Home / Function/ WrapperRow() — supabase Function Reference

WrapperRow() — supabase Function Reference

Architecture documentation for the WrapperRow() function in WrapperRow.tsx from the supabase codebase.

Entity Profile

Dependency Diagram

graph TD
  9b0468bc_4215_0f07_09dd_085c8f107257["WrapperRow()"]
  3f0a904f_bdfa_22ec_c956_24f285f3ee4c["convertKVStringArrayToJson()"]
  9b0468bc_4215_0f07_09dd_085c8f107257 -->|calls| 3f0a904f_bdfa_22ec_c956_24f285f3ee4c
  c8623a94_43a1_47f9_96c7_09ed48ad65f2["formatWrapperTables()"]
  9b0468bc_4215_0f07_09dd_085c8f107257 -->|calls| c8623a94_43a1_47f9_96c7_09ed48ad65f2
  style 9b0468bc_4215_0f07_09dd_085c8f107257 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

apps/studio/components/interfaces/Integrations/Wrappers/WrapperRow.tsx lines 35–215

export const WrapperRow = ({
  wrapper,
  selectedWrapperToEdit,
  selectedWrapperToDelete,
  setSelectedWrapperToEdit,
  setSelectedWrapperToDelete,
  deletingWrapperIdRef,
}: WrapperRowProps) => {
  const { ref, id } = useParams()
  const { can: canManageWrappers } = useAsyncCheckPermissions(
    PermissionAction.TENANT_SQL_ADMIN_WRITE,
    'wrappers'
  )

  const editWrapperShown = selectedWrapperToEdit?.id === wrapper.id
  const [isClosingEditWrapper, setIsClosingEditWrapper] = useState(false)

  const integration = INTEGRATIONS.find((i) => i.id === id)

  if (!integration || integration.type !== 'wrapper') {
    return <p className="text-foreground-lighter text-sm">A wrapper with this ID does not exist</p>
  }

  const serverOptions = convertKVStringArrayToJson(wrapper.server_options ?? [])
  const [encryptedMetadata, visibleMetadata] = partition(
    integration?.meta?.server.options.filter((option) => !option.hidden),
    'secureEntry'
  )

  const _tables = formatWrapperTables(wrapper, integration?.meta)

  return (
    <>
      <TableRow>
        <TableCell className="gap-2 align-top !py-3 min-w-80">
          {wrapper.name}

          {visibleMetadata.map((metadata) => (
            <div
              key={metadata.name}
              className="flex items-center space-x-2 text-sm text-foreground-light"
            >
              <span className="text-foreground-lighter text-nowrap">{metadata.label}:</span>
              <span className="truncate max-w-72" title={serverOptions[metadata.name]}>
                {serverOptions[metadata.name]}
              </span>
            </div>
          ))}
        </TableCell>

        <TableCell className="space-y-2 !p-4">
          {_tables?.map((table) => {
            const target = table.table ?? table.object ?? table.src_key

            return (
              <div key={table.id} className="flex items-center">
                <Badge className="bg-surface-300 bg-opacity-100 gap-2 font-mono text-[0.75rem] h-6 text-foreground rounded-r-none">
                  <div className="relative w-3 h-3 flex items-center justify-center">
                    {integration.icon({ className: 'p-0' })}
                  </div>
                  <Tooltip>
                    <TooltipTrigger className="truncate max-w-28">{target}</TooltipTrigger>
                    <TooltipContent
                      side="bottom"
                      className="max-w-64 whitespace-pre-wrap break-words"
                    >
                      {target}
                    </TooltipContent>
                  </Tooltip>
                  <ChevronRight
                    size={12}
                    strokeWidth={1.5}
                    className="text-foreground-lighter/50"
                  />
                </Badge>

                <Link href={`/project/${ref}/editor/${table.id}`}>
                  <Badge className="transition hover:bg-surface-300 px-2 rounded-l-none gap-1.5 h-6 font-mono text-[0.75rem] border-l-0">
                    <Table2 size={12} strokeWidth={1.5} className="text-foreground-lighter/50" />
                    <Tooltip>
                      <TooltipTrigger className="truncate max-w-28">
                        {table.schema}.{table.table_name}
                      </TooltipTrigger>
                      <TooltipContent
                        side="bottom"
                        className="max-w-64 whitespace-pre-wrap break-words"
                      >
                        {table.schema}.{table.table_name}
                      </TooltipContent>
                    </Tooltip>
                  </Badge>
                </Link>
              </div>
            )
          })}
        </TableCell>
        <TableCell>
          {encryptedMetadata.map((metadata) => (
            <div key={metadata.name} className="flex items-center space-x-2 text-sm">
              <Link
                href={`/project/${ref}/settings/vault/secrets?search=${wrapper.name}_${metadata.name}`}
                className="transition text-foreground-light hover:text-foreground flex items-center space-x-2 max-w-28"
              >
                <span className="truncate" title={metadata.label}>
                  {metadata.label}
                </span>
                <div>
                  <ExternalLink size={12} strokeWidth={1.5} className="text-foreground-lighter" />
                </div>
              </Link>
            </div>
          ))}
        </TableCell>
        <TableCell className="flex-nowrap">
          <div className="flex items-center gap-x-2">
            <ButtonTooltip
              disabled={!canManageWrappers}
              type="default"
              icon={<Edit strokeWidth={1.5} />}
              className="px-1.5"
              onClick={() => setSelectedWrapperToEdit(wrapper.id.toString())}
              tooltip={{
                content: {
                  side: 'bottom',
                  text: !canManageWrappers
                    ? 'You need additional permissions to edit wrappers'
                    : 'Edit wrapper',
                },
              }}
            />
            <ButtonTooltip
              type="default"
              disabled={!canManageWrappers}
              icon={<Trash strokeWidth={1.5} />}
              className="px-1.5"
              onClick={() => setSelectedWrapperToDelete(wrapper.id.toString())}
              tooltip={{
                content: {
                  side: 'bottom',
                  text: !canManageWrappers
                    ? 'You need additional permissions to delete wrappers'
                    : 'Delete wrapper',
                },
              }}
            />
          </div>
        </TableCell>
      </TableRow>
      <Sheet
        open={editWrapperShown}
        onOpenChange={(open) => {
          if (!open) {
            setIsClosingEditWrapper(true)
          }
        }}
      >
        <SheetContent size="lg" tabIndex={undefined}>
          {selectedWrapperToEdit && (
            <EditWrapperSheet
              wrapper={selectedWrapperToEdit}
              wrapperMeta={integration.meta}
              onClose={() => {
                setSelectedWrapperToEdit(null)
                setIsClosingEditWrapper(false)
              }}
              isClosing={isClosingEditWrapper}
              setIsClosing={setIsClosingEditWrapper}
            />
          )}
        </SheetContent>
      </Sheet>
      {selectedWrapperToDelete && (
        <DeleteWrapperModal
          selectedWrapper={selectedWrapperToDelete}
          onClose={() => setSelectedWrapperToDelete(null)}
          deletingWrapperIdRef={deletingWrapperIdRef}
        />
      )}
    </>
  )
}

Subdomains

Frequently Asked Questions

What does WrapperRow() do?
WrapperRow() is a function in the supabase codebase.
What does WrapperRow() call?
WrapperRow() calls 2 function(s): convertKVStringArrayToJson, formatWrapperTables.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free