diff --git a/apps/studio/components/grid/SupabaseGrid.tsx b/apps/studio/components/grid/SupabaseGrid.tsx index 3129c172d0e..3bf86dd9ee2 100644 --- a/apps/studio/components/grid/SupabaseGrid.tsx +++ b/apps/studio/components/grid/SupabaseGrid.tsx @@ -13,9 +13,9 @@ import { useTableEditorStateSnapshot } from 'state/table-editor' import { useTableEditorTableStateSnapshot } from 'state/table-editor-table' import { Shortcuts } from './components/common/Shortcuts' -import Footer from './components/footer/Footer' +import { Footer } from './components/footer/Footer' import { Grid } from './components/grid/Grid' -import Header, { HeaderProps } from './components/header/Header' +import { Header, HeaderProps } from './components/header/Header' import { RowContextMenu } from './components/menu' import { GridProps } from './types' @@ -84,7 +84,7 @@ export const SupabaseGrid = ({ return (
-
+
{children || ( <> @@ -99,7 +99,7 @@ export const SupabaseGrid = ({ filters={filters} onApplyFilters={onApplyFilters} /> -
+
)} diff --git a/apps/studio/components/grid/components/footer/Footer.tsx b/apps/studio/components/grid/components/footer/Footer.tsx index f4680d0acac..a6281989b9c 100644 --- a/apps/studio/components/grid/components/footer/Footer.tsx +++ b/apps/studio/components/grid/components/footer/Footer.tsx @@ -5,14 +5,9 @@ import { useTableEditorQuery } from 'data/table-editor/table-editor-query' import { isTableLike, isViewLike } from 'data/table-editor/table-editor-types' import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { useUrlState } from 'hooks/ui/useUrlState' -import RefreshButton from '../header/RefreshButton' import { Pagination } from './pagination' -export interface FooterProps { - isRefetching?: boolean -} - -const Footer = ({ isRefetching }: FooterProps) => { +export const Footer = () => { const { id: _id } = useParams() const id = _id ? Number(_id) : undefined const { data: project } = useSelectedProjectQuery() @@ -41,10 +36,6 @@ const Footer = ({ isRefetching }: FooterProps) => { {selectedView === 'data' && }
- {entity && selectedView === 'data' && ( - - )} - {(isViewSelected || isTableSelected) && ( { ) } - -export default Footer diff --git a/apps/studio/components/grid/components/header/Header.tsx b/apps/studio/components/grid/components/header/Header.tsx index fde164a247c..821a359c06d 100644 --- a/apps/studio/components/grid/components/header/Header.tsx +++ b/apps/studio/components/grid/components/header/Header.tsx @@ -8,7 +8,7 @@ import { toast } from 'sonner' import { useParams } from 'common' import { useTableFilter } from 'components/grid/hooks/useTableFilter' import { useTableSort } from 'components/grid/hooks/useTableSort' -import GridHeaderActions from 'components/interfaces/TableGridEditor/GridHeaderActions' +import { GridHeaderActions } from 'components/interfaces/TableGridEditor/GridHeaderActions' import { formatTableRowsToSQL } from 'components/interfaces/TableGridEditor/TableEntity.utils' import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { useTableRowsCountQuery } from 'data/table-rows/table-rows-count-query' @@ -56,9 +56,10 @@ export const MAX_EXPORT_ROW_COUNT_MESSAGE = ( export type HeaderProps = { customHeader: ReactNode + isRefetching: boolean } -const Header = ({ customHeader }: HeaderProps) => { +export const Header = ({ customHeader, isRefetching }: HeaderProps) => { const snap = useTableEditorTableStateSnapshot() return ( @@ -71,14 +72,12 @@ const Header = ({ customHeader }: HeaderProps) => { ) : ( )} - +
) } -export default Header - const DefaultHeader = () => { const { ref: projectRef } = useParams() const { data: org } = useSelectedOrganizationQuery() diff --git a/apps/studio/components/grid/components/header/RefreshButton.tsx b/apps/studio/components/grid/components/header/RefreshButton.tsx index 1020e419b02..91c611c8c9a 100644 --- a/apps/studio/components/grid/components/header/RefreshButton.tsx +++ b/apps/studio/components/grid/components/header/RefreshButton.tsx @@ -2,15 +2,15 @@ import { useQueryClient } from '@tanstack/react-query' import { RefreshCw } from 'lucide-react' import { useParams } from 'common' +import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { tableRowKeys } from 'data/table-rows/keys' -import { Button } from 'ui' export type RefreshButtonProps = { tableId?: number isRefetching?: boolean } -const RefreshButton = ({ tableId, isRefetching }: RefreshButtonProps) => { +export const RefreshButton = ({ tableId, isRefetching }: RefreshButtonProps) => { const { ref } = useParams() const queryClient = useQueryClient() const queryKey = tableRowKeys.tableRowsAndCount(ref, tableId) @@ -20,14 +20,18 @@ const RefreshButton = ({ tableId, isRefetching }: RefreshButtonProps) => { } return ( - + className="w-7 h-7 p-0" + tooltip={{ + content: { + side: 'bottom', + text: 'Refresh table data', + }, + }} + /> ) } -export default RefreshButton diff --git a/apps/studio/components/interfaces/Auth/Users/UsersV2.tsx b/apps/studio/components/interfaces/Auth/Users/UsersV2.tsx index 0ead1d0a200..49c683f70b2 100644 --- a/apps/studio/components/interfaces/Auth/Users/UsersV2.tsx +++ b/apps/studio/components/interfaces/Auth/Users/UsersV2.tsx @@ -8,7 +8,7 @@ import { toast } from 'sonner' import { LOCAL_STORAGE_KEYS, useParams } from 'common' import { useIsAPIDocsSidePanelEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' import AlertError from 'components/ui/AlertError' -import APIDocsButton from 'components/ui/APIDocsButton' +import { APIDocsButton } from 'components/ui/APIDocsButton' import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { FilterPopover } from 'components/ui/FilterPopover' import { FormHeader } from 'components/ui/Forms/FormHeader' diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerHeader.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerHeader.tsx index d9a672fd68c..0d080f6c90f 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerHeader.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerHeader.tsx @@ -17,7 +17,7 @@ import { import { useCallback, useEffect, useRef, useState } from 'react' import { useIsAPIDocsSidePanelEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' -import APIDocsButton from 'components/ui/APIDocsButton' +import { APIDocsButton } from 'components/ui/APIDocsButton' import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions' import { useStorageExplorerStateSnapshot } from 'state/storage-explorer' diff --git a/apps/studio/components/interfaces/TableGridEditor/GridHeaderActions.tsx b/apps/studio/components/interfaces/TableGridEditor/GridHeaderActions.tsx index c4dab21d894..0322cba739a 100644 --- a/apps/studio/components/interfaces/TableGridEditor/GridHeaderActions.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/GridHeaderActions.tsx @@ -5,8 +5,9 @@ import { useState } from 'react' import { toast } from 'sonner' import { useParams } from 'common' +import { RefreshButton } from 'components/grid/components/header/RefreshButton' import { getEntityLintDetails } from 'components/interfaces/TableGridEditor/TableEntity.utils' -import APIDocsButton from 'components/ui/APIDocsButton' +import { APIDocsButton } from 'components/ui/APIDocsButton' import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { useDatabasePoliciesQuery } from 'data/database-policies/database-policies-query' import { useDatabasePublicationsQuery } from 'data/database-publications/database-publications-query' @@ -45,9 +46,10 @@ import ViewEntityAutofixSecurityModal from './ViewEntityAutofixSecurityModal' export interface GridHeaderActionsProps { table: Entity + isRefetching: boolean } -const GridHeaderActions = ({ table }: GridHeaderActionsProps) => { +export const GridHeaderActions = ({ table, isRefetching }: GridHeaderActionsProps) => { const { ref } = useParams() const { data: project } = useSelectedProjectQuery() const { data: org } = useSelectedOrganizationQuery() @@ -277,13 +279,13 @@ const GridHeaderActions = ({ table }: GridHeaderActionsProps) => { -

+

Row Level Security (RLS) -

-
+ +

You can restrict and control who can read, write and update data in this table using Row Level Security. @@ -293,14 +295,13 @@ const GridHeaderActions = ({ table }: GridHeaderActionsProps) => { table.

{!isSchemaLocked && ( -
- -
+ )}
@@ -443,8 +444,9 @@ const GridHeaderActions = ({ table }: GridHeaderActionsProps) => { {isTable && realtimeEnabled && ( - + {!isRealtimeEnabled && 'Enable Realtime'} + )} + {doesHaveAutoGeneratedAPIDocs && } + +
)} { ) } - -export default GridHeaderActions diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/ForeignRowSelector/ForeignRowSelector.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/ForeignRowSelector/ForeignRowSelector.tsx index 9a2a6ac1c87..e815f7c3873 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/ForeignRowSelector/ForeignRowSelector.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/ForeignRowSelector/ForeignRowSelector.tsx @@ -4,7 +4,7 @@ import { DndProvider } from 'react-dnd' import { HTML5Backend } from 'react-dnd-html5-backend' import { useParams } from 'common' -import RefreshButton from 'components/grid/components/header/RefreshButton' +import { RefreshButton } from 'components/grid/components/header/RefreshButton' import { FilterPopoverPrimitive } from 'components/grid/components/header/filter/FilterPopoverPrimitive' import { SortPopoverPrimitive } from 'components/grid/components/header/sort/SortPopoverPrimitive' import type { Filter, Sort } from 'components/grid/types' diff --git a/apps/studio/components/interfaces/TableGridEditor/TableDefinition.tsx b/apps/studio/components/interfaces/TableGridEditor/TableDefinition.tsx index 45e81d6abf8..f424dc65ba4 100644 --- a/apps/studio/components/interfaces/TableGridEditor/TableDefinition.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/TableDefinition.tsx @@ -4,7 +4,7 @@ import Link from 'next/link' import { useMemo, useRef } from 'react' import { useParams } from 'common' -import Footer from 'components/grid/components/footer/Footer' +import { Footer } from 'components/grid/components/footer/Footer' import { GenericSkeletonLoader } from 'components/ui/ShimmeringLoader' import { useTableDefinitionQuery } from 'data/database/table-definition-query' import { useViewDefinitionQuery } from 'data/database/view-definition-query' @@ -24,7 +24,7 @@ export interface TableDefinitionProps { entity?: Entity } -const TableDefinition = ({ entity }: TableDefinitionProps) => { +export const TableDefinition = ({ entity }: TableDefinitionProps) => { const { ref } = useParams() const editorRef = useRef(null) const monacoRef = useRef(null) @@ -132,5 +132,3 @@ const TableDefinition = ({ entity }: TableDefinitionProps) => { ) } - -export default TableDefinition diff --git a/apps/studio/components/interfaces/TableGridEditor/TableGridEditor.tsx b/apps/studio/components/interfaces/TableGridEditor/TableGridEditor.tsx index d1bff23294c..f0c1904650a 100644 --- a/apps/studio/components/interfaces/TableGridEditor/TableGridEditor.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/TableGridEditor.tsx @@ -22,7 +22,7 @@ import { Button } from 'ui' import { Admonition, GenericSkeletonLoader } from 'ui-patterns' import DeleteConfirmationDialogs from './DeleteConfirmationDialogs' import SidePanelEditor from './SidePanelEditor/SidePanelEditor' -import TableDefinition from './TableDefinition' +import { TableDefinition } from './TableDefinition' export interface TableGridEditorProps { isLoadingSelectedTable?: boolean diff --git a/apps/studio/components/layouts/EdgeFunctionsLayout/EdgeFunctionDetailsLayout.tsx b/apps/studio/components/layouts/EdgeFunctionsLayout/EdgeFunctionDetailsLayout.tsx index ae035f65138..ef94be5b6d2 100644 --- a/apps/studio/components/layouts/EdgeFunctionsLayout/EdgeFunctionDetailsLayout.tsx +++ b/apps/studio/components/layouts/EdgeFunctionsLayout/EdgeFunctionDetailsLayout.tsx @@ -9,7 +9,7 @@ import { useParams } from 'common' import { useIsAPIDocsSidePanelEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' import { EdgeFunctionTesterSheet } from 'components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionTesterSheet' import { PageLayout } from 'components/layouts/PageLayout/PageLayout' -import APIDocsButton from 'components/ui/APIDocsButton' +import { APIDocsButton } from 'components/ui/APIDocsButton' import { DocsButton } from 'components/ui/DocsButton' import NoPermission from 'components/ui/NoPermission' import { useEdgeFunctionBodyQuery } from 'data/edge-functions/edge-function-body-query' diff --git a/apps/studio/components/ui/APIDocsButton.tsx b/apps/studio/components/ui/APIDocsButton.tsx index dcc0a5b2b3a..4a2f4971e49 100644 --- a/apps/studio/components/ui/APIDocsButton.tsx +++ b/apps/studio/components/ui/APIDocsButton.tsx @@ -1,27 +1,30 @@ -import { Code } from 'lucide-react' +import { BookOpenText } from 'lucide-react' import { useAppStateSnapshot } from 'state/app-state' -import { Button } from 'ui' +import { ButtonTooltip } from './ButtonTooltip' interface APIDocsButtonProps { section?: string[] } -const APIDocsButton = ({ section }: APIDocsButtonProps) => { +export const APIDocsButton = ({ section }: APIDocsButtonProps) => { const snap = useAppStateSnapshot() return ( - + icon={} + className="h-7 w-7" + tooltip={{ + content: { + side: 'bottom', + text: 'API Docs', + }, + }} + /> ) } - -export default APIDocsButton