From 02c0d75dfbe5af5260376a009bbf14e675d39b2d Mon Sep 17 00:00:00 2001 From: Terry Sutton Date: Tue, 7 May 2024 04:45:06 -0230 Subject: [PATCH] Add comboboxes to the index side panel dropdowns (#25821) * Add comboboxes to the index side panel dropdowns * Add loading state for create index panel select a table field * Add placehholder for columns field in create index side panel --------- Co-authored-by: Joshen Lim --- .../Database/Indexes/CreateIndexSidePanel.tsx | 182 +++++++++++++----- .../ui-patterns/MultiSelect/MultiSelectV2.tsx | 2 +- 2 files changed, 140 insertions(+), 44 deletions(-) diff --git a/apps/studio/components/interfaces/Database/Indexes/CreateIndexSidePanel.tsx b/apps/studio/components/interfaces/Database/Indexes/CreateIndexSidePanel.tsx index db61e85a643..993827d26ca 100644 --- a/apps/studio/components/interfaces/Database/Indexes/CreateIndexSidePanel.tsx +++ b/apps/studio/components/interfaces/Database/Indexes/CreateIndexSidePanel.tsx @@ -2,7 +2,6 @@ import Link from 'next/link' import { useEffect, useMemo, useState } from 'react' import toast from 'react-hot-toast' -import { SelectValue } from '@ui/components/shadcn/ui/select' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' import { CodeEditor } from 'components/ui/CodeEditor' import ShimmeringLoader from 'components/ui/ShimmeringLoader' @@ -11,9 +10,19 @@ import { useSchemasQuery } from 'data/database/schemas-query' import { useTableColumnsQuery } from 'data/database/table-columns-query' import { useEntityTypesQuery } from 'data/entity-types/entity-types-infinite-query' import { useExecuteSqlMutation } from 'data/sql/execute-sql-mutation' +import { Check, ChevronsUpDown } from 'lucide-react' import { Button, - Input, + CommandEmpty_Shadcn_, + CommandGroup_Shadcn_, + CommandInput_Shadcn_, + CommandItem_Shadcn_, + CommandList_Shadcn_, + Command_Shadcn_, + PopoverContent_Shadcn_, + PopoverTrigger_Shadcn_, + Popover_Shadcn_, + ScrollArea, SelectContent_Shadcn_, SelectItem_Shadcn_, SelectSeparator_Shadcn_, @@ -21,8 +30,10 @@ import { SelectValue_Shadcn_, Select_Shadcn_, SidePanel, + cn, } from 'ui' -import MultiSelect, { MultiSelectOption } from 'ui-patterns/MultiSelect' +import { MultiSelectOption } from 'ui-patterns/MultiSelect' +import { MultiSelectV2 } from 'ui-patterns/MultiSelect/MultiSelectV2' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { INDEX_TYPES } from './Indexes.constants' @@ -37,6 +48,8 @@ const CreateIndexSidePanel = ({ visible, onClose }: CreateIndexSidePanelProps) = const [selectedEntity, setSelectedEntity] = useState(undefined) const [selectedColumns, setSelectedColumns] = useState([]) const [selectedIndexType, setSelectedIndexType] = useState(INDEX_TYPES[0].value) + const [schemaDropdownOpen, setSchemaDropdownOpen] = useState(false) + const [tableDropdownOpen, setTableDropdownOpen] = useState(false) const { refetch: refetchIndexes } = useIndexesQuery({ schema: selectedSchema, @@ -47,7 +60,7 @@ const CreateIndexSidePanel = ({ visible, onClose }: CreateIndexSidePanelProps) = projectRef: project?.ref, connectionString: project?.connectionString, }) - const { data: entities } = useEntityTypesQuery({ + const { data: entities, isLoading } = useEntityTypesQuery({ schema: selectedSchema, sort: 'alphabetical', search: undefined, @@ -136,22 +149,62 @@ CREATE INDEX ON "${selectedSchema}"."${selectedEntity}" USING ${selectedIndexTyp
- - - {selectedSchema} - - - {(schemas ?? []).map((schema) => ( - - {schema.name} - - ))} - - + + + + + + + + No schemas found + + 7 ? 'h-[210px]' : ''}> + {(schemas ?? []).map((schema) => ( + { + setSelectedSchema(schema.name) + setSchemaDropdownOpen(false) + }} + onClick={() => { + setSelectedSchema(schema.name) + setSchemaDropdownOpen(false) + }} + > + {schema.name} + {selectedEntity === schema.name && ( + + )} + + ))} + + + + + + - - - - {selectedEntity} - - - - {(entityTypes ?? []).map((entity) => ( - - {entity.name} - - ))} - - + + {isLoading ? ( + + ) : ( + + )} + + + + + + No tables found + + 7 ? 'h-[210px]' : ''}> + {(entityTypes ?? []).map((entity) => ( + { + setSelectedEntity(entity.name) + setTableDropdownOpen(false) + }} + onClick={() => { + setSelectedEntity(entity.name) + setTableDropdownOpen(false) + }} + > + {entity.name} + {selectedEntity === entity.name && ( + + )} + + ))} + + + + + + {selectedEntity && ( {isLoadingTableColumns && } {isSuccessTableColumns && ( - No options found - 5 ? 'h-[225px]' : '')}> + 7 ? 'h-[210px]' : '')}> {formattedOptions?.map((option) => { const active = selectedOptions &&