diff --git a/apps/studio/components/interfaces/Database/EnumeratedTypes/EnumeratedTypes.tsx b/apps/studio/components/interfaces/Database/EnumeratedTypes/EnumeratedTypes.tsx index b0054b670d9..07abc181f0f 100644 --- a/apps/studio/components/interfaces/Database/EnumeratedTypes/EnumeratedTypes.tsx +++ b/apps/studio/components/interfaces/Database/EnumeratedTypes/EnumeratedTypes.tsx @@ -30,6 +30,7 @@ import { AlertError } from '@/components/ui/AlertError' import { DocsButton } from '@/components/ui/DocsButton' import { SchemaSelector } from '@/components/ui/SchemaSelector' import { Shortcut } from '@/components/ui/Shortcut' +import { TableRowNoResults } from '@/components/ui/TableRowNoResults' import { useEnumeratedTypeDeleteMutation } from '@/data/enumerated-types/enumerated-type-delete-mutation' import { useEnumeratedTypesQuery } from '@/data/enumerated-types/enumerated-types-query' import { useQuerySchemaState } from '@/hooks/misc/useSchemaQueryState' @@ -217,14 +218,7 @@ export const EnumeratedTypes = () => { )} {filteredEnumeratedTypes.length === 0 && search.length > 0 && ( - - -

No results found

-

- Your search for "{search}" did not return any results -

-
-
+ )} {filteredEnumeratedTypes.length > 0 && filteredEnumeratedTypes.map((type) => ( diff --git a/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionList.tsx b/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionList.tsx index bbecee321e8..37b98390db8 100644 --- a/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionList.tsx +++ b/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionList.tsx @@ -24,6 +24,7 @@ import { stripInArgModePrefixes } from '../Functions.utils' import { getDatabaseTriggersHref, getFilteredFunctions } from './FunctionList.utils' import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { TableRowNoResults } from '@/components/ui/TableRowNoResults' import { useDatabaseFunctionsQuery, type SavedDatabaseFunction, @@ -91,16 +92,7 @@ export const FunctionList = ({ } if (_functions.length === 0 && filterString.length > 0) { - return ( - - -

No results found

-

- Your search for "{filterString}" did not return any results -

-
-
- ) + return } return ( diff --git a/apps/studio/components/interfaces/Database/Indexes/Indexes.tsx b/apps/studio/components/interfaces/Database/Indexes/Indexes.tsx index ca4e967ed42..75a971a5110 100644 --- a/apps/studio/components/interfaces/Database/Indexes/Indexes.tsx +++ b/apps/studio/components/interfaces/Database/Indexes/Indexes.tsx @@ -28,6 +28,7 @@ import { AlertError } from '@/components/ui/AlertError' import { CodeEditor } from '@/components/ui/CodeEditor/CodeEditor' import { SchemaSelector } from '@/components/ui/SchemaSelector' import { Shortcut } from '@/components/ui/Shortcut' +import { TableRowNoResults } from '@/components/ui/TableRowNoResults' import { useDatabaseIndexDeleteMutation } from '@/data/database-indexes/index-delete-mutation' import { useIndexesQuery, type DatabaseIndex } from '@/data/database-indexes/indexes-query' import { useSchemasQuery } from '@/data/database/schemas-query' @@ -240,14 +241,7 @@ export const Indexes = () => { )} {indexes.length === 0 && search.length > 0 && ( - - -

No results found

-

- Your search for "{search}" did not return any results -

-
-
+ )} {indexes.length > 0 && indexes.map((index) => ( diff --git a/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx b/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx index 528ea2b7484..f5b627e7449 100644 --- a/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx +++ b/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx @@ -25,6 +25,7 @@ import { MigrationsEmptyState } from './MigrationsEmptyState' import { SupportLink } from '@/components/interfaces/Support/SupportLink' import { CodeEditor } from '@/components/ui/CodeEditor/CodeEditor' import { InlineLink } from '@/components/ui/InlineLink' +import { TableRowNoResults } from '@/components/ui/TableRowNoResults' import { DatabaseMigration, useMigrationsQuery } from '@/data/database/migrations-query' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' import { DOCS_URL } from '@/lib/constants' @@ -184,14 +185,7 @@ export const Migrations = () => { ) }) ) : ( - - -

No results found

-

- Your search for "{search}" did not return any results -

-
-
+ )} diff --git a/apps/studio/components/interfaces/Database/Replication/Destinations.tsx b/apps/studio/components/interfaces/Database/Replication/Destinations.tsx index 2ae5b186ef3..1516ae4b5aa 100644 --- a/apps/studio/components/interfaces/Database/Replication/Destinations.tsx +++ b/apps/studio/components/interfaces/Database/Replication/Destinations.tsx @@ -15,7 +15,6 @@ import { DropdownMenuTrigger, Table, TableBody, - TableCell, TableHead, TableHeader, TableHeadSort, @@ -42,6 +41,7 @@ import { import { useRedirectLegacyReadReplicaDestination } from './useRedirectLegacyReadReplicaDestination' import { AlertError } from '@/components/ui/AlertError' import { Shortcut } from '@/components/ui/Shortcut' +import { TableRowNoResults } from '@/components/ui/TableRowNoResults' import { useReplicationDestinationsQuery } from '@/data/replication/destinations-query' import { replicationKeys } from '@/data/replication/keys' import { @@ -404,16 +404,7 @@ export const Destinations = () => { {!isDestinationsLoading && filteredDestinations.length === 0 && - hasDestinations && ( - - -

No results found

-

- Your search for “{filterString}” did not return any results. -

-
-
- )} + hasDestinations && } diff --git a/apps/studio/components/interfaces/Database/Tables/TableList.tsx b/apps/studio/components/interfaces/Database/Tables/TableList.tsx index c331237c22e..0f59a3c4e31 100644 --- a/apps/studio/components/interfaces/Database/Tables/TableList.tsx +++ b/apps/studio/components/interfaces/Database/Tables/TableList.tsx @@ -54,6 +54,7 @@ import { DropdownMenuItemTooltip } from '@/components/ui/DropdownMenuItemTooltip import { EntityTypeIcon } from '@/components/ui/EntityTypeIcon' import { SchemaSelector } from '@/components/ui/SchemaSelector' import { Shortcut } from '@/components/ui/Shortcut' +import { TableRowNoResults } from '@/components/ui/TableRowNoResults' import { useDatabasePublicationsQuery } from '@/data/database-publications/database-publications-query' import { ENTITY_TYPE } from '@/data/entity-types/entity-type-constants' import { useForeignTablesQuery } from '@/data/foreign-tables/foreign-tables-query' @@ -429,14 +430,7 @@ export const TableList = ({ )} {entities.length === 0 && filterString.length > 0 && ( - - -

No results found

-

- Your search for "{filterString}" did not return any results -

-
-
+ )} {entities.length > 0 && entities.map((x) => ( diff --git a/apps/studio/components/interfaces/Database/Triggers/EventTriggersList/EventTriggerList.tsx b/apps/studio/components/interfaces/Database/Triggers/EventTriggersList/EventTriggerList.tsx index 9c74ec6f765..b4f41abc15e 100644 --- a/apps/studio/components/interfaces/Database/Triggers/EventTriggersList/EventTriggerList.tsx +++ b/apps/studio/components/interfaces/Database/Triggers/EventTriggersList/EventTriggerList.tsx @@ -19,6 +19,7 @@ import type { EventTrigger } from './EventTriggerList.utils' import { SUPABASE_ROLES } from '@/components/interfaces/Database/Roles/Roles.constants' import { getDatabaseFunctionsHref } from '@/components/interfaces/Database/Triggers/TriggersList/TriggerList.utils' import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { TableRowNoResults } from '@/components/ui/TableRowNoResults' interface EventTriggerListProps { filterString: string @@ -64,32 +65,8 @@ export const EventTriggerList = ({ return sortBy(filteredEventTriggers, (trigger) => trigger.name.toLocaleLowerCase()) }, [eventTriggers, ownerFilter, filterString]) - if (orderedTriggers.length === 0 && filterString.length === 0 && ownerFilter.length === 0) { - return ( - - -

No event triggers created yet

-

- There are no event triggers configured for this database -

-
-
- ) - } - if (orderedTriggers.length === 0 && (filterString.length > 0 || ownerFilter.length > 0)) { - return ( - - -

No results found

-

- {filterString.length > 0 - ? `Your search for "${filterString}" did not return any results` - : 'No event triggers match the current filters'} -

-
-
- ) + return } return ( diff --git a/apps/studio/components/interfaces/Database/Triggers/TriggersList/TriggerList.tsx b/apps/studio/components/interfaces/Database/Triggers/TriggersList/TriggerList.tsx index 6c4050d62af..e0d00fbef26 100644 --- a/apps/studio/components/interfaces/Database/Triggers/TriggersList/TriggerList.tsx +++ b/apps/studio/components/interfaces/Database/Triggers/TriggersList/TriggerList.tsx @@ -27,6 +27,7 @@ import { import { selectFilterSchema } from '@/components/interfaces/Reports/v2/ReportsSelectFilter' import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { TableRowNoResults } from '@/components/ui/TableRowNoResults' import { useDatabaseTriggersQuery } from '@/data/database-triggers/database-triggers-query' import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' import { useQuerySchemaState } from '@/hooks/misc/useSchemaQueryState' @@ -92,16 +93,7 @@ export const TriggerList = ({ editTrigger, duplicateTrigger, deleteTrigger }: Tr } if (_triggers.length === 0 && filterString.length > 0) { - return ( - - -

No results found

-

- Your search for "{filterString}" did not return any results -

-
-
- ) + return } return ( diff --git a/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/EdgeFunctionSecrets.tsx b/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/EdgeFunctionSecrets.tsx index da5205f1c84..58d0000a82f 100644 --- a/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/EdgeFunctionSecrets.tsx +++ b/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/EdgeFunctionSecrets.tsx @@ -20,6 +20,7 @@ import { EditSecretSheet } from './EditSecretSheet' import { AlertError } from '@/components/ui/AlertError' import { DocsButton } from '@/components/ui/DocsButton' import { NoPermission } from '@/components/ui/NoPermission' +import { TableRowNoResults } from '@/components/ui/TableRowNoResults' import { useSecretsDeleteMutation } from '@/data/secrets/secrets-delete-mutation' import { useSecretsQuery } from '@/data/secrets/secrets-query' import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' @@ -181,14 +182,11 @@ export const EdgeFunctionSecrets = () => { ) : ( - - -

No results found

-

- Your search for "{searchString}" did not return any results -

-
-
+ )} diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/index.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/index.tsx index 92c594863c3..b2a987ad33a 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/index.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/index.tsx @@ -27,6 +27,7 @@ import { CreateBucketButton } from '../NewBucketButton' import { CreateAnalyticsBucketModal } from './CreateAnalyticsBucketModal' import { AlertError } from '@/components/ui/AlertError' import { AlphaNotice } from '@/components/ui/AlphaNotice' +import { TableRowNoResults } from '@/components/ui/TableRowNoResults' import { useProjectStorageConfigQuery } from '@/data/config/project-storage-config-query' import { useAnalyticsBucketsQuery } from '@/data/storage/analytics-buckets-query' import { createNavigationHandler } from '@/lib/navigation' @@ -136,14 +137,11 @@ export const AnalyticsBuckets = () => { {analyticsBuckets.length === 0 && filterString.length > 0 && ( - - -

No results found

-

- Your search for "{filterString}" did not return any results -

-
-
+ )} {analyticsBuckets.map((bucket) => { const handleBucketNavigation = createNavigationHandler( diff --git a/apps/studio/components/interfaces/Storage/BucketsPickerDialog/BucketTableRow.tsx b/apps/studio/components/interfaces/Storage/BucketsPickerDialog/BucketTableRow.tsx index 06115535f5d..5cb3e449229 100644 --- a/apps/studio/components/interfaces/Storage/BucketsPickerDialog/BucketTableRow.tsx +++ b/apps/studio/components/interfaces/Storage/BucketsPickerDialog/BucketTableRow.tsx @@ -12,27 +12,6 @@ import { formatBytes } from '@/lib/helpers' type BucketTableMode = 'standard' | 'virtualized' -type BucketTableEmptyStateProps = { - mode: BucketTableMode - filterString: string -} - -export const BucketTableEmptyState = ({ mode, filterString }: BucketTableEmptyStateProps) => { - const BucketTableRow = mode === 'standard' ? TableRow : VirtualizedTableRow - const BucketTableCell = mode === 'standard' ? TableCell : VirtualizedTableCell - - return ( - - -

No results found

-

- Your search for “{filterString}” did not return any results -

-
-
- ) -} - type BucketTableRowProps = { mode: BucketTableMode bucket: Bucket diff --git a/apps/studio/components/interfaces/Storage/BucketsPickerDialog/BucketsTable.tsx b/apps/studio/components/interfaces/Storage/BucketsPickerDialog/BucketsTable.tsx index a73e9f3c7ef..19b36cbc940 100644 --- a/apps/studio/components/interfaces/Storage/BucketsPickerDialog/BucketsTable.tsx +++ b/apps/studio/components/interfaces/Storage/BucketsPickerDialog/BucketsTable.tsx @@ -3,8 +3,9 @@ import { Table, TableBody } from 'ui' import { LoadMoreRow } from './BucketsTable.LoadMoreRow' import { BucketTableHeader } from './BucketTableHeader' -import { BucketTableEmptyState, BucketTableRow } from './BucketTableRow' +import { BucketTableRow } from './BucketTableRow' import type { AllowedBucketType, BucketsTablePaginationProps } from './types' +import { TableRowNoResults } from '@/components/ui/TableRowNoResults' import { VirtualizedTable, VirtualizedTableBody } from '@/components/ui/VirtualizedTable' import { type Bucket } from '@/data/storage/buckets-query' @@ -47,7 +48,11 @@ const BucketsTableUnvirtualized = ({ 0} /> {showSearchEmptyState ? ( - + ) : ( buckets.map((bucket) => ( + ) : undefined } trailingContent={ diff --git a/apps/studio/components/interfaces/Storage/FilesBuckets/BucketTable.tsx b/apps/studio/components/interfaces/Storage/FilesBuckets/BucketTable.tsx index 5ce3d537792..b569965dcbd 100644 --- a/apps/studio/components/interfaces/Storage/FilesBuckets/BucketTable.tsx +++ b/apps/studio/components/interfaces/Storage/FilesBuckets/BucketTable.tsx @@ -14,6 +14,7 @@ import { import { PUBLIC_BUCKET_TOOLTIP } from '@/components/interfaces/Storage/Storage.constants' import { useBucketPolicyCount } from '@/components/interfaces/Storage/useBucketPolicyCount' +import { TableRowNoResults } from '@/components/ui/TableRowNoResults' import { VirtualizedTableCell, VirtualizedTableHead, @@ -64,19 +65,22 @@ type BucketTableEmptyStateProps = { } export const BucketTableEmptyState = ({ mode, filterString }: BucketTableEmptyStateProps) => { - const BucketTableRow = mode === 'standard' ? TableRow : VirtualizedTableRow - const BucketTableCell = mode === 'standard' ? TableCell : VirtualizedTableCell - - return ( - - -

No results found

-

- Your search for “{filterString}” did not return any results -

-
-
- ) + if (mode === 'standard') { + return ( + + ) + } else { + return ( + + +

No results found

+

+ Your search for “{filterString}” did not return any results +

+
+
+ ) + } } type BucketTableRowProps = { diff --git a/apps/studio/components/interfaces/Storage/FilesBuckets/BucketsTable.tsx b/apps/studio/components/interfaces/Storage/FilesBuckets/BucketsTable.tsx index 6cedc17b17b..be21a3782a5 100644 --- a/apps/studio/components/interfaces/Storage/FilesBuckets/BucketsTable.tsx +++ b/apps/studio/components/interfaces/Storage/FilesBuckets/BucketsTable.tsx @@ -3,7 +3,8 @@ import { Table, TableBody } from 'ui' import { LoadMoreRow } from './BucketsTable.LoadMoreRow' import type { BucketsTablePaginationProps } from './BucketsTable.types' -import { BucketTableEmptyState, BucketTableHeader, BucketTableRow } from './BucketTable' +import { BucketTableHeader, BucketTableRow } from './BucketTable' +import { TableRowNoResults } from '@/components/ui/TableRowNoResults' import { VirtualizedTable, VirtualizedTableBody } from '@/components/ui/VirtualizedTable' import { Bucket } from '@/data/storage/buckets-query' @@ -15,8 +16,16 @@ type BucketsTableProps = { pagination: BucketsTablePaginationProps } +// [Joshen] To investigate: There's a lot of duplicate logic + components between +// this FilesBuckets/BucketsTable and BucketsPickerDialog/BucketsTable. Check separately +// if they can be cleaned up and consolidated. The latter should take precedence as it aims to +// reduce footprint on the giant StorageExplorerState. + export const BucketsTable = (props: BucketsTableProps) => { + // [Joshen] To investigate: Can't we just default to virtualized? + // Do we need to dynamically decide whether to use a virtualized or unvirtualized one? const isVirtualized = props.buckets.length > 50 + return isVirtualized ? ( ) : ( @@ -43,7 +52,11 @@ const BucketsTableUnvirtualized = ({ 0} /> {showSearchEmptyState ? ( - + ) : ( buckets.map((bucket) => ( + ) : undefined } trailingContent={ diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerColumn.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerColumn.tsx index 82191b1239d..a023d1a0088 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerColumn.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerColumn.tsx @@ -269,7 +269,7 @@ export const FileExplorerColumn = ({
diff --git a/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/index.tsx b/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/index.tsx index 0bf237907eb..43b0d7b3b4a 100644 --- a/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/index.tsx +++ b/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/index.tsx @@ -45,6 +45,7 @@ import { ScaffoldSectionTitle, } from '@/components/layouts/Scaffold' import { AlertError } from '@/components/ui/AlertError' +import { TableRowNoResults } from '@/components/ui/TableRowNoResults' import { useVectorBucketQuery } from '@/data/storage/vector-bucket-query' import { useVectorBucketsIndexesQuery } from '@/data/storage/vector-buckets-indexes-query' @@ -182,25 +183,20 @@ export const VectorBucketDetails = () => { {filteredList.length === 0 ? ( - - - {filterString.length > 0 ? ( - <> -

No results found

-

- Your search for "{filterString}" did not return any results -

- - ) : ( - <> -

No tables yet

-

- Create your first table to get started -

- - )} -
-
+ + {filterString.length === 0 ? ( + <> +

No tables yet

+

+ Create your first table to get started +

+ + ) : undefined} +
) : ( filteredList.map((index, idx: number) => { const id = `index-${idx}` @@ -225,6 +221,7 @@ export const VectorBucketDetails = () => {