import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' import { useBreakpoint } from 'common/hooks/useBreakpoint' import { ProtectedSchemaModal } from 'components/interfaces/Database/ProtectedSchemaWarning' import EditorMenuListSkeleton from 'components/layouts/TableEditorLayout/EditorMenuListSkeleton' import AlertError from 'components/ui/AlertError' import { ButtonTooltip } from 'components/ui/ButtonTooltip' import InfiniteList from 'components/ui/InfiniteList' import SchemaSelector from 'components/ui/SchemaSelector' import { useSchemasQuery } from 'data/database/schemas-query' import { ENTITY_TYPE } from 'data/entity-types/entity-type-constants' import { useEntityTypesQuery } from 'data/entity-types/entity-types-infinite-query' import { useTableEditorQuery } from 'data/table-editor/table-editor-query' import { useCheckPermissions } from 'hooks/misc/useCheckPermissions' import { useLocalStorage } from 'hooks/misc/useLocalStorage' import { useQuerySchemaState } from 'hooks/misc/useSchemaQueryState' import { PROTECTED_SCHEMAS } from 'lib/constants/schemas' import { partition } from 'lodash' import { Filter, Plus } from 'lucide-react' import { useRouter } from 'next/router' import { useEffect, useMemo, useState } from 'react' import { useTableEditorStateSnapshot } from 'state/table-editor' import { AlertDescription_Shadcn_, AlertTitle_Shadcn_, Alert_Shadcn_, Button, Checkbox_Shadcn_, Label_Shadcn_, PopoverContent_Shadcn_, PopoverTrigger_Shadcn_, Popover_Shadcn_, } from 'ui' import { InnerSideBarEmptyPanel, InnerSideBarFilterSearchInput, InnerSideBarFilterSortDropdown, InnerSideBarFilterSortDropdownItem, InnerSideBarFilters, } from 'ui-patterns/InnerSideMenu' import { useProjectContext } from '../ProjectLayout/ProjectContext' import EntityListItem from './EntityListItem' import { TableMenuEmptyState } from './TableMenuEmptyState' const TableEditorMenu = () => { const { id: _id } = useParams() const router = useRouter() const id = _id ? Number(_id) : undefined const snap = useTableEditorStateSnapshot() const { selectedSchema, setSelectedSchema } = useQuerySchemaState() const isMobile = useBreakpoint() const [showModal, setShowModal] = useState(false) const [searchText, setSearchText] = useState('') const [visibleTypes, setVisibleTypes] = useState(Object.values(ENTITY_TYPE)) const [sort, setSort] = useLocalStorage<'alphabetical' | 'grouped-alphabetical'>( 'table-editor-sort', 'alphabetical' ) const { project } = useProjectContext() const { data, isLoading, isSuccess, isError, error, hasNextPage, isFetchingNextPage, fetchNextPage, } = useEntityTypesQuery( { projectRef: project?.ref, connectionString: project?.connectionString, schemas: [selectedSchema], search: searchText.trim() || undefined, sort, filterTypes: visibleTypes, }, { keepPreviousData: Boolean(searchText), } ) const entityTypes = useMemo( () => data?.pages.flatMap((page) => page.data.entities), [data?.pages] ) const { data: schemas } = useSchemasQuery({ projectRef: project?.ref, connectionString: project?.connectionString, }) const schema = schemas?.find((schema) => schema.name === selectedSchema) const canCreateTables = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'tables') const [protectedSchemas] = partition( (schemas ?? []).sort((a, b) => a.name.localeCompare(b.name)), (schema) => PROTECTED_SCHEMAS.includes(schema?.name ?? '') ) const isLocked = protectedSchemas.some((s) => s.id === schema?.id) const { data: selectedTable } = useTableEditorQuery({ projectRef: project?.ref, connectionString: project?.connectionString, id, }) useEffect(() => { if (selectedTable?.schema) { setSelectedSchema(selectedTable.schema) } }, [selectedTable?.schema]) return ( <>
{ setSearchText('') setSelectedSchema(name) router.push(`/project/${project?.ref}/editor`) }} onSelectCreateSchema={() => snap.onAddSchema()} />
{!isLocked ? ( } type="default" className="justify-start" onClick={snap.onAddTable} tooltip={{ content: { side: 'bottom', text: !canCreateTables ? 'You need additional permissions to create tables' : undefined, }, }} > New table ) : ( Viewing protected schema

This schema is managed by Supabase and is read-only through the table editor

)}
{ setSearchText(e.target.value) }} value={searchText} placeholder="Search tables..." > setSort(value)} > Alphabetical Entity Type
))}
{isLoading && } {isError && (
)} {isSuccess && ( <> {searchText.length === 0 && (entityTypes?.length ?? 0) <= 0 && ( )} {searchText.length > 0 && (entityTypes?.length ?? 0) <= 0 && ( )} {(entityTypes?.length ?? 0) > 0 && (
28} hasNextPage={hasNextPage} isLoadingNextPage={isFetchingNextPage} onLoadNextPage={() => fetchNextPage()} />
)} )} setShowModal(false)} /> ) } export default TableEditorMenu