diff --git a/.prettierignore b/.prettierignore index e0cec2dda8..5f74f6bc0d 100644 --- a/.prettierignore +++ b/.prettierignore @@ -16,6 +16,7 @@ examples/slack-clone/nextjs-slack-clone/full-schema.sql apps/studio/public apps/**/.turbo apps/docs/CONTRIBUTING.md +apps/docs/__generated__ apps/design-system/__registry__ packages/icons/__registry__ packages/icons/src/icons/*.ts diff --git a/apps/studio/components/grid/MsSqlValidation.tsx b/apps/studio/components/grid/MsSqlValidation.tsx index b6951f4c51..8a57748fd6 100644 --- a/apps/studio/components/grid/MsSqlValidation.tsx +++ b/apps/studio/components/grid/MsSqlValidation.tsx @@ -1,8 +1,8 @@ -import { isMsSqlForeignTable, type Entity } from 'data/table-editor/table-editor-types' import type { ComponentType, ReactNode } from 'react' - import { Admonition } from 'ui-patterns' + import type { Filter, Sort } from './types' +import { isMsSqlForeignTable, type Entity } from '@/data/table-editor/table-editor-types' type ValidateMsSqlSortingParams = { filters: Filter[] diff --git a/apps/studio/components/grid/SupabaseGrid.tsx b/apps/studio/components/grid/SupabaseGrid.tsx index 24ba3743a0..6ab669ebfb 100644 --- a/apps/studio/components/grid/SupabaseGrid.tsx +++ b/apps/studio/components/grid/SupabaseGrid.tsx @@ -1,19 +1,10 @@ import { keepPreviousData } from '@tanstack/react-query' import { useParams } from 'common' -import { isMsSqlForeignTable } from 'data/table-editor/table-editor-types' -import { useTableRowsQuery } from 'data/table-rows/table-rows-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { RoleImpersonationState } from 'lib/role-impersonation' -import { EMPTY_ARR } from 'lib/void' import { PropsWithChildren, useEffect, useRef, useState } from 'react' import { DataGridHandle } from 'react-data-grid' import { DndProvider } from 'react-dnd' import { HTML5Backend } from 'react-dnd-html5-backend' import { createPortal } from 'react-dom' -import { useRoleImpersonationStateSnapshot } from 'state/role-impersonation-state' -import { useTableEditorStateSnapshot } from 'state/table-editor' -import { QueuedOperation } from 'state/table-editor-operation-queue.types' -import { useTableEditorTableStateSnapshot } from 'state/table-editor-table' import { useIsTableFilterBarEnabled } from '../interfaces/App/FeaturePreview/FeaturePreviewContext' import { Shortcuts } from './components/common/Shortcuts' @@ -27,6 +18,15 @@ import { useTableSort } from './hooks/useTableSort' import { validateMsSqlSorting } from './MsSqlValidation' import { GridProps } from './types' import { formatGridDataWithOperationValues } from './utils/queueOperationUtils' +import { isMsSqlForeignTable } from '@/data/table-editor/table-editor-types' +import { useTableRowsQuery } from '@/data/table-rows/table-rows-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { RoleImpersonationState } from '@/lib/role-impersonation' +import { EMPTY_ARR } from '@/lib/void' +import { useRoleImpersonationStateSnapshot } from '@/state/role-impersonation-state' +import { useTableEditorStateSnapshot } from '@/state/table-editor' +import { QueuedOperation } from '@/state/table-editor-operation-queue.types' +import { useTableEditorTableStateSnapshot } from '@/state/table-editor-table' export const SupabaseGrid = ({ customHeader, diff --git a/apps/studio/components/grid/SupabaseGrid.utils.ts b/apps/studio/components/grid/SupabaseGrid.utils.ts index 37d5fe7408..ed98ffaef1 100644 --- a/apps/studio/components/grid/SupabaseGrid.utils.ts +++ b/apps/studio/components/grid/SupabaseGrid.utils.ts @@ -1,7 +1,4 @@ import AwesomeDebouncePromise from 'awesome-debounce-promise' -import type { Filter, SavedState, SupaRow } from 'components/grid/types' -import { Entity, isTableLike } from 'data/table-editor/table-editor-types' -import { BASE_PATH } from 'lib/constants' import { compact } from 'lodash' import { useSearchParams } from 'next/navigation' import { parseAsNativeArrayOf, parseAsString, useQueryStates } from 'nuqs' @@ -13,6 +10,9 @@ import { FilterOperatorOptions } from './components/header/filter/Filter.constan import { STORAGE_KEY_PREFIX } from './constants' import type { Sort, SupaColumn, SupaTable } from './types' import { formatClipboardValue } from './utils/common' +import type { Filter, SavedState, SupaRow } from '@/components/grid/types' +import { Entity, isTableLike } from '@/data/table-editor/table-editor-types' +import { BASE_PATH } from '@/lib/constants' import { QueuedOperation, QueuedOperationType } from '@/state/table-editor-operation-queue.types' export function formatSortURLParams(tableName: string, sort?: string[]): Sort[] { diff --git a/apps/studio/components/grid/components/common/BlockKeys.tsx b/apps/studio/components/grid/components/common/BlockKeys.tsx index aa7c9e48b7..098d39e4ef 100644 --- a/apps/studio/components/grid/components/common/BlockKeys.tsx +++ b/apps/studio/components/grid/components/common/BlockKeys.tsx @@ -1,6 +1,7 @@ -import { useClickedOutside } from 'hooks/ui/useClickedOutside' import { KeyboardEvent, ReactNode, useCallback, useEffect, useRef } from 'react' +import { useClickedOutside } from '@/hooks/ui/useClickedOutside' + interface BlockKeysProps { value: string | null children: ReactNode diff --git a/apps/studio/components/grid/components/common/DropdownControl.tsx b/apps/studio/components/grid/components/common/DropdownControl.tsx index a5f9fe0913..fe49c3ccc4 100644 --- a/apps/studio/components/grid/components/common/DropdownControl.tsx +++ b/apps/studio/components/grid/components/common/DropdownControl.tsx @@ -1,7 +1,8 @@ -import { DropdownMenuItemTooltip } from 'components/ui/DropdownMenuItemTooltip' import { PropsWithChildren } from 'react' import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from 'ui' +import { DropdownMenuItemTooltip } from '@/components/ui/DropdownMenuItemTooltip' + interface DropdownControlProps { options: { value: string | number diff --git a/apps/studio/components/grid/components/common/Shortcuts.tsx b/apps/studio/components/grid/components/common/Shortcuts.tsx index df4c5a8697..958f0afcac 100644 --- a/apps/studio/components/grid/components/common/Shortcuts.tsx +++ b/apps/studio/components/grid/components/common/Shortcuts.tsx @@ -1,9 +1,9 @@ import { RefObject, useMemo } from 'react' import type { DataGridHandle } from 'react-data-grid' -import { SupaRow } from 'components/grid/types' -import { useTableEditorTableStateSnapshot } from 'state/table-editor-table' import { useKeyboardShortcuts } from './Hooks' +import { SupaRow } from '@/components/grid/types' +import { useTableEditorTableStateSnapshot } from '@/state/table-editor-table' type ShortcutsProps = { gridRef: RefObject diff --git a/apps/studio/components/grid/components/editor/DateTimeEditor.tsx b/apps/studio/components/grid/components/editor/DateTimeEditor.tsx index c7ef67b676..a88343b955 100644 --- a/apps/studio/components/grid/components/editor/DateTimeEditor.tsx +++ b/apps/studio/components/grid/components/editor/DateTimeEditor.tsx @@ -1,9 +1,7 @@ import dayjs from 'dayjs' import { ChevronDown } from 'lucide-react' -import { useIsQueueOperationsEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' import { useEffect, useRef, useState } from 'react' import type { RenderEditCellProps } from 'react-data-grid' - import { Button, cn, @@ -17,7 +15,9 @@ import { } from 'ui' import { TimestampInfo, timestampLocalFormatter } from 'ui-patterns' import { Input } from 'ui-patterns/DataInputs/Input' + import { BlockKeys } from '../common/BlockKeys' +import { useIsQueueOperationsEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' interface BaseEditorProps extends RenderEditCellProps< TRow, diff --git a/apps/studio/components/grid/components/editor/JsonEditor.tsx b/apps/studio/components/grid/components/editor/JsonEditor.tsx index fc79ddb41f..6d7d1c35ea 100644 --- a/apps/studio/components/grid/components/editor/JsonEditor.tsx +++ b/apps/studio/components/grid/components/editor/JsonEditor.tsx @@ -1,21 +1,21 @@ +import { useParams } from 'common' import { Maximize } from 'lucide-react' import { useCallback, useState } from 'react' import type { RenderEditCellProps } from 'react-data-grid' import { toast } from 'sonner' - -import { useParams } from 'common' -import { useIsQueueOperationsEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' -import { isValueTruncated } from 'components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils' -import { useTableEditorQuery } from 'data/table-editor/table-editor-query' -import { isTableLike } from 'data/table-editor/table-editor-types' -import { useGetCellValueMutation } from 'data/table-rows/get-cell-value-mutation' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { prettifyJSON, removeJSONTrailingComma, tryParseJson } from 'lib/helpers' import { Popover, Tooltip, TooltipContent, TooltipTrigger } from 'ui' + import { BlockKeys } from '../common/BlockKeys' import { MonacoEditor } from '../common/MonacoEditor' import { NullValue } from '../common/NullValue' import { TruncatedWarningOverlay } from './TruncatedWarningOverlay' +import { useIsQueueOperationsEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import { isValueTruncated } from '@/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils' +import { useTableEditorQuery } from '@/data/table-editor/table-editor-query' +import { isTableLike } from '@/data/table-editor/table-editor-types' +import { useGetCellValueMutation } from '@/data/table-rows/get-cell-value-mutation' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { prettifyJSON, removeJSONTrailingComma, tryParseJson } from '@/lib/helpers' const verifyJSON = (value: string) => { try { diff --git a/apps/studio/components/grid/components/editor/TextEditor.tsx b/apps/studio/components/grid/components/editor/TextEditor.tsx index 00d7aa03c1..d719cf3907 100644 --- a/apps/studio/components/grid/components/editor/TextEditor.tsx +++ b/apps/studio/components/grid/components/editor/TextEditor.tsx @@ -1,10 +1,4 @@ import { useParams } from 'common' -import { useTableRowOperations } from 'components/grid/hooks/useTableRowOperations' -import { isValueTruncated } from 'components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils' -import { useTableEditorQuery } from 'data/table-editor/table-editor-query' -import { isTableLike } from 'data/table-editor/table-editor-types' -import { useGetCellValueMutation } from 'data/table-rows/get-cell-value-mutation' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Maximize } from 'lucide-react' import { useCallback, useState } from 'react' import type { RenderEditCellProps } from 'react-data-grid' @@ -17,6 +11,12 @@ import { EmptyValue } from '../common/EmptyValue' import { MonacoEditor } from '../common/MonacoEditor' import { NullValue } from '../common/NullValue' import { TruncatedWarningOverlay } from './TruncatedWarningOverlay' +import { useTableRowOperations } from '@/components/grid/hooks/useTableRowOperations' +import { isValueTruncated } from '@/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils' +import { useTableEditorQuery } from '@/data/table-editor/table-editor-query' +import { isTableLike } from '@/data/table-editor/table-editor-types' +import { useGetCellValueMutation } from '@/data/table-rows/get-cell-value-mutation' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export const TextEditor = ({ row, diff --git a/apps/studio/components/grid/components/footer/Footer.tsx b/apps/studio/components/grid/components/footer/Footer.tsx index 4425970499..9a06d3ccd7 100644 --- a/apps/studio/components/grid/components/footer/Footer.tsx +++ b/apps/studio/components/grid/components/footer/Footer.tsx @@ -1,12 +1,12 @@ +import { useParams } from 'common' import { parseAsString, useQueryState } from 'nuqs' -import { useParams } from 'common' -import { GridFooter } from 'components/ui/GridFooter' -import TwoOptionToggle from 'components/ui/TwoOptionToggle' -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 { Pagination } from './pagination/Pagination' +import { GridFooter } from '@/components/ui/GridFooter' +import TwoOptionToggle from '@/components/ui/TwoOptionToggle' +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' type FooterProps = { enableForeignRowsQuery?: boolean diff --git a/apps/studio/components/grid/components/footer/operations/SaveQueueActionBar.tsx b/apps/studio/components/grid/components/footer/operations/SaveQueueActionBar.tsx index b0b4de1a89..3e47da5317 100644 --- a/apps/studio/components/grid/components/footer/operations/SaveQueueActionBar.tsx +++ b/apps/studio/components/grid/components/footer/operations/SaveQueueActionBar.tsx @@ -1,10 +1,6 @@ -import { useOperationQueueActions } from 'components/grid/hooks/useOperationQueueActions' -import { useOperationQueueShortcuts } from 'components/grid/hooks/useOperationQueueShortcuts' -import { useIsQueueOperationsEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' import { AnimatePresence, motion } from 'framer-motion' import { Eye, MoreVertical, Trash } from 'lucide-react' import { createPortal } from 'react-dom' -import { useTableEditorStateSnapshot } from 'state/table-editor' import { Button, DropdownMenu, @@ -15,9 +11,13 @@ import { KeyboardShortcut, } from 'ui' +import { useOperationQueueActions } from '@/components/grid/hooks/useOperationQueueActions' +import { useOperationQueueShortcuts } from '@/components/grid/hooks/useOperationQueueShortcuts' +import { useIsQueueOperationsEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' import { DiscardChangesConfirmationDialog } from '@/components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' import { useConfirmOnClose } from '@/hooks/ui/useConfirmOnClose' import { getModKeyLabel } from '@/lib/helpers' +import { useTableEditorStateSnapshot } from '@/state/table-editor' export const SaveQueueActionBar = () => { const modKey = getModKeyLabel() diff --git a/apps/studio/components/grid/components/footer/pagination/Pagination.tsx b/apps/studio/components/grid/components/footer/pagination/Pagination.tsx index 4a1cade326..75d630804e 100644 --- a/apps/studio/components/grid/components/footer/pagination/Pagination.tsx +++ b/apps/studio/components/grid/components/footer/pagination/Pagination.tsx @@ -1,25 +1,25 @@ import { THRESHOLD_COUNT } from '@supabase/pg-meta' import { keepPreviousData } from '@tanstack/react-query' import { useParams } from 'common' -import { useTableFilter } from 'components/grid/hooks/useTableFilter' -import { useTableSort } from 'components/grid/hooks/useTableSort' -import { useTableEditorQuery } from 'data/table-editor/table-editor-query' -import { isForeignTable, isTable } from 'data/table-editor/table-editor-types' -import { useTableRowsCountQuery } from 'data/table-rows/table-rows-count-query' -import { useTableRowsQuery } from 'data/table-rows/table-rows-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { RoleImpersonationState } from 'lib/role-impersonation' import { AlertCircle, ArrowLeft, ArrowRight, HelpCircle, Loader2 } from 'lucide-react' import { useEffect, useState } from 'react' -import { useRoleImpersonationStateSnapshot } from 'state/role-impersonation-state' -import { useTableEditorStateSnapshot } from 'state/table-editor' -import { useTableEditorTableStateSnapshot } from 'state/table-editor-table' import { Button, Tooltip, TooltipContent, TooltipTrigger } from 'ui' import { Input } from 'ui-patterns/DataInputs/Input' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { DropdownControl } from '../../common/DropdownControl' import { formatEstimatedCount } from './Pagination.utils' +import { useTableFilter } from '@/components/grid/hooks/useTableFilter' +import { useTableSort } from '@/components/grid/hooks/useTableSort' +import { useTableEditorQuery } from '@/data/table-editor/table-editor-query' +import { isForeignTable, isTable } from '@/data/table-editor/table-editor-types' +import { useTableRowsCountQuery } from '@/data/table-rows/table-rows-count-query' +import { useTableRowsQuery } from '@/data/table-rows/table-rows-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { RoleImpersonationState } from '@/lib/role-impersonation' +import { useRoleImpersonationStateSnapshot } from '@/state/role-impersonation-state' +import { useTableEditorStateSnapshot } from '@/state/table-editor' +import { useTableEditorTableStateSnapshot } from '@/state/table-editor-table' const rowsPerPageOptions = [ { value: 100, label: '100 rows' }, diff --git a/apps/studio/components/grid/components/footer/pagination/Pagination.utils.test.ts b/apps/studio/components/grid/components/footer/pagination/Pagination.utils.test.ts index 837944df97..56afb597a5 100644 --- a/apps/studio/components/grid/components/footer/pagination/Pagination.utils.test.ts +++ b/apps/studio/components/grid/components/footer/pagination/Pagination.utils.test.ts @@ -1,4 +1,5 @@ -import { describe, test, expect } from 'vitest' +import { describe, expect, test } from 'vitest' + import { formatEstimatedCount } from './Pagination.utils' describe('formatEstimatedCount', () => { diff --git a/apps/studio/components/grid/components/formatter/BinaryFormatter.tsx b/apps/studio/components/grid/components/formatter/BinaryFormatter.tsx index 37c9e3d93e..5c3a9b3786 100644 --- a/apps/studio/components/grid/components/formatter/BinaryFormatter.tsx +++ b/apps/studio/components/grid/components/formatter/BinaryFormatter.tsx @@ -1,9 +1,9 @@ import { PropsWithChildren } from 'react' import type { RenderCellProps } from 'react-data-grid' -import { SupaRow } from 'components/grid/types' -import { convertByteaToHex } from 'components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils' import { NullValue } from '../common/NullValue' +import { SupaRow } from '@/components/grid/types' +import { convertByteaToHex } from '@/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils' export const BinaryFormatter = (p: PropsWithChildren>) => { const value = p.row[p.column.key] diff --git a/apps/studio/components/grid/components/formatter/BooleanFormatter.tsx b/apps/studio/components/grid/components/formatter/BooleanFormatter.tsx index df57b528b1..a6d58a6bcd 100644 --- a/apps/studio/components/grid/components/formatter/BooleanFormatter.tsx +++ b/apps/studio/components/grid/components/formatter/BooleanFormatter.tsx @@ -1,5 +1,6 @@ import type { PropsWithChildren } from 'react' import type { RenderCellProps } from 'react-data-grid' + import type { SupaRow } from '../../types' import { NullValue } from '../common/NullValue' diff --git a/apps/studio/components/grid/components/formatter/DefaultFormatter.tsx b/apps/studio/components/grid/components/formatter/DefaultFormatter.tsx index 745ba66168..edc12b34bc 100644 --- a/apps/studio/components/grid/components/formatter/DefaultFormatter.tsx +++ b/apps/studio/components/grid/components/formatter/DefaultFormatter.tsx @@ -1,9 +1,9 @@ import { PropsWithChildren } from 'react' import type { RenderCellProps } from 'react-data-grid' -import { SupaRow } from 'components/grid/types' import { EmptyValue } from '../common/EmptyValue' import { NullValue } from '../common/NullValue' +import { SupaRow } from '@/components/grid/types' export const DefaultFormatter = (p: PropsWithChildren>) => { let value = p.row[p.column.key] diff --git a/apps/studio/components/grid/components/formatter/ForeignKeyFormatter.tsx b/apps/studio/components/grid/components/formatter/ForeignKeyFormatter.tsx index ef26a4d64e..51c5582ea3 100644 --- a/apps/studio/components/grid/components/formatter/ForeignKeyFormatter.tsx +++ b/apps/studio/components/grid/components/formatter/ForeignKeyFormatter.tsx @@ -1,10 +1,4 @@ import type { PostgresTable } from '@supabase/postgres-meta' -import { convertByteaToHex } from 'components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useTableEditorQuery } from 'data/table-editor/table-editor-query' -import { isTableLike } from 'data/table-editor/table-editor-types' -import { useTableQuery } from 'data/tables/table-retrieve-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { ArrowRight } from 'lucide-react' import type { PropsWithChildren } from 'react' import type { RenderCellProps } from 'react-data-grid' @@ -14,6 +8,12 @@ import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import type { SupaRow } from '../../types' import { NullValue } from '../common/NullValue' import { ReferenceRecordPeek } from './ReferenceRecordPeek' +import { convertByteaToHex } from '@/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useTableEditorQuery } from '@/data/table-editor/table-editor-query' +import { isTableLike } from '@/data/table-editor/table-editor-types' +import { useTableQuery } from '@/data/tables/table-retrieve-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface Props extends PropsWithChildren> { tableId?: number diff --git a/apps/studio/components/grid/components/formatter/ReferenceRecordPeek.tsx b/apps/studio/components/grid/components/formatter/ReferenceRecordPeek.tsx index 58fed96b2b..8fb5bf1bd4 100644 --- a/apps/studio/components/grid/components/formatter/ReferenceRecordPeek.tsx +++ b/apps/studio/components/grid/components/formatter/ReferenceRecordPeek.tsx @@ -1,21 +1,6 @@ import { PostgresTable } from '@supabase/postgres-meta' import { keepPreviousData } from '@tanstack/react-query' import { useParams } from 'common' -import { COLUMN_MIN_WIDTH } from 'components/grid/constants' -import type { SupaColumn, SupaRow } from 'components/grid/types' -import { - ESTIMATED_CHARACTER_PIXEL_WIDTH, - getColumnDefaultWidth, -} from 'components/grid/utils/gridColumns' -import { - isArrayColumn, - isBinaryColumn, - isBoolColumn, - isJsonColumn, -} from 'components/grid/utils/types' -import { EditorTablePageLink } from 'data/prefetchers/project.$ref.editor.$id' -import { useTableRowsQuery } from 'data/table-rows/table-rows-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Key } from 'lucide-react' import { useMemo, useRef } from 'react' import DataGrid, { CalculatedColumn, Column } from 'react-data-grid' @@ -27,6 +12,21 @@ import { BooleanFormatter } from './BooleanFormatter' import { CellContextMenuWrapper } from './CellContextMenuWrapper' import { DefaultFormatter } from './DefaultFormatter' import { JsonFormatter } from './JsonFormatter' +import { COLUMN_MIN_WIDTH } from '@/components/grid/constants' +import type { SupaColumn, SupaRow } from '@/components/grid/types' +import { + ESTIMATED_CHARACTER_PIXEL_WIDTH, + getColumnDefaultWidth, +} from '@/components/grid/utils/gridColumns' +import { + isArrayColumn, + isBinaryColumn, + isBoolColumn, + isJsonColumn, +} from '@/components/grid/utils/types' +import { EditorTablePageLink } from '@/data/prefetchers/project.$ref.editor.$id' +import { useTableRowsQuery } from '@/data/table-rows/table-rows-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface ReferenceRecordPeekProps { table: PostgresTable diff --git a/apps/studio/components/grid/components/grid/ColumnHeader.tsx b/apps/studio/components/grid/components/grid/ColumnHeader.tsx index 6814549844..4218655876 100644 --- a/apps/studio/components/grid/components/grid/ColumnHeader.tsx +++ b/apps/studio/components/grid/components/grid/ColumnHeader.tsx @@ -1,10 +1,8 @@ import { FOREIGN_KEY_CASCADE_ACTION } from '@supabase/pg-meta' -import { getForeignKeyCascadeAction } from 'components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnEditor.utils' import type { XYCoord } from 'dnd-core' import { ArrowRight, Key, Lightbulb, Link, Lock } from 'lucide-react' import { useEffect, useRef } from 'react' import { useDrag, useDrop } from 'react-dnd' -import { useTableEditorTableStateSnapshot } from 'state/table-editor-table' import { Tooltip, TooltipContent, TooltipTrigger } from 'ui' import { @@ -13,6 +11,8 @@ import { } from '../../context/TableIndexAdvisorContext' import type { ColumnHeaderProps, ColumnType, DragItem, GridForeignKey } from '../../types' import { ColumnMenu } from '../menu/ColumnMenu' +import { getForeignKeyCascadeAction } from '@/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnEditor.utils' +import { useTableEditorTableStateSnapshot } from '@/state/table-editor-table' export function ColumnHeader({ column, diff --git a/apps/studio/components/grid/components/grid/Grid.tsx b/apps/studio/components/grid/components/grid/Grid.tsx index 049a775d00..903821c97a 100644 --- a/apps/studio/components/grid/components/grid/Grid.tsx +++ b/apps/studio/components/grid/components/grid/Grid.tsx @@ -1,19 +1,6 @@ import type { PostgresColumn } from '@supabase/postgres-meta' -import { useTableFilterNew } from 'components/grid/hooks/useTableFilterNew' -import { handleCopyCell } from 'components/grid/SupabaseGrid.utils' -import { useIsTableFilterBarEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' -import { formatForeignKeys } from 'components/interfaces/TableGridEditor/SidePanelEditor/ForeignKeySelector/ForeignKeySelector.utils' -import { useForeignKeyConstraintsQuery } from 'data/database/foreign-key-constraints-query' -import { ENTITY_TYPE } from 'data/entity-types/entity-type-constants' -import { isTableLike } from 'data/table-editor/table-editor-types' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useCsvFileDrop } from 'hooks/ui/useCsvFileDrop' import { forwardRef, memo, Ref, useCallback, useMemo, useRef } from 'react' import DataGrid, { CalculatedColumn, DataGridHandle } from 'react-data-grid' -import { useTableEditorStateSnapshot } from 'state/table-editor' -import { useTableEditorTableStateSnapshot } from 'state/table-editor-table' import { Button, cn } from 'ui' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { ref as valtioRef } from 'valtio' @@ -24,6 +11,19 @@ import { isPendingAddRow, isPendingDeleteRow } from '../../types' import { useOnRowsChange } from './Grid.utils' import { GridError } from './GridError' import { RowRenderer } from './RowRenderer' +import { useTableFilterNew } from '@/components/grid/hooks/useTableFilterNew' +import { handleCopyCell } from '@/components/grid/SupabaseGrid.utils' +import { useIsTableFilterBarEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import { formatForeignKeys } from '@/components/interfaces/TableGridEditor/SidePanelEditor/ForeignKeySelector/ForeignKeySelector.utils' +import { useForeignKeyConstraintsQuery } from '@/data/database/foreign-key-constraints-query' +import { ENTITY_TYPE } from '@/data/entity-types/entity-type-constants' +import { isTableLike } from '@/data/table-editor/table-editor-types' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useCsvFileDrop } from '@/hooks/ui/useCsvFileDrop' +import { useTableEditorStateSnapshot } from '@/state/table-editor' +import { useTableEditorTableStateSnapshot } from '@/state/table-editor-table' import { ResponseError } from '@/types' const rowKeyGetter = (row: SupaRow) => { diff --git a/apps/studio/components/grid/components/grid/Grid.utils.tsx b/apps/studio/components/grid/components/grid/Grid.utils.tsx index 354c39012b..8edb10cd8d 100644 --- a/apps/studio/components/grid/components/grid/Grid.utils.tsx +++ b/apps/studio/components/grid/components/grid/Grid.utils.tsx @@ -1,15 +1,15 @@ -import { SupaRow } from 'components/grid/types' -import { convertByteaToHex } from 'components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils' -import { DocsButton } from 'components/ui/DocsButton' -import { isTableLike } from 'data/table-editor/table-editor-types' -import { DOCS_URL } from 'lib/constants' import { useCallback } from 'react' import { RowsChangeData } from 'react-data-grid' import { toast } from 'sonner' -import { useTableEditorTableStateSnapshot } from 'state/table-editor-table' -import type { Dictionary } from 'types' import { useTableRowOperations } from '../../hooks/useTableRowOperations' +import { SupaRow } from '@/components/grid/types' +import { convertByteaToHex } from '@/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils' +import { DocsButton } from '@/components/ui/DocsButton' +import { isTableLike } from '@/data/table-editor/table-editor-types' +import { DOCS_URL } from '@/lib/constants' +import { useTableEditorTableStateSnapshot } from '@/state/table-editor-table' +import type { Dictionary } from '@/types' export function useOnRowsChange(rows: SupaRow[]) { const snap = useTableEditorTableStateSnapshot() diff --git a/apps/studio/components/grid/components/grid/GridError.tsx b/apps/studio/components/grid/components/grid/GridError.tsx index fa8def1d37..b7654a52d1 100644 --- a/apps/studio/components/grid/components/grid/GridError.tsx +++ b/apps/studio/components/grid/components/grid/GridError.tsx @@ -1,21 +1,21 @@ import { useParams } from 'common' -import { useTableFilter } from 'components/grid/hooks/useTableFilter' -import { useTableFilterNew } from 'components/grid/hooks/useTableFilterNew' -import { useTableSort } from 'components/grid/hooks/useTableSort' -import AlertError from 'components/ui/AlertError' -import { InlineLink } from 'components/ui/InlineLink' -import { ENTITY_TYPE } from 'data/entity-types/entity-type-constants' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { useCallback } from 'react' -import { useTableEditorTableStateSnapshot } from 'state/table-editor-table' import { Button } from 'ui' import { Admonition } from 'ui-patterns' import { isFilterRelatedError } from './GridError.utils' +import { useTableFilter } from '@/components/grid/hooks/useTableFilter' +import { useTableFilterNew } from '@/components/grid/hooks/useTableFilterNew' +import { useTableSort } from '@/components/grid/hooks/useTableSort' import { useIsTableFilterBarEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import AlertError from '@/components/ui/AlertError' import { HighCostError } from '@/components/ui/HighQueryCost' +import { InlineLink } from '@/components/ui/InlineLink' +import { ENTITY_TYPE } from '@/data/entity-types/entity-type-constants' import { COST_THRESHOLD_ERROR } from '@/data/sql/execute-sql-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' import { useTableEditorStateSnapshot } from '@/state/table-editor' +import { useTableEditorTableStateSnapshot } from '@/state/table-editor-table' import { ResponseError } from '@/types' export const GridError = ({ error }: { error?: ResponseError | null }) => { diff --git a/apps/studio/components/grid/components/grid/RowRenderer.tsx b/apps/studio/components/grid/components/grid/RowRenderer.tsx index fed375a8d7..8a9cbb8f1d 100644 --- a/apps/studio/components/grid/components/grid/RowRenderer.tsx +++ b/apps/studio/components/grid/components/grid/RowRenderer.tsx @@ -1,9 +1,10 @@ -import { ROW_CONTEXT_MENU_ID } from 'components/grid/constants' -import { SupaRow } from 'components/grid/types' import type { Key } from 'react' import { TriggerEvent, useContextMenu } from 'react-contexify' import { RenderRowProps, Row } from 'react-data-grid' +import { ROW_CONTEXT_MENU_ID } from '@/components/grid/constants' +import { SupaRow } from '@/components/grid/types' + /** * TODO: Refactor to use CellContextMenuWrapper instead of react-contexify */ diff --git a/apps/studio/components/grid/components/header/ExportDialog.tsx b/apps/studio/components/grid/components/header/ExportDialog.tsx index e397b669ed..0ab3441398 100644 --- a/apps/studio/components/grid/components/header/ExportDialog.tsx +++ b/apps/studio/components/grid/components/header/ExportDialog.tsx @@ -1,12 +1,5 @@ import { useParams } from 'common' -import { Filter, Sort, SupaTable } from 'components/grid/types' -import { getConnectionStrings } from 'components/interfaces/Connect/DatabaseSettings.utils' -import { useReadReplicasQuery } from 'data/read-replicas/replicas-query' -import { getAllTableRowsSql } from 'data/table-rows/table-rows-query' -import { pluckObjectFields } from 'lib/helpers' -import { RoleImpersonationState, wrapWithRoleImpersonation } from 'lib/role-impersonation' import { useState } from 'react' -import { useRoleImpersonationStateSnapshot } from 'state/role-impersonation-state' import { Button, cn, @@ -25,6 +18,14 @@ import { import { Admonition } from 'ui-patterns' import { CodeBlock } from 'ui-patterns/CodeBlock' +import { Filter, Sort, SupaTable } from '@/components/grid/types' +import { getConnectionStrings } from '@/components/interfaces/Connect/DatabaseSettings.utils' +import { useReadReplicasQuery } from '@/data/read-replicas/replicas-query' +import { getAllTableRowsSql } from '@/data/table-rows/table-rows-query' +import { pluckObjectFields } from '@/lib/helpers' +import { RoleImpersonationState, wrapWithRoleImpersonation } from '@/lib/role-impersonation' +import { useRoleImpersonationStateSnapshot } from '@/state/role-impersonation-state' + interface ExportDialogProps { table?: SupaTable filters?: Filter[] diff --git a/apps/studio/components/grid/components/header/Header.tsx b/apps/studio/components/grid/components/header/Header.tsx index 1507ec69d4..0fe8adac20 100644 --- a/apps/studio/components/grid/components/header/Header.tsx +++ b/apps/studio/components/grid/components/header/Header.tsx @@ -1,33 +1,9 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { keepPreviousData, useQueryClient } from '@tanstack/react-query' import { useParams } from 'common' -import { useTableFilter } from 'components/grid/hooks/useTableFilter' -import { useTableRowOperations } from 'components/grid/hooks/useTableRowOperations' -import { useTableSort } from 'components/grid/hooks/useTableSort' -import { GridHeaderActions } from 'components/interfaces/TableGridEditor/GridHeaderActions' -import { formatTableRowsToSQL } from 'components/interfaces/TableGridEditor/TableEntity.utils' -import { - useExportAllRowsAsCsv, - useExportAllRowsAsJson, - useExportAllRowsAsSql, -} from 'components/layouts/TableEditorLayout/ExportAllRows' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useTableRowsCountQuery } from 'data/table-rows/table-rows-count-query' -import { useTableRowsQuery } from 'data/table-rows/table-rows-query' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { RoleImpersonationState } from 'lib/role-impersonation' import { ArrowUp, ChevronDown, FileText, Trash } from 'lucide-react' import { ReactNode, useState } from 'react' import { toast } from 'sonner' -import { - useRoleImpersonationStateSnapshot, - useSubscribeToImpersonatedRole, -} from 'state/role-impersonation-state' -import { useTableEditorStateSnapshot } from 'state/table-editor' -import { useTableEditorTableStateSnapshot } from 'state/table-editor-table' import { Button, cn, @@ -43,6 +19,30 @@ import { ExportDialog } from './ExportDialog' import { FilterPopover } from './filter/FilterPopover' import { formatRowsForCSV } from './Header.utils' import { SortPopover } from './sort/SortPopover' +import { useTableFilter } from '@/components/grid/hooks/useTableFilter' +import { useTableRowOperations } from '@/components/grid/hooks/useTableRowOperations' +import { useTableSort } from '@/components/grid/hooks/useTableSort' +import { GridHeaderActions } from '@/components/interfaces/TableGridEditor/GridHeaderActions' +import { formatTableRowsToSQL } from '@/components/interfaces/TableGridEditor/TableEntity.utils' +import { + useExportAllRowsAsCsv, + useExportAllRowsAsJson, + useExportAllRowsAsSql, +} from '@/components/layouts/TableEditorLayout/ExportAllRows' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useTableRowsCountQuery } from '@/data/table-rows/table-rows-count-query' +import { useTableRowsQuery } from '@/data/table-rows/table-rows-query' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { RoleImpersonationState } from '@/lib/role-impersonation' +import { + useRoleImpersonationStateSnapshot, + useSubscribeToImpersonatedRole, +} from '@/state/role-impersonation-state' +import { useTableEditorStateSnapshot } from '@/state/table-editor' +import { useTableEditorTableStateSnapshot } from '@/state/table-editor-table' export type HeaderProps = { customHeader: ReactNode diff --git a/apps/studio/components/grid/components/header/HeaderNew.tsx b/apps/studio/components/grid/components/header/HeaderNew.tsx index 3f8d743c22..e36ba1ea2b 100644 --- a/apps/studio/components/grid/components/header/HeaderNew.tsx +++ b/apps/studio/components/grid/components/header/HeaderNew.tsx @@ -1,32 +1,9 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { keepPreviousData } from '@tanstack/react-query' import { useParams } from 'common' -import { useTableRowOperations } from 'components/grid/hooks/useTableRowOperations' -import { useTableSort } from 'components/grid/hooks/useTableSort' -import { GridHeaderActions } from 'components/interfaces/TableGridEditor/GridHeaderActions' -import { formatTableRowsToSQL } from 'components/interfaces/TableGridEditor/TableEntity.utils' -import { - useExportAllRowsAsCsv, - useExportAllRowsAsJson, - useExportAllRowsAsSql, -} from 'components/layouts/TableEditorLayout/ExportAllRows' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useTableRowsCountQuery } from 'data/table-rows/table-rows-count-query' -import { useTableRowsQuery } from 'data/table-rows/table-rows-query' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { RoleImpersonationState } from 'lib/role-impersonation' import { ArrowUp, ChevronDown, FileText, Trash } from 'lucide-react' import { ReactNode, useState } from 'react' import { toast } from 'sonner' -import { - useRoleImpersonationStateSnapshot, - useSubscribeToImpersonatedRole, -} from 'state/role-impersonation-state' -import { useTableEditorStateSnapshot } from 'state/table-editor' -import { useTableEditorTableStateSnapshot } from 'state/table-editor-table' import { Button, cn, @@ -43,6 +20,29 @@ import { ExportDialog } from './ExportDialog' import { FilterPopoverNew } from './filter/FilterPopoverNew' import { formatRowsForCSV } from './Header.utils' import { SortPopover } from './sort/SortPopover' +import { useTableRowOperations } from '@/components/grid/hooks/useTableRowOperations' +import { useTableSort } from '@/components/grid/hooks/useTableSort' +import { GridHeaderActions } from '@/components/interfaces/TableGridEditor/GridHeaderActions' +import { formatTableRowsToSQL } from '@/components/interfaces/TableGridEditor/TableEntity.utils' +import { + useExportAllRowsAsCsv, + useExportAllRowsAsJson, + useExportAllRowsAsSql, +} from '@/components/layouts/TableEditorLayout/ExportAllRows' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useTableRowsCountQuery } from '@/data/table-rows/table-rows-count-query' +import { useTableRowsQuery } from '@/data/table-rows/table-rows-query' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { RoleImpersonationState } from '@/lib/role-impersonation' +import { + useRoleImpersonationStateSnapshot, + useSubscribeToImpersonatedRole, +} from '@/state/role-impersonation-state' +import { useTableEditorStateSnapshot } from '@/state/table-editor' +import { useTableEditorTableStateSnapshot } from '@/state/table-editor-table' export type HeaderProps = { customHeader: ReactNode diff --git a/apps/studio/components/grid/components/header/RefreshButton.tsx b/apps/studio/components/grid/components/header/RefreshButton.tsx index da14e77987..48860aa1a8 100644 --- a/apps/studio/components/grid/components/header/RefreshButton.tsx +++ b/apps/studio/components/grid/components/header/RefreshButton.tsx @@ -1,10 +1,10 @@ import { useQueryClient } from '@tanstack/react-query' +import { useParams } from 'common' import { RefreshCw } from 'lucide-react' -import { useParams } from 'common' -import { useTableIndexAdvisor } from 'components/grid/context/TableIndexAdvisorContext' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { tableRowKeys } from 'data/table-rows/keys' +import { useTableIndexAdvisor } from '@/components/grid/context/TableIndexAdvisorContext' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { tableRowKeys } from '@/data/table-rows/keys' export type RefreshButtonProps = { tableId?: number diff --git a/apps/studio/components/grid/components/header/filter/FilterPopover.tsx b/apps/studio/components/grid/components/header/filter/FilterPopover.tsx index e8c103ac7b..e8ad05fe4d 100644 --- a/apps/studio/components/grid/components/header/filter/FilterPopover.tsx +++ b/apps/studio/components/grid/components/header/filter/FilterPopover.tsx @@ -1,8 +1,8 @@ import { useMemo } from 'react' -import { useTableFilter } from 'components/grid/hooks/useTableFilter' -import { formatFilterURLParams } from 'components/grid/SupabaseGrid.utils' import { FilterPopoverPrimitive } from './FilterPopoverPrimitive' +import { useTableFilter } from '@/components/grid/hooks/useTableFilter' +import { formatFilterURLParams } from '@/components/grid/SupabaseGrid.utils' export const FilterPopover = () => { const { urlFilters, onApplyFilters } = useTableFilter() diff --git a/apps/studio/components/grid/components/header/filter/FilterPopoverNew.tsx b/apps/studio/components/grid/components/header/filter/FilterPopoverNew.tsx index 4cfb450546..5e86396932 100644 --- a/apps/studio/components/grid/components/header/filter/FilterPopoverNew.tsx +++ b/apps/studio/components/grid/components/header/filter/FilterPopoverNew.tsx @@ -1,10 +1,6 @@ -import { useTableFilterNew } from 'components/grid/hooks/useTableFilterNew' -import type { Filter } from 'components/grid/types' -import { useSqlFilterGenerateMutation } from 'data/ai/sql-filter-mutation' import { format } from 'date-fns' import { Loader2 } from 'lucide-react' import { useCallback, useMemo, useState } from 'react' -import { useTableEditorTableStateSnapshot } from 'state/table-editor-table' import { AiIconAnimation, Button, Calendar } from 'ui' import { CustomOptionProps, @@ -18,6 +14,10 @@ import { } from 'ui-patterns' import { columnToFilterProperty } from './FilterPopoverNew.utils' +import { useTableFilterNew } from '@/components/grid/hooks/useTableFilterNew' +import type { Filter } from '@/components/grid/types' +import { useSqlFilterGenerateMutation } from '@/data/ai/sql-filter-mutation' +import { useTableEditorTableStateSnapshot } from '@/state/table-editor-table' export interface FilterPopoverProps { portal?: boolean diff --git a/apps/studio/components/grid/components/header/filter/FilterPopoverNew.utils.ts b/apps/studio/components/grid/components/header/filter/FilterPopoverNew.utils.ts index c450600043..78a28c587e 100644 --- a/apps/studio/components/grid/components/header/filter/FilterPopoverNew.utils.ts +++ b/apps/studio/components/grid/components/header/filter/FilterPopoverNew.utils.ts @@ -1,13 +1,14 @@ -import type { Filter, SupaColumn } from 'components/grid/types' +import { format } from 'date-fns' +import type { FilterProperty, OperatorDefinition } from 'ui-patterns' + +import type { Filter, SupaColumn } from '@/components/grid/types' import { isBoolColumn, isDateColumn, isDateTimeColumn, isEnumColumn, isTimeColumn, -} from 'components/grid/utils/types' -import { format } from 'date-fns' -import type { FilterProperty, OperatorDefinition } from 'ui-patterns' +} from '@/components/grid/utils/types' // Check if column is a date/datetime/time type function isDateLikeColumn(column: SupaColumn): boolean { diff --git a/apps/studio/components/grid/components/header/filter/FilterPopoverPrimitive.tsx b/apps/studio/components/grid/components/header/filter/FilterPopoverPrimitive.tsx index a3e4eb1c32..d19cecd56f 100644 --- a/apps/studio/components/grid/components/header/filter/FilterPopoverPrimitive.tsx +++ b/apps/studio/components/grid/components/header/filter/FilterPopoverPrimitive.tsx @@ -1,17 +1,17 @@ import { isEqual } from 'lodash' import { Filter as FilterIcon, Plus } from 'lucide-react' import { KeyboardEvent, useCallback, useMemo, useState } from 'react' - -import type { Filter } from 'components/grid/types' -import { useTableEditorTableStateSnapshot } from 'state/table-editor-table' import { Button, + Popover_Shadcn_, PopoverContent_Shadcn_, PopoverSeparator_Shadcn_, PopoverTrigger_Shadcn_, - Popover_Shadcn_, } from 'ui' + import FilterRow from './FilterRow' +import type { Filter } from '@/components/grid/types' +import { useTableEditorTableStateSnapshot } from '@/state/table-editor-table' export interface FilterPopoverPrimitiveProps { buttonText?: string diff --git a/apps/studio/components/grid/components/header/filter/FilterRow.tsx b/apps/studio/components/grid/components/header/filter/FilterRow.tsx index 9df3ebc6d0..daf8ac174b 100644 --- a/apps/studio/components/grid/components/header/filter/FilterRow.tsx +++ b/apps/studio/components/grid/components/header/filter/FilterRow.tsx @@ -1,11 +1,11 @@ import { ChevronDown, X } from 'lucide-react' import { KeyboardEvent, memo } from 'react' - -import { DropdownControl } from 'components/grid/components/common/DropdownControl' -import type { Filter, FilterOperator } from 'components/grid/types' -import { useTableEditorTableStateSnapshot } from 'state/table-editor-table' import { Button, Input } from 'ui' + import { FilterOperatorOptions } from './Filter.constants' +import { DropdownControl } from '@/components/grid/components/common/DropdownControl' +import type { Filter, FilterOperator } from '@/components/grid/types' +import { useTableEditorTableStateSnapshot } from '@/state/table-editor-table' export interface FilterRowProps { filterIdx: number diff --git a/apps/studio/components/grid/components/header/sort/SortPopover.tsx b/apps/studio/components/grid/components/header/sort/SortPopover.tsx index cc3cc71532..53a344f753 100644 --- a/apps/studio/components/grid/components/header/sort/SortPopover.tsx +++ b/apps/studio/components/grid/components/header/sort/SortPopover.tsx @@ -1,9 +1,9 @@ import { useMemo } from 'react' -import { formatSortURLParams } from 'components/grid/SupabaseGrid.utils' -import { useTableSort } from 'components/grid/hooks/useTableSort' -import { useTableEditorTableStateSnapshot } from 'state/table-editor-table' import { SortPopoverPrimitive } from './SortPopoverPrimitive' +import { useTableSort } from '@/components/grid/hooks/useTableSort' +import { formatSortURLParams } from '@/components/grid/SupabaseGrid.utils' +import { useTableEditorTableStateSnapshot } from '@/state/table-editor-table' export interface SortPopoverProps { tableQueriesEnabled?: boolean diff --git a/apps/studio/components/grid/components/header/sort/SortPopoverPrimitive.tsx b/apps/studio/components/grid/components/header/sort/SortPopoverPrimitive.tsx index 963e981f12..a929735fe1 100644 --- a/apps/studio/components/grid/components/header/sort/SortPopoverPrimitive.tsx +++ b/apps/studio/components/grid/components/header/sort/SortPopoverPrimitive.tsx @@ -1,19 +1,9 @@ import { THRESHOLD_COUNT } from '@supabase/pg-meta' import { keepPreviousData } from '@tanstack/react-query' import { useParams } from 'common' -import { useTableFilter } from 'components/grid/hooks/useTableFilter' -import type { Sort } from 'components/grid/types' -import { InlineLink } from 'components/ui/InlineLink' -import { useTableRowsCountQuery } from 'data/table-rows/table-rows-count-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { isEqual } from 'lodash' import { ChevronDown, List } from 'lucide-react' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' -import { - useRoleImpersonationStateSnapshot, - type RoleImpersonationState, -} from 'state/role-impersonation-state' -import { useTableEditorTableStateSnapshot } from 'state/table-editor-table' import { Button, Popover_Shadcn_, @@ -25,6 +15,16 @@ import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { DropdownControl } from '../../common/DropdownControl' import SortRow from './SortRow' +import { useTableFilter } from '@/components/grid/hooks/useTableFilter' +import type { Sort } from '@/components/grid/types' +import { InlineLink } from '@/components/ui/InlineLink' +import { useTableRowsCountQuery } from '@/data/table-rows/table-rows-count-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { + useRoleImpersonationStateSnapshot, + type RoleImpersonationState, +} from '@/state/role-impersonation-state' +import { useTableEditorTableStateSnapshot } from '@/state/table-editor-table' export interface SortPopoverPrimitiveProps { buttonText?: string diff --git a/apps/studio/components/grid/components/header/sort/SortRow.tsx b/apps/studio/components/grid/components/header/sort/SortRow.tsx index a48ec06400..b941e847a6 100644 --- a/apps/studio/components/grid/components/header/sort/SortRow.tsx +++ b/apps/studio/components/grid/components/header/sort/SortRow.tsx @@ -1,11 +1,12 @@ -import type { DragItem, Sort } from 'components/grid/types' import type { XYCoord } from 'dnd-core' import { Menu, X } from 'lucide-react' import { memo, useRef } from 'react' import { useDrag, useDrop } from 'react-dnd' -import { useTableEditorTableStateSnapshot } from 'state/table-editor-table' import { Button, Switch } from 'ui' +import type { DragItem, Sort } from '@/components/grid/types' +import { useTableEditorTableStateSnapshot } from '@/state/table-editor-table' + export interface SortRowProps { index: number columnName: string diff --git a/apps/studio/components/grid/components/menu/ColumnMenu.tsx b/apps/studio/components/grid/components/menu/ColumnMenu.tsx index e6bc661f68..df31191bb2 100644 --- a/apps/studio/components/grid/components/menu/ColumnMenu.tsx +++ b/apps/studio/components/grid/components/menu/ColumnMenu.tsx @@ -1,9 +1,5 @@ -import { useTableSort } from 'components/grid/hooks/useTableSort' -import type { Sort } from 'components/grid/types' import { ArrowDown, ArrowUp, ChevronDown, Copy, Edit, Lock, Trash, Unlock } from 'lucide-react' import type { CalculatedColumn } from 'react-data-grid' -import { useTableEditorStateSnapshot } from 'state/table-editor' -import { useTableEditorTableStateSnapshot } from 'state/table-editor-table' import { Button, cn, @@ -18,6 +14,11 @@ import { TooltipTrigger, } from 'ui' +import { useTableSort } from '@/components/grid/hooks/useTableSort' +import type { Sort } from '@/components/grid/types' +import { useTableEditorStateSnapshot } from '@/state/table-editor' +import { useTableEditorTableStateSnapshot } from '@/state/table-editor-table' + interface ColumnMenuProps { column: CalculatedColumn isEncrypted?: boolean diff --git a/apps/studio/components/grid/components/menu/RowContextMenu.tsx b/apps/studio/components/grid/components/menu/RowContextMenu.tsx index 864e3616cf..cc75494328 100644 --- a/apps/studio/components/grid/components/menu/RowContextMenu.tsx +++ b/apps/studio/components/grid/components/menu/RowContextMenu.tsx @@ -1,17 +1,17 @@ -import { ROW_CONTEXT_MENU_ID } from 'components/grid/constants' -import type { SupaRow } from 'components/grid/types' -import { useIsTableFilterBarEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' import { Copy, Edit, ListFilter, Trash } from 'lucide-react' import { useCallback } from 'react' import { Item, ItemParams, Menu } from 'react-contexify' import { toast } from 'sonner' -import { useTableEditorStateSnapshot } from 'state/table-editor' -import { useTableEditorTableStateSnapshot } from 'state/table-editor-table' import { copyToClipboard, DialogSectionSeparator } from 'ui' import { useTableRowOperations } from '../../hooks/useTableRowOperations' import { formatClipboardValue } from '../../utils/common' import { buildFilterFromCellValue, isComplexValue } from '../header/filter/FilterPopoverNew.utils' +import { ROW_CONTEXT_MENU_ID } from '@/components/grid/constants' +import type { SupaRow } from '@/components/grid/types' +import { useIsTableFilterBarEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import { useTableEditorStateSnapshot } from '@/state/table-editor' +import { useTableEditorTableStateSnapshot } from '@/state/table-editor-table' type RowContextMenuProps = { rows: SupaRow[] diff --git a/apps/studio/components/grid/context/TableIndexAdvisorContext.tsx b/apps/studio/components/grid/context/TableIndexAdvisorContext.tsx index 7db08a70e8..c12f949293 100644 --- a/apps/studio/components/grid/context/TableIndexAdvisorContext.tsx +++ b/apps/studio/components/grid/context/TableIndexAdvisorContext.tsx @@ -1,16 +1,17 @@ import { useQueryClient } from '@tanstack/react-query' -import { useIndexAdvisorStatus } from 'components/interfaces/QueryPerformance/hooks/useIsIndexAdvisorStatus' -import { QueryIndexes } from 'components/interfaces/QueryPerformance/QueryIndexes' -import { databaseKeys } from 'data/database/keys' +import { createContext, PropsWithChildren, useCallback, useContext, useState } from 'react' +import { Sheet, SheetContent, SheetHeader, SheetTitle } from 'ui' + +import { useIndexAdvisorStatus } from '@/components/interfaces/QueryPerformance/hooks/useIsIndexAdvisorStatus' +import { QueryIndexes } from '@/components/interfaces/QueryPerformance/QueryIndexes' +import { databaseKeys } from '@/data/database/keys' import { cleanIndexColumnName, IndexAdvisorSuggestion, TableIndexAdvisorData, useTableIndexAdvisorQuery, -} from 'data/database/table-index-advisor-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { createContext, PropsWithChildren, useCallback, useContext, useState } from 'react' -import { Sheet, SheetContent, SheetHeader, SheetTitle } from 'ui' +} from '@/data/database/table-index-advisor-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface TableIndexAdvisorContextValue { isLoading: boolean diff --git a/apps/studio/components/grid/hooks/useOperationQueueActions.ts b/apps/studio/components/grid/hooks/useOperationQueueActions.ts index c7ba7c17a8..a73ed1d8d0 100644 --- a/apps/studio/components/grid/hooks/useOperationQueueActions.ts +++ b/apps/studio/components/grid/hooks/useOperationQueueActions.ts @@ -1,12 +1,13 @@ import { useQueryClient } from '@tanstack/react-query' -import { tableRowKeys } from 'data/table-rows/keys' -import { useOperationQueueSaveMutation } from 'data/table-rows/operation-queue-save-mutation' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { useCallback } from 'react' import { toast } from 'sonner' -import { useGetImpersonatedRoleState } from 'state/role-impersonation-state' -import { useTableEditorStateSnapshot } from 'state/table-editor' -import { QueuedOperation } from 'state/table-editor-operation-queue.types' + +import { tableRowKeys } from '@/data/table-rows/keys' +import { useOperationQueueSaveMutation } from '@/data/table-rows/operation-queue-save-mutation' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useGetImpersonatedRoleState } from '@/state/role-impersonation-state' +import { useTableEditorStateSnapshot } from '@/state/table-editor' +import { QueuedOperation } from '@/state/table-editor-operation-queue.types' interface UseOperationQueueActionsOptions { onSaveSuccess?: () => void diff --git a/apps/studio/components/grid/hooks/useTableFilter.ts b/apps/studio/components/grid/hooks/useTableFilter.ts index c4fb62a177..9fe5be3770 100644 --- a/apps/studio/components/grid/hooks/useTableFilter.ts +++ b/apps/studio/components/grid/hooks/useTableFilter.ts @@ -1,8 +1,9 @@ -import { filtersToUrlParams, formatFilterURLParams } from 'components/grid/SupabaseGrid.utils' -import type { Filter } from 'components/grid/types' -import { useTableEditorFiltersSort } from 'hooks/misc/useTableEditorFiltersSort' import { useCallback } from 'react' +import { filtersToUrlParams, formatFilterURLParams } from '@/components/grid/SupabaseGrid.utils' +import type { Filter } from '@/components/grid/types' +import { useTableEditorFiltersSort } from '@/hooks/misc/useTableEditorFiltersSort' + /** * Hook for managing table filter URL parameters and saving. * NO direct snapshot interaction. diff --git a/apps/studio/components/grid/hooks/useTableFilterNew.ts b/apps/studio/components/grid/hooks/useTableFilterNew.ts index 25fed971f8..6dd44bac0a 100644 --- a/apps/studio/components/grid/hooks/useTableFilterNew.ts +++ b/apps/studio/components/grid/hooks/useTableFilterNew.ts @@ -1,5 +1,5 @@ -import { Filter } from 'components/grid/types' -import { useTableEditorTableStateSnapshot } from 'state/table-editor-table' +import { Filter } from '@/components/grid/types' +import { useTableEditorTableStateSnapshot } from '@/state/table-editor-table' /** * Hook for managing table filters via the table editor state (snap). diff --git a/apps/studio/components/grid/hooks/useTableRowOperations.ts b/apps/studio/components/grid/hooks/useTableRowOperations.ts index 2c3e463e6d..2ed9ab80ea 100644 --- a/apps/studio/components/grid/hooks/useTableRowOperations.ts +++ b/apps/studio/components/grid/hooks/useTableRowOperations.ts @@ -1,24 +1,24 @@ import { QueryKey, useQueryClient } from '@tanstack/react-query' -import type { SupaRow } from 'components/grid/types' +import { useCallback } from 'react' +import { toast } from 'sonner' + +import type { PendingAddRow } from '../types' +import type { SupaRow } from '@/components/grid/types' import { queueCellEditWithOptimisticUpdate, queueRowAddWithOptimisticUpdate, queueRowDeletesWithOptimisticUpdate, -} from 'components/grid/utils/queueOperationUtils' -import { useIsQueueOperationsEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' -import { isTableLike, type Entity } from 'data/table-editor/table-editor-types' -import { tableRowKeys } from 'data/table-rows/keys' -import { useTableRowCreateMutation } from 'data/table-rows/table-row-create-mutation' -import { useTableRowUpdateMutation } from 'data/table-rows/table-row-update-mutation' -import type { TableRowsData } from 'data/table-rows/table-rows-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useCallback } from 'react' -import { toast } from 'sonner' -import { useGetImpersonatedRoleState } from 'state/role-impersonation-state' -import { useTableEditorStateSnapshot } from 'state/table-editor' -import type { Dictionary } from 'types' - -import type { PendingAddRow } from '../types' +} from '@/components/grid/utils/queueOperationUtils' +import { useIsQueueOperationsEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import { isTableLike, type Entity } from '@/data/table-editor/table-editor-types' +import { tableRowKeys } from '@/data/table-rows/keys' +import { useTableRowCreateMutation } from '@/data/table-rows/table-row-create-mutation' +import { useTableRowUpdateMutation } from '@/data/table-rows/table-row-update-mutation' +import type { TableRowsData } from '@/data/table-rows/table-rows-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useGetImpersonatedRoleState } from '@/state/role-impersonation-state' +import { useTableEditorStateSnapshot } from '@/state/table-editor' +import type { Dictionary } from '@/types' export interface EditCellParams { table: Entity diff --git a/apps/studio/components/grid/hooks/useTableSort.ts b/apps/studio/components/grid/hooks/useTableSort.ts index deb26d373f..7a8cecb9d1 100644 --- a/apps/studio/components/grid/hooks/useTableSort.ts +++ b/apps/studio/components/grid/hooks/useTableSort.ts @@ -1,9 +1,9 @@ import { useCallback, useMemo } from 'react' -import { formatSortURLParams, sortsToUrlParams } from 'components/grid/SupabaseGrid.utils' -import type { Sort } from 'components/grid/types' -import { useTableEditorFiltersSort } from 'hooks/misc/useTableEditorFiltersSort' -import { useTableEditorTableStateSnapshot } from 'state/table-editor-table' +import { formatSortURLParams, sortsToUrlParams } from '@/components/grid/SupabaseGrid.utils' +import type { Sort } from '@/components/grid/types' +import { useTableEditorFiltersSort } from '@/hooks/misc/useTableEditorFiltersSort' +import { useTableEditorTableStateSnapshot } from '@/state/table-editor-table' /** * Hook for managing table sort URL parameters and saving. diff --git a/apps/studio/components/grid/types/table.ts b/apps/studio/components/grid/types/table.ts index 544dc149b8..346b5b8b07 100644 --- a/apps/studio/components/grid/types/table.ts +++ b/apps/studio/components/grid/types/table.ts @@ -1,7 +1,6 @@ -import type { ENTITY_TYPE } from 'data/entity-types/entity-type-constants' -import type { Dictionary } from 'types' - import { GridForeignKey } from './base' +import type { ENTITY_TYPE } from '@/data/entity-types/entity-type-constants' +import type { Dictionary } from '@/types' export interface SupaColumn { readonly dataType: string diff --git a/apps/studio/components/grid/utils/column.ts b/apps/studio/components/grid/utils/column.ts index ca2b4de3a0..d67aa072a3 100644 --- a/apps/studio/components/grid/utils/column.ts +++ b/apps/studio/components/grid/utils/column.ts @@ -1,4 +1,5 @@ import { CalculatedColumn } from 'react-data-grid' + import { ADD_COLUMN_KEY, SELECT_COLUMN_KEY } from '../constants' import type { SavedState } from '../types' diff --git a/apps/studio/components/grid/utils/queueConflictResolution.test.ts b/apps/studio/components/grid/utils/queueConflictResolution.test.ts index 77ddc7ca7e..c8ffab9ac0 100644 --- a/apps/studio/components/grid/utils/queueConflictResolution.test.ts +++ b/apps/studio/components/grid/utils/queueConflictResolution.test.ts @@ -7,11 +7,11 @@ import { upsertOperation, } from './queueConflictResolution' import { + QueuedOperation, + QueuedOperationType, type NewAddRowOperation, type NewDeleteRowOperation, type NewEditCellContentOperation, - QueuedOperation, - QueuedOperationType, } from '@/state/table-editor-operation-queue.types' describe('operationMatchesRow', () => { diff --git a/apps/studio/components/grid/utils/queueOperationUtils.ts b/apps/studio/components/grid/utils/queueOperationUtils.ts index 01e09c3103..3684886601 100644 --- a/apps/studio/components/grid/utils/queueOperationUtils.ts +++ b/apps/studio/components/grid/utils/queueOperationUtils.ts @@ -1,13 +1,12 @@ -import { isTableLike, type Entity } from 'data/table-editor/table-editor-types' -import type { Dictionary } from 'types' - import { isPendingAddRow, PendingAddRow, SupaRow } from '../types' +import { isTableLike, type Entity } from '@/data/table-editor/table-editor-types' import { EditCellContentOperation, NewQueuedOperation, QueuedOperation, QueuedOperationType, } from '@/state/table-editor-operation-queue.types' +import type { Dictionary } from '@/types' interface EditCellKeyOperation extends Omit< EditCellContentOperation, diff --git a/apps/studio/components/interfaces/APIKeys/APIKeyDeleteDialog.tsx b/apps/studio/components/interfaces/APIKeys/APIKeyDeleteDialog.tsx index d1d7e4d0dd..0c2bab785b 100644 --- a/apps/studio/components/interfaces/APIKeys/APIKeyDeleteDialog.tsx +++ b/apps/studio/components/interfaces/APIKeys/APIKeyDeleteDialog.tsx @@ -1,9 +1,9 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { Trash2 } from 'lucide-react' -import { DropdownMenuItemTooltip } from 'components/ui/DropdownMenuItemTooltip' -import type { APIKeysData } from 'data/api-keys/api-keys-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' +import { DropdownMenuItemTooltip } from '@/components/ui/DropdownMenuItemTooltip' +import type { APIKeysData } from '@/data/api-keys/api-keys-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' interface APIKeyDeleteDialogProps { apiKey: Extract diff --git a/apps/studio/components/interfaces/APIKeys/APIKeyRow.tsx b/apps/studio/components/interfaces/APIKeys/APIKeyRow.tsx index e3edee5a37..91115ebde0 100644 --- a/apps/studio/components/interfaces/APIKeys/APIKeyRow.tsx +++ b/apps/studio/components/interfaces/APIKeys/APIKeyRow.tsx @@ -1,9 +1,6 @@ +import { useFlag } from 'common' import { motion } from 'framer-motion' import { MoreVertical } from 'lucide-react' - -import { useFlag } from 'common' -import { TextConfirmModal } from 'components/ui/TextConfirmModalWrapper' -import type { APIKeysData } from 'data/api-keys/api-keys-query' import { Button, DropdownMenu, @@ -13,8 +10,11 @@ import { TableRow, } from 'ui' import { ShimmeringLoader, TimestampInfo } from 'ui-patterns' + import { APIKeyDeleteDialog } from './APIKeyDeleteDialog' import { ApiKeyPill } from './ApiKeyPill' +import { TextConfirmModal } from '@/components/ui/TextConfirmModalWrapper' +import type { APIKeysData } from '@/data/api-keys/api-keys-query' export const APIKeyRow = ({ apiKey, diff --git a/apps/studio/components/interfaces/APIKeys/ApiKeyPill.tsx b/apps/studio/components/interfaces/APIKeys/ApiKeyPill.tsx index 97263f3f3f..ae2eb04b23 100644 --- a/apps/studio/components/interfaces/APIKeys/ApiKeyPill.tsx +++ b/apps/studio/components/interfaces/APIKeys/ApiKeyPill.tsx @@ -1,18 +1,18 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useQueryClient } from '@tanstack/react-query' +import { InputVariants } from '@ui/components/shadcn/ui/input' +import { useParams } from 'common' import { Eye, EyeOff } from 'lucide-react' import { useEffect, useState } from 'react' import { toast } from 'sonner' - -import { InputVariants } from '@ui/components/shadcn/ui/input' -import { useParams } from 'common' -import CopyButton from 'components/ui/CopyButton' -import { useAPIKeyIdQuery } from 'data/api-keys/api-key-id-query' -import { APIKeysData } from 'data/api-keys/api-keys-query' -import { apiKeysKeys } from 'data/api-keys/keys' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { Button, cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' +import CopyButton from '@/components/ui/CopyButton' +import { useAPIKeyIdQuery } from '@/data/api-keys/api-key-id-query' +import { APIKeysData } from '@/data/api-keys/api-keys-query' +import { apiKeysKeys } from '@/data/api-keys/keys' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' + export function ApiKeyPill({ apiKey, }: { diff --git a/apps/studio/components/interfaces/APIKeys/ApiKeysIllustrations.tsx b/apps/studio/components/interfaces/APIKeys/ApiKeysIllustrations.tsx index 561afc8da7..358af930ac 100644 --- a/apps/studio/components/interfaces/APIKeys/ApiKeysIllustrations.tsx +++ b/apps/studio/components/interfaces/APIKeys/ApiKeysIllustrations.tsx @@ -1,10 +1,6 @@ -import { ExternalLink } from 'lucide-react' - import { SupportCategories } from '@supabase/shared-types/out/constants' import { LOCAL_STORAGE_KEYS } from 'common' -import { FeatureBanner } from 'components/ui/FeatureBanner' -import { InlineLink, InlineLinkClassName } from 'components/ui/InlineLink' -import { APIKeysData } from 'data/api-keys/api-keys-query' +import { ExternalLink } from 'lucide-react' import { Card, CardContent, @@ -16,9 +12,13 @@ import { TableHeader, TableRow, } from 'ui' + import { SupportLink } from '../Support/SupportLink' import { ApiKeyPill } from './ApiKeyPill' import { CreateNewAPIKeysButton } from './CreateNewAPIKeysButton' +import { FeatureBanner } from '@/components/ui/FeatureBanner' +import { InlineLink, InlineLinkClassName } from '@/components/ui/InlineLink' +import { APIKeysData } from '@/data/api-keys/api-keys-query' // Mock API Keys for demo const mockApiKeys = [ diff --git a/apps/studio/components/interfaces/APIKeys/CreateNewAPIKeysButton.tsx b/apps/studio/components/interfaces/APIKeys/CreateNewAPIKeysButton.tsx index 16456e7045..333734e703 100644 --- a/apps/studio/components/interfaces/APIKeys/CreateNewAPIKeysButton.tsx +++ b/apps/studio/components/interfaces/APIKeys/CreateNewAPIKeysButton.tsx @@ -1,8 +1,6 @@ +import { useParams } from 'common' import { useState } from 'react' import { toast } from 'sonner' - -import { useParams } from 'common' -import { useAPIKeyCreateMutation } from 'data/api-keys/api-key-create-mutation' import { AlertDialog, AlertDialogAction, @@ -15,6 +13,8 @@ import { Button, } from 'ui' +import { useAPIKeyCreateMutation } from '@/data/api-keys/api-key-create-mutation' + export const CreateNewAPIKeysButton = () => { const { ref: projectRef } = useParams() diff --git a/apps/studio/components/interfaces/APIKeys/CreatePublishableAPIKeyDialog.tsx b/apps/studio/components/interfaces/APIKeys/CreatePublishableAPIKeyDialog.tsx index 34a4162004..28b04f3950 100644 --- a/apps/studio/components/interfaces/APIKeys/CreatePublishableAPIKeyDialog.tsx +++ b/apps/studio/components/interfaces/APIKeys/CreatePublishableAPIKeyDialog.tsx @@ -1,5 +1,4 @@ import { zodResolver } from '@hookform/resolvers/zod' -import { useAPIKeyCreateMutation } from 'data/api-keys/api-key-create-mutation' import { Plus } from 'lucide-react' import { useParams } from 'next/navigation' import { parseAsString, useQueryState } from 'nuqs' @@ -23,6 +22,8 @@ import { import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import * as z from 'zod' +import { useAPIKeyCreateMutation } from '@/data/api-keys/api-key-create-mutation' + const FORM_ID = 'create-publishable-api-key' const SCHEMA = z.object({ name: z.string(), diff --git a/apps/studio/components/interfaces/APIKeys/CreateSecretAPIKeyDialog.tsx b/apps/studio/components/interfaces/APIKeys/CreateSecretAPIKeyDialog.tsx index 6f6c31ae27..85b5e4fa8b 100644 --- a/apps/studio/components/interfaces/APIKeys/CreateSecretAPIKeyDialog.tsx +++ b/apps/studio/components/interfaces/APIKeys/CreateSecretAPIKeyDialog.tsx @@ -1,6 +1,5 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useParams } from 'common' -import { useAPIKeyCreateMutation } from 'data/api-keys/api-key-create-mutation' import { Plus, ShieldCheck } from 'lucide-react' import { parseAsString, useQueryState } from 'nuqs' import { useForm, type SubmitHandler } from 'react-hook-form' @@ -27,6 +26,8 @@ import { import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import * as z from 'zod' +import { useAPIKeyCreateMutation } from '@/data/api-keys/api-key-create-mutation' + const NAME_SCHEMA = z .string() .min(4, 'Name must be at least 4 characters') diff --git a/apps/studio/components/interfaces/APIKeys/PublishableAPIKeys.tsx b/apps/studio/components/interfaces/APIKeys/PublishableAPIKeys.tsx index 2473ec0386..3d00c09a20 100644 --- a/apps/studio/components/interfaces/APIKeys/PublishableAPIKeys.tsx +++ b/apps/studio/components/interfaces/APIKeys/PublishableAPIKeys.tsx @@ -1,11 +1,5 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { AlertError } from 'components/ui/AlertError' -import { FormHeader } from 'components/ui/Forms/FormHeader' -import { NoPermission } from 'components/ui/NoPermission' -import { useAPIKeyDeleteMutation } from 'data/api-keys/api-key-delete-mutation' -import { APIKeysData, useAPIKeysQuery } from 'data/api-keys/api-keys-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { parseAsString, useQueryState } from 'nuqs' import { useEffect, useMemo } from 'react' import { toast } from 'sonner' @@ -23,6 +17,12 @@ import { Admonition, GenericSkeletonLoader } from 'ui-patterns' import { APIKeyRow } from './APIKeyRow' import { CreatePublishableAPIKeyDialog } from './CreatePublishableAPIKeyDialog' +import { AlertError } from '@/components/ui/AlertError' +import { FormHeader } from '@/components/ui/Forms/FormHeader' +import { NoPermission } from '@/components/ui/NoPermission' +import { useAPIKeyDeleteMutation } from '@/data/api-keys/api-key-delete-mutation' +import { APIKeysData, useAPIKeysQuery } from '@/data/api-keys/api-keys-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' export const PublishableAPIKeys = () => { const { ref: projectRef } = useParams() diff --git a/apps/studio/components/interfaces/APIKeys/SecretAPIKeys.tsx b/apps/studio/components/interfaces/APIKeys/SecretAPIKeys.tsx index 5d8967f754..0b4e54bd20 100644 --- a/apps/studio/components/interfaces/APIKeys/SecretAPIKeys.tsx +++ b/apps/studio/components/interfaces/APIKeys/SecretAPIKeys.tsx @@ -1,14 +1,6 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useFlag, useParams } from 'common' -import { AlertError } from 'components/ui/AlertError' -import { FormHeader } from 'components/ui/Forms/FormHeader' -import { NoPermission } from 'components/ui/NoPermission' -import { useAPIKeyDeleteMutation } from 'data/api-keys/api-key-delete-mutation' -import type { APIKeysData } from 'data/api-keys/api-keys-query' -import { useAPIKeysQuery } from 'data/api-keys/api-keys-query' import dayjs from 'dayjs' -import { useLogsQuery } from 'hooks/analytics/useLogsQuery' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { parseAsString, useQueryState } from 'nuqs' import { useEffect, useMemo, useRef } from 'react' import { toast } from 'sonner' @@ -24,6 +16,14 @@ import { import { APIKeyRow } from './APIKeyRow' import { CreateSecretAPIKeyDialog } from './CreateSecretAPIKeyDialog' +import { AlertError } from '@/components/ui/AlertError' +import { FormHeader } from '@/components/ui/Forms/FormHeader' +import { NoPermission } from '@/components/ui/NoPermission' +import { useAPIKeyDeleteMutation } from '@/data/api-keys/api-key-delete-mutation' +import type { APIKeysData } from '@/data/api-keys/api-keys-query' +import { useAPIKeysQuery } from '@/data/api-keys/api-keys-query' +import { useLogsQuery } from '@/hooks/analytics/useLogsQuery' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' interface LastSeenData { [hash: string]: { timestamp: number; relative: string } diff --git a/apps/studio/components/interfaces/Account/AccessTokens/AccessToken.constants.ts b/apps/studio/components/interfaces/Account/AccessTokens/AccessToken.constants.ts index 75e1accca3..e3df791f6c 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/AccessToken.constants.ts +++ b/apps/studio/components/interfaces/Account/AccessTokens/AccessToken.constants.ts @@ -1,5 +1,5 @@ -import { components } from 'api-types' import { permissions } from '@supabase/shared-types' +import { components } from 'api-types' export type ScopedAccessTokenPermission = components['schemas']['CreateScopedAccessTokenBody']['permissions'][number] diff --git a/apps/studio/components/interfaces/Account/AccessTokens/AccessToken.schemas.test.ts b/apps/studio/components/interfaces/Account/AccessTokens/AccessToken.schemas.test.ts index 6ac53f415f..c8b58c4fad 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/AccessToken.schemas.test.ts +++ b/apps/studio/components/interfaces/Account/AccessTokens/AccessToken.schemas.test.ts @@ -1,4 +1,5 @@ -import { describe, it, expect } from 'vitest' +import { describe, expect, it } from 'vitest' + import { PermissionRowSchema, TokenSchema } from './AccessToken.schemas' const validTokenData = { diff --git a/apps/studio/components/interfaces/Account/AccessTokens/AccessToken.utils.test.ts b/apps/studio/components/interfaces/Account/AccessTokens/AccessToken.utils.test.ts index 2aacdb8f8e..d037f8f25a 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/AccessToken.utils.test.ts +++ b/apps/studio/components/interfaces/Account/AccessTokens/AccessToken.utils.test.ts @@ -1,6 +1,16 @@ -import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' import dayjs from 'dayjs' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' + import type { BaseToken } from './AccessToken.types' +import { + filterAndSortTokens, + formatAccessText, + getExpirationDate, + getRealAccess, + getResourcePermissions, + handleSortChange, + mapPermissionToFGA, +} from './AccessToken.utils' // Mock PERMISSION_LIST so tests are deterministic and don't break when shared-types updates vi.mock('./AccessToken.constants', () => ({ @@ -57,16 +67,6 @@ vi.mock('./AccessToken.constants', () => ({ ], })) -import { - handleSortChange, - filterAndSortTokens, - mapPermissionToFGA, - getResourcePermissions, - getRealAccess, - formatAccessText, - getExpirationDate, -} from './AccessToken.utils' - // --- handleSortChange --- describe('handleSortChange', () => { diff --git a/apps/studio/components/interfaces/Account/AccessTokens/AccessToken.utils.ts b/apps/studio/components/interfaces/Account/AccessTokens/AccessToken.utils.ts index 20b573290c..2c9cb737a1 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/AccessToken.utils.ts +++ b/apps/studio/components/interfaces/Account/AccessTokens/AccessToken.utils.ts @@ -1,11 +1,12 @@ import dayjs from 'dayjs' + +import { PERMISSION_LIST, ScopedAccessTokenPermission } from './AccessToken.constants' import { AccessTokenSort, AccessTokenSortColumn, AccessTokenSortOrder, BaseToken, } from './AccessToken.types' -import { PERMISSION_LIST, ScopedAccessTokenPermission } from './AccessToken.constants' export const handleSortChange = ( currentSort: AccessTokenSort, diff --git a/apps/studio/components/interfaces/Account/AccessTokens/AccessTokenList.tsx b/apps/studio/components/interfaces/Account/AccessTokens/AccessTokenList.tsx index d6433c3ff8..985e9a3411 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/AccessTokenList.tsx +++ b/apps/studio/components/interfaces/Account/AccessTokens/AccessTokenList.tsx @@ -1,7 +1,5 @@ -import AlertError from 'components/ui/AlertError' -import { useAccessTokenDeleteMutation } from 'data/access-tokens/access-tokens-delete-mutation' -import { AccessToken, useAccessTokensQuery } from 'data/access-tokens/access-tokens-query' import { MoreVertical, Trash } from 'lucide-react' +import { parseAsStringLiteral, useQueryState } from 'nuqs' import { useMemo, useState } from 'react' import { toast } from 'sonner' import { @@ -13,17 +11,19 @@ import { } from 'ui' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { TableCell, TableRow } from 'ui/src/components/shadcn/ui/table' -import { parseAsStringLiteral, useQueryState } from 'nuqs' import { ACCESS_TOKEN_SORT_VALUES, AccessTokenSort, AccessTokenSortColumn, } from './AccessToken.types' -import { handleSortChange, filterAndSortTokens } from './AccessToken.utils' -import { TableContainer } from './AccessTokenTable/TableContainer' +import { filterAndSortTokens, handleSortChange } from './AccessToken.utils' import { RowLoading } from './AccessTokenTable/RowLoading' -import { TokenNameCell, LastUsedCell, ExpiresCell } from './AccessTokenTable/TokenCells' +import { TableContainer } from './AccessTokenTable/TableContainer' +import { ExpiresCell, LastUsedCell, TokenNameCell } from './AccessTokenTable/TokenCells' +import AlertError from '@/components/ui/AlertError' +import { useAccessTokenDeleteMutation } from '@/data/access-tokens/access-tokens-delete-mutation' +import { AccessToken, useAccessTokensQuery } from '@/data/access-tokens/access-tokens-query' export interface AccessTokenListProps { searchString?: string diff --git a/apps/studio/components/interfaces/Account/AccessTokens/AccessTokenNewBanner/AccessTokenNewBanner.tsx b/apps/studio/components/interfaces/Account/AccessTokens/AccessTokenNewBanner/AccessTokenNewBanner.tsx index bb055d856e..72b5de4a62 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/AccessTokenNewBanner/AccessTokenNewBanner.tsx +++ b/apps/studio/components/interfaces/Account/AccessTokens/AccessTokenNewBanner/AccessTokenNewBanner.tsx @@ -3,8 +3,9 @@ import { toast } from 'sonner' import { Button } from 'ui' import { Admonition } from 'ui-patterns' import { Input } from 'ui-patterns/DataInputs/Input' -import { TokenPermissionsSection } from './TokenPermissionSection' + import { useGroupedPermissions } from '../hooks/useGroupedPermissions' +import { TokenPermissionsSection } from './TokenPermissionSection' interface AccessTokenNewBannerProps { token: T diff --git a/apps/studio/components/interfaces/Account/AccessTokens/AccessTokenNewBanner/TokenPermissionSection.tsx b/apps/studio/components/interfaces/Account/AccessTokens/AccessTokenNewBanner/TokenPermissionSection.tsx index c5b99c5d0c..8a77b26596 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/AccessTokenNewBanner/TokenPermissionSection.tsx +++ b/apps/studio/components/interfaces/Account/AccessTokens/AccessTokenNewBanner/TokenPermissionSection.tsx @@ -1,11 +1,12 @@ import { ChevronDown, ChevronRight } from 'lucide-react' import { useState } from 'react' -import { Button } from 'ui' import { + Button, Collapsible_Shadcn_ as Collapsible, CollapsibleContent_Shadcn_ as CollapsibleContent, CollapsibleTrigger_Shadcn_ as CollapsibleTrigger, } from 'ui' + import { PermissionsList } from './PermissionList' const PERMISSIONS_COLLAPSE_THRESHOLD = 5 diff --git a/apps/studio/components/interfaces/Account/AccessTokens/AccessTokenTable/TableContainer.tsx b/apps/studio/components/interfaces/Account/AccessTokens/AccessTokenTable/TableContainer.tsx index b36702b25f..8462711f9f 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/AccessTokenTable/TableContainer.tsx +++ b/apps/studio/components/interfaces/Account/AccessTokens/AccessTokenTable/TableContainer.tsx @@ -7,6 +7,7 @@ import { TableHeadSort, TableRow, } from 'ui/src/components/shadcn/ui/table' + import { AccessTokenSort, AccessTokenSortColumn } from '../AccessToken.types' const tableHeaderClass = 'text-left font-mono uppercase text-xs text-foreground-lighter py-2' diff --git a/apps/studio/components/interfaces/Account/AccessTokens/AccessTokenTable/TokenCells.tsx b/apps/studio/components/interfaces/Account/AccessTokens/AccessTokenTable/TokenCells.tsx index b1cf4f95c1..1e21f75363 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/AccessTokenTable/TokenCells.tsx +++ b/apps/studio/components/interfaces/Account/AccessTokens/AccessTokenTable/TokenCells.tsx @@ -1,6 +1,6 @@ import dayjs from 'dayjs' -import { TableCell } from 'ui/src/components/shadcn/ui/table' import { TimestampInfo } from 'ui-patterns/TimestampInfo' +import { TableCell } from 'ui/src/components/shadcn/ui/table' interface TokenNameCellProps { name: string diff --git a/apps/studio/components/interfaces/Account/AccessTokens/Classic/NewTokenButton.tsx b/apps/studio/components/interfaces/Account/AccessTokens/Classic/NewTokenButton.tsx index c89aa724d1..887e53a467 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/Classic/NewTokenButton.tsx +++ b/apps/studio/components/interfaces/Account/AccessTokens/Classic/NewTokenButton.tsx @@ -1,6 +1,5 @@ import { ChevronDown } from 'lucide-react' import { useState } from 'react' - import { Button, DropdownMenu, @@ -8,8 +7,9 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from 'ui' + import { NewTokenDialog } from './NewTokenDialog' -import { type NewAccessToken } from 'data/access-tokens/access-tokens-create-mutation' +import { type NewAccessToken } from '@/data/access-tokens/access-tokens-create-mutation' export interface NewAccessTokenButtonProps { onCreateToken: (token: NewAccessToken) => void diff --git a/apps/studio/components/interfaces/Account/AccessTokens/Classic/NewTokenDialog.tsx b/apps/studio/components/interfaces/Account/AccessTokens/Classic/NewTokenDialog.tsx index 75c663f04a..56595e887b 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/Classic/NewTokenDialog.tsx +++ b/apps/studio/components/interfaces/Account/AccessTokens/Classic/NewTokenDialog.tsx @@ -4,13 +4,6 @@ import { ExternalLink } from 'lucide-react' import { useState } from 'react' import { useForm, type SubmitHandler } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' - -import { DatePicker } from 'components/ui/DatePicker' -import { - useAccessTokenCreateMutation, - type NewAccessToken, -} from 'data/access-tokens/access-tokens-create-mutation' import { Button, Dialog, @@ -33,12 +26,19 @@ import { } from 'ui' import { Admonition } from 'ui-patterns' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import { z } from 'zod' + import { CUSTOM_EXPIRY_VALUE, EXPIRES_AT_OPTIONS, NON_EXPIRING_TOKEN_VALUE, } from '../AccessToken.constants' import { getExpirationDate } from '../AccessToken.utils' +import { DatePicker } from '@/components/ui/DatePicker' +import { + useAccessTokenCreateMutation, + type NewAccessToken, +} from '@/data/access-tokens/access-tokens-create-mutation' const formId = 'new-access-token-form' diff --git a/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/BasicInfo.tsx b/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/BasicInfo.tsx index bae3683462..3b6ff930b7 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/BasicInfo.tsx +++ b/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/BasicInfo.tsx @@ -1,8 +1,6 @@ import dayjs from 'dayjs' import { useEffect, useState } from 'react' import { Control, ControllerRenderProps } from 'react-hook-form' - -import { DatePicker } from 'components/ui/DatePicker' import { FormControl_Shadcn_, FormField_Shadcn_, @@ -15,12 +13,14 @@ import { WarningIcon, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' + import { CUSTOM_EXPIRY_VALUE, EXPIRES_AT_OPTIONS, NON_EXPIRING_TOKEN_VALUE, } from '../../AccessToken.constants' import { type TokenFormValues } from '../../AccessToken.schemas' +import { DatePicker } from '@/components/ui/DatePicker' interface BasicInfoProps { control: Control diff --git a/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/Permissions/PermissionResourceSelector.tsx b/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/Permissions/PermissionResourceSelector.tsx index 8e084e3683..06ffdc6e09 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/Permissions/PermissionResourceSelector.tsx +++ b/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/Permissions/PermissionResourceSelector.tsx @@ -1,4 +1,3 @@ -import { ACCESS_TOKEN_RESOURCES } from 'components/interfaces/Account/AccessTokens/AccessToken.constants' import { Key, Plus } from 'lucide-react' import { Path, PathValue } from 'react-hook-form' import { @@ -22,6 +21,7 @@ import { PermissionsFormValues, } from './Permissions.types' import { togglePermissionResource } from './Permissions.utils' +import { ACCESS_TOKEN_RESOURCES } from '@/components/interfaces/Account/AccessTokens/AccessToken.constants' export const PermissionResourceSelector = ({ open, diff --git a/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/Permissions/Permissions.tsx b/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/Permissions/Permissions.tsx index 3a0da32818..2376204083 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/Permissions/Permissions.tsx +++ b/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/Permissions/Permissions.tsx @@ -1,6 +1,3 @@ -import { ACCESS_TOKEN_RESOURCES } from 'components/interfaces/Account/AccessTokens/AccessToken.constants' -import { formatAccessText } from 'components/interfaces/Account/AccessTokens/AccessToken.utils' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { ChevronDown, RotateCcw, X } from 'lucide-react' import { Path, PathValue } from 'react-hook-form' import { @@ -15,6 +12,9 @@ import { import { PermissionResourceSelector } from './PermissionResourceSelector' import { PermissionRow, PermissionsFormValues, PermissionsProps } from './Permissions.types' import { sortActions } from './Permissions.utils' +import { ACCESS_TOKEN_RESOURCES } from '@/components/interfaces/Account/AccessTokens/AccessToken.constants' +import { formatAccessText } from '@/components/interfaces/Account/AccessTokens/AccessToken.utils' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' export const Permissions = ({ setValue, diff --git a/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/Permissions/Permissions.utils.test.ts b/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/Permissions/Permissions.utils.test.ts index 0fa531cdc9..35c1cd4b38 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/Permissions/Permissions.utils.test.ts +++ b/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/Permissions/Permissions.utils.test.ts @@ -1,6 +1,7 @@ -import { describe, it, expect } from 'vitest' -import { sortActions, togglePermissionResource } from './Permissions.utils' +import { describe, expect, it } from 'vitest' + import type { PermissionResource, PermissionRow } from './Permissions.types' +import { sortActions, togglePermissionResource } from './Permissions.utils' // --- sortActions --- diff --git a/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccess/ResourceAccess.tsx b/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccess/ResourceAccess.tsx index 9fe8397e70..98bbf67b0a 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccess/ResourceAccess.tsx +++ b/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccess/ResourceAccess.tsx @@ -1,11 +1,11 @@ -import { useOrgAndProjectData } from 'components/interfaces/Account/AccessTokens/hooks/useOrgAndProjectData' -import { useProfile } from 'lib/profile' import { FormControl_Shadcn_, FormField_Shadcn_ } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { ResourceAccessProps } from './ResourceAccess.types' import { ResourceMultiSelector } from './ResourceMultiSelector' import { ResourceOption } from './ResourceOption' +import { useOrgAndProjectData } from '@/components/interfaces/Account/AccessTokens/hooks/useOrgAndProjectData' +import { useProfile } from '@/lib/profile' const RESOURCE_OPTIONS = [ { diff --git a/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccess/ResourceAccess.types.ts b/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccess/ResourceAccess.types.ts index 2a86417ba5..2416486675 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccess/ResourceAccess.types.ts +++ b/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccess/ResourceAccess.types.ts @@ -1,6 +1,7 @@ -import { TokenFormValues } from 'components/interfaces/Account/AccessTokens/AccessToken.schemas' import { Control, ControllerRenderProps, UseFormSetValue } from 'react-hook-form' +import { TokenFormValues } from '@/components/interfaces/Account/AccessTokens/AccessToken.schemas' + export interface ResourceAccessProps { control: Control resourceAccess: string diff --git a/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccess/ResourceMultiSelector.tsx b/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccess/ResourceMultiSelector.tsx index b32619fd88..5bb2d24c49 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccess/ResourceMultiSelector.tsx +++ b/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccess/ResourceMultiSelector.tsx @@ -8,6 +8,7 @@ import { MultiSelectorList, MultiSelectorTrigger, } from 'ui-patterns/multi-select' + import { ResourceMultiSelectorProps } from './ResourceAccess.types' export const ResourceMultiSelector = ({ diff --git a/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccess/ResourceOption.tsx b/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccess/ResourceOption.tsx index 0aed24cf0b..60b3a2f840 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccess/ResourceOption.tsx +++ b/apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccess/ResourceOption.tsx @@ -1,6 +1,5 @@ +import { Box, Check } from 'lucide-react' import { cn } from 'ui' -import { Box } from 'lucide-react' -import { Check } from 'lucide-react' export const ResourceOption = ({ value, diff --git a/apps/studio/components/interfaces/Account/AccessTokens/Scoped/NewScopedTokenButton.tsx b/apps/studio/components/interfaces/Account/AccessTokens/Scoped/NewScopedTokenButton.tsx index c95257038f..dea527cb52 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/Scoped/NewScopedTokenButton.tsx +++ b/apps/studio/components/interfaces/Account/AccessTokens/Scoped/NewScopedTokenButton.tsx @@ -1,8 +1,8 @@ import { useState } from 'react' - import { Button } from 'ui' -import { type NewScopedAccessToken } from 'data/scoped-access-tokens/scoped-access-token-create-mutation' + import { NewScopedTokenSheet } from './NewScopedTokenSheet' +import { type NewScopedAccessToken } from '@/data/scoped-access-tokens/scoped-access-token-create-mutation' export interface NewScopedTokenButtonProps { onCreateToken: (token: NewScopedAccessToken) => void diff --git a/apps/studio/components/interfaces/Account/AccessTokens/Scoped/NewScopedTokenSheet.tsx b/apps/studio/components/interfaces/Account/AccessTokens/Scoped/NewScopedTokenSheet.tsx index 2eaf5380d3..cbc42b0346 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/Scoped/NewScopedTokenSheet.tsx +++ b/apps/studio/components/interfaces/Account/AccessTokens/Scoped/NewScopedTokenSheet.tsx @@ -3,14 +3,8 @@ import dayjs from 'dayjs' import { ExternalLink } from 'lucide-react' import Link from 'next/link' import { useCallback, useState } from 'react' -import { type SubmitHandler, useForm } from 'react-hook-form' +import { useForm, type SubmitHandler } from 'react-hook-form' import { toast } from 'sonner' - -import { - useAccessTokenCreateMutation, - type NewScopedAccessToken, - type ScopedAccessTokenCreateVariables, -} from 'data/scoped-access-tokens/scoped-access-token-create-mutation' import { Button, Form_Shadcn_, @@ -18,23 +12,29 @@ import { Separator, Sheet, SheetContent, + SheetDescription, SheetFooter, SheetHeader, SheetTitle, - SheetDescription, } from 'ui' import { Admonition } from 'ui-patterns' -import { BasicInfo } from './Form/BasicInfo' -import { Permissions } from './Form/Permissions/Permissions' -import { ResourceAccess } from './Form/ResourceAccess/ResourceAccess' + import { CUSTOM_EXPIRY_VALUE, EXPIRES_AT_OPTIONS, type ScopedAccessTokenPermission, } from '../AccessToken.constants' -import { useOrgAndProjectData } from '../hooks/useOrgAndProjectData' -import { mapPermissionToFGA, getExpirationDate } from '../AccessToken.utils' import { TokenSchema, type TokenFormValues } from '../AccessToken.schemas' +import { getExpirationDate, mapPermissionToFGA } from '../AccessToken.utils' +import { useOrgAndProjectData } from '../hooks/useOrgAndProjectData' +import { BasicInfo } from './Form/BasicInfo' +import { Permissions } from './Form/Permissions/Permissions' +import { ResourceAccess } from './Form/ResourceAccess/ResourceAccess' +import { + useAccessTokenCreateMutation, + type NewScopedAccessToken, + type ScopedAccessTokenCreateVariables, +} from '@/data/scoped-access-tokens/scoped-access-token-create-mutation' export interface NewScopedTokenSheetProps { visible: boolean diff --git a/apps/studio/components/interfaces/Account/AccessTokens/Scoped/ScopedTokenList.tsx b/apps/studio/components/interfaces/Account/AccessTokens/Scoped/ScopedTokenList.tsx index 85307d6356..646af5da4c 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/Scoped/ScopedTokenList.tsx +++ b/apps/studio/components/interfaces/Account/AccessTokens/Scoped/ScopedTokenList.tsx @@ -1,10 +1,5 @@ -import AlertError from 'components/ui/AlertError' -import { useScopedAccessTokenDeleteMutation } from 'data/scoped-access-tokens/scoped-access-tokens-delete-mutation' -import { - ScopedAccessToken, - useScopedAccessTokensQuery, -} from 'data/scoped-access-tokens/scoped-access-token-query' -import { MoreVertical, Trash, Key } from 'lucide-react' +import { Key, MoreVertical, Trash } from 'lucide-react' +import { parseAsStringLiteral, useQueryState } from 'nuqs' import { useMemo, useState } from 'react' import { toast } from 'sonner' import { @@ -16,18 +11,23 @@ import { } from 'ui' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { TableCell, TableRow } from 'ui/src/components/shadcn/ui/table' -import { parseAsStringLiteral, useQueryState } from 'nuqs' import { ACCESS_TOKEN_SORT_VALUES, AccessTokenSort, AccessTokenSortColumn, } from '../AccessToken.types' -import { handleSortChange, filterAndSortTokens } from '../AccessToken.utils' -import { TableContainer } from '../AccessTokenTable/TableContainer' +import { filterAndSortTokens, handleSortChange } from '../AccessToken.utils' import { RowLoading } from '../AccessTokenTable/RowLoading' -import { TokenNameCell, LastUsedCell, ExpiresCell } from '../AccessTokenTable/TokenCells' +import { TableContainer } from '../AccessTokenTable/TableContainer' +import { ExpiresCell, LastUsedCell, TokenNameCell } from '../AccessTokenTable/TokenCells' import { ViewTokenSheet } from './ViewTokenSheet' +import AlertError from '@/components/ui/AlertError' +import { + ScopedAccessToken, + useScopedAccessTokensQuery, +} from '@/data/scoped-access-tokens/scoped-access-token-query' +import { useScopedAccessTokenDeleteMutation } from '@/data/scoped-access-tokens/scoped-access-tokens-delete-mutation' export interface ScopedTokenListProps { searchString?: string diff --git a/apps/studio/components/interfaces/Account/AccessTokens/Scoped/ViewTokenSheet.tsx b/apps/studio/components/interfaces/Account/AccessTokens/Scoped/ViewTokenSheet.tsx index f1810cf962..24a7da1f46 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/Scoped/ViewTokenSheet.tsx +++ b/apps/studio/components/interfaces/Account/AccessTokens/Scoped/ViewTokenSheet.tsx @@ -1,10 +1,13 @@ import dayjs from 'dayjs' +import { useMemo } from 'react' import { + Card, + CardContent, + cn, + ScrollArea, Sheet, SheetContent, SheetHeader, - ScrollArea, - cn, Table, TableBody, TableCell, @@ -12,14 +15,13 @@ import { TableHeader, TableRow, } from 'ui' -import { useScopedAccessTokenQuery } from 'data/scoped-access-tokens/scoped-access-token-query' -import { DocsButton } from 'components/ui/DocsButton' -import { Card, CardContent } from 'ui' +import { TimestampInfo } from 'ui-patterns/TimestampInfo' + import { ACCESS_TOKEN_RESOURCES } from '../AccessToken.constants' -import { useMemo } from 'react' import { formatAccessText, getRealAccess } from '../AccessToken.utils' import { useOrgAndProjectData } from '../hooks/useOrgAndProjectData' -import { TimestampInfo } from 'ui-patterns/TimestampInfo' +import { DocsButton } from '@/components/ui/DocsButton' +import { useScopedAccessTokenQuery } from '@/data/scoped-access-tokens/scoped-access-token-query' interface ViewTokenSheetProps { visible: boolean diff --git a/apps/studio/components/interfaces/Account/AccessTokens/hooks/useGroupedPermissions.ts b/apps/studio/components/interfaces/Account/AccessTokens/hooks/useGroupedPermissions.ts index d69f3e23e1..125ef5d226 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/hooks/useGroupedPermissions.ts +++ b/apps/studio/components/interfaces/Account/AccessTokens/hooks/useGroupedPermissions.ts @@ -1,6 +1,7 @@ import { useMemo } from 'react' + import { ACCESS_TOKEN_RESOURCES } from '../AccessToken.constants' -import { getRealAccess, formatAccessText } from '../AccessToken.utils' +import { formatAccessText, getRealAccess } from '../AccessToken.utils' export const useGroupedPermissions = (tokenPermissions: string[] | undefined) => { const groupedPermissions = useMemo(() => { diff --git a/apps/studio/components/interfaces/Account/AccessTokens/hooks/useOrgAndProjectData.ts b/apps/studio/components/interfaces/Account/AccessTokens/hooks/useOrgAndProjectData.ts index 2ae0c8bc0b..b211c9b689 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/hooks/useOrgAndProjectData.ts +++ b/apps/studio/components/interfaces/Account/AccessTokens/hooks/useOrgAndProjectData.ts @@ -1,6 +1,7 @@ import { useMemo } from 'react' -import { useOrganizationsQuery } from 'data/organizations/organizations-query' -import { useProjectsInfiniteQuery } from 'data/projects/projects-infinite-query' + +import { useOrganizationsQuery } from '@/data/organizations/organizations-query' +import { useProjectsInfiniteQuery } from '@/data/projects/projects-infinite-query' interface UseOrgAndProjectDataOptions { enabled?: boolean diff --git a/apps/studio/components/interfaces/Account/AuditLogs.tsx b/apps/studio/components/interfaces/Account/AuditLogs.tsx index 7dee611eaf..489f664d54 100644 --- a/apps/studio/components/interfaces/Account/AuditLogs.tsx +++ b/apps/studio/components/interfaces/Account/AuditLogs.tsx @@ -3,20 +3,20 @@ import { useDebounce } from '@uidotdev/usehooks' import dayjs from 'dayjs' import { ArrowDown, ArrowUp, RefreshCw } from 'lucide-react' import { useEffect, useMemo, useState } from 'react' - -import { LogDetailsPanel } from 'components/interfaces/AuditLogs/LogDetailsPanel' -import Table from 'components/to-be-cleaned/Table' -import AlertError from 'components/ui/AlertError' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { FilterPopover } from 'components/ui/FilterPopover' -import type { AuditLog } from 'data/organizations/organization-audit-logs-query' -import { useOrganizationsQuery } from 'data/organizations/organizations-query' -import { useProfileAuditLogsQuery } from 'data/profile/profile-audit-logs-query' -import { useProjectsInfiniteQuery } from 'data/projects/projects-infinite-query' import { Button } from 'ui' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { TimestampInfo } from 'ui-patterns/TimestampInfo' + import { LogsDatePicker } from '../Settings/Logs/Logs.DatePickers' +import { LogDetailsPanel } from '@/components/interfaces/AuditLogs/LogDetailsPanel' +import Table from '@/components/to-be-cleaned/Table' +import AlertError from '@/components/ui/AlertError' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { FilterPopover } from '@/components/ui/FilterPopover' +import type { AuditLog } from '@/data/organizations/organization-audit-logs-query' +import { useOrganizationsQuery } from '@/data/organizations/organizations-query' +import { useProfileAuditLogsQuery } from '@/data/profile/profile-audit-logs-query' +import { useProjectsInfiniteQuery } from '@/data/projects/projects-infinite-query' export const AuditLogs = () => { const currentTime = dayjs().utc().set('millisecond', 0) diff --git a/apps/studio/components/interfaces/Account/Preferences/AccountConnections.tsx b/apps/studio/components/interfaces/Account/Preferences/AccountConnections.tsx index e941faeb1e..a78ad17177 100644 --- a/apps/studio/components/interfaces/Account/Preferences/AccountConnections.tsx +++ b/apps/studio/components/interfaces/Account/Preferences/AccountConnections.tsx @@ -2,11 +2,6 @@ import { ChevronDown, RefreshCw, Unlink } from 'lucide-react' import Image from 'next/image' import { useState } from 'react' import { toast } from 'sonner' - -import { useGitHubAuthorizationDeleteMutation } from 'data/integrations/github-authorization-delete-mutation' -import { useGitHubAuthorizationQuery } from 'data/integrations/github-authorization-query' -import { BASE_PATH } from 'lib/constants' -import { openInstallGitHubIntegrationWindow } from 'lib/github' import { Badge, Button, @@ -30,6 +25,11 @@ import { } from 'ui-patterns/PageSection' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' +import { useGitHubAuthorizationDeleteMutation } from '@/data/integrations/github-authorization-delete-mutation' +import { useGitHubAuthorizationQuery } from '@/data/integrations/github-authorization-query' +import { BASE_PATH } from '@/lib/constants' +import { openInstallGitHubIntegrationWindow } from '@/lib/github' + export const AccountConnections = () => { const { data: gitHubAuthorization, diff --git a/apps/studio/components/interfaces/Account/Preferences/AccountDeletion.tsx b/apps/studio/components/interfaces/Account/Preferences/AccountDeletion.tsx index 2d8b9173e1..bad0ec5ace 100644 --- a/apps/studio/components/interfaces/Account/Preferences/AccountDeletion.tsx +++ b/apps/studio/components/interfaces/Account/Preferences/AccountDeletion.tsx @@ -1,4 +1,4 @@ -import { AlertDescription_Shadcn_, AlertTitle_Shadcn_, Alert_Shadcn_, CriticalIcon } from 'ui' +import { Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, CriticalIcon } from 'ui' import { PageSection, PageSectionContent, @@ -7,6 +7,7 @@ import { PageSectionSummary, PageSectionTitle, } from 'ui-patterns/PageSection' + import { DeleteAccountButton } from './DeleteAccountButton' export const AccountDeletion = () => { diff --git a/apps/studio/components/interfaces/Account/Preferences/AccountIdentities.tsx b/apps/studio/components/interfaces/Account/Preferences/AccountIdentities.tsx index eb40c22ec1..e33a2c98c8 100644 --- a/apps/studio/components/interfaces/Account/Preferences/AccountIdentities.tsx +++ b/apps/studio/components/interfaces/Account/Preferences/AccountIdentities.tsx @@ -1,8 +1,4 @@ -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useProfileIdentitiesQuery } from 'data/profile/profile-identities-query' -import { useUnlinkIdentityMutation } from 'data/profile/profile-unlink-identity-mutation' import dayjs from 'dayjs' -import { BASE_PATH } from 'lib/constants' import { Edit, Unlink } from 'lucide-react' import Image from 'next/image' import Link from 'next/link' @@ -39,6 +35,10 @@ import { GitHubChangeEmailAddress, SSOChangeEmailAddress, } from './ChangeEmailAddress' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useProfileIdentitiesQuery } from '@/data/profile/profile-identities-query' +import { useUnlinkIdentityMutation } from '@/data/profile/profile-unlink-identity-mutation' +import { BASE_PATH } from '@/lib/constants' const getProviderName = (provider: string) => provider === 'github' diff --git a/apps/studio/components/interfaces/Account/Preferences/AnalyticsSettings.tsx b/apps/studio/components/interfaces/Account/Preferences/AnalyticsSettings.tsx index bb65afb988..39f854b0fe 100644 --- a/apps/studio/components/interfaces/Account/Preferences/AnalyticsSettings.tsx +++ b/apps/studio/components/interfaces/Account/Preferences/AnalyticsSettings.tsx @@ -1,6 +1,5 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useConsentState } from 'common' -import { useSendResetMutation } from 'data/telemetry/send-reset-mutation' import { useForm } from 'react-hook-form' import { toast } from 'sonner' import { Card, CardContent, Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, Switch } from 'ui' @@ -15,6 +14,8 @@ import { } from 'ui-patterns/PageSection' import * as z from 'zod' +import { useSendResetMutation } from '@/data/telemetry/send-reset-mutation' + const AnalyticsSchema = z.object({ telemetryEnabled: z.boolean(), }) diff --git a/apps/studio/components/interfaces/Account/Preferences/ChangeEmailAddress.tsx b/apps/studio/components/interfaces/Account/Preferences/ChangeEmailAddress.tsx index 0aa80154dd..94a095d15e 100644 --- a/apps/studio/components/interfaces/Account/Preferences/ChangeEmailAddress.tsx +++ b/apps/studio/components/interfaces/Account/Preferences/ChangeEmailAddress.tsx @@ -3,10 +3,6 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useRef, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' - -import { InlineLink } from 'components/ui/InlineLink' -import { useEmailUpdateMutation } from 'data/profile/profile-update-email-mutation' import { Button, DialogFooter, @@ -17,6 +13,10 @@ import { Input_Shadcn_, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import * as z from 'zod' + +import { InlineLink } from '@/components/ui/InlineLink' +import { useEmailUpdateMutation } from '@/data/profile/profile-update-email-mutation' export const GitHubChangeEmailAddress = () => { return ( diff --git a/apps/studio/components/interfaces/Account/Preferences/DeleteAccountButton.tsx b/apps/studio/components/interfaces/Account/Preferences/DeleteAccountButton.tsx index bbc1968e44..d0222e005d 100644 --- a/apps/studio/components/interfaces/Account/Preferences/DeleteAccountButton.tsx +++ b/apps/studio/components/interfaces/Account/Preferences/DeleteAccountButton.tsx @@ -1,15 +1,9 @@ import { zodResolver } from '@hookform/resolvers/zod' import { SupportCategories } from '@supabase/shared-types/out/constants' +import { LOCAL_STORAGE_KEYS } from 'common' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' - -import { LOCAL_STORAGE_KEYS } from 'common' -import { NO_PROJECT_MARKER } from 'components/interfaces/Support/SupportForm.utils' -import { useSendSupportTicketMutation } from 'data/feedback/support-ticket-send' -import { useOrganizationsQuery } from 'data/organizations/organizations-query' -import { useProfile } from 'lib/profile' import { Button, Dialog, @@ -20,14 +14,20 @@ import { DialogSection, DialogTitle, DialogTrigger, + Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, FormItem_Shadcn_, FormLabel_Shadcn_, - Form_Shadcn_, Input_Shadcn_, Separator, } from 'ui' +import * as z from 'zod' + +import { NO_PROJECT_MARKER } from '@/components/interfaces/Support/SupportForm.utils' +import { useSendSupportTicketMutation } from '@/data/feedback/support-ticket-send' +import { useOrganizationsQuery } from '@/data/organizations/organizations-query' +import { useProfile } from '@/lib/profile' const setDeletionRequestFlag = () => { const expiryDate = new Date() diff --git a/apps/studio/components/interfaces/Account/Preferences/HotkeySettings.tsx b/apps/studio/components/interfaces/Account/Preferences/HotkeySettings.tsx index 9666307ecb..d7326f2c47 100644 --- a/apps/studio/components/interfaces/Account/Preferences/HotkeySettings.tsx +++ b/apps/studio/components/interfaces/Account/Preferences/HotkeySettings.tsx @@ -1,7 +1,5 @@ import { zodResolver } from '@hookform/resolvers/zod' import { LOCAL_STORAGE_KEYS } from 'common' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' import { useForm } from 'react-hook-form' import { Card, Form_Shadcn_ } from 'ui' import { @@ -15,6 +13,8 @@ import { import * as z from 'zod' import { HotkeyToggle } from './HotkeyToggle' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' const HotkeySchema = z.object({ commandMenuEnabled: z.boolean(), diff --git a/apps/studio/components/interfaces/Account/Preferences/InlineEditorSettings.tsx b/apps/studio/components/interfaces/Account/Preferences/InlineEditorSettings.tsx index 3d70246505..cae4255aef 100644 --- a/apps/studio/components/interfaces/Account/Preferences/InlineEditorSettings.tsx +++ b/apps/studio/components/interfaces/Account/Preferences/InlineEditorSettings.tsx @@ -1,12 +1,7 @@ import { zodResolver } from '@hookform/resolvers/zod' -import { useForm } from 'react-hook-form' -import * as z from 'zod' - import { LOCAL_STORAGE_KEYS } from 'common' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { Card, CardContent, FormControl_Shadcn_, FormField_Shadcn_, Form_Shadcn_, Switch } from 'ui' +import { useForm } from 'react-hook-form' +import { Card, CardContent, Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, Switch } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { PageSection, @@ -16,6 +11,11 @@ import { PageSectionSummary, PageSectionTitle, } from 'ui-patterns/PageSection' +import * as z from 'zod' + +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' const InlineEditorSchema = z.object({ inlineEditorEnabled: z.boolean(), diff --git a/apps/studio/components/interfaces/Account/Preferences/ProfileInformation.tsx b/apps/studio/components/interfaces/Account/Preferences/ProfileInformation.tsx index 71494dec66..5df25eaf1c 100644 --- a/apps/studio/components/interfaces/Account/Preferences/ProfileInformation.tsx +++ b/apps/studio/components/interfaces/Account/Preferences/ProfileInformation.tsx @@ -1,4 +1,5 @@ import { zodResolver } from '@hookform/resolvers/zod' +import { groupBy } from 'lodash' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' import { @@ -6,23 +7,16 @@ import { Card, CardContent, CardFooter, + Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, - Form_Shadcn_, Input_Shadcn_, + Select_Shadcn_, SelectContent_Shadcn_, SelectItem_Shadcn_, SelectTrigger_Shadcn_, SelectValue_Shadcn_, - Select_Shadcn_, } from 'ui' -import z from 'zod' - -import { useProfileIdentitiesQuery } from 'data/profile/profile-identities-query' -import { useProfileUpdateMutation } from 'data/profile/profile-update-mutation' -import { useProfile } from 'lib/profile' -import { groupBy } from 'lodash' -import type { FormSchema } from 'types' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { PageSection, @@ -31,6 +25,12 @@ import { PageSectionSummary, PageSectionTitle, } from 'ui-patterns/PageSection' +import z from 'zod' + +import { useProfileIdentitiesQuery } from '@/data/profile/profile-identities-query' +import { useProfileUpdateMutation } from '@/data/profile/profile-update-mutation' +import { useProfile } from '@/lib/profile' +import type { FormSchema } from '@/types' const FormSchema = z.object({ first_name: z.string().optional(), diff --git a/apps/studio/components/interfaces/Account/Preferences/ThemeSettings.tsx b/apps/studio/components/interfaces/Account/Preferences/ThemeSettings.tsx index 1cb2298276..a1994d0c9c 100644 --- a/apps/studio/components/interfaces/Account/Preferences/ThemeSettings.tsx +++ b/apps/studio/components/interfaces/Account/Preferences/ThemeSettings.tsx @@ -1,11 +1,7 @@ +import { LOCAL_STORAGE_KEYS } from 'common' import { useTheme } from 'next-themes' import { useEffect, useState } from 'react' import SVG from 'react-inlinesvg' - -import { LOCAL_STORAGE_KEYS } from 'common' -import { DEFAULT_SIDEBAR_BEHAVIOR } from 'components/interfaces/Sidebar' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { BASE_PATH } from 'lib/constants' import { Card, CardContent, @@ -31,6 +27,10 @@ import { PageSectionTitle, } from 'ui-patterns/PageSection' +import { DEFAULT_SIDEBAR_BEHAVIOR } from '@/components/interfaces/Sidebar' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { BASE_PATH } from '@/lib/constants' + export const ThemeSettings = () => { const [mounted, setMounted] = useState(false) const { theme, setTheme } = useTheme() diff --git a/apps/studio/components/interfaces/Account/TOTPFactors/AddNewFactorModal.tsx b/apps/studio/components/interfaces/Account/TOTPFactors/AddNewFactorModal.tsx index 2b2170cac6..56e5de262c 100644 --- a/apps/studio/components/interfaces/Account/TOTPFactors/AddNewFactorModal.tsx +++ b/apps/studio/components/interfaces/Account/TOTPFactors/AddNewFactorModal.tsx @@ -1,12 +1,6 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useQueryClient } from '@tanstack/react-query' import { LOCAL_STORAGE_KEYS } from 'common' -import InformationBox from 'components/ui/InformationBox' -import { organizationKeys } from 'data/organizations/keys' -import { useMfaChallengeAndVerifyMutation } from 'data/profile/mfa-challenge-and-verify-mutation' -import { useMfaEnrollMutation } from 'data/profile/mfa-enroll-mutation' -import { useMfaUnenrollMutation } from 'data/profile/mfa-unenroll-mutation' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' import { useEffect, useState } from 'react' import { useForm, type SubmitHandler } from 'react-hook-form' import { toast } from 'sonner' @@ -16,6 +10,13 @@ import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { z } from 'zod' +import InformationBox from '@/components/ui/InformationBox' +import { organizationKeys } from '@/data/organizations/keys' +import { useMfaChallengeAndVerifyMutation } from '@/data/profile/mfa-challenge-and-verify-mutation' +import { useMfaEnrollMutation } from '@/data/profile/mfa-enroll-mutation' +import { useMfaUnenrollMutation } from '@/data/profile/mfa-unenroll-mutation' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' + type TOTP = { qr_code: string; secret: string; uri: string } interface AddNewFactorModalProps { diff --git a/apps/studio/components/interfaces/Account/TOTPFactors/DeleteFactorModal.tsx b/apps/studio/components/interfaces/Account/TOTPFactors/DeleteFactorModal.tsx index d26cc6e7c0..41f1667081 100644 --- a/apps/studio/components/interfaces/Account/TOTPFactors/DeleteFactorModal.tsx +++ b/apps/studio/components/interfaces/Account/TOTPFactors/DeleteFactorModal.tsx @@ -1,12 +1,12 @@ import { useQueryClient } from '@tanstack/react-query' -import { toast } from 'sonner' - import { LOCAL_STORAGE_KEYS } from 'common' -import { organizationKeys } from 'data/organizations/keys' -import { useMfaUnenrollMutation } from 'data/profile/mfa-unenroll-mutation' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' +import { toast } from 'sonner' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' +import { organizationKeys } from '@/data/organizations/keys' +import { useMfaUnenrollMutation } from '@/data/profile/mfa-unenroll-mutation' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' + interface DeleteFactorModalProps { visible: boolean factorId: string | null diff --git a/apps/studio/components/interfaces/Account/TOTPFactors/index.tsx b/apps/studio/components/interfaces/Account/TOTPFactors/index.tsx index 45e7839730..4f52f530f8 100644 --- a/apps/studio/components/interfaces/Account/TOTPFactors/index.tsx +++ b/apps/studio/components/interfaces/Account/TOTPFactors/index.tsx @@ -1,14 +1,14 @@ import dayjs from 'dayjs' import { AlertCircle } from 'lucide-react' import { useState } from 'react' - -import AlertError from 'components/ui/AlertError' -import { useMfaListFactorsQuery } from 'data/profile/mfa-list-factors-query' -import { DATETIME_FORMAT } from 'lib/constants' -import { AlertDescription_Shadcn_, AlertTitle_Shadcn_, Alert_Shadcn_, Button } from 'ui' +import { Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, Button } from 'ui' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' + import { AddNewFactorModal } from './AddNewFactorModal' import DeleteFactorModal from './DeleteFactorModal' +import AlertError from '@/components/ui/AlertError' +import { useMfaListFactorsQuery } from '@/data/profile/mfa-list-factors-query' +import { DATETIME_FORMAT } from '@/lib/constants' export const TOTPFactors = () => { const [isAddNewFactorOpen, setIsAddNewFactorOpen] = useState(false) diff --git a/apps/studio/components/interfaces/Advisors/AdvisorRuleItem.tsx b/apps/studio/components/interfaces/Advisors/AdvisorRuleItem.tsx index 9255bc7e87..8f6afca5b6 100644 --- a/apps/studio/components/interfaces/Advisors/AdvisorRuleItem.tsx +++ b/apps/studio/components/interfaces/Advisors/AdvisorRuleItem.tsx @@ -1,15 +1,7 @@ +import { useParams } from 'common' import { ChevronRight, Trash } from 'lucide-react' import { useState } from 'react' import { toast } from 'sonner' - -import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DocsButton } from 'components/ui/DocsButton' -import { useLintRuleDeleteMutation } from 'data/lint/delete-lint-rule-mutation' -import { useProjectLintRulesQuery } from 'data/lint/lint-rules-query' -import { useOrganizationMembersQuery } from 'data/organizations/organization-members-query' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { Badge, Button, @@ -22,11 +14,19 @@ import { } from 'ui' import { GenericSkeletonLoader } from 'ui-patterns' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' + import { LintInfo } from '../Linter/Linter.constants' import { generateRuleText } from './AdvisorRules.utils' import { CreateRuleSheet } from './CreateRuleSheet' import { DisableRuleModal } from './DisableRuleModal' import { EnableRuleModal } from './EnableRuleModal' +import AlertError from '@/components/ui/AlertError' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DocsButton } from '@/components/ui/DocsButton' +import { useLintRuleDeleteMutation } from '@/data/lint/delete-lint-rule-mutation' +import { useProjectLintRulesQuery } from '@/data/lint/lint-rules-query' +import { useOrganizationMembersQuery } from '@/data/organizations/organization-members-query' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' interface AdvisorRuleItemProps { lint: LintInfo diff --git a/apps/studio/components/interfaces/Advisors/AdvisorRules.tsx b/apps/studio/components/interfaces/Advisors/AdvisorRules.tsx index 142a886f0f..72c59071b5 100644 --- a/apps/studio/components/interfaces/Advisors/AdvisorRules.tsx +++ b/apps/studio/components/interfaces/Advisors/AdvisorRules.tsx @@ -1,6 +1,6 @@ -import { ScaffoldContainer, ScaffoldSection } from 'components/layouts/Scaffold' import { lintInfoMap } from '../Linter/Linter.utils' import { AdvisorRuleItem } from './AdvisorRuleItem' +import { ScaffoldContainer, ScaffoldSection } from '@/components/layouts/Scaffold' interface AdvisorRulesProps { category: 'security' | 'performance' diff --git a/apps/studio/components/interfaces/Advisors/AdvisorRules.utils.tsx b/apps/studio/components/interfaces/Advisors/AdvisorRules.utils.tsx index 3da86dcfa9..62ff6b1e4d 100644 --- a/apps/studio/components/interfaces/Advisors/AdvisorRules.utils.tsx +++ b/apps/studio/components/interfaces/Advisors/AdvisorRules.utils.tsx @@ -1,6 +1,6 @@ -import { LintException } from 'data/lint/lint-rules-query' -import { Member } from 'data/organizations/organization-members-query' import { lintInfoMap } from '../Linter/Linter.utils' +import { LintException } from '@/data/lint/lint-rules-query' +import { Member } from '@/data/organizations/organization-members-query' export const generateRuleText = (e: LintException, member?: Member) => { const lintName = lintInfoMap.find((x) => x.name === e.lint_name)?.title diff --git a/apps/studio/components/interfaces/Advisors/CreateRuleSheet.tsx b/apps/studio/components/interfaces/Advisors/CreateRuleSheet.tsx index 8c03074cb2..aab5390081 100644 --- a/apps/studio/components/interfaces/Advisors/CreateRuleSheet.tsx +++ b/apps/studio/components/interfaces/Advisors/CreateRuleSheet.tsx @@ -1,15 +1,10 @@ import { zodResolver } from '@hookform/resolvers/zod' +import { useParams } from 'common' +import { useRouter } from 'next/router' // import { useQueryState } from 'nuqs' import { useEffect } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' - -import { useParams } from 'common' -import { useLintRuleCreateMutation } from 'data/lint/create-lint-rule-mutation' -import { useOrganizationMembersQuery } from 'data/organizations/organization-members-query' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useRouter } from 'next/router' import { Button, Form_Shadcn_, @@ -35,9 +30,14 @@ import { } from 'ui' import { Admonition } from 'ui-patterns' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import * as z from 'zod' + import { LintInfo } from '../Linter/Linter.constants' import { lintInfoMap } from '../Linter/Linter.utils' import { generateRuleDescription } from './AdvisorRules.utils' +import { useLintRuleCreateMutation } from '@/data/lint/create-lint-rule-mutation' +import { useOrganizationMembersQuery } from '@/data/organizations/organization-members-query' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' interface CreateRuleSheetProps { lint?: LintInfo diff --git a/apps/studio/components/interfaces/Advisors/DisableRuleModal.tsx b/apps/studio/components/interfaces/Advisors/DisableRuleModal.tsx index f3b0a271de..77a2adcf59 100644 --- a/apps/studio/components/interfaces/Advisors/DisableRuleModal.tsx +++ b/apps/studio/components/interfaces/Advisors/DisableRuleModal.tsx @@ -1,9 +1,7 @@ +import { useParams } from 'common' import { useRouter } from 'next/router' import { useState } from 'react' import { toast } from 'sonner' - -import { useParams } from 'common' -import { useLintRuleCreateMutation } from 'data/lint/create-lint-rule-mutation' import { Button, Dialog, @@ -15,8 +13,10 @@ import { DialogTitle, DialogTrigger, } from 'ui' + import { LintInfo } from '../Linter/Linter.constants' import { lintInfoMap } from '../Linter/Linter.utils' +import { useLintRuleCreateMutation } from '@/data/lint/create-lint-rule-mutation' interface DisableRuleModalProps { lint: LintInfo diff --git a/apps/studio/components/interfaces/Advisors/EnableRuleModal.tsx b/apps/studio/components/interfaces/Advisors/EnableRuleModal.tsx index 571735b0e3..644e408e61 100644 --- a/apps/studio/components/interfaces/Advisors/EnableRuleModal.tsx +++ b/apps/studio/components/interfaces/Advisors/EnableRuleModal.tsx @@ -1,10 +1,7 @@ +import { useParams } from 'common' import { useRouter } from 'next/router' import { useState } from 'react' import { toast } from 'sonner' - -import { useParams } from 'common' -import { useLintRuleDeleteMutation } from 'data/lint/delete-lint-rule-mutation' -import { LintException } from 'data/lint/lint-rules-query' import { Button, Dialog, @@ -16,7 +13,10 @@ import { DialogTitle, DialogTrigger, } from 'ui' + import { LintInfo } from '../Linter/Linter.constants' +import { useLintRuleDeleteMutation } from '@/data/lint/delete-lint-rule-mutation' +import { LintException } from '@/data/lint/lint-rules-query' interface EnableRuleModalProps { lint: LintInfo diff --git a/apps/studio/components/interfaces/App/AppBannerWrapper.tsx b/apps/studio/components/interfaces/App/AppBannerWrapper.tsx index 392b0fbd1d..46a60e29e2 100644 --- a/apps/studio/components/interfaces/App/AppBannerWrapper.tsx +++ b/apps/studio/components/interfaces/App/AppBannerWrapper.tsx @@ -1,11 +1,11 @@ import { useFlag } from 'common' -import { ClockSkewBanner } from 'components/layouts/AppLayout/ClockSkewBanner' -import { NoticeBanner } from 'components/layouts/AppLayout/NoticeBanner' -import { StatusPageBanner } from 'components/layouts/AppLayout/StatusPageBanner' -import { TaxIdBanner } from 'components/layouts/AppLayout/TaxIdBanner' import { PropsWithChildren } from 'react' import { OrganizationResourceBanner } from '../Organization/HeaderBanner' +import { ClockSkewBanner } from '@/components/layouts/AppLayout/ClockSkewBanner' +import { NoticeBanner } from '@/components/layouts/AppLayout/NoticeBanner' +import { StatusPageBanner } from '@/components/layouts/AppLayout/StatusPageBanner' +import { TaxIdBanner } from '@/components/layouts/AppLayout/TaxIdBanner' export const AppBannerWrapper = ({ children }: PropsWithChildren<{}>) => { const showNoticeBanner = useFlag('showNoticeBanner') diff --git a/apps/studio/components/interfaces/App/CommandMenu/ApiKeys.tsx b/apps/studio/components/interfaces/App/CommandMenu/ApiKeys.tsx index 29658ec9e6..0285aa4d25 100644 --- a/apps/studio/components/interfaces/App/CommandMenu/ApiKeys.tsx +++ b/apps/studio/components/interfaces/App/CommandMenu/ApiKeys.tsx @@ -1,7 +1,4 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' -import { getKeys, useAPIKeysQuery } from 'data/api-keys/api-keys-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Key } from 'lucide-react' import { useMemo } from 'react' import { toast } from 'sonner' @@ -18,6 +15,9 @@ import { import { COMMAND_MENU_SECTIONS } from './CommandMenu.utils' import { orderCommandSectionsByPriority } from './ordering' +import { getKeys, useAPIKeysQuery } from '@/data/api-keys/api-keys-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' const API_KEYS_PAGE_NAME = 'API Keys' diff --git a/apps/studio/components/interfaces/App/CommandMenu/ApiUrl.tsx b/apps/studio/components/interfaces/App/CommandMenu/ApiUrl.tsx index d98bd53c13..e3f1b4376e 100644 --- a/apps/studio/components/interfaces/App/CommandMenu/ApiUrl.tsx +++ b/apps/studio/components/interfaces/App/CommandMenu/ApiUrl.tsx @@ -1,5 +1,3 @@ -import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Link } from 'lucide-react' import { toast } from 'sonner' import { Badge, copyToClipboard } from 'ui' @@ -11,6 +9,8 @@ import { import { COMMAND_MENU_SECTIONS } from './CommandMenu.utils' import { orderCommandSectionsByPriority } from './ordering' +import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export function useApiUrlCommand() { const setIsOpen = useSetCommandMenuOpen() diff --git a/apps/studio/components/interfaces/App/CommandMenu/CommandMenu.tsx b/apps/studio/components/interfaces/App/CommandMenu/CommandMenu.tsx index 698585feeb..e35d8e1687 100644 --- a/apps/studio/components/interfaces/App/CommandMenu/CommandMenu.tsx +++ b/apps/studio/components/interfaces/App/CommandMenu/CommandMenu.tsx @@ -1,11 +1,4 @@ import { IS_PLATFORM } from 'common' -import { useBranchCommands } from 'components/interfaces/BranchManagement/Branch.Commands' -import { - useQueryTableCommands, - useSnippetCommands, -} from 'components/layouts/SQLEditorLayout/SqlEditor.Commands' -import { useProjectLevelTableEditorCommands } from 'components/layouts/TableEditorLayout/TableEditor.Commands' -import { useLayoutNavCommands } from 'components/layouts/useLayoutNavCommands' import { CommandHeader, CommandInput, CommandList, CommandMenu } from 'ui-patterns/CommandMenu' import { useChangelogCommand } from 'ui-patterns/CommandMenu/prepackaged/Changelog' import { useDocsAiCommands } from 'ui-patterns/CommandMenu/prepackaged/DocsAi' @@ -19,7 +12,14 @@ import { useCreateCommands } from './CreateCommands' import { orderCommandSectionsByPriority } from './ordering' import { useConfigureOrganizationCommand, useProjectSwitchCommand } from './OrgProjectSwitcher' import { useSupportCommands } from './Support' +import { useBranchCommands } from '@/components/interfaces/BranchManagement/Branch.Commands' import { useConnectCommands } from '@/components/interfaces/ConnectButton/Connect.Commands' +import { + useQueryTableCommands, + useSnippetCommands, +} from '@/components/layouts/SQLEditorLayout/SqlEditor.Commands' +import { useProjectLevelTableEditorCommands } from '@/components/layouts/TableEditorLayout/TableEditor.Commands' +import { useLayoutNavCommands } from '@/components/layouts/useLayoutNavCommands' export function CommandMenuInnerContent() { return ( diff --git a/apps/studio/components/interfaces/App/CommandMenu/ContextSearchCommands.tsx b/apps/studio/components/interfaces/App/CommandMenu/ContextSearchCommands.tsx index 8e61ba4731..ea270b0a99 100644 --- a/apps/studio/components/interfaces/App/CommandMenu/ContextSearchCommands.tsx +++ b/apps/studio/components/interfaces/App/CommandMenu/ContextSearchCommands.tsx @@ -1,8 +1,6 @@ 'use client' import { IS_PLATFORM } from 'common' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Auth, EdgeFunctions, Storage } from 'icons' import { Database } from 'lucide-react' import { useMemo } from 'react' @@ -22,6 +20,8 @@ import { COMMAND_MENU_SECTIONS } from './CommandMenu.utils' import { ContextSearchResults } from './ContextSearchResults' import { orderCommandSectionsByPriority } from './ordering' import type { SearchContextValue } from './SearchContext.types' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface SearchContextOption { value: SearchContextValue diff --git a/apps/studio/components/interfaces/App/CommandMenu/ContextSearchResults.shared.tsx b/apps/studio/components/interfaces/App/CommandMenu/ContextSearchResults.shared.tsx index 8a511334f9..2db9db46f0 100644 --- a/apps/studio/components/interfaces/App/CommandMenu/ContextSearchResults.shared.tsx +++ b/apps/studio/components/interfaces/App/CommandMenu/ContextSearchResults.shared.tsx @@ -1,11 +1,11 @@ 'use client' -import { CommandList_Shadcn_, cn } from 'ui' +import { cn, CommandList_Shadcn_ } from 'ui' import { ShimmeringLoader } from 'ui-patterns' +import { TextHighlighter } from 'ui-patterns/CommandMenu' import { CommandItem } from 'ui-patterns/CommandMenu/internal/Command' import { CommandGroup } from 'ui-patterns/CommandMenu/internal/CommandGroup' -import { TextHighlighter } from 'ui-patterns/CommandMenu' -import type { IRouteCommand, IActionCommand } from 'ui-patterns/CommandMenu/internal/types' +import type { IActionCommand, IRouteCommand } from 'ui-patterns/CommandMenu/internal/types' export interface SearchResult { id: string diff --git a/apps/studio/components/interfaces/App/CommandMenu/ContextSearchResults.tsx b/apps/studio/components/interfaces/App/CommandMenu/ContextSearchResults.tsx index 30a19b6894..80701e4458 100644 --- a/apps/studio/components/interfaces/App/CommandMenu/ContextSearchResults.tsx +++ b/apps/studio/components/interfaces/App/CommandMenu/ContextSearchResults.tsx @@ -1,10 +1,11 @@ 'use client' -import dynamic from 'next/dynamic' -import { Database } from 'lucide-react' import { Auth, EdgeFunctions, Storage } from 'icons' +import { Database } from 'lucide-react' +import dynamic from 'next/dynamic' + +import { EmptyState, SkeletonResults } from './ContextSearchResults.shared' import type { SearchContextValue } from './SearchContext.types' -import { SkeletonResults, EmptyState } from './ContextSearchResults.shared' const TableSearchResults = dynamic( () => import('./TableSearchResults').then((mod) => ({ default: mod.TableSearchResults })), diff --git a/apps/studio/components/interfaces/App/CommandMenu/CreateCommands.tsx b/apps/studio/components/interfaces/App/CommandMenu/CreateCommands.tsx index bb107f0a5f..2a91347b5a 100644 --- a/apps/studio/components/interfaces/App/CommandMenu/CreateCommands.tsx +++ b/apps/studio/components/interfaces/App/CommandMenu/CreateCommands.tsx @@ -1,7 +1,6 @@ 'use client' import { IS_PLATFORM } from 'common' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' import { Clock5, Code2, @@ -39,6 +38,7 @@ import { getIntegrationRoute, useCreateCommandsConfig, } from './CreateCommands.utils' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' const AiIconAnimation = dynamic(() => import('ui').then((mod) => mod.AiIconAnimation)) const Badge = dynamic(() => import('ui').then((mod) => mod.Badge)) diff --git a/apps/studio/components/interfaces/App/CommandMenu/CreateCommands.utils.tsx b/apps/studio/components/interfaces/App/CommandMenu/CreateCommands.utils.tsx index c3493239a2..ece30e8dbc 100644 --- a/apps/studio/components/interfaces/App/CommandMenu/CreateCommands.utils.tsx +++ b/apps/studio/components/interfaces/App/CommandMenu/CreateCommands.utils.tsx @@ -1,24 +1,25 @@ import { useParams } from 'common' -import type { Hook } from 'components/interfaces/Auth/Hooks/hooks.constants' -import { HOOKS_DEFINITIONS } from 'components/interfaces/Auth/Hooks/hooks.constants' -import { extractMethod, isValidHook } from 'components/interfaces/Auth/Hooks/hooks.utils' +import { useMemo } from 'react' +import { useSetPage } from 'ui-patterns/CommandMenu' + +import type { Hook } from '@/components/interfaces/Auth/Hooks/hooks.constants' +import { HOOKS_DEFINITIONS } from '@/components/interfaces/Auth/Hooks/hooks.constants' +import { extractMethod, isValidHook } from '@/components/interfaces/Auth/Hooks/hooks.utils' import { INTEGRATIONS, type IntegrationDefinition, -} from 'components/interfaces/Integrations/Landing/Integrations.constants' -import { useInstalledIntegrations } from 'components/interfaces/Integrations/Landing/useInstalledIntegrations' -import { useAuthConfigQuery } from 'data/auth/auth-config-query' +} from '@/components/interfaces/Integrations/Landing/Integrations.constants' +import { useInstalledIntegrations } from '@/components/interfaces/Integrations/Landing/useInstalledIntegrations' +import { useAuthConfigQuery } from '@/data/auth/auth-config-query' import { useIsAnalyticsBucketsEnabled, useIsVectorBucketsEnabled, -} from 'data/config/project-storage-config-query' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useMemo } from 'react' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' -import { useSetPage } from 'ui-patterns/CommandMenu' +} from '@/data/config/project-storage-config-query' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' export function getIntegrationRoute( integration: IntegrationDefinition, diff --git a/apps/studio/components/interfaces/App/CommandMenu/EdgeFunctionSearchResults.tsx b/apps/studio/components/interfaces/App/CommandMenu/EdgeFunctionSearchResults.tsx index 3a184435a7..2e1d6cfbac 100644 --- a/apps/studio/components/interfaces/App/CommandMenu/EdgeFunctionSearchResults.tsx +++ b/apps/studio/components/interfaces/App/CommandMenu/EdgeFunctionSearchResults.tsx @@ -1,16 +1,17 @@ 'use client' -import { useMemo } from 'react' +import { useParams } from 'common' import { EdgeFunctions } from 'icons' import { Loader2 } from 'lucide-react' -import { useParams } from 'common' -import { useEdgeFunctionsQuery } from 'data/edge-functions/edge-functions-query' +import { useMemo } from 'react' + import { - SkeletonResults, EmptyState, ResultsList, + SkeletonResults, type SearchResult, } from './ContextSearchResults.shared' +import { useEdgeFunctionsQuery } from '@/data/edge-functions/edge-functions-query' interface EdgeFunctionSearchResultsProps { query: string diff --git a/apps/studio/components/interfaces/App/CommandMenu/OrgProjectSwitcher.tsx b/apps/studio/components/interfaces/App/CommandMenu/OrgProjectSwitcher.tsx index 71a891f392..381f2ef20f 100644 --- a/apps/studio/components/interfaces/App/CommandMenu/OrgProjectSwitcher.tsx +++ b/apps/studio/components/interfaces/App/CommandMenu/OrgProjectSwitcher.tsx @@ -1,11 +1,11 @@ +import { IS_PLATFORM } from 'common' import { Building, Forward, Wrench } from 'lucide-react' import { useMemo } from 'react' - -import { IS_PLATFORM } from 'common' -import { useOrganizationsQuery } from 'data/organizations/organizations-query' -import { useProjectsInfiniteQuery } from 'data/projects/projects-infinite-query' import { PageType, useRegisterCommands, useRegisterPage, useSetPage } from 'ui-patterns/CommandMenu' + import { COMMAND_MENU_SECTIONS } from './CommandMenu.utils' +import { useOrganizationsQuery } from '@/data/organizations/organizations-query' +import { useProjectsInfiniteQuery } from '@/data/projects/projects-infinite-query' const PROJECT_SWITCHER_PAGE_NAME = 'Switch project' const ORGANIZATION_SWITCHER_PAGE_NAME = 'Configure organization' diff --git a/apps/studio/components/interfaces/App/CommandMenu/PolicySearchResults.tsx b/apps/studio/components/interfaces/App/CommandMenu/PolicySearchResults.tsx index 46bfd9c54d..e711dce37d 100644 --- a/apps/studio/components/interfaces/App/CommandMenu/PolicySearchResults.tsx +++ b/apps/studio/components/interfaces/App/CommandMenu/PolicySearchResults.tsx @@ -1,17 +1,18 @@ 'use client' -import { useMemo } from 'react' +import { useParams } from 'common' import { Auth } from 'icons' import { Loader2 } from 'lucide-react' -import { useParams } from 'common' -import { useDatabasePoliciesQuery } from 'data/database-policies/database-policies-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' +import { useMemo } from 'react' + import { - SkeletonResults, EmptyState, ResultsList, + SkeletonResults, type SearchResult, } from './ContextSearchResults.shared' +import { useDatabasePoliciesQuery } from '@/data/database-policies/database-policies-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface PolicySearchResultsProps { query: string diff --git a/apps/studio/components/interfaces/App/CommandMenu/StorageSearchResults.tsx b/apps/studio/components/interfaces/App/CommandMenu/StorageSearchResults.tsx index 2e7e5a1d7e..b9e864feda 100644 --- a/apps/studio/components/interfaces/App/CommandMenu/StorageSearchResults.tsx +++ b/apps/studio/components/interfaces/App/CommandMenu/StorageSearchResults.tsx @@ -1,31 +1,31 @@ 'use client' import { useDebounce } from '@uidotdev/usehooks' +import { useParams } from 'common' +import { AnalyticsBucket as AnalyticsBucketIcon, FilesBucket, Storage, VectorBucket } from 'icons' import { Loader2 } from 'lucide-react' import { useCallback, useMemo } from 'react' -import { useParams } from 'common' -import { - useIsAnalyticsBucketsEnabled, - useIsVectorBucketsEnabled, -} from 'data/config/project-storage-config-query' -import { - useAnalyticsBucketsQuery, - type AnalyticsBucket, -} from 'data/storage/analytics-buckets-query' -import { - useBucketNumberEstimateQuery, - usePaginatedBucketsQuery, - type Bucket, -} from 'data/storage/buckets-query' -import { useVectorBucketsQuery } from 'data/storage/vector-buckets-query' -import { AnalyticsBucket as AnalyticsBucketIcon, FilesBucket, Storage, VectorBucket } from 'icons' import { EmptyState, ResultsList, SkeletonResults, type SearchResult, } from './ContextSearchResults.shared' +import { + useIsAnalyticsBucketsEnabled, + useIsVectorBucketsEnabled, +} from '@/data/config/project-storage-config-query' +import { + useAnalyticsBucketsQuery, + type AnalyticsBucket, +} from '@/data/storage/analytics-buckets-query' +import { + useBucketNumberEstimateQuery, + usePaginatedBucketsQuery, + type Bucket, +} from '@/data/storage/buckets-query' +import { useVectorBucketsQuery } from '@/data/storage/vector-buckets-query' interface StorageSearchResultsProps { query: string diff --git a/apps/studio/components/interfaces/App/CommandMenu/StudioCommandProvider.tsx b/apps/studio/components/interfaces/App/CommandMenu/StudioCommandProvider.tsx index 8a948cf692..89c978fd6f 100644 --- a/apps/studio/components/interfaces/App/CommandMenu/StudioCommandProvider.tsx +++ b/apps/studio/components/interfaces/App/CommandMenu/StudioCommandProvider.tsx @@ -1,9 +1,9 @@ -import type { PropsWithChildren } from 'react' - -import { CommandProvider } from 'ui-patterns/CommandMenu' -import { useStudioCommandMenuTelemetry } from 'hooks/misc/useStudioCommandMenuTelemetry' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' import { LOCAL_STORAGE_KEYS } from 'common' +import type { PropsWithChildren } from 'react' +import { CommandProvider } from 'ui-patterns/CommandMenu' + +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { useStudioCommandMenuTelemetry } from '@/hooks/misc/useStudioCommandMenuTelemetry' export function StudioCommandProvider({ children }: PropsWithChildren) { const { onTelemetry } = useStudioCommandMenuTelemetry() diff --git a/apps/studio/components/interfaces/App/CommandMenu/Support.tsx b/apps/studio/components/interfaces/App/CommandMenu/Support.tsx index 3c89bf6423..c5300dde99 100644 --- a/apps/studio/components/interfaces/App/CommandMenu/Support.tsx +++ b/apps/studio/components/interfaces/App/CommandMenu/Support.tsx @@ -1,9 +1,9 @@ +import { IS_PLATFORM } from 'common' import { Activity, LifeBuoy } from 'lucide-react' import { useMemo } from 'react' - -import { IS_PLATFORM } from 'common' import type { ICommand } from 'ui-patterns/CommandMenu' import { useRegisterCommands } from 'ui-patterns/CommandMenu' + import { COMMAND_MENU_SECTIONS } from './CommandMenu.utils' export const useSupportCommands = () => { diff --git a/apps/studio/components/interfaces/App/CommandMenu/TableSearchResults.tsx b/apps/studio/components/interfaces/App/CommandMenu/TableSearchResults.tsx index 6f2ba0845f..66266fcd47 100644 --- a/apps/studio/components/interfaces/App/CommandMenu/TableSearchResults.tsx +++ b/apps/studio/components/interfaces/App/CommandMenu/TableSearchResults.tsx @@ -1,16 +1,17 @@ 'use client' -import { useMemo } from 'react' -import { Database, Loader2 } from 'lucide-react' import { useParams } from 'common' -import { useTablesQuery } from 'data/tables/tables-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' +import { Database, Loader2 } from 'lucide-react' +import { useMemo } from 'react' + import { - SkeletonResults, EmptyState, ResultsList, + SkeletonResults, type SearchResult, } from './ContextSearchResults.shared' +import { useTablesQuery } from '@/data/tables/tables-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface TableSearchResultsProps { query: string diff --git a/apps/studio/components/interfaces/App/CommandMenu/index.tsx b/apps/studio/components/interfaces/App/CommandMenu/index.tsx index 076af0e9d8..17dccfcb7b 100644 --- a/apps/studio/components/interfaces/App/CommandMenu/index.tsx +++ b/apps/studio/components/interfaces/App/CommandMenu/index.tsx @@ -1,5 +1,4 @@ import dynamic from 'next/dynamic' - import { useCommandMenuInitiated } from 'ui-patterns/CommandMenu' const LazyCommandMenu = dynamic(() => import('./CommandMenu'), { ssr: false }) diff --git a/apps/studio/components/interfaces/App/FeaturePreview/AdvisorRulesPreview.tsx b/apps/studio/components/interfaces/App/FeaturePreview/AdvisorRulesPreview.tsx index 254b84f5be..2a96db1432 100644 --- a/apps/studio/components/interfaces/App/FeaturePreview/AdvisorRulesPreview.tsx +++ b/apps/studio/components/interfaces/App/FeaturePreview/AdvisorRulesPreview.tsx @@ -1,9 +1,9 @@ +import { useParams } from 'common' import Image from 'next/image' -import { useParams } from 'common' -import { InlineLink } from 'components/ui/InlineLink' -import { BASE_PATH } from 'lib/constants' import { useIsAdvisorRulesEnabled } from './FeaturePreviewContext' +import { InlineLink } from '@/components/ui/InlineLink' +import { BASE_PATH } from '@/lib/constants' export const AdvisorRulesPreview = () => { const { ref } = useParams() diff --git a/apps/studio/components/interfaces/App/FeaturePreview/Branching2Preview.tsx b/apps/studio/components/interfaces/App/FeaturePreview/Branching2Preview.tsx index b98518dfb9..6eb5df454a 100644 --- a/apps/studio/components/interfaces/App/FeaturePreview/Branching2Preview.tsx +++ b/apps/studio/components/interfaces/App/FeaturePreview/Branching2Preview.tsx @@ -1,7 +1,8 @@ -import { InlineLink } from 'components/ui/InlineLink' -import { BASE_PATH, DOCS_URL } from 'lib/constants' import Image from 'next/image' +import { InlineLink } from '@/components/ui/InlineLink' +import { BASE_PATH, DOCS_URL } from '@/lib/constants' + export const Branching2Preview = () => { return (
diff --git a/apps/studio/components/interfaces/App/FeaturePreview/CLSPreview.tsx b/apps/studio/components/interfaces/App/FeaturePreview/CLSPreview.tsx index 036990b4a6..e7064826ea 100644 --- a/apps/studio/components/interfaces/App/FeaturePreview/CLSPreview.tsx +++ b/apps/studio/components/interfaces/App/FeaturePreview/CLSPreview.tsx @@ -1,11 +1,11 @@ -import Image from 'next/image' - import { useParams } from 'common' -import { Markdown } from 'components/interfaces/Markdown' -import { InlineLink } from 'components/ui/InlineLink' -import { useCustomContent } from 'hooks/custom-content/useCustomContent' -import { BASE_PATH, DOCS_URL } from 'lib/constants' -import { AlertDescription_Shadcn_, AlertTitle_Shadcn_, Alert_Shadcn_, WarningIcon } from 'ui' +import Image from 'next/image' +import { Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, WarningIcon } from 'ui' + +import { Markdown } from '@/components/interfaces/Markdown' +import { InlineLink } from '@/components/ui/InlineLink' +import { useCustomContent } from '@/hooks/custom-content/useCustomContent' +import { BASE_PATH, DOCS_URL } from '@/lib/constants' export const CLSPreview = () => { const { ref } = useParams() diff --git a/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewContext.tsx b/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewContext.tsx index 987fee39f2..0798fc2207 100644 --- a/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewContext.tsx +++ b/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewContext.tsx @@ -1,5 +1,4 @@ import { FeatureFlagContext, LOCAL_STORAGE_KEYS, useFlag } from 'common' -import { EMPTY_OBJ } from 'lib/void' import { noop } from 'lodash' import { useQueryState } from 'nuqs' import { @@ -14,6 +13,7 @@ import { import { useFeaturePreviews } from './useFeaturePreviews' import { useStaticEffectEvent } from '@/hooks/useStaticEffectEvent' +import { EMPTY_OBJ } from '@/lib/void' type FeaturePreviewContextType = { flags: { [key: string]: boolean } diff --git a/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewModal.tsx b/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewModal.tsx index 8e7b2a297f..b4a89858c1 100644 --- a/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewModal.tsx +++ b/apps/studio/components/interfaces/App/FeaturePreview/FeaturePreviewModal.tsx @@ -1,7 +1,4 @@ import { LOCAL_STORAGE_KEYS, useParams } from 'common' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { IS_PLATFORM } from 'lib/constants' import { ExternalLink, Eye, EyeOff, FlaskConical } from 'lucide-react' import Link from 'next/link' import { ReactNode } from 'react' @@ -29,15 +26,18 @@ import { AdvisorRulesPreview } from './AdvisorRulesPreview' import { Branching2Preview } from './Branching2Preview' import { CLSPreview } from './CLSPreview' import { useFeaturePreviewContext, useFeaturePreviewModal } from './FeaturePreviewContext' -import { JitDbAccessPreview } from './JitDbAccessPreview' import { FloatingMobileToolbarPreview } from './FloatingMobileToolbarPreview' +import { JitDbAccessPreview } from './JitDbAccessPreview' import { PgDeltaDiffPreview } from './PgDeltaDiffPreview' import { PlatformWebhooksPreview } from './PlatformWebhooksPreview' import { QueueOperationsPreview } from './QueueOperationsPreview' import { TableFilterBarPreview } from './TableFilterBarPreview' import { UnifiedLogsPreview } from './UnifiedLogsPreview' import { FeaturePreview, useFeaturePreviews } from './useFeaturePreviews' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { IS_PLATFORM } from '@/lib/constants' const FEATURE_PREVIEW_KEY_TO_CONTENT: { [key: string]: ReactNode diff --git a/apps/studio/components/interfaces/App/FeaturePreview/FloatingMobileToolbarPreview.tsx b/apps/studio/components/interfaces/App/FeaturePreview/FloatingMobileToolbarPreview.tsx index 2f6158014b..9141ef8ccf 100644 --- a/apps/studio/components/interfaces/App/FeaturePreview/FloatingMobileToolbarPreview.tsx +++ b/apps/studio/components/interfaces/App/FeaturePreview/FloatingMobileToolbarPreview.tsx @@ -1,6 +1,7 @@ -import { BASE_PATH } from 'lib/constants' import Image from 'next/image' +import { BASE_PATH } from '@/lib/constants' + export const FloatingMobileToolbarPreview = () => { return (
diff --git a/apps/studio/components/interfaces/App/FeaturePreview/InlineEditorPreview.tsx b/apps/studio/components/interfaces/App/FeaturePreview/InlineEditorPreview.tsx index 228da9d8b4..71f8505322 100644 --- a/apps/studio/components/interfaces/App/FeaturePreview/InlineEditorPreview.tsx +++ b/apps/studio/components/interfaces/App/FeaturePreview/InlineEditorPreview.tsx @@ -1,6 +1,6 @@ import Image from 'next/image' -import { BASE_PATH } from 'lib/constants' +import { BASE_PATH } from '@/lib/constants' export const InlineEditorPreview = () => { return ( diff --git a/apps/studio/components/interfaces/App/FeaturePreview/PgDeltaDiffPreview.tsx b/apps/studio/components/interfaces/App/FeaturePreview/PgDeltaDiffPreview.tsx index 10d3743388..98b0bacfc5 100644 --- a/apps/studio/components/interfaces/App/FeaturePreview/PgDeltaDiffPreview.tsx +++ b/apps/studio/components/interfaces/App/FeaturePreview/PgDeltaDiffPreview.tsx @@ -1,4 +1,4 @@ -import { InlineLink } from 'components/ui/InlineLink' +import { InlineLink } from '@/components/ui/InlineLink' const PG_DELTA_REPO_URL = 'https://github.com/supabase/pg-toolbelt' diff --git a/apps/studio/components/interfaces/App/FeaturePreview/QueueOperationsPreview.tsx b/apps/studio/components/interfaces/App/FeaturePreview/QueueOperationsPreview.tsx index 022bd257e2..7b748c8a36 100644 --- a/apps/studio/components/interfaces/App/FeaturePreview/QueueOperationsPreview.tsx +++ b/apps/studio/components/interfaces/App/FeaturePreview/QueueOperationsPreview.tsx @@ -1,8 +1,8 @@ import { useParams } from 'common' -import { BASE_PATH } from 'lib/constants' import Image from 'next/image' import { InlineLink } from '@/components/ui/InlineLink' +import { BASE_PATH } from '@/lib/constants' export const QueueOperationsPreview = () => { const { ref = '_' } = useParams() diff --git a/apps/studio/components/interfaces/App/FeaturePreview/TableFilterBarPreview.tsx b/apps/studio/components/interfaces/App/FeaturePreview/TableFilterBarPreview.tsx index 94beb29f6a..686ea6be13 100644 --- a/apps/studio/components/interfaces/App/FeaturePreview/TableFilterBarPreview.tsx +++ b/apps/studio/components/interfaces/App/FeaturePreview/TableFilterBarPreview.tsx @@ -1,8 +1,8 @@ import { useParams } from 'common' -import { BASE_PATH } from 'lib/constants' import Image from 'next/image' import { InlineLink } from '@/components/ui/InlineLink' +import { BASE_PATH } from '@/lib/constants' export const TableFilterBarPreview = () => { const { ref = '_' } = useParams() diff --git a/apps/studio/components/interfaces/App/FeaturePreview/UnifiedLogsPreview.tsx b/apps/studio/components/interfaces/App/FeaturePreview/UnifiedLogsPreview.tsx index 8fca669b28..a968d7e42e 100644 --- a/apps/studio/components/interfaces/App/FeaturePreview/UnifiedLogsPreview.tsx +++ b/apps/studio/components/interfaces/App/FeaturePreview/UnifiedLogsPreview.tsx @@ -1,8 +1,9 @@ import { useParams } from 'common' -import { InlineLink } from 'components/ui/InlineLink' -import { BASE_PATH } from 'lib/constants' import Image from 'next/image' +import { InlineLink } from '@/components/ui/InlineLink' +import { BASE_PATH } from '@/lib/constants' + export const UnifiedLogsPreview = () => { const { ref = '_' } = useParams() diff --git a/apps/studio/components/interfaces/App/RouteValidationWrapper.tsx b/apps/studio/components/interfaces/App/RouteValidationWrapper.tsx index 6d8b2a124a..e69aa8c939 100644 --- a/apps/studio/components/interfaces/App/RouteValidationWrapper.tsx +++ b/apps/studio/components/interfaces/App/RouteValidationWrapper.tsx @@ -1,15 +1,16 @@ import { LOCAL_STORAGE_KEYS, useIsLoggedIn, useIsMFAEnabled, useParams } from 'common' -import { useOrganizationsQuery } from 'data/organizations/organizations-query' -import { useProjectDetailQuery } from 'data/projects/project-detail-query' -import { useDashboardHistory } from 'hooks/misc/useDashboardHistory' -import useLatest from 'hooks/misc/useLatest' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { IS_PLATFORM } from 'lib/constants' import { useRouter } from 'next/router' import { PropsWithChildren, useEffect } from 'react' import { toast } from 'sonner' +import { useOrganizationsQuery } from '@/data/organizations/organizations-query' +import { useProjectDetailQuery } from '@/data/projects/project-detail-query' +import { useDashboardHistory } from '@/hooks/misc/useDashboardHistory' +import useLatest from '@/hooks/misc/useLatest' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { IS_PLATFORM } from '@/lib/constants' + // Ideally these could all be within a _middleware when we use Next 12 export const RouteValidationWrapper = ({ children }: PropsWithChildren<{}>) => { const router = useRouter() diff --git a/apps/studio/components/interfaces/App/UpdateBillingAddressModal.tsx b/apps/studio/components/interfaces/App/UpdateBillingAddressModal.tsx index 63efad95af..ace5621077 100644 --- a/apps/studio/components/interfaces/App/UpdateBillingAddressModal.tsx +++ b/apps/studio/components/interfaces/App/UpdateBillingAddressModal.tsx @@ -1,20 +1,6 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useQueryClient } from '@tanstack/react-query' import { useFlag } from 'common' -import { - BillingCustomerDataForm, - type BillingCustomerDataFormValues, -} from 'components/interfaces/Organization/BillingSettings/BillingCustomerData/BillingCustomerDataForm' -import { resolveStoredTaxId } from 'components/interfaces/Organization/BillingSettings/BillingCustomerData/TaxID.utils' -import { useBillingCustomerDataForm } from 'components/interfaces/Organization/BillingSettings/BillingCustomerData/useBillingCustomerDataForm' -import { useOrganizationCustomerProfileQuery } from 'data/organizations/organization-customer-profile-query' -import { useOrganizationCustomerProfileUpdateMutation } from 'data/organizations/organization-customer-profile-update-mutation' -import { useOrganizationTaxIdQuery } from 'data/organizations/organization-tax-id-query' -import { useOrganizationTaxIdUpdateMutation } from 'data/organizations/organization-tax-id-update-mutation' -import { invalidateOrganizationsQuery } from 'data/organizations/organizations-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { IS_PLATFORM } from 'lib/constants' import { useMemo, useState } from 'react' import { toast } from 'sonner' import { @@ -30,6 +16,21 @@ import { } from 'ui' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' +import { + BillingCustomerDataForm, + type BillingCustomerDataFormValues, +} from '@/components/interfaces/Organization/BillingSettings/BillingCustomerData/BillingCustomerDataForm' +import { resolveStoredTaxId } from '@/components/interfaces/Organization/BillingSettings/BillingCustomerData/TaxID.utils' +import { useBillingCustomerDataForm } from '@/components/interfaces/Organization/BillingSettings/BillingCustomerData/useBillingCustomerDataForm' +import { useOrganizationCustomerProfileQuery } from '@/data/organizations/organization-customer-profile-query' +import { useOrganizationCustomerProfileUpdateMutation } from '@/data/organizations/organization-customer-profile-update-mutation' +import { useOrganizationTaxIdQuery } from '@/data/organizations/organization-tax-id-query' +import { useOrganizationTaxIdUpdateMutation } from '@/data/organizations/organization-tax-id-update-mutation' +import { invalidateOrganizationsQuery } from '@/data/organizations/organizations-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { IS_PLATFORM } from '@/lib/constants' + export function UpdateBillingAddressModal() { const queryClient = useQueryClient() diff --git a/apps/studio/components/interfaces/AuditLogs/LogDetailsPanel.tsx b/apps/studio/components/interfaces/AuditLogs/LogDetailsPanel.tsx index edca0dd6c4..ba63573407 100644 --- a/apps/studio/components/interfaces/AuditLogs/LogDetailsPanel.tsx +++ b/apps/studio/components/interfaces/AuditLogs/LogDetailsPanel.tsx @@ -1,9 +1,13 @@ import dayjs from 'dayjs' - -import { FormSection, FormSectionContent, FormSectionLabel } from 'components/ui/Forms/FormSection' -import type { AuditLog } from 'data/organizations/organization-audit-logs-query' import { Input, SidePanel } from 'ui' +import { + FormSection, + FormSectionContent, + FormSectionLabel, +} from '@/components/ui/Forms/FormSection' +import type { AuditLog } from '@/data/organizations/organization-audit-logs-query' + export interface LogDetailsPanelProps { selectedLog?: AuditLog onClose: () => void diff --git a/apps/studio/components/interfaces/Auth/AuditLogsForm.tsx b/apps/studio/components/interfaces/Auth/AuditLogsForm.tsx index 47cf9b719d..55ce24c331 100644 --- a/apps/studio/components/interfaces/Auth/AuditLogsForm.tsx +++ b/apps/studio/components/interfaces/Auth/AuditLogsForm.tsx @@ -1,26 +1,17 @@ import { yupResolver } from '@hookform/resolvers/yup' import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { useEffect } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { boolean, object } from 'yup' - -import { useParams } from 'common' -import { AlertError } from 'components/ui/AlertError' -import { InlineLink } from 'components/ui/InlineLink' -import { useAuthConfigQuery } from 'data/auth/auth-config-query' -import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation' -import { useTablesQuery } from 'data/tables/tables-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Button, Card, CardContent, CardFooter, + Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, - Form_Shadcn_, Switch, } from 'ui' import { Admonition, GenericSkeletonLoader } from 'ui-patterns' @@ -32,6 +23,15 @@ import { PageSectionSummary, PageSectionTitle, } from 'ui-patterns/PageSection' +import { boolean, object } from 'yup' + +import { AlertError } from '@/components/ui/AlertError' +import { InlineLink } from '@/components/ui/InlineLink' +import { useAuthConfigQuery } from '@/data/auth/auth-config-query' +import { useAuthConfigUpdateMutation } from '@/data/auth/auth-config-update-mutation' +import { useTablesQuery } from '@/data/tables/tables-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' const schema = object({ AUDIT_LOG_DISABLE_POSTGRES: boolean().required(), diff --git a/apps/studio/components/interfaces/Auth/AuthProvidersForm/AuthAlert.tsx b/apps/studio/components/interfaces/Auth/AuthProvidersForm/AuthAlert.tsx index 5b8e74dd0c..83b84d4b1c 100644 --- a/apps/studio/components/interfaces/Auth/AuthProvidersForm/AuthAlert.tsx +++ b/apps/studio/components/interfaces/Auth/AuthProvidersForm/AuthAlert.tsx @@ -1,8 +1,6 @@ +import { useParams } from 'common' import { ExternalLink } from 'lucide-react' import Link from 'next/link' - -import { useParams } from 'common' -import { DOCS_URL } from 'lib/constants' import { Alert_Shadcn_, AlertDescription_Shadcn_, @@ -11,6 +9,8 @@ import { WarningIcon, } from 'ui' +import { DOCS_URL } from '@/lib/constants' + export const AuthAlert = ({ title, isHookSendSMSEnabled, diff --git a/apps/studio/components/interfaces/Auth/AuthProvidersForm/AuthProvidersForm.types.ts b/apps/studio/components/interfaces/Auth/AuthProvidersForm/AuthProvidersForm.types.ts index 32667230f5..ea925ef5e4 100644 --- a/apps/studio/components/interfaces/Auth/AuthProvidersForm/AuthProvidersForm.types.ts +++ b/apps/studio/components/interfaces/Auth/AuthProvidersForm/AuthProvidersForm.types.ts @@ -1,4 +1,4 @@ -import type { FeatureKey } from 'data/entitlements/entitlements-query' +import type { FeatureKey } from '@/data/entitlements/entitlements-query' export interface Enum { label: string diff --git a/apps/studio/components/interfaces/Auth/AuthProvidersForm/FormField.tsx b/apps/studio/components/interfaces/Auth/AuthProvidersForm/FormField.tsx index 1630965d9a..4dcd7e4cf1 100644 --- a/apps/studio/components/interfaces/Auth/AuthProvidersForm/FormField.tsx +++ b/apps/studio/components/interfaces/Auth/AuthProvidersForm/FormField.tsx @@ -1,6 +1,4 @@ -import { Markdown } from 'components/interfaces/Markdown' import { format } from 'date-fns' -import { BASE_PATH } from 'lib/constants' import { CalendarIcon, ExternalLink } from 'lucide-react' import { type Control } from 'react-hook-form' import ReactMarkdown from 'react-markdown' @@ -31,6 +29,8 @@ import { Input as DataInput } from 'ui-patterns/DataInputs/Input' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import type { Enum } from './AuthProvidersForm.types' +import { Markdown } from '@/components/interfaces/Markdown' +import { BASE_PATH } from '@/lib/constants' interface FormFieldProps { projectRef: string | undefined diff --git a/apps/studio/components/interfaces/Auth/AuthProvidersForm/ProviderForm.tsx b/apps/studio/components/interfaces/Auth/AuthProvidersForm/ProviderForm.tsx index a11b1bfee9..8ae0ddec11 100644 --- a/apps/studio/components/interfaces/Auth/AuthProvidersForm/ProviderForm.tsx +++ b/apps/studio/components/interfaces/Auth/AuthProvidersForm/ProviderForm.tsx @@ -1,18 +1,6 @@ import { yupResolver } from '@hookform/resolvers/yup' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { Markdown } from 'components/interfaces/Markdown' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DocsButton } from 'components/ui/DocsButton' -import { ResourceItem } from 'components/ui/Resource/ResourceItem' -import type { components } from 'data/api' -import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation' -import { useProjectApiUrl } from 'data/config/project-endpoint-query' -import { useHasEntitlementAccess } from 'hooks/misc/useCheckEntitlements' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useStaticEffectEvent } from 'hooks/useStaticEffectEvent' -import { BASE_PATH } from 'lib/constants' import { Check } from 'lucide-react' import { useTheme } from 'next-themes' import { useQueryState } from 'nuqs' @@ -39,6 +27,18 @@ import { NO_REQUIRED_CHARACTERS } from '../Auth.constants' import { AuthAlert } from './AuthAlert' import type { Provider } from './AuthProvidersForm.types' import FormField from './FormField' +import { Markdown } from '@/components/interfaces/Markdown' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DocsButton } from '@/components/ui/DocsButton' +import { ResourceItem } from '@/components/ui/Resource/ResourceItem' +import type { components } from '@/data/api' +import { useAuthConfigUpdateMutation } from '@/data/auth/auth-config-update-mutation' +import { useProjectApiUrl } from '@/data/config/project-endpoint-query' +import { useHasEntitlementAccess } from '@/hooks/misc/useCheckEntitlements' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useStaticEffectEvent } from '@/hooks/useStaticEffectEvent' +import { BASE_PATH } from '@/lib/constants' interface ProviderFormProps { config: components['schemas']['GoTrueConfigResponse'] diff --git a/apps/studio/components/interfaces/Auth/AuthProvidersForm/index.tsx b/apps/studio/components/interfaces/Auth/AuthProvidersForm/index.tsx index 2594920618..eef32ee931 100644 --- a/apps/studio/components/interfaces/Auth/AuthProvidersForm/index.tsx +++ b/apps/studio/components/interfaces/Auth/AuthProvidersForm/index.tsx @@ -1,11 +1,6 @@ +import { useParams } from 'common' import { ExternalLink } from 'lucide-react' import Link from 'next/link' - -import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { ResourceList } from 'components/ui/Resource/ResourceList' -import { HorizontalShimmerWithIcon } from 'components/ui/Shimmers' -import { useAuthConfigQuery } from 'data/auth/auth-config-query' import { Alert_Shadcn_, AlertDescription_Shadcn_, @@ -21,9 +16,14 @@ import { PageSectionSummary, PageSectionTitle, } from 'ui-patterns/PageSection' + import { getPhoneProviderValidationSchema, PROVIDERS_SCHEMAS } from '../AuthProvidersFormValidation' import type { Provider } from './AuthProvidersForm.types' import { ProviderForm } from './ProviderForm' +import AlertError from '@/components/ui/AlertError' +import { ResourceList } from '@/components/ui/Resource/ResourceList' +import { HorizontalShimmerWithIcon } from '@/components/ui/Shimmers' +import { useAuthConfigQuery } from '@/data/auth/auth-config-query' export const AuthProvidersForm = () => { const { ref: projectRef } = useParams() diff --git a/apps/studio/components/interfaces/Auth/AuthProvidersFormValidation.tsx b/apps/studio/components/interfaces/Auth/AuthProvidersFormValidation.tsx index b57e5a7d8d..752550df20 100644 --- a/apps/studio/components/interfaces/Auth/AuthProvidersFormValidation.tsx +++ b/apps/studio/components/interfaces/Auth/AuthProvidersFormValidation.tsx @@ -1,8 +1,9 @@ -import { NO_REQUIRED_CHARACTERS, urlRegex } from 'components/interfaces/Auth/Auth.constants' -import { ProjectAuthConfigData } from 'data/auth/auth-config-query' -import { DOCS_URL } from 'lib/constants' import { boolean, number, object, string } from 'yup' +import { NO_REQUIRED_CHARACTERS, urlRegex } from '@/components/interfaces/Auth/Auth.constants' +import { ProjectAuthConfigData } from '@/data/auth/auth-config-query' +import { DOCS_URL } from '@/lib/constants' + const parseBase64URL = (b64url: string) => { return atob(b64url.replace(/[-]/g, '+').replace(/[_]/g, '/')) } diff --git a/apps/studio/components/interfaces/Auth/AuthTemplatesValidation.tsx b/apps/studio/components/interfaces/Auth/AuthTemplatesValidation.tsx index 26c2331a84..7a6aabe88f 100644 --- a/apps/studio/components/interfaces/Auth/AuthTemplatesValidation.tsx +++ b/apps/studio/components/interfaces/Auth/AuthTemplatesValidation.tsx @@ -1,6 +1,7 @@ -import type { FormSchema } from 'types' import { object, string } from 'yup' +import type { FormSchema } from '@/types' + const JSON_SCHEMA_VERSION = 'http://json-schema.org/draft-07/schema#' const CONFIRMATION: FormSchema = { diff --git a/apps/studio/components/interfaces/Auth/BasicAuthSettingsForm.tsx b/apps/studio/components/interfaces/Auth/BasicAuthSettingsForm.tsx index 68d7992f03..829bb5c4fa 100644 --- a/apps/studio/components/interfaces/Auth/BasicAuthSettingsForm.tsx +++ b/apps/studio/components/interfaces/Auth/BasicAuthSettingsForm.tsx @@ -1,32 +1,22 @@ import { yupResolver } from '@hookform/resolvers/yup' import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { ExternalLink } from 'lucide-react' import Link from 'next/link' import { useEffect } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { boolean, object, string } from 'yup' - -import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { InlineLink } from 'components/ui/InlineLink' -import NoPermission from 'components/ui/NoPermission' -import { useAuthConfigQuery } from 'data/auth/auth-config-query' -import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { DOCS_URL } from 'lib/constants' import { + Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, - Alert_Shadcn_, Button, Card, CardContent, CardFooter, + Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, - Form_Shadcn_, Switch, WarningIcon, } from 'ui' @@ -39,7 +29,17 @@ import { PageSectionTitle, } from 'ui-patterns/PageSection' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' +import { boolean, object, string } from 'yup' + import { NO_REQUIRED_CHARACTERS } from './Auth.constants' +import AlertError from '@/components/ui/AlertError' +import { InlineLink } from '@/components/ui/InlineLink' +import NoPermission from '@/components/ui/NoPermission' +import { useAuthConfigQuery } from '@/data/auth/auth-config-query' +import { useAuthConfigUpdateMutation } from '@/data/auth/auth-config-update-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { DOCS_URL } from '@/lib/constants' const schema = object({ DISABLE_SIGNUP: boolean().required(), diff --git a/apps/studio/components/interfaces/Auth/CustomAuthProviders/CustomAuthProvidersList.tsx b/apps/studio/components/interfaces/Auth/CustomAuthProviders/CustomAuthProvidersList.tsx index f691540671..3e1cc3fed2 100644 --- a/apps/studio/components/interfaces/Auth/CustomAuthProviders/CustomAuthProvidersList.tsx +++ b/apps/studio/components/interfaces/Auth/CustomAuthProviders/CustomAuthProvidersList.tsx @@ -1,8 +1,9 @@ +import { useQueryClient } from '@tanstack/react-query' import { useParams } from 'common' import { Edit, MoreVertical, Plus, Search, Trash, X } from 'lucide-react' import { parseAsBoolean, parseAsStringLiteral, useQueryState } from 'nuqs' import { useEffect, useMemo, useState } from 'react' -import { useQueryClient } from '@tanstack/react-query' +import { toast } from 'sonner' import { Badge, Button, @@ -23,6 +24,7 @@ import { TableHeadSort, TableRow, } from 'ui' +import { Admonition } from 'ui-patterns/admonition' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { CreateOrUpdateCustomProviderSheet } from './CreateOrUpdateCustomProviderSheet' @@ -40,8 +42,6 @@ import { useAuthConfigQuery } from '@/data/auth/auth-config-query' import { useAuthConfigUpdateMutation } from '@/data/auth/auth-config-update-mutation' import { useOAuthCustomProvidersQuery } from '@/data/oauth-custom-providers/oauth-custom-providers-query' import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' -import { toast } from 'sonner' -import { Admonition } from 'ui-patterns/admonition' const CUSTOM_PROVIDERS_SORT_VALUES = [ 'name:asc', diff --git a/apps/studio/components/interfaces/Auth/CustomAuthProviders/index.tsx b/apps/studio/components/interfaces/Auth/CustomAuthProviders/index.tsx index 6a04512146..75f6bb6017 100644 --- a/apps/studio/components/interfaces/Auth/CustomAuthProviders/index.tsx +++ b/apps/studio/components/interfaces/Auth/CustomAuthProviders/index.tsx @@ -9,9 +9,9 @@ import { PageSectionTitle, } from 'ui-patterns/PageSection' -import { DocsButton } from 'components/ui/DocsButton' -import { DOCS_URL } from 'lib/constants' import { CustomAuthProvidersList } from './CustomAuthProvidersList' +import { DocsButton } from '@/components/ui/DocsButton' +import { DOCS_URL } from '@/lib/constants' export const CustomAuthProviders = () => { return ( diff --git a/apps/studio/components/interfaces/Auth/EmailTemplates/EmailTemplates.tsx b/apps/studio/components/interfaces/Auth/EmailTemplates/EmailTemplates.tsx index 0f8a3952ba..b5efd7eb21 100644 --- a/apps/studio/components/interfaces/Auth/EmailTemplates/EmailTemplates.tsx +++ b/apps/studio/components/interfaces/Auth/EmailTemplates/EmailTemplates.tsx @@ -1,20 +1,11 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' +import { LOCAL_STORAGE_KEYS, useParams } from 'common' import { ChevronRight, ExternalLink, X } from 'lucide-react' import Link from 'next/link' import { useEffect } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' - -import { LOCAL_STORAGE_KEYS, useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { InlineLink } from 'components/ui/InlineLink' -import { useAuthConfigQuery } from 'data/auth/auth-config-query' -import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { DOCS_URL } from 'lib/constants' import { Badge, Button, @@ -38,8 +29,17 @@ import { PageSectionTitle, } from 'ui-patterns/PageSection' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' +import { z } from 'zod' + import { TEMPLATES_SCHEMAS } from '../AuthTemplatesValidation' import { slugifyTitle } from './EmailTemplates.utils' +import AlertError from '@/components/ui/AlertError' +import { InlineLink } from '@/components/ui/InlineLink' +import { useAuthConfigQuery } from '@/data/auth/auth-config-query' +import { useAuthConfigUpdateMutation } from '@/data/auth/auth-config-update-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { DOCS_URL } from '@/lib/constants' const notificationEnabledKeys = TEMPLATES_SCHEMAS.filter( (t) => t.misc?.emailTemplateType === 'security' diff --git a/apps/studio/components/interfaces/Auth/EmailTemplates/SpamValidation.tsx b/apps/studio/components/interfaces/Auth/EmailTemplates/SpamValidation.tsx index 7853be1b2d..2dfb19ef0c 100644 --- a/apps/studio/components/interfaces/Auth/EmailTemplates/SpamValidation.tsx +++ b/apps/studio/components/interfaces/Auth/EmailTemplates/SpamValidation.tsx @@ -1,10 +1,10 @@ import { AnimatePresence, motion } from 'framer-motion' - -import { Markdown } from 'components/interfaces/Markdown' -import { ValidateSpamResponse } from 'data/auth/validate-spam-mutation' import { CardContent, Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from 'ui' import { Admonition } from 'ui-patterns' +import { Markdown } from '@/components/interfaces/Markdown' +import { ValidateSpamResponse } from '@/data/auth/validate-spam-mutation' + interface SpamValidationProps { spamRules?: ValidateSpamResponse['rules'] } diff --git a/apps/studio/components/interfaces/Auth/EmailTemplates/TemplateEditor.tsx b/apps/studio/components/interfaces/Auth/EmailTemplates/TemplateEditor.tsx index 9e3e61eab1..47a1888d02 100644 --- a/apps/studio/components/interfaces/Auth/EmailTemplates/TemplateEditor.tsx +++ b/apps/studio/components/interfaces/Auth/EmailTemplates/TemplateEditor.tsx @@ -1,18 +1,10 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import type { editor } from 'monaco-editor' import { useEffect, useMemo, useRef, useState } from 'react' import { useForm } from 'react-hook-form' import ReactMarkdown from 'react-markdown' import { toast } from 'sonner' - -import { useParams } from 'common' -import CodeEditor from 'components/ui/CodeEditor/CodeEditor' -import TwoOptionToggle from 'components/ui/TwoOptionToggle' -import { useAuthConfigQuery } from 'data/auth/auth-config-query' -import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation' -import { useValidateSpamMutation, ValidateSpamResponse } from 'data/auth/validate-spam-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import type { FormSchema } from 'types' import { Button, CardContent, @@ -28,8 +20,16 @@ import { } from 'ui' import { Admonition } from 'ui-patterns' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' + import { SpamValidation } from './SpamValidation' import { PreventNavigationOnUnsavedChanges } from '@/components/ui-patterns/Dialogs/PreventNavigationOnUnsavedChanges' +import CodeEditor from '@/components/ui/CodeEditor/CodeEditor' +import TwoOptionToggle from '@/components/ui/TwoOptionToggle' +import { useAuthConfigQuery } from '@/data/auth/auth-config-query' +import { useAuthConfigUpdateMutation } from '@/data/auth/auth-config-update-mutation' +import { useValidateSpamMutation, ValidateSpamResponse } from '@/data/auth/validate-spam-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import type { FormSchema } from '@/types' interface TemplateEditorProps { template: FormSchema diff --git a/apps/studio/components/interfaces/Auth/Hooks/AddHookDropdown.tsx b/apps/studio/components/interfaces/Auth/Hooks/AddHookDropdown.tsx index aafc243be6..38e1337b0e 100644 --- a/apps/studio/components/interfaces/Auth/Hooks/AddHookDropdown.tsx +++ b/apps/studio/components/interfaces/Auth/Hooks/AddHookDropdown.tsx @@ -1,11 +1,7 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' -import { ChevronDown } from 'lucide-react' import { useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { InlineLink } from 'components/ui/InlineLink' -import { useAuthConfigQuery } from 'data/auth/auth-config-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' +import { ChevronDown } from 'lucide-react' +import { useMemo } from 'react' import { Button, DropdownMenu, @@ -15,10 +11,15 @@ import { DropdownMenuSeparator, DropdownMenuTrigger, } from 'ui' -import { HOOKS_DEFINITIONS, HOOK_DEFINITION_TITLE, Hook } from './hooks.constants' + +import { Hook, HOOK_DEFINITION_TITLE, HOOKS_DEFINITIONS } from './hooks.constants' import { extractMethod, isValidHook } from './hooks.utils' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useMemo } from 'react' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { InlineLink } from '@/components/ui/InlineLink' +import { useAuthConfigQuery } from '@/data/auth/auth-config-query' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' interface AddHookDropdownProps { buttonText?: string diff --git a/apps/studio/components/interfaces/Auth/Hooks/CreateHookSheet.tsx b/apps/studio/components/interfaces/Auth/Hooks/CreateHookSheet.tsx index c4ce1fd516..bfe90b9835 100644 --- a/apps/studio/components/interfaces/Auth/Hooks/CreateHookSheet.tsx +++ b/apps/studio/components/interfaces/Auth/Hooks/CreateHookSheet.tsx @@ -1,17 +1,5 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useParams } from 'common' -import { convertArgumentTypes } from 'components/interfaces/Database/Functions/Functions.utils' -import { DiscardChangesConfirmationDialog } from 'components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' -import CodeEditor from 'components/ui/CodeEditor/CodeEditor' -import { DocsButton } from 'components/ui/DocsButton' -import FunctionSelector from 'components/ui/FunctionSelector' -import SchemaSelector from 'components/ui/SchemaSelector' -import { AuthConfigResponse } from 'data/auth/auth-config-query' -import { useAuthHooksUpdateMutation } from 'data/auth/auth-hooks-update-mutation' -import { executeSql } from 'data/sql/execute-sql-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useConfirmOnClose } from 'hooks/ui/useConfirmOnClose' -import { DOCS_URL } from 'lib/constants' import randomBytes from 'randombytes' import { useEffect, useMemo } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' @@ -39,6 +27,18 @@ import * as z from 'zod' import { Hook, HOOK_DEFINITION_TITLE, HOOKS_DEFINITIONS } from './hooks.constants' import { extractMethod, getRevokePermissionStatements, isValidHook } from './hooks.utils' +import { convertArgumentTypes } from '@/components/interfaces/Database/Functions/Functions.utils' +import { DiscardChangesConfirmationDialog } from '@/components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' +import CodeEditor from '@/components/ui/CodeEditor/CodeEditor' +import { DocsButton } from '@/components/ui/DocsButton' +import FunctionSelector from '@/components/ui/FunctionSelector' +import SchemaSelector from '@/components/ui/SchemaSelector' +import { AuthConfigResponse } from '@/data/auth/auth-config-query' +import { useAuthHooksUpdateMutation } from '@/data/auth/auth-hooks-update-mutation' +import { executeSql } from '@/data/sql/execute-sql-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useConfirmOnClose } from '@/hooks/ui/useConfirmOnClose' +import { DOCS_URL } from '@/lib/constants' interface CreateHookSheetProps { visible: boolean diff --git a/apps/studio/components/interfaces/Auth/Hooks/HookCard.tsx b/apps/studio/components/interfaces/Auth/Hooks/HookCard.tsx index f9e619fe5a..ef30411d00 100644 --- a/apps/studio/components/interfaces/Auth/Hooks/HookCard.tsx +++ b/apps/studio/components/interfaces/Auth/Hooks/HookCard.tsx @@ -1,12 +1,12 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { Check, Webhook } from 'lucide-react' +import { Badge, copyToClipboard, Input } from 'ui' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DocsButton } from 'components/ui/DocsButton' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { DOCS_URL } from 'lib/constants' -import { Badge, Input, copyToClipboard } from 'ui' import { Hook } from './hooks.constants' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DocsButton } from '@/components/ui/DocsButton' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { DOCS_URL } from '@/lib/constants' interface HookCardProps { hook: Hook diff --git a/apps/studio/components/interfaces/Auth/Hooks/HooksListing.tsx b/apps/studio/components/interfaces/Auth/Hooks/HooksListing.tsx index 92d4cd798c..c7a257207f 100644 --- a/apps/studio/components/interfaces/Auth/Hooks/HooksListing.tsx +++ b/apps/studio/components/interfaces/Auth/Hooks/HooksListing.tsx @@ -1,10 +1,4 @@ import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import CodeEditor from 'components/ui/CodeEditor/CodeEditor' -import { useAuthConfigQuery } from 'data/auth/auth-config-query' -import { useAuthHooksUpdateMutation } from 'data/auth/auth-hooks-update-mutation' -import { executeSql } from 'data/sql/execute-sql-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { parseAsString, useQueryState } from 'nuqs' import { useEffect, useState } from 'react' import { toast } from 'sonner' @@ -25,6 +19,12 @@ import { CreateHookSheet } from './CreateHookSheet' import { HookCard } from './HookCard' import { Hook, HOOKS_DEFINITIONS } from './hooks.constants' import { extractMethod, getRevokePermissionStatements, isValidHook } from './hooks.utils' +import AlertError from '@/components/ui/AlertError' +import CodeEditor from '@/components/ui/CodeEditor/CodeEditor' +import { useAuthConfigQuery } from '@/data/auth/auth-config-query' +import { useAuthHooksUpdateMutation } from '@/data/auth/auth-hooks-update-mutation' +import { executeSql } from '@/data/sql/execute-sql-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export const HooksListing = () => { const { ref: projectRef } = useParams() diff --git a/apps/studio/components/interfaces/Auth/MfaAuthSettingsForm/MfaAuthSettingsForm.tsx b/apps/studio/components/interfaces/Auth/MfaAuthSettingsForm/MfaAuthSettingsForm.tsx index 5fae77cc4c..a79b32f461 100644 --- a/apps/studio/components/interfaces/Auth/MfaAuthSettingsForm/MfaAuthSettingsForm.tsx +++ b/apps/studio/components/interfaces/Auth/MfaAuthSettingsForm/MfaAuthSettingsForm.tsx @@ -1,14 +1,6 @@ import { yupResolver } from '@hookform/resolvers/yup' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import NoPermission from 'components/ui/NoPermission' -import { UpgradeToPro } from 'components/ui/UpgradeToPro' -import { useAuthConfigQuery } from 'data/auth/auth-config-query' -import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { IS_PLATFORM } from 'lib/constants' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' @@ -47,6 +39,15 @@ import { } from 'ui-patterns/PageSection' import { boolean, number, object, string } from 'yup' +import AlertError from '@/components/ui/AlertError' +import NoPermission from '@/components/ui/NoPermission' +import { UpgradeToPro } from '@/components/ui/UpgradeToPro' +import { useAuthConfigQuery } from '@/data/auth/auth-config-query' +import { useAuthConfigUpdateMutation } from '@/data/auth/auth-config-update-mutation' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { IS_PLATFORM } from '@/lib/constants' + function determineMFAStatus(verifyEnabled: boolean, enrollEnabled: boolean) { return verifyEnabled ? (enrollEnabled ? 'Enabled' : 'Verify Enabled') : 'Disabled' } diff --git a/apps/studio/components/interfaces/Auth/OAuthApps/CreateOrUpdateOAuthAppSheet.tsx b/apps/studio/components/interfaces/Auth/OAuthApps/CreateOrUpdateOAuthAppSheet.tsx index 174da2268f..d1fd421714 100644 --- a/apps/studio/components/interfaces/Auth/OAuthApps/CreateOrUpdateOAuthAppSheet.tsx +++ b/apps/studio/components/interfaces/Auth/OAuthApps/CreateOrUpdateOAuthAppSheet.tsx @@ -5,13 +5,6 @@ import type { UpdateOAuthClientParams, } from '@supabase/supabase-js' import { useParams } from 'common' -import { InlineLink } from 'components/ui/InlineLink' -import Panel from 'components/ui/Panel' -import { useProjectApiUrl } from 'data/config/project-endpoint-query' -import { useOAuthServerAppCreateMutation } from 'data/oauth-server-apps/oauth-server-app-create-mutation' -import { useOAuthServerAppRegenerateSecretMutation } from 'data/oauth-server-apps/oauth-server-app-regenerate-secret-mutation' -import { useOAuthServerAppUpdateMutation } from 'data/oauth-server-apps/oauth-server-app-update-mutation' -import { DOCS_URL } from 'lib/constants' import { Trash2, Upload, X } from 'lucide-react' import { useEffect, useRef, useState, type ChangeEvent } from 'react' import { useForm } from 'react-hook-form' @@ -41,6 +34,14 @@ import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { SingleValueFieldArray } from 'ui-patterns/form/SingleValueFieldArray/SingleValueFieldArray' import * as z from 'zod' +import { InlineLink } from '@/components/ui/InlineLink' +import Panel from '@/components/ui/Panel' +import { useProjectApiUrl } from '@/data/config/project-endpoint-query' +import { useOAuthServerAppCreateMutation } from '@/data/oauth-server-apps/oauth-server-app-create-mutation' +import { useOAuthServerAppRegenerateSecretMutation } from '@/data/oauth-server-apps/oauth-server-app-regenerate-secret-mutation' +import { useOAuthServerAppUpdateMutation } from '@/data/oauth-server-apps/oauth-server-app-update-mutation' +import { DOCS_URL } from '@/lib/constants' + interface CreateOrUpdateOAuthAppSheetProps { visible: boolean appToEdit?: OAuthClient diff --git a/apps/studio/components/interfaces/Auth/OAuthApps/DeleteOAuthAppModal.tsx b/apps/studio/components/interfaces/Auth/OAuthApps/DeleteOAuthAppModal.tsx index 76a8818cb9..14bcd90b85 100644 --- a/apps/studio/components/interfaces/Auth/OAuthApps/DeleteOAuthAppModal.tsx +++ b/apps/studio/components/interfaces/Auth/OAuthApps/DeleteOAuthAppModal.tsx @@ -1,9 +1,10 @@ import type { OAuthClient } from '@supabase/supabase-js' import { useParams } from 'common' -import { useProjectApiUrl } from 'data/config/project-endpoint-query' -import type { OAuthServerAppDeleteVariables } from 'data/oauth-server-apps/oauth-server-app-delete-mutation' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' +import { useProjectApiUrl } from '@/data/config/project-endpoint-query' +import type { OAuthServerAppDeleteVariables } from '@/data/oauth-server-apps/oauth-server-app-delete-mutation' + interface DeleteOAuthAppModalProps { visible: boolean selectedApp?: OAuthClient diff --git a/apps/studio/components/interfaces/Auth/OAuthApps/NewOAuthAppBanner.tsx b/apps/studio/components/interfaces/Auth/OAuthApps/NewOAuthAppBanner.tsx index 15db254231..008715408d 100644 --- a/apps/studio/components/interfaces/Auth/OAuthApps/NewOAuthAppBanner.tsx +++ b/apps/studio/components/interfaces/Auth/OAuthApps/NewOAuthAppBanner.tsx @@ -1,7 +1,6 @@ import type { OAuthClient } from '@supabase/supabase-js' import { X } from 'lucide-react' import { toast } from 'sonner' - import { Button } from 'ui' import { Admonition } from 'ui-patterns/admonition' import { Input } from 'ui-patterns/DataInputs/Input' diff --git a/apps/studio/components/interfaces/Auth/OAuthApps/OAuthAppsList.tsx b/apps/studio/components/interfaces/Auth/OAuthApps/OAuthAppsList.tsx index 9e8331a612..ab0aa237c2 100644 --- a/apps/studio/components/interfaces/Auth/OAuthApps/OAuthAppsList.tsx +++ b/apps/studio/components/interfaces/Auth/OAuthApps/OAuthAppsList.tsx @@ -1,13 +1,5 @@ import type { OAuthClient } from '@supabase/supabase-js' import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { FilterPopover } from 'components/ui/FilterPopover' -import { useAuthConfigQuery } from 'data/auth/auth-config-query' -import { useProjectApiUrl } from 'data/config/project-endpoint-query' -import { useOAuthServerAppDeleteMutation } from 'data/oauth-server-apps/oauth-server-app-delete-mutation' -import { useOAuthServerAppRegenerateSecretMutation } from 'data/oauth-server-apps/oauth-server-app-regenerate-secret-mutation' -import { useOAuthServerAppsQuery } from 'data/oauth-server-apps/oauth-server-apps-query' import { Edit, MoreVertical, Plus, RotateCw, Search, Trash, X } from 'lucide-react' import Link from 'next/link' import { parseAsBoolean, parseAsString, parseAsStringLiteral, useQueryState } from 'nuqs' @@ -43,6 +35,14 @@ import { OAUTH_APP_CLIENT_TYPE_OPTIONS, OAUTH_APP_REGISTRATION_TYPE_OPTIONS, } from './oauthApps.utils' +import AlertError from '@/components/ui/AlertError' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { FilterPopover } from '@/components/ui/FilterPopover' +import { useAuthConfigQuery } from '@/data/auth/auth-config-query' +import { useProjectApiUrl } from '@/data/config/project-endpoint-query' +import { useOAuthServerAppDeleteMutation } from '@/data/oauth-server-apps/oauth-server-app-delete-mutation' +import { useOAuthServerAppRegenerateSecretMutation } from '@/data/oauth-server-apps/oauth-server-app-regenerate-secret-mutation' +import { useOAuthServerAppsQuery } from '@/data/oauth-server-apps/oauth-server-apps-query' const OAUTH_APPS_SORT_VALUES = [ 'name:asc', diff --git a/apps/studio/components/interfaces/Auth/OAuthApps/OAuthServerSettingsForm.tsx b/apps/studio/components/interfaces/Auth/OAuthApps/OAuthServerSettingsForm.tsx index 7f59d1461f..c87d078629 100644 --- a/apps/studio/components/interfaces/Auth/OAuthApps/OAuthServerSettingsForm.tsx +++ b/apps/studio/components/interfaces/Auth/OAuthApps/OAuthServerSettingsForm.tsx @@ -1,27 +1,18 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import Link from 'next/link' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' - -import { useParams } from 'common' -import { InlineLink } from 'components/ui/InlineLink' -import NoPermission from 'components/ui/NoPermission' -import { useAuthConfigQuery } from 'data/auth/auth-config-query' -import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation' -import { useOAuthServerAppsQuery } from 'data/oauth-server-apps/oauth-server-apps-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { DOCS_URL } from 'lib/constants' import { Button, Card, CardContent, CardFooter, + Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, - Form_Shadcn_, Input_Shadcn_, Switch, } from 'ui' @@ -29,6 +20,15 @@ import { Admonition } from 'ui-patterns/admonition' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' +import * as z from 'zod' + +import { InlineLink } from '@/components/ui/InlineLink' +import NoPermission from '@/components/ui/NoPermission' +import { useAuthConfigQuery } from '@/data/auth/auth-config-query' +import { useAuthConfigUpdateMutation } from '@/data/auth/auth-config-update-mutation' +import { useOAuthServerAppsQuery } from '@/data/oauth-server-apps/oauth-server-apps-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { DOCS_URL } from '@/lib/constants' const configUrlSchema = z.object({ id: z.string(), diff --git a/apps/studio/components/interfaces/Auth/Overview/OverviewErrors.constants.ts b/apps/studio/components/interfaces/Auth/Overview/OverviewErrors.constants.ts index 2d19f85d4e..ac32690614 100644 --- a/apps/studio/components/interfaces/Auth/Overview/OverviewErrors.constants.ts +++ b/apps/studio/components/interfaces/Auth/Overview/OverviewErrors.constants.ts @@ -1,5 +1,6 @@ import dayjs from 'dayjs' -import { fetchLogs } from 'data/reports/report.utils' + +import { fetchLogs } from '@/data/reports/report.utils' export type ResponseErrorRow = { method: string diff --git a/apps/studio/components/interfaces/Auth/Overview/OverviewMetrics.tsx b/apps/studio/components/interfaces/Auth/Overview/OverviewMetrics.tsx index f9aa6a9351..f36f3f9738 100644 --- a/apps/studio/components/interfaces/Auth/Overview/OverviewMetrics.tsx +++ b/apps/studio/components/interfaces/Auth/Overview/OverviewMetrics.tsx @@ -1,15 +1,9 @@ import { useQuery } from '@tanstack/react-query' import { useParams } from 'common' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import AlertError from 'components/ui/AlertError' -import { getStatusColor } from 'components/ui/DataTable/DataTable.utils' -import { Service } from 'data/graphql/graphql' import dayjs from 'dayjs' import { BarChart2, Bot, ChevronRight, ExternalLink, Telescope } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { AiIconAnimation, Button, cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' import { StatusCode } from 'ui-patterns' import { @@ -31,7 +25,6 @@ import { PageSectionTitle, } from 'ui-patterns/PageSection' -import { ErrorCodeTooltip } from 'components/ui/ErrorCodeTooltip/ErrorCodeTooltip' import { AuthErrorCodeRow, fetchTopAuthErrorCodes, @@ -46,6 +39,13 @@ import { getAuthSuccessRates, getMetricValues, } from './OverviewUsage.constants' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import AlertError from '@/components/ui/AlertError' +import { getStatusColor } from '@/components/ui/DataTable/DataTable.utils' +import { ErrorCodeTooltip } from '@/components/ui/ErrorCodeTooltip/ErrorCodeTooltip' +import { Service } from '@/data/graphql/graphql' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' const StatCard = ({ title, diff --git a/apps/studio/components/interfaces/Auth/Overview/OverviewTable.tsx b/apps/studio/components/interfaces/Auth/Overview/OverviewTable.tsx index f77385f990..46ce46f956 100644 --- a/apps/studio/components/interfaces/Auth/Overview/OverviewTable.tsx +++ b/apps/studio/components/interfaces/Auth/Overview/OverviewTable.tsx @@ -1,7 +1,8 @@ +import { Loader2 } from 'lucide-react' import { ReactNode } from 'react' import { cn, Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from 'ui' -import { Loader2 } from 'lucide-react' -import NoDataPlaceholder from 'components/ui/Charts/NoDataPlaceholder' + +import NoDataPlaceholder from '@/components/ui/Charts/NoDataPlaceholder' export type OverviewTableColumn = { key: keyof T | string diff --git a/apps/studio/components/interfaces/Auth/Overview/OverviewUsage.constants.ts b/apps/studio/components/interfaces/Auth/Overview/OverviewUsage.constants.ts index ed6cd20888..6fe1bd29f3 100644 --- a/apps/studio/components/interfaces/Auth/Overview/OverviewUsage.constants.ts +++ b/apps/studio/components/interfaces/Auth/Overview/OverviewUsage.constants.ts @@ -1,9 +1,9 @@ -import { get } from 'data/fetchers' import { RawAuthMetricsResponseSchema, type RawAuthMetricsResponse, type RawAuthMetricsRow, } from './OverviewUsage.schema' +import { get } from '@/data/fetchers' export type AuthMetricsResponse = RawAuthMetricsResponse diff --git a/apps/studio/components/interfaces/Auth/Overview/OverviewUsage.test.ts b/apps/studio/components/interfaces/Auth/Overview/OverviewUsage.test.ts index 8bbd192915..343ef22dbe 100644 --- a/apps/studio/components/interfaces/Auth/Overview/OverviewUsage.test.ts +++ b/apps/studio/components/interfaces/Auth/Overview/OverviewUsage.test.ts @@ -1,12 +1,13 @@ import { describe, expect, test } from 'vitest' -import { RawAuthMetricsResponseSchema } from './OverviewUsage.schema' + import { - getMetricValues, calculatePercentageChange, getApiSuccessRates, getAuthSuccessRates, + getMetricValues, type AuthMetricsResponse, } from './OverviewUsage.constants' +import { RawAuthMetricsResponseSchema } from './OverviewUsage.schema' const validSample = { result: [ diff --git a/apps/studio/components/interfaces/Auth/PerformanceSettingsForm.tsx b/apps/studio/components/interfaces/Auth/PerformanceSettingsForm.tsx index 8d690a315f..bfcbcd3dc6 100644 --- a/apps/studio/components/interfaces/Auth/PerformanceSettingsForm.tsx +++ b/apps/studio/components/interfaces/Auth/PerformanceSettingsForm.tsx @@ -1,16 +1,5 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { ScaffoldSection, ScaffoldSectionTitle } from 'components/layouts/Scaffold' -import AlertError from 'components/ui/AlertError' -import NoPermission from 'components/ui/NoPermission' -import { UpgradeToPro } from 'components/ui/UpgradeToPro' -import { useAuthConfigQuery } from 'data/auth/auth-config-query' -import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation' -import { useMaxConnectionsQuery } from 'data/database/max-connections-query' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { IS_PLATFORM } from 'lib/constants' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' @@ -36,6 +25,18 @@ import { GenericSkeletonLoader, ShimmeringLoader } from 'ui-patterns' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import * as z from 'zod' +import { ScaffoldSection, ScaffoldSectionTitle } from '@/components/layouts/Scaffold' +import AlertError from '@/components/ui/AlertError' +import NoPermission from '@/components/ui/NoPermission' +import { UpgradeToPro } from '@/components/ui/UpgradeToPro' +import { useAuthConfigQuery } from '@/data/auth/auth-config-query' +import { useAuthConfigUpdateMutation } from '@/data/auth/auth-config-update-mutation' +import { useMaxConnectionsQuery } from '@/data/database/max-connections-query' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { IS_PLATFORM } from '@/lib/constants' + const FormSchema = z.object({ API_MAX_REQUEST_DURATION: z.coerce .number() diff --git a/apps/studio/components/interfaces/Auth/Policies/Policies.tsx b/apps/studio/components/interfaces/Auth/Policies/Policies.tsx index 6972d72c4f..ec1980181e 100644 --- a/apps/studio/components/interfaces/Auth/Policies/Policies.tsx +++ b/apps/studio/components/interfaces/Auth/Policies/Policies.tsx @@ -1,21 +1,21 @@ import type { PostgresPolicy } from '@supabase/postgres-meta' +import { useParams } from 'common' import { isEmpty } from 'lodash' import Link from 'next/link' import { useCallback, useState } from 'react' import { toast } from 'sonner' +import { Button, Card, CardContent } from 'ui' +import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' -import { useParams } from 'common' import { PolicyTableRow, PolicyTableRowProps, -} from 'components/interfaces/Auth/Policies/PolicyTableRow' -import { ProtectedSchemaWarning } from 'components/interfaces/Database/ProtectedSchemaWarning' -import { NoSearchResults } from 'components/ui/NoSearchResults' -import { useDatabasePolicyDeleteMutation } from 'data/database-policies/database-policy-delete-mutation' -import { useTableUpdateMutation } from 'data/tables/table-update-mutation' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { Button, Card, CardContent } from 'ui' -import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' +} from '@/components/interfaces/Auth/Policies/PolicyTableRow' +import { ProtectedSchemaWarning } from '@/components/interfaces/Database/ProtectedSchemaWarning' +import { NoSearchResults } from '@/components/ui/NoSearchResults' +import { useDatabasePolicyDeleteMutation } from '@/data/database-policies/database-policy-delete-mutation' +import { useTableUpdateMutation } from '@/data/tables/table-update-mutation' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface PoliciesProps { search?: string diff --git a/apps/studio/components/interfaces/Auth/Policies/Policies.utils.test.ts b/apps/studio/components/interfaces/Auth/Policies/Policies.utils.test.ts index a271cbba20..fe78ee7e61 100644 --- a/apps/studio/components/interfaces/Auth/Policies/Policies.utils.test.ts +++ b/apps/studio/components/interfaces/Auth/Policies/Policies.utils.test.ts @@ -1,20 +1,18 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' -import type { ForeignKeyConstraint } from 'data/database/foreign-key-constraints-query' - -// Mock generateSqlPolicy for AI tests -const mockGenerateSqlPolicy = vi.fn() -vi.mock('data/ai/sql-policy-mutation', () => ({ - generateSqlPolicy: (...args: unknown[]) => mockGenerateSqlPolicy(...args), -})) - -// Import after mocks are set up import { generateAiPoliciesForTable, generateProgrammaticPoliciesForTable, generateStartingPoliciesForTable, type GeneratedPolicy, } from './Policies.utils' +import type { ForeignKeyConstraint } from '@/data/database/foreign-key-constraints-query' + +// Mock generateSqlPolicy for AI tests +const mockGenerateSqlPolicy = vi.fn() +vi.mock('@/data/ai/sql-policy-mutation', () => ({ + generateSqlPolicy: (...args: unknown[]) => mockGenerateSqlPolicy(...args), +})) // Helper to create a foreign key constraint const createForeignKey = (overrides: Partial = {}): ForeignKeyConstraint => ({ diff --git a/apps/studio/components/interfaces/Auth/Policies/Policies.utils.ts b/apps/studio/components/interfaces/Auth/Policies/Policies.utils.ts index f96ba267ee..13ad83f6b8 100644 --- a/apps/studio/components/interfaces/Auth/Policies/Policies.utils.ts +++ b/apps/studio/components/interfaces/Auth/Policies/Policies.utils.ts @@ -1,8 +1,5 @@ import { ident } from '@supabase/pg-meta/src/pg-format' import type { PostgresPolicy } from '@supabase/postgres-meta' -import { generateSqlPolicy } from 'data/ai/sql-policy-mutation' -import type { CreatePolicyBody } from 'data/database-policies/database-policy-create-mutation' -import type { ForeignKeyConstraint } from 'data/database/foreign-key-constraints-query' import { has, isEmpty, isEqual } from 'lodash' import { @@ -11,6 +8,9 @@ import { PostgresPolicyCreatePayload, PostgresPolicyUpdatePayload, } from './Policies.types' +import { generateSqlPolicy } from '@/data/ai/sql-policy-mutation' +import type { CreatePolicyBody } from '@/data/database-policies/database-policy-create-mutation' +import type { ForeignKeyConstraint } from '@/data/database/foreign-key-constraints-query' /** * Returns an array of SQL statements that will preview in the review step of the policy editor diff --git a/apps/studio/components/interfaces/Auth/Policies/PoliciesDataContext.tsx b/apps/studio/components/interfaces/Auth/Policies/PoliciesDataContext.tsx index cd2347c94e..de190298c8 100644 --- a/apps/studio/components/interfaces/Auth/Policies/PoliciesDataContext.tsx +++ b/apps/studio/components/interfaces/Auth/Policies/PoliciesDataContext.tsx @@ -2,7 +2,7 @@ import type { PostgresPolicy } from '@supabase/postgres-meta' import type { PropsWithChildren } from 'react' import { createContext, useCallback, useContext, useMemo } from 'react' -import type { ResponseError } from 'types' +import type { ResponseError } from '@/types' type TableKey = `${string}.${string}` diff --git a/apps/studio/components/interfaces/Auth/Policies/PolicyEditor/PolicyDefinition.tsx b/apps/studio/components/interfaces/Auth/Policies/PolicyEditor/PolicyDefinition.tsx index 25a1275969..c83b2fe9aa 100644 --- a/apps/studio/components/interfaces/Auth/Policies/PolicyEditor/PolicyDefinition.tsx +++ b/apps/studio/components/interfaces/Auth/Policies/PolicyEditor/PolicyDefinition.tsx @@ -2,10 +2,10 @@ import { usePrevious } from '@uidotdev/usehooks' import { noop } from 'lodash' import { HelpCircle } from 'lucide-react' import { useEffect } from 'react' - -import SqlEditor from 'components/ui/SqlEditor' import { Tooltip, TooltipContent, TooltipTrigger } from 'ui' +import SqlEditor from '@/components/ui/SqlEditor' + interface PolicyDefinitionProps { operation: string definition: string diff --git a/apps/studio/components/interfaces/Auth/Policies/PolicyEditor/PolicyRoles.tsx b/apps/studio/components/interfaces/Auth/Policies/PolicyEditor/PolicyRoles.tsx index 0eaaa9ede6..e8b266d531 100644 --- a/apps/studio/components/interfaces/Auth/Policies/PolicyEditor/PolicyRoles.tsx +++ b/apps/studio/components/interfaces/Auth/Policies/PolicyEditor/PolicyRoles.tsx @@ -1,12 +1,12 @@ -import { SYSTEM_ROLES } from 'components/interfaces/Database/Roles/Roles.constants' -import AlertError from 'components/ui/AlertError' - -import { useDatabaseRolesQuery } from 'data/database-roles/database-roles-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { sortBy } from 'lodash' import MultiSelect from 'ui-patterns/MultiSelectDeprecated' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' +import { SYSTEM_ROLES } from '@/components/interfaces/Database/Roles/Roles.constants' +import AlertError from '@/components/ui/AlertError' +import { useDatabaseRolesQuery } from '@/data/database-roles/database-roles-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' + interface PolicyRolesProps { selectedRoles: string[] onUpdateSelectedRoles: (roles: string[]) => void diff --git a/apps/studio/components/interfaces/Auth/Policies/PolicyEditorModal/PolicyEditorModal.constants.ts b/apps/studio/components/interfaces/Auth/Policies/PolicyEditorModal/PolicyEditorModal.constants.ts index fe15f9cff6..bd40f9d9ed 100644 --- a/apps/studio/components/interfaces/Auth/Policies/PolicyEditorModal/PolicyEditorModal.constants.ts +++ b/apps/studio/components/interfaces/Auth/Policies/PolicyEditorModal/PolicyEditorModal.constants.ts @@ -1,4 +1,5 @@ import { PolicyTemplate } from '../PolicyTemplates/PolicyTemplates.constants' + /** * ---------------------------------------------------------------- * PostgreSQL policy templates for the auth policies page diff --git a/apps/studio/components/interfaces/Auth/Policies/PolicyEditorModal/PolicyEditorModalTitle.tsx b/apps/studio/components/interfaces/Auth/Policies/PolicyEditorModal/PolicyEditorModalTitle.tsx index cb6071b0db..75bca0fd60 100644 --- a/apps/studio/components/interfaces/Auth/Policies/PolicyEditorModal/PolicyEditorModalTitle.tsx +++ b/apps/studio/components/interfaces/Auth/Policies/PolicyEditorModal/PolicyEditorModalTitle.tsx @@ -1,10 +1,10 @@ import { noop } from 'lodash' import { ChevronLeft, FlaskConical } from 'lucide-react' - -import { DocsButton } from 'components/ui/DocsButton' -import { DOCS_URL } from 'lib/constants' import { Button } from 'ui' + import { POLICY_MODAL_VIEWS } from '../Policies.constants' +import { DocsButton } from '@/components/ui/DocsButton' +import { DOCS_URL } from '@/lib/constants' interface PolicyEditorModalTitleProps { view: string diff --git a/apps/studio/components/interfaces/Auth/Policies/PolicyEditorModal/index.tsx b/apps/studio/components/interfaces/Auth/Policies/PolicyEditorModal/index.tsx index 5fbd96084c..2f43e92d50 100644 --- a/apps/studio/components/interfaces/Auth/Policies/PolicyEditorModal/index.tsx +++ b/apps/studio/components/interfaces/Auth/Policies/PolicyEditorModal/index.tsx @@ -1,8 +1,4 @@ import { PostgresPolicy } from '@supabase/postgres-meta' -import { useFeaturePreviewModal } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' -import { DiscardChangesConfirmationDialog } from 'components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' -import useLatest from 'hooks/misc/useLatest' -import { useConfirmOnClose } from 'hooks/ui/useConfirmOnClose' import { isEmpty, noop } from 'lodash' import { useCallback, useEffect, useState } from 'react' import { toast } from 'sonner' @@ -27,6 +23,10 @@ import PolicyTemplates from '../PolicyTemplates' import { PolicyTemplate } from '../PolicyTemplates/PolicyTemplates.constants' import { getGeneralPolicyTemplates } from './PolicyEditorModal.constants' import PolicyEditorModalTitle from './PolicyEditorModalTitle' +import { useFeaturePreviewModal } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import { DiscardChangesConfirmationDialog } from '@/components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' +import useLatest from '@/hooks/misc/useLatest' +import { useConfirmOnClose } from '@/hooks/ui/useConfirmOnClose' interface PolicyEditorModalProps { visible?: boolean diff --git a/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/PolicyDetailsV2.tsx b/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/PolicyDetailsV2.tsx index c15b1c1983..268326a9a1 100644 --- a/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/PolicyDetailsV2.tsx +++ b/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/PolicyDetailsV2.tsx @@ -2,40 +2,40 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { Check, ChevronsUpDown } from 'lucide-react' import { useEffect, useState } from 'react' import { UseFormReturn } from 'react-hook-form' - -import { useDatabaseRolesQuery } from 'data/database-roles/database-roles-query' -import { useTablesQuery } from 'data/tables/tables-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Button, + cn, + Command_Shadcn_, CommandEmpty_Shadcn_, CommandGroup_Shadcn_, CommandInput_Shadcn_, CommandItem_Shadcn_, CommandList_Shadcn_, - Command_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, FormItem_Shadcn_, FormLabel_Shadcn_, FormMessage_Shadcn_, Input_Shadcn_, + Popover_Shadcn_, PopoverContent_Shadcn_, PopoverTrigger_Shadcn_, - Popover_Shadcn_, - RadioGroupLargeItem_Shadcn_, RadioGroup_Shadcn_, + RadioGroupLargeItem_Shadcn_, ScrollArea, + Select_Shadcn_, SelectContent_Shadcn_, SelectGroup_Shadcn_, SelectItem_Shadcn_, SelectTrigger_Shadcn_, - Select_Shadcn_, - cn, } from 'ui' import { MultiSelectV2 } from 'ui-patterns/MultiSelectDeprecated/MultiSelectV2' +import { useDatabaseRolesQuery } from '@/data/database-roles/database-roles-query' +import { useTablesQuery } from '@/data/tables/tables-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' + interface PolicyDetailsV2Props { schema: string searchString?: string diff --git a/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/QueryError.tsx b/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/QueryError.tsx index 4277e3010a..d5508baac8 100644 --- a/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/QueryError.tsx +++ b/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/QueryError.tsx @@ -1,18 +1,18 @@ +import styles from '@ui/layout/ai-icon-animation/ai-icon-animation-style.module.css' import { initial, last } from 'lodash' import { Dispatch, SetStateAction } from 'react' - -import styles from '@ui/layout/ai-icon-animation/ai-icon-animation-style.module.css' -import { QueryResponseError } from 'data/sql/execute-sql-mutation' import { - AlertTitle_Shadcn_, Alert_Shadcn_, + AlertTitle_Shadcn_, Button, + cn, + Collapsible_Shadcn_, CollapsibleContent_Shadcn_, CollapsibleTrigger_Shadcn_, - Collapsible_Shadcn_, - cn, } from 'ui' +import { QueryResponseError } from '@/data/sql/execute-sql-mutation' + export const QueryError = ({ error, open, diff --git a/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/RLSCodeEditor.tsx b/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/RLSCodeEditor.tsx index d67bd4af8d..e14c5f9caa 100644 --- a/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/RLSCodeEditor.tsx +++ b/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/RLSCodeEditor.tsx @@ -4,8 +4,8 @@ import type { editor } from 'monaco-editor' import { MutableRefObject, useEffect, useRef } from 'react' import { cn } from 'ui' -import { Markdown } from 'components/interfaces/Markdown' -import { formatSql } from 'lib/formatSql' +import { Markdown } from '@/components/interfaces/Markdown' +import { formatSql } from '@/lib/formatSql' // [Joshen] Is there a way we can just have one single MonacoEditor component that's shared across the dashboard? // Feels like we're creating multiple copies of Editor. I'm keen to make this one the defacto as well so lets make sure diff --git a/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/index.tsx b/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/index.tsx index 13e51d0116..6a8dc027f5 100644 --- a/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/index.tsx +++ b/apps/studio/components/interfaces/Auth/Policies/PolicyEditorPanel/index.tsx @@ -3,37 +3,28 @@ import { Monaco } from '@monaco-editor/react' import type { PostgresPolicy } from '@supabase/postgres-meta' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useQueryClient } from '@tanstack/react-query' +import { useParams } from 'common' import { isEqual } from 'lodash' import { memo, useCallback, useEffect, useRef, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' - -import { useParams } from 'common' -import { IStandaloneCodeEditor } from 'components/interfaces/SQLEditor/SQLEditor.types' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DiscardChangesConfirmationDialog } from 'components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' -import { useDatabasePolicyUpdateMutation } from 'data/database-policies/database-policy-update-mutation' -import { databasePoliciesKeys } from 'data/database-policies/keys' -import { QueryResponseError, useExecuteSqlMutation } from 'data/sql/execute-sql-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useConfirmOnClose } from 'hooks/ui/useConfirmOnClose' import { Button, Checkbox_Shadcn_, + cn, Form_Shadcn_, Label_Shadcn_, ScrollArea, Sheet, SheetContent, SheetFooter, + Tabs_Shadcn_, TabsContent_Shadcn_, TabsList_Shadcn_, TabsTrigger_Shadcn_, - Tabs_Shadcn_, - cn, } from 'ui' +import * as z from 'zod' + import { LockedCreateQuerySection, LockedRenameQuerySection } from './LockedQuerySection' import { PolicyDetailsV2 } from './PolicyDetailsV2' import { checkIfPolicyHasChanged, generateCreatePolicyQuery } from './PolicyEditorPanel.utils' @@ -41,6 +32,15 @@ import { PolicyEditorPanelHeader } from './PolicyEditorPanelHeader' import { PolicyTemplates } from './PolicyTemplates' import { QueryError } from './QueryError' import { RLSCodeEditor } from './RLSCodeEditor' +import { IStandaloneCodeEditor } from '@/components/interfaces/SQLEditor/SQLEditor.types' +import { DiscardChangesConfirmationDialog } from '@/components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useDatabasePolicyUpdateMutation } from '@/data/database-policies/database-policy-update-mutation' +import { databasePoliciesKeys } from '@/data/database-policies/keys' +import { QueryResponseError, useExecuteSqlMutation } from '@/data/sql/execute-sql-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useConfirmOnClose } from '@/hooks/ui/useConfirmOnClose' interface PolicyEditorPanelProps { visible: boolean diff --git a/apps/studio/components/interfaces/Auth/Policies/PolicyReview.tsx b/apps/studio/components/interfaces/Auth/Policies/PolicyReview.tsx index 955566e390..fad0f484dc 100644 --- a/apps/studio/components/interfaces/Auth/Policies/PolicyReview.tsx +++ b/apps/studio/components/interfaces/Auth/Policies/PolicyReview.tsx @@ -1,9 +1,9 @@ -import SqlEditor from 'components/ui/SqlEditor' import { isEmpty, noop } from 'lodash' import { useState } from 'react' import { Button, Modal } from 'ui' import type { PolicyForReview } from './Policies.types' +import SqlEditor from '@/components/ui/SqlEditor' interface PolicyReviewProps { policy: PolicyForReview diff --git a/apps/studio/components/interfaces/Auth/Policies/PolicySelection.tsx b/apps/studio/components/interfaces/Auth/Policies/PolicySelection.tsx index cef77dd86d..267549b035 100644 --- a/apps/studio/components/interfaces/Auth/Policies/PolicySelection.tsx +++ b/apps/studio/components/interfaces/Auth/Policies/PolicySelection.tsx @@ -1,9 +1,9 @@ import { noop } from 'lodash' -import { AlertDescription_Shadcn_, AlertTitle_Shadcn_, Alert_Shadcn_, Button, Modal } from 'ui' - -import CardButton from 'components/ui/CardButton' import { Edit, ExternalLink, FlaskConical, Grid } from 'lucide-react' -import { useAppStateSnapshot } from 'state/app-state' +import { Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, Button, Modal } from 'ui' + +import CardButton from '@/components/ui/CardButton' +import { useAppStateSnapshot } from '@/state/app-state' interface PolicySelectionProps { description: string diff --git a/apps/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx b/apps/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx index 889131da29..91a78d00b3 100644 --- a/apps/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx +++ b/apps/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx @@ -2,14 +2,6 @@ import type { PostgresPolicy } from '@supabase/postgres-meta' import { PermissionAction } from '@supabase/shared-types/out/constants' import { noop } from 'lodash' import { Edit, MoreVertical, Trash } from 'lucide-react' - -import { DropdownMenuItemTooltip } from 'components/ui/DropdownMenuItemTooltip' -import { useAuthConfigQuery } from 'data/auth/auth-config-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { Button, DropdownMenu, @@ -23,7 +15,15 @@ import { TooltipContent, TooltipTrigger, } from 'ui' + import { generatePolicyUpdateSQL } from './PolicyTableRow.utils' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { DropdownMenuItemTooltip } from '@/components/ui/DropdownMenuItemTooltip' +import { useAuthConfigQuery } from '@/data/auth/auth-config-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' interface PolicyRowProps { policy: PostgresPolicy diff --git a/apps/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyTableRowHeader.tsx b/apps/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyTableRowHeader.tsx index c0f575bcf3..1808df14b4 100644 --- a/apps/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyTableRowHeader.tsx +++ b/apps/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyTableRowHeader.tsx @@ -1,16 +1,16 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { noop } from 'lodash' import { Lock, Table } from 'lucide-react' - -import { useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { EditorTablePageLink } from 'data/prefetchers/project.$ref.editor.$id' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' import { AiIconAnimation, Badge, CardTitle } from 'ui' + import type { PolicyTable } from './PolicyTableRow.types' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { EditorTablePageLink } from '@/data/prefetchers/project.$ref.editor.$id' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' interface PolicyTableRowHeaderProps { table: PolicyTable diff --git a/apps/studio/components/interfaces/Auth/Policies/PolicyTemplates/TemplatePreview.tsx b/apps/studio/components/interfaces/Auth/Policies/PolicyTemplates/TemplatePreview.tsx index 795fc57111..a7fd8f01fb 100644 --- a/apps/studio/components/interfaces/Auth/Policies/PolicyTemplates/TemplatePreview.tsx +++ b/apps/studio/components/interfaces/Auth/Policies/PolicyTemplates/TemplatePreview.tsx @@ -1,6 +1,7 @@ -import SqlEditor from 'components/ui/SqlEditor' import { isEmpty } from 'lodash' + import { PolicyTemplate } from './PolicyTemplates.constants' +import SqlEditor from '@/components/ui/SqlEditor' interface TemplatePreviewProps { selectedTemplate: PolicyTemplate diff --git a/apps/studio/components/interfaces/Auth/ProtectionAuthSettingsForm/ProtectionAuthSettingsForm.tsx b/apps/studio/components/interfaces/Auth/ProtectionAuthSettingsForm/ProtectionAuthSettingsForm.tsx index 7a0560d752..270aae48da 100644 --- a/apps/studio/components/interfaces/Auth/ProtectionAuthSettingsForm/ProtectionAuthSettingsForm.tsx +++ b/apps/studio/components/interfaces/Auth/ProtectionAuthSettingsForm/ProtectionAuthSettingsForm.tsx @@ -1,13 +1,6 @@ import { yupResolver } from '@hookform/resolvers/yup' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { InlineLink } from 'components/ui/InlineLink' -import NoPermission from 'components/ui/NoPermission' -import { useAuthConfigQuery } from 'data/auth/auth-config-query' -import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { DOCS_URL } from 'lib/constants' import Link from 'next/link' import { useEffect } from 'react' import { useForm } from 'react-hook-form' @@ -41,6 +34,13 @@ import { import { boolean, number, object, string } from 'yup' import { NO_REQUIRED_CHARACTERS } from '../Auth.constants' +import AlertError from '@/components/ui/AlertError' +import { InlineLink } from '@/components/ui/InlineLink' +import NoPermission from '@/components/ui/NoPermission' +import { useAuthConfigQuery } from '@/data/auth/auth-config-query' +import { useAuthConfigUpdateMutation } from '@/data/auth/auth-config-update-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { DOCS_URL } from '@/lib/constants' const CAPTCHA_PROVIDERS = [ { key: 'hcaptcha', label: 'hCaptcha' }, diff --git a/apps/studio/components/interfaces/Auth/RateLimits/RateLimits.tsx b/apps/studio/components/interfaces/Auth/RateLimits/RateLimits.tsx index 462b622934..c6cc6af9ff 100644 --- a/apps/studio/components/interfaces/Auth/RateLimits/RateLimits.tsx +++ b/apps/studio/components/interfaces/Auth/RateLimits/RateLimits.tsx @@ -1,11 +1,6 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import NoPermission from 'components/ui/NoPermission' -import { useAuthConfigQuery } from 'data/auth/auth-config-query' -import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import Link from 'next/link' import { useEffect } from 'react' import { useForm } from 'react-hook-form' @@ -32,6 +27,11 @@ import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import * as z from 'zod' import { isSmtpEnabled } from '../SmtpForm/SmtpForm.utils' +import AlertError from '@/components/ui/AlertError' +import NoPermission from '@/components/ui/NoPermission' +import { useAuthConfigQuery } from '@/data/auth/auth-config-query' +import { useAuthConfigUpdateMutation } from '@/data/auth/auth-config-update-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' export const RateLimits = () => { const { ref: projectRef } = useParams() diff --git a/apps/studio/components/interfaces/Auth/RedirectUrls/AddNewURLModal.test.tsx b/apps/studio/components/interfaces/Auth/RedirectUrls/AddNewURLModal.test.tsx index 56fcd9aa3b..8271972dd1 100644 --- a/apps/studio/components/interfaces/Auth/RedirectUrls/AddNewURLModal.test.tsx +++ b/apps/studio/components/interfaces/Auth/RedirectUrls/AddNewURLModal.test.tsx @@ -1,9 +1,8 @@ import { fireEvent, screen, waitFor } from '@testing-library/react' import userEvent from '@testing-library/user-event' -import { beforeEach, describe, expect, it, vi } from 'vitest' import { toast } from 'sonner' - import { render } from 'tests/helpers' +import { beforeEach, describe, expect, it, vi } from 'vitest' import { AddNewURLModal } from './AddNewURLModal' diff --git a/apps/studio/components/interfaces/Auth/RedirectUrls/AddNewURLModal.tsx b/apps/studio/components/interfaces/Auth/RedirectUrls/AddNewURLModal.tsx index 5dc944bfe7..7e1c3fc4c5 100644 --- a/apps/studio/components/interfaces/Auth/RedirectUrls/AddNewURLModal.tsx +++ b/apps/studio/components/interfaces/Auth/RedirectUrls/AddNewURLModal.tsx @@ -1,16 +1,16 @@ import { zodResolver } from '@hookform/resolvers/zod' +import { Label } from '@ui/components/shadcn/ui/label' +import { useParams } from 'common' import { useEffect } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' - -import { Label } from '@ui/components/shadcn/ui/label' -import { useParams } from 'common' -import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation' import { Button, cn, DialogSectionSeparator, Form_Shadcn_, Modal, ScrollArea } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { SingleValueFieldArray } from 'ui-patterns/form/SingleValueFieldArray/SingleValueFieldArray' +import * as z from 'zod' + import { urlRegex } from '../Auth.constants' +import { useAuthConfigUpdateMutation } from '@/data/auth/auth-config-update-mutation' const MAX_URLS_LENGTH = 2 * 1024 diff --git a/apps/studio/components/interfaces/Auth/RedirectUrls/RedirectUrlList.tsx b/apps/studio/components/interfaces/Auth/RedirectUrls/RedirectUrlList.tsx index 8c0fb20193..a6821e205c 100644 --- a/apps/studio/components/interfaces/Auth/RedirectUrls/RedirectUrlList.tsx +++ b/apps/studio/components/interfaces/Auth/RedirectUrls/RedirectUrlList.tsx @@ -1,11 +1,11 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { Globe, Trash } from 'lucide-react' - -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { EmptyListState } from 'components/ui/EmptyListState' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { Button, Checkbox_Shadcn_ } from 'ui' + import { ValueContainer } from './ValueContainer' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { EmptyListState } from '@/components/ui/EmptyListState' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' interface RedirectUrlListProps { allowList: string[] diff --git a/apps/studio/components/interfaces/Auth/RedirectUrls/RedirectUrls.tsx b/apps/studio/components/interfaces/Auth/RedirectUrls/RedirectUrls.tsx index 72af4e1b36..8a9cc0ab39 100644 --- a/apps/studio/components/interfaces/Auth/RedirectUrls/RedirectUrls.tsx +++ b/apps/studio/components/interfaces/Auth/RedirectUrls/RedirectUrls.tsx @@ -1,10 +1,4 @@ import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { DocsButton } from 'components/ui/DocsButton' -import { HorizontalShimmerWithIcon } from 'components/ui/Shimmers' -import { useAuthConfigQuery } from 'data/auth/auth-config-query' -import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation' -import { DOCS_URL } from 'lib/constants' import { useMemo, useState } from 'react' import { toast } from 'sonner' import { Button, cn, Modal, ScrollArea } from 'ui' @@ -21,6 +15,12 @@ import { import { AddNewURLModal } from './AddNewURLModal' import { RedirectUrlList } from './RedirectUrlList' import { ValueContainer } from './ValueContainer' +import AlertError from '@/components/ui/AlertError' +import { DocsButton } from '@/components/ui/DocsButton' +import { HorizontalShimmerWithIcon } from '@/components/ui/Shimmers' +import { useAuthConfigQuery } from '@/data/auth/auth-config-query' +import { useAuthConfigUpdateMutation } from '@/data/auth/auth-config-update-mutation' +import { DOCS_URL } from '@/lib/constants' export const RedirectUrls = () => { const { ref: projectRef } = useParams() diff --git a/apps/studio/components/interfaces/Auth/RedirectUrls/ValueContainer.tsx b/apps/studio/components/interfaces/Auth/RedirectUrls/ValueContainer.tsx index 6addd4f97e..3fda763e8a 100644 --- a/apps/studio/components/interfaces/Auth/RedirectUrls/ValueContainer.tsx +++ b/apps/studio/components/interfaces/Auth/RedirectUrls/ValueContainer.tsx @@ -1,5 +1,4 @@ -import { PropsWithChildren, MouseEvent } from 'react' - +import { MouseEvent, PropsWithChildren } from 'react' import { cn } from 'ui' interface ValueContainerProps { diff --git a/apps/studio/components/interfaces/Auth/SessionsAuthSettingsForm/SessionsAuthSettingsForm.tsx b/apps/studio/components/interfaces/Auth/SessionsAuthSettingsForm/SessionsAuthSettingsForm.tsx index 0c3d733c6f..36f5505099 100644 --- a/apps/studio/components/interfaces/Auth/SessionsAuthSettingsForm/SessionsAuthSettingsForm.tsx +++ b/apps/studio/components/interfaces/Auth/SessionsAuthSettingsForm/SessionsAuthSettingsForm.tsx @@ -1,14 +1,6 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import NoPermission from 'components/ui/NoPermission' -import { UpgradeToPro } from 'components/ui/UpgradeToPro' -import { useAuthConfigQuery } from 'data/auth/auth-config-query' -import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { IS_PLATFORM } from 'lib/constants' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' @@ -37,6 +29,15 @@ import { } from 'ui-patterns/PageSection' import * as z from 'zod' +import AlertError from '@/components/ui/AlertError' +import NoPermission from '@/components/ui/NoPermission' +import { UpgradeToPro } from '@/components/ui/UpgradeToPro' +import { useAuthConfigQuery } from '@/data/auth/auth-config-query' +import { useAuthConfigUpdateMutation } from '@/data/auth/auth-config-update-mutation' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { IS_PLATFORM } from '@/lib/constants' + function HoursOrNeverText({ value }: { value: number }) { if (value === 0) { return 'never' diff --git a/apps/studio/components/interfaces/Auth/SiteUrl/SiteUrl.tsx b/apps/studio/components/interfaces/Auth/SiteUrl/SiteUrl.tsx index 2f1710d1b5..04aaee1979 100644 --- a/apps/studio/components/interfaces/Auth/SiteUrl/SiteUrl.tsx +++ b/apps/studio/components/interfaces/Auth/SiteUrl/SiteUrl.tsx @@ -1,23 +1,17 @@ import { yupResolver } from '@hookform/resolvers/yup' import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { object, string } from 'yup' - -import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { useAuthConfigQuery } from 'data/auth/auth-config-query' -import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { Button, Card, CardContent, CardFooter, + Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, - Form_Shadcn_, Input_Shadcn_, } from 'ui' import { GenericSkeletonLoader } from 'ui-patterns' @@ -29,6 +23,12 @@ import { PageSectionSummary, PageSectionTitle, } from 'ui-patterns/PageSection' +import { object, string } from 'yup' + +import AlertError from '@/components/ui/AlertError' +import { useAuthConfigQuery } from '@/data/auth/auth-config-query' +import { useAuthConfigUpdateMutation } from '@/data/auth/auth-config-update-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' const schema = object({ SITE_URL: string().required('Must have a Site URL'), diff --git a/apps/studio/components/interfaces/Auth/SmtpForm/SmtpForm.tsx b/apps/studio/components/interfaces/Auth/SmtpForm/SmtpForm.tsx index 57800057c5..0101102944 100644 --- a/apps/studio/components/interfaces/Auth/SmtpForm/SmtpForm.tsx +++ b/apps/studio/components/interfaces/Auth/SmtpForm/SmtpForm.tsx @@ -1,12 +1,6 @@ import { yupResolver } from '@hookform/resolvers/yup' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { InlineLink } from 'components/ui/InlineLink' -import NoPermission from 'components/ui/NoPermission' -import { useAuthConfigQuery } from 'data/auth/auth-config-query' -import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' @@ -34,6 +28,12 @@ import * as yup from 'yup' import { urlRegex } from '../Auth.constants' import { defaultDisabledSmtpFormValues } from './SmtpForm.constants' import { generateFormValues, isSmtpEnabled } from './SmtpForm.utils' +import AlertError from '@/components/ui/AlertError' +import { InlineLink } from '@/components/ui/InlineLink' +import NoPermission from '@/components/ui/NoPermission' +import { useAuthConfigQuery } from '@/data/auth/auth-config-query' +import { useAuthConfigUpdateMutation } from '@/data/auth/auth-config-update-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' interface SmtpFormValues { SMTP_ADMIN_EMAIL?: string diff --git a/apps/studio/components/interfaces/Auth/SmtpForm/SmtpForm.utils.ts b/apps/studio/components/interfaces/Auth/SmtpForm/SmtpForm.utils.ts index b7b54b3bb3..e731f59b55 100644 --- a/apps/studio/components/interfaces/Auth/SmtpForm/SmtpForm.utils.ts +++ b/apps/studio/components/interfaces/Auth/SmtpForm/SmtpForm.utils.ts @@ -1,4 +1,4 @@ -import type { components } from 'data/api' +import type { components } from '@/data/api' type AuthConfig = components['schemas']['GoTrueConfigResponse'] diff --git a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateAuth0Dialog.tsx b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateAuth0Dialog.tsx index 9f3bf9f61c..5cb6ca3658 100644 --- a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateAuth0Dialog.tsx +++ b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateAuth0Dialog.tsx @@ -1,12 +1,9 @@ import { zodResolver } from '@hookform/resolvers/zod' +import { useParams } from 'common' import { Trash } from 'lucide-react' import { useEffect } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' - -import { useParams } from 'common' -import { useCreateThirdPartyAuthIntegrationMutation } from 'data/third-party-auth/integration-create-mutation' import { Button, Dialog, @@ -15,13 +12,16 @@ import { DialogHeader, DialogSection, DialogTitle, + Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, - Form_Shadcn_, Input_Shadcn_, Separator, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import * as z from 'zod' + +import { useCreateThirdPartyAuthIntegrationMutation } from '@/data/third-party-auth/integration-create-mutation' interface CreateAuth0IntegrationProps { visible: boolean diff --git a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateAwsCognitoAuthDialog.tsx b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateAwsCognitoAuthDialog.tsx index bf209bf461..10a9b5f10b 100644 --- a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateAwsCognitoAuthDialog.tsx +++ b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateAwsCognitoAuthDialog.tsx @@ -1,12 +1,9 @@ import { zodResolver } from '@hookform/resolvers/zod' +import { useParams } from 'common' import { Trash } from 'lucide-react' import { useEffect } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' - -import { useParams } from 'common' -import { useCreateThirdPartyAuthIntegrationMutation } from 'data/third-party-auth/integration-create-mutation' import { Button, Dialog, @@ -16,14 +13,17 @@ import { DialogHeader, DialogSection, DialogTitle, + Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, - Form_Shadcn_, Input_Shadcn_, Separator, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import * as z from 'zod' + import { AwsRegionSelector } from './AwsRegionSelector' +import { useCreateThirdPartyAuthIntegrationMutation } from '@/data/third-party-auth/integration-create-mutation' interface CreateAwsCognitoAuthIntegrationProps { visible: boolean diff --git a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateClerkAuthDialog.tsx b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateClerkAuthDialog.tsx index 76639f6d3b..9bb0e97c04 100644 --- a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateClerkAuthDialog.tsx +++ b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateClerkAuthDialog.tsx @@ -1,12 +1,8 @@ import { zodResolver } from '@hookform/resolvers/zod' +import { useParams } from 'common' import { useEffect } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' - -import { useParams } from 'common' -import { InlineLink } from 'components/ui/InlineLink' -import { useCreateThirdPartyAuthIntegrationMutation } from 'data/third-party-auth/integration-create-mutation' import { Button, Dialog, @@ -15,13 +11,17 @@ import { DialogHeader, DialogSection, DialogTitle, + Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, - Form_Shadcn_, Input_Shadcn_, Separator, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import * as z from 'zod' + +import { InlineLink } from '@/components/ui/InlineLink' +import { useCreateThirdPartyAuthIntegrationMutation } from '@/data/third-party-auth/integration-create-mutation' interface CreateClerkAuthIntegrationProps { visible: boolean diff --git a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateFirebaseAuthDialog.tsx b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateFirebaseAuthDialog.tsx index 9c13f8e70a..7dfe36372c 100644 --- a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateFirebaseAuthDialog.tsx +++ b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateFirebaseAuthDialog.tsx @@ -1,12 +1,9 @@ import { zodResolver } from '@hookform/resolvers/zod' +import { useParams } from 'common' import { Trash } from 'lucide-react' import { useEffect } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' - -import { useParams } from 'common' -import { useCreateThirdPartyAuthIntegrationMutation } from 'data/third-party-auth/integration-create-mutation' import { Button, Dialog, @@ -15,13 +12,16 @@ import { DialogHeader, DialogSection, DialogTitle, + Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, - Form_Shadcn_, Input_Shadcn_, Separator, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import * as z from 'zod' + +import { useCreateThirdPartyAuthIntegrationMutation } from '@/data/third-party-auth/integration-create-mutation' interface CreateFirebaseAuthIntegrationProps { visible: boolean diff --git a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateWorkOSDialog.tsx b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateWorkOSDialog.tsx index 2edd172878..05a64d30cf 100644 --- a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateWorkOSDialog.tsx +++ b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/CreateWorkOSDialog.tsx @@ -1,12 +1,9 @@ import { zodResolver } from '@hookform/resolvers/zod' +import { useParams } from 'common' import { Trash } from 'lucide-react' import { useEffect } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' - -import { useParams } from 'common' -import { useCreateThirdPartyAuthIntegrationMutation } from 'data/third-party-auth/integration-create-mutation' import { Button, Dialog, @@ -15,13 +12,16 @@ import { DialogHeader, DialogSection, DialogTitle, + Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, - Form_Shadcn_, Input_Shadcn_, Separator, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import * as z from 'zod' + +import { useCreateThirdPartyAuthIntegrationMutation } from '@/data/third-party-auth/integration-create-mutation' interface CreateWorkOSIntegrationProps { visible: boolean diff --git a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/IntegrationCard.tsx b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/IntegrationCard.tsx index 7beb88a600..090a185375 100644 --- a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/IntegrationCard.tsx +++ b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/IntegrationCard.tsx @@ -1,9 +1,7 @@ import { Check } from 'lucide-react' import Image from 'next/image' - -import { ThirdPartyAuthIntegration } from 'data/third-party-auth/integrations-query' -import { DOCS_URL } from 'lib/constants' import { Badge, Button } from 'ui' + import { AWS_IDP_REGIONS } from './AwsRegionSelector' import { getIntegrationType, @@ -11,6 +9,8 @@ import { getIntegrationTypeLabel, INTEGRATION_TYPES, } from './ThirdPartyAuthForm.utils' +import { ThirdPartyAuthIntegration } from '@/data/third-party-auth/integrations-query' +import { DOCS_URL } from '@/lib/constants' interface IntegrationCardProps { integration: ThirdPartyAuthIntegration diff --git a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/ThirdPartyAuthForm.utils.ts b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/ThirdPartyAuthForm.utils.ts index 2cb6643f48..349b887199 100644 --- a/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/ThirdPartyAuthForm.utils.ts +++ b/apps/studio/components/interfaces/Auth/ThirdPartyAuthForm/ThirdPartyAuthForm.utils.ts @@ -1,5 +1,5 @@ -import { ThirdPartyAuthIntegration } from 'data/third-party-auth/integrations-query' -import { BASE_PATH } from 'lib/constants' +import { ThirdPartyAuthIntegration } from '@/data/third-party-auth/integrations-query' +import { BASE_PATH } from '@/lib/constants' export const INTEGRATION_TYPES = [ 'firebase', diff --git a/apps/studio/components/interfaces/Auth/Users/AddUserDropdown.tsx b/apps/studio/components/interfaces/Auth/Users/AddUserDropdown.tsx index 494dfff31e..b58eed1179 100644 --- a/apps/studio/components/interfaces/Auth/Users/AddUserDropdown.tsx +++ b/apps/studio/components/interfaces/Auth/Users/AddUserDropdown.tsx @@ -1,13 +1,13 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { ChevronDown, Mail, UserPlus } from 'lucide-react' import { parseAsBoolean, useQueryState } from 'nuqs' - -import { DropdownMenuItemTooltip } from 'components/ui/DropdownMenuItemTooltip' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import { Button, DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from 'ui' + import CreateUserModal from './CreateUserModal' import InviteUserModal from './InviteUserModal' +import { DropdownMenuItemTooltip } from '@/components/ui/DropdownMenuItemTooltip' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' export const AddUserDropdown = () => { const showSendInvitation = useIsFeatureEnabled('authentication:show_send_invitation') diff --git a/apps/studio/components/interfaces/Auth/Users/BanUserModal.tsx b/apps/studio/components/interfaces/Auth/Users/BanUserModal.tsx index 97d7cb372d..a8bf20aa61 100644 --- a/apps/studio/components/interfaces/Auth/Users/BanUserModal.tsx +++ b/apps/studio/components/interfaces/Auth/Users/BanUserModal.tsx @@ -1,13 +1,9 @@ import { zodResolver } from '@hookform/resolvers/zod' +import { useParams } from 'common' import dayjs from 'dayjs' import { useEffect } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' - -import { useParams } from 'common' -import { useUserUpdateMutation } from 'data/auth/user-update-mutation' -import { User } from 'data/auth/users-infinite-query' import { Button, cn, @@ -23,6 +19,10 @@ import { Separator, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import * as z from 'zod' + +import { useUserUpdateMutation } from '@/data/auth/user-update-mutation' +import { User } from '@/data/auth/users-infinite-query' interface BanUserModalProps { visible: boolean diff --git a/apps/studio/components/interfaces/Auth/Users/CreateUserModal.tsx b/apps/studio/components/interfaces/Auth/Users/CreateUserModal.tsx index 6e102a6ef6..5a2996693a 100644 --- a/apps/studio/components/interfaces/Auth/Users/CreateUserModal.tsx +++ b/apps/studio/components/interfaces/Auth/Users/CreateUserModal.tsx @@ -1,13 +1,9 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { Lock, Mail } from 'lucide-react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' - -import { useParams } from 'common' -import { useUserCreateMutation } from 'data/auth/user-create-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { Button, Checkbox_Shadcn_, @@ -16,14 +12,18 @@ import { DialogHeader, DialogSectionSeparator, DialogTitle, + Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, FormItem_Shadcn_, FormLabel_Shadcn_, FormMessage_Shadcn_, - Form_Shadcn_, Input_Shadcn_, } from 'ui' +import * as z from 'zod' + +import { useUserCreateMutation } from '@/data/auth/user-create-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' export type CreateUserModalProps = { visible: boolean diff --git a/apps/studio/components/interfaces/Auth/Users/DeleteUserModal.tsx b/apps/studio/components/interfaces/Auth/Users/DeleteUserModal.tsx index c68031a943..aa226b2490 100644 --- a/apps/studio/components/interfaces/Auth/Users/DeleteUserModal.tsx +++ b/apps/studio/components/interfaces/Auth/Users/DeleteUserModal.tsx @@ -1,10 +1,10 @@ import { useParams } from 'common' import { toast } from 'sonner' - -import { useUserDeleteMutation } from 'data/auth/user-delete-mutation' -import { User } from 'data/auth/users-infinite-query' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' +import { useUserDeleteMutation } from '@/data/auth/user-delete-mutation' +import { User } from '@/data/auth/users-infinite-query' + interface DeleteUserModalProps { visible: boolean selectedUser?: User diff --git a/apps/studio/components/interfaces/Auth/Users/InviteUserModal.tsx b/apps/studio/components/interfaces/Auth/Users/InviteUserModal.tsx index f53f86d7fe..6e47130e80 100644 --- a/apps/studio/components/interfaces/Auth/Users/InviteUserModal.tsx +++ b/apps/studio/components/interfaces/Auth/Users/InviteUserModal.tsx @@ -1,8 +1,6 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { useUserInviteMutation } from 'data/auth/user-invite-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' import { @@ -16,6 +14,9 @@ import { import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import * as z from 'zod' +import { useUserInviteMutation } from '@/data/auth/user-invite-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' + export type InviteUserModalProps = { visible: boolean setVisible: (visible: boolean) => void diff --git a/apps/studio/components/interfaces/Auth/Users/SortDropdown.tsx b/apps/studio/components/interfaces/Auth/Users/SortDropdown.tsx index 173d0cdac7..6190cd408f 100644 --- a/apps/studio/components/interfaces/Auth/Users/SortDropdown.tsx +++ b/apps/studio/components/interfaces/Auth/Users/SortDropdown.tsx @@ -1,4 +1,3 @@ -import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { ArrowDownNarrowWide, ArrowDownWideNarrow } from 'lucide-react' import { Button, @@ -12,6 +11,8 @@ import { DropdownMenuTrigger, } from 'ui' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' + interface SortDropdownProps { specificFilterColumn: string sortColumn: string diff --git a/apps/studio/components/interfaces/Auth/Users/UserHeader.tsx b/apps/studio/components/interfaces/Auth/Users/UserHeader.tsx index 0c4cd915b2..9411040291 100644 --- a/apps/studio/components/interfaces/Auth/Users/UserHeader.tsx +++ b/apps/studio/components/interfaces/Auth/Users/UserHeader.tsx @@ -1,10 +1,10 @@ import { Copy } from 'lucide-react' - -import CopyButton from 'components/ui/CopyButton' -import { User } from 'data/auth/users-infinite-query' import { cn } from 'ui' + import { PANEL_PADDING } from './Users.constants' import { getDisplayName } from './Users.utils' +import CopyButton from '@/components/ui/CopyButton' +import { User } from '@/data/auth/users-infinite-query' export const UserHeader = ({ user }: { user: User }) => { const displayName = getDisplayName(user) diff --git a/apps/studio/components/interfaces/Auth/Users/UserLogs.tsx b/apps/studio/components/interfaces/Auth/Users/UserLogs.tsx index 5c236eca90..bb1de78c0d 100644 --- a/apps/studio/components/interfaces/Auth/Users/UserLogs.tsx +++ b/apps/studio/components/interfaces/Auth/Users/UserLogs.tsx @@ -1,9 +1,4 @@ import { useParams } from 'common' -import { LOGS_TABLES } from 'components/interfaces/Settings/Logs/Logs.constants' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { User } from 'data/auth/users-infinite-query' -import useLogsPreview from 'hooks/analytics/useLogsPreview' -import { useLogsUrlState } from 'hooks/analytics/useLogsUrlState' import { ExternalLink, RefreshCw } from 'lucide-react' import Link from 'next/link' import { useQueryState } from 'nuqs' @@ -14,6 +9,11 @@ import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { UserHeader } from './UserHeader' import { PANEL_PADDING } from './Users.constants' +import { LOGS_TABLES } from '@/components/interfaces/Settings/Logs/Logs.constants' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { User } from '@/data/auth/users-infinite-query' +import useLogsPreview from '@/hooks/analytics/useLogsPreview' +import { useLogsUrlState } from '@/hooks/analytics/useLogsUrlState' interface UserLogsProps { user: User diff --git a/apps/studio/components/interfaces/Auth/Users/UserOverview.tsx b/apps/studio/components/interfaces/Auth/Users/UserOverview.tsx index 25b50eeefe..f34750a103 100644 --- a/apps/studio/components/interfaces/Auth/Users/UserOverview.tsx +++ b/apps/studio/components/interfaces/Auth/Users/UserOverview.tsx @@ -1,33 +1,33 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import dayjs from 'dayjs' import { Ban, Check, Copy, Mail, ShieldOff, Trash, X } from 'lucide-react' import Link from 'next/link' import { ComponentProps, ReactNode, useEffect, useState } from 'react' import { toast } from 'sonner' - -import { useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import CopyButton from 'components/ui/CopyButton' -import { useAuthConfigQuery } from 'data/auth/auth-config-query' -import { useUserDeleteMFAFactorsMutation } from 'data/auth/user-delete-mfa-factors-mutation' -import { useUserResetPasswordMutation } from 'data/auth/user-reset-password-mutation' -import { useUserSendMagicLinkMutation } from 'data/auth/user-send-magic-link-mutation' -import { useUserSendOTPMutation } from 'data/auth/user-send-otp-mutation' -import { useUserUpdateMutation } from 'data/auth/user-update-mutation' -import { User } from 'data/auth/users-infinite-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { BASE_PATH } from 'lib/constants' -import { timeout } from 'lib/helpers' import { Button, cn, Separator } from 'ui' import { Admonition } from 'ui-patterns/admonition' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' + import { PROVIDERS_SCHEMAS } from '../AuthProvidersFormValidation' import { BanUserModal } from './BanUserModal' import { DeleteUserModal } from './DeleteUserModal' import { UserHeader } from './UserHeader' import { PANEL_PADDING } from './Users.constants' import { providerIconMap } from './Users.utils' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import CopyButton from '@/components/ui/CopyButton' +import { useAuthConfigQuery } from '@/data/auth/auth-config-query' +import { useUserDeleteMFAFactorsMutation } from '@/data/auth/user-delete-mfa-factors-mutation' +import { useUserResetPasswordMutation } from '@/data/auth/user-reset-password-mutation' +import { useUserSendMagicLinkMutation } from '@/data/auth/user-send-magic-link-mutation' +import { useUserSendOTPMutation } from '@/data/auth/user-send-otp-mutation' +import { useUserUpdateMutation } from '@/data/auth/user-update-mutation' +import { User } from '@/data/auth/users-infinite-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { BASE_PATH } from '@/lib/constants' +import { timeout } from '@/lib/helpers' const DATE_FORMAT = 'DD MMM, YYYY HH:mm' const CONTAINER_CLASS = cn( diff --git a/apps/studio/components/interfaces/Auth/Users/Users.constants.ts b/apps/studio/components/interfaces/Auth/Users/Users.constants.ts index b18fe93597..2bfc066be7 100644 --- a/apps/studio/components/interfaces/Auth/Users/Users.constants.ts +++ b/apps/studio/components/interfaces/Auth/Users/Users.constants.ts @@ -1,7 +1,7 @@ import { type OptimizedSearchColumns } from '@supabase/pg-meta' -import { BASE_PATH } from 'lib/constants' import { PROVIDER_PHONE, PROVIDERS_SCHEMAS } from '../AuthProvidersFormValidation' +import { BASE_PATH } from '@/lib/constants' export type Filter = 'all' | 'verified' | 'unverified' | 'anonymous' diff --git a/apps/studio/components/interfaces/Auth/Users/UsersFooter.tsx b/apps/studio/components/interfaces/Auth/Users/UsersFooter.tsx index 38295c01e4..c2ce363c57 100644 --- a/apps/studio/components/interfaces/Auth/Users/UsersFooter.tsx +++ b/apps/studio/components/interfaces/Auth/Users/UsersFooter.tsx @@ -1,15 +1,15 @@ import { THRESHOLD_COUNT, type OptimizedSearchColumns } from '@supabase/pg-meta' import { keepPreviousData } from '@tanstack/react-query' import { useParams } from 'common' -import { formatEstimatedCount } from 'components/grid/components/footer/pagination/Pagination.utils' -import { useUsersCountQuery } from 'data/auth/users-count-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { HelpCircle, Loader2 } from 'lucide-react' import { useEffect, useState } from 'react' import { Button, Tooltip, TooltipContent, TooltipTrigger } from 'ui' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import type { Filter, SpecificFilterColumn } from './Users.constants' +import { formatEstimatedCount } from '@/components/grid/components/footer/pagination/Pagination.utils' +import { useUsersCountQuery } from '@/data/auth/users-count-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface UsersFooterProps { filter: Filter diff --git a/apps/studio/components/interfaces/Auth/Users/UsersV2.tsx b/apps/studio/components/interfaces/Auth/Users/UsersV2.tsx index dcb8316d57..35b98bd209 100644 --- a/apps/studio/components/interfaces/Auth/Users/UsersV2.tsx +++ b/apps/studio/components/interfaces/Auth/Users/UsersV2.tsx @@ -3,27 +3,6 @@ import type { OptimizedSearchColumns } from '@supabase/pg-meta' import { keepPreviousData, useQueryClient } from '@tanstack/react-query' import AwesomeDebouncePromise from 'awesome-debounce-promise' import { LOCAL_STORAGE_KEYS, useFlag, useParams } from 'common' -import { useIsAPIDocsSidePanelEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' -import { AlertError } from 'components/ui/AlertError' -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' -import { InlineLink } from 'components/ui/InlineLink' -import { useAuthConfigQuery } from 'data/auth/auth-config-query' -import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation' -import { useIndexWorkerStatusQuery } from 'data/auth/index-worker-status-query' -import { authKeys } from 'data/auth/keys' -import { useUserDeleteMutation } from 'data/auth/user-delete-mutation' -import { useUserIndexStatusesQuery } from 'data/auth/user-search-indexes-query' -import { useUsersCountQuery } from 'data/auth/users-count-query' -import { User, useUsersInfiniteQuery } from 'data/auth/users-infinite-query' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { cleanPointerEventsNoneOnBody, isAtBottom } from 'lib/helpers' import { ExternalLinkIcon, InfoIcon, @@ -75,7 +54,28 @@ import { import { formatUserColumns, formatUsersData } from './Users.utils' import { UsersFooter } from './UsersFooter' import { UsersSearch } from './UsersSearch' +import { useIsAPIDocsSidePanelEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import { AlertError } from '@/components/ui/AlertError' +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' +import { InlineLink } from '@/components/ui/InlineLink' +import { useAuthConfigQuery } from '@/data/auth/auth-config-query' +import { useAuthConfigUpdateMutation } from '@/data/auth/auth-config-update-mutation' +import { useIndexWorkerStatusQuery } from '@/data/auth/index-worker-status-query' +import { authKeys } from '@/data/auth/keys' +import { useUserDeleteMutation } from '@/data/auth/user-delete-mutation' +import { useUserIndexStatusesQuery } from '@/data/auth/user-search-indexes-query' +import { useUsersCountQuery } from '@/data/auth/users-count-query' +import { User, useUsersInfiniteQuery } from '@/data/auth/users-infinite-query' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' import { PROJECT_STATUS } from '@/lib/constants/infrastructure' +import { cleanPointerEventsNoneOnBody, isAtBottom } from '@/lib/helpers' const SORT_BY_VALUE_COUNT_THRESHOLD = 10_000 const IMPROVED_SEARCH_COUNT_THRESHOLD = 10_000 diff --git a/apps/studio/components/interfaces/Billing/InvoiceStatusBadge.tsx b/apps/studio/components/interfaces/Billing/InvoiceStatusBadge.tsx index f0ff81794b..22c1f7d17b 100644 --- a/apps/studio/components/interfaces/Billing/InvoiceStatusBadge.tsx +++ b/apps/studio/components/interfaces/Billing/InvoiceStatusBadge.tsx @@ -1,7 +1,8 @@ -import { InlineLink } from 'components/ui/InlineLink' -import { DOCS_URL } from 'lib/constants' import { Badge, Tooltip, TooltipContent, TooltipTrigger } from 'ui' + import { InvoiceStatus } from './Invoices.types' +import { InlineLink } from '@/components/ui/InlineLink' +import { DOCS_URL } from '@/lib/constants' interface InvoiceStatusBadgeProps { status: InvoiceStatus diff --git a/apps/studio/components/interfaces/Billing/NoProjectsOnPaidOrgInfo.tsx b/apps/studio/components/interfaces/Billing/NoProjectsOnPaidOrgInfo.tsx index f45960f860..2062f15a4d 100644 --- a/apps/studio/components/interfaces/Billing/NoProjectsOnPaidOrgInfo.tsx +++ b/apps/studio/components/interfaces/Billing/NoProjectsOnPaidOrgInfo.tsx @@ -1,8 +1,9 @@ -import { useOrgProjectsInfiniteQuery } from 'data/projects/org-projects-infinite-query' import Link from 'next/link' -import type { Organization } from 'types' import { Admonition } from 'ui-patterns' +import { useOrgProjectsInfiniteQuery } from '@/data/projects/org-projects-infinite-query' +import type { Organization } from '@/types' + interface NoProjectsOnPaidOrgInfoProps { organization?: Organization } diff --git a/apps/studio/components/interfaces/Billing/Payment/AddNewPaymentMethodModal.tsx b/apps/studio/components/interfaces/Billing/Payment/AddNewPaymentMethodModal.tsx index d75a742e5c..cb0971ca9f 100644 --- a/apps/studio/components/interfaces/Billing/Payment/AddNewPaymentMethodModal.tsx +++ b/apps/studio/components/interfaces/Billing/Payment/AddNewPaymentMethodModal.tsx @@ -6,11 +6,11 @@ import { useCallback, useEffect, useState } from 'react' import { toast } from 'sonner' import { Modal } from 'ui' -import { useOrganizationPaymentMethodSetupIntent } from 'data/organizations/organization-payment-method-setup-intent-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { STRIPE_PUBLIC_KEY } from 'lib/constants' import AddPaymentMethodForm from './AddPaymentMethodForm' import { getStripeElementsAppearanceOptions } from './Payment.utils' +import { useOrganizationPaymentMethodSetupIntent } from '@/data/organizations/organization-payment-method-setup-intent-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { STRIPE_PUBLIC_KEY } from '@/lib/constants' interface AddNewPaymentMethodModalProps { visible: boolean diff --git a/apps/studio/components/interfaces/Billing/Payment/AddPaymentMethodForm.tsx b/apps/studio/components/interfaces/Billing/Payment/AddPaymentMethodForm.tsx index ae56cca687..c58af7e7c7 100644 --- a/apps/studio/components/interfaces/Billing/Payment/AddPaymentMethodForm.tsx +++ b/apps/studio/components/interfaces/Billing/Payment/AddPaymentMethodForm.tsx @@ -1,21 +1,22 @@ import { useQueryClient } from '@tanstack/react-query' -import { - NewPaymentMethodElement, - type PaymentMethodElementRef, -} from 'components/interfaces/Billing/Payment/PaymentMethods/NewPaymentMethodElement' -import { organizationKeys } from 'data/organizations/keys' -import { useOrganizationCustomerProfileQuery } from 'data/organizations/organization-customer-profile-query' -import { useOrganizationCustomerProfileUpdateMutation } from 'data/organizations/organization-customer-profile-update-mutation' -import { useOrganizationPaymentMethodMarkAsDefaultMutation } from 'data/organizations/organization-payment-method-default-mutation' -import { useOrganizationTaxIdQuery } from 'data/organizations/organization-tax-id-query' -import { useOrganizationTaxIdUpdateMutation } from 'data/organizations/organization-tax-id-update-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { isEqual } from 'lodash' import { useRef, useState } from 'react' import { toast } from 'sonner' import { Button, Checkbox_Shadcn_, Label_Shadcn_, Modal } from 'ui' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' +import { + NewPaymentMethodElement, + type PaymentMethodElementRef, +} from '@/components/interfaces/Billing/Payment/PaymentMethods/NewPaymentMethodElement' +import { organizationKeys } from '@/data/organizations/keys' +import { useOrganizationCustomerProfileQuery } from '@/data/organizations/organization-customer-profile-query' +import { useOrganizationCustomerProfileUpdateMutation } from '@/data/organizations/organization-customer-profile-update-mutation' +import { useOrganizationPaymentMethodMarkAsDefaultMutation } from '@/data/organizations/organization-payment-method-default-mutation' +import { useOrganizationTaxIdQuery } from '@/data/organizations/organization-tax-id-query' +import { useOrganizationTaxIdUpdateMutation } from '@/data/organizations/organization-tax-id-update-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' + interface AddPaymentMethodFormProps { returnUrl: string onCancel: () => void diff --git a/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/ChangePaymentMethodModal.tsx b/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/ChangePaymentMethodModal.tsx index cb6503be21..837ae1209d 100644 --- a/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/ChangePaymentMethodModal.tsx +++ b/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/ChangePaymentMethodModal.tsx @@ -1,10 +1,10 @@ -import { toast } from 'sonner' - import { useParams } from 'common' -import { useOrganizationPaymentMethodMarkAsDefaultMutation } from 'data/organizations/organization-payment-method-default-mutation' -import type { OrganizationPaymentMethod } from 'data/organizations/organization-payment-methods-query' +import { toast } from 'sonner' import { Button, Modal } from 'ui' +import { useOrganizationPaymentMethodMarkAsDefaultMutation } from '@/data/organizations/organization-payment-method-default-mutation' +import type { OrganizationPaymentMethod } from '@/data/organizations/organization-payment-methods-query' + export interface ChangePaymentMethodModalProps { selectedPaymentMethod?: OrganizationPaymentMethod onClose: () => void diff --git a/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/CreditCard.tsx b/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/CreditCard.tsx index 90ccd9c677..a6af99ef01 100644 --- a/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/CreditCard.tsx +++ b/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/CreditCard.tsx @@ -1,8 +1,4 @@ import { MoreHorizontal } from 'lucide-react' - -import { DropdownMenuItemTooltip } from 'components/ui/DropdownMenuItemTooltip' -import { OrganizationPaymentMethod } from 'data/organizations/organization-payment-methods-query' -import { BASE_PATH } from 'lib/constants' import { Badge, Button, @@ -12,7 +8,11 @@ import { DropdownMenuSeparator, DropdownMenuTrigger, } from 'ui' -import { PlanId } from 'data/subscriptions/types' + +import { DropdownMenuItemTooltip } from '@/components/ui/DropdownMenuItemTooltip' +import { OrganizationPaymentMethod } from '@/data/organizations/organization-payment-methods-query' +import { PlanId } from '@/data/subscriptions/types' +import { BASE_PATH } from '@/lib/constants' interface CreditCardProps { paymentMethod: OrganizationPaymentMethod diff --git a/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/CurrentPaymentMethod.tsx b/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/CurrentPaymentMethod.tsx index 99eda56f6a..fe635e1d8e 100644 --- a/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/CurrentPaymentMethod.tsx +++ b/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/CurrentPaymentMethod.tsx @@ -1,15 +1,15 @@ import { PermissionAction, SupportCategories } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { CreditCardIcon } from 'lucide-react' import Link from 'next/link' - -import { useParams } from 'common' -import { SupportLink } from 'components/interfaces/Support/SupportLink' -import { useOrganizationPaymentMethodsQuery } from 'data/organizations/organization-payment-methods-query' -import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { Button } from 'ui' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' + import CreditCard from './CreditCard' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' +import { useOrganizationPaymentMethodsQuery } from '@/data/organizations/organization-payment-methods-query' +import { useOrgSubscriptionQuery } from '@/data/subscriptions/org-subscription-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' const CurrentPaymentMethod = () => { const { slug } = useParams() diff --git a/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/DeletePaymentMethodModal.tsx b/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/DeletePaymentMethodModal.tsx index a4c077dde4..6874645dfe 100644 --- a/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/DeletePaymentMethodModal.tsx +++ b/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/DeletePaymentMethodModal.tsx @@ -1,11 +1,11 @@ import { useParams } from 'common' import { toast } from 'sonner' import { Button, Modal } from 'ui' - -import { useOrganizationPaymentMethodDeleteMutation } from 'data/organizations/organization-payment-method-delete-mutation' -import type { OrganizationPaymentMethod } from 'data/organizations/organization-payment-methods-query' import { Admonition } from 'ui-patterns' +import { useOrganizationPaymentMethodDeleteMutation } from '@/data/organizations/organization-payment-method-delete-mutation' +import type { OrganizationPaymentMethod } from '@/data/organizations/organization-payment-methods-query' + export interface DeletePaymentMethodModalProps { selectedPaymentMethod?: OrganizationPaymentMethod onClose: () => void diff --git a/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/NewPaymentMethodElement.tsx b/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/NewPaymentMethodElement.tsx index c8905ea93b..3710afb830 100644 --- a/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/NewPaymentMethodElement.tsx +++ b/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/NewPaymentMethodElement.tsx @@ -12,13 +12,6 @@ import { type SetupIntent, } from '@stripe/stripe-js' import { Form } from '@ui/components/shadcn/ui/form' -import { TAX_IDS } from 'components/interfaces/Organization/BillingSettings/BillingCustomerData/TaxID.constants' -import { - resolveStoredTaxId, - getEffectiveTaxCountry, -} from 'components/interfaces/Organization/BillingSettings/BillingCustomerData/TaxID.utils' -import type { CustomerAddress, CustomerTaxId } from 'data/organizations/types' -import { getURL } from 'lib/helpers' import { Check, ChevronsUpDown } from 'lucide-react' import { forwardRef, useEffect, useId, useImperativeHandle, useMemo, useState } from 'react' import { useForm } from 'react-hook-form' @@ -45,6 +38,14 @@ import { import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { z } from 'zod' +import { TAX_IDS } from '@/components/interfaces/Organization/BillingSettings/BillingCustomerData/TaxID.constants' +import { + getEffectiveTaxCountry, + resolveStoredTaxId, +} from '@/components/interfaces/Organization/BillingSettings/BillingCustomerData/TaxID.utils' +import type { CustomerAddress, CustomerTaxId } from '@/data/organizations/types' +import { getURL } from '@/lib/helpers' + export const BillingCustomerDataSchema = z.object({ tax_id_type: z.string(), tax_id_value: z.string().min(2, { diff --git a/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/PaymentMethods.tsx b/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/PaymentMethods.tsx index 5b1f019410..a4e9079ac1 100644 --- a/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/PaymentMethods.tsx +++ b/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/PaymentMethods.tsx @@ -1,33 +1,33 @@ import { PermissionAction, SupportCategories } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { CreditCardIcon, Plus } from 'lucide-react' import { useState } from 'react' import { toast } from 'sonner' +import { Button } from 'ui' +import { Admonition } from 'ui-patterns/admonition' +import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' -import { useParams } from 'common' -import AddNewPaymentMethodModal from 'components/interfaces/Billing/Payment/AddNewPaymentMethodModal' -import { SupportLink } from 'components/interfaces/Support/SupportLink' +import ChangePaymentMethodModal from './ChangePaymentMethodModal' +import CreditCard from './CreditCard' +import DeletePaymentMethodModal from './DeletePaymentMethodModal' +import AddNewPaymentMethodModal from '@/components/interfaces/Billing/Payment/AddNewPaymentMethodModal' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' import { ScaffoldSection, ScaffoldSectionContent, ScaffoldSectionDetail, -} from 'components/layouts/Scaffold' -import AlertError from 'components/ui/AlertError' -import { FormPanel } from 'components/ui/Forms/FormPanel' -import { FormSection, FormSectionContent } from 'components/ui/Forms/FormSection' -import NoPermission from 'components/ui/NoPermission' -import PartnerManagedResource from 'components/ui/PartnerManagedResource' -import { useOrganizationPaymentMethodsQuery } from 'data/organizations/organization-payment-methods-query' -import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { MANAGED_BY } from 'lib/constants/infrastructure' -import { getURL } from 'lib/helpers' -import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' -import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' -import ChangePaymentMethodModal from './ChangePaymentMethodModal' -import CreditCard from './CreditCard' -import DeletePaymentMethodModal from './DeletePaymentMethodModal' +} from '@/components/layouts/Scaffold' +import AlertError from '@/components/ui/AlertError' +import { FormPanel } from '@/components/ui/Forms/FormPanel' +import { FormSection, FormSectionContent } from '@/components/ui/Forms/FormSection' +import NoPermission from '@/components/ui/NoPermission' +import PartnerManagedResource from '@/components/ui/PartnerManagedResource' +import { useOrganizationPaymentMethodsQuery } from '@/data/organizations/organization-payment-methods-query' +import { useOrgSubscriptionQuery } from '@/data/subscriptions/org-subscription-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { MANAGED_BY } from '@/lib/constants/infrastructure' +import { getURL } from '@/lib/helpers' const PaymentMethods = () => { const { slug } = useParams() diff --git a/apps/studio/components/interfaces/Billing/SpendCapModal.tsx b/apps/studio/components/interfaces/Billing/SpendCapModal.tsx index e0c132c4a0..4dcf0489df 100644 --- a/apps/studio/components/interfaces/Billing/SpendCapModal.tsx +++ b/apps/studio/components/interfaces/Billing/SpendCapModal.tsx @@ -1,7 +1,8 @@ -import { DocsButton } from 'components/ui/DocsButton' -import { DOCS_URL } from 'lib/constants' import { Button, Modal, Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from 'ui' +import { DocsButton } from '@/components/ui/DocsButton' +import { DOCS_URL } from '@/lib/constants' + interface SpendCapModalProps { visible: boolean onHide: () => void diff --git a/apps/studio/components/interfaces/Billing/Subscription/Subscription.utils.ts b/apps/studio/components/interfaces/Billing/Subscription/Subscription.utils.ts index 7d8ab4ec3e..1b1536bce6 100644 --- a/apps/studio/components/interfaces/Billing/Subscription/Subscription.utils.ts +++ b/apps/studio/components/interfaces/Billing/Subscription/Subscription.utils.ts @@ -1,5 +1,5 @@ -import type { OrgSubscription, PlanId, ProjectSelectedAddon } from 'data/subscriptions/types' -import { IS_PLATFORM } from 'lib/constants' +import type { OrgSubscription, PlanId, ProjectSelectedAddon } from '@/data/subscriptions/types' +import { IS_PLATFORM } from '@/lib/constants' export const getAddons = (selectedAddons: ProjectSelectedAddon[]) => { const computeInstance = selectedAddons.find((addon) => addon.type === 'compute_instance') diff --git a/apps/studio/components/interfaces/Billing/Usage/UsageWarningAlerts/CPUWarnings.tsx b/apps/studio/components/interfaces/Billing/Usage/UsageWarningAlerts/CPUWarnings.tsx index 7c8a8328fb..78f960bd60 100644 --- a/apps/studio/components/interfaces/Billing/Usage/UsageWarningAlerts/CPUWarnings.tsx +++ b/apps/studio/components/interfaces/Billing/Usage/UsageWarningAlerts/CPUWarnings.tsx @@ -1,9 +1,9 @@ +import { AlertTitle } from '@ui/components/shadcn/ui/alert' import { AlertCircle } from 'lucide-react' import Link from 'next/link' +import { Alert_Shadcn_, AlertDescription_Shadcn_, Button } from 'ui' -import { AlertTitle } from '@ui/components/shadcn/ui/alert' -import { DOCS_URL } from 'lib/constants' -import { AlertDescription_Shadcn_, Alert_Shadcn_, Button } from 'ui' +import { DOCS_URL } from '@/lib/constants' interface CPUWarningsProps { hasAccessToComputeSizes: boolean diff --git a/apps/studio/components/interfaces/Billing/Usage/UsageWarningAlerts/RAMWarnings.tsx b/apps/studio/components/interfaces/Billing/Usage/UsageWarningAlerts/RAMWarnings.tsx index c2c37f79ef..39f3c5af0b 100644 --- a/apps/studio/components/interfaces/Billing/Usage/UsageWarningAlerts/RAMWarnings.tsx +++ b/apps/studio/components/interfaces/Billing/Usage/UsageWarningAlerts/RAMWarnings.tsx @@ -1,9 +1,9 @@ +import { AlertTitle } from '@ui/components/shadcn/ui/alert' import { AlertCircle } from 'lucide-react' import Link from 'next/link' +import { Alert_Shadcn_, AlertDescription_Shadcn_, Button } from 'ui' -import { AlertTitle } from '@ui/components/shadcn/ui/alert' -import { DOCS_URL } from 'lib/constants' -import { AlertDescription_Shadcn_, Alert_Shadcn_, Button } from 'ui' +import { DOCS_URL } from '@/lib/constants' interface RAMWarningsProps { hasAccessToComputeSizes: boolean diff --git a/apps/studio/components/interfaces/BranchManagement/ActionStatusBadge.tsx b/apps/studio/components/interfaces/BranchManagement/ActionStatusBadge.tsx index 96d1772826..c08b50c571 100644 --- a/apps/studio/components/interfaces/BranchManagement/ActionStatusBadge.tsx +++ b/apps/studio/components/interfaces/BranchManagement/ActionStatusBadge.tsx @@ -1,7 +1,8 @@ -import { ActionName, ActionStatus, type ActionRunStep } from 'data/actions/action-runs-query' import type { PropsWithChildren } from 'react' import { Badge, StatusIcon, Tooltip, TooltipContent, TooltipTrigger } from 'ui' +import { ActionName, ActionStatus, type ActionRunStep } from '@/data/actions/action-runs-query' + export interface ActionStatusBadgeProps { name: ActionName status: ActionStatus diff --git a/apps/studio/components/interfaces/BranchManagement/Branch.Commands.tsx b/apps/studio/components/interfaces/BranchManagement/Branch.Commands.tsx index cb13759dd0..7e061b6de5 100644 --- a/apps/studio/components/interfaces/BranchManagement/Branch.Commands.tsx +++ b/apps/studio/components/interfaces/BranchManagement/Branch.Commands.tsx @@ -1,10 +1,10 @@ import { Forward, GitBranch } from 'lucide-react' - -import { useBranchesQuery } from 'data/branches/branches-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { PageType, useRegisterCommands, useRegisterPage, useSetPage } from 'ui-patterns/CommandMenu' + import { COMMAND_MENU_SECTIONS } from '../App/CommandMenu/CommandMenu.utils' import { orderCommandSectionsByPriority } from '../App/CommandMenu/ordering' +import { useBranchesQuery } from '@/data/branches/branches-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' const SWITCH_BRANCH_PAGE_NAME = 'Switch branch' const EMPTY_ARRAY = [] as Array diff --git a/apps/studio/components/interfaces/BranchManagement/BranchManagement.utils.ts b/apps/studio/components/interfaces/BranchManagement/BranchManagement.utils.ts index e1f23edabf..26e45c7fc5 100644 --- a/apps/studio/components/interfaces/BranchManagement/BranchManagement.utils.ts +++ b/apps/studio/components/interfaces/BranchManagement/BranchManagement.utils.ts @@ -1,11 +1,11 @@ -import { DiskAttributesData } from 'data/config/disk-attributes-query' -import { DesiredInstanceSize, instanceSizeSpecs } from 'data/projects/new-project.constants' import { DISK_LIMITS, DISK_PRICING, DiskType, PLAN_DETAILS, } from '../DiskManagement/ui/DiskManagement.constants' +import { DiskAttributesData } from '@/data/config/disk-attributes-query' +import { DesiredInstanceSize, instanceSizeSpecs } from '@/data/projects/new-project.constants' // Ref: https://supabase.com/docs/guides/platform/compute-and-disk const maxDiskForCompute = new Map([ diff --git a/apps/studio/components/interfaces/BranchManagement/BranchPanels.tsx b/apps/studio/components/interfaces/BranchManagement/BranchPanels.tsx index f2f3e45021..e753b56c47 100644 --- a/apps/studio/components/interfaces/BranchManagement/BranchPanels.tsx +++ b/apps/studio/components/interfaces/BranchManagement/BranchPanels.tsx @@ -1,5 +1,3 @@ -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import type { Branch } from 'data/branches/branches-query' import dayjs from 'dayjs' import { Github } from 'lucide-react' import Link from 'next/link' @@ -10,6 +8,8 @@ import { TimestampInfo } from 'ui-patterns' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { WorkflowLogs } from './WorkflowLogs' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import type { Branch } from '@/data/branches/branches-query' interface BranchManagementSectionProps { header: string | ReactNode diff --git a/apps/studio/components/interfaces/BranchManagement/BranchSelector.tsx b/apps/studio/components/interfaces/BranchManagement/BranchSelector.tsx index ea2d8e7d4e..7583665666 100644 --- a/apps/studio/components/interfaces/BranchManagement/BranchSelector.tsx +++ b/apps/studio/components/interfaces/BranchManagement/BranchSelector.tsx @@ -1,21 +1,21 @@ import { Check, GitMerge, Shield } from 'lucide-react' import { useState } from 'react' - -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { Branch } from 'data/branches/branches-query' import { + Command_Shadcn_, CommandEmpty_Shadcn_, CommandGroup_Shadcn_, CommandInput_Shadcn_, CommandItem_Shadcn_, CommandList_Shadcn_, - Command_Shadcn_, + Popover_Shadcn_, PopoverContent_Shadcn_, PopoverTrigger_Shadcn_, - Popover_Shadcn_, ScrollArea, } from 'ui' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { Branch } from '@/data/branches/branches-query' + interface BranchSelectorProps { branches: Branch[] onBranchSelected?: (branch: Branch) => void diff --git a/apps/studio/components/interfaces/BranchManagement/BranchStatusBadge.tsx b/apps/studio/components/interfaces/BranchManagement/BranchStatusBadge.tsx index 692f0ef8af..471685eeba 100644 --- a/apps/studio/components/interfaces/BranchManagement/BranchStatusBadge.tsx +++ b/apps/studio/components/interfaces/BranchManagement/BranchStatusBadge.tsx @@ -1,7 +1,7 @@ -import type { BranchData } from 'data/branches/branch-query' -import type { Branch } from 'data/branches/branches-query' -import { Badge } from 'ui' -import { StatusIcon } from 'ui' +import { Badge, StatusIcon } from 'ui' + +import type { BranchData } from '@/data/branches/branch-query' +import type { Branch } from '@/data/branches/branches-query' type Status = Branch['status'] | BranchData['status'] diff --git a/apps/studio/components/interfaces/BranchManagement/CreateBranchModal.tsx b/apps/studio/components/interfaces/BranchManagement/CreateBranchModal.tsx index c1c80df065..15387a935c 100644 --- a/apps/studio/components/interfaces/BranchManagement/CreateBranchModal.tsx +++ b/apps/studio/components/interfaces/BranchManagement/CreateBranchModal.tsx @@ -1,41 +1,19 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useQueryClient } from '@tanstack/react-query' -import { Check, DatabaseZap, DollarSign, GitMerge, Github, Loader2 } from 'lucide-react' +import { useDebounce } from '@uidotdev/usehooks' +import { useFlag, useParams } from 'common' +import { Check, DatabaseZap, DollarSign, Github, GitMerge, Loader2 } from 'lucide-react' import Image from 'next/image' import Link from 'next/link' import { useRouter } from 'next/router' import { useCallback, useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' - -import { useDebounce } from '@uidotdev/usehooks' -import { useFlag, useParams } from 'common' -import { useIsBranching2Enabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' -import { BranchingPITRNotice } from 'components/layouts/AppLayout/EnableBranchingButton/BranchingPITRNotice' -import AlertError from 'components/ui/AlertError' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { InlineLink, InlineLinkClassName } from 'components/ui/InlineLink' -import { UpgradeToPro } from 'components/ui/UpgradeToPro' -import { useBranchCreateMutation } from 'data/branches/branch-create-mutation' -import { useBranchesQuery } from 'data/branches/branches-query' -import { DiskAttributesData, useDiskAttributesQuery } from 'data/config/disk-attributes-query' -import { useCheckGithubBranchValidity } from 'data/integrations/github-branch-check-query' -import { useGitHubConnectionsQuery } from 'data/integrations/github-connections-query' -import { projectKeys } from 'data/projects/keys' -import { DesiredInstanceSize, instanceSizeSpecs } from 'data/projects/new-project.constants' -import { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { BASE_PATH, IS_PLATFORM } from 'lib/constants' -import { useAppStateSnapshot } from 'state/app-state' import { Badge, Button, + cn, Dialog, DialogContent, DialogFooter, @@ -43,24 +21,46 @@ import { DialogSection, DialogSectionSeparator, DialogTitle, + Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, - Form_Shadcn_, Input_Shadcn_, Label_Shadcn_ as Label, Switch, Tooltip, TooltipContent, TooltipTrigger, - cn, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { GenericSkeletonLoader, ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' +import * as z from 'zod' + import { estimateComputeSize, estimateDiskCost, estimateRestoreTime, } from './BranchManagement.utils' +import { useIsBranching2Enabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import { BranchingPITRNotice } from '@/components/layouts/AppLayout/EnableBranchingButton/BranchingPITRNotice' +import AlertError from '@/components/ui/AlertError' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { InlineLink, InlineLinkClassName } from '@/components/ui/InlineLink' +import { UpgradeToPro } from '@/components/ui/UpgradeToPro' +import { useBranchCreateMutation } from '@/data/branches/branch-create-mutation' +import { useBranchesQuery } from '@/data/branches/branches-query' +import { DiskAttributesData, useDiskAttributesQuery } from '@/data/config/disk-attributes-query' +import { useCheckGithubBranchValidity } from '@/data/integrations/github-branch-check-query' +import { useGitHubConnectionsQuery } from '@/data/integrations/github-connections-query' +import { projectKeys } from '@/data/projects/keys' +import { DesiredInstanceSize, instanceSizeSpecs } from '@/data/projects/new-project.constants' +import { useProjectAddonsQuery } from '@/data/subscriptions/project-addons-query' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { BASE_PATH, IS_PLATFORM } from '@/lib/constants' +import { useAppStateSnapshot } from '@/state/app-state' export const CreateBranchModal = () => { const { ref } = useParams() diff --git a/apps/studio/components/interfaces/BranchManagement/DatabaseDiffPanel.tsx b/apps/studio/components/interfaces/BranchManagement/DatabaseDiffPanel.tsx index 9b85ce3dca..73400a291d 100644 --- a/apps/studio/components/interfaces/BranchManagement/DatabaseDiffPanel.tsx +++ b/apps/studio/components/interfaces/BranchManagement/DatabaseDiffPanel.tsx @@ -1,9 +1,9 @@ import { CircleAlert, Database, Download, Loader2, Wind } from 'lucide-react' import Link from 'next/link' import { toast } from 'sonner' +import { Button, Card, CardContent, CardHeader, CardTitle, Skeleton } from 'ui' import { DiffEditor } from '@/components/ui/DiffEditor' -import { Button, Card, CardContent, CardHeader, CardTitle, Skeleton } from 'ui' interface DatabaseDiffPanelProps { diffContent?: string diff --git a/apps/studio/components/interfaces/BranchManagement/EdgeFunctionsDiffPanel.tsx b/apps/studio/components/interfaces/BranchManagement/EdgeFunctionsDiffPanel.tsx index ff945fd038..9c76159c07 100644 --- a/apps/studio/components/interfaces/BranchManagement/EdgeFunctionsDiffPanel.tsx +++ b/apps/studio/components/interfaces/BranchManagement/EdgeFunctionsDiffPanel.tsx @@ -1,18 +1,18 @@ +import { basename } from 'path' import { IS_PLATFORM } from 'common' import { Circle, Code, Minus, Plus, Wind } from 'lucide-react' import Link from 'next/link' -import { basename } from 'path' import { useEffect, useMemo, useState } from 'react' +import { Card, CardContent, CardHeader, CardTitle, cn, Skeleton } from 'ui' import { DiffEditor } from '@/components/ui/DiffEditor' -import type { EdgeFunctionBodyData } from 'data/edge-functions/edge-function-body-query' +import type { EdgeFunctionBodyData } from '@/data/edge-functions/edge-function-body-query' import type { EdgeFunctionsDiffResult, FileInfo, FileStatus, -} from 'hooks/branches/useEdgeFunctionsDiff' -import { EMPTY_ARR } from 'lib/void' -import { Card, CardContent, CardHeader, CardTitle, cn, Skeleton } from 'ui' +} from '@/hooks/branches/useEdgeFunctionsDiff' +import { EMPTY_ARR } from '@/lib/void' const EMPTY_FUNCTION_BODY: EdgeFunctionBodyData = { files: EMPTY_ARR, diff --git a/apps/studio/components/interfaces/BranchManagement/EditBranchModal.tsx b/apps/studio/components/interfaces/BranchManagement/EditBranchModal.tsx index eeb573b832..67c9ca8f96 100644 --- a/apps/studio/components/interfaces/BranchManagement/EditBranchModal.tsx +++ b/apps/studio/components/interfaces/BranchManagement/EditBranchModal.tsx @@ -1,27 +1,16 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useDebounce } from '@uidotdev/usehooks' +import { useParams } from 'common' import { Check, Github, Loader2 } from 'lucide-react' import Image from 'next/image' import { useRouter } from 'next/router' import { useCallback, useEffect, useState } from 'react' import { useForm, useWatch } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' - -import { InlineLink } from '@/components/ui/InlineLink' -import { useParams } from 'common' -import { useIsBranching2Enabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' -import { AlertError } from 'components/ui/AlertError' -import { useBranchUpdateMutation } from 'data/branches/branch-update-mutation' -import { Branch, useBranchesQuery } from 'data/branches/branches-query' -import { useCheckGithubBranchValidity } from 'data/integrations/github-branch-check-query' -import { useGitHubConnectionsQuery } from 'data/integrations/github-connections-query' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { BASE_PATH } from 'lib/constants' import { Badge, Button, + cn, Dialog, DialogContent, DialogFooter, @@ -29,15 +18,26 @@ import { DialogSection, DialogSectionSeparator, DialogTitle, + Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, - Form_Shadcn_, Input_Shadcn_, Label_Shadcn_ as Label, - cn, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' +import * as z from 'zod' + +import { useIsBranching2Enabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import { AlertError } from '@/components/ui/AlertError' +import { InlineLink } from '@/components/ui/InlineLink' +import { useBranchUpdateMutation } from '@/data/branches/branch-update-mutation' +import { Branch, useBranchesQuery } from '@/data/branches/branches-query' +import { useCheckGithubBranchValidity } from '@/data/integrations/github-branch-check-query' +import { useGitHubConnectionsQuery } from '@/data/integrations/github-connections-query' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { BASE_PATH } from '@/lib/constants' interface EditBranchModalProps { branch?: Branch diff --git a/apps/studio/components/interfaces/BranchManagement/EmptyStates.tsx b/apps/studio/components/interfaces/BranchManagement/EmptyStates.tsx index 460fa46748..79394c1858 100644 --- a/apps/studio/components/interfaces/BranchManagement/EmptyStates.tsx +++ b/apps/studio/components/interfaces/BranchManagement/EmptyStates.tsx @@ -1,12 +1,12 @@ -import type { Branch } from 'data/branches/branches-query' import { Github } from 'lucide-react' import Link from 'next/link' -import { BranchSelector } from './BranchSelector' - -import { DocsButton } from 'components/ui/DocsButton' -import { DOCS_URL } from 'lib/constants' import { Button } from 'ui' +import { BranchSelector } from './BranchSelector' +import { DocsButton } from '@/components/ui/DocsButton' +import type { Branch } from '@/data/branches/branches-query' +import { DOCS_URL } from '@/lib/constants' + const EMPTY_STATE_CONTAINER = 'flex items-center flex-col gap-0.5 justify-center w-full py-10 px-4' export const PullRequestsEmptyState = ({ diff --git a/apps/studio/components/interfaces/BranchManagement/OutOfDateNotice.tsx b/apps/studio/components/interfaces/BranchManagement/OutOfDateNotice.tsx index 717875cf34..6b36cb48d3 100644 --- a/apps/studio/components/interfaces/BranchManagement/OutOfDateNotice.tsx +++ b/apps/studio/components/interfaces/BranchManagement/OutOfDateNotice.tsx @@ -1,6 +1,3 @@ -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { GitBranchIcon } from 'lucide-react' import { useState } from 'react' import { @@ -17,6 +14,10 @@ import { } from 'ui' import { Admonition } from 'ui-patterns' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' + interface OutOfDateNoticeProps { isBranchOutOfDateMigrations: boolean missingMigrationsCount: number diff --git a/apps/studio/components/interfaces/BranchManagement/Overview.tsx b/apps/studio/components/interfaces/BranchManagement/Overview.tsx index 4202e209fb..fe43b556e1 100644 --- a/apps/studio/components/interfaces/BranchManagement/Overview.tsx +++ b/apps/studio/components/interfaces/BranchManagement/Overview.tsx @@ -1,5 +1,6 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useQueryClient } from '@tanstack/react-query' +import { useParams } from 'common' import { partition } from 'lodash' import { Clock, @@ -14,21 +15,6 @@ import { import Link from 'next/link' import { useState } from 'react' import { toast } from 'sonner' - -import { useParams } from 'common' -import { useIsBranching2Enabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' -import { DropdownMenuItemTooltip } from 'components/ui/DropdownMenuItemTooltip' -import { TextConfirmModal } from 'components/ui/TextConfirmModalWrapper' -import { useBranchQuery } from 'data/branches/branch-query' -import { useBranchResetMutation } from 'data/branches/branch-reset-mutation' -import { useBranchRestoreMutation } from 'data/branches/branch-restore-mutation' -import { useBranchUpdateMutation } from 'data/branches/branch-update-mutation' -import type { Branch } from 'data/branches/branches-query' -import { branchKeys } from 'data/branches/keys' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { IS_PLATFORM } from 'lib/constants' import { Button, DropdownMenu, @@ -38,9 +24,23 @@ import { DropdownMenuTrigger, } from 'ui' import { ConfirmationModal } from 'ui-patterns/Dialogs/ConfirmationModal' + import { BranchLoader, BranchManagementSection, BranchRow, BranchRowLoader } from './BranchPanels' import { EditBranchModal } from './EditBranchModal' import { PreviewBranchesEmptyState } from './EmptyStates' +import { useIsBranching2Enabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import { DropdownMenuItemTooltip } from '@/components/ui/DropdownMenuItemTooltip' +import { TextConfirmModal } from '@/components/ui/TextConfirmModalWrapper' +import { useBranchQuery } from '@/data/branches/branch-query' +import { useBranchResetMutation } from '@/data/branches/branch-reset-mutation' +import { useBranchRestoreMutation } from '@/data/branches/branch-restore-mutation' +import { useBranchUpdateMutation } from '@/data/branches/branch-update-mutation' +import type { Branch } from '@/data/branches/branches-query' +import { branchKeys } from '@/data/branches/keys' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { IS_PLATFORM } from '@/lib/constants' interface OverviewProps { isGithubConnected: boolean diff --git a/apps/studio/components/interfaces/BranchManagement/ReviewRow.tsx b/apps/studio/components/interfaces/BranchManagement/ReviewRow.tsx index 5dc02d0e0c..c1354b5630 100644 --- a/apps/studio/components/interfaces/BranchManagement/ReviewRow.tsx +++ b/apps/studio/components/interfaces/BranchManagement/ReviewRow.tsx @@ -1,11 +1,7 @@ +import { useQueryClient } from '@tanstack/react-query' import dayjs from 'dayjs' import { MoreVertical, X } from 'lucide-react' import { useRouter } from 'next/router' - -import { useQueryClient } from '@tanstack/react-query' -import { useBranchUpdateMutation } from 'data/branches/branch-update-mutation' -import type { Branch } from 'data/branches/branches-query' -import { branchKeys } from 'data/branches/keys' import { toast } from 'sonner' import { Button, @@ -15,6 +11,10 @@ import { DropdownMenuTrigger, } from 'ui' +import { useBranchUpdateMutation } from '@/data/branches/branch-update-mutation' +import type { Branch } from '@/data/branches/branches-query' +import { branchKeys } from '@/data/branches/keys' + interface ReviewRowProps { branch: Branch } diff --git a/apps/studio/components/interfaces/BranchManagement/ReviewWithAI.tsx b/apps/studio/components/interfaces/BranchManagement/ReviewWithAI.tsx index 1d2204ad7a..3e5fcf3c9d 100644 --- a/apps/studio/components/interfaces/BranchManagement/ReviewWithAI.tsx +++ b/apps/studio/components/interfaces/BranchManagement/ReviewWithAI.tsx @@ -1,15 +1,16 @@ -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { Branch } from 'data/branches/branches-query' -import { useProjectDetailQuery } from 'data/projects/project-detail-query' -import { useTablesQuery } from 'data/tables/tables-query' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { tablesToSQL } from 'lib/helpers' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { AiIconAnimation } from 'ui' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { Branch } from '@/data/branches/branches-query' +import { useProjectDetailQuery } from '@/data/projects/project-detail-query' +import { useTablesQuery } from '@/data/tables/tables-query' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { tablesToSQL } from '@/lib/helpers' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' + interface ReviewWithAIProps { currentBranch?: Branch mainBranch?: Branch diff --git a/apps/studio/components/interfaces/BranchManagement/WorkflowLogs.tsx b/apps/studio/components/interfaces/BranchManagement/WorkflowLogs.tsx index 4db9cbaaee..4bc4a4e8f2 100644 --- a/apps/studio/components/interfaces/BranchManagement/WorkflowLogs.tsx +++ b/apps/studio/components/interfaces/BranchManagement/WorkflowLogs.tsx @@ -1,12 +1,3 @@ -import AlertError from 'components/ui/AlertError' -import { ActionRunData } from 'data/actions/action-detail-query' -import { useActionRunLogsQuery } from 'data/actions/action-logs-query' -import { - useActionsQuery, - type ActionRunStep, - type ActionStatus, -} from 'data/actions/action-runs-query' -import type { Branch } from 'data/branches/branches-query' import dayjs from 'dayjs' import { groupBy } from 'lodash' import { ArrowLeft, ArrowRight } from 'lucide-react' @@ -28,6 +19,15 @@ import { GenericSkeletonLoader, TimestampInfo } from 'ui-patterns' import { ActionStatusBadge, ActionStatusBadgeCondensed, STATUS_TO_LABEL } from './ActionStatusBadge' import BranchStatusBadge from './BranchStatusBadge' +import AlertError from '@/components/ui/AlertError' +import { ActionRunData } from '@/data/actions/action-detail-query' +import { useActionRunLogsQuery } from '@/data/actions/action-logs-query' +import { + useActionsQuery, + type ActionRunStep, + type ActionStatus, +} from '@/data/actions/action-runs-query' +import type { Branch } from '@/data/branches/branches-query' interface WorkflowLogsProps { branch: Branch diff --git a/apps/studio/components/interfaces/BranchManagement/WorkflowLogsCard.tsx b/apps/studio/components/interfaces/BranchManagement/WorkflowLogsCard.tsx index f587009de0..42d0ab4dc4 100644 --- a/apps/studio/components/interfaces/BranchManagement/WorkflowLogsCard.tsx +++ b/apps/studio/components/interfaces/BranchManagement/WorkflowLogsCard.tsx @@ -1,9 +1,9 @@ import { motion } from 'framer-motion' import { CircleDotDashed, GitMerge, X } from 'lucide-react' import { useEffect, useRef } from 'react' +import { Button, Card, CardContent, CardHeader, CardTitle } from 'ui' import { ActionRun } from '@/data/actions/action-detail-query' -import { Button, Card, CardContent, CardHeader, CardTitle } from 'ui' interface WorkflowLogsCardProps { workflowRun: ActionRun | null | undefined diff --git a/apps/studio/components/interfaces/Connect/ApiKeysTabContent.tsx b/apps/studio/components/interfaces/Connect/ApiKeysTabContent.tsx index 78232db1ca..da2b24c230 100644 --- a/apps/studio/components/interfaces/Connect/ApiKeysTabContent.tsx +++ b/apps/studio/components/interfaces/Connect/ApiKeysTabContent.tsx @@ -1,6 +1,5 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { AlertCircle, ExternalLink, Loader2 } from 'lucide-react' import Link from 'next/link' import type { ReactNode } from 'react' @@ -8,6 +7,7 @@ import { Button } from 'ui' import { Input } from 'ui-patterns/DataInputs/Input' import type { projectKeys } from './Connect.types' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' function KeyRow({ label, value }: { label: ReactNode; value: string }) { return ( diff --git a/apps/studio/components/interfaces/Connect/Connect.constants.ts b/apps/studio/components/interfaces/Connect/Connect.constants.ts index 805a157699..07854fdfb1 100644 --- a/apps/studio/components/interfaces/Connect/Connect.constants.ts +++ b/apps/studio/components/interfaces/Connect/Connect.constants.ts @@ -1,6 +1,7 @@ -import { DOCS_URL } from 'lib/constants' import { type CodeBlockLang } from 'ui-patterns/CodeBlock' +import { DOCS_URL } from '@/lib/constants' + export type DatabaseConnectionType = | 'uri' | 'psql' diff --git a/apps/studio/components/interfaces/Connect/ConnectDropdown.tsx b/apps/studio/components/interfaces/Connect/ConnectDropdown.tsx index b6816ec03d..9833262055 100644 --- a/apps/studio/components/interfaces/Connect/ConnectDropdown.tsx +++ b/apps/studio/components/interfaces/Connect/ConnectDropdown.tsx @@ -1,19 +1,19 @@ import { Box, Check, ChevronDown } from 'lucide-react' import { useState } from 'react' - import { Button, + cn, + Command_Shadcn_, CommandEmpty_Shadcn_, CommandGroup_Shadcn_, CommandInput_Shadcn_, CommandItem_Shadcn_, CommandList_Shadcn_, - Command_Shadcn_, + Popover_Shadcn_, PopoverContent_Shadcn_, PopoverTrigger_Shadcn_, - Popover_Shadcn_, - cn, } from 'ui' + import { ConnectionType } from './Connect.constants' import { ConnectionIcon } from './ConnectionIcon' diff --git a/apps/studio/components/interfaces/Connect/ConnectTabs.tsx b/apps/studio/components/interfaces/Connect/ConnectTabs.tsx index 849894ddae..791851c3b8 100644 --- a/apps/studio/components/interfaces/Connect/ConnectTabs.tsx +++ b/apps/studio/components/interfaces/Connect/ConnectTabs.tsx @@ -1,6 +1,5 @@ import { FileJson2 } from 'lucide-react' import { isValidElement, ReactNode } from 'react' - import { Tabs_Shadcn_, TabsContent_Shadcn_, TabsList_Shadcn_, TabsTrigger_Shadcn_ } from 'ui' interface ConnectTabTriggerProps { diff --git a/apps/studio/components/interfaces/Connect/ConnectionIcon.tsx b/apps/studio/components/interfaces/Connect/ConnectionIcon.tsx index b2de0e2079..cd8376a3f8 100644 --- a/apps/studio/components/interfaces/Connect/ConnectionIcon.tsx +++ b/apps/studio/components/interfaces/Connect/ConnectionIcon.tsx @@ -1,9 +1,9 @@ import { useTheme } from 'next-themes' import Image from 'next/image' - -import { BASE_PATH } from 'lib/constants' import { cn } from 'ui' +import { BASE_PATH } from '@/lib/constants' + interface ConnectionIconProps { icon: string iconFolder?: string diff --git a/apps/studio/components/interfaces/Connect/ConnectionPanel.tsx b/apps/studio/components/interfaces/Connect/ConnectionPanel.tsx index b5b8876227..d3cae172e1 100644 --- a/apps/studio/components/interfaces/Connect/ConnectionPanel.tsx +++ b/apps/studio/components/interfaces/Connect/ConnectionPanel.tsx @@ -1,10 +1,7 @@ import { useParams } from 'common' -import { useSupavisorConfigurationQuery } from 'data/database/supavisor-configuration-query' -import { IS_PLATFORM } from 'lib/constants' import { ChevronRight, FileCode, X } from 'lucide-react' import Link from 'next/link' import { PropsWithChildren, ReactNode } from 'react' -import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' import { Badge, Button, @@ -18,6 +15,9 @@ import { Admonition } from 'ui-patterns/admonition' import { CodeBlock, type CodeBlockLang } from 'ui-patterns/CodeBlock' import { ConnectionParameters } from './ConnectionParameters' +import { useSupavisorConfigurationQuery } from '@/data/database/supavisor-configuration-query' +import { IS_PLATFORM } from '@/lib/constants' +import { useDatabaseSelectorStateSnapshot } from '@/state/database-selector' interface ConnectionPanelProps { type?: 'direct' | 'transaction' | 'session' diff --git a/apps/studio/components/interfaces/Connect/ConnectionParameters.tsx b/apps/studio/components/interfaces/Connect/ConnectionParameters.tsx index 8edc2c3335..2b4752d839 100644 --- a/apps/studio/components/interfaces/Connect/ConnectionParameters.tsx +++ b/apps/studio/components/interfaces/Connect/ConnectionParameters.tsx @@ -1,6 +1,5 @@ import { Check, ChevronRight, Copy } from 'lucide-react' import { useState } from 'react' - import { Button, cn, diff --git a/apps/studio/components/interfaces/Connect/DatabaseConnectionString.tsx b/apps/studio/components/interfaces/Connect/DatabaseConnectionString.tsx index 6826787a0c..cc0c3fc0c5 100644 --- a/apps/studio/components/interfaces/Connect/DatabaseConnectionString.tsx +++ b/apps/studio/components/interfaces/Connect/DatabaseConnectionString.tsx @@ -1,21 +1,7 @@ import { useParams } from 'common' -import { getAddons } from 'components/interfaces/Billing/Subscription/Subscription.utils' -import AlertError from 'components/ui/AlertError' -import { DatabaseSelector } from 'components/ui/DatabaseSelector' -import { InlineLink } from 'components/ui/InlineLink' -import { usePgbouncerConfigQuery } from 'data/database/pgbouncer-config-query' -import { useSupavisorConfigurationQuery } from 'data/database/supavisor-configuration-query' -import { useReadReplicasQuery } from 'data/read-replicas/replicas-query' -import { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { DOCS_URL, IS_PLATFORM } from 'lib/constants' -import { pluckObjectFields } from 'lib/helpers' import { BookOpen, ChevronDown, ExternalLink } from 'lucide-react' import { parseAsString, useQueryState } from 'nuqs' import { HTMLAttributes, ReactNode, useEffect, useState } from 'react' -import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' import { Badge, Button, @@ -46,6 +32,20 @@ import { import { CodeBlockFileHeader, ConnectionPanel } from './ConnectionPanel' import { getConnectionStrings } from './DatabaseSettings.utils' import { examples, type Example } from './DirectConnectionExamples' +import { getAddons } from '@/components/interfaces/Billing/Subscription/Subscription.utils' +import AlertError from '@/components/ui/AlertError' +import { DatabaseSelector } from '@/components/ui/DatabaseSelector' +import { InlineLink } from '@/components/ui/InlineLink' +import { usePgbouncerConfigQuery } from '@/data/database/pgbouncer-config-query' +import { useSupavisorConfigurationQuery } from '@/data/database/supavisor-configuration-query' +import { useReadReplicasQuery } from '@/data/read-replicas/replicas-query' +import { useProjectAddonsQuery } from '@/data/subscriptions/project-addons-query' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { DOCS_URL, IS_PLATFORM } from '@/lib/constants' +import { pluckObjectFields } from '@/lib/helpers' +import { useDatabaseSelectorStateSnapshot } from '@/state/database-selector' const StepLabel = ({ number, diff --git a/apps/studio/components/interfaces/Connect/McpTabContent.tsx b/apps/studio/components/interfaces/Connect/McpTabContent.tsx index f5b0fdd28e..7f6bf6cd97 100644 --- a/apps/studio/components/interfaces/Connect/McpTabContent.tsx +++ b/apps/studio/components/interfaces/Connect/McpTabContent.tsx @@ -1,11 +1,12 @@ import { IS_PLATFORM, useParams } from 'common' -import Panel from 'components/ui/Panel' -import { useTrack } from 'lib/telemetry/track' import { useTheme } from 'next-themes' import { useMemo, useState } from 'react' import { createMcpCopyHandler, McpConfigPanel, type McpClient } from 'ui-patterns/McpUrlBuilder' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' + import type { projectKeys } from './Connect.types' +import Panel from '@/components/ui/Panel' +import { useTrack } from '@/lib/telemetry/track' export const McpTabContent = ({ projectKeys }: { projectKeys: projectKeys }) => { const { ref: projectRef } = useParams() diff --git a/apps/studio/components/interfaces/Connect/content/swift/supabaseswift/content.tsx b/apps/studio/components/interfaces/Connect/content/swift/supabaseswift/content.tsx index 9b0746d409..2fd5bf18cf 100644 --- a/apps/studio/components/interfaces/Connect/content/swift/supabaseswift/content.tsx +++ b/apps/studio/components/interfaces/Connect/content/swift/supabaseswift/content.tsx @@ -1,6 +1,6 @@ -import type { ContentFileProps } from 'components/interfaces/Connect/Connect.types' import { SimpleCodeBlock } from 'ui-patterns/SimpleCodeBlock' +import type { ContentFileProps } from '@/components/interfaces/Connect/Connect.types' import { ConnectTabContent, ConnectTabs, diff --git a/apps/studio/components/interfaces/ConnectButton/Connect.Commands.tsx b/apps/studio/components/interfaces/ConnectButton/Connect.Commands.tsx index 68617ab348..2364a4a2de 100644 --- a/apps/studio/components/interfaces/ConnectButton/Connect.Commands.tsx +++ b/apps/studio/components/interfaces/ConnectButton/Connect.Commands.tsx @@ -1,12 +1,13 @@ -import { COMMAND_MENU_SECTIONS } from 'components/interfaces/App/CommandMenu/CommandMenu.utils' -import { orderCommandSectionsByPriority } from 'components/interfaces/App/CommandMenu/ordering' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { PROJECT_STATUS } from 'lib/constants' import { Plug } from 'lucide-react' import { parseAsBoolean, parseAsString, useQueryState } from 'nuqs' import type { ICommand } from 'ui-patterns/CommandMenu' import { useRegisterCommands, useSetCommandMenuOpen } from 'ui-patterns/CommandMenu' +import { COMMAND_MENU_SECTIONS } from '@/components/interfaces/App/CommandMenu/CommandMenu.utils' +import { orderCommandSectionsByPriority } from '@/components/interfaces/App/CommandMenu/ordering' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { PROJECT_STATUS } from '@/lib/constants' + export function useConnectCommands() { const setIsOpen = useSetCommandMenuOpen() const { data: selectedProject } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/ConnectButton/ConnectButton.tsx b/apps/studio/components/interfaces/ConnectButton/ConnectButton.tsx index 1a4390c4ca..baa8260000 100644 --- a/apps/studio/components/interfaces/ConnectButton/ConnectButton.tsx +++ b/apps/studio/components/interfaces/ConnectButton/ConnectButton.tsx @@ -1,10 +1,10 @@ -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Plug } from 'lucide-react' import { parseAsBoolean, useQueryState } from 'nuqs' import { ComponentProps } from 'react' import { Button, cn } from 'ui' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' import { PROJECT_STATUS } from '@/lib/constants' import { useAppStateSnapshot } from '@/state/app-state' diff --git a/apps/studio/components/interfaces/ConnectSheet/Connect.constants.ts b/apps/studio/components/interfaces/ConnectSheet/Connect.constants.ts index 3ba4d4c723..b1f9f1a6d5 100644 --- a/apps/studio/components/interfaces/ConnectSheet/Connect.constants.ts +++ b/apps/studio/components/interfaces/ConnectSheet/Connect.constants.ts @@ -1,6 +1,7 @@ -import { DOCS_URL } from 'lib/constants' import { type CodeBlockLang } from 'ui-patterns/CodeBlock' +import { DOCS_URL } from '@/lib/constants' + export type DatabaseConnectionType = | 'uri' | 'psql' diff --git a/apps/studio/components/interfaces/ConnectSheet/Connect.utils.test.ts b/apps/studio/components/interfaces/ConnectSheet/Connect.utils.test.ts index 62d0477437..8e67cec143 100644 --- a/apps/studio/components/interfaces/ConnectSheet/Connect.utils.test.ts +++ b/apps/studio/components/interfaces/ConnectSheet/Connect.utils.test.ts @@ -1,4 +1,5 @@ -import { describe, test, expect } from 'vitest' +import { describe, expect, test } from 'vitest' + import { resolveFrameworkLibraryKey } from './Connect.utils' describe('Connect.utils:resolveFrameworkLibraryKey', () => { diff --git a/apps/studio/components/interfaces/ConnectSheet/ConnectSheet.tsx b/apps/studio/components/interfaces/ConnectSheet/ConnectSheet.tsx index 790a38f21d..16844bd955 100644 --- a/apps/studio/components/interfaces/ConnectSheet/ConnectSheet.tsx +++ b/apps/studio/components/interfaces/ConnectSheet/ConnectSheet.tsx @@ -1,8 +1,5 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { getKeys, useAPIKeysQuery } from 'data/api-keys/api-keys-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useTrack } from 'lib/telemetry/track' import { parseAsBoolean, parseAsString, useQueryState } from 'nuqs' import { useEffect, useMemo, useRef } from 'react' import { cn, Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from 'ui' @@ -13,7 +10,10 @@ import { ConnectConfigSection, ModeSelector } from './ConnectConfigSection' import { ConnectStepsSection } from './ConnectStepsSection' import { useAvailableConnectModes } from './useAvailableConnectModes' import { useConnectState } from './useConnectState' +import { getKeys, useAPIKeysQuery } from '@/data/api-keys/api-keys-query' import { useProjectApiUrl } from '@/data/config/project-endpoint-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useTrack } from '@/lib/telemetry/track' import { useAppStateSnapshot } from '@/state/app-state' function isConnectMode(value: string): value is ConnectMode { diff --git a/apps/studio/components/interfaces/ConnectSheet/ConnectStepsSection.tsx b/apps/studio/components/interfaces/ConnectSheet/ConnectStepsSection.tsx index 74493dd8d4..d084a13134 100644 --- a/apps/studio/components/interfaces/ConnectSheet/ConnectStepsSection.tsx +++ b/apps/studio/components/interfaces/ConnectSheet/ConnectStepsSection.tsx @@ -1,11 +1,4 @@ import { useParams } from 'common' -import { getAddons } from 'components/interfaces/Billing/Subscription/Subscription.utils' -import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' -import { usePgbouncerConfigQuery } from 'data/database/pgbouncer-config-query' -import { useSupavisorConfigurationQuery } from 'data/database/supavisor-configuration-query' -import { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { pluckObjectFields } from 'lib/helpers' import dynamic from 'next/dynamic' import { useMemo, useRef } from 'react' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' @@ -20,6 +13,13 @@ import type { import { ConnectSheetStep } from './ConnectSheetStep' import { CopyPromptAdmonition } from './CopyPromptAdmonition' import { getConnectionStrings } from './DatabaseSettings.utils' +import { getAddons } from '@/components/interfaces/Billing/Subscription/Subscription.utils' +import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' +import { usePgbouncerConfigQuery } from '@/data/database/pgbouncer-config-query' +import { useSupavisorConfigurationQuery } from '@/data/database/supavisor-configuration-query' +import { useProjectAddonsQuery } from '@/data/subscriptions/project-addons-query' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { pluckObjectFields } from '@/lib/helpers' interface ConnectStepsSectionProps { steps: ResolvedStep[] diff --git a/apps/studio/components/interfaces/ConnectSheet/ConnectionIcon.tsx b/apps/studio/components/interfaces/ConnectSheet/ConnectionIcon.tsx index 9bb52a94a8..bfa878ef5c 100644 --- a/apps/studio/components/interfaces/ConnectSheet/ConnectionIcon.tsx +++ b/apps/studio/components/interfaces/ConnectSheet/ConnectionIcon.tsx @@ -1,7 +1,8 @@ -import { BASE_PATH } from 'lib/constants' import { useTheme } from 'next-themes' import Image from 'next/image' +import { BASE_PATH } from '@/lib/constants' + interface ConnectionIconProps { icon: string iconFolder?: string diff --git a/apps/studio/components/interfaces/ConnectSheet/ConnectionString.utils.ts b/apps/studio/components/interfaces/ConnectSheet/ConnectionString.utils.ts index bc24971ad0..07d0771825 100644 --- a/apps/studio/components/interfaces/ConnectSheet/ConnectionString.utils.ts +++ b/apps/studio/components/interfaces/ConnectSheet/ConnectionString.utils.ts @@ -1,5 +1,5 @@ -import type { ConnectionStringPooler } from './Connect.types' import type { ConnectionStringMethod } from './Connect.constants' +import type { ConnectionStringPooler } from './Connect.types' export const DEFAULT_PORT = '5432' export const PASSWORD_PLACEHOLDER = '[YOUR-PASSWORD]' diff --git a/apps/studio/components/interfaces/ConnectSheet/CopyPromptAdmonition.tsx b/apps/studio/components/interfaces/ConnectSheet/CopyPromptAdmonition.tsx index 1ced61a03b..ab704a4729 100644 --- a/apps/studio/components/interfaces/ConnectSheet/CopyPromptAdmonition.tsx +++ b/apps/studio/components/interfaces/ConnectSheet/CopyPromptAdmonition.tsx @@ -1,9 +1,9 @@ -import { BASE_PATH } from 'lib/constants' import { type RefObject } from 'react' import { Badge } from 'ui' import { Admonition } from 'ui-patterns/admonition' import CopyButton from '@/components/ui/CopyButton' +import { BASE_PATH } from '@/lib/constants' interface CopyPromptAdmonitionProps { stepsContainerRef: RefObject diff --git a/apps/studio/components/interfaces/ConnectSheet/FrameworkSelector.tsx b/apps/studio/components/interfaces/ConnectSheet/FrameworkSelector.tsx index 2892cf6906..ffac00de4d 100644 --- a/apps/studio/components/interfaces/ConnectSheet/FrameworkSelector.tsx +++ b/apps/studio/components/interfaces/ConnectSheet/FrameworkSelector.tsx @@ -2,16 +2,16 @@ import { Box, Check, ChevronDown } from 'lucide-react' import { useState } from 'react' import { Button, + cn, + Command_Shadcn_, CommandEmpty_Shadcn_, CommandGroup_Shadcn_, CommandInput_Shadcn_, CommandItem_Shadcn_, CommandList_Shadcn_, - Command_Shadcn_, + Popover_Shadcn_, PopoverContent_Shadcn_, PopoverTrigger_Shadcn_, - Popover_Shadcn_, - cn, } from 'ui' import { ConnectionType } from '@/components/interfaces/ConnectSheet/Connect.constants' diff --git a/apps/studio/components/interfaces/ConnectSheet/content/prisma/content.tsx b/apps/studio/components/interfaces/ConnectSheet/content/prisma/content.tsx index 9ff6346fe5..5dfe5b7f60 100644 --- a/apps/studio/components/interfaces/ConnectSheet/content/prisma/content.tsx +++ b/apps/studio/components/interfaces/ConnectSheet/content/prisma/content.tsx @@ -1,7 +1,7 @@ -import { IS_PLATFORM } from 'lib/constants' import { MultipleCodeBlock } from 'ui-patterns/MultipleCodeBlock' import type { StepContentProps } from '@/components/interfaces/ConnectSheet/Connect.types' +import { IS_PLATFORM } from '@/lib/constants' const ContentFile = ({ connectionStringPooler }: StepContentProps) => { const files = [ diff --git a/apps/studio/components/interfaces/ConnectSheet/content/steps/direct-connection/content.tsx b/apps/studio/components/interfaces/ConnectSheet/content/steps/direct-connection/content.tsx index 62c9fa7c42..d2683ba6bc 100644 --- a/apps/studio/components/interfaces/ConnectSheet/content/steps/direct-connection/content.tsx +++ b/apps/studio/components/interfaces/ConnectSheet/content/steps/direct-connection/content.tsx @@ -12,7 +12,6 @@ import { } from '@/components/interfaces/ConnectSheet/Connect.constants' import type { StepContentProps } from '@/components/interfaces/ConnectSheet/Connect.types' import { ConnectionParameters } from '@/components/interfaces/ConnectSheet/ConnectionParameters' -import { useTrack } from 'lib/telemetry/track' import { buildConnectionParameters, buildSafeConnectionString, @@ -26,6 +25,7 @@ import { useReadReplicasQuery } from '@/data/read-replicas/replicas-query' import { useProjectAddonsQuery } from '@/data/subscriptions/project-addons-query' import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' import { pluckObjectFields } from '@/lib/helpers' +import { useTrack } from '@/lib/telemetry/track' const buildPsqlCommand = (params: { host: string; port: string; database: string; user: string }) => `psql -h ${params.host} -p ${params.port} -d ${params.database} -U ${params.user}` diff --git a/apps/studio/components/interfaces/ConnectSheet/content/steps/mcp/cursor/content.tsx b/apps/studio/components/interfaces/ConnectSheet/content/steps/mcp/cursor/content.tsx index b3f74f7c71..ac196cbcb8 100644 --- a/apps/studio/components/interfaces/ConnectSheet/content/steps/mcp/cursor/content.tsx +++ b/apps/studio/components/interfaces/ConnectSheet/content/steps/mcp/cursor/content.tsx @@ -1,6 +1,4 @@ import { useParams } from 'common' -import { IS_PLATFORM } from 'lib/constants' -import { useTrack } from 'lib/telemetry/track' import { useMemo } from 'react' import { createMcpCopyHandler, @@ -13,6 +11,8 @@ import { import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import type { StepContentProps } from '@/components/interfaces/ConnectSheet/Connect.types' +import { IS_PLATFORM } from '@/lib/constants' +import { useTrack } from '@/lib/telemetry/track' function McpCursorContent({ state, projectKeys }: StepContentProps) { const { ref: projectRef } = useParams() diff --git a/apps/studio/components/interfaces/ConnectSheet/useAvailableConnectModes.ts b/apps/studio/components/interfaces/ConnectSheet/useAvailableConnectModes.ts index 0e241e87b5..7eabf493de 100644 --- a/apps/studio/components/interfaces/ConnectSheet/useAvailableConnectModes.ts +++ b/apps/studio/components/interfaces/ConnectSheet/useAvailableConnectModes.ts @@ -1,6 +1,7 @@ -import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' import { useMemo } from 'react' + import type { ConnectMode } from './Connect.types' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' export function useAvailableConnectModes(): ConnectMode[] { const { diff --git a/apps/studio/components/interfaces/ConnectSheet/useMcpUrl.ts b/apps/studio/components/interfaces/ConnectSheet/useMcpUrl.ts index 221b58563c..ddb1037996 100644 --- a/apps/studio/components/interfaces/ConnectSheet/useMcpUrl.ts +++ b/apps/studio/components/interfaces/ConnectSheet/useMcpUrl.ts @@ -1,5 +1,4 @@ import { useParams } from 'common' -import { IS_PLATFORM } from 'lib/constants' import { useMemo } from 'react' import { FEATURE_GROUPS_NON_PLATFORM, @@ -8,6 +7,7 @@ import { } from 'ui-patterns/McpUrlBuilder' import { StepContentProps } from './Connect.types' +import { IS_PLATFORM } from '@/lib/constants' export function useMcpUrl( state: StepContentProps['state'], diff --git a/apps/studio/components/interfaces/Database/Backups/BackupItem.tsx b/apps/studio/components/interfaces/Database/Backups/BackupItem.tsx index 07c80f5337..3c47b0468d 100644 --- a/apps/studio/components/interfaces/Database/Backups/BackupItem.tsx +++ b/apps/studio/components/interfaces/Database/Backups/BackupItem.tsx @@ -1,15 +1,15 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' -import { Download } from 'lucide-react' - import { useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { InlineLink } from 'components/ui/InlineLink' -import { useBackupDownloadMutation } from 'data/database/backup-download-mutation' -import type { DatabaseBackup } from 'data/database/backups-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' +import { Download } from 'lucide-react' import { Badge, Tooltip, TooltipContent, TooltipTrigger } from 'ui' import { TimestampInfo } from 'ui-patterns' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { InlineLink } from '@/components/ui/InlineLink' +import { useBackupDownloadMutation } from '@/data/database/backup-download-mutation' +import type { DatabaseBackup } from '@/data/database/backups-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' + interface BackupItemProps { index: number isHealthy: boolean diff --git a/apps/studio/components/interfaces/Database/Backups/BackupsEmpty.tsx b/apps/studio/components/interfaces/Database/Backups/BackupsEmpty.tsx index 12bbcc53be..941f6120b7 100644 --- a/apps/studio/components/interfaces/Database/Backups/BackupsEmpty.tsx +++ b/apps/studio/components/interfaces/Database/Backups/BackupsEmpty.tsx @@ -1,5 +1,4 @@ import { DatabaseBackup } from 'lucide-react' - import { EmptyStatePresentational } from 'ui-patterns' export const BackupsEmpty = () => { diff --git a/apps/studio/components/interfaces/Database/Backups/BackupsList.tsx b/apps/studio/components/interfaces/Database/Backups/BackupsList.tsx index 95c564b742..0cd0e0a1e0 100644 --- a/apps/studio/components/interfaces/Database/Backups/BackupsList.tsx +++ b/apps/studio/components/interfaces/Database/Backups/BackupsList.tsx @@ -1,24 +1,24 @@ import { useParams } from 'common' -import Panel from 'components/ui/Panel' -import { UpgradeToPro } from 'components/ui/UpgradeToPro' -import { useBackupRestoreMutation } from 'data/database/backup-restore-mutation' -import { DatabaseBackup, useBackupsQuery } from 'data/database/backups-query' -import { useSetProjectStatus } from 'data/projects/project-detail-query' import dayjs from 'dayjs' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { PROJECT_STATUS } from 'lib/constants' import { Clock } from 'lucide-react' import { useRouter } from 'next/router' import { useState } from 'react' import { toast } from 'sonner' import { TimestampInfo } from 'ui-patterns' -import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { Admonition } from 'ui-patterns/admonition' +import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { BackupItem } from './BackupItem' import { BackupsEmpty } from './BackupsEmpty' import { BackupsStorageAlert } from './BackupsStorageAlert' +import Panel from '@/components/ui/Panel' +import { UpgradeToPro } from '@/components/ui/UpgradeToPro' +import { useBackupRestoreMutation } from '@/data/database/backup-restore-mutation' +import { DatabaseBackup, useBackupsQuery } from '@/data/database/backups-query' +import { useSetProjectStatus } from '@/data/projects/project-detail-query' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { PROJECT_STATUS } from '@/lib/constants' export const BackupsList = () => { const router = useRouter() diff --git a/apps/studio/components/interfaces/Database/Backups/DatabaseBackupsNav.tsx b/apps/studio/components/interfaces/Database/Backups/DatabaseBackupsNav.tsx index b4fe4b3fcc..dee242222e 100644 --- a/apps/studio/components/interfaces/Database/Backups/DatabaseBackupsNav.tsx +++ b/apps/studio/components/interfaces/Database/Backups/DatabaseBackupsNav.tsx @@ -1,9 +1,9 @@ import Link from 'next/link' - -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Badge, NavMenu, NavMenuItem } from 'ui' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' + type Props = { active: 'pitr' | 'scheduled' | 'rtnp' } diff --git a/apps/studio/components/interfaces/Database/Backups/PITR/PITR.utils.ts b/apps/studio/components/interfaces/Database/Backups/PITR/PITR.utils.ts index c4dc7bafd0..d47e74d077 100644 --- a/apps/studio/components/interfaces/Database/Backups/PITR/PITR.utils.ts +++ b/apps/studio/components/interfaces/Database/Backups/PITR/PITR.utils.ts @@ -1,8 +1,9 @@ import dayjs from 'dayjs' -import { guessLocalTimezone } from 'lib/dayjs' + import { ALL_TIMEZONES } from './PITR.constants' import type { Time } from './PITR.types' -import type { ProjectSelectedAddon } from 'data/subscriptions/types' +import type { ProjectSelectedAddon } from '@/data/subscriptions/types' +import { guessLocalTimezone } from '@/lib/dayjs' export const getPITRRetentionDuration = (addons: ProjectSelectedAddon[]) => { const pitrAddon = addons.find((addon) => addon.type === 'pitr') diff --git a/apps/studio/components/interfaces/Database/Backups/PITR/PITRForm.tsx b/apps/studio/components/interfaces/Database/Backups/PITR/PITRForm.tsx index 4168c4c80a..477ab6af96 100644 --- a/apps/studio/components/interfaces/Database/Backups/PITR/PITRForm.tsx +++ b/apps/studio/components/interfaces/Database/Backups/PITR/PITRForm.tsx @@ -1,11 +1,8 @@ import dayjs from 'dayjs' import { HelpCircle } from 'lucide-react' import { useMemo, useState } from 'react' - -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { FormPanel } from 'components/ui/Forms/FormPanel' -import InformationBox from 'components/ui/InformationBox' import { Calendar, cn } from 'ui' + import { Timezone } from './PITR.types' import { constrainDateToRange, @@ -15,6 +12,9 @@ import { } from './PITR.utils' import TimeInput from './TimeInput' import { TimezoneSelection } from './TimezoneSelection' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { FormPanel } from '@/components/ui/Forms/FormPanel' +import InformationBox from '@/components/ui/InformationBox' type Props = { onSubmit: (data: { diff --git a/apps/studio/components/interfaces/Database/Backups/PITR/PITRNotice.tsx b/apps/studio/components/interfaces/Database/Backups/PITR/PITRNotice.tsx index 3231a0e098..788d64d7ae 100644 --- a/apps/studio/components/interfaces/Database/Backups/PITR/PITRNotice.tsx +++ b/apps/studio/components/interfaces/Database/Backups/PITR/PITRNotice.tsx @@ -1,13 +1,13 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { Calendar } from 'lucide-react' import Link from 'next/link' -import { useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { FormPanel } from 'components/ui/Forms/FormPanel' -import { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { getPITRRetentionDuration } from './PITR.utils' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { FormPanel } from '@/components/ui/Forms/FormPanel' +import { useProjectAddonsQuery } from '@/data/subscriptions/project-addons-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' export const PITRNotice = () => { const { ref: projectRef } = useParams() diff --git a/apps/studio/components/interfaces/Database/Backups/PITR/PITRSelection.tsx b/apps/studio/components/interfaces/Database/Backups/PITR/PITRSelection.tsx index ab8638b2ad..a7a9230a55 100644 --- a/apps/studio/components/interfaces/Database/Backups/PITR/PITRSelection.tsx +++ b/apps/studio/components/interfaces/Database/Backups/PITR/PITRSelection.tsx @@ -1,28 +1,28 @@ +import { useParams } from 'common' import Link from 'next/link' import { useRouter } from 'next/router' import { useState } from 'react' - -import { useParams } from 'common' -import { FormHeader } from 'components/ui/Forms/FormHeader' -import { useBackupsQuery } from 'data/database/backups-query' -import { usePitrRestoreMutation } from 'data/database/pitr-restore-mutation' -import { useSetProjectStatus } from 'data/projects/project-detail-query' -import { useReadReplicasQuery } from 'data/read-replicas/replicas-query' -import { PROJECT_STATUS } from 'lib/constants' import { + Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, - Alert_Shadcn_, Button, Modal, WarningIcon, } from 'ui' + import { BackupsEmpty } from '../BackupsEmpty' import { BackupsStorageAlert } from '../BackupsStorageAlert' import type { Timezone } from './PITR.types' import { getClientTimezone } from './PITR.utils' import { PITRForm } from './PITRForm' import PITRStatus from './PITRStatus' +import { FormHeader } from '@/components/ui/Forms/FormHeader' +import { useBackupsQuery } from '@/data/database/backups-query' +import { usePitrRestoreMutation } from '@/data/database/pitr-restore-mutation' +import { useSetProjectStatus } from '@/data/projects/project-detail-query' +import { useReadReplicasQuery } from '@/data/read-replicas/replicas-query' +import { PROJECT_STATUS } from '@/lib/constants' export const PITRSelection = () => { const router = useRouter() diff --git a/apps/studio/components/interfaces/Database/Backups/PITR/PITRStatus.tsx b/apps/studio/components/interfaces/Database/Backups/PITR/PITRStatus.tsx index 763ede84c0..a6372f6633 100644 --- a/apps/studio/components/interfaces/Database/Backups/PITR/PITRStatus.tsx +++ b/apps/studio/components/interfaces/Database/Backups/PITR/PITRStatus.tsx @@ -3,13 +3,13 @@ import { useParams } from 'common' import dayjs from 'dayjs' import { AlertCircle } from 'lucide-react' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { FormPanel } from 'components/ui/Forms/FormPanel' -import { useBackupsQuery } from 'data/database/backups-query' -import { useReadReplicasQuery } from 'data/read-replicas/replicas-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import type { Timezone } from './PITR.types' import { TimezoneSelection } from './TimezoneSelection' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { FormPanel } from '@/components/ui/Forms/FormPanel' +import { useBackupsQuery } from '@/data/database/backups-query' +import { useReadReplicasQuery } from '@/data/read-replicas/replicas-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' interface PITRStatusProps { selectedTimezone: Timezone diff --git a/apps/studio/components/interfaces/Database/Backups/PITR/TimeInput.tsx b/apps/studio/components/interfaces/Database/Backups/PITR/TimeInput.tsx index e43aa3c2d9..5d96bc211e 100644 --- a/apps/studio/components/interfaces/Database/Backups/PITR/TimeInput.tsx +++ b/apps/studio/components/interfaces/Database/Backups/PITR/TimeInput.tsx @@ -2,8 +2,8 @@ import dayjs from 'dayjs' import { isNaN, noop } from 'lodash' import { Clock } from 'lucide-react' import { ChangeEvent, useEffect, useState } from 'react' - import { Tooltip, TooltipContent, TooltipTrigger } from 'ui' + import type { Time } from './PITR.types' import { formatNumberToTwoDigits, formatTimeToTimeString } from './PITR.utils' diff --git a/apps/studio/components/interfaces/Database/Backups/RestoreToNewProject/BackupsList.tsx b/apps/studio/components/interfaces/Database/Backups/RestoreToNewProject/BackupsList.tsx index b99a4c2e36..4fadd518cb 100644 --- a/apps/studio/components/interfaces/Database/Backups/RestoreToNewProject/BackupsList.tsx +++ b/apps/studio/components/interfaces/Database/Backups/RestoreToNewProject/BackupsList.tsx @@ -1,9 +1,10 @@ -import Panel from 'components/ui/Panel' -import { useCloneBackupsQuery } from 'data/projects/clone-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Badge, Button } from 'ui' import { TimestampInfo } from 'ui-patterns' + import { BackupsEmpty } from '../BackupsEmpty' +import Panel from '@/components/ui/Panel' +import { useCloneBackupsQuery } from '@/data/projects/clone-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface BackupsListProps { onSelectRestore: (id: number) => void diff --git a/apps/studio/components/interfaces/Database/Backups/RestoreToNewProject/ConfirmRestoreDialog.tsx b/apps/studio/components/interfaces/Database/Backups/RestoreToNewProject/ConfirmRestoreDialog.tsx index ddeaf156a5..ad1501457b 100644 --- a/apps/studio/components/interfaces/Database/Backups/RestoreToNewProject/ConfirmRestoreDialog.tsx +++ b/apps/studio/components/interfaces/Database/Backups/RestoreToNewProject/ConfirmRestoreDialog.tsx @@ -1,5 +1,3 @@ -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Button, Dialog, @@ -10,8 +8,11 @@ import { DialogSection, DialogTitle, } from 'ui' + import { AdditionalMonthlySpend } from './AdditionalMonthlySpend' import { NewProjectPrice } from './RestoreToNewProject.utils' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface ConfirmRestoreDialogProps { open: boolean diff --git a/apps/studio/components/interfaces/Database/Backups/RestoreToNewProject/CreateNewProjectDialog.tsx b/apps/studio/components/interfaces/Database/Backups/RestoreToNewProject/CreateNewProjectDialog.tsx index b93a387c38..71a86456b5 100644 --- a/apps/studio/components/interfaces/Database/Backups/RestoreToNewProject/CreateNewProjectDialog.tsx +++ b/apps/studio/components/interfaces/Database/Backups/RestoreToNewProject/CreateNewProjectDialog.tsx @@ -2,14 +2,6 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' - -import { PasswordStrengthBar } from 'components/ui/PasswordStrengthBar' -import { useProjectCloneMutation } from 'data/projects/clone-mutation' -import { useCloneBackupsQuery } from 'data/projects/clone-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { passwordStrength, PasswordStrengthScore } from 'lib/password-strength' -import { generateStrongPassword } from 'lib/project' import { Button, Dialog, @@ -26,8 +18,16 @@ import { Input_Shadcn_, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import { z } from 'zod' + import { AdditionalMonthlySpend } from './AdditionalMonthlySpend' import { NewProjectPrice } from './RestoreToNewProject.utils' +import { PasswordStrengthBar } from '@/components/ui/PasswordStrengthBar' +import { useProjectCloneMutation } from '@/data/projects/clone-mutation' +import { useCloneBackupsQuery } from '@/data/projects/clone-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { passwordStrength, PasswordStrengthScore } from '@/lib/password-strength' +import { generateStrongPassword } from '@/lib/project' interface CreateNewProjectDialogProps { open: boolean diff --git a/apps/studio/components/interfaces/Database/Backups/RestoreToNewProject/RestoreToNewProject.utils.ts b/apps/studio/components/interfaces/Database/Backups/RestoreToNewProject/RestoreToNewProject.utils.ts index 04fc434812..a27a42288e 100644 --- a/apps/studio/components/interfaces/Database/Backups/RestoreToNewProject/RestoreToNewProject.utils.ts +++ b/apps/studio/components/interfaces/Database/Backups/RestoreToNewProject/RestoreToNewProject.utils.ts @@ -1,11 +1,11 @@ -import { InfraInstanceSize } from 'components/interfaces/DiskManagement/DiskManagement.types' +import { InfraInstanceSize } from '@/components/interfaces/DiskManagement/DiskManagement.types' import { calculateComputeSizePrice, calculateDiskSizePrice, -} from 'components/interfaces/DiskManagement/DiskManagement.utils' -import { DiskType } from 'components/interfaces/DiskManagement/ui/DiskManagement.constants' -import { instanceSizeSpecs } from 'data/projects/new-project.constants' -import { PlanId } from 'data/subscriptions/types' +} from '@/components/interfaces/DiskManagement/DiskManagement.utils' +import { DiskType } from '@/components/interfaces/DiskManagement/ui/DiskManagement.constants' +import { instanceSizeSpecs } from '@/data/projects/new-project.constants' +import { PlanId } from '@/data/subscriptions/types' /** * @description diff --git a/apps/studio/components/interfaces/Database/EnumeratedTypes/CreateEnumeratedTypeSidePanel.tsx b/apps/studio/components/interfaces/Database/EnumeratedTypes/CreateEnumeratedTypeSidePanel.tsx index b830d3caea..1a45bc9718 100644 --- a/apps/studio/components/interfaces/Database/EnumeratedTypes/CreateEnumeratedTypeSidePanel.tsx +++ b/apps/studio/components/interfaces/Database/EnumeratedTypes/CreateEnumeratedTypeSidePanel.tsx @@ -5,28 +5,28 @@ import { useEffect, useRef } from 'react' import { DragDropContext, Droppable, DroppableProvided } from 'react-beautiful-dnd' import { useFieldArray, useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' - -import { useEnumeratedTypeCreateMutation } from 'data/enumerated-types/enumerated-type-create-mutation' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { + Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, - Alert_Shadcn_, Button, + cn, + Form_Shadcn_, FormControl_Shadcn_, FormDescription_Shadcn_, FormField_Shadcn_, FormItem_Shadcn_, FormLabel_Shadcn_, FormMessage_Shadcn_, - Form_Shadcn_, Input_Shadcn_, SidePanel, - cn, } from 'ui' -import EnumeratedTypeValueRow from './EnumeratedTypeValueRow' +import * as z from 'zod' + import { NATIVE_POSTGRES_TYPES } from './EnumeratedTypes.constants' +import EnumeratedTypeValueRow from './EnumeratedTypeValueRow' +import { useEnumeratedTypeCreateMutation } from '@/data/enumerated-types/enumerated-type-create-mutation' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface CreateEnumeratedTypeSidePanelProps { visible: boolean diff --git a/apps/studio/components/interfaces/Database/EnumeratedTypes/EditEnumeratedTypeSidePanel.tsx b/apps/studio/components/interfaces/Database/EnumeratedTypes/EditEnumeratedTypeSidePanel.tsx index d307fbfcb2..ebc768dec0 100644 --- a/apps/studio/components/interfaces/Database/EnumeratedTypes/EditEnumeratedTypeSidePanel.tsx +++ b/apps/studio/components/interfaces/Database/EnumeratedTypes/EditEnumeratedTypeSidePanel.tsx @@ -5,28 +5,28 @@ import { useEffect, useRef } from 'react' import { DragDropContext, Droppable, DroppableProvided } from 'react-beautiful-dnd' import { useFieldArray, useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' - -import { useEnumeratedTypeUpdateMutation } from 'data/enumerated-types/enumerated-type-update-mutation' -import type { EnumeratedType } from 'data/enumerated-types/enumerated-types-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { + Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, - Alert_Shadcn_, Button, + cn, + Form_Shadcn_, FormControl_Shadcn_, FormDescription_Shadcn_, FormField_Shadcn_, FormItem_Shadcn_, FormLabel_Shadcn_, FormMessage_Shadcn_, - Form_Shadcn_, Input_Shadcn_, SidePanel, - cn, } from 'ui' +import * as z from 'zod' + import EnumeratedTypeValueRow from './EnumeratedTypeValueRow' +import { useEnumeratedTypeUpdateMutation } from '@/data/enumerated-types/enumerated-type-update-mutation' +import type { EnumeratedType } from '@/data/enumerated-types/enumerated-types-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface EditEnumeratedTypeSidePanelProps { visible: boolean diff --git a/apps/studio/components/interfaces/Database/EnumeratedTypes/EnumeratedTypes.constants.ts b/apps/studio/components/interfaces/Database/EnumeratedTypes/EnumeratedTypes.constants.ts index 766bd65b18..bffc83affc 100644 --- a/apps/studio/components/interfaces/Database/EnumeratedTypes/EnumeratedTypes.constants.ts +++ b/apps/studio/components/interfaces/Database/EnumeratedTypes/EnumeratedTypes.constants.ts @@ -9,9 +9,9 @@ import { NUMERICAL_TYPES, OTHER_DATA_TYPES, TEXT_TYPES, - TIMESTAMP_TYPES, TIME_TYPES, -} from 'components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.constants' + TIMESTAMP_TYPES, +} from '@/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.constants' export const NATIVE_POSTGRES_TYPES = [ ...NUMERICAL_TYPES, diff --git a/apps/studio/components/interfaces/Database/EnumeratedTypes/EnumeratedTypes.tsx b/apps/studio/components/interfaces/Database/EnumeratedTypes/EnumeratedTypes.tsx index 4b9acd5660..419b4b7a77 100644 --- a/apps/studio/components/interfaces/Database/EnumeratedTypes/EnumeratedTypes.tsx +++ b/apps/studio/components/interfaces/Database/EnumeratedTypes/EnumeratedTypes.tsx @@ -1,10 +1,3 @@ -import AlertError from 'components/ui/AlertError' -import { DocsButton } from 'components/ui/DocsButton' -import SchemaSelector from 'components/ui/SchemaSelector' -import { useEnumeratedTypesQuery } from 'data/enumerated-types/enumerated-types-query' -import { useQuerySchemaState } from 'hooks/misc/useSchemaQueryState' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useIsProtectedSchema } from 'hooks/useProtectedSchemas' import { Edit, MoreVertical, Search, Trash } from 'lucide-react' import { parseAsBoolean, parseAsString, useQueryState } from 'nuqs' import { useEffect, useState } from 'react' @@ -30,7 +23,14 @@ import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { ProtectedSchemaWarning } from '../ProtectedSchemaWarning' import CreateEnumeratedTypeSidePanel from './CreateEnumeratedTypeSidePanel' import EditEnumeratedTypeSidePanel from './EditEnumeratedTypeSidePanel' +import AlertError from '@/components/ui/AlertError' +import { DocsButton } from '@/components/ui/DocsButton' +import SchemaSelector from '@/components/ui/SchemaSelector' 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' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useIsProtectedSchema } from '@/hooks/useProtectedSchemas' export const EnumeratedTypes = () => { const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Database/Extensions/EnableExtensionModal.tsx b/apps/studio/components/interfaces/Database/Extensions/EnableExtensionModal.tsx index af3a5bb586..344dc5dd76 100644 --- a/apps/studio/components/interfaces/Database/Extensions/EnableExtensionModal.tsx +++ b/apps/studio/components/interfaces/Database/Extensions/EnableExtensionModal.tsx @@ -1,11 +1,5 @@ import { zodResolver } from '@hookform/resolvers/zod' import type { PostgresExtension } from '@supabase/postgres-meta' -import { DocsButton } from 'components/ui/DocsButton' -import { useDatabaseExtensionEnableMutation } from 'data/database-extensions/database-extension-enable-mutation' -import { useSchemasQuery } from 'data/database/schemas-query' -import { useIsOrioleDb, useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useProtectedSchemas } from 'hooks/useProtectedSchemas' -import { DOCS_URL } from 'lib/constants' import { useForm } from 'react-hook-form' import { toast } from 'sonner' import { @@ -18,24 +12,30 @@ import { DialogSection, DialogSectionSeparator, DialogTitle, + Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, - Form_Shadcn_, Input_Shadcn_, + Select_Shadcn_, SelectContent_Shadcn_, SelectItem_Shadcn_, SelectSeparator_Shadcn_, SelectTrigger_Shadcn_, SelectValue_Shadcn_, - Select_Shadcn_, } from 'ui' import { Admonition } from 'ui-patterns' -import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import * as z from 'zod' import { extensionsWithRecommendedSchemas } from './Extensions.constants' +import { DocsButton } from '@/components/ui/DocsButton' +import { useDatabaseExtensionEnableMutation } from '@/data/database-extensions/database-extension-enable-mutation' import { useDatabaseExtensionDefaultSchemaQuery } from '@/data/database-extensions/database-extension-schema-query' +import { useSchemasQuery } from '@/data/database/schemas-query' +import { useIsOrioleDb, useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useProtectedSchemas } from '@/hooks/useProtectedSchemas' +import { DOCS_URL } from '@/lib/constants' const orioleExtCallOuts = ['vector', 'postgis'] diff --git a/apps/studio/components/interfaces/Database/Extensions/ExtensionRow.tsx b/apps/studio/components/interfaces/Database/Extensions/ExtensionRow.tsx index 1dcff8f5b3..1806a8dda2 100644 --- a/apps/studio/components/interfaces/Database/Extensions/ExtensionRow.tsx +++ b/apps/studio/components/interfaces/Database/Extensions/ExtensionRow.tsx @@ -1,10 +1,4 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useDatabaseExtensionDisableMutation } from 'data/database-extensions/database-extension-disable-mutation' -import { DatabaseExtension } from 'data/database-extensions/database-extensions-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useIsOrioleDb, useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import { AlertTriangle, Book, Github, Loader2 } from 'lucide-react' import Link from 'next/link' import { useState } from 'react' @@ -16,6 +10,12 @@ import { ConfirmationModal } from 'ui-patterns/Dialogs/ConfirmationModal' import { EnableExtensionModal } from './EnableExtensionModal' import { EXTENSION_DISABLE_WARNINGS } from './Extensions.constants' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useDatabaseExtensionDisableMutation } from '@/data/database-extensions/database-extension-disable-mutation' +import { DatabaseExtension } from '@/data/database-extensions/database-extensions-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useIsOrioleDb, useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' interface ExtensionRowProps { extension: DatabaseExtension diff --git a/apps/studio/components/interfaces/Database/Extensions/Extensions.tsx b/apps/studio/components/interfaces/Database/Extensions/Extensions.tsx index 0a11a6573e..df988fa0d5 100644 --- a/apps/studio/components/interfaces/Database/Extensions/Extensions.tsx +++ b/apps/studio/components/interfaces/Database/Extensions/Extensions.tsx @@ -1,14 +1,8 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { isNull, partition } from 'lodash' import { AlertCircle, Search } from 'lucide-react' import { useEffect, useState } from 'react' - -import { useParams } from 'common' -import InformationBox from 'components/ui/InformationBox' -import { NoSearchResults } from 'components/ui/NoSearchResults' -import { useDatabaseExtensionsQuery } from 'data/database-extensions/database-extensions-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Card, Input, @@ -21,8 +15,14 @@ import { TableRow, } from 'ui' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' + import { ExtensionRow } from './ExtensionRow' import { HIDDEN_EXTENSIONS, SEARCH_TERMS } from './Extensions.constants' +import InformationBox from '@/components/ui/InformationBox' +import { NoSearchResults } from '@/components/ui/NoSearchResults' +import { useDatabaseExtensionsQuery } from '@/data/database-extensions/database-extensions-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export const Extensions = () => { const { filter } = useParams() diff --git a/apps/studio/components/interfaces/Database/Functions/CreateFunction/CreateFunctionConfigParamsSection.test.tsx b/apps/studio/components/interfaces/Database/Functions/CreateFunction/CreateFunctionConfigParamsSection.test.tsx index f8cb0f439f..c5870c13ab 100644 --- a/apps/studio/components/interfaces/Database/Functions/CreateFunction/CreateFunctionConfigParamsSection.test.tsx +++ b/apps/studio/components/interfaces/Database/Functions/CreateFunction/CreateFunctionConfigParamsSection.test.tsx @@ -1,9 +1,8 @@ import { render, screen } from '@testing-library/react' import userEvent from '@testing-library/user-event' import { useForm } from 'react-hook-form' -import { describe, expect, it } from 'vitest' - import { Form_Shadcn_ } from 'ui' +import { describe, expect, it } from 'vitest' import { CreateFunctionConfigParamsSection } from './CreateFunctionConfigParamsSection' diff --git a/apps/studio/components/interfaces/Database/Functions/CreateFunction/CreateFunctionHeader.tsx b/apps/studio/components/interfaces/Database/Functions/CreateFunction/CreateFunctionHeader.tsx index 4e5083d531..e63633b2d2 100644 --- a/apps/studio/components/interfaces/Database/Functions/CreateFunction/CreateFunctionHeader.tsx +++ b/apps/studio/components/interfaces/Database/Functions/CreateFunction/CreateFunctionHeader.tsx @@ -1,6 +1,5 @@ import { X } from 'lucide-react' - -import { SheetClose, SheetHeader, SheetTitle, cn } from 'ui' +import { cn, SheetClose, SheetHeader, SheetTitle } from 'ui' interface CreateFunctionHeaderProps { selectedFunction?: string diff --git a/apps/studio/components/interfaces/Database/Functions/CreateFunction/FunctionEditor.tsx b/apps/studio/components/interfaces/Database/Functions/CreateFunction/FunctionEditor.tsx index 3eb7081c07..1963ff4305 100644 --- a/apps/studio/components/interfaces/Database/Functions/CreateFunction/FunctionEditor.tsx +++ b/apps/studio/components/interfaces/Database/Functions/CreateFunction/FunctionEditor.tsx @@ -1,7 +1,7 @@ import { Maximize2, Minimize2 } from 'lucide-react' +import { Button, cn, FormControl_Shadcn_, Tooltip, TooltipContent, TooltipTrigger } from 'ui' -import CodeEditor from 'components/ui/CodeEditor/CodeEditor' -import { Button, FormControl_Shadcn_, Tooltip, TooltipContent, TooltipTrigger, cn } from 'ui' +import CodeEditor from '@/components/ui/CodeEditor/CodeEditor' export const FunctionEditor = ({ field, diff --git a/apps/studio/components/interfaces/Database/Functions/CreateFunction/index.tsx b/apps/studio/components/interfaces/Database/Functions/CreateFunction/index.tsx index 47cb97a11b..11c9daec8f 100644 --- a/apps/studio/components/interfaces/Database/Functions/CreateFunction/index.tsx +++ b/apps/studio/components/interfaces/Database/Functions/CreateFunction/index.tsx @@ -4,49 +4,49 @@ import { Plus, Trash } from 'lucide-react' import { useEffect, useMemo, useState } from 'react' import { SubmitHandler, useFieldArray, useForm } from 'react-hook-form' import { toast } from 'sonner' -import z from 'zod' - -import { POSTGRES_DATA_TYPES } from 'components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.constants' -import SchemaSelector from 'components/ui/SchemaSelector' -import { useDatabaseExtensionsQuery } from 'data/database-extensions/database-extensions-query' -import { useDatabaseFunctionCreateMutation } from 'data/database-functions/database-functions-create-mutation' -import { DatabaseFunction } from 'data/database-functions/database-functions-query' -import { useDatabaseFunctionUpdateMutation } from 'data/database-functions/database-functions-update-mutation' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useConfirmOnClose } from 'hooks/ui/useConfirmOnClose' -import { useProtectedSchemas } from 'hooks/useProtectedSchemas' -import type { FormSchema } from 'types' import { Button, + cn, + Form_Shadcn_, FormControl_Shadcn_, FormDescription_Shadcn_, FormField_Shadcn_, FormItem_Shadcn_, FormLabel_Shadcn_, FormMessage_Shadcn_, - Form_Shadcn_, Input_Shadcn_, Radio, ScrollArea, + Select_Shadcn_, SelectContent_Shadcn_, SelectItem_Shadcn_, SelectTrigger_Shadcn_, SelectValue_Shadcn_, - Select_Shadcn_, Separator, Sheet, SheetContent, SheetFooter, SheetSection, Toggle, - cn, } from 'ui' -import { DiscardChangesConfirmationDialog } from 'components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import z from 'zod' + import { convertArgumentTypes, convertConfigParams } from '../Functions.utils' import { CreateFunctionConfigParamsSection } from './CreateFunctionConfigParamsSection' import { CreateFunctionHeader } from './CreateFunctionHeader' import { FunctionEditor } from './FunctionEditor' +import { POSTGRES_DATA_TYPES } from '@/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.constants' +import { DiscardChangesConfirmationDialog } from '@/components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' +import SchemaSelector from '@/components/ui/SchemaSelector' +import { useDatabaseExtensionsQuery } from '@/data/database-extensions/database-extensions-query' +import { useDatabaseFunctionCreateMutation } from '@/data/database-functions/database-functions-create-mutation' +import { DatabaseFunction } from '@/data/database-functions/database-functions-query' +import { useDatabaseFunctionUpdateMutation } from '@/data/database-functions/database-functions-update-mutation' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useConfirmOnClose } from '@/hooks/ui/useConfirmOnClose' +import { useProtectedSchemas } from '@/hooks/useProtectedSchemas' +import type { FormSchema } from '@/types' const FORM_ID = 'create-function-sidepanel' diff --git a/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionList.tsx b/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionList.tsx index 36e09378bd..b87f264ae4 100644 --- a/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionList.tsx +++ b/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionList.tsx @@ -3,13 +3,6 @@ import { includes, noop, sortBy } from 'lodash' import { Copy, Edit, Edit2, FileText, MoreVertical, Trash } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' - -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { Button, DropdownMenu, @@ -20,7 +13,14 @@ import { TableCell, TableRow, } from 'ui' -import type { DatabaseFunction } from 'data/database-functions/database-functions-query' + +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import type { DatabaseFunction } from '@/data/database-functions/database-functions-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' interface FunctionListProps { schema: string diff --git a/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionsList.tsx b/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionsList.tsx index 236dcd7bb2..9a14939b4c 100644 --- a/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionsList.tsx +++ b/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionsList.tsx @@ -1,39 +1,39 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { useIsInlineEditorEnabled } from 'components/interfaces/Account/Preferences/InlineEditorSettings' -import { CreateFunction } from 'components/interfaces/Database/Functions/CreateFunction' -import { - ReportsSelectFilter, - selectFilterSchema, -} from 'components/interfaces/Reports/v2/ReportsSelectFilter' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import ProductEmptyState from 'components/to-be-cleaned/ProductEmptyState' -import AlertError from 'components/ui/AlertError' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import SchemaSelector from 'components/ui/SchemaSelector' -import { useDatabaseFunctionDeleteMutation } from 'data/database-functions/database-functions-delete-mutation' -import type { DatabaseFunction } from 'data/database-functions/database-functions-query' -import { useDatabaseFunctionsQuery } from 'data/database-functions/database-functions-query' -import { useSchemasQuery } from 'data/database/schemas-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useQuerySchemaState } from 'hooks/misc/useSchemaQueryState' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useIsProtectedSchema } from 'hooks/useProtectedSchemas' import { Search } from 'lucide-react' import { useRouter } from 'next/router' import { parseAsBoolean, parseAsJson, parseAsString, useQueryState } from 'nuqs' import { useEffect } from 'react' import { toast } from 'sonner' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { useEditorPanelStateSnapshot } from 'state/editor-panel-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { AiIconAnimation, Card, Table, TableBody, TableHead, TableHeader, TableRow } from 'ui' import { Input } from 'ui-patterns/DataInputs/Input' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { ProtectedSchemaWarning } from '../../ProtectedSchemaWarning' import FunctionList from './FunctionList' +import { useIsInlineEditorEnabled } from '@/components/interfaces/Account/Preferences/InlineEditorSettings' +import { CreateFunction } from '@/components/interfaces/Database/Functions/CreateFunction' +import { + ReportsSelectFilter, + selectFilterSchema, +} from '@/components/interfaces/Reports/v2/ReportsSelectFilter' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import ProductEmptyState from '@/components/to-be-cleaned/ProductEmptyState' +import AlertError from '@/components/ui/AlertError' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import SchemaSelector from '@/components/ui/SchemaSelector' import { TextConfirmModal } from '@/components/ui/TextConfirmModalWrapper' +import { useDatabaseFunctionDeleteMutation } from '@/data/database-functions/database-functions-delete-mutation' +import type { DatabaseFunction } from '@/data/database-functions/database-functions-query' +import { useDatabaseFunctionsQuery } from '@/data/database-functions/database-functions-query' +import { useSchemasQuery } from '@/data/database/schemas-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useQuerySchemaState } from '@/hooks/misc/useSchemaQueryState' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useIsProtectedSchema } from '@/hooks/useProtectedSchemas' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useEditorPanelStateSnapshot } from '@/state/editor-panel-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' const createFunctionSnippet = `create function function_name() returns void diff --git a/apps/studio/components/interfaces/Database/Hooks/DeleteHookModal.tsx b/apps/studio/components/interfaces/Database/Hooks/DeleteHookModal.tsx index 8c8b0832a1..14d7ef3705 100644 --- a/apps/studio/components/interfaces/Database/Hooks/DeleteHookModal.tsx +++ b/apps/studio/components/interfaces/Database/Hooks/DeleteHookModal.tsx @@ -1,11 +1,11 @@ -import { TextConfirmModal } from 'components/ui/TextConfirmModalWrapper' -import { useDatabaseTriggerDeleteMutation } from 'data/database-triggers/database-trigger-delete-mutation' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { parseAsString, useQueryState } from 'nuqs' import { useEffect } from 'react' import { toast } from 'sonner' +import { TextConfirmModal } from '@/components/ui/TextConfirmModalWrapper' +import { useDatabaseTriggerDeleteMutation } from '@/data/database-triggers/database-trigger-delete-mutation' import { useDatabaseHooksQuery } from '@/data/database-triggers/database-triggers-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export const DeleteHookModal = () => { const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Database/Hooks/HTTPHeaders.tsx b/apps/studio/components/interfaces/Database/Hooks/HTTPHeaders.tsx index 84e3da18fd..ed901d5e38 100644 --- a/apps/studio/components/interfaces/Database/Hooks/HTTPHeaders.tsx +++ b/apps/studio/components/interfaces/Database/Hooks/HTTPHeaders.tsx @@ -5,12 +5,12 @@ import { useWatch_Shadcn_ } from 'ui' import { KeyValueFieldArray } from 'ui-patterns/form/KeyValueFieldArray/KeyValueFieldArray' import { WebhookFormValues } from './EditHookPanel.constants' +import { buildEdgeFunctionHeaderAddActions } from '@/components/interfaces/Functions/httpHeaderAddActions' import { FormSection, FormSectionContent, FormSectionLabel, } from '@/components/ui/Forms/FormSection' -import { buildEdgeFunctionHeaderAddActions } from '@/components/interfaces/Functions/httpHeaderAddActions' import { getKeys, useAPIKeysQuery } from '@/data/api-keys/api-keys-query' import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' import { uuidv4 } from '@/lib/helpers' diff --git a/apps/studio/components/interfaces/Database/Hooks/HTTPParameters.test.tsx b/apps/studio/components/interfaces/Database/Hooks/HTTPParameters.test.tsx index a6f15d6659..845ac2945f 100644 --- a/apps/studio/components/interfaces/Database/Hooks/HTTPParameters.test.tsx +++ b/apps/studio/components/interfaces/Database/Hooks/HTTPParameters.test.tsx @@ -1,9 +1,8 @@ import { render, screen } from '@testing-library/react' import userEvent from '@testing-library/user-event' import { useForm } from 'react-hook-form' -import { describe, expect, it } from 'vitest' - import { Form_Shadcn_ } from 'ui' +import { describe, expect, it } from 'vitest' import { type WebhookFormValues } from './EditHookPanel.constants' import { HTTPParameters } from './HTTPParameters' diff --git a/apps/studio/components/interfaces/Database/Hooks/Hooks.constants.ts b/apps/studio/components/interfaces/Database/Hooks/Hooks.constants.ts index eef1382836..cba8c84c96 100644 --- a/apps/studio/components/interfaces/Database/Hooks/Hooks.constants.ts +++ b/apps/studio/components/interfaces/Database/Hooks/Hooks.constants.ts @@ -1,4 +1,4 @@ -import { BASE_PATH, IS_PLATFORM } from 'lib/constants' +import { BASE_PATH, IS_PLATFORM } from '@/lib/constants' export const HOOK_EVENTS = [ { diff --git a/apps/studio/components/interfaces/Database/Hooks/HooksList/HookList.tsx b/apps/studio/components/interfaces/Database/Hooks/HooksList/HookList.tsx index 2b261fb2da..88cd734c64 100644 --- a/apps/studio/components/interfaces/Database/Hooks/HooksList/HookList.tsx +++ b/apps/studio/components/interfaces/Database/Hooks/HooksList/HookList.tsx @@ -1,11 +1,5 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import Table from 'components/to-be-cleaned/Table' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useDatabaseHooksQuery } from 'data/database-triggers/database-triggers-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { BASE_PATH } from 'lib/constants' import { includes } from 'lodash' import { Edit3, MoreVertical, Trash } from 'lucide-react' import Image from 'next/legacy/image' @@ -20,6 +14,13 @@ import { DropdownMenuTrigger, } from 'ui' +import Table from '@/components/to-be-cleaned/Table' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useDatabaseHooksQuery } from '@/data/database-triggers/database-triggers-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { BASE_PATH } from '@/lib/constants' + export interface HookListProps { schema: string filterString: string diff --git a/apps/studio/components/interfaces/Database/Hooks/HooksList/HooksList.tsx b/apps/studio/components/interfaces/Database/Hooks/HooksList/HooksList.tsx index 5c230a8a26..0642ca1ee9 100644 --- a/apps/studio/components/interfaces/Database/Hooks/HooksList/HooksList.tsx +++ b/apps/studio/components/interfaces/Database/Hooks/HooksList/HooksList.tsx @@ -1,12 +1,4 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' -import AlertError from 'components/ui/AlertError' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DocsButton } from 'components/ui/DocsButton' -import { NoSearchResults } from 'components/ui/NoSearchResults' -import { useDatabaseHooksQuery } from 'data/database-triggers/database-triggers-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import { includes, map as lodashMap, uniqBy } from 'lodash' import { Search } from 'lucide-react' import { parseAsBoolean, useQueryState } from 'nuqs' @@ -16,6 +8,14 @@ import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { HooksListEmpty } from './HooksListEmpty' import { SchemaTable } from './SchemaTable' +import AlertError from '@/components/ui/AlertError' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DocsButton } from '@/components/ui/DocsButton' +import { NoSearchResults } from '@/components/ui/NoSearchResults' +import { useDatabaseHooksQuery } from '@/data/database-triggers/database-triggers-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' export const HooksList = () => { const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Database/Hooks/HooksList/HooksListEmpty.tsx b/apps/studio/components/interfaces/Database/Hooks/HooksList/HooksListEmpty.tsx index 0aa73a04c3..95350d8284 100644 --- a/apps/studio/components/interfaces/Database/Hooks/HooksList/HooksListEmpty.tsx +++ b/apps/studio/components/interfaces/Database/Hooks/HooksList/HooksListEmpty.tsx @@ -1,4 +1,4 @@ -import Table from 'components/to-be-cleaned/Table' +import Table from '@/components/to-be-cleaned/Table' export const HooksListEmpty = () => { return ( diff --git a/apps/studio/components/interfaces/Database/Hooks/HooksList/SchemaTable.tsx b/apps/studio/components/interfaces/Database/Hooks/HooksList/SchemaTable.tsx index 871321ef27..c3dcfc6d34 100644 --- a/apps/studio/components/interfaces/Database/Hooks/HooksList/SchemaTable.tsx +++ b/apps/studio/components/interfaces/Database/Hooks/HooksList/SchemaTable.tsx @@ -1,6 +1,5 @@ -import Table from 'components/to-be-cleaned/Table' - import { HookList } from './HookList' +import Table from '@/components/to-be-cleaned/Table' interface SchemaTableProps { schema: string diff --git a/apps/studio/components/interfaces/Database/Indexes/CreateIndexSidePanel.tsx b/apps/studio/components/interfaces/Database/Indexes/CreateIndexSidePanel.tsx index b167ab4e0c..5236fe5501 100644 --- a/apps/studio/components/interfaces/Database/Indexes/CreateIndexSidePanel.tsx +++ b/apps/studio/components/interfaces/Database/Indexes/CreateIndexSidePanel.tsx @@ -1,11 +1,3 @@ -import CodeEditor from 'components/ui/CodeEditor/CodeEditor' -import { DocsButton } from 'components/ui/DocsButton' -import { useDatabaseIndexCreateMutation } from 'data/database-indexes/index-create-mutation' -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 { useIsOrioleDb, useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import { Check, ChevronsUpDown, Loader2 } from 'lucide-react' import Link from 'next/link' import { Fragment, useEffect, useMemo, useState } from 'react' @@ -37,6 +29,14 @@ import { MultiSelectV2 } from 'ui-patterns/MultiSelectDeprecated/MultiSelectV2' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { INDEX_TYPES } from './Indexes.constants' +import CodeEditor from '@/components/ui/CodeEditor/CodeEditor' +import { DocsButton } from '@/components/ui/DocsButton' +import { useDatabaseIndexCreateMutation } from '@/data/database-indexes/index-create-mutation' +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 { useIsOrioleDb, useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' interface CreateIndexSidePanelProps { visible: boolean diff --git a/apps/studio/components/interfaces/Database/Indexes/Indexes.tsx b/apps/studio/components/interfaces/Database/Indexes/Indexes.tsx index f5c36ab389..18efbf2ab8 100644 --- a/apps/studio/components/interfaces/Database/Indexes/Indexes.tsx +++ b/apps/studio/components/interfaces/Database/Indexes/Indexes.tsx @@ -1,13 +1,4 @@ import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import CodeEditor from 'components/ui/CodeEditor/CodeEditor' -import SchemaSelector from 'components/ui/SchemaSelector' -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' -import { useQuerySchemaState } from 'hooks/misc/useSchemaQueryState' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useIsProtectedSchema } from 'hooks/useProtectedSchemas' import { sortBy } from 'lodash' import { AlertCircle, Search, Trash } from 'lucide-react' import { parseAsBoolean, parseAsString, useQueryState } from 'nuqs' @@ -30,6 +21,15 @@ import { GenericSkeletonLoader, ShimmeringLoader } from 'ui-patterns/ShimmeringL import { ProtectedSchemaWarning } from '../ProtectedSchemaWarning' import { CreateIndexSidePanel } from './CreateIndexSidePanel' +import AlertError from '@/components/ui/AlertError' +import CodeEditor from '@/components/ui/CodeEditor/CodeEditor' +import SchemaSelector from '@/components/ui/SchemaSelector' +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' +import { useQuerySchemaState } from '@/hooks/misc/useSchemaQueryState' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useIsProtectedSchema } from '@/hooks/useProtectedSchemas' const Indexes = () => { const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx b/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx index d573f9a32b..8cc432d903 100644 --- a/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx +++ b/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx @@ -1,11 +1,4 @@ import { SupportCategories } from '@supabase/shared-types/out/constants' -import { SupportLink } from 'components/interfaces/Support/SupportLink' -import CodeEditor from 'components/ui/CodeEditor/CodeEditor' -import { InlineLink } from 'components/ui/InlineLink' -import { DatabaseMigration, useMigrationsQuery } from 'data/database/migrations-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' -import { parseMigrationVersion } from 'lib/migration-utils' import { Search } from 'lucide-react' import { useState } from 'react' import { @@ -28,6 +21,13 @@ import { Input } from 'ui-patterns/DataInputs/Input' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' 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 { DatabaseMigration, useMigrationsQuery } from '@/data/database/migrations-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' +import { parseMigrationVersion } from '@/lib/migration-utils' const Migrations = () => { const [search, setSearch] = useState('') diff --git a/apps/studio/components/interfaces/Database/Migrations/MigrationsEmptyState.tsx b/apps/studio/components/interfaces/Database/Migrations/MigrationsEmptyState.tsx index 5c4eda6e48..92862f0dc1 100644 --- a/apps/studio/components/interfaces/Database/Migrations/MigrationsEmptyState.tsx +++ b/apps/studio/components/interfaces/Database/Migrations/MigrationsEmptyState.tsx @@ -1,10 +1,10 @@ -import { Terminal } from 'lucide-react' - import { useParams } from 'common' -import CommandRender from 'components/interfaces/Functions/CommandRender' +import { Terminal } from 'lucide-react' import { Card, CardContent, CardHeader, CardTitle } from 'ui' import { EmptyStatePresentational } from 'ui-patterns' +import CommandRender from '@/components/interfaces/Functions/CommandRender' + export const MigrationsEmptyState = () => { const { ref } = useParams() diff --git a/apps/studio/components/interfaces/Database/Privileges/Privileges.utils.ts b/apps/studio/components/interfaces/Database/Privileges/Privileges.utils.ts index 7c0675e3ca..7bb3f0fe04 100644 --- a/apps/studio/components/interfaces/Database/Privileges/Privileges.utils.ts +++ b/apps/studio/components/interfaces/Database/Privileges/Privileges.utils.ts @@ -1,28 +1,28 @@ import { useQueryClient } from '@tanstack/react-query' import { useCallback, useState } from 'react' -import { grantColumnPrivileges } from 'data/privileges/column-privileges-grant-mutation' -import type { ColumnPrivilege } from 'data/privileges/column-privileges-query' -import { - ColumnPrivilegesRevoke, - revokeColumnPrivileges, -} from 'data/privileges/column-privileges-revoke-mutation' -import { privilegeKeys } from 'data/privileges/keys' -import { - TablePrivilegesGrant, - grantTablePrivileges, -} from 'data/privileges/table-privileges-grant-mutation' -import type { PgTablePrivileges } from 'data/privileges/table-privileges-query' -import { - TablePrivilegesRevoke, - revokeTablePrivileges, -} from 'data/privileges/table-privileges-revoke-mutation' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { ALL_PRIVILEGE_TYPES, COLUMN_PRIVILEGE_TYPES, ColumnPrivilegeType, } from './Privileges.constants' +import { grantColumnPrivileges } from '@/data/privileges/column-privileges-grant-mutation' +import type { ColumnPrivilege } from '@/data/privileges/column-privileges-query' +import { + ColumnPrivilegesRevoke, + revokeColumnPrivileges, +} from '@/data/privileges/column-privileges-revoke-mutation' +import { privilegeKeys } from '@/data/privileges/keys' +import { + grantTablePrivileges, + TablePrivilegesGrant, +} from '@/data/privileges/table-privileges-grant-mutation' +import type { PgTablePrivileges } from '@/data/privileges/table-privileges-query' +import { + revokeTablePrivileges, + TablePrivilegesRevoke, +} from '@/data/privileges/table-privileges-revoke-mutation' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export interface PrivilegeOperation { object: 'table' | 'column' diff --git a/apps/studio/components/interfaces/Database/Privileges/PrivilegesHead.tsx b/apps/studio/components/interfaces/Database/Privileges/PrivilegesHead.tsx index 85deba33f1..e2d5113f28 100644 --- a/apps/studio/components/interfaces/Database/Privileges/PrivilegesHead.tsx +++ b/apps/studio/components/interfaces/Database/Privileges/PrivilegesHead.tsx @@ -1,15 +1,15 @@ -import SchemaSelector from 'components/ui/SchemaSelector' - import { Button, + Select_Shadcn_, SelectContent_Shadcn_, SelectGroup_Shadcn_, SelectItem_Shadcn_, SelectTrigger_Shadcn_, SelectValue_Shadcn_, - Select_Shadcn_, } from 'ui' +import SchemaSelector from '@/components/ui/SchemaSelector' + export interface PrivilegesHeadProps { disabled: boolean selectedSchema: string diff --git a/apps/studio/components/interfaces/Database/Privileges/PrivilegesTable.tsx b/apps/studio/components/interfaces/Database/Privileges/PrivilegesTable.tsx index d2e72f03bc..0c2764abb9 100644 --- a/apps/studio/components/interfaces/Database/Privileges/PrivilegesTable.tsx +++ b/apps/studio/components/interfaces/Database/Privileges/PrivilegesTable.tsx @@ -1,12 +1,13 @@ -import Table from 'components/to-be-cleaned/Table' -import type { ColumnPrivilege } from 'data/privileges/column-privileges-query' import { Switch } from 'ui' + import { ALL_PRIVILEGE_TYPES, COLUMN_PRIVILEGE_TYPES, TABLE_PRIVILEGE_TYPES, } from './Privileges.constants' import { usePrivilegesState } from './Privileges.utils' +import Table from '@/components/to-be-cleaned/Table' +import type { ColumnPrivilege } from '@/data/privileges/column-privileges-query' export interface PrivilegesTableProps extends Pick< ReturnType, diff --git a/apps/studio/components/interfaces/Database/ProtectedSchemaWarning.tsx b/apps/studio/components/interfaces/Database/ProtectedSchemaWarning.tsx index a8efc3e0a8..791eac4d7a 100644 --- a/apps/studio/components/interfaces/Database/ProtectedSchemaWarning.tsx +++ b/apps/studio/components/interfaces/Database/ProtectedSchemaWarning.tsx @@ -1,5 +1,4 @@ import { useState } from 'react' - import { Button, Dialog, @@ -11,10 +10,10 @@ import { DialogTitle, DialogTrigger, } from 'ui' - -import { INTERNAL_SCHEMAS, useIsProtectedSchema } from 'hooks/useProtectedSchemas' import { Admonition } from 'ui-patterns' +import { INTERNAL_SCHEMAS, useIsProtectedSchema } from '@/hooks/useProtectedSchemas' + export const ProtectedSchemaDialog = ({ onClose }: { onClose: () => void }) => { return ( <> diff --git a/apps/studio/components/interfaces/Database/Publications/PublicationsList.tsx b/apps/studio/components/interfaces/Database/Publications/PublicationsList.tsx index ced70f2a37..9d5923dc79 100644 --- a/apps/studio/components/interfaces/Database/Publications/PublicationsList.tsx +++ b/apps/studio/components/interfaces/Database/Publications/PublicationsList.tsx @@ -1,17 +1,9 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { AlertCircle, Info, Search } from 'lucide-react' import Link from 'next/link' import { useState } from 'react' import { toast } from 'sonner' - -import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import InformationBox from 'components/ui/InformationBox' -import { NoSearchResults } from 'components/ui/NoSearchResults' -import { useDatabasePublicationsQuery } from 'data/database-publications/database-publications-query' -import { useDatabasePublicationUpdateMutation } from 'data/database-publications/database-publications-update-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Button, Card, @@ -28,7 +20,15 @@ import { } from 'ui' import { Input } from 'ui-patterns/DataInputs/Input' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' + import { PublicationSkeleton } from './PublicationSkeleton' +import AlertError from '@/components/ui/AlertError' +import InformationBox from '@/components/ui/InformationBox' +import { NoSearchResults } from '@/components/ui/NoSearchResults' +import { useDatabasePublicationsQuery } from '@/data/database-publications/database-publications-query' +import { useDatabasePublicationUpdateMutation } from '@/data/database-publications/database-publications-update-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface PublicationEvent { event: string diff --git a/apps/studio/components/interfaces/Database/Publications/PublicationsTableItem.tsx b/apps/studio/components/interfaces/Database/Publications/PublicationsTableItem.tsx index d550f90628..4c732907d9 100644 --- a/apps/studio/components/interfaces/Database/Publications/PublicationsTableItem.tsx +++ b/apps/studio/components/interfaces/Database/Publications/PublicationsTableItem.tsx @@ -2,13 +2,13 @@ import type { PostgresPublication, PostgresTable } from '@supabase/postgres-meta import { PermissionAction } from '@supabase/shared-types/out/constants' import { useState } from 'react' import { toast } from 'sonner' - -import { useDatabasePublicationUpdateMutation } from 'data/database-publications/database-publications-update-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useProtectedSchemas } from 'hooks/useProtectedSchemas' import { Badge, Switch, TableCell, TableRow, Tooltip, TooltipContent, TooltipTrigger } from 'ui' +import { useDatabasePublicationUpdateMutation } from '@/data/database-publications/database-publications-update-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useProtectedSchemas } from '@/hooks/useProtectedSchemas' + interface PublicationsTableItemProps { table: PostgresTable selectedPublication: PostgresPublication diff --git a/apps/studio/components/interfaces/Database/Publications/PublicationsTables.tsx b/apps/studio/components/interfaces/Database/Publications/PublicationsTables.tsx index 35226dcc43..8c55200cdc 100644 --- a/apps/studio/components/interfaces/Database/Publications/PublicationsTables.tsx +++ b/apps/studio/components/interfaces/Database/Publications/PublicationsTables.tsx @@ -1,20 +1,20 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { ChevronLeft, Search } from 'lucide-react' import Link from 'next/link' import { useMemo, useState } from 'react' - -import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { NoSearchResults } from 'components/ui/NoSearchResults' -import { useDatabasePublicationsQuery } from 'data/database-publications/database-publications-query' -import { useTablesQuery } from 'data/tables/tables-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Card, LogoLoader, Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from 'ui' import { Admonition } from 'ui-patterns' import { Input } from 'ui-patterns/DataInputs/Input' + import { PublicationsTableItem } from './PublicationsTableItem' +import AlertError from '@/components/ui/AlertError' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { NoSearchResults } from '@/components/ui/NoSearchResults' +import { useDatabasePublicationsQuery } from '@/data/database-publications/database-publications-query' +import { useTablesQuery } from '@/data/tables/tables-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export const PublicationsTables = () => { const { ref, id } = useParams() diff --git a/apps/studio/components/interfaces/Database/Replication/BatchRestartDialog.tsx b/apps/studio/components/interfaces/Database/Replication/BatchRestartDialog.tsx index 13a11344b1..ffc6cae2cb 100644 --- a/apps/studio/components/interfaces/Database/Replication/BatchRestartDialog.tsx +++ b/apps/studio/components/interfaces/Database/Replication/BatchRestartDialog.tsx @@ -1,9 +1,6 @@ +import { useParams } from 'common' import { useMemo } from 'react' import { toast } from 'sonner' - -import { ReplicationPipelineTableStatus } from '@/data/replication/pipeline-replication-status-query' -import { useParams } from 'common' -import { useRollbackTablesMutation } from 'data/replication/rollback-tables-mutation' import { AlertDialog, AlertDialogAction, @@ -15,6 +12,9 @@ import { AlertDialogTitle, } from 'ui' +import { ReplicationPipelineTableStatus } from '@/data/replication/pipeline-replication-status-query' +import { useRollbackTablesMutation } from '@/data/replication/rollback-tables-mutation' + interface BatchRestartDialogProps { open: boolean onOpenChange: (open: boolean) => void diff --git a/apps/studio/components/interfaces/Database/Replication/DeleteDestination.tsx b/apps/studio/components/interfaces/Database/Replication/DeleteDestination.tsx index 668de169f0..2489f40535 100644 --- a/apps/studio/components/interfaces/Database/Replication/DeleteDestination.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DeleteDestination.tsx @@ -1,4 +1,4 @@ -import { TextConfirmModal } from 'components/ui/TextConfirmModalWrapper' +import { TextConfirmModal } from '@/components/ui/TextConfirmModalWrapper' interface DeleteDestinationProps { visible: boolean diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/DestinationNameInput.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/DestinationNameInput.tsx index 2a39aaf8f6..58d4285527 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/DestinationNameInput.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/DestinationNameInput.tsx @@ -1,7 +1,7 @@ import type { UseFormReturn } from 'react-hook-form' - import { FormControl_Shadcn_, FormField_Shadcn_, Input_Shadcn_ } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' + import type { DestinationPanelSchemaType } from './DestinationForm.schema' type DestinationNameInputProps = { diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/DestinationPanelFields.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/DestinationPanelFields.tsx index 417596f7b2..72cd2b62a9 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/DestinationPanelFields.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/DestinationPanelFields.tsx @@ -1,15 +1,8 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { Eye, EyeOff, Loader2 } from 'lucide-react' import { useState } from 'react' import type { UseFormReturn } from 'react-hook-form' - -import { useParams } from 'common' -import { InlineLink } from 'components/ui/InlineLink' -import { getKeys, useAPIKeysQuery } from 'data/api-keys/api-keys-query' -import { useAnalyticsBucketsQuery } from 'data/storage/analytics-buckets-query' -import { useIcebergNamespacesQuery } from 'data/storage/iceberg-namespaces-query' -import { useStorageCredentialsQuery } from 'data/storage/s3-access-key-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { Button, FormControl_Shadcn_, @@ -27,8 +20,15 @@ import { import { Admonition } from 'ui-patterns' import { Input } from 'ui-patterns/DataInputs/Input' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' + import { CREATE_NEW_KEY, CREATE_NEW_NAMESPACE } from './DestinationForm.constants' import type { DestinationPanelSchemaType } from './DestinationForm.schema' +import { InlineLink } from '@/components/ui/InlineLink' +import { getKeys, useAPIKeysQuery } from '@/data/api-keys/api-keys-query' +import { useAnalyticsBucketsQuery } from '@/data/storage/analytics-buckets-query' +import { useIcebergNamespacesQuery } from '@/data/storage/iceberg-namespaces-query' +import { useStorageCredentialsQuery } from '@/data/storage/s3-access-key-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' export const BigQueryFields = ({ form }: { form: UseFormReturn }) => { return ( diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/NewPublicationPanel.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/NewPublicationPanel.tsx index e4e48da714..131c8e7900 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/NewPublicationPanel.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/NewPublicationPanel.tsx @@ -1,11 +1,7 @@ import { zodResolver } from '@hookform/resolvers/zod' +import { useParams } from 'common' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' - -import { useParams } from 'common' -import { useCreatePublicationMutation } from 'data/replication/publication-create-mutation' -import { useReplicationTablesQuery } from 'data/replication/tables-query' import { Button, Form_Shadcn_, @@ -22,6 +18,10 @@ import { } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { MultiSelector } from 'ui-patterns/multi-select' +import { z } from 'zod' + +import { useCreatePublicationMutation } from '@/data/replication/publication-create-mutation' +import { useReplicationTablesQuery } from '@/data/replication/tables-query' interface NewPublicationPanelProps { visible: boolean diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/PublicationSelection.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/PublicationSelection.tsx index 5f644dc2b8..173787d965 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/PublicationSelection.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/PublicationSelection.tsx @@ -1,13 +1,13 @@ +import { useParams } from 'common' import { useMemo } from 'react' import type { UseFormReturn } from 'react-hook-form' - -import { useParams } from 'common' -import { useReplicationPublicationsQuery } from 'data/replication/publications-query' import { FormControl_Shadcn_, FormField_Shadcn_ } from 'ui' import { Admonition } from 'ui-patterns' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' + import type { DestinationPanelSchemaType } from './DestinationForm.schema' import { PublicationsComboBox } from './PublicationsComboBox' +import { useReplicationPublicationsQuery } from '@/data/replication/publications-query' type PublicationSelectionProps = { form: UseFormReturn diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/PublicationsComboBox.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/PublicationsComboBox.tsx index 0dba1a4848..7eb552c55b 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/PublicationsComboBox.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/PublicationsComboBox.tsx @@ -1,8 +1,6 @@ import { Check, ChevronsUpDown, Loader2, Plus } from 'lucide-react' import { useEffect, useState } from 'react' import { ControllerRenderProps } from 'react-hook-form' - -import type { ReplicationPublication } from 'data/replication/publications-query' import { Badge, Button, @@ -20,6 +18,8 @@ import { ScrollArea, } from 'ui' +import type { ReplicationPublication } from '@/data/replication/publications-query' + interface PublicationsComboBoxProps { publications: ReplicationPublication[] isLoadingPublications: boolean diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/ValidationFailuresSection.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/ValidationFailuresSection.tsx index e3408acdba..f474ad81d6 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/ValidationFailuresSection.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/ValidationFailuresSection.tsx @@ -1,4 +1,3 @@ -import type { ValidationFailure } from 'data/replication/validate-destination-mutation' import { Accordion_Shadcn_, AccordionContent_Shadcn_, @@ -9,6 +8,8 @@ import { } from 'ui' import { Admonition } from 'ui-patterns' +import type { ValidationFailure } from '@/data/replication/validate-destination-mutation' + interface ValidationFailuresSectionProps { destinationFailures: ValidationFailure[] pipelineFailures: ValidationFailure[] diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/index.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/index.tsx index 3e0c87901e..58dc3f7c87 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/index.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/index.tsx @@ -1,37 +1,11 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { CreateAnalyticsBucketSheet } from 'components/interfaces/Storage/AnalyticsBuckets/CreateAnalyticsBucketSheet' -import { getKeys, useAPIKeysQuery } from 'data/api-keys/api-keys-query' -import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' -import { - BatchConfig, - useCreateDestinationPipelineMutation, -} from 'data/replication/create-destination-pipeline-mutation' -import { useReplicationDestinationByIdQuery } from 'data/replication/destination-by-id-query' -import { useReplicationPipelineByIdQuery } from 'data/replication/pipeline-by-id-query' -import { useReplicationPublicationsQuery } from 'data/replication/publications-query' -import { useRestartPipelineHelper } from 'data/replication/restart-pipeline-helper' -import { useReplicationSourcesQuery } from 'data/replication/sources-query' -import { useStartPipelineMutation } from 'data/replication/start-pipeline-mutation' -import { useUpdateDestinationPipelineMutation } from 'data/replication/update-destination-pipeline-mutation' -import { - useValidateDestinationMutation, - type ValidationFailure, -} from 'data/replication/validate-destination-mutation' -import { useValidatePipelineMutation } from 'data/replication/validate-pipeline-mutation' -import { useIcebergNamespaceCreateMutation } from 'data/storage/iceberg-namespace-create-mutation' -import { useS3AccessKeyCreateMutation } from 'data/storage/s3-access-key-create-mutation' import { AnimatePresence, motion } from 'framer-motion' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { Loader2 } from 'lucide-react' import { useEffect, useMemo, useRef, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { - PipelineStatusRequestStatus, - usePipelineRequestStatus, -} from 'state/replication-pipeline-request-status' import { Button, DialogSectionSeparator, Form_Shadcn_, SheetFooter, SheetSection } from 'ui' import * as z from 'zod' @@ -54,6 +28,32 @@ import { NoDestinationsAvailable } from './NoDestinationsAvailable' import { PublicationSelection } from './PublicationSelection' import { ReplicationDisclaimerDialog } from './ReplicationDisclaimerDialog' import { ValidationFailuresSection } from './ValidationFailuresSection' +import { CreateAnalyticsBucketSheet } from '@/components/interfaces/Storage/AnalyticsBuckets/CreateAnalyticsBucketSheet' +import { getKeys, useAPIKeysQuery } from '@/data/api-keys/api-keys-query' +import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' +import { + BatchConfig, + useCreateDestinationPipelineMutation, +} from '@/data/replication/create-destination-pipeline-mutation' +import { useReplicationDestinationByIdQuery } from '@/data/replication/destination-by-id-query' +import { useReplicationPipelineByIdQuery } from '@/data/replication/pipeline-by-id-query' +import { useReplicationPublicationsQuery } from '@/data/replication/publications-query' +import { useRestartPipelineHelper } from '@/data/replication/restart-pipeline-helper' +import { useReplicationSourcesQuery } from '@/data/replication/sources-query' +import { useStartPipelineMutation } from '@/data/replication/start-pipeline-mutation' +import { useUpdateDestinationPipelineMutation } from '@/data/replication/update-destination-pipeline-mutation' +import { + useValidateDestinationMutation, + type ValidationFailure, +} from '@/data/replication/validate-destination-mutation' +import { useValidatePipelineMutation } from '@/data/replication/validate-pipeline-mutation' +import { useIcebergNamespaceCreateMutation } from '@/data/storage/iceberg-namespace-create-mutation' +import { useS3AccessKeyCreateMutation } from '@/data/storage/s3-access-key-create-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { + PipelineStatusRequestStatus, + usePipelineRequestStatus, +} from '@/state/replication-pipeline-request-status' const formId = 'destination-editor' diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationPanel.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationPanel.tsx index b0d5853312..4aa5afcbea 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationPanel.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationPanel.tsx @@ -1,4 +1,3 @@ -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' import { ArrowUpRight } from 'lucide-react' import Link from 'next/link' import { parseAsInteger, parseAsStringEnum, useQueryState } from 'nuqs' @@ -25,6 +24,7 @@ import { DestinationType } from './DestinationPanel.types' import { DestinationTypeSelection } from './DestinationTypeSelection' import { ReadReplicaForm } from './ReadReplicaForm' import { DocsButton } from '@/components/ui/DocsButton' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' import { DOCS_URL } from '@/lib/constants' interface DestinationPanelProps { diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicaForm/ReadReplicaEligibilityWarnings.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicaForm/ReadReplicaEligibilityWarnings.tsx index be0813c67e..ac0abb7565 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicaForm/ReadReplicaEligibilityWarnings.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicaForm/ReadReplicaEligibilityWarnings.tsx @@ -1,14 +1,5 @@ import { SupportCategories } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { SupportLink } from 'components/interfaces/Support/SupportLink' -import { DocsButton } from 'components/ui/DocsButton' -import { UpgradePlanButton } from 'components/ui/UpgradePlanButton' -import { useEnablePhysicalBackupsMutation } from 'data/database/enable-physical-backups-mutation' -import { useProjectDetailQuery } from 'data/projects/project-detail-query' -import { MAX_REPLICAS_ABOVE_XL, MAX_REPLICAS_BELOW_XL } from 'data/read-replicas/replicas-query' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import Link from 'next/link' import { useEffect, useState } from 'react' import { toast } from 'sonner' @@ -16,6 +7,15 @@ import { Button } from 'ui' import { Admonition } from 'ui-patterns' import { useCheckEligibilityDeployReplica } from './useCheckEligibilityDeployReplica' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' +import { DocsButton } from '@/components/ui/DocsButton' +import { UpgradePlanButton } from '@/components/ui/UpgradePlanButton' +import { useEnablePhysicalBackupsMutation } from '@/data/database/enable-physical-backups-mutation' +import { useProjectDetailQuery } from '@/data/projects/project-detail-query' +import { MAX_REPLICAS_ABOVE_XL, MAX_REPLICAS_BELOW_XL } from '@/data/read-replicas/replicas-query' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' export const ReadReplicaEligibilityWarnings = () => { const { ref: projectRef } = useParams() diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicaForm/ReadReplicaPricingDialog.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicaForm/ReadReplicaPricingDialog.tsx index b1f81d5d9c..5523a42c99 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicaForm/ReadReplicaPricingDialog.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicaForm/ReadReplicaPricingDialog.tsx @@ -1,7 +1,3 @@ -import { DocsButton } from 'components/ui/DocsButton' -import { InlineLinkClassName } from 'components/ui/InlineLink' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import { cn, Dialog, @@ -19,7 +15,12 @@ import { TableHeader, TableRow, } from 'ui' + import { useGetReplicaCost } from './useGetReplicaCost' +import { DocsButton } from '@/components/ui/DocsButton' +import { InlineLinkClassName } from '@/components/ui/InlineLink' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' export const ReadReplicaPricingDialog = () => { const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicaForm/index.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicaForm/index.tsx index c5b9f9b8ce..fd23c5c9c3 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicaForm/index.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicaForm/index.tsx @@ -1,12 +1,7 @@ -import { useState } from 'react' -import { toast } from 'sonner' - import { useParams } from 'common' -import { AVAILABLE_REPLICA_REGIONS } from 'components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.constants' -import { Region, useReadReplicaSetUpMutation } from 'data/read-replicas/replica-setup-mutation' -import { useReadReplicasQuery } from 'data/read-replicas/replicas-query' -import { AWS_REGIONS_DEFAULT, BASE_PATH } from 'lib/constants' +import { useState } from 'react' import { AWS_REGIONS, AWS_REGIONS_KEYS } from 'shared-data' +import { toast } from 'sonner' import { Button, InfoIcon, @@ -19,10 +14,15 @@ import { SheetSection, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' + import { ReadReplicaEligibilityWarnings } from './ReadReplicaEligibilityWarnings' import { ReadReplicaPricingDialog } from './ReadReplicaPricingDialog' import { useCheckEligibilityDeployReplica } from './useCheckEligibilityDeployReplica' import { useGetReplicaCost } from './useGetReplicaCost' +import { AVAILABLE_REPLICA_REGIONS } from '@/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.constants' +import { Region, useReadReplicaSetUpMutation } from '@/data/read-replicas/replica-setup-mutation' +import { useReadReplicasQuery } from '@/data/read-replicas/replicas-query' +import { AWS_REGIONS_DEFAULT, BASE_PATH } from '@/lib/constants' interface ReadReplicaFormProps { onSuccess: () => void diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicaForm/useCheckEligibilityDeployReplica.ts b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicaForm/useCheckEligibilityDeployReplica.ts index f41c21fd4c..b2bc46d74a 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicaForm/useCheckEligibilityDeployReplica.ts +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicaForm/useCheckEligibilityDeployReplica.ts @@ -1,16 +1,16 @@ +import { useParams } from 'common' import { useMemo } from 'react' -import { useParams } from 'common' -import { useOverdueInvoicesQuery } from 'data/invoices/invoices-overdue-query' +import { useOverdueInvoicesQuery } from '@/data/invoices/invoices-overdue-query' import { MAX_REPLICAS_ABOVE_XL, MAX_REPLICAS_BELOW_XL, useReadReplicasQuery, -} from 'data/read-replicas/replicas-query' -import { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useIsAwsK8sCloudProvider, useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' +} from '@/data/read-replicas/replicas-query' +import { useProjectAddonsQuery } from '@/data/subscriptions/project-addons-query' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useIsAwsK8sCloudProvider, useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export const useCheckEligibilityDeployReplica = () => { const { ref: projectRef } = useParams() diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicaForm/useGetReplicaCost.ts b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicaForm/useGetReplicaCost.ts index b7b1acf3e6..01905ca1e2 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicaForm/useGetReplicaCost.ts +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicaForm/useGetReplicaCost.ts @@ -1,15 +1,16 @@ import { useParams } from 'common' + import { calculateIOPSPrice, calculateThroughputPrice, -} from 'components/interfaces/DiskManagement/DiskManagement.utils' +} from '@/components/interfaces/DiskManagement/DiskManagement.utils' import { DISK_PRICING, DiskType, -} from 'components/interfaces/DiskManagement/ui/DiskManagement.constants' -import { useDiskAttributesQuery } from 'data/config/disk-attributes-query' -import { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query' -import { formatCurrency } from 'lib/helpers' +} from '@/components/interfaces/DiskManagement/ui/DiskManagement.constants' +import { useDiskAttributesQuery } from '@/data/config/disk-attributes-query' +import { useProjectAddonsQuery } from '@/data/subscriptions/project-addons-query' +import { formatCurrency } from '@/lib/helpers' export const useGetReplicaCost = () => { const { ref: projectRef } = useParams() diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationRow.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationRow.tsx index 468d27e1af..a6d0cbeb8f 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationRow.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationRow.tsx @@ -1,19 +1,9 @@ import { useParams } from 'common' -import { AlertError } from 'components/ui/AlertError' -import { useDeleteDestinationPipelineMutation } from 'data/replication/delete-destination-pipeline-mutation' -import { useReplicationPipelineReplicationStatusQuery } from 'data/replication/pipeline-replication-status-query' -import { useReplicationPipelineStatusQuery } from 'data/replication/pipeline-status-query' -import { useReplicationPipelineVersionQuery } from 'data/replication/pipeline-version-query' -import { useStopPipelineMutation } from 'data/replication/stop-pipeline-mutation' import { AnalyticsBucket, BigQuery, Database } from 'icons' import { Minus } from 'lucide-react' import Link from 'next/link' import { useEffect, useState } from 'react' import { toast } from 'sonner' -import { - PipelineStatusRequestStatus, - usePipelineRequestStatus, -} from 'state/replication-pipeline-request-status' import { Button, TableCell, @@ -32,6 +22,16 @@ import { PipelineStatusName, STATUS_REFRESH_FREQUENCY_MS } from './Replication.c import { RowMenu } from './RowMenu' import { UpdateVersionModal } from './UpdateVersionModal' import { useDestinationInformation } from './useDestinationInformation' +import { AlertError } from '@/components/ui/AlertError' +import { useDeleteDestinationPipelineMutation } from '@/data/replication/delete-destination-pipeline-mutation' +import { useReplicationPipelineReplicationStatusQuery } from '@/data/replication/pipeline-replication-status-query' +import { useReplicationPipelineStatusQuery } from '@/data/replication/pipeline-status-query' +import { useReplicationPipelineVersionQuery } from '@/data/replication/pipeline-version-query' +import { useStopPipelineMutation } from '@/data/replication/stop-pipeline-mutation' +import { + PipelineStatusRequestStatus, + usePipelineRequestStatus, +} from '@/state/replication-pipeline-request-status' interface DestinationRowProps { destinationId: number diff --git a/apps/studio/components/interfaces/Database/Replication/Destinations.tsx b/apps/studio/components/interfaces/Database/Replication/Destinations.tsx index 14b67f4c9b..b915d10160 100644 --- a/apps/studio/components/interfaces/Database/Replication/Destinations.tsx +++ b/apps/studio/components/interfaces/Database/Replication/Destinations.tsx @@ -1,12 +1,5 @@ import { useQueryClient } from '@tanstack/react-query' import { useParams } from 'common' -import { AlertError } from 'components/ui/AlertError' -import { DocsButton } from 'components/ui/DocsButton' -import { useReplicationDestinationsQuery } from 'data/replication/destinations-query' -import { replicationKeys } from 'data/replication/keys' -import { fetchReplicationPipelineVersion } from 'data/replication/pipeline-version-query' -import { useReplicationPipelinesQuery } from 'data/replication/pipelines-query' -import { DOCS_URL } from 'lib/constants' import { Plus, Search, X } from 'lucide-react' import { parseAsStringEnum, useQueryState } from 'nuqs' import { useEffect, useRef, useState } from 'react' @@ -32,8 +25,15 @@ import { DestinationRow } from './DestinationRow' import { PIPELINE_ERROR_MESSAGES } from './Pipeline.utils' import { ReadReplicaRow } from './ReadReplicas/ReadReplicaRow' import { useIsETLBigQueryPrivateAlpha, useIsETLIcebergPrivateAlpha } from './useIsETLPrivateAlpha' +import { AlertError } from '@/components/ui/AlertError' +import { DocsButton } from '@/components/ui/DocsButton' import { useReadReplicasQuery } from '@/data/read-replicas/replicas-query' +import { useReplicationDestinationsQuery } from '@/data/replication/destinations-query' +import { replicationKeys } from '@/data/replication/keys' +import { fetchReplicationPipelineVersion } from '@/data/replication/pipeline-version-query' +import { useReplicationPipelinesQuery } from '@/data/replication/pipelines-query' import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { DOCS_URL } from '@/lib/constants' export const Destinations = () => { const queryClient = useQueryClient() diff --git a/apps/studio/components/interfaces/Database/Replication/EnableReplicationCallout.tsx b/apps/studio/components/interfaces/Database/Replication/EnableReplicationCallout.tsx index 630e033505..8fad5e633b 100644 --- a/apps/studio/components/interfaces/Database/Replication/EnableReplicationCallout.tsx +++ b/apps/studio/components/interfaces/Database/Replication/EnableReplicationCallout.tsx @@ -1,9 +1,9 @@ import { useParams } from 'common' -import { useCreateTenantSourceMutation } from 'data/replication/create-tenant-source-mutation' import { useState } from 'react' import { toast } from 'sonner' import { Button, + cn, Dialog, DialogContent, DialogFooter, @@ -12,13 +12,13 @@ import { DialogSectionSeparator, DialogTitle, DialogTrigger, - cn, } from 'ui' import { Admonition } from 'ui-patterns' import { DestinationType } from './DestinationPanel/DestinationPanel.types' import { DocsButton } from '@/components/ui/DocsButton' import { UpgradePlanButton } from '@/components/ui/UpgradePlanButton' +import { useCreateTenantSourceMutation } from '@/data/replication/create-tenant-source-mutation' import { DOCS_URL } from '@/lib/constants' const EnableReplicationModal = () => { diff --git a/apps/studio/components/interfaces/Database/Replication/ErroredTableDetails.tsx b/apps/studio/components/interfaces/Database/Replication/ErroredTableDetails.tsx index e4f01c69bc..e16ea0b1e1 100644 --- a/apps/studio/components/interfaces/Database/Replication/ErroredTableDetails.tsx +++ b/apps/studio/components/interfaces/Database/Replication/ErroredTableDetails.tsx @@ -1,9 +1,10 @@ -import { ReplicationPipelineTableStatus } from '@/data/replication/pipeline-replication-status-query' import { useParams } from 'common' -import { InlineLink } from 'components/ui/InlineLink' import { CriticalIcon } from 'ui' + import { isValidRetryPolicy } from './ReplicationPipelineStatus/ReplicationPipelineStatus.utils' import { RetryCountdown } from './RetryCountdown' +import { InlineLink } from '@/components/ui/InlineLink' +import { ReplicationPipelineTableStatus } from '@/data/replication/pipeline-replication-status-query' interface ErroredTableDetailsProps { table: ReplicationPipelineTableStatus diff --git a/apps/studio/components/interfaces/Database/Replication/Pipeline.utils.ts b/apps/studio/components/interfaces/Database/Replication/Pipeline.utils.ts index c43f4bf255..6ea1b884fa 100644 --- a/apps/studio/components/interfaces/Database/Replication/Pipeline.utils.ts +++ b/apps/studio/components/interfaces/Database/Replication/Pipeline.utils.ts @@ -1,9 +1,9 @@ +import { PipelineStatusName } from './Replication.constants' import { ReplicationPipelineStatus, ReplicationPipelineStatusData, -} from 'data/replication/pipeline-status-query' -import { PipelineStatusRequestStatus } from 'state/replication-pipeline-request-status' -import { PipelineStatusName } from './Replication.constants' +} from '@/data/replication/pipeline-status-query' +import { PipelineStatusRequestStatus } from '@/state/replication-pipeline-request-status' export const PIPELINE_ERROR_MESSAGES = { RETRIEVE_PIPELINE: 'Failed to retrieve pipeline information', diff --git a/apps/studio/components/interfaces/Database/Replication/PipelineStatus.tsx b/apps/studio/components/interfaces/Database/Replication/PipelineStatus.tsx index 32f9a19dc2..453ce729e0 100644 --- a/apps/studio/components/interfaces/Database/Replication/PipelineStatus.tsx +++ b/apps/studio/components/interfaces/Database/Replication/PipelineStatus.tsx @@ -1,14 +1,14 @@ -import { Loader2 } from 'lucide-react' - import { useParams } from 'common' -import { InlineLink } from 'components/ui/InlineLink' -import { ReplicationPipelineStatusData } from 'data/replication/pipeline-status-query' -import { PipelineStatusRequestStatus } from 'state/replication-pipeline-request-status' -import type { ResponseError } from 'types' +import { Loader2 } from 'lucide-react' import { Badge, Tooltip, TooltipContent, TooltipTrigger } from 'ui' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' + import { getPipelineStateMessages } from './Pipeline.utils' import { PipelineStatusName } from './Replication.constants' +import { InlineLink } from '@/components/ui/InlineLink' +import { ReplicationPipelineStatusData } from '@/data/replication/pipeline-status-query' +import { PipelineStatusRequestStatus } from '@/state/replication-pipeline-request-status' +import type { ResponseError } from '@/types' interface PipelineStatusProps { pipelineStatus: ReplicationPipelineStatusData['status'] | undefined diff --git a/apps/studio/components/interfaces/Database/Replication/ReplicationDiagram/Edges.tsx b/apps/studio/components/interfaces/Database/Replication/ReplicationDiagram/Edges.tsx index 391ffe1394..8bfc36c869 100644 --- a/apps/studio/components/interfaces/Database/Replication/ReplicationDiagram/Edges.tsx +++ b/apps/studio/components/interfaces/Database/Replication/ReplicationDiagram/Edges.tsx @@ -1,10 +1,10 @@ import { BaseEdge, EdgeLabelRenderer, getSmoothStepPath, type EdgeProps } from '@xyflow/react' import { useParams } from 'common' -import { useReplicationLagQuery } from 'data/read-replicas/replica-lag-query' -import { formatDatabaseID } from 'data/read-replicas/replicas.utils' import { Loader2, X } from 'lucide-react' import { cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' +import { useReplicationLagQuery } from '@/data/read-replicas/replica-lag-query' +import { formatDatabaseID } from '@/data/read-replicas/replicas.utils' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' type EdgeData = { diff --git a/apps/studio/components/interfaces/Database/Replication/ReplicationDiagram/Nodes.tsx b/apps/studio/components/interfaces/Database/Replication/ReplicationDiagram/Nodes.tsx index 506acc0453..247cef005c 100644 --- a/apps/studio/components/interfaces/Database/Replication/ReplicationDiagram/Nodes.tsx +++ b/apps/studio/components/interfaces/Database/Replication/ReplicationDiagram/Nodes.tsx @@ -1,7 +1,7 @@ +import { Handle, Position } from '@xyflow/react' import { useParams } from 'common' import { AnalyticsBucket, BigQuery, Database } from 'icons' import { PropsWithChildren, useMemo } from 'react' -import { Handle, Position } from '@xyflow/react' import { AWS_REGIONS } from 'shared-data' import { cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' diff --git a/apps/studio/components/interfaces/Database/Replication/ReplicationDiagram/index.tsx b/apps/studio/components/interfaces/Database/Replication/ReplicationDiagram/index.tsx index 164af43c3e..0a9045b7c1 100644 --- a/apps/studio/components/interfaces/Database/Replication/ReplicationDiagram/index.tsx +++ b/apps/studio/components/interfaces/Database/Replication/ReplicationDiagram/index.tsx @@ -1,8 +1,8 @@ import { useQueryClient } from '@tanstack/react-query' +import { Background, ColorMode, ReactFlow, ReactFlowProvider, useReactFlow } from '@xyflow/react' import { useParams } from 'common' import { useTheme } from 'next-themes' import { useEffect, useMemo } from 'react' -import { Background, ColorMode, ReactFlow, ReactFlowProvider, useReactFlow } from '@xyflow/react' import { getStatusName } from '../Pipeline.utils' import { PrimaryDatabaseNode, ReadReplicaNode, ReplicationNode } from './Nodes' diff --git a/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus/ReplicationPipelineStatus.tsx b/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus/ReplicationPipelineStatus.tsx index 203f867f27..f9f2d6be25 100644 --- a/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus/ReplicationPipelineStatus.tsx +++ b/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus/ReplicationPipelineStatus.tsx @@ -1,3 +1,4 @@ +import { useParams } from 'common' import { Activity, ArrowUpCircle, @@ -16,20 +17,6 @@ import Link from 'next/link' import { parseAsString, useQueryState } from 'nuqs' import { useEffect, useMemo, useState } from 'react' import { toast } from 'sonner' - -import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { useReplicationPipelineByIdQuery } from 'data/replication/pipeline-by-id-query' -import { useReplicationPipelineReplicationStatusQuery } from 'data/replication/pipeline-replication-status-query' -import { useReplicationPipelineStatusQuery } from 'data/replication/pipeline-status-query' -import { useReplicationPipelineVersionQuery } from 'data/replication/pipeline-version-query' -import { useRestartPipelineHelper } from 'data/replication/restart-pipeline-helper' -import { useStartPipelineMutation } from 'data/replication/start-pipeline-mutation' -import { useStopPipelineMutation } from 'data/replication/stop-pipeline-mutation' -import { - PipelineStatusRequestStatus, - usePipelineRequestStatus, -} from 'state/replication-pipeline-request-status' import { Button, Card, @@ -46,6 +33,7 @@ import { } from 'ui' import { GenericSkeletonLoader } from 'ui-patterns' import { Input } from 'ui-patterns/DataInputs/Input' + import { BatchRestartDialog } from '../BatchRestartDialog' import { ErrorDetailsDialog } from '../ErrorDetailsDialog' import { @@ -61,6 +49,18 @@ import { SlotLagMetrics } from './ReplicationPipelineStatus.types' import { getDisabledStateConfig } from './ReplicationPipelineStatus.utils' import { SlotLagMetricsInline, SlotLagMetricsList } from './SlotLagMetrics' import { TableReplicationRow } from './TableReplicationRow' +import AlertError from '@/components/ui/AlertError' +import { useReplicationPipelineByIdQuery } from '@/data/replication/pipeline-by-id-query' +import { useReplicationPipelineReplicationStatusQuery } from '@/data/replication/pipeline-replication-status-query' +import { useReplicationPipelineStatusQuery } from '@/data/replication/pipeline-status-query' +import { useReplicationPipelineVersionQuery } from '@/data/replication/pipeline-version-query' +import { useRestartPipelineHelper } from '@/data/replication/restart-pipeline-helper' +import { useStartPipelineMutation } from '@/data/replication/start-pipeline-mutation' +import { useStopPipelineMutation } from '@/data/replication/stop-pipeline-mutation' +import { + PipelineStatusRequestStatus, + usePipelineRequestStatus, +} from '@/state/replication-pipeline-request-status' /** * Component for displaying replication pipeline status and table replication details. diff --git a/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus/ReplicationPipelineStatus.utils.tsx b/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus/ReplicationPipelineStatus.utils.tsx index b596559155..452b4a9e85 100644 --- a/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus/ReplicationPipelineStatus.utils.tsx +++ b/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus/ReplicationPipelineStatus.utils.tsx @@ -1,12 +1,12 @@ import dayjs from 'dayjs' import { Activity, Clock, HelpCircle, Loader2, XCircle } from 'lucide-react' - -import { ReplicationPipelineStatusData } from 'data/replication/pipeline-status-query' -import { formatBytes } from 'lib/helpers' -import { PipelineStatusRequestStatus } from 'state/replication-pipeline-request-status' import { Badge } from 'ui' + import { getPipelineStateMessages } from '../Pipeline.utils' import { RetryPolicy, TableState } from './ReplicationPipelineStatus.types' +import { ReplicationPipelineStatusData } from '@/data/replication/pipeline-status-query' +import { formatBytes } from '@/lib/helpers' +import { PipelineStatusRequestStatus } from '@/state/replication-pipeline-request-status' const numberFormatter = new Intl.NumberFormat() diff --git a/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus/SlotLagMetrics.tsx b/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus/SlotLagMetrics.tsx index 1e11718fbe..fac788ff16 100644 --- a/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus/SlotLagMetrics.tsx +++ b/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus/SlotLagMetrics.tsx @@ -1,6 +1,6 @@ import { Info } from 'lucide-react' - import { Tooltip, TooltipContent, TooltipTrigger } from 'ui' + import { SlotLagMetricKey, SlotLagMetrics } from './ReplicationPipelineStatus.types' import { getFormattedLagValue } from './ReplicationPipelineStatus.utils' diff --git a/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus/TableReplicationRow.tsx b/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus/TableReplicationRow.tsx index d1d4115907..bbfb957cd3 100644 --- a/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus/TableReplicationRow.tsx +++ b/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus/TableReplicationRow.tsx @@ -1,14 +1,14 @@ +import { useParams } from 'common' import { ExternalLink, RotateCcw } from 'lucide-react' import Link from 'next/link' - -import { ButtonTooltip } from '@/components/ui/ButtonTooltip' -import { InlineLinkClassName } from '@/components/ui/InlineLink' -import { ReplicationPipelineTableStatus } from '@/data/replication/pipeline-replication-status-query' -import { useParams } from 'common' import { Badge, Button, cn, TableCell, TableRow, Tooltip, TooltipContent, TooltipTrigger } from 'ui' + import { ErroredTableDetails } from '../ErroredTableDetails' import { TableState } from './ReplicationPipelineStatus.types' import { getDisabledStateConfig, getStatusConfig } from './ReplicationPipelineStatus.utils' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { InlineLinkClassName } from '@/components/ui/InlineLink' +import { ReplicationPipelineTableStatus } from '@/data/replication/pipeline-replication-status-query' interface TableReplicationRowProps { table: ReplicationPipelineTableStatus diff --git a/apps/studio/components/interfaces/Database/Replication/RestartTableDialog.tsx b/apps/studio/components/interfaces/Database/Replication/RestartTableDialog.tsx index 9b88676079..275fb5bfa1 100644 --- a/apps/studio/components/interfaces/Database/Replication/RestartTableDialog.tsx +++ b/apps/studio/components/interfaces/Database/Replication/RestartTableDialog.tsx @@ -1,7 +1,5 @@ -import { toast } from 'sonner' - import { useParams } from 'common' -import { useRollbackTablesMutation } from 'data/replication/rollback-tables-mutation' +import { toast } from 'sonner' import { AlertDialog, AlertDialogAction, @@ -13,6 +11,8 @@ import { AlertDialogTitle, } from 'ui' +import { useRollbackTablesMutation } from '@/data/replication/rollback-tables-mutation' + interface RestartTableDialogProps { open: boolean onOpenChange: (open: boolean) => void diff --git a/apps/studio/components/interfaces/Database/Replication/RowMenu.tsx b/apps/studio/components/interfaces/Database/Replication/RowMenu.tsx index 74c63ccddc..f2a9115e6f 100644 --- a/apps/studio/components/interfaces/Database/Replication/RowMenu.tsx +++ b/apps/studio/components/interfaces/Database/Replication/RowMenu.tsx @@ -1,18 +1,7 @@ import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { ReplicationPipelineStatusData } from 'data/replication/pipeline-status-query' -import { Pipeline } from 'data/replication/pipelines-query' -import { useRestartPipelineHelper } from 'data/replication/restart-pipeline-helper' -import { useStartPipelineMutation } from 'data/replication/start-pipeline-mutation' -import { useStopPipelineMutation } from 'data/replication/stop-pipeline-mutation' import { ArrowUpCircle, Edit, MoreVertical, Pause, Play, RotateCcw, Trash } from 'lucide-react' import { parseAsInteger, useQueryState } from 'nuqs' import { toast } from 'sonner' -import { - PipelineStatusRequestStatus, - usePipelineRequestStatus, -} from 'state/replication-pipeline-request-status' -import type { ResponseError } from 'types' import { Button, DropdownMenu, @@ -30,6 +19,17 @@ import { PIPELINE_ERROR_MESSAGES, } from './Pipeline.utils' import { PipelineStatusName } from './Replication.constants' +import AlertError from '@/components/ui/AlertError' +import { ReplicationPipelineStatusData } from '@/data/replication/pipeline-status-query' +import { Pipeline } from '@/data/replication/pipelines-query' +import { useRestartPipelineHelper } from '@/data/replication/restart-pipeline-helper' +import { useStartPipelineMutation } from '@/data/replication/start-pipeline-mutation' +import { useStopPipelineMutation } from '@/data/replication/stop-pipeline-mutation' +import { + PipelineStatusRequestStatus, + usePipelineRequestStatus, +} from '@/state/replication-pipeline-request-status' +import type { ResponseError } from '@/types' interface RowMenuProps { destinationId: number diff --git a/apps/studio/components/interfaces/Database/Replication/UpdateVersionModal.tsx b/apps/studio/components/interfaces/Database/Replication/UpdateVersionModal.tsx index bddb229e27..22136bc564 100644 --- a/apps/studio/components/interfaces/Database/Replication/UpdateVersionModal.tsx +++ b/apps/studio/components/interfaces/Database/Replication/UpdateVersionModal.tsx @@ -1,16 +1,6 @@ -import { toast } from 'sonner' - import { useParams } from 'common' -import { useReplicationPipelineStatusQuery } from 'data/replication/pipeline-status-query' -import { useReplicationPipelineVersionQuery } from 'data/replication/pipeline-version-query' -import { Pipeline } from 'data/replication/pipelines-query' -import { useRestartPipelineHelper } from 'data/replication/restart-pipeline-helper' -import { useUpdatePipelineVersionMutation } from 'data/replication/update-pipeline-version-mutation' import { ChevronDown } from 'lucide-react' -import { - PipelineStatusRequestStatus, - usePipelineRequestStatus, -} from 'state/replication-pipeline-request-status' +import { toast } from 'sonner' import { Collapsible_Shadcn_, CollapsibleContent_Shadcn_, @@ -18,8 +8,18 @@ import { DialogSectionSeparator, } from 'ui' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' + import { getStatusName } from './Pipeline.utils' import { PipelineStatusName, STATUS_REFRESH_FREQUENCY_MS } from './Replication.constants' +import { useReplicationPipelineStatusQuery } from '@/data/replication/pipeline-status-query' +import { useReplicationPipelineVersionQuery } from '@/data/replication/pipeline-version-query' +import { Pipeline } from '@/data/replication/pipelines-query' +import { useRestartPipelineHelper } from '@/data/replication/restart-pipeline-helper' +import { useUpdatePipelineVersionMutation } from '@/data/replication/update-pipeline-version-mutation' +import { + PipelineStatusRequestStatus, + usePipelineRequestStatus, +} from '@/state/replication-pipeline-request-status' interface UpdateVersionModalProps { visible: boolean diff --git a/apps/studio/components/interfaces/Database/Replication/useIsETLPrivateAlpha.ts b/apps/studio/components/interfaces/Database/Replication/useIsETLPrivateAlpha.ts index 351d8095e5..ab7cbbd391 100644 --- a/apps/studio/components/interfaces/Database/Replication/useIsETLPrivateAlpha.ts +++ b/apps/studio/components/interfaces/Database/Replication/useIsETLPrivateAlpha.ts @@ -1,5 +1,6 @@ import { useFlag } from 'common' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' + +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' /** * Organization level opt in for ETL private alpha, there's 2 flags we're using which controls diff --git a/apps/studio/components/interfaces/Database/RestoreToNewProject/PreviousRestoreItem.tsx b/apps/studio/components/interfaces/Database/RestoreToNewProject/PreviousRestoreItem.tsx index dcd1092da3..b72e069e91 100644 --- a/apps/studio/components/interfaces/Database/RestoreToNewProject/PreviousRestoreItem.tsx +++ b/apps/studio/components/interfaces/Database/RestoreToNewProject/PreviousRestoreItem.tsx @@ -1,9 +1,9 @@ import { ChevronRightIcon } from 'lucide-react' import Link from 'next/link' - -import { CloneStatus } from 'data/projects/clone-status-query' import { TimestampInfo } from 'ui-patterns' + import { StatusBadge } from './StatusBadge' +import { CloneStatus } from '@/data/projects/clone-status-query' export const PreviousRestoreItem = ({ clone }: { clone: CloneStatus['clones'][number] }) => { if (clone.status === 'REMOVED') { diff --git a/apps/studio/components/interfaces/Database/RestoreToNewProject/RestoreToNewProject.tsx b/apps/studio/components/interfaces/Database/RestoreToNewProject/RestoreToNewProject.tsx index e6226e69e2..c8fec02d08 100644 --- a/apps/studio/components/interfaces/Database/RestoreToNewProject/RestoreToNewProject.tsx +++ b/apps/studio/components/interfaces/Database/RestoreToNewProject/RestoreToNewProject.tsx @@ -2,36 +2,36 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { Loader2 } from 'lucide-react' import Link from 'next/link' import { useEffect, useState } from 'react' +import { Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, Button } from 'ui' +import { Admonition } from 'ui-patterns/admonition' +import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' -import { PITRForm } from 'components/interfaces/Database/Backups/PITR/PITRForm' -import { BackupsList } from 'components/interfaces/Database/Backups/RestoreToNewProject/BackupsList' -import { ConfirmRestoreDialog } from 'components/interfaces/Database/Backups/RestoreToNewProject/ConfirmRestoreDialog' -import { CreateNewProjectDialog } from 'components/interfaces/Database/Backups/RestoreToNewProject/CreateNewProjectDialog' -import { projectSpecToMonthlyPrice } from 'components/interfaces/Database/Backups/RestoreToNewProject/RestoreToNewProject.utils' -import { DiskType } from 'components/interfaces/DiskManagement/ui/DiskManagement.constants' -import { Markdown } from 'components/interfaces/Markdown' -import AlertError from 'components/ui/AlertError' -import { InlineLink } from 'components/ui/InlineLink' -import NoPermission from 'components/ui/NoPermission' -import Panel from 'components/ui/Panel' -import { UpgradeToPro } from 'components/ui/UpgradeToPro' -import { useDiskAttributesQuery } from 'data/config/disk-attributes-query' -import { useCloneBackupsQuery } from 'data/projects/clone-query' -import { useCloneStatusQuery } from 'data/projects/clone-status-query' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' +import { PreviousRestoreItem } from './PreviousRestoreItem' +import { PITRForm } from '@/components/interfaces/Database/Backups/PITR/PITRForm' +import { BackupsList } from '@/components/interfaces/Database/Backups/RestoreToNewProject/BackupsList' +import { ConfirmRestoreDialog } from '@/components/interfaces/Database/Backups/RestoreToNewProject/ConfirmRestoreDialog' +import { CreateNewProjectDialog } from '@/components/interfaces/Database/Backups/RestoreToNewProject/CreateNewProjectDialog' +import { projectSpecToMonthlyPrice } from '@/components/interfaces/Database/Backups/RestoreToNewProject/RestoreToNewProject.utils' +import { DiskType } from '@/components/interfaces/DiskManagement/ui/DiskManagement.constants' +import { Markdown } from '@/components/interfaces/Markdown' +import AlertError from '@/components/ui/AlertError' +import { InlineLink } from '@/components/ui/InlineLink' +import NoPermission from '@/components/ui/NoPermission' +import Panel from '@/components/ui/Panel' +import { UpgradeToPro } from '@/components/ui/UpgradeToPro' +import { useDiskAttributesQuery } from '@/data/config/disk-attributes-query' +import { useCloneBackupsQuery } from '@/data/projects/clone-query' +import { useCloneStatusQuery } from '@/data/projects/clone-status-query' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' import { useIsAwsK8sCloudProvider, useIsOrioleDb, useSelectedProjectQuery, -} from 'hooks/misc/useSelectedProject' -import { DOCS_URL, PROJECT_STATUS } from 'lib/constants' -import { getDatabaseMajorVersion } from 'lib/helpers' -import { Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' -import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' -import { PreviousRestoreItem } from './PreviousRestoreItem' +} from '@/hooks/misc/useSelectedProject' +import { DOCS_URL, PROJECT_STATUS } from '@/lib/constants' +import { getDatabaseMajorVersion } from '@/lib/helpers' export const RestoreToNewProject = () => { const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Database/RestoreToNewProject/StatusBadge.tsx b/apps/studio/components/interfaces/Database/RestoreToNewProject/StatusBadge.tsx index 8b6fc9d6f6..5e6c57106d 100644 --- a/apps/studio/components/interfaces/Database/RestoreToNewProject/StatusBadge.tsx +++ b/apps/studio/components/interfaces/Database/RestoreToNewProject/StatusBadge.tsx @@ -1,6 +1,7 @@ -import { CloneStatus } from 'data/projects/clone-status-query' import { Badge } from 'ui' +import { CloneStatus } from '@/data/projects/clone-status-query' + export const StatusBadge = ({ status, }: { diff --git a/apps/studio/components/interfaces/Database/Roles/CreateRolePanel.tsx b/apps/studio/components/interfaces/Database/Roles/CreateRolePanel.tsx index 6d070ec4aa..788062ad9c 100644 --- a/apps/studio/components/interfaces/Database/Roles/CreateRolePanel.tsx +++ b/apps/studio/components/interfaces/Database/Roles/CreateRolePanel.tsx @@ -1,23 +1,23 @@ import { zodResolver } from '@hookform/resolvers/zod' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import z from 'zod' - -import { FormActions } from 'components/ui/Forms/FormActions' -import { useDatabaseRoleCreateMutation } from 'data/database-roles/database-role-create-mutation' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { + Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, FormItem_Shadcn_, FormLabel_Shadcn_, FormMessage_Shadcn_, - Form_Shadcn_, Input_Shadcn_, SidePanel, Switch, } from 'ui' +import z from 'zod' + import { ROLE_PERMISSIONS } from './Roles.constants' +import { FormActions } from '@/components/ui/Forms/FormActions' +import { useDatabaseRoleCreateMutation } from '@/data/database-roles/database-role-create-mutation' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface CreateRolePanelProps { visible: boolean diff --git a/apps/studio/components/interfaces/Database/Roles/RoleRow.tsx b/apps/studio/components/interfaces/Database/Roles/RoleRow.tsx index 046fa019bb..c9945aa648 100644 --- a/apps/studio/components/interfaces/Database/Roles/RoleRow.tsx +++ b/apps/studio/components/interfaces/Database/Roles/RoleRow.tsx @@ -1,7 +1,4 @@ import { zodResolver } from '@hookform/resolvers/zod' -import { useDatabaseRoleUpdateMutation } from 'data/database-roles/database-role-update-mutation' -import type { PgRole } from 'data/database-roles/database-roles-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { ChevronUp, MoreVertical, Trash } from 'lucide-react' import { useEffect, useState } from 'react' import { useForm, type SubmitHandler } from 'react-hook-form' @@ -23,6 +20,9 @@ import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import * as z from 'zod' import { ROLE_PERMISSIONS } from './Roles.constants' +import { useDatabaseRoleUpdateMutation } from '@/data/database-roles/database-role-update-mutation' +import type { PgRole } from '@/data/database-roles/database-roles-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface RoleRowProps { role: PgRole diff --git a/apps/studio/components/interfaces/Database/Roles/RolesList.tsx b/apps/studio/components/interfaces/Database/Roles/RolesList.tsx index 70748b7ade..68aca3aa62 100644 --- a/apps/studio/components/interfaces/Database/Roles/RolesList.tsx +++ b/apps/studio/components/interfaces/Database/Roles/RolesList.tsx @@ -1,11 +1,4 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { NoSearchResults } from 'components/ui/NoSearchResults' -import { SparkBar } from 'components/ui/SparkBar' -import { useDatabaseRolesQuery } from 'data/database-roles/database-roles-query' -import { useMaxConnectionsQuery } from 'data/database/max-connections-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { partition, sortBy } from 'lodash' import { Plus, Search, X } from 'lucide-react' import { parseAsBoolean, parseAsString, useQueryState } from 'nuqs' @@ -19,7 +12,14 @@ import { CreateRolePanel } from './CreateRolePanel' import { RoleRow } from './RoleRow' import { RoleRowSkeleton } from './RoleRowSkeleton' import { SUPABASE_ROLES } from './Roles.constants' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { NoSearchResults } from '@/components/ui/NoSearchResults' +import { SparkBar } from '@/components/ui/SparkBar' import { useDatabaseRoleDeleteMutation } from '@/data/database-roles/database-role-delete-mutation' +import { useDatabaseRolesQuery } from '@/data/database-roles/database-roles-query' +import { useMaxConnectionsQuery } from '@/data/database/max-connections-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' type SUPABASE_ROLE = (typeof SUPABASE_ROLES)[number] diff --git a/apps/studio/components/interfaces/Database/Schemas/SchemaGraph.tsx b/apps/studio/components/interfaces/Database/Schemas/SchemaGraph.tsx index 26233aa3ce..39731f6c87 100644 --- a/apps/studio/components/interfaces/Database/Schemas/SchemaGraph.tsx +++ b/apps/studio/components/interfaces/Database/Schemas/SchemaGraph.tsx @@ -20,19 +20,7 @@ import { useEffect, useMemo, useRef, useState } from 'react' import '@xyflow/react/dist/style.css' import { LOCAL_STORAGE_KEYS, useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import SchemaSelector from 'components/ui/SchemaSelector' -import { useSchemasQuery } from 'data/database/schemas-query' -import { useTablesQuery } from 'data/tables/tables-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useLocalStorage } from 'hooks/misc/useLocalStorage' -import { useQuerySchemaState } from 'hooks/misc/useSchemaQueryState' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useIsProtectedSchema } from 'hooks/useProtectedSchemas' -import { tablesToSQL } from 'lib/helpers' import { toast } from 'sonner' -import { useTableEditorStateSnapshot } from 'state/table-editor' import { Button, copyToClipboard, @@ -50,7 +38,19 @@ import { SchemaGraphLegend } from './SchemaGraphLegend' import { EdgeData, TableNodeData } from './Schemas.constants' import { getGraphDataFromTables, getLayoutedElementsViaDagre } from './Schemas.utils' import { TableNode } from './SchemaTableNode' +import AlertError from '@/components/ui/AlertError' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import SchemaSelector from '@/components/ui/SchemaSelector' +import { useSchemasQuery } from '@/data/database/schemas-query' +import { useTablesQuery } from '@/data/tables/tables-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useLocalStorage } from '@/hooks/misc/useLocalStorage' +import { useQuerySchemaState } from '@/hooks/misc/useSchemaQueryState' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useIsProtectedSchema } from '@/hooks/useProtectedSchemas' import { useStaticEffectEvent } from '@/hooks/useStaticEffectEvent' +import { tablesToSQL } from '@/lib/helpers' +import { useTableEditorStateSnapshot } from '@/state/table-editor' // [Joshen] Persisting logic: Only save positions to local storage WHEN a node is moved OR when explicitly clicked to reset layout diff --git a/apps/studio/components/interfaces/Database/Schemas/SchemaTableNode.tsx b/apps/studio/components/interfaces/Database/Schemas/SchemaTableNode.tsx index 9d492384c1..8328b1baaa 100644 --- a/apps/studio/components/interfaces/Database/Schemas/SchemaTableNode.tsx +++ b/apps/studio/components/interfaces/Database/Schemas/SchemaTableNode.tsx @@ -1,6 +1,5 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { Handle, Node, NodeProps } from '@xyflow/react' -import { buildTableEditorUrl } from 'components/grid/SupabaseGrid.utils' import { TableEditor } from 'icons' import { Copy, @@ -29,6 +28,7 @@ import { import { useSchemaGraphContext } from './SchemaGraphContext' import { TableNodeData } from './Schemas.constants' +import { buildTableEditorUrl } from '@/components/grid/SupabaseGrid.utils' import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' diff --git a/apps/studio/components/interfaces/Database/Schemas/Schemas.utils.ts b/apps/studio/components/interfaces/Database/Schemas/Schemas.utils.ts index 755ad5eac6..315df763eb 100644 --- a/apps/studio/components/interfaces/Database/Schemas/Schemas.utils.ts +++ b/apps/studio/components/interfaces/Database/Schemas/Schemas.utils.ts @@ -6,10 +6,10 @@ import { uniqBy } from 'lodash' import '@xyflow/react/dist/style.css' import { LOCAL_STORAGE_KEYS } from 'common' -import { tryParseJson } from 'lib/helpers' import { TableNodeData } from './Schemas.constants' import { TABLE_NODE_ROW_HEIGHT, TABLE_NODE_WIDTH } from './SchemaTableNode' +import { tryParseJson } from '@/lib/helpers' const NODE_SEP = 25 const RANK_SEP = 50 diff --git a/apps/studio/components/interfaces/Database/Tables/ColumnList.tsx b/apps/studio/components/interfaces/Database/Tables/ColumnList.tsx index 4848ecb2c6..27830b2558 100644 --- a/apps/studio/components/interfaces/Database/Tables/ColumnList.tsx +++ b/apps/studio/components/interfaces/Database/Tables/ColumnList.tsx @@ -1,15 +1,6 @@ import { PostgresColumn } from '@supabase/postgres-meta' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DropdownMenuItemTooltip } from 'components/ui/DropdownMenuItemTooltip' -import { NoSearchResults } from 'components/ui/NoSearchResults' -import { useTableEditorQuery } from 'data/table-editor/table-editor-query' -import { isTableLike } from 'data/table-editor/table-editor-types' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useIsProtectedSchema } from 'hooks/useProtectedSchemas' import { noop } from 'lodash' import { Braces, @@ -57,6 +48,15 @@ import { getUniqueIndexColumnNames, } from './ColumnList.utils' import { ConstraintToken } from './ConstraintToken' +import AlertError from '@/components/ui/AlertError' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DropdownMenuItemTooltip } from '@/components/ui/DropdownMenuItemTooltip' +import { NoSearchResults } from '@/components/ui/NoSearchResults' +import { useTableEditorQuery } from '@/data/table-editor/table-editor-query' +import { isTableLike } from '@/data/table-editor/table-editor-types' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useIsProtectedSchema } from '@/hooks/useProtectedSchemas' const getColumnTypeAffordancePresentation = (column: PostgresColumn) => { const { kind, label } = getColumnTypeAffordance(column.format) diff --git a/apps/studio/components/interfaces/Database/Tables/ColumnList.utils.ts b/apps/studio/components/interfaces/Database/Tables/ColumnList.utils.ts index bfd03662aa..f861453698 100644 --- a/apps/studio/components/interfaces/Database/Tables/ColumnList.utils.ts +++ b/apps/studio/components/interfaces/Database/Tables/ColumnList.utils.ts @@ -1,4 +1,4 @@ -import { POSTGRES_DATA_TYPE_OPTIONS } from 'components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.constants' +import { POSTGRES_DATA_TYPE_OPTIONS } from '@/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.constants' type TableConstraintSource = { schema: string diff --git a/apps/studio/components/interfaces/Database/Tables/TableList.tsx b/apps/studio/components/interfaces/Database/Tables/TableList.tsx index 8e9e0b69d6..187e90b9b2 100644 --- a/apps/studio/components/interfaces/Database/Tables/TableList.tsx +++ b/apps/studio/components/interfaces/Database/Tables/TableList.tsx @@ -1,23 +1,6 @@ import type { PostgresTable } from '@supabase/postgres-meta' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { buildTableEditorUrl } from 'components/grid/SupabaseGrid.utils' -import AlertError from 'components/ui/AlertError' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DropdownMenuItemTooltip } from 'components/ui/DropdownMenuItemTooltip' -import { EntityTypeIcon } from 'components/ui/EntityTypeIcon' -import SchemaSelector from 'components/ui/SchemaSelector' -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' -import { useMaterializedViewsQuery } from 'data/materialized-views/materialized-views-query' -import { usePrefetchEditorTablePage } from 'data/prefetchers/project.$ref.editor.$id' -import { useTablesQuery } from 'data/tables/tables-query' -import { useViewsQuery } from 'data/views/views-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useQuerySchemaState } from 'hooks/misc/useSchemaQueryState' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useIsProtectedSchema } from 'hooks/useProtectedSchemas' import { noop } from 'lodash' import { Check, Copy, Edit, Eye, Filter, MoreVertical, Plus, Search, Trash, X } from 'lucide-react' import Link from 'next/link' @@ -53,6 +36,23 @@ import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { ProtectedSchemaWarning } from '../ProtectedSchemaWarning' import { formatAllEntities } from './Tables.utils' +import { buildTableEditorUrl } from '@/components/grid/SupabaseGrid.utils' +import AlertError from '@/components/ui/AlertError' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DropdownMenuItemTooltip } from '@/components/ui/DropdownMenuItemTooltip' +import { EntityTypeIcon } from '@/components/ui/EntityTypeIcon' +import SchemaSelector from '@/components/ui/SchemaSelector' +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' +import { useMaterializedViewsQuery } from '@/data/materialized-views/materialized-views-query' +import { usePrefetchEditorTablePage } from '@/data/prefetchers/project.$ref.editor.$id' +import { useTablesQuery } from '@/data/tables/tables-query' +import { useViewsQuery } from '@/data/views/views-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useQuerySchemaState } from '@/hooks/misc/useSchemaQueryState' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useIsProtectedSchema } from '@/hooks/useProtectedSchemas' interface TableListProps { onAddTable: () => void diff --git a/apps/studio/components/interfaces/Database/Tables/Tables.utils.ts b/apps/studio/components/interfaces/Database/Tables/Tables.utils.ts index 1d5d69e843..2e032162c7 100644 --- a/apps/studio/components/interfaces/Database/Tables/Tables.utils.ts +++ b/apps/studio/components/interfaces/Database/Tables/Tables.utils.ts @@ -1,6 +1,7 @@ import { PostgresMaterializedView, PostgresTable, PostgresView } from '@supabase/postgres-meta' import { PostgresForeignTable } from '@supabase/postgres-meta/dist/lib/types' -import { ENTITY_TYPE } from 'data/entity-types/entity-type-constants' + +import { ENTITY_TYPE } from '@/data/entity-types/entity-type-constants' // [Joshen] We just need name, schema, description, rows, size, and the number of columns // Just missing partitioned tables as missing pg-meta support diff --git a/apps/studio/components/interfaces/Database/Triggers/ChooseFunctionForm.tsx b/apps/studio/components/interfaces/Database/Triggers/ChooseFunctionForm.tsx index c29ac4fdc9..96a4f3ba08 100644 --- a/apps/studio/components/interfaces/Database/Triggers/ChooseFunctionForm.tsx +++ b/apps/studio/components/interfaces/Database/Triggers/ChooseFunctionForm.tsx @@ -1,20 +1,20 @@ import { Transition } from '@headlessui/react' import { useParams } from 'common' import { map as lodashMap, uniqBy } from 'lodash' +import { ChevronDown, HelpCircle, Terminal } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' import { useState } from 'react' import { Button, SidePanel } from 'ui' -import ProductEmptyState from 'components/to-be-cleaned/ProductEmptyState' -import InformationBox from 'components/ui/InformationBox' -import SqlEditor from 'components/ui/SqlEditor' +import ProductEmptyState from '@/components/to-be-cleaned/ProductEmptyState' +import InformationBox from '@/components/ui/InformationBox' +import SqlEditor from '@/components/ui/SqlEditor' import { useDatabaseFunctionsQuery, type DatabaseFunction, -} from 'data/database-functions/database-functions-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { ChevronDown, HelpCircle, Terminal } from 'lucide-react' +} from '@/data/database-functions/database-functions-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export interface ChooseFunctionFormProps { visible: boolean diff --git a/apps/studio/components/interfaces/Database/Triggers/DeleteEventTrigger.tsx b/apps/studio/components/interfaces/Database/Triggers/DeleteEventTrigger.tsx index d824a93127..dc8d797a20 100644 --- a/apps/studio/components/interfaces/Database/Triggers/DeleteEventTrigger.tsx +++ b/apps/studio/components/interfaces/Database/Triggers/DeleteEventTrigger.tsx @@ -1,5 +1,5 @@ -import type { DatabaseEventTrigger } from 'data/database-event-triggers/database-event-triggers-query' -import { TextConfirmModal } from 'components/ui/TextConfirmModalWrapper' +import { TextConfirmModal } from '@/components/ui/TextConfirmModalWrapper' +import type { DatabaseEventTrigger } from '@/data/database-event-triggers/database-event-triggers-query' interface DeleteEventTriggerProps { trigger?: DatabaseEventTrigger diff --git a/apps/studio/components/interfaces/Database/Triggers/DeleteTrigger.tsx b/apps/studio/components/interfaces/Database/Triggers/DeleteTrigger.tsx index 868466732e..7126cc2f5e 100644 --- a/apps/studio/components/interfaces/Database/Triggers/DeleteTrigger.tsx +++ b/apps/studio/components/interfaces/Database/Triggers/DeleteTrigger.tsx @@ -1,7 +1,7 @@ import type { PostgresTrigger } from '@supabase/postgres-meta' -import { TextConfirmModal } from 'components/ui/TextConfirmModalWrapper' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' +import { TextConfirmModal } from '@/components/ui/TextConfirmModalWrapper' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface DeleteTriggerProps { trigger?: PostgresTrigger diff --git a/apps/studio/components/interfaces/Database/Triggers/EventTriggersList/EventTriggerList.tsx b/apps/studio/components/interfaces/Database/Triggers/EventTriggersList/EventTriggerList.tsx index ed1f1e1fc6..e1ac64dfec 100644 --- a/apps/studio/components/interfaces/Database/Triggers/EventTriggersList/EventTriggerList.tsx +++ b/apps/studio/components/interfaces/Database/Triggers/EventTriggersList/EventTriggerList.tsx @@ -1,12 +1,8 @@ +import { useParams } from 'common' import { includes, sortBy } from 'lodash' -import { useMemo } from 'react' import { Check, Copy, Edit, Edit2, MoreVertical, Trash, X } from 'lucide-react' import Link from 'next/link' - -import { useParams } from 'common' -import { SUPABASE_ROLES } from 'components/interfaces/Database/Roles/Roles.constants' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import type { DatabaseEventTrigger } from 'data/database-event-triggers/database-event-triggers-query' +import { useMemo } from 'react' import { Badge, Button, @@ -19,6 +15,10 @@ import { TableRow, } from 'ui' +import { SUPABASE_ROLES } from '@/components/interfaces/Database/Roles/Roles.constants' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import type { DatabaseEventTrigger } from '@/data/database-event-triggers/database-event-triggers-query' + interface EventTriggerListProps { filterString: string eventTriggers: DatabaseEventTrigger[] diff --git a/apps/studio/components/interfaces/Database/Triggers/EventTriggersList/EventTriggerList.utils.ts b/apps/studio/components/interfaces/Database/Triggers/EventTriggersList/EventTriggerList.utils.ts index 9eba6d524f..b326abdfd6 100644 --- a/apps/studio/components/interfaces/Database/Triggers/EventTriggersList/EventTriggerList.utils.ts +++ b/apps/studio/components/interfaces/Database/Triggers/EventTriggersList/EventTriggerList.utils.ts @@ -1,4 +1,4 @@ -import type { DatabaseEventTrigger } from 'data/database-event-triggers/database-event-triggers-query' +import type { DatabaseEventTrigger } from '@/data/database-event-triggers/database-event-triggers-query' const ensureSemicolon = (statement: string) => { const trimmed = statement.trim() diff --git a/apps/studio/components/interfaces/Database/Triggers/EventTriggersList/EventTriggersList.tsx b/apps/studio/components/interfaces/Database/Triggers/EventTriggersList/EventTriggersList.tsx index 38110ce5ce..0b06751282 100644 --- a/apps/studio/components/interfaces/Database/Triggers/EventTriggersList/EventTriggersList.tsx +++ b/apps/studio/components/interfaces/Database/Triggers/EventTriggersList/EventTriggersList.tsx @@ -1,36 +1,36 @@ +import { PermissionAction } from '@supabase/shared-types/out/constants' import { DatabaseZap, Plus, Search } from 'lucide-react' import { parseAsJson, parseAsString, useQueryState } from 'nuqs' import { useMemo, useState } from 'react' import { toast } from 'sonner' - -import { EMPTY_ARR } from '@/lib/void' -import { PermissionAction } from '@supabase/shared-types/out/constants' -import { DeleteEventTrigger } from 'components/interfaces/Database/Triggers/DeleteEventTrigger' -import { - ReportsSelectFilter, - selectFilterSchema, -} from 'components/interfaces/Reports/v2/ReportsSelectFilter' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import AlertError from 'components/ui/AlertError' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DocsButton } from 'components/ui/DocsButton' -import { useDatabaseEventTriggerDeleteMutation } from 'data/database-event-triggers/database-event-trigger-delete-mutation' -import { - type DatabaseEventTrigger, - useDatabaseEventTriggersQuery, -} from 'data/database-event-triggers/database-event-triggers-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { useEditorPanelStateSnapshot } from 'state/editor-panel-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { Card, Input, Table, TableBody, TableHead, TableHeader, TableRow } from 'ui' import { EmptyStatePresentational } from 'ui-patterns' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' + import { EventTriggerList } from './EventTriggerList' import { generateEventTriggerCreateSQL } from './EventTriggerList.utils' import { DEFAULT_EVENT_TRIGGER_SQL, EVENT_TRIGGER_TEMPLATES } from './EventTriggers.constants' +import { DeleteEventTrigger } from '@/components/interfaces/Database/Triggers/DeleteEventTrigger' +import { + ReportsSelectFilter, + selectFilterSchema, +} from '@/components/interfaces/Reports/v2/ReportsSelectFilter' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import AlertError from '@/components/ui/AlertError' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DocsButton } from '@/components/ui/DocsButton' +import { useDatabaseEventTriggerDeleteMutation } from '@/data/database-event-triggers/database-event-trigger-delete-mutation' +import { + useDatabaseEventTriggersQuery, + type DatabaseEventTrigger, +} from '@/data/database-event-triggers/database-event-triggers-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' +import { EMPTY_ARR } from '@/lib/void' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useEditorPanelStateSnapshot } from '@/state/editor-panel-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' const DEFAULT_OWNER_FILTER = ['postgres'] diff --git a/apps/studio/components/interfaces/Database/Triggers/TriggerSheet.tsx b/apps/studio/components/interfaces/Database/Triggers/TriggerSheet.tsx index 28fe906b51..c1b58ab6e9 100644 --- a/apps/studio/components/interfaces/Database/Triggers/TriggerSheet.tsx +++ b/apps/studio/components/interfaces/Database/Triggers/TriggerSheet.tsx @@ -1,13 +1,5 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PostgresTrigger } from '@supabase/postgres-meta' -import { DiscardChangesConfirmationDialog } from 'components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' -import FormBoxEmpty from 'components/ui/FormBoxEmpty' -import { useDatabaseTriggerCreateMutation } from 'data/database-triggers/database-trigger-create-mutation' -import { useDatabaseTriggerUpdateMutation } from 'data/database-triggers/database-trigger-update-mutation' -import { useTablesQuery } from 'data/tables/tables-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useConfirmOnClose } from 'hooks/ui/useConfirmOnClose' -import { useProtectedSchemas } from 'hooks/useProtectedSchemas' import { Terminal } from 'lucide-react' import { useEffect, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' @@ -42,6 +34,14 @@ import { TRIGGER_ORIENTATIONS, TRIGGER_TYPES, } from './Triggers.constants' +import { DiscardChangesConfirmationDialog } from '@/components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' +import FormBoxEmpty from '@/components/ui/FormBoxEmpty' +import { useDatabaseTriggerCreateMutation } from '@/data/database-triggers/database-trigger-create-mutation' +import { useDatabaseTriggerUpdateMutation } from '@/data/database-triggers/database-trigger-update-mutation' +import { useTablesQuery } from '@/data/tables/tables-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useConfirmOnClose } from '@/hooks/ui/useConfirmOnClose' +import { useProtectedSchemas } from '@/hooks/useProtectedSchemas' const formId = 'create-trigger' diff --git a/apps/studio/components/interfaces/Database/Triggers/TriggersList/CreateTriggerButtons.tsx b/apps/studio/components/interfaces/Database/Triggers/TriggersList/CreateTriggerButtons.tsx index 20ae766f29..f2234bfada 100644 --- a/apps/studio/components/interfaces/Database/Triggers/TriggersList/CreateTriggerButtons.tsx +++ b/apps/studio/components/interfaces/Database/Triggers/TriggersList/CreateTriggerButtons.tsx @@ -1,11 +1,11 @@ import { Plus } from 'lucide-react' - -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { AiIconAnimation } from 'ui' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' + interface CreateTriggerButtonsProps { hasTables: boolean canCreateTriggers: boolean diff --git a/apps/studio/components/interfaces/Database/Triggers/TriggersList/TriggerList.tsx b/apps/studio/components/interfaces/Database/Triggers/TriggersList/TriggerList.tsx index 655eb68ea6..6b392cfd07 100644 --- a/apps/studio/components/interfaces/Database/Triggers/TriggersList/TriggerList.tsx +++ b/apps/studio/components/interfaces/Database/Triggers/TriggersList/TriggerList.tsx @@ -1,17 +1,10 @@ import { PostgresTrigger } from '@supabase/postgres-meta' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useDatabaseTriggersQuery } from 'data/database-triggers/database-triggers-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { includes, sortBy } from 'lodash' import { Check, Copy, Edit, Edit2, MoreVertical, Trash, X } from 'lucide-react' import Link from 'next/link' import { parseAsJson, parseAsString, useQueryState } from 'nuqs' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { Badge, Button, @@ -26,8 +19,15 @@ import { import { generateTriggerCreateSQL } from './TriggerList.utils' import { selectFilterSchema } from '@/components/interfaces/Reports/v2/ReportsSelectFilter' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useDatabaseTriggersQuery } from '@/data/database-triggers/database-triggers-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' import { useQuerySchemaState } from '@/hooks/misc/useSchemaQueryState' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' import { useIsProtectedSchema } from '@/hooks/useProtectedSchemas' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' interface TriggerListProps { editTrigger: (trigger: PostgresTrigger) => void diff --git a/apps/studio/components/interfaces/Database/Triggers/TriggersList/TriggersList.tsx b/apps/studio/components/interfaces/Database/Triggers/TriggersList/TriggersList.tsx index 97f10b948e..3e88837df9 100644 --- a/apps/studio/components/interfaces/Database/Triggers/TriggersList/TriggersList.tsx +++ b/apps/studio/components/interfaces/Database/Triggers/TriggersList/TriggersList.tsx @@ -1,26 +1,9 @@ import type { PostgresTrigger } from '@supabase/postgres-meta' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { useIsInlineEditorEnabled } from 'components/interfaces/Account/Preferences/InlineEditorSettings' -import { ProtectedSchemaWarning } from 'components/interfaces/Database/ProtectedSchemaWarning' -import { TriggerSheet } from 'components/interfaces/Database/Triggers/TriggerSheet' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import AlertError from 'components/ui/AlertError' -import { DocsButton } from 'components/ui/DocsButton' -import SchemaSelector from 'components/ui/SchemaSelector' -import { useDatabaseTriggerDeleteMutation } from 'data/database-triggers/database-trigger-delete-mutation' -import { useDatabaseTriggersQuery } from 'data/database-triggers/database-triggers-query' -import { useTablesQuery } from 'data/tables/tables-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useQuerySchemaState } from 'hooks/misc/useSchemaQueryState' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useIsProtectedSchema, useProtectedSchemas } from 'hooks/useProtectedSchemas' -import { DOCS_URL } from 'lib/constants' import { DatabaseZap, Search } from 'lucide-react' import { parseAsBoolean, parseAsJson, parseAsString, useQueryState } from 'nuqs' import { useEffect } from 'react' import { toast } from 'sonner' -import { useEditorPanelStateSnapshot } from 'state/editor-panel-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { Card, Input, Table, TableBody, TableHead, TableHeader, TableRow } from 'ui' import { EmptyStatePresentational } from 'ui-patterns' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' @@ -28,11 +11,28 @@ import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { CreateTriggerButtons } from './CreateTriggerButtons' import { TriggerList } from './TriggerList' import { generateTriggerCreateSQL } from './TriggerList.utils' +import { useIsInlineEditorEnabled } from '@/components/interfaces/Account/Preferences/InlineEditorSettings' +import { ProtectedSchemaWarning } from '@/components/interfaces/Database/ProtectedSchemaWarning' +import { TriggerSheet } from '@/components/interfaces/Database/Triggers/TriggerSheet' import { ReportsSelectFilter, selectFilterSchema, } from '@/components/interfaces/Reports/v2/ReportsSelectFilter' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import AlertError from '@/components/ui/AlertError' +import { DocsButton } from '@/components/ui/DocsButton' +import SchemaSelector from '@/components/ui/SchemaSelector' import { TextConfirmModal } from '@/components/ui/TextConfirmModalWrapper' +import { useDatabaseTriggerDeleteMutation } from '@/data/database-triggers/database-trigger-delete-mutation' +import { useDatabaseTriggersQuery } from '@/data/database-triggers/database-triggers-query' +import { useTablesQuery } from '@/data/tables/tables-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useQuerySchemaState } from '@/hooks/misc/useSchemaQueryState' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useIsProtectedSchema, useProtectedSchemas } from '@/hooks/useProtectedSchemas' +import { DOCS_URL } from '@/lib/constants' +import { useEditorPanelStateSnapshot } from '@/state/editor-panel-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' export const TriggersList = () => { const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/DiskManagement/DiskManagement.schema.ts b/apps/studio/components/interfaces/DiskManagement/DiskManagement.schema.ts index 2aee9a7ea1..ea31c68a27 100644 --- a/apps/studio/components/interfaces/DiskManagement/DiskManagement.schema.ts +++ b/apps/studio/components/interfaces/DiskManagement/DiskManagement.schema.ts @@ -1,16 +1,21 @@ -import { CloudProvider, COMPUTE_MAX_IOPS, computeInstanceAddonVariantIdSchema } from 'shared-data' +import { + CloudProvider, + COMPUTE_MAX_IOPS, + COMPUTE_MAX_THROUGHPUT, + computeInstanceAddonVariantIdSchema, +} from 'shared-data' import { z } from 'zod' + import { calculateDiskSizeRequiredForIopsWithGp3, calculateDiskSizeRequiredForIopsWithIo2, calculateIopsRequiredForThroughput, - calculateMaxThroughput, calculateMaxIopsAllowedForDiskSizeWithGp3, calculateMaxIopsAllowedForDiskSizeWithio2, + calculateMaxThroughput, formatNumber, } from './DiskManagement.utils' import { DISK_LIMITS, DiskType } from './ui/DiskManagement.constants' -import { COMPUTE_MAX_THROUGHPUT } from 'shared-data' const baseSchema = z.object({ storageType: z.enum(['io2', 'gp3']).describe('Type of storage: io2 or gp3'), diff --git a/apps/studio/components/interfaces/DiskManagement/DiskManagement.types.ts b/apps/studio/components/interfaces/DiskManagement/DiskManagement.types.ts index 1cad60fa35..31cce0ebc4 100644 --- a/apps/studio/components/interfaces/DiskManagement/DiskManagement.types.ts +++ b/apps/studio/components/interfaces/DiskManagement/DiskManagement.types.ts @@ -1,4 +1,4 @@ -import { AddonVariantId } from 'data/subscriptions/types' +import { AddonVariantId } from '@/data/subscriptions/types' export type ComputeInstanceAddonVariantId = | Extract< diff --git a/apps/studio/components/interfaces/DiskManagement/DiskManagement.utils.ts b/apps/studio/components/interfaces/DiskManagement/DiskManagement.utils.ts index ecfac9c1bf..2753d1f199 100644 --- a/apps/studio/components/interfaces/DiskManagement/DiskManagement.utils.ts +++ b/apps/studio/components/interfaces/DiskManagement/DiskManagement.utils.ts @@ -1,6 +1,3 @@ -import { ProjectDetail } from 'data/projects/project-detail-query' -import { PlanId, ProjectAddonVariantMeta } from 'data/subscriptions/types' -import { INSTANCE_MICRO_SPECS, INSTANCE_NANO_SPECS } from 'lib/constants' import { COMPUTE_BASELINE_IOPS, COMPUTE_MAX_IOPS, @@ -13,6 +10,9 @@ import { InfraInstanceSize, } from './DiskManagement.types' import { DISK_LIMITS, DISK_PRICING, DiskType, PLAN_DETAILS } from './ui/DiskManagement.constants' +import { ProjectDetail } from '@/data/projects/project-detail-query' +import { PlanId, ProjectAddonVariantMeta } from '@/data/subscriptions/types' +import { INSTANCE_MICRO_SPECS, INSTANCE_NANO_SPECS } from '@/lib/constants' // Included disk size only applies to primary, not replicas export const calculateDiskSizePrice = ({ diff --git a/apps/studio/components/interfaces/DiskManagement/DiskManagementForm.tsx b/apps/studio/components/interfaces/DiskManagement/DiskManagementForm.tsx index a670255150..ca2d8dde9d 100644 --- a/apps/studio/components/interfaces/DiskManagement/DiskManagementForm.tsx +++ b/apps/studio/components/interfaces/DiskManagement/DiskManagementForm.tsx @@ -1,35 +1,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { MAX_WIDTH_CLASSES, PADDING_CLASSES, ScaffoldContainer } from 'components/layouts/Scaffold' -import { DocsButton } from 'components/ui/DocsButton' -import { RequestUpgradeToBillingOwners } from 'components/ui/RequestUpgradeToBillingOwners' -import { UpgradeToPro } from 'components/ui/UpgradeToPro' -import { - useDiskAttributesQuery, - useRemainingDurationForDiskAttributeUpdate, -} from 'data/config/disk-attributes-query' -import { useUpdateDiskAttributesMutation } from 'data/config/disk-attributes-update-mutation' -import { useDiskAutoscaleCustomConfigQuery } from 'data/config/disk-autoscale-config-query' -import { useUpdateDiskAutoscaleConfigMutation } from 'data/config/disk-autoscale-config-update-mutation' -import { useDiskUtilizationQuery } from 'data/config/disk-utilization-query' -import { useSetProjectStatus } from 'data/projects/project-detail-query' -import { useReadReplicasQuery } from 'data/read-replicas/replicas-query' -import { useProjectAddonUpdateMutation } from 'data/subscriptions/project-addon-update-mutation' -import { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query' -import { AddonVariantId } from 'data/subscriptions/types' -import { useResourceWarningsQuery } from 'data/usage/resource-warnings-query' import { AnimatePresence, motion } from 'framer-motion' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { - useIsAwsCloudProvider, - useIsAwsK8sCloudProvider, - useIsAwsNimbusCloudProvider, - useSelectedProjectQuery, -} from 'hooks/misc/useSelectedProject' -import { DOCS_URL, GB, PROJECT_STATUS } from 'lib/constants' import { ChevronRight } from 'lucide-react' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' @@ -66,6 +38,38 @@ import { } from './ui/DiskManagement.constants' import { NoticeBar } from './ui/NoticeBar' import { SpendCapDisabledSection } from './ui/SpendCapDisabledSection' +import { + MAX_WIDTH_CLASSES, + PADDING_CLASSES, + ScaffoldContainer, +} from '@/components/layouts/Scaffold' +import { DocsButton } from '@/components/ui/DocsButton' +import { RequestUpgradeToBillingOwners } from '@/components/ui/RequestUpgradeToBillingOwners' +import { UpgradeToPro } from '@/components/ui/UpgradeToPro' +import { + useDiskAttributesQuery, + useRemainingDurationForDiskAttributeUpdate, +} from '@/data/config/disk-attributes-query' +import { useUpdateDiskAttributesMutation } from '@/data/config/disk-attributes-update-mutation' +import { useDiskAutoscaleCustomConfigQuery } from '@/data/config/disk-autoscale-config-query' +import { useUpdateDiskAutoscaleConfigMutation } from '@/data/config/disk-autoscale-config-update-mutation' +import { useDiskUtilizationQuery } from '@/data/config/disk-utilization-query' +import { useSetProjectStatus } from '@/data/projects/project-detail-query' +import { useReadReplicasQuery } from '@/data/read-replicas/replicas-query' +import { useProjectAddonUpdateMutation } from '@/data/subscriptions/project-addon-update-mutation' +import { useProjectAddonsQuery } from '@/data/subscriptions/project-addons-query' +import { AddonVariantId } from '@/data/subscriptions/types' +import { useResourceWarningsQuery } from '@/data/usage/resource-warnings-query' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { + useIsAwsCloudProvider, + useIsAwsK8sCloudProvider, + useIsAwsNimbusCloudProvider, + useSelectedProjectQuery, +} from '@/hooks/misc/useSelectedProject' +import { DOCS_URL, GB, PROJECT_STATUS } from '@/lib/constants' export function DiskManagementForm() { const { ref: projectRef } = useParams() diff --git a/apps/studio/components/interfaces/DiskManagement/DiskManagementPanelForm.tsx b/apps/studio/components/interfaces/DiskManagement/DiskManagementPanelForm.tsx index ad61883132..7a1c8baa86 100644 --- a/apps/studio/components/interfaces/DiskManagement/DiskManagementPanelForm.tsx +++ b/apps/studio/components/interfaces/DiskManagement/DiskManagementPanelForm.tsx @@ -1,7 +1,5 @@ -import Link from 'next/link' - import { useParams } from 'common' -import { DOCS_URL } from 'lib/constants' +import Link from 'next/link' import { Button } from 'ui' import { PageSection, @@ -10,9 +8,11 @@ import { PageSectionSummary, PageSectionTitle, } from 'ui-patterns' -import { DocsButton } from '../../ui/DocsButton' import { Admonition } from 'ui-patterns/admonition' +import { DocsButton } from '../../ui/DocsButton' +import { DOCS_URL } from '@/lib/constants' + // [Joshen] Only used for non AWS projects export function DiskManagementPanelForm() { const { ref: projectRef } = useParams() diff --git a/apps/studio/components/interfaces/DiskManagement/DiskManagementRestartRequiredSection.tsx b/apps/studio/components/interfaces/DiskManagement/DiskManagementRestartRequiredSection.tsx index 13d935d535..c09d892760 100644 --- a/apps/studio/components/interfaces/DiskManagement/DiskManagementRestartRequiredSection.tsx +++ b/apps/studio/components/interfaces/DiskManagement/DiskManagementRestartRequiredSection.tsx @@ -1,6 +1,5 @@ import { AnimatePresence, motion } from 'framer-motion' import { RotateCcw } from 'lucide-react' - import { DialogSection, WarningIcon } from 'ui' interface DiskMangementRestartRequiredSectionProps { diff --git a/apps/studio/components/interfaces/DiskManagement/DiskManagementReviewAndSubmitDialog.tsx b/apps/studio/components/interfaces/DiskManagement/DiskManagementReviewAndSubmitDialog.tsx index 161057c799..4478fced0e 100644 --- a/apps/studio/components/interfaces/DiskManagement/DiskManagementReviewAndSubmitDialog.tsx +++ b/apps/studio/components/interfaces/DiskManagement/DiskManagementReviewAndSubmitDialog.tsx @@ -2,13 +2,6 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { ChevronRight } from 'lucide-react' import { useMemo } from 'react' import { UseFormReturn } from 'react-hook-form' - -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useIsAwsNimbusCloudProvider, useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { formatCurrency } from 'lib/helpers' import { Alert_Shadcn_, AlertTitle_Shadcn_, @@ -32,6 +25,7 @@ import { TableRow, WarningIcon, } from 'ui' + import { DiskStorageSchemaType } from './DiskManagement.schema' import { DiskManagementMessage } from './DiskManagement.types' import { @@ -46,6 +40,15 @@ import { DiskMangementRestartRequiredSection } from './DiskManagementRestartRequ import { BillingChangeBadge } from './ui/BillingChangeBadge' import { DISK_AUTOSCALE_CONFIG_DEFAULTS, DiskType } from './ui/DiskManagement.constants' import { DiskMangementCoolDownSection } from './ui/DiskManagementCoolDownSection' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useProjectAddonsQuery } from '@/data/subscriptions/project-addons-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { + useIsAwsNimbusCloudProvider, + useSelectedProjectQuery, +} from '@/hooks/misc/useSelectedProject' +import { formatCurrency } from '@/lib/helpers' const TableHeaderRow = () => ( diff --git a/apps/studio/components/interfaces/DiskManagement/fields/AutoScaleFields.tsx b/apps/studio/components/interfaces/DiskManagement/fields/AutoScaleFields.tsx index 88e8c416ed..b19c104a2b 100644 --- a/apps/studio/components/interfaces/DiskManagement/fields/AutoScaleFields.tsx +++ b/apps/studio/components/interfaces/DiskManagement/fields/AutoScaleFields.tsx @@ -1,6 +1,5 @@ import { InputVariants } from '@ui/components/shadcn/ui/input' import { useParams } from 'common' -import { useDiskAutoscaleCustomConfigQuery } from 'data/config/disk-autoscale-config-query' import { UseFormReturn } from 'react-hook-form' import { cn, @@ -16,6 +15,7 @@ import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { DiskStorageSchemaType } from '../DiskManagement.schema' import { DISK_AUTOSCALE_CONFIG_DEFAULTS } from '../ui/DiskManagement.constants' +import { useDiskAutoscaleCustomConfigQuery } from '@/data/config/disk-autoscale-config-query' type AutoScaleFieldProps = { form: UseFormReturn diff --git a/apps/studio/components/interfaces/DiskManagement/fields/ComputeSizeField.tsx b/apps/studio/components/interfaces/DiskManagement/fields/ComputeSizeField.tsx index 10859b0dfa..0a8ecbc8d4 100644 --- a/apps/studio/components/interfaces/DiskManagement/fields/ComputeSizeField.tsx +++ b/apps/studio/components/interfaces/DiskManagement/fields/ComputeSizeField.tsx @@ -1,19 +1,8 @@ +import { SupportCategories } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { CpuIcon, Lock, Microchip } from 'lucide-react' import { useMemo } from 'react' import { UseFormReturn } from 'react-hook-form' - -import { SupportCategories } from '@supabase/shared-types/out/constants' -import { useParams } from 'common' -import { SupportLink } from 'components/interfaces/Support/SupportLink' -import { DocsButton } from 'components/ui/DocsButton' -import { InlineLink } from 'components/ui/InlineLink' -import { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { getCloudProviderArchitecture } from 'lib/cloudprovider-utils' -import { DOCS_URL, InstanceSpecs } from 'lib/constants' import { cn, FormField_Shadcn_, @@ -26,16 +15,27 @@ import { } from 'ui' import { ComputeBadge } from 'ui-patterns' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' + import { DiskStorageSchemaType } from '../DiskManagement.schema' import { ComputeInstanceAddonVariantId, InfraInstanceSize } from '../DiskManagement.types' import { calculateComputeSizePrice, - getAvailableComputeOptions, ComputeAddonVariant, + getAvailableComputeOptions, } from '../DiskManagement.utils' import { BillingChangeBadge } from '../ui/BillingChangeBadge' import FormMessage from '../ui/FormMessage' import { NoticeBar } from '../ui/NoticeBar' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' +import { DocsButton } from '@/components/ui/DocsButton' +import { InlineLink } from '@/components/ui/InlineLink' +import { useProjectAddonsQuery } from '@/data/subscriptions/project-addons-query' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { getCloudProviderArchitecture } from '@/lib/cloudprovider-utils' +import { DOCS_URL, InstanceSpecs } from '@/lib/constants' /** * to do: this could be a type from api-types diff --git a/apps/studio/components/interfaces/DiskManagement/fields/DiskSizeField.tsx b/apps/studio/components/interfaces/DiskManagement/fields/DiskSizeField.tsx index 676fb52f85..7ccde9883c 100644 --- a/apps/studio/components/interfaces/DiskManagement/fields/DiskSizeField.tsx +++ b/apps/studio/components/interfaces/DiskManagement/fields/DiskSizeField.tsx @@ -1,11 +1,5 @@ import { useParams } from 'common' -import { DocsButton } from 'components/ui/DocsButton' -import { useDiskAttributesQuery } from 'data/config/disk-attributes-query' -import { useDiskUtilizationQuery } from 'data/config/disk-utilization-query' import dayjs from 'dayjs' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL, GB } from 'lib/constants' import { RotateCcw } from 'lucide-react' import { UseFormReturn } from 'react-hook-form' import { @@ -28,6 +22,12 @@ import { DiskManagementDiskSizeReadReplicas } from '../ui/DiskManagementReadRepl import { DiskSpaceBar } from '../ui/DiskSpaceBar' import { DiskTypeRecommendationSection } from '../ui/DiskTypeRecommendationSection' import FormMessage from '../ui/FormMessage' +import { DocsButton } from '@/components/ui/DocsButton' +import { useDiskAttributesQuery } from '@/data/config/disk-attributes-query' +import { useDiskUtilizationQuery } from '@/data/config/disk-utilization-query' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL, GB } from '@/lib/constants' type DiskSizeFieldProps = { form: UseFormReturn diff --git a/apps/studio/components/interfaces/DiskManagement/fields/IOPSField.tsx b/apps/studio/components/interfaces/DiskManagement/fields/IOPSField.tsx index 2c7e8f2ce6..604fdb3c48 100644 --- a/apps/studio/components/interfaces/DiskManagement/fields/IOPSField.tsx +++ b/apps/studio/components/interfaces/DiskManagement/fields/IOPSField.tsx @@ -1,6 +1,5 @@ import { InputVariants } from '@ui/components/shadcn/ui/input' import { useParams } from 'common' -import { useDiskAttributesQuery } from 'data/config/disk-attributes-query' import { UseFormReturn } from 'react-hook-form' import { Button, @@ -22,6 +21,7 @@ import { BillingChangeBadge } from '../ui/BillingChangeBadge' import { ComputeSizeRecommendationSection } from '../ui/ComputeSizeRecommendationSection' import { DiskType, RESTRICTED_COMPUTE_FOR_IOPS_ON_GP3 } from '../ui/DiskManagement.constants' import { DiskManagementIOPSReadReplicas } from '../ui/DiskManagementReadReplicas' +import { useDiskAttributesQuery } from '@/data/config/disk-attributes-query' type IOPSFieldProps = { form: UseFormReturn diff --git a/apps/studio/components/interfaces/DiskManagement/fields/StorageTypeField.tsx b/apps/studio/components/interfaces/DiskManagement/fields/StorageTypeField.tsx index 72c046ea60..ce138838fb 100644 --- a/apps/studio/components/interfaces/DiskManagement/fields/StorageTypeField.tsx +++ b/apps/studio/components/interfaces/DiskManagement/fields/StorageTypeField.tsx @@ -1,9 +1,5 @@ -import { UseFormReturn } from 'react-hook-form' - import { useParams } from 'common' -import { InlineLink } from 'components/ui/InlineLink' -import { useDiskAttributesQuery } from 'data/config/disk-attributes-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' +import { UseFormReturn } from 'react-hook-form' import { Badge, buttonVariants, @@ -21,10 +17,14 @@ import { TooltipTrigger, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' + import { IO2_AVAILABLE_REGIONS } from '../DiskManagement.constants' import { DiskStorageSchemaType } from '../DiskManagement.schema' import { DISK_LIMITS, DISK_TYPE_OPTIONS, DiskType } from '../ui/DiskManagement.constants' import FormMessage from '../ui/FormMessage' +import { InlineLink } from '@/components/ui/InlineLink' +import { useDiskAttributesQuery } from '@/data/config/disk-attributes-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' type StorageTypeFieldProps = { form: UseFormReturn diff --git a/apps/studio/components/interfaces/DiskManagement/fields/ThroughputField.tsx b/apps/studio/components/interfaces/DiskManagement/fields/ThroughputField.tsx index ba887cad1e..10cd39b1ed 100644 --- a/apps/studio/components/interfaces/DiskManagement/fields/ThroughputField.tsx +++ b/apps/studio/components/interfaces/DiskManagement/fields/ThroughputField.tsx @@ -1,6 +1,5 @@ import { InputVariants } from '@ui/components/shadcn/ui/input' import { useParams } from 'common' -import { useDiskAttributesQuery } from 'data/config/disk-attributes-query' import { AnimatePresence, motion } from 'framer-motion' import { useEffect } from 'react' import { UseFormReturn } from 'react-hook-form' @@ -23,6 +22,7 @@ import { RESTRICTED_COMPUTE_FOR_IOPS_ON_GP3, } from '../ui/DiskManagement.constants' import { DiskManagementThroughputReadReplicas } from '../ui/DiskManagementReadReplicas' +import { useDiskAttributesQuery } from '@/data/config/disk-attributes-query' type ThroughputFieldProps = { form: UseFormReturn diff --git a/apps/studio/components/interfaces/DiskManagement/ui/BillingChangeBadge.tsx b/apps/studio/components/interfaces/DiskManagement/ui/BillingChangeBadge.tsx index f64d8a2d42..364968da18 100644 --- a/apps/studio/components/interfaces/DiskManagement/ui/BillingChangeBadge.tsx +++ b/apps/studio/components/interfaces/DiskManagement/ui/BillingChangeBadge.tsx @@ -1,9 +1,9 @@ import { AnimatePresence, motion } from 'framer-motion' import { ChevronRight } from 'lucide-react' - -import { formatCurrency } from 'lib/helpers' import { Badge, cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' +import { formatCurrency } from '@/lib/helpers' + interface BillingChangeBadgeProps { beforePrice?: number afterPrice?: number diff --git a/apps/studio/components/interfaces/DiskManagement/ui/ComputeSizeRecommendationSection.tsx b/apps/studio/components/interfaces/DiskManagement/ui/ComputeSizeRecommendationSection.tsx index 40aa9d94bb..bf6c05bb26 100644 --- a/apps/studio/components/interfaces/DiskManagement/ui/ComputeSizeRecommendationSection.tsx +++ b/apps/studio/components/interfaces/DiskManagement/ui/ComputeSizeRecommendationSection.tsx @@ -1,15 +1,15 @@ import { AnimatePresence, motion } from 'framer-motion' import { ReactNode } from 'react' import { UseFormReturn } from 'react-hook-form' - +import { COMPUTE_BASELINE_IOPS, COMPUTE_MAX_IOPS } from 'shared-data' import { Admonition } from 'ui-patterns/admonition' + import { DiskStorageSchemaType } from '../DiskManagement.schema' import { calculateComputeSizeRequiredForIops, calculateMaxIopsForComputeSize, mapAddOnVariantIdToComputeSize, } from '../DiskManagement.utils' -import { COMPUTE_BASELINE_IOPS, COMPUTE_MAX_IOPS } from 'shared-data' import { RESTRICTED_COMPUTE_FOR_IOPS_ON_GP3 } from './DiskManagement.constants' interface ComputeSizeRecommendationSectionProps { diff --git a/apps/studio/components/interfaces/DiskManagement/ui/DiskCountdownRadial.tsx b/apps/studio/components/interfaces/DiskManagement/ui/DiskCountdownRadial.tsx index 510bf8e13e..3a5e877239 100644 --- a/apps/studio/components/interfaces/DiskManagement/ui/DiskCountdownRadial.tsx +++ b/apps/studio/components/interfaces/DiskManagement/ui/DiskCountdownRadial.tsx @@ -1,14 +1,13 @@ +import { useParams } from 'common' import { AnimatePresence, motion } from 'framer-motion' import { useEffect, useState } from 'react' - -import { useParams } from 'common' -import CountdownTimerRadial from 'components/ui/CountdownTimer/CountdownTimerRadial' -import CountdownTimerSpan from 'components/ui/CountdownTimer/CountdownTimerSpan' -import { useRemainingDurationForDiskAttributeUpdate } from 'data/config/disk-attributes-query' -import { COOLDOWN_DURATION } from 'data/config/disk-attributes-update-mutation' import { Card, CardContent } from 'ui' import FormMessage from './FormMessage' +import CountdownTimerRadial from '@/components/ui/CountdownTimer/CountdownTimerRadial' +import CountdownTimerSpan from '@/components/ui/CountdownTimer/CountdownTimerSpan' +import { useRemainingDurationForDiskAttributeUpdate } from '@/data/config/disk-attributes-query' +import { COOLDOWN_DURATION } from '@/data/config/disk-attributes-update-mutation' export function DiskCountdownRadial() { const { ref } = useParams() diff --git a/apps/studio/components/interfaces/DiskManagement/ui/DiskManagement.constants.tsx b/apps/studio/components/interfaces/DiskManagement/ui/DiskManagement.constants.tsx index 4850a28837..782ae78a15 100644 --- a/apps/studio/components/interfaces/DiskManagement/ui/DiskManagement.constants.tsx +++ b/apps/studio/components/interfaces/DiskManagement/ui/DiskManagement.constants.tsx @@ -1,4 +1,4 @@ -import { PlanId } from 'data/subscriptions/types' +import { PlanId } from '@/data/subscriptions/types' // Disk Storage expands automatically when the database reaches 90% of the disk size export const AUTOSCALING_THRESHOLD = 0.9 diff --git a/apps/studio/components/interfaces/DiskManagement/ui/DiskManagementCoolDownSection.tsx b/apps/studio/components/interfaces/DiskManagement/ui/DiskManagementCoolDownSection.tsx index 766a22b09d..a9c962d7af 100644 --- a/apps/studio/components/interfaces/DiskManagement/ui/DiskManagementCoolDownSection.tsx +++ b/apps/studio/components/interfaces/DiskManagement/ui/DiskManagementCoolDownSection.tsx @@ -1,9 +1,9 @@ import { AnimatePresence, motion } from 'framer-motion' import { useEffect, useState } from 'react' - -import CountdownTimerRadial from 'components/ui/CountdownTimer/CountdownTimerRadial' import { DialogSection } from 'ui' +import CountdownTimerRadial from '@/components/ui/CountdownTimer/CountdownTimerRadial' + export const DiskMangementCoolDownSection = ({ visible }: { visible: boolean }) => { const [progress, setProgress] = useState(100) const [showCountdown, setShowCountdown] = useState(false) diff --git a/apps/studio/components/interfaces/DiskManagement/ui/DiskManagementReadReplicas.tsx b/apps/studio/components/interfaces/DiskManagement/ui/DiskManagementReadReplicas.tsx index ed2fd756bd..2bbc81edad 100644 --- a/apps/studio/components/interfaces/DiskManagement/ui/DiskManagementReadReplicas.tsx +++ b/apps/studio/components/interfaces/DiskManagement/ui/DiskManagementReadReplicas.tsx @@ -1,16 +1,16 @@ -import { AnimatePresence, motion } from 'framer-motion' - import { useParams } from 'common' -import { useReadReplicasQuery } from 'data/read-replicas/replicas-query' -import { formatDatabaseID } from 'data/read-replicas/replicas.utils' +import { AnimatePresence, motion } from 'framer-motion' import { Alert_Shadcn_ as Alert, AlertDescription_Shadcn_ as AlertDescription, AlertTitle_Shadcn_ as AlertTitle, InfoIcon, } from 'ui' + import { BillingChangeBadge } from './BillingChangeBadge' import { DISK_LIMITS, DISK_PRICING, DiskType } from './DiskManagement.constants' +import { useReadReplicasQuery } from '@/data/read-replicas/replicas-query' +import { formatDatabaseID } from '@/data/read-replicas/replicas.utils' interface DiskManagementDiskSizeReadReplicasProps { isDirty: boolean diff --git a/apps/studio/components/interfaces/DiskManagement/ui/DiskSpaceBar.tsx b/apps/studio/components/interfaces/DiskManagement/ui/DiskSpaceBar.tsx index 7fbcd6c735..5dea41b351 100644 --- a/apps/studio/components/interfaces/DiskManagement/ui/DiskSpaceBar.tsx +++ b/apps/studio/components/interfaces/DiskManagement/ui/DiskSpaceBar.tsx @@ -1,19 +1,19 @@ import MotionNumber from '@number-flow/react' +import { useParams } from 'common' import { AnimatePresence, motion } from 'framer-motion' import { Info } from 'lucide-react' import { useTheme } from 'next-themes' -import { UseFormReturn } from 'react-hook-form' - -import { useParams } from 'common' -import { useDiskBreakdownQuery } from 'data/config/disk-breakdown-query' -import { useDiskUtilizationQuery } from 'data/config/disk-utilization-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { GB } from 'lib/constants' -import { formatBytes } from 'lib/helpers' import { useMemo } from 'react' +import { UseFormReturn } from 'react-hook-form' import { Badge, cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' + import { DiskStorageSchemaType } from '../DiskManagement.schema' import { AUTOSCALING_THRESHOLD } from './DiskManagement.constants' +import { useDiskBreakdownQuery } from '@/data/config/disk-breakdown-query' +import { useDiskUtilizationQuery } from '@/data/config/disk-utilization-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { GB } from '@/lib/constants' +import { formatBytes } from '@/lib/helpers' interface DiskSpaceBarProps { form: UseFormReturn diff --git a/apps/studio/components/interfaces/DiskManagement/ui/DiskTypeRecommendationSection.tsx b/apps/studio/components/interfaces/DiskManagement/ui/DiskTypeRecommendationSection.tsx index 4e09f85aa7..f5f9ba7df3 100644 --- a/apps/studio/components/interfaces/DiskManagement/ui/DiskTypeRecommendationSection.tsx +++ b/apps/studio/components/interfaces/DiskManagement/ui/DiskTypeRecommendationSection.tsx @@ -1,8 +1,8 @@ import { AnimatePresence, motion } from 'framer-motion' import { ReactNode } from 'react' import { UseFormReturn } from 'react-hook-form' - import { Admonition } from 'ui-patterns/admonition' + import { DiskStorageSchemaType } from '../DiskManagement.schema' import { DISK_LIMITS, DISK_TYPE_OPTIONS, DiskType } from './DiskManagement.constants' diff --git a/apps/studio/components/interfaces/DiskManagement/ui/NoticeBar.tsx b/apps/studio/components/interfaces/DiskManagement/ui/NoticeBar.tsx index e3353565e9..388289c7e0 100644 --- a/apps/studio/components/interfaces/DiskManagement/ui/NoticeBar.tsx +++ b/apps/studio/components/interfaces/DiskManagement/ui/NoticeBar.tsx @@ -1,7 +1,6 @@ import { AnimatePresence, motion } from 'framer-motion' import { type ComponentProps, type ReactNode } from 'react' import { cn } from 'ui' - import { Admonition } from 'ui-patterns' /** diff --git a/apps/studio/components/interfaces/DiskManagement/ui/SpendCapDisabledSection.tsx b/apps/studio/components/interfaces/DiskManagement/ui/SpendCapDisabledSection.tsx index 58fb36352a..225fd543df 100644 --- a/apps/studio/components/interfaces/DiskManagement/ui/SpendCapDisabledSection.tsx +++ b/apps/studio/components/interfaces/DiskManagement/ui/SpendCapDisabledSection.tsx @@ -1,8 +1,5 @@ import { AnimatePresence, motion } from 'framer-motion' import Link from 'next/link' - -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { AlertDescription_Shadcn_ as AlertDescription, AlertTitle_Shadcn_ as AlertTitle, @@ -11,6 +8,9 @@ import { } from 'ui' import { Admonition } from 'ui-patterns/admonition' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' + export function SpendCapDisabledSection() { const { data: org } = useSelectedOrganizationQuery() const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Docs/Description.tsx b/apps/studio/components/interfaces/Docs/Description.tsx index 06dad2b652..d39b0e860d 100644 --- a/apps/studio/components/interfaces/Docs/Description.tsx +++ b/apps/studio/components/interfaces/Docs/Description.tsx @@ -1,16 +1,16 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { noop } from 'lodash' +import { Loader } from 'lucide-react' import { useState } from 'react' import { toast } from 'sonner' - -import AutoTextArea from 'components/to-be-cleaned/forms/AutoTextArea' -import { executeSql } from 'data/sql/execute-sql-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { timeout } from 'lib/helpers' -import { Loader } from 'lucide-react' import { Button } from 'ui' +import AutoTextArea from '@/components/to-be-cleaned/forms/AutoTextArea' +import { executeSql } from '@/data/sql/execute-sql-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { timeout } from '@/lib/helpers' + // Removes some auto-generated Postgrest text // Ideally PostgREST wouldn't add this if there is already a comment const temp_removePostgrestText = (content: string) => { diff --git a/apps/studio/components/interfaces/Docs/PublicSchemaNotEnabledAlert.tsx b/apps/studio/components/interfaces/Docs/PublicSchemaNotEnabledAlert.tsx index 15d2a8b505..2965fb7bb3 100644 --- a/apps/studio/components/interfaces/Docs/PublicSchemaNotEnabledAlert.tsx +++ b/apps/studio/components/interfaces/Docs/PublicSchemaNotEnabledAlert.tsx @@ -1,6 +1,5 @@ -import Link from 'next/link' - import { useParams } from 'common' +import Link from 'next/link' import { Button } from 'ui' import { Admonition } from 'ui-patterns' diff --git a/apps/studio/components/interfaces/EdgeFunctions/DeployEdgeFunctionButton.tsx b/apps/studio/components/interfaces/EdgeFunctions/DeployEdgeFunctionButton.tsx index 06b36e3419..396c963390 100644 --- a/apps/studio/components/interfaces/EdgeFunctions/DeployEdgeFunctionButton.tsx +++ b/apps/studio/components/interfaces/EdgeFunctions/DeployEdgeFunctionButton.tsx @@ -1,12 +1,7 @@ import { useParams } from 'common' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { ChevronDown, Code, Terminal } from 'lucide-react' import { useRouter } from 'next/router' import { parseAsString, useQueryState } from 'nuqs' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { AiIconAnimation, DropdownMenu, @@ -15,8 +10,13 @@ import { DropdownMenuTrigger, } from 'ui' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' import { useIsProjectActive } from '@/hooks/misc/useSelectedProject' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' export const DeployEdgeFunctionButton = () => { const router = useRouter() diff --git a/apps/studio/components/interfaces/ErrorHandling/ErrorMatcher.test.tsx b/apps/studio/components/interfaces/ErrorHandling/ErrorMatcher.test.tsx index 38266a28e8..a8c30c5ae9 100644 --- a/apps/studio/components/interfaces/ErrorHandling/ErrorMatcher.test.tsx +++ b/apps/studio/components/interfaces/ErrorHandling/ErrorMatcher.test.tsx @@ -1,9 +1,9 @@ import { render, screen } from '@testing-library/react' -import { ConnectionTimeoutError } from 'types/api-errors' -import { ResponseError } from 'types/base' import { beforeEach, describe, expect, it, vi } from 'vitest' import { ErrorMatcher } from './ErrorMatcher' +import { ConnectionTimeoutError } from '@/types/api-errors' +import { ResponseError } from '@/types/base' vi.mock('lib/telemetry/track', () => ({ useTrack: () => vi.fn() })) vi.mock('state/ai-assistant-state', () => ({ diff --git a/apps/studio/components/interfaces/ErrorHandling/ErrorMatcher.tsx b/apps/studio/components/interfaces/ErrorHandling/ErrorMatcher.tsx index 9205be22a6..1542c9658e 100644 --- a/apps/studio/components/interfaces/ErrorHandling/ErrorMatcher.tsx +++ b/apps/studio/components/interfaces/ErrorHandling/ErrorMatcher.tsx @@ -1,9 +1,9 @@ 'use client' -import { useTrack } from 'lib/telemetry/track' import { ErrorDisplay, SupportFormParams } from 'ui-patterns/ErrorDisplay/ErrorDisplay' import { getMappingForError } from './ErrorMatcher.utils' +import { useTrack } from '@/lib/telemetry/track' interface ErrorMatcherProps { title: string diff --git a/apps/studio/components/interfaces/ErrorHandling/ErrorMatcher.utils.test.ts b/apps/studio/components/interfaces/ErrorHandling/ErrorMatcher.utils.test.ts index 34d3a7cbe9..f3a286fa40 100644 --- a/apps/studio/components/interfaces/ErrorHandling/ErrorMatcher.utils.test.ts +++ b/apps/studio/components/interfaces/ErrorHandling/ErrorMatcher.utils.test.ts @@ -1,7 +1,7 @@ -import { ConnectionTimeoutError, UnknownAPIResponseError } from 'types/api-errors' import { describe, expect, it } from 'vitest' import { getMappingForError } from './ErrorMatcher.utils' +import { ConnectionTimeoutError, UnknownAPIResponseError } from '@/types/api-errors' describe('getMappingForError', () => { it('returns the mapping for a classified error with a known errorType', () => { diff --git a/apps/studio/components/interfaces/ErrorHandling/ErrorMatcher.utils.ts b/apps/studio/components/interfaces/ErrorHandling/ErrorMatcher.utils.ts index 09f7321831..72543d5608 100644 --- a/apps/studio/components/interfaces/ErrorHandling/ErrorMatcher.utils.ts +++ b/apps/studio/components/interfaces/ErrorHandling/ErrorMatcher.utils.ts @@ -1,6 +1,5 @@ -import { ResponseError } from 'types/base' - import { ERROR_MAPPINGS, type ErrorMapping } from './error-mappings' +import { ResponseError } from '@/types/base' export function getMappingForError(error: unknown): ErrorMapping | null { const isResponseError = error instanceof ResponseError diff --git a/apps/studio/components/interfaces/ErrorHandling/RestartProjectDialog.tsx b/apps/studio/components/interfaces/ErrorHandling/RestartProjectDialog.tsx index 4e015f323d..2eaaef9142 100644 --- a/apps/studio/components/interfaces/ErrorHandling/RestartProjectDialog.tsx +++ b/apps/studio/components/interfaces/ErrorHandling/RestartProjectDialog.tsx @@ -1,16 +1,17 @@ 'use client' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { useSetProjectStatus } from 'data/projects/project-detail-query' -import { useProjectRestartMutation } from 'data/projects/project-restart-mutation' -import { useProjectRestartServicesMutation } from 'data/projects/project-restart-services-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { PROJECT_STATUS } from 'lib/constants' import { useRouter } from 'next/router' import { toast } from 'sonner' import { ConfirmationModal } from 'ui-patterns/Dialogs/ConfirmationModal' +import { useSetProjectStatus } from '@/data/projects/project-detail-query' +import { useProjectRestartMutation } from '@/data/projects/project-restart-mutation' +import { useProjectRestartServicesMutation } from '@/data/projects/project-restart-services-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { PROJECT_STATUS } from '@/lib/constants' + interface RestartProjectDialogProps { visible: boolean onClose: () => void diff --git a/apps/studio/components/interfaces/ErrorHandling/TroubleshootingAccordion.tsx b/apps/studio/components/interfaces/ErrorHandling/TroubleshootingAccordion.tsx index c65f398cab..56d143270e 100644 --- a/apps/studio/components/interfaces/ErrorHandling/TroubleshootingAccordion.tsx +++ b/apps/studio/components/interfaces/ErrorHandling/TroubleshootingAccordion.tsx @@ -1,9 +1,10 @@ 'use client' -import { useTrack } from 'lib/telemetry/track' import { ReactNode } from 'react' import { Accordion_Shadcn_ as Accordion, cn } from 'ui' +import { useTrack } from '@/lib/telemetry/track' + interface TroubleshootingAccordionProps { children: ReactNode /** Error mapping ID — used for telemetry */ diff --git a/apps/studio/components/interfaces/ErrorHandling/TroubleshootingSections.tsx b/apps/studio/components/interfaces/ErrorHandling/TroubleshootingSections.tsx index e1b7a4b46a..9f861a2371 100644 --- a/apps/studio/components/interfaces/ErrorHandling/TroubleshootingSections.tsx +++ b/apps/studio/components/interfaces/ErrorHandling/TroubleshootingSections.tsx @@ -1,7 +1,5 @@ 'use client' -import { AiAssistantDropdown } from 'components/ui/AiAssistantDropdown' -import { useTrack } from 'lib/telemetry/track' import { ExternalLink } from 'lucide-react' import { useState } from 'react' import { @@ -12,6 +10,8 @@ import { } from 'ui' import { RestartProjectDialog } from './RestartProjectDialog' +import { AiAssistantDropdown } from '@/components/ui/AiAssistantDropdown' +import { useTrack } from '@/lib/telemetry/track' interface StepTriggerProps { number: number diff --git a/apps/studio/components/interfaces/ErrorHandling/error-mappings.tsx b/apps/studio/components/interfaces/ErrorHandling/error-mappings.tsx index b5ac4ecf9a..8cedd1e26d 100644 --- a/apps/studio/components/interfaces/ErrorHandling/error-mappings.tsx +++ b/apps/studio/components/interfaces/ErrorHandling/error-mappings.tsx @@ -1,9 +1,9 @@ import { ComponentType } from 'react' -import { ConnectionTimeoutError } from 'types/api-errors' -import type { ClassifiedError, KnownErrorType } from 'types/api-errors' -import type { ResponseError } from 'types/base' import { ConnectionTimeoutTroubleshooting } from './errorMappings/ConnectionTimeout' +import { ConnectionTimeoutError } from '@/types/api-errors' +import type { ClassifiedError, KnownErrorType } from '@/types/api-errors' +import type { ResponseError } from '@/types/base' export interface ErrorMapping { id: KnownErrorType diff --git a/apps/studio/components/interfaces/ErrorHandling/errorMappings/ConnectionTimeout.tsx b/apps/studio/components/interfaces/ErrorHandling/errorMappings/ConnectionTimeout.tsx index db01ae411d..7ad79acc3b 100644 --- a/apps/studio/components/interfaces/ErrorHandling/errorMappings/ConnectionTimeout.tsx +++ b/apps/studio/components/interfaces/ErrorHandling/errorMappings/ConnectionTimeout.tsx @@ -1,13 +1,12 @@ -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' - import { TroubleshootingAccordion } from '../TroubleshootingAccordion' import { FixWithAITroubleshootingSection, RestartDatabaseTroubleshootingSection, TroubleshootingGuideSection, } from '../TroubleshootingSections' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' const ERROR_TYPE = 'connection-timeout' diff --git a/apps/studio/components/interfaces/ExplainVisualizer/ExplainVisualizer.Header.tsx b/apps/studio/components/interfaces/ExplainVisualizer/ExplainVisualizer.Header.tsx index 24b8d8fc2d..4d19e9fa80 100644 --- a/apps/studio/components/interfaces/ExplainVisualizer/ExplainVisualizer.Header.tsx +++ b/apps/studio/components/interfaces/ExplainVisualizer/ExplainVisualizer.Header.tsx @@ -1,13 +1,13 @@ -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { AiAssistantDropdown } from 'components/ui/AiAssistantDropdown' import { Code, Eye, HelpCircle } from 'lucide-react' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' -import { useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' import { Button, Tooltip, TooltipContent, TooltipTrigger } from 'ui' import { buildExplainPrompt } from './ExplainVisualizer.ai' import type { QueryPlanRow } from './ExplainVisualizer.types' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { AiAssistantDropdown } from '@/components/ui/AiAssistantDropdown' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' +import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' export interface ExplainSummary { totalTime: number diff --git a/apps/studio/components/interfaces/ExplainVisualizer/ExplainVisualizer.NodeRow.tsx b/apps/studio/components/interfaces/ExplainVisualizer/ExplainVisualizer.NodeRow.tsx index 506a13b0ed..5c318d567e 100644 --- a/apps/studio/components/interfaces/ExplainVisualizer/ExplainVisualizer.NodeRow.tsx +++ b/apps/studio/components/interfaces/ExplainVisualizer/ExplainVisualizer.NodeRow.tsx @@ -1,9 +1,10 @@ +import { ChevronDown, ChevronRight } from 'lucide-react' import { useState } from 'react' -import { ChevronRight, ChevronDown } from 'lucide-react' import { cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' + +import { parseDetailLines } from './ExplainVisualizer.parser' import { RowCountIndicator } from './ExplainVisualizer.RowCountIndicator' import type { ExplainNode } from './ExplainVisualizer.types' -import { parseDetailLines } from './ExplainVisualizer.parser' import { formatNodeDuration, getScanBarColor, getScanBorderColor } from './ExplainVisualizer.utils' interface ExplainNodeRowProps { diff --git a/apps/studio/components/interfaces/ExplainVisualizer/ExplainVisualizer.tsx b/apps/studio/components/interfaces/ExplainVisualizer/ExplainVisualizer.tsx index 1c030dfa40..fea215fc03 100644 --- a/apps/studio/components/interfaces/ExplainVisualizer/ExplainVisualizer.tsx +++ b/apps/studio/components/interfaces/ExplainVisualizer/ExplainVisualizer.tsx @@ -1,4 +1,5 @@ import { useMemo } from 'react' + import { ExplainHeader } from './ExplainVisualizer.Header' import { ExplainNodeRow } from './ExplainVisualizer.NodeRow' import { calculateMaxDuration, calculateSummary, createNodeTree } from './ExplainVisualizer.parser' diff --git a/apps/studio/components/interfaces/ExplainVisualizer/ExplainVisualizer.utils.ts b/apps/studio/components/interfaces/ExplainVisualizer/ExplainVisualizer.utils.ts index a87fde3c40..a305512a8a 100644 --- a/apps/studio/components/interfaces/ExplainVisualizer/ExplainVisualizer.utils.ts +++ b/apps/studio/components/interfaces/ExplainVisualizer/ExplainVisualizer.utils.ts @@ -3,10 +3,10 @@ import { Database, GitMerge, Hash, + Layers, ListFilter, SortAsc, Zap, - Layers, type LucideIcon, } from 'lucide-react' diff --git a/apps/studio/components/interfaces/Functions/CommandRender.tsx b/apps/studio/components/interfaces/Functions/CommandRender.tsx index df92d2c8fe..37ad088e1b 100644 --- a/apps/studio/components/interfaces/Functions/CommandRender.tsx +++ b/apps/studio/components/interfaces/Functions/CommandRender.tsx @@ -1,6 +1,5 @@ import { Check, Copy } from 'lucide-react' import { forwardRef, useState } from 'react' - import { cn, copyToClipboard } from 'ui' const CommandRender = forwardRef( diff --git a/apps/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionDetails.utils.tsx b/apps/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionDetails.utils.tsx index 448e73ebf1..25fe2a6cc0 100644 --- a/apps/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionDetails.utils.tsx +++ b/apps/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionDetails.utils.tsx @@ -1,4 +1,4 @@ -import { EdgeFunction } from 'data/edge-functions/edge-function-query' +import { EdgeFunction } from '@/data/edge-functions/edge-function-query' export const generateCLICommands = ({ selectedFunction, diff --git a/apps/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionTesterSheet.tsx b/apps/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionTesterSheet.tsx index 963937919e..79ff11e525 100644 --- a/apps/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionTesterSheet.tsx +++ b/apps/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionTesterSheet.tsx @@ -1,25 +1,9 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { RoleImpersonationPopover } from 'components/interfaces/RoleImpersonationSelector/RoleImpersonationPopover' -import { getKeys, useAPIKeysQuery } from 'data/api-keys/api-keys-query' -import { useSessionAccessTokenQuery } from 'data/auth/session-access-token-query' -import { useProjectPostgrestConfigQuery } from 'data/config/project-postgrest-config-query' -import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' -import { useEdgeFunctionTestMutation } from 'data/edge-functions/edge-function-test-mutation' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { IS_PLATFORM } from 'lib/constants' -import { prettifyJSON } from 'lib/helpers' -import { getRoleImpersonationJWT } from 'lib/role-impersonation' import { Loader2, Plus, Send, X } from 'lucide-react' import { useState } from 'react' import { useFieldArray, useForm } from 'react-hook-form' -import { - RoleImpersonationStateContextProvider, - useGetImpersonatedRoleState, -} from 'state/role-impersonation-state' import { Badge, Button, @@ -53,6 +37,22 @@ import * as z from 'zod' import { HTTP_METHODS } from './EdgeFunctionDetails.constants' import { ErrorWithStatus, ResponseData } from './EdgeFunctionDetails.types' +import { RoleImpersonationPopover } from '@/components/interfaces/RoleImpersonationSelector/RoleImpersonationPopover' +import { getKeys, useAPIKeysQuery } from '@/data/api-keys/api-keys-query' +import { useSessionAccessTokenQuery } from '@/data/auth/session-access-token-query' +import { useProjectPostgrestConfigQuery } from '@/data/config/project-postgrest-config-query' +import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' +import { useEdgeFunctionTestMutation } from '@/data/edge-functions/edge-function-test-mutation' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { IS_PLATFORM } from '@/lib/constants' +import { prettifyJSON } from '@/lib/helpers' +import { getRoleImpersonationJWT } from '@/lib/role-impersonation' +import { + RoleImpersonationStateContextProvider, + useGetImpersonatedRoleState, +} from '@/state/role-impersonation-state' interface EdgeFunctionTesterSheetProps { visible: boolean diff --git a/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionInvocationsSection.tsx b/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionInvocationsSection.tsx index 9d43ec7a87..d85fa8ecf0 100644 --- a/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionInvocationsSection.tsx +++ b/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionInvocationsSection.tsx @@ -22,8 +22,8 @@ import { getChartEmptyStateCopy, getSegmentedButtonClassName, } from './EdgeFunctionOverview.utils' -import { toAlertError } from './EdgeFunctionRecentErrors.utils' import type { InvocationChartDatum, InvocationUpdateAnnotation } from './EdgeFunctionOverview.utils' +import { toAlertError } from './EdgeFunctionRecentErrors.utils' interface EdgeFunctionInvocationsSectionProps { interval: string diff --git a/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionOverview.tsx b/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionOverview.tsx index c7c5e049a2..3cd9d54e4a 100644 --- a/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionOverview.tsx +++ b/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionOverview.tsx @@ -1,18 +1,6 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { IS_PLATFORM, useParams } from 'common' import { useUnifiedLogsPreview } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' -import { - EDGE_FUNCTION_CHART_INTERVALS, - getBucketedTimeRange, - getExecutionMetrics, - getInvocationChartData, - getInvocationTotals, - getInvocationUpdateAnnotation, - getRollingTimeRange, - getUsageMetrics, - toEdgeFunctionChartData, -} from './EdgeFunctionOverview.utils' -import type { EdgeFunctionChartRawDatum } from './EdgeFunctionOverview.utils' import NoPermission from 'components/ui/NoPermission' import { FunctionsCombinedStatsVariables, @@ -26,6 +14,18 @@ import { useRouter } from 'next/router' import { useEffect, useMemo, useState } from 'react' import { EdgeFunctionInvocationsSection } from './EdgeFunctionInvocationsSection' +import { + EDGE_FUNCTION_CHART_INTERVALS, + getBucketedTimeRange, + getExecutionMetrics, + getInvocationChartData, + getInvocationTotals, + getInvocationUpdateAnnotation, + getRollingTimeRange, + getUsageMetrics, + toEdgeFunctionChartData, +} from './EdgeFunctionOverview.utils' +import type { EdgeFunctionChartRawDatum } from './EdgeFunctionOverview.utils' import { EdgeFunctionPerformanceSection } from './EdgeFunctionPerformanceSection' import { EdgeFunctionRecentErrors } from './EdgeFunctionRecentErrors' import { EdgeFunctionUsageSection } from './EdgeFunctionUsageSection' diff --git a/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionOverview.utils.test.ts b/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionOverview.utils.test.ts index d05fff7a74..855ae983fb 100644 --- a/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionOverview.utils.test.ts +++ b/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionOverview.utils.test.ts @@ -3,7 +3,6 @@ import { describe, expect, it } from 'vitest' import { EDGE_FUNCTION_CHART_INTERVALS, - type EdgeFunctionChartRawDatum, formatChartTimestamp, formatMetric, formatRate, @@ -18,8 +17,9 @@ import { getMemoryTooltipDetail, getRollingTimeRange, getSegmentedButtonClassName, - toEdgeFunctionChartData, getUsageMetrics, + toEdgeFunctionChartData, + type EdgeFunctionChartRawDatum, } from './EdgeFunctionOverview.utils' describe('EdgeFunctionOverview.utils', () => { diff --git a/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionPerformanceSection.tsx b/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionPerformanceSection.tsx index 1a037405d6..bd837b5ce6 100644 --- a/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionPerformanceSection.tsx +++ b/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionPerformanceSection.tsx @@ -15,8 +15,8 @@ import { formatMetric, getChartEmptyStateCopy, } from './EdgeFunctionOverview.utils' -import { EdgeFunctionTimeSeriesChartCard } from './EdgeFunctionTimeSeriesChartCard' import type { EdgeFunctionChartDatum } from './EdgeFunctionOverview.utils' +import { EdgeFunctionTimeSeriesChartCard } from './EdgeFunctionTimeSeriesChartCard' interface EdgeFunctionPerformanceSectionProps { data: EdgeFunctionChartDatum[] diff --git a/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionRecentErrors.tsx b/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionRecentErrors.tsx index 34a6de6f93..96721b982c 100644 --- a/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionRecentErrors.tsx +++ b/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionRecentErrors.tsx @@ -33,13 +33,13 @@ import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { buildGroupAssistantPrompt, formatLogTimestamp, - getStatusBadgeVariant, formatSingleLineMessage, getFunctionRuntimeLogsSql, getRecentErrorGroups, getRecentErrorGroupsBase, getRecentErrorInvocationsSql, getRelatedExecutionIds, + getStatusBadgeVariant, toAlertError, type RecentErrorGroup, } from './EdgeFunctionRecentErrors.utils' diff --git a/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionUsageSection.tsx b/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionUsageSection.tsx index a434abe778..1de5fbffd0 100644 --- a/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionUsageSection.tsx +++ b/apps/studio/components/interfaces/Functions/EdgeFunctionOverview/EdgeFunctionUsageSection.tsx @@ -17,8 +17,8 @@ import { getChartEmptyStateCopy, MEMORY_CHART_CONFIG, } from './EdgeFunctionOverview.utils' -import { EdgeFunctionTimeSeriesChartCard } from './EdgeFunctionTimeSeriesChartCard' import type { EdgeFunctionChartDatum } from './EdgeFunctionOverview.utils' +import { EdgeFunctionTimeSeriesChartCard } from './EdgeFunctionTimeSeriesChartCard' interface EdgeFunctionUsageSectionProps { data: EdgeFunctionChartDatum[] diff --git a/apps/studio/components/interfaces/Functions/EdgeFunctionRecentInvocations.tsx b/apps/studio/components/interfaces/Functions/EdgeFunctionRecentInvocations.tsx index 04456c2dc2..1833ad8f8a 100644 --- a/apps/studio/components/interfaces/Functions/EdgeFunctionRecentInvocations.tsx +++ b/apps/studio/components/interfaces/Functions/EdgeFunctionRecentInvocations.tsx @@ -1,6 +1,4 @@ import { useParams } from 'common' -import { LOGS_TABLES } from 'components/interfaces/Settings/Logs/Logs.constants' -import useLogsPreview from 'hooks/analytics/useLogsPreview' import { Clock, ExternalLink, RefreshCw } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' @@ -9,6 +7,8 @@ import { Admonition, TimestampInfo } from 'ui-patterns' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { parseEdgeFunctionEventMessage } from './EdgeFunctionRecentInvocations.utils' +import { LOGS_TABLES } from '@/components/interfaces/Settings/Logs/Logs.constants' +import useLogsPreview from '@/hooks/analytics/useLogsPreview' interface EdgeFunctionRecentInvocationsProps { functionId: string diff --git a/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/AddNewSecretForm.tsx b/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/AddNewSecretForm.tsx index 0f38709fa2..b309b12b69 100644 --- a/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/AddNewSecretForm.tsx +++ b/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/AddNewSecretForm.tsx @@ -1,7 +1,5 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useParams } from 'common' -import { useSecretsCreateMutation } from 'data/secrets/secrets-create-mutation' -import { useSecretsQuery } from 'data/secrets/secrets-query' import { Eye, EyeOff, MinusCircle } from 'lucide-react' import { useState } from 'react' import { SubmitHandler, useFieldArray, useForm } from 'react-hook-form' @@ -13,17 +11,19 @@ import { CardFooter, CardHeader, CardTitle, + Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, FormItem_Shadcn_, FormLabel_Shadcn_, FormMessage_Shadcn_, - Form_Shadcn_, } from 'ui' import { Input } from 'ui-patterns/DataInputs/Input' import z from 'zod' import { DuplicateSecretWarningModal } from './DuplicateSecretWarningModal' +import { useSecretsCreateMutation } from '@/data/secrets/secrets-create-mutation' +import { useSecretsQuery } from '@/data/secrets/secrets-query' type SecretPair = { name: string diff --git a/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/EdgeFunctionSecret.tsx b/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/EdgeFunctionSecret.tsx index 207e280314..70fbf53cb4 100644 --- a/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/EdgeFunctionSecret.tsx +++ b/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/EdgeFunctionSecret.tsx @@ -1,7 +1,4 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import type { ProjectSecret } from 'data/secrets/secrets-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { Edit2, MoreVertical, Trash } from 'lucide-react' import { Button, @@ -15,6 +12,10 @@ import { } from 'ui' import { TimestampInfo } from 'ui-patterns' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import type { ProjectSecret } from '@/data/secrets/secrets-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' + interface EdgeFunctionSecretProps { secret: ProjectSecret onSelectDelete: () => void diff --git a/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/EdgeFunctionSecrets.tsx b/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/EdgeFunctionSecrets.tsx index 255741adb5..b71dff3ffd 100644 --- a/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/EdgeFunctionSecrets.tsx +++ b/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/EdgeFunctionSecrets.tsx @@ -1,10 +1,5 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import NoPermission from 'components/ui/NoPermission' -import { useSecretsDeleteMutation } from 'data/secrets/secrets-delete-mutation' -import { useSecretsQuery } from 'data/secrets/secrets-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { Search } from 'lucide-react' import { parseAsString, useQueryState } from 'nuqs' import { useEffect, useState } from 'react' @@ -17,7 +12,12 @@ import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import AddNewSecretForm from './AddNewSecretForm' import EdgeFunctionSecret from './EdgeFunctionSecret' import { EditSecretSheet } from './EditSecretSheet' +import AlertError from '@/components/ui/AlertError' import { InlineLink } from '@/components/ui/InlineLink' +import NoPermission from '@/components/ui/NoPermission' +import { useSecretsDeleteMutation } from '@/data/secrets/secrets-delete-mutation' +import { useSecretsQuery } from '@/data/secrets/secrets-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' import { DOCS_URL } from '@/lib/constants' export const EdgeFunctionSecrets = () => { diff --git a/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/EditSecretSheet.tsx b/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/EditSecretSheet.tsx index 8863864d59..abba9a16cb 100644 --- a/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/EditSecretSheet.tsx +++ b/apps/studio/components/interfaces/Functions/EdgeFunctionSecrets/EditSecretSheet.tsx @@ -1,9 +1,5 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useParams } from 'common' -import { DiscardChangesConfirmationDialog } from 'components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' -import { useSecretsCreateMutation } from 'data/secrets/secrets-create-mutation' -import { ProjectSecret } from 'data/secrets/secrets-query' -import { useConfirmOnClose } from 'hooks/ui/useConfirmOnClose' import { Eye, EyeOff } from 'lucide-react' import { useEffect, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' @@ -26,6 +22,11 @@ import { import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import z from 'zod' +import { DiscardChangesConfirmationDialog } from '@/components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' +import { useSecretsCreateMutation } from '@/data/secrets/secrets-create-mutation' +import { ProjectSecret } from '@/data/secrets/secrets-query' +import { useConfirmOnClose } from '@/hooks/ui/useConfirmOnClose' + const FORM_ID = 'edit-secret-sidepanel' const FormSchema = z.object({ diff --git a/apps/studio/components/interfaces/Functions/FunctionsEmptyState.tsx b/apps/studio/components/interfaces/Functions/FunctionsEmptyState.tsx index 1219c25764..371cd81d5e 100644 --- a/apps/studio/components/interfaces/Functions/FunctionsEmptyState.tsx +++ b/apps/studio/components/interfaces/Functions/FunctionsEmptyState.tsx @@ -1,20 +1,9 @@ import { useParams } from 'common' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { ScaffoldSectionTitle } from 'components/layouts/Scaffold' -import { DocsButton } from 'components/ui/DocsButton' -import { ResourceItem } from 'components/ui/Resource/ResourceItem' -import { ResourceList } from 'components/ui/Resource/ResourceList' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { DOCS_URL } from 'lib/constants' import { Code, Github, Lock, Play, Server, Terminal } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' import { parseAsString, useQueryState } from 'nuqs' import { useMemo } from 'react' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { AiIconAnimation, Button, @@ -35,6 +24,17 @@ import { import { CodeBlock } from 'ui-patterns/CodeBlock' import { EDGE_FUNCTION_TEMPLATES } from './Functions.templates' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { ScaffoldSectionTitle } from '@/components/layouts/Scaffold' +import { DocsButton } from '@/components/ui/DocsButton' +import { ResourceItem } from '@/components/ui/Resource/ResourceItem' +import { ResourceList } from '@/components/ui/Resource/ResourceList' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { DOCS_URL } from '@/lib/constants' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' export const FunctionsEmptyState = () => { const { ref } = useParams() diff --git a/apps/studio/components/interfaces/Functions/FunctionsNav.tsx b/apps/studio/components/interfaces/Functions/FunctionsNav.tsx index fe37ab1afc..c58ec504fb 100644 --- a/apps/studio/components/interfaces/Functions/FunctionsNav.tsx +++ b/apps/studio/components/interfaces/Functions/FunctionsNav.tsx @@ -1,5 +1,5 @@ -import { Tabs } from 'ui' import { useRouter } from 'next/router' +import { Tabs } from 'ui' const FunctionsNav = ({ item }: any) => { const router = useRouter() diff --git a/apps/studio/components/interfaces/Functions/TerminalInstructions.tsx b/apps/studio/components/interfaces/Functions/TerminalInstructions.tsx index f4d82bb4c0..2b63ae2735 100644 --- a/apps/studio/components/interfaces/Functions/TerminalInstructions.tsx +++ b/apps/studio/components/interfaces/Functions/TerminalInstructions.tsx @@ -1,11 +1,5 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import CommandRender from 'components/interfaces/Functions/CommandRender' -import { DocsButton } from 'components/ui/DocsButton' -import { useAccessTokensQuery } from 'data/access-tokens/access-tokens-query' -import { getKeys, useAPIKeysQuery } from 'data/api-keys/api-keys-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { DOCS_URL } from 'lib/constants' import { ExternalLink, Maximize2, Minimize2, Terminal } from 'lucide-react' import { useRouter } from 'next/router' import { ComponentPropsWithoutRef, ElementRef, forwardRef, useState } from 'react' @@ -17,7 +11,13 @@ import { } from 'ui' import type { Commands } from './Functions.types' +import CommandRender from '@/components/interfaces/Functions/CommandRender' +import { DocsButton } from '@/components/ui/DocsButton' +import { useAccessTokensQuery } from '@/data/access-tokens/access-tokens-query' +import { getKeys, useAPIKeysQuery } from '@/data/api-keys/api-keys-query' import { useProjectApiUrl } from '@/data/config/project-endpoint-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { DOCS_URL } from '@/lib/constants' interface TerminalInstructionsProps extends ComponentPropsWithoutRef { closable?: boolean diff --git a/apps/studio/components/interfaces/Functions/TerminalInstructionsDialog.tsx b/apps/studio/components/interfaces/Functions/TerminalInstructionsDialog.tsx index 86ac53cd7e..6f60b78be6 100644 --- a/apps/studio/components/interfaces/Functions/TerminalInstructionsDialog.tsx +++ b/apps/studio/components/interfaces/Functions/TerminalInstructionsDialog.tsx @@ -1,6 +1,6 @@ import { parseAsString, useQueryState } from 'nuqs' - import { Dialog, DialogContent, DialogSection, DialogTitle } from 'ui' + import { TerminalInstructions } from './TerminalInstructions' export const TerminalInstructionsDialog = () => { diff --git a/apps/studio/components/interfaces/GraphQL/GraphiQL.tsx b/apps/studio/components/interfaces/GraphQL/GraphiQL.tsx index 7d64ac69c1..e47ee2a2a4 100644 --- a/apps/studio/components/interfaces/GraphQL/GraphiQL.tsx +++ b/apps/studio/components/interfaces/GraphQL/GraphiQL.tsx @@ -19,7 +19,6 @@ import { ToolbarButton, Tooltip, UnStyledButton, - VariableEditor, useCopyQuery, useDragResize, useEditorContext, @@ -29,18 +28,19 @@ import { usePrettifyEditors, useSchemaContext, useTheme, + VariableEditor, } from '@graphiql/react' import { Fetcher } from '@graphiql/toolkit' import { PermissionAction } from '@supabase/shared-types/out/constants' +import { LOCAL_STORAGE_KEYS } from 'common' import { AlertTriangle, XIcon } from 'lucide-react' import { MouseEventHandler, useCallback, useEffect, useState } from 'react' +import { Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, Button, cn } from 'ui' -import { LOCAL_STORAGE_KEYS } from 'common' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useLocalStorage } from 'hooks/misc/useLocalStorage' -import { AlertDescription_Shadcn_, AlertTitle_Shadcn_, Alert_Shadcn_, Button, cn } from 'ui' import { RoleImpersonationSelector } from '../RoleImpersonationSelector' import styles from './graphiql.module.css' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useLocalStorage } from '@/hooks/misc/useLocalStorage' export interface GraphiQLProps { fetcher: Fetcher diff --git a/apps/studio/components/interfaces/Home/AdvisorWidget.tsx b/apps/studio/components/interfaces/Home/AdvisorWidget.tsx index 47b6cfc2a9..c24d92a392 100644 --- a/apps/studio/components/interfaces/Home/AdvisorWidget.tsx +++ b/apps/studio/components/interfaces/Home/AdvisorWidget.tsx @@ -1,17 +1,7 @@ import { useParams } from 'common' -import { LINTER_LEVELS } from 'components/interfaces/Linter/Linter.constants' -import { createLintSummaryPrompt, EntityTypeIcon } from 'components/interfaces/Linter/Linter.utils' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { AiAssistantDropdown } from 'components/ui/AiAssistantDropdown' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { Lint, useProjectLintsQuery } from 'data/lint/lint-query' -import { useTrack } from 'lib/telemetry/track' import { Activity, ExternalLink, Shield } from 'lucide-react' import Link from 'next/link' import { useCallback, useMemo, useState } from 'react' -import { useAdvisorStateSnapshot } from 'state/advisor-state' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { Card, CardContent, @@ -31,6 +21,19 @@ import { import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { useQueryPerformanceQuery } from '../QueryPerformance/useQueryPerformanceQuery' +import { LINTER_LEVELS } from '@/components/interfaces/Linter/Linter.constants' +import { + createLintSummaryPrompt, + EntityTypeIcon, +} from '@/components/interfaces/Linter/Linter.utils' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { AiAssistantDropdown } from '@/components/ui/AiAssistantDropdown' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { Lint, useProjectLintsQuery } from '@/data/lint/lint-query' +import { useTrack } from '@/lib/telemetry/track' +import { useAdvisorStateSnapshot } from '@/state/advisor-state' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' interface SlowQuery { rolname: string diff --git a/apps/studio/components/interfaces/Home/ClientLibrary.tsx b/apps/studio/components/interfaces/Home/ClientLibrary.tsx index 1f643efd5f..ad7d6f459f 100644 --- a/apps/studio/components/interfaces/Home/ClientLibrary.tsx +++ b/apps/studio/components/interfaces/Home/ClientLibrary.tsx @@ -1,8 +1,8 @@ import { BookOpen, Github } from 'lucide-react' - -import { BASE_PATH } from 'lib/constants' import { Badge, Button } from 'ui' +import { BASE_PATH } from '@/lib/constants' + interface ClientLibraryProps { language: string officialSupport?: boolean diff --git a/apps/studio/components/interfaces/Home/ExampleProject.tsx b/apps/studio/components/interfaces/Home/ExampleProject.tsx index 8f6ba8c573..f86e1b7036 100644 --- a/apps/studio/components/interfaces/Home/ExampleProject.tsx +++ b/apps/studio/components/interfaces/Home/ExampleProject.tsx @@ -1,13 +1,13 @@ +import { useParams } from 'common' import { ChevronRight } from 'lucide-react' import { useTheme } from 'next-themes' import Link from 'next/link' - -import { useParams } from 'common' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { BASE_PATH } from 'lib/constants' import { cn } from 'ui' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { BASE_PATH } from '@/lib/constants' + interface ExampleProjectProps { title: string description: string diff --git a/apps/studio/components/interfaces/Home/Home.tsx b/apps/studio/components/interfaces/Home/Home.tsx index 45d54e0fda..90da1c7746 100644 --- a/apps/studio/components/interfaces/Home/Home.tsx +++ b/apps/studio/components/interfaces/Home/Home.tsx @@ -1,30 +1,7 @@ +import { useParams } from 'common' import dayjs from 'dayjs' import Link from 'next/link' import { useEffect, useRef } from 'react' - -import { useParams } from 'common' -import { AdvisorWidget } from 'components/interfaces/Home/AdvisorWidget' -import { ClientLibrary } from 'components/interfaces/Home/ClientLibrary' -import { ExampleProject } from 'components/interfaces/Home/ExampleProject' -import { EXAMPLE_PROJECTS } from 'components/interfaces/Home/Home.constants' -import { NewProjectPanel } from 'components/interfaces/Home/NewProjectPanel/NewProjectPanel' -import { ProjectUsageSection } from 'components/interfaces/Home/ProjectUsageSection' -import { ServiceStatus } from 'components/interfaces/Home/ServiceStatus' -import { ProjectPausedState } from 'components/layouts/ProjectLayout/PausedState/ProjectPausedState' -import { ComputeBadgeWrapper } from 'components/ui/ComputeBadgeWrapper' -import { InlineLink } from 'components/ui/InlineLink' -import { ProjectUpgradeFailedBanner } from 'components/ui/ProjectUpgradeFailedBanner' -import { useBranchesQuery } from 'data/branches/branches-query' -import { useEdgeFunctionsQuery } from 'data/edge-functions/edge-functions-query' -import { useProjectDetailQuery } from 'data/projects/project-detail-query' -import { useReadReplicasQuery } from 'data/read-replicas/replicas-query' -import { useTablesQuery } from 'data/tables/tables-query' -import { useCustomContent } from 'hooks/custom-content/useCustomContent' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useIsOrioleDb, useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL, IS_PLATFORM, PROJECT_STATUS } from 'lib/constants' -import { useAppStateSnapshot } from 'state/app-state' import { Badge, cn, @@ -38,6 +15,29 @@ import { } from 'ui' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' +import { AdvisorWidget } from '@/components/interfaces/Home/AdvisorWidget' +import { ClientLibrary } from '@/components/interfaces/Home/ClientLibrary' +import { ExampleProject } from '@/components/interfaces/Home/ExampleProject' +import { EXAMPLE_PROJECTS } from '@/components/interfaces/Home/Home.constants' +import { NewProjectPanel } from '@/components/interfaces/Home/NewProjectPanel/NewProjectPanel' +import { ProjectUsageSection } from '@/components/interfaces/Home/ProjectUsageSection' +import { ServiceStatus } from '@/components/interfaces/Home/ServiceStatus' +import { ProjectPausedState } from '@/components/layouts/ProjectLayout/PausedState/ProjectPausedState' +import { ComputeBadgeWrapper } from '@/components/ui/ComputeBadgeWrapper' +import { InlineLink } from '@/components/ui/InlineLink' +import { ProjectUpgradeFailedBanner } from '@/components/ui/ProjectUpgradeFailedBanner' +import { useBranchesQuery } from '@/data/branches/branches-query' +import { useEdgeFunctionsQuery } from '@/data/edge-functions/edge-functions-query' +import { useProjectDetailQuery } from '@/data/projects/project-detail-query' +import { useReadReplicasQuery } from '@/data/read-replicas/replicas-query' +import { useTablesQuery } from '@/data/tables/tables-query' +import { useCustomContent } from '@/hooks/custom-content/useCustomContent' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useIsOrioleDb, useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL, IS_PLATFORM, PROJECT_STATUS } from '@/lib/constants' +import { useAppStateSnapshot } from '@/state/app-state' + export const Home = () => { const { data: project } = useSelectedProjectQuery() const { data: organization } = useSelectedOrganizationQuery() diff --git a/apps/studio/components/interfaces/Home/NewProjectPanel/APIKeys.tsx b/apps/studio/components/interfaces/Home/NewProjectPanel/APIKeys.tsx index f2e38f6dda..628a0c5cc7 100644 --- a/apps/studio/components/interfaces/Home/NewProjectPanel/APIKeys.tsx +++ b/apps/studio/components/interfaces/Home/NewProjectPanel/APIKeys.tsx @@ -1,13 +1,6 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { JwtSecretUpdateStatus } from '@supabase/shared-types/out/events' import { useParams } from 'common' -import { AlertError } from 'components/ui/AlertError' -import { InlineLink } from 'components/ui/InlineLink' -import { getKeys, useAPIKeysQuery } from 'data/api-keys/api-keys-query' -import { useLegacyAPIKeysStatusQuery } from 'data/api-keys/legacy-api-keys-status-query' -import { useJwtSecretUpdatingStatusQuery } from 'data/config/jwt-secret-updating-status-query' -import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { Loader } from 'lucide-react' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from 'ui' import { Admonition, GenericSkeletonLoader } from 'ui-patterns' @@ -16,6 +9,13 @@ import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { ConnectionIcon } from '@/components/interfaces/Connect/ConnectionIcon' import { ConnectButton } from '@/components/interfaces/ConnectButton/ConnectButton' +import { AlertError } from '@/components/ui/AlertError' +import { InlineLink } from '@/components/ui/InlineLink' +import { getKeys, useAPIKeysQuery } from '@/data/api-keys/api-keys-query' +import { useLegacyAPIKeysStatusQuery } from '@/data/api-keys/legacy-api-keys-status-query' +import { useJwtSecretUpdatingStatusQuery } from '@/data/config/jwt-secret-updating-status-query' +import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' export const APIKeys = () => { const { ref: projectRef } = useParams() diff --git a/apps/studio/components/interfaces/Home/ProjectList/EmptyStates.tsx b/apps/studio/components/interfaces/Home/ProjectList/EmptyStates.tsx index a4350d92eb..77f982a561 100644 --- a/apps/studio/components/interfaces/Home/ProjectList/EmptyStates.tsx +++ b/apps/studio/components/interfaces/Home/ProjectList/EmptyStates.tsx @@ -1,5 +1,3 @@ -import { HomeIcon } from 'components/layouts/Navigation/LayoutHeader/HomeIcon' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import { BoxPlus } from 'icons' import { Plus } from 'lucide-react' import Link from 'next/link' @@ -17,6 +15,8 @@ import { import { EmptyStatePresentational } from 'ui-patterns' import { ShimmeringCard } from './ShimmeringCard' +import { HomeIcon } from '@/components/layouts/Navigation/LayoutHeader/HomeIcon' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' export const Header = () => { return ( diff --git a/apps/studio/components/interfaces/Home/ProjectList/LoadMoreRow.tsx b/apps/studio/components/interfaces/Home/ProjectList/LoadMoreRow.tsx index 5bca21743b..90c6a91017 100644 --- a/apps/studio/components/interfaces/Home/ProjectList/LoadMoreRow.tsx +++ b/apps/studio/components/interfaces/Home/ProjectList/LoadMoreRow.tsx @@ -1,7 +1,7 @@ import { useIntersectionObserver } from '@uidotdev/usehooks' import { useEffect } from 'react' - import { cn, Skeleton, TableCell, TableRow } from 'ui' + import { ShimmeringCard } from './ShimmeringCard' interface LoadMoreRowProps { diff --git a/apps/studio/components/interfaces/Home/ProjectList/ProjectCard.tsx b/apps/studio/components/interfaces/Home/ProjectList/ProjectCard.tsx index b75ce7f895..b04bcaa9be 100644 --- a/apps/studio/components/interfaces/Home/ProjectList/ProjectCard.tsx +++ b/apps/studio/components/interfaces/Home/ProjectList/ProjectCard.tsx @@ -1,17 +1,7 @@ -import CardButton from 'components/ui/CardButton' -import { ComputeBadgeWrapper } from 'components/ui/ComputeBadgeWrapper' -import type { IntegrationProjectConnection } from 'data/integrations/integrations.types' -import { ProjectIndexPageLink } from 'data/prefetchers/project.$ref' -import { getComputeSize, OrgProject } from 'data/projects/org-projects-infinite-query' -import type { ResourceWarning } from 'data/usage/resource-warnings-query' -import { useCustomContent } from 'hooks/custom-content/useCustomContent' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { BASE_PATH } from 'lib/constants' import { Copy, Github, MoreVertical, Settings } from 'lucide-react' import { useRouter } from 'next/router' import InlineSVG from 'react-inlinesvg' import { toast } from 'sonner' -import type { Organization } from 'types' import { Button, copyToClipboard, @@ -23,6 +13,16 @@ import { import { inferProjectStatus } from './ProjectCard.utils' import { ProjectCardStatus } from './ProjectCardStatus' +import CardButton from '@/components/ui/CardButton' +import { ComputeBadgeWrapper } from '@/components/ui/ComputeBadgeWrapper' +import type { IntegrationProjectConnection } from '@/data/integrations/integrations.types' +import { ProjectIndexPageLink } from '@/data/prefetchers/project.$ref' +import { getComputeSize, OrgProject } from '@/data/projects/org-projects-infinite-query' +import type { ResourceWarning } from '@/data/usage/resource-warnings-query' +import { useCustomContent } from '@/hooks/custom-content/useCustomContent' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { BASE_PATH } from '@/lib/constants' +import type { Organization } from '@/types' export interface ProjectCardProps { slug?: string diff --git a/apps/studio/components/interfaces/Home/ProjectList/ProjectCard.utils.ts b/apps/studio/components/interfaces/Home/ProjectList/ProjectCard.utils.ts index 02bdb0bac7..6ab43062ff 100644 --- a/apps/studio/components/interfaces/Home/ProjectList/ProjectCard.utils.ts +++ b/apps/studio/components/interfaces/Home/ProjectList/ProjectCard.utils.ts @@ -1,4 +1,4 @@ -import { PROJECT_STATUS } from 'lib/constants' +import { PROJECT_STATUS } from '@/lib/constants' export const inferProjectStatus = (projectStatus: string) => { let status = undefined diff --git a/apps/studio/components/interfaces/Home/ProjectList/ProjectCardStatus.tsx b/apps/studio/components/interfaces/Home/ProjectList/ProjectCardStatus.tsx index ad6d47508b..dac3a6f396 100644 --- a/apps/studio/components/interfaces/Home/ProjectList/ProjectCardStatus.tsx +++ b/apps/studio/components/interfaces/Home/ProjectList/ProjectCardStatus.tsx @@ -1,10 +1,10 @@ import { AlertTriangle, Info, PauseCircle, RefreshCcw } from 'lucide-react' - -import { RESOURCE_WARNING_MESSAGES } from 'components/ui/ResourceExhaustionWarningBanner/ResourceExhaustionWarningBanner.constants' -import { getWarningContent } from 'components/ui/ResourceExhaustionWarningBanner/ResourceExhaustionWarningBanner.utils' -import type { ResourceWarning } from 'data/usage/resource-warnings-query' import { Badge, cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' + import { InferredProjectStatus } from './ProjectCard.utils' +import { RESOURCE_WARNING_MESSAGES } from '@/components/ui/ResourceExhaustionWarningBanner/ResourceExhaustionWarningBanner.constants' +import { getWarningContent } from '@/components/ui/ResourceExhaustionWarningBanner/ResourceExhaustionWarningBanner.utils' +import type { ResourceWarning } from '@/data/usage/resource-warnings-query' export interface ProjectCardWarningsProps { resourceWarnings?: ResourceWarning diff --git a/apps/studio/components/interfaces/Home/ProjectList/ProjectList.tsx b/apps/studio/components/interfaces/Home/ProjectList/ProjectList.tsx index 2990e303d9..4fb12281e1 100644 --- a/apps/studio/components/interfaces/Home/ProjectList/ProjectList.tsx +++ b/apps/studio/components/interfaces/Home/ProjectList/ProjectList.tsx @@ -1,19 +1,8 @@ import { keepPreviousData } from '@tanstack/react-query' import { useDebounce } from '@uidotdev/usehooks' import { LOCAL_STORAGE_KEYS, useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { NoSearchResults } from 'components/ui/NoSearchResults' -import { useGitHubConnectionsQuery } from 'data/integrations/github-connections-query' -import { useOrgIntegrationsQuery } from 'data/integrations/integrations-query-org-only' -import { usePermissionsQuery } from 'data/permissions/permissions-query' -import { useOrgProjectsInfiniteQuery } from 'data/projects/org-projects-infinite-query' -import { useResourceWarningsQuery } from 'data/usage/resource-warnings-query' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { IS_PLATFORM } from 'lib/constants' import { parseAsArrayOf, parseAsString, parseAsStringLiteral, useQueryState } from 'nuqs' import { useMemo } from 'react' -import type { Organization } from 'types' import { Card, cn, @@ -38,6 +27,17 @@ import { toTableHeadSortValue, } from './ProjectListSort.utils' import { ProjectTableRow } from './ProjectTableRow' +import AlertError from '@/components/ui/AlertError' +import { NoSearchResults } from '@/components/ui/NoSearchResults' +import { useGitHubConnectionsQuery } from '@/data/integrations/github-connections-query' +import { useOrgIntegrationsQuery } from '@/data/integrations/integrations-query-org-only' +import { usePermissionsQuery } from '@/data/permissions/permissions-query' +import { useOrgProjectsInfiniteQuery } from '@/data/projects/org-projects-infinite-query' +import { useResourceWarningsQuery } from '@/data/usage/resource-warnings-query' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { IS_PLATFORM } from '@/lib/constants' +import type { Organization } from '@/types' export interface ProjectListProps { organization?: Organization diff --git a/apps/studio/components/interfaces/Home/ProjectList/ProjectTableRow.tsx b/apps/studio/components/interfaces/Home/ProjectList/ProjectTableRow.tsx index 5721177a6e..03d4e8530b 100644 --- a/apps/studio/components/interfaces/Home/ProjectList/ProjectTableRow.tsx +++ b/apps/studio/components/interfaces/Home/ProjectList/ProjectTableRow.tsx @@ -1,29 +1,29 @@ -import { Github, MoreVertical, Settings, Copy, Check } from 'lucide-react' +import { Check, Copy, Github, MoreVertical, Settings } from 'lucide-react' import { useRouter } from 'next/router' -import InlineSVG from 'react-inlinesvg' import { useState } from 'react' - -import { ComputeBadgeWrapper } from 'components/ui/ComputeBadgeWrapper' -import type { IntegrationProjectConnection } from 'data/integrations/integrations.types' -import { getComputeSize, OrgProject } from 'data/projects/org-projects-infinite-query' -import type { ResourceWarning } from 'data/usage/resource-warnings-query' -import { BASE_PATH } from 'lib/constants' -import { createNavigationHandler } from 'lib/navigation' -import type { Organization } from 'types' +import InlineSVG from 'react-inlinesvg' +import { toast } from 'sonner' import { - DropdownMenuTrigger, - DropdownMenuItem, - DropdownMenuContent, + Button, + copyToClipboard, DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, TableCell, TableRow, - Button, } from 'ui' import { TimestampInfo } from 'ui-patterns' + import { inferProjectStatus } from './ProjectCard.utils' import { ProjectCardStatus } from './ProjectCardStatus' -import { toast } from 'sonner' -import { copyToClipboard } from 'ui' +import { ComputeBadgeWrapper } from '@/components/ui/ComputeBadgeWrapper' +import type { IntegrationProjectConnection } from '@/data/integrations/integrations.types' +import { getComputeSize, OrgProject } from '@/data/projects/org-projects-infinite-query' +import type { ResourceWarning } from '@/data/usage/resource-warnings-query' +import { BASE_PATH } from '@/lib/constants' +import { createNavigationHandler } from '@/lib/navigation' +import type { Organization } from '@/types' export interface ProjectTableRowProps { project: OrgProject diff --git a/apps/studio/components/interfaces/Home/ProjectList/ShimmeringCard.tsx b/apps/studio/components/interfaces/Home/ProjectList/ShimmeringCard.tsx index 9d6faf4a9b..4d236f5fbf 100644 --- a/apps/studio/components/interfaces/Home/ProjectList/ShimmeringCard.tsx +++ b/apps/studio/components/interfaces/Home/ProjectList/ShimmeringCard.tsx @@ -1,4 +1,4 @@ -import CardButton from 'components/ui/CardButton' +import CardButton from '@/components/ui/CardButton' export const ShimmeringCard = () => { return ( diff --git a/apps/studio/components/interfaces/Home/ProjectUsage.tsx b/apps/studio/components/interfaces/Home/ProjectUsage.tsx index 71adca4495..8d9d0bacd1 100644 --- a/apps/studio/components/interfaces/Home/ProjectUsage.tsx +++ b/apps/studio/components/interfaces/Home/ProjectUsage.tsx @@ -1,18 +1,5 @@ import { useParams } from 'common' -import BarChart from 'components/ui/Charts/BarChart' -import { ChartIntervalDropdown } from 'components/ui/Logs/ChartIntervalDropdown' -import { CHART_INTERVALS } from 'components/ui/Logs/logs.utils' -import Panel from 'components/ui/Panel' -import { - ProjectLogStatsVariables, - UsageApiCounts, - useProjectLogStatsQuery, -} from 'data/analytics/project-log-stats-query' import dayjs from 'dayjs' -import { useFillTimeseriesSorted } from 'hooks/analytics/useFillTimeseriesSorted' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { Auth, Database, Realtime, Storage } from 'icons' import sumBy from 'lodash/sumBy' import Link from 'next/link' @@ -20,6 +7,20 @@ import { useRouter } from 'next/router' import { useEffect, useState } from 'react' import { Loading } from 'ui' +import BarChart from '@/components/ui/Charts/BarChart' +import { ChartIntervalDropdown } from '@/components/ui/Logs/ChartIntervalDropdown' +import { CHART_INTERVALS } from '@/components/ui/Logs/logs.utils' +import Panel from '@/components/ui/Panel' +import { + ProjectLogStatsVariables, + UsageApiCounts, + useProjectLogStatsQuery, +} from '@/data/analytics/project-log-stats-query' +import { useFillTimeseriesSorted } from '@/hooks/analytics/useFillTimeseriesSorted' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' + type ChartIntervalKey = ProjectLogStatsVariables['interval'] const ProjectUsage = () => { diff --git a/apps/studio/components/interfaces/Home/ProjectUsageSection.tsx b/apps/studio/components/interfaces/Home/ProjectUsageSection.tsx index fd9c6dac0f..a59bc01245 100644 --- a/apps/studio/components/interfaces/Home/ProjectUsageSection.tsx +++ b/apps/studio/components/interfaces/Home/ProjectUsageSection.tsx @@ -1,11 +1,11 @@ import { AlertCircle } from 'lucide-react' -import { ProjectUsageLoadingState } from 'components/layouts/ProjectLayout/LoadingState' -import InformationBox from 'components/ui/InformationBox' -import { useProjectLogRequestsCountQuery } from 'data/analytics/project-log-requests-count-query' -import { useProjectLogStatsQuery } from 'data/analytics/project-log-stats-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import ProjectUsage from './ProjectUsage' +import { ProjectUsageLoadingState } from '@/components/layouts/ProjectLayout/LoadingState' +import InformationBox from '@/components/ui/InformationBox' +import { useProjectLogRequestsCountQuery } from '@/data/analytics/project-log-requests-count-query' +import { useProjectLogStatsQuery } from '@/data/analytics/project-log-stats-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export const ProjectUsageSection = () => { const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Home/ServiceStatus.tsx b/apps/studio/components/interfaces/Home/ServiceStatus.tsx index 0b1205906a..7a2b487abf 100644 --- a/apps/studio/components/interfaces/Home/ServiceStatus.tsx +++ b/apps/studio/components/interfaces/Home/ServiceStatus.tsx @@ -1,27 +1,27 @@ +import { useParams } from 'common' import dayjs from 'dayjs' import { AlertTriangle, CheckCircle2, ChevronRight, Loader2 } from 'lucide-react' import Link from 'next/link' import { useEffect, useState } from 'react' +import { + Button, + InfoIcon, + Popover_Shadcn_, + PopoverContent_Shadcn_, + PopoverTrigger_Shadcn_, +} from 'ui' -import { useParams } from 'common' -import { InlineLink } from 'components/ui/InlineLink' -import { useBranchesQuery } from 'data/branches/branches-query' -import { useEdgeFunctionServiceStatusQuery } from 'data/service-status/edge-functions-status-query' +import { InlineLink } from '@/components/ui/InlineLink' +import { useBranchesQuery } from '@/data/branches/branches-query' +import { useEdgeFunctionServiceStatusQuery } from '@/data/service-status/edge-functions-status-query' import { ProjectServiceStatus as APIProjectServiceStatus, ServiceHealthResponse, useProjectServiceStatusQuery, -} from 'data/service-status/service-status-query' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' -import { - Button, - InfoIcon, - PopoverContent_Shadcn_, - PopoverTrigger_Shadcn_, - Popover_Shadcn_, -} from 'ui' +} from '@/data/service-status/service-status-query' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' const SERVICE_STATUS_THRESHOLD = 5 // minutes diff --git a/apps/studio/components/interfaces/HomePageActions.tsx b/apps/studio/components/interfaces/HomePageActions.tsx index 91efa61186..1627e2e828 100644 --- a/apps/studio/components/interfaces/HomePageActions.tsx +++ b/apps/studio/components/interfaces/HomePageActions.tsx @@ -1,14 +1,6 @@ import { keepPreviousData } from '@tanstack/react-query' import { useDebounce } from '@uidotdev/usehooks' import { LOCAL_STORAGE_KEYS, useParams } from 'common' -import { - PROJECT_LIST_SORT_VALUES, - type ProjectListSort, -} from 'components/interfaces/Home/ProjectList/ProjectListSort.utils' -import { useOrgProjectsInfiniteQuery } from 'data/projects/org-projects-infinite-query' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { PROJECT_STATUS } from 'lib/constants' import { Grid, List, Loader2, Plus, Search, X } from 'lucide-react' import Link from 'next/link' import { parseAsArrayOf, parseAsString, parseAsStringLiteral, useQueryState } from 'nuqs' @@ -18,6 +10,14 @@ import { Input } from 'ui-patterns/DataInputs/Input' import { FilterPopover } from '../ui/FilterPopover' import { SortDropdown } from '../ui/SortDropdown' +import { + PROJECT_LIST_SORT_VALUES, + type ProjectListSort, +} from '@/components/interfaces/Home/ProjectList/ProjectListSort.utils' +import { useOrgProjectsInfiniteQuery } from '@/data/projects/org-projects-infinite-query' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { PROJECT_STATUS } from '@/lib/constants' interface HomePageActionsProps { slug?: string diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CreateCronJobSheet.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CreateCronJobSheet.tsx index f3bbc3adb7..e90b58e350 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CreateCronJobSheet.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CreateCronJobSheet.tsx @@ -2,16 +2,6 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useWatch } from '@ui/components/shadcn/ui/form' import { useParams } from 'common' -import { EnableExtensionModal } from 'components/interfaces/Database/Extensions/EnableExtensionModal' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { getDatabaseCronJob } from 'data/database-cron-jobs/database-cron-job-query' -import { useDatabaseCronJobCreateMutation } from 'data/database-cron-jobs/database-cron-jobs-create-mutation' -import { CronJob } from 'data/database-cron-jobs/database-cron-jobs-infinite-query' -import { useDatabaseExtensionsQuery } from 'data/database-extensions/database-extensions-query' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { parseAsString, useQueryState } from 'nuqs' import { useEffect, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' @@ -50,7 +40,17 @@ import { type CronJobType, } from './CreateCronJobSheet.constants' import { CronJobScheduleSection } from './CronJobScheduleSection' +import { EnableExtensionModal } from '@/components/interfaces/Database/Extensions/EnableExtensionModal' import { DiscardChangesConfirmationDialog } from '@/components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { getDatabaseCronJob } from '@/data/database-cron-jobs/database-cron-job-query' +import { useDatabaseCronJobCreateMutation } from '@/data/database-cron-jobs/database-cron-jobs-create-mutation' +import { CronJob } from '@/data/database-cron-jobs/database-cron-jobs-infinite-query' +import { useDatabaseExtensionsQuery } from '@/data/database-extensions/database-extensions-query' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' import { useConfirmOnClose } from '@/hooks/ui/useConfirmOnClose' import { isGreaterThanOrEqual } from '@/lib/semver' diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CronJobScheduleSection.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CronJobScheduleSection.tsx index 65b3754fb8..3b907de217 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CronJobScheduleSection.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CronJobScheduleSection.tsx @@ -1,11 +1,6 @@ import { motion } from 'framer-motion' import { useEffect, useState } from 'react' import { UseFormReturn } from 'react-hook-form' -import { useDebounce } from 'use-debounce' - -import { useSqlCronGenerateMutation } from 'data/ai/sql-cron-mutation' -import { useCronTimezoneQuery } from 'data/database-cron-jobs/database-cron-timezone-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Accordion_Shadcn_, AccordionContent_Shadcn_, @@ -23,9 +18,14 @@ import { Switch, } from 'ui' import { Input } from 'ui-patterns/DataInputs/Input' +import { useDebounce } from 'use-debounce' + import { formatScheduleString, getScheduleMessage } from '../CronJobs.utils' import CronSyntaxChart from '../CronSyntaxChart' import { type CreateCronJobForm } from './CreateCronJobSheet.constants' +import { useSqlCronGenerateMutation } from '@/data/ai/sql-cron-mutation' +import { useCronTimezoneQuery } from '@/data/database-cron-jobs/database-cron-timezone-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface CronJobScheduleSectionProps { form: UseFormReturn diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobPage.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobPage.tsx index 2875af6a5c..fb8fdd3cb3 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobPage.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobPage.tsx @@ -1,8 +1,5 @@ import { useParams } from 'common' import { toString as CronToString } from 'cronstrue' -import { useCronJobQuery } from 'data/database-cron-jobs/database-cron-job-query' -import { useEdgeFunctionsQuery } from 'data/edge-functions/edge-functions-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Edit3, List } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' @@ -34,6 +31,9 @@ import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { CreateCronJobSheet } from './CreateCronJobSheet/CreateCronJobSheet' import { isSecondsFormat, parseCronJobCommand } from './CronJobs.utils' import { PreviousRunsTab } from './PreviousRunsTab' +import { useCronJobQuery } from '@/data/database-cron-jobs/database-cron-job-query' +import { useEdgeFunctionsQuery } from '@/data/edge-functions/edge-functions-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export const CronJobPage = () => { const router = useRouter() diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobTableCell.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobTableCell.tsx index 0fbfcd134d..e5a516269d 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobTableCell.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobTableCell.tsx @@ -1,9 +1,5 @@ import parser from 'cron-parser' -import { useDatabaseCronJobRunCommandMutation } from 'data/database-cron-jobs/database-cron-job-run-mutation' -import { CronJob } from 'data/database-cron-jobs/database-cron-jobs-infinite-query' -import { useDatabaseCronJobToggleMutation } from 'data/database-cron-jobs/database-cron-jobs-toggle-mutation' import dayjs from 'dayjs' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Copy, Edit, Minus, MoreVertical, Play, Trash } from 'lucide-react' import { parseAsString, useQueryState } from 'nuqs' import { useState } from 'react' @@ -42,6 +38,11 @@ import { import { TimestampInfo } from 'ui-patterns' import { CodeBlock } from 'ui-patterns/CodeBlock' +import { useDatabaseCronJobRunCommandMutation } from '@/data/database-cron-jobs/database-cron-job-run-mutation' +import { CronJob } from '@/data/database-cron-jobs/database-cron-jobs-infinite-query' +import { useDatabaseCronJobToggleMutation } from '@/data/database-cron-jobs/database-cron-jobs-toggle-mutation' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' + const getNextRun = (schedule: string, lastRun?: string) => { // cron-parser can only deal with the traditional cron syntax but technically users can also // use strings like "30 seconds" now, For the latter case, we try our best to parse the next run diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.utils.test.ts b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.utils.test.ts index 48d5823192..ecdff361e1 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.utils.test.ts +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.utils.test.ts @@ -1,4 +1,5 @@ import { describe, expect, it } from 'vitest' + import { cronPattern, secondsPattern } from './CronJobs.constants' import { formatCronJobColumns, parseCronJobCommand } from './CronJobs.utils' diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.utils.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.utils.tsx index 1a1cfb6bae..b730fe724c 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.utils.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.utils.tsx @@ -1,11 +1,11 @@ import { toString as CronToString } from 'cronstrue' import { Column } from 'react-data-grid' - -import { CronJob } from 'data/database-cron-jobs/database-cron-jobs-infinite-query' import { cn } from 'ui' + import { CronJobType } from './CreateCronJobSheet/CreateCronJobSheet.constants' import { CRON_TABLE_COLUMNS, HTTPHeader, secondsPattern } from './CronJobs.constants' import { CronJobTableCell } from './CronJobTableCell' +import { CronJob } from '@/data/database-cron-jobs/database-cron-jobs-infinite-query' export function buildCronQuery(name: string, schedule: string, command: string) { const escapedName = name.replace(/'/g, "''") diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.DataGrid.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.DataGrid.tsx index 2d5063c263..937d9d55b5 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.DataGrid.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.DataGrid.tsx @@ -1,12 +1,12 @@ import { type MouseEvent, type UIEvent } from 'react' -import DataGrid, { type Column, Row } from 'react-data-grid' - -import AlertError from 'components/ui/AlertError' -import type { CronJob } from 'data/database-cron-jobs/database-cron-jobs-infinite-query' -import type { ResponseError } from 'types' +import DataGrid, { Row, type Column } from 'react-data-grid' import { cn } from 'ui' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' +import AlertError from '@/components/ui/AlertError' +import type { CronJob } from '@/data/database-cron-jobs/database-cron-jobs-infinite-query' +import type { ResponseError } from '@/types' + interface CronJobsTabDataGridProps { columns: readonly Column[] rows: CronJob[] diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.Header.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.Header.tsx index dc0a5e61b2..30504db89d 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.Header.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.Header.tsx @@ -1,6 +1,5 @@ import { RefreshCw, Search, X } from 'lucide-react' import type { KeyboardEvent } from 'react' - import { Button } from 'ui' import { Input } from 'ui-patterns/DataInputs/Input' diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.tsx index 30f95cb083..d687887976 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.tsx @@ -1,14 +1,4 @@ import { useParams } from 'common' -import { CreateCronJobSheet } from 'components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CreateCronJobSheet' -import { CronJob } from 'data/database-cron-jobs/database-cron-jobs-infinite-query' -import { useDatabaseExtensionsQuery } from 'data/database-extensions/database-extensions-query' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useInfiniteScroll } from 'hooks/misc/useInfiniteScroll' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { cleanPointerEventsNoneOnBody } from 'lib/helpers' -import { createNavigationHandler } from 'lib/navigation' -import { isGreaterThanOrEqual } from 'lib/semver' import { Loader2 } from 'lucide-react' import { useRouter } from 'next/router' import { parseAsBoolean, parseAsString, useQueryState } from 'nuqs' @@ -22,6 +12,16 @@ import { CronJobsTabDataGrid } from './CronJobsTab.DataGrid' import { CronJobsTabHeader } from './CronJobsTab.Header' import { useCronJobsData } from './CronJobsTab.useCronJobsData' import { DeleteCronJob } from './DeleteCronJob' +import { CreateCronJobSheet } from '@/components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CreateCronJobSheet' +import { CronJob } from '@/data/database-cron-jobs/database-cron-jobs-infinite-query' +import { useDatabaseExtensionsQuery } from '@/data/database-extensions/database-extensions-query' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useInfiniteScroll } from '@/hooks/misc/useInfiniteScroll' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { cleanPointerEventsNoneOnBody } from '@/lib/helpers' +import { createNavigationHandler } from '@/lib/navigation' +import { isGreaterThanOrEqual } from '@/lib/semver' const EMPTY_CRON_JOB = { jobname: '', schedule: '', active: true, command: '' } diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.useCleanupActions.ts b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.useCleanupActions.ts index 5ea420d523..b44694bbca 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.useCleanupActions.ts +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.useCleanupActions.ts @@ -2,21 +2,21 @@ import { getDeleteOldCronJobRunDetailsByCtidSql, getJobRunDetailsPageCountSql, } from '@supabase/pg-meta' -import { - CTID_BATCH_PAGE_SIZE, - validatePageNumber, -} from 'data/database-cron-jobs/database-cron-jobs.utils' -import { useExecuteSqlMutation } from 'data/sql/execute-sql-mutation' import { useCallback, useRef, useState } from 'react' import { toast } from 'sonner' import { CLEANUP_INTERVALS } from './CronJobsTab.constants' import type { ConnectionVars } from '@/data/common.types' +import { + CTID_BATCH_PAGE_SIZE, + validatePageNumber, +} from '@/data/database-cron-jobs/database-cron-jobs.utils' import { getDeleteOldCronJobRunDetailsByCtidKey, getJobRunDetailsPageCountKey, } from '@/data/database-cron-jobs/keys' import { useScheduleCronJobRunDetailsCleanupMutation } from '@/data/database-cron-jobs/schedule-clean-up-mutation' +import { useExecuteSqlMutation } from '@/data/sql/execute-sql-mutation' // Delay between batches to allow other queries to proceed (in milliseconds) const BATCH_DELAY_MS = 100 diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.useCronJobsData.ts b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.useCronJobsData.ts index 39d4ae1c86..ebca96442b 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.useCronJobsData.ts +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.useCronJobsData.ts @@ -1,17 +1,17 @@ import { keepPreviousData } from '@tanstack/react-query' -import { useCronJobsCountEstimateQuery } from 'data/database-cron-jobs/database-cron-jobs-count-estimate-query' -import { useCronJobsCountQuery } from 'data/database-cron-jobs/database-cron-jobs-count-query' -import { - CronJob, - useCronJobsInfiniteQuery, -} from 'data/database-cron-jobs/database-cron-jobs-infinite-query' import { useMemo } from 'react' -import type { ResponseError } from 'types' import { CRON_JOBS_THRESHOLD } from './CronJobsTab.constants' import type { ConnectionVars } from '@/data/common.types' +import { useCronJobsCountEstimateQuery } from '@/data/database-cron-jobs/database-cron-jobs-count-estimate-query' +import { useCronJobsCountQuery } from '@/data/database-cron-jobs/database-cron-jobs-count-query' +import { + CronJob, + useCronJobsInfiniteQuery, +} from '@/data/database-cron-jobs/database-cron-jobs-infinite-query' import { useCronJobsMinimalInfiniteQuery } from '@/data/database-cron-jobs/database-cron-jobs-minimal-infinite-query' import { COST_THRESHOLD_ERROR } from '@/data/sql/execute-sql-query' +import type { ResponseError } from '@/types' // ============================================================================= // Input types diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/DeleteCronJob.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/DeleteCronJob.tsx index 4bfd71e4b1..c59bfbef72 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/DeleteCronJob.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/DeleteCronJob.tsx @@ -1,15 +1,15 @@ -import { TextConfirmModal } from 'components/ui/TextConfirmModalWrapper' -import { useDatabaseCronJobDeleteMutation } from 'data/database-cron-jobs/database-cron-jobs-delete-mutation' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { cleanPointerEventsNoneOnBody } from 'lib/helpers' import { parseAsString, useQueryState } from 'nuqs' import { useEffect } from 'react' import { toast } from 'sonner' import { ConfirmationModal } from 'ui-patterns/Dialogs/ConfirmationModal' import { useCronJobsData } from './CronJobsTab.useCronJobsData' +import { TextConfirmModal } from '@/components/ui/TextConfirmModalWrapper' +import { useDatabaseCronJobDeleteMutation } from '@/data/database-cron-jobs/database-cron-jobs-delete-mutation' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { cleanPointerEventsNoneOnBody } from '@/lib/helpers' export const DeleteCronJob = () => { const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/EdgeFunctionSection.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/EdgeFunctionSection.tsx index 3943976988..bd217abbf0 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/EdgeFunctionSection.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/EdgeFunctionSection.tsx @@ -1,6 +1,4 @@ import { useParams } from 'common/hooks' -import { useEdgeFunctionsQuery } from 'data/edge-functions/edge-functions-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Check, ChevronsUpDown } from 'lucide-react' import Link from 'next/link' import { useEffect, useId, useMemo, useState } from 'react' @@ -34,6 +32,8 @@ import { import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { CreateCronJobForm } from './CreateCronJobSheet/CreateCronJobSheet.constants' +import { useEdgeFunctionsQuery } from '@/data/edge-functions/edge-functions-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface HTTPRequestFieldsProps { form: UseFormReturn diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/HttpBodyFieldSection.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/HttpBodyFieldSection.tsx index 4ba3b23f08..9ad9a78db1 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/HttpBodyFieldSection.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/HttpBodyFieldSection.tsx @@ -1,5 +1,4 @@ import { UseFormReturn } from 'react-hook-form' - import { FormControl_Shadcn_, FormField_Shadcn_, @@ -9,6 +8,7 @@ import { SheetSection, TextArea_Shadcn_, } from 'ui' + import { CreateCronJobForm } from './CreateCronJobSheet/CreateCronJobSheet.constants' interface HttpBodyFieldSectionProps { diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/HttpHeaderFieldsSection.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/HttpHeaderFieldsSection.tsx index c98248de0e..69615981f1 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/HttpHeaderFieldsSection.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/HttpHeaderFieldsSection.tsx @@ -1,13 +1,13 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' -import { useFormContext } from 'react-hook-form' - import { useParams } from 'common' -import { getKeys, useAPIKeysQuery } from 'data/api-keys/api-keys-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' +import { useFormContext } from 'react-hook-form' import { FormLabel_Shadcn_, SheetSection } from 'ui' import { KeyValueFieldArray } from 'ui-patterns/form/KeyValueFieldArray/KeyValueFieldArray' + import { CreateCronJobForm } from './CreateCronJobSheet/CreateCronJobSheet.constants' import { buildEdgeFunctionHeaderAddActions } from '@/components/interfaces/Functions/httpHeaderAddActions' +import { getKeys, useAPIKeysQuery } from '@/data/api-keys/api-keys-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' interface HTTPHeaderFieldsSectionProps { variant: 'edge_function' | 'http_request' diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/HttpRequestSection.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/HttpRequestSection.tsx index 3107f0b125..5f0b0a4a8b 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/HttpRequestSection.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/HttpRequestSection.tsx @@ -1,5 +1,4 @@ import { UseFormReturn } from 'react-hook-form' - import { FormControl_Shadcn_, FormField_Shadcn_, @@ -15,6 +14,7 @@ import { SheetSection, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' + import { CreateCronJobForm } from './CreateCronJobSheet/CreateCronJobSheet.constants' interface HttpRequestSectionProps { diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/PreviousRunsTab.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/PreviousRunsTab.tsx index a319025031..1ba627e4d9 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/PreviousRunsTab.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/PreviousRunsTab.tsx @@ -1,11 +1,5 @@ import { useParams } from 'common' -import { - CronJobRun, - useCronJobRunsInfiniteQuery, -} from 'data/database-cron-jobs/database-cron-jobs-runs-infinite-query' import dayjs from 'dayjs' -import { useInfiniteScroll } from 'hooks/misc/useInfiniteScroll' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { CircleCheck, CircleX, Loader } from 'lucide-react' import { useMemo } from 'react' import DataGrid, { Column, Row } from 'react-data-grid' @@ -16,6 +10,12 @@ import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { calculateDuration, formatDate } from './CronJobs.utils' import CronJobsEmptyState from './CronJobsEmptyState' +import { + CronJobRun, + useCronJobRunsInfiniteQuery, +} from '@/data/database-cron-jobs/database-cron-jobs-runs-infinite-query' +import { useInfiniteScroll } from '@/hooks/misc/useInfiniteScroll' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' const cronJobColumns = [ { diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/SqlFunctionSection.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/SqlFunctionSection.tsx index d19a394bc2..3c82cc3ec5 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/SqlFunctionSection.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/SqlFunctionSection.tsx @@ -1,10 +1,10 @@ -import FunctionSelector from 'components/ui/FunctionSelector' -import SchemaSelector from 'components/ui/SchemaSelector' import { UseFormReturn } from 'react-hook-form' import { FormField_Shadcn_, SheetSection } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { CreateCronJobForm } from './CreateCronJobSheet/CreateCronJobSheet.constants' +import FunctionSelector from '@/components/ui/FunctionSelector' +import SchemaSelector from '@/components/ui/SchemaSelector' interface SqlFunctionSectionProps { form: UseFormReturn diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/SqlSnippetSection.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/SqlSnippetSection.tsx index 25f14eb141..b792a4b494 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/SqlSnippetSection.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/SqlSnippetSection.tsx @@ -1,9 +1,9 @@ import { UseFormReturn } from 'react-hook-form' - -import CodeEditor from 'components/ui/CodeEditor/CodeEditor' import { FormField_Shadcn_, SheetSection } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' + import { CreateCronJobForm } from './CreateCronJobSheet/CreateCronJobSheet.constants' +import CodeEditor from '@/components/ui/CodeEditor/CodeEditor' interface SqlSnippetSectionProps { form: UseFormReturn diff --git a/apps/studio/components/interfaces/Integrations/DataApi/DataApiDisabledState.tsx b/apps/studio/components/interfaces/Integrations/DataApi/DataApiDisabledState.tsx index 031d964073..d2300e0e45 100644 --- a/apps/studio/components/interfaces/Integrations/DataApi/DataApiDisabledState.tsx +++ b/apps/studio/components/interfaces/Integrations/DataApi/DataApiDisabledState.tsx @@ -1,8 +1,9 @@ import { useParams } from 'common' -import { InlineLink } from 'components/ui/InlineLink' import { AlertCircle } from 'lucide-react' import { Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_ } from 'ui' +import { InlineLink } from '@/components/ui/InlineLink' + interface DataApiDisabledStateProps { description: string } diff --git a/apps/studio/components/interfaces/Integrations/GraphQL/GraphiQLTab.tsx b/apps/studio/components/interfaces/Integrations/GraphQL/GraphiQLTab.tsx index aff1a4084f..882d7b9afb 100644 --- a/apps/studio/components/interfaces/Integrations/GraphQL/GraphiQLTab.tsx +++ b/apps/studio/components/interfaces/Integrations/GraphQL/GraphiQLTab.tsx @@ -1,18 +1,19 @@ import '@graphiql/react/dist/style.css' + import { createGraphiQLFetcher, Fetcher } from '@graphiql/toolkit' +import { useParams } from 'common' import { useTheme } from 'next-themes' import { useMemo } from 'react' import { toast } from 'sonner' - -import { useParams } from 'common' -import GraphiQL from 'components/interfaces/GraphQL/GraphiQL' -import { useSessionAccessTokenQuery } from 'data/auth/session-access-token-query' -import { useProjectPostgrestConfigQuery } from 'data/config/project-postgrest-config-query' -import { API_URL, IS_PLATFORM } from 'lib/constants' -import { getRoleImpersonationJWT } from 'lib/role-impersonation' -import { useGetImpersonatedRoleState } from 'state/role-impersonation-state' import { LogoLoader } from 'ui' +import GraphiQL from '@/components/interfaces/GraphQL/GraphiQL' +import { useSessionAccessTokenQuery } from '@/data/auth/session-access-token-query' +import { useProjectPostgrestConfigQuery } from '@/data/config/project-postgrest-config-query' +import { API_URL, IS_PLATFORM } from '@/lib/constants' +import { getRoleImpersonationJWT } from '@/lib/role-impersonation' +import { useGetImpersonatedRoleState } from '@/state/role-impersonation-state' + export const GraphiQLTab = () => { const { resolvedTheme } = useTheme() const { ref: projectRef } = useParams() diff --git a/apps/studio/components/interfaces/Integrations/Integration/BuildBySection.tsx b/apps/studio/components/interfaces/Integrations/Integration/BuildBySection.tsx index 31cef5ce34..0fe6dc6dfa 100644 --- a/apps/studio/components/interfaces/Integrations/Integration/BuildBySection.tsx +++ b/apps/studio/components/interfaces/Integrations/Integration/BuildBySection.tsx @@ -1,8 +1,8 @@ import { Book } from 'lucide-react' import Link from 'next/link' import { ComponentPropsWithoutRef, ElementRef, forwardRef, ReactNode } from 'react' - import { cn } from 'ui' + import { IntegrationDefinition } from '../Landing/Integrations.constants' interface BuiltBySectionProps extends ComponentPropsWithoutRef<'div'> { diff --git a/apps/studio/components/interfaces/Integrations/Integration/IntegrationOverviewTab.tsx b/apps/studio/components/interfaces/Integrations/Integration/IntegrationOverviewTab.tsx index 9bd5ec0e4e..74549e79a4 100644 --- a/apps/studio/components/interfaces/Integrations/Integration/IntegrationOverviewTab.tsx +++ b/apps/studio/components/interfaces/Integrations/Integration/IntegrationOverviewTab.tsx @@ -1,6 +1,4 @@ import { useParams } from 'common' -import { useDatabaseExtensionsQuery } from 'data/database-extensions/database-extensions-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { PropsWithChildren, ReactNode } from 'react' import { Badge, Card, CardContent, cn, Separator } from 'ui' @@ -8,6 +6,8 @@ import { INTEGRATIONS } from '../Landing/Integrations.constants' import { BuiltBySection } from './BuildBySection' import { MarkdownContent } from './MarkdownContent' import { MissingExtensionAlert } from './MissingExtensionAlert' +import { useDatabaseExtensionsQuery } from '@/data/database-extensions/database-extensions-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export interface IntegrationOverviewTabProps { actions?: ReactNode diff --git a/apps/studio/components/interfaces/Integrations/Integration/IntegrationOverviewTabV2/MarkdownContent.tsx b/apps/studio/components/interfaces/Integrations/Integration/IntegrationOverviewTabV2/MarkdownContent.tsx index 88387eb293..69080081b5 100644 --- a/apps/studio/components/interfaces/Integrations/Integration/IntegrationOverviewTabV2/MarkdownContent.tsx +++ b/apps/studio/components/interfaces/Integrations/Integration/IntegrationOverviewTabV2/MarkdownContent.tsx @@ -1,6 +1,7 @@ -import { Markdown } from 'components/interfaces/Markdown' import { useEffect, useState } from 'react' +import { Markdown } from '@/components/interfaces/Markdown' + interface MarkdownContentProps { content: string | null | undefined integrationId?: string diff --git a/apps/studio/components/interfaces/Integrations/Integration/IntegrationOverviewTabV2/index.tsx b/apps/studio/components/interfaces/Integrations/Integration/IntegrationOverviewTabV2/index.tsx index 9fe3907590..4210b21208 100644 --- a/apps/studio/components/interfaces/Integrations/Integration/IntegrationOverviewTabV2/index.tsx +++ b/apps/studio/components/interfaces/Integrations/Integration/IntegrationOverviewTabV2/index.tsx @@ -1,11 +1,11 @@ import { useParams } from 'common' -import { Markdown } from 'components/interfaces/Markdown' import { PropsWithChildren } from 'react' import { cn } from 'ui' import { useAvailableIntegrations } from '../../Landing/useAvailableIntegrations' import { FilesViewer } from './FilesViewer' import { MarkdownContent } from './MarkdownContent' +import { Markdown } from '@/components/interfaces/Markdown' import { InlineLinkClassName } from '@/components/ui/InlineLink' const getSiteUrlLabel = (url: string | undefined | null) => { diff --git a/apps/studio/components/interfaces/Integrations/Integration/MarkdownContent.tsx b/apps/studio/components/interfaces/Integrations/Integration/MarkdownContent.tsx index 120d31fa4b..e93a997604 100644 --- a/apps/studio/components/interfaces/Integrations/Integration/MarkdownContent.tsx +++ b/apps/studio/components/interfaces/Integrations/Integration/MarkdownContent.tsx @@ -1,9 +1,9 @@ import { motion } from 'framer-motion' import { useEffect, useState } from 'react' - -import { Markdown } from 'components/interfaces/Markdown' import { cn } from 'ui' +import { Markdown } from '@/components/interfaces/Markdown' + const CHAR_LIMIT = 500 // Adjust this number as needed export const MarkdownContent = ({ diff --git a/apps/studio/components/interfaces/Integrations/Integration/MissingExtensionAlert.tsx b/apps/studio/components/interfaces/Integrations/Integration/MissingExtensionAlert.tsx index d8dbc1312a..8c9059a729 100644 --- a/apps/studio/components/interfaces/Integrations/Integration/MissingExtensionAlert.tsx +++ b/apps/studio/components/interfaces/Integrations/Integration/MissingExtensionAlert.tsx @@ -1,8 +1,9 @@ -import { EnableExtensionModal } from 'components/interfaces/Database/Extensions/EnableExtensionModal' -import { DatabaseExtension } from 'data/database-extensions/database-extensions-query' import { useState } from 'react' import { Button } from 'ui' +import { EnableExtensionModal } from '@/components/interfaces/Database/Extensions/EnableExtensionModal' +import { DatabaseExtension } from '@/data/database-extensions/database-extensions-query' + export const MissingExtensionAlert = ({ extension }: { extension: DatabaseExtension }) => { const [showEnableExtensionModal, setShowEnableExtensionModal] = useState(false) diff --git a/apps/studio/components/interfaces/Integrations/Landing/AvailableIntegrations.tsx b/apps/studio/components/interfaces/Integrations/Landing/AvailableIntegrations.tsx index 0cd1b5748e..20de9ae7fd 100644 --- a/apps/studio/components/interfaces/Integrations/Landing/AvailableIntegrations.tsx +++ b/apps/studio/components/interfaces/Integrations/Landing/AvailableIntegrations.tsx @@ -1,6 +1,3 @@ -import AlertError from 'components/ui/AlertError' -import { NoSearchResults } from 'components/ui/NoSearchResults' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import { Search } from 'lucide-react' import { parseAsString, useQueryState } from 'nuqs' import { buttonVariants, cn, Tabs_Shadcn_, TabsList_Shadcn_, TabsTrigger_Shadcn_ } from 'ui' @@ -10,6 +7,9 @@ import { Input } from 'ui-patterns/DataInputs/Input' import { IntegrationCard, IntegrationLoadingCard } from './IntegrationCard' import { useAvailableIntegrations } from './useAvailableIntegrations' import { useInstalledIntegrations } from './useInstalledIntegrations' +import AlertError from '@/components/ui/AlertError' +import { NoSearchResults } from '@/components/ui/NoSearchResults' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' type IntegrationCategory = 'all' | 'wrapper' | 'postgres_extensions' | 'custom' const CATEGORIES = [ diff --git a/apps/studio/components/interfaces/Integrations/Landing/InstalledIntegrations.tsx b/apps/studio/components/interfaces/Integrations/Landing/InstalledIntegrations.tsx index c1e4f30d10..91acd3d3de 100644 --- a/apps/studio/components/interfaces/Integrations/Landing/InstalledIntegrations.tsx +++ b/apps/studio/components/interfaces/Integrations/Landing/InstalledIntegrations.tsx @@ -1,6 +1,6 @@ -import AlertError from 'components/ui/AlertError' import { IntegrationCard, IntegrationLoadingCard } from './IntegrationCard' import { useInstalledIntegrations } from './useInstalledIntegrations' +import AlertError from '@/components/ui/AlertError' export const InstalledIntegrations = () => { const { installedIntegrations, error, isLoading, isSuccess, isError } = useInstalledIntegrations() diff --git a/apps/studio/components/interfaces/Integrations/Landing/IntegrationCard.tsx b/apps/studio/components/interfaces/Integrations/Landing/IntegrationCard.tsx index 82fdcd2a73..180169f930 100644 --- a/apps/studio/components/interfaces/Integrations/Landing/IntegrationCard.tsx +++ b/apps/studio/components/interfaces/Integrations/Landing/IntegrationCard.tsx @@ -1,12 +1,12 @@ import { BadgeCheck } from 'lucide-react' import Image from 'next/image' import Link from 'next/link' - -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { BASE_PATH } from 'lib/constants' import { Badge, Card, CardContent, cn } from 'ui' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' + import { IntegrationDefinition } from './Integrations.constants' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { BASE_PATH } from '@/lib/constants' type IntegrationCardProps = IntegrationDefinition & { isInstalled?: boolean diff --git a/apps/studio/components/interfaces/Integrations/Landing/Integrations.constants.tsx b/apps/studio/components/interfaces/Integrations/Landing/Integrations.constants.tsx index bce8cbbe42..20d0406f8d 100644 --- a/apps/studio/components/interfaces/Integrations/Landing/Integrations.constants.tsx +++ b/apps/studio/components/interfaces/Integrations/Landing/Integrations.constants.tsx @@ -110,7 +110,7 @@ const SUPABASE_INTEGRATIONS: Array = [ case 'overview': return dynamic( () => - import('components/interfaces/Integrations/Queues/OverviewTab').then( + import('@/components/interfaces/Integrations/Queues/OverviewTab').then( (mod) => mod.QueuesOverviewTab ), { loading: Loading } @@ -166,7 +166,7 @@ const SUPABASE_INTEGRATIONS: Array = [ case 'overview': return dynamic( () => - import('components/interfaces/Integrations/Integration/IntegrationOverviewTabWrapper').then( + import('@/components/interfaces/Integrations/Integration/IntegrationOverviewTabWrapper').then( (mod) => mod.IntegrationOverviewTabWrapper ), { @@ -209,7 +209,7 @@ const SUPABASE_INTEGRATIONS: Array = [ case 'overview': return dynamic( () => - import('components/interfaces/Integrations/Integration/IntegrationOverviewTabWrapper').then( + import('@/components/interfaces/Integrations/Integration/IntegrationOverviewTabWrapper').then( (mod) => mod.IntegrationOverviewTabWrapper ), { @@ -254,7 +254,7 @@ const SUPABASE_INTEGRATIONS: Array = [ case 'overview': return dynamic( () => - import('components/interfaces/Integrations/Webhooks/OverviewTab').then( + import('@/components/interfaces/Integrations/Webhooks/OverviewTab').then( (mod) => mod.WebhooksOverviewTab ), { @@ -264,7 +264,7 @@ const SUPABASE_INTEGRATIONS: Array = [ case 'webhooks': return dynamic( () => - import('components/interfaces/Integrations/Webhooks/ListTab').then( + import('@/components/interfaces/Integrations/Webhooks/ListTab').then( (mod) => mod.WebhooksListTab ), { @@ -311,7 +311,7 @@ const SUPABASE_INTEGRATIONS: Array = [ case 'overview': return dynamic( () => - import('components/interfaces/Integrations/DataApi/OverviewTab').then( + import('@/components/interfaces/Integrations/DataApi/OverviewTab').then( (mod) => mod.DataApiOverviewTab ), { @@ -321,7 +321,7 @@ const SUPABASE_INTEGRATIONS: Array = [ case 'settings': return dynamic( () => - import('components/interfaces/Integrations/DataApi/SettingsTab').then( + import('@/components/interfaces/Integrations/DataApi/SettingsTab').then( (mod) => mod.DataApiSettingsTab ), { @@ -331,7 +331,7 @@ const SUPABASE_INTEGRATIONS: Array = [ case 'docs': return dynamic( () => - import('components/interfaces/Integrations/DataApi/DocsTab').then( + import('@/components/interfaces/Integrations/DataApi/DocsTab').then( (mod) => mod.DataApiDocsTab ), { @@ -374,7 +374,7 @@ const SUPABASE_INTEGRATIONS: Array = [ case 'overview': return dynamic( () => - import('components/interfaces/Integrations/Integration/IntegrationOverviewTabWrapper').then( + import('@/components/interfaces/Integrations/Integration/IntegrationOverviewTabWrapper').then( (mod) => mod.IntegrationOverviewTabWrapper ), { @@ -384,7 +384,7 @@ const SUPABASE_INTEGRATIONS: Array = [ case 'graphiql': return dynamic( () => - import('components/interfaces/Integrations/GraphQL/GraphiQLTab').then( + import('@/components/interfaces/Integrations/GraphQL/GraphiQLTab').then( (mod) => mod.GraphiQLTab ), { @@ -425,7 +425,7 @@ const WRAPPER_INTEGRATIONS: Array = WRAPPERS.map((w) => { case 'overview': return dynamic( () => - import('components/interfaces/Integrations/Wrappers/OverviewTab').then( + import('@/components/interfaces/Integrations/Wrappers/OverviewTab').then( (mod) => mod.WrapperOverviewTab ), { @@ -435,7 +435,7 @@ const WRAPPER_INTEGRATIONS: Array = WRAPPERS.map((w) => { case 'wrappers': return dynamic( () => - import('components/interfaces/Integrations/Wrappers/WrappersTab').then( + import('@/components/interfaces/Integrations/Wrappers/WrappersTab').then( (mod) => mod.WrappersTab ), { @@ -487,7 +487,7 @@ const TEMPLATE_INTEGRATIONS: Array = [ case 'overview': return dynamic( () => - import('components/interfaces/Integrations/templates/StripeSyncEngine/InstallationOverview').then( + import('@/components/interfaces/Integrations/templates/StripeSyncEngine/InstallationOverview').then( (mod) => mod.StripeSyncInstallationPage ), { loading: Loading } @@ -495,7 +495,7 @@ const TEMPLATE_INTEGRATIONS: Array = [ case 'settings': return dynamic( () => - import('components/interfaces/Integrations/templates/StripeSyncEngine/StripeSyncSettingsPage').then( + import('@/components/interfaces/Integrations/templates/StripeSyncEngine/StripeSyncSettingsPage').then( (mod) => mod.StripeSyncSettingsPage ), { loading: Loading } diff --git a/apps/studio/components/interfaces/Integrations/Landing/useAvailableIntegrations.tsx b/apps/studio/components/interfaces/Integrations/Landing/useAvailableIntegrations.tsx index 076f4907f3..33bafdfae6 100644 --- a/apps/studio/components/interfaces/Integrations/Landing/useAvailableIntegrations.tsx +++ b/apps/studio/components/interfaces/Integrations/Landing/useAvailableIntegrations.tsx @@ -76,7 +76,7 @@ export const useAvailableIntegrations = () => { case 'overview': return dynamic( () => - import('components/interfaces/Integrations/Integration/IntegrationOverviewTabV2/index').then( + import('@/components/interfaces/Integrations/Integration/IntegrationOverviewTabV2/index').then( (mod) => mod.IntegrationOverviewTabV2 ), { diff --git a/apps/studio/components/interfaces/Integrations/Landing/useInstalledIntegrations.tsx b/apps/studio/components/interfaces/Integrations/Landing/useInstalledIntegrations.tsx index f5a8572ded..48ea23bacb 100644 --- a/apps/studio/components/interfaces/Integrations/Landing/useInstalledIntegrations.tsx +++ b/apps/studio/components/interfaces/Integrations/Landing/useInstalledIntegrations.tsx @@ -1,9 +1,3 @@ -import { useDatabaseExtensionsQuery } from 'data/database-extensions/database-extensions-query' -import { useSchemasQuery } from 'data/database/schemas-query' -import { useFDWsQuery } from 'data/fdw/fdws-query' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { EMPTY_ARR } from 'lib/void' import { useMemo } from 'react' import { parseSchemaComment } from 'stripe-experiment-sync/supabase' @@ -13,6 +7,12 @@ import { isInstalled as checkIsInstalled, findStripeSchema, } from '@/components/interfaces/Integrations/templates/StripeSyncEngine/stripe-sync-status' +import { useDatabaseExtensionsQuery } from '@/data/database-extensions/database-extensions-query' +import { useSchemasQuery } from '@/data/database/schemas-query' +import { useFDWsQuery } from '@/data/fdw/fdws-query' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { EMPTY_ARR } from '@/lib/void' export const useInstalledIntegrations = () => { const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Integrations/Queues/CreateQueueSheet/CreateQueueSheet.tsx b/apps/studio/components/interfaces/Integrations/Queues/CreateQueueSheet/CreateQueueSheet.tsx index fe91f24310..7b474bdc1f 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/CreateQueueSheet/CreateQueueSheet.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/CreateQueueSheet/CreateQueueSheet.tsx @@ -1,9 +1,4 @@ import { zodResolver } from '@hookform/resolvers/zod' -import { DiscardChangesConfirmationDialog } from 'components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' -import { useDatabaseQueueCreateMutation } from 'data/database-queues/database-queues-create-mutation' -import { useQueuesExposePostgrestStatusQuery } from 'data/database-queues/database-queues-expose-postgrest-status-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useConfirmOnClose } from 'hooks/ui/useConfirmOnClose' import { useRouter } from 'next/router' import { useEffect, useMemo } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' @@ -26,6 +21,11 @@ import { PgPartmanCallout } from './PgPartmanCallout' import { QueueNameField } from './QueueNameField' import { QueueTypeSelector } from './QueueTypeSelector' import { RlsSection } from './RlsSection' +import { DiscardChangesConfirmationDialog } from '@/components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' +import { useDatabaseQueueCreateMutation } from '@/data/database-queues/database-queues-create-mutation' +import { useQueuesExposePostgrestStatusQuery } from '@/data/database-queues/database-queues-expose-postgrest-status-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useConfirmOnClose } from '@/hooks/ui/useConfirmOnClose' export interface CreateQueueSheetProps { visible: boolean diff --git a/apps/studio/components/interfaces/Integrations/Queues/CreateQueueSheet/PgPartmanCallout.tsx b/apps/studio/components/interfaces/Integrations/Queues/CreateQueueSheet/PgPartmanCallout.tsx index 4e7e54f35d..8f3abeccb9 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/CreateQueueSheet/PgPartmanCallout.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/CreateQueueSheet/PgPartmanCallout.tsx @@ -1,9 +1,9 @@ -import { EnableExtensionModal } from 'components/interfaces/Database/Extensions/EnableExtensionModal' import { useState } from 'react' import { Button } from 'ui' import { Admonition } from 'ui-patterns' import { usePgPartmanStatus } from '../usePgPartmanStatus' +import { EnableExtensionModal } from '@/components/interfaces/Database/Extensions/EnableExtensionModal' export function PgPartmanCallout() { const { pgPartmanExtension, isAvailable, isInstalled } = usePgPartmanStatus() diff --git a/apps/studio/components/interfaces/Integrations/Queues/CreateQueueSheet/RlsSection.tsx b/apps/studio/components/interfaces/Integrations/Queues/CreateQueueSheet/RlsSection.tsx index 09f465e983..586ad0e871 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/CreateQueueSheet/RlsSection.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/CreateQueueSheet/RlsSection.tsx @@ -1,10 +1,10 @@ -import { Markdown } from 'components/interfaces/Markdown' import { UseFormReturn } from 'react-hook-form' import { Badge, FormControl_Shadcn_, FormField_Shadcn_, SheetSection, Switch } from 'ui' import { Admonition } from 'ui-patterns' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { CreateQueueForm } from './CreateQueueSheet.schema' +import { Markdown } from '@/components/interfaces/Markdown' export function RlsSection({ form, diff --git a/apps/studio/components/interfaces/Integrations/Queues/OverviewTab.tsx b/apps/studio/components/interfaces/Integrations/Queues/OverviewTab.tsx index 1648b13247..6781bed40d 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/OverviewTab.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/OverviewTab.tsx @@ -1,6 +1,4 @@ import { useFlag, useParams } from 'common' -import { useQueuesExposePostgrestStatusQuery } from 'data/database-queues/database-queues-expose-postgrest-status-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import Link from 'next/link' import { Button } from 'ui' import { Admonition } from 'ui-patterns' @@ -8,6 +6,8 @@ import { Admonition } from 'ui-patterns' import { IntegrationOverviewTab } from '../Integration/IntegrationOverviewTab' import { IntegrationOverviewTabV2 } from '../Integration/IntegrationOverviewTabV2' import { useDatabaseExtensionsQuery } from '@/data/database-extensions/database-extensions-query' +import { useQueuesExposePostgrestStatusQuery } from '@/data/database-queues/database-queues-expose-postgrest-status-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' const QueuesAdmonition = () => { const { ref } = useParams() diff --git a/apps/studio/components/interfaces/Integrations/Queues/QueueCells.tsx b/apps/studio/components/interfaces/Integrations/Queues/QueueCells.tsx index b6192a06eb..c72ea63e23 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/QueueCells.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/QueueCells.tsx @@ -1,11 +1,11 @@ import dayjs from 'dayjs' import { Check, Loader2, X } from 'lucide-react' -import { useQueuesMetricsQuery } from 'data/database-queues/database-queues-metrics-query' -import { PostgresQueue } from 'data/database-queues/database-queues-query' -import { useTablesQuery } from 'data/tables/tables-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DATETIME_FORMAT } from 'lib/constants' +import { useQueuesMetricsQuery } from '@/data/database-queues/database-queues-metrics-query' +import { PostgresQueue } from '@/data/database-queues/database-queues-query' +import { useTablesQuery } from '@/data/tables/tables-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DATETIME_FORMAT } from '@/lib/constants' export interface QueueWithMetrics extends PostgresQueue { id: string // Add unique id for DataGrid diff --git a/apps/studio/components/interfaces/Integrations/Queues/QueuePage.tsx b/apps/studio/components/interfaces/Integrations/Queues/QueuePage.tsx index a1703ae45b..a6b4c12247 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/QueuePage.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/QueuePage.tsx @@ -1,11 +1,7 @@ +import { useParams } from 'common' import dayjs from 'dayjs' import Link from 'next/link' import { useRouter } from 'next/router' - -import { useParams } from 'common' -import { useQueuesQuery } from 'data/database-queues/database-queues-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DATETIME_FORMAT } from 'lib/constants' import { BreadcrumbItem_Shadcn_ as BreadcrumbItem, BreadcrumbLink_Shadcn_ as BreadcrumbLink, @@ -21,7 +17,11 @@ import { PageHeaderSummary, PageHeaderTitle, } from 'ui-patterns/PageHeader' + import { QueueTab } from './QueueTab' +import { useQueuesQuery } from '@/data/database-queues/database-queues-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DATETIME_FORMAT } from '@/lib/constants' export const QueuePage = () => { const router = useRouter() diff --git a/apps/studio/components/interfaces/Integrations/Queues/QueueTab.tsx b/apps/studio/components/interfaces/Integrations/Queues/QueueTab.tsx index c55b11438d..b191093130 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/QueueTab.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/QueueTab.tsx @@ -1,25 +1,9 @@ +import { useParams } from 'common' import { Lock, Paintbrush, PlusCircle, Trash2 } from 'lucide-react' import Link from 'next/link' import { parseAsBoolean, useQueryState } from 'nuqs' import { useMemo, useState } from 'react' import { toast } from 'sonner' - -import { useParams } from 'common' -import { DeleteQueue } from 'components/interfaces/Integrations/Queues/SingleQueue/DeleteQueue' -import { PurgeQueue } from 'components/interfaces/Integrations/Queues/SingleQueue/PurgeQueue' -import { QUEUE_MESSAGE_TYPE } from 'components/interfaces/Integrations/Queues/SingleQueue/Queue.utils' -import { QueueMessagesDataGrid } from 'components/interfaces/Integrations/Queues/SingleQueue/QueueDataGrid' -import { QueueFilters } from 'components/interfaces/Integrations/Queues/SingleQueue/QueueFilters' -import { QueueSettings } from 'components/interfaces/Integrations/Queues/SingleQueue/QueueSettings' -import { SendMessageModal } from 'components/interfaces/Integrations/Queues/SingleQueue/SendMessageModal' -import { Markdown } from 'components/interfaces/Markdown' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useDatabasePoliciesQuery } from 'data/database-policies/database-policies-query' -import { useQueueMessagesInfiniteQuery } from 'data/database-queues/database-queue-messages-infinite-query' -import { useQueuesExposePostgrestStatusQuery } from 'data/database-queues/database-queues-expose-postgrest-status-query' -import { useTableUpdateMutation } from 'data/tables/table-update-mutation' -import { useTablesQuery } from 'data/tables/tables-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Button, cn, @@ -32,6 +16,22 @@ import { import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' +import { DeleteQueue } from '@/components/interfaces/Integrations/Queues/SingleQueue/DeleteQueue' +import { PurgeQueue } from '@/components/interfaces/Integrations/Queues/SingleQueue/PurgeQueue' +import { QUEUE_MESSAGE_TYPE } from '@/components/interfaces/Integrations/Queues/SingleQueue/Queue.utils' +import { QueueMessagesDataGrid } from '@/components/interfaces/Integrations/Queues/SingleQueue/QueueDataGrid' +import { QueueFilters } from '@/components/interfaces/Integrations/Queues/SingleQueue/QueueFilters' +import { QueueSettings } from '@/components/interfaces/Integrations/Queues/SingleQueue/QueueSettings' +import { SendMessageModal } from '@/components/interfaces/Integrations/Queues/SingleQueue/SendMessageModal' +import { Markdown } from '@/components/interfaces/Markdown' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useDatabasePoliciesQuery } from '@/data/database-policies/database-policies-query' +import { useQueueMessagesInfiniteQuery } from '@/data/database-queues/database-queue-messages-infinite-query' +import { useQueuesExposePostgrestStatusQuery } from '@/data/database-queues/database-queues-expose-postgrest-status-query' +import { useTableUpdateMutation } from '@/data/tables/table-update-mutation' +import { useTablesQuery } from '@/data/tables/tables-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' + export const QueueTab = () => { const { childId: queueName, ref } = useParams() const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Integrations/Queues/Queues.utils.tsx b/apps/studio/components/interfaces/Integrations/Queues/Queues.utils.tsx index 2ad7a10e1a..9378c1e752 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/Queues.utils.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/Queues.utils.tsx @@ -1,8 +1,7 @@ import { Column } from 'react-data-grid' +import { cn } from 'ui' import z from 'zod' -import { PostgresQueue } from 'data/database-queues/database-queues-query' -import { cn } from 'ui' import { QueueCreatedAtCell, QueueNameCell, @@ -11,6 +10,7 @@ import { QueueTypeCell, QueueWithMetrics, } from './QueueCells' +import { PostgresQueue } from '@/data/database-queues/database-queues-query' export const formatQueueColumns = (): Column[] => { return [ diff --git a/apps/studio/components/interfaces/Integrations/Queues/QueuesRows.tsx b/apps/studio/components/interfaces/Integrations/Queues/QueuesRows.tsx index ea46973bc8..edc6916bf0 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/QueuesRows.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/QueuesRows.tsx @@ -3,12 +3,12 @@ import { includes, sortBy } from 'lodash' import { Check, ChevronRight, Loader2, X } from 'lucide-react' import { useRouter } from 'next/router' -import Table from 'components/to-be-cleaned/Table' -import { useQueuesMetricsQuery } from 'data/database-queues/database-queues-metrics-query' -import { PostgresQueue } from 'data/database-queues/database-queues-query' -import { useTablesQuery } from 'data/tables/tables-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DATETIME_FORMAT } from 'lib/constants' +import Table from '@/components/to-be-cleaned/Table' +import { useQueuesMetricsQuery } from '@/data/database-queues/database-queues-metrics-query' +import { PostgresQueue } from '@/data/database-queues/database-queues-query' +import { useTablesQuery } from '@/data/tables/tables-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DATETIME_FORMAT } from '@/lib/constants' interface QueuesRowsProps { queues: PostgresQueue[] diff --git a/apps/studio/components/interfaces/Integrations/Queues/QueuesSettings.tsx b/apps/studio/components/interfaces/Integrations/Queues/QueuesSettings.tsx index 658db38217..d91f238416 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/QueuesSettings.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/QueuesSettings.tsx @@ -1,24 +1,6 @@ import { zodResolver } from '@hookform/resolvers/zod' import { QUEUES_SCHEMA } from '@supabase/pg-meta' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { DocsButton } from 'components/ui/DocsButton' -import { FormHeader } from 'components/ui/Forms/FormHeader' -import { - FormPanelContainer, - FormPanelContent, - FormPanelFooter, -} from 'components/ui/Forms/FormPanel' -import { InlineLink } from 'components/ui/InlineLink' -import { useProjectPostgrestConfigQuery } from 'data/config/project-postgrest-config-query' -import { useProjectPostgrestConfigUpdateMutation } from 'data/config/project-postgrest-config-update-mutation' -import { useQueuesExposePostgrestStatusQuery } from 'data/database-queues/database-queues-expose-postgrest-status-query' -import { useDatabaseQueueToggleExposeMutation } from 'data/database-queues/database-queues-toggle-postgrest-mutation' -import { useDatabaseQueuesVersionQuery } from 'data/database-queues/database-queues-version-query' -import { useTableUpdateMutation } from 'data/tables/table-update-mutation' -import { useTablesQuery } from 'data/tables/tables-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL, IS_PLATFORM } from 'lib/constants' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' @@ -35,6 +17,25 @@ import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { z } from 'zod' +import { DocsButton } from '@/components/ui/DocsButton' +import { FormHeader } from '@/components/ui/Forms/FormHeader' +import { + FormPanelContainer, + FormPanelContent, + FormPanelFooter, +} from '@/components/ui/Forms/FormPanel' +import { InlineLink } from '@/components/ui/InlineLink' +import { useProjectPostgrestConfigQuery } from '@/data/config/project-postgrest-config-query' +import { useProjectPostgrestConfigUpdateMutation } from '@/data/config/project-postgrest-config-update-mutation' +import { useQueuesExposePostgrestStatusQuery } from '@/data/database-queues/database-queues-expose-postgrest-status-query' +import { useDatabaseQueueToggleExposeMutation } from '@/data/database-queues/database-queues-toggle-postgrest-mutation' +import { useDatabaseQueuesVersionQuery } from '@/data/database-queues/database-queues-version-query' +import { useTableUpdateMutation } from '@/data/tables/table-update-mutation' +import { useTablesQuery } from '@/data/tables/tables-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL, IS_PLATFORM } from '@/lib/constants' + export const QueuesSettings = () => { const { data: project } = useSelectedProjectQuery() const { can: canUpdatePostgrestConfig } = useAsyncCheckPermissions( diff --git a/apps/studio/components/interfaces/Integrations/Queues/QueuesTab.tsx b/apps/studio/components/interfaces/Integrations/Queues/QueuesTab.tsx index ec41650a71..1ba67025fb 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/QueuesTab.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/QueuesTab.tsx @@ -1,7 +1,4 @@ import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { useQueuesQuery } from 'data/database-queues/database-queues-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { RefreshCw, Search, X } from 'lucide-react' import { useRouter } from 'next/router' import { parseAsBoolean, parseAsString, useQueryState } from 'nuqs' @@ -13,6 +10,9 @@ import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { CreateQueueSheet } from './CreateQueueSheet' import { formatQueueColumns, prepareQueuesForDataGrid } from './Queues.utils' +import AlertError from '@/components/ui/AlertError' +import { useQueuesQuery } from '@/data/database-queues/database-queues-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export const QueuesTab = () => { const router = useRouter() diff --git a/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/DeleteQueue.tsx b/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/DeleteQueue.tsx index d56f54563b..c7ead6ecda 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/DeleteQueue.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/DeleteQueue.tsx @@ -1,9 +1,9 @@ import { useRouter } from 'next/router' import { toast } from 'sonner' -import { TextConfirmModal } from 'components/ui/TextConfirmModalWrapper' -import { useDatabaseQueueDeleteMutation } from 'data/database-queues/database-queues-delete-mutation' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' +import { TextConfirmModal } from '@/components/ui/TextConfirmModalWrapper' +import { useDatabaseQueueDeleteMutation } from '@/data/database-queues/database-queues-delete-mutation' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface DeleteQueueProps { queueName: string diff --git a/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/MessageDetailsPanel.tsx b/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/MessageDetailsPanel.tsx index 0bbec45609..be47e16997 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/MessageDetailsPanel.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/MessageDetailsPanel.tsx @@ -1,18 +1,9 @@ import { useEscapeKeydown } from '@radix-ui/react-use-escape-keydown' +import { useParams } from 'common' +import dayjs from 'dayjs' import { isNil, noop } from 'lodash' import { Archive, Clock12, Trash2, X } from 'lucide-react' import { useState } from 'react' - -import { useParams } from 'common' -import { MonacoEditor } from 'components/grid/components/common/MonacoEditor' -import { RowAction, RowData } from 'components/interfaces/Auth/Users/UserOverview' -import { useDatabaseQueueMessageArchiveMutation } from 'data/database-queues/database-queue-messages-archive-mutation' -import { useDatabaseQueueMessageDeleteMutation } from 'data/database-queues/database-queue-messages-delete-mutation' -import { PostgresQueueMessage } from 'data/database-queues/database-queue-messages-infinite-query' -import { useDatabaseQueueMessageReadMutation } from 'data/database-queues/database-queue-messages-read-mutation' -import dayjs from 'dayjs' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { prettifyJSON } from 'lib/helpers' import { Button, ResizablePanel, @@ -23,6 +14,15 @@ import { TabsTrigger_Shadcn_, } from 'ui' +import { MonacoEditor } from '@/components/grid/components/common/MonacoEditor' +import { RowAction, RowData } from '@/components/interfaces/Auth/Users/UserOverview' +import { useDatabaseQueueMessageArchiveMutation } from '@/data/database-queues/database-queue-messages-archive-mutation' +import { useDatabaseQueueMessageDeleteMutation } from '@/data/database-queues/database-queue-messages-delete-mutation' +import { PostgresQueueMessage } from '@/data/database-queues/database-queue-messages-infinite-query' +import { useDatabaseQueueMessageReadMutation } from '@/data/database-queues/database-queue-messages-read-mutation' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { prettifyJSON } from '@/lib/helpers' + export const DATE_FORMAT = 'DD MMM, YYYY HH:mm' interface MessageDetailsPanelProps { diff --git a/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/PurgeQueue.tsx b/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/PurgeQueue.tsx index 30aee3c40d..7c1de9edf4 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/PurgeQueue.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/PurgeQueue.tsx @@ -1,8 +1,8 @@ import { toast } from 'sonner' -import { TextConfirmModal } from 'components/ui/TextConfirmModalWrapper' -import { useDatabaseQueuePurgeMutation } from 'data/database-queues/database-queues-purge-mutation' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' +import { TextConfirmModal } from '@/components/ui/TextConfirmModalWrapper' +import { useDatabaseQueuePurgeMutation } from '@/data/database-queues/database-queues-purge-mutation' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface PurgeQueueProps { queueName: string diff --git a/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/QueueFilters.tsx b/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/QueueFilters.tsx index 6b4b1dc686..afc8f3a6f6 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/QueueFilters.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/QueueFilters.tsx @@ -1,5 +1,5 @@ -import { FilterPopover } from 'components/ui/FilterPopover' import { QUEUE_MESSAGE_OPTIONS, QUEUE_MESSAGE_TYPE } from './Queue.utils' +import { FilterPopover } from '@/components/ui/FilterPopover' interface QueueFiltersProps { selectedTypes: QUEUE_MESSAGE_TYPE[] diff --git a/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/QueueSettings.tsx b/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/QueueSettings.tsx index c2c02f11dc..4e3f3ef3f8 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/QueueSettings.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/QueueSettings.tsx @@ -1,25 +1,9 @@ +import { useParams } from 'common' import { isEqual } from 'lodash' import { HelpCircle, Settings } from 'lucide-react' import Link from 'next/link' import { useEffect, useState } from 'react' import { toast } from 'sonner' - -import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useQueuesExposePostgrestStatusQuery } from 'data/database-queues/database-queues-expose-postgrest-status-query' -import { useDatabaseRolesQuery } from 'data/database-roles/database-roles-query' -import { - TablePrivilegesGrant, - useTablePrivilegesGrantMutation, -} from 'data/privileges/table-privileges-grant-mutation' -import { useTablePrivilegesQuery } from 'data/privileges/table-privileges-query' -import { - TablePrivilegesRevoke, - useTablePrivilegesRevokeMutation, -} from 'data/privileges/table-privileges-revoke-mutation' -import { useTablesQuery } from 'data/tables/tables-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Button, Sheet, @@ -43,7 +27,23 @@ import { } from 'ui' import { Admonition } from 'ui-patterns/admonition' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' + import { getQueueFunctionsMapping } from './Queue.utils' +import AlertError from '@/components/ui/AlertError' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useQueuesExposePostgrestStatusQuery } from '@/data/database-queues/database-queues-expose-postgrest-status-query' +import { useDatabaseRolesQuery } from '@/data/database-roles/database-roles-query' +import { + TablePrivilegesGrant, + useTablePrivilegesGrantMutation, +} from '@/data/privileges/table-privileges-grant-mutation' +import { useTablePrivilegesQuery } from '@/data/privileges/table-privileges-query' +import { + TablePrivilegesRevoke, + useTablePrivilegesRevokeMutation, +} from '@/data/privileges/table-privileges-revoke-mutation' +import { useTablesQuery } from '@/data/tables/tables-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' const ACTIONS = ['select', 'insert', 'update', 'delete'] const ROLES = ['anon', 'authenticated', 'postgres', 'service_role'] diff --git a/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/SendMessageModal.tsx b/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/SendMessageModal.tsx index 635cbaae0b..181c3a3178 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/SendMessageModal.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/SendMessageModal.tsx @@ -1,15 +1,15 @@ import { zodResolver } from '@hookform/resolvers/zod' +import { useParams } from 'common' import { useEffect } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import z from 'zod' - -import { useParams } from 'common' -import CodeEditor from 'components/ui/CodeEditor/CodeEditor' -import { useDatabaseQueueMessageSendMutation } from 'data/database-queues/database-queue-messages-send-mutation' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, Input, Modal } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import z from 'zod' + +import CodeEditor from '@/components/ui/CodeEditor/CodeEditor' +import { useDatabaseQueueMessageSendMutation } from '@/data/database-queues/database-queue-messages-send-mutation' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface SendMessageModalProps { visible: boolean diff --git a/apps/studio/components/interfaces/Integrations/Queues/UpgradeDatabaseAlert.tsx b/apps/studio/components/interfaces/Integrations/Queues/UpgradeDatabaseAlert.tsx index ed2042424e..7c6ffc398c 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/UpgradeDatabaseAlert.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/UpgradeDatabaseAlert.tsx @@ -1,8 +1,9 @@ -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import Link from 'next/link' import { Button } from 'ui' import { Admonition } from 'ui-patterns/admonition' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' + interface UpgradeDatabaseAlertProps { minimumVersion?: string } diff --git a/apps/studio/components/interfaces/Integrations/Queues/usePgPartmanStatus.ts b/apps/studio/components/interfaces/Integrations/Queues/usePgPartmanStatus.ts index 22d2aaf6df..6da0811f33 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/usePgPartmanStatus.ts +++ b/apps/studio/components/interfaces/Integrations/Queues/usePgPartmanStatus.ts @@ -1,5 +1,5 @@ -import { useDatabaseExtensionsQuery } from 'data/database-extensions/database-extensions-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' +import { useDatabaseExtensionsQuery } from '@/data/database-extensions/database-extensions-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export function usePgPartmanStatus() { const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Integrations/Vault/Secrets/AddNewSecretModal.tsx b/apps/studio/components/interfaces/Integrations/Vault/Secrets/AddNewSecretModal.tsx index 32f8abfa14..68d0b585b0 100644 --- a/apps/studio/components/interfaces/Integrations/Vault/Secrets/AddNewSecretModal.tsx +++ b/apps/studio/components/interfaces/Integrations/Vault/Secrets/AddNewSecretModal.tsx @@ -1,6 +1,4 @@ import { zodResolver } from '@hookform/resolvers/zod' -import { useVaultSecretCreateMutation } from 'data/vault/vault-secret-create-mutation' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { parseAsBoolean, useQueryState } from 'nuqs' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' @@ -22,6 +20,9 @@ import { Input } from 'ui-patterns/DataInputs/Input' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import * as z from 'zod' +import { useVaultSecretCreateMutation } from '@/data/vault/vault-secret-create-mutation' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' + const formSchema = z.object({ name: z.string().min(1, 'Please provide a name for your secret'), description: z.string().optional(), diff --git a/apps/studio/components/interfaces/Integrations/Vault/Secrets/DeleteSecretModal.tsx b/apps/studio/components/interfaces/Integrations/Vault/Secrets/DeleteSecretModal.tsx index 397b3d1d5b..cf844e0a54 100644 --- a/apps/studio/components/interfaces/Integrations/Vault/Secrets/DeleteSecretModal.tsx +++ b/apps/studio/components/interfaces/Integrations/Vault/Secrets/DeleteSecretModal.tsx @@ -1,11 +1,11 @@ -import { useVaultSecretDeleteMutation } from 'data/vault/vault-secret-delete-mutation' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { parseAsString, useQueryState } from 'nuqs' import { useEffect } from 'react' import { toast } from 'sonner' import { Modal } from 'ui' +import { useVaultSecretDeleteMutation } from '@/data/vault/vault-secret-delete-mutation' import { useVaultSecretsQuery } from '@/data/vault/vault-secrets-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export const DeleteSecretModal = () => { const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Integrations/Vault/Secrets/EditSecretModal.tsx b/apps/studio/components/interfaces/Integrations/Vault/Secrets/EditSecretModal.tsx index d17af31783..2114ee7892 100644 --- a/apps/studio/components/interfaces/Integrations/Vault/Secrets/EditSecretModal.tsx +++ b/apps/studio/components/interfaces/Integrations/Vault/Secrets/EditSecretModal.tsx @@ -1,13 +1,9 @@ import { zodResolver } from '@hookform/resolvers/zod' -import { useVaultSecretDecryptedValueQuery } from 'data/vault/vault-secret-decrypted-value-query' -import { useVaultSecretUpdateMutation } from 'data/vault/vault-secret-update-mutation' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Eye, EyeOff } from 'lucide-react' import { parseAsString, useQueryState } from 'nuqs' import { useEffect, useState } from 'react' import { useForm, type SubmitHandler } from 'react-hook-form' import { toast } from 'sonner' -import type { VaultSecret } from 'types' import { Button, Dialog, @@ -26,7 +22,11 @@ import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { z } from 'zod' +import { useVaultSecretDecryptedValueQuery } from '@/data/vault/vault-secret-decrypted-value-query' +import { useVaultSecretUpdateMutation } from '@/data/vault/vault-secret-update-mutation' import { useVaultSecretsQuery } from '@/data/vault/vault-secrets-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import type { VaultSecret } from '@/types' const SecretSchema = z.object({ name: z.string().min(1, 'Please provide a name for your secret'), diff --git a/apps/studio/components/interfaces/Integrations/Vault/Secrets/SecretRow.tsx b/apps/studio/components/interfaces/Integrations/Vault/Secrets/SecretRow.tsx index d4be094485..8a494fb364 100644 --- a/apps/studio/components/interfaces/Integrations/Vault/Secrets/SecretRow.tsx +++ b/apps/studio/components/interfaces/Integrations/Vault/Secrets/SecretRow.tsx @@ -1,14 +1,9 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { DropdownMenuItemTooltip } from 'components/ui/DropdownMenuItemTooltip' -import { useVaultSecretDecryptedValueQuery } from 'data/vault/vault-secret-decrypted-value-query' import dayjs from 'dayjs' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Edit3, Eye, EyeOff, Key, Loader, MoreVertical, Trash } from 'lucide-react' import { parseAsString, useQueryState } from 'nuqs' import { useState } from 'react' -import type { VaultSecret } from 'types' import { Button, DropdownMenu, @@ -19,6 +14,11 @@ import { import { Input } from 'ui-patterns/DataInputs/Input' import { SecretTableColumn } from './Secrets.types' +import { DropdownMenuItemTooltip } from '@/components/ui/DropdownMenuItemTooltip' +import { useVaultSecretDecryptedValueQuery } from '@/data/vault/vault-secret-decrypted-value-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import type { VaultSecret } from '@/types' interface SecretRowProps { row: VaultSecret diff --git a/apps/studio/components/interfaces/Integrations/Vault/Secrets/Secrets.utils.tsx b/apps/studio/components/interfaces/Integrations/Vault/Secrets/Secrets.utils.tsx index 431d6853ba..495856ec52 100644 --- a/apps/studio/components/interfaces/Integrations/Vault/Secrets/Secrets.utils.tsx +++ b/apps/studio/components/interfaces/Integrations/Vault/Secrets/Secrets.utils.tsx @@ -1,9 +1,9 @@ import type { Column } from 'react-data-grid' -import type { VaultSecret } from 'types' import { cn } from 'ui' import { SecretRow } from './SecretRow' import { SecretTableColumn } from './Secrets.types' +import type { VaultSecret } from '@/types' export const SECRET_TABLE_COLUMNS: SecretTableColumn[] = [ { id: 'secret', name: 'Secret', minWidth: 300, width: 360 }, diff --git a/apps/studio/components/interfaces/Integrations/Vault/Secrets/SecretsManagement.tsx b/apps/studio/components/interfaces/Integrations/Vault/Secrets/SecretsManagement.tsx index f78a21ebd7..e5fed51b1e 100644 --- a/apps/studio/components/interfaces/Integrations/Vault/Secrets/SecretsManagement.tsx +++ b/apps/studio/components/interfaces/Integrations/Vault/Secrets/SecretsManagement.tsx @@ -1,17 +1,10 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DocsButton } from 'components/ui/DocsButton' -import { useVaultSecretsQuery } from 'data/vault/vault-secrets-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import { sortBy } from 'lodash' import { RefreshCw, Search, X } from 'lucide-react' import { parseAsBoolean, useQueryState } from 'nuqs' import { useEffect, useMemo, useState } from 'react' import DataGrid, { Row } from 'react-data-grid' -import type { VaultSecret } from 'types' import { Button, cn, @@ -29,6 +22,13 @@ import { DeleteSecretModal } from './DeleteSecretModal' import { EditSecretModal } from './EditSecretModal' import { formatSecretColumns } from './Secrets.utils' import AlertError from '@/components/ui/AlertError' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DocsButton } from '@/components/ui/DocsButton' +import { useVaultSecretsQuery } from '@/data/vault/vault-secrets-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' +import type { VaultSecret } from '@/types' export const SecretsManagement = () => { const { search } = useParams() diff --git a/apps/studio/components/interfaces/Integrations/Vault/Secrets/__tests__/EditSecretModal.test.tsx b/apps/studio/components/interfaces/Integrations/Vault/Secrets/__tests__/EditSecretModal.test.tsx index cfbf274f92..e21e9fabb6 100644 --- a/apps/studio/components/interfaces/Integrations/Vault/Secrets/__tests__/EditSecretModal.test.tsx +++ b/apps/studio/components/interfaces/Integrations/Vault/Secrets/__tests__/EditSecretModal.test.tsx @@ -1,15 +1,15 @@ import { fireEvent, screen, waitFor } from '@testing-library/dom' import userEvent from '@testing-library/user-event' -import { ProjectContextProvider } from 'components/layouts/ProjectLayout/ProjectContext' import { mockAnimationsApi } from 'jsdom-testing-mocks' import { HttpResponse } from 'msw' -import { customRender } from 'tests/lib/custom-render' -import { addAPIMock } from 'tests/lib/msw' -import { routerMock } from 'tests/lib/route-mock' -import type { VaultSecret } from 'types' import { beforeEach, describe, expect, it } from 'vitest' import { EditSecretModal } from '../EditSecretModal' +import { ProjectContextProvider } from '@/components/layouts/ProjectLayout/ProjectContext' +import { customRender } from '@/tests/lib/custom-render' +import { addAPIMock } from '@/tests/lib/msw' +import { routerMock } from '@/tests/lib/route-mock' +import type { VaultSecret } from '@/types' const secret: VaultSecret = { id: '47ca58b4-01c5-4a71-8814-c73856b02e0e', diff --git a/apps/studio/components/interfaces/Integrations/Vercel/OrganizationPicker.tsx b/apps/studio/components/interfaces/Integrations/Vercel/OrganizationPicker.tsx index 99116bbf14..5f156f6a32 100644 --- a/apps/studio/components/interfaces/Integrations/Vercel/OrganizationPicker.tsx +++ b/apps/studio/components/interfaces/Integrations/Vercel/OrganizationPicker.tsx @@ -1,27 +1,27 @@ -import { useMemo, useRef, useState } from 'react' - -import { getHasInstalledObject } from 'components/layouts/IntegrationsLayout/Integrations.utils' -import PartnerIcon from 'components/ui/PartnerIcon' -import { useIntegrationsQuery } from 'data/integrations/integrations-query' -import type { IntegrationName } from 'data/integrations/integrations.types' -import { useOrganizationsQuery } from 'data/organizations/organizations-query' import { ChevronDown } from 'lucide-react' -import type { Organization } from 'types' +import { useMemo, useRef, useState } from 'react' import { Badge, Button, + cn, + Command_Shadcn_, CommandEmpty_Shadcn_, CommandGroup_Shadcn_, CommandInput_Shadcn_, CommandItem_Shadcn_, CommandList_Shadcn_, - Command_Shadcn_, + Popover_Shadcn_, PopoverContent_Shadcn_, PopoverTrigger_Shadcn_, - Popover_Shadcn_, - cn, } from 'ui' +import { getHasInstalledObject } from '@/components/layouts/IntegrationsLayout/Integrations.utils' +import PartnerIcon from '@/components/ui/PartnerIcon' +import { useIntegrationsQuery } from '@/data/integrations/integrations-query' +import type { IntegrationName } from '@/data/integrations/integrations.types' +import { useOrganizationsQuery } from '@/data/organizations/organizations-query' +import type { Organization } from '@/types' + export interface OrganizationPickerProps { integrationName: IntegrationName configurationId?: string diff --git a/apps/studio/components/interfaces/Integrations/VercelGithub/IntegrationConnection.tsx b/apps/studio/components/interfaces/Integrations/VercelGithub/IntegrationConnection.tsx index 9ab7486ff2..97435d21e0 100644 --- a/apps/studio/components/interfaces/Integrations/VercelGithub/IntegrationConnection.tsx +++ b/apps/studio/components/interfaces/Integrations/VercelGithub/IntegrationConnection.tsx @@ -3,16 +3,6 @@ import Link from 'next/link' import { useRouter } from 'next/router' import { forwardRef, useCallback, useState } from 'react' import { toast } from 'sonner' - -import { - IntegrationConnection, - IntegrationConnectionProps, -} from 'components/interfaces/Integrations/VercelGithub/IntegrationPanels' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useIntegrationsVercelConnectionSyncEnvsMutation } from 'data/integrations/integrations-vercel-connection-sync-envs-mutation' -import type { IntegrationProjectConnection } from 'data/integrations/integrations.types' -import { useProjectDetailQuery } from 'data/projects/project-detail-query' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { Button, DropdownMenu, @@ -23,6 +13,16 @@ import { } from 'ui' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' +import { + IntegrationConnection, + IntegrationConnectionProps, +} from '@/components/interfaces/Integrations/VercelGithub/IntegrationPanels' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useIntegrationsVercelConnectionSyncEnvsMutation } from '@/data/integrations/integrations-vercel-connection-sync-envs-mutation' +import type { IntegrationProjectConnection } from '@/data/integrations/integrations.types' +import { useProjectDetailQuery } from '@/data/projects/project-detail-query' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' + interface IntegrationConnectionItemProps extends IntegrationConnectionProps { disabled?: boolean onDeleteConnection: (connection: IntegrationProjectConnection) => void | Promise diff --git a/apps/studio/components/interfaces/Integrations/VercelGithub/IntegrationPanels.tsx b/apps/studio/components/interfaces/Integrations/VercelGithub/IntegrationPanels.tsx index 061b5a5528..de83cb9b97 100644 --- a/apps/studio/components/interfaces/Integrations/VercelGithub/IntegrationPanels.tsx +++ b/apps/studio/components/interfaces/Integrations/VercelGithub/IntegrationPanels.tsx @@ -3,17 +3,17 @@ import { ArrowRight, ExternalLink, Github } from 'lucide-react' import Image from 'next/legacy/image' import Link from 'next/link' import { forwardRef, HTMLAttributes, ReactNode, RefAttributes } from 'react' +import { Badge, Button, cn } from 'ui' -import { Markdown } from 'components/interfaces/Markdown' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' +import { Markdown } from '@/components/interfaces/Markdown' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' import type { Integration, IntegrationProjectConnection, -} from 'data/integrations/integrations.types' -import { useProjectDetailQuery } from 'data/projects/project-detail-query' -import { BASE_PATH } from 'lib/constants' -import { getIntegrationConfigurationUrl } from 'lib/integration-utils' -import { Badge, Button, cn } from 'ui' +} from '@/data/integrations/integrations.types' +import { useProjectDetailQuery } from '@/data/projects/project-detail-query' +import { BASE_PATH } from '@/lib/constants' +import { getIntegrationConfigurationUrl } from '@/lib/integration-utils' const ICON_STROKE_WIDTH = 2 const ICON_SIZE = 14 diff --git a/apps/studio/components/interfaces/Integrations/VercelGithub/ProjectLinker.tsx b/apps/studio/components/interfaces/Integrations/VercelGithub/ProjectLinker.tsx index 8cfdf7bd1a..9f21e471f8 100644 --- a/apps/studio/components/interfaces/Integrations/VercelGithub/ProjectLinker.tsx +++ b/apps/studio/components/interfaces/Integrations/VercelGithub/ProjectLinker.tsx @@ -1,38 +1,38 @@ import { Check, ChevronDown, Plus, PlusIcon } from 'lucide-react' +import Link from 'next/link' import { useRouter } from 'next/router' import { ReactNode, useEffect, useState } from 'react' import { toast } from 'sonner' - -import { OrganizationProjectSelector } from 'components/ui/OrganizationProjectSelector' -import ShimmerLine from 'components/ui/ShimmerLine' -import { - IntegrationConnectionsCreateVariables, - IntegrationProjectConnection, -} from 'data/integrations/integrations.types' -import { useOrgProjectsInfiniteQuery } from 'data/projects/org-projects-infinite-query' -import { useProjectDetailQuery } from 'data/projects/project-detail-query' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { BASE_PATH } from 'lib/constants' -import { openInstallGitHubIntegrationWindow } from 'lib/github' -import { EMPTY_ARR } from 'lib/void' -import Link from 'next/link' import { Badge, Button, + cn, + Command_Shadcn_, CommandEmpty_Shadcn_, CommandGroup_Shadcn_, CommandInput_Shadcn_, CommandItem_Shadcn_, CommandList_Shadcn_, CommandSeparator_Shadcn_, - Command_Shadcn_, + Popover_Shadcn_, PopoverContent_Shadcn_, PopoverTrigger_Shadcn_, - Popover_Shadcn_, - cn, } from 'ui' +import { OrganizationProjectSelector } from '@/components/ui/OrganizationProjectSelector' +import ShimmerLine from '@/components/ui/ShimmerLine' +import { + IntegrationConnectionsCreateVariables, + IntegrationProjectConnection, +} from '@/data/integrations/integrations.types' +import { useOrgProjectsInfiniteQuery } from '@/data/projects/org-projects-infinite-query' +import { useProjectDetailQuery } from '@/data/projects/project-detail-query' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { BASE_PATH } from '@/lib/constants' +import { openInstallGitHubIntegrationWindow } from '@/lib/github' +import { EMPTY_ARR } from '@/lib/void' + export interface Project { name: string ref: string diff --git a/apps/studio/components/interfaces/Integrations/Webhooks/OverviewTab.tsx b/apps/studio/components/interfaces/Integrations/Webhooks/OverviewTab.tsx index bf2d1c1b88..ace4e045a6 100644 --- a/apps/studio/components/interfaces/Integrations/Webhooks/OverviewTab.tsx +++ b/apps/studio/components/interfaces/Integrations/Webhooks/OverviewTab.tsx @@ -1,17 +1,17 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useFlag, useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import NoPermission from 'components/ui/NoPermission' -import { useHooksEnableMutation } from 'data/database/hooks-enable-mutation' -import { useSchemasQuery } from 'data/database/schemas-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { toast } from 'sonner' import { Admonition } from 'ui-patterns' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { IntegrationOverviewTab } from '../Integration/IntegrationOverviewTab' import { IntegrationOverviewTabV2 } from '../Integration/IntegrationOverviewTabV2' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import NoPermission from '@/components/ui/NoPermission' +import { useHooksEnableMutation } from '@/data/database/hooks-enable-mutation' +import { useSchemasQuery } from '@/data/database/schemas-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export const WebhooksOverviewTab = () => { const { ref: projectRef } = useParams() diff --git a/apps/studio/components/interfaces/Integrations/Wrappers/CreateIcebergWrapperSheet.tsx b/apps/studio/components/interfaces/Integrations/Wrappers/CreateIcebergWrapperSheet.tsx index c3938d1611..bab2e1450f 100644 --- a/apps/studio/components/interfaces/Integrations/Wrappers/CreateIcebergWrapperSheet.tsx +++ b/apps/studio/components/interfaces/Integrations/Wrappers/CreateIcebergWrapperSheet.tsx @@ -1,14 +1,6 @@ import { isEmpty } from 'lodash' import { useMemo, useState } from 'react' import { toast } from 'sonner' - -import { FormSection, FormSectionContent, FormSectionLabel } from 'components/ui/Forms/FormSection' -import { useSchemaCreateMutation } from 'data/database/schema-create-mutation' -import { useSchemasQuery } from 'data/database/schemas-query' -import { useFDWCreateMutation } from 'data/fdw/fdw-create-mutation' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Button, Form, @@ -20,9 +12,21 @@ import { SheetHeader, SheetTitle, } from 'ui' + import { CreateWrapperSheetProps } from './CreateWrapperSheet' import InputField from './InputField' import { makeValidateRequired } from './Wrappers.utils' +import { + FormSection, + FormSectionContent, + FormSectionLabel, +} from '@/components/ui/Forms/FormSection' +import { useSchemaCreateMutation } from '@/data/database/schema-create-mutation' +import { useSchemasQuery } from '@/data/database/schemas-query' +import { useFDWCreateMutation } from '@/data/fdw/fdw-create-mutation' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' const FORM_ID = 'create-wrapper-form' diff --git a/apps/studio/components/interfaces/Integrations/Wrappers/CreateWrapperSheet.tsx b/apps/studio/components/interfaces/Integrations/Wrappers/CreateWrapperSheet.tsx index ef74d88771..d7b95accea 100644 --- a/apps/studio/components/interfaces/Integrations/Wrappers/CreateWrapperSheet.tsx +++ b/apps/studio/components/interfaces/Integrations/Wrappers/CreateWrapperSheet.tsx @@ -3,15 +3,6 @@ import { isEmpty } from 'lodash' import { Edit, Trash } from 'lucide-react' import { useState } from 'react' import { toast } from 'sonner' - -import { FormSection, FormSectionContent, FormSectionLabel } from 'components/ui/Forms/FormSection' -import { useDatabaseExtensionsQuery } from 'data/database-extensions/database-extensions-query' -import { useSchemaCreateMutation } from 'data/database/schema-create-mutation' -import { invalidateSchemasQuery, useSchemasQuery } from 'data/database/schemas-query' -import { useFDWCreateMutation } from 'data/fdw/fdw-create-mutation' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Button, Form, @@ -24,10 +15,23 @@ import { SheetTitle, WarningIcon, } from 'ui' + import InputField from './InputField' import { WrapperMeta } from './Wrappers.types' import { makeValidateRequired } from './Wrappers.utils' import WrapperTableEditor from './WrapperTableEditor' +import { + FormSection, + FormSectionContent, + FormSectionLabel, +} from '@/components/ui/Forms/FormSection' +import { useDatabaseExtensionsQuery } from '@/data/database-extensions/database-extensions-query' +import { useSchemaCreateMutation } from '@/data/database/schema-create-mutation' +import { invalidateSchemasQuery, useSchemasQuery } from '@/data/database/schemas-query' +import { useFDWCreateMutation } from '@/data/fdw/fdw-create-mutation' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' const FORM_ID = 'create-wrapper-form' diff --git a/apps/studio/components/interfaces/Integrations/Wrappers/DeleteWrapperModal.tsx b/apps/studio/components/interfaces/Integrations/Wrappers/DeleteWrapperModal.tsx index dd5268c1b4..56d3ca2692 100644 --- a/apps/studio/components/interfaces/Integrations/Wrappers/DeleteWrapperModal.tsx +++ b/apps/studio/components/interfaces/Integrations/Wrappers/DeleteWrapperModal.tsx @@ -1,7 +1,4 @@ import { useParams } from 'common' -import { useFDWDeleteMutation } from 'data/fdw/fdw-delete-mutation' -import { useFDWsQuery } from 'data/fdw/fdws-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { parseAsString, useQueryState } from 'nuqs' import { useEffect, useMemo } from 'react' import { toast } from 'sonner' @@ -9,6 +6,9 @@ import { Modal } from 'ui' import { INTEGRATIONS } from '../Landing/Integrations.constants' import { getWrapperMetaForWrapper, wrapperMetaComparator } from './Wrappers.utils' +import { useFDWDeleteMutation } from '@/data/fdw/fdw-delete-mutation' +import { useFDWsQuery } from '@/data/fdw/fdws-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export const DeleteWrapperModal = () => { const { id, ref } = useParams() diff --git a/apps/studio/components/interfaces/Integrations/Wrappers/EditWrapperSheet.tsx b/apps/studio/components/interfaces/Integrations/Wrappers/EditWrapperSheet.tsx index 85cbb6afd2..f9bb04d32d 100644 --- a/apps/studio/components/interfaces/Integrations/Wrappers/EditWrapperSheet.tsx +++ b/apps/studio/components/interfaces/Integrations/Wrappers/EditWrapperSheet.tsx @@ -3,18 +3,9 @@ import { compact, isEmpty, mapValues } from 'lodash' import { Edit, Trash } from 'lucide-react' import { useCallback, useEffect, useRef, useState } from 'react' import { toast } from 'sonner' - -import { UUID_REGEX } from '@/lib/constants' -import { FormSection, FormSectionContent, FormSectionLabel } from 'components/ui/Forms/FormSection' -import { invalidateSchemasQuery } from 'data/database/schemas-query' -import { useFDWUpdateMutation } from 'data/fdw/fdw-update-mutation' -import { FDW } from 'data/fdw/fdws-query' -import { getDecryptedValues } from 'data/vault/vault-secret-decrypted-value-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useConfirmOnClose } from 'hooks/ui/useConfirmOnClose' import { Button, Form, Input, SheetFooter, SheetHeader, SheetTitle } from 'ui' -import { DiscardChangesConfirmationDialog } from 'components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' + import InputField from './InputField' import { WrapperMeta } from './Wrappers.types' import { @@ -24,6 +15,19 @@ import { makeValidateRequired, } from './Wrappers.utils' import WrapperTableEditor from './WrapperTableEditor' +import { DiscardChangesConfirmationDialog } from '@/components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' +import { + FormSection, + FormSectionContent, + FormSectionLabel, +} from '@/components/ui/Forms/FormSection' +import { invalidateSchemasQuery } from '@/data/database/schemas-query' +import { useFDWUpdateMutation } from '@/data/fdw/fdw-update-mutation' +import { FDW } from '@/data/fdw/fdws-query' +import { getDecryptedValues } from '@/data/vault/vault-secret-decrypted-value-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useConfirmOnClose } from '@/hooks/ui/useConfirmOnClose' +import { UUID_REGEX } from '@/lib/constants' export interface EditWrapperSheetProps { wrapper: FDW diff --git a/apps/studio/components/interfaces/Integrations/Wrappers/InputField.tsx b/apps/studio/components/interfaces/Integrations/Wrappers/InputField.tsx index 213aaccd1d..b124fb097d 100644 --- a/apps/studio/components/interfaces/Integrations/Wrappers/InputField.tsx +++ b/apps/studio/components/interfaces/Integrations/Wrappers/InputField.tsx @@ -1,8 +1,8 @@ +import { Eye, EyeOff, HelpCircle, Loader } from 'lucide-react' import Link from 'next/link' import { useState } from 'react' import { Button, Input } from 'ui' -import { Eye, EyeOff, HelpCircle, Loader } from 'lucide-react' import type { ServerOption } from './Wrappers.types' interface InputFieldProps { diff --git a/apps/studio/components/interfaces/Integrations/Wrappers/OverviewTab.tsx b/apps/studio/components/interfaces/Integrations/Wrappers/OverviewTab.tsx index 9e875c3c58..5a12573d13 100644 --- a/apps/studio/components/interfaces/Integrations/Wrappers/OverviewTab.tsx +++ b/apps/studio/components/interfaces/Integrations/Wrappers/OverviewTab.tsx @@ -1,17 +1,10 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useFlag, useParams } from 'common' -import { ScaffoldContainer, ScaffoldSection } from 'components/layouts/Scaffold' -import { DiscardChangesConfirmationDialog } from 'components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useDatabaseExtensionsQuery } from 'data/database-extensions/database-extensions-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useConfirmOnClose } from 'hooks/ui/useConfirmOnClose' import Link from 'next/link' -import { Admonition } from 'node_modules/ui-patterns' import { parseAsBoolean, useQueryState } from 'nuqs' import { useState } from 'react' import { Button, Sheet, SheetContent } from 'ui' +import { Admonition } from 'ui-patterns/admonition' import { IntegrationOverviewTab } from '../Integration/IntegrationOverviewTab' import { IntegrationOverviewTabV2 } from '../Integration/IntegrationOverviewTabV2' @@ -20,6 +13,13 @@ import { CreateIcebergWrapperSheet } from './CreateIcebergWrapperSheet' import { CreateWrapperSheet } from './CreateWrapperSheet' import { WRAPPERS } from './Wrappers.constants' import { WrapperTable } from './WrapperTable' +import { ScaffoldContainer, ScaffoldSection } from '@/components/layouts/Scaffold' +import { DiscardChangesConfirmationDialog } from '@/components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useDatabaseExtensionsQuery } from '@/data/database-extensions/database-extensions-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useConfirmOnClose } from '@/hooks/ui/useConfirmOnClose' const WrapperOverviewContent = () => { const { id } = useParams() diff --git a/apps/studio/components/interfaces/Integrations/Wrappers/WrapperDynamicColumns.tsx b/apps/studio/components/interfaces/Integrations/Wrappers/WrapperDynamicColumns.tsx index 001e453513..a3c6868bd8 100644 --- a/apps/studio/components/interfaces/Integrations/Wrappers/WrapperDynamicColumns.tsx +++ b/apps/studio/components/interfaces/Integrations/Wrappers/WrapperDynamicColumns.tsx @@ -1,9 +1,10 @@ -import ColumnType from 'components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnType' -import useLatest from 'hooks/misc/useLatest' import { X } from 'lucide-react' import { useEffect, useReducer } from 'react' import { Button, Input } from 'ui' +import ColumnType from '@/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnType' +import useLatest from '@/hooks/misc/useLatest' + export type SimpleColumn = { id: number name: string diff --git a/apps/studio/components/interfaces/Integrations/Wrappers/WrapperRow.tsx b/apps/studio/components/interfaces/Integrations/Wrappers/WrapperRow.tsx index 3373c86316..12b1045296 100644 --- a/apps/studio/components/interfaces/Integrations/Wrappers/WrapperRow.tsx +++ b/apps/studio/components/interfaces/Integrations/Wrappers/WrapperRow.tsx @@ -1,8 +1,5 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import type { FDW } from 'data/fdw/fdws-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { partition } from 'lodash' import { ChevronRight, Edit, ExternalLink, Table2, Trash } from 'lucide-react' import Link from 'next/link' @@ -11,6 +8,9 @@ import { Badge, TableCell, TableRow, Tooltip, TooltipContent, TooltipTrigger } f import { INTEGRATIONS } from '../Landing/Integrations.constants' import { convertKVStringArrayToJson, formatWrapperTables } from './Wrappers.utils' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import type { FDW } from '@/data/fdw/fdws-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' interface WrapperRowProps { wrapper: FDW diff --git a/apps/studio/components/interfaces/Integrations/Wrappers/WrapperTable.tsx b/apps/studio/components/interfaces/Integrations/Wrappers/WrapperTable.tsx index 9df814cca9..13d0cb5774 100644 --- a/apps/studio/components/interfaces/Integrations/Wrappers/WrapperTable.tsx +++ b/apps/studio/components/interfaces/Integrations/Wrappers/WrapperTable.tsx @@ -1,6 +1,4 @@ import { useParams } from 'common' -import { useFDWsQuery } from 'data/fdw/fdws-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { parseAsString, useQueryState } from 'nuqs' import { useEffect, useMemo, useState } from 'react' import { toast } from 'sonner' @@ -23,6 +21,8 @@ import { DeleteWrapperModal } from './DeleteWrapperModal' import { EditWrapperSheet } from './EditWrapperSheet' import { WrapperRow } from './WrapperRow' import { wrapperMetaComparator } from './Wrappers.utils' +import { useFDWsQuery } from '@/data/fdw/fdws-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface WrapperTableProps { isLatest?: boolean diff --git a/apps/studio/components/interfaces/Integrations/Wrappers/WrapperTableEditor.tsx b/apps/studio/components/interfaces/Integrations/Wrappers/WrapperTableEditor.tsx index 95ac87a2d1..d58521f31e 100644 --- a/apps/studio/components/interfaces/Integrations/Wrappers/WrapperTableEditor.tsx +++ b/apps/studio/components/interfaces/Integrations/Wrappers/WrapperTableEditor.tsx @@ -1,6 +1,3 @@ -import { ActionBar } from 'components/interfaces/TableGridEditor/SidePanelEditor/ActionBar' -import { useSchemasQuery } from 'data/database/schemas-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Check, ChevronsUpDown, Database, Plus } from 'lucide-react' import { useEffect, useId, useState } from 'react' import { @@ -28,6 +25,9 @@ import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import WrapperDynamicColumns from './WrapperDynamicColumns' import type { Table, TableOption } from './Wrappers.types' import { makeValidateRequired } from './Wrappers.utils' +import { ActionBar } from '@/components/interfaces/TableGridEditor/SidePanelEditor/ActionBar' +import { useSchemasQuery } from '@/data/database/schemas-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export type WrapperTableEditorProps = { visible: boolean diff --git a/apps/studio/components/interfaces/Integrations/Wrappers/Wrappers.constants.ts b/apps/studio/components/interfaces/Integrations/Wrappers/Wrappers.constants.ts index 62f32e21f7..f81cea188a 100644 --- a/apps/studio/components/interfaces/Integrations/Wrappers/Wrappers.constants.ts +++ b/apps/studio/components/interfaces/Integrations/Wrappers/Wrappers.constants.ts @@ -1,5 +1,5 @@ -import { BASE_PATH, DOCS_URL } from 'lib/constants' import type { ServerOption, WrapperMeta } from './Wrappers.types' +import { BASE_PATH, DOCS_URL } from '@/lib/constants' export const WRAPPER_HANDLERS = { STRIPE: 'stripe_fdw_handler', diff --git a/apps/studio/components/interfaces/Integrations/Wrappers/Wrappers.utils.ts b/apps/studio/components/interfaces/Integrations/Wrappers/Wrappers.utils.ts index cddc265b16..bda3c616e5 100644 --- a/apps/studio/components/interfaces/Integrations/Wrappers/Wrappers.utils.ts +++ b/apps/studio/components/interfaces/Integrations/Wrappers/Wrappers.utils.ts @@ -1,6 +1,6 @@ -import { FDW, FDWTable } from 'data/fdw/fdws-query' -import { WRAPPERS, WRAPPER_HANDLERS } from './Wrappers.constants' +import { WRAPPER_HANDLERS, WRAPPERS } from './Wrappers.constants' import type { WrapperMeta } from './Wrappers.types' +import { FDW, FDWTable } from '@/data/fdw/fdws-query' export const makeValidateRequired = (options: { name: string; required: boolean }[]) => { const requiredOptionsSet = new Set( diff --git a/apps/studio/components/interfaces/Integrations/Wrappers/WrappersTab.tsx b/apps/studio/components/interfaces/Integrations/Wrappers/WrappersTab.tsx index 2db4fa85d3..2c2de5dd6e 100644 --- a/apps/studio/components/interfaces/Integrations/Wrappers/WrappersTab.tsx +++ b/apps/studio/components/interfaces/Integrations/Wrappers/WrappersTab.tsx @@ -1,18 +1,18 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useFDWsQuery } from 'data/fdw/fdws-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useConfirmOnClose } from 'hooks/ui/useConfirmOnClose' import { HTMLProps, ReactNode, useCallback, useState } from 'react' import { Sheet, SheetContent } from 'ui' -import { DiscardChangesConfirmationDialog } from 'components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' import { CreateWrapperSheet } from './CreateWrapperSheet' import { WRAPPERS } from './Wrappers.constants' import { wrapperMetaComparator } from './Wrappers.utils' import { WrapperTable } from './WrapperTable' +import { DiscardChangesConfirmationDialog } from '@/components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useFDWsQuery } from '@/data/fdw/fdws-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useConfirmOnClose } from '@/hooks/ui/useConfirmOnClose' export const WrappersTab = () => { const { id } = useParams() diff --git a/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/InstallationOverview.tsx b/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/InstallationOverview.tsx index fbcd7c929b..22d5e73d67 100644 --- a/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/InstallationOverview.tsx +++ b/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/InstallationOverview.tsx @@ -1,12 +1,5 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useStripeSyncInstallMutation } from 'data/database-integrations/stripe/stripe-sync-install-mutation' -import { useStripeSyncUninstallMutation } from 'data/database-integrations/stripe/stripe-sync-uninstall-mutation' -import { useSchemasQuery } from 'data/database/schemas-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useTrack } from 'lib/telemetry/track' import { ExternalLink } from 'lucide-react' import Link from 'next/link' import { useCallback, useEffect, useRef, useState } from 'react' @@ -45,6 +38,13 @@ import { } from './stripe-sync-status' import { StripeSyncChangesCard } from './StripeSyncChangesCard' import { useStripeSyncStatus } from '@/components/interfaces/Integrations/templates/StripeSyncEngine/useStripeSyncStatus' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useStripeSyncInstallMutation } from '@/data/database-integrations/stripe/stripe-sync-install-mutation' +import { useStripeSyncUninstallMutation } from '@/data/database-integrations/stripe/stripe-sync-uninstall-mutation' +import { useSchemasQuery } from '@/data/database/schemas-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useTrack } from '@/lib/telemetry/track' const installFormSchema = z.object({ stripeSecretKey: z.string().min(1, 'Stripe API key is required'), diff --git a/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/StripeSyncSettingsPage.tsx b/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/StripeSyncSettingsPage.tsx index 5114ef2c1a..3167c5c401 100644 --- a/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/StripeSyncSettingsPage.tsx +++ b/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/StripeSyncSettingsPage.tsx @@ -1,5 +1,4 @@ import { formatRelative } from 'date-fns' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { BadgeCheck, RefreshCwIcon } from 'lucide-react' import Link from 'next/link' import { Button, Card, CardContent, CardHeader, CardTitle } from 'ui' @@ -16,6 +15,7 @@ import { import { isInstalled, isSyncRunning, isUninstalling } from './stripe-sync-status' import { useStripeSyncStatus } from '@/components/interfaces/Integrations/templates/StripeSyncEngine/useStripeSyncStatus' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export const StripeSyncSettingsPage = () => { const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/stripe-sync-status.ts b/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/stripe-sync-status.ts index 314d2f5cbd..dc5c8c3eb1 100644 --- a/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/stripe-sync-status.ts +++ b/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/stripe-sync-status.ts @@ -1,9 +1,10 @@ +import { SchemaInstallationStatus, StripeSchemaComment } from 'stripe-experiment-sync/supabase' + import type { StripeSyncState, StripeSyncStateData, -} from 'data/database-integrations/stripe/sync-state-query' -import type { Schema } from 'data/database/schemas-query' -import { SchemaInstallationStatus, StripeSchemaComment } from 'stripe-experiment-sync/supabase' +} from '@/data/database-integrations/stripe/sync-state-query' +import type { Schema } from '@/data/database/schemas-query' /** * Complete Stripe Sync status including schema, installation state, and sync state diff --git a/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/useStripeSyncStatus.ts b/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/useStripeSyncStatus.ts index e366e1167a..31e13afdd1 100644 --- a/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/useStripeSyncStatus.ts +++ b/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/useStripeSyncStatus.ts @@ -1,5 +1,3 @@ -import { useStripeSyncingState } from 'data/database-integrations/stripe/sync-state-query' -import { SchemasVariables, useSchemasQuery } from 'data/database/schemas-query' import { useEffect } from 'react' import { checkDomainOfScale } from 'recharts/types/util/ChartUtils' import { getCurrentVersion, parseSchemaComment } from 'stripe-experiment-sync/supabase' @@ -10,6 +8,8 @@ import { isInstalled, type StripeSyncStatusResult, } from '@/components/interfaces/Integrations/templates/StripeSyncEngine/stripe-sync-status' +import { useStripeSyncingState } from '@/data/database-integrations/stripe/sync-state-query' +import { SchemasVariables, useSchemasQuery } from '@/data/database/schemas-query' // Maximum time allowed for installation or uninstallation operations before the UI times out const OPERATION_TIME_OUT_MS: number = 5 * 60 * 1000 // 5 minutes diff --git a/apps/studio/components/interfaces/JwtSecrets/algorithm-hover-card.tsx b/apps/studio/components/interfaces/JwtSecrets/algorithm-hover-card.tsx index 0a2d40f6a1..9484f4dfd4 100644 --- a/apps/studio/components/interfaces/JwtSecrets/algorithm-hover-card.tsx +++ b/apps/studio/components/interfaces/JwtSecrets/algorithm-hover-card.tsx @@ -1,6 +1,6 @@ import { ExternalLink, HelpCircle, LockKeyholeOpen, RectangleEllipsis } from 'lucide-react' - import { HoverCard, HoverCardContent, HoverCardTrigger } from 'ui' + import { AlgorithmDetail, algorithmDetails } from './algorithm-details' interface AlgorithmHoverCardProps { diff --git a/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/create-key-dialog.tsx b/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/create-key-dialog.tsx index a0e8f5194a..2095b70c7d 100644 --- a/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/create-key-dialog.tsx +++ b/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/create-key-dialog.tsx @@ -1,10 +1,6 @@ import dayjs from 'dayjs' import { useMemo, useState } from 'react' import { toast } from 'sonner' - -import { useJWTSigningKeyCreateMutation } from 'data/jwt-signing-keys/jwt-signing-key-create-mutation' -import { JWTAlgorithm } from 'data/jwt-signing-keys/jwt-signing-keys-query' -import { stringToBase64URL } from 'lib/base64url' import { Badge, Button, @@ -15,14 +11,18 @@ import { DialogSectionSeparator, DialogTitle, Label_Shadcn_, + Select_Shadcn_, SelectContent_Shadcn_, SelectItem_Shadcn_, SelectTrigger_Shadcn_, SelectValue_Shadcn_, - Select_Shadcn_, Textarea, } from 'ui' +import { useJWTSigningKeyCreateMutation } from '@/data/jwt-signing-keys/jwt-signing-key-create-mutation' +import { JWTAlgorithm } from '@/data/jwt-signing-keys/jwt-signing-keys-query' +import { stringToBase64URL } from '@/lib/base64url' + const RSA_JWK_REQUIRED_PROPERTIES = ['kty', 'n', 'e', 'p', 'q', 'd', 'dq', 'dp', 'qi'] const EC_JWK_REQUIRED_PROPERTIES = ['kty', 'crv', 'x', 'y', 'd'] diff --git a/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/index.tsx b/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/index.tsx index dc881ea3bb..df4281df9c 100644 --- a/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/index.tsx +++ b/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/index.tsx @@ -1,15 +1,6 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { TextConfirmModal } from 'components/ui/TextConfirmModalWrapper' -import { useLegacyAPIKeysStatusQuery } from 'data/api-keys/legacy-api-keys-status-query' -import { useJWTSigningKeyDeleteMutation } from 'data/jwt-signing-keys/jwt-signing-key-delete-mutation' -import { useJWTSigningKeyUpdateMutation } from 'data/jwt-signing-keys/jwt-signing-key-update-mutation' -import { JWTSigningKey, useJWTSigningKeysQuery } from 'data/jwt-signing-keys/jwt-signing-keys-query' -import { useLegacyJWTSigningKeyCreateMutation } from 'data/jwt-signing-keys/legacy-jwt-signing-key-create-mutation' -import { useLegacyJWTSigningKeyQuery } from 'data/jwt-signing-keys/legacy-jwt-signing-key-query' import { AnimatePresence } from 'framer-motion' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { AlertCircle, RotateCw, Timer } from 'lucide-react' import { useMemo, useState } from 'react' import { toast } from 'sonner' @@ -45,6 +36,18 @@ import { CreateKeyDialog } from './create-key-dialog' import { KeyDetailsDialog } from './key-details-dialog' import { RotateKeyDialog } from './rotate-key-dialog' import { SigningKeyRow } from './signing-key-row' +import { TextConfirmModal } from '@/components/ui/TextConfirmModalWrapper' +import { useLegacyAPIKeysStatusQuery } from '@/data/api-keys/legacy-api-keys-status-query' +import { useJWTSigningKeyDeleteMutation } from '@/data/jwt-signing-keys/jwt-signing-key-delete-mutation' +import { useJWTSigningKeyUpdateMutation } from '@/data/jwt-signing-keys/jwt-signing-key-update-mutation' +import { + JWTSigningKey, + useJWTSigningKeysQuery, +} from '@/data/jwt-signing-keys/jwt-signing-keys-query' +import { useLegacyJWTSigningKeyCreateMutation } from '@/data/jwt-signing-keys/legacy-jwt-signing-key-create-mutation' +import { useLegacyJWTSigningKeyQuery } from '@/data/jwt-signing-keys/legacy-jwt-signing-key-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' type DialogType = 'legacy' | 'create' | 'rotate' | 'key-details' | 'revoke' | 'delete' diff --git a/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/key-details-dialog.tsx b/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/key-details-dialog.tsx index 3f99b86acc..3e6b9dcb71 100644 --- a/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/key-details-dialog.tsx +++ b/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/key-details-dialog.tsx @@ -1,7 +1,5 @@ import { FileKey } from 'lucide-react' import { useMemo } from 'react' - -import { JWTSigningKey } from 'data/jwt-signing-keys/jwt-signing-keys-query' import { Button, DialogFooter, @@ -14,6 +12,8 @@ import { Textarea, } from 'ui' +import { JWTSigningKey } from '@/data/jwt-signing-keys/jwt-signing-keys-query' + export function KeyDetailsDialog({ selectedKey, restURL, diff --git a/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/rotate-key-dialog.tsx b/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/rotate-key-dialog.tsx index ef202dcbe3..e683522936 100644 --- a/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/rotate-key-dialog.tsx +++ b/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/rotate-key-dialog.tsx @@ -1,7 +1,3 @@ -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useEdgeFunctionsQuery } from 'data/edge-functions/edge-functions-query' -import { useJWTSigningKeyUpdateMutation } from 'data/jwt-signing-keys/jwt-signing-key-update-mutation' -import { JWTSigningKey } from 'data/jwt-signing-keys/jwt-signing-keys-query' import { ArrowRight, ExternalLink, Info, Key, Timer } from 'lucide-react' import { useState } from 'react' import { toast } from 'sonner' @@ -22,6 +18,10 @@ import { import { algorithmLabels } from '../algorithm-details' import { statusColors } from '../jwt.constants' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useEdgeFunctionsQuery } from '@/data/edge-functions/edge-functions-query' +import { useJWTSigningKeyUpdateMutation } from '@/data/jwt-signing-keys/jwt-signing-key-update-mutation' +import { JWTSigningKey } from '@/data/jwt-signing-keys/jwt-signing-keys-query' export function RotateKeyDialog({ projectRef, diff --git a/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/signing-key-row.tsx b/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/signing-key-row.tsx index 838a20af78..fcfcd642ed 100644 --- a/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/signing-key-row.tsx +++ b/apps/studio/components/interfaces/JwtSecrets/jwt-secret-keys-table/signing-key-row.tsx @@ -1,3 +1,5 @@ +import { components } from 'api-types' +import dayjs from 'dayjs' import { motion } from 'framer-motion' import { CircleArrowDown, @@ -9,11 +11,6 @@ import { Timer, Trash2, } from 'lucide-react' - -import { components } from 'api-types' -import { DropdownMenuItemTooltip } from 'components/ui/DropdownMenuItemTooltip' -import { JWTSigningKey } from 'data/jwt-signing-keys/jwt-signing-keys-query' -import dayjs from 'dayjs' import { Badge, Button, @@ -26,8 +23,11 @@ import { TableRow, } from 'ui' import { TimestampInfo } from 'ui-patterns' + import { AlgorithmHoverCard } from '../algorithm-hover-card' import { statusColors, statusLabels } from '../jwt.constants' +import { DropdownMenuItemTooltip } from '@/components/ui/DropdownMenuItemTooltip' +import { JWTSigningKey } from '@/data/jwt-signing-keys/jwt-signing-keys-query' interface SigningKeyRowProps { signingKey: components['schemas']['SigningKeyResponse'] diff --git a/apps/studio/components/interfaces/JwtSecrets/jwt-settings.tsx b/apps/studio/components/interfaces/JwtSecrets/jwt-settings.tsx index 56a5d66fad..d6b4d6d5b6 100644 --- a/apps/studio/components/interfaces/JwtSecrets/jwt-settings.tsx +++ b/apps/studio/components/interfaces/JwtSecrets/jwt-settings.tsx @@ -5,19 +5,6 @@ import { JwtSecretUpdateStatus, } from '@supabase/shared-types/out/events' import { useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { FormActions } from 'components/ui/Forms/FormActions' -import Panel from 'components/ui/Panel' -import { TextConfirmModal } from 'components/ui/TextConfirmModalWrapper' -import { useLegacyAPIKeysStatusQuery } from 'data/api-keys/legacy-api-keys-status-query' -import { useAuthConfigQuery } from 'data/auth/auth-config-query' -import { useAuthConfigUpdateMutation } from 'data/auth/auth-config-update-mutation' -import { useJwtSecretUpdateMutation } from 'data/config/jwt-secret-update-mutation' -import { useJwtSecretUpdatingStatusQuery } from 'data/config/jwt-secret-updating-status-query' -import { useProjectPostgrestConfigQuery } from 'data/config/project-postgrest-config-query' -import { useLegacyJWTSigningKeyQuery } from 'data/jwt-signing-keys/legacy-jwt-signing-key-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { uuidv4 } from 'lib/helpers' import { AlertCircle, ChevronDown, @@ -56,6 +43,19 @@ import { JWT_SECRET_UPDATE_ERROR_MESSAGES, JWT_SECRET_UPDATE_PROGRESS_MESSAGES, } from './jwt.constants' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { FormActions } from '@/components/ui/Forms/FormActions' +import Panel from '@/components/ui/Panel' +import { TextConfirmModal } from '@/components/ui/TextConfirmModalWrapper' +import { useLegacyAPIKeysStatusQuery } from '@/data/api-keys/legacy-api-keys-status-query' +import { useAuthConfigQuery } from '@/data/auth/auth-config-query' +import { useAuthConfigUpdateMutation } from '@/data/auth/auth-config-update-mutation' +import { useJwtSecretUpdateMutation } from '@/data/config/jwt-secret-update-mutation' +import { useJwtSecretUpdatingStatusQuery } from '@/data/config/jwt-secret-updating-status-query' +import { useProjectPostgrestConfigQuery } from '@/data/config/project-postgrest-config-query' +import { useLegacyJWTSigningKeyQuery } from '@/data/jwt-signing-keys/legacy-jwt-signing-key-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { uuidv4 } from '@/lib/helpers' const schema = object({ JWT_EXP: number() diff --git a/apps/studio/components/interfaces/JwtSecrets/jwt.constants.ts b/apps/studio/components/interfaces/JwtSecrets/jwt.constants.ts index 6350949b14..6b4b54a809 100644 --- a/apps/studio/components/interfaces/JwtSecrets/jwt.constants.ts +++ b/apps/studio/components/interfaces/JwtSecrets/jwt.constants.ts @@ -1,5 +1,6 @@ import { JwtSecretUpdateError, JwtSecretUpdateProgress } from '@supabase/shared-types/out/events' -import { JWTSigningKey } from 'data/jwt-signing-keys/jwt-signing-keys-query' + +import { JWTSigningKey } from '@/data/jwt-signing-keys/jwt-signing-keys-query' export const statusLabels: Record = { in_use: 'Current key', diff --git a/apps/studio/components/interfaces/JwtSecrets/start-using-keys-banner.tsx b/apps/studio/components/interfaces/JwtSecrets/start-using-keys-banner.tsx index d0460153ee..24dac8296c 100644 --- a/apps/studio/components/interfaces/JwtSecrets/start-using-keys-banner.tsx +++ b/apps/studio/components/interfaces/JwtSecrets/start-using-keys-banner.tsx @@ -1,7 +1,8 @@ -import { FeatureBanner } from 'components/ui/FeatureBanner' import { Import } from 'lucide-react' import { Button } from 'ui' +import { FeatureBanner } from '@/components/ui/FeatureBanner' + export const StartUsingJwtSigningKeysBanner = ({ onClick, isLoading, diff --git a/apps/studio/components/interfaces/Linter/LintDetail.tsx b/apps/studio/components/interfaces/Linter/LintDetail.tsx index b2c3981077..7b11bdcb94 100644 --- a/apps/studio/components/interfaces/Linter/LintDetail.tsx +++ b/apps/studio/components/interfaces/Linter/LintDetail.tsx @@ -1,17 +1,17 @@ -import { createLintSummaryPrompt, lintInfoMap } from 'components/interfaces/Linter/Linter.utils' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { AiAssistantDropdown } from 'components/ui/AiAssistantDropdown' -import { Lint } from 'data/lint/lint-query' -import { DOCS_URL } from 'lib/constants' -import { useTrack } from 'lib/telemetry/track' import { ExternalLink } from 'lucide-react' import Link from 'next/link' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { Button } from 'ui' import { Markdown } from '../Markdown' import { EntityTypeIcon, LintCTA, LintEntity } from './Linter.utils' +import { createLintSummaryPrompt, lintInfoMap } from '@/components/interfaces/Linter/Linter.utils' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { AiAssistantDropdown } from '@/components/ui/AiAssistantDropdown' +import { Lint } from '@/data/lint/lint-query' +import { DOCS_URL } from '@/lib/constants' +import { useTrack } from '@/lib/telemetry/track' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' interface LintDetailProps { lint: Lint diff --git a/apps/studio/components/interfaces/Linter/LintPageTabs.tsx b/apps/studio/components/interfaces/Linter/LintPageTabs.tsx index 7a3b27d39e..1438613b1c 100644 --- a/apps/studio/components/interfaces/Linter/LintPageTabs.tsx +++ b/apps/studio/components/interfaces/Linter/LintPageTabs.tsx @@ -1,22 +1,20 @@ -import { MessageSquareMore } from 'lucide-react' - import { InformationCircleIcon } from '@heroicons/react/16/solid' - +import { MessageSquareMore } from 'lucide-react' +import { useRouter } from 'next/router' import { + cn, + Tabs_Shadcn_, TabsList_Shadcn_, TabsTrigger_Shadcn_, - Tabs_Shadcn_, Tooltip, TooltipContent, TooltipTrigger, - cn, } from 'ui' - -import { LINTER_LEVELS, LINT_TABS } from 'components/interfaces/Linter/Linter.constants' -import { Lint } from 'data/lint/lint-query' -import { useRouter } from 'next/router' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' +import { LINT_TABS, LINTER_LEVELS } from '@/components/interfaces/Linter/Linter.constants' +import { Lint } from '@/data/lint/lint-query' + interface LintPageTabsProps { currentTab: string setCurrentTab: (value: LINTER_LEVELS) => void diff --git a/apps/studio/components/interfaces/Linter/Linter.constants.ts b/apps/studio/components/interfaces/Linter/Linter.constants.ts index eaf8db434f..3ef516b5b4 100644 --- a/apps/studio/components/interfaces/Linter/Linter.constants.ts +++ b/apps/studio/components/interfaces/Linter/Linter.constants.ts @@ -1,4 +1,5 @@ -import { Lint } from 'data/lint/lint-query' +import { Lint } from '@/data/lint/lint-query' + export enum LINTER_LEVELS { ERROR = 'ERROR', WARN = 'WARN', diff --git a/apps/studio/components/interfaces/Linter/LinterDataGrid.tsx b/apps/studio/components/interfaces/Linter/LinterDataGrid.tsx index a69ca95d9a..7cc7c6dfae 100644 --- a/apps/studio/components/interfaces/Linter/LinterDataGrid.tsx +++ b/apps/studio/components/interfaces/Linter/LinterDataGrid.tsx @@ -1,13 +1,4 @@ import { useParams } from 'common' -import { LINTER_LEVELS } from 'components/interfaces/Linter/Linter.constants' -import { - LintCategoryBadge, - LintEntity, - lintInfoMap, - NoIssuesFound, -} from 'components/interfaces/Linter/Linter.utils' -import { Lint } from 'data/lint/lint-query' -import { useTrack } from 'lib/telemetry/track' import { X } from 'lucide-react' import { useRouter } from 'next/router' import { useRef } from 'react' @@ -18,6 +9,15 @@ import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import LintDetail from './LintDetail' import { EntityTypeIcon } from './Linter.utils' +import { LINTER_LEVELS } from '@/components/interfaces/Linter/Linter.constants' +import { + LintCategoryBadge, + LintEntity, + lintInfoMap, + NoIssuesFound, +} from '@/components/interfaces/Linter/Linter.utils' +import { Lint } from '@/data/lint/lint-query' +import { useTrack } from '@/lib/telemetry/track' interface LinterDataGridProps { isLoading: boolean diff --git a/apps/studio/components/interfaces/Linter/LinterFilters.tsx b/apps/studio/components/interfaces/Linter/LinterFilters.tsx index ff93e17067..3e9d39306f 100644 --- a/apps/studio/components/interfaces/Linter/LinterFilters.tsx +++ b/apps/studio/components/interfaces/Linter/LinterFilters.tsx @@ -1,11 +1,12 @@ import { useParams } from 'common' -import { LINTER_LEVELS, LINT_TABS } from 'components/interfaces/Linter/Linter.constants' -import { DownloadResultsButton } from 'components/ui/DownloadResultsButton' -import { FilterPopover } from 'components/ui/FilterPopover' -import { Lint } from 'data/lint/lint-query' import { RefreshCw } from 'lucide-react' import { Button } from 'ui' +import { LINT_TABS, LINTER_LEVELS } from '@/components/interfaces/Linter/Linter.constants' +import { DownloadResultsButton } from '@/components/ui/DownloadResultsButton' +import { FilterPopover } from '@/components/ui/FilterPopover' +import { Lint } from '@/data/lint/lint-query' + interface LinterFiltersProps { filterOptions: { name: string diff --git a/apps/studio/components/interfaces/Linter/LinterPageFooter.tsx b/apps/studio/components/interfaces/Linter/LinterPageFooter.tsx index 6a053c7218..fe7ebc97f1 100644 --- a/apps/studio/components/interfaces/Linter/LinterPageFooter.tsx +++ b/apps/studio/components/interfaces/Linter/LinterPageFooter.tsx @@ -1,9 +1,10 @@ import { LOCAL_STORAGE_KEYS } from 'common' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { DOCS_URL } from 'lib/constants' import { X } from 'lucide-react' import { Button, cn } from 'ui' + import { Markdown } from '../Markdown' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { DOCS_URL } from '@/lib/constants' interface LinterPageFooterProps { isLoading: boolean diff --git a/apps/studio/components/interfaces/LocalDropdown.tsx b/apps/studio/components/interfaces/LocalDropdown.tsx index 774e78c909..c8a0252cbe 100644 --- a/apps/studio/components/interfaces/LocalDropdown.tsx +++ b/apps/studio/components/interfaces/LocalDropdown.tsx @@ -1,4 +1,3 @@ -import { ProfileImage } from 'components/ui/ProfileImage' import { Command, FlaskConical } from 'lucide-react' import { useTheme } from 'next-themes' import { @@ -19,6 +18,7 @@ import { import { useSetCommandMenuOpen } from 'ui-patterns' import { useFeaturePreviewModal } from './App/FeaturePreview/FeaturePreviewContext' +import { ProfileImage } from '@/components/ui/ProfileImage' export const LocalDropdown = ({ triggerClassName, diff --git a/apps/studio/components/interfaces/LogDrains/AnimatedLogos.tsx b/apps/studio/components/interfaces/LogDrains/AnimatedLogos.tsx index de90f41bdc..c02bb82611 100644 --- a/apps/studio/components/interfaces/LogDrains/AnimatedLogos.tsx +++ b/apps/studio/components/interfaces/LogDrains/AnimatedLogos.tsx @@ -1,8 +1,8 @@ -import { useState, useEffect } from 'react' -import { motion, AnimatePresence } from 'framer-motion' -import { cn } from 'ui' +import { AnimatePresence, motion } from 'framer-motion' import { Datadog, Grafana, Sentry } from 'icons' import { BracesIcon } from 'lucide-react' +import { useEffect, useState } from 'react' +import { cn } from 'ui' export const AnimatedLogos = () => { const [currIndex, setCurrIndex] = useState(0) diff --git a/apps/studio/components/interfaces/LogDrains/LogDrainDestinationSheetForm.tsx b/apps/studio/components/interfaces/LogDrains/LogDrainDestinationSheetForm.tsx index acc2d839c8..45c55a858f 100644 --- a/apps/studio/components/interfaces/LogDrains/LogDrainDestinationSheetForm.tsx +++ b/apps/studio/components/interfaces/LogDrains/LogDrainDestinationSheetForm.tsx @@ -1,8 +1,5 @@ import { zodResolver } from '@hookform/resolvers/zod' import { IS_PLATFORM, useFlag, useParams } from 'common' -import { LogDrainData, useLogDrainsQuery } from 'data/log-drains/log-drains-query' -import { DOCS_URL } from 'lib/constants' -import { useTrack } from 'lib/telemetry/track' import { TrashIcon } from 'lucide-react' import Link from 'next/link' import { ReactNode, useEffect, useState } from 'react' @@ -50,6 +47,9 @@ import { getHeadersSectionDescription as getHeadersDescription, validateNewHeader, } from './LogDrains.utils' +import { LogDrainData, useLogDrainsQuery } from '@/data/log-drains/log-drains-query' +import { DOCS_URL } from '@/lib/constants' +import { useTrack } from '@/lib/telemetry/track' import { httpEndpointUrlSchema } from '@/lib/validation/http-url' const FORM_ID = 'log-drain-destination-form' diff --git a/apps/studio/components/interfaces/LogDrains/LogDrains.tsx b/apps/studio/components/interfaces/LogDrains/LogDrains.tsx index a701d50fbe..f65e3981d6 100644 --- a/apps/studio/components/interfaces/LogDrains/LogDrains.tsx +++ b/apps/studio/components/interfaces/LogDrains/LogDrains.tsx @@ -1,9 +1,4 @@ import { IS_PLATFORM, useFlag, useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { useDeleteLogDrainMutation } from 'data/log-drains/delete-log-drain-mutation' -import { LogDrainData, useLogDrainsQuery } from 'data/log-drains/log-drains-query' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useTrack } from 'lib/telemetry/track' import { MoreHorizontal, Pencil, TrashIcon } from 'lucide-react' import { cloneElement, useState } from 'react' import { toast } from 'sonner' @@ -29,6 +24,11 @@ import { LOG_DRAIN_TYPES, LogDrainType } from './LogDrains.constants' import { LogDrainsCard } from './LogDrainsCard' import { LogDrainsEmpty } from './LogDrainsEmpty' import { VoteLink } from './VoteLink' +import AlertError from '@/components/ui/AlertError' +import { useDeleteLogDrainMutation } from '@/data/log-drains/delete-log-drain-mutation' +import { LogDrainData, useLogDrainsQuery } from '@/data/log-drains/log-drains-query' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useTrack } from '@/lib/telemetry/track' export function LogDrains({ onNewDrainClick, diff --git a/apps/studio/components/interfaces/LogDrains/LogDrainsEmpty.tsx b/apps/studio/components/interfaces/LogDrains/LogDrainsEmpty.tsx index 8765914043..01efca2118 100644 --- a/apps/studio/components/interfaces/LogDrains/LogDrainsEmpty.tsx +++ b/apps/studio/components/interfaces/LogDrains/LogDrainsEmpty.tsx @@ -1,11 +1,11 @@ import { IS_PLATFORM } from 'common' -import { UpgradePlanButton } from 'components/ui/UpgradePlanButton' -import { DOCS_URL } from 'lib/constants' import Link from 'next/link' import { Button, Card, cn } from 'ui' import { AnimatedLogos } from './AnimatedLogos' import { VoteLink } from './VoteLink' +import { UpgradePlanButton } from '@/components/ui/UpgradePlanButton' +import { DOCS_URL } from '@/lib/constants' export const LogDrainsEmpty = () => { const items = [ diff --git a/apps/studio/components/interfaces/Markdown.tsx b/apps/studio/components/interfaces/Markdown.tsx index ace6fb57c5..480b432d89 100644 --- a/apps/studio/components/interfaces/Markdown.tsx +++ b/apps/studio/components/interfaces/Markdown.tsx @@ -1,10 +1,10 @@ -import { InlineLink } from 'components/ui/InlineLink' import { PropsWithChildren } from 'react' import { ReactMarkdown, ReactMarkdownOptions } from 'react-markdown/lib/react-markdown' import remarkGfm from 'remark-gfm' - import { cn } from 'ui' +import { InlineLink } from '@/components/ui/InlineLink' + interface MarkdownProps extends Omit { className?: string /** @deprecated Should remove this and just take `children` instead */ diff --git a/apps/studio/components/interfaces/Observability/DatabaseInfrastructureSection.tsx b/apps/studio/components/interfaces/Observability/DatabaseInfrastructureSection.tsx index 64dd8458c6..c5d2e2c9de 100644 --- a/apps/studio/components/interfaces/Observability/DatabaseInfrastructureSection.tsx +++ b/apps/studio/components/interfaces/Observability/DatabaseInfrastructureSection.tsx @@ -1,8 +1,5 @@ import { useParams } from 'common' -import { useInfraMonitoringAttributesQuery } from 'data/analytics/infra-monitoring-query' -import { useMaxConnectionsQuery } from 'data/database/max-connections-query' import dayjs from 'dayjs' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import Link from 'next/link' import { useMemo } from 'react' import { cn } from 'ui' @@ -18,6 +15,9 @@ import { parseConnectionsData, parseInfrastructureMetrics, } from './DatabaseInfrastructureSection.utils' +import { useInfraMonitoringAttributesQuery } from '@/data/analytics/infra-monitoring-query' +import { useMaxConnectionsQuery } from '@/data/database/max-connections-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' type DatabaseInfrastructureSectionProps = { interval: '1hr' | '1day' | '7day' diff --git a/apps/studio/components/interfaces/Observability/DatabaseInfrastructureSection.utils.test.ts b/apps/studio/components/interfaces/Observability/DatabaseInfrastructureSection.utils.test.ts index 021e16face..de1bdbaf81 100644 --- a/apps/studio/components/interfaces/Observability/DatabaseInfrastructureSection.utils.test.ts +++ b/apps/studio/components/interfaces/Observability/DatabaseInfrastructureSection.utils.test.ts @@ -1,7 +1,3 @@ -import type { - InfraMonitoringMultiResponse, - InfraMonitoringSingleResponse, -} from 'data/analytics/infra-monitoring-query' import { describe, expect, it } from 'vitest' import { @@ -9,6 +5,10 @@ import { parseInfrastructureMetrics, parseNumericValue, } from './DatabaseInfrastructureSection.utils' +import type { + InfraMonitoringMultiResponse, + InfraMonitoringSingleResponse, +} from '@/data/analytics/infra-monitoring-query' describe('parseNumericValue', () => { it('returns number value as-is', () => { diff --git a/apps/studio/components/interfaces/Observability/DatabaseInfrastructureSection.utils.ts b/apps/studio/components/interfaces/Observability/DatabaseInfrastructureSection.utils.ts index 2ad0b5e09b..49c420e85b 100644 --- a/apps/studio/components/interfaces/Observability/DatabaseInfrastructureSection.utils.ts +++ b/apps/studio/components/interfaces/Observability/DatabaseInfrastructureSection.utils.ts @@ -1,7 +1,7 @@ import type { InfraMonitoringMultiResponse, InfraMonitoringResponse, -} from 'data/analytics/infra-monitoring-query' +} from '@/data/analytics/infra-monitoring-query' type NumericValue = string | number | undefined diff --git a/apps/studio/components/interfaces/Observability/ObservabilityOverview.tsx b/apps/studio/components/interfaces/Observability/ObservabilityOverview.tsx index c8235010cc..32871b08ff 100644 --- a/apps/studio/components/interfaces/Observability/ObservabilityOverview.tsx +++ b/apps/studio/components/interfaces/Observability/ObservabilityOverview.tsx @@ -1,12 +1,6 @@ import { useQueryClient } from '@tanstack/react-query' import { useParams } from 'common' -import ReportHeader from 'components/interfaces/Reports/ReportHeader' -import ReportPadding from 'components/interfaces/Reports/ReportPadding' -import { ChartIntervalDropdown } from 'components/ui/Logs/ChartIntervalDropdown' -import { CHART_INTERVALS } from 'components/ui/Logs/logs.utils' import dayjs from 'dayjs' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { RefreshCw } from 'lucide-react' import { useRouter } from 'next/router' import { useCallback, useMemo, useState } from 'react' @@ -17,6 +11,12 @@ import { useObservabilityOverviewData } from './ObservabilityOverview.utils' import { ObservabilityOverviewFooter } from './ObservabilityOverviewFooter' import { ServiceHealthTable } from './ServiceHealthTable' import { useSlowQueriesCount } from './useSlowQueriesCount' +import ReportHeader from '@/components/interfaces/Reports/ReportHeader' +import ReportPadding from '@/components/interfaces/Reports/ReportPadding' +import { ChartIntervalDropdown } from '@/components/ui/Logs/ChartIntervalDropdown' +import { CHART_INTERVALS } from '@/components/ui/Logs/logs.utils' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' type ChartIntervalKey = '1hr' | '1day' | '7day' diff --git a/apps/studio/components/interfaces/Observability/ServiceHealthCard.tsx b/apps/studio/components/interfaces/Observability/ServiceHealthCard.tsx index d8e6cd6624..045d2b5686 100644 --- a/apps/studio/components/interfaces/Observability/ServiceHealthCard.tsx +++ b/apps/studio/components/interfaces/Observability/ServiceHealthCard.tsx @@ -1,10 +1,10 @@ -import NoDataPlaceholder from 'components/ui/Charts/NoDataPlaceholder' import Link from 'next/link' import { Button, Card, CardContent, CardFooter, CardHeader, CardTitle, cn, Loading } from 'ui' import { LogsBarChart } from 'ui-patterns/LogsBarChart' import type { LogsBarChartDatum } from '../ProjectHome/ProjectUsage.metrics' import { getHealthStatus, type ServiceKey } from './ObservabilityOverview.utils' +import NoDataPlaceholder from '@/components/ui/Charts/NoDataPlaceholder' const colorClassMap: Record = { muted: 'bg-muted', diff --git a/apps/studio/components/interfaces/Observability/usePostgrestOverviewMetrics.ts b/apps/studio/components/interfaces/Observability/usePostgrestOverviewMetrics.ts index 4c20f915c2..873b60ee3e 100644 --- a/apps/studio/components/interfaces/Observability/usePostgrestOverviewMetrics.ts +++ b/apps/studio/components/interfaces/Observability/usePostgrestOverviewMetrics.ts @@ -1,8 +1,8 @@ import { useQuery } from '@tanstack/react-query' -import { get } from 'data/fetchers' import type { LogsBarChartDatum } from '../ProjectHome/ProjectUsage.metrics' import { generateRegexpWhere } from '../Reports/Reports.constants' +import { get } from '@/data/fetchers' type PostgrestMetricsVariables = { projectRef: string diff --git a/apps/studio/components/interfaces/Observability/useServiceHealthMetrics.ts b/apps/studio/components/interfaces/Observability/useServiceHealthMetrics.ts index 73cb8c5f71..37591ac7b3 100644 --- a/apps/studio/components/interfaces/Observability/useServiceHealthMetrics.ts +++ b/apps/studio/components/interfaces/Observability/useServiceHealthMetrics.ts @@ -1,7 +1,4 @@ import { useQuery } from '@tanstack/react-query' -import { get } from 'data/fetchers' -import { useFillTimeseriesSorted } from 'hooks/analytics/useFillTimeseriesSorted' -import useTimeseriesUnixToIso from 'hooks/analytics/useTimeseriesUnixToIso' import { useMemo } from 'react' import type { LogsBarChartDatum } from '../ProjectHome/ProjectUsage.metrics' @@ -14,6 +11,9 @@ import { transformToBarChartData, type RawChartData, } from './useServiceHealthMetrics.utils' +import { get } from '@/data/fetchers' +import { useFillTimeseriesSorted } from '@/hooks/analytics/useFillTimeseriesSorted' +import useTimeseriesUnixToIso from '@/hooks/analytics/useTimeseriesUnixToIso' export type ServiceKey = 'db' | 'functions' | 'auth' | 'storage' | 'realtime' | 'postgrest' diff --git a/apps/studio/components/interfaces/Observability/useSlowQueriesCount.ts b/apps/studio/components/interfaces/Observability/useSlowQueriesCount.ts index 5e6f872ace..b7944f87a1 100644 --- a/apps/studio/components/interfaces/Observability/useSlowQueriesCount.ts +++ b/apps/studio/components/interfaces/Observability/useSlowQueriesCount.ts @@ -1,6 +1,7 @@ -import useDbQuery from 'hooks/analytics/useDbQuery' import { useMemo } from 'react' +import useDbQuery from '@/hooks/analytics/useDbQuery' + export function buildSlowQueriesCountSql(): string { return ` -- observability-slow-queries-count diff --git a/apps/studio/components/interfaces/Organization/AuditLogs/AuditLogs.tsx b/apps/studio/components/interfaces/Organization/AuditLogs/AuditLogs.tsx index ff36e39e6b..6ea8cd9646 100644 --- a/apps/studio/components/interfaces/Organization/AuditLogs/AuditLogs.tsx +++ b/apps/studio/components/interfaces/Organization/AuditLogs/AuditLogs.tsx @@ -6,35 +6,35 @@ import dayjs from 'dayjs' import { ArrowDown, ArrowUp, RefreshCw, User } from 'lucide-react' import Image from 'next/legacy/image' import { useEffect, useMemo, useState } from 'react' - -import { LogDetailsPanel } from 'components/interfaces/AuditLogs/LogDetailsPanel' -import { LogsDatePicker } from 'components/interfaces/Settings/Logs/Logs.DatePickers' -import { ScaffoldContainer, ScaffoldSection } from 'components/layouts/Scaffold' -import Table from 'components/to-be-cleaned/Table' -import AlertError from 'components/ui/AlertError' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { FilterPopover } from 'components/ui/FilterPopover' -import NoPermission from 'components/ui/NoPermission' -import { UpgradeToPro } from 'components/ui/UpgradeToPro' -import { useOrganizationRolesV2Query } from 'data/organization-members/organization-roles-query' -import { - AuditLog, - useOrganizationAuditLogsQuery, -} from 'data/organizations/organization-audit-logs-query' -import { useOrganizationMembersQuery } from 'data/organizations/organization-members-query' -import { useOrganizationsQuery } from 'data/organizations/organizations-query' -import { useOrgProjectsInfiniteQuery } from 'data/projects/org-projects-infinite-query' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { + Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, - Alert_Shadcn_, Button, WarningIcon, } from 'ui' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' +import { LogDetailsPanel } from '@/components/interfaces/AuditLogs/LogDetailsPanel' +import { LogsDatePicker } from '@/components/interfaces/Settings/Logs/Logs.DatePickers' +import { ScaffoldContainer, ScaffoldSection } from '@/components/layouts/Scaffold' +import Table from '@/components/to-be-cleaned/Table' +import AlertError from '@/components/ui/AlertError' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { FilterPopover } from '@/components/ui/FilterPopover' +import NoPermission from '@/components/ui/NoPermission' +import { UpgradeToPro } from '@/components/ui/UpgradeToPro' +import { useOrganizationRolesV2Query } from '@/data/organization-members/organization-roles-query' +import { + AuditLog, + useOrganizationAuditLogsQuery, +} from '@/data/organizations/organization-audit-logs-query' +import { useOrganizationMembersQuery } from '@/data/organizations/organization-members-query' +import { useOrganizationsQuery } from '@/data/organizations/organizations-query' +import { useOrgProjectsInfiniteQuery } from '@/data/projects/org-projects-infinite-query' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' + const logsUpgradeError = 'upgrade to Team or Enterprise Plan to access audit logs.' // [Joshen considerations] diff --git a/apps/studio/components/interfaces/Organization/AuditLogs/AuditLogs.utils.ts b/apps/studio/components/interfaces/Organization/AuditLogs/AuditLogs.utils.ts index c5429c8e6c..d3f14bc001 100644 --- a/apps/studio/components/interfaces/Organization/AuditLogs/AuditLogs.utils.ts +++ b/apps/studio/components/interfaces/Organization/AuditLogs/AuditLogs.utils.ts @@ -1,6 +1,7 @@ -import { DatePickerToFrom } from 'components/interfaces/Settings/Logs/Logs.types' import dayjs from 'dayjs' +import { DatePickerToFrom } from '@/components/interfaces/Settings/Logs/Logs.types' + // [Joshen] Mainly to handle if a single date is selected - currently just for Audit Logs as // i'm on the fence if this logic should be within the DatePicker component itself // e.g for Logs.DatePicker which uses this component, the component itself has its own time selection UI diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/BillingBreakdown.constants.ts b/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/BillingBreakdown.constants.ts index d198c0763c..bbb619b85d 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/BillingBreakdown.constants.ts +++ b/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/BillingBreakdown.constants.ts @@ -1,5 +1,5 @@ -import { PricingMetric } from 'data/analytics/org-daily-stats-query' -import { DOCS_URL } from 'lib/constants' +import { PricingMetric } from '@/data/analytics/org-daily-stats-query' +import { DOCS_URL } from '@/lib/constants' export const USAGE_APPROACHING_THRESHOLD = 0.8 diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/BillingBreakdown.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/BillingBreakdown.tsx index 3755da11b6..c27578b04d 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/BillingBreakdown.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/BillingBreakdown.tsx @@ -1,23 +1,23 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' +import dayjs from 'dayjs' +import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' + +import { UpcomingInvoice } from './UpcomingInvoice' import { ScaffoldSection, ScaffoldSectionContent, ScaffoldSectionDetail, -} from 'components/layouts/Scaffold' -import AlertError from 'components/ui/AlertError' -import NoPermission from 'components/ui/NoPermission' -import SparkBar from 'components/ui/SparkBar' -import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' -import dayjs from 'dayjs' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { MANAGED_BY } from 'lib/constants/infrastructure' -import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' - -import { UpcomingInvoice } from './UpcomingInvoice' +} from '@/components/layouts/Scaffold' +import AlertError from '@/components/ui/AlertError' import { InlineLink } from '@/components/ui/InlineLink' +import NoPermission from '@/components/ui/NoPermission' +import SparkBar from '@/components/ui/SparkBar' +import { useOrgSubscriptionQuery } from '@/data/subscriptions/org-subscription-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { MANAGED_BY } from '@/lib/constants/infrastructure' const BillingBreakdown = () => { const { slug: orgSlug } = useParams() diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/BillingMetric.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/BillingMetric.tsx index a3f75daa43..d031991c8d 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/BillingMetric.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/BillingMetric.tsx @@ -1,15 +1,15 @@ -import Link from 'next/link' - -import { UpgradePlanButton } from 'components/ui/UpgradePlanButton' -import { PricingMetric } from 'data/analytics/org-daily-stats-query' -import type { OrgSubscription } from 'data/subscriptions/types' -import type { OrgUsageResponse } from 'data/usage/org-usage-query' -import { formatCurrency } from 'lib/helpers' import { ChevronRight } from 'lucide-react' +import Link from 'next/link' import { useMemo } from 'react' import { cn, HoverCard, HoverCardContent, HoverCardTrigger } from 'ui' + import { billingMetricUnit, formatUsage } from '../helpers' import { Metric, USAGE_APPROACHING_THRESHOLD } from './BillingBreakdown.constants' +import { UpgradePlanButton } from '@/components/ui/UpgradePlanButton' +import { PricingMetric } from '@/data/analytics/org-daily-stats-query' +import type { OrgSubscription } from '@/data/subscriptions/types' +import type { OrgUsageResponse } from '@/data/usage/org-usage-query' +import { formatCurrency } from '@/lib/helpers' export interface BillingMetricProps { idx: number diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/ComputeMetric.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/ComputeMetric.tsx index a57b997751..0eb75aadc9 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/ComputeMetric.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/ComputeMetric.tsx @@ -1,14 +1,14 @@ -import Link from 'next/link' - -import { ComputeUsageMetric, PricingMetric } from 'data/analytics/org-daily-stats-query' -import type { OrgUsageResponse } from 'data/usage/org-usage-query' -import { DOCS_URL } from 'lib/constants' -import { formatCurrency } from 'lib/helpers' import { ChevronRight } from 'lucide-react' +import Link from 'next/link' import { useMemo } from 'react' import { HoverCard, HoverCardContent, HoverCardTrigger } from 'ui' + import { formatUsage } from '../helpers' import { Metric } from './BillingBreakdown.constants' +import { ComputeUsageMetric, PricingMetric } from '@/data/analytics/org-daily-stats-query' +import type { OrgUsageResponse } from '@/data/usage/org-usage-query' +import { DOCS_URL } from '@/lib/constants' +import { formatCurrency } from '@/lib/helpers' export interface ComputeMetricProps { slug?: string diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/UpcomingInvoice.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/UpcomingInvoice.tsx index 93bd17e505..f103bb367d 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/UpcomingInvoice.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/UpcomingInvoice.tsx @@ -1,11 +1,3 @@ -import AlertError from 'components/ui/AlertError' -import { PricingMetric } from 'data/analytics/org-daily-stats-query' -import { - UpcomingInvoiceResponse, - useOrgUpcomingInvoiceQuery, -} from 'data/invoices/org-invoice-upcoming-query' -import { DOCS_URL } from 'lib/constants' -import { formatCurrency } from 'lib/helpers' import Link from 'next/link' import React from 'react' import { Table, TableBody, TableCell, TableFooter, TableRow } from 'ui' @@ -13,7 +5,15 @@ import { InfoTooltip } from 'ui-patterns/info-tooltip' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { billingMetricUnit, formatUsage } from '../helpers' +import AlertError from '@/components/ui/AlertError' import { InlineLink } from '@/components/ui/InlineLink' +import { PricingMetric } from '@/data/analytics/org-daily-stats-query' +import { + UpcomingInvoiceResponse, + useOrgUpcomingInvoiceQuery, +} from '@/data/invoices/org-invoice-upcoming-query' +import { DOCS_URL } from '@/lib/constants' +import { formatCurrency } from '@/lib/helpers' export interface UpcomingInvoiceProps { slug?: string diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/BillingCustomerData/BillingCustomerData.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/BillingCustomerData/BillingCustomerData.tsx index 3a138e9da1..f86fe50419 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/BillingCustomerData/BillingCustomerData.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/BillingCustomerData/BillingCustomerData.tsx @@ -1,32 +1,32 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useQueryClient } from '@tanstack/react-query' +import { useParams } from 'common' import { useMemo, useState } from 'react' import { toast } from 'sonner' - -import { useParams } from 'common' -import { - ScaffoldSection, - ScaffoldSectionContent, - ScaffoldSectionDetail, -} from 'components/layouts/Scaffold' -import AlertError from 'components/ui/AlertError' -import NoPermission from 'components/ui/NoPermission' -import PartnerManagedResource from 'components/ui/PartnerManagedResource' -import { useOrganizationCustomerProfileQuery } from 'data/organizations/organization-customer-profile-query' -import { useOrganizationCustomerProfileUpdateMutation } from 'data/organizations/organization-customer-profile-update-mutation' -import { useOrganizationTaxIdQuery } from 'data/organizations/organization-tax-id-query' -import { useOrganizationTaxIdUpdateMutation } from 'data/organizations/organization-tax-id-update-mutation' -import { organizationKeys } from 'data/organizations/keys' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { Button, Card, CardFooter, Form_Shadcn_ as Form } from 'ui' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' + import { BillingCustomerDataForm, type BillingCustomerDataFormValues, } from './BillingCustomerDataForm' import { resolveStoredTaxId } from './TaxID.utils' import { useBillingCustomerDataForm } from './useBillingCustomerDataForm' +import { + ScaffoldSection, + ScaffoldSectionContent, + ScaffoldSectionDetail, +} from '@/components/layouts/Scaffold' +import AlertError from '@/components/ui/AlertError' +import NoPermission from '@/components/ui/NoPermission' +import PartnerManagedResource from '@/components/ui/PartnerManagedResource' +import { organizationKeys } from '@/data/organizations/keys' +import { useOrganizationCustomerProfileQuery } from '@/data/organizations/organization-customer-profile-query' +import { useOrganizationCustomerProfileUpdateMutation } from '@/data/organizations/organization-customer-profile-update-mutation' +import { useOrganizationTaxIdQuery } from '@/data/organizations/organization-tax-id-query' +import { useOrganizationTaxIdUpdateMutation } from '@/data/organizations/organization-tax-id-update-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' export const BillingCustomerData = () => { const { slug } = useParams() diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/BillingCustomerData/useBillingCustomerDataForm.ts b/apps/studio/components/interfaces/Organization/BillingSettings/BillingCustomerData/useBillingCustomerDataForm.ts index 5624f6d2a6..b2589963d0 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/BillingCustomerData/useBillingCustomerDataForm.ts +++ b/apps/studio/components/interfaces/Organization/BillingSettings/BillingCustomerData/useBillingCustomerDataForm.ts @@ -1,12 +1,12 @@ import { zodResolver } from '@hookform/resolvers/zod' +import { components } from 'api-types' import { useEffect } from 'react' import { useForm } from 'react-hook-form' import { BillingCustomerDataFormValues, BillingCustomerDataSchema } from './BillingCustomerDataForm' import { TAX_IDS } from './TaxID.constants' import { getEffectiveTaxCountry, sanitizeTaxIdValue } from './TaxID.utils' -import { components } from 'api-types' -import type { CustomerAddress } from 'data/organizations/types' +import type { CustomerAddress } from '@/data/organizations/types' export type FormCustomerData = { address: CustomerAddress | undefined diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/BillingEmail.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/BillingEmail.tsx index 416c389bf4..a273ab78d7 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/BillingEmail.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/BillingEmail.tsx @@ -2,19 +2,6 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' import { Form, FormControl, FormField } from '@ui/components/shadcn/ui/form' import { useParams } from 'common' -import { - ScaffoldSection, - ScaffoldSectionContent, - ScaffoldSectionDetail, -} from 'components/layouts/Scaffold' -import { FormActions } from 'components/ui/Forms/FormActions' -import { FormPanel } from 'components/ui/Forms/FormPanel' -import { FormSection, FormSectionContent } from 'components/ui/Forms/FormSection' -import NoPermission from 'components/ui/NoPermission' -import { useOrganizationCustomerProfileQuery } from 'data/organizations/organization-customer-profile-query' -import { useOrganizationUpdateMutation } from 'data/organizations/organization-update-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { useEffect } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' @@ -29,6 +16,20 @@ import { } from 'ui-patterns/multi-select' import { z } from 'zod' +import { + ScaffoldSection, + ScaffoldSectionContent, + ScaffoldSectionDetail, +} from '@/components/layouts/Scaffold' +import { FormActions } from '@/components/ui/Forms/FormActions' +import { FormPanel } from '@/components/ui/Forms/FormPanel' +import { FormSection, FormSectionContent } from '@/components/ui/Forms/FormSection' +import NoPermission from '@/components/ui/NoPermission' +import { useOrganizationCustomerProfileQuery } from '@/data/organizations/organization-customer-profile-query' +import { useOrganizationUpdateMutation } from '@/data/organizations/organization-update-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' + const FORM_ID = 'org-billing-email' const formSchema = z.object({ billingEmail: z.string().email('Please provide a valid email address').optional(), diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/BillingSettings.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/BillingSettings.tsx index c68bcc420b..b255efad6b 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/BillingSettings.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/BillingSettings.tsx @@ -1,13 +1,5 @@ -import { - ScaffoldContainer, - ScaffoldContainerLegacy, - ScaffoldDivider, - ScaffoldTitle, -} from 'components/layouts/Scaffold' -import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { cn } from 'ui' + import PaymentMethods from '../../Billing/Payment/PaymentMethods/PaymentMethods' import { InvoicesSection } from '../InvoicesSettings/InvoicesSection' import BillingBreakdown from './BillingBreakdown/BillingBreakdown' @@ -16,6 +8,15 @@ import BillingEmail from './BillingEmail' import CostControl from './CostControl/CostControl' import CreditBalance from './CreditBalance' import Subscription from './Subscription/Subscription' +import { + ScaffoldContainer, + ScaffoldContainerLegacy, + ScaffoldDivider, + ScaffoldTitle, +} from '@/components/layouts/Scaffold' +import { useOrgSubscriptionQuery } from '@/data/subscriptions/org-subscription-query' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' export const BillingSettings = () => { const { diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/CostControl/CostControl.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/CostControl/CostControl.tsx index 2903d9f1d0..4dc9b475a8 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/CostControl/CostControl.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/CostControl/CostControl.tsx @@ -1,30 +1,30 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useFlag, useParams } from 'common' -import { - ScaffoldSection, - ScaffoldSectionContent, - ScaffoldSectionDetail, -} from 'components/layouts/Scaffold' -import AlertError from 'components/ui/AlertError' -import NoPermission from 'components/ui/NoPermission' -import PartnerIcon from 'components/ui/PartnerIcon' -import { PARTNER_TO_NAME } from 'components/ui/PartnerManagedResource' -import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { BASE_PATH, DOCS_URL } from 'lib/constants' -import { MANAGED_BY } from 'lib/constants/infrastructure' import { ExternalLink } from 'lucide-react' import { useTheme } from 'next-themes' import Image from 'next/image' import Link from 'next/link' -import { useOrgSettingsPageStateSnapshot } from 'state/organization-settings' import { Alert, Alert_Shadcn_, AlertTitle_Shadcn_, Button } from 'ui' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { ProjectUpdateDisabledTooltip } from '../ProjectUpdateDisabledTooltip' import SpendCapSidePanel from './SpendCapSidePanel' +import { + ScaffoldSection, + ScaffoldSectionContent, + ScaffoldSectionDetail, +} from '@/components/layouts/Scaffold' +import AlertError from '@/components/ui/AlertError' import { InlineLink } from '@/components/ui/InlineLink' +import NoPermission from '@/components/ui/NoPermission' +import PartnerIcon from '@/components/ui/PartnerIcon' +import { PARTNER_TO_NAME } from '@/components/ui/PartnerManagedResource' +import { useOrgSubscriptionQuery } from '@/data/subscriptions/org-subscription-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { BASE_PATH, DOCS_URL } from '@/lib/constants' +import { MANAGED_BY } from '@/lib/constants/infrastructure' +import { useOrgSettingsPageStateSnapshot } from '@/state/organization-settings' export interface CostControlProps {} diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/CostControl/SpendCapSidePanel.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/CostControl/SpendCapSidePanel.tsx index 6aeb822cf3..d72172af75 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/CostControl/SpendCapSidePanel.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/CostControl/SpendCapSidePanel.tsx @@ -1,22 +1,22 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' +import { ChevronRight, ExternalLink } from 'lucide-react' import { useTheme } from 'next-themes' import Image from 'next/image' import Link from 'next/link' import { useEffect, useState } from 'react' -import { toast } from 'sonner' - -import { useParams } from 'common' -import Table from 'components/to-be-cleaned/Table' -import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' -import { useOrgSubscriptionUpdateMutation } from 'data/subscriptions/org-subscription-update-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { BASE_PATH, DOCS_URL, PRICING_TIER_PRODUCT_IDS } from 'lib/constants' -import { ChevronRight, ExternalLink } from 'lucide-react' import { pricing } from 'shared-data/pricing' -import { useOrgSettingsPageStateSnapshot } from 'state/organization-settings' -import { Button, Collapsible, SidePanel, cn } from 'ui' +import { toast } from 'sonner' +import { Button, cn, Collapsible, SidePanel } from 'ui' import { Admonition } from 'ui-patterns/admonition' +import Table from '@/components/to-be-cleaned/Table' +import { useOrgSubscriptionQuery } from '@/data/subscriptions/org-subscription-query' +import { useOrgSubscriptionUpdateMutation } from '@/data/subscriptions/org-subscription-update-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { BASE_PATH, DOCS_URL, PRICING_TIER_PRODUCT_IDS } from '@/lib/constants' +import { useOrgSettingsPageStateSnapshot } from '@/state/organization-settings' + const SPEND_CAP_OPTIONS: { name: string value: 'on' | 'off' diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/CreditBalance.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/CreditBalance.tsx index f538d0b507..ca1d7e2520 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/CreditBalance.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/CreditBalance.tsx @@ -1,19 +1,19 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' + +import { CreditCodeRedemption } from './CreditCodeRedemption' +import { CreditTopUp } from './CreditTopUp' import { ScaffoldSection, ScaffoldSectionContent, ScaffoldSectionDetail, -} from 'components/layouts/Scaffold' -import AlertError from 'components/ui/AlertError' -import { FormPanel } from 'components/ui/Forms/FormPanel' -import { FormSection, FormSectionContent } from 'components/ui/Forms/FormSection' -import NoPermission from 'components/ui/NoPermission' -import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' - -import { CreditCodeRedemption } from './CreditCodeRedemption' -import { CreditTopUp } from './CreditTopUp' +} from '@/components/layouts/Scaffold' +import AlertError from '@/components/ui/AlertError' +import { FormPanel } from '@/components/ui/Forms/FormPanel' +import { FormSection, FormSectionContent } from '@/components/ui/Forms/FormSection' +import NoPermission from '@/components/ui/NoPermission' +import { useOrgSubscriptionQuery } from '@/data/subscriptions/org-subscription-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' const CreditBalance = () => { const { slug } = useParams() diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/CreditCodeRedemption.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/CreditCodeRedemption.tsx index 37105629fa..6a42c6095f 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/CreditCodeRedemption.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/CreditCodeRedemption.tsx @@ -2,8 +2,6 @@ import HCaptcha from '@hcaptcha/react-hcaptcha' import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useFlag } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { Calendar, PartyPopper } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' @@ -29,10 +27,12 @@ import { Admonition, ShimmeringLoader, TimestampInfo } from 'ui-patterns' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { z } from 'zod' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' import { UpgradePlanButton } from '@/components/ui/UpgradePlanButton' import { useOrganizationCreditCodeRedemptionMutation } from '@/data/organizations/organization-credit-code-redemption-mutation' import { useOrganizationCustomerProfileQuery } from '@/data/organizations/organization-customer-profile-query' import { useOrganizationQuery } from '@/data/organizations/organization-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' import { useLatest } from '@/hooks/misc/useLatest' const FORM_ID = 'credit-code-redemption' diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/CreditTopUp.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/CreditTopUp.tsx index 167135bf1e..4eb34ecbf7 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/CreditTopUp.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/CreditTopUp.tsx @@ -1,27 +1,18 @@ import HCaptcha from '@hcaptcha/react-hcaptcha' import { zodResolver } from '@hookform/resolvers/zod' import { Elements } from '@stripe/react-stripe-js' -import { PaymentIntentResult, loadStripe } from '@stripe/stripe-js' +import { loadStripe, PaymentIntentResult } from '@stripe/stripe-js' import { PermissionAction, SupportCategories } from '@supabase/shared-types/out/constants' import { useQueryClient } from '@tanstack/react-query' -import { getStripeElementsAppearanceOptions } from 'components/interfaces/Billing/Payment/Payment.utils' -import { PaymentConfirmation } from 'components/interfaces/Billing/Payment/PaymentConfirmation' -import { NO_PROJECT_MARKER } from 'components/interfaces/Support/SupportForm.utils' -import { SupportLink } from 'components/interfaces/Support/SupportLink' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useOrganizationCreditTopUpMutation } from 'data/organizations/organization-credit-top-up-mutation' -import { subscriptionKeys } from 'data/subscriptions/keys' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { STRIPE_PUBLIC_KEY } from 'lib/constants' import { AlertCircle, Info } from 'lucide-react' import { useTheme } from 'next-themes' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' import { + Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, - Alert_Shadcn_, Button, Dialog, DialogContent, @@ -32,8 +23,8 @@ import { DialogSectionSeparator, DialogTitle, DialogTrigger, - FormField_Shadcn_, Form_Shadcn_, + FormField_Shadcn_, Input_Shadcn_, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' @@ -41,6 +32,15 @@ import { z } from 'zod' import type { PaymentMethodElementRef } from '../../Billing/Payment/PaymentMethods/NewPaymentMethodElement' import PaymentMethodSelection from './Subscription/PaymentMethodSelection' +import { getStripeElementsAppearanceOptions } from '@/components/interfaces/Billing/Payment/Payment.utils' +import { PaymentConfirmation } from '@/components/interfaces/Billing/Payment/PaymentConfirmation' +import { NO_PROJECT_MARKER } from '@/components/interfaces/Support/SupportForm.utils' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useOrganizationCreditTopUpMutation } from '@/data/organizations/organization-credit-top-up-mutation' +import { subscriptionKeys } from '@/data/subscriptions/keys' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { STRIPE_PUBLIC_KEY } from '@/lib/constants' const stripePromise = loadStripe(STRIPE_PUBLIC_KEY) diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Restriction.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/Restriction.tsx index d4118d5b5f..bea16a8cbd 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/Restriction.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/Restriction.tsx @@ -1,22 +1,22 @@ import dayjs from 'dayjs' import { ExternalLink } from 'lucide-react' import Link from 'next/link' - -import { PricingMetric } from 'data/analytics/org-daily-stats-query' -import { VIOLATION_TYPE_LABELS } from 'data/usage/constants' -import { useOrgUsageQuery } from 'data/usage/org-usage-query' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { DOCS_URL } from 'lib/constants' import { usePathname } from 'next/navigation' import { + Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, - Alert_Shadcn_, Button, CriticalIcon, WarningIcon, } from 'ui' +import { PricingMetric } from '@/data/analytics/org-daily-stats-query' +import { VIOLATION_TYPE_LABELS } from '@/data/usage/constants' +import { useOrgUsageQuery } from '@/data/usage/org-usage-query' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { DOCS_URL } from '@/lib/constants' + export const Restriction = () => { const { data: org } = useSelectedOrganizationQuery() const { data: usage, isSuccess: isSuccessOrgUsage } = useOrgUsageQuery({ orgSlug: org?.slug }) diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/DowngradeModal.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/DowngradeModal.tsx index a9decb09b3..787f4ad02c 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/DowngradeModal.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/DowngradeModal.tsx @@ -1,11 +1,12 @@ -import { getComputeSize, OrgProject } from 'data/projects/org-projects-infinite-query' -import type { OrgSubscription, ProjectAddon } from 'data/subscriptions/types' import { MinusCircle, PauseCircle } from 'lucide-react' import { useMemo } from 'react' import { plans as subscriptionsPlans } from 'shared-data/plans' import { Modal } from 'ui' import { Admonition } from 'ui-patterns' +import { getComputeSize, OrgProject } from '@/data/projects/org-projects-infinite-query' +import type { OrgSubscription, ProjectAddon } from '@/data/subscriptions/types' + export interface DowngradeModalProps { visible: boolean subscription?: OrgSubscription diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/EnterpriseCard.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/EnterpriseCard.tsx index adfcbada66..ddd7bdef44 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/EnterpriseCard.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/EnterpriseCard.tsx @@ -1,10 +1,10 @@ import { Check } from 'lucide-react' - -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { PricingInformation } from 'shared-data' import { Button, cn } from 'ui' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' + export interface EnterpriseCardProps { plan: PricingInformation isCurrentPlan: boolean diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/ExitSurveyModal.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/ExitSurveyModal.tsx index fec46b5171..a7dff8fd31 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/ExitSurveyModal.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/ExitSurveyModal.tsx @@ -1,13 +1,13 @@ import { useFlag, useParams } from 'common' -import { CANCELLATION_REASONS } from 'components/interfaces/Billing/Billing.constants' -import { useSendDowngradeFeedbackMutation } from 'data/feedback/exit-survey-send' -import { getComputeSize, OrgProject } from 'data/projects/org-projects-infinite-query' -import { useOrgSubscriptionUpdateMutation } from 'data/subscriptions/org-subscription-update-mutation' import { useState } from 'react' import { toast } from 'sonner' import { Alert, Button, cn, Input, Modal } from 'ui' import { ProjectUpdateDisabledTooltip } from '../ProjectUpdateDisabledTooltip' +import { CANCELLATION_REASONS } from '@/components/interfaces/Billing/Billing.constants' +import { useSendDowngradeFeedbackMutation } from '@/data/feedback/exit-survey-send' +import { getComputeSize, OrgProject } from '@/data/projects/org-projects-infinite-query' +import { useOrgSubscriptionUpdateMutation } from '@/data/subscriptions/org-subscription-update-mutation' export interface ExitSurveyModalProps { visible: boolean diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/MembersExceedLimitModal.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/MembersExceedLimitModal.tsx index 510d5a1b8c..b361a58ff0 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/MembersExceedLimitModal.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/MembersExceedLimitModal.tsx @@ -1,7 +1,8 @@ -import { useFreeProjectLimitCheckQuery } from 'data/organizations/free-project-limit-check-query' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { Button, Modal } from 'ui' +import { useFreeProjectLimitCheckQuery } from '@/data/organizations/free-project-limit-check-query' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' + export interface MembersExceedLimitModalProps { visible: boolean onClose: () => void diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PaymentMethodSelection.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PaymentMethodSelection.tsx index 0bd9a8daa2..3eccf23953 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PaymentMethodSelection.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PaymentMethodSelection.tsx @@ -2,18 +2,6 @@ import HCaptcha from '@hcaptcha/react-hcaptcha' import { Elements } from '@stripe/react-stripe-js' import { loadStripe, PaymentMethod, StripeElementsOptions } from '@stripe/stripe-js' import { useParams } from 'common' -import { getStripeElementsAppearanceOptions } from 'components/interfaces/Billing/Payment/Payment.utils' -import { - NewPaymentMethodElement, - type PaymentMethodElementRef, -} from 'components/interfaces/Billing/Payment/PaymentMethods/NewPaymentMethodElement' -import { useOrganizationCustomerProfileQuery } from 'data/organizations/organization-customer-profile-query' -import { useOrganizationPaymentMethodSetupIntent } from 'data/organizations/organization-payment-method-setup-intent-mutation' -import { useOrganizationPaymentMethodsQuery } from 'data/organizations/organization-payment-methods-query' -import { useOrganizationTaxIdQuery } from 'data/organizations/organization-tax-id-query' -import { SetupIntentResponse } from 'data/stripe/setup-intent-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { BASE_PATH, STRIPE_PUBLIC_KEY } from 'lib/constants' import { Loader, Plus } from 'lucide-react' import { useTheme } from 'next-themes' import { @@ -29,6 +17,19 @@ import { toast } from 'sonner' import { Checkbox_Shadcn_, Listbox } from 'ui' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' +import { getStripeElementsAppearanceOptions } from '@/components/interfaces/Billing/Payment/Payment.utils' +import { + NewPaymentMethodElement, + type PaymentMethodElementRef, +} from '@/components/interfaces/Billing/Payment/PaymentMethods/NewPaymentMethodElement' +import { useOrganizationCustomerProfileQuery } from '@/data/organizations/organization-customer-profile-query' +import { useOrganizationPaymentMethodSetupIntent } from '@/data/organizations/organization-payment-method-setup-intent-mutation' +import { useOrganizationPaymentMethodsQuery } from '@/data/organizations/organization-payment-methods-query' +import { useOrganizationTaxIdQuery } from '@/data/organizations/organization-tax-id-query' +import { SetupIntentResponse } from '@/data/stripe/setup-intent-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { BASE_PATH, STRIPE_PUBLIC_KEY } from '@/lib/constants' + const stripePromise = loadStripe(STRIPE_PUBLIC_KEY) export interface PaymentMethodSelectionProps { diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanUpdateSidePanel.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanUpdateSidePanel.tsx index b8252ec5b8..581c9a95d3 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanUpdateSidePanel.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/PlanUpdateSidePanel.tsx @@ -1,29 +1,11 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' import { StudioPricingSidePanelOpenedEvent } from 'common/telemetry-constants' -import { getPlanChangeType } from 'components/interfaces/Billing/Subscription/Subscription.utils' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import PartnerManagedResource from 'components/ui/PartnerManagedResource' -import { RequestUpgradeToBillingOwners } from 'components/ui/RequestUpgradeToBillingOwners' -import { useFreeProjectLimitCheckQuery } from 'data/organizations/free-project-limit-check-query' -import { useOrganizationBillingSubscriptionPreview } from 'data/organizations/organization-billing-subscription-preview' -import { useOrganizationQuery } from 'data/organizations/organization-query' -import { useOrgProjectsInfiniteQuery } from 'data/projects/org-projects-infinite-query' -import { useOrgPlansQuery } from 'data/subscriptions/org-plans-query' -import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' -import type { OrgPlan } from 'data/subscriptions/types' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { MANAGED_BY } from 'lib/constants/infrastructure' -import { formatCurrency } from 'lib/helpers' import { isArray } from 'lodash' import { Check, ExternalLink } from 'lucide-react' import { useRouter } from 'next/router' import { useEffect, useMemo, useRef, useState } from 'react' import { plans as subscriptionsPlans } from 'shared-data/plans' -import { useOrgSettingsPageStateSnapshot } from 'state/organization-settings' -import { Organization } from 'types/base' import { Button, cn, SidePanel } from 'ui' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' @@ -33,6 +15,24 @@ import { ExitSurveyModal } from './ExitSurveyModal' import MembersExceedLimitModal from './MembersExceedLimitModal' import { SubscriptionPlanUpdateDialog } from './SubscriptionPlanUpdateDialog' import UpgradeSurveyModal from './UpgradeModal' +import { getPlanChangeType } from '@/components/interfaces/Billing/Subscription/Subscription.utils' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import PartnerManagedResource from '@/components/ui/PartnerManagedResource' +import { RequestUpgradeToBillingOwners } from '@/components/ui/RequestUpgradeToBillingOwners' +import { useFreeProjectLimitCheckQuery } from '@/data/organizations/free-project-limit-check-query' +import { useOrganizationBillingSubscriptionPreview } from '@/data/organizations/organization-billing-subscription-preview' +import { useOrganizationQuery } from '@/data/organizations/organization-query' +import { useOrgProjectsInfiniteQuery } from '@/data/projects/org-projects-infinite-query' +import { useOrgPlansQuery } from '@/data/subscriptions/org-plans-query' +import { useOrgSubscriptionQuery } from '@/data/subscriptions/org-subscription-query' +import type { OrgPlan } from '@/data/subscriptions/types' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { MANAGED_BY } from '@/lib/constants/infrastructure' +import { formatCurrency } from '@/lib/helpers' +import { useOrgSettingsPageStateSnapshot } from '@/state/organization-settings' +import { Organization } from '@/types/base' const getPartnerManagedResourceCta = (selectedOrganization: Organization) => { if (selectedOrganization.managed_by === MANAGED_BY.VERCEL_MARKETPLACE) { diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/Subscription.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/Subscription.tsx index f3f6b37074..80ebf682fa 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/Subscription.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/Subscription.tsx @@ -1,17 +1,6 @@ import { PermissionAction, SupportCategories } from '@supabase/shared-types/out/constants' import { useFlag, useParams } from 'common' -import { SupportLink } from 'components/interfaces/Support/SupportLink' -import { - ScaffoldSection, - ScaffoldSectionContent, - ScaffoldSectionDetail, -} from 'components/layouts/Scaffold' -import AlertError from 'components/ui/AlertError' -import NoPermission from 'components/ui/NoPermission' -import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import Link from 'next/link' -import { useOrgSettingsPageStateSnapshot } from 'state/organization-settings' import { Alert, Button } from 'ui' import { Admonition } from 'ui-patterns' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' @@ -19,6 +8,17 @@ import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { ProjectUpdateDisabledTooltip } from '../ProjectUpdateDisabledTooltip' import { Restriction } from '../Restriction' import { PlanUpdateSidePanel } from './PlanUpdateSidePanel' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' +import { + ScaffoldSection, + ScaffoldSectionContent, + ScaffoldSectionDetail, +} from '@/components/layouts/Scaffold' +import AlertError from '@/components/ui/AlertError' +import NoPermission from '@/components/ui/NoPermission' +import { useOrgSubscriptionQuery } from '@/data/subscriptions/org-subscription-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useOrgSettingsPageStateSnapshot } from '@/state/organization-settings' const Subscription = () => { const { slug } = useParams() diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/SubscriptionPlanUpdateDialog.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/SubscriptionPlanUpdateDialog.tsx index 0e66029e02..d94076756b 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/SubscriptionPlanUpdateDialog.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/SubscriptionPlanUpdateDialog.tsx @@ -1,26 +1,5 @@ import { Elements } from '@stripe/react-stripe-js' import { loadStripe, PaymentIntentResult, StripeElementsOptions } from '@stripe/stripe-js' -import { getStripeElementsAppearanceOptions } from 'components/interfaces/Billing/Payment/Payment.utils' -import { PaymentConfirmation } from 'components/interfaces/Billing/Payment/PaymentConfirmation' -import type { PaymentMethodElementRef } from 'components/interfaces/Billing/Payment/PaymentMethods/NewPaymentMethodElement' -import { - billingPartnerLabel, - getPlanChangeType, -} from 'components/interfaces/Billing/Subscription/Subscription.utils' -import AlertError from 'components/ui/AlertError' -import { OrganizationBillingSubscriptionPreviewResponse } from 'data/organizations/organization-billing-subscription-preview' -import { OrgProject } from 'data/projects/org-projects-infinite-query' -import { useConfirmPendingSubscriptionChangeMutation } from 'data/subscriptions/org-subscription-confirm-pending-change' -import { useOrgSubscriptionUpdateMutation } from 'data/subscriptions/org-subscription-update-mutation' -import { SubscriptionTier } from 'data/subscriptions/types' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { - DOCS_URL, - PRICING_TIER_PRODUCT_IDS, - PROJECT_STATUS, - STRIPE_PUBLIC_KEY, -} from 'lib/constants' -import { formatCurrency } from 'lib/helpers' import { Check, InfoIcon } from 'lucide-react' import { useTheme } from 'next-themes' import Link from 'next/link' @@ -33,6 +12,27 @@ import { InfoTooltip } from 'ui-patterns/info-tooltip' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import PaymentMethodSelection from './PaymentMethodSelection' +import { getStripeElementsAppearanceOptions } from '@/components/interfaces/Billing/Payment/Payment.utils' +import { PaymentConfirmation } from '@/components/interfaces/Billing/Payment/PaymentConfirmation' +import type { PaymentMethodElementRef } from '@/components/interfaces/Billing/Payment/PaymentMethods/NewPaymentMethodElement' +import { + billingPartnerLabel, + getPlanChangeType, +} from '@/components/interfaces/Billing/Subscription/Subscription.utils' +import AlertError from '@/components/ui/AlertError' +import { OrganizationBillingSubscriptionPreviewResponse } from '@/data/organizations/organization-billing-subscription-preview' +import { OrgProject } from '@/data/projects/org-projects-infinite-query' +import { useConfirmPendingSubscriptionChangeMutation } from '@/data/subscriptions/org-subscription-confirm-pending-change' +import { useOrgSubscriptionUpdateMutation } from '@/data/subscriptions/org-subscription-update-mutation' +import { SubscriptionTier } from '@/data/subscriptions/types' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { + DOCS_URL, + PRICING_TIER_PRODUCT_IDS, + PROJECT_STATUS, + STRIPE_PUBLIC_KEY, +} from '@/lib/constants' +import { formatCurrency } from '@/lib/helpers' const stripePromise = loadStripe(STRIPE_PUBLIC_KEY) diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/UpgradeModal.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/UpgradeModal.tsx index d861642973..eb251755d2 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/UpgradeModal.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/UpgradeModal.tsx @@ -1,12 +1,12 @@ +import { useParams } from 'common' import { includes, without } from 'lodash' import { useReducer, useState } from 'react' import { toast } from 'sonner' - -import { useParams } from 'common' -import { useSendUpgradeFeedbackMutation } from 'data/feedback/upgrade-survey-send' -import type { OrgSubscription } from 'data/subscriptions/types' import { Input, Modal } from 'ui' + import { generateUpgradeReasons } from '../helpers' +import { useSendUpgradeFeedbackMutation } from '@/data/feedback/upgrade-survey-send' +import type { OrgSubscription } from '@/data/subscriptions/types' export interface UpgradeSurveyModalProps { visible: boolean diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/helpers.ts b/apps/studio/components/interfaces/Organization/BillingSettings/helpers.ts index 9294e92daa..fb80aa7b2a 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/helpers.ts +++ b/apps/studio/components/interfaces/Organization/BillingSettings/helpers.ts @@ -1,4 +1,4 @@ -import { PricingMetric } from 'data/analytics/org-daily-stats-query' +import { PricingMetric } from '@/data/analytics/org-daily-stats-query' const pricingMetricBytes = [ PricingMetric.DATABASE_SIZE, diff --git a/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceAutoRenewalWarning.tsx b/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceAutoRenewalWarning.tsx index e8056bd2bd..3173ceecee 100644 --- a/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceAutoRenewalWarning.tsx +++ b/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceAutoRenewalWarning.tsx @@ -1,6 +1,6 @@ -import { Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_ } from 'ui' import dayjs from 'dayjs' import Link from 'next/link' +import { Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_ } from 'ui' interface Props { awsContractEndDate: string diff --git a/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceContractNotLinkable.tsx b/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceContractNotLinkable.tsx index a0e87442c7..a32ec0f946 100644 --- a/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceContractNotLinkable.tsx +++ b/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceContractNotLinkable.tsx @@ -1,7 +1,8 @@ -import { CloudMarketplaceContractLinkingIneligibilityReason } from './cloud-marketplace-query' -import { Button, Card, CardContent } from 'ui' import Link from 'next/link' +import { Button, Card, CardContent } from 'ui' + import { SupportLink } from '../../Support/SupportLink' +import { CloudMarketplaceContractLinkingIneligibilityReason } from './cloud-marketplace-query' interface Props { reason: CloudMarketplaceContractLinkingIneligibilityReason diff --git a/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceCreateNewOrg.tsx b/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceCreateNewOrg.tsx index 1e625b88cb..723396ab11 100644 --- a/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceCreateNewOrg.tsx +++ b/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceCreateNewOrg.tsx @@ -1,5 +1,3 @@ -import { useAwsManagedOrganizationCreateMutation } from 'data/organizations/organization-create-mutation' -import { DOCS_URL } from 'lib/constants' import Link from 'next/link' import { useRouter } from 'next/router' import { SubmitHandler } from 'react-hook-form' @@ -18,6 +16,8 @@ import { ScaffoldSectionContent, ScaffoldSectionDetail, } from '@/components/layouts/Scaffold' +import { useAwsManagedOrganizationCreateMutation } from '@/data/organizations/organization-create-mutation' +import { DOCS_URL } from '@/lib/constants' const AwsMarketplaceCreateNewOrg = () => { const router = useRouter() diff --git a/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceLinkExistingOrg.tsx b/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceLinkExistingOrg.tsx index 1b257cd6d6..e732241824 100644 --- a/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceLinkExistingOrg.tsx +++ b/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceLinkExistingOrg.tsx @@ -1,4 +1,5 @@ import { zodResolver } from '@hookform/resolvers/zod' +import { RadioGroupCard, RadioGroupCardItem } from '@ui/components/radio-group-card' import { cn } from '@ui/lib/utils' import { ChevronRight } from 'lucide-react' import Link from 'next/link' @@ -6,18 +7,6 @@ import { useRouter } from 'next/router' import { useMemo, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' - -import { RadioGroupCard, RadioGroupCardItem } from '@ui/components/radio-group-card' -import { - ScaffoldSection, - ScaffoldSectionContent, - ScaffoldSectionDetail, -} from 'components/layouts/Scaffold' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useOrganizationLinkAwsMarketplaceMutation } from 'data/organizations/organization-link-aws-marketplace-mutation' -import { DOCS_URL } from 'lib/constants' -import type { Organization } from 'types' import { Button, Collapsible_Shadcn_, @@ -28,12 +17,23 @@ import { Skeleton, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import { z } from 'zod' + import { OrganizationCard } from '../OrganizationCard' import AwsMarketplaceAutoRenewalWarning from './AwsMarketplaceAutoRenewalWarning' +import AwsMarketplaceOnboardingPlaceholder from './AwsMarketplaceOnboardingPlaceholder' import AwsMarketplaceOnboardingSuccessModal from './AwsMarketplaceOnboardingSuccessModal' import { useCloudMarketplaceOnboardingInfoQuery } from './cloud-marketplace-query' import NewAwsMarketplaceOrgModal from './NewAwsMarketplaceOrgModal' -import AwsMarketplaceOnboardingPlaceholder from './AwsMarketplaceOnboardingPlaceholder' +import { + ScaffoldSection, + ScaffoldSectionContent, + ScaffoldSectionDetail, +} from '@/components/layouts/Scaffold' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useOrganizationLinkAwsMarketplaceMutation } from '@/data/organizations/organization-link-aws-marketplace-mutation' +import { DOCS_URL } from '@/lib/constants' +import type { Organization } from '@/types' interface AwsMarketplaceLinkExistingOrgProps { organizations?: Organization[] | undefined diff --git a/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceOnboardingPlaceholder.tsx b/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceOnboardingPlaceholder.tsx index 973d158a03..1a613bfe9f 100644 --- a/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceOnboardingPlaceholder.tsx +++ b/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceOnboardingPlaceholder.tsx @@ -1,9 +1,10 @@ import { Skeleton } from '@ui/components/shadcn/ui/skeleton' + import { ScaffoldSection, ScaffoldSectionContent, ScaffoldSectionDetail, -} from 'components/layouts/Scaffold' +} from '@/components/layouts/Scaffold' const AwsMarketplaceOnboardingPlaceholder = () => { return ( diff --git a/apps/studio/components/interfaces/Organization/CloudMarketplace/NewAwsMarketplaceOrgForm.tsx b/apps/studio/components/interfaces/Organization/CloudMarketplace/NewAwsMarketplaceOrgForm.tsx index cc27b6389c..8bd170d36f 100644 --- a/apps/studio/components/interfaces/Organization/CloudMarketplace/NewAwsMarketplaceOrgForm.tsx +++ b/apps/studio/components/interfaces/Organization/CloudMarketplace/NewAwsMarketplaceOrgForm.tsx @@ -1,4 +1,5 @@ -import { z } from 'zod' +import { zodResolver } from '@hookform/resolvers/zod' +import { useForm } from 'react-hook-form' import { Form_Shadcn_, FormControl_Shadcn_, @@ -12,8 +13,7 @@ import { SelectValue_Shadcn_, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' -import { useForm } from 'react-hook-form' -import { zodResolver } from '@hookform/resolvers/zod' +import { z } from 'zod' const ORG_KIND_TYPES = { PERSONAL: 'Personal', diff --git a/apps/studio/components/interfaces/Organization/CloudMarketplace/NewAwsMarketplaceOrgModal.tsx b/apps/studio/components/interfaces/Organization/CloudMarketplace/NewAwsMarketplaceOrgModal.tsx index 25f975a9c5..29ec8f2893 100644 --- a/apps/studio/components/interfaces/Organization/CloudMarketplace/NewAwsMarketplaceOrgModal.tsx +++ b/apps/studio/components/interfaces/Organization/CloudMarketplace/NewAwsMarketplaceOrgModal.tsx @@ -8,7 +8,6 @@ import { DialogSectionSeparator, DialogTitle, } from '@ui/components/shadcn/ui/dialog' -import { useAwsManagedOrganizationCreateMutation } from 'data/organizations/organization-create-mutation' import { SubmitHandler } from 'react-hook-form' import { toast } from 'sonner' import { Button } from 'ui' @@ -17,6 +16,7 @@ import NewAwsMarketplaceOrgForm, { CREATE_AWS_MANAGED_ORG_FORM_ID, NewMarketplaceOrgForm, } from './NewAwsMarketplaceOrgForm' +import { useAwsManagedOrganizationCreateMutation } from '@/data/organizations/organization-create-mutation' interface Props { buyerId: string diff --git a/apps/studio/components/interfaces/Organization/CloudMarketplace/cloud-marketplace-query.ts b/apps/studio/components/interfaces/Organization/CloudMarketplace/cloud-marketplace-query.ts index 2a45c17ccc..dc461165f1 100644 --- a/apps/studio/components/interfaces/Organization/CloudMarketplace/cloud-marketplace-query.ts +++ b/apps/studio/components/interfaces/Organization/CloudMarketplace/cloud-marketplace-query.ts @@ -1,9 +1,9 @@ import { useQuery } from '@tanstack/react-query' -import type { ResponseError, UseCustomQueryOptions } from 'types' import { cloudMarketplaceKeys } from './keys' import { get, handleError } from '@/data/fetchers' import { useProfile } from '@/lib/profile' +import type { ResponseError, UseCustomQueryOptions } from '@/types' export type CloudMarketplaceOnboardingInfoVariables = { buyerId: string diff --git a/apps/studio/components/interfaces/Organization/Documents/CustomDocument.tsx b/apps/studio/components/interfaces/Organization/Documents/CustomDocument.tsx index 29702c97b3..9b14686d2c 100644 --- a/apps/studio/components/interfaces/Organization/Documents/CustomDocument.tsx +++ b/apps/studio/components/interfaces/Organization/Documents/CustomDocument.tsx @@ -1,12 +1,13 @@ +import { ExternalLink } from 'lucide-react' +import { Button } from 'ui' + import { ScaffoldContainer, ScaffoldSection, ScaffoldSectionContent, ScaffoldSectionDetail, -} from 'components/layouts/Scaffold' -import { CustomContentTypes } from 'hooks/custom-content/CustomContent.types' -import { ExternalLink } from 'lucide-react' -import { Button } from 'ui' +} from '@/components/layouts/Scaffold' +import { CustomContentTypes } from '@/hooks/custom-content/CustomContent.types' interface CustomDocumentProps { doc: CustomContentTypes['organizationLegalDocuments'][number] diff --git a/apps/studio/components/interfaces/Organization/Documents/DPA.tsx b/apps/studio/components/interfaces/Organization/Documents/DPA.tsx index 48819de15b..a00b50aaab 100644 --- a/apps/studio/components/interfaces/Organization/Documents/DPA.tsx +++ b/apps/studio/components/interfaces/Organization/Documents/DPA.tsx @@ -1,18 +1,18 @@ import { useState } from 'react' import { toast } from 'sonner' +import { Button } from 'ui' import { ScaffoldSection, ScaffoldSectionContent, ScaffoldSectionDetail, -} from 'components/layouts/Scaffold' -import { InlineLink } from 'components/ui/InlineLink' -import { TextConfirmModal } from 'components/ui/TextConfirmModalWrapper' -import { useDpaRequestMutation } from 'data/documents/dpa-request-mutation' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useProfile } from 'lib/profile' -import { Button } from 'ui' +} from '@/components/layouts/Scaffold' +import { InlineLink } from '@/components/ui/InlineLink' +import { TextConfirmModal } from '@/components/ui/TextConfirmModalWrapper' +import { useDpaRequestMutation } from '@/data/documents/dpa-request-mutation' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useProfile } from '@/lib/profile' export const DPA = () => { const { profile } = useProfile() diff --git a/apps/studio/components/interfaces/Organization/Documents/Documents.tsx b/apps/studio/components/interfaces/Organization/Documents/Documents.tsx index 8d3ca07f67..1a1859b75a 100644 --- a/apps/studio/components/interfaces/Organization/Documents/Documents.tsx +++ b/apps/studio/components/interfaces/Organization/Documents/Documents.tsx @@ -1,12 +1,3 @@ -import { SupportLink } from 'components/interfaces/Support/SupportLink' -import { - ScaffoldContainer, - ScaffoldDivider, - ScaffoldSection, - ScaffoldSectionDetail, -} from 'components/layouts/Scaffold' -import { InlineLinkClassName } from 'components/ui/InlineLink' -import { useCustomContent } from 'hooks/custom-content/useCustomContent' import { Fragment } from 'react' import { CustomDocument } from './CustomDocument' @@ -15,6 +6,15 @@ import { HIPAA } from './HIPAA' import { SecurityQuestionnaire } from './SecurityQuestionnaire' import { SOC2 } from './SOC2' import { TIA } from './TIA' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' +import { + ScaffoldContainer, + ScaffoldDivider, + ScaffoldSection, + ScaffoldSectionDetail, +} from '@/components/layouts/Scaffold' +import { InlineLinkClassName } from '@/components/ui/InlineLink' +import { useCustomContent } from '@/hooks/custom-content/useCustomContent' export const Documents = () => { const { organizationLegalDocuments } = useCustomContent(['organization:legal_documents']) diff --git a/apps/studio/components/interfaces/Organization/Documents/HIPAA.tsx b/apps/studio/components/interfaces/Organization/Documents/HIPAA.tsx index f48408e5d9..ef9b4783c1 100644 --- a/apps/studio/components/interfaces/Organization/Documents/HIPAA.tsx +++ b/apps/studio/components/interfaces/Organization/Documents/HIPAA.tsx @@ -1,13 +1,13 @@ import { ExternalLink } from 'lucide-react' +import { Button } from 'ui' import { ScaffoldSection, ScaffoldSectionContent, ScaffoldSectionDetail, -} from 'components/layouts/Scaffold' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { Button } from 'ui' +} from '@/components/layouts/Scaffold' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' export const HIPAA = () => { const { data: organization } = useSelectedOrganizationQuery() diff --git a/apps/studio/components/interfaces/Organization/Documents/SOC2.tsx b/apps/studio/components/interfaces/Organization/Documents/SOC2.tsx index e460e858cd..17867dfd75 100644 --- a/apps/studio/components/interfaces/Organization/Documents/SOC2.tsx +++ b/apps/studio/components/interfaces/Organization/Documents/SOC2.tsx @@ -3,21 +3,21 @@ import { Download } from 'lucide-react' import Link from 'next/link' import { useState } from 'react' import { toast } from 'sonner' +import { Button } from 'ui' +import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' +import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { ScaffoldSection, ScaffoldSectionContent, ScaffoldSectionDetail, -} from 'components/layouts/Scaffold' -import NoPermission from 'components/ui/NoPermission' -import { getDocument } from 'data/documents/document-query' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { Button } from 'ui' -import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' -import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' +} from '@/components/layouts/Scaffold' +import NoPermission from '@/components/ui/NoPermission' +import { getDocument } from '@/data/documents/document-query' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' export const SOC2 = () => { const { data: organization } = useSelectedOrganizationQuery() diff --git a/apps/studio/components/interfaces/Organization/Documents/SecurityQuestionnaire.tsx b/apps/studio/components/interfaces/Organization/Documents/SecurityQuestionnaire.tsx index 7191078651..8e6084c066 100644 --- a/apps/studio/components/interfaces/Organization/Documents/SecurityQuestionnaire.tsx +++ b/apps/studio/components/interfaces/Organization/Documents/SecurityQuestionnaire.tsx @@ -2,20 +2,20 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { Download } from 'lucide-react' import Link from 'next/link' import { toast } from 'sonner' +import { Button } from 'ui' +import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { ScaffoldSection, ScaffoldSectionContent, ScaffoldSectionDetail, -} from 'components/layouts/Scaffold' -import NoPermission from 'components/ui/NoPermission' -import { getDocument } from 'data/documents/document-query' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { Button } from 'ui' -import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' +} from '@/components/layouts/Scaffold' +import NoPermission from '@/components/ui/NoPermission' +import { getDocument } from '@/data/documents/document-query' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' export const SecurityQuestionnaire = () => { const { data: organization } = useSelectedOrganizationQuery() diff --git a/apps/studio/components/interfaces/Organization/Documents/TIA.tsx b/apps/studio/components/interfaces/Organization/Documents/TIA.tsx index eeecc87cc0..9664cc4224 100644 --- a/apps/studio/components/interfaces/Organization/Documents/TIA.tsx +++ b/apps/studio/components/interfaces/Organization/Documents/TIA.tsx @@ -1,13 +1,13 @@ import { Download } from 'lucide-react' +import { Button } from 'ui' import { ScaffoldSection, ScaffoldSectionContent, ScaffoldSectionDetail, -} from 'components/layouts/Scaffold' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { Button } from 'ui' +} from '@/components/layouts/Scaffold' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' export const TIA = () => { const { data: organization } = useSelectedOrganizationQuery() diff --git a/apps/studio/components/interfaces/Organization/GeneralSettings/AIOptInLevelSelector.tsx b/apps/studio/components/interfaces/Organization/GeneralSettings/AIOptInLevelSelector.tsx index fd766e97cf..362dce7839 100644 --- a/apps/studio/components/interfaces/Organization/GeneralSettings/AIOptInLevelSelector.tsx +++ b/apps/studio/components/interfaces/Organization/GeneralSettings/AIOptInLevelSelector.tsx @@ -1,11 +1,11 @@ import { ReactNode } from 'react' import { Control } from 'react-hook-form' - -import { AIOptInFormValues } from 'hooks/forms/useAIOptInForm' import { FormField_Shadcn_, RadioGroup_Shadcn_, RadioGroupItem_Shadcn_ } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' + import { OptInToOpenAIToggle } from './OptInToOpenAIToggle' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' +import { AIOptInFormValues } from '@/hooks/forms/useAIOptInForm' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' interface AIOptInLevelSelectorProps { control: Control diff --git a/apps/studio/components/interfaces/Organization/GeneralSettings/DataPrivacyForm.tsx b/apps/studio/components/interfaces/Organization/GeneralSettings/DataPrivacyForm.tsx index fad4e87624..0eee0ddd16 100644 --- a/apps/studio/components/interfaces/Organization/GeneralSettings/DataPrivacyForm.tsx +++ b/apps/studio/components/interfaces/Organization/GeneralSettings/DataPrivacyForm.tsx @@ -1,11 +1,11 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useEffect } from 'react' - -import { FormActions } from 'components/ui/Forms/FormActions' -import { useAIOptInForm } from 'hooks/forms/useAIOptInForm' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { Card, CardContent, CardFooter, Form_Shadcn_ } from 'ui' + import { AIOptInLevelSelector } from './AIOptInLevelSelector' +import { FormActions } from '@/components/ui/Forms/FormActions' +import { useAIOptInForm } from '@/hooks/forms/useAIOptInForm' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' export const DataPrivacyForm = () => { const { form, onSubmit, isUpdating, currentOptInLevel } = useAIOptInForm() diff --git a/apps/studio/components/interfaces/Organization/GeneralSettings/DeleteOrganizationButton.tsx b/apps/studio/components/interfaces/Organization/GeneralSettings/DeleteOrganizationButton.tsx index 759774d326..0ab8ff62e2 100644 --- a/apps/studio/components/interfaces/Organization/GeneralSettings/DeleteOrganizationButton.tsx +++ b/apps/studio/components/interfaces/Organization/GeneralSettings/DeleteOrganizationButton.tsx @@ -1,15 +1,15 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { LOCAL_STORAGE_KEYS } from 'common' import { useRouter } from 'next/router' import { useState } from 'react' import { toast } from 'sonner' -import { LOCAL_STORAGE_KEYS } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useOrganizationDeleteMutation } from 'data/organizations/organization-delete-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { TextConfirmModal } from 'components/ui/TextConfirmModalWrapper' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { TextConfirmModal } from '@/components/ui/TextConfirmModalWrapper' +import { useOrganizationDeleteMutation } from '@/data/organizations/organization-delete-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' export const DeleteOrganizationButton = () => { const router = useRouter() diff --git a/apps/studio/components/interfaces/Organization/GeneralSettings/GeneralSettings.tsx b/apps/studio/components/interfaces/Organization/GeneralSettings/GeneralSettings.tsx index dd76e2e0d4..7c41c56179 100644 --- a/apps/studio/components/interfaces/Organization/GeneralSettings/GeneralSettings.tsx +++ b/apps/studio/components/interfaces/Organization/GeneralSettings/GeneralSettings.tsx @@ -1,5 +1,3 @@ -import { NoProjectsOnPaidOrgInfo } from 'components/interfaces/Billing/NoProjectsOnPaidOrgInfo' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import { PageSection, PageSectionContent, @@ -7,10 +5,12 @@ import { PageSectionSummary, PageSectionTitle, } from 'ui-patterns/PageSection' -import { OrganizationDeletePanel } from './OrganizationDeletePanel' import { DataPrivacyForm } from './DataPrivacyForm' +import { OrganizationDeletePanel } from './OrganizationDeletePanel' import { OrganizationDetailsForm } from './OrganizationDetailsForm' +import { NoProjectsOnPaidOrgInfo } from '@/components/interfaces/Billing/NoProjectsOnPaidOrgInfo' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' export const GeneralSettings = () => { const organizationDeletionEnabled = useIsFeatureEnabled('organizations:delete') diff --git a/apps/studio/components/interfaces/Organization/GeneralSettings/OptInToOpenAIToggle.tsx b/apps/studio/components/interfaces/Organization/GeneralSettings/OptInToOpenAIToggle.tsx index 0cee6710c1..ddbf50201e 100644 --- a/apps/studio/components/interfaces/Organization/GeneralSettings/OptInToOpenAIToggle.tsx +++ b/apps/studio/components/interfaces/Organization/GeneralSettings/OptInToOpenAIToggle.tsx @@ -1,5 +1,3 @@ -import { InlineLink } from 'components/ui/InlineLink' - import { Button, Dialog, @@ -10,6 +8,8 @@ import { DialogTrigger, } from 'ui' +import { InlineLink } from '@/components/ui/InlineLink' + export const OptInToOpenAIToggle = () => { return ( diff --git a/apps/studio/components/interfaces/Organization/GeneralSettings/OrganizationDeletePanel.tsx b/apps/studio/components/interfaces/Organization/GeneralSettings/OrganizationDeletePanel.tsx index a9ddf0d076..e2deae29c4 100644 --- a/apps/studio/components/interfaces/Organization/GeneralSettings/OrganizationDeletePanel.tsx +++ b/apps/studio/components/interfaces/Organization/GeneralSettings/OrganizationDeletePanel.tsx @@ -1,8 +1,9 @@ -import PartnerManagedResource from 'components/ui/PartnerManagedResource' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { MANAGED_BY } from 'lib/constants/infrastructure' import { Admonition } from 'ui-patterns' + import { DeleteOrganizationButton } from './DeleteOrganizationButton' +import PartnerManagedResource from '@/components/ui/PartnerManagedResource' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { MANAGED_BY } from '@/lib/constants/infrastructure' export const OrganizationDeletePanel = () => { const { data: selectedOrganization } = useSelectedOrganizationQuery() diff --git a/apps/studio/components/interfaces/Organization/GeneralSettings/OrganizationDetailsForm.tsx b/apps/studio/components/interfaces/Organization/GeneralSettings/OrganizationDetailsForm.tsx index 7a4326e80b..ee936ab620 100644 --- a/apps/studio/components/interfaces/Organization/GeneralSettings/OrganizationDetailsForm.tsx +++ b/apps/studio/components/interfaces/Organization/GeneralSettings/OrganizationDetailsForm.tsx @@ -2,15 +2,9 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useQueryClient } from '@tanstack/react-query' import { useParams } from 'common' -import { FormActions } from 'components/ui/Forms/FormActions' -import { useOrganizationUpdateMutation } from 'data/organizations/organization-update-mutation' -import { invalidateOrganizationsQuery } from 'data/organizations/organizations-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { useEffect } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import type { ResponseError } from 'types' import { Card, CardContent, @@ -24,6 +18,13 @@ import { Input } from 'ui-patterns/DataInputs/Input' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import * as z from 'zod' +import { FormActions } from '@/components/ui/Forms/FormActions' +import { useOrganizationUpdateMutation } from '@/data/organizations/organization-update-mutation' +import { invalidateOrganizationsQuery } from '@/data/organizations/organizations-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import type { ResponseError } from '@/types' + const OrgDetailsSchema = z.object({ name: z.string().min(1, 'Organization name is required'), }) diff --git a/apps/studio/components/interfaces/Organization/HeaderBanner.tsx b/apps/studio/components/interfaces/Organization/HeaderBanner.tsx index ed7f8d7fe4..8028da89e3 100644 --- a/apps/studio/components/interfaces/Organization/HeaderBanner.tsx +++ b/apps/studio/components/interfaces/Organization/HeaderBanner.tsx @@ -1,10 +1,10 @@ import { AnimatePresence, motion } from 'framer-motion' -import type { ReactNode } from 'react' - -import { useOrganizationRestrictions } from 'hooks/misc/useOrganizationRestrictions' import { XIcon } from 'lucide-react' +import type { ReactNode } from 'react' import { Button, cn, CriticalIcon, WarningIcon } from 'ui' +import { useOrganizationRestrictions } from '@/hooks/misc/useOrganizationRestrictions' + const bannerMotionProps = { initial: { height: 0, opacity: 0 }, animate: { height: 'auto', opacity: 1 }, diff --git a/apps/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx b/apps/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx index 72b34b486f..b8b94310f1 100644 --- a/apps/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx +++ b/apps/studio/components/interfaces/Organization/IntegrationSettings/IntegrationSettings.tsx @@ -1,10 +1,14 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useRouter } from 'next/router' import { useCallback } from 'react' import { toast } from 'sonner' +import { GenericSkeletonLoader } from 'ui-patterns' -import { EmptyIntegrationConnection } from 'components/interfaces/Integrations/VercelGithub/IntegrationPanels' -import { Markdown } from 'components/interfaces/Markdown' -import { VercelSection } from 'components/interfaces/Settings/Integrations/VercelIntegration/VercelSection' +import { IntegrationConnectionItem } from '../../Integrations/VercelGithub/IntegrationConnection' +import SidePanelVercelProjectLinker from './SidePanelVercelProjectLinker' +import { EmptyIntegrationConnection } from '@/components/interfaces/Integrations/VercelGithub/IntegrationPanels' +import { Markdown } from '@/components/interfaces/Markdown' +import { VercelSection } from '@/components/interfaces/Settings/Integrations/VercelIntegration/VercelSection' import { ScaffoldContainer, ScaffoldContainerLegacy, @@ -13,25 +17,21 @@ import { ScaffoldSectionContent, ScaffoldSectionDetail, ScaffoldTitle, -} from 'components/layouts/Scaffold' -import NoPermission from 'components/ui/NoPermission' -import { useGitHubAuthorizationQuery } from 'data/integrations/github-authorization-query' -import { useGitHubConnectionDeleteMutation } from 'data/integrations/github-connection-delete-mutation' -import { useGitHubConnectionsQuery } from 'data/integrations/github-connections-query' -import type { IntegrationProjectConnection } from 'data/integrations/integrations.types' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { BASE_PATH } from 'lib/constants' +} from '@/components/layouts/Scaffold' +import NoPermission from '@/components/ui/NoPermission' +import { useGitHubAuthorizationQuery } from '@/data/integrations/github-authorization-query' +import { useGitHubConnectionDeleteMutation } from '@/data/integrations/github-connection-delete-mutation' +import { useGitHubConnectionsQuery } from '@/data/integrations/github-connections-query' +import type { IntegrationProjectConnection } from '@/data/integrations/integrations.types' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { BASE_PATH } from '@/lib/constants' import { GITHUB_INTEGRATION_INSTALLATION_URL, GITHUB_INTEGRATION_REVOKE_AUTHORIZATION_URL, -} from 'lib/github' -import { useRouter } from 'next/router' -import { useSidePanelsStateSnapshot } from 'state/side-panels' -import { GenericSkeletonLoader } from 'ui-patterns' -import { IntegrationConnectionItem } from '../../Integrations/VercelGithub/IntegrationConnection' -import SidePanelVercelProjectLinker from './SidePanelVercelProjectLinker' +} from '@/lib/github' +import { useSidePanelsStateSnapshot } from '@/state/side-panels' const IntegrationImageHandler = ({ title }: { title: 'vercel' | 'github' }) => { return ( diff --git a/apps/studio/components/interfaces/Organization/IntegrationSettings/SidePanelVercelProjectLinker.tsx b/apps/studio/components/interfaces/Organization/IntegrationSettings/SidePanelVercelProjectLinker.tsx index 4897a23b5c..835015c428 100644 --- a/apps/studio/components/interfaces/Organization/IntegrationSettings/SidePanelVercelProjectLinker.tsx +++ b/apps/studio/components/interfaces/Organization/IntegrationSettings/SidePanelVercelProjectLinker.tsx @@ -1,22 +1,22 @@ +import { useParams } from 'common' import { keyBy } from 'lodash' import { useCallback, useMemo } from 'react' import { toast } from 'sonner' +import { SidePanel } from 'ui' -import { useParams } from 'common' -import { ENV_VAR_RAW_KEYS } from 'components/interfaces/Integrations/Vercel/Integrations-Vercel.constants' +import { ENV_VAR_RAW_KEYS } from '@/components/interfaces/Integrations/Vercel/Integrations-Vercel.constants' import ProjectLinker, { ForeignProject, -} from 'components/interfaces/Integrations/VercelGithub/ProjectLinker' -import { Markdown } from 'components/interfaces/Markdown' -import { vercelIcon } from 'components/to-be-cleaned/ListIcons' -import { useOrgIntegrationsQuery } from 'data/integrations/integrations-query-org-only' -import { useIntegrationVercelConnectionsCreateMutation } from 'data/integrations/integrations-vercel-connections-create-mutation' -import { useVercelProjectsQuery } from 'data/integrations/integrations-vercel-projects-query' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { BASE_PATH } from 'lib/constants' -import { EMPTY_ARR } from 'lib/void' -import { useSidePanelsStateSnapshot } from 'state/side-panels' -import { SidePanel } from 'ui' +} from '@/components/interfaces/Integrations/VercelGithub/ProjectLinker' +import { Markdown } from '@/components/interfaces/Markdown' +import { vercelIcon } from '@/components/to-be-cleaned/ListIcons' +import { useOrgIntegrationsQuery } from '@/data/integrations/integrations-query-org-only' +import { useIntegrationVercelConnectionsCreateMutation } from '@/data/integrations/integrations-vercel-connections-create-mutation' +import { useVercelProjectsQuery } from '@/data/integrations/integrations-vercel-projects-query' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { BASE_PATH } from '@/lib/constants' +import { EMPTY_ARR } from '@/lib/void' +import { useSidePanelsStateSnapshot } from '@/state/side-panels' const VERCEL_ICON = ( diff --git a/apps/studio/components/interfaces/Organization/InvoicesSettings/InvoicePayButton.tsx b/apps/studio/components/interfaces/Organization/InvoicesSettings/InvoicePayButton.tsx index 7e8f28575c..ac587ac19c 100644 --- a/apps/studio/components/interfaces/Organization/InvoicesSettings/InvoicePayButton.tsx +++ b/apps/studio/components/interfaces/Organization/InvoicesSettings/InvoicePayButton.tsx @@ -1,7 +1,8 @@ -import { useInvoicePaymentLinkGetMutation } from 'data/invoices/invoice-payment-link-mutation' import { toast } from 'sonner' import { Button } from 'ui' +import { useInvoicePaymentLinkGetMutation } from '@/data/invoices/invoice-payment-link-mutation' + interface InvoicePayButtonProps { slug?: string invoiceId: string diff --git a/apps/studio/components/interfaces/Organization/InvoicesSettings/InvoicesSection.tsx b/apps/studio/components/interfaces/Organization/InvoicesSettings/InvoicesSection.tsx index 0a077ee4aa..ec5ad3c66a 100644 --- a/apps/studio/components/interfaces/Organization/InvoicesSettings/InvoicesSection.tsx +++ b/apps/studio/components/interfaces/Organization/InvoicesSettings/InvoicesSection.tsx @@ -1,12 +1,13 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' + +import { InvoicesSettings } from './InvoicesSettings' import { ScaffoldSection, ScaffoldSectionContent, ScaffoldSectionDetail, -} from 'components/layouts/Scaffold' -import NoPermission from 'components/ui/NoPermission' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { InvoicesSettings } from './InvoicesSettings' +} from '@/components/layouts/Scaffold' +import NoPermission from '@/components/ui/NoPermission' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' export const InvoicesSection = () => { const { isSuccess: isPermissionsLoaded, can: canReadInvoices } = useAsyncCheckPermissions( diff --git a/apps/studio/components/interfaces/Organization/InvoicesSettings/InvoicesSettings.tsx b/apps/studio/components/interfaces/Organization/InvoicesSettings/InvoicesSettings.tsx index 90750e46b4..53c704ed01 100644 --- a/apps/studio/components/interfaces/Organization/InvoicesSettings/InvoicesSettings.tsx +++ b/apps/studio/components/interfaces/Organization/InvoicesSettings/InvoicesSettings.tsx @@ -1,35 +1,35 @@ -import InvoiceStatusBadge from 'components/interfaces/Billing/InvoiceStatusBadge' -import { InvoiceStatus } from 'components/interfaces/Billing/Invoices.types' -import AlertError from 'components/ui/AlertError' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import PartnerManagedResource from 'components/ui/PartnerManagedResource' -import { getInvoice } from 'data/invoices/invoice-query' -import { getInvoiceReceipt } from 'data/invoices/invoice-receipt-query' -import { useInvoicesCountQuery } from 'data/invoices/invoices-count-query' -import { useInvoicesQuery } from 'data/invoices/invoices-query' import dayjs from 'dayjs' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { MANAGED_BY } from 'lib/constants/infrastructure' -import { formatCurrency } from 'lib/helpers' import { ChevronLeft, ChevronRight, FileText, Receipt, ScrollText } from 'lucide-react' import { useEffect, useState } from 'react' import { toast } from 'sonner' -import { Organization } from 'types/base' import { Button, Card, CardFooter, + cn, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, - cn, } from 'ui' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import InvoicePayButton from './InvoicePayButton' +import { InvoiceStatus } from '@/components/interfaces/Billing/Invoices.types' +import InvoiceStatusBadge from '@/components/interfaces/Billing/InvoiceStatusBadge' +import AlertError from '@/components/ui/AlertError' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import PartnerManagedResource from '@/components/ui/PartnerManagedResource' +import { getInvoice } from '@/data/invoices/invoice-query' +import { getInvoiceReceipt } from '@/data/invoices/invoice-receipt-query' +import { useInvoicesCountQuery } from '@/data/invoices/invoices-count-query' +import { useInvoicesQuery } from '@/data/invoices/invoices-query' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { MANAGED_BY } from '@/lib/constants/infrastructure' +import { formatCurrency } from '@/lib/helpers' +import { Organization } from '@/types/base' const PAGE_LIMIT = 5 diff --git a/apps/studio/components/interfaces/Organization/NewOrg/NewOrgForm.tsx b/apps/studio/components/interfaces/Organization/NewOrg/NewOrgForm.tsx index b8e4ccce9f..f9644e240d 100644 --- a/apps/studio/components/interfaces/Organization/NewOrg/NewOrgForm.tsx +++ b/apps/studio/components/interfaces/Organization/NewOrg/NewOrgForm.tsx @@ -2,6 +2,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { Elements } from '@stripe/react-stripe-js' import type { PaymentIntentResult, PaymentMethod, StripeElementsOptions } from '@stripe/stripe-js' import { loadStripe } from '@stripe/stripe-js' +import { LOCAL_STORAGE_KEYS } from 'common' import { groupBy } from 'lodash' import { HelpCircle } from 'lucide-react' import { useTheme } from 'next-themes' @@ -10,28 +11,6 @@ import { parseAsBoolean, parseAsString, useQueryStates } from 'nuqs' import { useEffect, useMemo, useRef, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' - -import { LOCAL_STORAGE_KEYS } from 'common' -import { getStripeElementsAppearanceOptions } from 'components/interfaces/Billing/Payment/Payment.utils' -import { PaymentConfirmation } from 'components/interfaces/Billing/Payment/PaymentConfirmation' -import { - NewPaymentMethodElement, - type PaymentMethodElementRef, -} from 'components/interfaces/Billing/Payment/PaymentMethods/NewPaymentMethodElement' -import SpendCapModal from 'components/interfaces/Billing/SpendCapModal' -import { InlineLink } from 'components/ui/InlineLink' -import Panel from 'components/ui/Panel' -import { useOrganizationCreateMutation } from 'data/organizations/organization-create-mutation' -import { useOrganizationsQuery } from 'data/organizations/organizations-query' -import type { CustomerAddress, CustomerTaxId } from 'data/organizations/types' -import { useProjectsInfiniteQuery } from 'data/projects/projects-infinite-query' -import { SetupIntentResponse } from 'data/stripe/setup-intent-mutation' -import { useConfirmPendingSubscriptionCreateMutation } from 'data/subscriptions/org-subscription-confirm-pending-create' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { PRICING_TIER_LABELS_ORG, STRIPE_PUBLIC_KEY } from 'lib/constants' -import { useProfile } from 'lib/profile' import { Button, Form_Shadcn_, @@ -46,7 +25,28 @@ import { Switch, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import { z } from 'zod' + import { UpgradeExistingOrganizationCallout } from './UpgradeExistingOrganizationCallout' +import { getStripeElementsAppearanceOptions } from '@/components/interfaces/Billing/Payment/Payment.utils' +import { PaymentConfirmation } from '@/components/interfaces/Billing/Payment/PaymentConfirmation' +import { + NewPaymentMethodElement, + type PaymentMethodElementRef, +} from '@/components/interfaces/Billing/Payment/PaymentMethods/NewPaymentMethodElement' +import SpendCapModal from '@/components/interfaces/Billing/SpendCapModal' +import { InlineLink } from '@/components/ui/InlineLink' +import Panel from '@/components/ui/Panel' +import { useOrganizationCreateMutation } from '@/data/organizations/organization-create-mutation' +import { useOrganizationsQuery } from '@/data/organizations/organizations-query' +import type { CustomerAddress, CustomerTaxId } from '@/data/organizations/types' +import { useProjectsInfiniteQuery } from '@/data/projects/projects-infinite-query' +import { SetupIntentResponse } from '@/data/stripe/setup-intent-mutation' +import { useConfirmPendingSubscriptionCreateMutation } from '@/data/subscriptions/org-subscription-confirm-pending-create' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { PRICING_TIER_LABELS_ORG, STRIPE_PUBLIC_KEY } from '@/lib/constants' +import { useProfile } from '@/lib/profile' const ORG_KIND_TYPES = { PERSONAL: 'Personal', diff --git a/apps/studio/components/interfaces/Organization/NewOrg/UpgradeExistingOrganizationCallout.tsx b/apps/studio/components/interfaces/Organization/NewOrg/UpgradeExistingOrganizationCallout.tsx index f8012df79c..54ea99da6b 100644 --- a/apps/studio/components/interfaces/Organization/NewOrg/UpgradeExistingOrganizationCallout.tsx +++ b/apps/studio/components/interfaces/Organization/NewOrg/UpgradeExistingOrganizationCallout.tsx @@ -1,8 +1,9 @@ -import { InlineLink } from 'components/ui/InlineLink' -import Panel from 'components/ui/Panel' -import { DOCS_URL } from 'lib/constants' import { Admonition } from 'ui-patterns' +import { InlineLink } from '@/components/ui/InlineLink' +import Panel from '@/components/ui/Panel' +import { DOCS_URL } from '@/lib/constants' + export const UpgradeExistingOrganizationCallout = () => { return ( diff --git a/apps/studio/components/interfaces/Organization/OAuthApps/AuthorizedAppRow.tsx b/apps/studio/components/interfaces/Organization/OAuthApps/AuthorizedAppRow.tsx index 52d6e95461..bae93810eb 100644 --- a/apps/studio/components/interfaces/Organization/OAuthApps/AuthorizedAppRow.tsx +++ b/apps/studio/components/interfaces/Organization/OAuthApps/AuthorizedAppRow.tsx @@ -1,10 +1,10 @@ import { Trash } from 'lucide-react' - -import CopyButton from 'components/ui/CopyButton' -import type { AuthorizedApp } from 'data/oauth/authorized-apps-query' import { Button, TableCell, TableRow } from 'ui' import { TimestampInfo } from 'ui-patterns' +import CopyButton from '@/components/ui/CopyButton' +import type { AuthorizedApp } from '@/data/oauth/authorized-apps-query' + export interface AuthorizedAppRowProps { app: AuthorizedApp onSelectRevoke: () => void diff --git a/apps/studio/components/interfaces/Organization/OAuthApps/DeleteAppModal.tsx b/apps/studio/components/interfaces/Organization/OAuthApps/DeleteAppModal.tsx index ef332d21da..2395e9fe35 100644 --- a/apps/studio/components/interfaces/Organization/OAuthApps/DeleteAppModal.tsx +++ b/apps/studio/components/interfaces/Organization/OAuthApps/DeleteAppModal.tsx @@ -1,12 +1,12 @@ +import { useParams } from 'common' import { Lock } from 'lucide-react' import { toast } from 'sonner' - -import { useParams } from 'common' -import { useOAuthAppDeleteMutation } from 'data/oauth/oauth-app-delete-mutation' -import type { OAuthApp } from 'data/oauth/oauth-apps-query' import { Modal } from 'ui' import { Admonition } from 'ui-patterns' +import { useOAuthAppDeleteMutation } from '@/data/oauth/oauth-app-delete-mutation' +import type { OAuthApp } from '@/data/oauth/oauth-apps-query' + export interface DeleteAppModalProps { selectedApp?: OAuthApp onClose: () => void diff --git a/apps/studio/components/interfaces/Organization/OAuthApps/OAuthAppRow.tsx b/apps/studio/components/interfaces/Organization/OAuthApps/OAuthAppRow.tsx index fe26aca523..67e531186f 100644 --- a/apps/studio/components/interfaces/Organization/OAuthApps/OAuthAppRow.tsx +++ b/apps/studio/components/interfaces/Organization/OAuthApps/OAuthAppRow.tsx @@ -1,9 +1,5 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { Edit, MoreVertical, Trash } from 'lucide-react' - -import CopyButton from 'components/ui/CopyButton' -import type { OAuthApp } from 'data/oauth/oauth-apps-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { Button, DropdownMenu, @@ -19,6 +15,10 @@ import { } from 'ui' import { TimestampInfo } from 'ui-patterns' +import CopyButton from '@/components/ui/CopyButton' +import type { OAuthApp } from '@/data/oauth/oauth-apps-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' + export interface OAuthAppRowProps { app: OAuthApp onSelectEdit: () => void diff --git a/apps/studio/components/interfaces/Organization/OAuthApps/OAuthApps.tsx b/apps/studio/components/interfaces/Organization/OAuthApps/OAuthApps.tsx index 1718168386..2bc700e4b1 100644 --- a/apps/studio/components/interfaces/Organization/OAuthApps/OAuthApps.tsx +++ b/apps/studio/components/interfaces/Organization/OAuthApps/OAuthApps.tsx @@ -1,13 +1,5 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import CopyButton from 'components/ui/CopyButton' -import NoPermission from 'components/ui/NoPermission' -import { AuthorizedApp, useAuthorizedAppsQuery } from 'data/oauth/authorized-apps-query' -import { OAuthAppCreateResponse } from 'data/oauth/oauth-app-create-mutation' -import { OAuthApp, useOAuthAppsQuery } from 'data/oauth/oauth-apps-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { Check, X } from 'lucide-react' import { useMemo, useState } from 'react' import { @@ -39,6 +31,14 @@ import { DeleteAppModal } from './DeleteAppModal' import { OAuthAppRow } from './OAuthAppRow' import { PublishAppSidePanel } from './PublishAppSidePanel' import { RevokeAppModal } from './RevokeAppModal' +import AlertError from '@/components/ui/AlertError' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import CopyButton from '@/components/ui/CopyButton' +import NoPermission from '@/components/ui/NoPermission' +import { AuthorizedApp, useAuthorizedAppsQuery } from '@/data/oauth/authorized-apps-query' +import { OAuthAppCreateResponse } from '@/data/oauth/oauth-app-create-mutation' +import { OAuthApp, useOAuthAppsQuery } from '@/data/oauth/oauth-apps-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' // [Joshen] Note on nav UX // Kang Ming mentioned that it might be better to split Published Apps and Authorized Apps into 2 separate tabs diff --git a/apps/studio/components/interfaces/Organization/OAuthApps/OAuthSecrets/OAuthSecrets.tsx b/apps/studio/components/interfaces/Organization/OAuthApps/OAuthSecrets/OAuthSecrets.tsx index f41375d884..e4a6492000 100644 --- a/apps/studio/components/interfaces/Organization/OAuthApps/OAuthSecrets/OAuthSecrets.tsx +++ b/apps/studio/components/interfaces/Organization/OAuthApps/OAuthSecrets/OAuthSecrets.tsx @@ -1,16 +1,16 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' -import { useState } from 'react' - import { useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { InlineLink } from 'components/ui/InlineLink' -import { useClientSecretCreateMutation } from 'data/oauth-secrets/client-secret-create-mutation' -import { CreatedSecret, useClientSecretsQuery } from 'data/oauth-secrets/client-secrets-query' -import { OAuthApp } from 'data/oauth/oauth-apps-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { DOCS_URL } from 'lib/constants' +import { useState } from 'react' import { Alert_Shadcn_, AlertTitle_Shadcn_, InfoIcon } from 'ui' + import { SecretRow } from './SecretRow' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { InlineLink } from '@/components/ui/InlineLink' +import { useClientSecretCreateMutation } from '@/data/oauth-secrets/client-secret-create-mutation' +import { CreatedSecret, useClientSecretsQuery } from '@/data/oauth-secrets/client-secrets-query' +import { OAuthApp } from '@/data/oauth/oauth-apps-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { DOCS_URL } from '@/lib/constants' interface Props { selectedApp?: OAuthApp diff --git a/apps/studio/components/interfaces/Organization/OAuthApps/OAuthSecrets/SecretRow.tsx b/apps/studio/components/interfaces/Organization/OAuthApps/OAuthSecrets/SecretRow.tsx index 05263619f5..f0663797b4 100644 --- a/apps/studio/components/interfaces/Organization/OAuthApps/OAuthSecrets/SecretRow.tsx +++ b/apps/studio/components/interfaces/Organization/OAuthApps/OAuthSecrets/SecretRow.tsx @@ -1,19 +1,19 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import dayjs from 'dayjs' import { Check, Key, Trash } from 'lucide-react' import { useState } from 'react' import { toast } from 'sonner' - -import { useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import CopyButton from 'components/ui/CopyButton' -import { useClientSecretDeleteMutation } from 'data/oauth-secrets/client-secret-delete-mutation' -import { Secret, useClientSecretsQuery } from 'data/oauth-secrets/client-secrets-query' -import { useOrganizationMembersQuery } from 'data/organizations/organization-members-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { cn } from 'ui' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import CopyButton from '@/components/ui/CopyButton' +import { useClientSecretDeleteMutation } from '@/data/oauth-secrets/client-secret-delete-mutation' +import { Secret, useClientSecretsQuery } from '@/data/oauth-secrets/client-secrets-query' +import { useOrganizationMembersQuery } from '@/data/organizations/organization-members-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' + export interface SecretRowProps { secret: Secret appId?: string diff --git a/apps/studio/components/interfaces/Organization/OAuthApps/PublishAppSidePanel/Scopes.tsx b/apps/studio/components/interfaces/Organization/OAuthApps/PublishAppSidePanel/Scopes.tsx index 7466baa694..7b9108ef2b 100644 --- a/apps/studio/components/interfaces/Organization/OAuthApps/PublishAppSidePanel/Scopes.tsx +++ b/apps/studio/components/interfaces/Organization/OAuthApps/PublishAppSidePanel/Scopes.tsx @@ -1,7 +1,6 @@ import { OAuthScope } from '@supabase/shared-types/out/constants' import { ChevronDown } from 'lucide-react' import { Dispatch, PropsWithChildren, SetStateAction } from 'react' - import { Button, DropdownMenu, @@ -11,6 +10,7 @@ import { DropdownMenuSeparator, DropdownMenuTrigger, } from 'ui' + import { PERMISSIONS_DESCRIPTIONS } from '../OAuthApps.constants' const ScopeDropdownCheckboxItem = ({ diff --git a/apps/studio/components/interfaces/Organization/OAuthApps/PublishAppSidePanel/index.tsx b/apps/studio/components/interfaces/Organization/OAuthApps/PublishAppSidePanel/index.tsx index adadbb346d..7a83ad8c4d 100644 --- a/apps/studio/components/interfaces/Organization/OAuthApps/PublishAppSidePanel/index.tsx +++ b/apps/studio/components/interfaces/Organization/OAuthApps/PublishAppSidePanel/index.tsx @@ -1,22 +1,12 @@ import type { OAuthScope } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { Edit, Upload } from 'lucide-react' import { ChangeEvent, useEffect, useRef, useState } from 'react' import { toast } from 'sonner' - -import { useParams } from 'common' -import { DocsButton } from 'components/ui/DocsButton' -import { - OAuthAppCreateResponse, - useOAuthAppCreateMutation, -} from 'data/oauth/oauth-app-create-mutation' -import { useOAuthAppUpdateMutation } from 'data/oauth/oauth-app-update-mutation' -import type { OAuthApp } from 'data/oauth/oauth-apps-query' -import { DOCS_URL } from 'lib/constants' -import { isValidHttpUrl, uuidv4 } from 'lib/helpers' -import { uploadAttachment } from 'lib/upload' import { Badge, Button, + cn, DropdownMenu, DropdownMenuContent, DropdownMenuItem, @@ -25,11 +15,21 @@ import { Input, Modal, SidePanel, - cn, } from 'ui' + import { AuthorizeRequesterDetails } from '../AuthorizeRequesterDetails' import { OAuthSecrets } from '../OAuthSecrets/OAuthSecrets' import { ScopesPanel } from './Scopes' +import { DocsButton } from '@/components/ui/DocsButton' +import { + OAuthAppCreateResponse, + useOAuthAppCreateMutation, +} from '@/data/oauth/oauth-app-create-mutation' +import { useOAuthAppUpdateMutation } from '@/data/oauth/oauth-app-update-mutation' +import type { OAuthApp } from '@/data/oauth/oauth-apps-query' +import { DOCS_URL } from '@/lib/constants' +import { isValidHttpUrl, uuidv4 } from '@/lib/helpers' +import { uploadAttachment } from '@/lib/upload' export interface PublishAppSidePanelProps { visible: boolean diff --git a/apps/studio/components/interfaces/Organization/OAuthApps/RevokeAppModal.tsx b/apps/studio/components/interfaces/Organization/OAuthApps/RevokeAppModal.tsx index e3cf25ef3a..21396d3f5e 100644 --- a/apps/studio/components/interfaces/Organization/OAuthApps/RevokeAppModal.tsx +++ b/apps/studio/components/interfaces/Organization/OAuthApps/RevokeAppModal.tsx @@ -2,11 +2,11 @@ import { useParams } from 'common' import { Lock } from 'lucide-react' import { toast } from 'sonner' import { Modal } from 'ui' - -import { useAuthorizedAppRevokeMutation } from 'data/oauth/authorized-app-revoke-mutation' -import type { AuthorizedApp } from 'data/oauth/authorized-apps-query' import { Admonition } from 'ui-patterns' +import { useAuthorizedAppRevokeMutation } from '@/data/oauth/authorized-app-revoke-mutation' +import type { AuthorizedApp } from '@/data/oauth/authorized-apps-query' + export interface RevokeAppModalProps { selectedApp?: AuthorizedApp onClose: () => void diff --git a/apps/studio/components/interfaces/Organization/OrgNotFound.tsx b/apps/studio/components/interfaces/Organization/OrgNotFound.tsx index 5adbd66ad3..ae68260ed6 100644 --- a/apps/studio/components/interfaces/Organization/OrgNotFound.tsx +++ b/apps/studio/components/interfaces/Organization/OrgNotFound.tsx @@ -1,7 +1,8 @@ -import { useOrganizationsQuery } from 'data/organizations/organizations-query' import { Skeleton } from 'ui' import { Admonition } from 'ui-patterns/admonition' + import { OrganizationCard } from './OrganizationCard' +import { useOrganizationsQuery } from '@/data/organizations/organizations-query' export const OrgNotFound = ({ slug }: { slug?: string }) => { const { diff --git a/apps/studio/components/interfaces/Organization/OrganizationCard.tsx b/apps/studio/components/interfaces/Organization/OrganizationCard.tsx index 5dd12a125b..49a0b4bad1 100644 --- a/apps/studio/components/interfaces/Organization/OrganizationCard.tsx +++ b/apps/studio/components/interfaces/Organization/OrganizationCard.tsx @@ -1,12 +1,13 @@ import { useIsMFAEnabled } from 'common' -import { ActionCard } from 'components/ui/ActionCard' -import { useOrgProjectsInfiniteQuery } from 'data/projects/org-projects-infinite-query' import { Boxes, Lock } from 'lucide-react' import Link from 'next/link' import { Fragment } from 'react' -import type { Organization } from 'types' import { cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' +import { ActionCard } from '@/components/ui/ActionCard' +import { useOrgProjectsInfiniteQuery } from '@/data/projects/org-projects-infinite-query' +import type { Organization } from '@/types' + export const OrganizationCard = ({ organization, href, diff --git a/apps/studio/components/interfaces/Organization/PrivateApps/Apps/Apps.utils.test.ts b/apps/studio/components/interfaces/Organization/PrivateApps/Apps/Apps.utils.test.ts index 57dadb6f80..e3bdc55040 100644 --- a/apps/studio/components/interfaces/Organization/PrivateApps/Apps/Apps.utils.test.ts +++ b/apps/studio/components/interfaces/Organization/PrivateApps/Apps/Apps.utils.test.ts @@ -1,4 +1,5 @@ import { describe, expect, it, vi } from 'vitest' + import type { PrivateApp } from '../PrivateApps.types' import type { AppsSort } from './Apps.types' import { handleSortChange, sortApps } from './Apps.utils' diff --git a/apps/studio/components/interfaces/Organization/PrivateApps/Apps/AppsList/AppsList.tsx b/apps/studio/components/interfaces/Organization/PrivateApps/Apps/AppsList/AppsList.tsx index fef5325357..c65e410c13 100644 --- a/apps/studio/components/interfaces/Organization/PrivateApps/Apps/AppsList/AppsList.tsx +++ b/apps/studio/components/interfaces/Organization/PrivateApps/Apps/AppsList/AppsList.tsx @@ -1,19 +1,19 @@ -import { usePlatformAppDeleteMutation } from 'data/platform-apps/platform-app-delete-mutation' -import { usePlatformAppInstallationDeleteMutation } from 'data/platform-apps/platform-app-installation-delete-mutation' import { AppWindow, Plus } from 'lucide-react' import { useMemo, useState } from 'react' import { toast } from 'sonner' import { Button } from 'ui' import { EmptyStatePresentational } from 'ui-patterns' -import { PrivateApp, usePrivateApps } from '../../PrivateAppsContext' import { PromoteInstallationModal } from '../../Installations/PromoteInstallationModal' +import { PrivateApp, usePrivateApps } from '../../PrivateAppsContext' import type { AppsSort } from '../Apps.types' import { handleSortChange, sortApps } from '../Apps.utils' import { DeleteAppModal } from '../DeleteAppModal' import { ViewAppSheet } from '../ViewAppSheet/ViewAppSheet' import { AppsListLoading } from './AppsListLoading' import { AppsListTable } from './AppsListTable' +import { usePlatformAppDeleteMutation } from '@/data/platform-apps/platform-app-delete-mutation' +import { usePlatformAppInstallationDeleteMutation } from '@/data/platform-apps/platform-app-installation-delete-mutation' interface AppsListProps { onCreateApp: () => void diff --git a/apps/studio/components/interfaces/Organization/PrivateApps/Apps/AppsList/AppsListTable.tsx b/apps/studio/components/interfaces/Organization/PrivateApps/Apps/AppsList/AppsListTable.tsx index d395f642af..8cde031171 100644 --- a/apps/studio/components/interfaces/Organization/PrivateApps/Apps/AppsList/AppsListTable.tsx +++ b/apps/studio/components/interfaces/Organization/PrivateApps/Apps/AppsList/AppsListTable.tsx @@ -18,6 +18,7 @@ import { TableRow, } from 'ui' import { TimestampInfo } from 'ui-patterns/TimestampInfo' + import type { PrivateApp } from '../../PrivateAppsContext' import type { AppsSort } from '../Apps.types' diff --git a/apps/studio/components/interfaces/Organization/PrivateApps/Apps/CreateAppSheet/CreateAppSheet.tsx b/apps/studio/components/interfaces/Organization/PrivateApps/Apps/CreateAppSheet/CreateAppSheet.tsx index fa60b82be5..6f38dae3cd 100644 --- a/apps/studio/components/interfaces/Organization/PrivateApps/Apps/CreateAppSheet/CreateAppSheet.tsx +++ b/apps/studio/components/interfaces/Organization/PrivateApps/Apps/CreateAppSheet/CreateAppSheet.tsx @@ -1,9 +1,4 @@ import type { components } from 'api-types' -import { usePlatformAppCreateMutation } from 'data/platform-apps/platform-app-create-mutation' -import { usePlatformAppDeleteMutation } from 'data/platform-apps/platform-app-delete-mutation' -import { usePlatformAppInstallationCreateMutation } from 'data/platform-apps/platform-app-installation-create-mutation' -import { usePlatformAppSigningKeyCreateMutation } from 'data/platform-apps/platform-app-signing-key-create-mutation' -import { useCopyToClipboard } from 'hooks/ui/useCopyToClipboard' import { Copy, Download, Key, Plus, RotateCcw, X } from 'lucide-react' import { useEffect, useRef, useState } from 'react' import { toast } from 'sonner' @@ -35,6 +30,11 @@ import { FormLayout } from 'ui-patterns/form/Layout/FormLayout' import { usePrivateApps } from '../../PrivateAppsContext' import { PERMISSIONS } from '../Apps.constants' import { CreateAppSheetStep } from './CreateAppSheetStep' +import { usePlatformAppCreateMutation } from '@/data/platform-apps/platform-app-create-mutation' +import { usePlatformAppDeleteMutation } from '@/data/platform-apps/platform-app-delete-mutation' +import { usePlatformAppInstallationCreateMutation } from '@/data/platform-apps/platform-app-installation-create-mutation' +import { usePlatformAppSigningKeyCreateMutation } from '@/data/platform-apps/platform-app-signing-key-create-mutation' +import { useCopyToClipboard } from '@/hooks/ui/useCopyToClipboard' type CreatePlatformAppResponse = components['schemas']['CreatePlatformAppResponse'] type CreatePlatformAppSigningKeyResponse = diff --git a/apps/studio/components/interfaces/Organization/PrivateApps/Apps/DeleteAppModal.tsx b/apps/studio/components/interfaces/Organization/PrivateApps/Apps/DeleteAppModal.tsx index 9cd2354204..14d7a99b75 100644 --- a/apps/studio/components/interfaces/Organization/PrivateApps/Apps/DeleteAppModal.tsx +++ b/apps/studio/components/interfaces/Organization/PrivateApps/Apps/DeleteAppModal.tsx @@ -1,4 +1,5 @@ import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' + import { PrivateApp } from '../PrivateAppsContext' interface DeleteAppModalProps { diff --git a/apps/studio/components/interfaces/Organization/PrivateApps/Apps/ViewAppSheet/ViewAppSheet.tsx b/apps/studio/components/interfaces/Organization/PrivateApps/Apps/ViewAppSheet/ViewAppSheet.tsx index 65c6a83a2f..c2c7c68ee9 100644 --- a/apps/studio/components/interfaces/Organization/PrivateApps/Apps/ViewAppSheet/ViewAppSheet.tsx +++ b/apps/studio/components/interfaces/Organization/PrivateApps/Apps/ViewAppSheet/ViewAppSheet.tsx @@ -1,5 +1,3 @@ -import { usePlatformAppDeleteMutation } from 'data/platform-apps/platform-app-delete-mutation' -import { usePlatformAppQuery } from 'data/platform-apps/platform-app-query' import { X } from 'lucide-react' import { useState } from 'react' import { toast } from 'sonner' @@ -11,6 +9,8 @@ import { DeleteAppModal } from '../DeleteAppModal' import { ViewAppSheetDangerZone } from './ViewAppSheetDangerZone' import { ViewAppSheetInfo } from './ViewAppSheetInfo' import { ViewAppSheetPermissions } from './ViewAppSheetPermissions' +import { usePlatformAppDeleteMutation } from '@/data/platform-apps/platform-app-delete-mutation' +import { usePlatformAppQuery } from '@/data/platform-apps/platform-app-query' interface ViewAppSheetProps { app: PrivateApp | null diff --git a/apps/studio/components/interfaces/Organization/PrivateApps/Apps/ViewAppSheet/ViewAppSheetInfo.tsx b/apps/studio/components/interfaces/Organization/PrivateApps/Apps/ViewAppSheet/ViewAppSheetInfo.tsx index bee6b4cf05..5390e57c61 100644 --- a/apps/studio/components/interfaces/Organization/PrivateApps/Apps/ViewAppSheet/ViewAppSheetInfo.tsx +++ b/apps/studio/components/interfaces/Organization/PrivateApps/Apps/ViewAppSheet/ViewAppSheetInfo.tsx @@ -6,14 +6,15 @@ import { Badge, Card, CardContent, + copyToClipboard, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, - copyToClipboard, } from 'ui' + import type { Installation, PrivateApp } from '../../PrivateAppsContext' interface ViewAppSheetInfoProps { diff --git a/apps/studio/components/interfaces/Organization/PrivateApps/Apps/ViewAppSheet/ViewAppSheetPermissions.tsx b/apps/studio/components/interfaces/Organization/PrivateApps/Apps/ViewAppSheet/ViewAppSheetPermissions.tsx index 0211186632..bc0cc1dce4 100644 --- a/apps/studio/components/interfaces/Organization/PrivateApps/Apps/ViewAppSheet/ViewAppSheetPermissions.tsx +++ b/apps/studio/components/interfaces/Organization/PrivateApps/Apps/ViewAppSheet/ViewAppSheetPermissions.tsx @@ -8,6 +8,7 @@ import { TableHeader, TableRow, } from 'ui' + import type { Permission } from '../Apps.constants' interface ViewAppSheetPermissionsProps { diff --git a/apps/studio/components/interfaces/Organization/PrivateApps/Installations/PromoteInstallationModal.tsx b/apps/studio/components/interfaces/Organization/PrivateApps/Installations/PromoteInstallationModal.tsx index 39469bcc10..2b75a0b60d 100644 --- a/apps/studio/components/interfaces/Organization/PrivateApps/Installations/PromoteInstallationModal.tsx +++ b/apps/studio/components/interfaces/Organization/PrivateApps/Installations/PromoteInstallationModal.tsx @@ -1,9 +1,9 @@ -import { usePlatformAppInstallationCreateMutation } from 'data/platform-apps/platform-app-installation-create-mutation' -import { usePlatformAppInstallationDeleteMutation } from 'data/platform-apps/platform-app-installation-delete-mutation' import { toast } from 'sonner' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { Installation, PrivateApp, usePrivateApps } from '../PrivateAppsContext' +import { usePlatformAppInstallationCreateMutation } from '@/data/platform-apps/platform-app-installation-create-mutation' +import { usePlatformAppInstallationDeleteMutation } from '@/data/platform-apps/platform-app-installation-delete-mutation' interface PromoteInstallationModalProps { appToPromote: PrivateApp | undefined diff --git a/apps/studio/components/interfaces/Organization/PrivateApps/PrivateAppsContext.tsx b/apps/studio/components/interfaces/Organization/PrivateApps/PrivateAppsContext.tsx index 3d844c06bf..ef2c6d74cd 100644 --- a/apps/studio/components/interfaces/Organization/PrivateApps/PrivateAppsContext.tsx +++ b/apps/studio/components/interfaces/Organization/PrivateApps/PrivateAppsContext.tsx @@ -1,11 +1,12 @@ import type { components } from 'api-types' -import { usePlatformAppInstallationsQuery } from 'data/platform-apps/platform-app-installations-query' -import { usePlatformAppsQuery } from 'data/platform-apps/platform-apps-query' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { createContext, PropsWithChildren, useContext, useMemo, useState } from 'react' -export type { Installation, PrivateApp } from './PrivateApps.types' import type { Installation, PrivateApp } from './PrivateApps.types' +import { usePlatformAppInstallationsQuery } from '@/data/platform-apps/platform-app-installations-query' +import { usePlatformAppsQuery } from '@/data/platform-apps/platform-apps-query' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' + +export type { Installation, PrivateApp } from './PrivateApps.types' interface PrivateAppsContextValue { slug: string | undefined diff --git a/apps/studio/components/interfaces/Organization/ProjectClaim/benefits.tsx b/apps/studio/components/interfaces/Organization/ProjectClaim/benefits.tsx index 383d85287b..ea02a4096a 100644 --- a/apps/studio/components/interfaces/Organization/ProjectClaim/benefits.tsx +++ b/apps/studio/components/interfaces/Organization/ProjectClaim/benefits.tsx @@ -1,9 +1,9 @@ import { CheckCircle2 } from 'lucide-react' - -import { ApiAuthorizationResponse } from 'data/api-authorization/api-authorization-query' -import { OrganizationProjectClaimResponse } from 'data/organizations/organization-project-claim-query' import { Button } from 'ui' + import { ProjectClaimLayout } from './layout' +import { ApiAuthorizationResponse } from '@/data/api-authorization/api-authorization-query' +import { OrganizationProjectClaimResponse } from '@/data/organizations/organization-project-claim-query' export const ProjectClaimBenefits = ({ projectClaim, diff --git a/apps/studio/components/interfaces/Organization/ProjectClaim/choose-org.tsx b/apps/studio/components/interfaces/Organization/ProjectClaim/choose-org.tsx index 1a6fbf3481..328e3869dd 100644 --- a/apps/studio/components/interfaces/Organization/ProjectClaim/choose-org.tsx +++ b/apps/studio/components/interfaces/Organization/ProjectClaim/choose-org.tsx @@ -1,6 +1,5 @@ -import { OrganizationSelector } from 'components/ui/org-selector' - import { ProjectClaimLayout } from './layout' +import { OrganizationSelector } from '@/components/ui/org-selector' export interface ProjectClaimChooseOrgProps { onChoose: (orgSlug: string) => void diff --git a/apps/studio/components/interfaces/Organization/ProjectClaim/confirm.tsx b/apps/studio/components/interfaces/Organization/ProjectClaim/confirm.tsx index 2cc44c294b..5fd7c7cc52 100644 --- a/apps/studio/components/interfaces/Organization/ProjectClaim/confirm.tsx +++ b/apps/studio/components/interfaces/Organization/ProjectClaim/confirm.tsx @@ -1,17 +1,9 @@ import { OAuthScope } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { CheckCircle2, ChevronRight, ChevronsLeftRight } from 'lucide-react' import Image from 'next/image' import { useRouter } from 'next/router' import { toast } from 'sonner' - -import { useParams } from 'common' -import { useApiAuthorizationApproveMutation } from 'data/api-authorization/api-authorization-approve-mutation' -import { ApiAuthorizationResponse } from 'data/api-authorization/api-authorization-query' -import { useOrganizationProjectClaimMutation } from 'data/organizations/organization-project-claim-mutation' -import { OrganizationProjectClaimResponse } from 'data/organizations/organization-project-claim-query' -import { useInvalidateProjectsInfiniteQuery } from 'data/projects/org-projects-infinite-query' -import { BASE_PATH } from 'lib/constants' -import type { Organization } from 'types' import { Button, cn, @@ -20,9 +12,17 @@ import { CollapsibleTrigger_Shadcn_, } from 'ui' import { Admonition } from 'ui-patterns/admonition' + import { ScopeSection } from '../OAuthApps/AuthorizeRequesterDetails' import { PERMISSIONS_DESCRIPTIONS } from '../OAuthApps/OAuthApps.constants' import { ProjectClaimLayout } from './layout' +import { useApiAuthorizationApproveMutation } from '@/data/api-authorization/api-authorization-approve-mutation' +import { ApiAuthorizationResponse } from '@/data/api-authorization/api-authorization-query' +import { useOrganizationProjectClaimMutation } from '@/data/organizations/organization-project-claim-mutation' +import { OrganizationProjectClaimResponse } from '@/data/organizations/organization-project-claim-query' +import { useInvalidateProjectsInfiniteQuery } from '@/data/projects/org-projects-infinite-query' +import { BASE_PATH } from '@/lib/constants' +import type { Organization } from '@/types' export const ProjectClaimConfirm = ({ selectedOrganization, diff --git a/apps/studio/components/interfaces/Organization/ProjectClaim/layout.tsx b/apps/studio/components/interfaces/Organization/ProjectClaim/layout.tsx index b90a8e5344..2e0b69b932 100644 --- a/apps/studio/components/interfaces/Organization/ProjectClaim/layout.tsx +++ b/apps/studio/components/interfaces/Organization/ProjectClaim/layout.tsx @@ -1,10 +1,11 @@ -import { UserDropdown } from 'components/interfaces/UserDropdown' -import { FeedbackDropdown } from 'components/layouts/Navigation/LayoutHeader/FeedbackDropdown/FeedbackDropdown' -import { BASE_PATH } from 'lib/constants' import Image from 'next/image' import { PropsWithChildren, ReactNode } from 'react' import { cn, Separator } from 'ui' +import { UserDropdown } from '@/components/interfaces/UserDropdown' +import { FeedbackDropdown } from '@/components/layouts/Navigation/LayoutHeader/FeedbackDropdown/FeedbackDropdown' +import { BASE_PATH } from '@/lib/constants' + export const ProjectClaimLayout = ({ children, title, diff --git a/apps/studio/components/interfaces/Organization/SSO/AttributeMapping.tsx b/apps/studio/components/interfaces/Organization/SSO/AttributeMapping.tsx index 3bb981d807..570b7f2b66 100644 --- a/apps/studio/components/interfaces/Organization/SSO/AttributeMapping.tsx +++ b/apps/studio/components/interfaces/Organization/SSO/AttributeMapping.tsx @@ -2,6 +2,7 @@ import { UseFormReturn } from 'react-hook-form' import { Button } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { SingleValueFieldArray } from 'ui-patterns/form/SingleValueFieldArray/SingleValueFieldArray' + import type { SSOConfigFormSchema } from './SSOConfig' type ProviderAttribute = 'emailMapping' | 'userNameMapping' | 'firstNameMapping' | 'lastNameMapping' diff --git a/apps/studio/components/interfaces/Organization/SSO/JoinOrganizationOnSignup.tsx b/apps/studio/components/interfaces/Organization/SSO/JoinOrganizationOnSignup.tsx index c03389a690..55a6356e80 100644 --- a/apps/studio/components/interfaces/Organization/SSO/JoinOrganizationOnSignup.tsx +++ b/apps/studio/components/interfaces/Organization/SSO/JoinOrganizationOnSignup.tsx @@ -1,5 +1,4 @@ import { useForm } from 'react-hook-form' - import { FormControl_Shadcn_, FormField_Shadcn_, @@ -12,6 +11,7 @@ import { Switch, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' + import { SSOConfigFormSchema } from './SSOConfig' export const JoinOrganizationOnSignup = ({ diff --git a/apps/studio/components/interfaces/Organization/SSO/SSODomains.tsx b/apps/studio/components/interfaces/Organization/SSO/SSODomains.tsx index cc5f5c7eb2..1ec4262e83 100644 --- a/apps/studio/components/interfaces/Organization/SSO/SSODomains.tsx +++ b/apps/studio/components/interfaces/Organization/SSO/SSODomains.tsx @@ -1,6 +1,7 @@ import { useForm } from 'react-hook-form' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { SingleValueFieldArray } from 'ui-patterns/form/SingleValueFieldArray/SingleValueFieldArray' + import { SSOConfigFormSchema } from './SSOConfig' export const SSODomains = ({ form }: { form: ReturnType> }) => { diff --git a/apps/studio/components/interfaces/Organization/SecuritySettings.tsx b/apps/studio/components/interfaces/Organization/SecuritySettings.tsx index 2777bfa9a7..9b22282758 100644 --- a/apps/studio/components/interfaces/Organization/SecuritySettings.tsx +++ b/apps/studio/components/interfaces/Organization/SecuritySettings.tsx @@ -1,23 +1,9 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { useEffect } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' - -import { useParams } from 'common' -import { ScaffoldContainer, ScaffoldSection } from 'components/layouts/Scaffold' -import AlertError from 'components/ui/AlertError' -import { InlineLink } from 'components/ui/InlineLink' -import NoPermission from 'components/ui/NoPermission' -import { UpgradeToPro } from 'components/ui/UpgradeToPro' -import { useOrganizationMembersQuery } from 'data/organizations/organization-members-query' -import { useOrganizationMfaToggleMutation } from 'data/organizations/organization-mfa-mutation' -import { useOrganizationMfaQuery } from 'data/organizations/organization-mfa-query' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useProfile } from 'lib/profile' import { Button, Card, @@ -33,6 +19,20 @@ import { } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' +import { z } from 'zod' + +import { ScaffoldContainer, ScaffoldSection } from '@/components/layouts/Scaffold' +import AlertError from '@/components/ui/AlertError' +import { InlineLink } from '@/components/ui/InlineLink' +import NoPermission from '@/components/ui/NoPermission' +import { UpgradeToPro } from '@/components/ui/UpgradeToPro' +import { useOrganizationMembersQuery } from '@/data/organizations/organization-members-query' +import { useOrganizationMfaToggleMutation } from '@/data/organizations/organization-mfa-mutation' +import { useOrganizationMfaQuery } from '@/data/organizations/organization-mfa-query' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useProfile } from '@/lib/profile' const schema = z.object({ enforceMfa: z.boolean(), diff --git a/apps/studio/components/interfaces/Organization/TeamSettings/LeaveTeamButton.tsx b/apps/studio/components/interfaces/Organization/TeamSettings/LeaveTeamButton.tsx index 8249c8bbdd..96ccde6005 100644 --- a/apps/studio/components/interfaces/Organization/TeamSettings/LeaveTeamButton.tsx +++ b/apps/studio/components/interfaces/Organization/TeamSettings/LeaveTeamButton.tsx @@ -1,19 +1,19 @@ +import { LOCAL_STORAGE_KEYS, useParams } from 'common' import { useRouter } from 'next/router' import { useState } from 'react' import { toast } from 'sonner' - -import { LOCAL_STORAGE_KEYS, useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useOrganizationRolesV2Query } from 'data/organization-members/organization-roles-query' -import { useOrganizationMemberDeleteMutation } from 'data/organizations/organization-member-delete-mutation' -import { useOrganizationMembersQuery } from 'data/organizations/organization-members-query' -import { useOrganizationsQuery } from 'data/organizations/organizations-query' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useProfile } from 'lib/profile' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' + import { hasMultipleOwners } from './TeamSettings.utils' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useOrganizationRolesV2Query } from '@/data/organization-members/organization-roles-query' +import { useOrganizationMemberDeleteMutation } from '@/data/organizations/organization-member-delete-mutation' +import { useOrganizationMembersQuery } from '@/data/organizations/organization-members-query' +import { useOrganizationsQuery } from '@/data/organizations/organizations-query' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useProfile } from '@/lib/profile' export const LeaveTeamButton = () => { const router = useRouter() diff --git a/apps/studio/components/interfaces/Organization/TeamSettings/MemberActions.tsx b/apps/studio/components/interfaces/Organization/TeamSettings/MemberActions.tsx index 5daac9c174..bffc233478 100644 --- a/apps/studio/components/interfaces/Organization/TeamSettings/MemberActions.tsx +++ b/apps/studio/components/interfaces/Organization/TeamSettings/MemberActions.tsx @@ -1,24 +1,8 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { MoreVertical, Redo2, Trash } from 'lucide-react' import { useState } from 'react' import { toast } from 'sonner' - -import { useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DropdownMenuItemTooltip } from 'components/ui/DropdownMenuItemTooltip' -import { useOrganizationCreateInvitationMutation } from 'data/organization-members/organization-invitation-create-mutation' -import { useOrganizationDeleteInvitationMutation } from 'data/organization-members/organization-invitation-delete-mutation' -import { useOrganizationRolesV2Query } from 'data/organization-members/organization-roles-query' -import { useOrganizationMemberDeleteMutation } from 'data/organizations/organization-member-delete-mutation' -import { - useOrganizationMembersQuery, - type OrganizationMember, -} from 'data/organizations/organization-members-query' -import { usePermissionsQuery } from 'data/permissions/permissions-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useProfile } from 'lib/profile' import { Button, DropdownMenu, @@ -27,9 +11,25 @@ import { DropdownMenuTrigger, } from 'ui' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' + import { LeaveTeamButton } from './LeaveTeamButton' import { useGetRolesManagementPermissions } from './TeamSettings.utils' import { UpdateRolesPanel } from './UpdateRolesPanel/UpdateRolesPanel' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DropdownMenuItemTooltip } from '@/components/ui/DropdownMenuItemTooltip' +import { useOrganizationCreateInvitationMutation } from '@/data/organization-members/organization-invitation-create-mutation' +import { useOrganizationDeleteInvitationMutation } from '@/data/organization-members/organization-invitation-delete-mutation' +import { useOrganizationRolesV2Query } from '@/data/organization-members/organization-roles-query' +import { useOrganizationMemberDeleteMutation } from '@/data/organizations/organization-member-delete-mutation' +import { + useOrganizationMembersQuery, + type OrganizationMember, +} from '@/data/organizations/organization-members-query' +import { usePermissionsQuery } from '@/data/permissions/permissions-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useProfile } from '@/lib/profile' interface MemberActionsProps { member: OrganizationMember diff --git a/apps/studio/components/interfaces/Organization/TeamSettings/MemberRow.tsx b/apps/studio/components/interfaces/Organization/TeamSettings/MemberRow.tsx index 04006fafd4..8c8346876b 100644 --- a/apps/studio/components/interfaces/Organization/TeamSettings/MemberRow.tsx +++ b/apps/studio/components/interfaces/Organization/TeamSettings/MemberRow.tsx @@ -1,28 +1,28 @@ -import { ArrowRight, Check, User, X, ChevronRight } from 'lucide-react' +import { useParams } from 'common' +import { ArrowRight, Check, ChevronRight, User, X } from 'lucide-react' import Link from 'next/link' import { useMemo } from 'react' - -import { useParams } from 'common' -import PartnerIcon from 'components/ui/PartnerIcon' -import { ProfileImage } from 'components/ui/ProfileImage' -import { useOrganizationRolesV2Query } from 'data/organization-members/organization-roles-query' -import { OrganizationMember } from 'data/organizations/organization-members-query' -import { useOrgProjectsInfiniteQuery } from 'data/projects/org-projects-infinite-query' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useProfile } from 'lib/profile' import { Badge, + cn, + HoverCard_Shadcn_, HoverCardContent_Shadcn_, HoverCardTrigger_Shadcn_, - HoverCard_Shadcn_, ScrollArea, TableCell, TableRow, - cn, } from 'ui' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' + import { isInviteExpired } from '../Organization.utils' import { MemberActions } from './MemberActions' +import PartnerIcon from '@/components/ui/PartnerIcon' +import { ProfileImage } from '@/components/ui/ProfileImage' +import { useOrganizationRolesV2Query } from '@/data/organization-members/organization-roles-query' +import { OrganizationMember } from '@/data/organizations/organization-members-query' +import { useOrgProjectsInfiniteQuery } from '@/data/projects/org-projects-infinite-query' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useProfile } from '@/lib/profile' interface MemberRowProps { member: OrganizationMember diff --git a/apps/studio/components/interfaces/Organization/TeamSettings/MembersView.tsx b/apps/studio/components/interfaces/Organization/TeamSettings/MembersView.tsx index 3ccf0d018b..ea770ad9aa 100644 --- a/apps/studio/components/interfaces/Organization/TeamSettings/MembersView.tsx +++ b/apps/studio/components/interfaces/Organization/TeamSettings/MembersView.tsx @@ -1,12 +1,6 @@ -import { AlertCircle, HelpCircle } from 'lucide-react' - import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { useOrganizationRolesV2Query } from 'data/organization-members/organization-roles-query' -import { useOrganizationMembersQuery } from 'data/organizations/organization-members-query' -import { DOCS_URL } from 'lib/constants' -import { useProfile } from 'lib/profile' import { partition } from 'lodash' +import { AlertCircle, HelpCircle } from 'lucide-react' import { useMemo } from 'react' import { Button, @@ -25,7 +19,13 @@ import { } from 'ui' import { Admonition } from 'ui-patterns' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' + import { MemberRow } from './MemberRow' +import AlertError from '@/components/ui/AlertError' +import { useOrganizationRolesV2Query } from '@/data/organization-members/organization-roles-query' +import { useOrganizationMembersQuery } from '@/data/organizations/organization-members-query' +import { DOCS_URL } from '@/lib/constants' +import { useProfile } from '@/lib/profile' export interface MembersViewProps { searchString: string diff --git a/apps/studio/components/interfaces/Organization/TeamSettings/TeamSettings.tsx b/apps/studio/components/interfaces/Organization/TeamSettings/TeamSettings.tsx index 7e727914fa..121234a7dc 100644 --- a/apps/studio/components/interfaces/Organization/TeamSettings/TeamSettings.tsx +++ b/apps/studio/components/interfaces/Organization/TeamSettings/TeamSettings.tsx @@ -1,7 +1,11 @@ +import { useParams } from 'common' import { Search } from 'lucide-react' import { useState } from 'react' +import { Admonition } from 'ui-patterns' +import { Input } from 'ui-patterns/DataInputs/Input' -import { useParams } from 'common' +import { InviteMemberButton } from './InviteMemberButton' +import MembersView from './MembersView' import { ScaffoldActionsContainer, ScaffoldActionsGroup, @@ -10,15 +14,11 @@ import { ScaffoldSection, ScaffoldSectionContent, ScaffoldTitle, -} from 'components/layouts/Scaffold' -import { DocsButton } from 'components/ui/DocsButton' -import { useOrganizationRolesV2Query } from 'data/organization-members/organization-roles-query' -import { useOrgProjectsInfiniteQuery } from 'data/projects/org-projects-infinite-query' -import { DOCS_URL } from 'lib/constants' -import { Admonition } from 'ui-patterns' -import { Input } from 'ui-patterns/DataInputs/Input' -import { InviteMemberButton } from './InviteMemberButton' -import MembersView from './MembersView' +} from '@/components/layouts/Scaffold' +import { DocsButton } from '@/components/ui/DocsButton' +import { useOrganizationRolesV2Query } from '@/data/organization-members/organization-roles-query' +import { useOrgProjectsInfiniteQuery } from '@/data/projects/org-projects-infinite-query' +import { DOCS_URL } from '@/lib/constants' export const TeamSettings = () => { const { slug } = useParams() diff --git a/apps/studio/components/interfaces/Organization/TeamSettings/TeamSettings.utils.ts b/apps/studio/components/interfaces/Organization/TeamSettings/TeamSettings.utils.ts index d2d98195d5..74b1702e28 100644 --- a/apps/studio/components/interfaces/Organization/TeamSettings/TeamSettings.utils.ts +++ b/apps/studio/components/interfaces/Organization/TeamSettings/TeamSettings.utils.ts @@ -1,7 +1,8 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' -import type { OrganizationMember } from 'data/organizations/organization-members-query' -import { doPermissionsCheck, useGetPermissions } from 'hooks/misc/useCheckPermissions' -import type { Permission, Role } from 'types' + +import type { OrganizationMember } from '@/data/organizations/organization-members-query' +import { doPermissionsCheck, useGetPermissions } from '@/hooks/misc/useCheckPermissions' +import type { Permission, Role } from '@/types' export const useGetRolesManagementPermissions = ( orgSlug?: string, diff --git a/apps/studio/components/interfaces/Organization/TeamSettings/UpdateRolesPanel/UpdateRolesConfirmationModal.tsx b/apps/studio/components/interfaces/Organization/TeamSettings/UpdateRolesPanel/UpdateRolesConfirmationModal.tsx index 4362ea1e8b..faa5a4e7db 100644 --- a/apps/studio/components/interfaces/Organization/TeamSettings/UpdateRolesPanel/UpdateRolesConfirmationModal.tsx +++ b/apps/studio/components/interfaces/Organization/TeamSettings/UpdateRolesPanel/UpdateRolesConfirmationModal.tsx @@ -1,16 +1,5 @@ import { useQueryClient } from '@tanstack/react-query' import { useParams } from 'common' -import { organizationKeys } from 'data/organization-members/keys' -import { useOrganizationMemberAssignRoleMutation } from 'data/organization-members/organization-member-role-assign-mutation' -import { useOrganizationMemberUnassignRoleMutation } from 'data/organization-members/organization-member-role-unassign-mutation' -import { useOrganizationMemberUpdateRoleMutation } from 'data/organization-members/organization-member-role-update-mutation' -import { - OrganizationRole, - useOrganizationRolesV2Query, -} from 'data/organization-members/organization-roles-query' -import { organizationKeys as organizationKeysV1 } from 'data/organizations/keys' -import { OrganizationMember } from 'data/organizations/organization-members-query' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { useState } from 'react' import { toast } from 'sonner' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' @@ -21,6 +10,17 @@ import { formatMemberRoleToProjectRoleConfiguration, ProjectRoleConfiguration, } from './UpdateRolesPanel.utils' +import { organizationKeys } from '@/data/organization-members/keys' +import { useOrganizationMemberAssignRoleMutation } from '@/data/organization-members/organization-member-role-assign-mutation' +import { useOrganizationMemberUnassignRoleMutation } from '@/data/organization-members/organization-member-role-unassign-mutation' +import { useOrganizationMemberUpdateRoleMutation } from '@/data/organization-members/organization-member-role-update-mutation' +import { + OrganizationRole, + useOrganizationRolesV2Query, +} from '@/data/organization-members/organization-roles-query' +import { organizationKeys as organizationKeysV1 } from '@/data/organizations/keys' +import { OrganizationMember } from '@/data/organizations/organization-members-query' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' interface UpdateRolesConfirmationModal { visible: boolean diff --git a/apps/studio/components/interfaces/Organization/TeamSettings/UpdateRolesPanel/UpdateRolesPanel.tsx b/apps/studio/components/interfaces/Organization/TeamSettings/UpdateRolesPanel/UpdateRolesPanel.tsx index 6a84e033f8..78cf844a38 100644 --- a/apps/studio/components/interfaces/Organization/TeamSettings/UpdateRolesPanel/UpdateRolesPanel.tsx +++ b/apps/studio/components/interfaces/Organization/TeamSettings/UpdateRolesPanel/UpdateRolesPanel.tsx @@ -1,14 +1,4 @@ import { useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DocsButton } from 'components/ui/DocsButton' -import { OrganizationProjectSelector } from 'components/ui/OrganizationProjectSelector' -import { useOrganizationRolesV2Query } from 'data/organization-members/organization-roles-query' -import { OrganizationMember } from 'data/organizations/organization-members-query' -import { usePermissionsQuery } from 'data/permissions/permissions-query' -import { OrgProject, useOrgProjectsInfiniteQuery } from 'data/projects/org-projects-infinite-query' -import { useHasAccessToProjectLevelPermissions } from 'data/subscriptions/org-subscription-query' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { DOCS_URL } from 'lib/constants' import { isEqual } from 'lodash' import { ChevronDown, X } from 'lucide-react' import { useEffect, useMemo, useState } from 'react' @@ -44,6 +34,19 @@ import { formatMemberRoleToProjectRoleConfiguration, ProjectRoleConfiguration, } from './UpdateRolesPanel.utils' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DocsButton } from '@/components/ui/DocsButton' +import { OrganizationProjectSelector } from '@/components/ui/OrganizationProjectSelector' +import { useOrganizationRolesV2Query } from '@/data/organization-members/organization-roles-query' +import { OrganizationMember } from '@/data/organizations/organization-members-query' +import { usePermissionsQuery } from '@/data/permissions/permissions-query' +import { + OrgProject, + useOrgProjectsInfiniteQuery, +} from '@/data/projects/org-projects-infinite-query' +import { useHasAccessToProjectLevelPermissions } from '@/data/subscriptions/org-subscription-query' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { DOCS_URL } from '@/lib/constants' interface UpdateRolesPanelProps { visible: boolean diff --git a/apps/studio/components/interfaces/Organization/TeamSettings/UpdateRolesPanel/UpdateRolesPanel.utils.test.ts b/apps/studio/components/interfaces/Organization/TeamSettings/UpdateRolesPanel/UpdateRolesPanel.utils.test.ts index 41e58abaee..f60155040e 100644 --- a/apps/studio/components/interfaces/Organization/TeamSettings/UpdateRolesPanel/UpdateRolesPanel.utils.test.ts +++ b/apps/studio/components/interfaces/Organization/TeamSettings/UpdateRolesPanel/UpdateRolesPanel.utils.test.ts @@ -1,4 +1,5 @@ import { describe, expect, test } from 'vitest' + import { deriveRoleChangeActions } from './UpdateRolesPanel.utils' // [Joshen] This is specifically testing the project scope changes diff --git a/apps/studio/components/interfaces/Organization/TeamSettings/UpdateRolesPanel/UpdateRolesPanel.utils.ts b/apps/studio/components/interfaces/Organization/TeamSettings/UpdateRolesPanel/UpdateRolesPanel.utils.ts index 0854abd5a2..0cda4548fd 100644 --- a/apps/studio/components/interfaces/Organization/TeamSettings/UpdateRolesPanel/UpdateRolesPanel.utils.ts +++ b/apps/studio/components/interfaces/Organization/TeamSettings/UpdateRolesPanel/UpdateRolesPanel.utils.ts @@ -3,8 +3,8 @@ import { groupBy, isEqual } from 'lodash' import { OrganizationRole, OrganizationRolesResponse, -} from 'data/organization-members/organization-roles-query' -import { OrganizationMember } from 'data/organizations/organization-members-query' +} from '@/data/organization-members/organization-roles-query' +import { OrganizationMember } from '@/data/organizations/organization-members-query' export interface ProjectRoleConfiguration { ref?: string diff --git a/apps/studio/components/interfaces/Organization/Usage/ActiveCompute.tsx b/apps/studio/components/interfaces/Organization/Usage/ActiveCompute.tsx index 4ecc467976..c5d5ac9f86 100644 --- a/apps/studio/components/interfaces/Organization/Usage/ActiveCompute.tsx +++ b/apps/studio/components/interfaces/Organization/Usage/ActiveCompute.tsx @@ -1,15 +1,15 @@ import { BarChart2 } from 'lucide-react' import { useMemo } from 'react' - -import Panel from 'components/ui/Panel' -import { DataPoint } from 'data/analytics/constants' -import { PricingMetric, type OrgDailyUsageResponse } from 'data/analytics/org-daily-stats-query' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { DOCS_URL } from 'lib/constants' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' + import { SectionContent } from './SectionContent' import { dailyUsageToDataPoints } from './Usage.utils' import UsageBarChart from './UsageBarChart' +import Panel from '@/components/ui/Panel' +import { DataPoint } from '@/data/analytics/constants' +import { PricingMetric, type OrgDailyUsageResponse } from '@/data/analytics/org-daily-stats-query' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { DOCS_URL } from '@/lib/constants' export interface ComputeProps { orgDailyStats: OrgDailyUsageResponse | undefined diff --git a/apps/studio/components/interfaces/Organization/Usage/Activity.tsx b/apps/studio/components/interfaces/Organization/Usage/Activity.tsx index 4ee8fc9036..e036e6ed22 100644 --- a/apps/studio/components/interfaces/Organization/Usage/Activity.tsx +++ b/apps/studio/components/interfaces/Organization/Usage/Activity.tsx @@ -1,8 +1,8 @@ -import { DataPoint } from 'data/analytics/constants' -import { PricingMetric, type OrgDailyUsageResponse } from 'data/analytics/org-daily-stats-query' -import type { OrgSubscription } from 'data/subscriptions/types' -import UsageSection from './UsageSection/UsageSection' import { dailyUsageToDataPoints } from './Usage.utils' +import UsageSection from './UsageSection/UsageSection' +import { DataPoint } from '@/data/analytics/constants' +import { PricingMetric, type OrgDailyUsageResponse } from '@/data/analytics/org-daily-stats-query' +import type { OrgSubscription } from '@/data/subscriptions/types' export interface ActivityProps { orgSlug: string diff --git a/apps/studio/components/interfaces/Organization/Usage/Compute.tsx b/apps/studio/components/interfaces/Organization/Usage/Compute.tsx index 154440bdca..e32af374af 100644 --- a/apps/studio/components/interfaces/Organization/Usage/Compute.tsx +++ b/apps/studio/components/interfaces/Organization/Usage/Compute.tsx @@ -1,20 +1,20 @@ import { BarChart2 } from 'lucide-react' import { useMemo } from 'react' - -import Panel from 'components/ui/Panel' -import { DataPoint } from 'data/analytics/constants' -import { - ComputeUsageMetric, - computeUsageMetricLabel, - type OrgDailyUsageResponse, -} from 'data/analytics/org-daily-stats-query' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { DOCS_URL } from 'lib/constants' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' + import { SectionContent } from './SectionContent' import { Attribute, AttributeColor } from './Usage.constants' import { dailyUsageToDataPoints } from './Usage.utils' import UsageBarChart from './UsageBarChart' +import Panel from '@/components/ui/Panel' +import { DataPoint } from '@/data/analytics/constants' +import { + ComputeUsageMetric, + computeUsageMetricLabel, + type OrgDailyUsageResponse, +} from '@/data/analytics/org-daily-stats-query' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { DOCS_URL } from '@/lib/constants' export interface ComputeProps { orgDailyStats: OrgDailyUsageResponse | undefined diff --git a/apps/studio/components/interfaces/Organization/Usage/Egress.tsx b/apps/studio/components/interfaces/Organization/Usage/Egress.tsx index 8a20726ccc..b9960ee9b8 100644 --- a/apps/studio/components/interfaces/Organization/Usage/Egress.tsx +++ b/apps/studio/components/interfaces/Organization/Usage/Egress.tsx @@ -1,8 +1,8 @@ -import { DataPoint } from 'data/analytics/constants' -import { PricingMetric, type OrgDailyUsageResponse } from 'data/analytics/org-daily-stats-query' -import type { OrgSubscription } from 'data/subscriptions/types' -import UsageSection from './UsageSection/UsageSection' import { dailyUsageToDataPoints } from './Usage.utils' +import UsageSection from './UsageSection/UsageSection' +import { DataPoint } from '@/data/analytics/constants' +import { PricingMetric, type OrgDailyUsageResponse } from '@/data/analytics/org-daily-stats-query' +import type { OrgSubscription } from '@/data/subscriptions/types' export interface EgressProps { orgSlug: string diff --git a/apps/studio/components/interfaces/Organization/Usage/OrgLogUsage.tsx b/apps/studio/components/interfaces/Organization/Usage/OrgLogUsage.tsx index 48f65c75ea..7ef2d7e016 100644 --- a/apps/studio/components/interfaces/Organization/Usage/OrgLogUsage.tsx +++ b/apps/studio/components/interfaces/Organization/Usage/OrgLogUsage.tsx @@ -1,8 +1,8 @@ -import { DataPoint } from 'data/analytics/constants' -import { PricingMetric, type OrgDailyUsageResponse } from 'data/analytics/org-daily-stats-query' -import type { OrgSubscription } from 'data/subscriptions/types' -import UsageSection from './UsageSection/UsageSection' import { dailyUsageToDataPoints } from './Usage.utils' +import UsageSection from './UsageSection/UsageSection' +import { DataPoint } from '@/data/analytics/constants' +import { PricingMetric, type OrgDailyUsageResponse } from '@/data/analytics/org-daily-stats-query' +import type { OrgSubscription } from '@/data/subscriptions/types' export interface OrgLogUsageProps { orgSlug: string diff --git a/apps/studio/components/interfaces/Organization/Usage/SectionContent.tsx b/apps/studio/components/interfaces/Organization/Usage/SectionContent.tsx index 9d46db528e..0ecc47cc47 100644 --- a/apps/studio/components/interfaces/Organization/Usage/SectionContent.tsx +++ b/apps/studio/components/interfaces/Organization/Usage/SectionContent.tsx @@ -1,9 +1,10 @@ -import { ScaffoldContainer, ScaffoldDivider } from 'components/layouts/Scaffold' import { ExternalLink } from 'lucide-react' import Link from 'next/link' import { PropsWithChildren } from 'react' import { Badge } from 'ui' + import { CategoryAttribute } from './Usage.constants' +import { ScaffoldContainer, ScaffoldDivider } from '@/components/layouts/Scaffold' export interface SectionContent { section: Pick diff --git a/apps/studio/components/interfaces/Organization/Usage/SizeAndCounts.tsx b/apps/studio/components/interfaces/Organization/Usage/SizeAndCounts.tsx index 98fee9df80..3e5023802d 100644 --- a/apps/studio/components/interfaces/Organization/Usage/SizeAndCounts.tsx +++ b/apps/studio/components/interfaces/Organization/Usage/SizeAndCounts.tsx @@ -1,12 +1,12 @@ -import { DataPoint } from 'data/analytics/constants' +import { dailyUsageToDataPoints } from './Usage.utils' +import UsageSection from './UsageSection/UsageSection' +import { DataPoint } from '@/data/analytics/constants' import { PricingMetric, useOrgDailyStatsQuery, type OrgDailyUsageResponse, -} from 'data/analytics/org-daily-stats-query' -import type { OrgSubscription } from 'data/subscriptions/types' -import UsageSection from './UsageSection/UsageSection' -import { dailyUsageToDataPoints } from './Usage.utils' +} from '@/data/analytics/org-daily-stats-query' +import type { OrgSubscription } from '@/data/subscriptions/types' export interface SizeAndCountsProps { orgSlug: string diff --git a/apps/studio/components/interfaces/Organization/Usage/TotalUsage.tsx b/apps/studio/components/interfaces/Organization/Usage/TotalUsage.tsx index 3361b0a66f..e880852551 100644 --- a/apps/studio/components/interfaces/Organization/Usage/TotalUsage.tsx +++ b/apps/studio/components/interfaces/Organization/Usage/TotalUsage.tsx @@ -1,22 +1,22 @@ -import { useMemo } from 'react' - import { useBreakpoint } from 'common' -import AlertError from 'components/ui/AlertError' -import { - ComputeUsageMetric, - computeUsageMetricLabel, - PricingMetric, -} from 'data/analytics/org-daily-stats-query' -import type { OrgSubscription } from 'data/subscriptions/types' -import { useOrgUsageQuery } from 'data/usage/org-usage-query' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { DOCS_URL } from 'lib/constants' +import { useMemo } from 'react' import { cn } from 'ui' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' + import { BILLING_BREAKDOWN_METRICS } from '../BillingSettings/BillingBreakdown/BillingBreakdown.constants' import { BillingMetric } from '../BillingSettings/BillingBreakdown/BillingMetric' import { ComputeMetric } from '../BillingSettings/BillingBreakdown/ComputeMetric' import { SectionContent } from './SectionContent' +import AlertError from '@/components/ui/AlertError' +import { + ComputeUsageMetric, + computeUsageMetricLabel, + PricingMetric, +} from '@/data/analytics/org-daily-stats-query' +import type { OrgSubscription } from '@/data/subscriptions/types' +import { useOrgUsageQuery } from '@/data/usage/org-usage-query' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { DOCS_URL } from '@/lib/constants' export interface ComputeProps { orgSlug: string diff --git a/apps/studio/components/interfaces/Organization/Usage/Usage.constants.tsx b/apps/studio/components/interfaces/Organization/Usage/Usage.constants.tsx index e9a196b921..1be62c7b6d 100644 --- a/apps/studio/components/interfaces/Organization/Usage/Usage.constants.tsx +++ b/apps/studio/components/interfaces/Organization/Usage/Usage.constants.tsx @@ -1,10 +1,11 @@ -import { USAGE_APPROACHING_THRESHOLD } from 'components/interfaces/Billing/Billing.constants' -import { EgressType, PricingMetric } from 'data/analytics/org-daily-stats-query' -import type { OrgSubscription } from 'data/subscriptions/types' -import type { OrgUsageResponse } from 'data/usage/org-usage-query' -import { DOCS_URL } from 'lib/constants' import { Admonition } from 'ui-patterns' +import { USAGE_APPROACHING_THRESHOLD } from '@/components/interfaces/Billing/Billing.constants' +import { EgressType, PricingMetric } from '@/data/analytics/org-daily-stats-query' +import type { OrgSubscription } from '@/data/subscriptions/types' +import type { OrgUsageResponse } from '@/data/usage/org-usage-query' +import { DOCS_URL } from '@/lib/constants' + export const COLOR_MAP = { white: { bar: 'fill-foreground', marker: 'bg-foreground' }, green: { bar: 'fill-green-800', marker: 'bg-green-800' }, diff --git a/apps/studio/components/interfaces/Organization/Usage/Usage.tsx b/apps/studio/components/interfaces/Organization/Usage/Usage.tsx index 6e8baf4aa6..3bca73d5b0 100644 --- a/apps/studio/components/interfaces/Organization/Usage/Usage.tsx +++ b/apps/studio/components/interfaces/Organization/Usage/Usage.tsx @@ -1,21 +1,6 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { - ScaffoldContainer, - ScaffoldHeader, - ScaffoldSection, - ScaffoldTitle, -} from 'components/layouts/Scaffold' -import AlertError from 'components/ui/AlertError' -import DateRangePicker from 'components/ui/DateRangePicker' -import NoPermission from 'components/ui/NoPermission' -import { OrganizationProjectSelector } from 'components/ui/OrganizationProjectSelector' -import { useOrgDailyStatsQuery } from 'data/analytics/org-daily-stats-query' -import { useProjectDetailQuery } from 'data/projects/project-detail-query' -import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' import dayjs from 'dayjs' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { TIME_PERIODS_BILLING, TIME_PERIODS_REPORTS } from 'lib/constants/metrics' import { Check, ChevronDown } from 'lucide-react' import Link from 'next/link' import { useQueryState } from 'nuqs' @@ -32,6 +17,21 @@ import Egress from './Egress' import OrgLogUsage from './OrgLogUsage' import SizeAndCounts from './SizeAndCounts' import { TotalUsage } from './TotalUsage' +import { + ScaffoldContainer, + ScaffoldHeader, + ScaffoldSection, + ScaffoldTitle, +} from '@/components/layouts/Scaffold' +import AlertError from '@/components/ui/AlertError' +import DateRangePicker from '@/components/ui/DateRangePicker' +import NoPermission from '@/components/ui/NoPermission' +import { OrganizationProjectSelector } from '@/components/ui/OrganizationProjectSelector' +import { useOrgDailyStatsQuery } from '@/data/analytics/org-daily-stats-query' +import { useProjectDetailQuery } from '@/data/projects/project-detail-query' +import { useOrgSubscriptionQuery } from '@/data/subscriptions/org-subscription-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { TIME_PERIODS_BILLING, TIME_PERIODS_REPORTS } from '@/lib/constants/metrics' export const Usage = () => { const { slug } = useParams() diff --git a/apps/studio/components/interfaces/Organization/Usage/Usage.utils.test.ts b/apps/studio/components/interfaces/Organization/Usage/Usage.utils.test.ts index 38ce31dc1d..e22c4366f5 100644 --- a/apps/studio/components/interfaces/Organization/Usage/Usage.utils.test.ts +++ b/apps/studio/components/interfaces/Organization/Usage/Usage.utils.test.ts @@ -1,7 +1,8 @@ -import { describe, it, expect } from 'vitest' +import { describe, expect, it } from 'vitest' + import { dailyUsageToDataPoints } from './Usage.utils' -import { PricingMetric } from 'data/analytics/org-daily-stats-query' -import type { OrgDailyUsageResponse } from 'data/analytics/org-daily-stats-query' +import { PricingMetric } from '@/data/analytics/org-daily-stats-query' +import type { OrgDailyUsageResponse } from '@/data/analytics/org-daily-stats-query' describe('dailyUsageToDataPoints', () => { it('returns empty array when dailyUsage is undefined', () => { diff --git a/apps/studio/components/interfaces/Organization/Usage/Usage.utils.ts b/apps/studio/components/interfaces/Organization/Usage/Usage.utils.ts index 75388d0597..4e90d06ff8 100644 --- a/apps/studio/components/interfaces/Organization/Usage/Usage.utils.ts +++ b/apps/studio/components/interfaces/Organization/Usage/Usage.utils.ts @@ -1,10 +1,10 @@ import dayjs from 'dayjs' import { groupBy } from 'lodash' -import { DataPoint } from 'data/analytics/constants' -import type { OrgDailyUsageResponse, PricingMetric } from 'data/analytics/org-daily-stats-query' -import type { OrgSubscription } from 'data/subscriptions/types' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' +import { DataPoint } from '@/data/analytics/constants' +import type { OrgDailyUsageResponse, PricingMetric } from '@/data/analytics/org-daily-stats-query' +import type { OrgSubscription } from '@/data/subscriptions/types' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' // [Joshen] This is just for development to generate some test data for chart rendering export const generateUsageData = (attribute: string, days: number): DataPoint[] => { diff --git a/apps/studio/components/interfaces/Organization/Usage/UsageBarChart.tsx b/apps/studio/components/interfaces/Organization/Usage/UsageBarChart.tsx index 04977db1df..b5bf8e2c3a 100644 --- a/apps/studio/components/interfaces/Organization/Usage/UsageBarChart.tsx +++ b/apps/studio/components/interfaces/Organization/Usage/UsageBarChart.tsx @@ -9,11 +9,11 @@ import { XAxis, YAxis, } from 'recharts' - -import { DataPoint } from 'data/analytics/constants' import { cn } from 'ui' + import { Attribute, COLOR_MAP } from './Usage.constants' import { MultiAttributeTooltipContent, SingleAttributeTooltipContent } from './UsageChartTooltips' +import { DataPoint } from '@/data/analytics/constants' // [Joshen] This BarChart is specifically for usage, hence not a reusable component, and not // replacing the existing BarChart in ui/Charts diff --git a/apps/studio/components/interfaces/Organization/Usage/UsageChartTooltips.tsx b/apps/studio/components/interfaces/Organization/Usage/UsageChartTooltips.tsx index 1036abb043..9f22ae4088 100644 --- a/apps/studio/components/interfaces/Organization/Usage/UsageChartTooltips.tsx +++ b/apps/studio/components/interfaces/Organization/Usage/UsageChartTooltips.tsx @@ -1,6 +1,6 @@ import type { Payload, ValueType } from 'recharts/types/component/DefaultTooltipContent' - import { cn } from 'ui' + import { Attribute, COLOR_MAP } from './Usage.constants' export interface SingleAttributeTooltipContentProps { diff --git a/apps/studio/components/interfaces/Organization/Usage/UsageSection/AttributeUsage.tsx b/apps/studio/components/interfaces/Organization/Usage/UsageSection/AttributeUsage.tsx index ec8fc6785d..7a5f7da5f9 100644 --- a/apps/studio/components/interfaces/Organization/Usage/UsageSection/AttributeUsage.tsx +++ b/apps/studio/components/interfaces/Organization/Usage/UsageSection/AttributeUsage.tsx @@ -1,16 +1,9 @@ import { AlertTriangle, BarChart2 } from 'lucide-react' import Link from 'next/link' import { useMemo } from 'react' - -import AlertError from 'components/ui/AlertError' -import Panel from 'components/ui/Panel' -import SparkBar from 'components/ui/SparkBar' -import type { OrgSubscription } from 'data/subscriptions/types' -import type { OrgMetricsUsage, OrgUsageResponse } from 'data/usage/org-usage-query' -import { USAGE_APPROACHING_THRESHOLD } from 'lib/constants' -import type { ResponseError } from 'types' import { Button, cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' + import { SectionContent } from '../SectionContent' import { CategoryAttribute } from '../Usage.constants' import { @@ -20,6 +13,13 @@ import { } from '../Usage.utils' import UsageBarChart from '../UsageBarChart' import { ChartMeta } from './UsageSection' +import AlertError from '@/components/ui/AlertError' +import Panel from '@/components/ui/Panel' +import SparkBar from '@/components/ui/SparkBar' +import type { OrgSubscription } from '@/data/subscriptions/types' +import type { OrgMetricsUsage, OrgUsageResponse } from '@/data/usage/org-usage-query' +import { USAGE_APPROACHING_THRESHOLD } from '@/lib/constants' +import type { ResponseError } from '@/types' export interface AttributeUsageProps { slug: string diff --git a/apps/studio/components/interfaces/Organization/Usage/UsageSection/DatabaseSizeUsage.tsx b/apps/studio/components/interfaces/Organization/Usage/UsageSection/DatabaseSizeUsage.tsx index c468acdf61..5b72e3c747 100644 --- a/apps/studio/components/interfaces/Organization/Usage/UsageSection/DatabaseSizeUsage.tsx +++ b/apps/studio/components/interfaces/Organization/Usage/UsageSection/DatabaseSizeUsage.tsx @@ -1,11 +1,5 @@ import Link from 'next/link' import { useMemo } from 'react' - -import Panel from 'components/ui/Panel' -import { PricingMetric } from 'data/analytics/org-daily-stats-query' -import type { OrgSubscription } from 'data/subscriptions/types' -import { OrgUsageResponse } from 'data/usage/org-usage-query' -import { formatBytes } from 'lib/helpers' import { Alert_Shadcn_, AlertDescription_Shadcn_, @@ -14,8 +8,14 @@ import { CriticalIcon, } from 'ui' import { InfoTooltip } from 'ui-patterns/info-tooltip' + import { SectionContent } from '../SectionContent' import { CategoryAttribute } from '../Usage.constants' +import Panel from '@/components/ui/Panel' +import { PricingMetric } from '@/data/analytics/org-daily-stats-query' +import type { OrgSubscription } from '@/data/subscriptions/types' +import { OrgUsageResponse } from '@/data/usage/org-usage-query' +import { formatBytes } from '@/lib/helpers' export interface DatabaseSizeUsageProps { slug: string diff --git a/apps/studio/components/interfaces/Organization/Usage/UsageSection/DiskUsage.tsx b/apps/studio/components/interfaces/Organization/Usage/UsageSection/DiskUsage.tsx index aab685521e..d461138ba5 100644 --- a/apps/studio/components/interfaces/Organization/Usage/UsageSection/DiskUsage.tsx +++ b/apps/studio/components/interfaces/Organization/Usage/UsageSection/DiskUsage.tsx @@ -1,14 +1,6 @@ import MotionNumber from '@number-flow/react' import Link from 'next/link' import { useMemo } from 'react' - -import AlertError from 'components/ui/AlertError' -import Panel from 'components/ui/Panel' -import { PricingMetric } from 'data/analytics/org-daily-stats-query' -import { useOrgProjectsInfiniteQuery } from 'data/projects/org-projects-infinite-query' -import type { OrgSubscription } from 'data/subscriptions/types' -import { OrgUsageResponse } from 'data/usage/org-usage-query' -import { PROJECT_STATUS } from 'lib/constants' import { Alert_Shadcn_, AlertDescription_Shadcn_, @@ -18,8 +10,16 @@ import { } from 'ui' import { InfoTooltip } from 'ui-patterns/info-tooltip' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' + import { SectionContent } from '../SectionContent' import { CategoryAttribute } from '../Usage.constants' +import AlertError from '@/components/ui/AlertError' +import Panel from '@/components/ui/Panel' +import { PricingMetric } from '@/data/analytics/org-daily-stats-query' +import { useOrgProjectsInfiniteQuery } from '@/data/projects/org-projects-infinite-query' +import type { OrgSubscription } from '@/data/subscriptions/types' +import { OrgUsageResponse } from '@/data/usage/org-usage-query' +import { PROJECT_STATUS } from '@/lib/constants' export interface DiskUsageProps { slug: string diff --git a/apps/studio/components/interfaces/Organization/Usage/UsageSection/UsageSection.tsx b/apps/studio/components/interfaces/Organization/Usage/UsageSection/UsageSection.tsx index a971fba54a..c0a9747ac3 100644 --- a/apps/studio/components/interfaces/Organization/Usage/UsageSection/UsageSection.tsx +++ b/apps/studio/components/interfaces/Organization/Usage/UsageSection/UsageSection.tsx @@ -1,13 +1,13 @@ -import { ScaffoldContainer } from 'components/layouts/Scaffold' -import { DataPoint } from 'data/analytics/constants' -import { PricingMetric } from 'data/analytics/org-daily-stats-query' -import type { OrgSubscription } from 'data/subscriptions/types' -import { useOrgUsageQuery } from 'data/usage/org-usage-query' import SectionHeader from '../SectionHeader' import { CategoryMetaKey, USAGE_CATEGORIES } from '../Usage.constants' import AttributeUsage from './AttributeUsage' import DatabaseSizeUsage from './DatabaseSizeUsage' import { DiskUsage } from './DiskUsage' +import { ScaffoldContainer } from '@/components/layouts/Scaffold' +import { DataPoint } from '@/data/analytics/constants' +import { PricingMetric } from '@/data/analytics/org-daily-stats-query' +import type { OrgSubscription } from '@/data/subscriptions/types' +import { useOrgUsageQuery } from '@/data/usage/org-usage-query' export interface ChartMeta { [key: string]: { data: DataPoint[]; margin: number; isLoading: boolean } diff --git a/apps/studio/components/interfaces/Organization/restriction.constants.tsx b/apps/studio/components/interfaces/Organization/restriction.constants.tsx index 90026eae69..a6b86cbaaf 100644 --- a/apps/studio/components/interfaces/Organization/restriction.constants.tsx +++ b/apps/studio/components/interfaces/Organization/restriction.constants.tsx @@ -1,6 +1,6 @@ import { type ReactNode } from 'react' -import { InlineLink } from 'components/ui/InlineLink' +import { InlineLink } from '@/components/ui/InlineLink' export const RESTRICTION_MESSAGES = { GRACE_PERIOD: { diff --git a/apps/studio/components/interfaces/OrganizationInvite/OrganizationInvite.tsx b/apps/studio/components/interfaces/OrganizationInvite/OrganizationInvite.tsx index 1e2bf10fb2..bb51676d40 100644 --- a/apps/studio/components/interfaces/OrganizationInvite/OrganizationInvite.tsx +++ b/apps/studio/components/interfaces/OrganizationInvite/OrganizationInvite.tsx @@ -1,16 +1,16 @@ +import { useIsLoggedIn, useParams } from 'common' import { CheckSquare } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' import { toast } from 'sonner' - -import { useIsLoggedIn, useParams } from 'common' -import { useOrganizationAcceptInvitationMutation } from 'data/organization-members/organization-invitation-accept-mutation' -import { useOrganizationInvitationTokenQuery } from 'data/organization-members/organization-invitation-token-query' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useProfile } from 'lib/profile' import { Button, cn } from 'ui' import { Admonition, GenericSkeletonLoader } from 'ui-patterns' + import { OrganizationInviteError } from './OrganizationInviteError' +import { useOrganizationAcceptInvitationMutation } from '@/data/organization-members/organization-invitation-accept-mutation' +import { useOrganizationInvitationTokenQuery } from '@/data/organization-members/organization-invitation-token-query' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useProfile } from '@/lib/profile' export const OrganizationInvite = () => { const router = useRouter() diff --git a/apps/studio/components/interfaces/OrganizationInvite/OrganizationInviteError.tsx b/apps/studio/components/interfaces/OrganizationInvite/OrganizationInviteError.tsx index 2a3578d8a5..c4c7b1c699 100644 --- a/apps/studio/components/interfaces/OrganizationInvite/OrganizationInviteError.tsx +++ b/apps/studio/components/interfaces/OrganizationInvite/OrganizationInviteError.tsx @@ -1,12 +1,12 @@ import { useRouter } from 'next/router' - -import AlertError from 'components/ui/AlertError' -import { OrganizationInviteByToken } from 'data/organization-members/organization-invitation-token-query' -import { useSignOut } from 'lib/auth' -import { useProfile } from 'lib/profile' -import type { ResponseError } from 'types' import { cn } from 'ui' +import AlertError from '@/components/ui/AlertError' +import { OrganizationInviteByToken } from '@/data/organization-members/organization-invitation-token-query' +import { useSignOut } from '@/lib/auth' +import { useProfile } from '@/lib/profile' +import type { ResponseError } from '@/types' + interface OrganizationInviteError { data?: OrganizationInviteByToken error?: ResponseError | null diff --git a/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksDeliveryDetailsSheet.tsx b/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksDeliveryDetailsSheet.tsx index 00a2959509..3ae572e375 100644 --- a/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksDeliveryDetailsSheet.tsx +++ b/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksDeliveryDetailsSheet.tsx @@ -1,5 +1,3 @@ -import { getStatusLevel } from 'components/interfaces/UnifiedLogs/UnifiedLogs.utils' -import { DataTableColumnStatusCode } from 'components/ui/DataTable/DataTableColumn/DataTableColumnStatusCode' import { Copy, RotateCcw } from 'lucide-react' import { AlertDialog, @@ -23,6 +21,8 @@ import { TimestampInfo } from 'ui-patterns' import type { WebhookDelivery } from './PlatformWebhooks.types' import { formatDeliveryStatus, statusBadgeVariant } from './PlatformWebhooksView.utils' +import { getStatusLevel } from '@/components/interfaces/UnifiedLogs/UnifiedLogs.utils' +import { DataTableColumnStatusCode } from '@/components/ui/DataTable/DataTableColumn/DataTableColumnStatusCode' interface PlatformWebhooksDeliveryDetailsSheetProps { deliveryAttempt: number | null diff --git a/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksEndpointDetails.tsx b/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksEndpointDetails.tsx index 6089437abd..560c78cb5b 100644 --- a/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksEndpointDetails.tsx +++ b/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksEndpointDetails.tsx @@ -8,9 +8,6 @@ import { type PaginationState, type SortingState, } from '@tanstack/react-table' -import { getStatusLevel } from 'components/interfaces/UnifiedLogs/UnifiedLogs.utils' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DataTableColumnStatusCode } from 'components/ui/DataTable/DataTableColumn/DataTableColumnStatusCode' import { ChevronLeft, ChevronRight, RotateCcw, Search } from 'lucide-react' import { useEffect, useState, type ReactNode } from 'react' import { @@ -32,6 +29,9 @@ import { TanStackTableHeadSort } from 'ui-patterns/Table' import type { WebhookDelivery, WebhookEndpoint } from './PlatformWebhooks.types' import { statusBadgeVariant } from './PlatformWebhooksView.utils' +import { getStatusLevel } from '@/components/interfaces/UnifiedLogs/UnifiedLogs.utils' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DataTableColumnStatusCode } from '@/components/ui/DataTable/DataTableColumn/DataTableColumnStatusCode' interface DetailItemProps { label: string diff --git a/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksEndpointList.tsx b/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksEndpointList.tsx index 5a01e2cd98..c803c61318 100644 --- a/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksEndpointList.tsx +++ b/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksEndpointList.tsx @@ -1,4 +1,3 @@ -import { createNavigationHandler } from 'lib/navigation' import { ChevronRight, Eye, MoreVertical, Plus, Search, Trash2, Webhook } from 'lucide-react' import { useRouter } from 'next/router' import { useMemo, useState } from 'react' @@ -23,6 +22,7 @@ import { Input } from 'ui-patterns/DataInputs/Input' import type { WebhookEndpoint } from './PlatformWebhooks.types' import { getWebhookEndpointDisplayName } from './PlatformWebhooks.utils' +import { createNavigationHandler } from '@/lib/navigation' interface PlatformWebhooksEndpointListProps { filteredEndpoints: WebhookEndpoint[] diff --git a/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksEndpointSheet.test.tsx b/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksEndpointSheet.test.tsx index 9095fb882a..8feffdcfbf 100644 --- a/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksEndpointSheet.test.tsx +++ b/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksEndpointSheet.test.tsx @@ -1,11 +1,11 @@ import { fireEvent, screen, waitFor } from '@testing-library/react' import userEvent from '@testing-library/user-event' import type { ComponentProps } from 'react' -import { customRender } from 'tests/lib/custom-render' import { afterEach, describe, expect, it, vi } from 'vitest' import type { WebhookEndpoint } from './PlatformWebhooks.types' import { PlatformWebhooksEndpointSheet } from './PlatformWebhooksEndpointSheet' +import { customRender } from '@/tests/lib/custom-render' const { generateWebhookEndpointNameMock } = vi.hoisted(() => ({ generateWebhookEndpointNameMock: vi.fn(() => 'winged-envelope'), diff --git a/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksEndpointSheet.tsx b/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksEndpointSheet.tsx index c2460b8b06..7f2a579e7f 100644 --- a/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksEndpointSheet.tsx +++ b/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksEndpointSheet.tsx @@ -1,7 +1,4 @@ import { zodResolver } from '@hookform/resolvers/zod' -import { DiscardChangesConfirmationDialog } from 'components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' -import { InlineLink } from 'components/ui/InlineLink' -import { useConfirmOnClose } from 'hooks/ui/useConfirmOnClose' import { ChevronDown, Trash2 } from 'lucide-react' import { useEffect, useMemo, useState } from 'react' import { useForm } from 'react-hook-form' @@ -39,6 +36,9 @@ import type { WebhookScope, } from './PlatformWebhooks.types' import { generateWebhookEndpointName } from './PlatformWebhooks.utils' +import { DiscardChangesConfirmationDialog } from '@/components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' +import { InlineLink } from '@/components/ui/InlineLink' +import { useConfirmOnClose } from '@/hooks/ui/useConfirmOnClose' import { httpEndpointUrlSchema } from '@/lib/validation/http-url' const endpointFormSchema = z diff --git a/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksHeader.tsx b/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksHeader.tsx index 30acfbc864..8519ca5951 100644 --- a/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksHeader.tsx +++ b/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksHeader.tsx @@ -1,4 +1,3 @@ -import { DocsButton } from 'components/ui/DocsButton' import Link from 'next/link' import { ReactNode } from 'react' import { @@ -20,6 +19,8 @@ import { PageHeaderTitle, } from 'ui-patterns/PageHeader' +import { DocsButton } from '@/components/ui/DocsButton' + interface PlatformWebhooksHeaderProps { hasSelectedEndpoint: boolean headerTitle: string diff --git a/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksPage.tsx b/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksPage.tsx index 388cfe7f81..e1f9f85d5f 100644 --- a/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksPage.tsx +++ b/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksPage.tsx @@ -1,7 +1,4 @@ import { useParams } from 'common' -import { useIsPlatformWebhooksEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' -import { InlineLink } from 'components/ui/InlineLink' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { EllipsisVertical, Pencil, RotateCw, Trash2 } from 'lucide-react' import { useRouter } from 'next/router' import { parseAsString, parseAsStringLiteral, useQueryState } from 'nuqs' @@ -52,6 +49,9 @@ import { setPendingSigningSecretReveal, shouldHandleEndpointNotFound, } from './PlatformWebhooksPage.utils' +import { useIsPlatformWebhooksEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import { InlineLink } from '@/components/ui/InlineLink' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' const PANEL_VALUES = ['create', 'edit'] as const diff --git a/apps/studio/components/interfaces/ProjectAPIDocs/Content/Bucket.tsx b/apps/studio/components/interfaces/ProjectAPIDocs/Content/Bucket.tsx index 1da02d31f5..86408805af 100644 --- a/apps/studio/components/interfaces/ProjectAPIDocs/Content/Bucket.tsx +++ b/apps/studio/components/interfaces/ProjectAPIDocs/Content/Bucket.tsx @@ -1,13 +1,13 @@ +import { useQueryClient } from '@tanstack/react-query' import { useParams } from 'common' import { Badge } from 'ui' -import { useQueryClient } from '@tanstack/react-query' -import { useBucketInfoQueryPreferCached } from 'data/storage/buckets-query' -import { formatBytes } from 'lib/helpers' -import { useAppStateSnapshot } from 'state/app-state' import { DOCS_RESOURCE_CONTENT } from '../ProjectAPIDocs.constants' import ResourceContent from '../ResourceContent' import type { ContentProps } from './Content.types' +import { useBucketInfoQueryPreferCached } from '@/data/storage/buckets-query' +import { formatBytes } from '@/lib/helpers' +import { useAppStateSnapshot } from '@/state/app-state' export const Bucket = ({ language, apikey, endpoint }: ContentProps) => { const queryClient = useQueryClient() diff --git a/apps/studio/components/interfaces/ProjectAPIDocs/Content/EdgeFunction.tsx b/apps/studio/components/interfaces/ProjectAPIDocs/Content/EdgeFunction.tsx index 89079425be..5675aeb6a6 100644 --- a/apps/studio/components/interfaces/ProjectAPIDocs/Content/EdgeFunction.tsx +++ b/apps/studio/components/interfaces/ProjectAPIDocs/Content/EdgeFunction.tsx @@ -1,10 +1,10 @@ import { useParams } from 'common' -import { useEdgeFunctionsQuery } from 'data/edge-functions/edge-functions-query' -import { useAppStateSnapshot } from 'state/app-state' import { DOCS_RESOURCE_CONTENT } from '../ProjectAPIDocs.constants' import ResourceContent from '../ResourceContent' import type { ContentProps } from './Content.types' +import { useEdgeFunctionsQuery } from '@/data/edge-functions/edge-functions-query' +import { useAppStateSnapshot } from '@/state/app-state' export const EdgeFunction = ({ language, apikey = 'API_KEY', endpoint }: ContentProps) => { const { ref } = useParams() diff --git a/apps/studio/components/interfaces/ProjectAPIDocs/Content/Entities.tsx b/apps/studio/components/interfaces/ProjectAPIDocs/Content/Entities.tsx index 53c09429b6..422677d63a 100644 --- a/apps/studio/components/interfaces/ProjectAPIDocs/Content/Entities.tsx +++ b/apps/studio/components/interfaces/ProjectAPIDocs/Content/Entities.tsx @@ -1,16 +1,16 @@ +import { useParams } from 'common' import { Download } from 'lucide-react' import { useState } from 'react' import { toast } from 'sonner' - -import { useParams } from 'common' -import { DocsButton } from 'components/ui/DocsButton' -import { useProjectPostgrestConfigQuery } from 'data/config/project-postgrest-config-query' -import { generateTypes } from 'data/projects/project-type-generation-query' -import { DOCS_URL } from 'lib/constants' import { Button } from 'ui' + import ContentSnippet from '../ContentSnippet' import { DOCS_CONTENT } from '../ProjectAPIDocs.constants' import type { ContentProps } from './Content.types' +import { DocsButton } from '@/components/ui/DocsButton' +import { useProjectPostgrestConfigQuery } from '@/data/config/project-postgrest-config-query' +import { generateTypes } from '@/data/projects/project-type-generation-query' +import { DOCS_URL } from '@/lib/constants' export const Entities = ({ language }: ContentProps) => { const { ref } = useParams() diff --git a/apps/studio/components/interfaces/ProjectAPIDocs/Content/Entity.tsx b/apps/studio/components/interfaces/ProjectAPIDocs/Content/Entity.tsx index 13a7597a09..644bc01ed0 100644 --- a/apps/studio/components/interfaces/ProjectAPIDocs/Content/Entity.tsx +++ b/apps/studio/components/interfaces/ProjectAPIDocs/Content/Entity.tsx @@ -1,14 +1,14 @@ import { useParams } from 'common' import { useEffect } from 'react' -import Table from 'components/to-be-cleaned/Table' -import { useProjectJsonSchemaQuery } from 'data/docs/project-json-schema-query' -import { useAppStateSnapshot } from 'state/app-state' import LanguageSelector from '../LanguageSelector' import { DOCS_RESOURCE_CONTENT } from '../ProjectAPIDocs.constants' import ResourceContent from '../ResourceContent' import type { ContentProps } from './Content.types' import { tempRemovePostgrestText } from './Content.utils' +import Table from '@/components/to-be-cleaned/Table' +import { useProjectJsonSchemaQuery } from '@/data/docs/project-json-schema-query' +import { useAppStateSnapshot } from '@/state/app-state' function getColumnType(type: string, format: string) { // json and jsonb both have type=undefined, so check format instead diff --git a/apps/studio/components/interfaces/ProjectAPIDocs/Content/Introduction.tsx b/apps/studio/components/interfaces/ProjectAPIDocs/Content/Introduction.tsx index 8ea337222d..4448023a08 100644 --- a/apps/studio/components/interfaces/ProjectAPIDocs/Content/Introduction.tsx +++ b/apps/studio/components/interfaces/ProjectAPIDocs/Content/Introduction.tsx @@ -2,16 +2,16 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' import { Copy } from 'lucide-react' import { useEffect, useState } from 'react' -import { Button, Input, copyToClipboard } from 'ui' +import { Button, copyToClipboard, Input } from 'ui' -import { getKeys, useAPIKeysQuery } from 'data/api-keys/api-keys-query' -import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import ContentSnippet from '../ContentSnippet' import { DOCS_CONTENT } from '../ProjectAPIDocs.constants' import type { ContentProps } from './Content.types' +import { getKeys, useAPIKeysQuery } from '@/data/api-keys/api-keys-query' +import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' export const Introduction = ({ showKeys, language, apikey, endpoint }: ContentProps) => { const { ref } = useParams() diff --git a/apps/studio/components/interfaces/ProjectAPIDocs/Content/RPC.tsx b/apps/studio/components/interfaces/ProjectAPIDocs/Content/RPC.tsx index 8f13ca96ea..1f12a36c41 100644 --- a/apps/studio/components/interfaces/ProjectAPIDocs/Content/RPC.tsx +++ b/apps/studio/components/interfaces/ProjectAPIDocs/Content/RPC.tsx @@ -2,13 +2,13 @@ import { useParams } from 'common' import { useEffect } from 'react' import { Badge } from 'ui' -import Table from 'components/to-be-cleaned/Table' -import { useProjectJsonSchemaQuery } from 'data/docs/project-json-schema-query' -import { useOpenAPISpecQuery } from 'data/open-api/api-spec-query' -import { useAppStateSnapshot } from 'state/app-state' import { DOCS_RESOURCE_CONTENT } from '../ProjectAPIDocs.constants' import ResourceContent from '../ResourceContent' import type { ContentProps } from './Content.types' +import Table from '@/components/to-be-cleaned/Table' +import { useProjectJsonSchemaQuery } from '@/data/docs/project-json-schema-query' +import { useOpenAPISpecQuery } from '@/data/open-api/api-spec-query' +import { useAppStateSnapshot } from '@/state/app-state' export const RPC = ({ language }: ContentProps) => { const { ref } = useParams() diff --git a/apps/studio/components/interfaces/ProjectAPIDocs/Content/UserManagement.tsx b/apps/studio/components/interfaces/ProjectAPIDocs/Content/UserManagement.tsx index 0c502381fc..b3dccf177d 100644 --- a/apps/studio/components/interfaces/ProjectAPIDocs/Content/UserManagement.tsx +++ b/apps/studio/components/interfaces/ProjectAPIDocs/Content/UserManagement.tsx @@ -1,7 +1,7 @@ -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import ContentSnippet from '../ContentSnippet' import { DOCS_CONTENT } from '../ProjectAPIDocs.constants' import type { ContentProps } from './Content.types' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' export const UserManagement = ({ language, apikey, endpoint }: ContentProps) => { const { authenticationSignInProviders } = useIsFeatureEnabled([ diff --git a/apps/studio/components/interfaces/ProjectAPIDocs/FirstLevelNav.tsx b/apps/studio/components/interfaces/ProjectAPIDocs/FirstLevelNav.tsx index d6b81fb57c..612c056c5f 100644 --- a/apps/studio/components/interfaces/ProjectAPIDocs/FirstLevelNav.tsx +++ b/apps/studio/components/interfaces/ProjectAPIDocs/FirstLevelNav.tsx @@ -1,20 +1,20 @@ +import { useParams } from 'common' +import { Book, BookOpen } from 'lucide-react' import Link from 'next/link' import { Fragment, type ReactNode } from 'react' import SVG from 'react-inlinesvg' - -import { useParams } from 'common' -import { InfiniteListDefault, type RowComponentBaseProps } from 'components/ui/InfiniteList' -import { useEdgeFunctionsQuery } from 'data/edge-functions/edge-functions-query' -import { useOpenAPISpecQuery } from 'data/open-api/api-spec-query' -import { usePaginatedBucketsQuery, type Bucket } from 'data/storage/buckets-query' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { BASE_PATH, DOCS_URL } from 'lib/constants' -import { Book, BookOpen } from 'lucide-react' -import { useAppStateSnapshot } from 'state/app-state' import { Button, cn } from 'ui' import { ShimmeringLoader } from 'ui-patterns' + import { navigateToSection } from './Content/Content.utils' import { API_DOCS_CATEGORIES, DOCS_CONTENT, DOCS_MENU } from './ProjectAPIDocs.constants' +import { InfiniteListDefault, type RowComponentBaseProps } from '@/components/ui/InfiniteList' +import { useEdgeFunctionsQuery } from '@/data/edge-functions/edge-functions-query' +import { useOpenAPISpecQuery } from '@/data/open-api/api-spec-query' +import { usePaginatedBucketsQuery, type Bucket } from '@/data/storage/buckets-query' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { BASE_PATH, DOCS_URL } from '@/lib/constants' +import { useAppStateSnapshot } from '@/state/app-state' type DocsSections = typeof DOCS_MENU type DocsSection = DocsSections[number] diff --git a/apps/studio/components/interfaces/ProjectAPIDocs/LanguageSelector.tsx b/apps/studio/components/interfaces/ProjectAPIDocs/LanguageSelector.tsx index e6b714ae1b..05468575b7 100644 --- a/apps/studio/components/interfaces/ProjectAPIDocs/LanguageSelector.tsx +++ b/apps/studio/components/interfaces/ProjectAPIDocs/LanguageSelector.tsx @@ -1,18 +1,19 @@ -import { BASE_PATH } from 'lib/constants' -import { Terminal, ChevronDown } from 'lucide-react' +import { ChevronDown, Terminal } from 'lucide-react' import { useState } from 'react' -import { useAppStateSnapshot } from 'state/app-state' import { Button, + Command_Shadcn_, CommandGroup_Shadcn_, CommandItem_Shadcn_, CommandList_Shadcn_, - Command_Shadcn_, + Popover_Shadcn_, PopoverContent_Shadcn_, PopoverTrigger_Shadcn_, - Popover_Shadcn_, } from 'ui' +import { BASE_PATH } from '@/lib/constants' +import { useAppStateSnapshot } from '@/state/app-state' + interface LanguageSelectorProps { /** * Only show icons to represent the language diff --git a/apps/studio/components/interfaces/ProjectAPIDocs/ProjectAPIDocs.Commands.tsx b/apps/studio/components/interfaces/ProjectAPIDocs/ProjectAPIDocs.Commands.tsx index 7a0bcf3ba2..fbf01d8e05 100644 --- a/apps/studio/components/interfaces/ProjectAPIDocs/ProjectAPIDocs.Commands.tsx +++ b/apps/studio/components/interfaces/ProjectAPIDocs/ProjectAPIDocs.Commands.tsx @@ -1,6 +1,7 @@ import { useParams } from 'common' import type { CommandOptions } from 'ui-patterns/CommandMenu' import { useRegisterCommands } from 'ui-patterns/CommandMenu' + import { COMMAND_MENU_SECTIONS } from '../App/CommandMenu/CommandMenu.utils' export function useApiDocsGotoCommands(options?: CommandOptions) { diff --git a/apps/studio/components/interfaces/ProjectAPIDocs/ProjectAPIDocs.constants.ts b/apps/studio/components/interfaces/ProjectAPIDocs/ProjectAPIDocs.constants.ts index 3ef5dc24ff..5480c11140 100644 --- a/apps/studio/components/interfaces/ProjectAPIDocs/ProjectAPIDocs.constants.ts +++ b/apps/studio/components/interfaces/ProjectAPIDocs/ProjectAPIDocs.constants.ts @@ -1,4 +1,4 @@ -import { DOCS_URL } from 'lib/constants' +import { DOCS_URL } from '@/lib/constants' export const API_DOCS_CATEGORIES = { INTRODUCTION: 'introduction', diff --git a/apps/studio/components/interfaces/ProjectAPIDocs/ProjectAPIDocs.tsx b/apps/studio/components/interfaces/ProjectAPIDocs/ProjectAPIDocs.tsx index a2ead02366..2e86d2b693 100644 --- a/apps/studio/components/interfaces/ProjectAPIDocs/ProjectAPIDocs.tsx +++ b/apps/studio/components/interfaces/ProjectAPIDocs/ProjectAPIDocs.tsx @@ -1,9 +1,6 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { getKeys, useAPIKeysQuery } from 'data/api-keys/api-keys-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { useState } from 'react' -import { useAppStateSnapshot } from 'state/app-state' import { Button, SidePanel } from 'ui' import { Bucket } from './Content/Bucket' @@ -20,7 +17,10 @@ import { UserManagement } from './Content/UserManagement' import { FirstLevelNav } from './FirstLevelNav' import LanguageSelector from './LanguageSelector' import { SecondLevelNav } from './SecondLevelNav' +import { getKeys, useAPIKeysQuery } from '@/data/api-keys/api-keys-query' import { useProjectApiUrl } from '@/data/config/project-endpoint-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useAppStateSnapshot } from '@/state/app-state' /** * [Joshen] Reminder: when we choose to release this as a main feature diff --git a/apps/studio/components/interfaces/ProjectAPIDocs/SecondLevelNav.Layout.tsx b/apps/studio/components/interfaces/ProjectAPIDocs/SecondLevelNav.Layout.tsx index e8c4978a4e..d3f5196b5e 100644 --- a/apps/studio/components/interfaces/ProjectAPIDocs/SecondLevelNav.Layout.tsx +++ b/apps/studio/components/interfaces/ProjectAPIDocs/SecondLevelNav.Layout.tsx @@ -1,8 +1,5 @@ import { ChevronLeft, Code } from 'lucide-react' import { useMemo, useState, type PropsWithChildren, type ReactNode } from 'react' - -import { DocsButton } from 'components/ui/DocsButton' -import { useAppStateSnapshot } from 'state/app-state' import { Alert_Shadcn_, AlertDescription_Shadcn_, @@ -13,9 +10,12 @@ import { PopoverContent_Shadcn_, PopoverTrigger_Shadcn_, } from 'ui' + import { useIsAPIDocsSidePanelEnabled } from '../App/FeaturePreview/FeaturePreviewContext' import { navigateToSection } from './Content/Content.utils' import { DOCS_RESOURCE_CONTENT } from './ProjectAPIDocs.constants' +import { DocsButton } from '@/components/ui/DocsButton' +import { useAppStateSnapshot } from '@/state/app-state' type DocsResourceContentItem = (typeof DOCS_RESOURCE_CONTENT)[keyof typeof DOCS_RESOURCE_CONTENT] diff --git a/apps/studio/components/interfaces/ProjectAPIDocs/SecondLevelNav.ResourcePicker.tsx b/apps/studio/components/interfaces/ProjectAPIDocs/SecondLevelNav.ResourcePicker.tsx index 633069568e..a0f04bcfd6 100644 --- a/apps/studio/components/interfaces/ProjectAPIDocs/SecondLevelNav.ResourcePicker.tsx +++ b/apps/studio/components/interfaces/ProjectAPIDocs/SecondLevelNav.ResourcePicker.tsx @@ -5,6 +5,7 @@ import { CommandItem_Shadcn_, CommandList_Shadcn_, } from 'ui' + import type { ResourcePickerRenderProps } from './SecondLevelNav.Layout' type NamedResource = { name: string } diff --git a/apps/studio/components/interfaces/ProjectAPIDocs/SecondLevelNav.StoragePicker.tsx b/apps/studio/components/interfaces/ProjectAPIDocs/SecondLevelNav.StoragePicker.tsx index 62455fda41..3433213358 100644 --- a/apps/studio/components/interfaces/ProjectAPIDocs/SecondLevelNav.StoragePicker.tsx +++ b/apps/studio/components/interfaces/ProjectAPIDocs/SecondLevelNav.StoragePicker.tsx @@ -1,7 +1,6 @@ +import { keepPreviousData } from '@tanstack/react-query' import { useDebounce, useIntersectionObserver } from '@uidotdev/usehooks' import { useEffect, useMemo, useRef, useState } from 'react' - -import { usePaginatedBucketsQuery } from 'data/storage/buckets-query' import { cn, Command_Shadcn_, @@ -11,8 +10,9 @@ import { CommandItem_Shadcn_, CommandList_Shadcn_, } from 'ui' + import type { ResourcePickerRenderProps } from './SecondLevelNav.Layout' -import { keepPreviousData } from '@tanstack/react-query' +import { usePaginatedBucketsQuery } from '@/data/storage/buckets-query' type StorageResourceListProps = ResourcePickerRenderProps & { projectRef?: string diff --git a/apps/studio/components/interfaces/ProjectAPIDocs/SecondLevelNav.tsx b/apps/studio/components/interfaces/ProjectAPIDocs/SecondLevelNav.tsx index d16dbb30fb..cbe1ed9966 100644 --- a/apps/studio/components/interfaces/ProjectAPIDocs/SecondLevelNav.tsx +++ b/apps/studio/components/interfaces/ProjectAPIDocs/SecondLevelNav.tsx @@ -1,15 +1,15 @@ import { useParams } from 'common' import { type ReactNode } from 'react' -import { useEdgeFunctionsQuery } from 'data/edge-functions/edge-functions-query' -import { useOpenAPISpecQuery } from 'data/open-api/api-spec-query' -import { useBucketInfoQueryPreferCached } from 'data/storage/buckets-query' -import { DOCS_URL } from 'lib/constants' -import { useAppStateSnapshot } from 'state/app-state' import { API_DOCS_CATEGORIES } from './ProjectAPIDocs.constants' import { SecondLevelNavLayout, type MenuItemFilter } from './SecondLevelNav.Layout' import { ResourcePickerList } from './SecondLevelNav.ResourcePicker' import { StorageResourceList } from './SecondLevelNav.StoragePicker' +import { useEdgeFunctionsQuery } from '@/data/edge-functions/edge-functions-query' +import { useOpenAPISpecQuery } from '@/data/open-api/api-spec-query' +import { useBucketInfoQueryPreferCached } from '@/data/storage/buckets-query' +import { DOCS_URL } from '@/lib/constants' +import { useAppStateSnapshot } from '@/state/app-state' const OPEN_API_SPEC_STALE_TIME = 1000 * 60 * 10 diff --git a/apps/studio/components/interfaces/ProjectCreation/AdvancedConfiguration.tsx b/apps/studio/components/interfaces/ProjectCreation/AdvancedConfiguration.tsx index be46698b7f..1bda90fbe5 100644 --- a/apps/studio/components/interfaces/ProjectCreation/AdvancedConfiguration.tsx +++ b/apps/studio/components/interfaces/ProjectCreation/AdvancedConfiguration.tsx @@ -1,14 +1,12 @@ import { useFlag } from 'common' -import { DocsButton } from 'components/ui/DocsButton' -import Panel from 'components/ui/Panel' -import { DOCS_URL } from 'lib/constants' import { ChevronRight } from 'lucide-react' import { UseFormReturn } from 'react-hook-form' import { Badge, + cn, + Collapsible_Shadcn_, CollapsibleContent_Shadcn_, CollapsibleTrigger_Shadcn_, - Collapsible_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, FormItem_Shadcn_, @@ -17,12 +15,14 @@ import { Tooltip, TooltipContent, TooltipTrigger, - cn, } from 'ui' import { Admonition } from 'ui-patterns' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { CreateProjectForm } from './ProjectCreation.schema' +import { DocsButton } from '@/components/ui/DocsButton' +import Panel from '@/components/ui/Panel' +import { DOCS_URL } from '@/lib/constants' interface AdvancedConfigurationProps { form: UseFormReturn diff --git a/apps/studio/components/interfaces/ProjectCreation/CloudProviderSelector.tsx b/apps/studio/components/interfaces/ProjectCreation/CloudProviderSelector.tsx index 92e6f70ea5..aac1034f9b 100644 --- a/apps/studio/components/interfaces/ProjectCreation/CloudProviderSelector.tsx +++ b/apps/studio/components/interfaces/ProjectCreation/CloudProviderSelector.tsx @@ -1,8 +1,4 @@ import { UseFormReturn } from 'react-hook-form' - -import Panel from 'components/ui/Panel' -import { useCustomContent } from 'hooks/custom-content/useCustomContent' -import { PROVIDERS } from 'lib/constants' import { FormControl_Shadcn_, FormField_Shadcn_, @@ -14,7 +10,11 @@ import { SelectValue_Shadcn_, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' + import { CreateProjectForm } from './ProjectCreation.schema' +import Panel from '@/components/ui/Panel' +import { useCustomContent } from '@/hooks/custom-content/useCustomContent' +import { PROVIDERS } from '@/lib/constants' interface CloudProviderSelectorProps { form: UseFormReturn diff --git a/apps/studio/components/interfaces/ProjectCreation/ComputeSizeSelector.tsx b/apps/studio/components/interfaces/ProjectCreation/ComputeSizeSelector.tsx index 6221b563f2..994291878d 100644 --- a/apps/studio/components/interfaces/ProjectCreation/ComputeSizeSelector.tsx +++ b/apps/studio/components/interfaces/ProjectCreation/ComputeSizeSelector.tsx @@ -1,10 +1,4 @@ import { UseFormReturn } from 'react-hook-form' - -import { InlineLink } from 'components/ui/InlineLink' -import Panel from 'components/ui/Panel' -import { instanceSizeSpecs } from 'data/projects/new-project.constants' -import { getCloudProviderArchitecture } from 'lib/cloudprovider-utils' -import { DOCS_URL } from 'lib/constants' import { CloudProvider } from 'shared-data' import { FormField_Shadcn_, @@ -17,8 +11,14 @@ import { } from 'ui' import { ComputeBadge } from 'ui-patterns' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' + import { sizes } from './ProjectCreation.constants' import { CreateProjectForm } from './ProjectCreation.schema' +import { InlineLink } from '@/components/ui/InlineLink' +import Panel from '@/components/ui/Panel' +import { instanceSizeSpecs } from '@/data/projects/new-project.constants' +import { getCloudProviderArchitecture } from '@/lib/cloudprovider-utils' +import { DOCS_URL } from '@/lib/constants' interface ComputeSizeSelectorProps { form: UseFormReturn diff --git a/apps/studio/components/interfaces/ProjectCreation/CustomPostgresVersionInput.tsx b/apps/studio/components/interfaces/ProjectCreation/CustomPostgresVersionInput.tsx index 27e514e3dc..4bfe98b4f6 100644 --- a/apps/studio/components/interfaces/ProjectCreation/CustomPostgresVersionInput.tsx +++ b/apps/studio/components/interfaces/ProjectCreation/CustomPostgresVersionInput.tsx @@ -1,9 +1,9 @@ import { UseFormReturn } from 'react-hook-form' - -import Panel from 'components/ui/Panel' import { FormControl_Shadcn_, FormField_Shadcn_, Input_Shadcn_ } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' + import { CreateProjectForm } from './ProjectCreation.schema' +import Panel from '@/components/ui/Panel' interface CustomPostgresVersionInputProps { form: UseFormReturn diff --git a/apps/studio/components/interfaces/ProjectCreation/DatabasePasswordInput.tsx b/apps/studio/components/interfaces/ProjectCreation/DatabasePasswordInput.tsx index 450a2906fe..2e116ffea2 100644 --- a/apps/studio/components/interfaces/ProjectCreation/DatabasePasswordInput.tsx +++ b/apps/studio/components/interfaces/ProjectCreation/DatabasePasswordInput.tsx @@ -1,15 +1,15 @@ import { UseFormReturn } from 'react-hook-form' - -import Panel from 'components/ui/Panel' -import { PasswordStrengthBar } from 'components/ui/PasswordStrengthBar' -import { passwordStrength } from 'lib/password-strength' -import { generateStrongPassword } from 'lib/project' import { FormControl_Shadcn_, FormField_Shadcn_ } from 'ui' import { Input } from 'ui-patterns/DataInputs/Input' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' + import { DATABASE_PASSWORD_REGEX } from './ProjectCreation.constants' import { CreateProjectForm } from './ProjectCreation.schema' import { SpecialSymbolsCallout } from './SpecialSymbolsCallout' +import Panel from '@/components/ui/Panel' +import { PasswordStrengthBar } from '@/components/ui/PasswordStrengthBar' +import { passwordStrength } from '@/lib/password-strength' +import { generateStrongPassword } from '@/lib/project' interface DatabasePasswordInputProps { form: UseFormReturn diff --git a/apps/studio/components/interfaces/ProjectCreation/DisabledWarningDueToIncident.tsx b/apps/studio/components/interfaces/ProjectCreation/DisabledWarningDueToIncident.tsx index e18d5efb3a..6409977265 100644 --- a/apps/studio/components/interfaces/ProjectCreation/DisabledWarningDueToIncident.tsx +++ b/apps/studio/components/interfaces/ProjectCreation/DisabledWarningDueToIncident.tsx @@ -1,7 +1,7 @@ import { AlertCircle } from 'lucide-react' -import InformationBox from 'components/ui/InformationBox' -import Panel from 'components/ui/Panel' +import InformationBox from '@/components/ui/InformationBox' +import Panel from '@/components/ui/Panel' interface DisabledWarningDueToIncidentProps { title: string diff --git a/apps/studio/components/interfaces/ProjectCreation/FreeProjectLimitWarning.tsx b/apps/studio/components/interfaces/ProjectCreation/FreeProjectLimitWarning.tsx index b2168a3c4b..e3b8389232 100644 --- a/apps/studio/components/interfaces/ProjectCreation/FreeProjectLimitWarning.tsx +++ b/apps/studio/components/interfaces/ProjectCreation/FreeProjectLimitWarning.tsx @@ -1,8 +1,9 @@ -import Panel from 'components/ui/Panel' -import { UpgradePlanButton } from 'components/ui/UpgradePlanButton' -import type { MemberWithFreeProjectLimit } from 'data/organizations/free-project-limit-check-query' import { Admonition } from 'ui-patterns/admonition' +import Panel from '@/components/ui/Panel' +import { UpgradePlanButton } from '@/components/ui/UpgradePlanButton' +import type { MemberWithFreeProjectLimit } from '@/data/organizations/free-project-limit-check-query' + interface FreeProjectLimitWarningProps { membersExceededLimit: MemberWithFreeProjectLimit[] } diff --git a/apps/studio/components/interfaces/ProjectCreation/HighAvailabilityInput.tsx b/apps/studio/components/interfaces/ProjectCreation/HighAvailabilityInput.tsx index 6c49d90d5f..5503ed8d93 100644 --- a/apps/studio/components/interfaces/ProjectCreation/HighAvailabilityInput.tsx +++ b/apps/studio/components/interfaces/ProjectCreation/HighAvailabilityInput.tsx @@ -1,11 +1,11 @@ import Link from 'next/link' import { UseFormReturn } from 'react-hook-form' - -import Panel from 'components/ui/Panel' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' import { FormControl_Shadcn_, FormField_Shadcn_, Switch } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' + import { CreateProjectForm } from './ProjectCreation.schema' +import Panel from '@/components/ui/Panel' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' interface HighAvailabilityInputProps { form: UseFormReturn diff --git a/apps/studio/components/interfaces/ProjectCreation/OrganizationSelector.tsx b/apps/studio/components/interfaces/ProjectCreation/OrganizationSelector.tsx index c27ef8867e..79f278e3d7 100644 --- a/apps/studio/components/interfaces/ProjectCreation/OrganizationSelector.tsx +++ b/apps/studio/components/interfaces/ProjectCreation/OrganizationSelector.tsx @@ -1,16 +1,9 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useQueryClient } from '@tanstack/react-query' +import { useParams } from 'common' import { useRouter } from 'next/router' import { useEffect } from 'react' import { UseFormReturn } from 'react-hook-form' - -import { useParams } from 'common' -import { NoPermission } from 'components/ui/NoPermission' -import Panel from 'components/ui/Panel' -import { permissionKeys } from 'data/permissions/keys' -import { useOrganizationsQuery } from 'data/organizations/organizations-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { Badge, FormControl_Shadcn_, @@ -23,8 +16,15 @@ import { SelectValue_Shadcn_, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' + import { OrgNotFound } from '../Organization/OrgNotFound' import { CreateProjectForm } from './ProjectCreation.schema' +import { NoPermission } from '@/components/ui/NoPermission' +import Panel from '@/components/ui/Panel' +import { useOrganizationsQuery } from '@/data/organizations/organizations-query' +import { permissionKeys } from '@/data/permissions/keys' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' interface OrganizationSelectorProps { form: UseFormReturn diff --git a/apps/studio/components/interfaces/ProjectCreation/PostgresVersionSelector.tsx b/apps/studio/components/interfaces/ProjectCreation/PostgresVersionSelector.tsx index 01d41c55a1..c7f99a211c 100644 --- a/apps/studio/components/interfaces/ProjectCreation/PostgresVersionSelector.tsx +++ b/apps/studio/components/interfaces/ProjectCreation/PostgresVersionSelector.tsx @@ -1,22 +1,22 @@ import { useEffect } from 'react' import { ControllerRenderProps, UseFormReturn } from 'react-hook-form' - -import { useProjectCreationPostgresVersionsQuery } from 'data/config/project-creation-postgres-versions-query' -import { useProjectUnpausePostgresVersionsQuery } from 'data/config/project-unpause-postgres-versions-query' -import { PostgresEngine, ReleaseChannel } from 'data/projects/new-project.constants' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import type { CloudProvider } from 'shared-data' import { Badge, + Select_Shadcn_, SelectContent_Shadcn_, SelectGroup_Shadcn_, SelectItem_Shadcn_, SelectTrigger_Shadcn_, SelectValue_Shadcn_, - Select_Shadcn_, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' + import { smartRegionToExactRegion } from './ProjectCreation.utils' +import { useProjectCreationPostgresVersionsQuery } from '@/data/config/project-creation-postgres-versions-query' +import { useProjectUnpausePostgresVersionsQuery } from '@/data/config/project-unpause-postgres-versions-query' +import { PostgresEngine, ReleaseChannel } from '@/data/projects/new-project.constants' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface PostgresVersionDetails { postgresEngine?: Exclude diff --git a/apps/studio/components/interfaces/ProjectCreation/ProjectCreation.constants.ts b/apps/studio/components/interfaces/ProjectCreation/ProjectCreation.constants.ts index 75ef67137a..517d261d47 100644 --- a/apps/studio/components/interfaces/ProjectCreation/ProjectCreation.constants.ts +++ b/apps/studio/components/interfaces/ProjectCreation/ProjectCreation.constants.ts @@ -1,4 +1,4 @@ -import { DesiredInstanceSize } from 'data/projects/new-project.constants' +import { DesiredInstanceSize } from '@/data/projects/new-project.constants' // [Joshen] Obtained from https://gist.github.com/tadast/8827699 export const COUNTRY_LAT_LON = { diff --git a/apps/studio/components/interfaces/ProjectCreation/ProjectCreation.schema.ts b/apps/studio/components/interfaces/ProjectCreation/ProjectCreation.schema.ts index 0616efe99c..47d9c21209 100644 --- a/apps/studio/components/interfaces/ProjectCreation/ProjectCreation.schema.ts +++ b/apps/studio/components/interfaces/ProjectCreation/ProjectCreation.schema.ts @@ -1,6 +1,7 @@ -import { DEFAULT_MINIMUM_PASSWORD_STRENGTH } from 'lib/constants' import { z } from 'zod' +import { DEFAULT_MINIMUM_PASSWORD_STRENGTH } from '@/lib/constants' + export const FormSchema = z .object({ organization: z.string({ diff --git a/apps/studio/components/interfaces/ProjectCreation/ProjectCreation.test.ts b/apps/studio/components/interfaces/ProjectCreation/ProjectCreation.test.ts index 6c8c546b97..76babdb88d 100644 --- a/apps/studio/components/interfaces/ProjectCreation/ProjectCreation.test.ts +++ b/apps/studio/components/interfaces/ProjectCreation/ProjectCreation.test.ts @@ -1,4 +1,5 @@ import { expect, test } from 'vitest' + import { DATABASE_PASSWORD_REGEX } from './ProjectCreation.constants' test('Regex test to surface if password contains @, : or /', () => { diff --git a/apps/studio/components/interfaces/ProjectCreation/ProjectCreation.utils.ts b/apps/studio/components/interfaces/ProjectCreation/ProjectCreation.utils.ts index 142542f318..3b399505d9 100644 --- a/apps/studio/components/interfaces/ProjectCreation/ProjectCreation.utils.ts +++ b/apps/studio/components/interfaces/ProjectCreation/ProjectCreation.utils.ts @@ -1,8 +1,9 @@ -import { DesiredInstanceSize, instanceSizeSpecs } from 'data/projects/new-project.constants' import type { CloudProvider, Region } from 'shared-data' import { AWS_REGIONS, FLY_REGIONS } from 'shared-data' import { SMART_REGION_TO_EXACT_REGION_MAP } from 'shared-data/regions' +import { DesiredInstanceSize, instanceSizeSpecs } from '@/data/projects/new-project.constants' + export function smartRegionToExactRegion(smartOrExactRegion: string) { return SMART_REGION_TO_EXACT_REGION_MAP.get(smartOrExactRegion) ?? smartOrExactRegion } diff --git a/apps/studio/components/interfaces/ProjectCreation/ProjectCreationFooter.tsx b/apps/studio/components/interfaces/ProjectCreation/ProjectCreationFooter.tsx index 12f4be3623..790bdf4afc 100644 --- a/apps/studio/components/interfaces/ProjectCreation/ProjectCreationFooter.tsx +++ b/apps/studio/components/interfaces/ProjectCreation/ProjectCreationFooter.tsx @@ -1,13 +1,6 @@ +import { LOCAL_STORAGE_KEYS, useFlag } from 'common' import { useRouter } from 'next/router' import { UseFormReturn } from 'react-hook-form' - -import { LOCAL_STORAGE_KEYS, useFlag } from 'common' -import { InlineLink } from 'components/ui/InlineLink' -import { DesiredInstanceSize, instanceSizeSpecs } from 'data/projects/new-project.constants' -import { OrgProject } from 'data/projects/org-projects-infinite-query' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { DOCS_URL } from 'lib/constants' import { Badge, Button, @@ -20,8 +13,15 @@ import { TableRow, } from 'ui' import { InfoTooltip } from 'ui-patterns/info-tooltip' + import { CreateProjectForm } from './ProjectCreation.schema' import { instanceLabel, monthlyInstancePrice } from './ProjectCreation.utils' +import { InlineLink } from '@/components/ui/InlineLink' +import { DesiredInstanceSize, instanceSizeSpecs } from '@/data/projects/new-project.constants' +import { OrgProject } from '@/data/projects/org-projects-infinite-query' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { DOCS_URL } from '@/lib/constants' interface ProjectCreationFooterProps { form: UseFormReturn diff --git a/apps/studio/components/interfaces/ProjectCreation/ProjectNameInput.tsx b/apps/studio/components/interfaces/ProjectCreation/ProjectNameInput.tsx index 9d3be73eb2..e5e5387fdb 100644 --- a/apps/studio/components/interfaces/ProjectCreation/ProjectNameInput.tsx +++ b/apps/studio/components/interfaces/ProjectCreation/ProjectNameInput.tsx @@ -1,9 +1,9 @@ import { UseFormReturn } from 'react-hook-form' - -import Panel from 'components/ui/Panel' import { FormControl_Shadcn_, FormField_Shadcn_, Input_Shadcn_ } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' + import { CreateProjectForm } from './ProjectCreation.schema' +import Panel from '@/components/ui/Panel' interface ProjectNameInputProps { form: UseFormReturn diff --git a/apps/studio/components/interfaces/ProjectCreation/SecurityOptions.tsx b/apps/studio/components/interfaces/ProjectCreation/SecurityOptions.tsx index 4636b9a450..6a276e030c 100644 --- a/apps/studio/components/interfaces/ProjectCreation/SecurityOptions.tsx +++ b/apps/studio/components/interfaces/ProjectCreation/SecurityOptions.tsx @@ -1,4 +1,3 @@ -import Panel from 'components/ui/Panel' import Link from 'next/link' import { UseFormReturn } from 'react-hook-form' import { @@ -14,6 +13,7 @@ import { Admonition } from 'ui-patterns' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { CreateProjectForm } from './ProjectCreation.schema' +import Panel from '@/components/ui/Panel' interface SecurityOptionsProps { form: UseFormReturn diff --git a/apps/studio/components/interfaces/ProjectCreation/SpecialSymbolsCallout.tsx b/apps/studio/components/interfaces/ProjectCreation/SpecialSymbolsCallout.tsx index 92943b84cd..a2af77dac2 100644 --- a/apps/studio/components/interfaces/ProjectCreation/SpecialSymbolsCallout.tsx +++ b/apps/studio/components/interfaces/ProjectCreation/SpecialSymbolsCallout.tsx @@ -1,5 +1,5 @@ -import { InlineLink } from 'components/ui/InlineLink' -import { DOCS_URL } from 'lib/constants' +import { InlineLink } from '@/components/ui/InlineLink' +import { DOCS_URL } from '@/lib/constants' export const SpecialSymbolsCallout = () => { return ( diff --git a/apps/studio/components/interfaces/ProjectHome/ActivityStats.tsx b/apps/studio/components/interfaces/ProjectHome/ActivityStats.tsx index 59fb7186fb..d668179863 100644 --- a/apps/studio/components/interfaces/ProjectHome/ActivityStats.tsx +++ b/apps/studio/components/interfaces/ProjectHome/ActivityStats.tsx @@ -1,16 +1,16 @@ import { useParams } from 'common' -import { SingleStat } from 'components/ui/SingleStat' -import { useBranchesQuery } from 'data/branches/branches-query' -import { useBackupsQuery } from 'data/database/backups-query' -import { DatabaseMigration, useMigrationsQuery } from 'data/database/migrations-query' import dayjs from 'dayjs' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Archive, Database, GitBranch } from 'lucide-react' import { useMemo } from 'react' import { cn, Skeleton } from 'ui' import { TimestampInfo } from 'ui-patterns' import { ServiceStatus } from './ServiceStatus' +import { SingleStat } from '@/components/ui/SingleStat' +import { useBranchesQuery } from '@/data/branches/branches-query' +import { useBackupsQuery } from '@/data/database/backups-query' +import { DatabaseMigration, useMigrationsQuery } from '@/data/database/migrations-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' import { EMPTY_ARR } from '@/lib/void' export const ActivityStats = () => { diff --git a/apps/studio/components/interfaces/ProjectHome/AdvisorSection.tsx b/apps/studio/components/interfaces/ProjectHome/AdvisorSection.tsx index 6ce5ccaa87..9201ae2a27 100644 --- a/apps/studio/components/interfaces/ProjectHome/AdvisorSection.tsx +++ b/apps/studio/components/interfaces/ProjectHome/AdvisorSection.tsx @@ -1,20 +1,20 @@ import { useParams } from 'common' -import { LINTER_LEVELS } from 'components/interfaces/Linter/Linter.constants' -import { createLintSummaryPrompt } from 'components/interfaces/Linter/Linter.utils' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { AiAssistantDropdown } from 'components/ui/AiAssistantDropdown' -import { Lint, useProjectLintsQuery } from 'data/lint/lint-query' -import { useTrack } from 'lib/telemetry/track' import { BarChart, Shield } from 'lucide-react' import { useCallback, useMemo } from 'react' -import { useAdvisorStateSnapshot } from 'state/advisor-state' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { AiIconAnimation, Button, Card, CardContent, CardHeader, CardTitle } from 'ui' import { Row } from 'ui-patterns' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { Markdown } from '../Markdown' +import { LINTER_LEVELS } from '@/components/interfaces/Linter/Linter.constants' +import { createLintSummaryPrompt } from '@/components/interfaces/Linter/Linter.utils' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { AiAssistantDropdown } from '@/components/ui/AiAssistantDropdown' +import { Lint, useProjectLintsQuery } from '@/data/lint/lint-query' +import { useTrack } from '@/lib/telemetry/track' +import { useAdvisorStateSnapshot } from '@/state/advisor-state' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' export const AdvisorSection = ({ showEmptyState = false }: { showEmptyState?: boolean }) => { const { ref: projectRef } = useParams() diff --git a/apps/studio/components/interfaces/ProjectHome/ConnectSection.tsx b/apps/studio/components/interfaces/ProjectHome/ConnectSection.tsx index aa74633ace..a4e8c4ad76 100644 --- a/apps/studio/components/interfaces/ProjectHome/ConnectSection.tsx +++ b/apps/studio/components/interfaces/ProjectHome/ConnectSection.tsx @@ -1,7 +1,4 @@ import { IS_PLATFORM } from 'common' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { BASE_PATH, PROJECT_STATUS } from 'lib/constants' -import { useTrack } from 'lib/telemetry/track' import { ChevronRight } from 'lucide-react' import { useRouter } from 'next/router' import { parseAsBoolean, parseAsString, useQueryState } from 'nuqs' @@ -10,6 +7,9 @@ import { Card, CardContent, cn } from 'ui' import { useAvailableConnectModes } from '../ConnectSheet/useAvailableConnectModes' import { CONNECT_ACTIONS } from './ConnectSection.config' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { BASE_PATH, PROJECT_STATUS } from '@/lib/constants' +import { useTrack } from '@/lib/telemetry/track' import { useAppStateSnapshot } from '@/state/app-state' export const ConnectSection = () => { diff --git a/apps/studio/components/interfaces/ProjectHome/CustomReportSection.tsx b/apps/studio/components/interfaces/ProjectHome/CustomReportSection.tsx index 3764084ce0..0f133f7c50 100644 --- a/apps/studio/components/interfaces/ProjectHome/CustomReportSection.tsx +++ b/apps/studio/components/interfaces/ProjectHome/CustomReportSection.tsx @@ -10,35 +10,36 @@ import { arrayMove, rectSortingStrategy, SortableContext, useSortable } from '@d import { PermissionAction } from '@supabase/shared-types/out/constants' import { keepPreviousData } from '@tanstack/react-query' import { useParams } from 'common' -import { SnippetDropdown } from 'components/interfaces/ProjectHome/SnippetDropdown' -import { ReportBlock } from 'components/interfaces/Reports/ReportBlock/ReportBlock' -import { createSqlSnippetSkeletonV2 } from 'components/interfaces/SQLEditor/SQLEditor.utils' -import type { ChartConfig } from 'components/interfaces/SQLEditor/UtilityPanel/ChartConfig' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DEFAULT_CHART_CONFIG } from 'components/ui/QueryBlock/QueryBlock' -import { AnalyticsInterval } from 'data/analytics/constants' -import { useInvalidateAnalyticsQuery } from 'data/analytics/utils' -import { useContentInfiniteQuery } from 'data/content/content-infinite-query' -import { Content } from 'data/content/content-query' -import { - UpsertContentPayload, - useContentUpsertMutation, -} from 'data/content/content-upsert-mutation' import dayjs from 'dayjs' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { uuidv4 } from 'lib/helpers' -import { useProfile } from 'lib/profile' -import { useTrack } from 'lib/telemetry/track' import { Plus, RefreshCw } from 'lucide-react' import type { CSSProperties, DragEvent, ReactNode } from 'react' import { useCallback, useEffect, useMemo, useState } from 'react' import { toast } from 'sonner' -import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' -import type { Dashboards } from 'types' import { Button } from 'ui' import { Row } from 'ui-patterns' +import { SnippetDropdown } from '@/components/interfaces/ProjectHome/SnippetDropdown' +import { ReportBlock } from '@/components/interfaces/Reports/ReportBlock/ReportBlock' +import { createSqlSnippetSkeletonV2 } from '@/components/interfaces/SQLEditor/SQLEditor.utils' +import type { ChartConfig } from '@/components/interfaces/SQLEditor/UtilityPanel/ChartConfig' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DEFAULT_CHART_CONFIG } from '@/components/ui/QueryBlock/QueryBlock' +import { AnalyticsInterval } from '@/data/analytics/constants' +import { useInvalidateAnalyticsQuery } from '@/data/analytics/utils' +import { useContentInfiniteQuery } from '@/data/content/content-infinite-query' +import { Content } from '@/data/content/content-query' +import { + UpsertContentPayload, + useContentUpsertMutation, +} from '@/data/content/content-upsert-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { uuidv4 } from '@/lib/helpers' +import { useProfile } from '@/lib/profile' +import { useTrack } from '@/lib/telemetry/track' +import { useDatabaseSelectorStateSnapshot } from '@/state/database-selector' +import type { Dashboards } from '@/types' + export function CustomReportSection() { const startDate = dayjs().subtract(7, 'day').toISOString() const endDate = dayjs().toISOString() diff --git a/apps/studio/components/interfaces/ProjectHome/Home.tsx b/apps/studio/components/interfaces/ProjectHome/Home.tsx index 03c13ee156..1c092d9d43 100644 --- a/apps/studio/components/interfaces/ProjectHome/Home.tsx +++ b/apps/studio/components/interfaces/ProjectHome/Home.tsx @@ -1,17 +1,8 @@ import { DndContext, DragEndEvent, PointerSensor, useSensor, useSensors } from '@dnd-kit/core' import { arrayMove, SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable' import { IS_PLATFORM, useFlag, useParams } from 'common' -import { ProjectUsageSection as ProjectUsageSectionV1 } from 'components/interfaces/Home/ProjectUsageSection' -import { SortableSection } from 'components/interfaces/ProjectHome/SortableSection' -import { TopSection } from 'components/interfaces/ProjectHome/TopSection' -import { ScaffoldContainer, ScaffoldSection } from 'components/layouts/Scaffold' import dayjs from 'dayjs' -import { useLocalStorage } from 'hooks/misc/useLocalStorage' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { PROJECT_STATUS } from 'lib/constants' -import { useTrack } from 'lib/telemetry/track' import { useEffect, useRef } from 'react' -import { useAppStateSnapshot } from 'state/app-state' import { cn } from 'ui' import { AdvisorSection } from './AdvisorSection' @@ -19,6 +10,15 @@ import { ConnectSection } from './ConnectSection' import { CustomReportSection } from './CustomReportSection' import { DEFAULT_SECTION_ORDER, mergeSectionOrder } from './Home.utils' import { ProjectUsageSection as ProjectUsageSectionV2 } from './ProjectUsageSection' +import { ProjectUsageSection as ProjectUsageSectionV1 } from '@/components/interfaces/Home/ProjectUsageSection' +import { SortableSection } from '@/components/interfaces/ProjectHome/SortableSection' +import { TopSection } from '@/components/interfaces/ProjectHome/TopSection' +import { ScaffoldContainer, ScaffoldSection } from '@/components/layouts/Scaffold' +import { useLocalStorage } from '@/hooks/misc/useLocalStorage' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { PROJECT_STATUS } from '@/lib/constants' +import { useTrack } from '@/lib/telemetry/track' +import { useAppStateSnapshot } from '@/state/app-state' export const ProjectHome = () => { const { enableBranching } = useParams() diff --git a/apps/studio/components/interfaces/ProjectHome/ProjectConnectionPopover.tsx b/apps/studio/components/interfaces/ProjectHome/ProjectConnectionPopover.tsx index 447c694d43..bf6de42634 100644 --- a/apps/studio/components/interfaces/ProjectHome/ProjectConnectionPopover.tsx +++ b/apps/studio/components/interfaces/ProjectHome/ProjectConnectionPopover.tsx @@ -1,9 +1,4 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' -import { getConnectionStrings } from 'components/interfaces/Connect/DatabaseSettings.utils' -import { getKeys, useAPIKeysQuery } from 'data/api-keys/api-keys-query' -import { useReadReplicasQuery } from 'data/read-replicas/replicas-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { pluckObjectFields } from 'lib/helpers' import { Check, ChevronDown, Copy, Database, KeyRound, Link2, Terminal } from 'lucide-react' import { parseAsBoolean, useQueryState } from 'nuqs' import { useEffect, useMemo, useRef, useState } from 'react' @@ -19,7 +14,12 @@ import { } from 'ui' import { ShimmeringLoader } from 'ui-patterns' +import { getConnectionStrings } from '@/components/interfaces/Connect/DatabaseSettings.utils' +import { getKeys, useAPIKeysQuery } from '@/data/api-keys/api-keys-query' import { useProjectApiUrl } from '@/data/config/project-endpoint-query' +import { useReadReplicasQuery } from '@/data/read-replicas/replicas-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { pluckObjectFields } from '@/lib/helpers' const DB_FIELDS = ['db_host', 'db_name', 'db_port', 'db_user'] as const const EMPTY_CONNECTION_INFO = { diff --git a/apps/studio/components/interfaces/ProjectHome/ProjectUsageSection.tsx b/apps/studio/components/interfaces/ProjectHome/ProjectUsageSection.tsx index 469c9971a8..40c548d98c 100644 --- a/apps/studio/components/interfaces/ProjectHome/ProjectUsageSection.tsx +++ b/apps/studio/components/interfaces/ProjectHome/ProjectUsageSection.tsx @@ -1,18 +1,5 @@ import { useParams } from 'common' -import NoDataPlaceholder from 'components/ui/Charts/NoDataPlaceholder' -import { ChartIntervalDropdown } from 'components/ui/Logs/ChartIntervalDropdown' -import { CHART_INTERVALS } from 'components/ui/Logs/logs.utils' -import { - ProjectLogStatsVariables, - UsageApiCounts, - useProjectLogStatsQuery, -} from 'data/analytics/project-log-stats-query' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' import dayjs from 'dayjs' -import { useFillTimeseriesSorted } from 'hooks/analytics/useFillTimeseriesSorted' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import Link from 'next/link' import { useRouter } from 'next/router' import { useEffect, useMemo, useState } from 'react' @@ -20,6 +7,20 @@ import { Card, CardContent, CardHeader, CardTitle, Loading } from 'ui' import { Row } from 'ui-patterns' import { LogsBarChart } from 'ui-patterns/LogsBarChart' +import NoDataPlaceholder from '@/components/ui/Charts/NoDataPlaceholder' +import { ChartIntervalDropdown } from '@/components/ui/Logs/ChartIntervalDropdown' +import { CHART_INTERVALS } from '@/components/ui/Logs/logs.utils' +import { + ProjectLogStatsVariables, + UsageApiCounts, + useProjectLogStatsQuery, +} from '@/data/analytics/project-log-stats-query' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useFillTimeseriesSorted } from '@/hooks/analytics/useFillTimeseriesSorted' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' + type LogsBarChartDatum = { timestamp: string error_count: number diff --git a/apps/studio/components/interfaces/ProjectHome/ServiceStatus.tsx b/apps/studio/components/interfaces/ProjectHome/ServiceStatus.tsx index 26f78ae7b0..754d6d8290 100644 --- a/apps/studio/components/interfaces/ProjectHome/ServiceStatus.tsx +++ b/apps/studio/components/interfaces/ProjectHome/ServiceStatus.tsx @@ -1,13 +1,5 @@ import { useParams } from 'common' -import { InlineLink } from 'components/ui/InlineLink' -import { SingleStat } from 'components/ui/SingleStat' -import { useBranchesQuery } from 'data/branches/branches-query' -import { useEdgeFunctionServiceStatusQuery } from 'data/service-status/edge-functions-status-query' -import { useProjectServiceStatusQuery } from 'data/service-status/service-status-query' import dayjs from 'dayjs' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import { ChevronRight, Loader2 } from 'lucide-react' import Link from 'next/link' import { cn, InfoIcon, Popover_Shadcn_, PopoverContent_Shadcn_, PopoverTrigger_Shadcn_ } from 'ui' @@ -18,6 +10,14 @@ import { StatusIcon, StatusMessage, } from '../Home/ServiceStatus' +import { InlineLink } from '@/components/ui/InlineLink' +import { SingleStat } from '@/components/ui/SingleStat' +import { useBranchesQuery } from '@/data/branches/branches-query' +import { useEdgeFunctionServiceStatusQuery } from '@/data/service-status/edge-functions-status-query' +import { useProjectServiceStatusQuery } from '@/data/service-status/service-status-query' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' const SERVICE_STATUS_THRESHOLD = 5 // minutes diff --git a/apps/studio/components/interfaces/ProjectHome/SnippetDropdown.tsx b/apps/studio/components/interfaces/ProjectHome/SnippetDropdown.tsx index 7ab0d5d70c..5fefc1ce49 100644 --- a/apps/studio/components/interfaces/ProjectHome/SnippetDropdown.tsx +++ b/apps/studio/components/interfaces/ProjectHome/SnippetDropdown.tsx @@ -1,13 +1,7 @@ import { keepPreviousData } from '@tanstack/react-query' import { useDebounce, useIntersectionObserver } from '@uidotdev/usehooks' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { useContentInfiniteQuery } from 'data/content/content-infinite-query' -import type { Content } from 'data/content/content-query' -import { SNIPPET_PAGE_LIMIT } from 'data/content/sql-folders-query' import { Plus } from 'lucide-react' import { ReactNode, useEffect, useMemo, useRef, useState } from 'react' -import { editorPanelState } from 'state/editor-panel-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { Command_Shadcn_, CommandGroup_Shadcn_, @@ -21,6 +15,13 @@ import { } from 'ui' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { useContentInfiniteQuery } from '@/data/content/content-infinite-query' +import type { Content } from '@/data/content/content-query' +import { SNIPPET_PAGE_LIMIT } from '@/data/content/sql-folders-query' +import { editorPanelState } from '@/state/editor-panel-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' + type SnippetDropdownProps = { projectRef?: string trigger: ReactNode diff --git a/apps/studio/components/interfaces/ProjectHome/TopSection.tsx b/apps/studio/components/interfaces/ProjectHome/TopSection.tsx index 5279bb72ef..98ccfc4008 100644 --- a/apps/studio/components/interfaces/ProjectHome/TopSection.tsx +++ b/apps/studio/components/interfaces/ProjectHome/TopSection.tsx @@ -1,19 +1,19 @@ -import { ActivityStats } from 'components/interfaces/ProjectHome/ActivityStats' -import { ProjectConnectionPopover } from 'components/interfaces/ProjectHome/ProjectConnectionPopover' -import { ProjectPausedState } from 'components/layouts/ProjectLayout/PausedState/ProjectPausedState' -import { ComputeBadgeWrapper } from 'components/ui/ComputeBadgeWrapper' -import { InlineLink } from 'components/ui/InlineLink' -import { ProjectUpgradeFailedBanner } from 'components/ui/ProjectUpgradeFailedBanner' -import { useBranchesQuery } from 'data/branches/branches-query' -import { useProjectDetailQuery } from 'data/projects/project-detail-query' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useIsOrioleDb, useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL, PROJECT_STATUS } from 'lib/constants' -import Link from 'next/link' import { ReactFlowProvider } from '@xyflow/react' +import Link from 'next/link' import { Badge, cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' import { InstanceConfiguration } from '../Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration' +import { ActivityStats } from '@/components/interfaces/ProjectHome/ActivityStats' +import { ProjectConnectionPopover } from '@/components/interfaces/ProjectHome/ProjectConnectionPopover' +import { ProjectPausedState } from '@/components/layouts/ProjectLayout/PausedState/ProjectPausedState' +import { ComputeBadgeWrapper } from '@/components/ui/ComputeBadgeWrapper' +import { InlineLink } from '@/components/ui/InlineLink' +import { ProjectUpgradeFailedBanner } from '@/components/ui/ProjectUpgradeFailedBanner' +import { useBranchesQuery } from '@/data/branches/branches-query' +import { useProjectDetailQuery } from '@/data/projects/project-detail-query' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useIsOrioleDb, useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL, PROJECT_STATUS } from '@/lib/constants' export const TopSection = () => { const isOrioleDb = useIsOrioleDb() diff --git a/apps/studio/components/interfaces/QueryInsights/QueryInsights.tsx b/apps/studio/components/interfaces/QueryInsights/QueryInsights.tsx index e1506a7666..6ba495898b 100644 --- a/apps/studio/components/interfaces/QueryInsights/QueryInsights.tsx +++ b/apps/studio/components/interfaces/QueryInsights/QueryInsights.tsx @@ -1,21 +1,20 @@ -import { useMemo, useState } from 'react' +import { useParams } from 'common' import dayjs from 'dayjs' import utc from 'dayjs/plugin/utc' +import { useMemo, useState } from 'react' -import { useParams } from 'common' -import useLogsQuery from 'hooks/analytics/useLogsQuery' -import { getSupamonitorLogsQuery } from './QueryInsights.constants' -import { - parseSupamonitorLogs, - filterSystemLogs, - transformLogsToChartData, - aggregateLogsByQuery, -} from './utils/supamonitor.utils' - -import { QueryInsightsHealth } from './QueryInsightsHealth/QueryInsightsHealth' -import { QueryInsightsChart } from './QueryInsightsChart/QueryInsightsChart' -import { QueryInsightsTable } from './QueryInsightsTable/QueryInsightsTable' import { useSupamonitorIndexAdvisor } from './hooks/useSupamonitorIndexAdvisor' +import { getSupamonitorLogsQuery } from './QueryInsights.constants' +import { QueryInsightsChart } from './QueryInsightsChart/QueryInsightsChart' +import { QueryInsightsHealth } from './QueryInsightsHealth/QueryInsightsHealth' +import { QueryInsightsTable } from './QueryInsightsTable/QueryInsightsTable' +import { + aggregateLogsByQuery, + filterSystemLogs, + parseSupamonitorLogs, + transformLogsToChartData, +} from './utils/supamonitor.utils' +import useLogsQuery from '@/hooks/analytics/useLogsQuery' dayjs.extend(utc) diff --git a/apps/studio/components/interfaces/QueryInsights/QueryInsightsChart/QueryInsightsChart.constants.ts b/apps/studio/components/interfaces/QueryInsights/QueryInsightsChart/QueryInsightsChart.constants.ts index c00550bc82..35ec04d9a0 100644 --- a/apps/studio/components/interfaces/QueryInsights/QueryInsightsChart/QueryInsightsChart.constants.ts +++ b/apps/studio/components/interfaces/QueryInsights/QueryInsightsChart/QueryInsightsChart.constants.ts @@ -1,4 +1,4 @@ -import { CHART_COLORS } from 'components/ui/Charts/Charts.constants' +import { CHART_COLORS } from '@/components/ui/Charts/Charts.constants' export const CHART_TABS = [ { id: 'query_latency', label: 'Query latency' }, diff --git a/apps/studio/components/interfaces/QueryInsights/QueryInsightsChart/QueryInsightsChart.tsx b/apps/studio/components/interfaces/QueryInsights/QueryInsightsChart/QueryInsightsChart.tsx index 197e5f78d0..354fdd91a6 100644 --- a/apps/studio/components/interfaces/QueryInsights/QueryInsightsChart/QueryInsightsChart.tsx +++ b/apps/studio/components/interfaces/QueryInsights/QueryInsightsChart/QueryInsightsChart.tsx @@ -1,3 +1,5 @@ +import { Loader2 } from 'lucide-react' +import { useTheme } from 'next-themes' import { useMemo, useState } from 'react' import { Area, @@ -8,13 +10,12 @@ import { XAxis, YAxis, } from 'recharts' -import { Tabs_Shadcn_, TabsContent_Shadcn_, TabsList_Shadcn_, TabsTrigger_Shadcn_, cn } from 'ui' -import { Loader2 } from 'lucide-react' +import { cn, Tabs_Shadcn_, TabsContent_Shadcn_, TabsList_Shadcn_, TabsTrigger_Shadcn_ } from 'ui' + import type { ChartDataPoint } from '../QueryInsights.types' -import { useTheme } from 'next-themes' -import { QueryInsightsChartTooltip } from './QueryInsightsChartTooltip' -import { CHART_TABS, LEGEND_ITEMS, CHART_TYPE, SEL_COLOR } from './QueryInsightsChart.constants' +import { CHART_TABS, CHART_TYPE, LEGEND_ITEMS, SEL_COLOR } from './QueryInsightsChart.constants' import { formatTime } from './QueryInsightsChart.utils' +import { QueryInsightsChartTooltip } from './QueryInsightsChartTooltip' interface QueryInsightsChartProps { chartData: ChartDataPoint[] diff --git a/apps/studio/components/interfaces/QueryInsights/QueryInsightsChart/QueryInsightsChart.utils.test.ts b/apps/studio/components/interfaces/QueryInsights/QueryInsightsChart/QueryInsightsChart.utils.test.ts index 7b88857b46..998f5cb5fc 100644 --- a/apps/studio/components/interfaces/QueryInsights/QueryInsightsChart/QueryInsightsChart.utils.test.ts +++ b/apps/studio/components/interfaces/QueryInsights/QueryInsightsChart/QueryInsightsChart.utils.test.ts @@ -1,5 +1,6 @@ -import { describe, it, expect } from 'vitest' -import { isTimeMetric, formatTime } from './QueryInsightsChart.utils' +import { describe, expect, it } from 'vitest' + +import { formatTime, isTimeMetric } from './QueryInsightsChart.utils' describe('isTimeMetric', () => { it('returns true for p50 and p95', () => { diff --git a/apps/studio/components/interfaces/QueryInsights/QueryInsightsChart/QueryInsightsChartTooltip.tsx b/apps/studio/components/interfaces/QueryInsights/QueryInsightsChart/QueryInsightsChartTooltip.tsx index 20780afb22..78edb99738 100644 --- a/apps/studio/components/interfaces/QueryInsights/QueryInsightsChart/QueryInsightsChartTooltip.tsx +++ b/apps/studio/components/interfaces/QueryInsights/QueryInsightsChart/QueryInsightsChartTooltip.tsx @@ -1,8 +1,9 @@ import dayjs from 'dayjs' -import { guessLocalTimezone } from 'lib/dayjs' import type { TooltipProps } from 'recharts' + import { formatDuration } from '../QueryInsightsTable/QueryInsightsTable.utils' import { isTimeMetric } from './QueryInsightsChart.utils' +import { guessLocalTimezone } from '@/lib/dayjs' export const QueryInsightsChartTooltip = ({ active, payload }: TooltipProps) => { if (!active || !payload?.length) return null diff --git a/apps/studio/components/interfaces/QueryInsights/QueryInsightsHealth/QueryInsightsHealth.tsx b/apps/studio/components/interfaces/QueryInsights/QueryInsightsHealth/QueryInsightsHealth.tsx index 2c7a78bd8e..c99fc266b5 100644 --- a/apps/studio/components/interfaces/QueryInsights/QueryInsightsHealth/QueryInsightsHealth.tsx +++ b/apps/studio/components/interfaces/QueryInsights/QueryInsightsHealth/QueryInsightsHealth.tsx @@ -1,8 +1,8 @@ -import { useQueryInsightsIssues } from '../hooks/useQueryInsightsIssues' -import { useQueryInsightsScore } from '../hooks/useQueryInsightsScore' -import { useQueryInsightsMetrics } from '../hooks/useQueryInsightsMetrics' -import { HEALTH_COLORS, HEALTH_LEVELS } from './QueryInsightsHealth.constants' import type { QueryPerformanceRow } from '../../QueryPerformance/QueryPerformance.types' +import { useQueryInsightsIssues } from '../hooks/useQueryInsightsIssues' +import { useQueryInsightsMetrics } from '../hooks/useQueryInsightsMetrics' +import { useQueryInsightsScore } from '../hooks/useQueryInsightsScore' +import { HEALTH_COLORS, HEALTH_LEVELS } from './QueryInsightsHealth.constants' import { QueryInsightsHealthMetric } from './QueryInsightsHealthMetric' import { QueryInsightsHealthScore } from './QueryInsightsHealthScore' import { QueryInsightsHealthScoreSkeleton } from './QueryInsightsHealthScoreSkeleton' diff --git a/apps/studio/components/interfaces/QueryInsights/QueryInsightsHealth/QueryInsightsHealth.utils.test.ts b/apps/studio/components/interfaces/QueryInsights/QueryInsightsHealth/QueryInsightsHealth.utils.test.ts index bb10db89b1..1aaa160d80 100644 --- a/apps/studio/components/interfaces/QueryInsights/QueryInsightsHealth/QueryInsightsHealth.utils.test.ts +++ b/apps/studio/components/interfaces/QueryInsights/QueryInsightsHealth/QueryInsightsHealth.utils.test.ts @@ -1,4 +1,5 @@ -import { describe, it, expect } from 'vitest' +import { describe, expect, it } from 'vitest' + import { getHealthLevel } from './QueryInsightsHealth.utils' describe('getHealthLevel', () => { diff --git a/apps/studio/components/interfaces/QueryInsights/QueryInsightsTable/QueryInsightsDetailSheet.tsx b/apps/studio/components/interfaces/QueryInsights/QueryInsightsTable/QueryInsightsDetailSheet.tsx index 29905dd805..d6b710f720 100644 --- a/apps/studio/components/interfaces/QueryInsights/QueryInsightsTable/QueryInsightsDetailSheet.tsx +++ b/apps/studio/components/interfaces/QueryInsights/QueryInsightsTable/QueryInsightsDetailSheet.tsx @@ -1,5 +1,5 @@ -import { useRef } from 'react' import { Loader2 } from 'lucide-react' +import { useRef } from 'react' import { AiIconAnimation, Button, @@ -8,19 +8,20 @@ import { SheetDescription, SheetTitle, Tabs_Shadcn_, + TabsContent_Shadcn_, TabsList_Shadcn_, TabsTrigger_Shadcn_, - TabsContent_Shadcn_, } from 'ui' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' -import { ExplainVisualizer } from 'components/interfaces/ExplainVisualizer/ExplainVisualizer' + import { QueryDetail } from '../../QueryPerformance/QueryDetail' import { QueryIndexes } from '../../QueryPerformance/QueryIndexes' import { buildExplainOptimizationPrompt } from '../../QueryPerformance/QueryPerformance.ai' -import type { QueryPlanRow } from 'components/interfaces/ExplainVisualizer/ExplainVisualizer.types' import type { ClassifiedQuery } from '../QueryInsightsHealth/QueryInsightsHealth.types' +import { ExplainVisualizer } from '@/components/interfaces/ExplainVisualizer/ExplainVisualizer' +import type { QueryPlanRow } from '@/components/interfaces/ExplainVisualizer/ExplainVisualizer.types' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' interface QueryInsightsDetailSheetProps { open: boolean diff --git a/apps/studio/components/interfaces/QueryInsights/QueryInsightsTable/QueryInsightsTable.tsx b/apps/studio/components/interfaces/QueryInsights/QueryInsightsTable/QueryInsightsTable.tsx index 86a86b4d6d..673b06dd69 100644 --- a/apps/studio/components/interfaces/QueryInsights/QueryInsightsTable/QueryInsightsTable.tsx +++ b/apps/studio/components/interfaces/QueryInsights/QueryInsightsTable/QueryInsightsTable.tsx @@ -1,20 +1,11 @@ import { wrapWithRollback } from '@supabase/pg-meta/src/query' import { useParams } from 'common' -import type { QueryPlanRow } from 'components/interfaces/ExplainVisualizer/ExplainVisualizer.types' -import { FilterPill } from 'components/interfaces/QueryPerformance/components/FilterPill' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { FilterPopover } from 'components/ui/FilterPopover' -import TwoOptionToggle from 'components/ui/TwoOptionToggle' -import { useExecuteSqlMutation } from 'data/sql/execute-sql-mutation' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Search, TextSearch, X } from 'lucide-react' import { useRouter } from 'next/router' import { parseAsArrayOf, parseAsString, useQueryStates } from 'nuqs' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' // eslint-disable-next-line no-restricted-imports import DataGrid, { DataGridHandle, Row } from 'react-data-grid' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { Button, cn, Tabs_Shadcn_, TabsList_Shadcn_, TabsTrigger_Shadcn_ } from 'ui' import { Input } from 'ui-patterns/DataInputs/Input' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' @@ -32,6 +23,15 @@ import { getQueryType, getTableName, } from './QueryInsightsTable.utils' +import type { QueryPlanRow } from '@/components/interfaces/ExplainVisualizer/ExplainVisualizer.types' +import { FilterPill } from '@/components/interfaces/QueryPerformance/components/FilterPill' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { FilterPopover } from '@/components/ui/FilterPopover' +import TwoOptionToggle from '@/components/ui/TwoOptionToggle' +import { useExecuteSqlMutation } from '@/data/sql/execute-sql-mutation' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' interface QueryInsightsTableProps { data: QueryPerformanceRow[] diff --git a/apps/studio/components/interfaces/QueryInsights/QueryInsightsTable/QueryInsightsTable.utils.test.ts b/apps/studio/components/interfaces/QueryInsights/QueryInsightsTable/QueryInsightsTable.utils.test.ts index 5b5ad17140..0867b8915c 100644 --- a/apps/studio/components/interfaces/QueryInsights/QueryInsightsTable/QueryInsightsTable.utils.test.ts +++ b/apps/studio/components/interfaces/QueryInsights/QueryInsightsTable/QueryInsightsTable.utils.test.ts @@ -1,10 +1,11 @@ -import { describe, it, expect } from 'vitest' +import { describe, expect, it } from 'vitest' + import { formatDuration, + formatQueryDisplay, + getColumnName, getQueryType, getTableName, - getColumnName, - formatQueryDisplay, } from './QueryInsightsTable.utils' describe('formatDuration', () => { diff --git a/apps/studio/components/interfaces/QueryInsights/QueryInsightsTable/QueryInsightsTableRow.tsx b/apps/studio/components/interfaces/QueryInsights/QueryInsightsTable/QueryInsightsTableRow.tsx index 436159ee6a..9b907af437 100644 --- a/apps/studio/components/interfaces/QueryInsights/QueryInsightsTable/QueryInsightsTableRow.tsx +++ b/apps/studio/components/interfaces/QueryInsights/QueryInsightsTable/QueryInsightsTableRow.tsx @@ -1,8 +1,9 @@ import { Loader2 } from 'lucide-react' import { AiIconAnimation, Button, cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' + import type { ClassifiedQuery } from '../QueryInsightsHealth/QueryInsightsHealth.types' import { ISSUE_DOT_COLORS, ISSUE_ICONS } from './QueryInsightsTable.constants' -import { formatDuration, getTableName, getColumnName } from './QueryInsightsTable.utils' +import { formatDuration, getColumnName, getTableName } from './QueryInsightsTable.utils' interface QueryInsightsTableRowProps { item: ClassifiedQuery diff --git a/apps/studio/components/interfaces/QueryInsights/hooks/useQueryInsightsIssues.utils.test.ts b/apps/studio/components/interfaces/QueryInsights/hooks/useQueryInsightsIssues.utils.test.ts index 3f2922c8df..71f66dc4b7 100644 --- a/apps/studio/components/interfaces/QueryInsights/hooks/useQueryInsightsIssues.utils.test.ts +++ b/apps/studio/components/interfaces/QueryInsights/hooks/useQueryInsightsIssues.utils.test.ts @@ -1,13 +1,13 @@ -import { describe, it, expect, vi } from 'vitest' -import { classifyQuery } from './useQueryInsightsIssues.utils' +import { describe, expect, it, vi } from 'vitest' + +import { hasIndexRecommendations } from '../../QueryPerformance/IndexAdvisor/index-advisor.utils' import type { QueryPerformanceRow } from '../../QueryPerformance/QueryPerformance.types' +import { classifyQuery } from './useQueryInsightsIssues.utils' vi.mock('../../QueryPerformance/IndexAdvisor/index-advisor.utils', () => ({ hasIndexRecommendations: vi.fn(), })) -import { hasIndexRecommendations } from '../../QueryPerformance/IndexAdvisor/index-advisor.utils' - const baseRow: QueryPerformanceRow = { query: 'SELECT * FROM users', calls: 10, diff --git a/apps/studio/components/interfaces/QueryInsights/hooks/useQueryInsightsIssues.utils.ts b/apps/studio/components/interfaces/QueryInsights/hooks/useQueryInsightsIssues.utils.ts index 5a71597685..360a99e18f 100644 --- a/apps/studio/components/interfaces/QueryInsights/hooks/useQueryInsightsIssues.utils.ts +++ b/apps/studio/components/interfaces/QueryInsights/hooks/useQueryInsightsIssues.utils.ts @@ -1,5 +1,5 @@ -import type { QueryPerformanceRow } from '../../QueryPerformance/QueryPerformance.types' import { hasIndexRecommendations } from '../../QueryPerformance/IndexAdvisor/index-advisor.utils' +import type { QueryPerformanceRow } from '../../QueryPerformance/QueryPerformance.types' import { SLOW_QUERY_THRESHOLD_MS } from '../QueryInsightsHealth/QueryInsightsHealth.constants' import type { IssueType } from '../QueryInsightsHealth/QueryInsightsHealth.types' diff --git a/apps/studio/components/interfaces/QueryInsights/hooks/useQueryInsightsMetrics.ts b/apps/studio/components/interfaces/QueryInsights/hooks/useQueryInsightsMetrics.ts index 6391d5bb35..28dd8c88ed 100644 --- a/apps/studio/components/interfaces/QueryInsights/hooks/useQueryInsightsMetrics.ts +++ b/apps/studio/components/interfaces/QueryInsights/hooks/useQueryInsightsMetrics.ts @@ -1,4 +1,5 @@ import { useMemo } from 'react' + import type { QueryPerformanceRow } from '../../QueryPerformance/QueryPerformance.types' export const useQueryInsightsMetrics = (data: QueryPerformanceRow[]) => { diff --git a/apps/studio/components/interfaces/QueryInsights/hooks/useQueryInsightsScore.ts b/apps/studio/components/interfaces/QueryInsights/hooks/useQueryInsightsScore.ts index b4f7c24ea4..09ea9e7938 100644 --- a/apps/studio/components/interfaces/QueryInsights/hooks/useQueryInsightsScore.ts +++ b/apps/studio/components/interfaces/QueryInsights/hooks/useQueryInsightsScore.ts @@ -1,11 +1,11 @@ import { useMemo } from 'react' import { - SCORE_DEDUCTIONS, HIGH_CALL_THRESHOLD, + SCORE_DEDUCTIONS, } from '../QueryInsightsHealth/QueryInsightsHealth.constants' -import { getHealthLevel } from '../QueryInsightsHealth/QueryInsightsHealth.utils' import type { ClassifiedQuery } from '../QueryInsightsHealth/QueryInsightsHealth.types' +import { getHealthLevel } from '../QueryInsightsHealth/QueryInsightsHealth.utils' export function useQueryInsightsScore({ errors, diff --git a/apps/studio/components/interfaces/QueryInsights/hooks/useSupamonitorIndexAdvisor.ts b/apps/studio/components/interfaces/QueryInsights/hooks/useSupamonitorIndexAdvisor.ts index 65128a1348..3b4f5a5c4e 100644 --- a/apps/studio/components/interfaces/QueryInsights/hooks/useSupamonitorIndexAdvisor.ts +++ b/apps/studio/components/interfaces/QueryInsights/hooks/useSupamonitorIndexAdvisor.ts @@ -1,10 +1,10 @@ import { useQueries } from '@tanstack/react-query' -import { databaseKeys } from 'data/database/keys' -import { getIndexAdvisorResult } from 'data/database/retrieve-index-advisor-result-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { useIndexAdvisorStatus } from '../../QueryPerformance/hooks/useIsIndexAdvisorStatus' import type { QueryPerformanceRow } from '../../QueryPerformance/QueryPerformance.types' +import { databaseKeys } from '@/data/database/keys' +import { getIndexAdvisorResult } from '@/data/database/retrieve-index-advisor-result-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' function isEligibleQuery(query: string): boolean { const lower = query.trim().toLowerCase() diff --git a/apps/studio/components/interfaces/QueryInsights/utils/supamonitor.utils.test.ts b/apps/studio/components/interfaces/QueryInsights/utils/supamonitor.utils.test.ts index 22d1dd0c3e..e74028edef 100644 --- a/apps/studio/components/interfaces/QueryInsights/utils/supamonitor.utils.test.ts +++ b/apps/studio/components/interfaces/QueryInsights/utils/supamonitor.utils.test.ts @@ -1,10 +1,11 @@ -import { describe, it, expect } from 'vitest' +import { describe, expect, it } from 'vitest' + +import type { ParsedLogEntry } from '../QueryInsights.types' import { + aggregateLogsByQuery, parseSupamonitorLogs, transformLogsToChartData, - aggregateLogsByQuery, } from './supamonitor.utils' -import type { ParsedLogEntry } from '../QueryInsights.types' const makeSampleLog = (overrides: Partial = {}): any => ({ timestamp: '2025-01-01T00:00:00Z', diff --git a/apps/studio/components/interfaces/QueryInsights/utils/supamonitor.utils.ts b/apps/studio/components/interfaces/QueryInsights/utils/supamonitor.utils.ts index 1b324c9f97..493ba3cdc5 100644 --- a/apps/studio/components/interfaces/QueryInsights/utils/supamonitor.utils.ts +++ b/apps/studio/components/interfaces/QueryInsights/utils/supamonitor.utils.ts @@ -1,11 +1,11 @@ import type { QueryPerformanceRow } from '../../QueryPerformance/QueryPerformance.types' -import type { ChartDataPoint, ParsedLogEntry } from '../QueryInsights.types' import { - SUPAMONITOR_EXCLUDED_ROLES, - SUPAMONITOR_EXCLUDED_APP_NAMES, - TRANSACTION_CONTROL_REGEX, SCHEMA_INTROSPECTION_REGEX, + SUPAMONITOR_EXCLUDED_APP_NAMES, + SUPAMONITOR_EXCLUDED_ROLES, + TRANSACTION_CONTROL_REGEX, } from '../QueryInsights.constants' +import type { ChartDataPoint, ParsedLogEntry } from '../QueryInsights.types' export function filterSystemLogs( logs: ParsedLogEntry[], diff --git a/apps/studio/components/interfaces/QueryPerformance/IndexAdvisor/EnableIndexAdvisorButton.tsx b/apps/studio/components/interfaces/QueryPerformance/IndexAdvisor/EnableIndexAdvisorButton.tsx index 9b6ee288f9..91f2e78ace 100644 --- a/apps/studio/components/interfaces/QueryPerformance/IndexAdvisor/EnableIndexAdvisorButton.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/IndexAdvisor/EnableIndexAdvisorButton.tsx @@ -1,10 +1,5 @@ import { useState } from 'react' import { toast } from 'sonner' - -import { useDatabaseExtensionEnableMutation } from 'data/database-extensions/database-extension-enable-mutation' -import { useDatabaseExtensionsQuery } from 'data/database-extensions/database-extensions-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useTrack } from 'lib/telemetry/track' import { AlertDialog, AlertDialogAction, @@ -17,7 +12,12 @@ import { AlertDialogTrigger, Button, } from 'ui' + import { getIndexAdvisorExtensions } from './index-advisor.utils' +import { useDatabaseExtensionEnableMutation } from '@/data/database-extensions/database-extension-enable-mutation' +import { useDatabaseExtensionsQuery } from '@/data/database-extensions/database-extensions-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useTrack } from '@/lib/telemetry/track' export const EnableIndexAdvisorButton = () => { const track = useTrack() diff --git a/apps/studio/components/interfaces/QueryPerformance/IndexAdvisor/IndexAdvisorDisabledState.tsx b/apps/studio/components/interfaces/QueryPerformance/IndexAdvisor/IndexAdvisorDisabledState.tsx index aa864cd72c..1a709ddd6c 100644 --- a/apps/studio/components/interfaces/QueryPerformance/IndexAdvisor/IndexAdvisorDisabledState.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/IndexAdvisor/IndexAdvisorDisabledState.tsx @@ -1,15 +1,15 @@ +import { useParams } from 'common' import Link from 'next/link' import { toast } from 'sonner' +import { Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, Button } from 'ui' -import { useParams } from 'common' -import { DocsButton } from 'components/ui/DocsButton' -import { useDatabaseExtensionEnableMutation } from 'data/database-extensions/database-extension-enable-mutation' -import { useDatabaseExtensionsQuery } from 'data/database-extensions/database-extensions-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' -import { AlertDescription_Shadcn_, AlertTitle_Shadcn_, Alert_Shadcn_, Button } from 'ui' import { Markdown } from '../../Markdown' import { getIndexAdvisorExtensions } from './index-advisor.utils' +import { DocsButton } from '@/components/ui/DocsButton' +import { useDatabaseExtensionEnableMutation } from '@/data/database-extensions/database-extension-enable-mutation' +import { useDatabaseExtensionsQuery } from '@/data/database-extensions/database-extensions-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' export const IndexAdvisorDisabledState = () => { const { ref } = useParams() diff --git a/apps/studio/components/interfaces/QueryPerformance/IndexAdvisor/IndexAdvisorNotice.tsx b/apps/studio/components/interfaces/QueryPerformance/IndexAdvisor/IndexAdvisorNotice.tsx index c1fe279152..7111802bd0 100644 --- a/apps/studio/components/interfaces/QueryPerformance/IndexAdvisor/IndexAdvisorNotice.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/IndexAdvisor/IndexAdvisorNotice.tsx @@ -1,11 +1,12 @@ -import { useIndexAdvisorStatus } from 'components/interfaces/QueryPerformance/hooks/useIsIndexAdvisorStatus' -import { BASE_PATH } from 'lib/constants' -import { Admonition } from 'ui-patterns' -import { EnableIndexAdvisorButton } from './EnableIndexAdvisorButton' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' import { LOCAL_STORAGE_KEYS } from 'common' import { useParams } from 'common/hooks' import { Button } from 'ui' +import { Admonition } from 'ui-patterns' + +import { EnableIndexAdvisorButton } from './EnableIndexAdvisorButton' +import { useIndexAdvisorStatus } from '@/components/interfaces/QueryPerformance/hooks/useIsIndexAdvisorStatus' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { BASE_PATH } from '@/lib/constants' export const IndexAdvisorNotice = () => { const { ref } = useParams() diff --git a/apps/studio/components/interfaces/QueryPerformance/IndexAdvisor/IndexImprovementText.tsx b/apps/studio/components/interfaces/QueryPerformance/IndexAdvisor/IndexImprovementText.tsx index 88af921bc7..30d26c7ffe 100644 --- a/apps/studio/components/interfaces/QueryPerformance/IndexAdvisor/IndexImprovementText.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/IndexAdvisor/IndexImprovementText.tsx @@ -1,6 +1,6 @@ import { HTMLAttributes } from 'react' - import { cn } from 'ui' + import { calculateImprovement } from './index-advisor.utils' interface IndexImprovementTextProps extends HTMLAttributes { diff --git a/apps/studio/components/interfaces/QueryPerformance/IndexAdvisor/IndexSuggestionIcon.tsx b/apps/studio/components/interfaces/QueryPerformance/IndexAdvisor/IndexSuggestionIcon.tsx index 944ae227b9..913b2b0577 100644 --- a/apps/studio/components/interfaces/QueryPerformance/IndexAdvisor/IndexSuggestionIcon.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/IndexAdvisor/IndexSuggestionIcon.tsx @@ -1,5 +1,3 @@ -import { GetIndexAdvisorResultResponse } from 'data/database/retrieve-index-advisor-result-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Loader2 } from 'lucide-react' import { MouseEvent, useState } from 'react' import { @@ -17,6 +15,8 @@ import { useIndexInvalidation } from '../hooks/useIndexInvalidation' import { QueryPanelScoreSection } from '../QueryPanel' import { createIndexes } from './index-advisor.utils' import { IndexImprovementText } from './IndexImprovementText' +import { GetIndexAdvisorResultResponse } from '@/data/database/retrieve-index-advisor-result-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface IndexSuggestionIconProps { indexAdvisorResult: GetIndexAdvisorResultResponse diff --git a/apps/studio/components/interfaces/QueryPerformance/IndexAdvisor/index-advisor.utils.ts b/apps/studio/components/interfaces/QueryPerformance/IndexAdvisor/index-advisor.utils.ts index 2c565b7314..e0b80a3d5a 100644 --- a/apps/studio/components/interfaces/QueryPerformance/IndexAdvisor/index-advisor.utils.ts +++ b/apps/studio/components/interfaces/QueryPerformance/IndexAdvisor/index-advisor.utils.ts @@ -1,10 +1,9 @@ import { toast } from 'sonner' -import { DatabaseExtension } from 'data/database-extensions/database-extensions-query' -import { GetIndexAdvisorResultResponse } from 'data/database/retrieve-index-advisor-result-query' -import { executeSql } from 'data/sql/execute-sql-query' - -import { INTERNAL_SCHEMAS } from 'hooks/useProtectedSchemas' +import { DatabaseExtension } from '@/data/database-extensions/database-extensions-query' +import { GetIndexAdvisorResultResponse } from '@/data/database/retrieve-index-advisor-result-query' +import { executeSql } from '@/data/sql/execute-sql-query' +import { INTERNAL_SCHEMAS } from '@/hooks/useProtectedSchemas' /** * Gets the required extensions for index advisor diff --git a/apps/studio/components/interfaces/QueryPerformance/QueryDetail.tsx b/apps/studio/components/interfaces/QueryPerformance/QueryDetail.tsx index 3d1bcdcf98..9a6088ef8a 100644 --- a/apps/studio/components/interfaces/QueryPerformance/QueryDetail.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/QueryDetail.tsx @@ -1,12 +1,6 @@ -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { AiAssistantDropdown } from 'components/ui/AiAssistantDropdown' -import { formatSql } from 'lib/formatSql' -import { useTrack } from 'lib/telemetry/track' import { ChevronsUpDown, Lightbulb } from 'lucide-react' import dynamic from 'next/dynamic' import { useEffect, useState } from 'react' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, Button, cn } from 'ui' import { QueryPanelContainer, QueryPanelSection } from './QueryPanel' @@ -14,6 +8,12 @@ import { buildQueryExplanationPrompt } from './QueryPerformance.ai' import { QUERY_PERFORMANCE_COLUMNS } from './QueryPerformance.constants' import { QueryPerformanceRow } from './QueryPerformance.types' import { formatDuration } from './QueryPerformance.utils' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { AiAssistantDropdown } from '@/components/ui/AiAssistantDropdown' +import { formatSql } from '@/lib/formatSql' +import { useTrack } from '@/lib/telemetry/track' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' interface QueryDetailProps { selectedRow?: QueryPerformanceRow diff --git a/apps/studio/components/interfaces/QueryPerformance/QueryIndexes.tsx b/apps/studio/components/interfaces/QueryPerformance/QueryIndexes.tsx index 42fbc269f0..575c41df55 100644 --- a/apps/studio/components/interfaces/QueryPerformance/QueryIndexes.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/QueryIndexes.tsx @@ -1,16 +1,4 @@ import { AccordionTrigger } from '@ui/components/shadcn/ui/accordion' -import { useIndexAdvisorStatus } from 'components/interfaces/QueryPerformance/hooks/useIsIndexAdvisorStatus' -import AlertError from 'components/ui/AlertError' -import { DocsButton } from 'components/ui/DocsButton' -import { useDatabaseExtensionsQuery } from 'data/database-extensions/database-extensions-query' -import { - GetIndexAdvisorResultResponse, - useGetIndexAdvisorResult, -} from 'data/database/retrieve-index-advisor-result-query' -import { useGetIndexesFromSelectQuery } from 'data/database/retrieve-index-from-select-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' -import { useTrack } from 'lib/telemetry/track' import { Check, Lightbulb, Table2 } from 'lucide-react' import { useEffect, useState } from 'react' import { @@ -41,6 +29,18 @@ import { IndexAdvisorDisabledState } from './IndexAdvisor/IndexAdvisorDisabledSt import { IndexImprovementText } from './IndexAdvisor/IndexImprovementText' import { QueryPanelContainer, QueryPanelScoreSection, QueryPanelSection } from './QueryPanel' import { QueryPerformanceRow } from './QueryPerformance.types' +import { useIndexAdvisorStatus } from '@/components/interfaces/QueryPerformance/hooks/useIsIndexAdvisorStatus' +import AlertError from '@/components/ui/AlertError' +import { DocsButton } from '@/components/ui/DocsButton' +import { useDatabaseExtensionsQuery } from '@/data/database-extensions/database-extensions-query' +import { + GetIndexAdvisorResultResponse, + useGetIndexAdvisorResult, +} from '@/data/database/retrieve-index-advisor-result-query' +import { useGetIndexesFromSelectQuery } from '@/data/database/retrieve-index-from-select-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' +import { useTrack } from '@/lib/telemetry/track' interface QueryIndexesProps { selectedRow: Pick diff --git a/apps/studio/components/interfaces/QueryPerformance/QueryPanel.tsx b/apps/studio/components/interfaces/QueryPerformance/QueryPanel.tsx index 57c33a87f5..7c700952fa 100644 --- a/apps/studio/components/interfaces/QueryPerformance/QueryPanel.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/QueryPanel.tsx @@ -1,7 +1,7 @@ import { InformationCircleIcon } from '@heroicons/react/16/solid' import { ArrowDown, ArrowUp } from 'lucide-react' import { PropsWithChildren } from 'react' -import { Tooltip, TooltipContent, TooltipTrigger, cn } from 'ui' +import { cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' export const QueryPanelContainer = ({ children, diff --git a/apps/studio/components/interfaces/QueryPerformance/QueryPerformance.ai.ts b/apps/studio/components/interfaces/QueryPerformance/QueryPerformance.ai.ts index 4d61579941..23e681a7a3 100644 --- a/apps/studio/components/interfaces/QueryPerformance/QueryPerformance.ai.ts +++ b/apps/studio/components/interfaces/QueryPerformance/QueryPerformance.ai.ts @@ -1,10 +1,10 @@ import { QueryPerformanceRow } from './QueryPerformance.types' -import type { QueryPlanRow } from 'components/interfaces/ExplainVisualizer/ExplainVisualizer.types' -import type { ClassifiedQuery } from 'components/interfaces/QueryInsights/QueryInsightsHealth/QueryInsightsHealth.types' +import type { QueryPlanRow } from '@/components/interfaces/ExplainVisualizer/ExplainVisualizer.types' +import type { ClassifiedQuery } from '@/components/interfaces/QueryInsights/QueryInsightsHealth/QueryInsightsHealth.types' import { - getTableName, getColumnName, -} from 'components/interfaces/QueryInsights/QueryInsightsTable/QueryInsightsTable.utils' + getTableName, +} from '@/components/interfaces/QueryInsights/QueryInsightsTable/QueryInsightsTable.utils' export interface QueryExplanationPrompt { query: string diff --git a/apps/studio/components/interfaces/QueryPerformance/QueryPerformance.tsx b/apps/studio/components/interfaces/QueryPerformance/QueryPerformance.tsx index b5f2217832..ed15e1a896 100644 --- a/apps/studio/components/interfaces/QueryPerformance/QueryPerformance.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/QueryPerformance.tsx @@ -1,10 +1,10 @@ import { useParams } from 'common' import { useEffect } from 'react' -import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' import { PresetHookResult } from '../Reports/Reports.utils' import { QueryPerformanceInfiniteHook } from './useQueryPerformanceQuery' import { WithStatements } from './WithStatements/WithStatements' +import { useDatabaseSelectorStateSnapshot } from '@/state/database-selector' interface QueryPerformanceProps { queryHitRate: PresetHookResult diff --git a/apps/studio/components/interfaces/QueryPerformance/QueryPerformance.types.ts b/apps/studio/components/interfaces/QueryPerformance/QueryPerformance.types.ts index 243b653811..491315baf1 100644 --- a/apps/studio/components/interfaces/QueryPerformance/QueryPerformance.types.ts +++ b/apps/studio/components/interfaces/QueryPerformance/QueryPerformance.types.ts @@ -1,4 +1,4 @@ -import { GetIndexAdvisorResultResponse } from 'data/database/retrieve-index-advisor-result-query' +import { GetIndexAdvisorResultResponse } from '@/data/database/retrieve-index-advisor-result-query' export interface QueryPerformanceRow { query: string diff --git a/apps/studio/components/interfaces/QueryPerformance/QueryPerformance.utils.test.ts b/apps/studio/components/interfaces/QueryPerformance/QueryPerformance.utils.test.ts index fe898f94d9..96ce100460 100644 --- a/apps/studio/components/interfaces/QueryPerformance/QueryPerformance.utils.test.ts +++ b/apps/studio/components/interfaces/QueryPerformance/QueryPerformance.utils.test.ts @@ -1,4 +1,5 @@ -import { describe, it, expect } from 'vitest' +import { describe, expect, it } from 'vitest' + import { formatDuration } from './QueryPerformance.utils' describe('formatDuration', () => { diff --git a/apps/studio/components/interfaces/QueryPerformance/QueryPerformance.utils.ts b/apps/studio/components/interfaces/QueryPerformance/QueryPerformance.utils.ts index 386c94fa94..a8dcebdce4 100644 --- a/apps/studio/components/interfaces/QueryPerformance/QueryPerformance.utils.ts +++ b/apps/studio/components/interfaces/QueryPerformance/QueryPerformance.utils.ts @@ -2,7 +2,7 @@ import * as Sentry from '@sentry/nextjs' import dayjs from 'dayjs' import duration from 'dayjs/plugin/duration' -import { getErrorMessage } from 'lib/get-error-message' +import { getErrorMessage } from '@/lib/get-error-message' dayjs.extend(duration) diff --git a/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceChart.tsx b/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceChart.tsx index c057595183..8678d17f8c 100644 --- a/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceChart.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceChart.tsx @@ -1,10 +1,11 @@ -import { useState, useMemo } from 'react' -import { Tabs_Shadcn_, TabsContent_Shadcn_, TabsList_Shadcn_, TabsTrigger_Shadcn_ } from 'ui' -import { QUERY_PERFORMANCE_CHART_TABS } from './QueryPerformance.constants' import { Loader2 } from 'lucide-react' -import { ComposedChart } from 'components/ui/Charts/ComposedChart' -import type { MultiAttribute } from 'components/ui/Charts/ComposedChart.utils' +import { useMemo, useState } from 'react' +import { Tabs_Shadcn_, TabsContent_Shadcn_, TabsList_Shadcn_, TabsTrigger_Shadcn_ } from 'ui' + import type { ChartDataPoint } from '../QueryInsights/QueryInsights.types' +import { QUERY_PERFORMANCE_CHART_TABS } from './QueryPerformance.constants' +import { ComposedChart } from '@/components/ui/Charts/ComposedChart' +import type { MultiAttribute } from '@/components/ui/Charts/ComposedChart.utils' interface QueryPerformanceChartProps { dateRange?: { diff --git a/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceFilterBar.tsx b/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceFilterBar.tsx index 0d9b9819c5..927ecb7d35 100644 --- a/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceFilterBar.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceFilterBar.tsx @@ -1,8 +1,3 @@ -import { - NumericFilter, - ReportsNumericFilter, -} from 'components/interfaces/Reports/v2/ReportsNumericFilter' -import { useDebouncedValue } from 'hooks/misc/useDebouncedValue' import { parseAsArrayOf, parseAsJson, parseAsString, useQueryStates } from 'nuqs' import { ReactNode, useEffect, useState } from 'react' @@ -14,6 +9,11 @@ import { SortIndicator } from './components/SortIndicator' import { SourceFilterDropdown } from './components/SourceFilterDropdown' import { useIndexAdvisorStatus } from './hooks/useIsIndexAdvisorStatus' import { useQueryPerformanceSort } from './hooks/useQueryPerformanceSort' +import { + NumericFilter, + ReportsNumericFilter, +} from '@/components/interfaces/Reports/v2/ReportsNumericFilter' +import { useDebouncedValue } from '@/hooks/misc/useDebouncedValue' export const QueryPerformanceFilterBar = ({ actions, diff --git a/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceGrid.tsx b/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceGrid.tsx index 2ccf2d6bee..ac59a67e43 100644 --- a/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceGrid.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceGrid.tsx @@ -1,6 +1,4 @@ import { useParams } from 'common' -import { NumericFilter } from 'components/interfaces/Reports/v2/ReportsNumericFilter' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { ArrowDown, ArrowRight, ArrowUp, ChevronDown, TextSearch } from 'lucide-react' import { parseAsArrayOf, parseAsJson, parseAsString, useQueryStates } from 'nuqs' import { UIEvent, useCallback, useEffect, useMemo, useRef, useState } from 'react' @@ -40,6 +38,8 @@ import { } from './QueryPerformance.constants' import { QueryPerformanceRow } from './QueryPerformance.types' import { formatDuration } from './QueryPerformance.utils' +import { NumericFilter } from '@/components/interfaces/Reports/v2/ReportsNumericFilter' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' interface QueryPerformanceGridProps { aggregatedData: QueryPerformanceRow[] diff --git a/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceMetrics.tsx b/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceMetrics.tsx index 700e08a147..5e71f07153 100644 --- a/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceMetrics.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceMetrics.tsx @@ -1,10 +1,10 @@ -import { NumericFilter } from 'components/interfaces/Reports/v2/ReportsNumericFilter' import { Info } from 'lucide-react' import { parseAsJson, useQueryStates } from 'nuqs' import React, { useMemo } from 'react' import { cn, Skeleton, Tooltip, TooltipContent, TooltipTrigger } from 'ui' import { useQueryPerformanceQuery } from './useQueryPerformanceQuery' +import { NumericFilter } from '@/components/interfaces/Reports/v2/ReportsNumericFilter' export const QueryPerformanceMetrics = () => { const { data: queryMetrics, isLoading } = useQueryPerformanceQuery({ preset: 'queryMetrics' }) diff --git a/apps/studio/components/interfaces/QueryPerformance/SqlMonacoBlock.tsx b/apps/studio/components/interfaces/QueryPerformance/SqlMonacoBlock.tsx index 9aab8444bf..b734c965a6 100644 --- a/apps/studio/components/interfaces/QueryPerformance/SqlMonacoBlock.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/SqlMonacoBlock.tsx @@ -1,7 +1,6 @@ import Editor from '@monaco-editor/react' import { Check, Copy } from 'lucide-react' import { useMemo, useState } from 'react' - import { Button, cn, copyToClipboard } from 'ui' type SqlMonacoBlockProps = { diff --git a/apps/studio/components/interfaces/QueryPerformance/WithStatements/WithStatements.tsx b/apps/studio/components/interfaces/QueryPerformance/WithStatements/WithStatements.tsx index 256f9add6f..49b671dce7 100644 --- a/apps/studio/components/interfaces/QueryPerformance/WithStatements/WithStatements.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/WithStatements/WithStatements.tsx @@ -1,20 +1,8 @@ import { LOCAL_STORAGE_KEYS, useParams } from 'common' -import { PresetHookResult } from 'components/interfaces/Reports/Reports.utils' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DownloadResultsButton } from 'components/ui/DownloadResultsButton' -import { useReadReplicasQuery } from 'data/read-replicas/replicas-query' -import { formatDatabaseID } from 'data/read-replicas/replicas.utils' -import { executeSql } from 'data/sql/execute-sql-query' -import { useInfiniteScroll } from 'hooks/misc/useInfiniteScroll' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL, IS_PLATFORM } from 'lib/constants' -import { getErrorMessage } from 'lib/get-error-message' import { RefreshCw, RotateCcw, X } from 'lucide-react' import { parseAsString, useQueryStates } from 'nuqs' import { useEffect, useMemo, useState } from 'react' import { toast } from 'sonner' -import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' import { Button, cn, LoadingLine } from 'ui' import { Admonition } from 'ui-patterns' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' @@ -26,6 +14,18 @@ import { QueryPerformanceGrid } from '../QueryPerformanceGrid' import { QueryPerformanceMetrics } from '../QueryPerformanceMetrics' import { QueryPerformanceInfiniteHook } from '../useQueryPerformanceQuery' import { transformStatementDataToRows } from './WithStatements.utils' +import { PresetHookResult } from '@/components/interfaces/Reports/Reports.utils' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DownloadResultsButton } from '@/components/ui/DownloadResultsButton' +import { useReadReplicasQuery } from '@/data/read-replicas/replicas-query' +import { formatDatabaseID } from '@/data/read-replicas/replicas.utils' +import { executeSql } from '@/data/sql/execute-sql-query' +import { useInfiniteScroll } from '@/hooks/misc/useInfiniteScroll' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL, IS_PLATFORM } from '@/lib/constants' +import { getErrorMessage } from '@/lib/get-error-message' +import { useDatabaseSelectorStateSnapshot } from '@/state/database-selector' interface WithStatementsProps { queryHitRate: PresetHookResult diff --git a/apps/studio/components/interfaces/QueryPerformance/WithStatements/WithStatements.utils.test.ts b/apps/studio/components/interfaces/QueryPerformance/WithStatements/WithStatements.utils.test.ts index 26e0d4c457..306ac92d8e 100644 --- a/apps/studio/components/interfaces/QueryPerformance/WithStatements/WithStatements.utils.test.ts +++ b/apps/studio/components/interfaces/QueryPerformance/WithStatements/WithStatements.utils.test.ts @@ -1,4 +1,5 @@ -import { describe, it, expect, vi } from 'vitest' +import { describe, expect, it, vi } from 'vitest' + import { transformStatementDataToRows } from './WithStatements.utils' vi.mock('../IndexAdvisor/index-advisor.utils', () => ({ diff --git a/apps/studio/components/interfaces/QueryPerformance/WithStatements/WithStatements.utils.ts b/apps/studio/components/interfaces/QueryPerformance/WithStatements/WithStatements.utils.ts index a16b89110c..3a0a9f19d2 100644 --- a/apps/studio/components/interfaces/QueryPerformance/WithStatements/WithStatements.utils.ts +++ b/apps/studio/components/interfaces/QueryPerformance/WithStatements/WithStatements.utils.ts @@ -1,8 +1,8 @@ -import { QueryPerformanceRow } from '../QueryPerformance.types' import { filterProtectedSchemaIndexAdvisorResult, queryInvolvesProtectedSchemas, } from '../IndexAdvisor/index-advisor.utils' +import { QueryPerformanceRow } from '../QueryPerformance.types' export const transformStatementDataToRows = ( data: any[], diff --git a/apps/studio/components/interfaces/QueryPerformance/components/FilterPill.tsx b/apps/studio/components/interfaces/QueryPerformance/components/FilterPill.tsx index 65df7af6b0..994a0be499 100644 --- a/apps/studio/components/interfaces/QueryPerformance/components/FilterPill.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/components/FilterPill.tsx @@ -1,5 +1,4 @@ import { X } from 'lucide-react' - import { Tooltip, TooltipContent, TooltipTrigger } from 'ui' interface FilterPillProps { diff --git a/apps/studio/components/interfaces/QueryPerformance/components/RoleTooltip.tsx b/apps/studio/components/interfaces/QueryPerformance/components/RoleTooltip.tsx index 30964c3cff..439c5c251b 100644 --- a/apps/studio/components/interfaces/QueryPerformance/components/RoleTooltip.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/components/RoleTooltip.tsx @@ -1,5 +1,4 @@ -import { cn } from 'ui' -import { Tooltip, TooltipContent, TooltipTrigger } from 'ui' +import { cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' interface RoleTooltipProps { htmlFor: string diff --git a/apps/studio/components/interfaces/QueryPerformance/components/RolesFilterDropdown.tsx b/apps/studio/components/interfaces/QueryPerformance/components/RolesFilterDropdown.tsx index 13903c5247..46f57cb451 100644 --- a/apps/studio/components/interfaces/QueryPerformance/components/RolesFilterDropdown.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/components/RolesFilterDropdown.tsx @@ -1,6 +1,6 @@ -import { FilterPopover } from 'components/ui/FilterPopover' -import { RoleTooltip } from './RoleTooltip' import { useRolesFilter, type RoleWithDescription } from '../hooks/useRolesFilter' +import { RoleTooltip } from './RoleTooltip' +import { FilterPopover } from '@/components/ui/FilterPopover' interface RolesFilterDropdownProps { activeOptions: string[] diff --git a/apps/studio/components/interfaces/QueryPerformance/components/SortIndicator.tsx b/apps/studio/components/interfaces/QueryPerformance/components/SortIndicator.tsx index 65de8f26a2..406a46d193 100644 --- a/apps/studio/components/interfaces/QueryPerformance/components/SortIndicator.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/components/SortIndicator.tsx @@ -1,5 +1,4 @@ import { X } from 'lucide-react' - import { Tooltip, TooltipContent, TooltipTrigger } from 'ui' interface SortIndicatorProps { diff --git a/apps/studio/components/interfaces/QueryPerformance/components/SourceFilterDropdown.tsx b/apps/studio/components/interfaces/QueryPerformance/components/SourceFilterDropdown.tsx index f3f1ade100..7ff4854a6e 100644 --- a/apps/studio/components/interfaces/QueryPerformance/components/SourceFilterDropdown.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/components/SourceFilterDropdown.tsx @@ -1,4 +1,4 @@ -import { FilterPopover } from 'components/ui/FilterPopover' +import { FilterPopover } from '@/components/ui/FilterPopover' interface SourceFilterDropdownProps { activeOptions: string[] diff --git a/apps/studio/components/interfaces/QueryPerformance/hooks/useIndexInvalidation.ts b/apps/studio/components/interfaces/QueryPerformance/hooks/useIndexInvalidation.ts index 6ebafea90c..48a368a675 100644 --- a/apps/studio/components/interfaces/QueryPerformance/hooks/useIndexInvalidation.ts +++ b/apps/studio/components/interfaces/QueryPerformance/hooks/useIndexInvalidation.ts @@ -1,8 +1,4 @@ import { useQueryClient } from '@tanstack/react-query' -import { useTableIndexAdvisor } from 'components/grid/context/TableIndexAdvisorContext' -import { databaseIndexesKeys } from 'data/database-indexes/keys' -import { databaseKeys } from 'data/database/keys' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { useRouter } from 'next/router' import { parseAsString, useQueryStates } from 'nuqs' import { useCallback } from 'react' @@ -14,6 +10,10 @@ import { import { type QueryPerformanceSort } from '../QueryPerformance.types' import { useQueryPerformanceQuery } from '../useQueryPerformanceQuery' import { useIndexAdvisorStatus } from './useIsIndexAdvisorStatus' +import { useTableIndexAdvisor } from '@/components/grid/context/TableIndexAdvisorContext' +import { databaseIndexesKeys } from '@/data/database-indexes/keys' +import { databaseKeys } from '@/data/database/keys' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export function useIndexInvalidation() { const router = useRouter() diff --git a/apps/studio/components/interfaces/QueryPerformance/hooks/useIsIndexAdvisorStatus.ts b/apps/studio/components/interfaces/QueryPerformance/hooks/useIsIndexAdvisorStatus.ts index 7001611ce7..22b51712aa 100644 --- a/apps/studio/components/interfaces/QueryPerformance/hooks/useIsIndexAdvisorStatus.ts +++ b/apps/studio/components/interfaces/QueryPerformance/hooks/useIsIndexAdvisorStatus.ts @@ -1,6 +1,6 @@ -import { getIndexAdvisorExtensions } from 'components/interfaces/QueryPerformance/IndexAdvisor/index-advisor.utils' -import { useDatabaseExtensionsQuery } from 'data/database-extensions/database-extensions-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' +import { getIndexAdvisorExtensions } from '@/components/interfaces/QueryPerformance/IndexAdvisor/index-advisor.utils' +import { useDatabaseExtensionsQuery } from '@/data/database-extensions/database-extensions-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' /** * Hook to get both index advisor availability and enabled status diff --git a/apps/studio/components/interfaces/QueryPerformance/hooks/useRolesFilter.ts b/apps/studio/components/interfaces/QueryPerformance/hooks/useRolesFilter.ts index c6f939b3c1..567f66cf85 100644 --- a/apps/studio/components/interfaces/QueryPerformance/hooks/useRolesFilter.ts +++ b/apps/studio/components/interfaces/QueryPerformance/hooks/useRolesFilter.ts @@ -1,8 +1,5 @@ import { useMemo } from 'react' -import { useDatabaseRolesQuery } from 'data/database-roles/database-roles-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' - import { APP_ACCESS_ROLES, isKnownRole, @@ -11,6 +8,8 @@ import { SUPABASE_SYSTEM_ROLES, type KnownRole, } from '../constants/roles' +import { useDatabaseRolesQuery } from '@/data/database-roles/database-roles-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export type RoleWithDescription = { name: string diff --git a/apps/studio/components/interfaces/QueryPerformance/hooks/useSupamonitorStatus.ts b/apps/studio/components/interfaces/QueryPerformance/hooks/useSupamonitorStatus.ts index d142b0e3a7..0b70e1aba9 100644 --- a/apps/studio/components/interfaces/QueryPerformance/hooks/useSupamonitorStatus.ts +++ b/apps/studio/components/interfaces/QueryPerformance/hooks/useSupamonitorStatus.ts @@ -1,5 +1,5 @@ -import { useSupamonitorEnabledQuery } from 'data/database/supamonitor-enabled-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' +import { useSupamonitorEnabledQuery } from '@/data/database/supamonitor-enabled-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export function useSupamonitorStatus() { const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/QueryPerformance/useQueryPerformanceQuery.ts b/apps/studio/components/interfaces/QueryPerformance/useQueryPerformanceQuery.ts index 1b8f593a31..1f91aba2f5 100644 --- a/apps/studio/components/interfaces/QueryPerformance/useQueryPerformanceQuery.ts +++ b/apps/studio/components/interfaces/QueryPerformance/useQueryPerformanceQuery.ts @@ -1,10 +1,4 @@ import { useInfiniteQuery, useQueryClient } from '@tanstack/react-query' -import { useReadReplicasQuery } from 'data/read-replicas/replicas-query' -import { executeSql } from 'data/sql/execute-sql-query' -import useDbQuery from 'hooks/analytics/useDbQuery' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { IS_PLATFORM } from 'lib/constants' -import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' import { PRESET_CONFIG } from '../Reports/Reports.constants' import { Presets } from '../Reports/Reports.types' @@ -13,6 +7,12 @@ import { QueryPerformanceSort, QueryPerformanceSQLParams, } from './QueryPerformance.types' +import { useReadReplicasQuery } from '@/data/read-replicas/replicas-query' +import { executeSql } from '@/data/sql/execute-sql-query' +import useDbQuery from '@/hooks/analytics/useDbQuery' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { IS_PLATFORM } from '@/lib/constants' +import { useDatabaseSelectorStateSnapshot } from '@/state/database-selector' const VALID_SORT_COLUMNS: ReadonlySet = new Set([ 'query', diff --git a/apps/studio/components/interfaces/Realtime/Inspector/AnimatedCursors.tsx b/apps/studio/components/interfaces/Realtime/Inspector/AnimatedCursors.tsx index de4bd3abae..50fcf5c43c 100644 --- a/apps/studio/components/interfaces/Realtime/Inspector/AnimatedCursors.tsx +++ b/apps/studio/components/interfaces/Realtime/Inspector/AnimatedCursors.tsx @@ -1,6 +1,6 @@ -import { useState, useEffect } from 'react' import { motion } from 'framer-motion' import { MousePointer2 } from 'lucide-react' +import { useEffect, useState } from 'react' export const AnimatedCursors = () => { const [cursor1Position, setCursor1Position] = useState({ x: 20, y: 20 }) diff --git a/apps/studio/components/interfaces/Realtime/Inspector/ChooseChannelPopover.tsx b/apps/studio/components/interfaces/Realtime/Inspector/ChooseChannelPopover.tsx index 6cf53e61e0..c551e88fe8 100644 --- a/apps/studio/components/interfaces/Realtime/Inspector/ChooseChannelPopover.tsx +++ b/apps/studio/components/interfaces/Realtime/Inspector/ChooseChannelPopover.tsx @@ -3,28 +3,28 @@ import { IS_PLATFORM, useParams } from 'common' import { ChevronDown } from 'lucide-react' import { Dispatch, SetStateAction, useState } from 'react' import { useForm } from 'react-hook-form' -import * as z from 'zod' - -import { DocsButton } from 'components/ui/DocsButton' -import { getTemporaryAPIKey } from 'data/api-keys/temp-api-keys-query' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { DOCS_URL } from 'lib/constants' import { Button, + Form_Shadcn_, FormControl_Shadcn_, FormDescription_Shadcn_, FormField_Shadcn_, FormItem_Shadcn_, FormLabel_Shadcn_, - Form_Shadcn_, Input_Shadcn_, + Popover_Shadcn_, PopoverContent_Shadcn_, PopoverTrigger_Shadcn_, - Popover_Shadcn_, Switch, } from 'ui' +import * as z from 'zod' + import { RealtimeConfig } from './useRealtimeMessages' +import { DocsButton } from '@/components/ui/DocsButton' +import { getTemporaryAPIKey } from '@/data/api-keys/temp-api-keys-query' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { DOCS_URL } from '@/lib/constants' interface ChooseChannelPopoverProps { config: RealtimeConfig diff --git a/apps/studio/components/interfaces/Realtime/Inspector/EmptyRealtime.tsx b/apps/studio/components/interfaces/Realtime/Inspector/EmptyRealtime.tsx index 2d0b725d1c..8139df5a4e 100644 --- a/apps/studio/components/interfaces/Realtime/Inspector/EmptyRealtime.tsx +++ b/apps/studio/components/interfaces/Realtime/Inspector/EmptyRealtime.tsx @@ -1,12 +1,12 @@ -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { DOCS_URL } from 'lib/constants' import Link from 'next/link' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { AiIconAnimation, Button, Card, cn } from 'ui' import { AnimatedCursors } from './AnimatedCursors' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' import { DocsButton } from '@/components/ui/DocsButton' +import { DOCS_URL } from '@/lib/constants' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' /** * Acts as a container component for the entire log display diff --git a/apps/studio/components/interfaces/Realtime/Inspector/Header.tsx b/apps/studio/components/interfaces/Realtime/Inspector/Header.tsx index 9e8af8a2d6..47b1d18124 100644 --- a/apps/studio/components/interfaces/Realtime/Inspector/Header.tsx +++ b/apps/studio/components/interfaces/Realtime/Inspector/Header.tsx @@ -1,10 +1,5 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { IS_PLATFORM, useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { getTemporaryAPIKey } from 'data/api-keys/temp-api-keys-query' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { PlayCircle, StopCircle } from 'lucide-react' import { Dispatch, SetStateAction } from 'react' @@ -12,6 +7,11 @@ import { ChooseChannelPopover } from './ChooseChannelPopover' import { RealtimeFilterPopover } from './RealtimeFilterPopover' import { RealtimeTokensPopover } from './RealtimeTokensPopover' import { RealtimeConfig } from './useRealtimeMessages' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { getTemporaryAPIKey } from '@/data/api-keys/temp-api-keys-query' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' interface HeaderProps { config: RealtimeConfig diff --git a/apps/studio/components/interfaces/Realtime/Inspector/MessageSelection.tsx b/apps/studio/components/interfaces/Realtime/Inspector/MessageSelection.tsx index e0d14a7bb2..9b6cbe0344 100644 --- a/apps/studio/components/interfaces/Realtime/Inspector/MessageSelection.tsx +++ b/apps/studio/components/interfaces/Realtime/Inspector/MessageSelection.tsx @@ -1,13 +1,13 @@ import { useParams } from 'common' -import CopyButton from 'components/ui/CopyButton' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { X } from 'lucide-react' import { useMemo } from 'react' import { Button, cn } from 'ui' import type { LogData } from './Messages.types' import { SelectedRealtimeMessagePanel } from './SelectedRealtimeMessagePanel' +import CopyButton from '@/components/ui/CopyButton' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' export interface MessageSelectionProps { log: LogData | null diff --git a/apps/studio/components/interfaces/Realtime/Inspector/MessagesFormatters.tsx b/apps/studio/components/interfaces/Realtime/Inspector/MessagesFormatters.tsx index 58beca3d59..332a46bd75 100644 --- a/apps/studio/components/interfaces/Realtime/Inspector/MessagesFormatters.tsx +++ b/apps/studio/components/interfaces/Realtime/Inspector/MessagesFormatters.tsx @@ -1,7 +1,7 @@ import { PropsWithChildren } from 'react' -import CopyButton from 'components/ui/CopyButton' import { unixMicroToIsoTimestamp } from './Messages.utils' +import CopyButton from '@/components/ui/CopyButton' export const RowLayout = ({ children }: PropsWithChildren<{}>) => (
{children}
diff --git a/apps/studio/components/interfaces/Realtime/Inspector/MessagesTable.tsx b/apps/studio/components/interfaces/Realtime/Inspector/MessagesTable.tsx index 466dbe35b7..9030a2bbe7 100644 --- a/apps/studio/components/interfaces/Realtime/Inspector/MessagesTable.tsx +++ b/apps/studio/components/interfaces/Realtime/Inspector/MessagesTable.tsx @@ -1,12 +1,5 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { DocsButton } from 'components/ui/DocsButton' -import NoPermission from 'components/ui/NoPermission' -import ShimmerLine from 'components/ui/ShimmerLine' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { DOCS_URL } from 'lib/constants' import { isEqual } from 'lodash' import { ExternalLink, Loader2, Megaphone } from 'lucide-react' import Link from 'next/link' @@ -19,6 +12,13 @@ import type { LogData } from './Messages.types' import MessageSelection from './MessageSelection' import NoChannelEmptyState from './NoChannelEmptyState' import { ColumnRenderer } from './RealtimeMessageColumnRenderer' +import { DocsButton } from '@/components/ui/DocsButton' +import NoPermission from '@/components/ui/NoPermission' +import ShimmerLine from '@/components/ui/ShimmerLine' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { DOCS_URL } from '@/lib/constants' export const isErrorLog = (l: LogData) => { return l.message === 'SYSTEM' && l.metadata?.status === 'error' diff --git a/apps/studio/components/interfaces/Realtime/Inspector/NoChannelEmptyState.tsx b/apps/studio/components/interfaces/Realtime/Inspector/NoChannelEmptyState.tsx index 74ee5a9eec..d64cde17e2 100644 --- a/apps/studio/components/interfaces/Realtime/Inspector/NoChannelEmptyState.tsx +++ b/apps/studio/components/interfaces/Realtime/Inspector/NoChannelEmptyState.tsx @@ -1,7 +1,8 @@ -import { DocsButton } from 'components/ui/DocsButton' -import { DOCS_URL } from 'lib/constants' import { cn } from 'ui' +import { DocsButton } from '@/components/ui/DocsButton' +import { DOCS_URL } from '@/lib/constants' + const NoChannelEmptyState = () => { return (
diff --git a/apps/studio/components/interfaces/Realtime/Inspector/RealtimeFilterPopover/FilterSchema.tsx b/apps/studio/components/interfaces/Realtime/Inspector/RealtimeFilterPopover/FilterSchema.tsx index a6e1f60040..5887ed4d76 100644 --- a/apps/studio/components/interfaces/Realtime/Inspector/RealtimeFilterPopover/FilterSchema.tsx +++ b/apps/studio/components/interfaces/Realtime/Inspector/RealtimeFilterPopover/FilterSchema.tsx @@ -1,4 +1,4 @@ -import SchemaSelector from 'components/ui/SchemaSelector' +import SchemaSelector from '@/components/ui/SchemaSelector' export const FilterSchema = ({ value, diff --git a/apps/studio/components/interfaces/Realtime/Inspector/RealtimeFilterPopover/TableSelector.tsx b/apps/studio/components/interfaces/Realtime/Inspector/RealtimeFilterPopover/TableSelector.tsx index fb3bf7c4eb..0f6afc9450 100644 --- a/apps/studio/components/interfaces/Realtime/Inspector/RealtimeFilterPopover/TableSelector.tsx +++ b/apps/studio/components/interfaces/Realtime/Inspector/RealtimeFilterPopover/TableSelector.tsx @@ -1,26 +1,26 @@ import { debounce } from 'lodash' import { Check, Code, Loader } from 'lucide-react' import { useEffect, useState } from 'react' - -import { useEntityTypesQuery } from 'data/entity-types/entity-types-infinite-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { + Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, - Alert_Shadcn_, Button, + Command_Shadcn_, CommandEmpty_Shadcn_, CommandGroup_Shadcn_, CommandInput_Shadcn_, CommandItem_Shadcn_, CommandList_Shadcn_, - Command_Shadcn_, + Popover_Shadcn_, PopoverContent_Shadcn_, PopoverTrigger_Shadcn_, - Popover_Shadcn_, ScrollArea, } from 'ui' +import { useEntityTypesQuery } from '@/data/entity-types/entity-types-infinite-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' + interface TableSelectorProps { className?: string size?: 'tiny' | 'small' diff --git a/apps/studio/components/interfaces/Realtime/Inspector/RealtimeFilterPopover/index.tsx b/apps/studio/components/interfaces/Realtime/Inspector/RealtimeFilterPopover/index.tsx index 2453a2d056..b4e1a5827a 100644 --- a/apps/studio/components/interfaces/Realtime/Inspector/RealtimeFilterPopover/index.tsx +++ b/apps/studio/components/interfaces/Realtime/Inspector/RealtimeFilterPopover/index.tsx @@ -1,31 +1,31 @@ +import { useParams } from 'common' import { PlusCircle } from 'lucide-react' import Link from 'next/link' import { Dispatch, SetStateAction, useEffect, useState } from 'react' - -import { InlineLink } from '@/components/ui/InlineLink' -import { useDatabasePublicationsQuery } from '@/data/database-publications/database-publications-query' -import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' -import { useParams } from 'common' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { DOCS_URL } from 'lib/constants' import { Badge, Button, + cn, IconBroadcast, IconDatabaseChanges, IconPresence, Input, + Popover_Shadcn_, PopoverContent_Shadcn_, PopoverTrigger_Shadcn_, - Popover_Shadcn_, Toggle, - cn, } from 'ui' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' + import { RealtimeConfig } from '../useRealtimeMessages' import { FilterSchema } from './FilterSchema' import { FilterTable } from './FilterTable' +import { InlineLink } from '@/components/ui/InlineLink' +import { useDatabasePublicationsQuery } from '@/data/database-publications/database-publications-query' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' interface RealtimeFilterPopoverProps { config: RealtimeConfig diff --git a/apps/studio/components/interfaces/Realtime/Inspector/RealtimeMessageColumnRenderer.tsx b/apps/studio/components/interfaces/Realtime/Inspector/RealtimeMessageColumnRenderer.tsx index d9ac7b4e32..91d55d1191 100644 --- a/apps/studio/components/interfaces/Realtime/Inspector/RealtimeMessageColumnRenderer.tsx +++ b/apps/studio/components/interfaces/Realtime/Inspector/RealtimeMessageColumnRenderer.tsx @@ -1,7 +1,7 @@ +import { AlertTriangle } from 'lucide-react' import { Column } from 'react-data-grid' import { cn, IconBroadcast, IconDatabaseChanges, IconPresence } from 'ui' -import { AlertTriangle } from 'lucide-react' import type { LogData, PreviewLogData } from './Messages.types' import { RowLayout } from './MessagesFormatters' import { isErrorLog } from './MessagesTable' diff --git a/apps/studio/components/interfaces/Realtime/Inspector/RealtimeTokensPopover.tsx b/apps/studio/components/interfaces/Realtime/Inspector/RealtimeTokensPopover.tsx index 2aedcb99c6..22a58b114f 100644 --- a/apps/studio/components/interfaces/Realtime/Inspector/RealtimeTokensPopover.tsx +++ b/apps/studio/components/interfaces/Realtime/Inspector/RealtimeTokensPopover.tsx @@ -1,19 +1,19 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { Dispatch, SetStateAction, useEffect, useRef } from 'react' import { toast } from 'sonner' -import { useParams } from 'common' -import { RoleImpersonationPopover } from 'components/interfaces/RoleImpersonationSelector/RoleImpersonationPopover' -import { getKeys, useAPIKeysQuery } from 'data/api-keys/api-keys-query' -import { getTemporaryAPIKey } from 'data/api-keys/temp-api-keys-query' -import { useProjectPostgrestConfigQuery } from 'data/config/project-postgrest-config-query' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { IS_PLATFORM } from 'lib/constants' -import { getRoleImpersonationJWT } from 'lib/role-impersonation' -import { useRoleImpersonationStateSnapshot } from 'state/role-impersonation-state' import { RealtimeConfig } from './useRealtimeMessages' +import { RoleImpersonationPopover } from '@/components/interfaces/RoleImpersonationSelector/RoleImpersonationPopover' +import { getKeys, useAPIKeysQuery } from '@/data/api-keys/api-keys-query' +import { getTemporaryAPIKey } from '@/data/api-keys/temp-api-keys-query' +import { useProjectPostgrestConfigQuery } from '@/data/config/project-postgrest-config-query' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { IS_PLATFORM } from '@/lib/constants' +import { getRoleImpersonationJWT } from '@/lib/role-impersonation' +import { useRoleImpersonationStateSnapshot } from '@/state/role-impersonation-state' interface RealtimeTokensPopoverProps { config: RealtimeConfig diff --git a/apps/studio/components/interfaces/Realtime/Inspector/SendMessageModal.tsx b/apps/studio/components/interfaces/Realtime/Inspector/SendMessageModal.tsx index 4544111808..be3bc21622 100644 --- a/apps/studio/components/interfaces/Realtime/Inspector/SendMessageModal.tsx +++ b/apps/studio/components/interfaces/Realtime/Inspector/SendMessageModal.tsx @@ -1,9 +1,9 @@ import { useEffect, useState } from 'react' - -import CodeEditor from 'components/ui/CodeEditor/CodeEditor' -import { tryParseJson } from 'lib/helpers' import { Input, Modal } from 'ui' +import CodeEditor from '@/components/ui/CodeEditor/CodeEditor' +import { tryParseJson } from '@/lib/helpers' + interface SendMessageModalProps { visible: boolean onSelectCancel: () => void diff --git a/apps/studio/components/interfaces/Realtime/Inspector/index.tsx b/apps/studio/components/interfaces/Realtime/Inspector/index.tsx index 64b6d1230d..64570e52d8 100644 --- a/apps/studio/components/interfaces/Realtime/Inspector/index.tsx +++ b/apps/studio/components/interfaces/Realtime/Inspector/index.tsx @@ -1,8 +1,4 @@ import { useParams } from 'common' -import { useDatabasePublicationsQuery } from 'data/database-publications/database-publications-query' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { useEffect, useState } from 'react' import { EmptyRealtime } from './EmptyRealtime' @@ -10,6 +6,10 @@ import { Header } from './Header' import MessagesTable from './MessagesTable' import { SendMessageModal } from './SendMessageModal' import { RealtimeConfig, useRealtimeMessages } from './useRealtimeMessages' +import { useDatabasePublicationsQuery } from '@/data/database-publications/database-publications-query' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' /** * Acts as a container component for the entire log display diff --git a/apps/studio/components/interfaces/Realtime/Inspector/useRealtimeMessages.ts b/apps/studio/components/interfaces/Realtime/Inspector/useRealtimeMessages.ts index 88ac870e16..df6681bf6c 100644 --- a/apps/studio/components/interfaces/Realtime/Inspector/useRealtimeMessages.ts +++ b/apps/studio/components/interfaces/Realtime/Inspector/useRealtimeMessages.ts @@ -3,11 +3,11 @@ import { sortBy, take } from 'lodash' import { Dispatch, SetStateAction, useCallback, useEffect, useReducer, useState } from 'react' import { toast } from 'sonner' -import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' -import { uuidv4 } from 'lib/helpers' -import { EMPTY_ARR } from 'lib/void' -import { useRoleImpersonationStateSnapshot } from 'state/role-impersonation-state' import type { LogData } from './Messages.types' +import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' +import { uuidv4 } from '@/lib/helpers' +import { EMPTY_ARR } from '@/lib/void' +import { useRoleImpersonationStateSnapshot } from '@/state/role-impersonation-state' const DEFAULT_HEADERS = { 'X-Client-Info': 'supabase-js-web/studio' } diff --git a/apps/studio/components/interfaces/Realtime/Policies.tsx b/apps/studio/components/interfaces/Realtime/Policies.tsx index 5b1a4c061e..34f9727d64 100644 --- a/apps/studio/components/interfaces/Realtime/Policies.tsx +++ b/apps/studio/components/interfaces/Realtime/Policies.tsx @@ -1,16 +1,16 @@ import { PostgresPolicy } from '@supabase/postgres-meta' import { useMemo, useState } from 'react' - -import { Policies } from 'components/interfaces/Auth/Policies/Policies' -import { PoliciesDataProvider } from 'components/interfaces/Auth/Policies/PoliciesDataContext' -import { PolicyEditorPanel } from 'components/interfaces/Auth/Policies/PolicyEditorPanel' -import AlertError from 'components/ui/AlertError' -import { useProjectPostgrestConfigQuery } from 'data/config/project-postgrest-config-query' -import { useDatabasePoliciesQuery } from 'data/database-policies/database-policies-query' -import { useTablesQuery } from 'data/tables/tables-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' +import { Policies } from '@/components/interfaces/Auth/Policies/Policies' +import { PoliciesDataProvider } from '@/components/interfaces/Auth/Policies/PoliciesDataContext' +import { PolicyEditorPanel } from '@/components/interfaces/Auth/Policies/PolicyEditorPanel' +import AlertError from '@/components/ui/AlertError' +import { useProjectPostgrestConfigQuery } from '@/data/config/project-postgrest-config-query' +import { useDatabasePoliciesQuery } from '@/data/database-policies/database-policies-query' +import { useTablesQuery } from '@/data/tables/tables-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' + export const RealtimePolicies = () => { const { data: project } = useSelectedProjectQuery() const { data: postgrestConfig } = useProjectPostgrestConfigQuery({ projectRef: project?.ref }) diff --git a/apps/studio/components/interfaces/Realtime/RealtimeSettings.tsx b/apps/studio/components/interfaces/Realtime/RealtimeSettings.tsx index 9e7e0b367f..97fc2b1a8c 100644 --- a/apps/studio/components/interfaces/Realtime/RealtimeSettings.tsx +++ b/apps/studio/components/interfaces/Realtime/RealtimeSettings.tsx @@ -1,19 +1,6 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { ToggleSpendCapButton } from 'components/ui/ToggleSpendCapButton' -import { UpgradePlanButton } from 'components/ui/UpgradePlanButton' -import { useDatabasePoliciesQuery } from 'data/database-policies/database-policies-query' -import { useMaxConnectionsQuery } from 'data/database/max-connections-query' -import { useRealtimeConfigurationUpdateMutation } from 'data/realtime/realtime-config-mutation' -import { - REALTIME_DEFAULT_CONFIG, - useRealtimeConfigurationQuery, -} from 'data/realtime/realtime-config-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import Link from 'next/link' import { useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' @@ -38,6 +25,20 @@ import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import * as z from 'zod' +import AlertError from '@/components/ui/AlertError' +import { ToggleSpendCapButton } from '@/components/ui/ToggleSpendCapButton' +import { UpgradePlanButton } from '@/components/ui/UpgradePlanButton' +import { useDatabasePoliciesQuery } from '@/data/database-policies/database-policies-query' +import { useMaxConnectionsQuery } from '@/data/database/max-connections-query' +import { useRealtimeConfigurationUpdateMutation } from '@/data/realtime/realtime-config-mutation' +import { + REALTIME_DEFAULT_CONFIG, + useRealtimeConfigurationQuery, +} from '@/data/realtime/realtime-config-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' + const formId = 'realtime-configuration-form' export const RealtimeSettings = () => { diff --git a/apps/studio/components/interfaces/Reports/CreateReportModal.tsx b/apps/studio/components/interfaces/Reports/CreateReportModal.tsx index 667892049d..747297a388 100644 --- a/apps/studio/components/interfaces/Reports/CreateReportModal.tsx +++ b/apps/studio/components/interfaces/Reports/CreateReportModal.tsx @@ -1,8 +1,4 @@ import { zodResolver } from '@hookform/resolvers/zod' -import { useContentUpsertMutation } from 'data/content/content-upsert-mutation' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { uuidv4 } from 'lib/helpers' -import { useProfile } from 'lib/profile' import { useRouter } from 'next/router' import { useMemo } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' @@ -19,6 +15,11 @@ import { import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import * as z from 'zod' +import { useContentUpsertMutation } from '@/data/content/content-upsert-mutation' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { uuidv4 } from '@/lib/helpers' +import { useProfile } from '@/lib/profile' + export interface CreateReportModal { visible: boolean onCancel: () => void diff --git a/apps/studio/components/interfaces/Reports/GridResize.tsx b/apps/studio/components/interfaces/Reports/GridResize.tsx index 1770fb7ce1..bd5be9a51b 100644 --- a/apps/studio/components/interfaces/Reports/GridResize.tsx +++ b/apps/studio/components/interfaces/Reports/GridResize.tsx @@ -1,24 +1,26 @@ import RGL, { WidthProvider } from 'react-grid-layout' + import 'react-grid-layout/css/styles.css' import 'react-resizable/css/styles.css' -import { toast } from 'sonner' import { useParams } from 'common' -import { DEFAULT_CHART_CONFIG } from 'components/ui/QueryBlock/QueryBlock' -import { AnalyticsInterval } from 'data/analytics/constants' -import { - UpsertContentPayload, - useContentUpsertMutation, -} from 'data/content/content-upsert-mutation' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useProfile } from 'lib/profile' -import type { Dashboards } from 'types' +import { toast } from 'sonner' + import { createSqlSnippetSkeletonV2 } from '../SQLEditor/SQLEditor.utils' import { ChartConfig } from '../SQLEditor/UtilityPanel/ChartConfig' import { ReportBlock } from './ReportBlock/ReportBlock' import { LAYOUT_COLUMN_COUNT } from './Reports.constants' +import { DEFAULT_CHART_CONFIG } from '@/components/ui/QueryBlock/QueryBlock' +import { AnalyticsInterval } from '@/data/analytics/constants' +import { + UpsertContentPayload, + useContentUpsertMutation, +} from '@/data/content/content-upsert-mutation' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useProfile } from '@/lib/profile' +import type { Dashboards } from '@/types' const ReactGridLayout = WidthProvider(RGL) diff --git a/apps/studio/components/interfaces/Reports/MetricOptions.tsx b/apps/studio/components/interfaces/Reports/MetricOptions.tsx index ffd5bd4243..831f2eead5 100644 --- a/apps/studio/components/interfaces/Reports/MetricOptions.tsx +++ b/apps/studio/components/interfaces/Reports/MetricOptions.tsx @@ -1,16 +1,7 @@ import { useDebounce } from '@uidotdev/usehooks' import { useParams } from 'common' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { useContentQuery } from 'data/content/content-query' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { Metric, METRIC_CATEGORIES, METRICS } from 'lib/constants/metrics' import { Home, Plus } from 'lucide-react' import { useState } from 'react' -import { editorPanelState } from 'state/editor-panel-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' -import type { Dashboards } from 'types' import { Command_Shadcn_, CommandGroup_Shadcn_, @@ -27,6 +18,15 @@ import { import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { DEPRECATED_REPORTS } from './Reports.constants' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { useContentQuery } from '@/data/content/content-query' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { Metric, METRIC_CATEGORIES, METRICS } from '@/lib/constants/metrics' +import { editorPanelState } from '@/state/editor-panel-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' +import type { Dashboards } from '@/types' interface MetricOptionsProps { config?: Dashboards.Content diff --git a/apps/studio/components/interfaces/Reports/ReportBlock/ChartBlock.tsx b/apps/studio/components/interfaces/Reports/ReportBlock/ChartBlock.tsx index abeab07ee0..61a9e249e6 100644 --- a/apps/studio/components/interfaces/Reports/ReportBlock/ChartBlock.tsx +++ b/apps/studio/components/interfaces/Reports/ReportBlock/ChartBlock.tsx @@ -1,29 +1,32 @@ -import { ChartConfig } from 'components/interfaces/SQLEditor/UtilityPanel/ChartConfig' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import NoDataPlaceholder from 'components/ui/Charts/NoDataPlaceholder' -import { checkHasNonPositiveValues, formatLogTick } from 'components/ui/QueryBlock/QueryBlock.utils' -import { AnalyticsInterval } from 'data/analytics/constants' -import { mapMultiResponseToAnalyticsData } from 'data/analytics/infra-monitoring-queries' -import { - InfraMonitoringAttribute, - useInfraMonitoringAttributesQuery, -} from 'data/analytics/infra-monitoring-query' -import { - ProjectDailyStatsAttribute, - useProjectDailyStatsQuery, -} from 'data/analytics/project-daily-stats-query' import dayjs from 'dayjs' -import { METRICS } from 'lib/constants/metrics' import { Activity, BarChartIcon, Loader2 } from 'lucide-react' import { useRouter } from 'next/router' import { ReactNode, useCallback, useEffect, useMemo, useState } from 'react' import { Bar, BarChart, CartesianGrid, Line, LineChart, XAxis, YAxis } from 'recharts' -import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' -import type { Dashboards } from 'types' import { ChartContainer, ChartTooltip, ChartTooltipContent, WarningIcon } from 'ui' import { METRIC_THRESHOLDS } from './ReportBlock.constants' import { ReportBlockContainer } from './ReportBlockContainer' +import { ChartConfig } from '@/components/interfaces/SQLEditor/UtilityPanel/ChartConfig' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import NoDataPlaceholder from '@/components/ui/Charts/NoDataPlaceholder' +import { + checkHasNonPositiveValues, + formatLogTick, +} from '@/components/ui/QueryBlock/QueryBlock.utils' +import { AnalyticsInterval } from '@/data/analytics/constants' +import { mapMultiResponseToAnalyticsData } from '@/data/analytics/infra-monitoring-queries' +import { + InfraMonitoringAttribute, + useInfraMonitoringAttributesQuery, +} from '@/data/analytics/infra-monitoring-query' +import { + ProjectDailyStatsAttribute, + useProjectDailyStatsQuery, +} from '@/data/analytics/project-daily-stats-query' +import { METRICS } from '@/lib/constants/metrics' +import { useDatabaseSelectorStateSnapshot } from '@/state/database-selector' +import type { Dashboards } from '@/types' interface ChartBlockProps { label: string diff --git a/apps/studio/components/interfaces/Reports/ReportBlock/DeprecatedChartBlock.tsx b/apps/studio/components/interfaces/Reports/ReportBlock/DeprecatedChartBlock.tsx index 4bd09d91a5..66e60bdf51 100644 --- a/apps/studio/components/interfaces/Reports/ReportBlock/DeprecatedChartBlock.tsx +++ b/apps/studio/components/interfaces/Reports/ReportBlock/DeprecatedChartBlock.tsx @@ -1,8 +1,9 @@ import { useParams } from 'common' -import { InlineLink } from 'components/ui/InlineLink' -import { METRICS } from 'lib/constants/metrics' import { ReactNode } from 'react' + import { ReportBlockContainer } from './ReportBlockContainer' +import { InlineLink } from '@/components/ui/InlineLink' +import { METRICS } from '@/lib/constants/metrics' interface DeprecatedChartBlockProps { label: string diff --git a/apps/studio/components/interfaces/Reports/ReportBlock/ReportBlock.tsx b/apps/studio/components/interfaces/Reports/ReportBlock/ReportBlock.tsx index 34f540c384..8c8392e467 100644 --- a/apps/studio/components/interfaces/Reports/ReportBlock/ReportBlock.tsx +++ b/apps/studio/components/interfaces/Reports/ReportBlock/ReportBlock.tsx @@ -1,22 +1,22 @@ import { useQuery } from '@tanstack/react-query' import { useParams } from 'common' -import { ChartConfig } from 'components/interfaces/SQLEditor/UtilityPanel/ChartConfig' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DEFAULT_CHART_CONFIG, QueryBlock } from 'components/ui/QueryBlock/QueryBlock' -import { AnalyticsInterval } from 'data/analytics/constants' -import { useContentIdQuery } from 'data/content/content-id-query' -import { usePrimaryDatabase } from 'data/read-replicas/replicas-query' -import { executeSql } from 'data/sql/execute-sql-query' -import { sqlKeys } from 'data/sql/keys' import { X } from 'lucide-react' import { useEffect, useState } from 'react' import { toast } from 'sonner' -import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' -import type { Dashboards, SqlSnippets } from 'types' import { DEPRECATED_REPORTS } from '../Reports.constants' import { ChartBlock } from './ChartBlock' import { DeprecatedChartBlock } from './DeprecatedChartBlock' +import { ChartConfig } from '@/components/interfaces/SQLEditor/UtilityPanel/ChartConfig' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DEFAULT_CHART_CONFIG, QueryBlock } from '@/components/ui/QueryBlock/QueryBlock' +import { AnalyticsInterval } from '@/data/analytics/constants' +import { useContentIdQuery } from '@/data/content/content-id-query' +import { usePrimaryDatabase } from '@/data/read-replicas/replicas-query' +import { executeSql } from '@/data/sql/execute-sql-query' +import { sqlKeys } from '@/data/sql/keys' +import { useDatabaseSelectorStateSnapshot } from '@/state/database-selector' +import type { Dashboards, SqlSnippets } from '@/types' interface ReportBlockProps { item: Dashboards.Chart diff --git a/apps/studio/components/interfaces/Reports/ReportBlock/ReportBlockContainer.tsx b/apps/studio/components/interfaces/Reports/ReportBlock/ReportBlockContainer.tsx index 4cb1ef68da..18b70c5f54 100644 --- a/apps/studio/components/interfaces/Reports/ReportBlock/ReportBlockContainer.tsx +++ b/apps/studio/components/interfaces/Reports/ReportBlock/ReportBlockContainer.tsx @@ -1,6 +1,5 @@ import { Code, GripHorizontal } from 'lucide-react' import { DragEvent, PropsWithChildren, ReactNode } from 'react' - import { cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' interface ReportBlockContainerProps { diff --git a/apps/studio/components/interfaces/Reports/ReportFilterBar.tsx b/apps/studio/components/interfaces/Reports/ReportFilterBar.tsx index 80cde9d7d6..2b151e9af0 100644 --- a/apps/studio/components/interfaces/Reports/ReportFilterBar.tsx +++ b/apps/studio/components/interfaces/Reports/ReportFilterBar.tsx @@ -1,16 +1,12 @@ +import { Popover, PopoverContent, PopoverTrigger } from '@ui/components/shadcn/ui/popover' +import { useParams } from 'common' +import { Auth, Realtime, Storage } from 'icons' import { ChevronDown, Database, Network, Plus, RefreshCw, X } from 'lucide-react' import { ComponentProps, useEffect, useState } from 'react' import SVG from 'react-inlinesvg' - -import { Popover, PopoverContent, PopoverTrigger } from '@ui/components/shadcn/ui/popover' -import { useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DatabaseSelector } from 'components/ui/DatabaseSelector' -import { useLoadBalancersQuery } from 'data/read-replicas/load-balancers-query' -import { Auth, Realtime, Storage } from 'icons' -import { BASE_PATH } from 'lib/constants' import { Button, + cn, DropdownMenu, DropdownMenuContent, DropdownMenuItem, @@ -18,11 +14,15 @@ import { DropdownMenuTrigger, Input, Select, - cn, } from 'ui' + import { DatePickerValue, LogsDatePicker } from '../Settings/Logs/Logs.DatePickers' import { REPORTS_DATEPICKER_HELPERS } from './Reports.constants' import type { ReportFilterItem } from './Reports.types' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DatabaseSelector } from '@/components/ui/DatabaseSelector' +import { useLoadBalancersQuery } from '@/data/read-replicas/load-balancers-query' +import { BASE_PATH } from '@/lib/constants' interface ReportFilterBarProps { filters: ReportFilterItem[] diff --git a/apps/studio/components/interfaces/Reports/ReportFilterPopover.tsx b/apps/studio/components/interfaces/Reports/ReportFilterPopover.tsx index 47298ddc4f..1189867c69 100644 --- a/apps/studio/components/interfaces/Reports/ReportFilterPopover.tsx +++ b/apps/studio/components/interfaces/Reports/ReportFilterPopover.tsx @@ -1,26 +1,26 @@ import { isEqual } from 'lodash' import { ChevronDown, Filter as FilterIcon, Plus, X } from 'lucide-react' import { KeyboardEvent, useCallback, useEffect, useMemo, useState } from 'react' - -import { DropdownControl } from 'components/grid/components/common/DropdownControl' import { Button, + cn, + Command_Shadcn_, CommandEmpty_Shadcn_, CommandGroup_Shadcn_, CommandInput_Shadcn_, CommandItem_Shadcn_, CommandList_Shadcn_, - Command_Shadcn_, Input, + Popover_Shadcn_, PopoverContent_Shadcn_, PopoverSeparator_Shadcn_, PopoverTrigger_Shadcn_, - Popover_Shadcn_, - cn, } from 'ui' import { sizes } from 'ui/src/lib/commonCva' import defaultTheme from 'ui/src/lib/theme/defaultTheme' + import type { ReportFilter, ReportFilterProperty } from './Reports.types' +import { DropdownControl } from '@/components/grid/components/common/DropdownControl' const FilterableInput = ({ value, diff --git a/apps/studio/components/interfaces/Reports/ReportHeader.tsx b/apps/studio/components/interfaces/Reports/ReportHeader.tsx index 39369c0625..7a54f7fa5f 100644 --- a/apps/studio/components/interfaces/Reports/ReportHeader.tsx +++ b/apps/studio/components/interfaces/Reports/ReportHeader.tsx @@ -1,7 +1,7 @@ +import { useParams } from 'common' import { useRouter } from 'next/router' -import { useParams } from 'common' -import { DatabaseSelector } from 'components/ui/DatabaseSelector' +import { DatabaseSelector } from '@/components/ui/DatabaseSelector' interface ReportHeaderProps { title: string diff --git a/apps/studio/components/interfaces/Reports/ReportPadding.tsx b/apps/studio/components/interfaces/Reports/ReportPadding.tsx index a002a9846a..abc3d87d21 100644 --- a/apps/studio/components/interfaces/Reports/ReportPadding.tsx +++ b/apps/studio/components/interfaces/Reports/ReportPadding.tsx @@ -1,5 +1,4 @@ import { PropsWithChildren } from 'react' - import { cn } from 'ui' /** diff --git a/apps/studio/components/interfaces/Reports/ReportWidget.tsx b/apps/studio/components/interfaces/Reports/ReportWidget.tsx index a7a771957d..4d8f6177cc 100644 --- a/apps/studio/components/interfaces/Reports/ReportWidget.tsx +++ b/apps/studio/components/interfaces/Reports/ReportWidget.tsx @@ -1,12 +1,12 @@ +import { useParams } from 'common' import { ExternalLink, HelpCircle } from 'lucide-react' import { NextRouter, useRouter } from 'next/router' import { ReactNode } from 'react' +import { Button, cn, Loading, Tooltip, TooltipContent, TooltipTrigger } from 'ui' -import { useParams } from 'common' -import Panel from 'components/ui/Panel' -import { Button, Loading, Tooltip, TooltipContent, TooltipTrigger, cn } from 'ui' import type { LogsEndpointParams } from '../Settings/Logs/Logs.types' import type { BaseReportParams, ReportQueryType } from './Reports.types' +import Panel from '@/components/ui/Panel' export interface ReportWidgetProps { data: T[] diff --git a/apps/studio/components/interfaces/Reports/Reports.constants.test.ts b/apps/studio/components/interfaces/Reports/Reports.constants.test.ts index 50d40d413f..5ece03218c 100644 --- a/apps/studio/components/interfaces/Reports/Reports.constants.test.ts +++ b/apps/studio/components/interfaces/Reports/Reports.constants.test.ts @@ -1,4 +1,5 @@ -import { describe, it, expect } from 'vitest' +import { describe, expect, it } from 'vitest' + import { generateRegexpWhere } from './Reports.constants' import type { ReportFilterItem } from './Reports.types' diff --git a/apps/studio/components/interfaces/Reports/Reports.constants.ts b/apps/studio/components/interfaces/Reports/Reports.constants.ts index 7c56e63954..a46de31a3d 100644 --- a/apps/studio/components/interfaces/Reports/Reports.constants.ts +++ b/apps/studio/components/interfaces/Reports/Reports.constants.ts @@ -1,8 +1,8 @@ -import { PlanId } from 'data/subscriptions/types' import dayjs from 'dayjs' import type { DatetimeHelper } from '../Settings/Logs/Logs.types' import { PresetConfig, Presets, ReportFilterItem } from './Reports.types' +import { PlanId } from '@/data/subscriptions/types' export const LAYOUT_COLUMN_COUNT = 2 diff --git a/apps/studio/components/interfaces/Reports/Reports.tsx b/apps/studio/components/interfaces/Reports/Reports.tsx index 98f4b82639..db80ac912d 100644 --- a/apps/studio/components/interfaces/Reports/Reports.tsx +++ b/apps/studio/components/interfaces/Reports/Reports.tsx @@ -1,34 +1,12 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useQueryClient } from '@tanstack/react-query' import { useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DatabaseSelector } from 'components/ui/DatabaseSelector' -import { DateRangePicker } from 'components/ui/DateRangePicker' -import NoPermission from 'components/ui/NoPermission' -import { DEFAULT_CHART_CONFIG } from 'components/ui/QueryBlock/QueryBlock' -import { AnalyticsInterval } from 'data/analytics/constants' -import { analyticsKeys } from 'data/analytics/keys' -import { useContentQuery } from 'data/content/content-query' -import { - UpsertContentPayload, - useContentUpsertMutation, -} from 'data/content/content-upsert-mutation' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' import dayjs from 'dayjs' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { BASE_PATH } from 'lib/constants' -import { Metric, TIME_PERIODS_REPORTS } from 'lib/constants/metrics' -import { uuidv4 } from 'lib/helpers' -import { useProfile } from 'lib/profile' import { groupBy, isEqual, isNull } from 'lodash' import { Plus, RefreshCw, Save } from 'lucide-react' import { useRouter } from 'next/router' import { DragEvent, useEffect, useState } from 'react' import { toast } from 'sonner' -import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' -import type { Dashboards } from 'types' import { Button, cn, DropdownMenu, DropdownMenuContent, DropdownMenuTrigger, LogoLoader } from 'ui' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' @@ -38,6 +16,28 @@ import { GridResize } from './GridResize' import { MetricOptions } from './MetricOptions' import { LAYOUT_COLUMN_COUNT } from './Reports.constants' import { PreventNavigationOnUnsavedChanges } from '@/components/ui-patterns/Dialogs/PreventNavigationOnUnsavedChanges' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DatabaseSelector } from '@/components/ui/DatabaseSelector' +import { DateRangePicker } from '@/components/ui/DateRangePicker' +import NoPermission from '@/components/ui/NoPermission' +import { DEFAULT_CHART_CONFIG } from '@/components/ui/QueryBlock/QueryBlock' +import { AnalyticsInterval } from '@/data/analytics/constants' +import { analyticsKeys } from '@/data/analytics/keys' +import { useContentQuery } from '@/data/content/content-query' +import { + UpsertContentPayload, + useContentUpsertMutation, +} from '@/data/content/content-upsert-mutation' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { BASE_PATH } from '@/lib/constants' +import { Metric, TIME_PERIODS_REPORTS } from '@/lib/constants/metrics' +import { uuidv4 } from '@/lib/helpers' +import { useProfile } from '@/lib/profile' +import { useDatabaseSelectorStateSnapshot } from '@/state/database-selector' +import type { Dashboards } from '@/types' const DEFAULT_CHART_COLUMN_COUNT = 1 const DEFAULT_CHART_ROW_COUNT = 1 diff --git a/apps/studio/components/interfaces/Reports/Reports.types.ts b/apps/studio/components/interfaces/Reports/Reports.types.ts index da46ba98bd..19424c1e07 100644 --- a/apps/studio/components/interfaces/Reports/Reports.types.ts +++ b/apps/studio/components/interfaces/Reports/Reports.types.ts @@ -1,4 +1,4 @@ -import type { ResponseError } from 'types' +import type { ResponseError } from '@/types' export enum Presets { API = 'api', diff --git a/apps/studio/components/interfaces/Reports/Reports.utils.test.ts b/apps/studio/components/interfaces/Reports/Reports.utils.test.ts index 8884c0e8a7..20fe9aba5b 100644 --- a/apps/studio/components/interfaces/Reports/Reports.utils.test.ts +++ b/apps/studio/components/interfaces/Reports/Reports.utils.test.ts @@ -1,7 +1,8 @@ -import { describe, it, expect } from 'vitest' -import { formatTimestamp } from './Reports.utils' import dayjs from 'dayjs' import utc from 'dayjs/plugin/utc' +import { describe, expect, it } from 'vitest' + +import { formatTimestamp } from './Reports.utils' dayjs.extend(utc) diff --git a/apps/studio/components/interfaces/Reports/Reports.utils.tsx b/apps/studio/components/interfaces/Reports/Reports.utils.tsx index 7e737385c3..735786c980 100644 --- a/apps/studio/components/interfaces/Reports/Reports.utils.tsx +++ b/apps/studio/components/interfaces/Reports/Reports.utils.tsx @@ -1,14 +1,14 @@ +import dayjs from 'dayjs' + +import { type BaseQueries, type PresetConfig, type ReportQuery } from './Reports.types' import { isUnixMicro, unixMicroToIsoTimestamp, -} from 'components/interfaces/Settings/Logs/Logs.utils' -import { REPORT_STATUS_CODE_COLORS } from 'data/reports/report.utils' -import dayjs from 'dayjs' -import useDbQuery, { DbQueryHook } from 'hooks/analytics/useDbQuery' -import useLogsQuery, { LogsQueryHook } from 'hooks/analytics/useLogsQuery' -import { getHttpStatusCodeInfo } from 'lib/http-status-codes' - -import { type BaseQueries, type PresetConfig, type ReportQuery } from './Reports.types' +} from '@/components/interfaces/Settings/Logs/Logs.utils' +import { REPORT_STATUS_CODE_COLORS } from '@/data/reports/report.utils' +import useDbQuery, { DbQueryHook } from '@/hooks/analytics/useDbQuery' +import useLogsQuery, { LogsQueryHook } from '@/hooks/analytics/useLogsQuery' +import { getHttpStatusCodeInfo } from '@/lib/http-status-codes' /** * Converts a query params string to an object diff --git a/apps/studio/components/interfaces/Reports/SharedAPIReport/SharedAPIReport.constants.ts b/apps/studio/components/interfaces/Reports/SharedAPIReport/SharedAPIReport.constants.ts index 2684c59b56..999dbcedf6 100644 --- a/apps/studio/components/interfaces/Reports/SharedAPIReport/SharedAPIReport.constants.ts +++ b/apps/studio/components/interfaces/Reports/SharedAPIReport/SharedAPIReport.constants.ts @@ -1,12 +1,12 @@ import * as Sentry from '@sentry/nextjs' import { useQueries, useQueryClient } from '@tanstack/react-query' +import { useParams } from 'common' import { isEqual } from 'lodash' import { useState } from 'react' -import { useParams } from 'common' -import { get } from 'data/fetchers' import { generateRegexpWhere } from '../Reports.constants' import { ReportFilterItem } from '../Reports.types' +import { get } from '@/data/fetchers' export const SHARED_API_REPORT_SQL = { totalRequests: { diff --git a/apps/studio/components/interfaces/Reports/SharedAPIReport/SharedAPIReport.tsx b/apps/studio/components/interfaces/Reports/SharedAPIReport/SharedAPIReport.tsx index 3adccf6648..4227d4cebc 100644 --- a/apps/studio/components/interfaces/Reports/SharedAPIReport/SharedAPIReport.tsx +++ b/apps/studio/components/interfaces/Reports/SharedAPIReport/SharedAPIReport.tsx @@ -1,4 +1,3 @@ -import ReportWidget from '../ReportWidget' import { ErrorCountsChartRenderer, NetworkTrafficRenderer, @@ -6,6 +5,7 @@ import { TopApiRoutesRenderer, TotalRequestsChartRenderer, } from '../renderers/ApiRenderers' +import ReportWidget from '../ReportWidget' import { SharedAPIReportKey } from './SharedAPIReport.constants' type SharedAPIReportWidgetsProps = { diff --git a/apps/studio/components/interfaces/Reports/UpdateModal.tsx b/apps/studio/components/interfaces/Reports/UpdateModal.tsx index c34adc456d..fdf8e6e2ef 100644 --- a/apps/studio/components/interfaces/Reports/UpdateModal.tsx +++ b/apps/studio/components/interfaces/Reports/UpdateModal.tsx @@ -1,7 +1,5 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useParams } from 'common' -import { Content } from 'data/content/content-query' -import { useContentUpsertMutation } from 'data/content/content-upsert-mutation' import { useEffect } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' @@ -17,6 +15,9 @@ import { import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import * as z from 'zod' +import { Content } from '@/data/content/content-query' +import { useContentUpsertMutation } from '@/data/content/content-upsert-mutation' + const formSchema = z.object({ name: z.string().min(1, 'Required'), description: z.string().optional(), diff --git a/apps/studio/components/interfaces/Reports/renderers/ApiRenderers.tsx b/apps/studio/components/interfaces/Reports/renderers/ApiRenderers.tsx index 0c5a123e37..2c3d66d1ec 100644 --- a/apps/studio/components/interfaces/Reports/renderers/ApiRenderers.tsx +++ b/apps/studio/components/interfaces/Reports/renderers/ApiRenderers.tsx @@ -1,32 +1,10 @@ import { useParams } from 'common' -import { COUNTRY_LAT_LON } from 'components/interfaces/ProjectCreation/ProjectCreation.constants' -import { - buildCountsByIso2, - computeMarkerRadius, - extractIso2FromFeatureProps, - getFillColor, - getFillOpacity, - isKnownCountryCode, - isMicroCountry, - iso2ToCountryName, - MAP_CHART_THEME, -} from 'components/interfaces/Reports/utils/geo' -import { - jsonSyntaxHighlight, - TextFormatter, -} from 'components/interfaces/Settings/Logs/LogsFormatters' -import Table from 'components/to-be-cleaned/Table' -import AlertError from 'components/ui/AlertError' -import BarChart from 'components/ui/Charts/BarChart' import { geoCentroid } from 'd3-geo' -import { useFillTimeseriesSorted } from 'hooks/analytics/useFillTimeseriesSorted' -import { BASE_PATH } from 'lib/constants' import sumBy from 'lodash/sumBy' import { ChevronRight } from 'lucide-react' import { useTheme } from 'next-themes' import { Fragment, useRef, useState } from 'react' import { ComposableMap, Geographies, Geography, Marker, ZoomableGroup } from 'react-simple-maps' -import type { ResponseError } from 'types' import { Alert_Shadcn_, AlertDescription_Shadcn_, @@ -42,6 +20,28 @@ import * as z from 'zod' import { queryParamsToObject } from '../Reports.utils' import { ReportWidgetProps, ReportWidgetRendererProps } from '../ReportWidget' +import { COUNTRY_LAT_LON } from '@/components/interfaces/ProjectCreation/ProjectCreation.constants' +import { + buildCountsByIso2, + computeMarkerRadius, + extractIso2FromFeatureProps, + getFillColor, + getFillOpacity, + isKnownCountryCode, + isMicroCountry, + iso2ToCountryName, + MAP_CHART_THEME, +} from '@/components/interfaces/Reports/utils/geo' +import { + jsonSyntaxHighlight, + TextFormatter, +} from '@/components/interfaces/Settings/Logs/LogsFormatters' +import Table from '@/components/to-be-cleaned/Table' +import AlertError from '@/components/ui/AlertError' +import BarChart from '@/components/ui/Charts/BarChart' +import { useFillTimeseriesSorted } from '@/hooks/analytics/useFillTimeseriesSorted' +import { BASE_PATH } from '@/lib/constants' +import type { ResponseError } from '@/types' export const NetworkTrafficRenderer = ( props: ReportWidgetProps<{ diff --git a/apps/studio/components/interfaces/Reports/renderers/StorageRenderers.tsx b/apps/studio/components/interfaces/Reports/renderers/StorageRenderers.tsx index f7c39d5afb..0de73078d0 100644 --- a/apps/studio/components/interfaces/Reports/renderers/StorageRenderers.tsx +++ b/apps/studio/components/interfaces/Reports/renderers/StorageRenderers.tsx @@ -1,8 +1,9 @@ -import { TextFormatter } from 'components/interfaces/Settings/Logs/LogsFormatters' -import Table from 'components/to-be-cleaned/Table' -import StackedBarChart from 'components/ui/Charts/StackedBarChart' import { Fragment } from 'react' + import { ReportWidgetProps, ReportWidgetRendererProps } from '../ReportWidget' +import { TextFormatter } from '@/components/interfaces/Settings/Logs/LogsFormatters' +import Table from '@/components/to-be-cleaned/Table' +import StackedBarChart from '@/components/ui/Charts/StackedBarChart' export const CacheHitRateChartRenderer = ( props: ReportWidgetProps<{ diff --git a/apps/studio/components/interfaces/Reports/useReportFilters.ts b/apps/studio/components/interfaces/Reports/useReportFilters.ts index 2d207dcc4c..a913df5745 100644 --- a/apps/studio/components/interfaces/Reports/useReportFilters.ts +++ b/apps/studio/components/interfaces/Reports/useReportFilters.ts @@ -1,5 +1,6 @@ -import { useCallback, useEffect, useState, useMemo, useRef } from 'react' import { parseAsString, useQueryStates } from 'nuqs' +import { useCallback, useEffect, useMemo, useRef, useState } from 'react' + import type { ReportFilter, ReportFilterItem, ReportFilterProperty } from './Reports.types' export enum ReportFilterKeys { diff --git a/apps/studio/components/interfaces/Reports/utils/geo.ts b/apps/studio/components/interfaces/Reports/utils/geo.ts index 253f4416a5..bb20edebdf 100644 --- a/apps/studio/components/interfaces/Reports/utils/geo.ts +++ b/apps/studio/components/interfaces/Reports/utils/geo.ts @@ -1,5 +1,5 @@ -import { COUNTRIES } from 'components/interfaces/Organization/BillingSettings/BillingCustomerData/BillingAddress.constants' -import { COUNTRY_LAT_LON } from 'components/interfaces/ProjectCreation/ProjectCreation.constants' +import { COUNTRIES } from '@/components/interfaces/Organization/BillingSettings/BillingCustomerData/BillingAddress.constants' +import { COUNTRY_LAT_LON } from '@/components/interfaces/ProjectCreation/ProjectCreation.constants' export type CountryCountRow = { country: string | null; count: number | string } diff --git a/apps/studio/components/interfaces/Reports/v2/ReportChartUpsell.tsx b/apps/studio/components/interfaces/Reports/v2/ReportChartUpsell.tsx index cf826f0a3c..026b4f9046 100644 --- a/apps/studio/components/interfaces/Reports/v2/ReportChartUpsell.tsx +++ b/apps/studio/components/interfaces/Reports/v2/ReportChartUpsell.tsx @@ -1,9 +1,9 @@ import Link from 'next/link' import { useRef, useState } from 'react' - -import { LazyComposedChartHandler } from 'components/ui/Charts/ComposedChartHandler' import { Button, Card, cn } from 'ui' +import { LazyComposedChartHandler } from '@/components/ui/Charts/ComposedChartHandler' + interface ReportsChartUpsellProps { report: { label: string diff --git a/apps/studio/components/interfaces/Reports/v2/ReportChartV2.test.tsx b/apps/studio/components/interfaces/Reports/v2/ReportChartV2.test.tsx index 85b134bb5e..1827b58523 100644 --- a/apps/studio/components/interfaces/Reports/v2/ReportChartV2.test.tsx +++ b/apps/studio/components/interfaces/Reports/v2/ReportChartV2.test.tsx @@ -1,4 +1,5 @@ -import { describe, it, expect } from 'vitest' +import { describe, expect, it } from 'vitest' + import { computePeriodTotal } from './ReportChartV2' describe('computePeriodTotal', () => { diff --git a/apps/studio/components/interfaces/Reports/v2/ReportChartV2.tsx b/apps/studio/components/interfaces/Reports/v2/ReportChartV2.tsx index 36f7324977..6a70dc4f1e 100644 --- a/apps/studio/components/interfaces/Reports/v2/ReportChartV2.tsx +++ b/apps/studio/components/interfaces/Reports/v2/ReportChartV2.tsx @@ -1,18 +1,18 @@ import { useQuery } from '@tanstack/react-query' -import type { ChartHighlightAction } from 'components/ui/Charts/ChartHighlightActions' -import { ComposedChart } from 'components/ui/Charts/ComposedChart' -import type { MultiAttribute } from 'components/ui/Charts/ComposedChart.utils' -import { useChartHighlight } from 'components/ui/Charts/useChartHighlight' -import type { AnalyticsInterval } from 'data/analytics/constants' -import type { ReportConfig } from 'data/reports/v2/reports.types' -import { useFillTimeseriesSorted } from 'hooks/analytics/useFillTimeseriesSorted' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { Loader2 } from 'lucide-react' import { useState } from 'react' import { Card, CardContent, cn } from 'ui' import { ReportChartUpsell } from './ReportChartUpsell' +import type { ChartHighlightAction } from '@/components/ui/Charts/ChartHighlightActions' +import { ComposedChart } from '@/components/ui/Charts/ComposedChart' +import type { MultiAttribute } from '@/components/ui/Charts/ComposedChart.utils' +import { useChartHighlight } from '@/components/ui/Charts/useChartHighlight' +import type { AnalyticsInterval } from '@/data/analytics/constants' +import type { ReportConfig } from '@/data/reports/v2/reports.types' +import { useFillTimeseriesSorted } from '@/hooks/analytics/useFillTimeseriesSorted' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' export interface ReportChartV2Props { report: ReportConfig diff --git a/apps/studio/components/interfaces/Reports/v2/ReportSectionHeader.tsx b/apps/studio/components/interfaces/Reports/v2/ReportSectionHeader.tsx index c00b9d3046..9c298e292d 100644 --- a/apps/studio/components/interfaces/Reports/v2/ReportSectionHeader.tsx +++ b/apps/studio/components/interfaces/Reports/v2/ReportSectionHeader.tsx @@ -1,9 +1,9 @@ -import { Link, Check } from 'lucide-react' +import { Check, Link } from 'lucide-react' import { useState } from 'react' - -import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { copyToClipboard } from 'ui' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' + interface ReportSectionHeaderProps { id: string title: string diff --git a/apps/studio/components/interfaces/Reports/v2/ReportsNumericFilter.tsx b/apps/studio/components/interfaces/Reports/v2/ReportsNumericFilter.tsx index 49ade2e053..985a5d1d07 100644 --- a/apps/studio/components/interfaces/Reports/v2/ReportsNumericFilter.tsx +++ b/apps/studio/components/interfaces/Reports/v2/ReportsNumericFilter.tsx @@ -1,6 +1,3 @@ -import { ChevronDown } from 'lucide-react' -import { useEffect, useState } from 'react' - import { Label } from '@ui/components/shadcn/ui/label' import { Popover, PopoverContent, PopoverTrigger } from '@ui/components/shadcn/ui/popover' import { @@ -10,6 +7,8 @@ import { SelectTrigger, SelectValue, } from '@ui/components/shadcn/ui/select' +import { ChevronDown } from 'lucide-react' +import { useEffect, useState } from 'react' import { Button, cn } from 'ui' import { Input } from 'ui-patterns/DataInputs/Input' import { z } from 'zod' diff --git a/apps/studio/components/interfaces/Reports/v2/ReportsSelectFilter.tsx b/apps/studio/components/interfaces/Reports/v2/ReportsSelectFilter.tsx index 579bd77098..06aa035b86 100644 --- a/apps/studio/components/interfaces/Reports/v2/ReportsSelectFilter.tsx +++ b/apps/studio/components/interfaces/Reports/v2/ReportsSelectFilter.tsx @@ -1,10 +1,9 @@ -import { ChevronDown } from 'lucide-react' -import { useEffect, useState } from 'react' - import { Checkbox } from '@ui/components/shadcn/ui/checkbox' import { CommandGroup } from '@ui/components/shadcn/ui/command' import { Label } from '@ui/components/shadcn/ui/label' import { Popover, PopoverContent, PopoverTrigger } from '@ui/components/shadcn/ui/popover' +import { ChevronDown } from 'lucide-react' +import { useEffect, useState } from 'react' import { Button, cn, diff --git a/apps/studio/components/interfaces/RoleImpersonationSelector/RoleImpersonationPopover.tsx b/apps/studio/components/interfaces/RoleImpersonationSelector/RoleImpersonationPopover.tsx index 6112c01197..27e266b58f 100644 --- a/apps/studio/components/interfaces/RoleImpersonationSelector/RoleImpersonationPopover.tsx +++ b/apps/studio/components/interfaces/RoleImpersonationSelector/RoleImpersonationPopover.tsx @@ -1,11 +1,11 @@ -import { useState } from 'react' -import { Button, PopoverContent_Shadcn_, PopoverTrigger_Shadcn_, Popover_Shadcn_, cn } from 'ui' - -import type { User } from 'data/auth/users-infinite-query' -import { ChevronDown, User as IconUser } from 'lucide-react' -import { useRoleImpersonationStateSnapshot } from 'state/role-impersonation-state' import { RoleImpersonationSelector } from '.' +import { ChevronDown, User as IconUser } from 'lucide-react' +import { useState } from 'react' +import { Button, cn, Popover_Shadcn_, PopoverContent_Shadcn_, PopoverTrigger_Shadcn_ } from 'ui' + import { getAvatarUrl, getDisplayName } from '../Auth/Users/Users.utils' +import type { User } from '@/data/auth/users-infinite-query' +import { useRoleImpersonationStateSnapshot } from '@/state/role-impersonation-state' export interface RoleImpersonationPopoverProps { serviceRoleLabel?: string diff --git a/apps/studio/components/interfaces/RoleImpersonationSelector/UserImpersonationSelector.tsx b/apps/studio/components/interfaces/RoleImpersonationSelector/UserImpersonationSelector.tsx index a0f859553e..316eda7f88 100644 --- a/apps/studio/components/interfaces/RoleImpersonationSelector/UserImpersonationSelector.tsx +++ b/apps/studio/components/interfaces/RoleImpersonationSelector/UserImpersonationSelector.tsx @@ -1,19 +1,9 @@ +import { keepPreviousData } from '@tanstack/react-query' import { useDebounce } from '@uidotdev/usehooks' +import { LOCAL_STORAGE_KEYS, useParams } from 'common' import { ChevronDown, User as IconUser, Loader2, Search, X } from 'lucide-react' import { useMemo, useState } from 'react' import { toast } from 'sonner' - -import { keepPreviousData } from '@tanstack/react-query' -import { LOCAL_STORAGE_KEYS, useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { InlineLink } from 'components/ui/InlineLink' -import { User, useUsersInfiniteQuery } from 'data/auth/users-infinite-query' -import { useCustomAccessTokenHookDetails } from 'hooks/misc/useCustomAccessTokenHookDetails' -import { useLocalStorage } from 'hooks/misc/useLocalStorage' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' -import { useRoleImpersonationStateSnapshot } from 'state/role-impersonation-state' -import type { ResponseError } from 'types' import { Button, cn, @@ -30,7 +20,17 @@ import { TabsTrigger_Shadcn_, } from 'ui' import { InfoTooltip } from 'ui-patterns/info-tooltip' + import { getAvatarUrl, getDisplayName } from '../Auth/Users/Users.utils' +import AlertError from '@/components/ui/AlertError' +import { InlineLink } from '@/components/ui/InlineLink' +import { User, useUsersInfiniteQuery } from '@/data/auth/users-infinite-query' +import { useCustomAccessTokenHookDetails } from '@/hooks/misc/useCustomAccessTokenHookDetails' +import { useLocalStorage } from '@/hooks/misc/useLocalStorage' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' +import { useRoleImpersonationStateSnapshot } from '@/state/role-impersonation-state' +import type { ResponseError } from '@/types' type AuthenticatorAssuranceLevels = 'aal1' | 'aal2' diff --git a/apps/studio/components/interfaces/RoleImpersonationSelector/index.tsx b/apps/studio/components/interfaces/RoleImpersonationSelector/index.tsx index ec63ddb3a6..e818dd6f18 100644 --- a/apps/studio/components/interfaces/RoleImpersonationSelector/index.tsx +++ b/apps/studio/components/interfaces/RoleImpersonationSelector/index.tsx @@ -1,11 +1,11 @@ import { useState } from 'react' +import { cn, DropdownMenuSeparator } from 'ui' -import { PostgrestRole } from 'lib/role-impersonation' -import { useRoleImpersonationStateSnapshot } from 'state/role-impersonation-state' -import { DropdownMenuSeparator, cn } from 'ui' import { AnonIcon, AuthenticatedIcon, ServiceRoleIcon } from './Icons' import RoleImpersonationRadio from './RoleImpersonationRadio' import UserImpersonationSelector from './UserImpersonationSelector' +import { PostgrestRole } from '@/lib/role-impersonation' +import { useRoleImpersonationStateSnapshot } from '@/state/role-impersonation-state' export interface RoleImpersonationSelectorProps { serviceRoleLabel?: string diff --git a/apps/studio/components/interfaces/SQLEditor/AskAIWidget.tsx b/apps/studio/components/interfaces/SQLEditor/AskAIWidget.tsx index d44429b232..cafc5539e9 100644 --- a/apps/studio/components/interfaces/SQLEditor/AskAIWidget.tsx +++ b/apps/studio/components/interfaces/SQLEditor/AskAIWidget.tsx @@ -1,5 +1,4 @@ import { ChangeEvent, KeyboardEvent, useCallback, useEffect, useRef } from 'react' - import { Button, ExpandingTextArea } from 'ui' interface AskAIWidgetProps { diff --git a/apps/studio/components/interfaces/SQLEditor/DownloadSnippetModal.tsx b/apps/studio/components/interfaces/SQLEditor/DownloadSnippetModal.tsx index 40bffbafe0..2b734ea95f 100644 --- a/apps/studio/components/interfaces/SQLEditor/DownloadSnippetModal.tsx +++ b/apps/studio/components/interfaces/SQLEditor/DownloadSnippetModal.tsx @@ -1,11 +1,8 @@ import type { ModalProps } from '@ui/components/Modal/Modal' -import TwoOptionToggle from 'components/ui/TwoOptionToggle' -import { DOCS_URL } from 'lib/constants' import { snakeCase } from 'lodash' import { ExternalLink } from 'lucide-react' import Link from 'next/link' import { useState } from 'react' -import { useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' import { Button, Modal, Tabs } from 'ui' import { CodeBlock } from 'ui-patterns/CodeBlock' @@ -15,6 +12,9 @@ import { generateMigrationCliCommand, generateSeedCliCommand, } from './SQLEditor.utils' +import TwoOptionToggle from '@/components/ui/TwoOptionToggle' +import { DOCS_URL } from '@/lib/constants' +import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' export interface DownloadSnippetModalProps extends ModalProps { id: string diff --git a/apps/studio/components/interfaces/SQLEditor/MonacoEditor.tsx b/apps/studio/components/interfaces/SQLEditor/MonacoEditor.tsx index 3a18053eee..78b6e4a813 100644 --- a/apps/studio/components/interfaces/SQLEditor/MonacoEditor.tsx +++ b/apps/studio/components/interfaces/SQLEditor/MonacoEditor.tsx @@ -1,21 +1,21 @@ import Editor, { Monaco, OnMount } from '@monaco-editor/react' -import { useRouter } from 'next/router' -import { MutableRefObject, useEffect, useRef, useState } from 'react' - import { useDebounce } from '@uidotdev/usehooks' import { LOCAL_STORAGE_KEYS, useParams } from 'common' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useProfile } from 'lib/profile' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' -import { useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' -import { useTabsStateSnapshot } from 'state/tabs' +import { useRouter } from 'next/router' +import { MutableRefObject, useEffect, useRef, useState } from 'react' import { cn } from 'ui' import { Admonition } from 'ui-patterns' + import type { IStandaloneCodeEditor } from './SQLEditor.types' import { createSqlSnippetSkeletonV2 } from './SQLEditor.utils' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useProfile } from '@/lib/profile' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' +import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' +import { useTabsStateSnapshot } from '@/state/tabs' export type MonacoEditorProps = { id: string diff --git a/apps/studio/components/interfaces/SQLEditor/MoveQueryModal.tsx b/apps/studio/components/interfaces/SQLEditor/MoveQueryModal.tsx index 4d17450e9f..285bac14cf 100644 --- a/apps/studio/components/interfaces/SQLEditor/MoveQueryModal.tsx +++ b/apps/studio/components/interfaces/SQLEditor/MoveQueryModal.tsx @@ -1,31 +1,19 @@ import { zodResolver } from '@hookform/resolvers/zod' +import { IS_PLATFORM, useParams } from 'common' import { Check, Code, Plus } from 'lucide-react' import { useRouter } from 'next/router' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' - -import { IS_PLATFORM, useParams } from 'common' -import { getContentById } from 'data/content/content-id-query' -import { useContentUpsertMutation } from 'data/content/content-upsert-mutation' -import { useSQLSnippetFolderCreateMutation } from 'data/content/sql-folder-create-mutation' -import { Snippet } from 'data/content/sql-folders-query' -import { - SnippetWithContent, - useSnippetFolders, - useSqlEditorV2StateSnapshot, -} from 'state/sql-editor-v2' -import { createTabId, useTabsStateSnapshot } from 'state/tabs' import { Button, + Command_Shadcn_, CommandEmpty_Shadcn_, CommandGroup_Shadcn_, CommandInput_Shadcn_, CommandItem_Shadcn_, CommandList_Shadcn_, CommandSeparator_Shadcn_, - Command_Shadcn_, Dialog, DialogContent, DialogDescription, @@ -34,19 +22,31 @@ import { DialogSection, DialogSectionSeparator, DialogTitle, + Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, FormItem_Shadcn_, FormLabel_Shadcn_, FormMessage_Shadcn_, - Form_Shadcn_, Input_Shadcn_, Label_Shadcn_, + Popover_Shadcn_, PopoverContent_Shadcn_, PopoverTrigger_Shadcn_, - Popover_Shadcn_, ScrollArea, } from 'ui' +import * as z from 'zod' + +import { getContentById } from '@/data/content/content-id-query' +import { useContentUpsertMutation } from '@/data/content/content-upsert-mutation' +import { useSQLSnippetFolderCreateMutation } from '@/data/content/sql-folder-create-mutation' +import { Snippet } from '@/data/content/sql-folders-query' +import { + SnippetWithContent, + useSnippetFolders, + useSqlEditorV2StateSnapshot, +} from '@/state/sql-editor-v2' +import { createTabId, useTabsStateSnapshot } from '@/state/tabs' interface MoveQueryModalProps { visible: boolean diff --git a/apps/studio/components/interfaces/SQLEditor/OngoingQueriesPanel.tsx b/apps/studio/components/interfaces/SQLEditor/OngoingQueriesPanel.tsx index cc499899d7..6b72d051ed 100644 --- a/apps/studio/components/interfaces/SQLEditor/OngoingQueriesPanel.tsx +++ b/apps/studio/components/interfaces/SQLEditor/OngoingQueriesPanel.tsx @@ -1,18 +1,8 @@ import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { useReadReplicasQuery } from 'data/read-replicas/replicas-query' -import { useQueryAbortMutation } from 'data/sql/abort-query-mutation' -import { useOngoingQueriesQuery } from 'data/sql/ongoing-queries-query' import dayjs from 'dayjs' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useUrlState } from 'hooks/ui/useUrlState' -import { IS_PLATFORM } from 'lib/constants' import { RefreshCw, StopCircle } from 'lucide-react' import { useEffect, useState } from 'react' import { toast } from 'sonner' -import { useAppStateSnapshot } from 'state/app-state' -import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' -import type { ResponseError } from 'types' import { Button, cn, @@ -29,6 +19,17 @@ import { import { CodeBlock } from 'ui-patterns/CodeBlock' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' +import AlertError from '@/components/ui/AlertError' +import { useReadReplicasQuery } from '@/data/read-replicas/replicas-query' +import { useQueryAbortMutation } from '@/data/sql/abort-query-mutation' +import { useOngoingQueriesQuery } from '@/data/sql/ongoing-queries-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useUrlState } from '@/hooks/ui/useUrlState' +import { IS_PLATFORM } from '@/lib/constants' +import { useAppStateSnapshot } from '@/state/app-state' +import { useDatabaseSelectorStateSnapshot } from '@/state/database-selector' +import type { ResponseError } from '@/types' + export const OngoingQueriesPanel = () => { const [_, setParams] = useUrlState({ replace: true }) const { viewOngoingQueries } = useParams() diff --git a/apps/studio/components/interfaces/SQLEditor/RenameQueryModal.tsx b/apps/studio/components/interfaces/SQLEditor/RenameQueryModal.tsx index b8613ddf11..a2c181ebe2 100644 --- a/apps/studio/components/interfaces/SQLEditor/RenameQueryModal.tsx +++ b/apps/studio/components/interfaces/SQLEditor/RenameQueryModal.tsx @@ -1,25 +1,9 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useCheckOpenAIKeyQuery } from 'data/ai/check-api-key-query' -import { useSqlTitleGenerateMutation } from 'data/ai/sql-title-mutation' -import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' -import { getContentById } from 'data/content/content-id-query' -import { - UpsertContentPayload, - useContentUpsertMutation, -} from 'data/content/content-upsert-mutation' -import { Snippet } from 'data/content/sql-folders-query' -import type { SqlSnippet } from 'data/content/sql-snippets-query' -import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { IS_PLATFORM } from 'lib/constants' import { useRouter } from 'next/router' import { useEffect } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import { useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' -import { createTabId, useTabsStateSnapshot } from 'state/tabs' import { AiIconAnimation, Button, @@ -34,6 +18,22 @@ import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import * as z from 'zod' import { subscriptionHasHipaaAddon } from '../Billing/Subscription/Subscription.utils' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useCheckOpenAIKeyQuery } from '@/data/ai/check-api-key-query' +import { useSqlTitleGenerateMutation } from '@/data/ai/sql-title-mutation' +import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' +import { getContentById } from '@/data/content/content-id-query' +import { + UpsertContentPayload, + useContentUpsertMutation, +} from '@/data/content/content-upsert-mutation' +import { Snippet } from '@/data/content/sql-folders-query' +import type { SqlSnippet } from '@/data/content/sql-snippets-query' +import { useOrgSubscriptionQuery } from '@/data/subscriptions/org-subscription-query' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { IS_PLATFORM } from '@/lib/constants' +import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' +import { createTabId, useTabsStateSnapshot } from '@/state/tabs' export interface RenameQueryModalProps { snippet?: SqlSnippet | Snippet diff --git a/apps/studio/components/interfaces/SQLEditor/SQLEditor.constants.ts b/apps/studio/components/interfaces/SQLEditor/SQLEditor.constants.ts index 6a3b8e597d..3a89760fe1 100644 --- a/apps/studio/components/interfaces/SQLEditor/SQLEditor.constants.ts +++ b/apps/studio/components/interfaces/SQLEditor/SQLEditor.constants.ts @@ -1,5 +1,6 @@ import { IS_PLATFORM } from 'common' -import type { SqlSnippets, UserContent } from 'types' + +import type { SqlSnippets, UserContent } from '@/types' const SQL_SNIPPET_SCHEMA_VERSION = '1.0' diff --git a/apps/studio/components/interfaces/SQLEditor/SQLEditor.queries.ts b/apps/studio/components/interfaces/SQLEditor/SQLEditor.queries.ts index 7c7c189579..392b5b9409 100644 --- a/apps/studio/components/interfaces/SQLEditor/SQLEditor.queries.ts +++ b/apps/studio/components/interfaces/SQLEditor/SQLEditor.queries.ts @@ -1,5 +1,5 @@ -import { DOCS_URL } from 'lib/constants' import type { SQLTemplate } from './SQLEditor.types' +import { DOCS_URL } from '@/lib/constants' export const SQL_TEMPLATES: SQLTemplate[] = [ { diff --git a/apps/studio/components/interfaces/SQLEditor/SQLEditor.tsx b/apps/studio/components/interfaces/SQLEditor/SQLEditor.tsx index 651365de99..6e9b347794 100644 --- a/apps/studio/components/interfaces/SQLEditor/SQLEditor.tsx +++ b/apps/studio/components/interfaces/SQLEditor/SQLEditor.tsx @@ -2,44 +2,11 @@ import type { Monaco } from '@monaco-editor/react' import { wrapWithRollback } from '@supabase/pg-meta/src/query' import { useQueryClient } from '@tanstack/react-query' import { IS_PLATFORM, LOCAL_STORAGE_KEYS, useFlag, useParams } from 'common' -import { - isExplainQuery, - isExplainSql, - splitSqlStatements, -} from 'components/interfaces/ExplainVisualizer/ExplainVisualizer.utils' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import ResizableAIWidget from 'components/ui/AIEditor/ResizableAIWidget' -import { GridFooter } from 'components/ui/GridFooter' -import { useSqlTitleGenerateMutation } from 'data/ai/sql-title-mutation' -import { constructHeaders, isValidConnString } from 'data/fetchers' -import { lintKeys } from 'data/lint/keys' -import { useReadReplicasQuery } from 'data/read-replicas/replicas-query' -import { useExecuteSqlMutation } from 'data/sql/execute-sql-mutation' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { isError } from 'data/utils/error-check' -import { useOrgAiOptInLevel } from 'hooks/misc/useOrgOptedIntoAi' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { generateUuid } from 'lib/api/snippets.browser' -import { BASE_PATH } from 'lib/constants' -import { formatSql } from 'lib/formatSql' -import { detectOS } from 'lib/helpers' -import { useProfile } from 'lib/profile' -import { wrapWithRoleImpersonation } from 'lib/role-impersonation' import { ChevronUp, Loader2 } from 'lucide-react' import dynamic from 'next/dynamic' import { useRouter } from 'next/router' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { toast } from 'sonner' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' -import { - isRoleImpersonationEnabled, - useGetImpersonatedRoleState, -} from 'state/role-impersonation-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' -import { getSqlEditorV2StateSnapshot, useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' -import { createTabId, useTabsStateSnapshot } from 'state/tabs' import { Button, cn, @@ -80,6 +47,39 @@ import { } from './SQLEditor.utils' import { useAddDefinitions } from './useAddDefinitions' import UtilityPanel from './UtilityPanel/UtilityPanel' +import { + isExplainQuery, + isExplainSql, + splitSqlStatements, +} from '@/components/interfaces/ExplainVisualizer/ExplainVisualizer.utils' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import ResizableAIWidget from '@/components/ui/AIEditor/ResizableAIWidget' +import { GridFooter } from '@/components/ui/GridFooter' +import { useSqlTitleGenerateMutation } from '@/data/ai/sql-title-mutation' +import { constructHeaders, isValidConnString } from '@/data/fetchers' +import { lintKeys } from '@/data/lint/keys' +import { useReadReplicasQuery } from '@/data/read-replicas/replicas-query' +import { useExecuteSqlMutation } from '@/data/sql/execute-sql-mutation' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { isError } from '@/data/utils/error-check' +import { useOrgAiOptInLevel } from '@/hooks/misc/useOrgOptedIntoAi' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { generateUuid } from '@/lib/api/snippets.browser' +import { BASE_PATH } from '@/lib/constants' +import { formatSql } from '@/lib/formatSql' +import { detectOS } from '@/lib/helpers' +import { useProfile } from '@/lib/profile' +import { wrapWithRoleImpersonation } from '@/lib/role-impersonation' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useDatabaseSelectorStateSnapshot } from '@/state/database-selector' +import { + isRoleImpersonationEnabled, + useGetImpersonatedRoleState, +} from '@/state/role-impersonation-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' +import { getSqlEditorV2StateSnapshot, useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' +import { createTabId, useTabsStateSnapshot } from '@/state/tabs' // Load the monaco editor client-side only (does not behave well server-side) const MonacoEditor = dynamic(() => import('./MonacoEditor'), { ssr: false }) diff --git a/apps/studio/components/interfaces/SQLEditor/SQLEditor.utils.test.ts b/apps/studio/components/interfaces/SQLEditor/SQLEditor.utils.test.ts index b14c2d46e5..e6a9a10957 100644 --- a/apps/studio/components/interfaces/SQLEditor/SQLEditor.utils.test.ts +++ b/apps/studio/components/interfaces/SQLEditor/SQLEditor.utils.test.ts @@ -1,4 +1,6 @@ import { stripIndent } from 'common-tags' +import { describe, expect, it, test } from 'vitest' + import { checkAlterDatabaseConnection, checkDestructiveQuery, @@ -6,7 +8,6 @@ import { isUpdateWithoutWhere, suffixWithLimit, } from './SQLEditor.utils' -import { describe, test, expect, it } from 'vitest' describe('SQLEditor.utils.ts:checkIfAppendLimitRequired', () => { test('Should return false if limit passed is <= 0', () => { diff --git a/apps/studio/components/interfaces/SQLEditor/SQLEditor.utils.ts b/apps/studio/components/interfaces/SQLEditor/SQLEditor.utils.ts index 23ded23477..b638d619a1 100644 --- a/apps/studio/components/interfaces/SQLEditor/SQLEditor.utils.ts +++ b/apps/studio/components/interfaces/SQLEditor/SQLEditor.utils.ts @@ -1,7 +1,3 @@ -import { generateUuid } from 'lib/api/snippets.browser' -import { removeCommentsFromSql } from 'lib/helpers' -import type { SnippetWithContent } from 'state/sql-editor-v2' - import { alterDatabasePreventConnectionStatements, destructiveSqlRegex, @@ -10,6 +6,9 @@ import { updateWithoutWhereRegex, } from './SQLEditor.constants' import { ContentDiff } from './SQLEditor.types' +import { generateUuid } from '@/lib/api/snippets.browser' +import { removeCommentsFromSql } from '@/lib/helpers' +import type { SnippetWithContent } from '@/state/sql-editor-v2' export const createSqlSnippetSkeletonV2 = ({ name, diff --git a/apps/studio/components/interfaces/SQLEditor/SQLTemplates/SQLQuickstarts.tsx b/apps/studio/components/interfaces/SQLEditor/SQLTemplates/SQLQuickstarts.tsx index 4dd977b484..18d287be31 100644 --- a/apps/studio/components/interfaces/SQLEditor/SQLTemplates/SQLQuickstarts.tsx +++ b/apps/studio/components/interfaces/SQLEditor/SQLTemplates/SQLQuickstarts.tsx @@ -1,19 +1,19 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { partition } from 'lodash' import { useRouter } from 'next/router' import { toast } from 'sonner' - -import { useParams } from 'common' -import { SQL_TEMPLATES } from 'components/interfaces/SQLEditor/SQLEditor.queries' -import { ActionCard } from 'components/layouts/Tabs/ActionCard' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useProfile } from 'lib/profile' -import { useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' import { cn, SQL_ICON } from 'ui' + import { createSqlSnippetSkeletonV2 } from '../SQLEditor.utils' +import { SQL_TEMPLATES } from '@/components/interfaces/SQLEditor/SQLEditor.queries' +import { ActionCard } from '@/components/layouts/Tabs/ActionCard' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useProfile } from '@/lib/profile' +import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' const SQLQuickstarts = () => { const router = useRouter() diff --git a/apps/studio/components/interfaces/SQLEditor/SQLTemplates/SQLTemplates.tsx b/apps/studio/components/interfaces/SQLEditor/SQLTemplates/SQLTemplates.tsx index 81a2de6c04..31c55e4543 100644 --- a/apps/studio/components/interfaces/SQLEditor/SQLTemplates/SQLTemplates.tsx +++ b/apps/studio/components/interfaces/SQLEditor/SQLTemplates/SQLTemplates.tsx @@ -1,19 +1,19 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { partition } from 'lodash' import { useRouter } from 'next/router' import { toast } from 'sonner' - -import { useParams } from 'common' -import { SQL_TEMPLATES } from 'components/interfaces/SQLEditor/SQLEditor.queries' -import { ActionCard } from 'components/layouts/Tabs/ActionCard' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useProfile } from 'lib/profile' -import { useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' import { cn, SQL_ICON } from 'ui' + import { createSqlSnippetSkeletonV2 } from '../SQLEditor.utils' +import { SQL_TEMPLATES } from '@/components/interfaces/SQLEditor/SQLEditor.queries' +import { ActionCard } from '@/components/layouts/Tabs/ActionCard' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useProfile } from '@/lib/profile' +import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' const SQLTemplates = () => { const router = useRouter() diff --git a/apps/studio/components/interfaces/SQLEditor/UtilityPanel/CellDetailPanel.tsx b/apps/studio/components/interfaces/SQLEditor/UtilityPanel/CellDetailPanel.tsx index 03eb6500e1..054565a49c 100644 --- a/apps/studio/components/interfaces/SQLEditor/UtilityPanel/CellDetailPanel.tsx +++ b/apps/studio/components/interfaces/SQLEditor/UtilityPanel/CellDetailPanel.tsx @@ -1,11 +1,11 @@ import { useEffect, useState } from 'react' import remarkGfm from 'remark-gfm' - -import { Markdown } from 'components/interfaces/Markdown' -import CodeEditor from 'components/ui/CodeEditor/CodeEditor' -import TwoOptionToggle from 'components/ui/TwoOptionToggle' import { Sheet, SheetContent, SheetHeader, SheetTitle } from 'ui' +import { Markdown } from '@/components/interfaces/Markdown' +import CodeEditor from '@/components/ui/CodeEditor/CodeEditor' +import TwoOptionToggle from '@/components/ui/TwoOptionToggle' + interface CellDetailPanelProps { column: string value: any diff --git a/apps/studio/components/interfaces/SQLEditor/UtilityPanel/ChartConfig.tsx b/apps/studio/components/interfaces/SQLEditor/UtilityPanel/ChartConfig.tsx index 73126157f4..53e152aca1 100644 --- a/apps/studio/components/interfaces/SQLEditor/UtilityPanel/ChartConfig.tsx +++ b/apps/studio/components/interfaces/SQLEditor/UtilityPanel/ChartConfig.tsx @@ -1,9 +1,5 @@ import { LOCAL_STORAGE_KEYS, useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import BarChart from 'components/ui/Charts/BarChart' -import NoDataPlaceholder from 'components/ui/Charts/NoDataPlaceholder' import dayjs from 'dayjs' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' import { ArrowUpDown, X } from 'lucide-react' import Link from 'next/link' import { useMemo } from 'react' @@ -26,6 +22,11 @@ import { } from 'ui' import { Admonition } from 'ui-patterns' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import BarChart from '@/components/ui/Charts/BarChart' +import NoDataPlaceholder from '@/components/ui/Charts/NoDataPlaceholder' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' + type Results = { rows: readonly any[] } export type ChartConfig = { diff --git a/apps/studio/components/interfaces/SQLEditor/UtilityPanel/ReadOnlyBadge.tsx b/apps/studio/components/interfaces/SQLEditor/UtilityPanel/ReadOnlyBadge.tsx index f9a49bfb91..7a2a8aa75d 100644 --- a/apps/studio/components/interfaces/SQLEditor/UtilityPanel/ReadOnlyBadge.tsx +++ b/apps/studio/components/interfaces/SQLEditor/UtilityPanel/ReadOnlyBadge.tsx @@ -1,7 +1,8 @@ -import { useProfile } from 'lib/profile' -import { useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' import { Badge } from 'ui' +import { useProfile } from '@/lib/profile' +import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' + export type ReadOnlyBadgeProps = { id: string } const ReadOnlyBadge = ({ id }: ReadOnlyBadgeProps) => { const { profile } = useProfile() diff --git a/apps/studio/components/interfaces/SQLEditor/UtilityPanel/Results.tsx b/apps/studio/components/interfaces/SQLEditor/UtilityPanel/Results.tsx index 222fb6ab93..4469699973 100644 --- a/apps/studio/components/interfaces/SQLEditor/UtilityPanel/Results.tsx +++ b/apps/studio/components/interfaces/SQLEditor/UtilityPanel/Results.tsx @@ -1,8 +1,6 @@ import { Copy, Expand } from 'lucide-react' import { useState } from 'react' import DataGrid, { CalculatedColumn } from 'react-data-grid' - -import { handleCopyCell } from 'components/grid/SupabaseGrid.utils' import { cn, ContextMenu_Shadcn_, @@ -11,7 +9,9 @@ import { ContextMenuTrigger_Shadcn_, copyToClipboard, } from 'ui' + import { CellDetailPanel } from './CellDetailPanel' +import { handleCopyCell } from '@/components/grid/SupabaseGrid.utils' function formatClipboardValue(value: any) { if (value === null) return '' diff --git a/apps/studio/components/interfaces/SQLEditor/UtilityPanel/RunButton.tsx b/apps/studio/components/interfaces/SQLEditor/UtilityPanel/RunButton.tsx index 19403f8278..954a2769a8 100644 --- a/apps/studio/components/interfaces/SQLEditor/UtilityPanel/RunButton.tsx +++ b/apps/studio/components/interfaces/SQLEditor/UtilityPanel/RunButton.tsx @@ -1,8 +1,8 @@ import { Command, CornerDownLeft, Loader2 } from 'lucide-react' - -import { detectOS } from 'lib/helpers' import { Button } from 'ui' +import { detectOS } from '@/lib/helpers' + interface SqlRunButtonProps { isDisabled?: boolean isExecuting?: boolean diff --git a/apps/studio/components/interfaces/SQLEditor/UtilityPanel/SavingIndicator.tsx b/apps/studio/components/interfaces/SQLEditor/UtilityPanel/SavingIndicator.tsx index a8fbec38aa..5380fa72a1 100644 --- a/apps/studio/components/interfaces/SQLEditor/UtilityPanel/SavingIndicator.tsx +++ b/apps/studio/components/interfaces/SQLEditor/UtilityPanel/SavingIndicator.tsx @@ -1,11 +1,11 @@ import { usePrevious } from '@uidotdev/usehooks' import { AlertCircle, Check, Loader2, RefreshCcw } from 'lucide-react' import { useEffect, useState } from 'react' - -import { useProfile } from 'lib/profile' -import { useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' import { Button, Tooltip, TooltipContent, TooltipTrigger } from 'ui' + import ReadOnlyBadge from './ReadOnlyBadge' +import { useProfile } from '@/lib/profile' +import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' export type SavingIndicatorProps = { id: string } diff --git a/apps/studio/components/interfaces/SQLEditor/UtilityPanel/UtilityActions.tsx b/apps/studio/components/interfaces/SQLEditor/UtilityPanel/UtilityActions.tsx index ac0cae6e8f..3b3ae4830a 100644 --- a/apps/studio/components/interfaces/SQLEditor/UtilityPanel/UtilityActions.tsx +++ b/apps/studio/components/interfaces/SQLEditor/UtilityPanel/UtilityActions.tsx @@ -1,14 +1,9 @@ +import { LOCAL_STORAGE_KEYS, useParams } from 'common' import { AlignLeft, Check, Heart, Keyboard, MoreVertical } from 'lucide-react' import { toast } from 'sonner' - -import { LOCAL_STORAGE_KEYS, useParams } from 'common' -import { RoleImpersonationPopover } from 'components/interfaces/RoleImpersonationSelector/RoleImpersonationPopover' -import { DatabaseSelector } from 'components/ui/DatabaseSelector' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { IS_PLATFORM } from 'lib/constants' -import { useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' import { Button, + cn, DropdownMenu, DropdownMenuContent, DropdownMenuItem, @@ -17,10 +12,15 @@ import { Tooltip, TooltipContent, TooltipTrigger, - cn, } from 'ui' + import { SqlRunButton } from './RunButton' import SavingIndicator from './SavingIndicator' +import { RoleImpersonationPopover } from '@/components/interfaces/RoleImpersonationSelector/RoleImpersonationPopover' +import { DatabaseSelector } from '@/components/ui/DatabaseSelector' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { IS_PLATFORM } from '@/lib/constants' +import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' export type UtilityActionsProps = { id: string diff --git a/apps/studio/components/interfaces/SQLEditor/UtilityPanel/UtilityPanel.tsx b/apps/studio/components/interfaces/SQLEditor/UtilityPanel/UtilityPanel.tsx index 59abfe4311..6bb4817b01 100644 --- a/apps/studio/components/interfaces/SQLEditor/UtilityPanel/UtilityPanel.tsx +++ b/apps/studio/components/interfaces/SQLEditor/UtilityPanel/UtilityPanel.tsx @@ -1,17 +1,17 @@ import { useFlag, useParams } from 'common' -import { DownloadResultsButton } from 'components/ui/DownloadResultsButton' -import { useContentUpsertMutation } from 'data/content/content-upsert-mutation' -import { Snippet } from 'data/content/sql-folders-query' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { toast } from 'sonner' -import { useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' import { Tabs_Shadcn_, TabsContent_Shadcn_, TabsList_Shadcn_, TabsTrigger_Shadcn_ } from 'ui' import { ChartConfig } from './ChartConfig' import UtilityActions from './UtilityActions' import { UtilityTabExplain } from './UtilityTabExplain' import UtilityTabResults from './UtilityTabResults' +import { DownloadResultsButton } from '@/components/ui/DownloadResultsButton' +import { useContentUpsertMutation } from '@/data/content/content-upsert-mutation' +import { Snippet } from '@/data/content/sql-folders-query' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' export type UtilityPanelProps = { id: string diff --git a/apps/studio/components/interfaces/SQLEditor/UtilityPanel/UtilityTabExplain.tsx b/apps/studio/components/interfaces/SQLEditor/UtilityPanel/UtilityTabExplain.tsx index d1274caf48..c06900e837 100644 --- a/apps/studio/components/interfaces/SQLEditor/UtilityPanel/UtilityTabExplain.tsx +++ b/apps/studio/components/interfaces/SQLEditor/UtilityPanel/UtilityTabExplain.tsx @@ -1,16 +1,16 @@ import { Loader2 } from 'lucide-react' import { useState } from 'react' +import { Tooltip, TooltipContent, TooltipTrigger } from 'ui' -import CopyButton from 'components/ui/CopyButton' -import { ExplainVisualizer } from 'components/interfaces/ExplainVisualizer/ExplainVisualizer' -import { ExplainHeader } from 'components/interfaces/ExplainVisualizer/ExplainVisualizer.Header' +import Results from './Results' +import { ExplainVisualizer } from '@/components/interfaces/ExplainVisualizer/ExplainVisualizer' +import { ExplainHeader } from '@/components/interfaces/ExplainVisualizer/ExplainVisualizer.Header' import { isExplainQuery, isTextFormatExplain, -} from 'components/interfaces/ExplainVisualizer/ExplainVisualizer.utils' -import { useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' -import { Tooltip, TooltipContent, TooltipTrigger } from 'ui' -import Results from './Results' +} from '@/components/interfaces/ExplainVisualizer/ExplainVisualizer.utils' +import CopyButton from '@/components/ui/CopyButton' +import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' export type UtilityTabExplainProps = { id: string diff --git a/apps/studio/components/interfaces/SQLEditor/UtilityPanel/UtilityTabResults.tsx b/apps/studio/components/interfaces/SQLEditor/UtilityPanel/UtilityTabResults.tsx index d92981b565..e6832c34ab 100644 --- a/apps/studio/components/interfaces/SQLEditor/UtilityPanel/UtilityTabResults.tsx +++ b/apps/studio/components/interfaces/SQLEditor/UtilityPanel/UtilityTabResults.tsx @@ -1,20 +1,20 @@ import { useParams } from 'common' -import { subscriptionHasHipaaAddon } from 'components/interfaces/Billing/Subscription/Subscription.utils' -import { AiAssistantDropdown } from 'components/ui/AiAssistantDropdown' -import CopyButton from 'components/ui/CopyButton' -import { InlineLink, InlineLinkClassName } from 'components/ui/InlineLink' -import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' -import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { DOCS_URL } from 'lib/constants' import { ExternalLink, Loader2 } from 'lucide-react' import { parseAsBoolean, useQueryState } from 'nuqs' import { forwardRef } from 'react' -import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' -import { useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' import { Button, cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' import Results from './Results' +import { subscriptionHasHipaaAddon } from '@/components/interfaces/Billing/Subscription/Subscription.utils' +import { AiAssistantDropdown } from '@/components/ui/AiAssistantDropdown' +import CopyButton from '@/components/ui/CopyButton' +import { InlineLink, InlineLinkClassName } from '@/components/ui/InlineLink' +import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' +import { useOrgSubscriptionQuery } from '@/data/subscriptions/org-subscription-query' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { DOCS_URL } from '@/lib/constants' +import { useDatabaseSelectorStateSnapshot } from '@/state/database-selector' +import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' export type UtilityTabResultsProps = { id: string diff --git a/apps/studio/components/interfaces/SQLEditor/hooks.ts b/apps/studio/components/interfaces/SQLEditor/hooks.ts index b4f51f0d33..047056aca2 100644 --- a/apps/studio/components/interfaces/SQLEditor/hooks.ts +++ b/apps/studio/components/interfaces/SQLEditor/hooks.ts @@ -1,11 +1,9 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { useRouter } from 'next/router' import { useCallback, useEffect, useMemo, useState } from 'react' import { toast } from 'sonner' -import { useParams } from 'common' -import { useProfile } from 'lib/profile' -import { useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' import { ContentDiff, DiffType } from './SQLEditor.types' import { compareAsAddition, @@ -13,8 +11,10 @@ import { compareAsNewSnippet, createSqlSnippetSkeletonV2, } from './SQLEditor.utils' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useProfile } from '@/lib/profile' +import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' export const useNewQuery = () => { const router = useRouter() diff --git a/apps/studio/components/interfaces/SQLEditor/useAddDefinitions.ts b/apps/studio/components/interfaces/SQLEditor/useAddDefinitions.ts index 7aeebb1838..e26c2f4fd4 100644 --- a/apps/studio/components/interfaces/SQLEditor/useAddDefinitions.ts +++ b/apps/studio/components/interfaces/SQLEditor/useAddDefinitions.ts @@ -1,18 +1,18 @@ import { Monaco } from '@monaco-editor/react' +import { LOCAL_STORAGE_KEYS } from 'common' import type { IDisposable } from 'monaco-editor' import { useEffect, useRef } from 'react' -import { LOCAL_STORAGE_KEYS } from 'common' -import getPgsqlCompletionProvider from 'components/ui/CodeEditor/Providers/PgSQLCompletionProvider' -import getPgsqlSignatureHelpProvider from 'components/ui/CodeEditor/Providers/PgSQLSignatureHelpProvider' -import { useDatabaseFunctionsQuery } from 'data/database-functions/database-functions-query' -import { useKeywordsQuery } from 'data/database/keywords-query' -import { useSchemasQuery } from 'data/database/schemas-query' -import { useTableColumnsQuery } from 'data/database/table-columns-query' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { formatSql } from 'lib/formatSql' -import { useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' +import getPgsqlCompletionProvider from '@/components/ui/CodeEditor/Providers/PgSQLCompletionProvider' +import getPgsqlSignatureHelpProvider from '@/components/ui/CodeEditor/Providers/PgSQLSignatureHelpProvider' +import { useDatabaseFunctionsQuery } from '@/data/database-functions/database-functions-query' +import { useKeywordsQuery } from '@/data/database/keywords-query' +import { useSchemasQuery } from '@/data/database/schemas-query' +import { useTableColumnsQuery } from '@/data/database/table-columns-query' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { formatSql } from '@/lib/formatSql' +import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' export const useAddDefinitions = (id: string, monaco: Monaco | null) => { const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Settings/API/DataApiEnableSwitch.tsx b/apps/studio/components/interfaces/Settings/API/DataApiEnableSwitch.tsx index ec63e62704..3f6ba8d0e6 100644 --- a/apps/studio/components/interfaces/Settings/API/DataApiEnableSwitch.tsx +++ b/apps/studio/components/interfaces/Settings/API/DataApiEnableSwitch.tsx @@ -6,14 +6,14 @@ import { useForm } from 'react-hook-form' import { toast } from 'sonner' import { Card } from 'ui' -import { DataApiEnableSwitchForm } from './DataApiEnableSwitchForm' -import { DataApiEnableSwitchError, DataApiEnableSwitchLoading } from './DataApiEnableSwitchStates' import { dataApiFormSchema, type DataApiFormValues } from './DataApiEnableSwitch.types' import { enableCheckReducer, getDefaultSchemas, queryUnsafeEntitiesInApi, } from './DataApiEnableSwitch.utils' +import { DataApiEnableSwitchForm } from './DataApiEnableSwitchForm' +import { DataApiEnableSwitchError, DataApiEnableSwitchLoading } from './DataApiEnableSwitchStates' import { UnsafeEntitiesConfirmModal } from './UnsafeEntitiesConfirmModal' import { useProjectPostgrestConfigQuery } from '@/data/config/project-postgrest-config-query' import { useProjectPostgrestConfigUpdateMutation } from '@/data/config/project-postgrest-config-update-mutation' diff --git a/apps/studio/components/interfaces/Settings/API/HardenAPIModal.tsx b/apps/studio/components/interfaces/Settings/API/HardenAPIModal.tsx index bb34cbb4f9..8af67b6b77 100644 --- a/apps/studio/components/interfaces/Settings/API/HardenAPIModal.tsx +++ b/apps/studio/components/interfaces/Settings/API/HardenAPIModal.tsx @@ -1,12 +1,3 @@ -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DocsButton } from 'components/ui/DocsButton' -import InformationBox from 'components/ui/InformationBox' -import { useCreateAndExposeAPISchemaMutation } from 'data/api-settings/create-and-expose-api-schema-mutation' -import { useProjectPostgrestConfigQuery } from 'data/config/project-postgrest-config-query' -import { useProjectPostgrestConfigUpdateMutation } from 'data/config/project-postgrest-config-update-mutation' -import { useSchemasQuery } from 'data/database/schemas-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import { Check, ChevronDown } from 'lucide-react' import { toast } from 'sonner' import { @@ -27,6 +18,16 @@ import { } from 'ui' import { CodeBlock } from 'ui-patterns/CodeBlock' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DocsButton } from '@/components/ui/DocsButton' +import InformationBox from '@/components/ui/InformationBox' +import { useCreateAndExposeAPISchemaMutation } from '@/data/api-settings/create-and-expose-api-schema-mutation' +import { useProjectPostgrestConfigQuery } from '@/data/config/project-postgrest-config-query' +import { useProjectPostgrestConfigUpdateMutation } from '@/data/config/project-postgrest-config-update-mutation' +import { useSchemasQuery } from '@/data/database/schemas-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' + interface HardenAPIModalProps { visible: boolean onClose: () => void diff --git a/apps/studio/components/interfaces/Settings/Addons/Addons.tsx b/apps/studio/components/interfaces/Settings/Addons/Addons.tsx index fd43ba280d..637eab40be 100644 --- a/apps/studio/components/interfaces/Settings/Addons/Addons.tsx +++ b/apps/studio/components/interfaces/Settings/Addons/Addons.tsx @@ -1,34 +1,9 @@ import { SupportCategories } from '@supabase/shared-types/out/constants' import { useFlag, useParams } from 'common' -import { - getAddons, - subscriptionHasHipaaAddon, -} from 'components/interfaces/Billing/Subscription/Subscription.utils' -import { ProjectUpdateDisabledTooltip } from 'components/interfaces/Organization/BillingSettings/ProjectUpdateDisabledTooltip' -import { SupportLink } from 'components/interfaces/Support/SupportLink' -import AlertError from 'components/ui/AlertError' -import { ResourceItem } from 'components/ui/Resource/ResourceItem' -import { ResourceList } from 'components/ui/Resource/ResourceList' -import { HorizontalShimmerWithIcon } from 'components/ui/Shimmers' -import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' -import { useProjectDetailQuery } from 'data/projects/project-detail-query' -import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' -import { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { - useIsAwsCloudProvider, - useIsOrioleDbInAws, - useIsProjectActive, - useSelectedProjectQuery, -} from 'hooks/misc/useSelectedProject' -import { BASE_PATH, DOCS_URL } from 'lib/constants' -import { getDatabaseMajorVersion, getSemanticVersion } from 'lib/helpers' import { AlertCircle, Lock } from 'lucide-react' import { useTheme } from 'next-themes' import Image from 'next/image' import Link from 'next/link' -import { useAddonsPagePanel } from 'state/addons-page' import { Alert_Shadcn_, AlertDescription_Shadcn_, @@ -51,6 +26,31 @@ import { import CustomDomainSidePanel from './CustomDomainSidePanel' import IPv4SidePanel from './IPv4SidePanel' import PITRSidePanel from './PITRSidePanel' +import { + getAddons, + subscriptionHasHipaaAddon, +} from '@/components/interfaces/Billing/Subscription/Subscription.utils' +import { ProjectUpdateDisabledTooltip } from '@/components/interfaces/Organization/BillingSettings/ProjectUpdateDisabledTooltip' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' +import AlertError from '@/components/ui/AlertError' +import { ResourceItem } from '@/components/ui/Resource/ResourceItem' +import { ResourceList } from '@/components/ui/Resource/ResourceList' +import { HorizontalShimmerWithIcon } from '@/components/ui/Shimmers' +import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' +import { useProjectDetailQuery } from '@/data/projects/project-detail-query' +import { useOrgSubscriptionQuery } from '@/data/subscriptions/org-subscription-query' +import { useProjectAddonsQuery } from '@/data/subscriptions/project-addons-query' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { + useIsAwsCloudProvider, + useIsOrioleDbInAws, + useIsProjectActive, + useSelectedProjectQuery, +} from '@/hooks/misc/useSelectedProject' +import { BASE_PATH, DOCS_URL } from '@/lib/constants' +import { getDatabaseMajorVersion, getSemanticVersion } from '@/lib/helpers' +import { useAddonsPagePanel } from '@/state/addons-page' export const Addons = () => { const { resolvedTheme } = useTheme() diff --git a/apps/studio/components/interfaces/Settings/Addons/CustomDomainSidePanel.tsx b/apps/studio/components/interfaces/Settings/Addons/CustomDomainSidePanel.tsx index b17248b256..a291ed1a3b 100644 --- a/apps/studio/components/interfaces/Settings/Addons/CustomDomainSidePanel.tsx +++ b/apps/studio/components/interfaces/Settings/Addons/CustomDomainSidePanel.tsx @@ -1,19 +1,9 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useFlag, useParams } from 'common' -import { UpgradeToPro } from 'components/ui/UpgradeToPro' -import { useProjectAddonRemoveMutation } from 'data/subscriptions/project-addon-remove-mutation' -import { useProjectAddonUpdateMutation } from 'data/subscriptions/project-addon-update-mutation' -import { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query' -import type { AddonVariantId } from 'data/subscriptions/types' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { DOCS_URL } from 'lib/constants' -import { formatCurrency } from 'lib/helpers' import { AlertCircle } from 'lucide-react' import Link from 'next/link' import { useEffect, useState } from 'react' import { toast } from 'sonner' -import { useAddonsPagePanel } from 'state/addons-page' import { Alert_Shadcn_, AlertDescription_Shadcn_, @@ -24,6 +14,16 @@ import { } from 'ui' import { DocsButton } from '@/components/ui/DocsButton' +import { UpgradeToPro } from '@/components/ui/UpgradeToPro' +import { useProjectAddonRemoveMutation } from '@/data/subscriptions/project-addon-remove-mutation' +import { useProjectAddonUpdateMutation } from '@/data/subscriptions/project-addon-update-mutation' +import { useProjectAddonsQuery } from '@/data/subscriptions/project-addons-query' +import type { AddonVariantId } from '@/data/subscriptions/types' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { DOCS_URL } from '@/lib/constants' +import { formatCurrency } from '@/lib/helpers' +import { useAddonsPagePanel } from '@/state/addons-page' const CustomDomainSidePanel = () => { const { ref: projectRef } = useParams() diff --git a/apps/studio/components/interfaces/Settings/Addons/IPv4SidePanel.tsx b/apps/studio/components/interfaces/Settings/Addons/IPv4SidePanel.tsx index 3d8498e64c..3bbff8cb2d 100644 --- a/apps/studio/components/interfaces/Settings/Addons/IPv4SidePanel.tsx +++ b/apps/studio/components/interfaces/Settings/Addons/IPv4SidePanel.tsx @@ -1,23 +1,24 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { DocsButton } from 'components/ui/DocsButton' -import { InlineLink } from 'components/ui/InlineLink' -import { UpgradeToPro } from 'components/ui/UpgradeToPro' -import { useProjectAddonRemoveMutation } from 'data/subscriptions/project-addon-remove-mutation' -import { useProjectAddonUpdateMutation } from 'data/subscriptions/project-addon-update-mutation' -import { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query' -import type { AddonVariantId } from 'data/subscriptions/types' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useIsAwsCloudProvider } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' -import { formatCurrency } from 'lib/helpers' import { useEffect, useState } from 'react' import { toast } from 'sonner' -import { useAddonsPagePanel } from 'state/addons-page' import { cn, RadioGroup_Shadcn_, RadioGroupLargeItem_Shadcn_, SidePanel } from 'ui' import { Admonition } from 'ui-patterns' +import { DocsButton } from '@/components/ui/DocsButton' +import { InlineLink } from '@/components/ui/InlineLink' +import { UpgradeToPro } from '@/components/ui/UpgradeToPro' +import { useProjectAddonRemoveMutation } from '@/data/subscriptions/project-addon-remove-mutation' +import { useProjectAddonUpdateMutation } from '@/data/subscriptions/project-addon-update-mutation' +import { useProjectAddonsQuery } from '@/data/subscriptions/project-addons-query' +import type { AddonVariantId } from '@/data/subscriptions/types' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useIsAwsCloudProvider } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' +import { formatCurrency } from '@/lib/helpers' +import { useAddonsPagePanel } from '@/state/addons-page' + const IPv4SidePanel = () => { const isAws = useIsAwsCloudProvider() const { ref: projectRef } = useParams() diff --git a/apps/studio/components/interfaces/Settings/Addons/PITRSidePanel.tsx b/apps/studio/components/interfaces/Settings/Addons/PITRSidePanel.tsx index 4ffcb3234d..2ba835538a 100644 --- a/apps/studio/components/interfaces/Settings/Addons/PITRSidePanel.tsx +++ b/apps/studio/components/interfaces/Settings/Addons/PITRSidePanel.tsx @@ -1,24 +1,8 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { subscriptionHasHipaaAddon } from 'components/interfaces/Billing/Subscription/Subscription.utils' -import { SupportLink } from 'components/interfaces/Support/SupportLink' -import { UpgradeToPro } from 'components/ui/UpgradeToPro' -import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' -import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' -import { useProjectAddonRemoveMutation } from 'data/subscriptions/project-addon-remove-mutation' -import { useProjectAddonUpdateMutation } from 'data/subscriptions/project-addon-update-mutation' -import { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query' -import type { AddonVariantId } from 'data/subscriptions/types' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { BASE_PATH, DOCS_URL } from 'lib/constants' -import { formatCurrency } from 'lib/helpers' import { useTheme } from 'next-themes' import { useEffect, useState } from 'react' import { toast } from 'sonner' -import { useAddonsPagePanel } from 'state/addons-page' import { Alert_Shadcn_, AlertDescription_Shadcn_, @@ -30,7 +14,23 @@ import { SidePanel, } from 'ui' +import { subscriptionHasHipaaAddon } from '@/components/interfaces/Billing/Subscription/Subscription.utils' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' import { DocsButton } from '@/components/ui/DocsButton' +import { UpgradeToPro } from '@/components/ui/UpgradeToPro' +import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' +import { useOrgSubscriptionQuery } from '@/data/subscriptions/org-subscription-query' +import { useProjectAddonRemoveMutation } from '@/data/subscriptions/project-addon-remove-mutation' +import { useProjectAddonUpdateMutation } from '@/data/subscriptions/project-addon-update-mutation' +import { useProjectAddonsQuery } from '@/data/subscriptions/project-addons-query' +import type { AddonVariantId } from '@/data/subscriptions/types' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { BASE_PATH, DOCS_URL } from '@/lib/constants' +import { formatCurrency } from '@/lib/helpers' +import { useAddonsPagePanel } from '@/state/addons-page' const PITR_CATEGORY_OPTIONS: { id: 'off' | 'on' diff --git a/apps/studio/components/interfaces/Settings/Database/BannedIPs.tsx b/apps/studio/components/interfaces/Settings/Database/BannedIPs.tsx index 9c74ca8ca7..5d9325e2d9 100644 --- a/apps/studio/components/interfaces/Settings/Database/BannedIPs.tsx +++ b/apps/studio/components/interfaces/Settings/Database/BannedIPs.tsx @@ -1,14 +1,5 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DocsButton } from 'components/ui/DocsButton' -import { useBannedIPsDeleteMutation } from 'data/banned-ips/banned-ips-delete-mutations' -import { useBannedIPsQuery } from 'data/banned-ips/banned-ips-query' -import { useUserIPAddressQuery } from 'data/misc/user-ip-address-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import { Globe } from 'lucide-react' import { useState } from 'react' import { toast } from 'sonner' @@ -23,6 +14,16 @@ import { } from 'ui-patterns' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' +import AlertError from '@/components/ui/AlertError' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DocsButton } from '@/components/ui/DocsButton' +import { useBannedIPsDeleteMutation } from '@/data/banned-ips/banned-ips-delete-mutations' +import { useBannedIPsQuery } from '@/data/banned-ips/banned-ips-query' +import { useUserIPAddressQuery } from '@/data/misc/user-ip-address-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' + export const BannedIPs = () => { const { ref } = useParams() const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Settings/Database/ConnectionPooling/ConnectionPooling.tsx b/apps/studio/components/interfaces/Settings/Database/ConnectionPooling/ConnectionPooling.tsx index e0189d5085..260222d646 100644 --- a/apps/studio/components/interfaces/Settings/Database/ConnectionPooling/ConnectionPooling.tsx +++ b/apps/studio/components/interfaces/Settings/Database/ConnectionPooling/ConnectionPooling.tsx @@ -1,20 +1,6 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { DocsButton } from 'components/ui/DocsButton' -import { setValueAsNullableNumber } from 'components/ui/Forms/Form.constants' -import { FormActions } from 'components/ui/Forms/FormActions' -import { InlineLink } from 'components/ui/InlineLink' -import Panel from 'components/ui/Panel' -import { useMaxConnectionsQuery } from 'data/database/max-connections-query' -import { usePgbouncerConfigQuery } from 'data/database/pgbouncer-config-query' -import { usePgbouncerConfigurationUpdateMutation } from 'data/database/pgbouncer-config-update-mutation' -import { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import { capitalize } from 'lodash' import Link from 'next/link' import { Fragment, useEffect } from 'react' @@ -49,6 +35,20 @@ import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import z from 'zod' import { POOLING_OPTIMIZATIONS } from './ConnectionPooling.constants' +import AlertError from '@/components/ui/AlertError' +import { DocsButton } from '@/components/ui/DocsButton' +import { setValueAsNullableNumber } from '@/components/ui/Forms/Form.constants' +import { FormActions } from '@/components/ui/Forms/FormActions' +import { InlineLink } from '@/components/ui/InlineLink' +import Panel from '@/components/ui/Panel' +import { useMaxConnectionsQuery } from '@/data/database/max-connections-query' +import { usePgbouncerConfigQuery } from '@/data/database/pgbouncer-config-query' +import { usePgbouncerConfigurationUpdateMutation } from '@/data/database/pgbouncer-config-update-mutation' +import { useProjectAddonsQuery } from '@/data/subscriptions/project-addons-query' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' const formId = 'pooling-configuration-form' diff --git a/apps/studio/components/interfaces/Settings/Database/DatabaseReadOnlyAlert.tsx b/apps/studio/components/interfaces/Settings/Database/DatabaseReadOnlyAlert.tsx index 2c0ad328f6..9130b7be5f 100644 --- a/apps/studio/components/interfaces/Settings/Database/DatabaseReadOnlyAlert.tsx +++ b/apps/studio/components/interfaces/Settings/Database/DatabaseReadOnlyAlert.tsx @@ -2,12 +2,12 @@ import { useParams } from 'common' import { AlertTriangle, ExternalLink } from 'lucide-react' import Link from 'next/link' import { useState } from 'react' +import { Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, Button } from 'ui' -import { useResourceWarningsQuery } from 'data/usage/resource-warnings-query' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { DOCS_URL } from 'lib/constants' -import { AlertDescription_Shadcn_, AlertTitle_Shadcn_, Alert_Shadcn_, Button } from 'ui' import ConfirmDisableReadOnlyModeModal from './DatabaseSettings/ConfirmDisableReadOnlyModal' +import { useResourceWarningsQuery } from '@/data/usage/resource-warnings-query' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { DOCS_URL } from '@/lib/constants' export const DatabaseReadOnlyAlert = () => { const { ref: projectRef } = useParams() diff --git a/apps/studio/components/interfaces/Settings/Database/DatabaseSettings/ConfirmDisableReadOnlyModal.tsx b/apps/studio/components/interfaces/Settings/Database/DatabaseSettings/ConfirmDisableReadOnlyModal.tsx index f3c9a9a1df..93753a9473 100644 --- a/apps/studio/components/interfaces/Settings/Database/DatabaseSettings/ConfirmDisableReadOnlyModal.tsx +++ b/apps/studio/components/interfaces/Settings/Database/DatabaseSettings/ConfirmDisableReadOnlyModal.tsx @@ -2,7 +2,7 @@ import { useParams } from 'common' import { toast } from 'sonner' import { Modal } from 'ui' -import { useDisableReadOnlyModeMutation } from 'data/config/project-temp-disable-read-only-mutation' +import { useDisableReadOnlyModeMutation } from '@/data/config/project-temp-disable-read-only-mutation' interface ConfirmDisableReadOnlyModeModalProps { visible: boolean diff --git a/apps/studio/components/interfaces/Settings/Database/DatabaseSettings/ResetDbPassword.tsx b/apps/studio/components/interfaces/Settings/Database/DatabaseSettings/ResetDbPassword.tsx index 7b54ad637e..d41e2e441b 100644 --- a/apps/studio/components/interfaces/Settings/Database/DatabaseSettings/ResetDbPassword.tsx +++ b/apps/studio/components/interfaces/Settings/Database/DatabaseSettings/ResetDbPassword.tsx @@ -1,25 +1,26 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { PasswordStrengthBar } from 'components/ui/PasswordStrengthBar' -import { useDatabasePasswordResetMutation } from 'data/database/database-password-reset-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useIsProjectActive, useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DEFAULT_MINIMUM_PASSWORD_STRENGTH } from 'lib/constants' -import { passwordStrength, PasswordStrengthScore } from 'lib/password-strength' -import { generateStrongPassword } from 'lib/project' import { useEffect, useState } from 'react' import { toast } from 'sonner' import { Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Input, Modal } from 'ui' import { PageSection, PageSectionContent, + PageSectionDescription, PageSectionMeta, PageSectionSummary, - PageSectionDescription, PageSectionTitle, } from 'ui-patterns/PageSection' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { PasswordStrengthBar } from '@/components/ui/PasswordStrengthBar' +import { useDatabasePasswordResetMutation } from '@/data/database/database-password-reset-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useIsProjectActive, useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DEFAULT_MINIMUM_PASSWORD_STRENGTH } from '@/lib/constants' +import { passwordStrength, PasswordStrengthScore } from '@/lib/password-strength' +import { generateStrongPassword } from '@/lib/project' + const ResetDbPassword = ({ disabled = false }) => { const { ref } = useParams() const isProjectActive = useIsProjectActive() diff --git a/apps/studio/components/interfaces/Settings/Database/DiskSizeConfiguration.tsx b/apps/studio/components/interfaces/Settings/Database/DiskSizeConfiguration.tsx index b617e882c3..35c71b8289 100644 --- a/apps/studio/components/interfaces/Settings/Database/DiskSizeConfiguration.tsx +++ b/apps/studio/components/interfaces/Settings/Database/DiskSizeConfiguration.tsx @@ -1,20 +1,5 @@ -import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { Markdown } from 'components/interfaces/Markdown' -import DiskSizeConfigurationModal from 'components/interfaces/Settings/Database/DiskSizeConfigurationModal' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DocsButton } from 'components/ui/DocsButton' -import Panel from 'components/ui/Panel' -import { useProjectDiskResizeMutation } from 'data/config/project-disk-resize-mutation' -import { useDatabaseSizeQuery } from 'data/database/database-size-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useIsAwsNimbusCloudProvider, useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useUrlState } from 'hooks/ui/useUrlState' -import { DOCS_URL } from 'lib/constants' -import { formatBytes } from 'lib/helpers' import { ExternalLink, Info } from 'lucide-react' import Link from 'next/link' import { SetStateAction } from 'react' @@ -28,6 +13,25 @@ import { PageSectionTitle, } from 'ui-patterns' +import { Markdown } from '@/components/interfaces/Markdown' +import DiskSizeConfigurationModal from '@/components/interfaces/Settings/Database/DiskSizeConfigurationModal' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DocsButton } from '@/components/ui/DocsButton' +import Panel from '@/components/ui/Panel' +import { useProjectDiskResizeMutation } from '@/data/config/project-disk-resize-mutation' +import { useDatabaseSizeQuery } from '@/data/database/database-size-query' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { + useIsAwsNimbusCloudProvider, + useSelectedProjectQuery, +} from '@/hooks/misc/useSelectedProject' +import { useUrlState } from '@/hooks/ui/useUrlState' +import { DOCS_URL } from '@/lib/constants' +import { formatBytes } from '@/lib/helpers' + export interface DiskSizeConfigurationProps { disabled?: boolean } diff --git a/apps/studio/components/interfaces/Settings/Database/DiskSizeConfigurationModal.tsx b/apps/studio/components/interfaces/Settings/Database/DiskSizeConfigurationModal.tsx index 19498ff0c6..7cda259ed0 100644 --- a/apps/studio/components/interfaces/Settings/Database/DiskSizeConfigurationModal.tsx +++ b/apps/studio/components/interfaces/Settings/Database/DiskSizeConfigurationModal.tsx @@ -1,14 +1,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { SupportCategories } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { SupportLink } from 'components/interfaces/Support/SupportLink' -import { useProjectDiskResizeMutation } from 'data/config/project-disk-resize-mutation' -import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' import dayjs from 'dayjs' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import { ExternalLink, Info } from 'lucide-react' import Link from 'next/link' import { SetStateAction, useEffect, useMemo } from 'react' @@ -34,6 +27,14 @@ import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import * as z from 'zod' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' +import { useProjectDiskResizeMutation } from '@/data/config/project-disk-resize-mutation' +import { useOrgSubscriptionQuery } from '@/data/subscriptions/org-subscription-query' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' + export interface DiskSizeConfigurationProps { visible: boolean hideModal: (value: SetStateAction) => void diff --git a/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccess.utils.test.ts b/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccess.utils.test.ts index b9230ed1b3..5756364e91 100644 --- a/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccess.utils.test.ts +++ b/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccess.utils.test.ts @@ -1,4 +1,3 @@ -import type { OrganizationMembersData } from 'data/organizations/organization-members-query' import dayjs from 'dayjs' import { describe, expect, it } from 'vitest' @@ -12,6 +11,7 @@ import { parseCommaSeparatedCidrs, serializeDraftRolesForGrantMutation, } from './JitDbAccess.utils' +import type { OrganizationMembersData } from '@/data/organizations/organization-members-query' describe('jitDbAccess.utils', () => { it('returns empty expiry string for never/custom-only fallback modes', () => { diff --git a/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccess.utils.ts b/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccess.utils.ts index 88778bc3d9..ae6c365391 100644 --- a/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccess.utils.ts +++ b/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccess.utils.ts @@ -1,7 +1,3 @@ -import { type DatabaseRolesData, type PgRole } from 'data/database-roles/database-roles-query' -import type { JitDbAccessMembersData } from 'data/jit-db-access/jit-db-access-members-query' -import type { OrganizationMembersData } from 'data/organizations/organization-members-query' -import type { ProjectMembersData } from 'data/projects/project-members-query' import dayjs from 'dayjs' import { IPv4CidrRange, IPv6CidrRange } from 'ip-num' @@ -15,6 +11,10 @@ import type { JitUserRule, JitUserRuleDraft, } from './JitDbAccess.types' +import { type DatabaseRolesData, type PgRole } from '@/data/database-roles/database-roles-query' +import type { JitDbAccessMembersData } from '@/data/jit-db-access/jit-db-access-members-query' +import type { OrganizationMembersData } from '@/data/organizations/organization-members-query' +import type { ProjectMembersData } from '@/data/projects/project-members-query' export function getRelativeDatetimeByMode(mode: JitExpiryMode) { if (mode === '1h') return dayjs().add(1, 'hour').toISOString() diff --git a/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessConfiguration.tsx b/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessConfiguration.tsx index 46c0b08c55..50af7588a3 100644 --- a/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessConfiguration.tsx +++ b/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessConfiguration.tsx @@ -1,20 +1,5 @@ import { PermissionAction, SupportCategories } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { SupportLink } from 'components/interfaces/Support/SupportLink' -import AlertError from 'components/ui/AlertError' -import { DocsButton } from 'components/ui/DocsButton' -import { InlineLinkClassName } from 'components/ui/InlineLink' -import { useDatabaseRolesQuery } from 'data/database-roles/database-roles-query' -import { useJitDbAccessMembersQuery } from 'data/jit-db-access/jit-db-access-members-query' -import { useJitDbAccessQuery } from 'data/jit-db-access/jit-db-access-query' -import { useJitDbAccessRevokeMutation } from 'data/jit-db-access/jit-db-access-revoke-mutation' -import { useJitDbAccessUpdateMutation } from 'data/jit-db-access/jit-db-access-update-mutation' -import { useOrganizationMembersQuery } from 'data/organizations/organization-members-query' -import { useProjectMembersQuery } from 'data/projects/project-members-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import { Loader2 } from 'lucide-react' import Link from 'next/link' import { parseAsBoolean, parseAsString, useQueryState } from 'nuqs' @@ -56,6 +41,21 @@ import { import { JitDbAccessDeleteDialog } from './JitDbAccessDeleteDialog' import { JitDbAccessRuleSheet } from './JitDbAccessRuleSheet' import { JitDbAccessRulesTable } from './JitDbAccessRulesTable' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' +import AlertError from '@/components/ui/AlertError' +import { DocsButton } from '@/components/ui/DocsButton' +import { InlineLinkClassName } from '@/components/ui/InlineLink' +import { useDatabaseRolesQuery } from '@/data/database-roles/database-roles-query' +import { useJitDbAccessMembersQuery } from '@/data/jit-db-access/jit-db-access-members-query' +import { useJitDbAccessQuery } from '@/data/jit-db-access/jit-db-access-query' +import { useJitDbAccessRevokeMutation } from '@/data/jit-db-access/jit-db-access-revoke-mutation' +import { useJitDbAccessUpdateMutation } from '@/data/jit-db-access/jit-db-access-update-mutation' +import { useOrganizationMembersQuery } from '@/data/organizations/organization-members-query' +import { useProjectMembersQuery } from '@/data/projects/project-members-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' export const JitDbAccessConfiguration = () => { const { ref } = useParams() diff --git a/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessRoleGrantFields.tsx b/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessRoleGrantFields.tsx index ba7e7926fb..3a5f7fc02f 100644 --- a/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessRoleGrantFields.tsx +++ b/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessRoleGrantFields.tsx @@ -1,7 +1,4 @@ -import { DatePicker } from 'components/ui/DatePicker' -import { InlineLink } from 'components/ui/InlineLink' import dayjs from 'dayjs' -import { DOCS_URL } from 'lib/constants' import { Checkbox_Shadcn_, Input_Shadcn_, @@ -18,6 +15,9 @@ import { Admonition } from 'ui-patterns/admonition' import { JIT_EXPIRY_MODE_OPTIONS, JIT_MAX_CUSTOM_EXPIRY_YEARS } from './JitDbAccess.constants' import type { JitRoleGrantDraft, JitRoleOption } from './JitDbAccess.types' import { getRelativeDatetimeByMode } from './JitDbAccess.utils' +import { DatePicker } from '@/components/ui/DatePicker' +import { InlineLink } from '@/components/ui/InlineLink' +import { DOCS_URL } from '@/lib/constants' interface JitDbAccessRoleGrantFieldsProps { role: JitRoleOption diff --git a/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessRuleSheet.tsx b/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessRuleSheet.tsx index 2ab79f9fbf..37ce502ede 100644 --- a/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessRuleSheet.tsx +++ b/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessRuleSheet.tsx @@ -1,7 +1,5 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useParams } from 'common' -import { InlineLink } from 'components/ui/InlineLink' -import { DOCS_URL } from 'lib/constants' import { parseAsBoolean, parseAsString, useQueryState } from 'nuqs' import { useEffect, useMemo } from 'react' import { useForm } from 'react-hook-form' @@ -44,12 +42,14 @@ import { } from './JitDbAccess.utils' import { JitDbAccessRoleGrantFields } from './JitDbAccessRoleGrantFields' import { DiscardChangesConfirmationDialog } from '@/components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' +import { InlineLink } from '@/components/ui/InlineLink' import { useDatabaseRolesQuery } from '@/data/database-roles/database-roles-query' import { useJitDbAccessGrantMutation } from '@/data/jit-db-access/jit-db-access-grant-mutation' import { useJitDbAccessMembersQuery } from '@/data/jit-db-access/jit-db-access-members-query' import { useProjectMembersQuery } from '@/data/projects/project-members-query' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' import { useConfirmOnClose } from '@/hooks/ui/useConfirmOnClose' +import { DOCS_URL } from '@/lib/constants' const grantSchema = z.object({ roleId: z.string(), diff --git a/apps/studio/components/interfaces/Settings/Database/NetworkRestrictions/AddRestrictionModal.tsx b/apps/studio/components/interfaces/Settings/Database/NetworkRestrictions/AddRestrictionModal.tsx index 2ccdc816ef..23fdcc9269 100644 --- a/apps/studio/components/interfaces/Settings/Database/NetworkRestrictions/AddRestrictionModal.tsx +++ b/apps/studio/components/interfaces/Settings/Database/NetworkRestrictions/AddRestrictionModal.tsx @@ -1,9 +1,5 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useParams } from 'common' -import InformationBox from 'components/ui/InformationBox' -import { useNetworkRestrictionsQuery } from 'data/network-restrictions/network-restrictions-query' -import { useNetworkRestrictionsApplyMutation } from 'data/network-restrictions/network-retrictions-apply-mutation' -import { DOCS_URL } from 'lib/constants' import { HelpCircle } from 'lucide-react' import { useEffect } from 'react' import { useForm, useWatch } from 'react-hook-form' @@ -23,6 +19,10 @@ import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import * as z from 'zod' import { checkIfPrivate, getAddressEndRange, normalize } from './NetworkRestrictions.utils' +import InformationBox from '@/components/ui/InformationBox' +import { useNetworkRestrictionsQuery } from '@/data/network-restrictions/network-restrictions-query' +import { useNetworkRestrictionsApplyMutation } from '@/data/network-restrictions/network-retrictions-apply-mutation' +import { DOCS_URL } from '@/lib/constants' const IPV4_MAX_CIDR_BLOCK_SIZE = 32 const IPV6_MAX_CIDR_BLOCK_SIZE = 128 diff --git a/apps/studio/components/interfaces/Settings/Database/NetworkRestrictions/AllowAllModal.tsx b/apps/studio/components/interfaces/Settings/Database/NetworkRestrictions/AllowAllModal.tsx index d41750072d..adb3d92592 100644 --- a/apps/studio/components/interfaces/Settings/Database/NetworkRestrictions/AllowAllModal.tsx +++ b/apps/studio/components/interfaces/Settings/Database/NetworkRestrictions/AllowAllModal.tsx @@ -1,7 +1,7 @@ +import { useParams } from 'common/hooks' import { Button, Modal } from 'ui' -import { useParams } from 'common/hooks' -import { useNetworkRestrictionsApplyMutation } from 'data/network-restrictions/network-retrictions-apply-mutation' +import { useNetworkRestrictionsApplyMutation } from '@/data/network-restrictions/network-retrictions-apply-mutation' interface AllowAllModalProps { visible: boolean diff --git a/apps/studio/components/interfaces/Settings/Database/NetworkRestrictions/DisallowAllModal.tsx b/apps/studio/components/interfaces/Settings/Database/NetworkRestrictions/DisallowAllModal.tsx index 2ba9e890f9..d88aaa1d90 100644 --- a/apps/studio/components/interfaces/Settings/Database/NetworkRestrictions/DisallowAllModal.tsx +++ b/apps/studio/components/interfaces/Settings/Database/NetworkRestrictions/DisallowAllModal.tsx @@ -1,8 +1,8 @@ import { useParams } from 'common' import { Button, Modal } from 'ui' -import InformationBox from 'components/ui/InformationBox' -import { useNetworkRestrictionsApplyMutation } from 'data/network-restrictions/network-retrictions-apply-mutation' +import InformationBox from '@/components/ui/InformationBox' +import { useNetworkRestrictionsApplyMutation } from '@/data/network-restrictions/network-retrictions-apply-mutation' interface DisallowAllModalProps { visible: boolean diff --git a/apps/studio/components/interfaces/Settings/Database/NetworkRestrictions/NetworkRestrictions.tsx b/apps/studio/components/interfaces/Settings/Database/NetworkRestrictions/NetworkRestrictions.tsx index 7f6bc4aa76..d6a039e82b 100644 --- a/apps/studio/components/interfaces/Settings/Database/NetworkRestrictions/NetworkRestrictions.tsx +++ b/apps/studio/components/interfaces/Settings/Database/NetworkRestrictions/NetworkRestrictions.tsx @@ -1,14 +1,7 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { AlertCircle, ChevronDown, Globe, Lock } from 'lucide-react' import { useState } from 'react' - -import { useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DocsButton } from 'components/ui/DocsButton' -import { useNetworkRestrictionsQuery } from 'data/network-restrictions/network-restrictions-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import { Badge, Button, @@ -33,10 +26,17 @@ import { PageSectionTitle, } from 'ui-patterns' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' + import AddRestrictionModal from './AddRestrictionModal' import AllowAllModal from './AllowAllModal' import DisallowAllModal from './DisallowAllModal' import RemoveRestrictionModal from './RemoveRestrictionModal' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DocsButton } from '@/components/ui/DocsButton' +import { useNetworkRestrictionsQuery } from '@/data/network-restrictions/network-restrictions-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' interface AccessButtonProps { disabled: boolean diff --git a/apps/studio/components/interfaces/Settings/Database/NetworkRestrictions/RemoveRestrictionModal.tsx b/apps/studio/components/interfaces/Settings/Database/NetworkRestrictions/RemoveRestrictionModal.tsx index 1cd9dd1671..6026e29079 100644 --- a/apps/studio/components/interfaces/Settings/Database/NetworkRestrictions/RemoveRestrictionModal.tsx +++ b/apps/studio/components/interfaces/Settings/Database/NetworkRestrictions/RemoveRestrictionModal.tsx @@ -1,11 +1,11 @@ import { useParams } from 'common' import { toast } from 'sonner' import { Button, Modal } from 'ui' - -import { useNetworkRestrictionsQuery } from 'data/network-restrictions/network-restrictions-query' -import { useNetworkRestrictionsApplyMutation } from 'data/network-restrictions/network-retrictions-apply-mutation' import { Admonition } from 'ui-patterns' +import { useNetworkRestrictionsQuery } from '@/data/network-restrictions/network-restrictions-query' +import { useNetworkRestrictionsApplyMutation } from '@/data/network-restrictions/network-retrictions-apply-mutation' + interface RemoveRestrictionModalProps { visible: boolean selectedRestriction?: string diff --git a/apps/studio/components/interfaces/Settings/Database/PoolingModesModal.tsx b/apps/studio/components/interfaces/Settings/Database/PoolingModesModal.tsx index 1449fcf80a..2dc69ec7bf 100644 --- a/apps/studio/components/interfaces/Settings/Database/PoolingModesModal.tsx +++ b/apps/studio/components/interfaces/Settings/Database/PoolingModesModal.tsx @@ -1,16 +1,9 @@ -import { AlertTriangleIcon } from 'lucide-react' - import { useParams } from 'common' -import { Markdown } from 'components/interfaces/Markdown' -import { DocsButton } from 'components/ui/DocsButton' -import { useSupavisorConfigurationQuery } from 'data/database/supavisor-configuration-query' -import { DOCS_URL } from 'lib/constants' -import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' -import { useDatabaseSettingsStateSnapshot } from 'state/database-settings' +import { AlertTriangleIcon } from 'lucide-react' import { + Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, - Alert_Shadcn_, Button, Dialog, DialogClose, @@ -23,6 +16,13 @@ import { DialogTitle, } from 'ui' +import { Markdown } from '@/components/interfaces/Markdown' +import { DocsButton } from '@/components/ui/DocsButton' +import { useSupavisorConfigurationQuery } from '@/data/database/supavisor-configuration-query' +import { DOCS_URL } from '@/lib/constants' +import { useDatabaseSelectorStateSnapshot } from '@/state/database-selector' +import { useDatabaseSettingsStateSnapshot } from '@/state/database-settings' + export const PoolingModesModal = () => { const { ref: projectRef } = useParams() const snap = useDatabaseSettingsStateSnapshot() diff --git a/apps/studio/components/interfaces/Settings/Database/SSLConfiguration.tsx b/apps/studio/components/interfaces/Settings/Database/SSLConfiguration.tsx index cfd3b7c673..3c79ccdba7 100644 --- a/apps/studio/components/interfaces/Settings/Database/SSLConfiguration.tsx +++ b/apps/studio/components/interfaces/Settings/Database/SSLConfiguration.tsx @@ -1,16 +1,5 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { SupportLink } from 'components/interfaces/Support/SupportLink' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DocsButton } from 'components/ui/DocsButton' -import { InlineLinkClassName } from 'components/ui/InlineLink' -import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' -import { useSSLEnforcementQuery } from 'data/ssl-enforcement/ssl-enforcement-query' -import { useSSLEnforcementUpdateMutation } from 'data/ssl-enforcement/ssl-enforcement-update-mutation' -import { useCustomContent } from 'hooks/custom-content/useCustomContent' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import { template } from 'lodash' import { Download, Loader2 } from 'lucide-react' import { useEffect, useMemo, useState } from 'react' @@ -43,6 +32,18 @@ import { } from 'ui-patterns' import { FormLayout } from 'ui-patterns/form/Layout/FormLayout' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DocsButton } from '@/components/ui/DocsButton' +import { InlineLinkClassName } from '@/components/ui/InlineLink' +import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' +import { useSSLEnforcementQuery } from '@/data/ssl-enforcement/ssl-enforcement-query' +import { useSSLEnforcementUpdateMutation } from '@/data/ssl-enforcement/ssl-enforcement-update-mutation' +import { useCustomContent } from '@/hooks/custom-content/useCustomContent' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' + export const SSLConfiguration = () => { const { ref } = useParams() const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Settings/Database/SettingsDatabaseEmptyStateLocal.tsx b/apps/studio/components/interfaces/Settings/Database/SettingsDatabaseEmptyStateLocal.tsx index b089eaca41..6a26777e94 100644 --- a/apps/studio/components/interfaces/Settings/Database/SettingsDatabaseEmptyStateLocal.tsx +++ b/apps/studio/components/interfaces/Settings/Database/SettingsDatabaseEmptyStateLocal.tsx @@ -1,6 +1,7 @@ import { Card, CardContent, CardHeader } from 'ui' -import { DOCS_URL } from 'lib/constants' -import { DocsButton } from 'components/ui/DocsButton' + +import { DocsButton } from '@/components/ui/DocsButton' +import { DOCS_URL } from '@/lib/constants' export function SettingsDatabaseEmptyStateLocal() { return ( diff --git a/apps/studio/components/interfaces/Settings/General/ComplianceConfig/ProjectComplianceMode.tsx b/apps/studio/components/interfaces/Settings/General/ComplianceConfig/ProjectComplianceMode.tsx index 628c7b1342..9648baed9b 100644 --- a/apps/studio/components/interfaces/Settings/General/ComplianceConfig/ProjectComplianceMode.tsx +++ b/apps/studio/components/interfaces/Settings/General/ComplianceConfig/ProjectComplianceMode.tsx @@ -1,17 +1,8 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { Loader2 } from 'lucide-react' import { useEffect, useState } from 'react' import { toast } from 'sonner' - -import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { DocsButton } from 'components/ui/DocsButton' -import { InlineLink } from 'components/ui/InlineLink' -import { useComplianceConfigUpdateMutation } from 'data/config/project-compliance-config-mutation' -import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import { Card, CardContent, Switch, Tooltip, TooltipContent, TooltipTrigger } from 'ui' import { PageSection, @@ -22,6 +13,15 @@ import { PageSectionTitle, } from 'ui-patterns/PageSection' +import AlertError from '@/components/ui/AlertError' +import { DocsButton } from '@/components/ui/DocsButton' +import { InlineLink } from '@/components/ui/InlineLink' +import { useComplianceConfigUpdateMutation } from '@/data/config/project-compliance-config-mutation' +import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' + export const ComplianceConfig = () => { const { ref } = useParams() const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainActivate.tsx b/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainActivate.tsx index 0b35de9131..cea6d36b42 100644 --- a/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainActivate.tsx +++ b/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainActivate.tsx @@ -1,17 +1,18 @@ -import { DocsButton } from 'components/ui/DocsButton' -import Panel from 'components/ui/Panel' -import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' -import { useCheckCNAMERecordMutation } from 'data/custom-domains/check-cname-mutation' -import { useCustomDomainActivateMutation } from 'data/custom-domains/custom-domains-activate-mutation' -import { useCustomDomainDeleteMutation } from 'data/custom-domains/custom-domains-delete-mutation' -import type { CustomDomainResponse } from 'data/custom-domains/custom-domains-query' -import { DOCS_URL } from 'lib/constants' import { useState } from 'react' import { toast } from 'sonner' import { Button } from 'ui' import { Admonition } from 'ui-patterns/admonition' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' +import { DocsButton } from '@/components/ui/DocsButton' +import Panel from '@/components/ui/Panel' +import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' +import { useCheckCNAMERecordMutation } from '@/data/custom-domains/check-cname-mutation' +import { useCustomDomainActivateMutation } from '@/data/custom-domains/custom-domains-activate-mutation' +import { useCustomDomainDeleteMutation } from '@/data/custom-domains/custom-domains-delete-mutation' +import type { CustomDomainResponse } from '@/data/custom-domains/custom-domains-query' +import { DOCS_URL } from '@/lib/constants' + export type CustomDomainActivateProps = { projectRef?: string customDomain: CustomDomainResponse diff --git a/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainConfig.tsx b/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainConfig.tsx index 5edd3a16d3..7d7f161e37 100644 --- a/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainConfig.tsx +++ b/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainConfig.tsx @@ -1,14 +1,5 @@ import { SupportCategories } from '@supabase/shared-types/out/constants' import { useFlag, useParams } from 'common' -import { SupportLink } from 'components/interfaces/Support/SupportLink' -import { InlineLinkClassName } from 'components/ui/InlineLink' -import { UpgradeToPro } from 'components/ui/UpgradeToPro' -import { - useCustomDomainsQuery, - type CustomDomainsData, -} from 'data/custom-domains/custom-domains-query' -import { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { AlertCircle } from 'lucide-react' import { Card, CardContent } from 'ui' import { @@ -25,6 +16,15 @@ import { CustomDomainDelete } from './CustomDomainDelete' import { CustomDomainsConfigureHostname } from './CustomDomainsConfigureHostname' import { CustomDomainsShimmerLoader } from './CustomDomainsShimmerLoader' import { CustomDomainVerify } from './CustomDomainVerify' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' +import { InlineLinkClassName } from '@/components/ui/InlineLink' +import { UpgradeToPro } from '@/components/ui/UpgradeToPro' +import { + useCustomDomainsQuery, + type CustomDomainsData, +} from '@/data/custom-domains/custom-domains-query' +import { useProjectAddonsQuery } from '@/data/subscriptions/project-addons-query' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' export const CustomDomainConfig = () => { const { ref } = useParams() diff --git a/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainDelete.tsx b/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainDelete.tsx index da82b6dc82..66ddad4ef4 100644 --- a/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainDelete.tsx +++ b/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainDelete.tsx @@ -1,14 +1,15 @@ -import { DocsButton } from 'components/ui/DocsButton' -import Panel from 'components/ui/Panel' -import { useCustomDomainDeleteMutation } from 'data/custom-domains/custom-domains-delete-mutation' -import type { CustomDomainResponse } from 'data/custom-domains/custom-domains-query' -import { DOCS_URL } from 'lib/constants' import { Trash } from 'lucide-react' import { useState } from 'react' import { toast } from 'sonner' import { Button } from 'ui' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' +import { DocsButton } from '@/components/ui/DocsButton' +import Panel from '@/components/ui/Panel' +import { useCustomDomainDeleteMutation } from '@/data/custom-domains/custom-domains-delete-mutation' +import type { CustomDomainResponse } from '@/data/custom-domains/custom-domains-query' +import { DOCS_URL } from '@/lib/constants' + export type CustomDomainDeleteProps = { projectRef?: string customDomain: CustomDomainResponse diff --git a/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainVerify.tsx b/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainVerify.tsx index 0303780c27..b997187367 100644 --- a/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainVerify.tsx +++ b/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainVerify.tsx @@ -1,12 +1,4 @@ import { useParams } from 'common' -import { DocsButton } from 'components/ui/DocsButton' -import { InlineLink } from 'components/ui/InlineLink' -import Panel from 'components/ui/Panel' -import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' -import { useCustomDomainDeleteMutation } from 'data/custom-domains/custom-domains-delete-mutation' -import { useCustomDomainsQuery } from 'data/custom-domains/custom-domains-query' -import { useCustomDomainReverifyQuery } from 'data/custom-domains/custom-domains-reverify-query' -import { DOCS_URL } from 'lib/constants' import { AlertCircle, RefreshCw } from 'lucide-react' import { useEffect } from 'react' import { toast } from 'sonner' @@ -21,6 +13,14 @@ import { Admonition } from 'ui-patterns/admonition' import DNSRecord from './DNSRecord' import { DNSTableHeaders } from './DNSTableHeaders' +import { DocsButton } from '@/components/ui/DocsButton' +import { InlineLink } from '@/components/ui/InlineLink' +import Panel from '@/components/ui/Panel' +import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' +import { useCustomDomainDeleteMutation } from '@/data/custom-domains/custom-domains-delete-mutation' +import { useCustomDomainsQuery } from '@/data/custom-domains/custom-domains-query' +import { useCustomDomainReverifyQuery } from '@/data/custom-domains/custom-domains-reverify-query' +import { DOCS_URL } from '@/lib/constants' export const CustomDomainVerify = () => { const { ref: projectRef } = useParams() diff --git a/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainsConfigureHostname.tsx b/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainsConfigureHostname.tsx index 6540d69929..a20f1fcb43 100644 --- a/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainsConfigureHostname.tsx +++ b/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainsConfigureHostname.tsx @@ -1,14 +1,6 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import CopyButton from 'components/ui/CopyButton' -import { DocsButton } from 'components/ui/DocsButton' -import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' -import { useCheckCNAMERecordMutation } from 'data/custom-domains/check-cname-mutation' -import { useCustomDomainCreateMutation } from 'data/custom-domains/custom-domains-create-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import { useForm } from 'react-hook-form' import { Button, @@ -25,6 +17,15 @@ import { import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { z } from 'zod' +import CopyButton from '@/components/ui/CopyButton' +import { DocsButton } from '@/components/ui/DocsButton' +import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' +import { useCheckCNAMERecordMutation } from '@/data/custom-domains/check-cname-mutation' +import { useCustomDomainCreateMutation } from '@/data/custom-domains/custom-domains-create-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' + const schema = z.object({ domain: z.string().trim().min(1, 'A value for your custom domain is required'), }) diff --git a/apps/studio/components/interfaces/Settings/General/DeleteProjectPanel/DeleteProjectButton.tsx b/apps/studio/components/interfaces/Settings/General/DeleteProjectPanel/DeleteProjectButton.tsx index 11031ac033..bda6c0a4ca 100644 --- a/apps/studio/components/interfaces/Settings/General/DeleteProjectPanel/DeleteProjectButton.tsx +++ b/apps/studio/components/interfaces/Settings/General/DeleteProjectPanel/DeleteProjectButton.tsx @@ -1,10 +1,10 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useState } from 'react' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { DeleteProjectModal } from './DeleteProjectModal' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export interface DeleteProjectButtonProps { type?: 'danger' | 'default' diff --git a/apps/studio/components/interfaces/Settings/General/DeleteProjectPanel/DeleteProjectModal.tsx b/apps/studio/components/interfaces/Settings/General/DeleteProjectPanel/DeleteProjectModal.tsx index 3a54b3e8ba..b4b9f51271 100644 --- a/apps/studio/components/interfaces/Settings/General/DeleteProjectPanel/DeleteProjectModal.tsx +++ b/apps/studio/components/interfaces/Settings/General/DeleteProjectPanel/DeleteProjectModal.tsx @@ -1,19 +1,20 @@ import { LOCAL_STORAGE_KEYS } from 'common' -import { CANCELLATION_REASONS } from 'components/interfaces/Billing/Billing.constants' -import { TextConfirmModal } from 'components/ui/TextConfirmModalWrapper' -import { useSendDowngradeFeedbackMutation } from 'data/feedback/exit-survey-send' -import type { OrgProject } from 'data/projects/org-projects-infinite-query' -import { useProjectDeleteMutation } from 'data/projects/project-delete-mutation' -import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { useRouter } from 'next/router' import { useEffect, useState } from 'react' import { toast } from 'sonner' -import type { Organization } from 'types' import { Input } from 'ui' +import { CANCELLATION_REASONS } from '@/components/interfaces/Billing/Billing.constants' +import { TextConfirmModal } from '@/components/ui/TextConfirmModalWrapper' +import { useSendDowngradeFeedbackMutation } from '@/data/feedback/exit-survey-send' +import type { OrgProject } from '@/data/projects/org-projects-infinite-query' +import { useProjectDeleteMutation } from '@/data/projects/project-delete-mutation' +import { useOrgSubscriptionQuery } from '@/data/subscriptions/org-subscription-query' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import type { Organization } from '@/types' + export const DeleteProjectModal = ({ visible, onClose, diff --git a/apps/studio/components/interfaces/Settings/General/DeleteProjectPanel/DeleteProjectPanel.tsx b/apps/studio/components/interfaces/Settings/General/DeleteProjectPanel/DeleteProjectPanel.tsx index 2182e4e6ab..95f6d35bc6 100644 --- a/apps/studio/components/interfaces/Settings/General/DeleteProjectPanel/DeleteProjectPanel.tsx +++ b/apps/studio/components/interfaces/Settings/General/DeleteProjectPanel/DeleteProjectPanel.tsx @@ -1,6 +1,4 @@ -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { AlertDescription_Shadcn_, AlertTitle_Shadcn_, Alert_Shadcn_, CriticalIcon } from 'ui' +import { Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, CriticalIcon } from 'ui' import { PageSection, PageSectionContent, @@ -9,7 +7,10 @@ import { PageSectionSummary, PageSectionTitle, } from 'ui-patterns/PageSection' + import { DeleteProjectButton } from './DeleteProjectButton' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export const DeleteProjectPanel = () => { const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Settings/General/General.tsx b/apps/studio/components/interfaces/Settings/General/General.tsx index 6b03ea3d33..2986890425 100644 --- a/apps/studio/components/interfaces/Settings/General/General.tsx +++ b/apps/studio/components/interfaces/Settings/General/General.tsx @@ -1,8 +1,5 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { useProjectUpdateMutation } from 'data/projects/project-update-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import Link from 'next/link' import { useForm } from 'react-hook-form' import { toast } from 'sonner' @@ -33,6 +30,9 @@ import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import * as z from 'zod' import { ProjectAccessSection } from './ProjectAccessSection' +import { useProjectUpdateMutation } from '@/data/projects/project-update-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export const General = () => { const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Settings/General/General.utils.ts b/apps/studio/components/interfaces/Settings/General/General.utils.ts index 0bef111875..d4111be7b5 100644 --- a/apps/studio/components/interfaces/Settings/General/General.utils.ts +++ b/apps/studio/components/interfaces/Settings/General/General.utils.ts @@ -1,8 +1,8 @@ import type { OrganizationRole, OrganizationRolesResponse, -} from 'data/organization-members/organization-roles-query' -import type { OrganizationMember } from 'data/organizations/organization-members-query' +} from '@/data/organization-members/organization-roles-query' +import type { OrganizationMember } from '@/data/organizations/organization-members-query' export interface ProjectAccessMember { id: string diff --git a/apps/studio/components/interfaces/Settings/General/Infrastructure/PauseProjectButton.tsx b/apps/studio/components/interfaces/Settings/General/Infrastructure/PauseProjectButton.tsx index e59a59a036..b2d812943c 100644 --- a/apps/studio/components/interfaces/Settings/General/Infrastructure/PauseProjectButton.tsx +++ b/apps/studio/components/interfaces/Settings/General/Infrastructure/PauseProjectButton.tsx @@ -1,18 +1,18 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useSetProjectStatus } from 'data/projects/project-detail-query' -import { useProjectPauseMutation } from 'data/projects/project-pause-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useIsProjectActive, useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { PROJECT_STATUS } from 'lib/constants' import { Pause } from 'lucide-react' import { useRouter } from 'next/router' import { useState } from 'react' import { toast } from 'sonner' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useSetProjectStatus } from '@/data/projects/project-detail-query' +import { useProjectPauseMutation } from '@/data/projects/project-pause-mutation' import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useIsProjectActive, useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { PROJECT_STATUS } from '@/lib/constants' const PauseProjectButton = () => { const router = useRouter() diff --git a/apps/studio/components/interfaces/Settings/General/Infrastructure/ProjectUpgradeAlert.tsx b/apps/studio/components/interfaces/Settings/General/Infrastructure/ProjectUpgradeAlert.tsx index b616e30624..3156f7e1ca 100644 --- a/apps/studio/components/interfaces/Settings/General/Infrastructure/ProjectUpgradeAlert.tsx +++ b/apps/studio/components/interfaces/Settings/General/Infrastructure/ProjectUpgradeAlert.tsx @@ -1,47 +1,47 @@ import { zodResolver } from '@hookform/resolvers/zod' +import { useFlag, useParams } from 'common' import { AlertCircle, AlertTriangle } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import { z } from 'zod' - -import { useFlag, useParams } from 'common' -import { PLAN_DETAILS } from 'components/interfaces/DiskManagement/ui/DiskManagement.constants' -import { Markdown } from 'components/interfaces/Markdown' -import { extractPostgresVersionDetails } from 'components/interfaces/ProjectCreation/PostgresVersionSelector' -import { useDiskAttributesQuery } from 'data/config/disk-attributes-query' -import { - ProjectUpgradeTargetVersion, - useProjectUpgradeEligibilityQuery, -} from 'data/config/project-upgrade-eligibility-query' -import { useSetProjectStatus } from 'data/projects/project-detail-query' -import { useProjectUpgradeMutation } from 'data/projects/project-upgrade-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { DOCS_URL, PROJECT_STATUS } from 'lib/constants' import { + Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, - Alert_Shadcn_, Badge, Button, + Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, - Form_Shadcn_, Modal, + Select_Shadcn_, SelectContent_Shadcn_, SelectGroup_Shadcn_, SelectItem_Shadcn_, SelectTrigger_Shadcn_, SelectValue_Shadcn_, - Select_Shadcn_, Tooltip, TooltipContent, TooltipTrigger, } from 'ui' import { Admonition } from 'ui-patterns/admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import { z } from 'zod' + +import { PLAN_DETAILS } from '@/components/interfaces/DiskManagement/ui/DiskManagement.constants' +import { Markdown } from '@/components/interfaces/Markdown' +import { extractPostgresVersionDetails } from '@/components/interfaces/ProjectCreation/PostgresVersionSelector' +import { useDiskAttributesQuery } from '@/data/config/disk-attributes-query' +import { + ProjectUpgradeTargetVersion, + useProjectUpgradeEligibilityQuery, +} from '@/data/config/project-upgrade-eligibility-query' +import { useSetProjectStatus } from '@/data/projects/project-detail-query' +import { useProjectUpgradeMutation } from '@/data/projects/project-upgrade-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { DOCS_URL, PROJECT_STATUS } from '@/lib/constants' const formatValue = ({ postgres_version, release_channel }: ProjectUpgradeTargetVersion) => { return `${postgres_version}|${release_channel}` diff --git a/apps/studio/components/interfaces/Settings/General/Infrastructure/RestartServerButton.tsx b/apps/studio/components/interfaces/Settings/General/Infrastructure/RestartServerButton.tsx index ccd3479572..022fc8c4cb 100644 --- a/apps/studio/components/interfaces/Settings/General/Infrastructure/RestartServerButton.tsx +++ b/apps/studio/components/interfaces/Settings/General/Infrastructure/RestartServerButton.tsx @@ -1,17 +1,5 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useFlag } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useSetProjectStatus } from 'data/projects/project-detail-query' -import { useProjectRestartMutation } from 'data/projects/project-restart-mutation' -import { useProjectRestartServicesMutation } from 'data/projects/project-restart-services-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { - useIsAwsK8sCloudProvider, - useIsProjectActive, - useSelectedProjectQuery, -} from 'hooks/misc/useSelectedProject' -import { PROJECT_STATUS } from 'lib/constants' import { ChevronDown } from 'lucide-react' import { useRouter } from 'next/router' import { useState } from 'react' @@ -26,6 +14,19 @@ import { } from 'ui' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useSetProjectStatus } from '@/data/projects/project-detail-query' +import { useProjectRestartMutation } from '@/data/projects/project-restart-mutation' +import { useProjectRestartServicesMutation } from '@/data/projects/project-restart-services-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { + useIsAwsK8sCloudProvider, + useIsProjectActive, + useSelectedProjectQuery, +} from '@/hooks/misc/useSelectedProject' +import { PROJECT_STATUS } from '@/lib/constants' + const RestartServerButton = () => { const router = useRouter() const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Settings/General/ProjectAccessSection.tsx b/apps/studio/components/interfaces/Settings/General/ProjectAccessSection.tsx index dd6c29330a..531a846a24 100644 --- a/apps/studio/components/interfaces/Settings/General/ProjectAccessSection.tsx +++ b/apps/studio/components/interfaces/Settings/General/ProjectAccessSection.tsx @@ -1,9 +1,3 @@ -import AlertError from 'components/ui/AlertError' -import { useOrganizationRolesV2Query } from 'data/organization-members/organization-roles-query' -import { useOrganizationMembersQuery } from 'data/organizations/organization-members-query' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useProfile } from 'lib/profile' import Link from 'next/link' import { Badge, @@ -28,6 +22,12 @@ import { import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { summarizeProjectAccess } from './General.utils' +import AlertError from '@/components/ui/AlertError' +import { useOrganizationRolesV2Query } from '@/data/organization-members/organization-roles-query' +import { useOrganizationMembersQuery } from '@/data/organizations/organization-members-query' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useProfile } from '@/lib/profile' export const ProjectAccessSection = () => { const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Settings/General/TransferProjectPanel/TransferProjectButton.tsx b/apps/studio/components/interfaces/Settings/General/TransferProjectPanel/TransferProjectButton.tsx index b49ef4ef8d..c9f8f49a94 100644 --- a/apps/studio/components/interfaces/Settings/General/TransferProjectPanel/TransferProjectButton.tsx +++ b/apps/studio/components/interfaces/Settings/General/TransferProjectPanel/TransferProjectButton.tsx @@ -1,22 +1,22 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useQueryClient } from '@tanstack/react-query' +import { useFlag } from 'common' import { Loader, Shield, Users, Wrench } from 'lucide-react' import { useEffect, useState } from 'react' import { toast } from 'sonner' - -import { useQueryClient } from '@tanstack/react-query' -import { useFlag } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DocsButton } from 'components/ui/DocsButton' -import { useOrganizationsQuery } from 'data/organizations/organizations-query' -import { projectKeys } from 'data/projects/keys' -import { useProjectTransferMutation } from 'data/projects/project-transfer-mutation' -import { useProjectTransferPreviewQuery } from 'data/projects/project-transfer-preview-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import { Button, InfoIcon, Listbox, Loading, Modal, WarningIcon } from 'ui' import { Admonition } from 'ui-patterns' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DocsButton } from '@/components/ui/DocsButton' +import { useOrganizationsQuery } from '@/data/organizations/organizations-query' +import { projectKeys } from '@/data/projects/keys' +import { useProjectTransferMutation } from '@/data/projects/project-transfer-mutation' +import { useProjectTransferPreviewQuery } from '@/data/projects/project-transfer-preview-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' + export const TransferProjectButton = () => { const { data: project } = useSelectedProjectQuery() const projectRef = project?.ref diff --git a/apps/studio/components/interfaces/Settings/General/TransferProjectPanel/TransferProjectPanel.tsx b/apps/studio/components/interfaces/Settings/General/TransferProjectPanel/TransferProjectPanel.tsx index 072f7cf5bc..231268481b 100644 --- a/apps/studio/components/interfaces/Settings/General/TransferProjectPanel/TransferProjectPanel.tsx +++ b/apps/studio/components/interfaces/Settings/General/TransferProjectPanel/TransferProjectPanel.tsx @@ -1,7 +1,4 @@ import { Truck } from 'lucide-react' - -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { TransferProjectButton } from './TransferProjectButton' import { Card, CardContent } from 'ui' import { PageSection, @@ -12,6 +9,9 @@ import { PageSectionTitle, } from 'ui-patterns/PageSection' +import { TransferProjectButton } from './TransferProjectButton' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' + export const TransferProjectPanel = () => { const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Settings/Infrastructure/Infrastructure.constants.ts b/apps/studio/components/interfaces/Settings/Infrastructure/Infrastructure.constants.ts index 3959d388d5..b2cb9ad13c 100644 --- a/apps/studio/components/interfaces/Settings/Infrastructure/Infrastructure.constants.ts +++ b/apps/studio/components/interfaces/Settings/Infrastructure/Infrastructure.constants.ts @@ -1,4 +1,4 @@ -import { DOCS_URL } from 'lib/constants' +import { DOCS_URL } from '@/lib/constants' export interface Attribute { key: string diff --git a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureActivity.tsx b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureActivity.tsx index eb37178625..a5d13e268b 100644 --- a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureActivity.tsx +++ b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureActivity.tsx @@ -1,44 +1,44 @@ import { useParams } from 'common' -import { getAddons } from 'components/interfaces/Billing/Subscription/Subscription.utils' -import { CPUWarnings } from 'components/interfaces/Billing/Usage/UsageWarningAlerts/CPUWarnings' -import { DiskIOBandwidthWarnings } from 'components/interfaces/Billing/Usage/UsageWarningAlerts/DiskIOBandwidthWarnings' -import { RAMWarnings } from 'components/interfaces/Billing/Usage/UsageWarningAlerts/RAMWarnings' -import UsageBarChart from 'components/interfaces/Organization/Usage/UsageBarChart' +import dayjs from 'dayjs' +import { capitalize } from 'lodash' +import { BarChart2, ExternalLink } from 'lucide-react' +import Link from 'next/link' +import { Fragment, useMemo, useState } from 'react' +import { Admonition } from 'ui-patterns/admonition' +import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' + +import { INFRA_ACTIVITY_METRICS } from './Infrastructure.constants' +import { getAddons } from '@/components/interfaces/Billing/Subscription/Subscription.utils' +import { CPUWarnings } from '@/components/interfaces/Billing/Usage/UsageWarningAlerts/CPUWarnings' +import { DiskIOBandwidthWarnings } from '@/components/interfaces/Billing/Usage/UsageWarningAlerts/DiskIOBandwidthWarnings' +import { RAMWarnings } from '@/components/interfaces/Billing/Usage/UsageWarningAlerts/RAMWarnings' +import UsageBarChart from '@/components/interfaces/Organization/Usage/UsageBarChart' import { ScaffoldContainer, ScaffoldDivider, ScaffoldSection, ScaffoldSectionContent, ScaffoldSectionDetail, -} from 'components/layouts/Scaffold' -import { DatabaseSelector } from 'components/ui/DatabaseSelector' -import { DateRangePicker } from 'components/ui/DateRangePicker' -import { DocsButton } from 'components/ui/DocsButton' -import Panel from 'components/ui/Panel' -import { DataPoint } from 'data/analytics/constants' -import { mapMultiResponseToAnalyticsData } from 'data/analytics/infra-monitoring-queries' +} from '@/components/layouts/Scaffold' +import { DatabaseSelector } from '@/components/ui/DatabaseSelector' +import { DateRangePicker } from '@/components/ui/DateRangePicker' +import { DocsButton } from '@/components/ui/DocsButton' +import Panel from '@/components/ui/Panel' +import { DataPoint } from '@/data/analytics/constants' +import { mapMultiResponseToAnalyticsData } from '@/data/analytics/infra-monitoring-queries' import { InfraMonitoringAttribute, useInfraMonitoringAttributesQuery, -} from 'data/analytics/infra-monitoring-query' -import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' -import { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query' -import { useResourceWarningsQuery } from 'data/usage/resource-warnings-query' -import dayjs from 'dayjs' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL, INSTANCE_MICRO_SPECS, INSTANCE_NANO_SPECS, InstanceSpecs } from 'lib/constants' -import { TIME_PERIODS_BILLING, TIME_PERIODS_REPORTS } from 'lib/constants/metrics' -import { capitalize } from 'lodash' -import { BarChart2, ExternalLink } from 'lucide-react' -import Link from 'next/link' -import { Fragment, useMemo, useState } from 'react' -import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' -import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' -import { Admonition } from 'ui-patterns/admonition' - -import { INFRA_ACTIVITY_METRICS } from './Infrastructure.constants' +} from '@/data/analytics/infra-monitoring-query' +import { useOrgSubscriptionQuery } from '@/data/subscriptions/org-subscription-query' +import { useProjectAddonsQuery } from '@/data/subscriptions/project-addons-query' +import { useResourceWarningsQuery } from '@/data/usage/resource-warnings-query' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL, INSTANCE_MICRO_SPECS, INSTANCE_NANO_SPECS, InstanceSpecs } from '@/lib/constants' +import { TIME_PERIODS_BILLING, TIME_PERIODS_REPORTS } from '@/lib/constants/metrics' +import { useDatabaseSelectorStateSnapshot } from '@/state/database-selector' const NON_DEDICATED_IO_RESOURCES = [ 'ci_micro', diff --git a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/DropAllReplicasConfirmationModal.tsx b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/DropAllReplicasConfirmationModal.tsx index 863f80bed0..b7e8e6d200 100644 --- a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/DropAllReplicasConfirmationModal.tsx +++ b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/DropAllReplicasConfirmationModal.tsx @@ -1,12 +1,12 @@ import { useQueryClient } from '@tanstack/react-query' -import { toast } from 'sonner' - import { useParams } from 'common' -import { replicaKeys } from 'data/read-replicas/keys' -import { useReadReplicaRemoveMutation } from 'data/read-replicas/replica-remove-mutation' -import { useReadReplicasQuery } from 'data/read-replicas/replicas-query' +import { toast } from 'sonner' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' +import { replicaKeys } from '@/data/read-replicas/keys' +import { useReadReplicaRemoveMutation } from '@/data/read-replicas/replica-remove-mutation' +import { useReadReplicasQuery } from '@/data/read-replicas/replicas-query' + interface DropAllReplicasConfirmationModalProps { visible: boolean onSuccess: () => void diff --git a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/DropReplicaConfirmationModal.tsx b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/DropReplicaConfirmationModal.tsx index a427514976..b66f78eebb 100644 --- a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/DropReplicaConfirmationModal.tsx +++ b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/DropReplicaConfirmationModal.tsx @@ -1,13 +1,13 @@ import { useQueryClient } from '@tanstack/react-query' -import { toast } from 'sonner' - -import { replicaKeys } from '@/data/read-replicas/keys' import { useParams } from 'common' -import { useReadReplicaRemoveMutation } from 'data/read-replicas/replica-remove-mutation' -import type { Database } from 'data/read-replicas/replicas-query' -import { formatDatabaseID } from 'data/read-replicas/replicas.utils' +import { toast } from 'sonner' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' + import { REPLICA_STATUS } from './InstanceConfiguration.constants' +import { replicaKeys } from '@/data/read-replicas/keys' +import { useReadReplicaRemoveMutation } from '@/data/read-replicas/replica-remove-mutation' +import type { Database } from '@/data/read-replicas/replicas-query' +import { formatDatabaseID } from '@/data/read-replicas/replicas.utils' interface DropReplicaConfirmationModalProps { selectedReplica?: Database diff --git a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/Edge.tsx b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/Edge.tsx index 99a6b737df..edc2227663 100644 --- a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/Edge.tsx +++ b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/Edge.tsx @@ -1,11 +1,11 @@ import { BaseEdge, Edge, EdgeLabelRenderer, getSmoothStepPath, type EdgeProps } from '@xyflow/react' import { useParams } from 'common' -import { useReplicationLagQuery } from 'data/read-replicas/replica-lag-query' -import { formatDatabaseID } from 'data/read-replicas/replicas.utils' import { Loader2 } from 'lucide-react' import { Tooltip, TooltipContent, TooltipTrigger } from 'ui' import { EdgeData, REPLICA_STATUS } from './InstanceConfiguration.constants' +import { useReplicationLagQuery } from '@/data/read-replicas/replica-lag-query' +import { formatDatabaseID } from '@/data/read-replicas/replicas.utils' export const SmoothstepEdge = ({ id, diff --git a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.constants.ts b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.constants.ts index 70add9f92f..401be52791 100644 --- a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.constants.ts +++ b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.constants.ts @@ -1,10 +1,10 @@ import { ReadReplicaSetupError, ReadReplicaSetupProgress } from '@supabase/shared-types/out/events' - -import { components } from 'data/api' -import { PROJECT_STATUS } from 'lib/constants' import type { AWS_REGIONS_KEYS } from 'shared-data' import { AWS_REGIONS } from 'shared-data' +import { components } from '@/data/api' +import { PROJECT_STATUS } from '@/lib/constants' + export interface Region { key: AWS_REGIONS_KEYS name: string diff --git a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.tsx b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.tsx index b8954694f8..830e597ad4 100644 --- a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.tsx +++ b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.tsx @@ -16,22 +16,6 @@ import { useEffect, useMemo, useState } from 'react' import '@xyflow/react/dist/style.css' import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useLoadBalancersQuery } from 'data/read-replicas/load-balancers-query' -import { Database, useReadReplicasQuery } from 'data/read-replicas/replicas-query' -import { - ReplicaInitializationStatus, - useReadReplicasStatusesQuery, -} from 'data/read-replicas/replicas-status-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { - useIsAwsCloudProvider, - useIsOrioleDb, - useSelectedProjectQuery, -} from 'hooks/misc/useSelectedProject' -import { timeout } from 'lib/helpers' import { useRouter } from 'next/router' import { Button, @@ -51,6 +35,22 @@ import { addRegionNodes, generateNodes, getDagreGraphLayout } from './InstanceCo import { LoadBalancerNode, PrimaryNode, RegionNode, ReplicaNode } from './InstanceNode' import MapView from './MapView' import { RestartReplicaConfirmationModal } from './RestartReplicaConfirmationModal' +import AlertError from '@/components/ui/AlertError' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useLoadBalancersQuery } from '@/data/read-replicas/load-balancers-query' +import { Database, useReadReplicasQuery } from '@/data/read-replicas/replicas-query' +import { + ReplicaInitializationStatus, + useReadReplicasStatusesQuery, +} from '@/data/read-replicas/replicas-status-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { + useIsAwsCloudProvider, + useIsOrioleDb, + useSelectedProjectQuery, +} from '@/hooks/misc/useSelectedProject' +import { timeout } from '@/lib/helpers' interface InstanceConfigurationUIProps { diagramOnly?: boolean diff --git a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.utils.ts b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.utils.ts index 2aa8c64142..f7d9022e64 100644 --- a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.utils.ts +++ b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.utils.ts @@ -1,7 +1,5 @@ import dagre from '@dagrejs/dagre' import { Edge, Node, Position } from '@xyflow/react' -import type { LoadBalancer } from 'data/read-replicas/load-balancers-query' -import type { Database } from 'data/read-replicas/replicas-query' import { groupBy } from 'lodash' import { AWS_REGIONS, AWS_REGIONS_KEYS } from 'shared-data' @@ -13,6 +11,8 @@ import { NODE_WIDTH, ReplicaNodeData, } from './InstanceConfiguration.constants' +import type { LoadBalancer } from '@/data/read-replicas/load-balancers-query' +import type { Database } from '@/data/read-replicas/replicas-query' // [Joshen] Just FYI the nodes generation assumes each project only has one load balancer // Will need to change if this eventually becomes otherwise diff --git a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceNode.tsx b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceNode.tsx index 3055ecbb13..30fb3142c4 100644 --- a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceNode.tsx +++ b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceNode.tsx @@ -1,15 +1,6 @@ import { Handle, Node, NodeProps, Position } from '@xyflow/react' import { useParams } from 'common' -import SparkBar from 'components/ui/SparkBar' -import { - DatabaseInitEstimations, - ReplicaInitializationStatus, - useReadReplicasStatusesQuery, -} from 'data/read-replicas/replicas-status-query' -import { formatDatabaseID } from 'data/read-replicas/replicas.utils' import dayjs from 'dayjs' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { BASE_PATH } from 'lib/constants' import { Database, DatabaseBackup, HelpCircle, Loader2, MoreVertical } from 'lucide-react' import Link from 'next/link' import { parseAsBoolean, parseAsString, useQueryStates } from 'nuqs' @@ -38,6 +29,15 @@ import { ReplicaNodeData, } from './InstanceConfiguration.constants' import { formatSeconds } from './InstanceConfiguration.utils' +import SparkBar from '@/components/ui/SparkBar' +import { + DatabaseInitEstimations, + ReplicaInitializationStatus, + useReadReplicasStatusesQuery, +} from '@/data/read-replicas/replicas-status-query' +import { formatDatabaseID } from '@/data/read-replicas/replicas.utils' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { BASE_PATH } from '@/lib/constants' import { useDatabaseSelectorStateSnapshot } from '@/state/database-selector' export const LoadBalancerNode = ({ data }: NodeProps>) => { diff --git a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/MapView.tsx b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/MapView.tsx index 225cd7f2ce..805c51272f 100644 --- a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/MapView.tsx +++ b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/MapView.tsx @@ -1,4 +1,5 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import dayjs from 'dayjs' import { partition, uniqBy } from 'lodash' import { MoreVertical } from 'lucide-react' @@ -13,17 +14,7 @@ import { Marker, ZoomableGroup, } from 'react-simple-maps' - -import { useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DropdownMenuItemTooltip } from 'components/ui/DropdownMenuItemTooltip' -import { Database, useReadReplicasQuery } from 'data/read-replicas/replicas-query' -import { formatDatabaseID } from 'data/read-replicas/replicas.utils' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { BASE_PATH } from 'lib/constants' import type { AWS_REGIONS_KEYS } from 'shared-data' -import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' import { Badge, Button, @@ -34,8 +25,17 @@ import { DropdownMenuTrigger, ScrollArea, } from 'ui' + import { AVAILABLE_REPLICA_REGIONS, REPLICA_STATUS } from './InstanceConfiguration.constants' import GeographyData from './MapData.json' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DropdownMenuItemTooltip } from '@/components/ui/DropdownMenuItemTooltip' +import { Database, useReadReplicasQuery } from '@/data/read-replicas/replicas-query' +import { formatDatabaseID } from '@/data/read-replicas/replicas.utils' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { BASE_PATH } from '@/lib/constants' +import { useDatabaseSelectorStateSnapshot } from '@/state/database-selector' // [Joshen] Foresee that we'll skip this view for initial launch diff --git a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/RestartReplicaConfirmationModal.tsx b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/RestartReplicaConfirmationModal.tsx index 9d3a52abda..c6f99f98dc 100644 --- a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/RestartReplicaConfirmationModal.tsx +++ b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/RestartReplicaConfirmationModal.tsx @@ -1,13 +1,13 @@ -import { toast } from 'sonner' - import { useQueryClient } from '@tanstack/react-query' import { useParams } from 'common' -import { useProjectRestartMutation } from 'data/projects/project-restart-mutation' -import { replicaKeys } from 'data/read-replicas/keys' -import { Database } from 'data/read-replicas/replicas-query' -import { formatDatabaseID } from 'data/read-replicas/replicas.utils' +import { toast } from 'sonner' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' + import { REPLICA_STATUS } from './InstanceConfiguration.constants' +import { useProjectRestartMutation } from '@/data/projects/project-restart-mutation' +import { replicaKeys } from '@/data/read-replicas/keys' +import { Database } from '@/data/read-replicas/replicas-query' +import { formatDatabaseID } from '@/data/read-replicas/replicas.utils' interface RestartReplicaConfirmationModalProps { selectedReplica?: Database diff --git a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureInfo.tsx b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureInfo.tsx index 5a8a523cda..8be122a01b 100644 --- a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureInfo.tsx +++ b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureInfo.tsx @@ -1,18 +1,4 @@ import { useParams } from 'common' -import { NoticeBar } from 'components/interfaces/DiskManagement/ui/NoticeBar' -import { - ScaffoldContainer, - ScaffoldDivider, - ScaffoldSection, - ScaffoldSectionContent, - ScaffoldSectionDetail, -} from 'components/layouts/Scaffold' -import AlertError from 'components/ui/AlertError' -import { useProjectUpgradeEligibilityQuery } from 'data/config/project-upgrade-eligibility-query' -import { useProjectServiceVersionsQuery } from 'data/projects/project-service-versions' -import { useReadReplicasQuery } from 'data/read-replicas/replicas-query' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useIsOrioleDb, useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import Link from 'next/link' import { Badge, Button, Input, Tooltip, TooltipContent, TooltipTrigger } from 'ui' import { Admonition } from 'ui-patterns/admonition' @@ -20,6 +6,20 @@ import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { ProjectUpgradeAlert } from '../General/Infrastructure/ProjectUpgradeAlert' import { ReadReplicasWarning, ValidationErrorsWarning } from './UpgradeWarnings' +import { NoticeBar } from '@/components/interfaces/DiskManagement/ui/NoticeBar' +import { + ScaffoldContainer, + ScaffoldDivider, + ScaffoldSection, + ScaffoldSectionContent, + ScaffoldSectionDetail, +} from '@/components/layouts/Scaffold' +import AlertError from '@/components/ui/AlertError' +import { useProjectUpgradeEligibilityQuery } from '@/data/config/project-upgrade-eligibility-query' +import { useProjectServiceVersionsQuery } from '@/data/projects/project-service-versions' +import { useReadReplicasQuery } from '@/data/read-replicas/replicas-query' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useIsOrioleDb, useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export const InfrastructureInfo = () => { const { ref } = useParams() diff --git a/apps/studio/components/interfaces/Settings/Infrastructure/UpgradeWarnings.tsx b/apps/studio/components/interfaces/Settings/Infrastructure/UpgradeWarnings.tsx index 9b72003c60..f46f83cfe8 100644 --- a/apps/studio/components/interfaces/Settings/Infrastructure/UpgradeWarnings.tsx +++ b/apps/studio/components/interfaces/Settings/Infrastructure/UpgradeWarnings.tsx @@ -1,11 +1,11 @@ import { useParams } from 'common' -import { InlineLink } from 'components/ui/InlineLink' -import { DOCS_URL } from 'lib/constants' import Link from 'next/link' import { Button } from 'ui' import { Admonition } from 'ui-patterns/admonition' +import { InlineLink } from '@/components/ui/InlineLink' import { ProjectUpgradeEligibilityValidationError } from '@/data/config/project-upgrade-eligibility-query' +import { DOCS_URL } from '@/lib/constants' export const ReadReplicasWarning = ({ latestPgVersion }: { latestPgVersion: string }) => { const { ref } = useParams() diff --git a/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLinkAccountItem.tsx b/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLinkAccountItem.tsx index 25faef9cdd..2259dc01be 100644 --- a/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLinkAccountItem.tsx +++ b/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLinkAccountItem.tsx @@ -1,5 +1,4 @@ import { Edit, MoreVertical, Trash } from 'lucide-react' - import { Badge, Button, diff --git a/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLinkForm.tsx b/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLinkForm.tsx index a32d4791e8..52b532047f 100644 --- a/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLinkForm.tsx +++ b/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLinkForm.tsx @@ -2,18 +2,12 @@ import Link from 'next/link' import { useEffect } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' - -import { InlineLink } from 'components/ui/InlineLink' -import { useAWSAccountCreateMutation } from 'data/aws-accounts/aws-account-create-mutation' -import type { AWSAccount } from 'data/aws-accounts/aws-accounts-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import { Badge, Button, + Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, - Form_Shadcn_, Input_Shadcn_, Sheet, SheetContent, @@ -26,6 +20,12 @@ import { import { Admonition } from 'ui-patterns' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import { InlineLink } from '@/components/ui/InlineLink' +import { useAWSAccountCreateMutation } from '@/data/aws-accounts/aws-account-create-mutation' +import type { AWSAccount } from '@/data/aws-accounts/aws-accounts-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' + interface AWSPrivateLinkFormProps { account?: AWSAccount open: boolean diff --git a/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLinkSection.tsx b/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLinkSection.tsx index 7d10ab43f2..b957acfa68 100644 --- a/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLinkSection.tsx +++ b/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLinkSection.tsx @@ -1,24 +1,24 @@ import { useState } from 'react' import { toast } from 'sonner' +import { Button, Card, CardContent, cn } from 'ui' +import { ConfirmationModal } from 'ui-patterns/Dialogs/ConfirmationModal' +import { IntegrationImageHandler } from '../IntegrationsSettings' +import { AWSPrivateLinkAccountItem } from './AWSPrivateLinkAccountItem' +import { AWSPrivateLinkForm } from './AWSPrivateLinkForm' import { ScaffoldContainer, ScaffoldSection, ScaffoldSectionContent, ScaffoldSectionDetail, -} from 'components/layouts/Scaffold' -import { ResourceList } from 'components/ui/Resource/ResourceList' -import { UpgradeToPro } from 'components/ui/UpgradeToPro' -import { useAWSAccountDeleteMutation } from 'data/aws-accounts/aws-account-delete-mutation' -import { useAWSAccountsQuery } from 'data/aws-accounts/aws-accounts-query' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { IS_PLATFORM } from 'lib/constants' -import { Button, Card, CardContent, cn } from 'ui' -import { ConfirmationModal } from 'ui-patterns/Dialogs/ConfirmationModal' -import { IntegrationImageHandler } from '../IntegrationsSettings' -import { AWSPrivateLinkAccountItem } from './AWSPrivateLinkAccountItem' -import { AWSPrivateLinkForm } from './AWSPrivateLinkForm' +} from '@/components/layouts/Scaffold' +import { ResourceList } from '@/components/ui/Resource/ResourceList' +import { UpgradeToPro } from '@/components/ui/UpgradeToPro' +import { useAWSAccountDeleteMutation } from '@/data/aws-accounts/aws-account-delete-mutation' +import { useAWSAccountsQuery } from '@/data/aws-accounts/aws-accounts-query' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { IS_PLATFORM } from '@/lib/constants' export const AWSPrivateLinkSection = () => { const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Settings/Integrations/GithubIntegration/GitHubStatus.tsx b/apps/studio/components/interfaces/Settings/Integrations/GithubIntegration/GitHubStatus.tsx index f14fa572b8..5aa2bc4115 100644 --- a/apps/studio/components/interfaces/Settings/Integrations/GithubIntegration/GitHubStatus.tsx +++ b/apps/studio/components/interfaces/Settings/Integrations/GithubIntegration/GitHubStatus.tsx @@ -1,15 +1,15 @@ +import { useParams } from 'common' import { AlertCircle, ArrowUpRight, CheckCircle2 } from 'lucide-react' import Image from 'next/image' import Link from 'next/link' - -import { useParams } from 'common' -import { useBranchesQuery } from 'data/branches/branches-query' -import { useGitHubConnectionsQuery } from 'data/integrations/github-connections-query' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { BASE_PATH } from 'lib/constants' import { HoverCard, HoverCardContent, HoverCardTrigger } from 'ui' +import { useBranchesQuery } from '@/data/branches/branches-query' +import { useGitHubConnectionsQuery } from '@/data/integrations/github-connections-query' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { BASE_PATH } from '@/lib/constants' + export const GitHubStatus = () => { const { ref: projectRef } = useParams() const { data: selectedProject } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Settings/Integrations/IntegrationsSettings.tsx b/apps/studio/components/interfaces/Settings/Integrations/IntegrationsSettings.tsx index b64cbfe56e..4e25ff414c 100644 --- a/apps/studio/components/interfaces/Settings/Integrations/IntegrationsSettings.tsx +++ b/apps/studio/components/interfaces/Settings/Integrations/IntegrationsSettings.tsx @@ -1,15 +1,15 @@ -import { SidePanelVercelProjectLinker } from 'components/interfaces/Organization/IntegrationSettings/SidePanelVercelProjectLinker' -import { ScaffoldContainer, ScaffoldDivider } from 'components/layouts/Scaffold' -import { useProjectDetailQuery } from 'data/projects/project-detail-query' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { BASE_PATH } from 'lib/constants' import Link from 'next/link' import { Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, WarningIcon } from 'ui' import { AWSPrivateLinkSection } from './AWSPrivateLink/AWSPrivateLinkSection' import { GitHubSection } from './GithubIntegration/GithubSection' import { VercelSection } from './VercelIntegration/VercelSection' +import { SidePanelVercelProjectLinker } from '@/components/interfaces/Organization/IntegrationSettings/SidePanelVercelProjectLinker' +import { ScaffoldContainer, ScaffoldDivider } from '@/components/layouts/Scaffold' +import { useProjectDetailQuery } from '@/data/projects/project-detail-query' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { BASE_PATH } from '@/lib/constants' export const IntegrationImageHandler = ({ title }: { title: 'vercel' | 'github' | 'aws' }) => { return ( diff --git a/apps/studio/components/interfaces/Settings/Integrations/VercelIntegration/VercelIntegrationConnectionForm.tsx b/apps/studio/components/interfaces/Settings/Integrations/VercelIntegration/VercelIntegrationConnectionForm.tsx index 688cf480c3..e81a5e0c21 100644 --- a/apps/studio/components/interfaces/Settings/Integrations/VercelIntegration/VercelIntegrationConnectionForm.tsx +++ b/apps/studio/components/interfaces/Settings/Integrations/VercelIntegration/VercelIntegrationConnectionForm.tsx @@ -1,32 +1,32 @@ import { zodResolver } from '@hookform/resolvers/zod' +import Link from 'next/link' import { useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' - -import { FormActions } from 'components/ui/Forms/FormActions' -import type { - EnvironmentTargets, - Integration, - IntegrationProjectConnection, -} from 'data/integrations/integrations.types' -import { useVercelConnectionUpdateMutation } from 'data/integrations/vercel-connection-update-mutate' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { DOCS_URL } from 'lib/constants' -import Link from 'next/link' import { + Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, - Alert_Shadcn_, + Form_Shadcn_, FormControl_Shadcn_, FormDescription_Shadcn_, FormField_Shadcn_, FormItem_Shadcn_, FormLabel_Shadcn_, FormMessage_Shadcn_, - Form_Shadcn_, Input_Shadcn_, Switch, } from 'ui' +import * as z from 'zod' + +import { FormActions } from '@/components/ui/Forms/FormActions' +import type { + EnvironmentTargets, + Integration, + IntegrationProjectConnection, +} from '@/data/integrations/integrations.types' +import { useVercelConnectionUpdateMutation } from '@/data/integrations/vercel-connection-update-mutate' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { DOCS_URL } from '@/lib/constants' const VercelIntegrationConnectionForm = ({ disabled, diff --git a/apps/studio/components/interfaces/Settings/Integrations/VercelIntegration/VercelSection.tsx b/apps/studio/components/interfaces/Settings/Integrations/VercelIntegration/VercelSection.tsx index 548b152720..3bffb8b81f 100644 --- a/apps/studio/components/interfaces/Settings/Integrations/VercelIntegration/VercelSection.tsx +++ b/apps/studio/components/interfaces/Settings/Integrations/VercelIntegration/VercelSection.tsx @@ -1,41 +1,41 @@ +import { PermissionAction } from '@supabase/shared-types/out/constants' import { ExternalLink } from 'lucide-react' import Link from 'next/link' import { useCallback, useMemo } from 'react' import { toast } from 'sonner' +import { Button, cn } from 'ui' +import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' -import { PermissionAction } from '@supabase/shared-types/out/constants' -import { IntegrationConnectionItem } from 'components/interfaces/Integrations/VercelGithub/IntegrationConnection' +import { IntegrationImageHandler } from '../IntegrationsSettings' +import VercelIntegrationConnectionForm from './VercelIntegrationConnectionForm' +import { IntegrationConnectionItem } from '@/components/interfaces/Integrations/VercelGithub/IntegrationConnection' import { EmptyIntegrationConnection, IntegrationConnectionHeader, IntegrationInstallation, -} from 'components/interfaces/Integrations/VercelGithub/IntegrationPanels' -import { Markdown } from 'components/interfaces/Markdown' +} from '@/components/interfaces/Integrations/VercelGithub/IntegrationPanels' +import { Markdown } from '@/components/interfaces/Markdown' import { ScaffoldContainer, ScaffoldSection, ScaffoldSectionContent, ScaffoldSectionDetail, -} from 'components/layouts/Scaffold' -import NoPermission from 'components/ui/NoPermission' -import { useOrgIntegrationsQuery } from 'data/integrations/integrations-query-org-only' -import { useIntegrationsVercelInstalledConnectionDeleteMutation } from 'data/integrations/integrations-vercel-installed-connection-delete-mutation' -import { useVercelProjectsQuery } from 'data/integrations/integrations-vercel-projects-query' +} from '@/components/layouts/Scaffold' +import NoPermission from '@/components/ui/NoPermission' +import { useOrgIntegrationsQuery } from '@/data/integrations/integrations-query-org-only' +import { useIntegrationsVercelInstalledConnectionDeleteMutation } from '@/data/integrations/integrations-vercel-installed-connection-delete-mutation' +import { useVercelProjectsQuery } from '@/data/integrations/integrations-vercel-projects-query' import type { Integration, IntegrationName, IntegrationProjectConnection, -} from 'data/integrations/integrations.types' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { pluralize } from 'lib/helpers' -import { getIntegrationConfigurationUrl } from 'lib/integration-utils' -import { useSidePanelsStateSnapshot } from 'state/side-panels' -import { Button, cn } from 'ui' -import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' -import { IntegrationImageHandler } from '../IntegrationsSettings' -import VercelIntegrationConnectionForm from './VercelIntegrationConnectionForm' +} from '@/data/integrations/integrations.types' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { pluralize } from '@/lib/helpers' +import { getIntegrationConfigurationUrl } from '@/lib/integration-utils' +import { useSidePanelsStateSnapshot } from '@/state/side-panels' export const VercelSection = ({ isProjectScoped }: { isProjectScoped: boolean }) => { const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Settings/Logs/ErrorCodeDialog.tsx b/apps/studio/components/interfaces/Settings/Logs/ErrorCodeDialog.tsx index 7ba173ef1e..04d6cb0d1b 100644 --- a/apps/studio/components/interfaces/Settings/Logs/ErrorCodeDialog.tsx +++ b/apps/studio/components/interfaces/Settings/Logs/ErrorCodeDialog.tsx @@ -1,5 +1,3 @@ -import { useErrorCodesQuery } from 'data/content-api/docs-error-codes-query' -import { type ErrorCodeQueryQuery, Service } from 'data/graphql/graphql' import { AlertTriangle } from 'lucide-react' import { Alert_Shadcn_, @@ -15,6 +13,9 @@ import { } from 'ui' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' +import { useErrorCodesQuery } from '@/data/content-api/docs-error-codes-query' +import { Service, type ErrorCodeQueryQuery } from '@/data/graphql/graphql' + interface ErrorCodeDialogProps { open: boolean onOpenChange: (open: boolean) => void diff --git a/apps/studio/components/interfaces/Settings/Logs/LogColumnRenderers/AuthColumnRenderer.tsx b/apps/studio/components/interfaces/Settings/Logs/LogColumnRenderers/AuthColumnRenderer.tsx index ce42ab399d..5e7ac8a052 100644 --- a/apps/studio/components/interfaces/Settings/Logs/LogColumnRenderers/AuthColumnRenderer.tsx +++ b/apps/studio/components/interfaces/Settings/Logs/LogColumnRenderers/AuthColumnRenderer.tsx @@ -1,9 +1,9 @@ import { Column } from 'react-data-grid' +import { TimestampInfo } from 'ui-patterns/TimestampInfo' import type { LogData } from '../Logs.types' import { RowLayout, SeverityFormatter, TextFormatter } from '../LogsFormatters' import { defaultRenderCell } from './DefaultPreviewColumnRenderer' -import { TimestampInfo } from 'ui-patterns/TimestampInfo' const columns: Column[] = [ { diff --git a/apps/studio/components/interfaces/Settings/Logs/LogColumnRenderers/DatabaseApiColumnRender.tsx b/apps/studio/components/interfaces/Settings/Logs/LogColumnRenderers/DatabaseApiColumnRender.tsx index 181fa69526..c127103854 100644 --- a/apps/studio/components/interfaces/Settings/Logs/LogColumnRenderers/DatabaseApiColumnRender.tsx +++ b/apps/studio/components/interfaces/Settings/Logs/LogColumnRenderers/DatabaseApiColumnRender.tsx @@ -1,10 +1,11 @@ import { Column } from 'react-data-grid' -import { Service } from 'data/graphql/graphql' +import { TimestampInfo } from 'ui-patterns/TimestampInfo' + import type { LogData } from '../Logs.types' import { ResponseCodeFormatter, RowLayout, TextFormatter } from '../LogsFormatters' import { defaultRenderCell } from './DefaultPreviewColumnRenderer' -import { TimestampInfo } from 'ui-patterns/TimestampInfo' -import { ErrorCodeTooltip } from 'components/ui/ErrorCodeTooltip/ErrorCodeTooltip' +import { ErrorCodeTooltip } from '@/components/ui/ErrorCodeTooltip/ErrorCodeTooltip' +import { Service } from '@/data/graphql/graphql' const columns: Column[] = [ { diff --git a/apps/studio/components/interfaces/Settings/Logs/LogColumnRenderers/DatabasePostgresColumnRender.tsx b/apps/studio/components/interfaces/Settings/Logs/LogColumnRenderers/DatabasePostgresColumnRender.tsx index 85df191c40..5151210fc2 100644 --- a/apps/studio/components/interfaces/Settings/Logs/LogColumnRenderers/DatabasePostgresColumnRender.tsx +++ b/apps/studio/components/interfaces/Settings/Logs/LogColumnRenderers/DatabasePostgresColumnRender.tsx @@ -1,8 +1,9 @@ import { Column } from 'react-data-grid' +import { TimestampInfo } from 'ui-patterns/TimestampInfo' + import type { LogData } from '../Logs.types' import { RowLayout, SeverityFormatter, TextFormatter } from '../LogsFormatters' import { defaultRenderCell } from './DefaultPreviewColumnRenderer' -import { TimestampInfo } from 'ui-patterns/TimestampInfo' const columns: Column[] = [ { diff --git a/apps/studio/components/interfaces/Settings/Logs/LogColumnRenderers/DefaultPreviewColumnRenderer.tsx b/apps/studio/components/interfaces/Settings/Logs/LogColumnRenderers/DefaultPreviewColumnRenderer.tsx index dc828c1f26..69b1489d94 100644 --- a/apps/studio/components/interfaces/Settings/Logs/LogColumnRenderers/DefaultPreviewColumnRenderer.tsx +++ b/apps/studio/components/interfaces/Settings/Logs/LogColumnRenderers/DefaultPreviewColumnRenderer.tsx @@ -1,7 +1,8 @@ import { Column, RenderCellProps } from 'react-data-grid' +import { TimestampInfo } from 'ui-patterns/TimestampInfo' + import type { LogData } from '../Logs.types' import { RowLayout, TextFormatter } from '../LogsFormatters' -import { TimestampInfo } from 'ui-patterns/TimestampInfo' export const defaultRenderCell = (props: RenderCellProps) => ( diff --git a/apps/studio/components/interfaces/Settings/Logs/LogColumnRenderers/FunctionsLogsColumnRender.tsx b/apps/studio/components/interfaces/Settings/Logs/LogColumnRenderers/FunctionsLogsColumnRender.tsx index ef55144445..25969d5188 100644 --- a/apps/studio/components/interfaces/Settings/Logs/LogColumnRenderers/FunctionsLogsColumnRender.tsx +++ b/apps/studio/components/interfaces/Settings/Logs/LogColumnRenderers/FunctionsLogsColumnRender.tsx @@ -1,8 +1,9 @@ import { Column } from 'react-data-grid' +import { TimestampInfo } from 'ui-patterns/TimestampInfo' + import type { LogData } from '../Logs.types' import { RowLayout, SeverityFormatter, TextFormatter } from '../LogsFormatters' import { defaultRenderCell } from './DefaultPreviewColumnRenderer' -import { TimestampInfo } from 'ui-patterns/TimestampInfo' const columns: Column[] = [ { diff --git a/apps/studio/components/interfaces/Settings/Logs/LogSelection.tsx b/apps/studio/components/interfaces/Settings/Logs/LogSelection.tsx index 2aaa77717c..4c39e489e1 100644 --- a/apps/studio/components/interfaces/Settings/Logs/LogSelection.tsx +++ b/apps/studio/components/interfaces/Settings/Logs/LogSelection.tsx @@ -1,4 +1,3 @@ -import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { Check, Copy, MousePointerClick, X } from 'lucide-react' import { useEffect, useState } from 'react' import { @@ -16,6 +15,7 @@ import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import type { LogData, QueryType } from './Logs.types' import { apiKey, role as extractRole, jwtAPIKey } from './Logs.utils' import DefaultPreviewSelectionRenderer from './LogSelectionRenderers/DefaultPreviewSelectionRenderer' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' export interface LogSelectionProps { log?: LogData diff --git a/apps/studio/components/interfaces/Settings/Logs/LogSelectionRenderers/DefaultPreviewSelectionRenderer.tsx b/apps/studio/components/interfaces/Settings/Logs/LogSelectionRenderers/DefaultPreviewSelectionRenderer.tsx index d50736fe28..ea46e785e8 100644 --- a/apps/studio/components/interfaces/Settings/Logs/LogSelectionRenderers/DefaultPreviewSelectionRenderer.tsx +++ b/apps/studio/components/interfaces/Settings/Logs/LogSelectionRenderers/DefaultPreviewSelectionRenderer.tsx @@ -1,5 +1,3 @@ -import { Service } from 'data/graphql/graphql' -import { useLogsUrlState } from 'hooks/analytics/useLogsUrlState' import { useEffect, useState } from 'react' import { toast } from 'sonner' import { @@ -15,9 +13,11 @@ import { import { TimestampInfo } from 'ui-patterns' import { ErrorCodeDialog } from '../ErrorCodeDialog' -import { ErrorCodeTooltip } from 'components/ui/ErrorCodeTooltip/ErrorCodeTooltip' import type { LogSearchCallback, PreviewLogData } from '../Logs.types' import { ResponseCodeFormatter } from '../LogsFormatters' +import { ErrorCodeTooltip } from '@/components/ui/ErrorCodeTooltip/ErrorCodeTooltip' +import { Service } from '@/data/graphql/graphql' +import { useLogsUrlState } from '@/hooks/analytics/useLogsUrlState' const LogRowCodeBlock = ({ value, className }: { value: string; className?: string }) => (
 = ({ error, isCustomQuery }) => (
diff --git a/apps/studio/components/interfaces/Settings/Logs/LogsFilterPopover.tsx b/apps/studio/components/interfaces/Settings/Logs/LogsFilterPopover.tsx
index ce68bebc9e..aaf729d1d7 100644
--- a/apps/studio/components/interfaces/Settings/Logs/LogsFilterPopover.tsx
+++ b/apps/studio/components/interfaces/Settings/Logs/LogsFilterPopover.tsx
@@ -1,10 +1,10 @@
-import { useEffect, useMemo, useState } from 'react'
-
 import { Checkbox } from '@ui/components/shadcn/ui/checkbox'
 import { Label } from '@ui/components/shadcn/ui/label'
 import { Popover, PopoverContent, PopoverTrigger } from '@ui/components/shadcn/ui/popover'
+import { useEffect, useMemo, useState } from 'react'
 import { Button, cn } from 'ui'
-import type { FilterSet, Filters } from './Logs.types'
+
+import type { Filters, FilterSet } from './Logs.types'
 
 interface LogsFilterPopoverProps {
   options: FilterSet
diff --git a/apps/studio/components/interfaces/Settings/Logs/LogsFormatters.tsx b/apps/studio/components/interfaces/Settings/Logs/LogsFormatters.tsx
index 4774a6f7c6..bbe76db1c1 100644
--- a/apps/studio/components/interfaces/Settings/Logs/LogsFormatters.tsx
+++ b/apps/studio/components/interfaces/Settings/Logs/LogsFormatters.tsx
@@ -4,13 +4,14 @@
  * for http response codes
  */
 
-import CopyButton from 'components/ui/CopyButton'
-import React from 'react'
-import { isUnixMicro, unixMicroToIsoTimestamp } from './Logs.utils'
-import { AlertCircle, Info } from 'lucide-react'
 import dayjs from 'dayjs'
+import { AlertCircle, Info } from 'lucide-react'
+import React from 'react'
 import { cn } from 'ui'
 
+import { isUnixMicro, unixMicroToIsoTimestamp } from './Logs.utils'
+import CopyButton from '@/components/ui/CopyButton'
+
 export const RowLayout: React.FC = ({ children }) => (
   
{children}
) diff --git a/apps/studio/components/interfaces/Settings/Logs/LogsPreviewer.tsx b/apps/studio/components/interfaces/Settings/Logs/LogsPreviewer.tsx index 77e05a6eed..2390858ed3 100644 --- a/apps/studio/components/interfaces/Settings/Logs/LogsPreviewer.tsx +++ b/apps/studio/components/interfaces/Settings/Logs/LogsPreviewer.tsx @@ -1,20 +1,8 @@ import { useParams } from 'common' -import PreviewFilterPanel from 'components/interfaces/Settings/Logs/PreviewFilterPanel' -import LoadingOpacity from 'components/ui/LoadingOpacity' -import ShimmerLine from 'components/ui/ShimmerLine' -import { useReadReplicasQuery } from 'data/read-replicas/replicas-query' import dayjs from 'dayjs' -import useLogsPreview from 'hooks/analytics/useLogsPreview' -import { useLogsUrlState } from 'hooks/analytics/useLogsUrlState' -import { useSelectedLog } from 'hooks/analytics/useSelectedLog' -import useSingleLog from 'hooks/analytics/useSingleLog' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useUpgradePrompt } from 'hooks/misc/useUpgradePrompt' import { Rewind } from 'lucide-react' import { useRouter } from 'next/router' import { PropsWithChildren, useEffect, useState } from 'react' -import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' import { Button } from 'ui' import { LogsBarChart } from 'ui-patterns/LogsBarChart' @@ -29,6 +17,18 @@ import type { Filters, LogSearchCallback, LogTemplate, QueryType } from './Logs. import { maybeShowUpgradePromptIfNotEntitled } from './Logs.utils' import { LogTable } from './LogTable' import UpgradePrompt from './UpgradePrompt' +import PreviewFilterPanel from '@/components/interfaces/Settings/Logs/PreviewFilterPanel' +import LoadingOpacity from '@/components/ui/LoadingOpacity' +import ShimmerLine from '@/components/ui/ShimmerLine' +import { useReadReplicasQuery } from '@/data/read-replicas/replicas-query' +import useLogsPreview from '@/hooks/analytics/useLogsPreview' +import { useLogsUrlState } from '@/hooks/analytics/useLogsUrlState' +import { useSelectedLog } from '@/hooks/analytics/useSelectedLog' +import useSingleLog from '@/hooks/analytics/useSingleLog' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useUpgradePrompt } from '@/hooks/misc/useUpgradePrompt' +import { useDatabaseSelectorStateSnapshot } from '@/state/database-selector' /** * Calculates the appropriate time range for bar click filtering based on the current time range duration. diff --git a/apps/studio/components/interfaces/Settings/Logs/LogsQueryPanel.tsx b/apps/studio/components/interfaces/Settings/Logs/LogsQueryPanel.tsx index 8981208653..807115c539 100644 --- a/apps/studio/components/interfaces/Settings/Logs/LogsQueryPanel.tsx +++ b/apps/studio/components/interfaces/Settings/Logs/LogsQueryPanel.tsx @@ -1,7 +1,4 @@ import { IS_PLATFORM } from 'common' -import Table from 'components/to-be-cleaned/Table' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { DOCS_URL } from 'lib/constants' import { BookOpen, Check, ChevronDown, Copy, ExternalLink, X } from 'lucide-react' import Link from 'next/link' import { ReactNode, useEffect, useState } from 'react' @@ -28,6 +25,9 @@ import { } from './Logs.constants' import { DatePickerValue, LogsDatePicker } from './Logs.DatePickers' import { LogsWarning, LogTemplate } from './Logs.types' +import Table from '@/components/to-be-cleaned/Table' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { DOCS_URL } from '@/lib/constants' export interface LogsQueryPanelProps { templates?: LogTemplate[] diff --git a/apps/studio/components/interfaces/Settings/Logs/MultiSelectActionBar.tsx b/apps/studio/components/interfaces/Settings/Logs/MultiSelectActionBar.tsx index ad9120c6e1..598f03f2ff 100644 --- a/apps/studio/components/interfaces/Settings/Logs/MultiSelectActionBar.tsx +++ b/apps/studio/components/interfaces/Settings/Logs/MultiSelectActionBar.tsx @@ -1,9 +1,5 @@ -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { AiAssistantDropdown } from 'components/ui/AiAssistantDropdown' import { Check, ChevronDown, Copy, X as XIcon } from 'lucide-react' import { useMemo } from 'react' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { Button, DropdownMenu, @@ -14,6 +10,10 @@ import { import type { LogData, QueryType } from './Logs.types' import { buildLogsPrompt } from './Logs.utils' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { AiAssistantDropdown } from '@/components/ui/AiAssistantDropdown' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' interface MultiSelectActionBarProps { selectedRows: Set diff --git a/apps/studio/components/interfaces/Settings/Logs/PreviewFilterPanel.tsx b/apps/studio/components/interfaces/Settings/Logs/PreviewFilterPanel.tsx index 3bc684741c..f169b4b450 100644 --- a/apps/studio/components/interfaces/Settings/Logs/PreviewFilterPanel.tsx +++ b/apps/studio/components/interfaces/Settings/Logs/PreviewFilterPanel.tsx @@ -1,9 +1,4 @@ import { useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DatabaseSelector } from 'components/ui/DatabaseSelector' -import { DownloadResultsButton } from 'components/ui/DownloadResultsButton' -import { useLoadBalancersQuery } from 'data/read-replicas/load-balancers-query' -import { IS_PLATFORM } from 'lib/constants' import { Eye, EyeOff, RefreshCw, Search, Terminal, X } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' @@ -19,6 +14,11 @@ import { import { DatePickerValue, LogsDatePicker } from './Logs.DatePickers' import type { Filters, LogSearchCallback, LogTemplate } from './Logs.types' import LogsFilterPopover from './LogsFilterPopover' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DatabaseSelector } from '@/components/ui/DatabaseSelector' +import { DownloadResultsButton } from '@/components/ui/DownloadResultsButton' +import { useLoadBalancersQuery } from '@/data/read-replicas/load-balancers-query' +import { IS_PLATFORM } from '@/lib/constants' interface PreviewFilterPanelProps { defaultSearchValue?: string diff --git a/apps/studio/components/interfaces/Settings/Logs/PreviewFilterPanelWithUniversal.tsx b/apps/studio/components/interfaces/Settings/Logs/PreviewFilterPanelWithUniversal.tsx index 4a55bc7414..d9fb6c8eb5 100644 --- a/apps/studio/components/interfaces/Settings/Logs/PreviewFilterPanelWithUniversal.tsx +++ b/apps/studio/components/interfaces/Settings/Logs/PreviewFilterPanelWithUniversal.tsx @@ -1,14 +1,10 @@ +import { useParams } from 'common' import dayjs from 'dayjs' import { Eye, EyeOff, RefreshCw, Terminal } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' import { useMemo, useState } from 'react' - -import { useParams } from 'common' -import { DatabaseSelector } from 'components/ui/DatabaseSelector' -import { useLoadBalancersQuery } from 'data/read-replicas/load-balancers-query' -import { IS_PLATFORM } from 'lib/constants' -import { Button, Calendar, Tooltip, TooltipContent, TooltipTrigger, cn } from 'ui' +import { Button, Calendar, cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' import type { CustomOptionProps, FilterCondition, @@ -16,9 +12,13 @@ import type { FilterProperty, } from 'ui-patterns/FilterBar' import { FilterBar } from 'ui-patterns/FilterBar' -import { DatePickerValue } from './Logs.DatePickers' + import { FILTER_OPTIONS, LOG_ROUTES_WITH_REPLICA_SUPPORT, LogsTableName } from './Logs.constants' +import { DatePickerValue } from './Logs.DatePickers' import type { Filters, LogSearchCallback, LogTemplate } from './Logs.types' +import { DatabaseSelector } from '@/components/ui/DatabaseSelector' +import { useLoadBalancersQuery } from '@/data/read-replicas/load-balancers-query' +import { IS_PLATFORM } from '@/lib/constants' function isBooleanMap(v: unknown): v is Record { return typeof v === 'object' && v !== null && !Array.isArray(v) diff --git a/apps/studio/components/interfaces/Settings/Logs/RecentQueriesItem.tsx b/apps/studio/components/interfaces/Settings/Logs/RecentQueriesItem.tsx index 0afcc534c0..5ea89e1510 100644 --- a/apps/studio/components/interfaces/Settings/Logs/RecentQueriesItem.tsx +++ b/apps/studio/components/interfaces/Settings/Logs/RecentQueriesItem.tsx @@ -1,10 +1,10 @@ import { Play } from 'lucide-react' import { useRouter } from 'next/router' - -import Table from 'components/to-be-cleaned/Table' -import type { LogSqlSnippets } from 'types' import { Button } from 'ui' + import SqlSnippetCode from './Logs.SqlSnippetCode' +import Table from '@/components/to-be-cleaned/Table' +import type { LogSqlSnippets } from '@/types' interface Props { item: LogSqlSnippets.Content diff --git a/apps/studio/components/interfaces/Settings/Logs/UpgradePrompt.tsx b/apps/studio/components/interfaces/Settings/Logs/UpgradePrompt.tsx index b6414a5c37..0a72e6c325 100644 --- a/apps/studio/components/interfaces/Settings/Logs/UpgradePrompt.tsx +++ b/apps/studio/components/interfaces/Settings/Logs/UpgradePrompt.tsx @@ -1,8 +1,8 @@ import Link from 'next/link' - -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { Button, Modal } from 'ui' + import { TIER_QUERY_LIMITS } from './Logs.constants' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' interface Props { show: boolean diff --git a/apps/studio/components/interfaces/Sidebar.tsx b/apps/studio/components/interfaces/Sidebar.tsx index 59943dd552..aa9010f980 100644 --- a/apps/studio/components/interfaces/Sidebar.tsx +++ b/apps/studio/components/interfaces/Sidebar.tsx @@ -1,26 +1,11 @@ import { LOCAL_STORAGE_KEYS, useFlag, useIsMFAEnabled, useParams } from 'common' -import { - generateOtherRoutes, - generateProductRoutes, - generateSettingsRoutes, - generateToolRoutes, -} from 'components/layouts/Navigation/NavigationBar/NavigationBar.utils' -import { ProjectIndexPageLink } from 'data/prefetchers/project.$ref' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' import { AnimatePresence, motion, MotionProps } from 'framer-motion' -import { useHideSidebar } from 'hooks/misc/useHideSidebar' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useLints } from 'hooks/misc/useLints' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Home } from 'icons' import { isUndefined } from 'lodash' import { Blocks, Boxes, ChartArea, PanelLeftDashed, Receipt, Settings, Users } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' import { ComponentProps, ComponentPropsWithoutRef, FC, ReactNode, useEffect } from 'react' -import { useAppStateSnapshot } from 'state/app-state' import { Button, cn, @@ -48,6 +33,21 @@ import { useIsPlatformWebhooksEnabled, useUnifiedLogsPreview, } from './App/FeaturePreview/FeaturePreviewContext' +import { + generateOtherRoutes, + generateProductRoutes, + generateSettingsRoutes, + generateToolRoutes, +} from '@/components/layouts/Navigation/NavigationBar/NavigationBar.utils' +import { ProjectIndexPageLink } from '@/data/prefetchers/project.$ref' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useHideSidebar } from '@/hooks/misc/useHideSidebar' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useLints } from '@/hooks/misc/useLints' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useAppStateSnapshot } from '@/state/app-state' export const ICON_SIZE = 32 export const ICON_STROKE_WIDTH = 1.5 diff --git a/apps/studio/components/interfaces/SignIn/ForgotPasswordWizard.tsx b/apps/studio/components/interfaces/SignIn/ForgotPasswordWizard.tsx index 332659f46d..e615fbd14a 100644 --- a/apps/studio/components/interfaces/SignIn/ForgotPasswordWizard.tsx +++ b/apps/studio/components/interfaces/SignIn/ForgotPasswordWizard.tsx @@ -1,8 +1,5 @@ import HCaptcha from '@hcaptcha/react-hcaptcha' import { zodResolver } from '@hookform/resolvers/zod' -import { useResetPasswordMutation } from 'data/misc/reset-password-mutation' -import { BASE_PATH } from 'lib/constants' -import { auth } from 'lib/gotrue' import { useRouter } from 'next/router' import { useRef, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' @@ -12,6 +9,10 @@ import { Admonition } from 'ui-patterns' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import * as z from 'zod' +import { useResetPasswordMutation } from '@/data/misc/reset-password-mutation' +import { BASE_PATH } from '@/lib/constants' +import { auth } from '@/lib/gotrue' + const forgotPasswordSchema = z.object({ email: z.string().min(1, 'Please provide an email address').email('Must be a valid email'), }) diff --git a/apps/studio/components/interfaces/SignIn/LastSignInWrapper.tsx b/apps/studio/components/interfaces/SignIn/LastSignInWrapper.tsx index 122bc7bf15..580a7c3676 100644 --- a/apps/studio/components/interfaces/SignIn/LastSignInWrapper.tsx +++ b/apps/studio/components/interfaces/SignIn/LastSignInWrapper.tsx @@ -1,8 +1,8 @@ -import { LastSignInType, useLastSignIn } from 'hooks/misc/useLastSignIn' import { ReactNode } from 'react' - import { Badge, cn } from 'ui' +import { LastSignInType, useLastSignIn } from '@/hooks/misc/useLastSignIn' + export function LastSignInWrapper({ children, type, diff --git a/apps/studio/components/interfaces/SignIn/ResetPasswordForm.tsx b/apps/studio/components/interfaces/SignIn/ResetPasswordForm.tsx index 7d85034b5a..7ead5e17cb 100644 --- a/apps/studio/components/interfaces/SignIn/ResetPasswordForm.tsx +++ b/apps/studio/components/interfaces/SignIn/ResetPasswordForm.tsx @@ -1,7 +1,5 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useParams } from 'common' -import { captureCriticalError } from 'lib/error-reporting' -import { auth, getReturnToPath } from 'lib/gotrue' import { Eye, EyeOff } from 'lucide-react' import { useRouter } from 'next/router' import { useState } from 'react' @@ -13,6 +11,8 @@ import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { z } from 'zod' import PasswordConditionsHelper from './PasswordConditionsHelper' +import { captureCriticalError } from '@/lib/error-reporting' +import { auth, getReturnToPath } from '@/lib/gotrue' const passwordValidation = z .string() diff --git a/apps/studio/components/interfaces/SignIn/SessionTimeoutModal.tsx b/apps/studio/components/interfaces/SignIn/SessionTimeoutModal.tsx index 4eb53c9110..5261078adb 100644 --- a/apps/studio/components/interfaces/SignIn/SessionTimeoutModal.tsx +++ b/apps/studio/components/interfaces/SignIn/SessionTimeoutModal.tsx @@ -1,9 +1,7 @@ -import { SupportCategories } from '@supabase/shared-types/out/constants' import * as Sentry from '@sentry/nextjs' +import { SupportCategories } from '@supabase/shared-types/out/constants' import { useEffect } from 'react' import { toast } from 'sonner' - -import { InlineLink, InlineLinkClassName } from 'components/ui/InlineLink' import { AlertCollapsible, AlertDialog, @@ -16,7 +14,9 @@ import { AlertDialogTitle, Button, } from 'ui' + import { SupportLink } from '../Support/SupportLink' +import { InlineLink, InlineLinkClassName } from '@/components/ui/InlineLink' interface SessionTimeoutModalProps { visible: boolean diff --git a/apps/studio/components/interfaces/SignIn/SignInForm.tsx b/apps/studio/components/interfaces/SignIn/SignInForm.tsx index a09d53769e..3399f7d546 100644 --- a/apps/studio/components/interfaces/SignIn/SignInForm.tsx +++ b/apps/studio/components/interfaces/SignIn/SignInForm.tsx @@ -2,23 +2,23 @@ import HCaptcha from '@hcaptcha/react-hcaptcha' import { zodResolver } from '@hookform/resolvers/zod' import type { AuthError } from '@supabase/supabase-js' import { useQueryClient } from '@tanstack/react-query' +import { Eye, EyeOff } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' import { useEffect, useRef, useState } from 'react' -import { type SubmitHandler, useForm } from 'react-hook-form' +import { useForm, type SubmitHandler } from 'react-hook-form' import { toast } from 'sonner' -import z from 'zod' - -import { useAddLoginEvent } from 'data/misc/audit-login-mutation' -import { getMfaAuthenticatorAssuranceLevel } from 'data/profile/mfa-authenticator-assurance-level-query' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useLastSignIn } from 'hooks/misc/useLastSignIn' -import { captureCriticalError } from 'lib/error-reporting' -import { auth, buildPathWithParams, getReturnToPath } from 'lib/gotrue' import { Button, Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, Input_Shadcn_ } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import z from 'zod' + import { LastSignInWrapper } from './LastSignInWrapper' -import { Eye, EyeOff } from 'lucide-react' +import { useAddLoginEvent } from '@/data/misc/audit-login-mutation' +import { getMfaAuthenticatorAssuranceLevel } from '@/data/profile/mfa-authenticator-assurance-level-query' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useLastSignIn } from '@/hooks/misc/useLastSignIn' +import { captureCriticalError } from '@/lib/error-reporting' +import { auth, buildPathWithParams, getReturnToPath } from '@/lib/gotrue' const schema = z.object({ email: z.string().min(1, 'Email is required').email('Must be a valid email'), diff --git a/apps/studio/components/interfaces/SignIn/SignInMfaForm.tsx b/apps/studio/components/interfaces/SignIn/SignInMfaForm.tsx index f408cdbaad..21977a14f1 100644 --- a/apps/studio/components/interfaces/SignIn/SignInMfaForm.tsx +++ b/apps/studio/components/interfaces/SignIn/SignInMfaForm.tsx @@ -3,11 +3,6 @@ import { SupportCategories } from '@supabase/shared-types/out/constants' import type { Factor } from '@supabase/supabase-js' import { useQueryClient } from '@tanstack/react-query' import { useAuthError } from 'common' -import AlertError from 'components/ui/AlertError' -import { useMfaChallengeAndVerifyMutation } from 'data/profile/mfa-challenge-and-verify-mutation' -import { useMfaListFactorsQuery } from 'data/profile/mfa-list-factors-query' -import { useSignOut } from 'lib/auth' -import { getReturnToPath } from 'lib/gotrue' import { Lock } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' @@ -19,6 +14,11 @@ import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import z from 'zod' import { SupportLink } from '../Support/SupportLink' +import AlertError from '@/components/ui/AlertError' +import { useMfaChallengeAndVerifyMutation } from '@/data/profile/mfa-challenge-and-verify-mutation' +import { useMfaListFactorsQuery } from '@/data/profile/mfa-list-factors-query' +import { useSignOut } from '@/lib/auth' +import { getReturnToPath } from '@/lib/gotrue' const schema = z.object({ code: z.string().min(1, 'MFA Code is required'), diff --git a/apps/studio/components/interfaces/SignIn/SignInPartner.tsx b/apps/studio/components/interfaces/SignIn/SignInPartner.tsx index 814c5ae68f..6aafa0281d 100644 --- a/apps/studio/components/interfaces/SignIn/SignInPartner.tsx +++ b/apps/studio/components/interfaces/SignIn/SignInPartner.tsx @@ -1,9 +1,10 @@ -import { InlineLink } from 'components/ui/InlineLink' -import { auth } from 'lib/gotrue' import { Loader2 } from 'lucide-react' import { useRouter } from 'next/router' import { useEffect } from 'react' +import { InlineLink } from '@/components/ui/InlineLink' +import { auth } from '@/lib/gotrue' + export const SignInPartner = () => { const router = useRouter() diff --git a/apps/studio/components/interfaces/SignIn/SignInSSOForm.tsx b/apps/studio/components/interfaces/SignIn/SignInSSOForm.tsx index 73f5870cb6..c94d009b22 100644 --- a/apps/studio/components/interfaces/SignIn/SignInSSOForm.tsx +++ b/apps/studio/components/interfaces/SignIn/SignInSSOForm.tsx @@ -2,16 +2,16 @@ import HCaptcha from '@hcaptcha/react-hcaptcha' import { zodResolver } from '@hookform/resolvers/zod' import { useQueryClient } from '@tanstack/react-query' import { useRef, useState } from 'react' -import { type SubmitHandler, useForm } from 'react-hook-form' +import { useForm, type SubmitHandler } from 'react-hook-form' import { toast } from 'sonner' -import z from 'zod' - -import { useLastSignIn } from 'hooks/misc/useLastSignIn' -import { BASE_PATH } from 'lib/constants' -import { captureCriticalError } from 'lib/error-reporting' -import { auth, buildPathWithParams } from 'lib/gotrue' import { Button, Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, Input_Shadcn_ } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import z from 'zod' + +import { useLastSignIn } from '@/hooks/misc/useLastSignIn' +import { BASE_PATH } from '@/lib/constants' +import { captureCriticalError } from '@/lib/error-reporting' +import { auth, buildPathWithParams } from '@/lib/gotrue' const schema = z.object({ email: z.string().min(1, 'Email is required').email('Must be a valid email'), diff --git a/apps/studio/components/interfaces/SignIn/SignInWithCustom.tsx b/apps/studio/components/interfaces/SignIn/SignInWithCustom.tsx index f5959dd23c..7e5a3c58ed 100644 --- a/apps/studio/components/interfaces/SignIn/SignInWithCustom.tsx +++ b/apps/studio/components/interfaces/SignIn/SignInWithCustom.tsx @@ -1,11 +1,11 @@ import { useState } from 'react' import { toast } from 'sonner' - -import { BASE_PATH } from 'lib/constants' -import { captureCriticalError } from 'lib/error-reporting' -import { auth, buildPathWithParams } from 'lib/gotrue' import { Button } from 'ui' +import { BASE_PATH } from '@/lib/constants' +import { captureCriticalError } from '@/lib/error-reporting' +import { auth, buildPathWithParams } from '@/lib/gotrue' + interface SignInWithCustomProps { providerName: string } diff --git a/apps/studio/components/interfaces/SignIn/SignInWithGitHub.tsx b/apps/studio/components/interfaces/SignIn/SignInWithGitHub.tsx index 3431b56c89..5827d15433 100644 --- a/apps/studio/components/interfaces/SignIn/SignInWithGitHub.tsx +++ b/apps/studio/components/interfaces/SignIn/SignInWithGitHub.tsx @@ -1,14 +1,13 @@ import { Github } from 'lucide-react' import { useState } from 'react' import { toast } from 'sonner' - -import { BASE_PATH } from 'lib/constants' - -import { useLastSignIn } from 'hooks/misc/useLastSignIn' -import { captureCriticalError } from 'lib/error-reporting' -import { auth, buildPathWithParams } from 'lib/gotrue' import { Button } from 'ui' + import { LastSignInWrapper } from './LastSignInWrapper' +import { useLastSignIn } from '@/hooks/misc/useLastSignIn' +import { BASE_PATH } from '@/lib/constants' +import { captureCriticalError } from '@/lib/error-reporting' +import { auth, buildPathWithParams } from '@/lib/gotrue' export const SignInWithGitHub = () => { const [loading, setLoading] = useState(false) diff --git a/apps/studio/components/interfaces/SignIn/SignUpForm.tsx b/apps/studio/components/interfaces/SignIn/SignUpForm.tsx index 03a4aa3bf6..e1310c0bd0 100644 --- a/apps/studio/components/interfaces/SignIn/SignUpForm.tsx +++ b/apps/studio/components/interfaces/SignIn/SignUpForm.tsx @@ -1,9 +1,6 @@ import HCaptcha from '@hcaptcha/react-hcaptcha' import { zodResolver } from '@hookform/resolvers/zod' -import { useSignUpMutation } from 'data/misc/signup-mutation' import { motion } from 'framer-motion' -import { BASE_PATH } from 'lib/constants' -import { buildPathWithParams } from 'lib/gotrue' import { CheckCircle, Eye, EyeOff } from 'lucide-react' import { useRouter } from 'next/router' import { parseAsString, useQueryStates } from 'nuqs' @@ -25,6 +22,9 @@ import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import z from 'zod' import PasswordConditionsHelper from './PasswordConditionsHelper' +import { useSignUpMutation } from '@/data/misc/signup-mutation' +import { BASE_PATH } from '@/lib/constants' +import { buildPathWithParams } from '@/lib/gotrue' const schema = z.object({ email: z.string().min(1, 'Email is required').email('Must be a valid email'), diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/BucketHeader.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/BucketHeader.tsx index 033fd0c409..ee023453bf 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/BucketHeader.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/BucketHeader.tsx @@ -1,14 +1,14 @@ import { noop } from 'lodash' -import { FormattedWrapperTable } from 'components/interfaces/Integrations/Wrappers/Wrappers.utils' +import { HIDE_REPLICATION_USER_FLOW } from './AnalyticsBucketDetails.constants' +import { ConnectTablesDialog } from './ConnectTablesDialog' +import { CreateTableInstructionsDialog } from './CreateTable/CreateTableInstructionsDialog' +import { FormattedWrapperTable } from '@/components/interfaces/Integrations/Wrappers/Wrappers.utils' import { ScaffoldHeader, ScaffoldSectionDescription, ScaffoldSectionTitle, -} from 'components/layouts/Scaffold' -import { HIDE_REPLICATION_USER_FLOW } from './AnalyticsBucketDetails.constants' -import { ConnectTablesDialog } from './ConnectTablesDialog' -import { CreateTableInstructionsDialog } from './CreateTable/CreateTableInstructionsDialog' +} from '@/components/layouts/Scaffold' interface BucketHeaderProps { showActions?: boolean diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/ConnectTablesDialog.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/ConnectTablesDialog.tsx index 4d29c5a141..9bd60d028b 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/ConnectTablesDialog.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/ConnectTablesDialog.tsx @@ -1,21 +1,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { useIsETLPrivateAlpha } from 'components/interfaces/Database/Replication/useIsETLPrivateAlpha' -import { convertKVStringArrayToJson } from 'components/interfaces/Integrations/Wrappers/Wrappers.utils' -import { getKeys, useAPIKeysQuery } from 'data/api-keys/api-keys-query' -import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' -import { useCreateDestinationPipelineMutation } from 'data/replication/create-destination-pipeline-mutation' -import { useCreateTenantSourceMutation } from 'data/replication/create-tenant-source-mutation' -import { useCreatePublicationMutation } from 'data/replication/publication-create-mutation' -import { useUpdatePublicationMutation } from 'data/replication/publication-update-mutation' -import { useReplicationSourcesQuery } from 'data/replication/sources-query' -import { useStartPipelineMutation } from 'data/replication/start-pipeline-mutation' -import { useReplicationTablesQuery } from 'data/replication/tables-query' -import { getDecryptedValues } from 'data/vault/vault-secret-decrypted-value-query' import { AnimatePresence, motion } from 'framer-motion' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Loader2, Plus } from 'lucide-react' import { useEffect, useMemo, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' @@ -47,6 +33,20 @@ import { } from './AnalyticsBucketDetails.utils' import { useAnalyticsBucketAssociatedEntities } from './useAnalyticsBucketAssociatedEntities' import { useAnalyticsBucketWrapperInstance } from './useAnalyticsBucketWrapperInstance' +import { useIsETLPrivateAlpha } from '@/components/interfaces/Database/Replication/useIsETLPrivateAlpha' +import { convertKVStringArrayToJson } from '@/components/interfaces/Integrations/Wrappers/Wrappers.utils' +import { getKeys, useAPIKeysQuery } from '@/data/api-keys/api-keys-query' +import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' +import { useCreateDestinationPipelineMutation } from '@/data/replication/create-destination-pipeline-mutation' +import { useCreateTenantSourceMutation } from '@/data/replication/create-tenant-source-mutation' +import { useCreatePublicationMutation } from '@/data/replication/publication-create-mutation' +import { useUpdatePublicationMutation } from '@/data/replication/publication-update-mutation' +import { useReplicationSourcesQuery } from '@/data/replication/sources-query' +import { useStartPipelineMutation } from '@/data/replication/start-pipeline-mutation' +import { useReplicationTablesQuery } from '@/data/replication/tables-query' +import { getDecryptedValues } from '@/data/vault/vault-secret-decrypted-value-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' /** * [Joshen] So far this is purely just setting up a "Connect from empty state" flow diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/CopyEnvButton.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/CopyEnvButton.tsx index d1261e3bc0..9d9301bdcc 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/CopyEnvButton.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/CopyEnvButton.tsx @@ -1,11 +1,10 @@ import { Copy } from 'lucide-react' import { useCallback, useState } from 'react' import { toast } from 'sonner' +import { Button, copyToClipboard } from 'ui' -import { Button } from 'ui' -import { getDecryptedValue } from 'data/vault/vault-secret-decrypted-value-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { copyToClipboard } from 'ui' +import { getDecryptedValue } from '@/data/vault/vault-secret-decrypted-value-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export const CopyEnvButton = ({ serverOptions, diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/CreateTable/CreateTableInstructions.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/CreateTable/CreateTableInstructions.tsx index e3d6bb379f..dbed726327 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/CreateTable/CreateTableInstructions.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/CreateTable/CreateTableInstructions.tsx @@ -1,16 +1,4 @@ import { useParams } from 'common' -import CommandRender from 'components/interfaces/Functions/CommandRender' -import { convertKVStringArrayToJson } from 'components/interfaces/Integrations/Wrappers/Wrappers.utils' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import CopyButton from 'components/ui/CopyButton' -import { InlineLink } from 'components/ui/InlineLink' -import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' -import { - getDecryptedValues, - useVaultSecretDecryptedValueQuery, -} from 'data/vault/vault-secret-decrypted-value-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import { Eye, EyeOff } from 'lucide-react' import { useMemo, useState } from 'react' import { @@ -27,6 +15,18 @@ import { CodeBlock } from 'ui-patterns/CodeBlock' import { useAnalyticsBucketWrapperInstance } from '../useAnalyticsBucketWrapperInstance' import { getPyicebergSnippet } from './CreateTableInstructions.constants' +import CommandRender from '@/components/interfaces/Functions/CommandRender' +import { convertKVStringArrayToJson } from '@/components/interfaces/Integrations/Wrappers/Wrappers.utils' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import CopyButton from '@/components/ui/CopyButton' +import { InlineLink } from '@/components/ui/InlineLink' +import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' +import { + getDecryptedValues, + useVaultSecretDecryptedValueQuery, +} from '@/data/vault/vault-secret-decrypted-value-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' export const CreateTableInstructions = ({ hideHeader = false, diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/CreateTable/CreateTableInstructionsDialog.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/CreateTable/CreateTableInstructionsDialog.tsx index 9f5d0d1b61..6312fa4224 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/CreateTable/CreateTableInstructionsDialog.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/CreateTable/CreateTableInstructionsDialog.tsx @@ -14,6 +14,7 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from 'ui' + import { CreateTableInstructions } from './CreateTableInstructions' import { CreateTableSheet } from './CreateTableSheet' diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/CreateTable/CreateTableSheet.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/CreateTable/CreateTableSheet.tsx index 923a032448..ff9a0b2e8c 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/CreateTable/CreateTableSheet.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/CreateTable/CreateTableSheet.tsx @@ -1,12 +1,5 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useParams } from 'common' -import { useIcebergNamespaceCreateMutation } from 'data/storage/iceberg-namespace-create-mutation' -import { - NamespaceTableFields, - useIcebergNamespaceTableCreateMutation, -} from 'data/storage/iceberg-namespace-table-create-mutation' -import { useIcebergNamespaceTablesQuery } from 'data/storage/iceberg-namespace-tables-query' -import { useIcebergNamespacesQuery } from 'data/storage/iceberg-namespaces-query' import { Plus, X } from 'lucide-react' import { Fragment, useState } from 'react' import { SubmitHandler, useFieldArray, useForm } from 'react-hook-form' @@ -39,6 +32,13 @@ import { z } from 'zod' import { COLUMN_TYPE_FIELDS, COLUMN_TYPES } from './CreateTableSheet.constants' import { createFormSchema } from './CreateTableSheet.schema' +import { useIcebergNamespaceCreateMutation } from '@/data/storage/iceberg-namespace-create-mutation' +import { + NamespaceTableFields, + useIcebergNamespaceTableCreateMutation, +} from '@/data/storage/iceberg-namespace-table-create-mutation' +import { useIcebergNamespaceTablesQuery } from '@/data/storage/iceberg-namespace-tables-query' +import { useIcebergNamespacesQuery } from '@/data/storage/iceberg-namespaces-query' const formId = 'create-namespace-table' const NEW_NAMESPACE_MARKER = 'new-namespace' diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/DecryptedReadOnlyInput.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/DecryptedReadOnlyInput.tsx index 570d75ec45..d14a9015b4 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/DecryptedReadOnlyInput.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/DecryptedReadOnlyInput.tsx @@ -1,14 +1,14 @@ +import { useParams } from 'common' import { ExternalLink, Eye, EyeOff, Loader } from 'lucide-react' import Link from 'next/link' import { useState } from 'react' - -import { useParams } from 'common' -import { useVaultSecretDecryptedValueQuery } from 'data/vault/vault-secret-decrypted-value-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Button, CardContent, Tooltip, TooltipContent, TooltipTrigger } from 'ui' import { Input } from 'ui-patterns/DataInputs/Input' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import { useVaultSecretDecryptedValueQuery } from '@/data/vault/vault-secret-decrypted-value-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' + export const DecryptedReadOnlyInput = ({ value, secureEntry, diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/InitializeForeignSchemaDialog.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/InitializeForeignSchemaDialog.tsx index 2cb28bfc63..853d170ab0 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/InitializeForeignSchemaDialog.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/InitializeForeignSchemaDialog.tsx @@ -1,16 +1,8 @@ import { zodResolver } from '@hookform/resolvers/zod' +import { useParams } from 'common' import { useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import z from 'zod' - -import { useParams } from 'common' -import { DocsButton } from 'components/ui/DocsButton' -import { useSchemaCreateMutation } from 'data/database/schema-create-mutation' -import { useSchemasQuery } from 'data/database/schemas-query' -import { useFDWImportForeignSchemaMutation } from 'data/fdw/fdw-import-foreign-schema-mutation' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import { Button, Dialog, @@ -26,7 +18,15 @@ import { Input_Shadcn_, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import z from 'zod' + import { getAnalyticsBucketFDWServerName } from './AnalyticsBucketDetails.utils' +import { DocsButton } from '@/components/ui/DocsButton' +import { useSchemaCreateMutation } from '@/data/database/schema-create-mutation' +import { useSchemasQuery } from '@/data/database/schemas-query' +import { useFDWImportForeignSchemaMutation } from '@/data/fdw/fdw-import-foreign-schema-mutation' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' // Create foreign tables for namespace tables export const InitializeForeignSchemaDialog = ({ namespace }: { namespace: string }) => { diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/NamespaceWithTables/InsertDataDialog.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/NamespaceWithTables/InsertDataDialog.tsx index 89c10bcdcf..295c7e9237 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/NamespaceWithTables/InsertDataDialog.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/NamespaceWithTables/InsertDataDialog.tsx @@ -1,8 +1,5 @@ import { useParams } from 'common' -import { DocsButton } from 'components/ui/DocsButton' -import { FDWTable } from 'data/fdw/fdws-query' import { SqlEditor } from 'icons' -import { DOCS_URL } from 'lib/constants' import Link from 'next/link' import { Button, @@ -18,6 +15,10 @@ import { } from 'ui' import { CodeBlock } from 'ui-patterns/CodeBlock' +import { DocsButton } from '@/components/ui/DocsButton' +import { FDWTable } from '@/data/fdw/fdws-query' +import { DOCS_URL } from '@/lib/constants' + interface InsertDataDialogProps { table: string fdwTable: FDWTable diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/NamespaceWithTables/NamespaceWithTables.utils.ts b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/NamespaceWithTables/NamespaceWithTables.utils.ts index af2c690b76..be1c876dc6 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/NamespaceWithTables/NamespaceWithTables.utils.ts +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/NamespaceWithTables/NamespaceWithTables.utils.ts @@ -1,6 +1,6 @@ import { snakeCase } from 'lodash' -import { ReplicationPublication } from 'data/replication/publications-query' +import { ReplicationPublication } from '@/data/replication/publications-query' export const inferPostgresTableFromNamespaceTable = ({ publication, diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/NamespaceWithTables/TableRowComponent.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/NamespaceWithTables/TableRowComponent.tsx index 154b4006ce..199e9a3443 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/NamespaceWithTables/TableRowComponent.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/NamespaceWithTables/TableRowComponent.tsx @@ -1,26 +1,10 @@ +import { useParams } from 'common' +import { SqlEditor, TableEditor } from 'icons' import { uniq } from 'lodash' import { Eye, Loader2, MoreVertical, Pause, Play, Table2, Trash } from 'lucide-react' import Link from 'next/link' import { useMemo, useState } from 'react' import { toast } from 'sonner' - -import { useParams } from 'common' -import { - convertKVStringArrayToJson, - formatWrapperTables, -} from 'components/interfaces/Integrations/Wrappers/Wrappers.utils' -import { getDecryptedParameters } from 'components/interfaces/Storage/Storage.utils' -import { DotPing } from 'components/ui/DotPing' -import { DropdownMenuItemTooltip } from 'components/ui/DropdownMenuItemTooltip' -import { useFDWDropForeignTableMutation } from 'data/fdw/fdw-drop-foreign-table-mutation' -import { useFDWUpdateMutation } from 'data/fdw/fdw-update-mutation' -import { useReplicationPipelineStatusQuery } from 'data/replication/pipeline-status-query' -import { useUpdatePublicationMutation } from 'data/replication/publication-update-mutation' -import { useStartPipelineMutation } from 'data/replication/start-pipeline-mutation' -import { useReplicationTablesQuery } from 'data/replication/tables-query' -import { useIcebergNamespaceTableDeleteMutation } from 'data/storage/iceberg-namespace-table-delete-mutation' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { SqlEditor, TableEditor } from 'icons' import { Button, cn, @@ -36,6 +20,7 @@ import { TooltipTrigger, } from 'ui' import { ConfirmationModal } from 'ui-patterns/Dialogs/ConfirmationModal' + import { HIDE_REPLICATION_USER_FLOW } from '../AnalyticsBucketDetails.constants' import { getAnalyticsBucketFDWServerName, @@ -45,6 +30,21 @@ import { useAnalyticsBucketAssociatedEntities } from '../useAnalyticsBucketAssoc import { useAnalyticsBucketWrapperInstance } from '../useAnalyticsBucketWrapperInstance' import { InsertDataDialog } from './InsertDataDialog' import { inferPostgresTableFromNamespaceTable } from './NamespaceWithTables.utils' +import { + convertKVStringArrayToJson, + formatWrapperTables, +} from '@/components/interfaces/Integrations/Wrappers/Wrappers.utils' +import { getDecryptedParameters } from '@/components/interfaces/Storage/Storage.utils' +import { DotPing } from '@/components/ui/DotPing' +import { DropdownMenuItemTooltip } from '@/components/ui/DropdownMenuItemTooltip' +import { useFDWDropForeignTableMutation } from '@/data/fdw/fdw-drop-foreign-table-mutation' +import { useFDWUpdateMutation } from '@/data/fdw/fdw-update-mutation' +import { useReplicationPipelineStatusQuery } from '@/data/replication/pipeline-status-query' +import { useUpdatePublicationMutation } from '@/data/replication/publication-update-mutation' +import { useStartPipelineMutation } from '@/data/replication/start-pipeline-mutation' +import { useReplicationTablesQuery } from '@/data/replication/tables-query' +import { useIcebergNamespaceTableDeleteMutation } from '@/data/storage/iceberg-namespace-table-delete-mutation' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface TableRowComponentProps { table: { id: number; name: string; isConnected: boolean } diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/NamespaceWithTables/index.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/NamespaceWithTables/index.tsx index fed7187700..87f8f94412 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/NamespaceWithTables/index.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/NamespaceWithTables/index.tsx @@ -1,17 +1,7 @@ +import { useParams } from 'common' import { ChevronRight, Info, Loader2, MoreVertical, Plus, RefreshCw, Trash } from 'lucide-react' import { useEffect, useMemo, useState } from 'react' import { toast } from 'sonner' - -import { useParams } from 'common' -import { FormattedWrapperTable } from 'components/interfaces/Integrations/Wrappers/Wrappers.utils' -import { ImportForeignSchemaDialog } from 'components/interfaces/Storage/ImportForeignSchemaDialog' -import { useFDWDropForeignTableMutation } from 'data/fdw/fdw-drop-foreign-table-mutation' -import { useFDWImportForeignSchemaMutation } from 'data/fdw/fdw-import-foreign-schema-mutation' -import { useIcebergNamespaceDeleteMutation } from 'data/storage/iceberg-namespace-delete-mutation' -import { useIcebergNamespaceTableDeleteMutation } from 'data/storage/iceberg-namespace-table-delete-mutation' -import { useIcebergNamespaceTablesQuery } from 'data/storage/iceberg-namespace-tables-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { BASE_PATH } from 'lib/constants' import { Button, Card, @@ -33,12 +23,22 @@ import { TooltipTrigger, } from 'ui' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' + import { HIDE_REPLICATION_USER_FLOW } from '../AnalyticsBucketDetails.constants' import { getNamespaceTableNameFromPostgresTableName } from '../AnalyticsBucketDetails.utils' import { InitializeForeignSchemaDialog } from '../InitializeForeignSchemaDialog' import { UpdateForeignSchemaDialog } from '../UpdateForeignSchemaDialog' import { useAnalyticsBucketAssociatedEntities } from '../useAnalyticsBucketAssociatedEntities' import { TableRowComponent } from './TableRowComponent' +import { FormattedWrapperTable } from '@/components/interfaces/Integrations/Wrappers/Wrappers.utils' +import { ImportForeignSchemaDialog } from '@/components/interfaces/Storage/ImportForeignSchemaDialog' +import { useFDWDropForeignTableMutation } from '@/data/fdw/fdw-drop-foreign-table-mutation' +import { useFDWImportForeignSchemaMutation } from '@/data/fdw/fdw-import-foreign-schema-mutation' +import { useIcebergNamespaceDeleteMutation } from '@/data/storage/iceberg-namespace-delete-mutation' +import { useIcebergNamespaceTableDeleteMutation } from '@/data/storage/iceberg-namespace-table-delete-mutation' +import { useIcebergNamespaceTablesQuery } from '@/data/storage/iceberg-namespace-tables-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { BASE_PATH } from '@/lib/constants' type NamespaceWithTablesProps = { namespace: string diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/SimpleConfigurationDetails.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/SimpleConfigurationDetails.tsx index 4ef76059e7..386def2c40 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/SimpleConfigurationDetails.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/SimpleConfigurationDetails.tsx @@ -1,19 +1,20 @@ -import { INTEGRATIONS } from 'components/interfaces/Integrations/Landing/Integrations.constants' -import { WrapperMeta } from 'components/interfaces/Integrations/Wrappers/Wrappers.types' -import { convertKVStringArrayToJson } from 'components/interfaces/Integrations/Wrappers/Wrappers.utils' +import { Card } from 'ui' + +import { DESCRIPTIONS, LABELS, OPTION_ORDER } from './AnalyticsBucketDetails.constants' +import { CopyEnvButton } from './CopyEnvButton' +import { DecryptedReadOnlyInput } from './DecryptedReadOnlyInput' +import { useAnalyticsBucketWrapperInstance } from './useAnalyticsBucketWrapperInstance' +import { INTEGRATIONS } from '@/components/interfaces/Integrations/Landing/Integrations.constants' +import { WrapperMeta } from '@/components/interfaces/Integrations/Wrappers/Wrappers.types' +import { convertKVStringArrayToJson } from '@/components/interfaces/Integrations/Wrappers/Wrappers.utils' import { ScaffoldHeader, ScaffoldSection, ScaffoldSectionDescription, ScaffoldSectionTitle, -} from 'components/layouts/Scaffold' -import { InlineLink } from 'components/ui/InlineLink' -import { DOCS_URL } from 'lib/constants' -import { Card } from 'ui' -import { DESCRIPTIONS, LABELS, OPTION_ORDER } from './AnalyticsBucketDetails.constants' -import { CopyEnvButton } from './CopyEnvButton' -import { DecryptedReadOnlyInput } from './DecryptedReadOnlyInput' -import { useAnalyticsBucketWrapperInstance } from './useAnalyticsBucketWrapperInstance' +} from '@/components/layouts/Scaffold' +import { InlineLink } from '@/components/ui/InlineLink' +import { DOCS_URL } from '@/lib/constants' export const SimpleConfigurationDetails = ({ bucketName }: { bucketName?: string }) => { const integration = INTEGRATIONS.find((i) => i.id === 'iceberg_wrapper' && i.type === 'wrapper') diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/UpdateForeignSchemaDialog.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/UpdateForeignSchemaDialog.tsx index 84c65cfb2c..c58a0978f4 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/UpdateForeignSchemaDialog.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/UpdateForeignSchemaDialog.tsx @@ -1,15 +1,8 @@ import { zodResolver } from '@hookform/resolvers/zod' +import { useParams } from 'common' import { useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import z from 'zod' - -import { useParams } from 'common' -import { DocsButton } from 'components/ui/DocsButton' -import { InlineLinkClassName } from 'components/ui/InlineLink' -import { useFDWImportForeignSchemaMutation } from 'data/fdw/fdw-import-foreign-schema-mutation' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import { Button, Dialog, @@ -32,8 +25,15 @@ import { TooltipTrigger, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import z from 'zod' + import { getAnalyticsBucketFDWServerName } from './AnalyticsBucketDetails.utils' import { useAnalyticsBucketAssociatedEntities } from './useAnalyticsBucketAssociatedEntities' +import { DocsButton } from '@/components/ui/DocsButton' +import { InlineLinkClassName } from '@/components/ui/InlineLink' +import { useFDWImportForeignSchemaMutation } from '@/data/fdw/fdw-import-foreign-schema-mutation' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' export const UpdateForeignSchemaDialog = ({ namespace, diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/index.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/index.tsx index 78a1eca16a..a0b49ed310 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/index.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/index.tsx @@ -1,38 +1,15 @@ +import { useParams } from 'common' import { uniq } from 'lodash' import { Loader2, SquarePlus } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' import { parseAsBoolean, useQueryState } from 'nuqs' import { useEffect, useMemo, useState } from 'react' - -import { useParams } from 'common' -import { INTEGRATIONS } from 'components/interfaces/Integrations/Landing/Integrations.constants' -import { WrapperMeta } from 'components/interfaces/Integrations/Wrappers/Wrappers.types' -import { - convertKVStringArrayToJson, - formatWrapperTables, -} from 'components/interfaces/Integrations/Wrappers/Wrappers.utils' -import { - ScaffoldContainer, - ScaffoldSection, - ScaffoldSectionTitle, -} from 'components/layouts/Scaffold' -import AlertError from 'components/ui/AlertError' -import { InlineLink } from 'components/ui/InlineLink' -import { - DatabaseExtension, - useDatabaseExtensionsQuery, -} from 'data/database-extensions/database-extensions-query' -import { useReplicationPipelineStatusQuery } from 'data/replication/pipeline-status-query' -import { useStartPipelineMutation } from 'data/replication/start-pipeline-mutation' -import { useIcebergNamespacesQuery } from 'data/storage/iceberg-namespaces-query' -import { useIcebergWrapperCreateMutation } from 'data/storage/iceberg-wrapper-create-mutation' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import { Button, Card, CardContent } from 'ui' import { EmptyStatePresentational } from 'ui-patterns' import { Admonition } from 'ui-patterns/admonition' import { GenericTableLoader } from 'ui-patterns/ShimmeringLoader' + import { DeleteAnalyticsBucketModal } from '../DeleteAnalyticsBucketModal' import { useSelectedAnalyticsBucket } from '../useSelectedAnalyticsBucket' import { HIDE_REPLICATION_USER_FLOW } from './AnalyticsBucketDetails.constants' @@ -43,6 +20,29 @@ import { NamespaceWithTables } from './NamespaceWithTables' import { SimpleConfigurationDetails } from './SimpleConfigurationDetails' import { useAnalyticsBucketAssociatedEntities } from './useAnalyticsBucketAssociatedEntities' import { useIcebergWrapperExtension } from './useIcebergWrapper' +import { INTEGRATIONS } from '@/components/interfaces/Integrations/Landing/Integrations.constants' +import { WrapperMeta } from '@/components/interfaces/Integrations/Wrappers/Wrappers.types' +import { + convertKVStringArrayToJson, + formatWrapperTables, +} from '@/components/interfaces/Integrations/Wrappers/Wrappers.utils' +import { + ScaffoldContainer, + ScaffoldSection, + ScaffoldSectionTitle, +} from '@/components/layouts/Scaffold' +import AlertError from '@/components/ui/AlertError' +import { InlineLink } from '@/components/ui/InlineLink' +import { + DatabaseExtension, + useDatabaseExtensionsQuery, +} from '@/data/database-extensions/database-extensions-query' +import { useReplicationPipelineStatusQuery } from '@/data/replication/pipeline-status-query' +import { useStartPipelineMutation } from '@/data/replication/start-pipeline-mutation' +import { useIcebergNamespacesQuery } from '@/data/storage/iceberg-namespaces-query' +import { useIcebergWrapperCreateMutation } from '@/data/storage/iceberg-wrapper-create-mutation' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' export const AnalyticBucketDetails = () => { const router = useRouter() diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/useAnalyticsBucketAssociatedEntities.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/useAnalyticsBucketAssociatedEntities.tsx index 7c7fbbebca..aeb766bfbb 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/useAnalyticsBucketAssociatedEntities.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/useAnalyticsBucketAssociatedEntities.tsx @@ -1,22 +1,22 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' -import { useFDWDeleteMutation } from 'data/fdw/fdw-delete-mutation' -import { useDeleteDestinationPipelineMutation } from 'data/replication/delete-destination-pipeline-mutation' -import { useReplicationDestinationsQuery } from 'data/replication/destinations-query' -import { useReplicationPipelinesQuery } from 'data/replication/pipelines-query' -import { useDeletePublicationMutation } from 'data/replication/publication-delete-mutation' -import { useReplicationPublicationsQuery } from 'data/replication/publications-query' -import { useReplicationSourcesQuery } from 'data/replication/sources-query' -import { useS3AccessKeyDeleteMutation } from 'data/storage/s3-access-key-delete-mutation' -import { useStorageCredentialsQuery } from 'data/storage/s3-access-key-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { getAnalyticsBucketPublicationName, getAnalyticsBucketS3KeyName, getAnalyticsBucketsDestinationName, } from './AnalyticsBucketDetails.utils' import { useAnalyticsBucketWrapperInstance } from './useAnalyticsBucketWrapperInstance' +import { useFDWDeleteMutation } from '@/data/fdw/fdw-delete-mutation' +import { useDeleteDestinationPipelineMutation } from '@/data/replication/delete-destination-pipeline-mutation' +import { useReplicationDestinationsQuery } from '@/data/replication/destinations-query' +import { useReplicationPipelinesQuery } from '@/data/replication/pipelines-query' +import { useDeletePublicationMutation } from '@/data/replication/publication-delete-mutation' +import { useReplicationPublicationsQuery } from '@/data/replication/publications-query' +import { useReplicationSourcesQuery } from '@/data/replication/sources-query' +import { useS3AccessKeyDeleteMutation } from '@/data/storage/s3-access-key-delete-mutation' +import { useStorageCredentialsQuery } from '@/data/storage/s3-access-key-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' /** * Returns all the data that's associated to a specified analytics bucket (e.g publications, S3 keys, etc) diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/useAnalyticsBucketWrapperInstance.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/useAnalyticsBucketWrapperInstance.tsx index 1d514f9573..c5d4dfeadc 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/useAnalyticsBucketWrapperInstance.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/useAnalyticsBucketWrapperInstance.tsx @@ -1,13 +1,13 @@ import { useMemo } from 'react' -import { WRAPPER_HANDLERS } from 'components/interfaces/Integrations/Wrappers/Wrappers.constants' +import { getAnalyticsBucketFDWName } from './AnalyticsBucketDetails.utils' +import { WRAPPER_HANDLERS } from '@/components/interfaces/Integrations/Wrappers/Wrappers.constants' import { getWrapperMetaForWrapper, wrapperMetaComparator, -} from 'components/interfaces/Integrations/Wrappers/Wrappers.utils' -import { useFDWsQuery } from 'data/fdw/fdws-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { getAnalyticsBucketFDWName } from './AnalyticsBucketDetails.utils' +} from '@/components/interfaces/Integrations/Wrappers/Wrappers.utils' +import { useFDWsQuery } from '@/data/fdw/fdws-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export const useAnalyticsBucketWrapperInstance = ( { bucketId }: { bucketId?: string }, diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/useIcebergWrapper.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/useIcebergWrapper.tsx index 9da05a5393..5b1cc1e743 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/useIcebergWrapper.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/useIcebergWrapper.tsx @@ -1,6 +1,6 @@ -import { INTEGRATIONS } from 'components/interfaces/Integrations/Landing/Integrations.constants' -import { useDatabaseExtensionsQuery } from 'data/database-extensions/database-extensions-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' +import { INTEGRATIONS } from '@/components/interfaces/Integrations/Landing/Integrations.constants' +import { useDatabaseExtensionsQuery } from '@/data/database-extensions/database-extensions-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export const useIcebergWrapperExtension = () => { const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/CreateAnalyticsBucketForm.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/CreateAnalyticsBucketForm.tsx index 2e2ce35a22..c391e531ea 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/CreateAnalyticsBucketForm.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/CreateAnalyticsBucketForm.tsx @@ -1,18 +1,7 @@ import { zodResolver } from '@hookform/resolvers/zod' +import { useParams } from 'common' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import z from 'zod' - -import { useParams } from 'common' -import { InlineLink } from 'components/ui/InlineLink' -import { useDatabaseExtensionEnableMutation } from 'data/database-extensions/database-extension-enable-mutation' -import { useAnalyticsBucketCreateMutation } from 'data/storage/analytics-bucket-create-mutation' -import { useAnalyticsBucketsQuery } from 'data/storage/analytics-buckets-query' -import { useIcebergWrapperCreateMutation } from 'data/storage/iceberg-wrapper-create-mutation' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import { Button, cn, @@ -27,12 +16,23 @@ import { } from 'ui' import { Admonition } from 'ui-patterns' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import z from 'zod' + import { useIcebergWrapperExtension } from './AnalyticsBucketDetails/useIcebergWrapper' import { reservedPrefixes, reservedSuffixes, validBucketNameRegex, } from './CreateAnalyticsBucketForm.utils' +import { InlineLink } from '@/components/ui/InlineLink' +import { useDatabaseExtensionEnableMutation } from '@/data/database-extensions/database-extension-enable-mutation' +import { useAnalyticsBucketCreateMutation } from '@/data/storage/analytics-bucket-create-mutation' +import { useAnalyticsBucketsQuery } from '@/data/storage/analytics-buckets-query' +import { useIcebergWrapperCreateMutation } from '@/data/storage/iceberg-wrapper-create-mutation' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' const FormSchema = z .object({ diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/CreateAnalyticsBucketModal.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/CreateAnalyticsBucketModal.tsx index 86b3609e38..0406a8c06f 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/CreateAnalyticsBucketModal.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/CreateAnalyticsBucketModal.tsx @@ -1,4 +1,5 @@ import { Dialog, DialogContent, DialogHeader, DialogSectionSeparator, DialogTitle } from 'ui' + import { BUCKET_TYPES } from '../Storage.constants' import { CreateAnalyticsBucketForm } from './CreateAnalyticsBucketForm' diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/CreateAnalyticsBucketSheet.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/CreateAnalyticsBucketSheet.tsx index 732381fc0d..9c030c2035 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/CreateAnalyticsBucketSheet.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/CreateAnalyticsBucketSheet.tsx @@ -1,4 +1,5 @@ import { Sheet, SheetContent, SheetHeader, SheetTitle } from 'ui' + import { BUCKET_TYPES } from '../Storage.constants' import { CreateAnalyticsBucketForm } from './CreateAnalyticsBucketForm' diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/DeleteAnalyticsBucketModal.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/DeleteAnalyticsBucketModal.tsx index 0a5b86829c..19b66de507 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/DeleteAnalyticsBucketModal.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/DeleteAnalyticsBucketModal.tsx @@ -1,10 +1,10 @@ +import { useParams } from 'common' import { toast } from 'sonner' -import { useParams } from 'common' -import { TextConfirmModal } from 'components/ui/TextConfirmModalWrapper' -import { useAnalyticsBucketDeleteMutation } from 'data/storage/analytics-bucket-delete-mutation' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { useAnalyticsBucketDeleteCleanUp } from './AnalyticsBucketDetails/useAnalyticsBucketAssociatedEntities' +import { TextConfirmModal } from '@/components/ui/TextConfirmModalWrapper' +import { useAnalyticsBucketDeleteMutation } from '@/data/storage/analytics-bucket-delete-mutation' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export interface DeleteAnalyticsBucketModalProps { visible: boolean diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/index.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/index.tsx index 510f877a0a..be9c59dc7a 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/index.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/index.tsx @@ -1,15 +1,9 @@ +import { useParams } from 'common' +import { AnalyticsBucket as AnalyticsBucketIcon } from 'icons' import { ChevronRight, Search } from 'lucide-react' import { useRouter } from 'next/navigation' import { parseAsBoolean, useQueryState } from 'nuqs' import { useState } from 'react' - -import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { AlphaNotice } from 'components/ui/AlphaNotice' -import { useProjectStorageConfigQuery } from 'data/config/project-storage-config-query' -import { useAnalyticsBucketsQuery } from 'data/storage/analytics-buckets-query' -import { AnalyticsBucket as AnalyticsBucketIcon } from 'icons' -import { createNavigationHandler } from 'lib/navigation' import { Card, Table, @@ -27,9 +21,15 @@ import { Input } from 'ui-patterns/DataInputs/Input' import { PageContainer } from 'ui-patterns/PageContainer' import { PageSection, PageSectionContent, PageSectionTitle } from 'ui-patterns/PageSection' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' + import { EmptyBucketState } from '../EmptyBucketState' import { CreateBucketButton } from '../NewBucketButton' import { CreateAnalyticsBucketModal } from './CreateAnalyticsBucketModal' +import AlertError from '@/components/ui/AlertError' +import { AlphaNotice } from '@/components/ui/AlphaNotice' +import { useProjectStorageConfigQuery } from '@/data/config/project-storage-config-query' +import { useAnalyticsBucketsQuery } from '@/data/storage/analytics-buckets-query' +import { createNavigationHandler } from '@/lib/navigation' export const AnalyticsBuckets = () => { const { ref } = useParams() diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/useSelectedAnalyticsBucket.ts b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/useSelectedAnalyticsBucket.ts index 02918bbc10..cf2d4b5fda 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/useSelectedAnalyticsBucket.ts +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/useSelectedAnalyticsBucket.ts @@ -1,6 +1,7 @@ import { useParams } from 'common' -import { useIsAnalyticsBucketsEnabled } from 'data/config/project-storage-config-query' -import { useAnalyticsBucketsQuery } from 'data/storage/analytics-buckets-query' + +import { useIsAnalyticsBucketsEnabled } from '@/data/config/project-storage-config-query' +import { useAnalyticsBucketsQuery } from '@/data/storage/analytics-buckets-query' export const useSelectedAnalyticsBucket = () => { const { ref, bucketId } = useParams() diff --git a/apps/studio/components/interfaces/Storage/BucketsUpgradePlan.tsx b/apps/studio/components/interfaces/Storage/BucketsUpgradePlan.tsx index cb6c2eb970..de66af97ca 100644 --- a/apps/studio/components/interfaces/Storage/BucketsUpgradePlan.tsx +++ b/apps/studio/components/interfaces/Storage/BucketsUpgradePlan.tsx @@ -1,10 +1,11 @@ -import { AlphaNotice } from 'components/ui/AlphaNotice' -import { UpgradePlanButton } from 'components/ui/UpgradePlanButton' import { AnalyticsBucket as AnalyticsBucketIcon, VectorBucket as VectorBucketIcon } from 'icons' import { EmptyStatePresentational } from 'ui-patterns' import { PageContainer } from 'ui-patterns/PageContainer' import { PageSection, PageSectionContent } from 'ui-patterns/PageSection' + import { BUCKET_TYPES } from './Storage.constants' +import { AlphaNotice } from '@/components/ui/AlphaNotice' +import { UpgradePlanButton } from '@/components/ui/UpgradePlanButton' export const BucketsUpgradePlan = ({ type }: { type: 'analytics' | 'vector' }) => { return ( diff --git a/apps/studio/components/interfaces/Storage/CreateBucketModal.tsx b/apps/studio/components/interfaces/Storage/CreateBucketModal.tsx index aea27e3fc7..363bb71030 100644 --- a/apps/studio/components/interfaces/Storage/CreateBucketModal.tsx +++ b/apps/studio/components/interfaces/Storage/CreateBucketModal.tsx @@ -1,17 +1,8 @@ import { zodResolver } from '@hookform/resolvers/zod' +import { useParams } from 'common' import { useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import z from 'zod' - -import { useParams } from 'common' -import { StorageSizeUnits } from 'components/interfaces/Storage/StorageSettings/StorageSettings.constants' -import { InlineLink } from 'components/ui/InlineLink' -import { useProjectStorageConfigQuery } from 'data/config/project-storage-config-query' -import { useBucketCreateMutation } from 'data/storage/bucket-create-mutation' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { IS_PLATFORM } from 'lib/constants' import { Button, Dialog, @@ -35,8 +26,17 @@ import { } from 'ui' import { Admonition } from 'ui-patterns/admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import z from 'zod' + import { inverseValidBucketNameRegex, validBucketNameRegex } from './CreateBucketModal.utils' import { convertFromBytes, convertToBytes } from './StorageSettings/StorageSettings.utils' +import { StorageSizeUnits } from '@/components/interfaces/Storage/StorageSettings/StorageSettings.constants' +import { InlineLink } from '@/components/ui/InlineLink' +import { useProjectStorageConfigQuery } from '@/data/config/project-storage-config-query' +import { useBucketCreateMutation } from '@/data/storage/bucket-create-mutation' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { IS_PLATFORM } from '@/lib/constants' const FormSchema = z .object({ diff --git a/apps/studio/components/interfaces/Storage/DeleteBucketModal.tsx b/apps/studio/components/interfaces/Storage/DeleteBucketModal.tsx index e8b76abeea..939a6eec61 100644 --- a/apps/studio/components/interfaces/Storage/DeleteBucketModal.tsx +++ b/apps/studio/components/interfaces/Storage/DeleteBucketModal.tsx @@ -1,14 +1,14 @@ +import { useParams } from 'common' import { useRouter } from 'next/router' import { toast } from 'sonner' -import { useParams } from 'common' -import { TextConfirmModal } from 'components/ui/TextConfirmModalWrapper' -import { useDatabasePoliciesQuery } from 'data/database-policies/database-policies-query' -import { useDatabasePolicyDeleteMutation } from 'data/database-policies/database-policy-delete-mutation' -import { useBucketDeleteMutation } from 'data/storage/bucket-delete-mutation' -import { Bucket } from 'data/storage/buckets-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { extractBucketNameFromDefinition } from './Storage.utils' +import { TextConfirmModal } from '@/components/ui/TextConfirmModalWrapper' +import { useDatabasePoliciesQuery } from '@/data/database-policies/database-policies-query' +import { useDatabasePolicyDeleteMutation } from '@/data/database-policies/database-policy-delete-mutation' +import { useBucketDeleteMutation } from '@/data/storage/bucket-delete-mutation' +import { Bucket } from '@/data/storage/buckets-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export interface DeleteBucketModalProps { visible: boolean diff --git a/apps/studio/components/interfaces/Storage/EditBucketModal.tsx b/apps/studio/components/interfaces/Storage/EditBucketModal.tsx index 62552e195b..ad46aeced3 100644 --- a/apps/studio/components/interfaces/Storage/EditBucketModal.tsx +++ b/apps/studio/components/interfaces/Storage/EditBucketModal.tsx @@ -1,20 +1,8 @@ import { zodResolver } from '@hookform/resolvers/zod' -import { useEffect, useRef, useState } from 'react' -import { type SubmitHandler, useForm } from 'react-hook-form' -import { toast } from 'sonner' -import { z } from 'zod' - import { useParams } from 'common' -import { StorageSizeUnits } from 'components/interfaces/Storage/StorageSettings/StorageSettings.constants' -import { - convertFromBytes, - convertToBytes, -} from 'components/interfaces/Storage/StorageSettings/StorageSettings.utils' -import { InlineLink } from 'components/ui/InlineLink' -import { useProjectStorageConfigQuery } from 'data/config/project-storage-config-query' -import { useBucketUpdateMutation } from 'data/storage/bucket-update-mutation' -import { Bucket } from 'data/storage/buckets-query' -import { DOCS_URL, IS_PLATFORM } from 'lib/constants' +import { useEffect, useRef, useState } from 'react' +import { useForm, type SubmitHandler } from 'react-hook-form' +import { toast } from 'sonner' import { Button, Dialog, @@ -24,20 +12,32 @@ import { DialogSection, DialogSectionSeparator, DialogTitle, + Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, FormMessage_Shadcn_, - Form_Shadcn_, Input_Shadcn_, + Select_Shadcn_, SelectContent_Shadcn_, SelectItem_Shadcn_, SelectTrigger_Shadcn_, SelectValue_Shadcn_, - Select_Shadcn_, Switch, } from 'ui' import { Admonition } from 'ui-patterns' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import { z } from 'zod' + +import { StorageSizeUnits } from '@/components/interfaces/Storage/StorageSettings/StorageSettings.constants' +import { + convertFromBytes, + convertToBytes, +} from '@/components/interfaces/Storage/StorageSettings/StorageSettings.utils' +import { InlineLink } from '@/components/ui/InlineLink' +import { useProjectStorageConfigQuery } from '@/data/config/project-storage-config-query' +import { useBucketUpdateMutation } from '@/data/storage/bucket-update-mutation' +import { Bucket } from '@/data/storage/buckets-query' +import { DOCS_URL, IS_PLATFORM } from '@/lib/constants' export interface EditBucketModalProps { visible: boolean diff --git a/apps/studio/components/interfaces/Storage/EmptyBucketModal.tsx b/apps/studio/components/interfaces/Storage/EmptyBucketModal.tsx index f9d9b15aad..83641e7222 100644 --- a/apps/studio/components/interfaces/Storage/EmptyBucketModal.tsx +++ b/apps/studio/components/interfaces/Storage/EmptyBucketModal.tsx @@ -1,9 +1,5 @@ import { useParams } from 'common' import { toast } from 'sonner' - -import { useBucketEmptyMutation } from 'data/storage/bucket-empty-mutation' -import type { Bucket } from 'data/storage/buckets-query' -import { useStorageExplorerStateSnapshot } from 'state/storage-explorer' import { Button, Dialog, @@ -16,6 +12,10 @@ import { } from 'ui' import { Admonition } from 'ui-patterns' +import { useBucketEmptyMutation } from '@/data/storage/bucket-empty-mutation' +import type { Bucket } from '@/data/storage/buckets-query' +import { useStorageExplorerStateSnapshot } from '@/state/storage-explorer' + export interface EmptyBucketModalProps { visible: boolean bucket?: Bucket diff --git a/apps/studio/components/interfaces/Storage/EmptyBucketState.tsx b/apps/studio/components/interfaces/Storage/EmptyBucketState.tsx index e080d7e537..61bb1d2eb7 100644 --- a/apps/studio/components/interfaces/Storage/EmptyBucketState.tsx +++ b/apps/studio/components/interfaces/Storage/EmptyBucketState.tsx @@ -1,5 +1,6 @@ import { BucketPlus } from 'icons' import { EmptyStatePresentational } from 'ui-patterns' + import { CreateBucketButton } from './NewBucketButton' import { BUCKET_TYPES } from './Storage.constants' diff --git a/apps/studio/components/interfaces/Storage/FilesBuckets/BucketTable.tsx b/apps/studio/components/interfaces/Storage/FilesBuckets/BucketTable.tsx index d26eba51bc..2383c43c8b 100644 --- a/apps/studio/components/interfaces/Storage/FilesBuckets/BucketTable.tsx +++ b/apps/studio/components/interfaces/Storage/FilesBuckets/BucketTable.tsx @@ -1,14 +1,4 @@ -import { useBucketPolicyCount } from 'components/interfaces/Storage/useBucketPolicyCount' -import { - VirtualizedTableCell, - VirtualizedTableHead, - VirtualizedTableHeader, - VirtualizedTableRow, -} from 'components/ui/VirtualizedTable' -import { Bucket } from 'data/storage/buckets-query' import { FilesBucket as FilesBucketIcon } from 'icons' -import { formatBytes } from 'lib/helpers' -import { createNavigationHandler } from 'lib/navigation' import { ChevronRight } from 'lucide-react' import { useRouter } from 'next/navigation' import { @@ -22,6 +12,17 @@ import { TooltipTrigger, } from 'ui' +import { useBucketPolicyCount } from '@/components/interfaces/Storage/useBucketPolicyCount' +import { + VirtualizedTableCell, + VirtualizedTableHead, + VirtualizedTableHeader, + VirtualizedTableRow, +} from '@/components/ui/VirtualizedTable' +import { Bucket } from '@/data/storage/buckets-query' +import { formatBytes } from '@/lib/helpers' +import { createNavigationHandler } from '@/lib/navigation' + type BucketTableMode = 'standard' | 'virtualized' type BucketTableHeaderProps = { diff --git a/apps/studio/components/interfaces/Storage/FilesBuckets/BucketsTable.LoadMoreRow.tsx b/apps/studio/components/interfaces/Storage/FilesBuckets/BucketsTable.LoadMoreRow.tsx index 1e4902713d..ef6eafbef6 100644 --- a/apps/studio/components/interfaces/Storage/FilesBuckets/BucketsTable.LoadMoreRow.tsx +++ b/apps/studio/components/interfaces/Storage/FilesBuckets/BucketsTable.LoadMoreRow.tsx @@ -1,9 +1,10 @@ import { useIntersectionObserver } from '@uidotdev/usehooks' -import { VirtualizedTableCell, VirtualizedTableRow } from 'components/ui/VirtualizedTable' import { useEffect, type ReactNode } from 'react' import { TableCell, TableRow } from 'ui' import { ShimmeringLoader } from 'ui-patterns' + import type { BucketsTablePaginationProps } from './BucketsTable.types' +import { VirtualizedTableCell, VirtualizedTableRow } from '@/components/ui/VirtualizedTable' type LoadMoreRowProps = { mode: 'standard' | 'virtualized' diff --git a/apps/studio/components/interfaces/Storage/FilesBuckets/BucketsTable.tsx b/apps/studio/components/interfaces/Storage/FilesBuckets/BucketsTable.tsx index b6e09d9302..6cedc17b17 100644 --- a/apps/studio/components/interfaces/Storage/FilesBuckets/BucketsTable.tsx +++ b/apps/studio/components/interfaces/Storage/FilesBuckets/BucketsTable.tsx @@ -1,11 +1,11 @@ import { useRef } from 'react' - -import { VirtualizedTable, VirtualizedTableBody } from 'components/ui/VirtualizedTable' -import { Bucket } from 'data/storage/buckets-query' import { Table, TableBody } from 'ui' -import { BucketTableEmptyState, BucketTableHeader, BucketTableRow } from './BucketTable' + import { LoadMoreRow } from './BucketsTable.LoadMoreRow' import type { BucketsTablePaginationProps } from './BucketsTable.types' +import { BucketTableEmptyState, BucketTableHeader, BucketTableRow } from './BucketTable' +import { VirtualizedTable, VirtualizedTableBody } from '@/components/ui/VirtualizedTable' +import { Bucket } from '@/data/storage/buckets-query' type BucketsTableProps = { buckets: Bucket[] diff --git a/apps/studio/components/interfaces/Storage/FilesBuckets/index.tsx b/apps/studio/components/interfaces/Storage/FilesBuckets/index.tsx index 85c93a6e4d..fb63378784 100644 --- a/apps/studio/components/interfaces/Storage/FilesBuckets/index.tsx +++ b/apps/studio/components/interfaces/Storage/FilesBuckets/index.tsx @@ -1,16 +1,8 @@ import { useDebounce } from '@uidotdev/usehooks' -import { ArrowDownNarrowWide, Search } from 'lucide-react' -import { useCallback, useMemo, useState } from 'react' - import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { InlineLink } from 'components/ui/InlineLink' -import { useProjectStorageConfigQuery } from 'data/config/project-storage-config-query' -import { usePaginatedBucketsQuery } from 'data/storage/buckets-query' -import { IS_PLATFORM } from 'lib/constants' -import { formatBytes } from 'lib/helpers' +import { ArrowDownNarrowWide, Search } from 'lucide-react' import { parseAsBoolean, useQueryState } from 'nuqs' -import { useStorageExplorerStateSnapshot } from 'state/storage-explorer' +import { useCallback, useMemo, useState } from 'react' import { Button, Card, @@ -25,11 +17,19 @@ import { Input } from 'ui-patterns/DataInputs/Input' import { PageContainer } from 'ui-patterns/PageContainer' import { PageSection, PageSectionContent } from 'ui-patterns/PageSection' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' + import { CreateBucketModal } from '../CreateBucketModal' import { EmptyBucketState } from '../EmptyBucketState' import { CreateBucketButton } from '../NewBucketButton' import { STORAGE_BUCKET_SORT } from '../Storage.constants' import { BucketsTable } from './BucketsTable' +import AlertError from '@/components/ui/AlertError' +import { InlineLink } from '@/components/ui/InlineLink' +import { useProjectStorageConfigQuery } from '@/data/config/project-storage-config-query' +import { usePaginatedBucketsQuery } from '@/data/storage/buckets-query' +import { IS_PLATFORM } from '@/lib/constants' +import { formatBytes } from '@/lib/helpers' +import { useStorageExplorerStateSnapshot } from '@/state/storage-explorer' export const FilesBuckets = () => { const { ref } = useParams() diff --git a/apps/studio/components/interfaces/Storage/FilesBuckets/useSelectedBucket.ts b/apps/studio/components/interfaces/Storage/FilesBuckets/useSelectedBucket.ts index 65308de92b..08a4ccca09 100644 --- a/apps/studio/components/interfaces/Storage/FilesBuckets/useSelectedBucket.ts +++ b/apps/studio/components/interfaces/Storage/FilesBuckets/useSelectedBucket.ts @@ -1,5 +1,6 @@ import { useParams } from 'common' -import { useBucketQuery } from 'data/storage/buckets-query' + +import { useBucketQuery } from '@/data/storage/buckets-query' export const useSelectedBucket = () => { const { ref, bucketId } = useParams() diff --git a/apps/studio/components/interfaces/Storage/ImportForeignSchemaDialog.tsx b/apps/studio/components/interfaces/Storage/ImportForeignSchemaDialog.tsx index fe4b4a82a1..c91ec82928 100644 --- a/apps/studio/components/interfaces/Storage/ImportForeignSchemaDialog.tsx +++ b/apps/studio/components/interfaces/Storage/ImportForeignSchemaDialog.tsx @@ -1,24 +1,24 @@ import { zodResolver } from '@hookform/resolvers/zod' +import { useParams } from 'common' import { uniq } from 'lodash' import { useEffect, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import z from 'zod' - -import { useParams } from 'common' -import { useSchemaCreateMutation } from 'data/database/schema-create-mutation' -import { useSchemasQuery } from 'data/database/schemas-query' -import { useFDWImportForeignSchemaMutation } from 'data/fdw/fdw-import-foreign-schema-mutation' -import { useFDWUpdateMutation } from 'data/fdw/fdw-update-mutation' -import { getFDWs } from 'data/fdw/fdws-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Button, Form_Shadcn_, FormField_Shadcn_, Input_Shadcn_, Modal, Separator } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import z from 'zod' + import { formatWrapperTables } from '../Integrations/Wrappers/Wrappers.utils' import { SchemaEditor } from '../TableGridEditor/SidePanelEditor/SchemaEditor' import { getAnalyticsBucketFDWServerName } from './AnalyticsBuckets/AnalyticsBucketDetails/AnalyticsBucketDetails.utils' import { useAnalyticsBucketAssociatedEntities } from './AnalyticsBuckets/AnalyticsBucketDetails/useAnalyticsBucketAssociatedEntities' import { getDecryptedParameters } from './Storage.utils' +import { useSchemaCreateMutation } from '@/data/database/schema-create-mutation' +import { useSchemasQuery } from '@/data/database/schemas-query' +import { useFDWImportForeignSchemaMutation } from '@/data/fdw/fdw-import-foreign-schema-mutation' +import { useFDWUpdateMutation } from '@/data/fdw/fdw-update-mutation' +import { getFDWs } from '@/data/fdw/fdws-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export interface ImportForeignSchemaDialogProps { namespace: string diff --git a/apps/studio/components/interfaces/Storage/NewBucketButton.tsx b/apps/studio/components/interfaces/Storage/NewBucketButton.tsx index f356f155c7..8d088f9037 100644 --- a/apps/studio/components/interfaces/Storage/NewBucketButton.tsx +++ b/apps/studio/components/interfaces/Storage/NewBucketButton.tsx @@ -2,8 +2,8 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { Plus } from 'lucide-react' import { MouseEventHandler } from 'react' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' export const CreateBucketButton = ({ onClick, diff --git a/apps/studio/components/interfaces/Storage/Storage.Commands.tsx b/apps/studio/components/interfaces/Storage/Storage.Commands.tsx index 77f14d4921..16089006e7 100644 --- a/apps/studio/components/interfaces/Storage/Storage.Commands.tsx +++ b/apps/studio/components/interfaces/Storage/Storage.Commands.tsx @@ -1,8 +1,9 @@ import { useParams } from 'common' -import { COMMAND_MENU_SECTIONS } from 'components/interfaces/App/CommandMenu/CommandMenu.utils' import type { CommandOptions } from 'ui-patterns/CommandMenu' import { useRegisterCommands } from 'ui-patterns/CommandMenu' +import { COMMAND_MENU_SECTIONS } from '@/components/interfaces/App/CommandMenu/CommandMenu.utils' + export function useStorageGotoCommands(options?: CommandOptions) { let { ref } = useParams() ref ||= '_' diff --git a/apps/studio/components/interfaces/Storage/Storage.constants.ts b/apps/studio/components/interfaces/Storage/Storage.constants.ts index c8669b8ab2..70daadf21f 100644 --- a/apps/studio/components/interfaces/Storage/Storage.constants.ts +++ b/apps/studio/components/interfaces/Storage/Storage.constants.ts @@ -1,4 +1,4 @@ -import { DOCS_URL } from 'lib/constants' +import { DOCS_URL } from '@/lib/constants' // Original storage constants export enum URL_EXPIRY_DURATION { diff --git a/apps/studio/components/interfaces/Storage/Storage.types.ts b/apps/studio/components/interfaces/Storage/Storage.types.ts index 3b76c8bdab..e182853176 100644 --- a/apps/studio/components/interfaces/Storage/Storage.types.ts +++ b/apps/studio/components/interfaces/Storage/Storage.types.ts @@ -1,6 +1,5 @@ -import type { PolicyFormField } from 'components/interfaces/Auth/Policies/Policies.types' - import { STORAGE_ROW_STATUS, STORAGE_ROW_TYPES } from './Storage.constants' +import type { PolicyFormField } from '@/components/interfaces/Auth/Policies/Policies.types' export interface StoragePolicyFormField extends PolicyFormField { allowedOperations: string[] diff --git a/apps/studio/components/interfaces/Storage/Storage.utils.ts b/apps/studio/components/interfaces/Storage/Storage.utils.ts index aaf4fdf69a..197bfe692c 100644 --- a/apps/studio/components/interfaces/Storage/Storage.utils.ts +++ b/apps/studio/components/interfaces/Storage/Storage.utils.ts @@ -2,14 +2,14 @@ import { PostgresPolicy } from '@supabase/postgres-meta' import { difference } from 'lodash' import { useRouter } from 'next/router' -import { WrapperMeta } from 'components/interfaces/Integrations/Wrappers/Wrappers.types' -import { convertKVStringArrayToJson } from 'components/interfaces/Integrations/Wrappers/Wrappers.utils' -import { FDW } from 'data/fdw/fdws-query' -import { Bucket } from 'data/storage/buckets-query' -import { getDecryptedValues } from 'data/vault/vault-secret-decrypted-value-query' -import { createWrappedSymbol } from 'lib/helpers' import { STORAGE_CLIENT_LIBRARY_MAPPINGS } from './Storage.constants' import type { StoragePolicyFormField } from './Storage.types' +import { WrapperMeta } from '@/components/interfaces/Integrations/Wrappers/Wrappers.types' +import { convertKVStringArrayToJson } from '@/components/interfaces/Integrations/Wrappers/Wrappers.utils' +import { FDW } from '@/data/fdw/fdws-query' +import { Bucket } from '@/data/storage/buckets-query' +import { getDecryptedValues } from '@/data/vault/vault-secret-decrypted-value-query' +import { createWrappedSymbol } from '@/lib/helpers' const shortHash = (str: string) => { let hash = 0 diff --git a/apps/studio/components/interfaces/Storage/StorageBucketsError.tsx b/apps/studio/components/interfaces/Storage/StorageBucketsError.tsx index a13720a5ff..8384085fcb 100644 --- a/apps/studio/components/interfaces/Storage/StorageBucketsError.tsx +++ b/apps/studio/components/interfaces/Storage/StorageBucketsError.tsx @@ -1,8 +1,9 @@ import { SupportCategories } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import type { ResponseError } from 'types' import { Alert, Button } from 'ui' + import { SupportLink } from '../Support/SupportLink' +import type { ResponseError } from '@/types' export interface StorageBucketsErrorProps { error: ResponseError diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/ColumnContextMenu.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/ColumnContextMenu.tsx index c9c5204d08..5cb538c711 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/ColumnContextMenu.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/ColumnContextMenu.tsx @@ -1,17 +1,19 @@ import { compact, uniqBy } from 'lodash' import { Item, Menu, Separator, Submenu } from 'react-contexify' + import 'react-contexify/dist/ReactContexify.css' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { ChevronRight, ChevronsDown, ChevronsUp, Copy, Eye, FolderPlus } from 'lucide-react' -import { useStorageExplorerStateSnapshot } from 'state/storage-explorer' + import { STORAGE_ROW_TYPES, STORAGE_SORT_BY, STORAGE_SORT_BY_ORDER, STORAGE_VIEWS, } from '../Storage.constants' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useStorageExplorerStateSnapshot } from '@/state/storage-explorer' interface ColumnContextMenuProps { id: string diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/ConfirmDeleteModal.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/ConfirmDeleteModal.tsx index e55b7e1c53..4a37d81ec4 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/ConfirmDeleteModal.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/ConfirmDeleteModal.tsx @@ -1,8 +1,8 @@ import { useEffect, useState } from 'react' - -import { useStorageExplorerStateSnapshot } from '@/state/storage-explorer' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' + import { STORAGE_ROW_TYPES } from '../Storage.constants' +import { useStorageExplorerStateSnapshot } from '@/state/storage-explorer' export const ConfirmDeleteModal = () => { const [deleting, setDeleting] = useState(false) diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/CustomExpiryModal.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/CustomExpiryModal.tsx index 583bb87b74..d59832c5d7 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/CustomExpiryModal.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/CustomExpiryModal.tsx @@ -1,8 +1,6 @@ import { zodResolver } from '@hookform/resolvers/zod' import dayjs from 'dayjs' -import { DATETIME_FORMAT } from 'lib/constants' import { SubmitHandler, useForm, useWatch } from 'react-hook-form' -import { useStorageExplorerStateSnapshot } from 'state/storage-explorer' import { Button, Form_Shadcn_, @@ -20,6 +18,8 @@ import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import * as z from 'zod' import { useCopyUrl } from './useCopyUrl' +import { DATETIME_FORMAT } from '@/lib/constants' +import { useStorageExplorerStateSnapshot } from '@/state/storage-explorer' const unitMap = { days: 3600 * 24, diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorer.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorer.tsx index 1bfcc42d5f..71e1aeb356 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorer.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorer.tsx @@ -1,6 +1,5 @@ import { noop } from 'lodash' import { useEffect, useRef } from 'react' -import { useStorageExplorerStateSnapshot } from 'state/storage-explorer' import { cn } from 'ui' import { CONTEXT_MENU_KEYS, STORAGE_ROW_STATUS, STORAGE_VIEWS } from '../Storage.constants' @@ -9,6 +8,7 @@ import { ColumnContextMenu } from './ColumnContextMenu' import { FileExplorerColumn } from './FileExplorerColumn' import { FolderContextMenu } from './FolderContextMenu' import { ItemContextMenu } from './ItemContextMenu' +import { useStorageExplorerStateSnapshot } from '@/state/storage-explorer' export interface FileExplorerProps { columns: StorageColumn[] diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerColumn.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerColumn.tsx index 52a77b63d1..aaec878c0a 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerColumn.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerColumn.tsx @@ -5,14 +5,9 @@ import { Upload } from 'lucide-react' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useContextMenu } from 'react-contexify' import { toast } from 'sonner' - -import { InfiniteListDefault, LoaderForIconMenuItems } from 'components/ui/InfiniteList' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { BASE_PATH } from 'lib/constants' -import { formatBytes } from 'lib/helpers' -import { useStorageExplorerStateSnapshot } from 'state/storage-explorer' import { Checkbox, cn } from 'ui' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' + import { CONTEXT_MENU_KEYS, STORAGE_ROW_STATUS, @@ -21,6 +16,11 @@ import { } from '../Storage.constants' import type { StorageColumn, StorageItemWithColumn } from '../Storage.types' import { FileExplorerRow } from './FileExplorerRow' +import { InfiniteListDefault, LoaderForIconMenuItems } from '@/components/ui/InfiniteList' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { BASE_PATH } from '@/lib/constants' +import { formatBytes } from '@/lib/helpers' +import { useStorageExplorerStateSnapshot } from '@/state/storage-explorer' const DragOverOverlay = ({ isOpen, onDragLeave, onDrop, folderIsEmpty }: any) => { return ( diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerHeader.test.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerHeader.test.tsx index 3f3fb85d7b..5f82f320b8 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerHeader.test.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerHeader.test.tsx @@ -2,9 +2,9 @@ import { screen, waitFor } from '@testing-library/react' import userEvent from '@testing-library/user-event' import { beforeEach, describe, expect, it, vi } from 'vitest' -import { FileExplorerHeader } from './FileExplorerHeader' import { STORAGE_SORT_BY, STORAGE_SORT_BY_ORDER, STORAGE_VIEWS } from '../Storage.constants' -import { customRender as render } from 'tests/lib/custom-render' +import { FileExplorerHeader } from './FileExplorerHeader' +import { customRender as render } from '@/tests/lib/custom-render' const { mockTrack, diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerHeader.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerHeader.tsx index 07737ed747..8e7d9f8964 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerHeader.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerHeader.tsx @@ -1,9 +1,4 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' -import { useIsAPIDocsSidePanelEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' -import { APIDocsButton } from 'components/ui/APIDocsButton' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useTrack } from 'lib/telemetry/track' import { compact, isEqual, noop } from 'lodash' import { ArrowLeft, @@ -20,14 +15,13 @@ import { X, } from 'lucide-react' import { - type ChangeEvent, - type ChangeEventHandler, - type SyntheticEvent, useEffect, useRef, useState, + type ChangeEvent, + type ChangeEventHandler, + type SyntheticEvent, } from 'react' -import { useStorageExplorerStateSnapshot } from 'state/storage-explorer' import { Button, cn, @@ -52,6 +46,12 @@ import { import { Input } from 'ui-patterns/DataInputs/Input' import { STORAGE_SORT_BY, STORAGE_SORT_BY_ORDER, STORAGE_VIEWS } from '../Storage.constants' +import { useIsAPIDocsSidePanelEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import { APIDocsButton } from '@/components/ui/APIDocsButton' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useTrack } from '@/lib/telemetry/track' +import { useStorageExplorerStateSnapshot } from '@/state/storage-explorer' const VIEW_OPTIONS = [ { key: STORAGE_VIEWS.COLUMNS, name: 'As columns' }, diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerHeaderSelection.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerHeaderSelection.tsx index 08f0b0cd1a..2b457f1751 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerHeaderSelection.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerHeaderSelection.tsx @@ -1,11 +1,11 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { Download, Move, Trash2, X } from 'lucide-react' - -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useStorageExplorerStateSnapshot } from 'state/storage-explorer' import { Button } from 'ui' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useStorageExplorerStateSnapshot } from '@/state/storage-explorer' + export const FileExplorerHeaderSelection = () => { const { can: canUpdateFiles } = useAsyncCheckPermissions(PermissionAction.STORAGE_WRITE, '*') diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerRow.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerRow.tsx index da0f398924..06d1da299a 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerRow.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerRow.tsx @@ -1,7 +1,5 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { FilesBucket as FilesBucketIcon } from 'icons' -import { formatBytes } from 'lib/helpers' import { find, isEmpty, isEqual } from 'lodash' import { AlertCircle, @@ -20,7 +18,6 @@ import { } from 'lucide-react' import type { CSSProperties } from 'react' import { useContextMenu } from 'react-contexify' -import { useStorageExplorerStateSnapshot } from 'state/storage-explorer' import { Checkbox, cn, @@ -49,6 +46,9 @@ import { StorageItemWithColumn, type StorageItem } from '../Storage.types' import { FileExplorerRowEditing } from './FileExplorerRowEditing' import { copyPathToFolder } from './StorageExplorer.utils' import { useCopyUrl } from './useCopyUrl' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { formatBytes } from '@/lib/helpers' +import { useStorageExplorerStateSnapshot } from '@/state/storage-explorer' export const RowIcon = ({ view, diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerRowEditing.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerRowEditing.tsx index 3914352bb1..10a50275a6 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerRowEditing.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/FileExplorerRowEditing.tsx @@ -1,10 +1,10 @@ import { has } from 'lodash' import { useEffect, useRef, useState, type CSSProperties } from 'react' -import { useStorageExplorerStateSnapshot } from 'state/storage-explorer' import { STORAGE_ROW_STATUS, STORAGE_ROW_TYPES, STORAGE_VIEWS } from '../Storage.constants' import { StorageItem } from '../Storage.types' import { RowIcon } from './FileExplorerRow' +import { useStorageExplorerStateSnapshot } from '@/state/storage-explorer' export interface FileExplorerRowEditingProps { item: StorageItem diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/FolderContextMenu.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/FolderContextMenu.tsx index b52a18bb28..9c0050bf34 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/FolderContextMenu.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/FolderContextMenu.tsx @@ -1,11 +1,12 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { Copy, Download, Edit, Trash2 } from 'lucide-react' import { Item, Menu, Separator } from 'react-contexify' + import 'react-contexify/dist/ReactContexify.css' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useStorageExplorerStateSnapshot } from 'state/storage-explorer' import { copyPathToFolder } from './StorageExplorer.utils' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useStorageExplorerStateSnapshot } from '@/state/storage-explorer' interface FolderContextMenuProps { id: string diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/ItemContextMenu.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/ItemContextMenu.tsx index 4f5fcba4f1..6b7ec64b32 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/ItemContextMenu.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/ItemContextMenu.tsx @@ -5,12 +5,12 @@ import { Item, Menu, Separator, Submenu } from 'react-contexify' import 'react-contexify/dist/ReactContexify.css' import { useParams } from 'common' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useStorageExplorerStateSnapshot } from 'state/storage-explorer' import { URL_EXPIRY_DURATION } from '../Storage.constants' import { StorageItemWithColumn } from '../Storage.types' import { useCopyUrl } from './useCopyUrl' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useStorageExplorerStateSnapshot } from '@/state/storage-explorer' interface ItemContextMenuProps { id: string diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/MoveItemsModal.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/MoveItemsModal.tsx index 8da76072e4..066f84b5ee 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/MoveItemsModal.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/MoveItemsModal.tsx @@ -1,7 +1,7 @@ import { noop } from 'lodash' import { useEffect, useState } from 'react' - import { Button, Input, Modal } from 'ui' + import { StorageItemWithColumn } from '../Storage.types' interface MoveItemsModalProps { diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/PreviewPane.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/PreviewPane.tsx index 56be45a6f3..951c022426 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/PreviewPane.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/PreviewPane.tsx @@ -1,13 +1,8 @@ import { Transition } from '@headlessui/react' import { PermissionAction } from '@supabase/shared-types/out/constants' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { BASE_PATH } from 'lib/constants' -import { formatBytes } from 'lib/helpers' import { isEmpty } from 'lodash' import { AlertCircle, ChevronDown, Copy, Download, LoaderCircle, Trash2, X } from 'lucide-react' import SVG from 'react-inlinesvg' -import { useStorageExplorerStateSnapshot } from 'state/storage-explorer' import { Button, DropdownMenu, @@ -20,6 +15,11 @@ import { URL_EXPIRY_DURATION } from '../Storage.constants' import { StorageItem } from '../Storage.types' import { useCopyUrl } from './useCopyUrl' import { useFetchFileUrlQuery } from './useFetchFileUrlQuery' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { BASE_PATH } from '@/lib/constants' +import { formatBytes } from '@/lib/helpers' +import { useStorageExplorerStateSnapshot } from '@/state/storage-explorer' const PREVIEW_SIZE_LIMIT = 10 * 1024 * 1024 // 10MB diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/StorageExplorer.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/StorageExplorer.tsx index 9b8515b3f9..b0bc13c26b 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/StorageExplorer.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/StorageExplorer.tsx @@ -1,11 +1,7 @@ import { useDebounce } from '@uidotdev/usehooks' import { useParams } from 'common' -import { useProjectStorageConfigQuery } from 'data/config/project-storage-config-query' -import type { Bucket } from 'data/storage/buckets-query' -import { IS_PLATFORM } from 'lib/constants' import { compact, get, isEmpty, uniqBy } from 'lodash' import { useEffect, useRef, useState } from 'react' -import { useStorageExplorerStateSnapshot } from 'state/storage-explorer' import { useSelectedBucket } from '../FilesBuckets/useSelectedBucket' import { STORAGE_ROW_TYPES, STORAGE_VIEWS } from '../Storage.constants' @@ -16,7 +12,11 @@ import { FileExplorerHeader } from './FileExplorerHeader' import { FileExplorerHeaderSelection } from './FileExplorerHeaderSelection' import { MoveItemsModal } from './MoveItemsModal' import { PreviewPane } from './PreviewPane' +import { useProjectStorageConfigQuery } from '@/data/config/project-storage-config-query' +import type { Bucket } from '@/data/storage/buckets-query' import { useStaticEffectEvent } from '@/hooks/useStaticEffectEvent' +import { IS_PLATFORM } from '@/lib/constants' +import { useStorageExplorerStateSnapshot } from '@/state/storage-explorer' export const StorageExplorer = () => { const { ref, bucketId } = useParams() diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/useCopyUrl.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/useCopyUrl.tsx index f475aa5e29..5581a9cf78 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/useCopyUrl.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/useCopyUrl.tsx @@ -1,11 +1,11 @@ import { useCallback } from 'react' import { toast } from 'sonner' -import { useStorageExplorerStateSnapshot } from 'state/storage-explorer' import { copyToClipboard } from 'ui' import { URL_EXPIRY_DURATION } from '../Storage.constants' import { fetchFileUrl } from './useFetchFileUrlQuery' import { useProjectApiUrl } from '@/data/config/project-endpoint-query' +import { useStorageExplorerStateSnapshot } from '@/state/storage-explorer' export const useCopyUrl = () => { const { projectRef, selectedBucket } = useStorageExplorerStateSnapshot() diff --git a/apps/studio/components/interfaces/Storage/StorageExplorer/useFetchFileUrlQuery.tsx b/apps/studio/components/interfaces/Storage/StorageExplorer/useFetchFileUrlQuery.tsx index 289303c4b9..066153c513 100644 --- a/apps/studio/components/interfaces/Storage/StorageExplorer/useFetchFileUrlQuery.tsx +++ b/apps/studio/components/interfaces/Storage/StorageExplorer/useFetchFileUrlQuery.tsx @@ -1,11 +1,12 @@ import { useQuery } from '@tanstack/react-query' -import { getPublicUrlForBucketObject } from 'data/storage/bucket-object-get-public-url-mutation' -import { signBucketObject } from 'data/storage/bucket-object-sign-mutation' -import { Bucket } from 'data/storage/buckets-query' -import { useStorageExplorerStateSnapshot } from 'state/storage-explorer' -import type { ResponseError, UseCustomQueryOptions } from 'types' + import { StorageItem } from '../Storage.types' import { getPathAlongOpenedFolders } from './StorageExplorer.utils' +import { getPublicUrlForBucketObject } from '@/data/storage/bucket-object-get-public-url-mutation' +import { signBucketObject } from '@/data/storage/bucket-object-sign-mutation' +import { Bucket } from '@/data/storage/buckets-query' +import { useStorageExplorerStateSnapshot } from '@/state/storage-explorer' +import type { ResponseError, UseCustomQueryOptions } from '@/types' const DEFAULT_EXPIRY = 7 * 24 * 60 * 60 // in seconds, default to 1 week diff --git a/apps/studio/components/interfaces/Storage/StorageMenuV2.tsx b/apps/studio/components/interfaces/Storage/StorageMenuV2.tsx index 41bfba31ec..2327766378 100644 --- a/apps/studio/components/interfaces/Storage/StorageMenuV2.tsx +++ b/apps/studio/components/interfaces/Storage/StorageMenuV2.tsx @@ -1,14 +1,14 @@ import { IS_PLATFORM, useParams } from 'common' -import { - useIsAnalyticsBucketsEnabled, - useIsVectorBucketsEnabled, -} from 'data/config/project-storage-config-query' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import Link from 'next/link' import { Badge, Menu } from 'ui' import { BUCKET_TYPES } from './Storage.constants' import { useStorageV2Page } from './Storage.utils' +import { + useIsAnalyticsBucketsEnabled, + useIsVectorBucketsEnabled, +} from '@/data/config/project-storage-config-query' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' export const StorageMenuV2 = () => { const { ref } = useParams() diff --git a/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePolicies.tsx b/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePolicies.tsx index cc28ee83d6..1bc7753d79 100644 --- a/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePolicies.tsx +++ b/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePolicies.tsx @@ -1,13 +1,5 @@ import { PostgresPolicy } from '@supabase/postgres-meta' import { useParams } from 'common' -import { PolicyEditorModal } from 'components/interfaces/Auth/Policies/PolicyEditorModal' -import { useDatabasePoliciesQuery } from 'data/database-policies/database-policies-query' -import { useDatabasePolicyCreateMutation } from 'data/database-policies/database-policy-create-mutation' -import { useDatabasePolicyDeleteMutation } from 'data/database-policies/database-policy-delete-mutation' -import { useDatabasePolicyUpdateMutation } from 'data/database-policies/database-policy-update-mutation' -import { usePaginatedBucketsQuery } from 'data/storage/buckets-query' -import { useDebouncedValue } from 'hooks/misc/useDebouncedValue' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { isEmpty } from 'lodash' import { parseAsString, useQueryState } from 'nuqs' import { useMemo, useState } from 'react' @@ -28,6 +20,14 @@ import { formatPoliciesForStorage, UNGROUPED_POLICY_SYMBOL } from '../Storage.ut import { StoragePoliciesBucketRow } from './StoragePoliciesBucketRow' import { BucketsPolicies, type SelectBucketPolicyForAction } from './StoragePoliciesBucketsSection' import { StoragePoliciesEditPolicyModal } from './StoragePoliciesEditPolicyModal' +import { PolicyEditorModal } from '@/components/interfaces/Auth/Policies/PolicyEditorModal' +import { useDatabasePoliciesQuery } from '@/data/database-policies/database-policies-query' +import { useDatabasePolicyCreateMutation } from '@/data/database-policies/database-policy-create-mutation' +import { useDatabasePolicyDeleteMutation } from '@/data/database-policies/database-policy-delete-mutation' +import { useDatabasePolicyUpdateMutation } from '@/data/database-policies/database-policy-update-mutation' +import { usePaginatedBucketsQuery } from '@/data/storage/buckets-query' +import { useDebouncedValue } from '@/hooks/misc/useDebouncedValue' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export const StoragePolicies = () => { const { ref: projectRef } = useParams() diff --git a/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesBucketRow.tsx b/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesBucketRow.tsx index aaa9321de4..34a2eacf87 100644 --- a/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesBucketRow.tsx +++ b/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesBucketRow.tsx @@ -1,6 +1,4 @@ import { PostgresPolicy } from '@supabase/postgres-meta' -import { PolicyRow } from 'components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow' -import { Bucket } from 'data/storage/buckets-query' import { FilesBucket as FilesBucketIcon } from 'icons' import { noop } from 'lodash' import { forwardRef, type CSSProperties } from 'react' @@ -21,6 +19,9 @@ import { TooltipTrigger, } from 'ui' +import { PolicyRow } from '@/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow' +import { Bucket } from '@/data/storage/buckets-query' + interface StoragePoliciesBucketRowProps { table: string label: string diff --git a/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesBucketsSection.tsx b/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesBucketsSection.tsx index 11b5b443e7..bc327c6817 100644 --- a/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesBucketsSection.tsx +++ b/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesBucketsSection.tsx @@ -2,11 +2,6 @@ import { PostgresPolicy } from '@supabase/postgres-meta' import { useVirtualizer } from '@tanstack/react-virtual' import { ChevronUp, Search, X } from 'lucide-react' import { forwardRef, useEffect, useState, type HTMLAttributes, type ReactNode } from 'react' - -import { useMainScrollContainer } from 'components/layouts/MainScrollContainerContext' -import { NoSearchResults } from 'components/ui/NoSearchResults' -import { type Bucket } from 'data/storage/buckets-query' -import { useStaticEffectEvent } from 'hooks/useStaticEffectEvent' import { Button, cn, @@ -24,8 +19,13 @@ import { PageSectionSummary, PageSectionTitle, } from 'ui-patterns/PageSection' + import { StoragePoliciesBucketRow } from './StoragePoliciesBucketRow' import StoragePoliciesPlaceholder from './StoragePoliciesPlaceholder' +import { useMainScrollContainer } from '@/components/layouts/MainScrollContainerContext' +import { NoSearchResults } from '@/components/ui/NoSearchResults' +import { type Bucket } from '@/data/storage/buckets-query' +import { useStaticEffectEvent } from '@/hooks/useStaticEffectEvent' export type SelectBucketPolicyForAction = { addPolicy: (bucketName?: string, table?: string) => void diff --git a/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesEditPolicyModal.tsx b/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesEditPolicyModal.tsx index 43a1ad0b6a..0fca65ac44 100644 --- a/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesEditPolicyModal.tsx +++ b/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesEditPolicyModal.tsx @@ -1,8 +1,3 @@ -import { POLICY_MODAL_VIEWS } from 'components/interfaces/Auth/Policies/Policies.constants' -import PolicySelection from 'components/interfaces/Auth/Policies/PolicySelection' -import PolicyTemplates from 'components/interfaces/Auth/Policies/PolicyTemplates' -import { DocsButton } from 'components/ui/DocsButton' -import { DOCS_URL } from 'lib/constants' import { noop, pull } from 'lodash' import { ChevronLeft } from 'lucide-react' import { useEffect, useState } from 'react' @@ -17,6 +12,11 @@ import { import { STORAGE_POLICY_TEMPLATES } from './StoragePolicies.constants' import StoragePoliciesEditor from './StoragePoliciesEditor' import StoragePoliciesReview from './StoragePoliciesReview' +import { POLICY_MODAL_VIEWS } from '@/components/interfaces/Auth/Policies/Policies.constants' +import PolicySelection from '@/components/interfaces/Auth/Policies/PolicySelection' +import PolicyTemplates from '@/components/interfaces/Auth/Policies/PolicyTemplates' +import { DocsButton } from '@/components/ui/DocsButton' +import { DOCS_URL } from '@/lib/constants' const newPolicyTemplate: any = { name: '', diff --git a/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesEditor.tsx b/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesEditor.tsx index b9e3a4b623..55b2a6e09c 100644 --- a/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesEditor.tsx +++ b/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesEditor.tsx @@ -1,12 +1,12 @@ import { noop } from 'lodash' import { Button, Checkbox, cn, Modal } from 'ui' -import { PolicyName } from 'components/interfaces/Auth/Policies/PolicyEditor/PolicyName' -import { PolicyRoles } from 'components/interfaces/Auth/Policies/PolicyEditor/PolicyRoles' -import SqlEditor from 'components/ui/SqlEditor' -import { DOCS_URL } from 'lib/constants' import { STORAGE_CLIENT_LIBRARY_MAPPINGS } from '../Storage.constants' import { deriveAllowedClientLibraryMethods } from '../Storage.utils' +import { PolicyName } from '@/components/interfaces/Auth/Policies/PolicyEditor/PolicyName' +import { PolicyRoles } from '@/components/interfaces/Auth/Policies/PolicyEditor/PolicyRoles' +import SqlEditor from '@/components/ui/SqlEditor' +import { DOCS_URL } from '@/lib/constants' const PolicyDefinition = ({ definition = '', onUpdatePolicyDefinition = () => {} }) => { return ( diff --git a/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesReview.tsx b/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesReview.tsx index fde162aa5b..4e2d68556c 100644 --- a/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesReview.tsx +++ b/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesReview.tsx @@ -1,7 +1,8 @@ -import SqlEditor from 'components/ui/SqlEditor' import { useState } from 'react' import { Button, Modal } from 'ui' +import SqlEditor from '@/components/ui/SqlEditor' + const ReviewEmptyState = () => { return (
diff --git a/apps/studio/components/interfaces/Storage/StorageSettings/CreateCredentialModal.tsx b/apps/studio/components/interfaces/Storage/StorageSettings/CreateCredentialModal.tsx index 1dc69f815d..f63e98f666 100644 --- a/apps/studio/components/interfaces/Storage/StorageSettings/CreateCredentialModal.tsx +++ b/apps/studio/components/interfaces/Storage/StorageSettings/CreateCredentialModal.tsx @@ -2,10 +2,6 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' import { FormField } from '@ui/components/shadcn/ui/form' import { useParams } from 'common' -import { useProjectStorageConfigQuery } from 'data/config/project-storage-config-query' -import { useS3AccessKeyCreateMutation } from 'data/storage/s3-access-key-create-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useIsProjectActive } from 'hooks/misc/useSelectedProject' import { Plus } from 'lucide-react' import { useState } from 'react' import { useForm } from 'react-hook-form' @@ -30,6 +26,11 @@ import { Input } from 'ui-patterns/DataInputs/Input' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { z } from 'zod' +import { useProjectStorageConfigQuery } from '@/data/config/project-storage-config-query' +import { useS3AccessKeyCreateMutation } from '@/data/storage/s3-access-key-create-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useIsProjectActive } from '@/hooks/misc/useSelectedProject' + interface CreateCredentialModalProps { visible: boolean onOpenChange: (value: boolean) => void diff --git a/apps/studio/components/interfaces/Storage/StorageSettings/RevokeCredentialModal.tsx b/apps/studio/components/interfaces/Storage/StorageSettings/RevokeCredentialModal.tsx index 5257a9ee20..6fd18b7444 100644 --- a/apps/studio/components/interfaces/Storage/StorageSettings/RevokeCredentialModal.tsx +++ b/apps/studio/components/interfaces/Storage/StorageSettings/RevokeCredentialModal.tsx @@ -1,7 +1,5 @@ -import { toast } from 'sonner' - import { useParams } from 'common' -import { useS3AccessKeyDeleteMutation } from 'data/storage/s3-access-key-delete-mutation' +import { toast } from 'sonner' import { Button, Dialog, @@ -14,6 +12,8 @@ import { DialogTitle, } from 'ui' +import { useS3AccessKeyDeleteMutation } from '@/data/storage/s3-access-key-delete-mutation' + interface RevokeCredentialModalProps { visible: boolean selectedCredential?: { id: string; description: string } diff --git a/apps/studio/components/interfaces/Storage/StorageSettings/S3Connection.tsx b/apps/studio/components/interfaces/Storage/StorageSettings/S3Connection.tsx index afe0925218..188d75678c 100644 --- a/apps/studio/components/interfaces/Storage/StorageSettings/S3Connection.tsx +++ b/apps/studio/components/interfaces/Storage/StorageSettings/S3Connection.tsx @@ -2,16 +2,6 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' import { AlertTitle } from '@ui/components/shadcn/ui/alert' import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { DocsButton } from 'components/ui/DocsButton' -import NoPermission from 'components/ui/NoPermission' -import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' -import { useProjectStorageConfigQuery } from 'data/config/project-storage-config-query' -import { useProjectStorageConfigUpdateUpdateMutation } from 'data/config/project-storage-config-update-mutation' -import { useStorageCredentialsQuery } from 'data/storage/s3-access-key-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useIsProjectActive, useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import Link from 'next/link' import { useEffect, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' @@ -54,6 +44,16 @@ import { CreateCredentialModal } from './CreateCredentialModal' import { RevokeCredentialModal } from './RevokeCredentialModal' import { StorageCredItem } from './StorageCredItem' import { getConnectionURL } from './StorageSettings.utils' +import AlertError from '@/components/ui/AlertError' +import { DocsButton } from '@/components/ui/DocsButton' +import NoPermission from '@/components/ui/NoPermission' +import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' +import { useProjectStorageConfigQuery } from '@/data/config/project-storage-config-query' +import { useProjectStorageConfigUpdateUpdateMutation } from '@/data/config/project-storage-config-update-mutation' +import { useStorageCredentialsQuery } from '@/data/storage/s3-access-key-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useIsProjectActive, useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' export const S3Connection = () => { const { ref: projectRef } = useParams() diff --git a/apps/studio/components/interfaces/Storage/StorageSettings/StorageCredItem.tsx b/apps/studio/components/interfaces/Storage/StorageSettings/StorageCredItem.tsx index 36a0eff15e..59dd670cad 100644 --- a/apps/studio/components/interfaces/Storage/StorageSettings/StorageCredItem.tsx +++ b/apps/studio/components/interfaces/Storage/StorageSettings/StorageCredItem.tsx @@ -1,6 +1,5 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { differenceInDays } from 'date-fns' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { MoreVertical, TrashIcon } from 'lucide-react' import { Button, @@ -13,6 +12,8 @@ import { } from 'ui' import { Input } from 'ui-patterns/DataInputs/Input' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' + export const StorageCredItem = ({ description, id, diff --git a/apps/studio/components/interfaces/Storage/StorageSettings/StorageFileSizeLimitErrorMessage.tsx b/apps/studio/components/interfaces/Storage/StorageSettings/StorageFileSizeLimitErrorMessage.tsx index d4e3f76d89..1817e33524 100644 --- a/apps/studio/components/interfaces/Storage/StorageSettings/StorageFileSizeLimitErrorMessage.tsx +++ b/apps/studio/components/interfaces/Storage/StorageSettings/StorageFileSizeLimitErrorMessage.tsx @@ -1,5 +1,4 @@ import { LARGEST_SIZE_LIMIT_BUCKETS_COUNT } from '@supabase/pg-meta' -import { InlineLink } from 'components/ui/InlineLink' import Link from 'next/link' import { type FieldError } from 'react-hook-form' import { cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' @@ -9,6 +8,7 @@ import { formatBytesForDisplay, isBucketLimitErrorMessage, } from './StorageSettings.utils' +import { InlineLink } from '@/components/ui/InlineLink' interface StorageFileSizeLimitErrorMessageProps { error?: FieldError diff --git a/apps/studio/components/interfaces/Storage/StorageSettings/StorageListV2MigrationCallout.tsx b/apps/studio/components/interfaces/Storage/StorageSettings/StorageListV2MigrationCallout.tsx index 5058a9affe..4980f6e089 100644 --- a/apps/studio/components/interfaces/Storage/StorageSettings/StorageListV2MigrationCallout.tsx +++ b/apps/studio/components/interfaces/Storage/StorageSettings/StorageListV2MigrationCallout.tsx @@ -1,13 +1,8 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import dayjs from 'dayjs' import { useState } from 'react' import { toast } from 'sonner' - -import { useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { InlineLink } from 'components/ui/InlineLink' -import { useProjectStorageConfigUpdateUpdateMutation } from 'data/config/project-storage-config-update-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { Button, Dialog, @@ -22,6 +17,11 @@ import { } from 'ui' import { Admonition, TimestampInfo } from 'ui-patterns' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { InlineLink } from '@/components/ui/InlineLink' +import { useProjectStorageConfigUpdateUpdateMutation } from '@/data/config/project-storage-config-update-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' + // [Joshen] Will be decided by Storage team, temp setting to 15th December 2025 UTC (3 months buffer) const MIGRATION_DEADLINE = '2025-12-15T00:00:00' diff --git a/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.ValidateSizeLimit.tsx b/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.ValidateSizeLimit.tsx index 880144e126..d3eb9bf3d3 100644 --- a/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.ValidateSizeLimit.tsx +++ b/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.ValidateSizeLimit.tsx @@ -1,15 +1,15 @@ import { useEffect, useReducer, useState } from 'react' import { useWatch, type FieldError } from 'react-hook-form' - -import { - THRESHOLD_FOR_AUTO_QUERYING_BUCKET_LIMITS, - type BucketWithSizeLimit, -} from 'data/storage/buckets-max-size-limit-query' import { cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' + import { StorageFileSizeLimitErrorMessage } from './StorageFileSizeLimitErrorMessage' import { StorageSizeUnits } from './StorageSettings.constants' import { convertToBytes, encodeBucketLimitErrorMessage } from './StorageSettings.utils' +import { + THRESHOLD_FOR_AUTO_QUERYING_BUCKET_LIMITS, + type BucketWithSizeLimit, +} from '@/data/storage/buckets-max-size-limit-query' type ValidationState = | { status: 'initial' } diff --git a/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.tsx b/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.tsx index dc3e95e8e2..f051418609 100644 --- a/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.tsx +++ b/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.tsx @@ -1,39 +1,24 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' +import { IS_PLATFORM, useFlag, useParams } from 'common' import { useEffect, useMemo, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import * as z from 'zod' - -import { IS_PLATFORM, useFlag, useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { InlineLink } from 'components/ui/InlineLink' -import NoPermission from 'components/ui/NoPermission' -import { UpgradeToPro } from 'components/ui/UpgradeToPro' -import { useProjectStorageConfigQuery } from 'data/config/project-storage-config-query' -import { useProjectStorageConfigUpdateUpdateMutation } from 'data/config/project-storage-config-update-mutation' -import { useLargestBucketSizeLimitsCheck } from 'data/storage/buckets-max-size-limit-query' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' -import { formatBytes } from 'lib/helpers' import { Button, Card, CardContent, CardFooter, + Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, FormMessage_Shadcn_, - Form_Shadcn_, Input_Shadcn_, + Select_Shadcn_, SelectContent_Shadcn_, SelectItem_Shadcn_, SelectTrigger_Shadcn_, SelectValue_Shadcn_, - Select_Shadcn_, Switch, } from 'ui' import { Admonition } from 'ui-patterns/admonition' @@ -41,6 +26,8 @@ import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { PageContainer } from 'ui-patterns/PageContainer' import { PageSection, PageSectionContent } from 'ui-patterns/PageSection' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' +import * as z from 'zod' + import { StorageFileSizeLimitErrorMessage } from './StorageFileSizeLimitErrorMessage' import { StorageListV2MigratingCallout, @@ -57,6 +44,19 @@ import { encodeBucketLimitErrorMessage, } from './StorageSettings.utils' import { ValidateSizeLimit } from './StorageSettings.ValidateSizeLimit' +import AlertError from '@/components/ui/AlertError' +import { InlineLink } from '@/components/ui/InlineLink' +import NoPermission from '@/components/ui/NoPermission' +import { UpgradeToPro } from '@/components/ui/UpgradeToPro' +import { useProjectStorageConfigQuery } from '@/data/config/project-storage-config-query' +import { useProjectStorageConfigUpdateUpdateMutation } from '@/data/config/project-storage-config-update-mutation' +import { useLargestBucketSizeLimitsCheck } from '@/data/storage/buckets-max-size-limit-query' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' +import { formatBytes } from '@/lib/helpers' const formId = 'storage-settings-form' diff --git a/apps/studio/components/interfaces/Storage/VectorBuckets/CreateVectorBucketDialog.tsx b/apps/studio/components/interfaces/Storage/VectorBuckets/CreateVectorBucketDialog.tsx index 2b0e1fb719..927b3ba1cc 100644 --- a/apps/studio/components/interfaces/Storage/VectorBuckets/CreateVectorBucketDialog.tsx +++ b/apps/studio/components/interfaces/Storage/VectorBuckets/CreateVectorBucketDialog.tsx @@ -1,19 +1,8 @@ import { zodResolver } from '@hookform/resolvers/zod' +import { useParams } from 'common' import { useEffect, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' -import z from 'zod' - -import { useParams } from 'common' -import { InlineLink } from 'components/ui/InlineLink' -import { useDatabaseExtensionEnableMutation } from 'data/database-extensions/database-extension-enable-mutation' -import { useS3VectorsWrapperCreateMutation } from 'data/storage/s3-vectors-wrapper-create-mutation' -import { useVectorBucketCreateMutation } from 'data/storage/vector-bucket-create-mutation' -import { useVectorBucketsQuery } from 'data/storage/vector-buckets-query' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import { Button, Dialog, @@ -30,8 +19,19 @@ import { } from 'ui' import { Admonition } from 'ui-patterns/admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import z from 'zod' + import { validVectorBucketName } from './CreateVectorBucketDialog.utils' import { useS3VectorsWrapperExtension } from './useS3VectorsWrapper' +import { InlineLink } from '@/components/ui/InlineLink' +import { useDatabaseExtensionEnableMutation } from '@/data/database-extensions/database-extension-enable-mutation' +import { useS3VectorsWrapperCreateMutation } from '@/data/storage/s3-vectors-wrapper-create-mutation' +import { useVectorBucketCreateMutation } from '@/data/storage/vector-bucket-create-mutation' +import { useVectorBucketsQuery } from '@/data/storage/vector-buckets-query' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' const FormSchema = z.object({ name: z diff --git a/apps/studio/components/interfaces/Storage/VectorBuckets/CreateVectorTableSheet.tsx b/apps/studio/components/interfaces/Storage/VectorBuckets/CreateVectorTableSheet.tsx index a89ac16189..14bef741ed 100644 --- a/apps/studio/components/interfaces/Storage/VectorBuckets/CreateVectorTableSheet.tsx +++ b/apps/studio/components/interfaces/Storage/VectorBuckets/CreateVectorTableSheet.tsx @@ -5,15 +5,6 @@ import { parseAsBoolean, useQueryState } from 'nuqs' import { useEffect } from 'react' import { SubmitHandler, useFieldArray, useForm } from 'react-hook-form' import { toast } from 'sonner' -import z from 'zod' - -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DocsButton } from 'components/ui/DocsButton' -import { useFDWImportForeignSchemaMutation } from 'data/fdw/fdw-import-foreign-schema-mutation' -import { useVectorBucketIndexCreateMutation } from 'data/storage/vector-bucket-index-create-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import { Button, Form_Shadcn_, @@ -33,8 +24,17 @@ import { } from 'ui' import { Admonition } from 'ui-patterns' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import z from 'zod' + import { inverseValidBucketNameRegex } from '../CreateBucketModal.utils' import { useS3VectorsWrapperInstance } from './useS3VectorsWrapperInstance' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DocsButton } from '@/components/ui/DocsButton' +import { useFDWImportForeignSchemaMutation } from '@/data/fdw/fdw-import-foreign-schema-mutation' +import { useVectorBucketIndexCreateMutation } from '@/data/storage/vector-bucket-index-create-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' const isStagingLocal = process.env.NEXT_PUBLIC_ENVIRONMENT !== 'prod' diff --git a/apps/studio/components/interfaces/Storage/VectorBuckets/DeleteVectorBucketModal.tsx b/apps/studio/components/interfaces/Storage/VectorBuckets/DeleteVectorBucketModal.tsx index 46e9b9f550..b0da404160 100644 --- a/apps/studio/components/interfaces/Storage/VectorBuckets/DeleteVectorBucketModal.tsx +++ b/apps/studio/components/interfaces/Storage/VectorBuckets/DeleteVectorBucketModal.tsx @@ -1,13 +1,13 @@ import { useState } from 'react' import { toast } from 'sonner' -import { TextConfirmModal } from 'components/ui/TextConfirmModalWrapper' -import { useFDWDeleteMutation } from 'data/fdw/fdw-delete-mutation' -import { useVectorBucketDeleteMutation } from 'data/storage/vector-bucket-delete-mutation' -import { deleteVectorBucketIndex } from 'data/storage/vector-bucket-index-delete-mutation' -import { useVectorBucketsIndexesQuery } from 'data/storage/vector-buckets-indexes-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { useS3VectorsWrapperInstance } from './useS3VectorsWrapperInstance' +import { TextConfirmModal } from '@/components/ui/TextConfirmModalWrapper' +import { useFDWDeleteMutation } from '@/data/fdw/fdw-delete-mutation' +import { useVectorBucketDeleteMutation } from '@/data/storage/vector-bucket-delete-mutation' +import { deleteVectorBucketIndex } from '@/data/storage/vector-bucket-index-delete-mutation' +import { useVectorBucketsIndexesQuery } from '@/data/storage/vector-buckets-indexes-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export interface DeleteVectorBucketModalProps { visible: boolean diff --git a/apps/studio/components/interfaces/Storage/VectorBuckets/DeleteVectorTableModal.tsx b/apps/studio/components/interfaces/Storage/VectorBuckets/DeleteVectorTableModal.tsx index c1677b0ce9..f85d764bce 100644 --- a/apps/studio/components/interfaces/Storage/VectorBuckets/DeleteVectorTableModal.tsx +++ b/apps/studio/components/interfaces/Storage/VectorBuckets/DeleteVectorTableModal.tsx @@ -1,14 +1,14 @@ +import { useParams } from 'common' import { parseAsString, useQueryState } from 'nuqs' import { useEffect } from 'react' import { toast } from 'sonner' - -import { useParams } from 'common' -import { useFDWDropForeignTableMutation } from 'data/fdw/fdw-drop-foreign-table-mutation' -import { useVectorBucketIndexDeleteMutation } from 'data/storage/vector-bucket-index-delete-mutation' -import { useVectorBucketsIndexesQuery } from 'data/storage/vector-buckets-indexes-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { ConfirmationModal } from 'ui-patterns/Dialogs/ConfirmationModal' + import { useS3VectorsWrapperInstance } from './useS3VectorsWrapperInstance' +import { useFDWDropForeignTableMutation } from '@/data/fdw/fdw-drop-foreign-table-mutation' +import { useVectorBucketIndexDeleteMutation } from '@/data/storage/vector-bucket-index-delete-mutation' +import { useVectorBucketsIndexesQuery } from '@/data/storage/vector-buckets-indexes-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export const DeleteVectorTableModal = () => { const { ref: projectRef, bucketId } = useParams() diff --git a/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/InitializeForeignSchemaDialog.tsx b/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/InitializeForeignSchemaDialog.tsx index 03f2f808e5..a47e350c34 100644 --- a/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/InitializeForeignSchemaDialog.tsx +++ b/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/InitializeForeignSchemaDialog.tsx @@ -1,15 +1,6 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useQueryClient } from '@tanstack/react-query' import { useParams } from 'common' -import { formatWrapperTables } from 'components/interfaces/Integrations/Wrappers/Wrappers.utils' -import { DocsButton } from 'components/ui/DocsButton' -import { useSchemaCreateMutation } from 'data/database/schema-create-mutation' -import { useSchemasQuery } from 'data/database/schemas-query' -import { useFDWImportForeignSchemaMutation } from 'data/fdw/fdw-import-foreign-schema-mutation' -import { useFDWUpdateMutation } from 'data/fdw/fdw-update-mutation' -import { fdwKeys } from 'data/fdw/keys' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL } from 'lib/constants' import { parseAsBoolean, useQueryState } from 'nuqs' import { useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' @@ -24,8 +15,8 @@ import { DialogSectionSeparator, DialogTitle, DialogTrigger, - FormField_Shadcn_, Form_Shadcn_, + FormField_Shadcn_, Input_Shadcn_, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' @@ -34,6 +25,15 @@ import z from 'zod' import { getDecryptedParameters } from '../../Storage.utils' import { useS3VectorsWrapperExtension } from '../useS3VectorsWrapper' import { useS3VectorsWrapperInstance } from '../useS3VectorsWrapperInstance' +import { formatWrapperTables } from '@/components/interfaces/Integrations/Wrappers/Wrappers.utils' +import { DocsButton } from '@/components/ui/DocsButton' +import { useSchemaCreateMutation } from '@/data/database/schema-create-mutation' +import { useSchemasQuery } from '@/data/database/schemas-query' +import { useFDWImportForeignSchemaMutation } from '@/data/fdw/fdw-import-foreign-schema-mutation' +import { useFDWUpdateMutation } from '@/data/fdw/fdw-update-mutation' +import { fdwKeys } from '@/data/fdw/keys' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL } from '@/lib/constants' import { isGreaterThanOrEqual } from '@/lib/semver' // Create foreign tables for vector bucket diff --git a/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/VectorBucketCallouts.tsx b/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/VectorBucketCallouts.tsx index c4c45626c7..06afe8742b 100644 --- a/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/VectorBucketCallouts.tsx +++ b/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/VectorBucketCallouts.tsx @@ -1,15 +1,15 @@ import Link from 'next/link' import { toast } from 'sonner' - -import { WrapperMeta } from 'components/interfaces/Integrations/Wrappers/Wrappers.types' -import { ScaffoldSection } from 'components/layouts/Scaffold' -import { InlineLink } from 'components/ui/InlineLink' -import { DatabaseExtension } from 'data/database-extensions/database-extensions-query' -import { useS3VectorsWrapperCreateMutation } from 'data/storage/s3-vectors-wrapper-create-mutation' -import { DOCS_URL } from 'lib/constants' import { Button } from 'ui' import { Admonition } from 'ui-patterns/admonition' +import { WrapperMeta } from '@/components/interfaces/Integrations/Wrappers/Wrappers.types' +import { ScaffoldSection } from '@/components/layouts/Scaffold' +import { InlineLink } from '@/components/ui/InlineLink' +import { DatabaseExtension } from '@/data/database-extensions/database-extensions-query' +import { useS3VectorsWrapperCreateMutation } from '@/data/storage/s3-vectors-wrapper-create-mutation' +import { DOCS_URL } from '@/lib/constants' + export const ExtensionNotInstalled = ({ projectRef, wrapperMeta, diff --git a/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/VectorBucketTableExamplesSheet.tsx b/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/VectorBucketTableExamplesSheet.tsx index 4d9e12f45d..d4f6588cd3 100644 --- a/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/VectorBucketTableExamplesSheet.tsx +++ b/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/VectorBucketTableExamplesSheet.tsx @@ -1,11 +1,6 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { DocsButton } from 'components/ui/DocsButton' -import { getKeys, useAPIKeysQuery } from 'data/api-keys/api-keys-query' -import { VectorBucketIndex } from 'data/storage/vector-buckets-indexes-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { SqlEditor } from 'icons' -import { DOCS_URL } from 'lib/constants' import { ChevronDown, ListPlus } from 'lucide-react' import Link from 'next/link' import { parseAsBoolean, useQueryState } from 'nuqs' @@ -32,6 +27,11 @@ import { CodeBlock } from 'ui-patterns/CodeBlock' import { useS3VectorsWrapperExtension } from '../useS3VectorsWrapper' import { useS3VectorsWrapperInstance } from '../useS3VectorsWrapperInstance' +import { DocsButton } from '@/components/ui/DocsButton' +import { getKeys, useAPIKeysQuery } from '@/data/api-keys/api-keys-query' +import { VectorBucketIndex } from '@/data/storage/vector-buckets-indexes-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { DOCS_URL } from '@/lib/constants' import { isGreaterThanOrEqual } from '@/lib/semver' interface VectorBucketTableExamplesSheetProps { diff --git a/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/index.tsx b/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/index.tsx index d9931a0d48..1c888edf7e 100644 --- a/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/index.tsx +++ b/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/index.tsx @@ -1,21 +1,10 @@ +import { useParams } from 'common' +import { SqlEditor, TableEditor } from 'icons' import { MoreVertical, Search, Trash2 } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' import { parseAsBoolean, parseAsString, useQueryState } from 'nuqs' import { useState } from 'react' - -import { useParams } from 'common' -import { - ScaffoldContainer, - ScaffoldHeader, - ScaffoldSection, - ScaffoldSectionDescription, - ScaffoldSectionTitle, -} from 'components/layouts/Scaffold' -import AlertError from 'components/ui/AlertError' -import { useVectorBucketQuery } from 'data/storage/vector-bucket-query' -import { useVectorBucketsIndexesQuery } from 'data/storage/vector-buckets-indexes-query' -import { SqlEditor, TableEditor } from 'icons' import { Button, Card, @@ -34,6 +23,7 @@ import { } from 'ui' import { Input } from 'ui-patterns/DataInputs/Input' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' + import { CreateVectorTableSheet } from '../CreateVectorTableSheet' import { DeleteVectorBucketModal } from '../DeleteVectorBucketModal' import { DeleteVectorTableModal } from '../DeleteVectorTableModal' @@ -47,6 +37,16 @@ import { WrapperMissing, } from './VectorBucketCallouts' import { VectorBucketTableExamplesSheet } from './VectorBucketTableExamplesSheet' +import { + ScaffoldContainer, + ScaffoldHeader, + ScaffoldSection, + ScaffoldSectionDescription, + ScaffoldSectionTitle, +} from '@/components/layouts/Scaffold' +import AlertError from '@/components/ui/AlertError' +import { useVectorBucketQuery } from '@/data/storage/vector-bucket-query' +import { useVectorBucketsIndexesQuery } from '@/data/storage/vector-buckets-indexes-query' export const VectorBucketDetails = () => { const router = useRouter() diff --git a/apps/studio/components/interfaces/Storage/VectorBuckets/index.tsx b/apps/studio/components/interfaces/Storage/VectorBuckets/index.tsx index e759e7729e..74ac9ffe52 100644 --- a/apps/studio/components/interfaces/Storage/VectorBuckets/index.tsx +++ b/apps/studio/components/interfaces/Storage/VectorBuckets/index.tsx @@ -1,23 +1,23 @@ +import { useParams } from 'common' +import { VectorBucket as VectorBucketIcon } from 'icons' import { ChevronRight, Search } from 'lucide-react' import { useRouter } from 'next/navigation' import { parseAsBoolean, useQueryState } from 'nuqs' import { useState } from 'react' - -import { useParams } from 'common' -import AlertError from 'components/ui/AlertError' -import { AlphaNotice } from 'components/ui/AlphaNotice' -import { useVectorBucketsQuery } from 'data/storage/vector-buckets-query' -import { VectorBucket as VectorBucketIcon } from 'icons' -import { createNavigationHandler } from 'lib/navigation' import { Card, Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from 'ui' import { Input } from 'ui-patterns/DataInputs/Input' import { PageContainer } from 'ui-patterns/PageContainer' import { PageSection, PageSectionContent, PageSectionTitle } from 'ui-patterns/PageSection' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { TimestampInfo } from 'ui-patterns/TimestampInfo' + import { EmptyBucketState } from '../EmptyBucketState' import { CreateBucketButton } from '../NewBucketButton' import { CreateVectorBucketDialog } from './CreateVectorBucketDialog' +import AlertError from '@/components/ui/AlertError' +import { AlphaNotice } from '@/components/ui/AlphaNotice' +import { useVectorBucketsQuery } from '@/data/storage/vector-buckets-query' +import { createNavigationHandler } from '@/lib/navigation' /** * [Joshen] Low-priority refactor: We should use a virtualized table here as per how we do it diff --git a/apps/studio/components/interfaces/Storage/VectorBuckets/useS3VectorsWrapper.tsx b/apps/studio/components/interfaces/Storage/VectorBuckets/useS3VectorsWrapper.tsx index b987200d9e..cd750f4b8e 100644 --- a/apps/studio/components/interfaces/Storage/VectorBuckets/useS3VectorsWrapper.tsx +++ b/apps/studio/components/interfaces/Storage/VectorBuckets/useS3VectorsWrapper.tsx @@ -1,9 +1,9 @@ -import { INTEGRATIONS } from 'components/interfaces/Integrations/Landing/Integrations.constants' +import { INTEGRATIONS } from '@/components/interfaces/Integrations/Landing/Integrations.constants' import { DatabaseExtension, useDatabaseExtensionsQuery, -} from 'data/database-extensions/database-extensions-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' +} from '@/data/database-extensions/database-extensions-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export const useS3VectorsWrapperExtension = (): { extension: DatabaseExtension | undefined diff --git a/apps/studio/components/interfaces/Storage/VectorBuckets/useS3VectorsWrapperInstance.tsx b/apps/studio/components/interfaces/Storage/VectorBuckets/useS3VectorsWrapperInstance.tsx index 59e2196d70..c87ba11625 100644 --- a/apps/studio/components/interfaces/Storage/VectorBuckets/useS3VectorsWrapperInstance.tsx +++ b/apps/studio/components/interfaces/Storage/VectorBuckets/useS3VectorsWrapperInstance.tsx @@ -1,13 +1,13 @@ import { useMemo } from 'react' +import { getVectorBucketFDWName } from './VectorBuckets.utils' import { WRAPPER_HANDLERS, WRAPPERS, -} from 'components/interfaces/Integrations/Wrappers/Wrappers.constants' -import { wrapperMetaComparator } from 'components/interfaces/Integrations/Wrappers/Wrappers.utils' -import { useFDWsQuery } from 'data/fdw/fdws-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { getVectorBucketFDWName } from './VectorBuckets.utils' +} from '@/components/interfaces/Integrations/Wrappers/Wrappers.constants' +import { wrapperMetaComparator } from '@/components/interfaces/Integrations/Wrappers/Wrappers.utils' +import { useFDWsQuery } from '@/data/fdw/fdws-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export const useS3VectorsWrapperInstance = ({ bucketId }: { bucketId?: string }) => { const { data: project, isPending: isLoadingProject } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Storage/VectorBuckets/useSelectedVectorBuckets.ts b/apps/studio/components/interfaces/Storage/VectorBuckets/useSelectedVectorBuckets.ts index 70f78febcd..b637659351 100644 --- a/apps/studio/components/interfaces/Storage/VectorBuckets/useSelectedVectorBuckets.ts +++ b/apps/studio/components/interfaces/Storage/VectorBuckets/useSelectedVectorBuckets.ts @@ -1,5 +1,6 @@ import { useParams } from 'common' -import { useVectorBucketsQuery } from 'data/storage/vector-buckets-query' + +import { useVectorBucketsQuery } from '@/data/storage/vector-buckets-query' export const useSelectedVectorBucket = () => { const { ref: projectRef, bucketId } = useParams() diff --git a/apps/studio/components/interfaces/Storage/__tests__/CreateBucketModal.test.tsx b/apps/studio/components/interfaces/Storage/__tests__/CreateBucketModal.test.tsx index 3f1ca183d7..dd67cccd98 100644 --- a/apps/studio/components/interfaces/Storage/__tests__/CreateBucketModal.test.tsx +++ b/apps/studio/components/interfaces/Storage/__tests__/CreateBucketModal.test.tsx @@ -2,11 +2,11 @@ import { fireEvent, screen, waitFor } from '@testing-library/dom' import userEvent from '@testing-library/user-event' import { beforeEach, describe, expect, it, vi } from 'vitest' -import { ProjectContextProvider } from 'components/layouts/ProjectLayout/ProjectContext' -import { customRender } from 'tests/lib/custom-render' -import { addAPIMock } from 'tests/lib/msw' -import { routerMock } from 'tests/lib/route-mock' import { CreateBucketModal } from '../CreateBucketModal' +import { ProjectContextProvider } from '@/components/layouts/ProjectLayout/ProjectContext' +import { customRender } from '@/tests/lib/custom-render' +import { addAPIMock } from '@/tests/lib/msw' +import { routerMock } from '@/tests/lib/route-mock' describe(`CreateBucketModal`, () => { beforeEach(() => { diff --git a/apps/studio/components/interfaces/Storage/__tests__/DeleteBucketModal.test.tsx b/apps/studio/components/interfaces/Storage/__tests__/DeleteBucketModal.test.tsx index 3cdb377c01..b0fbecf523 100644 --- a/apps/studio/components/interfaces/Storage/__tests__/DeleteBucketModal.test.tsx +++ b/apps/studio/components/interfaces/Storage/__tests__/DeleteBucketModal.test.tsx @@ -4,12 +4,12 @@ import userEvent from '@testing-library/user-event' import { useState } from 'react' import { beforeEach, describe, expect, it, vi } from 'vitest' -import { ProjectContextProvider } from 'components/layouts/ProjectLayout/ProjectContext' -import { Bucket } from 'data/storage/buckets-query' -import { customRender } from 'tests/lib/custom-render' -import { addAPIMock } from 'tests/lib/msw' -import { routerMock } from 'tests/lib/route-mock' import { DeleteBucketModal } from '../DeleteBucketModal' +import { ProjectContextProvider } from '@/components/layouts/ProjectLayout/ProjectContext' +import { Bucket } from '@/data/storage/buckets-query' +import { customRender } from '@/tests/lib/custom-render' +import { addAPIMock } from '@/tests/lib/msw' +import { routerMock } from '@/tests/lib/route-mock' const bucket: Bucket = { id: 'test', diff --git a/apps/studio/components/interfaces/Storage/__tests__/EditBucketModal.test.tsx b/apps/studio/components/interfaces/Storage/__tests__/EditBucketModal.test.tsx index 8cf400c131..d73df7aed4 100644 --- a/apps/studio/components/interfaces/Storage/__tests__/EditBucketModal.test.tsx +++ b/apps/studio/components/interfaces/Storage/__tests__/EditBucketModal.test.tsx @@ -4,11 +4,11 @@ import userEvent from '@testing-library/user-event' import { useState } from 'react' import { beforeEach, describe, expect, it, vi } from 'vitest' -import { ProjectContextProvider } from 'components/layouts/ProjectLayout/ProjectContext' -import { Bucket } from 'data/storage/buckets-query' -import { render } from 'tests/helpers' -import { addAPIMock } from 'tests/lib/msw' import { EditBucketModal } from '../EditBucketModal' +import { ProjectContextProvider } from '@/components/layouts/ProjectLayout/ProjectContext' +import { Bucket } from '@/data/storage/buckets-query' +import { render } from '@/tests/helpers' +import { addAPIMock } from '@/tests/lib/msw' const bucket: Bucket = { id: faker.string.uuid(), diff --git a/apps/studio/components/interfaces/Storage/__tests__/EmptyBucketModal.test.tsx b/apps/studio/components/interfaces/Storage/__tests__/EmptyBucketModal.test.tsx index dd76310edc..586a53896b 100644 --- a/apps/studio/components/interfaces/Storage/__tests__/EmptyBucketModal.test.tsx +++ b/apps/studio/components/interfaces/Storage/__tests__/EmptyBucketModal.test.tsx @@ -4,12 +4,12 @@ import userEvent from '@testing-library/user-event' import { useState } from 'react' import { beforeEach, describe, expect, it, vi } from 'vitest' -import { ProjectContextProvider } from 'components/layouts/ProjectLayout/ProjectContext' -import { Bucket } from 'data/storage/buckets-query' -import { render } from 'tests/helpers' -import { addAPIMock } from 'tests/lib/msw' -import { routerMock } from 'tests/lib/route-mock' import { EmptyBucketModal } from '../EmptyBucketModal' +import { ProjectContextProvider } from '@/components/layouts/ProjectLayout/ProjectContext' +import { Bucket } from '@/data/storage/buckets-query' +import { render } from '@/tests/helpers' +import { addAPIMock } from '@/tests/lib/msw' +import { routerMock } from '@/tests/lib/route-mock' const bucket: Bucket = { id: faker.string.uuid(), diff --git a/apps/studio/components/interfaces/Storage/useBucketPolicyCount.ts b/apps/studio/components/interfaces/Storage/useBucketPolicyCount.ts index b392c1f8ff..afca034eab 100644 --- a/apps/studio/components/interfaces/Storage/useBucketPolicyCount.ts +++ b/apps/studio/components/interfaces/Storage/useBucketPolicyCount.ts @@ -1,8 +1,8 @@ import { useCallback, useMemo } from 'react' -import { extractBucketNameFromDefinition } from 'components/interfaces/Storage/Storage.utils' -import { useDatabasePoliciesQuery } from 'data/database-policies/database-policies-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' +import { extractBucketNameFromDefinition } from '@/components/interfaces/Storage/Storage.utils' +import { useDatabasePoliciesQuery } from '@/data/database-policies/database-policies-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' export function useBucketPolicyCount() { const { data: project, isPending: isProjectPending } = useSelectedProjectQuery() diff --git a/apps/studio/components/interfaces/Support/AIAssistantOption.tsx b/apps/studio/components/interfaces/Support/AIAssistantOption.tsx index 631123ca77..129791d905 100644 --- a/apps/studio/components/interfaces/Support/AIAssistantOption.tsx +++ b/apps/studio/components/interfaces/Support/AIAssistantOption.tsx @@ -2,10 +2,10 @@ import { AnimatePresence, motion } from 'framer-motion' import { MessageSquare } from 'lucide-react' import Link from 'next/link' import { useCallback, useEffect, useState } from 'react' - -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' import { AiIconAnimation, Button } from 'ui' + import { NO_ORG_MARKER, NO_PROJECT_MARKER } from './SupportForm.utils' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' interface AIAssistantOptionProps { projectRef?: string | null diff --git a/apps/studio/components/interfaces/Support/AffectedServicesSelector.tsx b/apps/studio/components/interfaces/Support/AffectedServicesSelector.tsx index 660bc0b960..ebbfd3b64c 100644 --- a/apps/studio/components/interfaces/Support/AffectedServicesSelector.tsx +++ b/apps/studio/components/interfaces/Support/AffectedServicesSelector.tsx @@ -1,11 +1,12 @@ -import type { UseFormReturn } from 'react-hook-form' // End of third-party imports import { SupportCategories } from '@supabase/shared-types/out/constants' +import type { UseFormReturn } from 'react-hook-form' import { FormControl_Shadcn_, FormField_Shadcn_ } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { MultiSelectV2 } from 'ui-patterns/MultiSelectDeprecated/MultiSelectV2' -import { type ExtendedSupportCategories, SERVICE_OPTIONS } from './Support.constants' + +import { SERVICE_OPTIONS, type ExtendedSupportCategories } from './Support.constants' import type { SupportFormValues } from './SupportForm.schema' interface AffectedServicesSelectorProps { diff --git a/apps/studio/components/interfaces/Support/AttachmentUpload.tsx b/apps/studio/components/interfaces/Support/AttachmentUpload.tsx index 99007e27d8..bb90a70ad3 100644 --- a/apps/studio/components/interfaces/Support/AttachmentUpload.tsx +++ b/apps/studio/components/interfaces/Support/AttachmentUpload.tsx @@ -1,11 +1,7 @@ // End of third-party imports -import { useGenerateAttachmentURLsMutation } from 'data/support/generate-attachment-urls-mutation' -import { uuidv4 } from 'lib/helpers' -import { useProfile } from 'lib/profile' import { compact } from 'lodash' import { File, FileCode, Plus, X } from 'lucide-react' -import { InlineLink } from 'components/ui/InlineLink' import { useCallback, useEffect, @@ -19,6 +15,10 @@ import { toast } from 'sonner' import { cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' import { createSupportStorageClient } from './support-storage-client' +import { InlineLink } from '@/components/ui/InlineLink' +import { useGenerateAttachmentURLsMutation } from '@/data/support/generate-attachment-urls-mutation' +import { uuidv4 } from '@/lib/helpers' +import { useProfile } from '@/lib/profile' const MAX_ATTACHMENTS = 5 diff --git a/apps/studio/components/interfaces/Support/CategoryAndSeverityInfo.tsx b/apps/studio/components/interfaces/Support/CategoryAndSeverityInfo.tsx index 58720a1cd2..48a47234c8 100644 --- a/apps/studio/components/interfaces/Support/CategoryAndSeverityInfo.tsx +++ b/apps/studio/components/interfaces/Support/CategoryAndSeverityInfo.tsx @@ -1,28 +1,28 @@ // End of third-party imports import { SupportCategories } from '@supabase/shared-types/out/constants' -import { InlineLink } from 'components/ui/InlineLink' import type { UseFormReturn } from 'react-hook-form' import { + cn, FormControl_Shadcn_, FormField_Shadcn_, + Select_Shadcn_, SelectContent_Shadcn_, SelectGroup_Shadcn_, SelectItem_Shadcn_, SelectTrigger_Shadcn_, SelectValue_Shadcn_, - Select_Shadcn_, - cn, } from 'ui' import { Admonition } from 'ui-patterns/admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { CATEGORY_OPTIONS, - type ExtendedSupportCategories, SEVERITY_OPTIONS, + type ExtendedSupportCategories, } from './Support.constants' import type { SupportFormValues } from './SupportForm.schema' import { NO_PROJECT_MARKER } from './SupportForm.utils' +import { InlineLink } from '@/components/ui/InlineLink' interface CategoryAndSeverityInfoProps { form: UseFormReturn diff --git a/apps/studio/components/interfaces/Support/ClientLibraryInfo.tsx b/apps/studio/components/interfaces/Support/ClientLibraryInfo.tsx index 889af97acb..4963d37963 100644 --- a/apps/studio/components/interfaces/Support/ClientLibraryInfo.tsx +++ b/apps/studio/components/interfaces/Support/ClientLibraryInfo.tsx @@ -1,10 +1,9 @@ -import { ExternalLink } from 'lucide-react' -import Link from 'next/link' -import type { UseFormReturn } from 'react-hook-form' // End of third-party imports import { CLIENT_LIBRARIES } from 'common/constants' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' +import { ExternalLink } from 'lucide-react' +import Link from 'next/link' +import type { UseFormReturn } from 'react-hook-form' import { Button, cn, @@ -18,8 +17,10 @@ import { SelectValue_Shadcn_, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' + import type { ExtendedSupportCategories } from './Support.constants' import type { SupportFormValues } from './SupportForm.schema' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' interface ClientLibraryInfoProps { form: UseFormReturn diff --git a/apps/studio/components/interfaces/Support/DashboardLogsToggle.tsx b/apps/studio/components/interfaces/Support/DashboardLogsToggle.tsx index 47a5f804df..97948f588e 100644 --- a/apps/studio/components/interfaces/Support/DashboardLogsToggle.tsx +++ b/apps/studio/components/interfaces/Support/DashboardLogsToggle.tsx @@ -1,7 +1,6 @@ import { ChevronRight } from 'lucide-react' import { useMemo, useState } from 'react' import type { UseFormReturn } from 'react-hook-form' - import { Collapsible_Shadcn_, CollapsibleContent_Shadcn_, @@ -10,8 +9,9 @@ import { Switch, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' -import type { SupportFormValues } from './SupportForm.schema' + import { DASHBOARD_LOG_CATEGORIES } from './dashboard-logs' +import type { SupportFormValues } from './SupportForm.schema' interface DashboardLogsToggleProps { form: UseFormReturn diff --git a/apps/studio/components/interfaces/Support/DiscordCTACard.tsx b/apps/studio/components/interfaces/Support/DiscordCTACard.tsx index 376db759ec..08987e7f1b 100644 --- a/apps/studio/components/interfaces/Support/DiscordCTACard.tsx +++ b/apps/studio/components/interfaces/Support/DiscordCTACard.tsx @@ -1,11 +1,12 @@ -import { useOrganizationsQuery } from 'data/organizations/organizations-query' import { AnimatePresence, motion } from 'framer-motion' import Link from 'next/link' import router from 'next/router' import { useEffect, useState } from 'react' import SVG from 'react-inlinesvg' import { Button } from 'ui' + import { NO_ORG_MARKER } from './SupportForm.utils' +import { useOrganizationsQuery } from '@/data/organizations/organizations-query' interface DiscordCTACardProps { organizationSlug?: string | null diff --git a/apps/studio/components/interfaces/Support/DocsLink.tsx b/apps/studio/components/interfaces/Support/DocsLink.tsx index ef053f07f5..b58690ff7f 100644 --- a/apps/studio/components/interfaces/Support/DocsLink.tsx +++ b/apps/studio/components/interfaces/Support/DocsLink.tsx @@ -1,9 +1,9 @@ +import { type DocsSearchResult as Page, type DocsSearchResultSection as PageSection } from 'common' import { ChevronRight } from 'lucide-react' import Link from 'next/link' - -import { type DocsSearchResult as Page, type DocsSearchResultSection as PageSection } from 'common' import { cn } from 'ui' import { TextHighlighterBase as TextHighlighter } from 'ui-patterns/CommandMenu' + import { formatSectionUrl, generateLink, getPageIcon } from './SupportForm.utils' const cardBaseClasses = diff --git a/apps/studio/components/interfaces/Support/DocsSuggestions.tsx b/apps/studio/components/interfaces/Support/DocsSuggestions.tsx index 9bd626d5ad..72dbb421d1 100644 --- a/apps/studio/components/interfaces/Support/DocsSuggestions.tsx +++ b/apps/studio/components/interfaces/Support/DocsSuggestions.tsx @@ -1,10 +1,10 @@ -import { Book, Github, Loader2 } from 'lucide-react' - import { useDocsSearch, type DocsSearchResult } from 'common' -import { useChangedSync } from 'hooks/misc/useChanged' -import { DOCS_URL } from 'lib/constants' +import { Book, Github, Loader2 } from 'lucide-react' import { cn } from 'ui' +import { useChangedSync } from '@/hooks/misc/useChanged' +import { DOCS_URL } from '@/lib/constants' + function useDocsSuggestions(subject: string) { const { handleDocsSearchDebounced, resetSearch, searchState } = useDocsSearch() diff --git a/apps/studio/components/interfaces/Support/IPV4SuggestionAlert.tsx b/apps/studio/components/interfaces/Support/IPV4SuggestionAlert.tsx index 29fe99d787..81f5abe3a5 100644 --- a/apps/studio/components/interfaces/Support/IPV4SuggestionAlert.tsx +++ b/apps/studio/components/interfaces/Support/IPV4SuggestionAlert.tsx @@ -1,6 +1,5 @@ import { ExternalLink, HelpCircle } from 'lucide-react' import Link from 'next/link' - import { Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, Button } from 'ui' export const IPV4SuggestionAlert = () => { diff --git a/apps/studio/components/interfaces/Support/IncidentAdmonition.tsx b/apps/studio/components/interfaces/Support/IncidentAdmonition.tsx index 4561e4c30b..247f924a60 100644 --- a/apps/studio/components/interfaces/Support/IncidentAdmonition.tsx +++ b/apps/studio/components/interfaces/Support/IncidentAdmonition.tsx @@ -1,11 +1,12 @@ -import { useIncidentStatusQuery } from 'data/platform/incident-status-query' -import { processIncidentData } from 'data/platform/incident-status-utils' import { AnimatePresence, motion } from 'framer-motion' import { ExternalLink } from 'lucide-react' import Link from 'next/link' import { Button } from 'ui' import { Admonition } from 'ui-patterns/admonition' +import { useIncidentStatusQuery } from '@/data/platform/incident-status-query' +import { processIncidentData } from '@/data/platform/incident-status-utils' + interface IncidentAdmonitionProps { isActive: boolean } diff --git a/apps/studio/components/interfaces/Support/LinkSupportTicketForm.tsx b/apps/studio/components/interfaces/Support/LinkSupportTicketForm.tsx index 68f35b2671..5edd152d63 100644 --- a/apps/studio/components/interfaces/Support/LinkSupportTicketForm.tsx +++ b/apps/studio/components/interfaces/Support/LinkSupportTicketForm.tsx @@ -1,6 +1,4 @@ import { zodResolver } from '@hookform/resolvers/zod' -import { useLinkSupportTicketMutation } from 'data/feedback/link-support-ticket-mutation' -import { useOrganizationsQuery } from 'data/organizations/organizations-query' import { Link2 } from 'lucide-react' import { useEffect } from 'react' import type { SubmitHandler } from 'react-hook-form' @@ -9,9 +7,9 @@ import { toast } from 'sonner' import { Button, DialogSectionSeparator, + Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, - Form_Shadcn_, Input_Shadcn_, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' @@ -24,7 +22,9 @@ import { import { OrganizationSelector } from './OrganizationSelector' import { ProjectAndPlanInfo } from './ProjectAndPlanInfo' import { DISABLE_SUPPORT_ACCESS_CATEGORIES, SupportAccessToggle } from './SupportAccessToggle' -import { NO_ORG_MARKER, NO_PROJECT_MARKER, getOrgSubscriptionPlan } from './SupportForm.utils' +import { getOrgSubscriptionPlan, NO_ORG_MARKER, NO_PROJECT_MARKER } from './SupportForm.utils' +import { useLinkSupportTicketMutation } from '@/data/feedback/link-support-ticket-mutation' +import { useOrganizationsQuery } from '@/data/organizations/organizations-query' interface LinkSupportTicketFormProps { conversationId: string diff --git a/apps/studio/components/interfaces/Support/LinkSupportTicketPage.tsx b/apps/studio/components/interfaces/Support/LinkSupportTicketPage.tsx index 0e687e5455..d5107fff2b 100644 --- a/apps/studio/components/interfaces/Support/LinkSupportTicketPage.tsx +++ b/apps/studio/components/interfaces/Support/LinkSupportTicketPage.tsx @@ -2,9 +2,9 @@ import { Check, Mail } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' import { useState } from 'react' - import { Button, cn, DialogSectionSeparator } from 'ui' import { Admonition } from 'ui-patterns' + import { LinkSupportTicketForm } from './LinkSupportTicketForm' export function LinkSupportTicketPage() { diff --git a/apps/studio/components/interfaces/Support/MessageField.tsx b/apps/studio/components/interfaces/Support/MessageField.tsx index da390930cf..be94263427 100644 --- a/apps/studio/components/interfaces/Support/MessageField.tsx +++ b/apps/studio/components/interfaces/Support/MessageField.tsx @@ -4,6 +4,7 @@ import type { UseFormReturn } from 'react-hook-form' import { FormControl_Shadcn_, FormField_Shadcn_, TextArea_Shadcn_ } from 'ui' import { Admonition } from 'ui-patterns/admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' + import { IPV4SuggestionAlert } from './IPV4SuggestionAlert' import { IPV4_MIGRATION_STRINGS } from './Support.constants' import type { SupportFormValues } from './SupportForm.schema' diff --git a/apps/studio/components/interfaces/Support/OrganizationSelector.tsx b/apps/studio/components/interfaces/Support/OrganizationSelector.tsx index 6d86cf1abf..4dc3954950 100644 --- a/apps/studio/components/interfaces/Support/OrganizationSelector.tsx +++ b/apps/studio/components/interfaces/Support/OrganizationSelector.tsx @@ -1,7 +1,4 @@ import type { UseFormReturn } from 'react-hook-form' -// End of third-party imports - -import { useOrganizationsQuery } from 'data/organizations/organizations-query' import { Badge, FormControl_Shadcn_, @@ -14,8 +11,12 @@ import { SelectValue_Shadcn_, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' + import type { SupportFormValues } from './SupportForm.schema' import { getOrgSubscriptionPlan, NO_ORG_MARKER, NO_PROJECT_MARKER } from './SupportForm.utils' +// End of third-party imports + +import { useOrganizationsQuery } from '@/data/organizations/organizations-query' interface OrganizationSelectorProps { form: UseFormReturn diff --git a/apps/studio/components/interfaces/Support/ProjectAndPlanInfo.tsx b/apps/studio/components/interfaces/Support/ProjectAndPlanInfo.tsx index 6246d881d6..2ef1a10347 100644 --- a/apps/studio/components/interfaces/Support/ProjectAndPlanInfo.tsx +++ b/apps/studio/components/interfaces/Support/ProjectAndPlanInfo.tsx @@ -1,10 +1,7 @@ // End of third-party imports import { useParams } from 'common' -import CopyButton from 'components/ui/CopyButton' -import { OrganizationProjectSelector } from 'components/ui/OrganizationProjectSelector' import { AnimatePresence, motion } from 'framer-motion' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import { Check, ChevronsUpDown, ExternalLink } from 'lucide-react' import Link from 'next/link' import type { UseFormReturn } from 'react-hook-form' @@ -24,6 +21,9 @@ import ShimmeringLoader from 'ui-patterns/ShimmeringLoader' import type { ExtendedSupportCategories } from './Support.constants' import type { SupportFormValues } from './SupportForm.schema' import { NO_ORG_MARKER, NO_PROJECT_MARKER } from './SupportForm.utils' +import CopyButton from '@/components/ui/CopyButton' +import { OrganizationProjectSelector } from '@/components/ui/OrganizationProjectSelector' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' interface ProjectAndPlanProps { form: UseFormReturn diff --git a/apps/studio/components/interfaces/Support/SubjectAndSuggestionsInfo.tsx b/apps/studio/components/interfaces/Support/SubjectAndSuggestionsInfo.tsx index 5e370b95a0..d0d25f1f9f 100644 --- a/apps/studio/components/interfaces/Support/SubjectAndSuggestionsInfo.tsx +++ b/apps/studio/components/interfaces/Support/SubjectAndSuggestionsInfo.tsx @@ -1,11 +1,12 @@ -import { ExternalLink } from 'lucide-react' -import Link from 'next/link' -import type { UseFormReturn } from 'react-hook-form' // End of third-party imports import { SupportCategories } from '@supabase/shared-types/out/constants' +import { ExternalLink } from 'lucide-react' +import Link from 'next/link' +import type { UseFormReturn } from 'react-hook-form' import { FormControl_Shadcn_, FormField_Shadcn_, Input_Shadcn_ } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' + import { DocsSuggestions } from './DocsSuggestions' import type { ExtendedSupportCategories } from './Support.constants' import type { SupportFormValues } from './SupportForm.schema' diff --git a/apps/studio/components/interfaces/Support/Success.tsx b/apps/studio/components/interfaces/Support/Success.tsx index bc0e14775e..2367a6087a 100644 --- a/apps/studio/components/interfaces/Support/Success.tsx +++ b/apps/studio/components/interfaces/Support/Success.tsx @@ -1,9 +1,10 @@ -import { useProjectDetailQuery } from 'data/projects/project-detail-query' -import { useProfile } from 'lib/profile' import { Check, Mail } from 'lucide-react' import Link from 'next/link' import { Button, IconDiscord, Separator } from 'ui' + import { NO_PROJECT_MARKER } from './SupportForm.utils' +import { useProjectDetailQuery } from '@/data/projects/project-detail-query' +import { useProfile } from '@/lib/profile' interface SuccessProps { sentCategory?: string diff --git a/apps/studio/components/interfaces/Support/SupportAccessToggle.tsx b/apps/studio/components/interfaces/Support/SupportAccessToggle.tsx index 0c24ef7d63..474e3162a3 100644 --- a/apps/studio/components/interfaces/Support/SupportAccessToggle.tsx +++ b/apps/studio/components/interfaces/Support/SupportAccessToggle.tsx @@ -6,9 +6,9 @@ import Link from 'next/link' import type { UseFormReturn } from 'react-hook-form' import { Badge, + Collapsible_Shadcn_, CollapsibleContent_Shadcn_, CollapsibleTrigger_Shadcn_, - Collapsible_Shadcn_, FormField_Shadcn_, Switch, } from 'ui' diff --git a/apps/studio/components/interfaces/Support/SupportForm.schema.ts b/apps/studio/components/interfaces/Support/SupportForm.schema.ts index 280780185a..65371fca01 100644 --- a/apps/studio/components/interfaces/Support/SupportForm.schema.ts +++ b/apps/studio/components/interfaces/Support/SupportForm.schema.ts @@ -1,7 +1,7 @@ -import { PLAN_REQUEST_EMPTY_PLACEHOLDER } from 'components/ui/UpgradePlanButton' import { z } from 'zod' import { CATEGORY_OPTIONS, type ExtendedSupportCategories } from './Support.constants' +import { PLAN_REQUEST_EMPTY_PLACEHOLDER } from '@/components/ui/UpgradePlanButton' export const SupportFormSchema = z .object({ diff --git a/apps/studio/components/interfaces/Support/SupportForm.state.ts b/apps/studio/components/interfaces/Support/SupportForm.state.ts index dd4605c458..b2a236e344 100644 --- a/apps/studio/components/interfaces/Support/SupportForm.state.ts +++ b/apps/studio/components/interfaces/Support/SupportForm.state.ts @@ -1,5 +1,5 @@ -import { neverGuard } from 'lib/helpers' import type { ExtendedSupportCategories } from './Support.constants' +import { neverGuard } from '@/lib/helpers' export type SupportFormState = | { diff --git a/apps/studio/components/interfaces/Support/SupportForm.utils.tsx b/apps/studio/components/interfaces/Support/SupportForm.utils.tsx index 42aeb037a1..60a88b4d71 100644 --- a/apps/studio/components/interfaces/Support/SupportForm.utils.tsx +++ b/apps/studio/components/interfaces/Support/SupportForm.utils.tsx @@ -5,9 +5,7 @@ import { type DocsSearchResult as Page, type DocsSearchResultSection as PageSection, } from 'common' -import { getProjectDetail } from 'data/projects/project-detail-query' import dayjs from 'dayjs' -import { DOCS_URL } from 'lib/constants' import { partition } from 'lodash' import { Book, Github, Hash, MessageSquare } from 'lucide-react' import { @@ -18,9 +16,11 @@ import { type inferParserType, type UseQueryStatesKeysMap, } from 'nuqs' -import type { Organization } from 'types' import { CATEGORY_OPTIONS } from './Support.constants' +import { getProjectDetail } from '@/data/projects/project-detail-query' +import { DOCS_URL } from '@/lib/constants' +import type { Organization } from '@/types' export const NO_PROJECT_MARKER = 'no-project' export const NO_ORG_MARKER = 'no-org' diff --git a/apps/studio/components/interfaces/Support/SupportFormPage.tsx b/apps/studio/components/interfaces/Support/SupportFormPage.tsx index 60268f0003..335ca47932 100644 --- a/apps/studio/components/interfaces/Support/SupportFormPage.tsx +++ b/apps/studio/components/interfaces/Support/SupportFormPage.tsx @@ -1,16 +1,11 @@ import * as Sentry from '@sentry/nextjs' -import CopyButton from 'components/ui/CopyButton' -import { useIncidentStatusQuery } from 'data/platform/incident-status-query' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useStateTransition } from 'hooks/misc/useStateTransition' -import { BASE_PATH, DOCS_URL } from 'lib/constants' import { Loader2, Wrench } from 'lucide-react' import Link from 'next/link' -import { type Dispatch, type PropsWithChildren, useCallback, useReducer } from 'react' +import { useCallback, useReducer, type Dispatch, type PropsWithChildren } from 'react' import type { UseFormReturn } from 'react-hook-form' import SVG from 'react-inlinesvg' import { toast } from 'sonner' -import { Button, Tooltip, TooltipContent, TooltipTrigger, cn } from 'ui' +import { Button, cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' import { Admonition } from 'ui-patterns/admonition' import { AIAssistantOption } from './AIAssistantOption' @@ -20,14 +15,19 @@ import { Success } from './Success' import type { ExtendedSupportCategories } from './Support.constants' import type { SupportFormValues } from './SupportForm.schema' import { - type SupportFormActions, - type SupportFormState, createInitialSupportFormState, supportFormReducer, + type SupportFormActions, + type SupportFormState, } from './SupportForm.state' import { NO_PROJECT_MARKER } from './SupportForm.utils' import { SupportFormV2 } from './SupportFormV2' import { useSupportForm } from './useSupportForm' +import CopyButton from '@/components/ui/CopyButton' +import { useIncidentStatusQuery } from '@/data/platform/incident-status-query' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useStateTransition } from '@/hooks/misc/useStateTransition' +import { BASE_PATH, DOCS_URL } from '@/lib/constants' function useSupportFormTelemetry() { const { mutate: sendEvent } = useSendEventMutation() diff --git a/apps/studio/components/interfaces/Support/SupportFormV2.tsx b/apps/studio/components/interfaces/Support/SupportFormV2.tsx index eb1093d28d..688945f35f 100644 --- a/apps/studio/components/interfaces/Support/SupportFormV2.tsx +++ b/apps/studio/components/interfaces/Support/SupportFormV2.tsx @@ -2,15 +2,6 @@ import { SupportCategories } from '@supabase/shared-types/out/constants' import { useConstant, useFlag } from 'common' import { CLIENT_LIBRARIES } from 'common/constants' -import { getProjectAuthConfig } from 'data/auth/auth-config-query' -import { useSendSupportTicketMutation } from 'data/feedback/support-ticket-send' -import { type OrganizationPlanID } from 'data/organizations/organization-query' -import { useOrganizationsQuery } from 'data/organizations/organizations-query' -import { useGenerateAttachmentURLsMutation } from 'data/support/generate-attachment-urls-mutation' -import { useDeploymentCommitQuery } from 'data/utils/deployment-commit-query' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { detectBrowser } from 'lib/helpers' -import { useProfile } from 'lib/profile' import { type Dispatch, type MouseEventHandler } from 'react' import type { SubmitHandler, UseFormReturn } from 'react-hook-form' import { DialogSectionSeparator, Form_Shadcn_ } from 'ui' @@ -22,6 +13,11 @@ import { import { AttachmentUploadDisplay, useAttachmentUpload } from './AttachmentUpload' import { CategoryAndSeverityInfo } from './CategoryAndSeverityInfo' import { ClientLibraryInfo } from './ClientLibraryInfo' +import { + DASHBOARD_LOG_CATEGORIES, + getSanitizedBreadcrumbs, + uploadDashboardLog, +} from './dashboard-logs' import { DashboardLogsToggle } from './DashboardLogsToggle' import { MessageField } from './MessageField' import { OrganizationSelector } from './OrganizationSelector' @@ -32,17 +28,21 @@ import { DISABLE_SUPPORT_ACCESS_CATEGORIES, SupportAccessToggle } from './Suppor import type { SupportFormValues } from './SupportForm.schema' import type { SupportFormActions, SupportFormState } from './SupportForm.state' import { - NO_ORG_MARKER, - NO_PROJECT_MARKER, formatMessage, formatStudioVersion, getOrgSubscriptionPlan, + NO_ORG_MARKER, + NO_PROJECT_MARKER, } from './SupportForm.utils' -import { - DASHBOARD_LOG_CATEGORIES, - getSanitizedBreadcrumbs, - uploadDashboardLog, -} from './dashboard-logs' +import { getProjectAuthConfig } from '@/data/auth/auth-config-query' +import { useSendSupportTicketMutation } from '@/data/feedback/support-ticket-send' +import { type OrganizationPlanID } from '@/data/organizations/organization-query' +import { useOrganizationsQuery } from '@/data/organizations/organizations-query' +import { useGenerateAttachmentURLsMutation } from '@/data/support/generate-attachment-urls-mutation' +import { useDeploymentCommitQuery } from '@/data/utils/deployment-commit-query' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { detectBrowser } from '@/lib/helpers' +import { useProfile } from '@/lib/profile' const useIsSimplifiedForm = (slug: string, subscriptionPlanId?: OrganizationPlanID) => { const simplifiedSupportForm = useFlag('simplifiedSupportForm') diff --git a/apps/studio/components/interfaces/Support/SupportLink.tsx b/apps/studio/components/interfaces/Support/SupportLink.tsx index 5effa0e792..ff86410500 100644 --- a/apps/studio/components/interfaces/Support/SupportLink.tsx +++ b/apps/studio/components/interfaces/Support/SupportLink.tsx @@ -1,8 +1,8 @@ import Link from 'next/link' import type { ComponentProps, PropsWithChildren } from 'react' -import { takeBreadcrumbSnapshot } from 'lib/breadcrumbs' import { createSupportFormUrl, type SupportFormUrlKeys } from './SupportForm.utils' +import { takeBreadcrumbSnapshot } from '@/lib/breadcrumbs' export const SupportLink = ({ children, diff --git a/apps/studio/components/interfaces/Support/__tests__/SupportFormPage.test.tsx b/apps/studio/components/interfaces/Support/__tests__/SupportFormPage.test.tsx index 1fb46c32d7..bdbab028ab 100644 --- a/apps/studio/components/interfaces/Support/__tests__/SupportFormPage.test.tsx +++ b/apps/studio/components/interfaces/Support/__tests__/SupportFormPage.test.tsx @@ -1,18 +1,18 @@ import { screen, waitFor } from '@testing-library/react' import userEvent from '@testing-library/user-event' import dayjs from 'dayjs' -// End of third-party imports - -import { API_URL, BASE_PATH } from 'lib/constants' import { http, HttpResponse } from 'msw' -import { createMockOrganization, createMockProject } from 'tests/helpers' -import { customRender } from 'tests/lib/custom-render' -import { addAPIMock, mswServer } from 'tests/lib/msw' -import { createMockProfileContext } from 'tests/lib/profile-helpers' import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' import { NO_ORG_MARKER, NO_PROJECT_MARKER } from '../SupportForm.utils' import { SupportFormPage } from '../SupportFormPage' +// End of third-party imports + +import { API_URL, BASE_PATH } from '@/lib/constants' +import { createMockOrganization, createMockProject } from '@/tests/helpers' +import { customRender } from '@/tests/lib/custom-render' +import { addAPIMock, mswServer } from '@/tests/lib/msw' +import { createMockProfileContext } from '@/tests/lib/profile-helpers' type Screen = typeof screen @@ -98,7 +98,7 @@ vi.mock('../support-storage-client', () => ({ createSupportStorageClient: vi.fn(), })) -vi.mock(import('lib/breadcrumbs'), async (importOriginal) => { +vi.mock(import('@/lib/breadcrumbs'), async (importOriginal) => { const actual = await importOriginal() return { ...actual, @@ -163,7 +163,7 @@ vi.mock(import('common'), async (importOriginal) => { } }) -vi.mock(import('lib/gotrue'), async (importOriginal) => { +vi.mock(import('@/lib/gotrue'), async (importOriginal) => { const actual = await importOriginal() return { ...actual, @@ -174,7 +174,7 @@ vi.mock(import('lib/gotrue'), async (importOriginal) => { } }) -vi.mock(import('lib/constants'), async (importOriginal) => { +vi.mock(import('@/lib/constants'), async (importOriginal) => { const actual = await importOriginal() return { ...actual, @@ -355,7 +355,7 @@ describe('SupportFormPage', () => { }) ) - const breadcrumbsModule = await import('lib/breadcrumbs') + const breadcrumbsModule = await import('@/lib/breadcrumbs') getBreadcrumbSnapshotMock = vi.mocked(breadcrumbsModule.getOwnershipOfBreadcrumbSnapshot) getBreadcrumbSnapshotMock.mockReset() getBreadcrumbSnapshotMock.mockReturnValue([ diff --git a/apps/studio/components/interfaces/Support/dashboard-logs.ts b/apps/studio/components/interfaces/Support/dashboard-logs.ts index caa85b87fc..9bd723f5ea 100644 --- a/apps/studio/components/interfaces/Support/dashboard-logs.ts +++ b/apps/studio/components/interfaces/Support/dashboard-logs.ts @@ -1,15 +1,15 @@ import * as Sentry from '@sentry/nextjs' - import { SupportCategories } from '@supabase/shared-types/out/constants' + +import { createSupportStorageClient } from './support-storage-client' +import type { ExtendedSupportCategories } from './Support.constants' import type { GenerateAttachmentURLsData, GenerateAttachmentURLsVariables, -} from 'data/support/generate-attachment-urls-mutation' -import { getMirroredBreadcrumbs, getOwnershipOfBreadcrumbSnapshot } from 'lib/breadcrumbs' -import { uuidv4 } from 'lib/helpers' -import { sanitizeArrayOfObjects } from 'lib/sanitize' -import { createSupportStorageClient } from './support-storage-client' -import type { ExtendedSupportCategories } from './Support.constants' +} from '@/data/support/generate-attachment-urls-mutation' +import { getMirroredBreadcrumbs, getOwnershipOfBreadcrumbSnapshot } from '@/lib/breadcrumbs' +import { uuidv4 } from '@/lib/helpers' +import { sanitizeArrayOfObjects } from '@/lib/sanitize' export type DashboardBreadcrumb = Sentry.Breadcrumb diff --git a/apps/studio/components/interfaces/Support/useSupportForm.ts b/apps/studio/components/interfaces/Support/useSupportForm.ts index 1f8c532302..e224d02956 100644 --- a/apps/studio/components/interfaces/Support/useSupportForm.ts +++ b/apps/studio/components/interfaces/Support/useSupportForm.ts @@ -1,18 +1,19 @@ import { zodResolver } from '@hookform/resolvers/zod' -import { type Dispatch, useEffect, useRef, useState } from 'react' -import { type DefaultValues, type UseFormReturn, useForm, useWatch } from 'react-hook-form' -// End of third-party imports +import { useEffect, useRef, useState, type Dispatch } from 'react' +import { useForm, useWatch, type DefaultValues, type UseFormReturn } from 'react-hook-form' -import { useOrganizationsQuery } from 'data/organizations/organizations-query' import { SupportFormSchema, type SupportFormValues } from './SupportForm.schema' import type { SupportFormActions } from './SupportForm.state' import { + loadSupportFormInitialParams, NO_ORG_MARKER, NO_PROJECT_MARKER, - type SupportFormUrlKeys, - loadSupportFormInitialParams, selectInitialOrgAndProject, + type SupportFormUrlKeys, } from './SupportForm.utils' +// End of third-party imports + +import { useOrganizationsQuery } from '@/data/organizations/organizations-query' const supportFormDefaultValues: DefaultValues = { organizationSlug: NO_ORG_MARKER, diff --git a/apps/studio/components/interfaces/TableGridEditor/DeleteConfirmationDialogs.tsx b/apps/studio/components/interfaces/TableGridEditor/DeleteConfirmationDialogs.tsx index ea0b66407c..7d9a906a17 100644 --- a/apps/studio/components/interfaces/TableGridEditor/DeleteConfirmationDialogs.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/DeleteConfirmationDialogs.tsx @@ -1,21 +1,21 @@ import { ExternalLink } from 'lucide-react' import Link from 'next/link' import { toast } from 'sonner' - -import { useTableFilter } from 'components/grid/hooks/useTableFilter' -import type { SupaRow } from 'components/grid/types' -import { useDatabaseColumnDeleteMutation } from 'data/database-columns/database-column-delete-mutation' -import { TableLike } from 'data/table-editor/table-editor-types' -import { useTableRowDeleteAllMutation } from 'data/table-rows/table-row-delete-all-mutation' -import { useTableRowDeleteMutation } from 'data/table-rows/table-row-delete-mutation' -import { useTableRowTruncateMutation } from 'data/table-rows/table-row-truncate-mutation' -import { useTableDeleteMutation } from 'data/tables/table-delete-mutation' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useGetImpersonatedRoleState } from 'state/role-impersonation-state' -import { useTableEditorStateSnapshot } from 'state/table-editor' -import { AlertDescription_Shadcn_, AlertTitle_Shadcn_, Alert_Shadcn_, Button, Checkbox } from 'ui' +import { Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, Button, Checkbox } from 'ui' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' +import { useTableFilter } from '@/components/grid/hooks/useTableFilter' +import type { SupaRow } from '@/components/grid/types' +import { useDatabaseColumnDeleteMutation } from '@/data/database-columns/database-column-delete-mutation' +import { TableLike } from '@/data/table-editor/table-editor-types' +import { useTableRowDeleteAllMutation } from '@/data/table-rows/table-row-delete-all-mutation' +import { useTableRowDeleteMutation } from '@/data/table-rows/table-row-delete-mutation' +import { useTableRowTruncateMutation } from '@/data/table-rows/table-row-truncate-mutation' +import { useTableDeleteMutation } from '@/data/tables/table-delete-mutation' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useGetImpersonatedRoleState } from '@/state/role-impersonation-state' +import { useTableEditorStateSnapshot } from '@/state/table-editor' + export type DeleteConfirmationDialogsProps = { selectedTable?: TableLike onTableDeleted?: () => void diff --git a/apps/studio/components/interfaces/TableGridEditor/GridHeaderActions.tsx b/apps/studio/components/interfaces/TableGridEditor/GridHeaderActions.tsx index 4a201d8d80..5681e0700f 100644 --- a/apps/studio/components/interfaces/TableGridEditor/GridHeaderActions.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/GridHeaderActions.tsx @@ -1,49 +1,49 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { Lightbulb, Lock, MousePointer2, PlusCircle, Unlock } from 'lucide-react' import Link from 'next/link' +import { parseAsBoolean, useQueryState } from 'nuqs' import { useState } from 'react' import { toast } from 'sonner' +import { + Button, + cn, + Popover_Shadcn_, + PopoverContent_Shadcn_, + PopoverTrigger_Shadcn_, + Tooltip, + TooltipContent, + TooltipTrigger, +} from 'ui' +import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' -import { useParams } from 'common' -import { RefreshButton } from 'components/grid/components/header/RefreshButton' -import { useTableIndexAdvisor } from 'components/grid/context/TableIndexAdvisorContext' -import { EnableIndexAdvisorButton } from 'components/interfaces/QueryPerformance/IndexAdvisor/EnableIndexAdvisorButton' -import { getEntityLintDetails } from 'components/interfaces/TableGridEditor/TableEntity.utils' -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' -import { useDatabasePublicationUpdateMutation } from 'data/database-publications/database-publications-update-mutation' -import { useProjectLintsQuery } from 'data/lint/lint-query' +import { RoleImpersonationPopover } from '../RoleImpersonationSelector/RoleImpersonationPopover' +import ViewEntityAutofixSecurityModal from './ViewEntityAutofixSecurityModal' +import { RefreshButton } from '@/components/grid/components/header/RefreshButton' +import { useTableIndexAdvisor } from '@/components/grid/context/TableIndexAdvisorContext' +import { EnableIndexAdvisorButton } from '@/components/interfaces/QueryPerformance/IndexAdvisor/EnableIndexAdvisorButton' +import { getEntityLintDetails } from '@/components/interfaces/TableGridEditor/TableEntity.utils' +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' +import { useDatabasePublicationUpdateMutation } from '@/data/database-publications/database-publications-update-mutation' +import { useProjectLintsQuery } from '@/data/lint/lint-query' import { Entity, isTableLike, isForeignTable as isTableLikeForeignTable, isMaterializedView as isTableLikeMaterializedView, isView as isTableLikeView, -} from 'data/table-editor/table-editor-types' -import { useTableUpdateMutation } from 'data/tables/table-update-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useIsProtectedSchema } from 'hooks/useProtectedSchemas' -import { DOCS_URL } from 'lib/constants' -import { useTrack } from 'lib/telemetry/track' -import { parseAsBoolean, useQueryState } from 'nuqs' -import { useTableEditorTableStateSnapshot } from 'state/table-editor-table' -import { - Button, - PopoverContent_Shadcn_, - PopoverTrigger_Shadcn_, - Popover_Shadcn_, - Tooltip, - TooltipContent, - TooltipTrigger, - cn, -} from 'ui' -import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' -import { RoleImpersonationPopover } from '../RoleImpersonationSelector/RoleImpersonationPopover' -import ViewEntityAutofixSecurityModal from './ViewEntityAutofixSecurityModal' +} from '@/data/table-editor/table-editor-types' +import { useTableUpdateMutation } from '@/data/tables/table-update-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useIsProtectedSchema } from '@/hooks/useProtectedSchemas' +import { DOCS_URL } from '@/lib/constants' +import { useTrack } from '@/lib/telemetry/track' +import { useTableEditorTableStateSnapshot } from '@/state/table-editor-table' export interface GridHeaderActionsProps { table: Entity diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ActionBar.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ActionBar.tsx index 6ee65372dd..3eb397dfc3 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ActionBar.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ActionBar.tsx @@ -1,9 +1,10 @@ -import { useHotKey } from 'hooks/ui/useHotKey' -import { getModKeyLabel } from 'lib/helpers' import { noop } from 'lodash' import { PropsWithChildren, useCallback, useMemo, useState } from 'react' import { Button } from 'ui' +import { useHotKey } from '@/hooks/ui/useHotKey' +import { getModKeyLabel } from '@/lib/helpers' + interface ActionBarProps { loading?: boolean disableApply?: boolean diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnDefaultValue.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnDefaultValue.tsx index 37298ca9a5..6cd2ffecc4 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnDefaultValue.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnDefaultValue.tsx @@ -1,12 +1,12 @@ import { noop } from 'lodash' import { Select } from 'ui' -import type { EnumeratedType } from 'data/enumerated-types/enumerated-types-query' import { POSTGRES_DATA_TYPES } from '../SidePanelEditor.constants' import type { ColumnField } from '../SidePanelEditor.types' import { typeExpressionSuggestions } from './ColumnEditor.constants' import type { Suggestion } from './ColumnEditor.types' import InputWithSuggestions from './InputWithSuggestions' +import type { EnumeratedType } from '@/data/enumerated-types/enumerated-types-query' interface ColumnDefaultValueProps { columnFields: ColumnField diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnEditor.constants.ts b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnEditor.constants.ts index ad364b3ca4..aafa68b750 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnEditor.constants.ts +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnEditor.constants.ts @@ -1,5 +1,5 @@ -import type { Dictionary } from 'types' import type { Suggestion } from './ColumnEditor.types' +import type { Dictionary } from '@/types' const defaultTimeBasedExpressions: Suggestion[] = [ { diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnEditor.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnEditor.tsx index 75c8d13f77..010ef7b7a9 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnEditor.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnEditor.tsx @@ -1,19 +1,5 @@ import type { PostgresColumn, PostgresTable } from '@supabase/postgres-meta' import { useParams } from 'common' -import { FormSection, FormSectionContent, FormSectionLabel } from 'components/ui/Forms/FormSection' -import { - Constraint, - CONSTRAINT_TYPE, - useTableConstraintsQuery, -} from 'data/database/constraints-query' -import { - ForeignKeyConstraint, - useForeignKeyConstraintsQuery, -} from 'data/database/foreign-key-constraints-query' -import { useEnumeratedTypesQuery } from 'data/enumerated-types/enumerated-types-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useProtectedSchemas } from 'hooks/useProtectedSchemas' -import { DOCS_URL } from 'lib/constants' import { isEmpty, noop } from 'lodash' import { ExternalLink, Plus } from 'lucide-react' import Link from 'next/link' @@ -59,6 +45,24 @@ import { import ColumnForeignKey from './ColumnForeignKey' import ColumnType from './ColumnType' import { HeaderTitle } from './HeaderTitle' +import { + FormSection, + FormSectionContent, + FormSectionLabel, +} from '@/components/ui/Forms/FormSection' +import { + Constraint, + CONSTRAINT_TYPE, + useTableConstraintsQuery, +} from '@/data/database/constraints-query' +import { + ForeignKeyConstraint, + useForeignKeyConstraintsQuery, +} from '@/data/database/foreign-key-constraints-query' +import { useEnumeratedTypesQuery } from '@/data/enumerated-types/enumerated-types-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useProtectedSchemas } from '@/hooks/useProtectedSchemas' +import { DOCS_URL } from '@/lib/constants' export interface ColumnEditorProps { column?: Readonly diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnEditor.utils.ts b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnEditor.utils.ts index cd3550e1de..40c1ff7fe6 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnEditor.utils.ts +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnEditor.utils.ts @@ -1,11 +1,7 @@ import { FOREIGN_KEY_CASCADE_ACTION } from '@supabase/pg-meta' import type { PostgresColumn } from '@supabase/postgres-meta' -import type { ForeignKeyConstraint } from 'data/database/foreign-key-constraints-query' -import type { RetrievedTableColumn, RetrieveTableResult } from 'data/tables/table-retrieve-query' -import { uuidv4 } from 'lib/helpers' import { isNull } from 'lodash' import { toast } from 'sonner' -import type { Dictionary } from 'types' import { ColumnField, @@ -13,6 +9,10 @@ import { ExtendedPostgresRelationship, UpdateColumnPayload, } from '../SidePanelEditor.types' +import type { ForeignKeyConstraint } from '@/data/database/foreign-key-constraints-query' +import type { RetrievedTableColumn, RetrieveTableResult } from '@/data/tables/table-retrieve-query' +import { uuidv4 } from '@/lib/helpers' +import type { Dictionary } from '@/types' const isSQLExpression = (input: string) => { if (['CURRENT_DATE'].includes(input)) return true diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnForeignKey.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnForeignKey.tsx index eeca2f8e42..48b5e1cd97 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnForeignKey.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnForeignKey.tsx @@ -1,7 +1,4 @@ import { useParams } from 'common' -import { useForeignKeyConstraintsQuery } from 'data/database/foreign-key-constraints-query' -import { useTableEditorQuery } from 'data/table-editor/table-editor-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { useState } from 'react' import { Button } from 'ui' @@ -10,6 +7,9 @@ import type { ForeignKey } from '../ForeignKeySelector/ForeignKeySelector.types' import type { ColumnField } from '../SidePanelEditor.types' import { ForeignKeyRow } from '../TableEditor/ForeignKeysManagement/ForeignKeyRow' import { checkIfRelationChanged } from '../TableEditor/ForeignKeysManagement/ForeignKeysManagement.utils' +import { useForeignKeyConstraintsQuery } from '@/data/database/foreign-key-constraints-query' +import { useTableEditorQuery } from '@/data/table-editor/table-editor-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface ColumnForeignKeyProps { tableId?: number diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnType.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnType.tsx index 5d9588cc8b..11e2bdd3c5 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnType.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/ColumnType.tsx @@ -1,4 +1,3 @@ -import type { EnumeratedType } from 'data/enumerated-types/enumerated-types-query' import { noop } from 'lodash' import { Calendar, @@ -43,6 +42,7 @@ import { RECOMMENDED_ALTERNATIVE_DATA_TYPE, } from '../SidePanelEditor.constants' import type { PostgresDataTypeOption } from '../SidePanelEditor.types' +import type { EnumeratedType } from '@/data/enumerated-types/enumerated-types-query' interface ColumnTypeProps { value: string diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/InputWithSuggestions.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/InputWithSuggestions.tsx index e08fc2c029..36fad741b3 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/InputWithSuggestions.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ColumnEditor/InputWithSuggestions.tsx @@ -5,7 +5,6 @@ // with timeouts and a lot of unnecessary defensive guards - but these can go away when we port // the component over to the UI library -import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { noop } from 'lodash' import { List } from 'lucide-react' import { useEffect, useRef, useState } from 'react' @@ -20,6 +19,7 @@ import { } from 'ui' import type { Suggestion } from './ColumnEditor.types' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' const MAX_SUGGESTIONS = 3 diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ForeignKeySelector/ForeignKeySelector.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ForeignKeySelector/ForeignKeySelector.tsx index d130c21387..ada532a66b 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ForeignKeySelector/ForeignKeySelector.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ForeignKeySelector/ForeignKeySelector.tsx @@ -1,16 +1,5 @@ import { FOREIGN_KEY_CASCADE_ACTION } from '@supabase/pg-meta' import type { PostgresTable } from '@supabase/postgres-meta' -import { DiscardChangesConfirmationDialog } from 'components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' -import { DocsButton } from 'components/ui/DocsButton' -import InformationBox from 'components/ui/InformationBox' -import { useSchemasQuery } from 'data/database/schemas-query' -import { useTableQuery } from 'data/tables/table-retrieve-query' -import { useTablesQuery } from 'data/tables/tables-query' -import { useQuerySchemaState } from 'hooks/misc/useSchemaQueryState' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useConfirmOnClose } from 'hooks/ui/useConfirmOnClose' -import { DOCS_URL } from 'lib/constants' -import { uuidv4 } from 'lib/helpers' import { sortBy } from 'lodash' import { ArrowRight, Database, HelpCircle, Loader2, Table, X } from 'lucide-react' import { Fragment, useEffect, useState } from 'react' @@ -34,6 +23,17 @@ import { normalizeForeignKeyForDirtyCheck, type ForeignKeyDirtyState, } from './ForeignKeySelector.utils' +import { DiscardChangesConfirmationDialog } from '@/components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' +import { DocsButton } from '@/components/ui/DocsButton' +import InformationBox from '@/components/ui/InformationBox' +import { useSchemasQuery } from '@/data/database/schemas-query' +import { useTableQuery } from '@/data/tables/table-retrieve-query' +import { useTablesQuery } from '@/data/tables/tables-query' +import { useQuerySchemaState } from '@/hooks/misc/useSchemaQueryState' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useConfirmOnClose } from '@/hooks/ui/useConfirmOnClose' +import { DOCS_URL } from '@/lib/constants' +import { uuidv4 } from '@/lib/helpers' const EMPTY_STATE: ForeignKey = { id: undefined, diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ForeignKeySelector/ForeignKeySelector.utils.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ForeignKeySelector/ForeignKeySelector.utils.tsx index 142aa59f8f..6bdd452056 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ForeignKeySelector/ForeignKeySelector.utils.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/ForeignKeySelector/ForeignKeySelector.utils.tsx @@ -1,11 +1,11 @@ import { FOREIGN_KEY_CASCADE_ACTION } from '@supabase/pg-meta' -import type { ForeignKeyConstraint } from 'data/database/foreign-key-constraints-query' import { isEqual } from 'lodash' import { HelpCircle } from 'lucide-react' import { Tooltip, TooltipContent, TooltipTrigger } from 'ui' import { getForeignKeyCascadeAction } from '../ColumnEditor/ColumnEditor.utils' import type { ForeignKey } from './ForeignKeySelector.types' +import type { ForeignKeyConstraint } from '@/data/database/foreign-key-constraints-query' export interface ForeignKeyDirtyState { id?: number | string diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/OperationQueueSidePanel/AddRowOperationItem.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/OperationQueueSidePanel/AddRowOperationItem.tsx index 2cf02b0ade..3ff0e01c1a 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/OperationQueueSidePanel/AddRowOperationItem.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/OperationQueueSidePanel/AddRowOperationItem.tsx @@ -1,12 +1,12 @@ import { useQueryClient } from '@tanstack/react-query' -import { tableRowKeys } from 'data/table-rows/keys' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Undo2 } from 'lucide-react' -import { useTableEditorStateSnapshot } from 'state/table-editor' import { Card, CardContent, CardHeader } from 'ui' import { formatOperationItemValue } from './OperationQueueSidePanel.utils' import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { tableRowKeys } from '@/data/table-rows/keys' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useTableEditorStateSnapshot } from '@/state/table-editor' import { AddRowPayload } from '@/state/table-editor-operation-queue.types' interface AddRowOperationItemProps { diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/OperationQueueSidePanel/DeleteRowOperationItem.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/OperationQueueSidePanel/DeleteRowOperationItem.tsx index 29a7798793..4425a4b5b3 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/OperationQueueSidePanel/DeleteRowOperationItem.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/OperationQueueSidePanel/DeleteRowOperationItem.tsx @@ -1,12 +1,12 @@ import { useQueryClient } from '@tanstack/react-query' -import { tableRowKeys } from 'data/table-rows/keys' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Undo2 } from 'lucide-react' -import { useTableEditorStateSnapshot } from 'state/table-editor' import { Card, CardContent, CardHeader } from 'ui' import { formatOperationItemValue } from './OperationQueueSidePanel.utils' import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { tableRowKeys } from '@/data/table-rows/keys' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useTableEditorStateSnapshot } from '@/state/table-editor' import { DeleteRowPayload } from '@/state/table-editor-operation-queue.types' interface DeleteRowOperationItemProps { diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/OperationQueueSidePanel/OperationItem.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/OperationQueueSidePanel/OperationItem.tsx index 78e3ae3588..09ea84ec47 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/OperationQueueSidePanel/OperationItem.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/OperationQueueSidePanel/OperationItem.tsx @@ -1,12 +1,12 @@ import { useQueryClient } from '@tanstack/react-query' -import { tableRowKeys } from 'data/table-rows/keys' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Undo2 } from 'lucide-react' -import { useTableEditorStateSnapshot } from 'state/table-editor' import { Card, CardContent, CardHeader } from 'ui' import { formatOperationItemValue } from './OperationQueueSidePanel.utils' import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { tableRowKeys } from '@/data/table-rows/keys' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useTableEditorStateSnapshot } from '@/state/table-editor' import { EditCellContentPayload } from '@/state/table-editor-operation-queue.types' interface OperationItemProps { diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/OperationQueueSidePanel/OperationList.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/OperationQueueSidePanel/OperationList.tsx index af3c365133..655ebb848f 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/OperationQueueSidePanel/OperationList.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/OperationQueueSidePanel/OperationList.tsx @@ -1,13 +1,12 @@ +import { AddRowOperationItem } from './AddRowOperationItem' +import { DeleteRowOperationItem } from './DeleteRowOperationItem' +import { OperationItem } from './OperationItem' import { isAddRowOperation, isDeleteRowOperation, isEditCellContentOperation, QueuedOperation, -} from 'state/table-editor-operation-queue.types' - -import { AddRowOperationItem } from './AddRowOperationItem' -import { DeleteRowOperationItem } from './DeleteRowOperationItem' -import { OperationItem } from './OperationItem' +} from '@/state/table-editor-operation-queue.types' interface OperationListProps { operations: readonly QueuedOperation[] diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/OperationQueueSidePanel/OperationQueueSidePanel.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/OperationQueueSidePanel/OperationQueueSidePanel.tsx index 6b459d98f6..fca06781ea 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/OperationQueueSidePanel/OperationQueueSidePanel.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/OperationQueueSidePanel/OperationQueueSidePanel.tsx @@ -1,5 +1,3 @@ -import { useOperationQueueActions } from 'components/grid/hooks/useOperationQueueActions' -import { useTableEditorStateSnapshot } from 'state/table-editor' import { Button, Sheet, @@ -12,9 +10,11 @@ import { } from 'ui' import { OperationList } from './OperationList' +import { useOperationQueueActions } from '@/components/grid/hooks/useOperationQueueActions' import { DiscardChangesConfirmationDialog } from '@/components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' import { useConfirmOnClose } from '@/hooks/ui/useConfirmOnClose' import { getModKeyLabel } from '@/lib/helpers' +import { useTableEditorStateSnapshot } from '@/state/table-editor' import { QueuedOperation } from '@/state/table-editor-operation-queue.types' export const OperationQueueSidePanel = () => { diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/DateTimeInput/DateTimeInput.utils.ts b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/DateTimeInput/DateTimeInput.utils.ts index 419f286079..e92ffa8d17 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/DateTimeInput/DateTimeInput.utils.ts +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/DateTimeInput/DateTimeInput.utils.ts @@ -1,4 +1,4 @@ -import { TIMESTAMP_TYPES, DATE_TYPES, TIME_TYPES } from '../../SidePanelEditor.constants' +import { DATE_TYPES, TIME_TYPES, TIMESTAMP_TYPES } from '../../SidePanelEditor.constants' export function getColumnType(format: string) { if (isDateColumn(format)) { diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/DateTimeInput/index.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/DateTimeInput/index.tsx index 964f8db9c1..f7e280f896 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/DateTimeInput/index.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/DateTimeInput/index.tsx @@ -1,7 +1,6 @@ import dayjs from 'dayjs' import { Edit } from 'lucide-react' import { ReactNode } from 'react' - import { Button, cn, @@ -11,6 +10,7 @@ import { DropdownMenuTrigger, Input, } from 'ui' + import { getColumnType } from './DateTimeInput.utils' interface DateTimeInputProps { 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 bdc3d5f8b2..12ba21b529 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/ForeignRowSelector/ForeignRowSelector.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/ForeignRowSelector/ForeignRowSelector.tsx @@ -1,33 +1,33 @@ import { keepPreviousData } from '@tanstack/react-query' import { useParams } from 'common' -import { FilterPopoverPrimitive } from 'components/grid/components/header/filter/FilterPopoverPrimitive' -import { RefreshButton } from 'components/grid/components/header/RefreshButton' -import { SortPopoverPrimitive } from 'components/grid/components/header/sort/SortPopoverPrimitive' -import { - formatSortURLParams, - loadTableEditorStateFromLocalStorage, - saveTableEditorStateToLocalStorage, - sortsToUrlParams, -} from 'components/grid/SupabaseGrid.utils' -import type { Filter, Sort } from 'components/grid/types' -import { useTableEditorQuery } from 'data/table-editor/table-editor-query' -import { useTableRowsQuery } from 'data/table-rows/table-rows-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Loader2, X } from 'lucide-react' import { useEffect, useState } from 'react' import { DndProvider } from 'react-dnd' import { HTML5Backend } from 'react-dnd-html5-backend' -import { - RoleImpersonationState, - useRoleImpersonationStateSnapshot, -} from 'state/role-impersonation-state' -import { TableEditorTableStateContextProvider } from 'state/table-editor-table' import { Button, SidePanel } from 'ui' import { ForeignKey } from '../../ForeignKeySelector/ForeignKeySelector.types' import { convertByteaToHex } from '../RowEditor.utils' import Pagination from './Pagination' import SelectorGrid from './SelectorGrid' +import { FilterPopoverPrimitive } from '@/components/grid/components/header/filter/FilterPopoverPrimitive' +import { RefreshButton } from '@/components/grid/components/header/RefreshButton' +import { SortPopoverPrimitive } from '@/components/grid/components/header/sort/SortPopoverPrimitive' +import { + formatSortURLParams, + loadTableEditorStateFromLocalStorage, + saveTableEditorStateToLocalStorage, + sortsToUrlParams, +} from '@/components/grid/SupabaseGrid.utils' +import type { Filter, Sort } from '@/components/grid/types' +import { useTableEditorQuery } from '@/data/table-editor/table-editor-query' +import { useTableRowsQuery } from '@/data/table-rows/table-rows-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { + RoleImpersonationState, + useRoleImpersonationStateSnapshot, +} from '@/state/role-impersonation-state' +import { TableEditorTableStateContextProvider } from '@/state/table-editor-table' const FOREIGN_ROW_SELECTOR_TABLE_NAME_SUFFIX = '__frselector' diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/ForeignRowSelector/Pagination.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/ForeignRowSelector/Pagination.tsx index ee785cd32f..8499412bcc 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/ForeignRowSelector/Pagination.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/ForeignRowSelector/Pagination.tsx @@ -1,4 +1,4 @@ -import { Loader, ArrowLeft, ArrowRight } from 'lucide-react' +import { ArrowLeft, ArrowRight, Loader } from 'lucide-react' import { Button } from 'ui' export interface PaginationProps { diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/ForeignRowSelector/SelectorGrid.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/ForeignRowSelector/SelectorGrid.tsx index 5bbc052095..d68eab3e2f 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/ForeignRowSelector/SelectorGrid.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/ForeignRowSelector/SelectorGrid.tsx @@ -1,16 +1,16 @@ import { Key } from 'lucide-react' import DataGrid, { Column } from 'react-data-grid' +import { Tooltip, TooltipContent, TooltipTrigger } from 'ui' -import { NullValue } from 'components/grid/components/common/NullValue' -import { COLUMN_MIN_WIDTH } from 'components/grid/constants' -import type { SupaRow } from 'components/grid/types' +import { convertByteaToHex } from '../RowEditor.utils' +import { NullValue } from '@/components/grid/components/common/NullValue' +import { COLUMN_MIN_WIDTH } from '@/components/grid/constants' +import type { SupaRow } from '@/components/grid/types' import { ESTIMATED_CHARACTER_PIXEL_WIDTH, getColumnDefaultWidth, -} from 'components/grid/utils/gridColumns' -import { useTableEditorTableStateSnapshot } from 'state/table-editor-table' -import { Tooltip, TooltipContent, TooltipTrigger } from 'ui' -import { convertByteaToHex } from '../RowEditor.utils' +} from '@/components/grid/utils/gridColumns' +import { useTableEditorTableStateSnapshot } from '@/state/table-editor-table' export interface SelectorGridProps { rows: SupaRow[] diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/JsonEditor/DrilldownViewer/DrilldownBreadCrumbs.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/JsonEditor/DrilldownViewer/DrilldownBreadCrumbs.tsx index a4408c3ecc..078fdf693c 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/JsonEditor/DrilldownViewer/DrilldownBreadCrumbs.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/JsonEditor/DrilldownViewer/DrilldownBreadCrumbs.tsx @@ -1,5 +1,5 @@ import { last } from 'lodash' -import { Home, ChevronRight } from 'lucide-react' +import { ChevronRight, Home } from 'lucide-react' interface DrilldownBreadCrumbsProps { breadcrumbs: string[] diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/JsonEditor/DrilldownViewer/DrilldownPane.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/JsonEditor/DrilldownViewer/DrilldownPane.tsx index 7e28b3f2ee..6c29f0f68e 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/JsonEditor/DrilldownViewer/DrilldownPane.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/JsonEditor/DrilldownViewer/DrilldownPane.tsx @@ -1,7 +1,7 @@ import { isNull, noop } from 'lodash' import { ChevronRight } from 'lucide-react' -import type { Dictionary } from 'types' +import type { Dictionary } from '@/types' interface DrilldownPaneProps { pane: number diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/JsonEditor/DrilldownViewer/DrilldownViewer.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/JsonEditor/DrilldownViewer/DrilldownViewer.tsx index f5208b606b..336b746cd9 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/JsonEditor/DrilldownViewer/DrilldownViewer.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/JsonEditor/DrilldownViewer/DrilldownViewer.tsx @@ -1,9 +1,9 @@ import { isEmpty, last } from 'lodash' import { useState } from 'react' -import type { Dictionary } from 'types' import DrilldownBreadCrumbs from './DrilldownBreadCrumbs' import DrilldownPane from './DrilldownPane' +import type { Dictionary } from '@/types' interface DrilldownViewerProps { jsonData: Dictionary diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/JsonEditor/index.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/JsonEditor/index.tsx index f422a201a5..e51adb3c62 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/JsonEditor/index.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/JsonEditor/index.tsx @@ -1,21 +1,21 @@ import { MAX_CHARACTERS } from '@supabase/pg-meta/src/query/table-row-query' +import { useParams } from 'common' import { AlignLeft } from 'lucide-react' import { useCallback, useEffect, useState } from 'react' import { toast } from 'sonner' +import { Button, cn, SidePanel } from 'ui' -import { useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import TwoOptionToggle from 'components/ui/TwoOptionToggle' -import { useTableEditorQuery } from 'data/table-editor/table-editor-query' -import { isTableLike } from 'data/table-editor/table-editor-types' -import { useGetCellValueMutation } from 'data/table-rows/get-cell-value-mutation' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { minifyJSON, prettifyJSON, removeJSONTrailingComma, tryParseJson } from 'lib/helpers' -import { Button, SidePanel, cn } from 'ui' import { ActionBar } from '../../ActionBar' import { isValueTruncated } from '../RowEditor.utils' import { DrilldownViewer } from './DrilldownViewer/DrilldownViewer' import { JsonCodeEditor } from './JsonCodeEditor' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import TwoOptionToggle from '@/components/ui/TwoOptionToggle' +import { useTableEditorQuery } from '@/data/table-editor/table-editor-query' +import { isTableLike } from '@/data/table-editor/table-editor-types' +import { useGetCellValueMutation } from '@/data/table-rows/get-cell-value-mutation' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { minifyJSON, prettifyJSON, removeJSONTrailingComma, tryParseJson } from '@/lib/helpers' interface JsonEditProps { row?: { [key: string]: any } diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.tsx index 48d22be46a..c641711344 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.tsx @@ -1,9 +1,6 @@ import type { PostgresTable } from '@supabase/postgres-meta' -import { useForeignKeyConstraintsQuery } from 'data/database/foreign-key-constraints-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { isEmpty, noop, partition } from 'lodash' import { useEffect, useMemo, useState } from 'react' -import type { Dictionary } from 'types' import { SidePanel, Toggle } from 'ui' import { ActionBar } from '../ActionBar' @@ -22,6 +19,9 @@ import { } from './RowEditor.utils' import { TextEditor } from './TextEditor' import { useIsQueueOperationsEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import { useForeignKeyConstraintsQuery } from '@/data/database/foreign-key-constraints-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import type { Dictionary } from '@/types' export interface RowEditorProps { row?: Dictionary diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils.test.ts b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils.test.ts index c82a4f1670..d6e7bdd4a9 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils.test.ts +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils.test.ts @@ -1,12 +1,13 @@ -import { RowField } from 'components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.types' +import { describe, expect, it, vi } from 'vitest' + +import { RowField } from '@/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.types' import { convertByteaToHex, generateRowObjectFromFields, isValueTruncated, parseValue, validateFields, -} from 'components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils' -import { describe, expect, it, vi } from 'vitest' +} from '@/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils' describe('parseValue', () => { it('should return null when originalValue is null', () => { diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils.ts b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils.ts index 86ab7bc767..8499810af5 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils.ts +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils.ts @@ -1,9 +1,7 @@ import { MAX_ARRAY_SIZE, MAX_CHARACTERS } from '@supabase/pg-meta/src/query/table-row-query' import type { PostgresColumn, PostgresRelationship, PostgresTable } from '@supabase/postgres-meta' import dayjs from 'dayjs' -import { minifyJSON, tryParseJson } from 'lib/helpers' import { compact, isEqual, isNull, isString, isUndefined, omitBy } from 'lodash' -import type { Dictionary } from 'types' import { ForeignKey } from '../ForeignKeySelector/ForeignKeySelector.types' import { @@ -14,6 +12,8 @@ import { TIMESTAMP_TYPES, } from '../SidePanelEditor.constants' import type { RowField } from './RowEditor.types' +import { minifyJSON, tryParseJson } from '@/lib/helpers' +import type { Dictionary } from '@/types' const getRowValue = ({ column, row }: { column: PostgresColumn; row?: Dictionary }) => { const isNewRow = row === undefined diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/TextEditor.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/TextEditor.tsx index 7191536347..fa48f46292 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/TextEditor.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/TextEditor.tsx @@ -1,20 +1,20 @@ import { Editor } from '@monaco-editor/react' import { MAX_CHARACTERS } from '@supabase/pg-meta/src/query/table-row-query' +import { useParams } from 'common' import { Loader } from 'lucide-react' import { useCallback, useEffect, useState } from 'react' import remarkGfm from 'remark-gfm' import { toast } from 'sonner' +import { Button, cn, SidePanel } from 'ui' -import { useParams } from 'common' -import { Markdown } from 'components/interfaces/Markdown' -import TwoOptionToggle from 'components/ui/TwoOptionToggle' -import { useTableEditorQuery } from 'data/table-editor/table-editor-query' -import { isTableLike } from 'data/table-editor/table-editor-types' -import { useGetCellValueMutation } from 'data/table-rows/get-cell-value-mutation' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { Button, SidePanel, cn } from 'ui' import { ActionBar } from '../ActionBar' import { isValueTruncated } from './RowEditor.utils' +import { Markdown } from '@/components/interfaces/Markdown' +import TwoOptionToggle from '@/components/ui/TwoOptionToggle' +import { useTableEditorQuery } from '@/data/table-editor/table-editor-query' +import { isTableLike } from '@/data/table-editor/table-editor-types' +import { useGetCellValueMutation } from '@/data/table-rows/get-cell-value-mutation' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface TextEditorProps { visible: boolean diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SchemaEditor.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SchemaEditor.tsx index 0b5a06fedc..61a8e2f380 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SchemaEditor.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SchemaEditor.tsx @@ -2,8 +2,8 @@ import { useEffect, useState } from 'react' import { toast } from 'sonner' import { Input, SidePanel } from 'ui' -import { useSchemaCreateMutation } from 'data/database/schema-create-mutation' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' +import { useSchemaCreateMutation } from '@/data/database/schema-create-mutation' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface SchemaEditorProps { visible: boolean diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.constants.ts b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.constants.ts index a2f459ef94..8d7c4f7bee 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.constants.ts +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.constants.ts @@ -1,4 +1,5 @@ import { concat, sortBy } from 'lodash' + import type { PostgresDataTypeOption } from './SidePanelEditor.types' export const NUMERICAL_TYPES = [ diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.tsx index 2f2fb14b2e..095693767b 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.tsx @@ -2,39 +2,9 @@ import * as Sentry from '@sentry/nextjs' import type { PostgresColumn, PostgresTable } from '@supabase/postgres-meta' import { useQueryClient } from '@tanstack/react-query' import { useParams } from 'common' -import { useTableRowOperations } from 'components/grid/hooks/useTableRowOperations' -import { useIsQueueOperationsEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' -import { type GeneratedPolicy } from 'components/interfaces/Auth/Policies/Policies.utils' -import { DiscardChangesConfirmationDialog } from 'components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' -import { databasePoliciesKeys } from 'data/database-policies/keys' -import { useDatabasePublicationCreateMutation } from 'data/database-publications/database-publications-create-mutation' -import { useDatabasePublicationsQuery } from 'data/database-publications/database-publications-query' -import { useDatabasePublicationUpdateMutation } from 'data/database-publications/database-publications-update-mutation' -import type { Constraint } from 'data/database/constraints-query' -import type { ForeignKeyConstraint } from 'data/database/foreign-key-constraints-query' -import { databaseKeys } from 'data/database/keys' -import { ENTITY_TYPE } from 'data/entity-types/entity-type-constants' -import { entityTypeKeys } from 'data/entity-types/keys' -import { lintKeys } from 'data/lint/keys' -import { privilegeKeys } from 'data/privileges/keys' -import { tableEditorKeys } from 'data/table-editor/keys' -import { isTableLike, type Entity } from 'data/table-editor/table-editor-types' -import { tableRowKeys } from 'data/table-rows/keys' -import { tableKeys } from 'data/tables/keys' -import { RetrieveTableResult } from 'data/tables/table-retrieve-query' -import { getTables } from 'data/tables/tables-query' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useConfirmOnClose } from 'hooks/ui/useConfirmOnClose' -import { useUrlState } from 'hooks/ui/useUrlState' -import { useVisibleKey } from 'hooks/ui/useVisibleKey' -import { useTrack } from 'lib/telemetry/track' import { isEmpty, isUndefined, noop } from 'lodash' import { useState } from 'react' import { toast } from 'sonner' -import { useTableEditorStateSnapshot, type TableEditorState } from 'state/table-editor' -import { createTabId, useTabsStateSnapshot } from 'state/tabs' -import type { Dictionary } from 'types' import { SonnerProgress } from 'ui' import { ColumnEditor } from './ColumnEditor/ColumnEditor' @@ -64,11 +34,41 @@ import { } from './TableEditor/ApiAccessToggle' import { TableEditor } from './TableEditor/TableEditor' import type { ImportContent } from './TableEditor/TableEditor.types' +import { useTableRowOperations } from '@/components/grid/hooks/useTableRowOperations' +import { useIsQueueOperationsEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import { type GeneratedPolicy } from '@/components/interfaces/Auth/Policies/Policies.utils' +import { DiscardChangesConfirmationDialog } from '@/components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' +import { databasePoliciesKeys } from '@/data/database-policies/keys' +import { useDatabasePublicationCreateMutation } from '@/data/database-publications/database-publications-create-mutation' +import { useDatabasePublicationsQuery } from '@/data/database-publications/database-publications-query' +import { useDatabasePublicationUpdateMutation } from '@/data/database-publications/database-publications-update-mutation' +import type { Constraint } from '@/data/database/constraints-query' +import type { ForeignKeyConstraint } from '@/data/database/foreign-key-constraints-query' +import { databaseKeys } from '@/data/database/keys' +import { ENTITY_TYPE } from '@/data/entity-types/entity-type-constants' +import { entityTypeKeys } from '@/data/entity-types/keys' +import { lintKeys } from '@/data/lint/keys' +import { privilegeKeys } from '@/data/privileges/keys' import { useTableApiAccessPrivilegesMutation } from '@/data/privileges/table-api-access-mutation' +import { tableEditorKeys } from '@/data/table-editor/keys' +import { isTableLike, type Entity } from '@/data/table-editor/table-editor-types' +import { tableRowKeys } from '@/data/table-rows/keys' +import { tableKeys } from '@/data/tables/keys' +import { RetrieveTableResult } from '@/data/tables/table-retrieve-query' +import { getTables } from '@/data/tables/tables-query' import { useDataApiGrantTogglesEnabled } from '@/hooks/misc/useDataApiGrantTogglesEnabled' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useConfirmOnClose } from '@/hooks/ui/useConfirmOnClose' +import { useUrlState } from '@/hooks/ui/useUrlState' +import { useVisibleKey } from '@/hooks/ui/useVisibleKey' import { type ApiPrivilegesByRole } from '@/lib/data-api-types' import { isObjectContainingKeys } from '@/lib/helpers' +import { useTrack } from '@/lib/telemetry/track' import type { DeepReadonly, Prettify } from '@/lib/type-helpers' +import { useTableEditorStateSnapshot, type TableEditorState } from '@/state/table-editor' +import { createTabId, useTabsStateSnapshot } from '@/state/tabs' +import type { Dictionary } from '@/types' export type SaveTableParams = | SaveTableParamsNew diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.types.ts b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.types.ts index a497e2c3c7..4a103f29c5 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.types.ts +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.types.ts @@ -1,6 +1,7 @@ import type { PostgresRelationship } from '@supabase/postgres-meta' -import { CreateColumnBody } from 'data/database-columns/database-column-create-mutation' -import { UpdateColumnBody } from 'data/database-columns/database-column-update-mutation' + +import { CreateColumnBody } from '@/data/database-columns/database-column-create-mutation' +import { UpdateColumnBody } from '@/data/database-columns/database-column-update-mutation' export interface CreateColumnPayload extends CreateColumnBody {} diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.utils.test.ts b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.utils.test.ts index 372797a0bf..a47f133a00 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.utils.test.ts +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.utils.test.ts @@ -1,7 +1,8 @@ import { describe, expect, test } from 'vitest' + import { formatRowsForInsert, getRowFromSidePanel } from './SidePanelEditor.utils' -import type { SidePanel } from 'state/table-editor' -import type { SupaRow } from 'components/grid/types' +import type { SupaRow } from '@/components/grid/types' +import type { SidePanel } from '@/state/table-editor' describe('SidePanelEditor.utils.test.ts', () => { test('formatRowsForInsert should for format rows with basic data types correctly', () => { diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.utils.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.utils.tsx index 9edb7cfa22..34e3018780 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.utils.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SidePanelEditor.utils.tsx @@ -13,43 +13,9 @@ import pgMeta, { } from '@supabase/pg-meta' import { Query } from '@supabase/pg-meta/src/query' import type { PostgresPrimaryKey } from '@supabase/postgres-meta' -import type { SupaRow } from 'components/grid/types' -import { GeneratedPolicy } from 'components/interfaces/Auth/Policies/Policies.utils' -import SparkBar from 'components/ui/SparkBar' -import { createDatabaseColumn } from 'data/database-columns/database-column-create-mutation' -import { deleteDatabaseColumn } from 'data/database-columns/database-column-delete-mutation' -import { updateDatabaseColumn } from 'data/database-columns/database-column-update-mutation' -import { createDatabasePolicy } from 'data/database-policies/database-policy-create-mutation' -import type { Constraint } from 'data/database/constraints-query' -import { ForeignKeyConstraint } from 'data/database/foreign-key-constraints-query' -import { databaseKeys } from 'data/database/keys' -import { entityTypeKeys } from 'data/entity-types/keys' -import { lintKeys } from 'data/lint/keys' -import { prefetchEditorTablePage } from 'data/prefetchers/project.$ref.editor.$id' -import { getQueryClient } from 'data/query-client' -import { executeSql } from 'data/sql/execute-sql-query' -import { tableEditorKeys } from 'data/table-editor/keys' -import { prefetchTableEditor } from 'data/table-editor/table-editor-query' -import { tableRowKeys } from 'data/table-rows/keys' -import { executeWithRetry } from 'data/table-rows/table-rows-query' -import { tableKeys } from 'data/tables/keys' -import { - getTable, - getTableQuery, - RetrievedTableColumn, - RetrieveTableResult, -} from 'data/tables/table-retrieve-query' -import { - UpdateTableBody, - updateTable as updateTableMutation, -} from 'data/tables/table-update-mutation' -import { getTables } from 'data/tables/tables-query' -import { sendEvent } from 'data/telemetry/send-event-mutation' -import { isObject, isObjectContainingKeys, timeout, tryParseJson } from 'lib/helpers' import { chunk, find, isEmpty, isEqual } from 'lodash' import Papa from 'papaparse' import { toast } from 'sonner' -import type { SidePanel } from 'state/table-editor' import { generateCreateColumnPayload, @@ -58,7 +24,41 @@ import { import type { ColumnField, CreateColumnPayload, UpdateColumnPayload } from './SidePanelEditor.types' import { checkIfRelationChanged } from './TableEditor/ForeignKeysManagement/ForeignKeysManagement.utils' import type { ImportContent } from './TableEditor/TableEditor.types' +import type { SupaRow } from '@/components/grid/types' +import { GeneratedPolicy } from '@/components/interfaces/Auth/Policies/Policies.utils' +import SparkBar from '@/components/ui/SparkBar' +import { createDatabaseColumn } from '@/data/database-columns/database-column-create-mutation' +import { deleteDatabaseColumn } from '@/data/database-columns/database-column-delete-mutation' +import { updateDatabaseColumn } from '@/data/database-columns/database-column-update-mutation' +import { createDatabasePolicy } from '@/data/database-policies/database-policy-create-mutation' +import type { Constraint } from '@/data/database/constraints-query' +import { ForeignKeyConstraint } from '@/data/database/foreign-key-constraints-query' +import { databaseKeys } from '@/data/database/keys' +import { entityTypeKeys } from '@/data/entity-types/keys' +import { lintKeys } from '@/data/lint/keys' +import { prefetchEditorTablePage } from '@/data/prefetchers/project.$ref.editor.$id' +import { getQueryClient } from '@/data/query-client' +import { executeSql } from '@/data/sql/execute-sql-query' +import { tableEditorKeys } from '@/data/table-editor/keys' +import { prefetchTableEditor } from '@/data/table-editor/table-editor-query' +import { tableRowKeys } from '@/data/table-rows/keys' +import { executeWithRetry } from '@/data/table-rows/table-rows-query' +import { tableKeys } from '@/data/tables/keys' +import { + getTable, + getTableQuery, + RetrievedTableColumn, + RetrieveTableResult, +} from '@/data/tables/table-retrieve-query' +import { + UpdateTableBody, + updateTable as updateTableMutation, +} from '@/data/tables/table-update-mutation' +import { getTables } from '@/data/tables/tables-query' +import { sendEvent } from '@/data/telemetry/send-event-mutation' +import { isObject, isObjectContainingKeys, timeout, tryParseJson } from '@/lib/helpers' import type { DeepReadonly } from '@/lib/type-helpers' +import type { SidePanel } from '@/state/table-editor' const BATCH_SIZE = 1000 const CHUNK_SIZE = 1024 * 1024 * 0.1 // 0.1MB diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SpreadsheetImport/SpreadSheetFileUpload.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SpreadsheetImport/SpreadSheetFileUpload.tsx index ff91de5f50..52e25ef997 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SpreadsheetImport/SpreadSheetFileUpload.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SpreadsheetImport/SpreadSheetFileUpload.tsx @@ -1,8 +1,9 @@ -import SparkBar from 'components/ui/SparkBar' import { FileText, Loader } from 'lucide-react' import { DragEvent, useCallback, useRef, useState, type ChangeEvent } from 'react' import { Button, cn } from 'ui' +import SparkBar from '@/components/ui/SparkBar' + interface SpreadSheetFileUploadProps { parseProgress: number uploadedFile: File | undefined diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SpreadsheetImport/SpreadSheetImportConfiguration.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SpreadsheetImport/SpreadSheetImportConfiguration.tsx index 37889c082c..8020aebe1c 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SpreadsheetImport/SpreadSheetImportConfiguration.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SpreadsheetImport/SpreadSheetImportConfiguration.tsx @@ -1,7 +1,7 @@ import { ChevronDown } from 'lucide-react' import { useState } from 'react' - import { Button, Checkbox_Shadcn_, cn, Collapsible, Label_Shadcn_, SidePanel } from 'ui' + import type { SpreadsheetData } from './SpreadsheetImport.types' interface SpreadSheetImportConfigurationProps { diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SpreadsheetImport/SpreadsheetImport.types.ts b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SpreadsheetImport/SpreadsheetImport.types.ts index 54bd0a4702..e432846e14 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SpreadsheetImport/SpreadsheetImport.types.ts +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SpreadsheetImport/SpreadsheetImport.types.ts @@ -1,6 +1,5 @@ -import type { Dictionary } from 'types' - import type { InferredColumnType } from './SpreadsheetImport.utils' +import type { Dictionary } from '@/types' export interface SpreadsheetData { headers: string[] diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SpreadsheetImport/SpreadsheetImport.utils.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SpreadsheetImport/SpreadsheetImport.utils.tsx index ad97b14082..2833e50798 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SpreadsheetImport/SpreadsheetImport.utils.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SpreadsheetImport/SpreadsheetImport.utils.tsx @@ -1,6 +1,4 @@ import dayjs from 'dayjs' -import { DOCS_URL } from 'lib/constants' -import { isObject, tryParseJson } from 'lib/helpers' import { has } from 'lodash' import { ExternalLink } from 'lucide-react' import Link from 'next/link' @@ -14,6 +12,8 @@ import { UPLOAD_FILE_TYPES, } from './SpreadsheetImport.constants' import type { SpreadsheetData } from './SpreadsheetImport.types' +import { DOCS_URL } from '@/lib/constants' +import { isObject, tryParseJson } from '@/lib/helpers' const CHUNK_SIZE = 1024 * 1024 * 0.25 // 0.25MB diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SpreadsheetImport/SpreadsheetImportPreview.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SpreadsheetImport/SpreadsheetImportPreview.tsx index 182cfffa42..43f060af32 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SpreadsheetImport/SpreadsheetImportPreview.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/SpreadsheetImport/SpreadsheetImportPreview.tsx @@ -1,6 +1,5 @@ import { AlertCircle, ArrowRight, ChevronDown, ChevronRight } from 'lucide-react' import { useEffect, useState } from 'react' - import { Alert_Shadcn_, AlertDescription_Shadcn_, @@ -12,6 +11,7 @@ import { SidePanel, WarningIcon, } from 'ui' + import type { SpreadsheetData } from './SpreadsheetImport.types' import SpreadsheetPreviewGrid from './SpreadsheetPreviewGrid' diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ApiAccessToggle.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ApiAccessToggle.tsx index 183773915e..1215325054 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ApiAccessToggle.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ApiAccessToggle.tsx @@ -1,9 +1,4 @@ import { useQuery } from '@tanstack/react-query' -import { useLoadBalancersQuery } from 'data/read-replicas/load-balancers-query' -import { useReadReplicasQuery } from 'data/read-replicas/replicas-query' -import { useIsSchemaExposed } from 'hooks/misc/useIsSchemaExposed' -import { useQuerySchemaState } from 'hooks/misc/useSchemaQueryState' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { ExternalLink } from 'lucide-react' import Link from 'next/link' import { @@ -21,9 +16,13 @@ import { Admonition } from 'ui-patterns' import { Input } from 'ui-patterns/DataInputs/Input' import { useProjectApiUrl } from '@/data/config/project-endpoint-query' -import { useTrack } from 'lib/telemetry/track' import { defaultPrivilegesQueryOptions } from '@/data/privileges/default-privileges-query' import { useTableApiAccessQuery } from '@/data/privileges/table-api-access-query' +import { useLoadBalancersQuery } from '@/data/read-replicas/load-balancers-query' +import { useReadReplicasQuery } from '@/data/read-replicas/replicas-query' +import { useIsSchemaExposed } from '@/hooks/misc/useIsSchemaExposed' +import { useQuerySchemaState } from '@/hooks/misc/useSchemaQueryState' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' import { useStaticEffectEvent } from '@/hooks/useStaticEffectEvent' import { checkDataApiPrivilegesNonEmpty, @@ -31,6 +30,7 @@ import { EMPTY_DATA_API_PRIVILEGES, type ApiPrivilegesByRole, } from '@/lib/data-api-types' +import { useTrack } from '@/lib/telemetry/track' import type { DeepReadonly, Prettify } from '@/lib/type-helpers' import { useDatabaseSelectorStateSnapshot } from '@/state/database-selector' diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/Column.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/Column.tsx index 2e250c71c8..64d6b62658 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/Column.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/Column.tsx @@ -1,7 +1,3 @@ -import { useForeignKeyConstraintsQuery } from 'data/database/foreign-key-constraints-query' -import type { EnumeratedType } from 'data/enumerated-types/enumerated-types-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { EMPTY_ARR, EMPTY_OBJ } from 'lib/void' import { Link, Menu, Plus, Settings, X } from 'lucide-react' import { useState } from 'react' import { DraggableProvidedDragHandleProps } from 'react-beautiful-dnd' @@ -30,6 +26,10 @@ import InputWithSuggestions from '../ColumnEditor/InputWithSuggestions' import { ForeignKey } from '../ForeignKeySelector/ForeignKeySelector.types' import type { ColumnField } from '../SidePanelEditor.types' import { checkIfRelationChanged } from './ForeignKeysManagement/ForeignKeysManagement.utils' +import { useForeignKeyConstraintsQuery } from '@/data/database/foreign-key-constraints-query' +import type { EnumeratedType } from '@/data/enumerated-types/enumerated-types-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { EMPTY_ARR, EMPTY_OBJ } from '@/lib/void' /** * [Joshen] For context: diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ColumnManagement.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ColumnManagement.tsx index 33f12bbdac..77c3b27756 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ColumnManagement.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ColumnManagement.tsx @@ -1,9 +1,4 @@ import { useParams } from 'common' -import InformationBox from 'components/ui/InformationBox' -import type { EnumeratedType } from 'data/enumerated-types/enumerated-types-query' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { DOCS_URL } from 'lib/constants' import { isEmpty, noop, partition } from 'lodash' import { Edit, ExternalLink, HelpCircle, Key, Trash } from 'lucide-react' import { useState } from 'react' @@ -33,6 +28,11 @@ import { TEXT_TYPES } from '../SidePanelEditor.constants' import type { ColumnField, ExtendedPostgresRelationship } from '../SidePanelEditor.types' import { Column } from './Column' import type { ImportContent, TableField } from './TableEditor.types' +import InformationBox from '@/components/ui/InformationBox' +import type { EnumeratedType } from '@/data/enumerated-types/enumerated-types-query' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { DOCS_URL } from '@/lib/constants' interface ColumnManagementProps { table: TableField diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ForeignKeysManagement/ForeignKeyRow.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ForeignKeysManagement/ForeignKeyRow.tsx index 84d9b6d29b..30dce927eb 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ForeignKeysManagement/ForeignKeyRow.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ForeignKeysManagement/ForeignKeyRow.tsx @@ -1,11 +1,11 @@ +import { useParams } from 'common' import { ArrowRight } from 'lucide-react' import Link from 'next/link' import SVG from 'react-inlinesvg' - -import { useParams } from 'common' -import { BASE_PATH } from 'lib/constants' import { Badge, Button, cn } from 'ui' + import type { ForeignKey } from '../../ForeignKeySelector/ForeignKeySelector.types' +import { BASE_PATH } from '@/lib/constants' interface ForeignKeyProps { foreignKey: ForeignKey diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ForeignKeysManagement/ForeignKeysManagement.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ForeignKeysManagement/ForeignKeysManagement.tsx index 4b739c5933..3ed742cf2d 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ForeignKeysManagement/ForeignKeysManagement.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ForeignKeysManagement/ForeignKeysManagement.tsx @@ -1,17 +1,17 @@ import { useState } from 'react' import { Button } from 'ui' - -import AlertError from 'components/ui/AlertError' -import { useForeignKeyConstraintsQuery } from 'data/database/foreign-key-constraints-query' -import { useQuerySchemaState } from 'hooks/misc/useSchemaQueryState' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import type { ResponseError } from 'types' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' + import { ForeignKeySelector } from '../../ForeignKeySelector/ForeignKeySelector' import type { ForeignKey } from '../../ForeignKeySelector/ForeignKeySelector.types' import type { TableField } from '../TableEditor.types' import { ForeignKeyRow } from './ForeignKeyRow' import { checkIfRelationChanged } from './ForeignKeysManagement.utils' +import AlertError from '@/components/ui/AlertError' +import { useForeignKeyConstraintsQuery } from '@/data/database/foreign-key-constraints-query' +import { useQuerySchemaState } from '@/hooks/misc/useSchemaQueryState' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import type { ResponseError } from '@/types' interface ForeignKeysManagementProps { table: TableField diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ForeignKeysManagement/ForeignKeysManagement.utils.ts b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ForeignKeysManagement/ForeignKeysManagement.utils.ts index 13f38a6092..f4103facbc 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ForeignKeysManagement/ForeignKeysManagement.utils.ts +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ForeignKeysManagement/ForeignKeysManagement.utils.ts @@ -1,7 +1,8 @@ -import type { ForeignKeyConstraint } from 'data/database/foreign-key-constraints-query' -import type { ForeignKey } from '../../ForeignKeySelector/ForeignKeySelector.types' import { isEqual } from 'lodash' +import type { ForeignKey } from '../../ForeignKeySelector/ForeignKeySelector.types' +import type { ForeignKeyConstraint } from '@/data/database/foreign-key-constraints-query' + export const checkIfRelationChanged = (existing: ForeignKeyConstraint, state: ForeignKey) => { const stateSourceColumns = state.columns.map((x) => x.source) const stateTargetColumns = state.columns.map((x) => x.target) diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/RLSDisableModal.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/RLSDisableModal.tsx index 9382ef15e9..b8f9d1bdff 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/RLSDisableModal.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/RLSDisableModal.tsx @@ -1,10 +1,10 @@ import { AlertOctagon, Lock, ShieldOff } from 'lucide-react' - -import { DocsButton } from 'components/ui/DocsButton' -import { useCustomContent } from 'hooks/custom-content/useCustomContent' -import { DOCS_URL } from 'lib/constants' import { Alert } from 'ui' +import { DocsButton } from '@/components/ui/DocsButton' +import { useCustomContent } from '@/hooks/custom-content/useCustomContent' +import { DOCS_URL } from '@/lib/constants' + export function RLSDisableModalContent() { const { docsRowLevelSecurityGuidePath } = useCustomContent(['docs:row_level_security_guide_path']) diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableEditor.constants.ts b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableEditor.constants.ts index 3a8fbc9430..03f2116479 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableEditor.constants.ts +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableEditor.constants.ts @@ -1,5 +1,5 @@ -import { uuidv4 } from 'lib/helpers' import type { ColumnField } from '../SidePanelEditor.types' +import { uuidv4 } from '@/lib/helpers' export const DEFAULT_COLUMNS: ColumnField[] = [ { diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableEditor.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableEditor.tsx index 0013b143e1..5b86f6a818 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableEditor.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableEditor.tsx @@ -1,24 +1,7 @@ import type { PostgresTable } from '@supabase/postgres-meta' -import { DocsButton } from 'components/ui/DocsButton' -import { useDatabasePublicationsQuery } from 'data/database-publications/database-publications-query' -import { CONSTRAINT_TYPE, useTableConstraintsQuery } from 'data/database/constraints-query' -import { useForeignKeyConstraintsQuery } from 'data/database/foreign-key-constraints-query' -import { useEnumeratedTypesQuery } from 'data/enumerated-types/enumerated-types-query' -import { useCustomContent } from 'hooks/custom-content/useCustomContent' -import { useChanged } from 'hooks/misc/useChanged' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useQuerySchemaState } from 'hooks/misc/useSchemaQueryState' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useUrlState } from 'hooks/ui/useUrlState' -import { useVisibleKey } from 'hooks/ui/useVisibleKey' -import { useProtectedSchemas } from 'hooks/useProtectedSchemas' -import { DOCS_URL } from 'lib/constants' -import { useTrack } from 'lib/telemetry/track' -import { type PlainObject } from 'lib/type-helpers' import { isEmpty, noop } from 'lodash' import { useContext, useEffect, useMemo, useState } from 'react' import { toast } from 'sonner' -import { TableEditorStateContext, useTableEditorStateSnapshot } from 'state/table-editor' import { Badge, Checkbox, Input, SidePanel } from 'ui' import { Admonition } from 'ui-patterns' import { ConfirmationModal } from 'ui-patterns/Dialogs/ConfirmationModal' @@ -42,7 +25,24 @@ import { generateTableFieldFromPostgresTable, validateFields, } from './TableEditor.utils' +import { DocsButton } from '@/components/ui/DocsButton' +import { useDatabasePublicationsQuery } from '@/data/database-publications/database-publications-query' +import { CONSTRAINT_TYPE, useTableConstraintsQuery } from '@/data/database/constraints-query' +import { useForeignKeyConstraintsQuery } from '@/data/database/foreign-key-constraints-query' +import { useEnumeratedTypesQuery } from '@/data/enumerated-types/enumerated-types-query' +import { useCustomContent } from '@/hooks/custom-content/useCustomContent' +import { useChanged } from '@/hooks/misc/useChanged' import { useDataApiGrantTogglesEnabled } from '@/hooks/misc/useDataApiGrantTogglesEnabled' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useQuerySchemaState } from '@/hooks/misc/useSchemaQueryState' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useUrlState } from '@/hooks/ui/useUrlState' +import { useVisibleKey } from '@/hooks/ui/useVisibleKey' +import { useProtectedSchemas } from '@/hooks/useProtectedSchemas' +import { DOCS_URL } from '@/lib/constants' +import { useTrack } from '@/lib/telemetry/track' +import { type PlainObject } from '@/lib/type-helpers' +import { TableEditorStateContext, useTableEditorStateSnapshot } from '@/state/table-editor' type SaveTableParamsFor = Extract< SaveTableParams, diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableEditor.types.ts b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableEditor.types.ts index 10868afdd6..1c578a3546 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableEditor.types.ts +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableEditor.types.ts @@ -1,8 +1,7 @@ -import type { Dictionary } from 'types' - import type { ColumnField } from '../SidePanelEditor.types' import type { InferredColumnType } from '../SpreadsheetImport/SpreadsheetImport.utils' import type { Prettify } from '@/lib/type-helpers' +import type { Dictionary } from '@/types' export type TableField = Prettify<{ id: number diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableEditor.utils.ts b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableEditor.utils.ts index 72a4674314..6cf50fb627 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableEditor.utils.ts +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableEditor.utils.ts @@ -1,7 +1,6 @@ import type { PostgresTable } from '@supabase/postgres-meta' import { some } from 'lodash' -import type { ForeignKeyConstraint } from 'data/database/foreign-key-constraints-query' import { generateColumnField, generateColumnFieldFromPostgresColumn, @@ -9,6 +8,7 @@ import { import type { ColumnField } from '../SidePanelEditor.types' import { DEFAULT_COLUMNS } from './TableEditor.constants' import type { ImportContent, TableField } from './TableEditor.types' +import type { ForeignKeyConstraint } from '@/data/database/foreign-key-constraints-query' type ValidateFieldsReturn = { name?: string diff --git a/apps/studio/components/interfaces/TableGridEditor/TableDefinition.tsx b/apps/studio/components/interfaces/TableGridEditor/TableDefinition.tsx index 74f01addd8..dbf98df811 100644 --- a/apps/studio/components/interfaces/TableGridEditor/TableDefinition.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/TableDefinition.tsx @@ -1,24 +1,24 @@ import Editor from '@monaco-editor/react' +import { useParams } from 'common' import { useTheme } from 'next-themes' import Link from 'next/link' import { useMemo, useRef } from 'react' +import { Button } from 'ui' +import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' -import { useParams } from 'common' -import { Footer } from 'components/grid/components/footer/Footer' -import { useTableDefinitionQuery } from 'data/database/table-definition-query' -import { useViewDefinitionQuery } from 'data/database/view-definition-query' +import { Footer } from '@/components/grid/components/footer/Footer' +import { useTableDefinitionQuery } from '@/data/database/table-definition-query' +import { useViewDefinitionQuery } from '@/data/database/view-definition-query' import { Entity, isMaterializedView, isTableLike, isView, isViewLike, -} from 'data/table-editor/table-editor-types' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { formatSql } from 'lib/formatSql' -import { timeout } from 'lib/helpers' -import { Button } from 'ui' -import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' +} from '@/data/table-editor/table-editor-types' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { formatSql } from '@/lib/formatSql' +import { timeout } from '@/lib/helpers' export interface TableDefinitionProps { entity?: Entity diff --git a/apps/studio/components/interfaces/TableGridEditor/TableEntity.utils.test.ts b/apps/studio/components/interfaces/TableGridEditor/TableEntity.utils.test.ts index 756eea86af..fdad0f6dc8 100644 --- a/apps/studio/components/interfaces/TableGridEditor/TableEntity.utils.test.ts +++ b/apps/studio/components/interfaces/TableGridEditor/TableEntity.utils.test.ts @@ -1,7 +1,8 @@ -import type { SupaTable } from 'components/grid/types' -import { ENTITY_TYPE } from 'data/entity-types/entity-type-constants' import { describe, expect, it } from 'vitest' + import { formatTableRowsToSQL } from './TableEntity.utils' +import type { SupaTable } from '@/components/grid/types' +import { ENTITY_TYPE } from '@/data/entity-types/entity-type-constants' describe('TableEntity.utils: formatTableRowsToSQL', () => { it('should format rows into a single SQL INSERT statement', () => { diff --git a/apps/studio/components/interfaces/TableGridEditor/TableEntity.utils.ts b/apps/studio/components/interfaces/TableGridEditor/TableEntity.utils.ts index 565174ed7c..ba6791614c 100644 --- a/apps/studio/components/interfaces/TableGridEditor/TableEntity.utils.ts +++ b/apps/studio/components/interfaces/TableGridEditor/TableEntity.utils.ts @@ -1,5 +1,4 @@ -import { SupaTable } from 'components/grid/types' - +import { SupaTable } from '@/components/grid/types' import { Lint } from '@/data/lint/lint-query' export const getEntityLintDetails = ( diff --git a/apps/studio/components/interfaces/TableGridEditor/TableGridEditor.tsx b/apps/studio/components/interfaces/TableGridEditor/TableGridEditor.tsx index 8e00a44a60..6f78afc56c 100644 --- a/apps/studio/components/interfaces/TableGridEditor/TableGridEditor.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/TableGridEditor.tsx @@ -1,11 +1,16 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import Link from 'next/link' import { useRouter } from 'next/router' import { useCallback } from 'react' +import { Button } from 'ui' +import { Admonition, GenericSkeletonLoader } from 'ui-patterns' -import { useParams } from 'common' -import { SupabaseGrid } from 'components/grid/SupabaseGrid' -import { useSyncTableEditorStateFromLocalStorageWithUrl } from 'components/grid/SupabaseGrid.utils' +import DeleteConfirmationDialogs from './DeleteConfirmationDialogs' +import { SidePanelEditor } from './SidePanelEditor/SidePanelEditor' +import { TableDefinition } from './TableDefinition' +import { SupabaseGrid } from '@/components/grid/SupabaseGrid' +import { useSyncTableEditorStateFromLocalStorageWithUrl } from '@/components/grid/SupabaseGrid.utils' import { Entity, isForeignTable, @@ -13,19 +18,14 @@ import { isTableLike, isView, TableLike, -} from 'data/table-editor/table-editor-types' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useDashboardHistory } from 'hooks/misc/useDashboardHistory' -import { useQuerySchemaState } from 'hooks/misc/useSchemaQueryState' -import { useUrlState } from 'hooks/ui/useUrlState' -import { useIsProtectedSchema } from 'hooks/useProtectedSchemas' -import { TableEditorTableStateContextProvider } from 'state/table-editor-table' -import { createTabId, useTabsStateSnapshot } from 'state/tabs' -import { Button } from 'ui' -import { Admonition, GenericSkeletonLoader } from 'ui-patterns' -import DeleteConfirmationDialogs from './DeleteConfirmationDialogs' -import { SidePanelEditor } from './SidePanelEditor/SidePanelEditor' -import { TableDefinition } from './TableDefinition' +} from '@/data/table-editor/table-editor-types' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useDashboardHistory } from '@/hooks/misc/useDashboardHistory' +import { useQuerySchemaState } from '@/hooks/misc/useSchemaQueryState' +import { useUrlState } from '@/hooks/ui/useUrlState' +import { useIsProtectedSchema } from '@/hooks/useProtectedSchemas' +import { TableEditorTableStateContextProvider } from '@/state/table-editor-table' +import { createTabId, useTabsStateSnapshot } from '@/state/tabs' export interface TableGridEditorProps { isLoadingSelectedTable?: boolean diff --git a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/ServiceFlowHeader.tsx b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/ServiceFlowHeader.tsx index 4327f1f015..a5f3d80e4d 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/ServiceFlowHeader.tsx +++ b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/ServiceFlowHeader.tsx @@ -1,14 +1,15 @@ -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DataTableColumnStatusCode } from 'components/ui/DataTable/DataTableColumn/DataTableColumnStatusCode' -import { Kbd } from 'components/ui/DataTable/primitives/Kbd' -import { useDataTable } from 'components/ui/DataTable/providers/DataTableProvider' import { ChevronDown, ChevronUp, X } from 'lucide-react' import { useCallback, useEffect, useMemo } from 'react' import { Badge, Button, Separator } from 'ui' + import { LogTypeIcon } from '../../components/LogTypeIcon' import { ColumnSchema } from '../../UnifiedLogs.schema' import { getStatusLevel } from '../../UnifiedLogs.utils' import { TruncatedTextWithPopover } from './shared/TruncatedTextWithPopover' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DataTableColumnStatusCode } from '@/components/ui/DataTable/DataTableColumn/DataTableColumnStatusCode' +import { Kbd } from '@/components/ui/DataTable/primitives/Kbd' +import { useDataTable } from '@/components/ui/DataTable/providers/DataTableProvider' interface ServiceFlowHeaderProps { selectedRow: ColumnSchema diff --git a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/blocks/RequestStartedBlock.tsx b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/blocks/RequestStartedBlock.tsx index 950e96e519..4982d9c362 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/blocks/RequestStartedBlock.tsx +++ b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/blocks/RequestStartedBlock.tsx @@ -1,5 +1,6 @@ import { Clock } from 'lucide-react' import { memo } from 'react' + import { ColumnSchema } from '../../../UnifiedLogs.schema' import { StyledIcon } from '../shared/TimelineStep' diff --git a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/blocks/ResponseCompletedBlock.tsx b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/blocks/ResponseCompletedBlock.tsx index 71898c18f1..90163c771c 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/blocks/ResponseCompletedBlock.tsx +++ b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/blocks/ResponseCompletedBlock.tsx @@ -1,8 +1,9 @@ -import { memo } from 'react' import { Clock } from 'lucide-react' -import { StyledIcon } from '../shared/TimelineStep' -import { EventMessage } from '../shared/EventMessage' +import { memo } from 'react' + import { ColumnSchema } from '../../../UnifiedLogs.schema' +import { EventMessage } from '../shared/EventMessage' +import { StyledIcon } from '../shared/TimelineStep' interface ResponseCompletedBlockProps { data: ColumnSchema diff --git a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/shared/BlockField.tsx b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/shared/BlockField.tsx index f824420dd9..96d13f73a4 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/shared/BlockField.tsx +++ b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/shared/BlockField.tsx @@ -1,9 +1,10 @@ -import { DataTableColumnStatusCode } from 'components/ui/DataTable/DataTableColumn/DataTableColumnStatusCode' -import { DataTableSheetRowAction } from 'components/ui/DataTable/DataTableSheetRowAction' import { Skeleton } from 'ui' + import { getStatusLevel } from '../../../UnifiedLogs.utils' import { BlockFieldProps } from '../../types' import { TruncatedTextWithPopover } from './TruncatedTextWithPopover' +import { DataTableColumnStatusCode } from '@/components/ui/DataTable/DataTableColumn/DataTableColumnStatusCode' +import { DataTableSheetRowAction } from '@/components/ui/DataTable/DataTableSheetRowAction' export const BlockField = ({ config, diff --git a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/shared/CollapsibleSection.tsx b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/shared/CollapsibleSection.tsx index 39e0aaa26b..b4d9b63d5d 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/shared/CollapsibleSection.tsx +++ b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/shared/CollapsibleSection.tsx @@ -1,16 +1,16 @@ import { Table } from '@tanstack/react-table' import { ChevronDown, ChevronRight } from 'lucide-react' import { useState } from 'react' - -import { DataTableFilterField } from 'components/ui/DataTable/DataTable.types' import { Button, Collapsible_Shadcn_ as Collapsible, CollapsibleContent_Shadcn_ as CollapsibleContent, CollapsibleTrigger_Shadcn_ as CollapsibleTrigger, } from 'ui' + import { BlockFieldConfig } from '../../types' import { BlockField } from './BlockField' +import { DataTableFilterField } from '@/components/ui/DataTable/DataTable.types' interface CollapsibleSectionProps { title: string diff --git a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/shared/EventMessage.tsx b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/shared/EventMessage.tsx index 02b77334ab..ab189bf2a7 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/shared/EventMessage.tsx +++ b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/shared/EventMessage.tsx @@ -1,9 +1,9 @@ import { Database, LucideIcon } from 'lucide-react' - -import { LEVELS } from 'components/ui/DataTable/DataTable.constants' import { Badge } from 'ui' + import { LOG_TYPES } from '../../../UnifiedLogs.constants' import { formatServiceTypeForDisplay } from '../../../UnifiedLogs.utils' +import { LEVELS } from '@/components/ui/DataTable/DataTable.constants' type LogType = (typeof LOG_TYPES)[number] type Level = (typeof LEVELS)[number] diff --git a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/shared/FieldWithSeeMore.tsx b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/shared/FieldWithSeeMore.tsx index 9f0b5dd5ba..2d11ed1a8c 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/shared/FieldWithSeeMore.tsx +++ b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/shared/FieldWithSeeMore.tsx @@ -1,8 +1,6 @@ import { Table } from '@tanstack/react-table' import { X } from 'lucide-react' import { useState } from 'react' - -import { DataTableFilterField } from 'components/ui/DataTable/DataTable.types' import { Badge, Collapsible_Shadcn_ as Collapsible, @@ -10,8 +8,10 @@ import { CollapsibleTrigger_Shadcn_ as CollapsibleTrigger, Skeleton, } from 'ui' + import { BlockFieldConfig } from '../../types' import { BlockField } from './BlockField' +import { DataTableFilterField } from '@/components/ui/DataTable/DataTable.types' // Single source of truth for field row styling export const FieldRow = ({ diff --git a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/shared/TimelineStep.tsx b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/shared/TimelineStep.tsx index ea2bc00f79..621f43a397 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/shared/TimelineStep.tsx +++ b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/shared/TimelineStep.tsx @@ -1,8 +1,8 @@ +import { Auth, EdgeFunctions, Storage } from 'icons' import { Clock, Database, Globe, LucideIcon, Server } from 'lucide-react' -import { DataTableColumnStatusCode } from 'components/ui/DataTable/DataTableColumn/DataTableColumnStatusCode' -import { Auth, EdgeFunctions, Storage } from 'icons' import { getStatusLevel } from '../../../UnifiedLogs.utils' +import { DataTableColumnStatusCode } from '@/components/ui/DataTable/DataTableColumn/DataTableColumnStatusCode' // Type for icon components (covers both lucide-react and our icon library) type IconComponent = LucideIcon | React.ComponentType diff --git a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/shared/TruncatedTextWithPopover.tsx b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/shared/TruncatedTextWithPopover.tsx index 24a7b095be..23b01778d5 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/shared/TruncatedTextWithPopover.tsx +++ b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/components/shared/TruncatedTextWithPopover.tsx @@ -1,5 +1,4 @@ import { useState } from 'react' - import { Popover_Shadcn_, PopoverContent_Shadcn_, PopoverTrigger_Shadcn_ } from 'ui' interface TruncatedTextWithPopoverProps { diff --git a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/config/blockConfigs.ts b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/config/blockConfigs.ts index ee40b54b96..444316116a 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/config/blockConfigs.ts +++ b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/config/blockConfigs.ts @@ -1,23 +1,23 @@ import { BlockConfig } from '../components/shared/Block' import { + apiKeyAdditionalFields, + apiKeyPrimaryField, + authorizationFields, authPrimaryFields, + edgeFunctionDetailsFields, + edgeFunctionPrimaryFields, + locationAdditionalFields, + locationPrimaryField, + networkPrimaryFields, + postgresDetailsFields, + postgresPrimaryFields, postgrestPrimaryFields, postgrestResponseFields, - networkPrimaryFields, - apiKeyPrimaryField, - apiKeyAdditionalFields, - userPrimaryField, - userAdditionalFields, - locationPrimaryField, - locationAdditionalFields, - authorizationFields, - techDetailsFields, - edgeFunctionPrimaryFields, - edgeFunctionDetailsFields, - storagePrimaryFields, storageDetailsFields, - postgresPrimaryFields, - postgresDetailsFields, + storagePrimaryFields, + techDetailsFields, + userAdditionalFields, + userPrimaryField, } from './serviceFlowFields' export const authBlockConfig: BlockConfig = { diff --git a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/config/serviceFlowFields.ts b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/config/serviceFlowFields.ts index 0b32cd34ab..51f6c29e38 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/config/serviceFlowFields.ts +++ b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/config/serviceFlowFields.ts @@ -1,6 +1,6 @@ -import { formatBytes } from 'lib/helpers' import { BlockFieldConfig } from '../types' import { getStorageMetadata } from '../utils/storageUtils' +import { formatBytes } from '@/lib/helpers' // Helper functions that avoid duplication with existing storage utilities const getFileName = (path: string): string => { diff --git a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/types.ts b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/types.ts index d1541fa79a..e71f31a8d8 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/types.ts +++ b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlow/types.ts @@ -1,5 +1,6 @@ import { Table } from '@tanstack/react-table' -import { DataTableFilterField } from 'components/ui/DataTable/DataTable.types' + +import { DataTableFilterField } from '@/components/ui/DataTable/DataTable.types' /** * Service Flow Type Definitions diff --git a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlowPanel.tsx b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlowPanel.tsx index f1632f6e0c..b8cb1542f5 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlowPanel.tsx +++ b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlowPanel.tsx @@ -1,10 +1,4 @@ import { useParams } from 'common' -import { useDataTable } from 'components/ui/DataTable/providers/DataTableProvider' -import { - ServiceFlowType, - useUnifiedLogInspectionQuery, -} from 'data/logs/unified-log-inspection-query' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import { useState } from 'react' import { cn, @@ -31,6 +25,12 @@ import { import { ServiceFlowHeader } from './ServiceFlow/components/ServiceFlowHeader' import { ColumnSchema } from './UnifiedLogs.schema' import { QuerySearchParamsType } from './UnifiedLogs.types' +import { useDataTable } from '@/components/ui/DataTable/providers/DataTableProvider' +import { + ServiceFlowType, + useUnifiedLogInspectionQuery, +} from '@/data/logs/unified-log-inspection-query' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' interface ServiceFlowPanelProps { selectedRow: ColumnSchema diff --git a/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.constants.tsx b/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.constants.tsx index 8ad58dc0c7..a100d9ef3d 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.constants.tsx +++ b/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.constants.tsx @@ -14,7 +14,7 @@ import { RANGE_DELIMITER, SLIDER_DELIMITER, SORT_DELIMITER, -} from 'components/ui/DataTable/DataTable.constants' +} from '@/components/ui/DataTable/DataTable.constants' export const REGIONS = ['ams', 'fra', 'gru', 'hkg', 'iad', 'syd'] as const export const METHODS = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'] as const diff --git a/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.fields.tsx b/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.fields.tsx index 2b4fca614b..e12b8d354b 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.fields.tsx +++ b/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.fields.tsx @@ -1,14 +1,14 @@ import { format } from 'date-fns' import { User } from 'lucide-react' - -import { LEVELS } from 'components/ui/DataTable/DataTable.constants' -import { DataTableFilterField, Option } from 'components/ui/DataTable/DataTable.types' -import { getLevelColor } from 'components/ui/DataTable/DataTable.utils' import { cn } from 'ui' + import { LOG_TYPES, METHODS, STATUS_CODE_LABELS } from './UnifiedLogs.constants' import { ColumnSchema } from './UnifiedLogs.schema' import { LogsMeta, SheetField } from './UnifiedLogs.types' import { getLevelLabel } from './UnifiedLogs.utils' +import { LEVELS } from '@/components/ui/DataTable/DataTable.constants' +import { DataTableFilterField, Option } from '@/components/ui/DataTable/DataTable.types' +import { getLevelColor } from '@/components/ui/DataTable/DataTable.utils' // instead of filterFields, maybe just 'fields' with a filterDisabled prop? // that way, we could have 'message' or 'headers' field with label and value as well as type! diff --git a/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.hooks.ts b/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.hooks.ts index 1661458a02..c8ef733224 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.hooks.ts +++ b/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.hooks.ts @@ -1,8 +1,8 @@ import { useQueryState } from 'nuqs' import { useEffect, useMemo, useRef } from 'react' -import { useHotKey } from 'hooks/ui/useHotKey' import { SEARCH_PARAMS_PARSER } from './UnifiedLogs.constants' +import { useHotKey } from '@/hooks/ui/useHotKey' export const useResetFocus = () => { useHotKey(() => { diff --git a/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.schema.ts b/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.schema.ts index 0ec4c679a4..53ea85afe0 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.schema.ts +++ b/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.schema.ts @@ -1,11 +1,11 @@ import { z } from 'zod' +import { LOG_TYPES, METHODS, REGIONS } from './UnifiedLogs.constants' import { ARRAY_DELIMITER, LEVELS, RANGE_DELIMITER, -} from 'components/ui/DataTable/DataTable.constants' -import { LOG_TYPES, METHODS, REGIONS } from './UnifiedLogs.constants' +} from '@/components/ui/DataTable/DataTable.constants' export const columnSchema = z.object({ id: z.string(), diff --git a/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.utils.ts b/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.utils.ts index 3efedfb24f..03dd6b7911 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.utils.ts +++ b/apps/studio/components/interfaces/UnifiedLogs/UnifiedLogs.utils.ts @@ -1,8 +1,8 @@ import { type Table as TTable } from '@tanstack/react-table' - -import { LEVELS } from 'components/ui/DataTable/DataTable.constants' import { cn } from 'ui' + import { FacetMetadataSchema } from './UnifiedLogs.schema' +import { LEVELS } from '@/components/ui/DataTable/DataTable.constants' export const logEventBus = { listeners: new Map void>>(), diff --git a/apps/studio/components/interfaces/UnifiedLogs/components/AuthUserHoverCard.tsx b/apps/studio/components/interfaces/UnifiedLogs/components/AuthUserHoverCard.tsx index 0d9f329dd9..4f902b66f1 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/components/AuthUserHoverCard.tsx +++ b/apps/studio/components/interfaces/UnifiedLogs/components/AuthUserHoverCard.tsx @@ -1,5 +1,4 @@ import { User } from 'lucide-react' - import { HoverCard, HoverCardContent, diff --git a/apps/studio/components/interfaces/UnifiedLogs/components/Columns.tsx b/apps/studio/components/interfaces/UnifiedLogs/components/Columns.tsx index 0c79832a17..0876c81405 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/components/Columns.tsx +++ b/apps/studio/components/interfaces/UnifiedLogs/components/Columns.tsx @@ -1,6 +1,4 @@ import { ColumnDef } from '@tanstack/react-table' -import { DataTableColumnLevelIndicator } from 'components/ui/DataTable/DataTableColumn/DataTableColumnLevelIndicator' -import { DataTableColumnStatusCode } from 'components/ui/DataTable/DataTableColumn/DataTableColumnStatusCode' import { Tooltip, TooltipContent, TooltipTrigger } from 'ui' import { STATUS_CODE_LABELS } from '../UnifiedLogs.constants' @@ -9,6 +7,8 @@ import { AuthUserHoverCard } from './AuthUserHoverCard' import { HoverCardTimestamp } from './HoverCardTimestamp' import { LogTypeIcon } from './LogTypeIcon' import { TextWithTooltip } from './TextWithTooltip' +import { DataTableColumnLevelIndicator } from '@/components/ui/DataTable/DataTableColumn/DataTableColumnLevelIndicator' +import { DataTableColumnStatusCode } from '@/components/ui/DataTable/DataTableColumn/DataTableColumnStatusCode' /** * Determines if a column should be hidden based on its values in the data. diff --git a/apps/studio/components/interfaces/UnifiedLogs/components/DataTableSheetContent.tsx b/apps/studio/components/interfaces/UnifiedLogs/components/DataTableSheetContent.tsx index 6fd5aa0ac6..2e66d00ef2 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/components/DataTableSheetContent.tsx +++ b/apps/studio/components/interfaces/UnifiedLogs/components/DataTableSheetContent.tsx @@ -1,10 +1,10 @@ import { Table } from '@tanstack/react-table' import { HTMLAttributes, memo } from 'react' - -import { DataTableFilterField } from 'components/ui/DataTable/DataTable.types' -import { DataTableSheetRowAction } from 'components/ui/DataTable/DataTableSheetRowAction' import { cn, Skeleton } from 'ui' + import { SheetField } from '../UnifiedLogs.types' +import { DataTableFilterField } from '@/components/ui/DataTable/DataTable.types' +import { DataTableSheetRowAction } from '@/components/ui/DataTable/DataTableSheetRowAction' interface SheetDetailsContentSkeletonProps { fields: SheetField[] diff --git a/apps/studio/components/interfaces/UnifiedLogs/components/DownloadLogsButton.tsx b/apps/studio/components/interfaces/UnifiedLogs/components/DownloadLogsButton.tsx index 4defc89300..d01e78b6e0 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/components/DownloadLogsButton.tsx +++ b/apps/studio/components/interfaces/UnifiedLogs/components/DownloadLogsButton.tsx @@ -1,14 +1,11 @@ +import { IS_PLATFORM, useParams } from 'common' import saveAs from 'file-saver' import { Download, Settings } from 'lucide-react' import Link from 'next/link' +import { usePathname } from 'next/navigation' import Papa from 'papaparse' import { useEffect, useState } from 'react' import { toast } from 'sonner' - -import { usePathname } from 'next/navigation' -import { IS_PLATFORM, useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useGetUnifiedLogsMutation } from 'data/logs/get-unified-logs' import { Button, Dialog, @@ -28,7 +25,10 @@ import { SelectTrigger_Shadcn_, SelectValue_Shadcn_, } from 'ui' + import { QuerySearchParamsType } from '../UnifiedLogs.types' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useGetUnifiedLogsMutation } from '@/data/logs/get-unified-logs' const DEFAULT_NUM_ROWS = '100' const DEFAULT_DURATION = '1' diff --git a/apps/studio/components/interfaces/UnifiedLogs/components/LogTypeIcon.tsx b/apps/studio/components/interfaces/UnifiedLogs/components/LogTypeIcon.tsx index 2198117c36..b463fb3b96 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/components/LogTypeIcon.tsx +++ b/apps/studio/components/interfaces/UnifiedLogs/components/LogTypeIcon.tsx @@ -1,7 +1,7 @@ -import { BookHeart, Box, Cpu, Database, Globe } from 'lucide-react' - import { Auth, EdgeFunctions, Storage } from 'icons' +import { BookHeart, Box, Cpu, Database, Globe } from 'lucide-react' import { cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' + import { type LOG_TYPES } from '../UnifiedLogs.constants' interface LogTypeIconProps { diff --git a/apps/studio/components/interfaces/UnifiedLogs/components/LogsList.tsx b/apps/studio/components/interfaces/UnifiedLogs/components/LogsList.tsx index 8bba137b90..4428041dda 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/components/LogsList.tsx +++ b/apps/studio/components/interfaces/UnifiedLogs/components/LogsList.tsx @@ -1,6 +1,6 @@ -import CopyButton from 'components/ui/CopyButton' -import { DataTableColumnStatusCode } from 'components/ui/DataTable/DataTableColumn/DataTableColumnStatusCode' import { HoverCardTimestamp } from './HoverCardTimestamp' +import CopyButton from '@/components/ui/CopyButton' +import { DataTableColumnStatusCode } from '@/components/ui/DataTable/DataTableColumn/DataTableColumnStatusCode' interface LogEntry { id: string diff --git a/apps/studio/components/interfaces/UnifiedLogs/components/LogsListPanel.tsx b/apps/studio/components/interfaces/UnifiedLogs/components/LogsListPanel.tsx index b36cff647d..24f02de8a4 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/components/LogsListPanel.tsx +++ b/apps/studio/components/interfaces/UnifiedLogs/components/LogsListPanel.tsx @@ -1,8 +1,8 @@ import type { Row } from '@tanstack/react-table' import { ChevronDown } from 'lucide-react' import { useState } from 'react' - import { Button, cn, ResizableHandle, ResizablePanel } from 'ui' + import { LogsList } from './LogsList' export const LogsListPanel = ({ selectedRow }: { selectedRow?: Row }) => { diff --git a/apps/studio/components/interfaces/UserDropdown.tsx b/apps/studio/components/interfaces/UserDropdown.tsx index bac26dca6f..9a8ebadcb1 100644 --- a/apps/studio/components/interfaces/UserDropdown.tsx +++ b/apps/studio/components/interfaces/UserDropdown.tsx @@ -1,12 +1,7 @@ -import { ProfileImage } from 'components/ui/ProfileImage' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { IS_PLATFORM } from 'lib/constants' -import { useProfileNameAndPicture } from 'lib/profile' import { FlaskConical, Loader2, ScrollText, Settings } from 'lucide-react' import { useTheme } from 'next-themes' import Link from 'next/link' import { useRouter } from 'next/router' -import { useAppStateSnapshot } from 'state/app-state' import { Button, cn, @@ -24,6 +19,11 @@ import { } from 'ui' import { useFeaturePreviewModal } from './App/FeaturePreview/FeaturePreviewContext' +import { ProfileImage } from '@/components/ui/ProfileImage' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { IS_PLATFORM } from '@/lib/constants' +import { useProfileNameAndPicture } from '@/lib/profile' +import { useAppStateSnapshot } from '@/state/app-state' export function UserDropdown({ triggerClassName, diff --git a/apps/studio/components/layouts/APIAuthorizationLayout.tsx b/apps/studio/components/layouts/APIAuthorizationLayout.tsx index 4dada71df9..6fb194222f 100644 --- a/apps/studio/components/layouts/APIAuthorizationLayout.tsx +++ b/apps/studio/components/layouts/APIAuthorizationLayout.tsx @@ -1,11 +1,12 @@ -import { useCustomContent } from 'hooks/custom-content/useCustomContent' -import { BASE_PATH } from 'lib/constants' import { useTheme } from 'next-themes' import Head from 'next/head' import Image from 'next/legacy/image' import type { PropsWithChildren } from 'react' import { Separator } from 'ui' +import { useCustomContent } from '@/hooks/custom-content/useCustomContent' +import { BASE_PATH } from '@/lib/constants' + export interface APIAuthorizationLayoutProps {} const APIAuthorizationLayout = ({ children }: PropsWithChildren) => { diff --git a/apps/studio/components/layouts/APIKeys/APIKeysLayout.tsx b/apps/studio/components/layouts/APIKeys/APIKeysLayout.tsx index aa8c5db774..2d396b6db2 100644 --- a/apps/studio/components/layouts/APIKeys/APIKeysLayout.tsx +++ b/apps/studio/components/layouts/APIKeys/APIKeysLayout.tsx @@ -1,10 +1,10 @@ -import { PageLayout } from 'components/layouts/PageLayout/PageLayout' -import { ScaffoldContainer } from 'components/layouts/Scaffold' +import { useParams } from 'common' import { PropsWithChildren } from 'react' -import { useParams } from 'common' -import { DocsButton } from 'components/ui/DocsButton' -import { DOCS_URL } from 'lib/constants' +import { PageLayout } from '@/components/layouts/PageLayout/PageLayout' +import { ScaffoldContainer } from '@/components/layouts/Scaffold' +import { DocsButton } from '@/components/ui/DocsButton' +import { DOCS_URL } from '@/lib/constants' const ApiKeysLayout = ({ children }: PropsWithChildren) => { const { ref: projectRef } = useParams() diff --git a/apps/studio/components/layouts/AccountLayout/AccountLayout.tsx b/apps/studio/components/layouts/AccountLayout/AccountLayout.tsx index f760a804fb..e4418c68ac 100644 --- a/apps/studio/components/layouts/AccountLayout/AccountLayout.tsx +++ b/apps/studio/components/layouts/AccountLayout/AccountLayout.tsx @@ -1,20 +1,20 @@ import { LOCAL_STORAGE_KEYS } from 'common' -import { useCustomContent } from 'hooks/custom-content/useCustomContent' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { withAuth } from 'hooks/misc/withAuth' -import { IS_PLATFORM } from 'lib/constants' -import { buildStudioPageTitle } from 'lib/page-title' import Head from 'next/head' import { useRouter } from 'next/router' import type { PropsWithChildren } from 'react' import { useEffect, useLayoutEffect, useMemo } from 'react' -import { useAppStateSnapshot } from 'state/app-state' import { cn } from 'ui' import { useMobileSheet } from '../Navigation/NavigationBar/MobileSheetContext' import { AccountMenuContent } from './AccountMenuContent' import { WithSidebar } from './WithSidebar' +import { useCustomContent } from '@/hooks/custom-content/useCustomContent' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { withAuth } from '@/hooks/misc/withAuth' +import { IS_PLATFORM } from '@/lib/constants' +import { buildStudioPageTitle } from '@/lib/page-title' +import { useAppStateSnapshot } from '@/state/app-state' export interface AccountLayoutProps { title: string diff --git a/apps/studio/components/layouts/AccountLayout/AccountLayout.utils.ts b/apps/studio/components/layouts/AccountLayout/AccountLayout.utils.ts index 947761b29d..3fd546d81b 100644 --- a/apps/studio/components/layouts/AccountLayout/AccountLayout.utils.ts +++ b/apps/studio/components/layouts/AccountLayout/AccountLayout.utils.ts @@ -1,6 +1,5 @@ -import type { SubMenuSection } from 'components/ui/ProductMenu/ProductMenu.types' - import type { SidebarSection } from './AccountLayout.types' +import type { SubMenuSection } from '@/components/ui/ProductMenu/ProductMenu.types' /** * Converts AccountLayout SidebarSection[] to SubMenuSection[] for SubMenu/ProductMenu. diff --git a/apps/studio/components/layouts/AccountLayout/AccountMenuContent.tsx b/apps/studio/components/layouts/AccountLayout/AccountMenuContent.tsx index caa7aad8dd..f10606ed17 100644 --- a/apps/studio/components/layouts/AccountLayout/AccountMenuContent.tsx +++ b/apps/studio/components/layouts/AccountLayout/AccountMenuContent.tsx @@ -1,9 +1,8 @@ 'use client' -import { SubMenu } from 'components/ui/ProductMenu/SubMenu' - -import { getActiveKey, toSubMenuSections } from './AccountLayout.utils' import type { SidebarSection } from './AccountLayout.types' +import { getActiveKey, toSubMenuSections } from './AccountLayout.utils' +import { SubMenu } from '@/components/ui/ProductMenu/SubMenu' export interface AccountMenuContentProps { sections: SidebarSection[] diff --git a/apps/studio/components/layouts/AccountLayout/WithSidebar.tsx b/apps/studio/components/layouts/AccountLayout/WithSidebar.tsx index 804ffe5033..243db77267 100644 --- a/apps/studio/components/layouts/AccountLayout/WithSidebar.tsx +++ b/apps/studio/components/layouts/AccountLayout/WithSidebar.tsx @@ -1,10 +1,10 @@ import { ArrowLeft } from 'lucide-react' import Link from 'next/link' import { PropsWithChildren, ReactNode } from 'react' -import { useAppStateSnapshot } from 'state/app-state' import { cn, Menu } from 'ui' import type { SidebarSection } from './AccountLayout.types' +import { useAppStateSnapshot } from '@/state/app-state' interface WithSidebarProps { title: string diff --git a/apps/studio/components/layouts/AdvisorsLayout/Advisors.Commands.tsx b/apps/studio/components/layouts/AdvisorsLayout/Advisors.Commands.tsx index 719a387333..3851259466 100644 --- a/apps/studio/components/layouts/AdvisorsLayout/Advisors.Commands.tsx +++ b/apps/studio/components/layouts/AdvisorsLayout/Advisors.Commands.tsx @@ -1,8 +1,9 @@ import { useParams } from 'common' -import { COMMAND_MENU_SECTIONS } from 'components/interfaces/App/CommandMenu/CommandMenu.utils' import type { CommandOptions } from 'ui-patterns/CommandMenu' import { useRegisterCommands } from 'ui-patterns/CommandMenu' +import { COMMAND_MENU_SECTIONS } from '@/components/interfaces/App/CommandMenu/CommandMenu.utils' + export function useAdvisorsGoToCommands(options?: CommandOptions) { let { ref } = useParams() ref ||= '_' diff --git a/apps/studio/components/layouts/AdvisorsLayout/AdvisorsLayout.tsx b/apps/studio/components/layouts/AdvisorsLayout/AdvisorsLayout.tsx index cc8738a147..1bd0776d63 100644 --- a/apps/studio/components/layouts/AdvisorsLayout/AdvisorsLayout.tsx +++ b/apps/studio/components/layouts/AdvisorsLayout/AdvisorsLayout.tsx @@ -1,9 +1,9 @@ import { useRouter } from 'next/router' import { PropsWithChildren } from 'react' -import { withAuth } from 'hooks/misc/withAuth' import { ProjectLayout } from '../ProjectLayout' import { AdvisorsSidebarMenu } from './AdvisorsSidebarMenu' +import { withAuth } from '@/hooks/misc/withAuth' export interface AdvisorsLayoutProps { title?: string diff --git a/apps/studio/components/layouts/AdvisorsLayout/AdvisorsMenu.utils.tsx b/apps/studio/components/layouts/AdvisorsLayout/AdvisorsMenu.utils.tsx index 142d8f93ac..3e968a1478 100644 --- a/apps/studio/components/layouts/AdvisorsLayout/AdvisorsMenu.utils.tsx +++ b/apps/studio/components/layouts/AdvisorsLayout/AdvisorsMenu.utils.tsx @@ -1,8 +1,9 @@ -import type { ProductMenuGroup } from 'components/ui/ProductMenu/ProductMenu.types' -import type { Project } from 'data/projects/project-detail-query' -import { IS_PLATFORM } from 'lib/constants' import { ArrowUpRight } from 'lucide-react' +import type { ProductMenuGroup } from '@/components/ui/ProductMenu/ProductMenu.types' +import type { Project } from '@/data/projects/project-detail-query' +import { IS_PLATFORM } from '@/lib/constants' + export const generateAdvisorsMenu = (project?: Project): ProductMenuGroup[] => { const ref = project?.ref ?? 'default' diff --git a/apps/studio/components/layouts/AdvisorsLayout/AdvisorsSidebarMenu.tsx b/apps/studio/components/layouts/AdvisorsLayout/AdvisorsSidebarMenu.tsx index 770e078842..0d73595039 100644 --- a/apps/studio/components/layouts/AdvisorsLayout/AdvisorsSidebarMenu.tsx +++ b/apps/studio/components/layouts/AdvisorsLayout/AdvisorsSidebarMenu.tsx @@ -1,11 +1,11 @@ -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { ProductMenu } from 'components/ui/ProductMenu' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { Badge, Button } from 'ui' import { FeaturePreviewSidebarPanel } from '../../ui/FeaturePreviewSidebarPanel' import { generateAdvisorsMenu } from './AdvisorsMenu.utils' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { ProductMenu } from '@/components/ui/ProductMenu' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' interface AdvisorsSidebarMenuProps { page?: string diff --git a/apps/studio/components/layouts/AppLayout/AdvisorButton.tsx b/apps/studio/components/layouts/AppLayout/AdvisorButton.tsx index f2c49386fe..a5f6f05b17 100644 --- a/apps/studio/components/layouts/AppLayout/AdvisorButton.tsx +++ b/apps/studio/components/layouts/AppLayout/AdvisorButton.tsx @@ -1,12 +1,12 @@ -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useProjectLintsQuery } from 'data/lint/lint-query' import { Lightbulb } from 'lucide-react' import { useMemo } from 'react' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { cn } from 'ui' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useProjectLintsQuery } from '@/data/lint/lint-query' import { useNotificationsV2Query } from '@/data/notifications/notifications-v2-query' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' export const AdvisorButton = ({ projectRef }: { projectRef?: string }) => { const { toggleSidebar, activeSidebar } = useSidebarManagerSnapshot() diff --git a/apps/studio/components/layouts/AppLayout/AssistantButton.tsx b/apps/studio/components/layouts/AppLayout/AssistantButton.tsx index 11067fa1e1..56c7bb5f45 100644 --- a/apps/studio/components/layouts/AppLayout/AssistantButton.tsx +++ b/apps/studio/components/layouts/AppLayout/AssistantButton.tsx @@ -1,11 +1,12 @@ import { LOCAL_STORAGE_KEYS } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' import { AiIconAnimation, cn, KeyboardShortcut } from 'ui' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' + export const AssistantButton = () => { const { activeSidebar, toggleSidebar } = useSidebarManagerSnapshot() const [isAIAssistantHotkeyEnabled] = useLocalStorageQuery( diff --git a/apps/studio/components/layouts/AppLayout/BranchBadge.tsx b/apps/studio/components/layouts/AppLayout/BranchBadge.tsx index 06147aa8d3..855b704b9a 100644 --- a/apps/studio/components/layouts/AppLayout/BranchBadge.tsx +++ b/apps/studio/components/layouts/AppLayout/BranchBadge.tsx @@ -1,6 +1,7 @@ -import type { Branch } from 'data/branches/branches-query' import { Badge } from 'ui' +import type { Branch } from '@/data/branches/branches-query' + interface BranchBadgeProps { branch: Branch | undefined isBranchingEnabled: boolean diff --git a/apps/studio/components/layouts/AppLayout/BranchDropdown.tsx b/apps/studio/components/layouts/AppLayout/BranchDropdown.tsx index 1449d9e9b1..1589759eeb 100644 --- a/apps/studio/components/layouts/AppLayout/BranchDropdown.tsx +++ b/apps/studio/components/layouts/AppLayout/BranchDropdown.tsx @@ -1,15 +1,15 @@ import { useParams } from 'common' -import { useBranchesQuery } from 'data/branches/branches-query' -import type { Branch } from 'data/branches/branches-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { useState } from 'react' -import { useAppStateSnapshot } from 'state/app-state' import { ShimmeringLoader } from 'ui-patterns' import { AppLayoutDropdownError, AppLayoutDropdownWithPopover } from './AppLayoutDropdown' import { BranchBadge } from './BranchBadge' import { BranchDropdownCommandContent } from './BranchDropdownCommandContent' import { useEmbeddedCloseHandler } from './useEmbeddedCloseHandler' +import { useBranchesQuery } from '@/data/branches/branches-query' +import type { Branch } from '@/data/branches/branches-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useAppStateSnapshot } from '@/state/app-state' interface BranchDropdownProps { embedded?: boolean diff --git a/apps/studio/components/layouts/AppLayout/BranchDropdownCommandContent.tsx b/apps/studio/components/layouts/AppLayout/BranchDropdownCommandContent.tsx index e60a50d2f5..9466500915 100644 --- a/apps/studio/components/layouts/AppLayout/BranchDropdownCommandContent.tsx +++ b/apps/studio/components/layouts/AppLayout/BranchDropdownCommandContent.tsx @@ -1,5 +1,3 @@ -import type { Branch } from 'data/branches/branches-query' -import { useTrack } from 'lib/telemetry/track' import { ListTree, MessageCircle, Plus } from 'lucide-react' import Link from 'next/link' import { @@ -16,6 +14,8 @@ import { } from 'ui' import { BranchLink } from './BranchLink' +import type { Branch } from '@/data/branches/branches-query' +import { useTrack } from '@/lib/telemetry/track' const BRANCHING_GITHUB_DISCUSSION_LINK = 'https://github.com/orgs/supabase/discussions/18937' diff --git a/apps/studio/components/layouts/AppLayout/BranchLink.tsx b/apps/studio/components/layouts/AppLayout/BranchLink.tsx index 2403575656..32cdce43d4 100644 --- a/apps/studio/components/layouts/AppLayout/BranchLink.tsx +++ b/apps/studio/components/layouts/AppLayout/BranchLink.tsx @@ -1,11 +1,11 @@ -import type { Branch } from 'data/branches/branches-query' -import { useTrack } from 'lib/telemetry/track' import { Check, Shield } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' import { CommandItem_Shadcn_ } from 'ui' import { sanitizeRoute } from './ProjectDropdown.utils' +import type { Branch } from '@/data/branches/branches-query' +import { useTrack } from '@/lib/telemetry/track' export interface BranchLinkProps { branch: Branch diff --git a/apps/studio/components/layouts/AppLayout/ClockSkewBanner.tsx b/apps/studio/components/layouts/AppLayout/ClockSkewBanner.tsx index 50174f78d1..370aca62c3 100644 --- a/apps/studio/components/layouts/AppLayout/ClockSkewBanner.tsx +++ b/apps/studio/components/layouts/AppLayout/ClockSkewBanner.tsx @@ -1,9 +1,9 @@ import { useEffect, useState } from 'react' -import { HeaderBanner } from 'components/interfaces/Organization/HeaderBanner' -import { InlineLink } from 'components/ui/InlineLink' -import { useClockSkewQuery } from 'data/misc/clock-skew-query' -import { DOCS_URL } from 'lib/constants' +import { HeaderBanner } from '@/components/interfaces/Organization/HeaderBanner' +import { InlineLink } from '@/components/ui/InlineLink' +import { useClockSkewQuery } from '@/data/misc/clock-skew-query' +import { DOCS_URL } from '@/lib/constants' export const ClockSkewBanner = () => { const [isClockSkewed, setIsClockSkewed] = useState(false) diff --git a/apps/studio/components/layouts/AppLayout/EnableBranchingButton/BranchingPITRNotice.tsx b/apps/studio/components/layouts/AppLayout/EnableBranchingButton/BranchingPITRNotice.tsx index f101320651..ed8c33eccb 100644 --- a/apps/studio/components/layouts/AppLayout/EnableBranchingButton/BranchingPITRNotice.tsx +++ b/apps/studio/components/layouts/AppLayout/EnableBranchingButton/BranchingPITRNotice.tsx @@ -1,13 +1,13 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { Clock } from 'lucide-react' import Link from 'next/link' - -import { useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useAppStateSnapshot } from 'state/app-state' import { Button } from 'ui' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useAppStateSnapshot } from '@/state/app-state' + export const BranchingPITRNotice = () => { const { ref } = useParams() const snap = useAppStateSnapshot() diff --git a/apps/studio/components/layouts/AppLayout/EnableBranchingButton/BranchingPlanNotice.tsx b/apps/studio/components/layouts/AppLayout/EnableBranchingButton/BranchingPlanNotice.tsx index b8b99c9d7a..48e8fd8f8b 100644 --- a/apps/studio/components/layouts/AppLayout/EnableBranchingButton/BranchingPlanNotice.tsx +++ b/apps/studio/components/layouts/AppLayout/EnableBranchingButton/BranchingPlanNotice.tsx @@ -1,9 +1,9 @@ import { AlertCircleIcon } from 'lucide-react' import Link from 'next/link' +import { Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, Button } from 'ui' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useAppStateSnapshot } from 'state/app-state' -import { AlertDescription_Shadcn_, AlertTitle_Shadcn_, Alert_Shadcn_, Button } from 'ui' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useAppStateSnapshot } from '@/state/app-state' export const BranchingPlanNotice = () => { const snap = useAppStateSnapshot() diff --git a/apps/studio/components/layouts/AppLayout/EnableBranchingButton/BranchingPostgresVersionNotice.tsx b/apps/studio/components/layouts/AppLayout/EnableBranchingButton/BranchingPostgresVersionNotice.tsx index 29865c992c..bd9e8f1f25 100644 --- a/apps/studio/components/layouts/AppLayout/EnableBranchingButton/BranchingPostgresVersionNotice.tsx +++ b/apps/studio/components/layouts/AppLayout/EnableBranchingButton/BranchingPostgresVersionNotice.tsx @@ -1,9 +1,9 @@ +import { useParams } from 'common' import { AlertCircleIcon } from 'lucide-react' import Link from 'next/link' -import { AlertDescription_Shadcn_, AlertTitle_Shadcn_, Alert_Shadcn_, Button } from 'ui' +import { Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, Button } from 'ui' -import { useParams } from 'common' -import { useAppStateSnapshot } from 'state/app-state' +import { useAppStateSnapshot } from '@/state/app-state' export const BranchingPostgresVersionNotice = () => { const { ref } = useParams() diff --git a/apps/studio/components/layouts/AppLayout/InlineEditorButton.tsx b/apps/studio/components/layouts/AppLayout/InlineEditorButton.tsx index 770aff13e7..302667d33a 100644 --- a/apps/studio/components/layouts/AppLayout/InlineEditorButton.tsx +++ b/apps/studio/components/layouts/AppLayout/InlineEditorButton.tsx @@ -1,11 +1,12 @@ import { LOCAL_STORAGE_KEYS } from 'common' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' import { SqlEditor } from 'icons' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { cn, KeyboardShortcut } from 'ui' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' + const InlineEditorKeyboardTooltip = () => { const [hotkeyEnabled] = useLocalStorageQuery( LOCAL_STORAGE_KEYS.HOTKEY_SIDEBAR(SIDEBAR_KEYS.EDITOR_PANEL), diff --git a/apps/studio/components/layouts/AppLayout/OrgCommandItem.tsx b/apps/studio/components/layouts/AppLayout/OrgCommandItem.tsx index fed9165495..cfd09ee9d2 100644 --- a/apps/studio/components/layouts/AppLayout/OrgCommandItem.tsx +++ b/apps/studio/components/layouts/AppLayout/OrgCommandItem.tsx @@ -1,9 +1,10 @@ -import PartnerIcon from 'components/ui/PartnerIcon' import { Check } from 'lucide-react' import Link from 'next/link' -import type { Organization } from 'types' import { cn, CommandItem_Shadcn_ } from 'ui' +import PartnerIcon from '@/components/ui/PartnerIcon' +import type { Organization } from '@/types' + export interface OrgCommandItemProps { org: Organization selectedSlug: string | undefined diff --git a/apps/studio/components/layouts/AppLayout/OrganizationDropdown.tsx b/apps/studio/components/layouts/AppLayout/OrganizationDropdown.tsx index a9d65e9f87..3376b079bc 100644 --- a/apps/studio/components/layouts/AppLayout/OrganizationDropdown.tsx +++ b/apps/studio/components/layouts/AppLayout/OrganizationDropdown.tsx @@ -1,7 +1,4 @@ import { useParams } from 'common' -import { useOrganizationsQuery } from 'data/organizations/organizations-query' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { Boxes } from 'lucide-react' import { useRouter } from 'next/router' import { useState } from 'react' @@ -11,6 +8,9 @@ import { GenericSkeletonLoader, ShimmeringLoader } from 'ui-patterns' import { AppLayoutDropdownError, AppLayoutDropdownWithPopover } from './AppLayoutDropdown' import { OrganizationDropdownCommandContent } from './OrganizationDropdownCommandContent' import { useEmbeddedCloseHandler } from './useEmbeddedCloseHandler' +import { useOrganizationsQuery } from '@/data/organizations/organizations-query' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' interface OrganizationDropdownProps { embedded?: boolean diff --git a/apps/studio/components/layouts/AppLayout/OrganizationDropdownCommandContent.tsx b/apps/studio/components/layouts/AppLayout/OrganizationDropdownCommandContent.tsx index 5644eaded7..fa9d3b1b4d 100644 --- a/apps/studio/components/layouts/AppLayout/OrganizationDropdownCommandContent.tsx +++ b/apps/studio/components/layouts/AppLayout/OrganizationDropdownCommandContent.tsx @@ -1,7 +1,5 @@ -import PartnerIcon from 'components/ui/PartnerIcon' import { Plus } from 'lucide-react' import Link from 'next/link' -import type { Organization } from 'types' import { Button, cn, @@ -16,6 +14,8 @@ import { } from 'ui' import { OrgCommandItem } from './OrgCommandItem' +import PartnerIcon from '@/components/ui/PartnerIcon' +import type { Organization } from '@/types' export interface OrganizationDropdownCommandContentProps { embedded: boolean diff --git a/apps/studio/components/layouts/AppLayout/ProjectDropdown.tsx b/apps/studio/components/layouts/AppLayout/ProjectDropdown.tsx index c6f595d129..51ef8a43cc 100644 --- a/apps/studio/components/layouts/AppLayout/ProjectDropdown.tsx +++ b/apps/studio/components/layouts/AppLayout/ProjectDropdown.tsx @@ -1,10 +1,4 @@ import { useParams } from 'common' -import { OrganizationProjectSelector } from 'components/ui/OrganizationProjectSelector' -import { useProjectDetailQuery } from 'data/projects/project-detail-query' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { IS_PLATFORM } from 'lib/constants' import { Box, Plus } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' @@ -17,6 +11,12 @@ import { AppLayoutDropdownTriggerButton } from './AppLayoutDropdown' import { sanitizeRoute } from './ProjectDropdown.utils' import { ProjectRowLink } from './ProjectRowLink' import { useEmbeddedCloseHandler } from './useEmbeddedCloseHandler' +import { OrganizationProjectSelector } from '@/components/ui/OrganizationProjectSelector' +import { useProjectDetailQuery } from '@/data/projects/project-detail-query' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { IS_PLATFORM } from '@/lib/constants' // --- Sub-components --- diff --git a/apps/studio/components/layouts/AppLayout/StatusPageBanner.tsx b/apps/studio/components/layouts/AppLayout/StatusPageBanner.tsx index 162e2bf22d..c278562eb1 100644 --- a/apps/studio/components/layouts/AppLayout/StatusPageBanner.tsx +++ b/apps/studio/components/layouts/AppLayout/StatusPageBanner.tsx @@ -1,6 +1,6 @@ +import { useStatusPageBannerVisibility } from './useStatusPageBannerVisibility' import { HeaderBanner } from '@/components/interfaces/Organization/HeaderBanner' import { InlineLink } from '@/components/ui/InlineLink' -import { useStatusPageBannerVisibility } from './useStatusPageBannerVisibility' const BANNER_DESCRIPTION = ( <> diff --git a/apps/studio/components/layouts/AppLayout/StatusPageBanner.utils.ts b/apps/studio/components/layouts/AppLayout/StatusPageBanner.utils.ts index 490fcf6300..11daf030b1 100644 --- a/apps/studio/components/layouts/AppLayout/StatusPageBanner.utils.ts +++ b/apps/studio/components/layouts/AppLayout/StatusPageBanner.utils.ts @@ -1,4 +1,4 @@ -import type { IncidentCache } from 'lib/api/incident-status' +import type { IncidentCache } from '@/lib/api/incident-status' type BannerIncident = { id: string; cache?: IncidentCache | null } diff --git a/apps/studio/components/layouts/AppLayout/TaxIdBanner.tsx b/apps/studio/components/layouts/AppLayout/TaxIdBanner.tsx index b6ec0897ea..346b257f50 100644 --- a/apps/studio/components/layouts/AppLayout/TaxIdBanner.tsx +++ b/apps/studio/components/layouts/AppLayout/TaxIdBanner.tsx @@ -1,10 +1,10 @@ import { LOCAL_STORAGE_KEYS } from 'common' -import { useOrganizationCustomerProfileQuery } from 'data/organizations/organization-customer-profile-query' import { useRouter } from 'next/router' import { TAX_IDS } from '@/components/interfaces/Organization/BillingSettings/BillingCustomerData/TaxID.constants' import { HeaderBanner } from '@/components/interfaces/Organization/HeaderBanner' import { InlineLink } from '@/components/ui/InlineLink' +import { useOrganizationCustomerProfileQuery } from '@/data/organizations/organization-customer-profile-query' import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' diff --git a/apps/studio/components/layouts/AuthLayout/Auth.Commands.tsx b/apps/studio/components/layouts/AuthLayout/Auth.Commands.tsx index 0e11c0742a..aee72616b5 100644 --- a/apps/studio/components/layouts/AuthLayout/Auth.Commands.tsx +++ b/apps/studio/components/layouts/AuthLayout/Auth.Commands.tsx @@ -1,10 +1,11 @@ import { useParams } from 'common' -import { COMMAND_MENU_SECTIONS } from 'components/interfaces/App/CommandMenu/CommandMenu.utils' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import type { CommandOptions } from 'ui-patterns/CommandMenu' import { useRegisterCommands } from 'ui-patterns/CommandMenu' import { IRouteCommand } from 'ui-patterns/CommandMenu/internal/types' +import { COMMAND_MENU_SECTIONS } from '@/components/interfaces/App/CommandMenu/CommandMenu.utils' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' + export function useAuthGotoCommands(options?: CommandOptions) { let { ref } = useParams() ref ||= '_' diff --git a/apps/studio/components/layouts/AuthLayout/AuthEmailsLayout.tsx b/apps/studio/components/layouts/AuthLayout/AuthEmailsLayout.tsx index 4d2644f733..3b265cf267 100644 --- a/apps/studio/components/layouts/AuthLayout/AuthEmailsLayout.tsx +++ b/apps/studio/components/layouts/AuthLayout/AuthEmailsLayout.tsx @@ -1,10 +1,10 @@ import { useParams } from 'common' -import { PageLayout } from 'components/layouts/PageLayout/PageLayout' -import { UnknownInterface } from 'components/ui/UnknownInterface' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import { PropsWithChildren } from 'react' import AuthLayout from './AuthLayout' +import { PageLayout } from '@/components/layouts/PageLayout/PageLayout' +import { UnknownInterface } from '@/components/ui/UnknownInterface' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' export const AuthEmailsLayout = ({ children }: PropsWithChildren<{}>) => { const { ref } = useParams() diff --git a/apps/studio/components/layouts/AuthLayout/AuthLayout.tsx b/apps/studio/components/layouts/AuthLayout/AuthLayout.tsx index 51d1768f0c..96d4d2b70a 100644 --- a/apps/studio/components/layouts/AuthLayout/AuthLayout.tsx +++ b/apps/studio/components/layouts/AuthLayout/AuthLayout.tsx @@ -1,12 +1,12 @@ import { useFlag, useParams } from 'common' -import { ProductMenu } from 'components/ui/ProductMenu' -import { useAuthConfigPrefetch } from 'data/auth/auth-config-query' -import { withAuth } from 'hooks/misc/withAuth' import { useRouter } from 'next/router' import type { PropsWithChildren } from 'react' import { ProjectLayout } from '../ProjectLayout' import { useGenerateAuthMenu } from './AuthLayout.utils' +import { ProductMenu } from '@/components/ui/ProductMenu' +import { useAuthConfigPrefetch } from '@/data/auth/auth-config-query' +import { withAuth } from '@/hooks/misc/withAuth' export const AuthProductMenu = () => { const router = useRouter() diff --git a/apps/studio/components/layouts/AuthLayout/AuthLayout.utils.test.ts b/apps/studio/components/layouts/AuthLayout/AuthLayout.utils.test.ts index edf74a3609..dde954aa27 100644 --- a/apps/studio/components/layouts/AuthLayout/AuthLayout.utils.test.ts +++ b/apps/studio/components/layouts/AuthLayout/AuthLayout.utils.test.ts @@ -1,4 +1,5 @@ import { describe, expect, it } from 'vitest' + import { generateAuthMenu, GenerateAuthMenuOptions } from './AuthLayout.utils' const allFeaturesEnabled: GenerateAuthMenuOptions = { diff --git a/apps/studio/components/layouts/AuthLayout/AuthLayout.utils.ts b/apps/studio/components/layouts/AuthLayout/AuthLayout.utils.ts index 972b74567c..bcbacdb158 100644 --- a/apps/studio/components/layouts/AuthLayout/AuthLayout.utils.ts +++ b/apps/studio/components/layouts/AuthLayout/AuthLayout.utils.ts @@ -1,8 +1,8 @@ import { useFlag, useParams } from 'common' -import type { ProductMenuGroup } from 'components/ui/ProductMenu/ProductMenu.types' -import { IS_PLATFORM } from 'lib/constants' +import type { ProductMenuGroup } from '@/components/ui/ProductMenu/ProductMenu.types' import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { IS_PLATFORM } from '@/lib/constants' export interface GenerateAuthMenuOptions { ref?: string diff --git a/apps/studio/components/layouts/AuthLayout/AuthProvidersLayout.tsx b/apps/studio/components/layouts/AuthLayout/AuthProvidersLayout.tsx index 7831f8d382..9e40c0113f 100644 --- a/apps/studio/components/layouts/AuthLayout/AuthProvidersLayout.tsx +++ b/apps/studio/components/layouts/AuthLayout/AuthProvidersLayout.tsx @@ -1,10 +1,10 @@ import { useParams } from 'common' -import { PageLayout } from 'components/layouts/PageLayout/PageLayout' -import { UnknownInterface } from 'components/ui/UnknownInterface' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import { PropsWithChildren } from 'react' import AuthLayout from './AuthLayout' +import { PageLayout } from '@/components/layouts/PageLayout/PageLayout' +import { UnknownInterface } from '@/components/ui/UnknownInterface' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' export const AuthProvidersLayout = ({ children }: PropsWithChildren<{}>) => { const { ref } = useParams() diff --git a/apps/studio/components/layouts/AuthenticationLayout.tsx b/apps/studio/components/layouts/AuthenticationLayout.tsx index 077a1d1fef..0391b95168 100644 --- a/apps/studio/components/layouts/AuthenticationLayout.tsx +++ b/apps/studio/components/layouts/AuthenticationLayout.tsx @@ -1,6 +1,6 @@ import { PropsWithChildren } from 'react' -import { AppBannerWrapper } from 'components/interfaces/App/AppBannerWrapper' +import { AppBannerWrapper } from '@/components/interfaces/App/AppBannerWrapper' export const AuthenticationLayout = ({ children }: PropsWithChildren<{}>) => { return ( diff --git a/apps/studio/components/layouts/BillingLayout/Billing.Commands.tsx b/apps/studio/components/layouts/BillingLayout/Billing.Commands.tsx index cced180f24..4dce05bac4 100644 --- a/apps/studio/components/layouts/BillingLayout/Billing.Commands.tsx +++ b/apps/studio/components/layouts/BillingLayout/Billing.Commands.tsx @@ -1,10 +1,11 @@ import { IS_PLATFORM } from 'common' -import { COMMAND_MENU_SECTIONS } from 'components/interfaces/App/CommandMenu/CommandMenu.utils' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import type { CommandOptions } from 'ui-patterns/CommandMenu' import { useRegisterCommands } from 'ui-patterns/CommandMenu' +import { COMMAND_MENU_SECTIONS } from '@/components/interfaces/App/CommandMenu/CommandMenu.utils' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' + export function useBillingGotoCommands(options?: CommandOptions) { const { data: organization } = useSelectedOrganizationQuery() const billingEnabled = useIsFeatureEnabled('billing:all') diff --git a/apps/studio/components/layouts/BranchLayout/BranchLayout.tsx b/apps/studio/components/layouts/BranchLayout/BranchLayout.tsx index 2b2ba475c5..19246aae56 100644 --- a/apps/studio/components/layouts/BranchLayout/BranchLayout.tsx +++ b/apps/studio/components/layouts/BranchLayout/BranchLayout.tsx @@ -1,12 +1,12 @@ import { useParams } from 'common' -import { GitHubStatus } from 'components/interfaces/Settings/Integrations/GithubIntegration/GitHubStatus' -import { ProductMenu } from 'components/ui/ProductMenu' -import { withAuth } from 'hooks/misc/withAuth' import { useRouter } from 'next/router' import { PropsWithChildren } from 'react' import { ProjectLayout } from '../ProjectLayout' import { generateBranchMenu } from './BranchLayout.utils' +import { GitHubStatus } from '@/components/interfaces/Settings/Integrations/GithubIntegration/GitHubStatus' +import { ProductMenu } from '@/components/ui/ProductMenu' +import { withAuth } from '@/hooks/misc/withAuth' const BranchProductMenu = () => { const router = useRouter() diff --git a/apps/studio/components/layouts/BranchLayout/BranchLayout.utils.ts b/apps/studio/components/layouts/BranchLayout/BranchLayout.utils.ts index 40785ed882..875c83dfca 100644 --- a/apps/studio/components/layouts/BranchLayout/BranchLayout.utils.ts +++ b/apps/studio/components/layouts/BranchLayout/BranchLayout.utils.ts @@ -1,4 +1,4 @@ -import type { ProductMenuGroup } from 'components/ui/ProductMenu/ProductMenu.types' +import type { ProductMenuGroup } from '@/components/ui/ProductMenu/ProductMenu.types' export const generateBranchMenu = (ref: string): ProductMenuGroup[] => { return [ diff --git a/apps/studio/components/layouts/DatabaseLayout/Database.Commands.tsx b/apps/studio/components/layouts/DatabaseLayout/Database.Commands.tsx index 53ba2cf8c9..47e1184dca 100644 --- a/apps/studio/components/layouts/DatabaseLayout/Database.Commands.tsx +++ b/apps/studio/components/layouts/DatabaseLayout/Database.Commands.tsx @@ -1,13 +1,13 @@ -import { Blocks, Code, Database, History, Search } from 'lucide-react' - import { useParams } from 'common' -import { COMMAND_MENU_SECTIONS } from 'components/interfaces/App/CommandMenu/CommandMenu.utils' -import { orderCommandSectionsByPriority } from 'components/interfaces/App/CommandMenu/ordering' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' +import { Blocks, Code, Database, History, Search } from 'lucide-react' import type { CommandOptions } from 'ui-patterns/CommandMenu' import { useRegisterCommands } from 'ui-patterns/CommandMenu' import { IRouteCommand } from 'ui-patterns/CommandMenu/internal/types' +import { COMMAND_MENU_SECTIONS } from '@/components/interfaces/App/CommandMenu/CommandMenu.utils' +import { orderCommandSectionsByPriority } from '@/components/interfaces/App/CommandMenu/ordering' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' + export function useDatabaseGotoCommands(options?: CommandOptions) { let { ref } = useParams() ref ||= '_' diff --git a/apps/studio/components/layouts/DatabaseLayout/DatabaseLayout.tsx b/apps/studio/components/layouts/DatabaseLayout/DatabaseLayout.tsx index 3ce9895013..30db23926f 100644 --- a/apps/studio/components/layouts/DatabaseLayout/DatabaseLayout.tsx +++ b/apps/studio/components/layouts/DatabaseLayout/DatabaseLayout.tsx @@ -1,10 +1,10 @@ -import { ProductMenu } from 'components/ui/ProductMenu' -import { withAuth } from 'hooks/misc/withAuth' import { useRouter } from 'next/router' import type { PropsWithChildren } from 'react' import { ProjectLayout } from '../ProjectLayout' import { useGenerateDatabaseMenu } from './DatabaseMenu.utils' +import { ProductMenu } from '@/components/ui/ProductMenu' +import { withAuth } from '@/hooks/misc/withAuth' export interface DatabaseLayoutProps { title: string diff --git a/apps/studio/components/layouts/DatabaseLayout/DatabaseMenu.utils.tsx b/apps/studio/components/layouts/DatabaseLayout/DatabaseMenu.utils.tsx index c40b45a8eb..b42d5ce4e7 100644 --- a/apps/studio/components/layouts/DatabaseLayout/DatabaseMenu.utils.tsx +++ b/apps/studio/components/layouts/DatabaseLayout/DatabaseMenu.utils.tsx @@ -1,17 +1,17 @@ import { useParams } from 'common' -import type { - ProductMenuGroup, - ProductMenuGroupItem, -} from 'components/ui/ProductMenu/ProductMenu.types' -import { IS_PLATFORM } from 'lib/constants' import { ArrowUpRight } from 'lucide-react' import { useIsColumnLevelPrivilegesEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' import { useIsETLPrivateAlpha } from '@/components/interfaces/Database/Replication/useIsETLPrivateAlpha' +import type { + ProductMenuGroup, + ProductMenuGroupItem, +} from '@/components/ui/ProductMenu/ProductMenu.types' import { useDatabaseExtensionsQuery } from '@/data/database-extensions/database-extensions-query' import { useProjectAddonsQuery } from '@/data/subscriptions/project-addons-query' import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { IS_PLATFORM } from '@/lib/constants' const ExternalLinkIcon = diff --git a/apps/studio/components/layouts/DatabaseLayout/DatabaseTriggersLayout.tsx b/apps/studio/components/layouts/DatabaseLayout/DatabaseTriggersLayout.tsx index d2527b8fc3..375aa6ba03 100644 --- a/apps/studio/components/layouts/DatabaseLayout/DatabaseTriggersLayout.tsx +++ b/apps/studio/components/layouts/DatabaseLayout/DatabaseTriggersLayout.tsx @@ -1,11 +1,11 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { PageLayout } from 'components/layouts/PageLayout/PageLayout' -import NoPermission from 'components/ui/NoPermission' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { PropsWithChildren } from 'react' import DatabaseLayout from './DatabaseLayout' +import { PageLayout } from '@/components/layouts/PageLayout/PageLayout' +import NoPermission from '@/components/ui/NoPermission' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' type DatabaseTriggersLayoutProps = PropsWithChildren diff --git a/apps/studio/components/layouts/DefaultLayout.tsx b/apps/studio/components/layouts/DefaultLayout.tsx index a09175a865..630f6fee10 100644 --- a/apps/studio/components/layouts/DefaultLayout.tsx +++ b/apps/studio/components/layouts/DefaultLayout.tsx @@ -1,11 +1,6 @@ import { LOCAL_STORAGE_KEYS, useParams } from 'common' -import { AppBannerWrapper } from 'components/interfaces/App/AppBannerWrapper' -import { Sidebar } from 'components/interfaces/Sidebar' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { useCheckLatestDeploy } from 'hooks/use-check-latest-deploy' import { useRouter } from 'next/router' import { PropsWithChildren, useEffect, useState } from 'react' -import { useAppStateSnapshot } from 'state/app-state' import { ResizablePanel, ResizablePanelGroup, SidebarProvider } from 'ui' import { BannerStack } from '../ui/BannerStack/BannerStack' @@ -17,6 +12,11 @@ import { StudioMobileSheetNav } from './Navigation/NavigationBar/StudioMobileShe import { LayoutSidebar } from './ProjectLayout/LayoutSidebar' import { LayoutSidebarProvider } from './ProjectLayout/LayoutSidebar/LayoutSidebarProvider' import { ProjectContextProvider } from './ProjectLayout/ProjectContext' +import { AppBannerWrapper } from '@/components/interfaces/App/AppBannerWrapper' +import { Sidebar } from '@/components/interfaces/Sidebar' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { useCheckLatestDeploy } from '@/hooks/use-check-latest-deploy' +import { useAppStateSnapshot } from '@/state/app-state' export interface DefaultLayoutProps { headerTitle?: string diff --git a/apps/studio/components/layouts/DocsLayout/DocsLayout.tsx b/apps/studio/components/layouts/DocsLayout/DocsLayout.tsx index 19011e6685..11af7eb851 100644 --- a/apps/studio/components/layouts/DocsLayout/DocsLayout.tsx +++ b/apps/studio/components/layouts/DocsLayout/DocsLayout.tsx @@ -1,17 +1,17 @@ import { useParams } from 'common' -import { useIsAPIDocsSidePanelEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' -import Error from 'components/ui/Error' -import { ProductMenu } from 'components/ui/ProductMenu' -import { useOpenAPISpecQuery } from 'data/open-api/api-spec-query' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { withAuth } from 'hooks/misc/withAuth' -import { PROJECT_STATUS } from 'lib/constants' import { useRouter } from 'next/router' import { ReactElement } from 'react' import { ProjectLayout } from '../ProjectLayout' import { generateDocsMenu, getActivePage } from './DocsLayout.utils' +import { useIsAPIDocsSidePanelEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import Error from '@/components/ui/Error' +import { ProductMenu } from '@/components/ui/ProductMenu' +import { useOpenAPISpecQuery } from '@/data/open-api/api-spec-query' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { withAuth } from '@/hooks/misc/withAuth' +import { PROJECT_STATUS } from '@/lib/constants' function DocsLayout({ title, children }: { title: string; children: ReactElement }) { const router = useRouter() diff --git a/apps/studio/components/layouts/EdgeFunctionsLayout/EdgeFunctionDetailsLayout.tsx b/apps/studio/components/layouts/EdgeFunctionsLayout/EdgeFunctionDetailsLayout.tsx index c65b7130fb..fc88f2985b 100644 --- a/apps/studio/components/layouts/EdgeFunctionsLayout/EdgeFunctionDetailsLayout.tsx +++ b/apps/studio/components/layouts/EdgeFunctionsLayout/EdgeFunctionDetailsLayout.tsx @@ -1,21 +1,8 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { BlobReader, BlobWriter, ZipWriter } from '@zip.js/zip.js' import { IS_PLATFORM, useParams } from 'common' -import { useIsAPIDocsSidePanelEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' -import { EdgeFunctionTesterSheet } from 'components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionTesterSheet' -import { APIDocsButton } from 'components/ui/APIDocsButton' -import { DocsButton } from 'components/ui/DocsButton' -import NoPermission from 'components/ui/NoPermission' -import { useProjectApiUrl } from 'data/config/project-endpoint-query' -import { useEdgeFunctionBodyQuery } from 'data/edge-functions/edge-function-body-query' -import { useEdgeFunctionQuery } from 'data/edge-functions/edge-function-query' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' import dayjs from 'dayjs' import relativeTime from 'dayjs/plugin/relativeTime' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { withAuth } from 'hooks/misc/withAuth' -import { DOCS_URL } from 'lib/constants' import { Clock, Download, FileArchive, Send } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' @@ -52,7 +39,20 @@ import { import { ProjectLayout } from '../ProjectLayout' import EdgeFunctionsLayout from './EdgeFunctionsLayout' +import { useIsAPIDocsSidePanelEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import { EdgeFunctionTesterSheet } from '@/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionTesterSheet' +import { APIDocsButton } from '@/components/ui/APIDocsButton' import CopyButton from '@/components/ui/CopyButton' +import { DocsButton } from '@/components/ui/DocsButton' +import NoPermission from '@/components/ui/NoPermission' +import { useProjectApiUrl } from '@/data/config/project-endpoint-query' +import { useEdgeFunctionBodyQuery } from '@/data/edge-functions/edge-function-body-query' +import { useEdgeFunctionQuery } from '@/data/edge-functions/edge-function-query' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { withAuth } from '@/hooks/misc/withAuth' +import { DOCS_URL } from '@/lib/constants' dayjs.extend(relativeTime) diff --git a/apps/studio/components/layouts/EdgeFunctionsLayout/EdgeFunctions.Commands.tsx b/apps/studio/components/layouts/EdgeFunctionsLayout/EdgeFunctions.Commands.tsx index 1c447f1c19..a96a4c7225 100644 --- a/apps/studio/components/layouts/EdgeFunctionsLayout/EdgeFunctions.Commands.tsx +++ b/apps/studio/components/layouts/EdgeFunctionsLayout/EdgeFunctions.Commands.tsx @@ -1,8 +1,9 @@ import { useParams } from 'common' -import { COMMAND_MENU_SECTIONS } from 'components/interfaces/App/CommandMenu/CommandMenu.utils' import type { CommandOptions } from 'ui-patterns/CommandMenu' import { useRegisterCommands } from 'ui-patterns/CommandMenu' +import { COMMAND_MENU_SECTIONS } from '@/components/interfaces/App/CommandMenu/CommandMenu.utils' + export function useFunctionsGotoCommands(options?: CommandOptions) { let { ref } = useParams() ref ||= '_' diff --git a/apps/studio/components/layouts/EdgeFunctionsLayout/EdgeFunctionsLayout.tsx b/apps/studio/components/layouts/EdgeFunctionsLayout/EdgeFunctionsLayout.tsx index 3da3e6bd11..cd06752a18 100644 --- a/apps/studio/components/layouts/EdgeFunctionsLayout/EdgeFunctionsLayout.tsx +++ b/apps/studio/components/layouts/EdgeFunctionsLayout/EdgeFunctionsLayout.tsx @@ -1,10 +1,10 @@ import { useParams } from 'common' -import { ProductMenu } from 'components/ui/ProductMenu' -import { withAuth } from 'hooks/misc/withAuth' import { useRouter } from 'next/router' import type { ComponentProps, PropsWithChildren } from 'react' import { ProjectLayout } from '../ProjectLayout' +import { ProductMenu } from '@/components/ui/ProductMenu' +import { withAuth } from '@/hooks/misc/withAuth' export const EdgeFunctionsProductMenu = () => { const { ref: projectRef = 'default' } = useParams() diff --git a/apps/studio/components/layouts/Integrations/IntegrationsMenu.utils.ts b/apps/studio/components/layouts/Integrations/IntegrationsMenu.utils.ts index 995a7164f3..6dd20f5d60 100644 --- a/apps/studio/components/layouts/Integrations/IntegrationsMenu.utils.ts +++ b/apps/studio/components/layouts/Integrations/IntegrationsMenu.utils.ts @@ -1,4 +1,4 @@ -import type { ProductMenuGroup } from 'components/ui/ProductMenu/ProductMenu.types' +import type { ProductMenuGroup } from '@/components/ui/ProductMenu/ProductMenu.types' export function generateIntegrationsMenu({ projectRef, diff --git a/apps/studio/components/layouts/Integrations/IntegrationsProductMenu.tsx b/apps/studio/components/layouts/Integrations/IntegrationsProductMenu.tsx index 91ec564fad..151c341463 100644 --- a/apps/studio/components/layouts/Integrations/IntegrationsProductMenu.tsx +++ b/apps/studio/components/layouts/Integrations/IntegrationsProductMenu.tsx @@ -1,17 +1,17 @@ import { useParams } from 'common' -import { useInstalledIntegrations } from 'components/interfaces/Integrations/Landing/useInstalledIntegrations' -import AlertError from 'components/ui/AlertError' -import { ProductMenu } from 'components/ui/ProductMenu' -import { ProductMenuItem } from 'components/ui/ProductMenu/ProductMenuItem' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { getPathnameWithoutQuery } from 'lib/pathname.utils' import { useRouter } from 'next/router' import { Menu, Separator } from 'ui' import { GenericSkeletonLoader } from 'ui-patterns' import { getCategoryParamFromAsPath, getIntegrationsPageFromPathname } from './Integrations.utils' import { generateIntegrationsMenu } from './IntegrationsMenu.utils' +import { useInstalledIntegrations } from '@/components/interfaces/Integrations/Landing/useInstalledIntegrations' +import AlertError from '@/components/ui/AlertError' +import { ProductMenu } from '@/components/ui/ProductMenu' +import { ProductMenuItem } from '@/components/ui/ProductMenu/ProductMenuItem' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { getPathnameWithoutQuery } from '@/lib/pathname.utils' export function IntegrationsProductMenu() { const router = useRouter() diff --git a/apps/studio/components/layouts/IntegrationsLayout/IntegrationWindowLayout.tsx b/apps/studio/components/layouts/IntegrationsLayout/IntegrationWindowLayout.tsx index 621e1b2c08..b28f328c07 100644 --- a/apps/studio/components/layouts/IntegrationsLayout/IntegrationWindowLayout.tsx +++ b/apps/studio/components/layouts/IntegrationsLayout/IntegrationWindowLayout.tsx @@ -1,11 +1,11 @@ -import Link from 'next/link' -import { PropsWithChildren, ReactNode, forwardRef } from 'react' -import { LoadingLine, cn } from 'ui' - -import { withAuth } from 'hooks/misc/withAuth' -import { BASE_PATH } from 'lib/constants' import { Book, LifeBuoy, X } from 'lucide-react' +import Link from 'next/link' +import { forwardRef, PropsWithChildren, ReactNode } from 'react' +import { cn, LoadingLine } from 'ui' + import { ScaffoldContainer } from '../Scaffold' +import { withAuth } from '@/hooks/misc/withAuth' +import { BASE_PATH } from '@/lib/constants' export type IntegrationWindowLayoutProps = { title: string diff --git a/apps/studio/components/layouts/IntegrationsLayout/Integrations.Commands.tsx b/apps/studio/components/layouts/IntegrationsLayout/Integrations.Commands.tsx index 6a775092ea..0cecc765c3 100644 --- a/apps/studio/components/layouts/IntegrationsLayout/Integrations.Commands.tsx +++ b/apps/studio/components/layouts/IntegrationsLayout/Integrations.Commands.tsx @@ -1,13 +1,14 @@ import { useParams } from 'common' -import { COMMAND_MENU_SECTIONS } from 'components/interfaces/App/CommandMenu/CommandMenu.utils' -import { orderCommandSectionsByPriority } from 'components/interfaces/App/CommandMenu/ordering' +import type { CommandOptions } from 'ui-patterns/CommandMenu' +import { useRegisterCommands } from 'ui-patterns/CommandMenu' + +import { COMMAND_MENU_SECTIONS } from '@/components/interfaces/App/CommandMenu/CommandMenu.utils' +import { orderCommandSectionsByPriority } from '@/components/interfaces/App/CommandMenu/ordering' import { IntegrationDefinition, INTEGRATIONS, -} from 'components/interfaces/Integrations/Landing/Integrations.constants' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import type { CommandOptions } from 'ui-patterns/CommandMenu' -import { useRegisterCommands } from 'ui-patterns/CommandMenu' +} from '@/components/interfaces/Integrations/Landing/Integrations.constants' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' export function useIntegrationsGotoCommands(options?: CommandOptions) { let { ref } = useParams() diff --git a/apps/studio/components/layouts/IntegrationsLayout/Integrations.utils.ts b/apps/studio/components/layouts/IntegrationsLayout/Integrations.utils.ts index 33e016388f..9c39346206 100644 --- a/apps/studio/components/layouts/IntegrationsLayout/Integrations.utils.ts +++ b/apps/studio/components/layouts/IntegrationsLayout/Integrations.utils.ts @@ -1,6 +1,6 @@ -import type { IntegrationsData } from 'data/integrations/integrations-query' -import type { IntegrationName } from 'data/integrations/integrations.types' -import type { Organization } from 'types' +import type { IntegrationsData } from '@/data/integrations/integrations-query' +import type { IntegrationName } from '@/data/integrations/integrations.types' +import type { Organization } from '@/types' export function getHasInstalledObject({ integrationName, diff --git a/apps/studio/components/layouts/IntegrationsLayout/VercelIntegrationWindowLayout.tsx b/apps/studio/components/layouts/IntegrationsLayout/VercelIntegrationWindowLayout.tsx index 9f27291892..124f071984 100644 --- a/apps/studio/components/layouts/IntegrationsLayout/VercelIntegrationWindowLayout.tsx +++ b/apps/studio/components/layouts/IntegrationsLayout/VercelIntegrationWindowLayout.tsx @@ -1,10 +1,10 @@ +import { useParams } from 'common' import { PropsWithChildren } from 'react' import InlineSVG from 'react-inlinesvg' -import { useParams } from 'common' -import { BASE_PATH } from 'lib/constants' import IntegrationWindowLayout from './IntegrationWindowLayout' -import { useIntegrationInstallationSnapshot } from 'state/integration-installation' +import { BASE_PATH } from '@/lib/constants' +import { useIntegrationInstallationSnapshot } from '@/state/integration-installation' const VERCEL_ICON = (
diff --git a/apps/studio/components/layouts/JWTKeys/JWTKeysLayout.tsx b/apps/studio/components/layouts/JWTKeys/JWTKeysLayout.tsx index 7b004ca2b3..8d8c0e6949 100644 --- a/apps/studio/components/layouts/JWTKeys/JWTKeysLayout.tsx +++ b/apps/studio/components/layouts/JWTKeys/JWTKeysLayout.tsx @@ -1,8 +1,8 @@ -import { PageLayout } from 'components/layouts/PageLayout/PageLayout' -import { ScaffoldContainer } from 'components/layouts/Scaffold' +import { useParams } from 'common' import { PropsWithChildren } from 'react' -import { useParams } from 'common' +import { PageLayout } from '@/components/layouts/PageLayout/PageLayout' +import { ScaffoldContainer } from '@/components/layouts/Scaffold' const JWTKeysLayout = ({ children }: PropsWithChildren) => { const { ref: projectRef } = useParams() diff --git a/apps/studio/components/layouts/LinkAwsMarketplaceLayout.tsx b/apps/studio/components/layouts/LinkAwsMarketplaceLayout.tsx index 1f14f57b65..3a4df75721 100644 --- a/apps/studio/components/layouts/LinkAwsMarketplaceLayout.tsx +++ b/apps/studio/components/layouts/LinkAwsMarketplaceLayout.tsx @@ -1,11 +1,12 @@ -import { useCustomContent } from 'hooks/custom-content/useCustomContent' -import { BASE_PATH } from 'lib/constants' import { useTheme } from 'next-themes' import Head from 'next/head' import Image from 'next/legacy/image' import type { PropsWithChildren } from 'react' import { Separator } from 'ui' + import { withAuth } from '../../hooks/misc/withAuth' +import { useCustomContent } from '@/hooks/custom-content/useCustomContent' +import { BASE_PATH } from '@/lib/constants' export interface LinkAwsMarketplaceLayoutProps {} diff --git a/apps/studio/components/layouts/LogsLayout/Logs.Commands.tsx b/apps/studio/components/layouts/LogsLayout/Logs.Commands.tsx index d6fd444e8d..f1cd1dfaa1 100644 --- a/apps/studio/components/layouts/LogsLayout/Logs.Commands.tsx +++ b/apps/studio/components/layouts/LogsLayout/Logs.Commands.tsx @@ -1,10 +1,11 @@ import { useParams } from 'common' -import { COMMAND_MENU_SECTIONS } from 'components/interfaces/App/CommandMenu/CommandMenu.utils' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import type { CommandOptions } from 'ui-patterns/CommandMenu' import { useRegisterCommands } from 'ui-patterns/CommandMenu' import { IRouteCommand } from 'ui-patterns/CommandMenu/internal/types' +import { COMMAND_MENU_SECTIONS } from '@/components/interfaces/App/CommandMenu/CommandMenu.utils' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' + export function useLogsGotoCommands(options?: CommandOptions) { let { ref } = useParams() ref ||= '_' diff --git a/apps/studio/components/layouts/LogsLayout/LogsLayout.tsx b/apps/studio/components/layouts/LogsLayout/LogsLayout.tsx index bcf845096c..1fa0957006 100644 --- a/apps/studio/components/layouts/LogsLayout/LogsLayout.tsx +++ b/apps/studio/components/layouts/LogsLayout/LogsLayout.tsx @@ -1,11 +1,11 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' -import NoPermission from 'components/ui/NoPermission' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { withAuth } from 'hooks/misc/withAuth' import { PropsWithChildren } from 'react' import { ProjectLayout } from '../ProjectLayout' import { LogsSidebarMenuV2 } from './LogsSidebarMenuV2' +import NoPermission from '@/components/ui/NoPermission' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { withAuth } from '@/hooks/misc/withAuth' interface LogsLayoutProps { title: string diff --git a/apps/studio/components/layouts/LogsLayout/LogsSidebarMenuV2.tsx b/apps/studio/components/layouts/LogsLayout/LogsSidebarMenuV2.tsx index d4e647a5d2..2c67de6fb0 100644 --- a/apps/studio/components/layouts/LogsLayout/LogsSidebarMenuV2.tsx +++ b/apps/studio/components/layouts/LogsLayout/LogsSidebarMenuV2.tsx @@ -1,17 +1,4 @@ import { IS_PLATFORM, useFlag, useParams } from 'common' -import { - useFeaturePreviewModal, - useUnifiedLogsPreview, -} from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' -import { useIsETLPrivateAlpha } from 'components/interfaces/Database/Replication/useIsETLPrivateAlpha' -import { LOG_DRAIN_TYPES } from 'components/interfaces/LogDrains/LogDrains.constants' -import SavedQueriesItem from 'components/interfaces/Settings/Logs/Logs.SavedQueriesItem' -import { LogsSidebarItem } from 'components/interfaces/Settings/Logs/SidebarV2/SidebarItem' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useContentQuery } from 'data/content/content-query' -import { useReplicationSourcesQuery } from 'data/replication/sources-query' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import { ChevronRight, CircleHelpIcon, Plus } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' @@ -34,6 +21,19 @@ import { import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { FeaturePreviewSidebarPanel } from '../../ui/FeaturePreviewSidebarPanel' +import { + useFeaturePreviewModal, + useUnifiedLogsPreview, +} from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import { useIsETLPrivateAlpha } from '@/components/interfaces/Database/Replication/useIsETLPrivateAlpha' +import { LOG_DRAIN_TYPES } from '@/components/interfaces/LogDrains/LogDrains.constants' +import SavedQueriesItem from '@/components/interfaces/Settings/Logs/Logs.SavedQueriesItem' +import { LogsSidebarItem } from '@/components/interfaces/Settings/Logs/SidebarV2/SidebarItem' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useContentQuery } from '@/data/content/content-query' +import { useReplicationSourcesQuery } from '@/data/replication/sources-query' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' const SupaIcon = ({ className }: { className?: string }) => { return ( diff --git a/apps/studio/components/layouts/Navigation/FloatingMobileToolbar/FloatingMobileToolbar.tsx b/apps/studio/components/layouts/Navigation/FloatingMobileToolbar/FloatingMobileToolbar.tsx index db5dd46ba4..27219872f7 100644 --- a/apps/studio/components/layouts/Navigation/FloatingMobileToolbar/FloatingMobileToolbar.tsx +++ b/apps/studio/components/layouts/Navigation/FloatingMobileToolbar/FloatingMobileToolbar.tsx @@ -1,10 +1,4 @@ import { useParams, useViewport } from 'common' -import { AdvisorButton } from 'components/layouts/AppLayout/AdvisorButton' -import { AssistantButton } from 'components/layouts/AppLayout/AssistantButton' -import { InlineEditorButton } from 'components/layouts/AppLayout/InlineEditorButton' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { HelpButton } from 'components/ui/HelpPanel/HelpButton' import { AnimatePresence } from 'framer-motion' import { Menu, Search, X } from 'lucide-react' import { useRef } from 'react' @@ -15,6 +9,12 @@ import { useFloatingToolbarDrag } from './useFloatingToolbarDrag' import { useFloatingToolbarNavSize } from './useFloatingToolbarNavSize' import { useFloatingToolbarSheet } from './useFloatingToolbarSheet' import { useFloatingToolbarSidebarClick } from './useFloatingToolbarSidebarClick' +import { AdvisorButton } from '@/components/layouts/AppLayout/AdvisorButton' +import { AssistantButton } from '@/components/layouts/AppLayout/AssistantButton' +import { InlineEditorButton } from '@/components/layouts/AppLayout/InlineEditorButton' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { HelpButton } from '@/components/ui/HelpPanel/HelpButton' export const FloatingMobileToolbar = ({ hideMobileMenu }: { hideMobileMenu?: boolean }) => { const navRef = useRef(null) diff --git a/apps/studio/components/layouts/Navigation/FloatingMobileToolbar/FloatingMobileToolbar.utils.test.ts b/apps/studio/components/layouts/Navigation/FloatingMobileToolbar/FloatingMobileToolbar.utils.test.ts index 1ff0f77693..72d80284e4 100644 --- a/apps/studio/components/layouts/Navigation/FloatingMobileToolbar/FloatingMobileToolbar.utils.test.ts +++ b/apps/studio/components/layouts/Navigation/FloatingMobileToolbar/FloatingMobileToolbar.utils.test.ts @@ -2,8 +2,8 @@ import { describe, expect, it } from 'vitest' import { clampPosition, - getToolbarStyle, getNextPosition, + getToolbarStyle, isMenuContent, shouldShowMenuButton, } from './FloatingMobileToolbar.utils' diff --git a/apps/studio/components/layouts/Navigation/FloatingMobileToolbar/useFloatingToolbarSheet.tsx b/apps/studio/components/layouts/Navigation/FloatingMobileToolbar/useFloatingToolbarSheet.tsx index 57d4cce8a3..8e3171edc2 100644 --- a/apps/studio/components/layouts/Navigation/FloatingMobileToolbar/useFloatingToolbarSheet.tsx +++ b/apps/studio/components/layouts/Navigation/FloatingMobileToolbar/useFloatingToolbarSheet.tsx @@ -1,9 +1,9 @@ import { useRouter } from 'next/router' import { useCallback } from 'react' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { useMobileSheet } from '../NavigationBar/MobileSheetContext' import { isMenuContent, shouldShowMenuButton } from './FloatingMobileToolbar.utils' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' export function useFloatingToolbarSheet(hideMobileMenu?: boolean) { const router = useRouter() diff --git a/apps/studio/components/layouts/Navigation/FloatingMobileToolbar/useFloatingToolbarSidebarClick.ts b/apps/studio/components/layouts/Navigation/FloatingMobileToolbar/useFloatingToolbarSidebarClick.ts index d41d0caad8..02fd41c20e 100644 --- a/apps/studio/components/layouts/Navigation/FloatingMobileToolbar/useFloatingToolbarSidebarClick.ts +++ b/apps/studio/components/layouts/Navigation/FloatingMobileToolbar/useFloatingToolbarSidebarClick.ts @@ -1,7 +1,7 @@ import { useCallback } from 'react' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { useMobileSheet } from '../NavigationBar/MobileSheetContext' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' export function useFloatingToolbarSidebarClick() { const { setContent: setSheetContent } = useMobileSheet() diff --git a/apps/studio/components/layouts/Navigation/LayoutHeader/FeedbackDropdown/FeedbackDropdown.tsx b/apps/studio/components/layouts/Navigation/LayoutHeader/FeedbackDropdown/FeedbackDropdown.tsx index 664a1ec77d..7e326d0431 100644 --- a/apps/studio/components/layouts/Navigation/LayoutHeader/FeedbackDropdown/FeedbackDropdown.tsx +++ b/apps/studio/components/layouts/Navigation/LayoutHeader/FeedbackDropdown/FeedbackDropdown.tsx @@ -1,15 +1,7 @@ import { IS_PLATFORM } from 'common' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { ASSISTANT_SUGGESTIONS } from 'components/ui/HelpPanel/HelpPanel.constants' -import { getSupportLinkQueryParams } from 'components/ui/HelpPanel/HelpPanel.utils' -import { HelpSection } from 'components/ui/HelpPanel/HelpSection' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Lightbulb, TriangleAlert } from 'lucide-react' import { useRouter } from 'next/router' import { useState } from 'react' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { Button, Popover_Shadcn_, @@ -19,6 +11,14 @@ import { } from 'ui' import { FeedbackWidget } from './FeedbackWidget' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { ASSISTANT_SUGGESTIONS } from '@/components/ui/HelpPanel/HelpPanel.constants' +import { getSupportLinkQueryParams } from '@/components/ui/HelpPanel/HelpPanel.utils' +import { HelpSection } from '@/components/ui/HelpPanel/HelpSection' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' export const FeedbackDropdown = ({ className }: { className?: string }) => { const router = useRouter() diff --git a/apps/studio/components/layouts/Navigation/LayoutHeader/FeedbackDropdown/FeedbackDropdown.utils.ts b/apps/studio/components/layouts/Navigation/LayoutHeader/FeedbackDropdown/FeedbackDropdown.utils.ts index 3430de3566..3fe7728dc9 100644 --- a/apps/studio/components/layouts/Navigation/LayoutHeader/FeedbackDropdown/FeedbackDropdown.utils.ts +++ b/apps/studio/components/layouts/Navigation/LayoutHeader/FeedbackDropdown/FeedbackDropdown.utils.ts @@ -1,6 +1,6 @@ -import { createSupportStorageClient } from 'components/interfaces/Support/support-storage-client' -import { generateAttachmentURLs } from 'data/support/generate-attachment-urls-mutation' -import { uuidv4 } from 'lib/helpers' +import { createSupportStorageClient } from '@/components/interfaces/Support/support-storage-client' +import { generateAttachmentURLs } from '@/data/support/generate-attachment-urls-mutation' +import { uuidv4 } from '@/lib/helpers' export const convertB64toBlob = (image: string) => { const contentType = 'image/png' diff --git a/apps/studio/components/layouts/Navigation/LayoutHeader/FeedbackDropdown/FeedbackWidget.tsx b/apps/studio/components/layouts/Navigation/LayoutHeader/FeedbackDropdown/FeedbackWidget.tsx index 0275094680..d5424834b6 100644 --- a/apps/studio/components/layouts/Navigation/LayoutHeader/FeedbackDropdown/FeedbackWidget.tsx +++ b/apps/studio/components/layouts/Navigation/LayoutHeader/FeedbackDropdown/FeedbackWidget.tsx @@ -1,21 +1,11 @@ import { useDebounce } from '@uidotdev/usehooks' +import { LOCAL_STORAGE_KEYS, useParams } from 'common' import { AnimatePresence, motion } from 'framer-motion' import { toPng } from 'html-to-image' import { Camera, CircleCheck, HelpCircle, Image as ImageIcon, Upload, X } from 'lucide-react' import { useRouter } from 'next/router' import { ChangeEvent, useEffect, useRef, useState } from 'react' import { toast } from 'sonner' - -import { LOCAL_STORAGE_KEYS, useParams } from 'common' -import { InlineLinkClassName } from 'components/ui/InlineLink' -import { SupportLink } from 'components/interfaces/Support/SupportLink' -import { useFeedbackCategoryQuery } from 'data/feedback/feedback-category' -import { useSendFeedbackMutation } from 'data/feedback/feedback-send' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { timeout } from 'lib/helpers' -import { useProfile } from 'lib/profile' import { Button, cn, @@ -28,11 +18,21 @@ import { TextArea_Shadcn_, } from 'ui' import { Admonition } from 'ui-patterns' + import { convertB64toBlob, isLikelySupportRequest, uploadAttachment, } from './FeedbackDropdown.utils' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' +import { InlineLinkClassName } from '@/components/ui/InlineLink' +import { useFeedbackCategoryQuery } from '@/data/feedback/feedback-category' +import { useSendFeedbackMutation } from '@/data/feedback/feedback-send' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { timeout } from '@/lib/helpers' +import { useProfile } from '@/lib/profile' interface FeedbackWidgetProps { onClose: () => void diff --git a/apps/studio/components/layouts/Navigation/LayoutHeader/HomeIcon.tsx b/apps/studio/components/layouts/Navigation/LayoutHeader/HomeIcon.tsx index 2613ab8be7..140a5b3a74 100644 --- a/apps/studio/components/layouts/Navigation/LayoutHeader/HomeIcon.tsx +++ b/apps/studio/components/layouts/Navigation/LayoutHeader/HomeIcon.tsx @@ -1,13 +1,14 @@ import { LOCAL_STORAGE_KEYS } from 'common' -import { useOrganizationsQuery } from 'data/organizations/organizations-query' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { IS_PLATFORM } from 'lib/constants' import Link from 'next/link' import { useRouter } from 'next/router' import { cn } from 'ui' +import { useOrganizationsQuery } from '@/data/organizations/organizations-query' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { IS_PLATFORM } from '@/lib/constants' + export const HomeIcon = ({ className }: { className?: string }) => { const { data: selectedOrganization } = useSelectedOrganizationQuery() const { data: organizations } = useOrganizationsQuery() diff --git a/apps/studio/components/layouts/Navigation/LayoutHeader/LayoutHeader.tsx b/apps/studio/components/layouts/Navigation/LayoutHeader/LayoutHeader.tsx index 7fb67146ab..44ea0d757f 100644 --- a/apps/studio/components/layouts/Navigation/LayoutHeader/LayoutHeader.tsx +++ b/apps/studio/components/layouts/Navigation/LayoutHeader/LayoutHeader.tsx @@ -1,28 +1,7 @@ import { LOCAL_STORAGE_KEYS, useParams } from 'common' -import { - useIsBranching2Enabled, - useIsFloatingMobileToolbarEnabled, -} from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' -import { ConnectButton } from 'components/interfaces/ConnectButton/ConnectButton' -import { ConnectSheet } from 'components/interfaces/ConnectSheet/ConnectSheet' -import { LocalDropdown } from 'components/interfaces/LocalDropdown' -import { UserDropdown } from 'components/interfaces/UserDropdown' -import { AdvisorButton } from 'components/layouts/AppLayout/AdvisorButton' -import { AssistantButton } from 'components/layouts/AppLayout/AssistantButton' -import { BranchDropdown } from 'components/layouts/AppLayout/BranchDropdown' -import { InlineEditorButton } from 'components/layouts/AppLayout/InlineEditorButton' -import { OrganizationDropdown } from 'components/layouts/AppLayout/OrganizationDropdown' -import { ProjectDropdown } from 'components/layouts/AppLayout/ProjectDropdown' -import { HelpButton } from 'components/ui/HelpPanel/HelpButton' -import { getResourcesExceededLimitsOrg } from 'components/ui/OveragesBanner/OveragesBanner.utils' -import { useOrgUsageQuery } from 'data/usage/org-usage-query' import dayjs from 'dayjs' import { DevToolbarTrigger } from 'dev-tools' import { AnimatePresence, motion } from 'framer-motion' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { IS_PLATFORM } from 'lib/constants' import { ChevronLeft } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' @@ -35,6 +14,27 @@ import { FeedbackDropdown } from './FeedbackDropdown/FeedbackDropdown' import { HomeIcon } from './HomeIcon' import { LocalVersionPopover } from './LocalVersionPopover' import { MergeRequestButton } from './MergeRequestButton' +import { + useIsBranching2Enabled, + useIsFloatingMobileToolbarEnabled, +} from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import { ConnectButton } from '@/components/interfaces/ConnectButton/ConnectButton' +import { ConnectSheet } from '@/components/interfaces/ConnectSheet/ConnectSheet' +import { LocalDropdown } from '@/components/interfaces/LocalDropdown' +import { UserDropdown } from '@/components/interfaces/UserDropdown' +import { AdvisorButton } from '@/components/layouts/AppLayout/AdvisorButton' +import { AssistantButton } from '@/components/layouts/AppLayout/AssistantButton' +import { BranchDropdown } from '@/components/layouts/AppLayout/BranchDropdown' +import { InlineEditorButton } from '@/components/layouts/AppLayout/InlineEditorButton' +import { OrganizationDropdown } from '@/components/layouts/AppLayout/OrganizationDropdown' +import { ProjectDropdown } from '@/components/layouts/AppLayout/ProjectDropdown' +import { HelpButton } from '@/components/ui/HelpPanel/HelpButton' +import { getResourcesExceededLimitsOrg } from '@/components/ui/OveragesBanner/OveragesBanner.utils' +import { useOrgUsageQuery } from '@/data/usage/org-usage-query' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { IS_PLATFORM } from '@/lib/constants' const LayoutHeaderDivider = ({ className, ...props }: React.HTMLProps) => ( diff --git a/apps/studio/components/layouts/Navigation/LayoutHeader/LocalVersionPopover.test.ts b/apps/studio/components/layouts/Navigation/LayoutHeader/LocalVersionPopover.test.ts index 605592f0f2..7288c17190 100644 --- a/apps/studio/components/layouts/Navigation/LayoutHeader/LocalVersionPopover.test.ts +++ b/apps/studio/components/layouts/Navigation/LayoutHeader/LocalVersionPopover.test.ts @@ -1,4 +1,5 @@ import { describe, expect, test } from 'vitest' + import { semverGte, semverLte } from './LocalVersionPopover.utils' describe('LocalVersionPopover.utils:semverLte', () => { diff --git a/apps/studio/components/layouts/Navigation/LayoutHeader/MergeRequestButton.tsx b/apps/studio/components/layouts/Navigation/LayoutHeader/MergeRequestButton.tsx index 9490a9324d..7c56a41869 100644 --- a/apps/studio/components/layouts/Navigation/LayoutHeader/MergeRequestButton.tsx +++ b/apps/studio/components/layouts/Navigation/LayoutHeader/MergeRequestButton.tsx @@ -1,14 +1,15 @@ import { useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useBranchUpdateMutation } from 'data/branches/branch-update-mutation' -import { useBranchesQuery } from 'data/branches/branches-query' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { GitMerge } from 'lucide-react' import { useRouter } from 'next/router' import { toast } from 'sonner' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useBranchUpdateMutation } from '@/data/branches/branch-update-mutation' +import { useBranchesQuery } from '@/data/branches/branches-query' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' + export const MergeRequestButton = () => { const { ref } = useParams() const router = useRouter() diff --git a/apps/studio/components/layouts/Navigation/NavigationBar/CommandOption.tsx b/apps/studio/components/layouts/Navigation/NavigationBar/CommandOption.tsx index 5e56cc9651..8cde14b7b6 100644 --- a/apps/studio/components/layouts/Navigation/NavigationBar/CommandOption.tsx +++ b/apps/studio/components/layouts/Navigation/NavigationBar/CommandOption.tsx @@ -1,9 +1,9 @@ import { Command } from 'lucide-react' import { ReactNode } from 'react' - -import { detectOS } from 'lib/helpers' import { cn } from 'ui' +import { detectOS } from '@/lib/helpers' + interface CommandOptionProps { icon: ReactNode label: string diff --git a/apps/studio/components/layouts/Navigation/NavigationBar/MobileNavigationBar.tsx b/apps/studio/components/layouts/Navigation/NavigationBar/MobileNavigationBar.tsx index 112a4224e5..e913295d49 100644 --- a/apps/studio/components/layouts/Navigation/NavigationBar/MobileNavigationBar.tsx +++ b/apps/studio/components/layouts/Navigation/NavigationBar/MobileNavigationBar.tsx @@ -1,13 +1,4 @@ import { useParams } from 'common' -import { useIsFloatingMobileToolbarEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' -import { ConnectButton } from 'components/interfaces/ConnectButton/ConnectButton' -import { LocalDropdown } from 'components/interfaces/LocalDropdown' -import { SidebarContent } from 'components/interfaces/Sidebar' -import { UserDropdown } from 'components/interfaces/UserDropdown' -import { FloatingMobileToolbar } from 'components/layouts/Navigation/FloatingMobileToolbar/FloatingMobileToolbar' -import { useOrganizationsQuery } from 'data/organizations/organizations-query' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { IS_PLATFORM } from 'lib/constants' import { ChevronLeft, Menu, Search } from 'lucide-react' import Link from 'next/link' import { useState } from 'react' @@ -18,6 +9,15 @@ import { HomeIcon } from '../LayoutHeader/HomeIcon' import { useMobileSheet } from './MobileSheetContext' import { OrgSelector } from './OrgSelector' import { ProjectBranchSelector } from './ProjectBranchSelector' +import { useIsFloatingMobileToolbarEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import { ConnectButton } from '@/components/interfaces/ConnectButton/ConnectButton' +import { LocalDropdown } from '@/components/interfaces/LocalDropdown' +import { SidebarContent } from '@/components/interfaces/Sidebar' +import { UserDropdown } from '@/components/interfaces/UserDropdown' +import { FloatingMobileToolbar } from '@/components/layouts/Navigation/FloatingMobileToolbar/FloatingMobileToolbar' +import { useOrganizationsQuery } from '@/data/organizations/organizations-query' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { IS_PLATFORM } from '@/lib/constants' export const ICON_SIZE = 20 export const ICON_STROKE_WIDTH = 1.5 diff --git a/apps/studio/components/layouts/Navigation/NavigationBar/MobileViewNav.tsx b/apps/studio/components/layouts/Navigation/NavigationBar/MobileViewNav.tsx index 71dd9e7d3e..a0af1ff917 100644 --- a/apps/studio/components/layouts/Navigation/NavigationBar/MobileViewNav.tsx +++ b/apps/studio/components/layouts/Navigation/NavigationBar/MobileViewNav.tsx @@ -1,7 +1,8 @@ import { PropsWithChildren } from 'react' -import { useAppStateSnapshot } from 'state/app-state' import { cn } from 'ui' +import { useAppStateSnapshot } from '@/state/app-state' + interface Props { title?: string } diff --git a/apps/studio/components/layouts/Navigation/NavigationBar/NavigationBar.utils.test.tsx b/apps/studio/components/layouts/Navigation/NavigationBar/NavigationBar.utils.test.tsx index 4518c37011..343838d251 100644 --- a/apps/studio/components/layouts/Navigation/NavigationBar/NavigationBar.utils.test.tsx +++ b/apps/studio/components/layouts/Navigation/NavigationBar/NavigationBar.utils.test.tsx @@ -1,4 +1,3 @@ -import type { Project } from 'data/projects/project-detail-query' import { describe, expect, it } from 'vitest' import { @@ -7,6 +6,7 @@ import { generateSettingsRoutes, generateToolRoutes, } from './NavigationBar.utils' +import type { Project } from '@/data/projects/project-detail-query' const REF = 'test-project-ref' diff --git a/apps/studio/components/layouts/Navigation/NavigationBar/NavigationBar.utils.tsx b/apps/studio/components/layouts/Navigation/NavigationBar/NavigationBar.utils.tsx index 1b2021d128..0139208b17 100644 --- a/apps/studio/components/layouts/Navigation/NavigationBar/NavigationBar.utils.tsx +++ b/apps/studio/components/layouts/Navigation/NavigationBar/NavigationBar.utils.tsx @@ -1,11 +1,12 @@ -import { ICON_SIZE, ICON_STROKE_WIDTH } from 'components/interfaces/Sidebar' -import type { Route } from 'components/ui/ui.types' -import { EditorIndexPageLink } from 'data/prefetchers/project.$ref.editor' -import type { Project } from 'data/projects/project-detail-query' import { Auth, Database, EdgeFunctions, Realtime, SqlEditor, Storage, TableEditor } from 'icons' -import { IS_PLATFORM, PROJECT_STATUS } from 'lib/constants' import { Blocks, FileText, Lightbulb, List, Settings, Telescope } from 'lucide-react' +import { ICON_SIZE, ICON_STROKE_WIDTH } from '@/components/interfaces/Sidebar' +import type { Route } from '@/components/ui/ui.types' +import { EditorIndexPageLink } from '@/data/prefetchers/project.$ref.editor' +import type { Project } from '@/data/projects/project-detail-query' +import { IS_PLATFORM, PROJECT_STATUS } from '@/lib/constants' + interface RouteContext { ref?: string isProjectActive: boolean diff --git a/apps/studio/components/layouts/Navigation/NavigationBar/NavigationIconButton.tsx b/apps/studio/components/layouts/Navigation/NavigationBar/NavigationIconButton.tsx index f974fedd9c..976c360991 100644 --- a/apps/studio/components/layouts/Navigation/NavigationBar/NavigationIconButton.tsx +++ b/apps/studio/components/layouts/Navigation/NavigationBar/NavigationIconButton.tsx @@ -1,4 +1,4 @@ -import { ComponentProps, ReactNode, forwardRef } from 'react' +import { ComponentProps, forwardRef, ReactNode } from 'react' import { Button, cn } from 'ui' export const NavigationIconButton = forwardRef< diff --git a/apps/studio/components/layouts/Navigation/NavigationBar/NavigationIconLink.tsx b/apps/studio/components/layouts/Navigation/NavigationBar/NavigationIconLink.tsx index 4316d1eb98..40fe102459 100644 --- a/apps/studio/components/layouts/Navigation/NavigationBar/NavigationIconLink.tsx +++ b/apps/studio/components/layouts/Navigation/NavigationBar/NavigationIconLink.tsx @@ -1,3 +1,4 @@ +import { LOCAL_STORAGE_KEYS } from 'common' import { noop } from 'lodash' import Link from 'next/link' import { @@ -9,9 +10,8 @@ import { } from 'react' import { cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' -import type { Route } from 'components/ui/ui.types' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { LOCAL_STORAGE_KEYS } from 'common' +import type { Route } from '@/components/ui/ui.types' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' interface NavigationIconButtonProps extends AnchorHTMLAttributes { route: Route diff --git a/apps/studio/components/layouts/Navigation/NavigationBar/OrgSelector.tsx b/apps/studio/components/layouts/Navigation/NavigationBar/OrgSelector.tsx index cf068b9c98..53a3556b29 100644 --- a/apps/studio/components/layouts/Navigation/NavigationBar/OrgSelector.tsx +++ b/apps/studio/components/layouts/Navigation/NavigationBar/OrgSelector.tsx @@ -1,9 +1,4 @@ import { useBreakpoint, useParams } from 'common' -import { OrgCommandItem } from 'components/layouts/AppLayout/OrgCommandItem' -import { useOrganizationsQuery } from 'data/organizations/organizations-query' -import { useOrgProjectsInfiniteQuery } from 'data/projects/org-projects-infinite-query' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { Boxes, ChevronsUpDown, Plus } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' @@ -27,6 +22,11 @@ import { import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { OrgSelectorSheet } from './OrgSelectorSheet' +import { OrgCommandItem } from '@/components/layouts/AppLayout/OrgCommandItem' +import { useOrganizationsQuery } from '@/data/organizations/organizations-query' +import { useOrgProjectsInfiniteQuery } from '@/data/projects/org-projects-infinite-query' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' export function OrgSelector() { const router = useRouter() diff --git a/apps/studio/components/layouts/Navigation/NavigationBar/OrgSelectorSheet.tsx b/apps/studio/components/layouts/Navigation/NavigationBar/OrgSelectorSheet.tsx index 998ac1d391..dc4be78d26 100644 --- a/apps/studio/components/layouts/Navigation/NavigationBar/OrgSelectorSheet.tsx +++ b/apps/studio/components/layouts/Navigation/NavigationBar/OrgSelectorSheet.tsx @@ -1,6 +1,4 @@ -import { OrganizationDropdown } from 'components/layouts/AppLayout/OrganizationDropdown' import { Boxes } from 'lucide-react' -import type { Organization } from 'types' import { SheetHeader, SheetTitle, @@ -11,6 +9,9 @@ import { } from 'ui' import MobileSheetNav from 'ui-patterns/MobileSheetNav/MobileSheetNav' +import { OrganizationDropdown } from '@/components/layouts/AppLayout/OrganizationDropdown' +import type { Organization } from '@/types' + const embeddedClassName = 'bg-transparent border-0 shadow-none min-h-0 flex-1 flex flex-col overflow-hidden rounded-none' diff --git a/apps/studio/components/layouts/Navigation/NavigationBar/ProjectBranchSelector.tsx b/apps/studio/components/layouts/Navigation/NavigationBar/ProjectBranchSelector.tsx index d76c26adfc..5cdb3e75d2 100644 --- a/apps/studio/components/layouts/Navigation/NavigationBar/ProjectBranchSelector.tsx +++ b/apps/studio/components/layouts/Navigation/NavigationBar/ProjectBranchSelector.tsx @@ -1,9 +1,4 @@ import { useBreakpoint, useParams } from 'common' -import { useBranchesQuery } from 'data/branches/branches-query' -import { useProjectDetailQuery } from 'data/projects/project-detail-query' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { IS_PLATFORM } from 'lib/constants' import { useRouter } from 'next/router' import { useState } from 'react' import { @@ -20,6 +15,11 @@ import { getProjectBranchSelectorState } from './ProjectBranchSelector.utils' import { ProjectBranchSelectorPopover } from './ProjectBranchSelectorPopover' import { ProjectBranchSelectorSheet } from './ProjectBranchSelectorSheet' import { ProjectBranchSelectorTrigger } from './ProjectBranchSelectorTrigger' +import { useBranchesQuery } from '@/data/branches/branches-query' +import { useProjectDetailQuery } from '@/data/projects/project-detail-query' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { IS_PLATFORM } from '@/lib/constants' export function ProjectBranchSelector() { const router = useRouter() diff --git a/apps/studio/components/layouts/Navigation/NavigationBar/ProjectBranchSelector.utils.ts b/apps/studio/components/layouts/Navigation/NavigationBar/ProjectBranchSelector.utils.ts index fede88d68a..78b508839b 100644 --- a/apps/studio/components/layouts/Navigation/NavigationBar/ProjectBranchSelector.utils.ts +++ b/apps/studio/components/layouts/Navigation/NavigationBar/ProjectBranchSelector.utils.ts @@ -1,5 +1,5 @@ -import type { Branch } from 'data/branches/branches-query' -import type { Organization } from 'types' +import type { Branch } from '@/data/branches/branches-query' +import type { Organization } from '@/types' export interface ProjectBranchSelectorState { selectedBranch: Branch | undefined diff --git a/apps/studio/components/layouts/Navigation/NavigationBar/ProjectBranchSelectorPopover.tsx b/apps/studio/components/layouts/Navigation/NavigationBar/ProjectBranchSelectorPopover.tsx index c3e5f514a7..794601c762 100644 --- a/apps/studio/components/layouts/Navigation/NavigationBar/ProjectBranchSelectorPopover.tsx +++ b/apps/studio/components/layouts/Navigation/NavigationBar/ProjectBranchSelectorPopover.tsx @@ -1,6 +1,6 @@ -import { BranchDropdown } from 'components/layouts/AppLayout/BranchDropdown' -import { OrganizationDropdown } from 'components/layouts/AppLayout/OrganizationDropdown' -import { ProjectDropdown } from 'components/layouts/AppLayout/ProjectDropdown' +import { BranchDropdown } from '@/components/layouts/AppLayout/BranchDropdown' +import { OrganizationDropdown } from '@/components/layouts/AppLayout/OrganizationDropdown' +import { ProjectDropdown } from '@/components/layouts/AppLayout/ProjectDropdown' const embeddedClassName = 'bg-transparent border-0 shadow-none min-h-0 flex-1' diff --git a/apps/studio/components/layouts/Navigation/NavigationBar/ProjectBranchSelectorSheet.tsx b/apps/studio/components/layouts/Navigation/NavigationBar/ProjectBranchSelectorSheet.tsx index fce94a529a..3eb616f904 100644 --- a/apps/studio/components/layouts/Navigation/NavigationBar/ProjectBranchSelectorSheet.tsx +++ b/apps/studio/components/layouts/Navigation/NavigationBar/ProjectBranchSelectorSheet.tsx @@ -1,10 +1,4 @@ -import { BranchDropdown } from 'components/layouts/AppLayout/BranchDropdown' -import { OrganizationDropdown } from 'components/layouts/AppLayout/OrganizationDropdown' -import { ProjectDropdown } from 'components/layouts/AppLayout/ProjectDropdown' -import type { Branch } from 'data/branches/branches-query' -import type { ProjectDetail } from 'data/projects/project-detail-query' import { Box, Boxes, GitBranch } from 'lucide-react' -import type { Organization } from 'types' import { cn, SheetHeader, @@ -16,6 +10,12 @@ import { import MobileSheetNav from 'ui-patterns/MobileSheetNav/MobileSheetNav' import { ProjectBranchSelectorSheetTabTrigger } from './ProjectBranchSelectorSheetTabTrigger' +import { BranchDropdown } from '@/components/layouts/AppLayout/BranchDropdown' +import { OrganizationDropdown } from '@/components/layouts/AppLayout/OrganizationDropdown' +import { ProjectDropdown } from '@/components/layouts/AppLayout/ProjectDropdown' +import type { Branch } from '@/data/branches/branches-query' +import type { ProjectDetail } from '@/data/projects/project-detail-query' +import type { Organization } from '@/types' const EMBEDDED_CLASSNAME = 'bg-transparent border-0 shadow-none min-h-0 flex-1 flex flex-col overflow-hidden rounded-none' diff --git a/apps/studio/components/layouts/Navigation/NavigationBar/StudioMobileSheetNav.tsx b/apps/studio/components/layouts/Navigation/NavigationBar/StudioMobileSheetNav.tsx index 0b758db27b..60350900db 100644 --- a/apps/studio/components/layouts/Navigation/NavigationBar/StudioMobileSheetNav.tsx +++ b/apps/studio/components/layouts/Navigation/NavigationBar/StudioMobileSheetNav.tsx @@ -1,6 +1,4 @@ -import { CommandMenuInnerContent } from 'components/interfaces/App/CommandMenu/CommandMenu' import type { ReactNode } from 'react' -import { sidebarManagerState, useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { CommandWrapper, MobileSheetNav } from 'ui-patterns' import { @@ -9,6 +7,8 @@ import { } from '../../ProjectLayout/LayoutSidebar/LayoutSidebarProvider' import type { MobileSheetContentType } from './MobileSheetContext' import { useMobileSheet } from './MobileSheetContext' +import { CommandMenuInnerContent } from '@/components/interfaces/App/CommandMenu/CommandMenu' +import { sidebarManagerState, useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' function isSidebarId(content: unknown): content is TYPEOF_SIDEBAR_KEYS { return ( diff --git a/apps/studio/components/layouts/ObservabilityLayout/Observability.Commands.tsx b/apps/studio/components/layouts/ObservabilityLayout/Observability.Commands.tsx index e1be634fac..ebfbd4bb87 100644 --- a/apps/studio/components/layouts/ObservabilityLayout/Observability.Commands.tsx +++ b/apps/studio/components/layouts/ObservabilityLayout/Observability.Commands.tsx @@ -1,11 +1,11 @@ -import { useMemo } from 'react' - import { useParams } from 'common' -import { COMMAND_MENU_SECTIONS } from 'components/interfaces/App/CommandMenu/CommandMenu.utils' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' +import { useMemo } from 'react' import type { CommandOptions, ICommand } from 'ui-patterns/CommandMenu' import { orderSectionFirst, useQuery, useRegisterCommands } from 'ui-patterns/CommandMenu' +import { COMMAND_MENU_SECTIONS } from '@/components/interfaces/App/CommandMenu/CommandMenu.utils' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' + const QUERY_PERFORMANCE_COMMAND_ID = 'nav-reports-query-performance' export function useReportsGotoCommands(options?: CommandOptions) { diff --git a/apps/studio/components/layouts/ObservabilityLayout/ObservabilityLayout.tsx b/apps/studio/components/layouts/ObservabilityLayout/ObservabilityLayout.tsx index 0461d1ab1c..7e42e1fc2c 100644 --- a/apps/studio/components/layouts/ObservabilityLayout/ObservabilityLayout.tsx +++ b/apps/studio/components/layouts/ObservabilityLayout/ObservabilityLayout.tsx @@ -1,17 +1,17 @@ import { IS_PLATFORM, LOCAL_STORAGE_KEYS, useParams } from 'common' -import { useIndexAdvisorStatus } from 'components/interfaces/QueryPerformance/hooks/useIsIndexAdvisorStatus' -import { BannerIndexAdvisor } from 'components/ui/BannerStack/Banners/BannerIndexAdvisor' -import { BannerMetricsAPI } from 'components/ui/BannerStack/Banners/BannerMetricsAPI' -import { useBannerStack } from 'components/ui/BannerStack/BannerStackProvider' -import { UnknownInterface } from 'components/ui/UnknownInterface' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { withAuth } from 'hooks/misc/withAuth' import { usePathname } from 'next/navigation' import { PropsWithChildren, useEffect, useRef } from 'react' import { ProjectLayout } from '../ProjectLayout' import ObservabilityMenu from './ObservabilityMenu' +import { useIndexAdvisorStatus } from '@/components/interfaces/QueryPerformance/hooks/useIsIndexAdvisorStatus' +import { BannerIndexAdvisor } from '@/components/ui/BannerStack/Banners/BannerIndexAdvisor' +import { BannerMetricsAPI } from '@/components/ui/BannerStack/Banners/BannerMetricsAPI' +import { useBannerStack } from '@/components/ui/BannerStack/BannerStackProvider' +import { UnknownInterface } from '@/components/ui/UnknownInterface' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { withAuth } from '@/hooks/misc/withAuth' interface ObservabilityLayoutProps { title: string diff --git a/apps/studio/components/layouts/ObservabilityLayout/ObservabilityMenu.tsx b/apps/studio/components/layouts/ObservabilityLayout/ObservabilityMenu.tsx index 78004bf305..9bf267650c 100644 --- a/apps/studio/components/layouts/ObservabilityLayout/ObservabilityMenu.tsx +++ b/apps/studio/components/layouts/ObservabilityLayout/ObservabilityMenu.tsx @@ -1,21 +1,11 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useFlag, useParams } from 'common' -import { CreateReportModal } from 'components/interfaces/Reports/CreateReportModal' -import { UpdateCustomReportModal } from 'components/interfaces/Reports/UpdateModal' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useContentDeleteMutation } from 'data/content/content-delete-mutation' -import { Content, ContentBase, useContentQuery } from 'data/content/content-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { IS_PLATFORM } from 'lib/constants' -import { useProfile } from 'lib/profile' import { Plus } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' import { parseAsBoolean, useQueryState } from 'nuqs' import { Fragment, useMemo, useState } from 'react' import { toast } from 'sonner' -import type { Dashboards } from 'types' import { cn, Menu } from 'ui' import { InnerSideBarEmptyPanel } from 'ui-patterns' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' @@ -24,6 +14,16 @@ import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { generateObservabilityMenuItems } from './ObservabilityMenu.utils' import { ObservabilityMenuItem } from './ObservabilityMenuItem' import { useSupamonitorStatus } from '@/components/interfaces/QueryPerformance/hooks/useSupamonitorStatus' +import { CreateReportModal } from '@/components/interfaces/Reports/CreateReportModal' +import { UpdateCustomReportModal } from '@/components/interfaces/Reports/UpdateModal' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useContentDeleteMutation } from '@/data/content/content-delete-mutation' +import { Content, ContentBase, useContentQuery } from '@/data/content/content-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { IS_PLATFORM } from '@/lib/constants' +import { useProfile } from '@/lib/profile' +import type { Dashboards } from '@/types' const ObservabilityMenu = () => { const router = useRouter() diff --git a/apps/studio/components/layouts/ObservabilityLayout/ObservabilityMenu.utils.tsx b/apps/studio/components/layouts/ObservabilityLayout/ObservabilityMenu.utils.tsx index 2a814cedec..62f26186a0 100644 --- a/apps/studio/components/layouts/ObservabilityLayout/ObservabilityMenu.utils.tsx +++ b/apps/studio/components/layouts/ObservabilityLayout/ObservabilityMenu.utils.tsx @@ -1,4 +1,4 @@ -import { IS_PLATFORM } from 'lib/constants' +import { IS_PLATFORM } from '@/lib/constants' interface ObservabilityMenuItem { name: string diff --git a/apps/studio/components/layouts/ObservabilityLayout/ObservabilityMenuItem.tsx b/apps/studio/components/layouts/ObservabilityLayout/ObservabilityMenuItem.tsx index 968774c1ed..898305337e 100644 --- a/apps/studio/components/layouts/ObservabilityLayout/ObservabilityMenuItem.tsx +++ b/apps/studio/components/layouts/ObservabilityLayout/ObservabilityMenuItem.tsx @@ -1,11 +1,6 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' -import { Edit2, Trash, MoreVertical, MoreHorizontal } from 'lucide-react' +import { Edit2, MoreHorizontal, MoreVertical, Trash } from 'lucide-react' import Link from 'next/link' - -import { ContentBase } from 'data/content/content-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useProfile } from 'lib/profile' -import type { Dashboards } from 'types' import { Button, cn, @@ -16,6 +11,11 @@ import { DropdownMenuTrigger, } from 'ui' +import { ContentBase } from '@/data/content/content-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useProfile } from '@/lib/profile' +import type { Dashboards } from '@/types' + interface ReportMenuItemProps { item: { id?: string diff --git a/apps/studio/components/layouts/OrganizationLayout.tsx b/apps/studio/components/layouts/OrganizationLayout.tsx index 9478f693d7..d18a454226 100644 --- a/apps/studio/components/layouts/OrganizationLayout.tsx +++ b/apps/studio/components/layouts/OrganizationLayout.tsx @@ -1,12 +1,3 @@ -import PartnerIcon from 'components/ui/PartnerIcon' -import { PARTNER_TO_NAME } from 'components/ui/PartnerManagedResource' -import { useAwsRedirectQuery } from 'data/integrations/aws-redirect-query' -import { useVercelRedirectQuery } from 'data/integrations/vercel-redirect-query' -import { useCustomContent } from 'hooks/custom-content/useCustomContent' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { withAuth } from 'hooks/misc/withAuth' -import { MANAGED_BY } from 'lib/constants/infrastructure' -import { buildStudioPageTitle } from 'lib/page-title' import { ExternalLink } from 'lucide-react' import Head from 'next/head' import { useRouter } from 'next/router' @@ -14,6 +5,15 @@ import type { PropsWithChildren } from 'react' import { Alert_Shadcn_, AlertTitle_Shadcn_, Button, cn } from 'ui' import { useRegisterOrgMenu } from './OrganizationLayout/useRegisterOrgMenu' +import PartnerIcon from '@/components/ui/PartnerIcon' +import { PARTNER_TO_NAME } from '@/components/ui/PartnerManagedResource' +import { useAwsRedirectQuery } from '@/data/integrations/aws-redirect-query' +import { useVercelRedirectQuery } from '@/data/integrations/vercel-redirect-query' +import { useCustomContent } from '@/hooks/custom-content/useCustomContent' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { withAuth } from '@/hooks/misc/withAuth' +import { MANAGED_BY } from '@/lib/constants/infrastructure' +import { buildStudioPageTitle } from '@/lib/page-title' interface OrganizationLayoutProps { title: string diff --git a/apps/studio/components/layouts/PageLayout/PageHeader.tsx b/apps/studio/components/layouts/PageLayout/PageHeader.tsx index 44efb6a01e..7e70fc4848 100644 --- a/apps/studio/components/layouts/PageLayout/PageHeader.tsx +++ b/apps/studio/components/layouts/PageLayout/PageHeader.tsx @@ -1,8 +1,7 @@ +import { useParams } from 'common' import { ChevronLeft } from 'lucide-react' import Link from 'next/link' import { Fragment, ReactNode } from 'react' - -import { useParams } from 'common' import { cn } from 'ui' import { Breadcrumb, @@ -12,6 +11,7 @@ import { BreadcrumbPage as BreadcrumbPageItem, BreadcrumbSeparator, } from 'ui/src/components/shadcn/ui/breadcrumb' + import { ScaffoldDescription, ScaffoldTitle } from '../Scaffold' interface PageHeaderProps { diff --git a/apps/studio/components/layouts/PageLayout/PageLayout.tsx b/apps/studio/components/layouts/PageLayout/PageLayout.tsx index 033a2da2e4..3795029777 100644 --- a/apps/studio/components/layouts/PageLayout/PageLayout.tsx +++ b/apps/studio/components/layouts/PageLayout/PageLayout.tsx @@ -1,9 +1,9 @@ +import { useParams } from 'common' import Link from 'next/link' import { useRouter } from 'next/router' import { ReactNode } from 'react' - -import { useParams } from 'common' import { Badge, Button, cn, NavMenu, NavMenuItem } from 'ui' + import { ScaffoldContainer } from '../Scaffold' import { PageHeader } from './PageHeader' diff --git a/apps/studio/components/layouts/ProjectIntegrationsLayout.tsx b/apps/studio/components/layouts/ProjectIntegrationsLayout.tsx index b84ad41e08..bc6c161d74 100644 --- a/apps/studio/components/layouts/ProjectIntegrationsLayout.tsx +++ b/apps/studio/components/layouts/ProjectIntegrationsLayout.tsx @@ -1,17 +1,17 @@ import { useQuery } from '@tanstack/react-query' import { IS_PLATFORM, useFeatureFlags, useFlag, useParams } from 'common' -import { useInstalledIntegrations } from 'components/interfaces/Integrations/Landing/useInstalledIntegrations' -import { ProjectLayout } from 'components/layouts/ProjectLayout' -import AlertError from 'components/ui/AlertError' -import { ProductMenuItem } from 'components/ui/ProductMenu/ProductMenuItem' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { withAuth } from 'hooks/misc/withAuth' import { useRouter } from 'next/router' import { PropsWithChildren } from 'react' import { Menu, Separator } from 'ui' import { GenericSkeletonLoader } from 'ui-patterns' +import { useInstalledIntegrations } from '@/components/interfaces/Integrations/Landing/useInstalledIntegrations' +import { ProjectLayout } from '@/components/layouts/ProjectLayout' +import AlertError from '@/components/ui/AlertError' +import { ProductMenuItem } from '@/components/ui/ProductMenu/ProductMenuItem' import { marketplaceCategoriesQueryOptions } from '@/data/marketplace/integration-categories-query' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { withAuth } from '@/hooks/misc/withAuth' /** * Layout component for the Integrations section diff --git a/apps/studio/components/layouts/ProjectLayout/BuildingState.tsx b/apps/studio/components/layouts/ProjectLayout/BuildingState.tsx index f869fa1e7a..dfcef4694f 100644 --- a/apps/studio/components/layouts/ProjectLayout/BuildingState.tsx +++ b/apps/studio/components/layouts/ProjectLayout/BuildingState.tsx @@ -1,22 +1,22 @@ +import { useParams } from 'common' import { ArrowRight, Loader2 } from 'lucide-react' import Link from 'next/link' import { useEffect } from 'react' - -import { useParams } from 'common' -import { ClientLibrary } from 'components/interfaces/Home/ClientLibrary' -import { ExampleProject } from 'components/interfaces/Home/ExampleProject' -import { EXAMPLE_PROJECTS } from 'components/interfaces/Home/Home.constants' -import { APIKeys } from 'components/interfaces/Home/NewProjectPanel/APIKeys' -import { SupportLink } from 'components/interfaces/Support/SupportLink' -import { useInvalidateProjectsInfiniteQuery } from 'data/projects/org-projects-infinite-query' -import { useInvalidateProjectDetailsQuery } from 'data/projects/project-detail-query' -import { useProjectStatusQuery } from 'data/projects/project-status-query' -import { useCustomContent } from 'hooks/custom-content/useCustomContent' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { DOCS_URL, PROJECT_STATUS } from 'lib/constants' import { Badge, Button } from 'ui' +import { ClientLibrary } from '@/components/interfaces/Home/ClientLibrary' +import { ExampleProject } from '@/components/interfaces/Home/ExampleProject' +import { EXAMPLE_PROJECTS } from '@/components/interfaces/Home/Home.constants' +import { APIKeys } from '@/components/interfaces/Home/NewProjectPanel/APIKeys' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' +import { useInvalidateProjectsInfiniteQuery } from '@/data/projects/org-projects-infinite-query' +import { useInvalidateProjectDetailsQuery } from '@/data/projects/project-detail-query' +import { useProjectStatusQuery } from '@/data/projects/project-status-query' +import { useCustomContent } from '@/hooks/custom-content/useCustomContent' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL, PROJECT_STATUS } from '@/lib/constants' + const BuildingState = () => { const { ref } = useParams() const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/layouts/ProjectLayout/ConnectingState.tsx b/apps/studio/components/layouts/ProjectLayout/ConnectingState.tsx index 760862b1c5..aef2e7190e 100644 --- a/apps/studio/components/layouts/ProjectLayout/ConnectingState.tsx +++ b/apps/studio/components/layouts/ProjectLayout/ConnectingState.tsx @@ -1,17 +1,17 @@ +import { useParams } from 'common' import { ExternalLink, Loader, Monitor, Server } from 'lucide-react' import Link from 'next/link' import { useEffect, useRef } from 'react' +import { Badge, Button } from 'ui' -import { useParams } from 'common' -import ShimmerLine from 'components/ui/ShimmerLine' +import ShimmerLine from '@/components/ui/ShimmerLine' import { useInvalidateProjectDetailsQuery, useSetProjectPostgrestStatus, type Project, -} from 'data/projects/project-detail-query' -import { DOCS_URL } from 'lib/constants' -import pingPostgrest from 'lib/pingPostgrest' -import { Badge, Button } from 'ui' +} from '@/data/projects/project-detail-query' +import { DOCS_URL } from '@/lib/constants' +import pingPostgrest from '@/lib/pingPostgrest' export interface ConnectingStateProps { project: Project diff --git a/apps/studio/components/layouts/ProjectLayout/LayoutHeader/MobileMenuContent/MobileMenuContent.tsx b/apps/studio/components/layouts/ProjectLayout/LayoutHeader/MobileMenuContent/MobileMenuContent.tsx index d6bc1be057..5e4cf69c86 100644 --- a/apps/studio/components/layouts/ProjectLayout/LayoutHeader/MobileMenuContent/MobileMenuContent.tsx +++ b/apps/studio/components/layouts/ProjectLayout/LayoutHeader/MobileMenuContent/MobileMenuContent.tsx @@ -1,22 +1,7 @@ 'use client' import { useFlag, useParams } from 'common' -import { - useIsAPIDocsSidePanelEnabled, - useUnifiedLogsPreview, -} from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' -import { ICON_SIZE, ICON_STROKE_WIDTH } from 'components/interfaces/Sidebar' -import { - generateOtherRoutes, - generateProductRoutes, - generateSettingsRoutes, - generateToolRoutes, -} from 'components/layouts/Navigation/NavigationBar/NavigationBar.utils' -import type { Route } from 'components/ui/ui.types' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Home } from 'icons' -import { getPathnameWithoutQuery, getPathSegment } from 'lib/pathname.utils' import { ChevronLeft } from 'lucide-react' import { useRouter } from 'next/router' import React, { useMemo } from 'react' @@ -27,6 +12,21 @@ import { resolveSectionDisplay } from './MobileMenuContent.utils' import { getProductMenuComponent } from './mobileProductMenuRegistry' import { TopLevelRouteItem } from './TopLevelRouteItem' import { routeHasSubmenu, useMobileMenuNavigation } from './useMobileMenuNavigation' +import { + useIsAPIDocsSidePanelEnabled, + useUnifiedLogsPreview, +} from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import { ICON_SIZE, ICON_STROKE_WIDTH } from '@/components/interfaces/Sidebar' +import { + generateOtherRoutes, + generateProductRoutes, + generateSettingsRoutes, + generateToolRoutes, +} from '@/components/layouts/Navigation/NavigationBar/NavigationBar.utils' +import type { Route } from '@/components/ui/ui.types' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { getPathnameWithoutQuery, getPathSegment } from '@/lib/pathname.utils' export interface MobileMenuContentProps { currentProductMenu: React.ReactNode diff --git a/apps/studio/components/layouts/ProjectLayout/LayoutHeader/MobileMenuContent/OrgMenuContent.tsx b/apps/studio/components/layouts/ProjectLayout/LayoutHeader/MobileMenuContent/OrgMenuContent.tsx index 2beaa1f3cb..02ac3a607b 100644 --- a/apps/studio/components/layouts/ProjectLayout/LayoutHeader/MobileMenuContent/OrgMenuContent.tsx +++ b/apps/studio/components/layouts/ProjectLayout/LayoutHeader/MobileMenuContent/OrgMenuContent.tsx @@ -1,11 +1,6 @@ 'use client' import { useIsMFAEnabled, useParams } from 'common' -import { ICON_SIZE, ICON_STROKE_WIDTH } from 'components/interfaces/Sidebar' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { getPathnameWithoutQuery } from 'lib/pathname.utils' -import { useTrack } from 'lib/telemetry/track' import { Blocks, Boxes, ChartArea, ChevronLeft, Receipt, Settings, Users } from 'lucide-react' import { useRouter } from 'next/router' import React, { useMemo } from 'react' @@ -21,6 +16,11 @@ import { } from './OrgMenuContent.utils' import { OrgMenuItem } from './OrgMenuItem' import { orgItemHasSubmenu, useOrgMenuNavigation } from './useOrgMenuNavigation' +import { ICON_SIZE, ICON_STROKE_WIDTH } from '@/components/interfaces/Sidebar' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { getPathnameWithoutQuery } from '@/lib/pathname.utils' +import { useTrack } from '@/lib/telemetry/track' export interface OrgMenuContentProps { onCloseSheet?: () => void diff --git a/apps/studio/components/layouts/ProjectLayout/LayoutHeader/MobileMenuContent/OrgMenuItem.tsx b/apps/studio/components/layouts/ProjectLayout/LayoutHeader/MobileMenuContent/OrgMenuItem.tsx index 1c68ac6717..5e5cd8371e 100644 --- a/apps/studio/components/layouts/ProjectLayout/LayoutHeader/MobileMenuContent/OrgMenuItem.tsx +++ b/apps/studio/components/layouts/ProjectLayout/LayoutHeader/MobileMenuContent/OrgMenuItem.tsx @@ -1,5 +1,5 @@ import Link from 'next/link' -import { cn, SidebarMenuItem, sidebarMenuButtonVariants } from 'ui' +import { cn, sidebarMenuButtonVariants, SidebarMenuItem } from 'ui' import type { OrgNavItem } from './OrgMenuContent.utils' diff --git a/apps/studio/components/layouts/ProjectLayout/LayoutHeader/MobileMenuContent/TopLevelRouteItem.tsx b/apps/studio/components/layouts/ProjectLayout/LayoutHeader/MobileMenuContent/TopLevelRouteItem.tsx index 5c95ddc9cd..d378251d87 100644 --- a/apps/studio/components/layouts/ProjectLayout/LayoutHeader/MobileMenuContent/TopLevelRouteItem.tsx +++ b/apps/studio/components/layouts/ProjectLayout/LayoutHeader/MobileMenuContent/TopLevelRouteItem.tsx @@ -1,8 +1,8 @@ -import type { Route } from 'components/ui/ui.types' import Link from 'next/link' import { cn, sidebarMenuButtonVariants, SidebarMenuItem } from 'ui' import { isDirectLinkAtTopLevel } from './useMobileMenuNavigation' +import type { Route } from '@/components/ui/ui.types' export interface TopLevelRouteItemProps { route: Route diff --git a/apps/studio/components/layouts/ProjectLayout/LayoutHeader/MobileMenuContent/mobileProductMenuRegistry.tsx b/apps/studio/components/layouts/ProjectLayout/LayoutHeader/MobileMenuContent/mobileProductMenuRegistry.tsx index aa882e0a17..ea0c66d2a3 100644 --- a/apps/studio/components/layouts/ProjectLayout/LayoutHeader/MobileMenuContent/mobileProductMenuRegistry.tsx +++ b/apps/studio/components/layouts/ProjectLayout/LayoutHeader/MobileMenuContent/mobileProductMenuRegistry.tsx @@ -8,63 +8,63 @@ import React, { type ComponentType } from 'react' export const MOBILE_PRODUCT_MENU_REGISTRY: Record = { HOME: null, editor: React.lazy(() => - import('components/layouts/TableEditorLayout/TableEditorMenu').then((m) => ({ + import('@/components/layouts/TableEditorLayout/TableEditorMenu').then((m) => ({ default: m.TableEditorMenu, })) ), sql: React.lazy(() => - import('components/layouts/SQLEditorLayout/SQLEditorMenu').then((m) => ({ + import('@/components/layouts/SQLEditorLayout/SQLEditorMenu').then((m) => ({ default: m.SQLEditorMenu, })) ), database: React.lazy(() => - import('components/layouts/DatabaseLayout/DatabaseLayout').then((m) => ({ + import('@/components/layouts/DatabaseLayout/DatabaseLayout').then((m) => ({ default: m.DatabaseProductMenu, })) ), auth: React.lazy(() => - import('components/layouts/AuthLayout/AuthLayout').then((m) => ({ + import('@/components/layouts/AuthLayout/AuthLayout').then((m) => ({ default: m.AuthProductMenu, })) ), storage: React.lazy(() => - import('components/interfaces/Storage/StorageMenuV2').then((m) => ({ + import('@/components/interfaces/Storage/StorageMenuV2').then((m) => ({ default: m.StorageMenuV2, })) ), functions: React.lazy(() => - import('components/layouts/EdgeFunctionsLayout/EdgeFunctionsLayout').then((m) => ({ + import('@/components/layouts/EdgeFunctionsLayout/EdgeFunctionsLayout').then((m) => ({ default: m.EdgeFunctionsProductMenu, })) ), realtime: React.lazy(() => - import('components/layouts/RealtimeLayout/RealtimeLayout').then((m) => ({ + import('@/components/layouts/RealtimeLayout/RealtimeLayout').then((m) => ({ default: m.RealtimeProductMenu, })) ), advisors: React.lazy(() => - import('components/layouts/AdvisorsLayout/AdvisorsSidebarMenu').then((m) => ({ + import('@/components/layouts/AdvisorsLayout/AdvisorsSidebarMenu').then((m) => ({ default: m.AdvisorsSidebarMenu, })) ), observability: React.lazy(() => - import('components/layouts/ObservabilityLayout/ObservabilityMenu').then((m) => ({ + import('@/components/layouts/ObservabilityLayout/ObservabilityMenu').then((m) => ({ default: m.default, })) ), logs: React.lazy(() => - import('components/layouts/LogsLayout/LogsSidebarMenuV2').then((m) => ({ + import('@/components/layouts/LogsLayout/LogsSidebarMenuV2').then((m) => ({ default: m.LogsSidebarMenuV2, })) ), api: null, integrations: React.lazy(() => - import('components/layouts/Integrations/IntegrationsProductMenu').then((m) => ({ + import('@/components/layouts/Integrations/IntegrationsProductMenu').then((m) => ({ default: m.IntegrationsProductMenu, })) ), settings: React.lazy(() => - import('components/layouts/ProjectSettingsLayout/SettingsLayout').then((m) => ({ + import('@/components/layouts/ProjectSettingsLayout/SettingsLayout').then((m) => ({ default: m.SettingsProductMenu, })) ), diff --git a/apps/studio/components/layouts/ProjectLayout/LayoutHeader/MobileMenuContent/useMobileMenuNavigation.ts b/apps/studio/components/layouts/ProjectLayout/LayoutHeader/MobileMenuContent/useMobileMenuNavigation.ts index 2a92d079bd..47e04c5225 100644 --- a/apps/studio/components/layouts/ProjectLayout/LayoutHeader/MobileMenuContent/useMobileMenuNavigation.ts +++ b/apps/studio/components/layouts/ProjectLayout/LayoutHeader/MobileMenuContent/useMobileMenuNavigation.ts @@ -1,10 +1,10 @@ 'use client' -import type { Route } from 'components/ui/ui.types' import { useRouter } from 'next/router' import { useCallback, useState } from 'react' import { getProductMenuComponent } from './mobileProductMenuRegistry' +import type { Route } from '@/components/ui/ui.types' const TOP_LEVEL_DIRECT_LINK_KEYS = ['editor', 'sql'] as const diff --git a/apps/studio/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider.tsx b/apps/studio/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider.tsx index 63a0e5aad8..c454079e01 100644 --- a/apps/studio/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider.tsx +++ b/apps/studio/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider.tsx @@ -1,27 +1,28 @@ import { LOCAL_STORAGE_KEYS } from 'common' -import { getSupportLinkQueryParams } from 'components/ui/HelpPanel/HelpPanel.utils' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import useLatest from 'hooks/misc/useLatest' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import dynamic from 'next/dynamic' import { useRouter } from 'next/router' import { parseAsString, useQueryState } from 'nuqs' import { useEffect, type PropsWithChildren } from 'react' -import { useRegisterSidebar, useSidebarManagerSnapshot } from 'state/sidebar-manager-state' + +import { getSupportLinkQueryParams } from '@/components/ui/HelpPanel/HelpPanel.utils' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import useLatest from '@/hooks/misc/useLatest' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useRegisterSidebar, useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' const AdvisorPanel = dynamic(() => - import('components/ui/AdvisorPanel/AdvisorPanel').then((m) => m.AdvisorPanel) + import('@/components/ui/AdvisorPanel/AdvisorPanel').then((m) => m.AdvisorPanel) ) const AIAssistant = dynamic(() => - import('components/ui/AIAssistantPanel/AIAssistant').then((m) => m.AIAssistant) + import('@/components/ui/AIAssistantPanel/AIAssistant').then((m) => m.AIAssistant) ) const EditorPanel = dynamic(() => - import('components/ui/EditorPanel/EditorPanel').then((m) => m.EditorPanel) + import('@/components/ui/EditorPanel/EditorPanel').then((m) => m.EditorPanel) ) const HelpPanel = dynamic(() => - import('components/ui/HelpPanel/HelpPanel').then((m) => m.HelpPanel) + import('@/components/ui/HelpPanel/HelpPanel').then((m) => m.HelpPanel) ) export const SIDEBAR_KEYS = { diff --git a/apps/studio/components/layouts/ProjectLayout/LayoutSidebar/index.test.tsx b/apps/studio/components/layouts/ProjectLayout/LayoutSidebar/index.test.tsx index 5c4e1924f2..0bf4b9597b 100644 --- a/apps/studio/components/layouts/ProjectLayout/LayoutSidebar/index.test.tsx +++ b/apps/studio/components/layouts/ProjectLayout/LayoutSidebar/index.test.tsx @@ -1,13 +1,13 @@ import { act, screen, waitFor } from '@testing-library/react' -import { MobileSheetProvider } from 'components/layouts/Navigation/NavigationBar/MobileSheetContext' -import { sidebarManagerState } from 'state/sidebar-manager-state' -import { render } from 'tests/helpers' -import { routerMock } from 'tests/lib/route-mock' import { ResizablePanel, ResizablePanelGroup } from 'ui' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { LayoutSidebar } from './index' import { LayoutSidebarProvider, SIDEBAR_KEYS } from './LayoutSidebarProvider' +import { MobileSheetProvider } from '@/components/layouts/Navigation/NavigationBar/MobileSheetContext' +import { sidebarManagerState } from '@/state/sidebar-manager-state' +import { render } from '@/tests/helpers' +import { routerMock } from '@/tests/lib/route-mock' vi.mock('components/ui/AIAssistantPanel/AIAssistant', () => ({ AIAssistant: () =>
AI Assistant
, diff --git a/apps/studio/components/layouts/ProjectLayout/LayoutSidebar/index.tsx b/apps/studio/components/layouts/ProjectLayout/LayoutSidebar/index.tsx index 55f1e24eeb..a76f8ffc40 100644 --- a/apps/studio/components/layouts/ProjectLayout/LayoutSidebar/index.tsx +++ b/apps/studio/components/layouts/ProjectLayout/LayoutSidebar/index.tsx @@ -1,10 +1,10 @@ import { useBreakpoint } from 'common' -import { useMobileSheet } from 'components/layouts/Navigation/NavigationBar/MobileSheetContext' import { useEffect } from 'react' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { cn, ResizableHandle, ResizablePanel } from 'ui' import { SIDEBAR_KEYS, type TYPEOF_SIDEBAR_KEYS } from './LayoutSidebarProvider' +import { useMobileSheet } from '@/components/layouts/Navigation/NavigationBar/MobileSheetContext' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' function isSidebarId(content: unknown): content is TYPEOF_SIDEBAR_KEYS { return ( diff --git a/apps/studio/components/layouts/ProjectLayout/LoadingState.tsx b/apps/studio/components/layouts/ProjectLayout/LoadingState.tsx index b498035749..0027ded4b6 100644 --- a/apps/studio/components/layouts/ProjectLayout/LoadingState.tsx +++ b/apps/studio/components/layouts/ProjectLayout/LoadingState.tsx @@ -1,7 +1,8 @@ import { useParams } from 'common' -import { useProjectDetailQuery } from 'data/projects/project-detail-query' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' +import { useProjectDetailQuery } from '@/data/projects/project-detail-query' + export const LoadingState = () => { const { ref } = useParams() const { data: project, isPending: isLoading } = useProjectDetailQuery({ ref }) diff --git a/apps/studio/components/layouts/ProjectLayout/OrganizationSettingsLayout.tsx b/apps/studio/components/layouts/ProjectLayout/OrganizationSettingsLayout.tsx index 6733eaaccb..9706d57ba5 100644 --- a/apps/studio/components/layouts/ProjectLayout/OrganizationSettingsLayout.tsx +++ b/apps/studio/components/layouts/ProjectLayout/OrganizationSettingsLayout.tsx @@ -1,11 +1,12 @@ import { useFlag, useParams } from 'common' -import { useIsPlatformWebhooksEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' -import type { SidebarSection } from 'components/layouts/AccountLayout/AccountLayout.types' -import { WithSidebar } from 'components/layouts/AccountLayout/WithSidebar' -import { useCurrentPath } from 'hooks/misc/useCurrentPath' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import { PropsWithChildren } from 'react' +import { useIsPlatformWebhooksEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import type { SidebarSection } from '@/components/layouts/AccountLayout/AccountLayout.types' +import { WithSidebar } from '@/components/layouts/AccountLayout/WithSidebar' +import { useCurrentPath } from '@/hooks/misc/useCurrentPath' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' + interface OrganizationSettingsMenuItemsProps { slug?: string showSecuritySettings?: boolean diff --git a/apps/studio/components/layouts/ProjectLayout/OrganizationSettingsMenu.tsx b/apps/studio/components/layouts/ProjectLayout/OrganizationSettingsMenu.tsx index 03d22d210d..cf00d5f9c0 100644 --- a/apps/studio/components/layouts/ProjectLayout/OrganizationSettingsMenu.tsx +++ b/apps/studio/components/layouts/ProjectLayout/OrganizationSettingsMenu.tsx @@ -1,14 +1,14 @@ import { useFlag, useParams } from 'common' -import { useIsPlatformWebhooksEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' -import { SubMenu } from 'components/ui/ProductMenu/SubMenu' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { getPathnameWithoutQuery } from 'lib/pathname.utils' import { useRouter } from 'next/router' import { generateOrganizationSettingsSections, normalizeOrganizationSettingsPath, } from './OrganizationSettingsLayout' +import { useIsPlatformWebhooksEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import { SubMenu } from '@/components/ui/ProductMenu/SubMenu' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { getPathnameWithoutQuery } from '@/lib/pathname.utils' export interface OrganizationSettingsMenuProps { onCloseSheet?: () => void diff --git a/apps/studio/components/layouts/ProjectLayout/PauseFailedState.tsx b/apps/studio/components/layouts/ProjectLayout/PauseFailedState.tsx index 949c6e0ef2..d531713561 100644 --- a/apps/studio/components/layouts/ProjectLayout/PauseFailedState.tsx +++ b/apps/studio/components/layouts/ProjectLayout/PauseFailedState.tsx @@ -1,19 +1,19 @@ import { PermissionAction, SupportCategories } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { Download, MoreVertical, Trash } from 'lucide-react' import { useState } from 'react' - -import { useParams } from 'common' -import { DeleteProjectModal } from 'components/interfaces/Settings/General/DeleteProjectPanel/DeleteProjectModal' -import { SupportLink } from 'components/interfaces/Support/SupportLink' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DropdownMenuItemTooltip } from 'components/ui/DropdownMenuItemTooltip' -import { InlineLink } from 'components/ui/InlineLink' -import { useBackupDownloadMutation } from 'data/database/backup-download-mutation' -import { useDownloadableBackupQuery } from 'data/database/backup-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Button, CriticalIcon, DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from 'ui' +import { DeleteProjectModal } from '@/components/interfaces/Settings/General/DeleteProjectPanel/DeleteProjectModal' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DropdownMenuItemTooltip } from '@/components/ui/DropdownMenuItemTooltip' +import { InlineLink } from '@/components/ui/InlineLink' +import { useBackupDownloadMutation } from '@/data/database/backup-download-mutation' +import { useDownloadableBackupQuery } from '@/data/database/backup-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' + export const PauseFailedState = () => { const { ref } = useParams() const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/layouts/ProjectLayout/PausedState/PauseDisabledState.tsx b/apps/studio/components/layouts/ProjectLayout/PausedState/PauseDisabledState.tsx index 90b85ea5a4..90b0ee5af6 100644 --- a/apps/studio/components/layouts/ProjectLayout/PausedState/PauseDisabledState.tsx +++ b/apps/studio/components/layouts/ProjectLayout/PausedState/PauseDisabledState.tsx @@ -1,17 +1,8 @@ +import { useParams } from 'common' +import { Database, Storage } from 'icons' import { ChevronDown, Download, ExternalLink } from 'lucide-react' import { useEffect, useState } from 'react' import { toast } from 'sonner' - -import { useParams } from 'common' -import { DropdownMenuItemTooltip } from 'components/ui/DropdownMenuItemTooltip' -import { InlineLink } from 'components/ui/InlineLink' -import { useBackupDownloadMutation } from 'data/database/backup-download-mutation' -import { useProjectPauseStatusQuery } from 'data/projects/project-pause-status-query' -import { useStorageArchiveCreateMutation } from 'data/storage/storage-archive-create-mutation' -import { useStorageArchiveQuery } from 'data/storage/storage-archive-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { Database, Storage } from 'icons' -import { DOCS_URL, PROJECT_STATUS } from 'lib/constants' import { Button, DropdownMenu, @@ -21,6 +12,15 @@ import { } from 'ui' import { Admonition, TimestampInfo } from 'ui-patterns' +import { DropdownMenuItemTooltip } from '@/components/ui/DropdownMenuItemTooltip' +import { InlineLink } from '@/components/ui/InlineLink' +import { useBackupDownloadMutation } from '@/data/database/backup-download-mutation' +import { useProjectPauseStatusQuery } from '@/data/projects/project-pause-status-query' +import { useStorageArchiveCreateMutation } from '@/data/storage/storage-archive-create-mutation' +import { useStorageArchiveQuery } from '@/data/storage/storage-archive-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { DOCS_URL, PROJECT_STATUS } from '@/lib/constants' + export const PauseDisabledState = () => { const { ref } = useParams() const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/layouts/ProjectLayout/PausedState/ProjectPausedState.tsx b/apps/studio/components/layouts/ProjectLayout/PausedState/ProjectPausedState.tsx index 9899cd98fd..ea4787ca57 100644 --- a/apps/studio/components/layouts/ProjectLayout/PausedState/ProjectPausedState.tsx +++ b/apps/studio/components/layouts/ProjectLayout/PausedState/ProjectPausedState.tsx @@ -1,31 +1,13 @@ import { zodResolver } from '@hookform/resolvers/zod' import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useFlag, useParams } from 'common' import dayjs from 'dayjs' import { PauseCircle } from 'lucide-react' import Link from 'next/link' import { useState } from 'react' import { useForm } from 'react-hook-form' -import { toast } from 'sonner' -import { z } from 'zod' - -import { useFlag, useParams } from 'common' -import { - extractPostgresVersionDetails, - PostgresVersionSelector, -} from 'components/interfaces/ProjectCreation/PostgresVersionSelector' -import AlertError from 'components/ui/AlertError' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { InlineLinkClassName } from 'components/ui/InlineLink' -import { useFreeProjectLimitCheckQuery } from 'data/organizations/free-project-limit-check-query' -import { useSetProjectStatus } from 'data/projects/project-detail-query' -import { useProjectPauseStatusQuery } from 'data/projects/project-pause-status-query' -import { useProjectRestoreMutation } from 'data/projects/project-restore-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { usePHFlag } from 'hooks/ui/useFlag' -import { PROJECT_STATUS } from 'lib/constants' import { AWS_REGIONS, CloudProvider } from 'shared-data' +import { toast } from 'sonner' import { Button, Card, @@ -47,7 +29,25 @@ import { import { TimestampInfo } from 'ui-patterns' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' +import { z } from 'zod' + import { PauseDisabledState } from './PauseDisabledState' +import { + extractPostgresVersionDetails, + PostgresVersionSelector, +} from '@/components/interfaces/ProjectCreation/PostgresVersionSelector' +import AlertError from '@/components/ui/AlertError' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { InlineLinkClassName } from '@/components/ui/InlineLink' +import { useFreeProjectLimitCheckQuery } from '@/data/organizations/free-project-limit-check-query' +import { useSetProjectStatus } from '@/data/projects/project-detail-query' +import { useProjectPauseStatusQuery } from '@/data/projects/project-pause-status-query' +import { useProjectRestoreMutation } from '@/data/projects/project-restore-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { usePHFlag } from '@/hooks/ui/useFlag' +import { PROJECT_STATUS } from '@/lib/constants' export interface ProjectPausedStateProps { product?: string diff --git a/apps/studio/components/layouts/ProjectLayout/PausingState.tsx b/apps/studio/components/layouts/ProjectLayout/PausingState.tsx index ab91945665..657392bf59 100644 --- a/apps/studio/components/layouts/ProjectLayout/PausingState.tsx +++ b/apps/studio/components/layouts/ProjectLayout/PausingState.tsx @@ -1,13 +1,13 @@ +import { useParams } from 'common' import { Circle, Loader } from 'lucide-react' import { useEffect, useState } from 'react' - -import { useParams } from 'common' -import { useInvalidateProjectsInfiniteQuery } from 'data/projects/org-projects-infinite-query' -import { Project, useInvalidateProjectDetailsQuery } from 'data/projects/project-detail-query' -import { useProjectStatusQuery } from 'data/projects/project-status-query' -import { PROJECT_STATUS } from 'lib/constants' import { Badge } from 'ui' +import { useInvalidateProjectsInfiniteQuery } from '@/data/projects/org-projects-infinite-query' +import { Project, useInvalidateProjectDetailsQuery } from '@/data/projects/project-detail-query' +import { useProjectStatusQuery } from '@/data/projects/project-status-query' +import { PROJECT_STATUS } from '@/lib/constants' + export interface PausingStateProps { project: Project } diff --git a/apps/studio/components/layouts/ProjectLayout/ResizingState.tsx b/apps/studio/components/layouts/ProjectLayout/ResizingState.tsx index 0c7e0f0f25..cd5a243877 100644 --- a/apps/studio/components/layouts/ProjectLayout/ResizingState.tsx +++ b/apps/studio/components/layouts/ProjectLayout/ResizingState.tsx @@ -1,8 +1,8 @@ import { useParams } from 'common' import { Loader2 } from 'lucide-react' -import { useProjectDetailQuery } from 'data/projects/project-detail-query' -import { PROJECT_STATUS } from 'lib/constants' +import { useProjectDetailQuery } from '@/data/projects/project-detail-query' +import { PROJECT_STATUS } from '@/lib/constants' export const ResizingState = () => { const { ref } = useParams() diff --git a/apps/studio/components/layouts/ProjectLayout/RestartingState.tsx b/apps/studio/components/layouts/ProjectLayout/RestartingState.tsx index 278a3bb32a..a78c5c813e 100644 --- a/apps/studio/components/layouts/ProjectLayout/RestartingState.tsx +++ b/apps/studio/components/layouts/ProjectLayout/RestartingState.tsx @@ -1,8 +1,8 @@ import { useParams } from 'common' import { Loader2 } from 'lucide-react' -import { useProjectDetailQuery } from 'data/projects/project-detail-query' -import { PROJECT_STATUS } from 'lib/constants' +import { useProjectDetailQuery } from '@/data/projects/project-detail-query' +import { PROJECT_STATUS } from '@/lib/constants' const RestartingState = () => { const { ref } = useParams() diff --git a/apps/studio/components/layouts/ProjectLayout/RestoreFailedState.tsx b/apps/studio/components/layouts/ProjectLayout/RestoreFailedState.tsx index 9ef2b41120..3d986811a1 100644 --- a/apps/studio/components/layouts/ProjectLayout/RestoreFailedState.tsx +++ b/apps/studio/components/layouts/ProjectLayout/RestoreFailedState.tsx @@ -1,19 +1,19 @@ import { PermissionAction, SupportCategories } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { Download, MoreVertical, Trash } from 'lucide-react' import { useState } from 'react' - -import { useParams } from 'common' -import { DeleteProjectModal } from 'components/interfaces/Settings/General/DeleteProjectPanel/DeleteProjectModal' -import { SupportLink } from 'components/interfaces/Support/SupportLink' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { DropdownMenuItemTooltip } from 'components/ui/DropdownMenuItemTooltip' -import { InlineLink } from 'components/ui/InlineLink' -import { useBackupDownloadMutation } from 'data/database/backup-download-mutation' -import { useDownloadableBackupQuery } from 'data/database/backup-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Button, CriticalIcon, DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from 'ui' +import { DeleteProjectModal } from '@/components/interfaces/Settings/General/DeleteProjectPanel/DeleteProjectModal' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { DropdownMenuItemTooltip } from '@/components/ui/DropdownMenuItemTooltip' +import { InlineLink } from '@/components/ui/InlineLink' +import { useBackupDownloadMutation } from '@/data/database/backup-download-mutation' +import { useDownloadableBackupQuery } from '@/data/database/backup-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' + export const RestoreFailedState = () => { const { ref } = useParams() const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/layouts/ProjectLayout/RestorePaidPlanProjectNotice.tsx b/apps/studio/components/layouts/ProjectLayout/RestorePaidPlanProjectNotice.tsx index c05285b283..b9da9a7a8d 100644 --- a/apps/studio/components/layouts/ProjectLayout/RestorePaidPlanProjectNotice.tsx +++ b/apps/studio/components/layouts/ProjectLayout/RestorePaidPlanProjectNotice.tsx @@ -1,13 +1,14 @@ -import { DOCS_URL } from 'lib/constants' import { ExternalLink } from 'lucide-react' import { + Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, - Alert_Shadcn_, Button, WarningIcon, } from 'ui' +import { DOCS_URL } from '@/lib/constants' + export const RestorePaidPlanProjectNotice = () => { return ( diff --git a/apps/studio/components/layouts/ProjectLayout/RestoringState.tsx b/apps/studio/components/layouts/ProjectLayout/RestoringState.tsx index 3538e4cb8e..54a788982a 100644 --- a/apps/studio/components/layouts/ProjectLayout/RestoringState.tsx +++ b/apps/studio/components/layouts/ProjectLayout/RestoringState.tsx @@ -1,14 +1,6 @@ import { SupportCategories } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { SupportLink } from 'components/interfaces/Support/SupportLink' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useBackupDownloadMutation } from 'data/database/backup-download-mutation' -import { useDownloadableBackupQuery } from 'data/database/backup-query' -import { useInvalidateProjectDetailsQuery } from 'data/projects/project-detail-query' -import { useProjectStatusQuery } from 'data/projects/project-status-query' import dayjs from 'dayjs' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { PROJECT_STATUS } from 'lib/constants' import { CheckCircle, Download, Loader } from 'lucide-react' import { useEffect, useState } from 'react' import { @@ -23,6 +15,15 @@ import { DialogTrigger, } from 'ui' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useBackupDownloadMutation } from '@/data/database/backup-download-mutation' +import { useDownloadableBackupQuery } from '@/data/database/backup-query' +import { useInvalidateProjectDetailsQuery } from '@/data/projects/project-detail-query' +import { useProjectStatusQuery } from '@/data/projects/project-status-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { PROJECT_STATUS } from '@/lib/constants' + export const RestoringState = () => { const { ref } = useParams() const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/layouts/ProjectLayout/UpgradingState/index.tsx b/apps/studio/components/layouts/ProjectLayout/UpgradingState/index.tsx index 7a115e941a..c30c38a0f7 100644 --- a/apps/studio/components/layouts/ProjectLayout/UpgradingState/index.tsx +++ b/apps/studio/components/layouts/ProjectLayout/UpgradingState/index.tsx @@ -1,4 +1,6 @@ +import { SupportCategories } from '@supabase/shared-types/out/constants' import { DatabaseUpgradeProgress, DatabaseUpgradeStatus } from '@supabase/shared-types/out/events' +import { useParams } from 'common' import dayjs from 'dayjs' import { AlertCircle, @@ -12,16 +14,14 @@ import { } from 'lucide-react' import { useSearchParams } from 'next/navigation' import { useState } from 'react' - -import { SupportCategories } from '@supabase/shared-types/out/constants' -import { useParams } from 'common' -import { SupportLink } from 'components/interfaces/Support/SupportLink' -import { useProjectUpgradingStatusQuery } from 'data/config/project-upgrade-status-query' -import { useInvalidateProjectDetailsQuery } from 'data/projects/project-detail-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { IS_PLATFORM } from 'lib/constants' import { Button, Tooltip, TooltipContent, TooltipTrigger } from 'ui' + import { DATABASE_UPGRADE_MESSAGES } from './UpgradingState.constants' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' +import { useProjectUpgradingStatusQuery } from '@/data/config/project-upgrade-status-query' +import { useInvalidateProjectDetailsQuery } from '@/data/projects/project-detail-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { IS_PLATFORM } from '@/lib/constants' export const UpgradingState = () => { const { ref } = useParams() diff --git a/apps/studio/components/layouts/ProjectSettingsLayout/ProjectSettings.Commands.tsx b/apps/studio/components/layouts/ProjectSettingsLayout/ProjectSettings.Commands.tsx index 046cf0e20e..0bb24b8774 100644 --- a/apps/studio/components/layouts/ProjectSettingsLayout/ProjectSettings.Commands.tsx +++ b/apps/studio/components/layouts/ProjectSettingsLayout/ProjectSettings.Commands.tsx @@ -1,11 +1,11 @@ import { useParams } from 'common' -import { useIsPlatformWebhooksEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' import { useRouter } from 'next/router' import type { CommandOptions, ICommand } from 'ui-patterns/CommandMenu' import { useRegisterCommands, useSetCommandMenuOpen } from 'ui-patterns/CommandMenu' import { IRouteCommand } from 'ui-patterns/CommandMenu/internal/types' import { COMMAND_MENU_SECTIONS } from '@/components/interfaces/App/CommandMenu/CommandMenu.utils' +import { useIsPlatformWebhooksEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' export function useProjectSettingsGotoCommands(options?: CommandOptions) { diff --git a/apps/studio/components/layouts/ProjectSettingsLayout/SettingsLayout.tsx b/apps/studio/components/layouts/ProjectSettingsLayout/SettingsLayout.tsx index 78788f8a3f..bd82ede3f2 100644 --- a/apps/studio/components/layouts/ProjectSettingsLayout/SettingsLayout.tsx +++ b/apps/studio/components/layouts/ProjectSettingsLayout/SettingsLayout.tsx @@ -1,10 +1,10 @@ -import { ProductMenu } from 'components/ui/ProductMenu' -import { withAuth } from 'hooks/misc/withAuth' import { useRouter } from 'next/router' import type { PropsWithChildren } from 'react' import { ProjectLayout } from '../ProjectLayout' import { useGenerateSettingsMenu } from './SettingsMenu.utils' +import { ProductMenu } from '@/components/ui/ProductMenu' +import { withAuth } from '@/hooks/misc/withAuth' /** * Menu-only component for the settings section. Used by the desktop sidebar and by the diff --git a/apps/studio/components/layouts/ProjectSettingsLayout/SettingsMenu.utils.tsx b/apps/studio/components/layouts/ProjectSettingsLayout/SettingsMenu.utils.tsx index 50454aba17..03b1da18cd 100644 --- a/apps/studio/components/layouts/ProjectSettingsLayout/SettingsMenu.utils.tsx +++ b/apps/studio/components/layouts/ProjectSettingsLayout/SettingsMenu.utils.tsx @@ -1,11 +1,11 @@ import { useFlag, useParams } from 'common' -import { IS_PLATFORM, PROJECT_STATUS } from 'lib/constants' import { ArrowUpRight } from 'lucide-react' import { useIsPlatformWebhooksEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { IS_PLATFORM, PROJECT_STATUS } from '@/lib/constants' export const useGenerateSettingsMenu = () => { const { ref } = useParams() diff --git a/apps/studio/components/layouts/RealtimeLayout/RealtimeLayout.tsx b/apps/studio/components/layouts/RealtimeLayout/RealtimeLayout.tsx index 6c4bfe001a..4e2cf485ea 100644 --- a/apps/studio/components/layouts/RealtimeLayout/RealtimeLayout.tsx +++ b/apps/studio/components/layouts/RealtimeLayout/RealtimeLayout.tsx @@ -1,11 +1,11 @@ -import { ProductMenu } from 'components/ui/ProductMenu' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { withAuth } from 'hooks/misc/withAuth' import { useRouter } from 'next/router' import type { PropsWithChildren } from 'react' import { ProjectLayout } from '../ProjectLayout' import { generateRealtimeMenu } from './RealtimeMenu.utils' +import { ProductMenu } from '@/components/ui/ProductMenu' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { withAuth } from '@/hooks/misc/withAuth' /** * Menu-only component for the Realtime section. Used by the desktop sidebar and by the diff --git a/apps/studio/components/layouts/RealtimeLayout/RealtimeMenu.utils.ts b/apps/studio/components/layouts/RealtimeLayout/RealtimeMenu.utils.ts index 387e3d9f28..3c2b36f093 100644 --- a/apps/studio/components/layouts/RealtimeLayout/RealtimeMenu.utils.ts +++ b/apps/studio/components/layouts/RealtimeLayout/RealtimeMenu.utils.ts @@ -1,6 +1,6 @@ -import type { ProductMenuGroup } from 'components/ui/ProductMenu/ProductMenu.types' -import type { Project } from 'data/projects/project-detail-query' -import { IS_PLATFORM } from 'lib/constants' +import type { ProductMenuGroup } from '@/components/ui/ProductMenu/ProductMenu.types' +import type { Project } from '@/data/projects/project-detail-query' +import { IS_PLATFORM } from '@/lib/constants' export const generateRealtimeMenu = (project: Project | undefined): ProductMenuGroup[] => { const ref = project?.ref ?? 'default' diff --git a/apps/studio/components/layouts/RedeemCreditsLayout.tsx b/apps/studio/components/layouts/RedeemCreditsLayout.tsx index f2db6eafae..865d7f0f52 100644 --- a/apps/studio/components/layouts/RedeemCreditsLayout.tsx +++ b/apps/studio/components/layouts/RedeemCreditsLayout.tsx @@ -1,11 +1,12 @@ -import { useCustomContent } from 'hooks/custom-content/useCustomContent' -import { BASE_PATH } from 'lib/constants' import { useTheme } from 'next-themes' import Head from 'next/head' import Image from 'next/legacy/image' import type { PropsWithChildren } from 'react' import { Separator } from 'ui' + import { withAuth } from '../../hooks/misc/withAuth' +import { useCustomContent } from '@/hooks/custom-content/useCustomContent' +import { BASE_PATH } from '@/lib/constants' export interface RedeemCreditsLayoutProps {} diff --git a/apps/studio/components/layouts/ReportsLayout/ReportMenuItem.tsx b/apps/studio/components/layouts/ReportsLayout/ReportMenuItem.tsx index 0b8b048919..c3ab64f431 100644 --- a/apps/studio/components/layouts/ReportsLayout/ReportMenuItem.tsx +++ b/apps/studio/components/layouts/ReportsLayout/ReportMenuItem.tsx @@ -1,11 +1,6 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { ChevronDown, Edit2, Trash } from 'lucide-react' import Link from 'next/link' - -import { ContentBase } from 'data/content/content-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useProfile } from 'lib/profile' -import type { Dashboards } from 'types' import { Button, cn, @@ -16,6 +11,11 @@ import { DropdownMenuTrigger, } from 'ui' +import { ContentBase } from '@/data/content/content-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useProfile } from '@/lib/profile' +import type { Dashboards } from '@/types' + interface ReportMenuItemProps { item: { id?: string diff --git a/apps/studio/components/layouts/ReportsLayout/Reports.Commands.tsx b/apps/studio/components/layouts/ReportsLayout/Reports.Commands.tsx index 20d2216ec6..39113b7bf4 100644 --- a/apps/studio/components/layouts/ReportsLayout/Reports.Commands.tsx +++ b/apps/studio/components/layouts/ReportsLayout/Reports.Commands.tsx @@ -1,11 +1,11 @@ -import { useMemo } from 'react' - import { useParams } from 'common' -import { COMMAND_MENU_SECTIONS } from 'components/interfaces/App/CommandMenu/CommandMenu.utils' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' +import { useMemo } from 'react' import type { CommandOptions, ICommand } from 'ui-patterns/CommandMenu' import { orderSectionFirst, useQuery, useRegisterCommands } from 'ui-patterns/CommandMenu' +import { COMMAND_MENU_SECTIONS } from '@/components/interfaces/App/CommandMenu/CommandMenu.utils' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' + const QUERY_PERFORMANCE_COMMAND_ID = 'nav-reports-query-performance' export function useReportsGotoCommands(options?: CommandOptions) { diff --git a/apps/studio/components/layouts/ReportsLayout/ReportsMenu.tsx b/apps/studio/components/layouts/ReportsLayout/ReportsMenu.tsx index 89cf5c437b..799ee04a0e 100644 --- a/apps/studio/components/layouts/ReportsLayout/ReportsMenu.tsx +++ b/apps/studio/components/layouts/ReportsLayout/ReportsMenu.tsx @@ -1,13 +1,5 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { CreateReportModal } from 'components/interfaces/Reports/CreateReportModal' -import { UpdateCustomReportModal } from 'components/interfaces/Reports/UpdateModal' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useContentDeleteMutation } from 'data/content/content-delete-mutation' -import { Content, useContentQuery } from 'data/content/content-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useProfile } from 'lib/profile' import { Plus } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' @@ -19,6 +11,14 @@ import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { ReportMenuItem } from './ReportMenuItem' +import { CreateReportModal } from '@/components/interfaces/Reports/CreateReportModal' +import { UpdateCustomReportModal } from '@/components/interfaces/Reports/UpdateModal' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useContentDeleteMutation } from '@/data/content/content-delete-mutation' +import { Content, useContentQuery } from '@/data/content/content-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useProfile } from '@/lib/profile' const ReportsMenu = () => { const router = useRouter() diff --git a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorLayout.tsx b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorLayout.tsx index 52adbcfd5c..6ce9d4ddad 100644 --- a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorLayout.tsx +++ b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorLayout.tsx @@ -1,7 +1,8 @@ -import { OngoingQueriesPanel } from 'components/interfaces/SQLEditor/OngoingQueriesPanel' -import { withAuth } from 'hooks/misc/withAuth' import { ReactNode } from 'react' +import { OngoingQueriesPanel } from '@/components/interfaces/SQLEditor/OngoingQueriesPanel' +import { withAuth } from '@/hooks/misc/withAuth' + export interface SQLEditorLayoutProps { children: ReactNode } diff --git a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorMenu.tsx b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorMenu.tsx index a6af02d7ee..54ddc8bbc1 100644 --- a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorMenu.tsx +++ b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorMenu.tsx @@ -5,13 +5,6 @@ import { FilePlus, FolderPlus, Plus, X } from 'lucide-react' import { useRouter } from 'next/router' import { useEffect, useState } from 'react' import { toast } from 'sonner' - -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useLocalStorage } from 'hooks/misc/useLocalStorage' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useProfile } from 'lib/profile' -import { getAppStateSnapshot } from 'state/app-state' -import { useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' import { Button, DropdownMenu, @@ -28,8 +21,15 @@ import { InnerSideBarFilterSortDropdown, InnerSideBarFilterSortDropdownItem, } from 'ui-patterns/InnerSideMenu' + import { SearchList } from './SQLEditorNavV2/SearchList' import { SQLEditorNav } from './SQLEditorNavV2/SQLEditorNav' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useLocalStorage } from '@/hooks/misc/useLocalStorage' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useProfile } from '@/lib/profile' +import { getAppStateSnapshot } from '@/state/app-state' +import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' export const SQLEditorMenu = () => { const router = useRouter() diff --git a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/CommunitySnippetsSection.tsx b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/CommunitySnippetsSection.tsx index 5466d8c7b2..5444b69c5d 100644 --- a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/CommunitySnippetsSection.tsx +++ b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/CommunitySnippetsSection.tsx @@ -1,5 +1,4 @@ import { LOCAL_STORAGE_KEYS, useParams } from 'common' -import { useLocalStorage } from 'hooks/misc/useLocalStorage' import { BookText } from 'lucide-react' import { useRouter } from 'next/router' import { @@ -8,7 +7,9 @@ import { InnerSideMenuCollapsibleTrigger, } from 'ui-patterns' import { InnerSideMenuDataItem } from 'ui-patterns/InnerSideMenu' + import { DEFAULT_SECTION_STATE, type SectionState } from './SQLEditorNav.constants' +import { useLocalStorage } from '@/hooks/misc/useLocalStorage' const OPTIONS = ['templates', 'quickstarts'] as const diff --git a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/DeleteSnippetsModal.tsx b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/DeleteSnippetsModal.tsx index 3ba65b2fab..b4444814c2 100644 --- a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/DeleteSnippetsModal.tsx +++ b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/DeleteSnippetsModal.tsx @@ -1,13 +1,13 @@ +import { useParams } from 'common' import { useRouter } from 'next/router' import { toast } from 'sonner' - -import { useParams } from 'common' -import { useContentDeleteMutation } from 'data/content/content-delete-mutation' -import { Snippet } from 'data/content/sql-folders-query' -import { useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' -import { createTabId, useTabsStateSnapshot } from 'state/tabs' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' +import { useContentDeleteMutation } from '@/data/content/content-delete-mutation' +import { Snippet } from '@/data/content/sql-folders-query' +import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' +import { createTabId, useTabsStateSnapshot } from '@/state/tabs' + export const DeleteSnippetsModal = ({ snippets, visible, diff --git a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorNav.tsx b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorNav.tsx index 680f80f1f0..06d86694a9 100644 --- a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorNav.tsx +++ b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorNav.tsx @@ -1,28 +1,9 @@ import { keepPreviousData } from '@tanstack/react-query' +import { IS_PLATFORM, LOCAL_STORAGE_KEYS, useParams } from 'common' import { Heart } from 'lucide-react' import { useRouter } from 'next/router' import { useEffect, useMemo, useState } from 'react' import { toast } from 'sonner' - -import { IS_PLATFORM, LOCAL_STORAGE_KEYS, useParams } from 'common' -import DownloadSnippetModal from 'components/interfaces/SQLEditor/DownloadSnippetModal' -import { MoveQueryModal } from 'components/interfaces/SQLEditor/MoveQueryModal' -import RenameQueryModal from 'components/interfaces/SQLEditor/RenameQueryModal' -import { generateSnippetTitle } from 'components/interfaces/SQLEditor/SQLEditor.constants' -import { createSqlSnippetSkeletonV2 } from 'components/interfaces/SQLEditor/SQLEditor.utils' -import { EmptyPrivateQueriesPanel } from 'components/layouts/SQLEditorLayout/PrivateSqlSnippetEmpty' -import EditorMenuListSkeleton from 'components/layouts/TableEditorLayout/EditorMenuListSkeleton' -import { useSqlEditorTabsCleanup } from 'components/layouts/Tabs/Tabs.utils' -import { useContentCountQuery } from 'data/content/content-count-query' -import { useContentDeleteMutation } from 'data/content/content-delete-mutation' -import { useSQLSnippetFoldersDeleteMutation } from 'data/content/sql-folders-delete-mutation' -import { Snippet, SnippetFolder, useSQLSnippetFoldersQuery } from 'data/content/sql-folders-query' -import { useSqlSnippetsQuery } from 'data/content/sql-snippets-query' -import { useLocalStorage } from 'hooks/misc/useLocalStorage' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useProfile } from 'lib/profile' -import { useSnippetFolders, useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' -import { createTabId, useTabsStateSnapshot } from 'state/tabs' import { TreeView } from 'ui' import { InnerSideBarEmptyPanel, @@ -32,14 +13,33 @@ import { InnerSideMenuSeparator, } from 'ui-patterns' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' + import { CommunitySnippetsSection } from './CommunitySnippetsSection' import { DeleteSnippetsModal } from './DeleteSnippetsModal' +import { ShareSnippetModal } from './ShareSnippetModal' import SQLEditorLoadingSnippets from './SQLEditorLoadingSnippets' import { DEFAULT_SECTION_STATE, type SectionState } from './SQLEditorNav.constants' import { formatFolderResponseForTreeView, getLastItemIds, ROOT_NODE } from './SQLEditorNav.utils' import { SQLEditorTreeViewItem } from './SQLEditorTreeViewItem' -import { ShareSnippetModal } from './ShareSnippetModal' import { UnshareSnippetModal } from './UnshareSnippetModal' +import DownloadSnippetModal from '@/components/interfaces/SQLEditor/DownloadSnippetModal' +import { MoveQueryModal } from '@/components/interfaces/SQLEditor/MoveQueryModal' +import RenameQueryModal from '@/components/interfaces/SQLEditor/RenameQueryModal' +import { generateSnippetTitle } from '@/components/interfaces/SQLEditor/SQLEditor.constants' +import { createSqlSnippetSkeletonV2 } from '@/components/interfaces/SQLEditor/SQLEditor.utils' +import { EmptyPrivateQueriesPanel } from '@/components/layouts/SQLEditorLayout/PrivateSqlSnippetEmpty' +import EditorMenuListSkeleton from '@/components/layouts/TableEditorLayout/EditorMenuListSkeleton' +import { useSqlEditorTabsCleanup } from '@/components/layouts/Tabs/Tabs.utils' +import { useContentCountQuery } from '@/data/content/content-count-query' +import { useContentDeleteMutation } from '@/data/content/content-delete-mutation' +import { useSQLSnippetFoldersDeleteMutation } from '@/data/content/sql-folders-delete-mutation' +import { Snippet, SnippetFolder, useSQLSnippetFoldersQuery } from '@/data/content/sql-folders-query' +import { useSqlSnippetsQuery } from '@/data/content/sql-snippets-query' +import { useLocalStorage } from '@/hooks/misc/useLocalStorage' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useProfile } from '@/lib/profile' +import { useSnippetFolders, useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' +import { createTabId, useTabsStateSnapshot } from '@/state/tabs' interface SQLEditorNavProps { sort?: 'inserted_at' | 'name' diff --git a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorNav.utils.ts b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorNav.utils.ts index ee581b3958..65f8dbd286 100644 --- a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorNav.utils.ts +++ b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorNav.utils.ts @@ -1,4 +1,4 @@ -import { SnippetFolderResponse } from 'data/content/sql-folders-query' +import { SnippetFolderResponse } from '@/data/content/sql-folders-query' export interface TreeViewItemProps { id: string | number diff --git a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorTreeViewItem.tsx b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorTreeViewItem.tsx index ad7a3c22c8..e670c639a3 100644 --- a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorTreeViewItem.tsx +++ b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorTreeViewItem.tsx @@ -1,4 +1,7 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { keepPreviousData } from '@tanstack/react-query' +import { IS_PLATFORM } from 'common' +import { useParams } from 'common/hooks/useParams' import { Copy, Download, @@ -14,30 +17,27 @@ import { import Link from 'next/link' import { useRouter } from 'next/router' import { ComponentProps, useEffect } from 'react' - -import { keepPreviousData } from '@tanstack/react-query' -import { IS_PLATFORM } from 'common' -import { useParams } from 'common/hooks/useParams' -import { createSqlSnippetSkeletonV2 } from 'components/interfaces/SQLEditor/SQLEditor.utils' -import { getContentById } from 'data/content/content-id-query' -import { useSQLSnippetFolderContentsQuery } from 'data/content/sql-folder-contents-query' -import { Snippet } from 'data/content/sql-folders-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import useLatest from 'hooks/misc/useLatest' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useProfile } from 'lib/profile' -import { useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' import { Button, + cn, + ContextMenu_Shadcn_, ContextMenuContent_Shadcn_, ContextMenuItem_Shadcn_, ContextMenuSeparator_Shadcn_, ContextMenuTrigger_Shadcn_, - ContextMenu_Shadcn_, TreeViewItem, - cn, } from 'ui' +import { createSqlSnippetSkeletonV2 } from '@/components/interfaces/SQLEditor/SQLEditor.utils' +import { getContentById } from '@/data/content/content-id-query' +import { useSQLSnippetFolderContentsQuery } from '@/data/content/sql-folder-contents-query' +import { Snippet } from '@/data/content/sql-folders-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import useLatest from '@/hooks/misc/useLatest' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useProfile } from '@/lib/profile' +import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' + interface SQLEditorTreeViewItemProps extends Omit< ComponentProps, 'name' | 'xPadding' diff --git a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SearchList.tsx b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SearchList.tsx index 3a19610198..23d14fbe84 100644 --- a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SearchList.tsx +++ b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SearchList.tsx @@ -1,21 +1,21 @@ -import { Loader2 } from 'lucide-react' -import { useMemo, useState } from 'react' - import { keepPreviousData } from '@tanstack/react-query' import { useParams } from 'common' -import DownloadSnippetModal from 'components/interfaces/SQLEditor/DownloadSnippetModal' -import RenameQueryModal from 'components/interfaces/SQLEditor/RenameQueryModal' -import { useContentCountQuery } from 'data/content/content-count-query' -import { useContentInfiniteQuery } from 'data/content/content-infinite-query' -import { Snippet, SNIPPET_PAGE_LIMIT } from 'data/content/sql-folders-query' -import { createTabId, useTabsStateSnapshot } from 'state/tabs' +import { Loader2 } from 'lucide-react' +import { useMemo, useState } from 'react' import { TreeView } from 'ui' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' + import { DeleteSnippetsModal } from './DeleteSnippetsModal' +import { ShareSnippetModal } from './ShareSnippetModal' import { formatFolderResponseForTreeView, getLastItemIds } from './SQLEditorNav.utils' import { SQLEditorTreeViewItem } from './SQLEditorTreeViewItem' -import { ShareSnippetModal } from './ShareSnippetModal' import { UnshareSnippetModal } from './UnshareSnippetModal' +import DownloadSnippetModal from '@/components/interfaces/SQLEditor/DownloadSnippetModal' +import RenameQueryModal from '@/components/interfaces/SQLEditor/RenameQueryModal' +import { useContentCountQuery } from '@/data/content/content-count-query' +import { useContentInfiniteQuery } from '@/data/content/content-infinite-query' +import { Snippet, SNIPPET_PAGE_LIMIT } from '@/data/content/sql-folders-query' +import { createTabId, useTabsStateSnapshot } from '@/state/tabs' interface SearchListProps { search: string diff --git a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/ShareSnippetModal.tsx b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/ShareSnippetModal.tsx index 5f0ebac1ff..99d2c3e09f 100644 --- a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/ShareSnippetModal.tsx +++ b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/ShareSnippetModal.tsx @@ -1,14 +1,14 @@ +import { useParams } from 'common' import { Eye, Unlock } from 'lucide-react' import { toast } from 'sonner' - -import { useParams } from 'common' -import { getContentById } from 'data/content/content-id-query' -import { useContentUpsertMutation } from 'data/content/content-upsert-mutation' -import { Snippet } from 'data/content/sql-folders-query' -import { useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' -import type { SqlSnippets } from 'types' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' +import { getContentById } from '@/data/content/content-id-query' +import { useContentUpsertMutation } from '@/data/content/content-upsert-mutation' +import { Snippet } from '@/data/content/sql-folders-query' +import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' +import type { SqlSnippets } from '@/types' + export const ShareSnippetModal = ({ snippet, onClose, diff --git a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/UnshareSnippetModal.tsx b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/UnshareSnippetModal.tsx index 42a9e4d0dc..efc2503add 100644 --- a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/UnshareSnippetModal.tsx +++ b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/UnshareSnippetModal.tsx @@ -1,14 +1,14 @@ +import { useParams } from 'common' import { EyeOffIcon } from 'lucide-react' import { toast } from 'sonner' - -import { useParams } from 'common' -import { getContentById } from 'data/content/content-id-query' -import { useContentUpsertMutation } from 'data/content/content-upsert-mutation' -import { Snippet } from 'data/content/sql-folders-query' -import { useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' -import type { SqlSnippets } from 'types' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' +import { getContentById } from '@/data/content/content-id-query' +import { useContentUpsertMutation } from '@/data/content/content-upsert-mutation' +import { Snippet } from '@/data/content/sql-folders-query' +import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' +import type { SqlSnippets } from '@/types' + export const UnshareSnippetModal = ({ snippet, onClose, diff --git a/apps/studio/components/layouts/SQLEditorLayout/SqlEditor.Commands.tsx b/apps/studio/components/layouts/SQLEditorLayout/SqlEditor.Commands.tsx index 9ad7541753..83e4faa732 100644 --- a/apps/studio/components/layouts/SQLEditorLayout/SqlEditor.Commands.tsx +++ b/apps/studio/components/layouts/SQLEditorLayout/SqlEditor.Commands.tsx @@ -1,14 +1,6 @@ import { type PostgresColumn } from '@supabase/postgres-meta' import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' -import { COMMAND_MENU_SECTIONS } from 'components/interfaces/App/CommandMenu/CommandMenu.utils' -import { orderCommandSectionsByPriority } from 'components/interfaces/App/CommandMenu/ordering' -import { useSqlSnippetsQuery, type SqlSnippet } from 'data/content/sql-snippets-query' -import { usePrefetchTables, useTablesQuery, type TablesData } from 'data/tables/tables-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useProtectedSchemas } from 'hooks/useProtectedSchemas' -import { useProfile } from 'lib/profile' import { AlertTriangle, Code, Loader2, Table2 } from 'lucide-react' import { useRouter } from 'next/navigation' import { useEffect, useMemo, useRef } from 'react' @@ -37,6 +29,15 @@ import { useSetPage, } from 'ui-patterns/CommandMenu' +import { COMMAND_MENU_SECTIONS } from '@/components/interfaces/App/CommandMenu/CommandMenu.utils' +import { orderCommandSectionsByPriority } from '@/components/interfaces/App/CommandMenu/ordering' +import { useSqlSnippetsQuery, type SqlSnippet } from '@/data/content/sql-snippets-query' +import { usePrefetchTables, useTablesQuery, type TablesData } from '@/data/tables/tables-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useProtectedSchemas } from '@/hooks/useProtectedSchemas' +import { useProfile } from '@/lib/profile' + export function useSqlEditorGotoCommands(options?: CommandOptions) { let { ref } = useParams() ref ||= '_' diff --git a/apps/studio/components/layouts/SignInLayout/ForgotPasswordLayout.tsx b/apps/studio/components/layouts/SignInLayout/ForgotPasswordLayout.tsx index 58c8b61309..30a25f3245 100644 --- a/apps/studio/components/layouts/SignInLayout/ForgotPasswordLayout.tsx +++ b/apps/studio/components/layouts/SignInLayout/ForgotPasswordLayout.tsx @@ -1,10 +1,11 @@ -import { BASE_PATH } from 'lib/constants' import { useTheme } from 'next-themes' import Image from 'next/legacy/image' import Link from 'next/link' import { PropsWithChildren } from 'react' import { cn } from 'ui' +import { BASE_PATH } from '@/lib/constants' + type ForgotPasswordLayoutProps = { heading?: string subheading?: string diff --git a/apps/studio/components/layouts/SignInLayout/SignInLayout.tsx b/apps/studio/components/layouts/SignInLayout/SignInLayout.tsx index 1b419ec8f3..d692beb9f2 100644 --- a/apps/studio/components/layouts/SignInLayout/SignInLayout.tsx +++ b/apps/studio/components/layouts/SignInLayout/SignInLayout.tsx @@ -1,16 +1,16 @@ import { useQueryClient } from '@tanstack/react-query' +import { getAccessToken, useFlag } from 'common' import { useTheme } from 'next-themes' import Link from 'next/link' import { useRouter } from 'next/router' import { PropsWithChildren, useEffect, useState } from 'react' - -import { getAccessToken, useFlag } from 'common' -import { DocsButton } from 'components/ui/DocsButton' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { BASE_PATH, DOCS_URL } from 'lib/constants' -import { auth, buildPathWithParams, getReturnToPath } from 'lib/gotrue' import { tweets } from 'shared-data' +import { DocsButton } from '@/components/ui/DocsButton' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { BASE_PATH, DOCS_URL } from '@/lib/constants' +import { auth, buildPathWithParams, getReturnToPath } from '@/lib/gotrue' + type SignInLayoutProps = { heading: string subheading: string diff --git a/apps/studio/components/layouts/StorageLayout/StorageBucketsLayout.tsx b/apps/studio/components/layouts/StorageLayout/StorageBucketsLayout.tsx index 4a74e00a15..472e5d7c81 100644 --- a/apps/studio/components/layouts/StorageLayout/StorageBucketsLayout.tsx +++ b/apps/studio/components/layouts/StorageLayout/StorageBucketsLayout.tsx @@ -1,7 +1,4 @@ import { IS_PLATFORM, useParams } from 'common' -import { BUCKET_TYPES } from 'components/interfaces/Storage/Storage.constants' -import { useStorageV2Page } from 'components/interfaces/Storage/Storage.utils' -import { DocsButton } from 'components/ui/DocsButton' import Link from 'next/link' import { usePathname } from 'next/navigation' import { PropsWithChildren } from 'react' @@ -16,6 +13,10 @@ import { PageHeaderTitle, } from 'ui-patterns/PageHeader' +import { BUCKET_TYPES } from '@/components/interfaces/Storage/Storage.constants' +import { useStorageV2Page } from '@/components/interfaces/Storage/Storage.utils' +import { DocsButton } from '@/components/ui/DocsButton' + export const StorageBucketsLayout = ({ title, hideSubtitle = false, diff --git a/apps/studio/components/layouts/StorageLayout/StorageLayout.tsx b/apps/studio/components/layouts/StorageLayout/StorageLayout.tsx index 70cc2ba167..9ff619f534 100644 --- a/apps/studio/components/layouts/StorageLayout/StorageLayout.tsx +++ b/apps/studio/components/layouts/StorageLayout/StorageLayout.tsx @@ -1,8 +1,8 @@ -import { StorageMenuV2 } from 'components/interfaces/Storage/StorageMenuV2' -import { withAuth } from 'hooks/misc/withAuth' import { ReactNode } from 'react' import { ProjectLayout } from '../ProjectLayout' +import { StorageMenuV2 } from '@/components/interfaces/Storage/StorageMenuV2' +import { withAuth } from '@/hooks/misc/withAuth' export interface StorageLayoutProps { title: string diff --git a/apps/studio/components/layouts/TableEditorLayout/ExportAllRows.tsx b/apps/studio/components/layouts/TableEditorLayout/ExportAllRows.tsx index a23f6989b8..4d01a6adad 100644 --- a/apps/studio/components/layouts/TableEditorLayout/ExportAllRows.tsx +++ b/apps/studio/components/layouts/TableEditorLayout/ExportAllRows.tsx @@ -1,23 +1,10 @@ import { useQueryClient, type QueryClient } from '@tanstack/react-query' +import { IS_PLATFORM } from 'common' import saveAs from 'file-saver' import Papa from 'papaparse' import { useCallback, useState, type ReactNode } from 'react' - -import { IS_PLATFORM } from 'common' -import { parseSupaTable } from 'components/grid/SupabaseGrid.utils' -import type { Filter, Sort, SupaTable } from 'components/grid/types' -import { formatTableRowsToSQL } from 'components/interfaces/TableGridEditor/TableEntity.utils' -import { InlineLink } from 'components/ui/InlineLink' -import { ENTITY_TYPE } from 'data/entity-types/entity-type-constants' -import type { Entity } from 'data/entity-types/entity-types-infinite-query' -import { tableEditorKeys } from 'data/table-editor/keys' -import { getTableEditor, type TableEditorData } from 'data/table-editor/table-editor-query' -import { isTableLike } from 'data/table-editor/table-editor-types' -import { fetchAllTableRows } from 'data/table-rows/table-rows-query' -import { useStaticEffectEvent } from 'hooks/useStaticEffectEvent' -import { DOCS_URL } from 'lib/constants' -import type { RoleImpersonationState } from 'lib/role-impersonation' import { ConfirmationModal } from 'ui-patterns/Dialogs/ConfirmationModal' + import { BlobCreationError, DownloadSaveError, @@ -31,6 +18,19 @@ import { type ExportAllRowsErrorFamily, } from './ExportAllRows.errors' import { useProgressToasts } from './ExportAllRows.progress' +import { parseSupaTable } from '@/components/grid/SupabaseGrid.utils' +import type { Filter, Sort, SupaTable } from '@/components/grid/types' +import { formatTableRowsToSQL } from '@/components/interfaces/TableGridEditor/TableEntity.utils' +import { InlineLink } from '@/components/ui/InlineLink' +import { ENTITY_TYPE } from '@/data/entity-types/entity-type-constants' +import type { Entity } from '@/data/entity-types/entity-types-infinite-query' +import { tableEditorKeys } from '@/data/table-editor/keys' +import { getTableEditor, type TableEditorData } from '@/data/table-editor/table-editor-query' +import { isTableLike } from '@/data/table-editor/table-editor-types' +import { fetchAllTableRows } from '@/data/table-rows/table-rows-query' +import { useStaticEffectEvent } from '@/hooks/useStaticEffectEvent' +import { DOCS_URL } from '@/lib/constants' +import type { RoleImpersonationState } from '@/lib/role-impersonation' // [Joshen] CSV exports require this guard as a fail-safe if the table is // just too large for a browser to keep all the rows in memory before diff --git a/apps/studio/components/layouts/TableEditorLayout/TableEditor.Commands.tsx b/apps/studio/components/layouts/TableEditorLayout/TableEditor.Commands.tsx index 3207b4f872..41e3ef211c 100644 --- a/apps/studio/components/layouts/TableEditorLayout/TableEditor.Commands.tsx +++ b/apps/studio/components/layouts/TableEditorLayout/TableEditor.Commands.tsx @@ -1,12 +1,12 @@ -import { Table2 } from 'lucide-react' - import { useParams } from 'common' -import { COMMAND_MENU_SECTIONS } from 'components/interfaces/App/CommandMenu/CommandMenu.utils' -import { orderCommandSectionsByPriority } from 'components/interfaces/App/CommandMenu/ordering' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' +import { Table2 } from 'lucide-react' import type { CommandOptions } from 'ui-patterns/CommandMenu' import { useRegisterCommands } from 'ui-patterns/CommandMenu' +import { COMMAND_MENU_SECTIONS } from '@/components/interfaces/App/CommandMenu/CommandMenu.utils' +import { orderCommandSectionsByPriority } from '@/components/interfaces/App/CommandMenu/ordering' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' + export function useProjectLevelTableEditorCommands(options?: CommandOptions) { const { data: project } = useSelectedProjectQuery() const ref = project?.ref || '_' diff --git a/apps/studio/components/layouts/TableEditorLayout/TableEditorLayout.tsx b/apps/studio/components/layouts/TableEditorLayout/TableEditorLayout.tsx index 6d99d68dcb..5fef71bcf1 100644 --- a/apps/studio/components/layouts/TableEditorLayout/TableEditorLayout.tsx +++ b/apps/studio/components/layouts/TableEditorLayout/TableEditorLayout.tsx @@ -1,7 +1,5 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { LOCAL_STORAGE_KEYS, useParams } from 'common' -import NoPermission from 'components/ui/NoPermission' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { PropsWithChildren, useEffect } from 'react' import { ProjectLayoutWithAuth } from '../ProjectLayout' @@ -9,6 +7,8 @@ import { SaveQueueActionBar } from '@/components/grid/components/footer/operatio import { useIsQueueOperationsEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' import { BannerTableEditorQueueOperations } from '@/components/ui/BannerStack/Banners/BannerTableEditorQueueOperations' import { useBannerStack } from '@/components/ui/BannerStack/BannerStackProvider' +import NoPermission from '@/components/ui/NoPermission' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' export const TableEditorLayout = ({ children }: PropsWithChildren<{}>) => { diff --git a/apps/studio/components/layouts/TableEditorLayout/TableEditorMenu.tsx b/apps/studio/components/layouts/TableEditorLayout/TableEditorMenu.tsx index 9bc3596dc8..f4cdc12031 100644 --- a/apps/studio/components/layouts/TableEditorLayout/TableEditorMenu.tsx +++ b/apps/studio/components/layouts/TableEditorLayout/TableEditorMenu.tsx @@ -2,27 +2,8 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { keepPreviousData } from '@tanstack/react-query' import { useParams } from 'common' import { useBreakpoint } from 'common/hooks/useBreakpoint' -import { ExportDialog } from 'components/grid/components/header/ExportDialog' -import { parseSupaTable } from 'components/grid/SupabaseGrid.utils' -import { SupaTable } from 'components/grid/types' -import { ProtectedSchemaWarning } from 'components/interfaces/Database/ProtectedSchemaWarning' -import { ErrorMatcher } from 'components/interfaces/ErrorHandling/ErrorMatcher' -import EditorMenuListSkeleton from 'components/layouts/TableEditorLayout/EditorMenuListSkeleton' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { InfiniteListDefault, LoaderForIconMenuItems } from 'components/ui/InfiniteList' -import SchemaSelector from 'components/ui/SchemaSelector' -import { ENTITY_TYPE } from 'data/entity-types/entity-type-constants' -import { useEntityTypesQuery } from 'data/entity-types/entity-types-infinite-query' -import { useTableApiAccessQuery } from 'data/privileges/table-api-access-query' -import { getTableEditor, useTableEditorQuery } from 'data/table-editor/table-editor-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useLocalStorage } from 'hooks/misc/useLocalStorage' -import { useQuerySchemaState } from 'hooks/misc/useSchemaQueryState' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useIsProtectedSchema } from 'hooks/useProtectedSchemas' import { Filter, Plus } from 'lucide-react' import { useCallback, useEffect, useMemo, useState } from 'react' -import { useTableEditorStateSnapshot } from 'state/table-editor' import { Button, Checkbox_Shadcn_, @@ -42,6 +23,25 @@ import { import { useTableEditorTabsCleanUp } from '../Tabs/Tabs.utils' import { EntityListItem } from './EntityListItem' import { TableMenuEmptyState } from './TableMenuEmptyState' +import { ExportDialog } from '@/components/grid/components/header/ExportDialog' +import { parseSupaTable } from '@/components/grid/SupabaseGrid.utils' +import { SupaTable } from '@/components/grid/types' +import { ProtectedSchemaWarning } from '@/components/interfaces/Database/ProtectedSchemaWarning' +import { ErrorMatcher } from '@/components/interfaces/ErrorHandling/ErrorMatcher' +import EditorMenuListSkeleton from '@/components/layouts/TableEditorLayout/EditorMenuListSkeleton' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { InfiniteListDefault, LoaderForIconMenuItems } from '@/components/ui/InfiniteList' +import SchemaSelector from '@/components/ui/SchemaSelector' +import { ENTITY_TYPE } from '@/data/entity-types/entity-type-constants' +import { useEntityTypesQuery } from '@/data/entity-types/entity-types-infinite-query' +import { useTableApiAccessQuery } from '@/data/privileges/table-api-access-query' +import { getTableEditor, useTableEditorQuery } from '@/data/table-editor/table-editor-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useLocalStorage } from '@/hooks/misc/useLocalStorage' +import { useQuerySchemaState } from '@/hooks/misc/useSchemaQueryState' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useIsProtectedSchema } from '@/hooks/useProtectedSchemas' +import { useTableEditorStateSnapshot } from '@/state/table-editor' export const TableEditorMenu = () => { const { id: _id, ref: projectRef } = useParams() diff --git a/apps/studio/components/layouts/TableEditorLayout/TableMenuEmptyState.tsx b/apps/studio/components/layouts/TableEditorLayout/TableMenuEmptyState.tsx index 9fa3b33670..82ef9d6eff 100644 --- a/apps/studio/components/layouts/TableEditorLayout/TableMenuEmptyState.tsx +++ b/apps/studio/components/layouts/TableEditorLayout/TableMenuEmptyState.tsx @@ -1,9 +1,10 @@ import { useParams } from 'common' import { Pointer } from 'lucide-react' import { useRef } from 'react' -import { InnerSideBarEmptyPanel } from 'ui-patterns/InnerSideMenu' import { cn, TreeViewItemVariant } from 'ui' -import { EntityTypeIcon } from 'components/ui/EntityTypeIcon' +import { InnerSideBarEmptyPanel } from 'ui-patterns/InnerSideMenu' + +import { EntityTypeIcon } from '@/components/ui/EntityTypeIcon' export const TableMenuEmptyState = () => { return ( diff --git a/apps/studio/components/layouts/Tabs/CollapseButton.tsx b/apps/studio/components/layouts/Tabs/CollapseButton.tsx index 7daab686a7..2a7198fd40 100644 --- a/apps/studio/components/layouts/Tabs/CollapseButton.tsx +++ b/apps/studio/components/layouts/Tabs/CollapseButton.tsx @@ -1,8 +1,9 @@ import { useBreakpoint } from 'common' import { PanelLeftClose, PanelLeftOpen } from 'lucide-react' -import { useAppStateSnapshot } from 'state/app-state' import { cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' +import { useAppStateSnapshot } from '@/state/app-state' + export function CollapseButton({ hideTabs }: { hideTabs: boolean }) { const { showSidebar, setShowSidebar, mobileMenuOpen, setMobileMenuOpen } = useAppStateSnapshot() const isMobile = useBreakpoint('md') diff --git a/apps/studio/components/layouts/Tabs/NewTab.tsx b/apps/studio/components/layouts/Tabs/NewTab.tsx index 7cda3aa234..e4c4a8450f 100644 --- a/apps/studio/components/layouts/Tabs/NewTab.tsx +++ b/apps/studio/components/layouts/Tabs/NewTab.tsx @@ -1,35 +1,35 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { partition } from 'lodash' import { Table2 } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' import { toast } from 'sonner' - -import { useParams } from 'common' -import { SQL_TEMPLATES } from 'components/interfaces/SQLEditor/SQLEditor.queries' -import { createSqlSnippetSkeletonV2 } from 'components/interfaces/SQLEditor/SQLEditor.utils' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useQuerySchemaState } from 'hooks/misc/useSchemaQueryState' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useIsProtectedSchema } from 'hooks/useProtectedSchemas' -import { useProfile } from 'lib/profile' -import { useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' -import { useTableEditorStateSnapshot } from 'state/table-editor' -import { createTabId, useTabsStateSnapshot } from 'state/tabs' import { Button, + cn, SQL_ICON, + Tabs_Shadcn_, TabsContent_Shadcn_, TabsList_Shadcn_, TabsTrigger_Shadcn_, - Tabs_Shadcn_, - cn, } from 'ui' + import { useEditorType } from '../editors/EditorsLayout.hooks' import { ActionCard } from './ActionCard' import { RecentItems } from './RecentItems' +import { SQL_TEMPLATES } from '@/components/interfaces/SQLEditor/SQLEditor.queries' +import { createSqlSnippetSkeletonV2 } from '@/components/interfaces/SQLEditor/SQLEditor.utils' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useQuerySchemaState } from '@/hooks/misc/useSchemaQueryState' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useIsProtectedSchema } from '@/hooks/useProtectedSchemas' +import { useProfile } from '@/lib/profile' +import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' +import { useTableEditorStateSnapshot } from '@/state/table-editor' +import { createTabId, useTabsStateSnapshot } from '@/state/tabs' export function NewTab() { const router = useRouter() diff --git a/apps/studio/components/layouts/Tabs/RecentItems.tsx b/apps/studio/components/layouts/Tabs/RecentItems.tsx index 90fb50e485..08db7584b5 100644 --- a/apps/studio/components/layouts/Tabs/RecentItems.tsx +++ b/apps/studio/components/layouts/Tabs/RecentItems.tsx @@ -1,13 +1,13 @@ +import { useParams } from 'common' import dayjs from 'dayjs' import { AnimatePresence, motion } from 'framer-motion' import Link from 'next/link' -import { useParams } from 'common' -import { buildTableEditorUrl } from 'components/grid/SupabaseGrid.utils' -import { EntityTypeIcon } from 'components/ui/EntityTypeIcon' -import { ENTITY_TYPE } from 'data/entity-types/entity-type-constants' -import { editorEntityTypes, useTabsStateSnapshot } from 'state/tabs' import { useEditorType } from '../editors/EditorsLayout.hooks' +import { buildTableEditorUrl } from '@/components/grid/SupabaseGrid.utils' +import { EntityTypeIcon } from '@/components/ui/EntityTypeIcon' +import { ENTITY_TYPE } from '@/data/entity-types/entity-type-constants' +import { editorEntityTypes, useTabsStateSnapshot } from '@/state/tabs' export function RecentItems() { const { ref } = useParams() diff --git a/apps/studio/components/layouts/Tabs/SortableTab.tsx b/apps/studio/components/layouts/Tabs/SortableTab.tsx index b5b33f3744..ae06a2d810 100644 --- a/apps/studio/components/layouts/Tabs/SortableTab.tsx +++ b/apps/studio/components/layouts/Tabs/SortableTab.tsx @@ -1,14 +1,14 @@ import { useSortable } from '@dnd-kit/sortable' import { CSS } from '@dnd-kit/utilities' -import { EntityTypeIcon } from 'components/ui/EntityTypeIcon' import { AnimatePresence, motion } from 'framer-motion' -import { useQuerySchemaState } from 'hooks/misc/useSchemaQueryState' import { X } from 'lucide-react' import { useMemo } from 'react' -import { useTabsStateSnapshot, type Tab } from 'state/tabs' import { cn, TabsTrigger_Shadcn_ } from 'ui' import { useEditorType } from '../editors/EditorsLayout.hooks' +import { EntityTypeIcon } from '@/components/ui/EntityTypeIcon' +import { useQuerySchemaState } from '@/hooks/misc/useSchemaQueryState' +import { useTabsStateSnapshot, type Tab } from '@/state/tabs' /** * Individual draggable tab component that handles: diff --git a/apps/studio/components/layouts/Tabs/TabPreview.tsx b/apps/studio/components/layouts/Tabs/TabPreview.tsx index 44e608427d..ed75833d1b 100644 --- a/apps/studio/components/layouts/Tabs/TabPreview.tsx +++ b/apps/studio/components/layouts/Tabs/TabPreview.tsx @@ -1,8 +1,8 @@ +import { useParams } from 'common' import { motion } from 'framer-motion' -import { useParams } from 'common' -import { EntityTypeIcon } from 'components/ui/EntityTypeIcon' -import { useTabsStateSnapshot } from 'state/tabs' +import { EntityTypeIcon } from '@/components/ui/EntityTypeIcon' +import { useTabsStateSnapshot } from '@/state/tabs' export const TabPreview = ({ tab }: { tab: string }) => { const { ref } = useParams() diff --git a/apps/studio/components/layouts/Tabs/Tabs.tsx b/apps/studio/components/layouts/Tabs/Tabs.tsx index a84460da48..bc12ca07b0 100644 --- a/apps/studio/components/layouts/Tabs/Tabs.tsx +++ b/apps/studio/components/layouts/Tabs/Tabs.tsx @@ -9,11 +9,9 @@ import { import { horizontalListSortingStrategy, SortableContext } from '@dnd-kit/sortable' import { useParams } from 'common' import { AnimatePresence, motion } from 'framer-motion' -import { useDashboardHistory } from 'hooks/misc/useDashboardHistory' import { Plus, X } from 'lucide-react' import { useRouter } from 'next/router' import { useEffect } from 'react' -import { editorEntityTypes, useTabsStateSnapshot, type Tab } from 'state/tabs' import { cn, ContextMenu_Shadcn_, @@ -30,6 +28,8 @@ import { CollapseButton } from './CollapseButton' import { SortableTab } from './SortableTab' import { TabPreview } from './TabPreview' import { useTabsScroll } from './Tabs.utils' +import { useDashboardHistory } from '@/hooks/misc/useDashboardHistory' +import { editorEntityTypes, useTabsStateSnapshot, type Tab } from '@/state/tabs' export const EditorTabs = () => { const { ref, id } = useParams() diff --git a/apps/studio/components/layouts/Tabs/Tabs.utils.ts b/apps/studio/components/layouts/Tabs/Tabs.utils.ts index 4919e516e6..3e1582745f 100644 --- a/apps/studio/components/layouts/Tabs/Tabs.utils.ts +++ b/apps/studio/components/layouts/Tabs/Tabs.utils.ts @@ -1,7 +1,8 @@ -import { Entity } from 'data/entity-types/entity-types-infinite-query' -import useLatest from 'hooks/misc/useLatest' import { useCallback, useEffect, useRef } from 'react' -import { createTabId, editorEntityTypes, useTabsStateSnapshot } from 'state/tabs' + +import { Entity } from '@/data/entity-types/entity-types-infinite-query' +import useLatest from '@/hooks/misc/useLatest' +import { createTabId, editorEntityTypes, useTabsStateSnapshot } from '@/state/tabs' export function useTableEditorTabsCleanUp() { const tabs = useTabsStateSnapshot() diff --git a/apps/studio/components/layouts/WizardLayout.tsx b/apps/studio/components/layouts/WizardLayout.tsx index 61a289fabf..758618116a 100644 --- a/apps/studio/components/layouts/WizardLayout.tsx +++ b/apps/studio/components/layouts/WizardLayout.tsx @@ -1,6 +1,6 @@ import { PropsWithChildren } from 'react' -import { withAuth } from 'hooks/misc/withAuth' +import { withAuth } from '@/hooks/misc/withAuth' const WizardLayout = ({ children }: PropsWithChildren<{}>) => { return ( diff --git a/apps/studio/components/layouts/editors/EditorBaseLayout.tsx b/apps/studio/components/layouts/editors/EditorBaseLayout.tsx index fdb7537724..3ff1003b34 100644 --- a/apps/studio/components/layouts/editors/EditorBaseLayout.tsx +++ b/apps/studio/components/layouts/editors/EditorBaseLayout.tsx @@ -1,13 +1,13 @@ import { useParams } from 'common' import { usePathname } from 'next/navigation' import { ComponentProps, ReactNode } from 'react' -import { useTabsStateSnapshot } from 'state/tabs' import { cn } from 'ui' import { ProjectLayoutWithAuth } from '../ProjectLayout' import { CollapseButton } from '../Tabs/CollapseButton' import { EditorTabs } from '../Tabs/Tabs' import { useEditorType } from './EditorsLayout.hooks' +import { useTabsStateSnapshot } from '@/state/tabs' export interface ExplorerLayoutProps extends ComponentProps { children: ReactNode diff --git a/apps/studio/components/layouts/useLayoutNavCommands.ts b/apps/studio/components/layouts/useLayoutNavCommands.ts index 8ea4b8ccc0..bc37ee9ce9 100644 --- a/apps/studio/components/layouts/useLayoutNavCommands.ts +++ b/apps/studio/components/layouts/useLayoutNavCommands.ts @@ -1,5 +1,6 @@ import { useIsLoggedIn } from 'common' -import { useApiDocsGotoCommands } from 'components/interfaces/ProjectAPIDocs/ProjectAPIDocs.Commands' + +import { useStorageGotoCommands } from '../interfaces/Storage/Storage.Commands' import { useAdvisorsGoToCommands } from './AdvisorsLayout/Advisors.Commands' import { useAuthGotoCommands } from './AuthLayout/Auth.Commands' import { useBillingGotoCommands } from './BillingLayout/Billing.Commands' @@ -10,8 +11,8 @@ import { useLogsGotoCommands } from './LogsLayout/Logs.Commands' import { useProjectSettingsGotoCommands } from './ProjectSettingsLayout/ProjectSettings.Commands' import { useReportsGotoCommands } from './ReportsLayout/Reports.Commands' import { useSqlEditorGotoCommands } from './SQLEditorLayout/SqlEditor.Commands' -import { useStorageGotoCommands } from '../interfaces/Storage/Storage.Commands' import { useTableEditorGotoCommands } from './TableEditorLayout/TableEditor.Commands' +import { useApiDocsGotoCommands } from '@/components/interfaces/ProjectAPIDocs/ProjectAPIDocs.Commands' export function useLayoutNavCommands() { const isLoggedIn = useIsLoggedIn() diff --git a/apps/studio/components/to-be-cleaned/ProductEmptyState.tsx b/apps/studio/components/to-be-cleaned/ProductEmptyState.tsx index 2b7d675a58..afc2ec19ee 100644 --- a/apps/studio/components/to-be-cleaned/ProductEmptyState.tsx +++ b/apps/studio/components/to-be-cleaned/ProductEmptyState.tsx @@ -1,10 +1,10 @@ import { ExternalLink } from 'lucide-react' -import { PropsWithChildren } from 'react' - -import { ButtonTooltip } from 'components/ui/ButtonTooltip' import Link from 'next/link' +import { PropsWithChildren } from 'react' import { Button } from 'ui' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' + interface ProductEmptyStateProps { title?: string size?: 'medium' | 'large' diff --git a/apps/studio/components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog.tsx b/apps/studio/components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog.tsx index d1cb633596..8944bb8aa4 100644 --- a/apps/studio/components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog.tsx +++ b/apps/studio/components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog.tsx @@ -1,8 +1,6 @@ 'use client' import { useCallback, useEffect, useRef, type ReactNode } from 'react' - -import { type ConfirmOnCloseModalProps } from 'hooks/ui/useConfirmOnClose' import { AlertDialog, AlertDialogAction, @@ -14,6 +12,8 @@ import { AlertDialogTitle, } from 'ui' +import { type ConfirmOnCloseModalProps } from '@/hooks/ui/useConfirmOnClose' + export interface DiscardChangesConfirmationDialogProps extends ConfirmOnCloseModalProps { title?: ReactNode description?: ReactNode diff --git a/apps/studio/components/ui/AIAssistantPanel/AIAssistant.tsx b/apps/studio/components/ui/AIAssistantPanel/AIAssistant.tsx index 0b4566c2a0..6c3dabef41 100644 --- a/apps/studio/components/ui/AIAssistantPanel/AIAssistant.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/AIAssistant.tsx @@ -1,41 +1,19 @@ import type { UIMessage as MessageType } from '@ai-sdk/react' import { useChat } from '@ai-sdk/react' import { lastAssistantMessageIsCompleteWithToolCalls } from 'ai' +import { LOCAL_STORAGE_KEYS, useFlag } from 'common' +import { useParams, useSearchParamsShallow } from 'common/hooks' import { AnimatePresence, motion } from 'framer-motion' import { Eraser, Pencil, X } from 'lucide-react' import { useRouter } from 'next/router' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' - -import { LOCAL_STORAGE_KEYS, useFlag } from 'common' -import { useParams, useSearchParamsShallow } from 'common/hooks' -import { Markdown } from 'components/interfaces/Markdown' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { useCheckOpenAIKeyQuery } from 'data/ai/check-api-key-query' -import { useRateMessageMutation } from 'data/ai/rate-message-mutation' -import { useTablesQuery } from 'data/tables/tables-query' -import { useTrack } from 'lib/telemetry/track' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { useOrgAiOptInLevel } from 'hooks/misc/useOrgOptedIntoAi' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useHotKey } from 'hooks/ui/useHotKey' -import { - DEFAULT_ASSISTANT_BASE_MODEL_ID, - defaultAssistantModelId, - isAssistantBaseModelId, - isKnownAssistantModelId, -} from 'lib/ai/model.utils' -import { IS_PLATFORM } from 'lib/constants' -import { uuidv4 } from 'lib/helpers' -import type { AssistantModel } from 'state/ai-assistant-state' -import { useAiAssistantState, useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' -import { useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' import { Button, cn, KeyboardShortcut } from 'ui' import { Admonition } from 'ui-patterns' +import AlertError from '../AlertError' import { ButtonTooltip } from '../ButtonTooltip' import { ErrorBoundary } from '../ErrorBoundary/ErrorBoundary' +import { ASSISTANT_ERRORS } from './AiAssistant.constants' import type { SqlSnippet } from './AIAssistant.types' import { onErrorChat } from './AIAssistant.utils' import { AIAssistantHeader } from './AIAssistantHeader' @@ -47,9 +25,30 @@ import { ConversationScrollButton, } from './elements/Conversation' import { Message } from './Message' -import AlertError from '../AlertError' -import { ASSISTANT_ERRORS } from './AiAssistant.constants' +import { Markdown } from '@/components/interfaces/Markdown' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { useCheckOpenAIKeyQuery } from '@/data/ai/check-api-key-query' +import { useRateMessageMutation } from '@/data/ai/rate-message-mutation' +import { useTablesQuery } from '@/data/tables/tables-query' import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { useOrgAiOptInLevel } from '@/hooks/misc/useOrgOptedIntoAi' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useHotKey } from '@/hooks/ui/useHotKey' +import { + DEFAULT_ASSISTANT_BASE_MODEL_ID, + defaultAssistantModelId, + isAssistantBaseModelId, + isKnownAssistantModelId, +} from '@/lib/ai/model.utils' +import { IS_PLATFORM } from '@/lib/constants' +import { uuidv4 } from '@/lib/helpers' +import { useTrack } from '@/lib/telemetry/track' +import type { AssistantModel } from '@/state/ai-assistant-state' +import { useAiAssistantState, useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' +import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' interface AIAssistantProps { initialMessages?: MessageType[] | undefined diff --git a/apps/studio/components/ui/AIAssistantPanel/AIAssistant.utils.test.ts b/apps/studio/components/ui/AIAssistantPanel/AIAssistant.utils.test.ts index 6ebfe8d93f..5e23e4ba8a 100644 --- a/apps/studio/components/ui/AIAssistantPanel/AIAssistant.utils.test.ts +++ b/apps/studio/components/ui/AIAssistantPanel/AIAssistant.utils.test.ts @@ -1,4 +1,5 @@ import { describe, expect, test } from 'vitest' + import { isReadOnlySelect } from './AIAssistant.utils' describe('AIAssistant.utils.ts:isReadOnlySelect', () => { diff --git a/apps/studio/components/ui/AIAssistantPanel/AIAssistant.utils.ts b/apps/studio/components/ui/AIAssistantPanel/AIAssistant.utils.ts index aa0cec1e05..63c2786325 100644 --- a/apps/studio/components/ui/AIAssistantPanel/AIAssistant.utils.ts +++ b/apps/studio/components/ui/AIAssistantPanel/AIAssistant.utils.ts @@ -1,17 +1,17 @@ -import { authKeys } from 'data/auth/keys' -import { databaseExtensionsKeys } from 'data/database-extensions/keys' -import { databaseIndexesKeys } from 'data/database-indexes/keys' -import { databasePoliciesKeys } from 'data/database-policies/keys' -import { databaseTriggerKeys } from 'data/database-triggers/keys' -import { databaseKeys } from 'data/database/keys' -import { enumeratedTypesKeys } from 'data/enumerated-types/keys' -import { handleError } from 'data/fetchers' -import { tableKeys } from 'data/tables/keys' -import { tryParseJson } from 'lib/helpers' import { toast } from 'sonner' -import { ResponseError } from 'types' import { SAFE_FUNCTIONS } from './AiAssistant.constants' +import { authKeys } from '@/data/auth/keys' +import { databaseExtensionsKeys } from '@/data/database-extensions/keys' +import { databaseIndexesKeys } from '@/data/database-indexes/keys' +import { databasePoliciesKeys } from '@/data/database-policies/keys' +import { databaseTriggerKeys } from '@/data/database-triggers/keys' +import { databaseKeys } from '@/data/database/keys' +import { enumeratedTypesKeys } from '@/data/enumerated-types/keys' +import { handleError } from '@/data/fetchers' +import { tableKeys } from '@/data/tables/keys' +import { tryParseJson } from '@/lib/helpers' +import { ResponseError } from '@/types' // [Joshen] This is just very basic identification, but possible can extend perhaps export const identifyQueryType = (query: string) => { diff --git a/apps/studio/components/ui/AIAssistantPanel/AIAssistantChatSelector.tsx b/apps/studio/components/ui/AIAssistantPanel/AIAssistantChatSelector.tsx index 4dac2ec53d..919b30782f 100644 --- a/apps/studio/components/ui/AIAssistantPanel/AIAssistantChatSelector.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/AIAssistantChatSelector.tsx @@ -1,7 +1,5 @@ import { Check, ChevronDown, Edit, Plus, Trash, X } from 'lucide-react' import { useState } from 'react' - -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' import { Button, cn, @@ -19,6 +17,8 @@ import { ScrollArea, } from 'ui' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' + interface AIAssistantChatSelectorProps { disabled?: boolean } diff --git a/apps/studio/components/ui/AIAssistantPanel/AIAssistantHeader.tsx b/apps/studio/components/ui/AIAssistantPanel/AIAssistantHeader.tsx index 3e6acc6378..4fafb19595 100644 --- a/apps/studio/components/ui/AIAssistantPanel/AIAssistantHeader.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/AIAssistantHeader.tsx @@ -1,6 +1,5 @@ import { Clipboard, Ellipsis, Plus, Settings, X } from 'lucide-react' import { useState } from 'react' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' import { AiIconAnimation, Button, @@ -15,6 +14,7 @@ import { Admonition } from 'ui-patterns' import { ButtonTooltip } from '../ButtonTooltip' import { AIAssistantChatSelector } from './AIAssistantChatSelector' import { AIOptInModal } from './AIOptInModal' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' interface AIAssistantHeaderProps { isChatLoading: boolean diff --git a/apps/studio/components/ui/AIAssistantPanel/AIOnboarding.tsx b/apps/studio/components/ui/AIAssistantPanel/AIOnboarding.tsx index 832160d4fa..4ed1c3a03e 100644 --- a/apps/studio/components/ui/AIAssistantPanel/AIOnboarding.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/AIOnboarding.tsx @@ -1,13 +1,13 @@ +import { useParams } from 'common' import { motion } from 'framer-motion' import { BarChart, FileText, Shield } from 'lucide-react' - -import { useParams } from 'common' -import { LINTER_LEVELS } from 'components/interfaces/Linter/Linter.constants' -import { createLintSummaryPrompt } from 'components/interfaces/Linter/Linter.utils' -import { type Lint, useProjectLintsQuery } from 'data/lint/lint-query' import { Button, Skeleton } from 'ui' + import { codeSnippetPrompts, defaultPrompts } from './AIAssistant.prompts' import type { SqlSnippet } from './AIAssistant.types' +import { LINTER_LEVELS } from '@/components/interfaces/Linter/Linter.constants' +import { createLintSummaryPrompt } from '@/components/interfaces/Linter/Linter.utils' +import { useProjectLintsQuery, type Lint } from '@/data/lint/lint-query' interface AIOnboardingProps { sqlSnippets?: SqlSnippet[] diff --git a/apps/studio/components/ui/AIAssistantPanel/AIOptInModal.tsx b/apps/studio/components/ui/AIAssistantPanel/AIOptInModal.tsx index d539c9eba1..62d32eee8c 100644 --- a/apps/studio/components/ui/AIAssistantPanel/AIOptInModal.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/AIOptInModal.tsx @@ -1,9 +1,5 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useEffect } from 'react' - -import { AIOptInLevelSelector } from 'components/interfaces/Organization/GeneralSettings/AIOptInLevelSelector' -import { useAIOptInForm } from 'hooks/forms/useAIOptInForm' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { Button, cn, @@ -17,6 +13,10 @@ import { Form_Shadcn_, } from 'ui' +import { AIOptInLevelSelector } from '@/components/interfaces/Organization/GeneralSettings/AIOptInLevelSelector' +import { useAIOptInForm } from '@/hooks/forms/useAIOptInForm' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' + interface AIOptInModalProps { visible: boolean onCancel: () => void diff --git a/apps/studio/components/ui/AIAssistantPanel/AssistantChatForm.tsx b/apps/studio/components/ui/AIAssistantPanel/AssistantChatForm.tsx index a97064a2f8..9e5d672b87 100644 --- a/apps/studio/components/ui/AIAssistantPanel/AssistantChatForm.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/AssistantChatForm.tsx @@ -1,14 +1,14 @@ +import { useBreakpoint } from 'common' import { ArrowUp, Loader2, Square } from 'lucide-react' import { ChangeEvent, FormEvent, forwardRef, KeyboardEvent, memo, useRef } from 'react' - -import { useBreakpoint } from 'common' import { ExpandingTextArea } from 'ui' import { cn } from 'ui/src/lib/utils' + import { ButtonTooltip } from '../ButtonTooltip' -import type { AssistantModelId } from 'lib/ai/model.utils' import { type SqlSnippet } from './AIAssistant.types' import { ModelSelector } from './ModelSelector' import { getSnippetContent, SnippetRow } from './SnippetRow' +import type { AssistantModelId } from '@/lib/ai/model.utils' export interface FormProps { /* The ref for the textarea, optional. Exposed for the CommandsPopover to attach events. */ diff --git a/apps/studio/components/ui/AIAssistantPanel/ConfirmFooter.tsx b/apps/studio/components/ui/AIAssistantPanel/ConfirmFooter.tsx index 8f79bddcd1..da4468fb07 100644 --- a/apps/studio/components/ui/AIAssistantPanel/ConfirmFooter.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/ConfirmFooter.tsx @@ -1,5 +1,4 @@ import { PropsWithChildren } from 'react' - import { Button, cn } from 'ui' interface ConfirmFooterProps { diff --git a/apps/studio/components/ui/AIAssistantPanel/DisplayBlockRenderer.tsx b/apps/studio/components/ui/AIAssistantPanel/DisplayBlockRenderer.tsx index 6ca37f7c1f..3849b5f33c 100644 --- a/apps/studio/components/ui/AIAssistantPanel/DisplayBlockRenderer.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/DisplayBlockRenderer.tsx @@ -1,22 +1,22 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useQueryClient } from '@tanstack/react-query' +import { useParams } from 'common' import { useRouter } from 'next/router' import { useRef, useState, type DragEvent, type PropsWithChildren } from 'react' -import { useParams } from 'common' -import { ChartConfig } from 'components/interfaces/SQLEditor/UtilityPanel/ChartConfig' -import { entityTypeKeys } from 'data/entity-types/keys' -import { lintKeys } from 'data/lint/keys' -import { usePrimaryDatabase } from 'data/read-replicas/replicas-query' -import { useExecuteSqlMutation } from 'data/sql/execute-sql-mutation' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useChangedSync } from 'hooks/misc/useChanged' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useProfile } from 'lib/profile' import { DEFAULT_CHART_CONFIG, QueryBlock } from '../QueryBlock/QueryBlock' import { identifyQueryType } from './AIAssistant.utils' import { ConfirmFooter } from './ConfirmFooter' +import { ChartConfig } from '@/components/interfaces/SQLEditor/UtilityPanel/ChartConfig' +import { entityTypeKeys } from '@/data/entity-types/keys' +import { lintKeys } from '@/data/lint/keys' +import { usePrimaryDatabase } from '@/data/read-replicas/replicas-query' +import { useExecuteSqlMutation } from '@/data/sql/execute-sql-mutation' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useChangedSync } from '@/hooks/misc/useChanged' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useProfile } from '@/lib/profile' interface DisplayBlockRendererProps { messageId: string diff --git a/apps/studio/components/ui/AIAssistantPanel/EdgeFunctionRenderer.tsx b/apps/studio/components/ui/AIAssistantPanel/EdgeFunctionRenderer.tsx index 7fade2aed7..a43ef28d4e 100644 --- a/apps/studio/components/ui/AIAssistantPanel/EdgeFunctionRenderer.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/EdgeFunctionRenderer.tsx @@ -1,14 +1,14 @@ -import { type PropsWithChildren, useMemo, useState } from 'react' +import { useParams } from 'common' +import { useMemo, useState, type PropsWithChildren } from 'react' import { toast } from 'sonner' -import { useParams } from 'common' -import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' -import { useEdgeFunctionQuery } from 'data/edge-functions/edge-function-query' -import { useEdgeFunctionDeployMutation } from 'data/edge-functions/edge-functions-deploy-mutation' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { EdgeFunctionBlock } from '../EdgeFunctionBlock/EdgeFunctionBlock' import { ConfirmFooter } from './ConfirmFooter' +import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' +import { useEdgeFunctionQuery } from '@/data/edge-functions/edge-function-query' +import { useEdgeFunctionDeployMutation } from '@/data/edge-functions/edge-functions-deploy-mutation' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' interface EdgeFunctionRendererProps { label: string diff --git a/apps/studio/components/ui/AIAssistantPanel/Message.Actions.tsx b/apps/studio/components/ui/AIAssistantPanel/Message.Actions.tsx index 7ee1705bbf..258116724f 100644 --- a/apps/studio/components/ui/AIAssistantPanel/Message.Actions.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/Message.Actions.tsx @@ -1,9 +1,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { Pencil, ThumbsDown, ThumbsUp, Trash2 } from 'lucide-react' -import { type PropsWithChildren, useEffect, useState } from 'react' +import { useEffect, useState, type PropsWithChildren } from 'react' import { useForm } from 'react-hook-form' -import * as z from 'zod' - import { Button, cn, @@ -16,6 +14,8 @@ import { TextArea_Shadcn_, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' +import * as z from 'zod' + import { ButtonTooltip } from '../ButtonTooltip' export function MessageActions({ diff --git a/apps/studio/components/ui/AIAssistantPanel/Message.Context.tsx b/apps/studio/components/ui/AIAssistantPanel/Message.Context.tsx index e9905ce824..3f29581b4c 100644 --- a/apps/studio/components/ui/AIAssistantPanel/Message.Context.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/Message.Context.tsx @@ -1,4 +1,4 @@ -import { createContext, type PropsWithChildren, useContext } from 'react' +import { createContext, useContext, type PropsWithChildren } from 'react' export type AddToolResult = (args: { tool: string diff --git a/apps/studio/components/ui/AIAssistantPanel/Message.Display.tsx b/apps/studio/components/ui/AIAssistantPanel/Message.Display.tsx index dc9c8b8da1..9d63ed44f2 100644 --- a/apps/studio/components/ui/AIAssistantPanel/Message.Display.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/Message.Display.tsx @@ -1,12 +1,12 @@ import { UIMessage as VercelMessage } from '@ai-sdk/react' -import { ProfileImage as ProfileImageDisplay } from 'components/ui/ProfileImage' -import { useProfileNameAndPicture } from 'lib/profile' import { type PropsWithChildren } from 'react' import { cn } from 'ui' import { useMessageInfoContext } from './Message.Context' import { MessagePartSwitcher } from './Message.Parts' import { MessageMarkdown } from './MessageMarkdown' +import { ProfileImage as ProfileImageDisplay } from '@/components/ui/ProfileImage' +import { useProfileNameAndPicture } from '@/lib/profile' function MessageDisplayProfileImage() { const { username, avatarUrl } = useProfileNameAndPicture() diff --git a/apps/studio/components/ui/AIAssistantPanel/Message.Parts.tsx b/apps/studio/components/ui/AIAssistantPanel/Message.Parts.tsx index c61c7b24cd..8707919ba2 100644 --- a/apps/studio/components/ui/AIAssistantPanel/Message.Parts.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/Message.Parts.tsx @@ -1,8 +1,8 @@ import { UIMessage as VercelMessage } from '@ai-sdk/react' import { type DynamicToolUIPart, type ReasoningUIPart, type TextUIPart, type ToolUIPart } from 'ai' import { BrainIcon, CheckIcon, Loader2 } from 'lucide-react' - import { cn } from 'ui' + import { DisplayBlockRenderer } from './DisplayBlockRenderer' import { EdgeFunctionRenderer } from './EdgeFunctionRenderer' import { Tool } from './elements/Tool' diff --git a/apps/studio/components/ui/AIAssistantPanel/Message.tsx b/apps/studio/components/ui/AIAssistantPanel/Message.tsx index 7796683852..313ed63de7 100644 --- a/apps/studio/components/ui/AIAssistantPanel/Message.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/Message.tsx @@ -1,13 +1,13 @@ import { UIMessage as VercelMessage } from '@ai-sdk/react' import { useState } from 'react' import { toast } from 'sonner' - import { cn } from 'ui' + import { DeleteMessageConfirmModal } from './DeleteMessageConfirmModal' import { MessageActions } from './Message.Actions' import type { AddToolResult, MessageInfo } from './Message.Context' -import { MessageDisplay } from './Message.Display' import { MessageProvider, useMessageActionsContext, useMessageInfoContext } from './Message.Context' +import { MessageDisplay } from './Message.Display' function AssistantMessage({ message }: { message: VercelMessage }) { const { id, variant, state, isLastMessage, readOnly, rating, isLoading } = useMessageInfoContext() diff --git a/apps/studio/components/ui/AIAssistantPanel/MessageMarkdown.tsx b/apps/studio/components/ui/AIAssistantPanel/MessageMarkdown.tsx index af11471c7a..b8370650bd 100644 --- a/apps/studio/components/ui/AIAssistantPanel/MessageMarkdown.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/MessageMarkdown.tsx @@ -1,4 +1,3 @@ -import { ChartConfig } from 'components/interfaces/SQLEditor/UtilityPanel/ChartConfig' import dynamic from 'next/dynamic' import Link from 'next/link' import { @@ -31,6 +30,7 @@ import { AssistantSnippetProps } from './AIAssistant.types' import { CollapsibleCodeBlock } from './CollapsibleCodeBlock' import { DisplayBlockRenderer } from './DisplayBlockRenderer' import { defaultUrlTransform, wrapPlaceholderUrls } from './Message.utils' +import { ChartConfig } from '@/components/interfaces/SQLEditor/UtilityPanel/ChartConfig' const Streamdown = dynamic( () => import('streamdown').then((mod) => mod.Streamdown), diff --git a/apps/studio/components/ui/AIAssistantPanel/ModelSelector.tsx b/apps/studio/components/ui/AIAssistantPanel/ModelSelector.tsx index c558d7bd69..819745a92d 100644 --- a/apps/studio/components/ui/AIAssistantPanel/ModelSelector.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/ModelSelector.tsx @@ -1,24 +1,25 @@ import { Check, ChevronsUpDown } from 'lucide-react' -import { useState } from 'react' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { useRouter } from 'next/router' +import { useState } from 'react' import { Badge, Button, + Command_Shadcn_, CommandGroup_Shadcn_, CommandItem_Shadcn_, CommandList_Shadcn_, - Command_Shadcn_, + Popover_Shadcn_, PopoverContent_Shadcn_, PopoverTrigger_Shadcn_, - Popover_Shadcn_, + Tooltip, TooltipContent, TooltipTrigger, - Tooltip, } from 'ui' + import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' -import { ASSISTANT_MODELS, isAdvanceOnlyModelId } from 'lib/ai/model.utils' -import type { AssistantModelId } from 'lib/ai/model.utils' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { ASSISTANT_MODELS, isAdvanceOnlyModelId } from '@/lib/ai/model.utils' +import type { AssistantModelId } from '@/lib/ai/model.utils' interface ModelSelectorProps { selectedModel: AssistantModelId diff --git a/apps/studio/components/ui/AIAssistantPanel/elements/Conversation.tsx b/apps/studio/components/ui/AIAssistantPanel/elements/Conversation.tsx index ff375a7dde..85f6a73869 100644 --- a/apps/studio/components/ui/AIAssistantPanel/elements/Conversation.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/elements/Conversation.tsx @@ -1,9 +1,8 @@ import { ArrowDownIcon } from 'lucide-react' import type { ComponentProps } from 'react' import { useCallback } from 'react' -import { StickToBottom, useStickToBottomContext } from 'use-stick-to-bottom' - import { Button, cn } from 'ui' +import { StickToBottom, useStickToBottomContext } from 'use-stick-to-bottom' type ConversationProps = ComponentProps type ConversationContentProps = ComponentProps diff --git a/apps/studio/components/ui/AIAssistantPanel/elements/Tool.tsx b/apps/studio/components/ui/AIAssistantPanel/elements/Tool.tsx index 458557ccc4..edb63921b7 100644 --- a/apps/studio/components/ui/AIAssistantPanel/elements/Tool.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/elements/Tool.tsx @@ -1,5 +1,4 @@ import type { PropsWithChildren } from 'react' - import { cn, Collapsible, diff --git a/apps/studio/components/ui/AIEditor/ResizableAIWidget.tsx b/apps/studio/components/ui/AIEditor/ResizableAIWidget.tsx index 999e9aa4d8..aa0075b119 100644 --- a/apps/studio/components/ui/AIEditor/ResizableAIWidget.tsx +++ b/apps/studio/components/ui/AIEditor/ResizableAIWidget.tsx @@ -1,8 +1,8 @@ import type { editor as monacoEditor } from 'monaco-editor' import { useCallback, useEffect, useRef, useState } from 'react' -import { AskAIWidget } from 'components/interfaces/SQLEditor/AskAIWidget' -import InlineWidget from 'components/interfaces/SQLEditor/InlineWidget' +import { AskAIWidget } from '@/components/interfaces/SQLEditor/AskAIWidget' +import InlineWidget from '@/components/interfaces/SQLEditor/InlineWidget' interface ResizableAIWidgetProps { editor: monacoEditor.IStandaloneCodeEditor | monacoEditor.IStandaloneDiffEditor diff --git a/apps/studio/components/ui/AIEditor/index.tsx b/apps/studio/components/ui/AIEditor/index.tsx index c3d6fbdbd7..f04d8c2636 100644 --- a/apps/studio/components/ui/AIEditor/index.tsx +++ b/apps/studio/components/ui/AIEditor/index.tsx @@ -1,16 +1,16 @@ import Editor, { Monaco, OnMount } from '@monaco-editor/react' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { constructHeaders } from 'data/fetchers' import { AnimatePresence, motion } from 'framer-motion' -import { detectOS } from 'lib/helpers' import { Command } from 'lucide-react' import type { editor as monacoEditor } from 'monaco-editor' import { useCallback, useEffect, useRef, useState } from 'react' import { toast } from 'sonner' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { DiffEditor } from '../DiffEditor' import ResizableAIWidget from './ResizableAIWidget' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { constructHeaders } from '@/data/fetchers' +import { detectOS } from '@/lib/helpers' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' interface AIEditorProps { id?: string diff --git a/apps/studio/components/ui/APIDocsButton.tsx b/apps/studio/components/ui/APIDocsButton.tsx index 2f3291b58b..894a2dad19 100644 --- a/apps/studio/components/ui/APIDocsButton.tsx +++ b/apps/studio/components/ui/APIDocsButton.tsx @@ -1,10 +1,10 @@ import { useParams } from 'common' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { BookOpenText } from 'lucide-react' -import { useAppStateSnapshot } from 'state/app-state' import { ButtonTooltip } from './ButtonTooltip' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useAppStateSnapshot } from '@/state/app-state' interface APIDocsButtonProps { section?: string[] diff --git a/apps/studio/components/ui/AdvisorPanel/AdvisorDetail.tsx b/apps/studio/components/ui/AdvisorPanel/AdvisorDetail.tsx index b6c2356631..b0ee624465 100644 --- a/apps/studio/components/ui/AdvisorPanel/AdvisorDetail.tsx +++ b/apps/studio/components/ui/AdvisorPanel/AdvisorDetail.tsx @@ -1,9 +1,10 @@ -import LintDetail from 'components/interfaces/Linter/LintDetail' -import { Lint } from 'data/lint/lint-query' -import { Notification } from 'data/notifications/notifications-v2-query' import { noop } from 'lodash' + import type { AdvisorItem } from './AdvisorPanel.types' import { NotificationDetail } from './NotificationDetail' +import LintDetail from '@/components/interfaces/Linter/LintDetail' +import { Lint } from '@/data/lint/lint-query' +import { Notification } from '@/data/notifications/notifications-v2-query' interface AdvisorDetailProps { item: AdvisorItem diff --git a/apps/studio/components/ui/AdvisorPanel/AdvisorFilters.tsx b/apps/studio/components/ui/AdvisorPanel/AdvisorFilters.tsx index 1e743400c5..e394ba0e41 100644 --- a/apps/studio/components/ui/AdvisorPanel/AdvisorFilters.tsx +++ b/apps/studio/components/ui/AdvisorPanel/AdvisorFilters.tsx @@ -1,9 +1,10 @@ -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { FilterPopover } from 'components/ui/FilterPopover' import { X } from 'lucide-react' -import { AdvisorSeverity, AdvisorTab } from 'state/advisor-state' import { Tabs_Shadcn_, TabsList_Shadcn_, TabsTrigger_Shadcn_ } from 'ui' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { FilterPopover } from '@/components/ui/FilterPopover' +import { AdvisorSeverity, AdvisorTab } from '@/state/advisor-state' + const severityOptions = [ { label: 'Critical', value: 'critical' }, { label: 'Warning', value: 'warning' }, diff --git a/apps/studio/components/ui/AdvisorPanel/AdvisorPanel.tsx b/apps/studio/components/ui/AdvisorPanel/AdvisorPanel.tsx index e3f8ec439b..66aa88d8e3 100644 --- a/apps/studio/components/ui/AdvisorPanel/AdvisorPanel.tsx +++ b/apps/studio/components/ui/AdvisorPanel/AdvisorPanel.tsx @@ -1,24 +1,24 @@ -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { Lint, useProjectLintsQuery } from 'data/lint/lint-query' -import { - Notification, - NotificationData, - useNotificationsV2Query, -} from 'data/notifications/notifications-v2-query' -import { useNotificationsV2UpdateMutation } from 'data/notifications/notifications-v2-update-mutation' import dayjs from 'dayjs' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { IS_PLATFORM } from 'lib/constants' -import { useTrack } from 'lib/telemetry/track' import { useMemo, useRef } from 'react' -import { AdvisorSeverity, AdvisorTab, useAdvisorStateSnapshot } from 'state/advisor-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { AdvisorDetail } from './AdvisorDetail' import { AdvisorFilters } from './AdvisorFilters' import type { AdvisorItem } from './AdvisorPanel.types' import { AdvisorPanelBody } from './AdvisorPanelBody' import { AdvisorPanelHeader } from './AdvisorPanelHeader' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { Lint, useProjectLintsQuery } from '@/data/lint/lint-query' +import { + Notification, + NotificationData, + useNotificationsV2Query, +} from '@/data/notifications/notifications-v2-query' +import { useNotificationsV2UpdateMutation } from '@/data/notifications/notifications-v2-update-mutation' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { IS_PLATFORM } from '@/lib/constants' +import { useTrack } from '@/lib/telemetry/track' +import { AdvisorSeverity, AdvisorTab, useAdvisorStateSnapshot } from '@/state/advisor-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' const severityOrder: Record = { critical: 0, diff --git a/apps/studio/components/ui/AdvisorPanel/AdvisorPanel.types.ts b/apps/studio/components/ui/AdvisorPanel/AdvisorPanel.types.ts index 3c24a57fe2..24103dcfcf 100644 --- a/apps/studio/components/ui/AdvisorPanel/AdvisorPanel.types.ts +++ b/apps/studio/components/ui/AdvisorPanel/AdvisorPanel.types.ts @@ -1,6 +1,6 @@ -import { Lint } from 'data/lint/lint-query' -import { Notification } from 'data/notifications/notifications-v2-query' -import { AdvisorItemSource, AdvisorSeverity } from 'state/advisor-state' +import { Lint } from '@/data/lint/lint-query' +import { Notification } from '@/data/notifications/notifications-v2-query' +import { AdvisorItemSource, AdvisorSeverity } from '@/state/advisor-state' export type AdvisorItem = { id: string diff --git a/apps/studio/components/ui/AdvisorPanel/AdvisorPanel.utils.ts b/apps/studio/components/ui/AdvisorPanel/AdvisorPanel.utils.ts index 19a9bbe53f..e740a40529 100644 --- a/apps/studio/components/ui/AdvisorPanel/AdvisorPanel.utils.ts +++ b/apps/studio/components/ui/AdvisorPanel/AdvisorPanel.utils.ts @@ -1,10 +1,10 @@ import dayjs from 'dayjs' import { Gauge, Inbox, Shield } from 'lucide-react' -import { lintInfoMap } from 'components/interfaces/Linter/Linter.utils' -import { Lint } from 'data/lint/lint-query' -import { AdvisorSeverity, AdvisorTab } from 'state/advisor-state' import type { AdvisorItem } from './AdvisorPanel.types' +import { lintInfoMap } from '@/components/interfaces/Linter/Linter.utils' +import { Lint } from '@/data/lint/lint-query' +import { AdvisorSeverity, AdvisorTab } from '@/state/advisor-state' export const formatItemDate = (timestamp: number): string => { const daysFromNow = dayjs().diff(dayjs(timestamp), 'day') diff --git a/apps/studio/components/ui/AdvisorPanel/AdvisorPanelBody.tsx b/apps/studio/components/ui/AdvisorPanel/AdvisorPanelBody.tsx index 3b7b80860d..b3a190826d 100644 --- a/apps/studio/components/ui/AdvisorPanel/AdvisorPanelBody.tsx +++ b/apps/studio/components/ui/AdvisorPanel/AdvisorPanelBody.tsx @@ -1,7 +1,4 @@ -import { Lint } from 'data/lint/lint-query' -import { Notification } from 'data/notifications/notifications-v2-query' import { AlertTriangle, ChevronRight, Inbox } from 'lucide-react' -import { AdvisorSeverity, AdvisorTab } from 'state/advisor-state' import { Badge, Button, cn } from 'ui' import { GenericSkeletonLoader } from 'ui-patterns' @@ -16,6 +13,9 @@ import { tabIconMap, } from './AdvisorPanel.utils' import { EmptyAdvisor } from './EmptyAdvisor' +import { Lint } from '@/data/lint/lint-query' +import { Notification } from '@/data/notifications/notifications-v2-query' +import { AdvisorSeverity, AdvisorTab } from '@/state/advisor-state' const NoProjectNotice = () => { return ( diff --git a/apps/studio/components/ui/AdvisorPanel/AdvisorPanelHeader.tsx b/apps/studio/components/ui/AdvisorPanel/AdvisorPanelHeader.tsx index bfee8cad72..42f73d1a5c 100644 --- a/apps/studio/components/ui/AdvisorPanel/AdvisorPanelHeader.tsx +++ b/apps/studio/components/ui/AdvisorPanel/AdvisorPanelHeader.tsx @@ -1,4 +1,3 @@ -import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { ChevronLeft, X } from 'lucide-react' import { Badge } from 'ui' @@ -9,6 +8,7 @@ import { severityBadgeVariants, severityLabels, } from './AdvisorPanel.utils' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' interface AdvisorPanelHeaderProps { selectedItem: AdvisorItem | undefined diff --git a/apps/studio/components/ui/AdvisorPanel/EmptyAdvisor.tsx b/apps/studio/components/ui/AdvisorPanel/EmptyAdvisor.tsx index 49c1647a6a..5032cea79c 100644 --- a/apps/studio/components/ui/AdvisorPanel/EmptyAdvisor.tsx +++ b/apps/studio/components/ui/AdvisorPanel/EmptyAdvisor.tsx @@ -1,6 +1,7 @@ import { TextSearch } from 'lucide-react' import { Button } from 'ui' -import { AdvisorTab } from 'state/advisor-state' + +import { AdvisorTab } from '@/state/advisor-state' interface EmptyAdvisorProps { activeTab: AdvisorTab diff --git a/apps/studio/components/ui/AdvisorPanel/NotificationDetail.tsx b/apps/studio/components/ui/AdvisorPanel/NotificationDetail.tsx index cb8cda263e..b7e6606a16 100644 --- a/apps/studio/components/ui/AdvisorPanel/NotificationDetail.tsx +++ b/apps/studio/components/ui/AdvisorPanel/NotificationDetail.tsx @@ -1,10 +1,11 @@ import { Archive, ArchiveRestoreIcon, ExternalLink } from 'lucide-react' import Link from 'next/link' import { Button } from 'ui' -import { Markdown } from 'components/interfaces/Markdown' -import { Notification, NotificationData } from 'data/notifications/notifications-v2-query' -import { useProjectDetailQuery } from 'data/projects/project-detail-query' -import { useOrganizationsQuery } from 'data/organizations/organizations-query' + +import { Markdown } from '@/components/interfaces/Markdown' +import { Notification, NotificationData } from '@/data/notifications/notifications-v2-query' +import { useOrganizationsQuery } from '@/data/organizations/organizations-query' +import { useProjectDetailQuery } from '@/data/projects/project-detail-query' interface NotificationDetailProps { notification: Notification diff --git a/apps/studio/components/ui/AiAssistantDropdown.tsx b/apps/studio/components/ui/AiAssistantDropdown.tsx index 84c85a2d9c..f2bd36cd5e 100644 --- a/apps/studio/components/ui/AiAssistantDropdown.tsx +++ b/apps/studio/components/ui/AiAssistantDropdown.tsx @@ -1,6 +1,5 @@ import { AiAssistantSource } from 'common/telemetry-constants' import { Chatgpt, Claude } from 'icons' -import { useTrack } from 'lib/telemetry/track' import { Check, ChevronDown, Copy } from 'lucide-react' import { ComponentProps, ReactNode, useEffect, useState } from 'react' import { @@ -18,6 +17,8 @@ import { TooltipTrigger, } from 'ui' +import { useTrack } from '@/lib/telemetry/track' + type TelemetrySource = AiAssistantSource const EXTERNAL_AI_TOOLS = [ diff --git a/apps/studio/components/ui/AlertError.tsx b/apps/studio/components/ui/AlertError.tsx index 822c289b42..e4358a95b8 100644 --- a/apps/studio/components/ui/AlertError.tsx +++ b/apps/studio/components/ui/AlertError.tsx @@ -1,10 +1,11 @@ import { SupportCategories } from '@supabase/shared-types/out/constants' -import { SupportLink } from 'components/interfaces/Support/SupportLink' -import { useTrack } from 'lib/telemetry/track' import { PropsWithChildren, useEffect, useRef } from 'react' import { Button } from 'ui' import { Admonition } from 'ui-patterns/admonition' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' +import { useTrack } from '@/lib/telemetry/track' + export interface AlertErrorProps { projectRef?: string subject?: string diff --git a/apps/studio/components/ui/AlphaNotice.tsx b/apps/studio/components/ui/AlphaNotice.tsx index 6511e7f47f..2831a09856 100644 --- a/apps/studio/components/ui/AlphaNotice.tsx +++ b/apps/studio/components/ui/AlphaNotice.tsx @@ -1,11 +1,11 @@ import { ExternalLink } from 'lucide-react' import Link from 'next/link' - -import { BASE_PATH } from 'lib/constants' import { PropsWithChildren } from 'react' import { Badge, Button } from 'ui' import { Admonition } from 'ui-patterns' +import { BASE_PATH } from '@/lib/constants' + interface AlphaNoticeProps { entity: string feedbackUrl: string diff --git a/apps/studio/components/ui/BannerStack/BannerCard.tsx b/apps/studio/components/ui/BannerStack/BannerCard.tsx index a364750ed1..100c828591 100644 --- a/apps/studio/components/ui/BannerStack/BannerCard.tsx +++ b/apps/studio/components/ui/BannerStack/BannerCard.tsx @@ -1,6 +1,7 @@ import { X } from 'lucide-react' import { Button, Card, CardContent, cn } from 'ui' -import { BASE_PATH } from 'lib/constants' + +import { BASE_PATH } from '@/lib/constants' interface BannerCardProps { onDismiss?: () => void diff --git a/apps/studio/components/ui/BannerStack/BannerStack.tsx b/apps/studio/components/ui/BannerStack/BannerStack.tsx index 4809e02bf0..5c7dbbc19c 100644 --- a/apps/studio/components/ui/BannerStack/BannerStack.tsx +++ b/apps/studio/components/ui/BannerStack/BannerStack.tsx @@ -1,8 +1,9 @@ +import { AnimatePresence, motion } from 'framer-motion' import { useState } from 'react' -import { motion, AnimatePresence } from 'framer-motion' -import { useBannerStack } from './BannerStackProvider' import { cn } from 'ui' +import { useBannerStack } from './BannerStackProvider' + export const BannerStack = () => { const { banners } = useBannerStack() const [isHovered, setIsHovered] = useState(false) diff --git a/apps/studio/components/ui/BannerStack/Banners/BannerIndexAdvisor.tsx b/apps/studio/components/ui/BannerStack/Banners/BannerIndexAdvisor.tsx index b2e1fe309c..50039a8111 100644 --- a/apps/studio/components/ui/BannerStack/Banners/BannerIndexAdvisor.tsx +++ b/apps/studio/components/ui/BannerStack/Banners/BannerIndexAdvisor.tsx @@ -1,11 +1,12 @@ import { LOCAL_STORAGE_KEYS } from 'common' import { useParams } from 'common/hooks' -import { EnableIndexAdvisorButton } from 'components/interfaces/QueryPerformance/IndexAdvisor/EnableIndexAdvisorButton' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { useTrack } from 'lib/telemetry/track' import { Lightbulb } from 'lucide-react' + import { BannerCard } from '../BannerCard' import { useBannerStack } from '../BannerStackProvider' +import { EnableIndexAdvisorButton } from '@/components/interfaces/QueryPerformance/IndexAdvisor/EnableIndexAdvisorButton' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { useTrack } from '@/lib/telemetry/track' export const BannerIndexAdvisor = () => { const track = useTrack() diff --git a/apps/studio/components/ui/BannerStack/Banners/BannerMetricsAPI.tsx b/apps/studio/components/ui/BannerStack/Banners/BannerMetricsAPI.tsx index 9bf58bb446..96119e76a7 100644 --- a/apps/studio/components/ui/BannerStack/Banners/BannerMetricsAPI.tsx +++ b/apps/studio/components/ui/BannerStack/Banners/BannerMetricsAPI.tsx @@ -1,15 +1,15 @@ -import { useParams } from 'common/hooks' -import { BannerCard } from '../BannerCard' -import { useTrack } from 'lib/telemetry/track' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' import { LOCAL_STORAGE_KEYS } from 'common' -import { Badge } from 'ui' -import { LOG_DRAIN_TYPES } from 'components/interfaces/LogDrains/LogDrains.constants' -import React from 'react' -import { Button } from 'ui' +import { useParams } from 'common/hooks' import Link from 'next/link' -import { DOCS_URL } from 'lib/constants' +import React from 'react' +import { Badge, Button } from 'ui' + +import { BannerCard } from '../BannerCard' import { useBannerStack } from '../BannerStackProvider' +import { LOG_DRAIN_TYPES } from '@/components/interfaces/LogDrains/LogDrains.constants' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { DOCS_URL } from '@/lib/constants' +import { useTrack } from '@/lib/telemetry/track' export const BannerMetricsAPI = () => { const { ref } = useParams() diff --git a/apps/studio/components/ui/BannerStack/Banners/BannerRlsEventTrigger.tsx b/apps/studio/components/ui/BannerStack/Banners/BannerRlsEventTrigger.tsx index 9f4295b844..1f0e87bf39 100644 --- a/apps/studio/components/ui/BannerStack/Banners/BannerRlsEventTrigger.tsx +++ b/apps/studio/components/ui/BannerStack/Banners/BannerRlsEventTrigger.tsx @@ -1,21 +1,21 @@ -import { ShieldCheck } from 'lucide-react' -import { useEffect, useMemo, useState } from 'react' - import { PermissionAction } from '@supabase/shared-types/out/constants' import { LOCAL_STORAGE_KEYS } from 'common' import { useParams } from 'common/hooks' -import { AUTO_ENABLE_RLS_EVENT_TRIGGER_SQL } from 'components/interfaces/Database/Triggers/EventTriggersList/EventTriggers.constants' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useDatabaseEventTriggerCreateMutation } from 'data/database-event-triggers/database-event-trigger-create-mutation' -import { useDatabaseEventTriggersQuery } from 'data/database-event-triggers/database-event-triggers-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useTrack } from 'lib/telemetry/track' +import { ShieldCheck } from 'lucide-react' import Link from 'next/link' +import { useEffect, useMemo, useState } from 'react' import { Button, cn } from 'ui' + import { BannerCard } from '../BannerCard' import { useBannerStack } from '../BannerStackProvider' +import { AUTO_ENABLE_RLS_EVENT_TRIGGER_SQL } from '@/components/interfaces/Database/Triggers/EventTriggersList/EventTriggers.constants' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useDatabaseEventTriggerCreateMutation } from '@/data/database-event-triggers/database-event-trigger-create-mutation' +import { useDatabaseEventTriggersQuery } from '@/data/database-event-triggers/database-event-triggers-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useTrack } from '@/lib/telemetry/track' export const BannerRlsEventTrigger = () => { const { ref } = useParams() diff --git a/apps/studio/components/ui/BannerStack/Banners/BannerTableEditorQueueOperations.tsx b/apps/studio/components/ui/BannerStack/Banners/BannerTableEditorQueueOperations.tsx index de2785590e..941e6427f0 100644 --- a/apps/studio/components/ui/BannerStack/Banners/BannerTableEditorQueueOperations.tsx +++ b/apps/studio/components/ui/BannerStack/Banners/BannerTableEditorQueueOperations.tsx @@ -1,6 +1,5 @@ import { LOCAL_STORAGE_KEYS } from 'common' import { useParams } from 'common/hooks' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' import { Badge, Button, Card, CardContent, CardHeader } from 'ui' import { BannerCard } from '../BannerCard' @@ -9,6 +8,7 @@ import { useFeaturePreviewModal, useIsQueueOperationsEnabled, } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' export const BannerTableEditorQueueOperations = () => { const { ref } = useParams() diff --git a/apps/studio/components/ui/ButtonTooltip.tsx b/apps/studio/components/ui/ButtonTooltip.tsx index 4837580d9c..f7ba3f1cac 100644 --- a/apps/studio/components/ui/ButtonTooltip.tsx +++ b/apps/studio/components/ui/ButtonTooltip.tsx @@ -1,5 +1,5 @@ -import { ComponentProps, ComponentPropsWithoutRef, ElementRef, ReactNode, forwardRef } from 'react' -import { Button, Tooltip, TooltipContent, TooltipTrigger, cn } from 'ui' +import { ComponentProps, ComponentPropsWithoutRef, ElementRef, forwardRef, ReactNode } from 'react' +import { Button, cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' export const ButtonTooltip = forwardRef< ElementRef, diff --git a/apps/studio/components/ui/CardButton.tsx b/apps/studio/components/ui/CardButton.tsx index 7aadcfb3ca..d156dc3e12 100644 --- a/apps/studio/components/ui/CardButton.tsx +++ b/apps/studio/components/ui/CardButton.tsx @@ -1,7 +1,6 @@ import { ChevronRight, Loader } from 'lucide-react' import Link from 'next/link' import React, { cloneElement, PropsWithChildren } from 'react' - import { cn } from 'ui' interface CardButtonProps { diff --git a/apps/studio/components/ui/Charts/AreaChart.tsx b/apps/studio/components/ui/Charts/AreaChart.tsx index 8336b68181..5454292476 100644 --- a/apps/studio/components/ui/Charts/AreaChart.tsx +++ b/apps/studio/components/ui/Charts/AreaChart.tsx @@ -1,13 +1,13 @@ import dayjs from 'dayjs' import { useState } from 'react' import { Area, AreaChart as RechartAreaChart, Tooltip, XAxis } from 'recharts' -import { useChartHoverState } from './useChartHoverState' -import { CHART_COLORS, DateTimeFormats } from 'components/ui/Charts/Charts.constants' import { ChartHeader } from './ChartHeader' import type { CommonChartProps, Datum } from './Charts.types' import { numberFormatter, useChartSize } from './Charts.utils' import NoDataPlaceholder from './NoDataPlaceholder' +import { useChartHoverState } from './useChartHoverState' +import { CHART_COLORS, DateTimeFormats } from '@/components/ui/Charts/Charts.constants' export interface AreaChartProps extends CommonChartProps { yAxisKey: string diff --git a/apps/studio/components/ui/Charts/BarChart.tsx b/apps/studio/components/ui/Charts/BarChart.tsx index 1510920af9..27444adae2 100644 --- a/apps/studio/components/ui/Charts/BarChart.tsx +++ b/apps/studio/components/ui/Charts/BarChart.tsx @@ -1,4 +1,3 @@ -import { CHART_COLORS, DateTimeFormats } from 'components/ui/Charts/Charts.constants' import dayjs from 'dayjs' import { ComponentProps, useMemo, useState } from 'react' import { @@ -18,6 +17,7 @@ import type { CommonChartProps, Datum } from './Charts.types' import { numberFormatter, useChartSize } from './Charts.utils' import NoDataPlaceholder from './NoDataPlaceholder' import { useChartHoverState } from './useChartHoverState' +import { CHART_COLORS, DateTimeFormats } from '@/components/ui/Charts/Charts.constants' export interface BarChartProps extends CommonChartProps { yAxisKey: string diff --git a/apps/studio/components/ui/Charts/ChartHandler.tsx b/apps/studio/components/ui/Charts/ChartHandler.tsx index 4f3c2ce4e4..480f2cfb39 100644 --- a/apps/studio/components/ui/Charts/ChartHandler.tsx +++ b/apps/studio/components/ui/Charts/ChartHandler.tsx @@ -1,24 +1,23 @@ +import dayjs from 'dayjs' +import { Activity, BarChartIcon, Loader2 } from 'lucide-react' import { useRouter } from 'next/router' import { PropsWithChildren, useMemo, useState } from 'react' -import { Button, Tooltip, TooltipContent, TooltipTrigger } from 'ui' +import { Button, Tooltip, TooltipContent, TooltipTrigger, WarningIcon } from 'ui' -import AreaChart from 'components/ui/Charts/AreaChart' -import BarChart from 'components/ui/Charts/BarChart' -import { AnalyticsInterval } from 'data/analytics/constants' -import { mapMultiResponseToAnalyticsData } from 'data/analytics/infra-monitoring-queries' +import type { ChartData } from './Charts.types' +import AreaChart from '@/components/ui/Charts/AreaChart' +import BarChart from '@/components/ui/Charts/BarChart' +import { AnalyticsInterval } from '@/data/analytics/constants' +import { mapMultiResponseToAnalyticsData } from '@/data/analytics/infra-monitoring-queries' import { InfraMonitoringAttribute, useInfraMonitoringAttributesQuery, -} from 'data/analytics/infra-monitoring-query' +} from '@/data/analytics/infra-monitoring-query' import { ProjectDailyStatsAttribute, useProjectDailyStatsQuery, -} from 'data/analytics/project-daily-stats-query' -import dayjs from 'dayjs' -import { Activity, BarChartIcon, Loader2 } from 'lucide-react' -import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' -import { WarningIcon } from 'ui' -import type { ChartData } from './Charts.types' +} from '@/data/analytics/project-daily-stats-query' +import { useDatabaseSelectorStateSnapshot } from '@/state/database-selector' interface ChartHandlerProps { id?: string diff --git a/apps/studio/components/ui/Charts/ChartHeader.tsx b/apps/studio/components/ui/Charts/ChartHeader.tsx index 79a641c249..1de59f1c7f 100644 --- a/apps/studio/components/ui/Charts/ChartHeader.tsx +++ b/apps/studio/components/ui/Charts/ChartHeader.tsx @@ -1,7 +1,5 @@ import { useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' import dayjs from 'dayjs' -import { formatBytes } from 'lib/helpers' import { Activity, BarChartIcon, @@ -11,12 +9,13 @@ import { } from 'lucide-react' import Link from 'next/link' import { useEffect, useState } from 'react' -import { cn } from 'ui' -import { Badge } from 'ui' +import { Badge, cn } from 'ui' import { InfoTooltip } from 'ui-patterns/info-tooltip' import { formatPercentage, numberFormatter } from './Charts.utils' import { useChartHoverState } from './useChartHoverState' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { formatBytes } from '@/lib/helpers' export interface ChartHeaderProps { title?: string diff --git a/apps/studio/components/ui/Charts/ChartHighlightActions.tsx b/apps/studio/components/ui/Charts/ChartHighlightActions.tsx index 8a0be73774..1a7a52803b 100644 --- a/apps/studio/components/ui/Charts/ChartHighlightActions.tsx +++ b/apps/studio/components/ui/Charts/ChartHighlightActions.tsx @@ -1,7 +1,6 @@ import dayjs from 'dayjs' import { ArrowRight, SearchIcon } from 'lucide-react' import { ReactNode, useEffect, useMemo, useState } from 'react' - import { cn, DropdownMenu, @@ -11,6 +10,7 @@ import { DropdownMenuSeparator, DropdownMenuTrigger, } from 'ui' + import { ChartHighlight } from './useChartHighlight' export type UpdateDateRange = (from: string, to: string) => void diff --git a/apps/studio/components/ui/Charts/ComposedChart.tsx b/apps/studio/components/ui/Charts/ComposedChart.tsx index 22ebeb58b8..3bedcc265b 100644 --- a/apps/studio/components/ui/Charts/ComposedChart.tsx +++ b/apps/studio/components/ui/Charts/ComposedChart.tsx @@ -1,5 +1,4 @@ import dayjs from 'dayjs' -import { formatBytes } from 'lib/helpers' import { useTheme } from 'next-themes' import { ComponentProps, useEffect, useMemo, useState } from 'react' import { @@ -45,6 +44,7 @@ import { import NoDataPlaceholder from './NoDataPlaceholder' import { ChartHighlight } from './useChartHighlight' import { useChartHoverState } from './useChartHoverState' +import { formatBytes } from '@/lib/helpers' export interface ComposedChartProps extends CommonChartProps { chartId?: string diff --git a/apps/studio/components/ui/Charts/ComposedChart.utils.tsx b/apps/studio/components/ui/Charts/ComposedChart.utils.tsx index cce3bb4868..5e15e74338 100644 --- a/apps/studio/components/ui/Charts/ComposedChart.utils.tsx +++ b/apps/studio/components/ui/Charts/ComposedChart.utils.tsx @@ -1,13 +1,13 @@ 'use client' import dayjs from 'dayjs' -import { guessLocalTimezone } from 'lib/dayjs' -import { formatBytes } from 'lib/helpers' import { useState } from 'react' import { cn, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from 'ui' import { CHART_COLORS, DateTimeFormats } from './Charts.constants' import { formatPercentage, numberFormatter } from './Charts.utils' +import { guessLocalTimezone } from '@/lib/dayjs' +import { formatBytes } from '@/lib/helpers' export interface ReportAttributes { id?: string diff --git a/apps/studio/components/ui/Charts/ComposedChartHandler.tsx b/apps/studio/components/ui/Charts/ComposedChartHandler.tsx index 8f6efde584..8c0a57efad 100644 --- a/apps/studio/components/ui/Charts/ComposedChartHandler.tsx +++ b/apps/studio/components/ui/Charts/ComposedChartHandler.tsx @@ -1,15 +1,7 @@ -import Panel from 'components/ui/Panel' -import { AnalyticsInterval, DataPoint } from 'data/analytics/constants' -import { useInfraMonitoringQueries } from 'data/analytics/infra-monitoring-queries' -import { InfraMonitoringAttribute } from 'data/analytics/infra-monitoring-query' -import { useProjectDailyStatsQueries } from 'data/analytics/project-daily-stats-queries' -import { ProjectDailyStatsAttribute } from 'data/analytics/project-daily-stats-query' import dayjs from 'dayjs' import { List, Loader2 } from 'lucide-react' import { useRouter } from 'next/router' -import type { UpdateDateRange } from 'pages/project/[ref]/observability/database' import React, { PropsWithChildren, useEffect, useMemo, useRef, useState } from 'react' -import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' import { Card, cn, WarningIcon } from 'ui' import type { ChartHighlightAction } from './ChartHighlightActions' @@ -17,6 +9,14 @@ import type { ChartData } from './Charts.types' import { ComposedChart } from './ComposedChart' import { MultiAttribute } from './ComposedChart.utils' import { useChartHighlight } from './useChartHighlight' +import Panel from '@/components/ui/Panel' +import { AnalyticsInterval, DataPoint } from '@/data/analytics/constants' +import { useInfraMonitoringQueries } from '@/data/analytics/infra-monitoring-queries' +import { InfraMonitoringAttribute } from '@/data/analytics/infra-monitoring-query' +import { useProjectDailyStatsQueries } from '@/data/analytics/project-daily-stats-queries' +import { ProjectDailyStatsAttribute } from '@/data/analytics/project-daily-stats-query' +import type { UpdateDateRange } from '@/pages/project/[ref]/observability/database' +import { useDatabaseSelectorStateSnapshot } from '@/state/database-selector' export interface ComposedChartHandlerProps { id?: string diff --git a/apps/studio/components/ui/Charts/NoDataPlaceholder.tsx b/apps/studio/components/ui/Charts/NoDataPlaceholder.tsx index 0c9c6fe9d8..6c61a41275 100644 --- a/apps/studio/components/ui/Charts/NoDataPlaceholder.tsx +++ b/apps/studio/components/ui/Charts/NoDataPlaceholder.tsx @@ -1,6 +1,6 @@ import { BarChart2 } from 'lucide-react' - import { cn } from 'ui' + import { ChartHeader } from './ChartHeader' import { useChartSize } from './Charts.utils' diff --git a/apps/studio/components/ui/Charts/ReportSettings.tsx b/apps/studio/components/ui/Charts/ReportSettings.tsx index 5fc052c620..ea57653fec 100644 --- a/apps/studio/components/ui/Charts/ReportSettings.tsx +++ b/apps/studio/components/ui/Charts/ReportSettings.tsx @@ -1,4 +1,3 @@ -import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { Settings } from 'lucide-react' import { useState } from 'react' import { @@ -9,7 +8,9 @@ import { Label_Shadcn_, Switch, } from 'ui' + import { useChartHoverState } from './useChartHoverState' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' interface ReportSettingsProps { chartId: string diff --git a/apps/studio/components/ui/Charts/useChartHoverState.test.tsx b/apps/studio/components/ui/Charts/useChartHoverState.test.tsx index fd14a2300a..0adb9a8a49 100644 --- a/apps/studio/components/ui/Charts/useChartHoverState.test.tsx +++ b/apps/studio/components/ui/Charts/useChartHoverState.test.tsx @@ -1,5 +1,5 @@ -import { renderHook, act } from '@testing-library/react' -import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest' +import { act, renderHook } from '@testing-library/react' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' // Mock localStorage const localStorageMock = (() => { diff --git a/apps/studio/components/ui/CodeEditor/CodeEditor.tsx b/apps/studio/components/ui/CodeEditor/CodeEditor.tsx index 522cc5d17e..77fb646c56 100644 --- a/apps/studio/components/ui/CodeEditor/CodeEditor.tsx +++ b/apps/studio/components/ui/CodeEditor/CodeEditor.tsx @@ -2,13 +2,13 @@ import Editor, { EditorProps, Monaco, OnChange, OnMount, useMonaco } from '@mona import { merge, noop } from 'lodash' import type { editor } from 'monaco-editor' import { MutableRefObject, useEffect, useRef, useState } from 'react' - -import { Markdown } from 'components/interfaces/Markdown' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { formatSql } from 'lib/formatSql' -import { timeout } from 'lib/helpers' import { cn, LogoLoader } from 'ui' + import { alignEditor } from './CodeEditor.utils' +import { Markdown } from '@/components/interfaces/Markdown' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { formatSql } from '@/lib/formatSql' +import { timeout } from '@/lib/helpers' type CodeEditorActions = { enabled: boolean; callback: (value: any) => void } const DEFAULT_ACTIONS = { diff --git a/apps/studio/components/ui/CodeEditor/Providers/PgSQLCompletionProvider.ts b/apps/studio/components/ui/CodeEditor/Providers/PgSQLCompletionProvider.ts index f7bbbe4bce..d8b9d6334a 100644 --- a/apps/studio/components/ui/CodeEditor/Providers/PgSQLCompletionProvider.ts +++ b/apps/studio/components/ui/CodeEditor/Providers/PgSQLCompletionProvider.ts @@ -1,8 +1,9 @@ -import type { DatabaseFunction } from 'data/database-functions/database-functions-query' -import type { Schema } from 'data/database/schemas-query' -import type { TableColumn } from 'data/database/table-columns-query' import type { RefObject } from 'react' + import BackwardIterator from './BackwardIterator' +import type { DatabaseFunction } from '@/data/database-functions/database-functions-query' +import type { Schema } from '@/data/database/schemas-query' +import type { TableColumn } from '@/data/database/table-columns-query' // [Joshen] Needs to be fixed diff --git a/apps/studio/components/ui/CodeEditor/Providers/PgSQLSignatureHelpProvider.ts b/apps/studio/components/ui/CodeEditor/Providers/PgSQLSignatureHelpProvider.ts index 03df0fc3d4..151c28dd01 100644 --- a/apps/studio/components/ui/CodeEditor/Providers/PgSQLSignatureHelpProvider.ts +++ b/apps/studio/components/ui/CodeEditor/Providers/PgSQLSignatureHelpProvider.ts @@ -1,6 +1,7 @@ import { RefObject } from 'react' + import BackwardIterator from './BackwardIterator' -import type { DatabaseFunction } from 'data/database-functions/database-functions-query' +import type { DatabaseFunction } from '@/data/database-functions/database-functions-query' // [Joshen] Needs to be fixed diff --git a/apps/studio/components/ui/ComputeBadgeWrapper.tsx b/apps/studio/components/ui/ComputeBadgeWrapper.tsx index a22babc88a..c620cece43 100644 --- a/apps/studio/components/ui/ComputeBadgeWrapper.tsx +++ b/apps/studio/components/ui/ComputeBadgeWrapper.tsx @@ -1,17 +1,17 @@ import Link from 'next/link' import { useState } from 'react' - -import { getAddons } from 'components/interfaces/Billing/Subscription/Subscription.utils' -import { ProjectDetail } from 'data/projects/project-detail-query' -import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' -import { useProjectAddonsQuery } from 'data/subscriptions/project-addons-query' -import { ProjectAddonVariantMeta } from 'data/subscriptions/types' -import { getCloudProviderArchitecture } from 'lib/cloudprovider-utils' -import { INSTANCE_MICRO_SPECS } from 'lib/constants' import { Button, HoverCard, HoverCardContent, HoverCardTrigger, Separator } from 'ui' import { ComputeBadge } from 'ui-patterns/ComputeBadge' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' +import { getAddons } from '@/components/interfaces/Billing/Subscription/Subscription.utils' +import { ProjectDetail } from '@/data/projects/project-detail-query' +import { useOrgSubscriptionQuery } from '@/data/subscriptions/org-subscription-query' +import { useProjectAddonsQuery } from '@/data/subscriptions/project-addons-query' +import { ProjectAddonVariantMeta } from '@/data/subscriptions/types' +import { getCloudProviderArchitecture } from '@/lib/cloudprovider-utils' +import { INSTANCE_MICRO_SPECS } from '@/lib/constants' + const Row = ({ label, stat }: { label: string; stat: React.ReactNode | string }) => { return (
diff --git a/apps/studio/components/ui/CopyButton.tsx b/apps/studio/components/ui/CopyButton.tsx index 87fd9c183c..425a168775 100644 --- a/apps/studio/components/ui/CopyButton.tsx +++ b/apps/studio/components/ui/CopyButton.tsx @@ -1,6 +1,5 @@ import { Check, Copy } from 'lucide-react' import { ComponentProps, forwardRef, useEffect, useState } from 'react' - import { Button, cn, copyToClipboard } from 'ui' type CopyButtonBaseProps = { diff --git a/apps/studio/components/ui/DataTable/DataTableColumn/DataTableColumnLevelIndicator.tsx b/apps/studio/components/ui/DataTable/DataTableColumn/DataTableColumnLevelIndicator.tsx index 8b6f0482d1..dde560e82d 100644 --- a/apps/studio/components/ui/DataTable/DataTableColumn/DataTableColumnLevelIndicator.tsx +++ b/apps/studio/components/ui/DataTable/DataTableColumn/DataTableColumnLevelIndicator.tsx @@ -1,4 +1,5 @@ import { cn } from 'ui' + import { LEVELS } from '../DataTable.constants' import { getLevelColor } from '../DataTable.utils' diff --git a/apps/studio/components/ui/DataTable/DataTableColumn/DataTableColumnStatusCode.tsx b/apps/studio/components/ui/DataTable/DataTableColumn/DataTableColumnStatusCode.tsx index 175e3a477a..badd8d7d4b 100644 --- a/apps/studio/components/ui/DataTable/DataTableColumn/DataTableColumnStatusCode.tsx +++ b/apps/studio/components/ui/DataTable/DataTableColumn/DataTableColumnStatusCode.tsx @@ -1,6 +1,6 @@ import { Minus } from 'lucide-react' - import { cn } from 'ui' + import { getStatusColor } from '../DataTable.utils' export const DataTableColumnStatusCode = ({ diff --git a/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterCheckbox.tsx b/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterCheckbox.tsx index 02d284968a..61775a8094 100644 --- a/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterCheckbox.tsx +++ b/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterCheckbox.tsx @@ -1,7 +1,7 @@ import { Search } from 'lucide-react' import { useState } from 'react' - import { Checkbox_Shadcn_ as Checkbox, cn, Label_Shadcn_ as Label, Skeleton } from 'ui' + import type { DataTableCheckboxFilterField } from '../DataTable.types' import { formatCompactNumber } from '../DataTable.utils' import { InputWithAddons } from '../primitives/InputWithAddons' diff --git a/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterCheckboxAsync.tsx b/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterCheckboxAsync.tsx index a6489841b2..da429bdbdc 100644 --- a/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterCheckboxAsync.tsx +++ b/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterCheckboxAsync.tsx @@ -1,15 +1,15 @@ +import { keepPreviousData } from '@tanstack/react-query' import { useDebounce } from '@uidotdev/usehooks' +import { useParams } from 'common' import { Loader2, Search } from 'lucide-react' import { useState } from 'react' - -import { useParams } from 'common' -import { useUnifiedLogsFacetCountQuery } from 'data/logs/unified-logs-facet-count-query' import { Checkbox_Shadcn_ as Checkbox, cn, Label_Shadcn_ as Label, Skeleton } from 'ui' + import type { DataTableCheckboxFilterField } from '../DataTable.types' import { formatCompactNumber } from '../DataTable.utils' import { InputWithAddons } from '../primitives/InputWithAddons' import { useDataTable } from '../providers/DataTableProvider' -import { keepPreviousData } from '@tanstack/react-query' +import { useUnifiedLogsFacetCountQuery } from '@/data/logs/unified-logs-facet-count-query' export function DataTableFilterCheckboxAsync({ value: _value, diff --git a/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterCommand.tsx b/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterCommand.tsx index b76d192636..16d87c701e 100644 --- a/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterCommand.tsx +++ b/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterCommand.tsx @@ -2,8 +2,6 @@ import { formatDistanceToNow } from 'date-fns' import { LoaderCircle, Search, X } from 'lucide-react' import { ParserBuilder } from 'nuqs' import { useEffect, useMemo, useRef, useState } from 'react' - -import { useLocalStorage } from 'hooks/misc/useLocalStorage' import { cn, Command_Shadcn_ as Command, @@ -15,6 +13,7 @@ import { CommandSeparator_Shadcn_ as CommandSeparator, Separator, } from 'ui' + import type { DataTableFilterField } from '../DataTable.types' import { formatCompactNumber } from '../DataTable.utils' import { Kbd } from '../primitives/Kbd' @@ -26,6 +25,7 @@ import { getWordByCaretPosition, replaceInputByFieldType, } from './DataTableFilters.utils' +import { useLocalStorage } from '@/hooks/misc/useLocalStorage' // FIXME: there is an issue on cmdk if I wanna only set a single slider value... diff --git a/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterControls.tsx b/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterControls.tsx index 90b01df6de..a4f423f61e 100644 --- a/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterControls.tsx +++ b/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterControls.tsx @@ -5,17 +5,16 @@ import { AccordionTrigger_Shadcn_ as AccordionTrigger, } from 'ui' +import { DateRangeDisabled } from '../DataTable.types' +import { useDataTable } from '../providers/DataTableProvider' import { DataTableFilterCheckbox } from './DataTableFilterCheckbox' +import { DataTableFilterCheckboxAsync } from './DataTableFilterCheckboxAsync' +import { DataTableFilterCheckboxLoader } from './DataTableFilterCheckboxLoader' import { DataTableFilterInput } from './DataTableFilterInput' import { DataTableFilterResetButton } from './DataTableFilterResetButton' import { DataTableFilterSlider } from './DataTableFilterSlider' import { DataTableFilterTimerange } from './DataTableFilterTimerange' -import { DateRangeDisabled } from '../DataTable.types' -import { useDataTable } from '../providers/DataTableProvider' -import { DataTableFilterCheckboxAsync } from './DataTableFilterCheckboxAsync' -import { DataTableFilterCheckboxLoader } from './DataTableFilterCheckboxLoader' - // FIXME: use @container (especially for the slider element) to restructure elements // TODO: only pass the columns to generate the filters! diff --git a/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterControlsDrawer.tsx b/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterControlsDrawer.tsx index 0267de6069..ec2ae97724 100644 --- a/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterControlsDrawer.tsx +++ b/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterControlsDrawer.tsx @@ -1,8 +1,6 @@ import { VisuallyHidden } from '@radix-ui/react-visually-hidden' import { FilterIcon } from 'lucide-react' import { useRef } from 'react' - -import { useHotKey } from 'hooks/ui/useHotKey' import { Button, Drawer, @@ -17,9 +15,11 @@ import { TooltipContent, TooltipTrigger, } from 'ui' + import { useMediaQuery } from '../hooks/useMediaQuery' import { Kbd } from '../primitives/Kbd' import { DataTableFilterControls } from './DataTableFilterControls' +import { useHotKey } from '@/hooks/ui/useHotKey' export function DataTableFilterControlsDrawer() { const triggerButtonRef = useRef(null) diff --git a/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterInput.tsx b/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterInput.tsx index a41cc5d965..435c4256f4 100644 --- a/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterInput.tsx +++ b/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterInput.tsx @@ -1,7 +1,7 @@ import { Search } from 'lucide-react' import { useEffect, useState } from 'react' - import { Label_Shadcn_ as Label } from 'ui' + import type { DataTableInputFilterField } from '../DataTable.types' import { useDebounce } from '../hooks/useDebounce' import { InputWithAddons } from '../primitives/InputWithAddons' diff --git a/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterResetButton.tsx b/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterResetButton.tsx index baae73eb65..40c3f5e815 100644 --- a/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterResetButton.tsx +++ b/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterResetButton.tsx @@ -1,6 +1,6 @@ import { X } from 'lucide-react' - import { Button } from 'ui' + import type { DataTableFilterField } from '../DataTable.types' import { useDataTable } from '../providers/DataTableProvider' diff --git a/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterSlider.tsx b/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterSlider.tsx index 8882c6fe91..43858468e6 100644 --- a/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterSlider.tsx +++ b/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterSlider.tsx @@ -1,6 +1,6 @@ import { useEffect, useState } from 'react' - import { Label_Shadcn_ as Label } from 'ui' + import type { DataTableSliderFilterField } from '../DataTable.types' import { isArrayOfNumbers } from '../DataTable.utils' import { useDebounce } from '../hooks/useDebounce' diff --git a/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterTimerange.tsx b/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterTimerange.tsx index 5bd4bf95c2..7a1cb73ed8 100644 --- a/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterTimerange.tsx +++ b/apps/studio/components/ui/DataTable/DataTableFilters/DataTableFilterTimerange.tsx @@ -1,17 +1,17 @@ import { useMemo, useState } from 'react' import type { DateRange } from 'react-day-picker' -import { REPORTS_DATEPICKER_HELPERS } from 'components/interfaces/Reports/Reports.constants' -import { - DatePickerValue, - LogsDatePicker, -} from 'components/interfaces/Settings/Logs/Logs.DatePickers' -import { maybeShowUpgradePromptIfNotEntitled } from 'components/interfaces/Settings/Logs/Logs.utils' -import UpgradePrompt from 'components/interfaces/Settings/Logs/UpgradePrompt' import type { DataTableTimerangeFilterField } from '../DataTable.types' import { isArrayOfDates } from '../DataTable.utils' import { useDataTable } from '../providers/DataTableProvider' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' +import { REPORTS_DATEPICKER_HELPERS } from '@/components/interfaces/Reports/Reports.constants' +import { + DatePickerValue, + LogsDatePicker, +} from '@/components/interfaces/Settings/Logs/Logs.DatePickers' +import { maybeShowUpgradePromptIfNotEntitled } from '@/components/interfaces/Settings/Logs/Logs.utils' +import UpgradePrompt from '@/components/interfaces/Settings/Logs/UpgradePrompt' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' export function DataTableFilterTimerange({ value: _value, diff --git a/apps/studio/components/ui/DataTable/DataTableInfinite.tsx b/apps/studio/components/ui/DataTable/DataTableInfinite.tsx index c36c719924..5da20eb091 100644 --- a/apps/studio/components/ui/DataTable/DataTableInfinite.tsx +++ b/apps/studio/components/ui/DataTable/DataTableInfinite.tsx @@ -4,12 +4,12 @@ import { flexRender } from '@tanstack/react-table' import { LoaderCircle } from 'lucide-react' import { useQueryState } from 'nuqs' import { Fragment, memo, ReactNode, UIEvent, useCallback, useRef } from 'react' - -import { useHotKey } from 'hooks/ui/useHotKey' import { Button, cn } from 'ui' + import { formatCompactNumber } from './DataTable.utils' import { useDataTable } from './providers/DataTableProvider' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from './Table' +import { useHotKey } from '@/hooks/ui/useHotKey' // TODO: add a possible chartGroupBy export interface DataTableInfiniteProps { diff --git a/apps/studio/components/ui/DataTable/DataTableResetButton.tsx b/apps/studio/components/ui/DataTable/DataTableResetButton.tsx index efcdff50e9..a2a2b379e1 100644 --- a/apps/studio/components/ui/DataTable/DataTableResetButton.tsx +++ b/apps/studio/components/ui/DataTable/DataTableResetButton.tsx @@ -1,9 +1,9 @@ import { X } from 'lucide-react' - -import { useHotKey } from 'hooks/ui/useHotKey' import { Button, Tooltip, TooltipContent, TooltipTrigger } from 'ui' + import { Kbd } from './primitives/Kbd' import { useDataTable } from './providers/DataTableProvider' +import { useHotKey } from '@/hooks/ui/useHotKey' export function DataTableResetButton() { const { table } = useDataTable() diff --git a/apps/studio/components/ui/DataTable/DataTableSheetDetails.tsx b/apps/studio/components/ui/DataTable/DataTableSheetDetails.tsx index 29f7a7f049..3c7a302f56 100644 --- a/apps/studio/components/ui/DataTable/DataTableSheetDetails.tsx +++ b/apps/studio/components/ui/DataTable/DataTableSheetDetails.tsx @@ -1,7 +1,7 @@ import { ChevronDown, ChevronUp, X } from 'lucide-react' import { ReactNode, useCallback, useEffect, useMemo } from 'react' - import { Button, cn, Separator, Skeleton, Tooltip, TooltipContent, TooltipTrigger } from 'ui' + import { Kbd } from './primitives/Kbd' import { useDataTable } from './providers/DataTableProvider' diff --git a/apps/studio/components/ui/DataTable/DataTableSheetRowAction.tsx b/apps/studio/components/ui/DataTable/DataTableSheetRowAction.tsx index 235fbae746..210ce495fc 100644 --- a/apps/studio/components/ui/DataTable/DataTableSheetRowAction.tsx +++ b/apps/studio/components/ui/DataTable/DataTableSheetRowAction.tsx @@ -11,9 +11,6 @@ import { Search, } from 'lucide-react' import { ComponentPropsWithRef } from 'react' - -import { DataTableFilterField } from 'components/ui/DataTable/DataTable.types' -import { useCopyToClipboard } from 'hooks/ui/useCopyToClipboard' import { cn, DropdownMenu, @@ -24,6 +21,9 @@ import { DropdownMenuTrigger, } from 'ui' +import { DataTableFilterField } from '@/components/ui/DataTable/DataTable.types' +import { useCopyToClipboard } from '@/hooks/ui/useCopyToClipboard' + interface DataTableSheetRowActionProps< TData, TFields extends DataTableFilterField, diff --git a/apps/studio/components/ui/DataTable/DataTableSideBarLayout.tsx b/apps/studio/components/ui/DataTable/DataTableSideBarLayout.tsx index 5898566d13..b63f30dc48 100644 --- a/apps/studio/components/ui/DataTable/DataTableSideBarLayout.tsx +++ b/apps/studio/components/ui/DataTable/DataTableSideBarLayout.tsx @@ -1,6 +1,6 @@ import { CSSProperties, ReactNode, useMemo } from 'react' - import { cn } from 'ui' + import { useDataTable } from './providers/DataTableProvider' interface DataTableSideBarLayoutProps { diff --git a/apps/studio/components/ui/DataTable/DataTableToolbar.tsx b/apps/studio/components/ui/DataTable/DataTableToolbar.tsx index 8d6ce34717..e61f15f472 100644 --- a/apps/studio/components/ui/DataTable/DataTableToolbar.tsx +++ b/apps/studio/components/ui/DataTable/DataTableToolbar.tsx @@ -1,4 +1,3 @@ -import { useHotKey } from 'hooks/ui/useHotKey' import { PanelLeftClose, PanelLeftOpen } from 'lucide-react' import { ReactNode, useMemo } from 'react' import { Button, Tooltip, TooltipContent, TooltipTrigger } from 'ui' @@ -9,6 +8,7 @@ import { DataTableResetButton } from './DataTableResetButton' import { DataTableViewOptions } from './DataTableViewOptions' import { Kbd } from './primitives/Kbd' import { useDataTable } from './providers/DataTableProvider' +import { useHotKey } from '@/hooks/ui/useHotKey' interface DataTableToolbarProps { renderActions?: () => ReactNode diff --git a/apps/studio/components/ui/DataTable/LiveButton.tsx b/apps/studio/components/ui/DataTable/LiveButton.tsx index ebb1c3f04e..e361c591b5 100644 --- a/apps/studio/components/ui/DataTable/LiveButton.tsx +++ b/apps/studio/components/ui/DataTable/LiveButton.tsx @@ -2,10 +2,10 @@ import type { FetchPreviousPageOptions } from '@tanstack/react-query' import { CirclePause, CirclePlay } from 'lucide-react' import { useQueryStates } from 'nuqs' import { useEffect } from 'react' - -import { useHotKey } from 'hooks/ui/useHotKey' import { Button, cn } from 'ui' + import { useDataTable } from './providers/DataTableProvider' +import { useHotKey } from '@/hooks/ui/useHotKey' const REFRESH_INTERVAL = 10_000 diff --git a/apps/studio/components/ui/DataTable/RefreshButton.tsx b/apps/studio/components/ui/DataTable/RefreshButton.tsx index a0e82436b1..3fba976c15 100644 --- a/apps/studio/components/ui/DataTable/RefreshButton.tsx +++ b/apps/studio/components/ui/DataTable/RefreshButton.tsx @@ -1,4 +1,5 @@ import { LoaderCircle, RefreshCcw } from 'lucide-react' + import { ButtonTooltip } from '../ButtonTooltip' interface RefreshButtonProps { diff --git a/apps/studio/components/ui/DataTable/TimelineChart.tsx b/apps/studio/components/ui/DataTable/TimelineChart.tsx index a8a17cb9c7..ed9263e1f1 100644 --- a/apps/studio/components/ui/DataTable/TimelineChart.tsx +++ b/apps/studio/components/ui/DataTable/TimelineChart.tsx @@ -2,8 +2,8 @@ import { format } from 'date-fns' import { useMemo, useState } from 'react' import { Bar, BarChart, CartesianGrid, ReferenceArea, XAxis } from 'recharts' import type { CategoricalChartFunc } from 'recharts/types/chart/generateCategoricalChart' - import { ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent, cn } from 'ui' + import { useDataTable } from './providers/DataTableProvider' export type BaseChartSchema = { timestamp: number; [key: string]: number } diff --git a/apps/studio/components/ui/DataTable/primitives/InputWithAddons.tsx b/apps/studio/components/ui/DataTable/primitives/InputWithAddons.tsx index 974dde4b67..c43f5b4a5d 100644 --- a/apps/studio/components/ui/DataTable/primitives/InputWithAddons.tsx +++ b/apps/studio/components/ui/DataTable/primitives/InputWithAddons.tsx @@ -1,6 +1,5 @@ -import { cn } from 'ui' - import { forwardRef, InputHTMLAttributes, ReactNode } from 'react' +import { cn } from 'ui' export interface InputWithAddonsProps extends InputHTMLAttributes { leading?: ReactNode diff --git a/apps/studio/components/ui/DataTable/primitives/Kbd.tsx b/apps/studio/components/ui/DataTable/primitives/Kbd.tsx index 550bed2e29..afbd52e742 100644 --- a/apps/studio/components/ui/DataTable/primitives/Kbd.tsx +++ b/apps/studio/components/ui/DataTable/primitives/Kbd.tsx @@ -1,6 +1,5 @@ // Copy Pasta from: https://github.com/sadmann7/shadcn-table/blob/main/src/components/kbd.tsx#L54 import { ComponentPropsWithoutRef, forwardRef } from 'react' - import { cn } from 'ui' export const kdbClassName = cn( diff --git a/apps/studio/components/ui/DataTable/primitives/Slider.tsx b/apps/studio/components/ui/DataTable/primitives/Slider.tsx index 6809ead142..076d3d3890 100644 --- a/apps/studio/components/ui/DataTable/primitives/Slider.tsx +++ b/apps/studio/components/ui/DataTable/primitives/Slider.tsx @@ -3,7 +3,6 @@ import * as SliderPrimitive from '@radix-ui/react-slider' import { ComponentPropsWithoutRef, ElementRef, forwardRef, Fragment } from 'react' - import { cn } from 'ui' export const Slider = forwardRef< diff --git a/apps/studio/components/ui/DataTable/primitives/Sortable.tsx b/apps/studio/components/ui/DataTable/primitives/Sortable.tsx index 60d95096fe..71690a1dbb 100644 --- a/apps/studio/components/ui/DataTable/primitives/Sortable.tsx +++ b/apps/studio/components/ui/DataTable/primitives/Sortable.tsx @@ -32,8 +32,8 @@ import { CSS } from '@dnd-kit/utilities' import { Slot, type SlotProps } from '@radix-ui/react-slot' import { createContext, forwardRef, useContext, useMemo, useState } from 'react' import { createPortal } from 'react-dom' - import { Button, cn, type ButtonProps } from 'ui' + import { composeRefs } from '../hooks/useComposedRefs' const orientationConfig = { diff --git a/apps/studio/components/ui/DataTable/providers/DataTableProvider.tsx b/apps/studio/components/ui/DataTable/providers/DataTableProvider.tsx index 7495725d68..393377026b 100644 --- a/apps/studio/components/ui/DataTable/providers/DataTableProvider.tsx +++ b/apps/studio/components/ui/DataTable/providers/DataTableProvider.tsx @@ -7,10 +7,10 @@ import type { Table, VisibilityState, } from '@tanstack/react-table' -import { QuerySearchParamsType } from 'components/interfaces/UnifiedLogs/UnifiedLogs.types' import { createContext, ReactNode, useContext, useMemo } from 'react' import { DataTableFilterField } from '../DataTable.types' +import { QuerySearchParamsType } from '@/components/interfaces/UnifiedLogs/UnifiedLogs.types' // REMINDER: read about how to move controlled state out of the useReactTable hook // https://github.com/TanStack/table/discussions/4005#discussioncomment-7303569 diff --git a/apps/studio/components/ui/DatabaseSelector.tsx b/apps/studio/components/ui/DatabaseSelector.tsx index 6a5c379210..c02aa78e69 100644 --- a/apps/studio/components/ui/DatabaseSelector.tsx +++ b/apps/studio/components/ui/DatabaseSelector.tsx @@ -1,17 +1,10 @@ import { useParams } from 'common' -import { Markdown } from 'components/interfaces/Markdown' -import { REPLICA_STATUS } from 'components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.constants' -import { useReadReplicasQuery } from 'data/read-replicas/replicas-query' -import { formatDatabaseID, formatDatabaseRegion } from 'data/read-replicas/replicas.utils' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { IS_PLATFORM } from 'lib/constants' import { noop } from 'lodash' import { Check, ChevronDown, Loader2, Plus } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' import { parseAsBoolean, useQueryState } from 'nuqs' import { useEffect, useState } from 'react' -import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' import { Button, ButtonProps, @@ -29,6 +22,14 @@ import { TooltipTrigger, } from 'ui' +import { Markdown } from '@/components/interfaces/Markdown' +import { REPLICA_STATUS } from '@/components/interfaces/Settings/Infrastructure/InfrastructureConfiguration/InstanceConfiguration.constants' +import { useReadReplicasQuery } from '@/data/read-replicas/replicas-query' +import { formatDatabaseID, formatDatabaseRegion } from '@/data/read-replicas/replicas.utils' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { IS_PLATFORM } from '@/lib/constants' +import { useDatabaseSelectorStateSnapshot } from '@/state/database-selector' + interface DatabaseSelectorProps { selectedDatabaseId?: string // To override initial state variant?: 'regular' | 'connected-on-right' | 'connected-on-left' | 'connected-on-both' diff --git a/apps/studio/components/ui/DatePicker/TimeSplitInput.tsx b/apps/studio/components/ui/DatePicker/TimeSplitInput.tsx index 51653255d0..372ad23a3f 100644 --- a/apps/studio/components/ui/DatePicker/TimeSplitInput.tsx +++ b/apps/studio/components/ui/DatePicker/TimeSplitInput.tsx @@ -1,13 +1,13 @@ import { format } from 'date-fns' import { Clock } from 'lucide-react' import { useEffect, useState } from 'react' +import { cn } from 'ui' +import type { TimeSplitInputProps, TimeType } from './DatePicker.types' import { isUnixMicro, unixMicroToIsoTimestamp, -} from 'components/interfaces/Settings/Logs/Logs.utils' -import { cn } from 'ui' -import type { TimeSplitInputProps, TimeType } from './DatePicker.types' +} from '@/components/interfaces/Settings/Logs/Logs.utils' const inputStyle = cn( 'w-6 p-0 text-center text-xs text-foreground outline-none cursor-text', diff --git a/apps/studio/components/ui/DatePicker/index.tsx b/apps/studio/components/ui/DatePicker/index.tsx index 93a5f7db24..3295fcca0b 100644 --- a/apps/studio/components/ui/DatePicker/index.tsx +++ b/apps/studio/components/ui/DatePicker/index.tsx @@ -2,18 +2,18 @@ import { format } from 'date-fns' import dayjs from 'dayjs' import { ArrowRight, Calendar } from 'lucide-react' import { ReactNode, useCallback, useEffect, useMemo, useState } from 'react' - -import type { DatePickerToFrom } from 'components/interfaces/Settings/Logs/Logs.types' import { Button, Calendar as CalendarPicker, Popover, + Popover_Shadcn_, PopoverContent_Shadcn_, PopoverTrigger_Shadcn_, - Popover_Shadcn_, } from 'ui' import { ButtonProps } from 'ui/src/components/Button/Button' + import { TimeSplitInput } from './TimeSplitInput' +import type { DatePickerToFrom } from '@/components/interfaces/Settings/Logs/Logs.types' interface DatePickerProps { onChange?: (args: DatePickerToFrom) => void diff --git a/apps/studio/components/ui/DateRangePicker.tsx b/apps/studio/components/ui/DateRangePicker.tsx index ae880c4809..f5f48cd759 100644 --- a/apps/studio/components/ui/DateRangePicker.tsx +++ b/apps/studio/components/ui/DateRangePicker.tsx @@ -1,8 +1,6 @@ import dayjs from 'dayjs' import { ChevronDown } from 'lucide-react' import { ReactNode, useEffect, useState } from 'react' - -import { DATE_FORMAT } from 'lib/constants' import { Button, cn, @@ -14,6 +12,8 @@ import { DropdownMenuTrigger, } from 'ui' +import { DATE_FORMAT } from '@/lib/constants' + /** * There's timestamp rounding that kicks in if there are more than 50 data points * being returned, in order to increase cache hit rates. diff --git a/apps/studio/components/ui/DownloadResultsButton.tsx b/apps/studio/components/ui/DownloadResultsButton.tsx index ba1e9145e0..751c03d73d 100644 --- a/apps/studio/components/ui/DownloadResultsButton.tsx +++ b/apps/studio/components/ui/DownloadResultsButton.tsx @@ -1,12 +1,5 @@ import { IS_PLATFORM, LOCAL_STORAGE_KEYS, useParams } from 'common' -import { - convertResultsToCSV, - convertResultsToJSON, - convertResultsToMarkdown, -} from 'components/interfaces/SQLEditor/UtilityPanel/Results.utils' import saveAs from 'file-saver' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { useHotKey } from 'hooks/ui/useHotKey' import { ChevronDown, Copy, Download, Settings } from 'lucide-react' import Link from 'next/link' import { usePathname } from 'next/navigation' @@ -22,6 +15,14 @@ import { KeyboardShortcut, } from 'ui' +import { + convertResultsToCSV, + convertResultsToJSON, + convertResultsToMarkdown, +} from '@/components/interfaces/SQLEditor/UtilityPanel/Results.utils' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { useHotKey } from '@/hooks/ui/useHotKey' + interface DownloadResultsButtonProps { iconOnly?: boolean type?: 'text' | 'default' diff --git a/apps/studio/components/ui/DropdownMenuItemTooltip.tsx b/apps/studio/components/ui/DropdownMenuItemTooltip.tsx index cafada2db0..9cb8cba939 100644 --- a/apps/studio/components/ui/DropdownMenuItemTooltip.tsx +++ b/apps/studio/components/ui/DropdownMenuItemTooltip.tsx @@ -1,5 +1,5 @@ import { ComponentProps, ComponentPropsWithoutRef, ElementRef, forwardRef } from 'react' -import { DropdownMenuItem, Tooltip, TooltipContent, TooltipTrigger, cn } from 'ui' +import { cn, DropdownMenuItem, Tooltip, TooltipContent, TooltipTrigger } from 'ui' export const DropdownMenuItemTooltip = forwardRef< ElementRef, diff --git a/apps/studio/components/ui/EdgeFunctionBlock/EdgeFunctionBlock.tsx b/apps/studio/components/ui/EdgeFunctionBlock/EdgeFunctionBlock.tsx index 1f1a056914..5a81dd998e 100644 --- a/apps/studio/components/ui/EdgeFunctionBlock/EdgeFunctionBlock.tsx +++ b/apps/studio/components/ui/EdgeFunctionBlock/EdgeFunctionBlock.tsx @@ -1,4 +1,3 @@ -import { ReportBlockContainer } from 'components/interfaces/Reports/ReportBlock/ReportBlockContainer' import { Code } from 'lucide-react' import Link from 'next/link' import type { DragEvent, ReactNode } from 'react' @@ -6,6 +5,8 @@ import { Button, cn } from 'ui' import { Admonition } from 'ui-patterns/admonition' import { CodeBlock, type CodeBlockLang } from 'ui-patterns/CodeBlock' +import { ReportBlockContainer } from '@/components/interfaces/Reports/ReportBlock/ReportBlockContainer' + interface EdgeFunctionBlockProps { /** Title of the EdgeFunctionBlock */ label: string diff --git a/apps/studio/components/ui/EditorPanel/EditorPanel.tsx b/apps/studio/components/ui/EditorPanel/EditorPanel.tsx index f1001fee50..21f1c6d147 100644 --- a/apps/studio/components/ui/EditorPanel/EditorPanel.tsx +++ b/apps/studio/components/ui/EditorPanel/EditorPanel.tsx @@ -2,26 +2,6 @@ import type { Monaco } from '@monaco-editor/react' import { useQueryClient } from '@tanstack/react-query' import { useDebounce } from '@uidotdev/usehooks' import { LOCAL_STORAGE_KEYS, useParams } from 'common' -import { isExplainQuery } from 'components/interfaces/ExplainVisualizer/ExplainVisualizer.utils' -import { generateSnippetTitle } from 'components/interfaces/SQLEditor/SQLEditor.constants' -import { - createSqlSnippetSkeletonV2, - suffixWithLimit, -} from 'components/interfaces/SQLEditor/SQLEditor.utils' -import { useAddDefinitions } from 'components/interfaces/SQLEditor/useAddDefinitions' -import Results from 'components/interfaces/SQLEditor/UtilityPanel/Results' -import { SqlRunButton } from 'components/interfaces/SQLEditor/UtilityPanel/RunButton' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { useContentIdQuery } from 'data/content/content-id-query' -import { useContentQuery, type Content } from 'data/content/content-query' -import { useContentUpsertMutation } from 'data/content/content-upsert-mutation' -import { contentKeys } from 'data/content/keys' -import { useExecuteSqlMutation } from 'data/sql/execute-sql-mutation' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { BASE_PATH } from 'lib/constants' -import { useProfile } from 'lib/profile' import { AlertCircle, Book, @@ -35,9 +15,6 @@ import { import type { editor as MonacoEditor } from 'monaco-editor' import { useRouter } from 'next/router' import { useEffect, useRef, useState } from 'react' -import { editorPanelState, useEditorPanelStateSnapshot } from 'state/editor-panel-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' -import { useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' import { Button, cn, @@ -65,6 +42,29 @@ import { ButtonTooltip } from '../ButtonTooltip' import { SqlWarningAdmonition } from '../SqlWarningAdmonition' import { formatSqlError } from './EditorPanel.utils' import { SaveSnippetDialog } from './SaveSnippetDialog' +import { isExplainQuery } from '@/components/interfaces/ExplainVisualizer/ExplainVisualizer.utils' +import { generateSnippetTitle } from '@/components/interfaces/SQLEditor/SQLEditor.constants' +import { + createSqlSnippetSkeletonV2, + suffixWithLimit, +} from '@/components/interfaces/SQLEditor/SQLEditor.utils' +import { useAddDefinitions } from '@/components/interfaces/SQLEditor/useAddDefinitions' +import Results from '@/components/interfaces/SQLEditor/UtilityPanel/Results' +import { SqlRunButton } from '@/components/interfaces/SQLEditor/UtilityPanel/RunButton' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { useContentIdQuery } from '@/data/content/content-id-query' +import { useContentQuery, type Content } from '@/data/content/content-query' +import { useContentUpsertMutation } from '@/data/content/content-upsert-mutation' +import { contentKeys } from '@/data/content/keys' +import { useExecuteSqlMutation } from '@/data/sql/execute-sql-mutation' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { BASE_PATH } from '@/lib/constants' +import { useProfile } from '@/lib/profile' +import { editorPanelState, useEditorPanelStateSnapshot } from '@/state/editor-panel-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' +import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' export const EditorPanel = () => { const { diff --git a/apps/studio/components/ui/EditorPanel/EditorPanel.utils.ts b/apps/studio/components/ui/EditorPanel/EditorPanel.utils.ts index 3a6ffa836c..a30ff8dd57 100644 --- a/apps/studio/components/ui/EditorPanel/EditorPanel.utils.ts +++ b/apps/studio/components/ui/EditorPanel/EditorPanel.utils.ts @@ -1,4 +1,4 @@ -import type { SqlError } from 'state/editor-panel-state' +import type { SqlError } from '@/state/editor-panel-state' export function formatSqlError(error: SqlError): { header: string | undefined; lines: string[] } { if (error.formattedError) { diff --git a/apps/studio/components/ui/EditorPanel/SaveSnippetDialog.tsx b/apps/studio/components/ui/EditorPanel/SaveSnippetDialog.tsx index 4412fbf460..20fa3f0b4c 100644 --- a/apps/studio/components/ui/EditorPanel/SaveSnippetDialog.tsx +++ b/apps/studio/components/ui/EditorPanel/SaveSnippetDialog.tsx @@ -1,12 +1,4 @@ import { useParams } from 'common' -import { subscriptionHasHipaaAddon } from 'components/interfaces/Billing/Subscription/Subscription.utils' -import { generateSnippetTitle } from 'components/interfaces/SQLEditor/SQLEditor.constants' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useCheckOpenAIKeyQuery } from 'data/ai/check-api-key-query' -import { useSqlTitleGenerateMutation } from 'data/ai/sql-title-mutation' -import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' -import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { useEffect, useState } from 'react' import { toast } from 'sonner' import { @@ -23,6 +15,15 @@ import { Label_Shadcn_, } from 'ui' +import { subscriptionHasHipaaAddon } from '@/components/interfaces/Billing/Subscription/Subscription.utils' +import { generateSnippetTitle } from '@/components/interfaces/SQLEditor/SQLEditor.constants' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useCheckOpenAIKeyQuery } from '@/data/ai/check-api-key-query' +import { useSqlTitleGenerateMutation } from '@/data/ai/sql-title-mutation' +import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' +import { useOrgSubscriptionQuery } from '@/data/subscriptions/org-subscription-query' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' + interface SaveSnippetDialogProps { open: boolean sql: string diff --git a/apps/studio/components/ui/EntityTypeIcon.tsx b/apps/studio/components/ui/EntityTypeIcon.tsx index b0110b2040..f62f616ba1 100644 --- a/apps/studio/components/ui/EntityTypeIcon.tsx +++ b/apps/studio/components/ui/EntityTypeIcon.tsx @@ -1,7 +1,8 @@ -import { ENTITY_TYPE } from 'data/entity-types/entity-type-constants' import { Eye, GitBranch, Table2 } from 'lucide-react' import { cn, SQL_ICON } from 'ui' +import { ENTITY_TYPE } from '@/data/entity-types/entity-type-constants' + interface EntityTypeIconProps { type: 'sql' | 'schema' | 'new' | 'r' | 'v' | 'm' | 'f' | 'p' size?: number diff --git a/apps/studio/components/ui/Error.tsx b/apps/studio/components/ui/Error.tsx index c61a43c4f2..555929a6e7 100644 --- a/apps/studio/components/ui/Error.tsx +++ b/apps/studio/components/ui/Error.tsx @@ -1,8 +1,9 @@ -import { SupportLink } from 'components/interfaces/Support/SupportLink' import Link from 'next/link' import { useEffect } from 'react' import { Button } from 'ui' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' + export default function EmptyPageState({ error }: any) { useEffect(() => { console.error('Error', error) diff --git a/apps/studio/components/ui/ErrorBoundary/ClientSideExceptionHandler.tsx b/apps/studio/components/ui/ErrorBoundary/ClientSideExceptionHandler.tsx index 5779cbf34d..a30da4ae22 100644 --- a/apps/studio/components/ui/ErrorBoundary/ClientSideExceptionHandler.tsx +++ b/apps/studio/components/ui/ErrorBoundary/ClientSideExceptionHandler.tsx @@ -1,12 +1,12 @@ -import { ExternalLink } from 'lucide-react' - import { SupportCategories } from '@supabase/shared-types/out/constants' -import { SupportLink } from 'components/interfaces/Support/SupportLink' +import { ExternalLink } from 'lucide-react' import { useRouter } from 'next/router' import { Button, cn } from 'ui' import { Admonition } from 'ui-patterns' + import CopyButton from '../CopyButton' import { InlineLinkClassName } from '../InlineLink' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' interface ClientSideExceptionHandlerProps { message: string diff --git a/apps/studio/components/ui/ErrorBoundary/ErrorBoundary.tsx b/apps/studio/components/ui/ErrorBoundary/ErrorBoundary.tsx index ac82ea58da..4f5dddafe5 100644 --- a/apps/studio/components/ui/ErrorBoundary/ErrorBoundary.tsx +++ b/apps/studio/components/ui/ErrorBoundary/ErrorBoundary.tsx @@ -1,8 +1,8 @@ -import { ErrorBoundary as ReactErrorBoundary } from 'react-error-boundary' import * as Sentry from '@sentry/nextjs' -import { Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, Button } from 'ui' import { AlertCircle } from 'lucide-react' import { ErrorInfo } from 'react' +import { ErrorBoundary as ReactErrorBoundary } from 'react-error-boundary' +import { Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, Button } from 'ui' interface ErrorFallbackProps { error: Error diff --git a/apps/studio/components/ui/ErrorBoundary/GlobalErrorBoundaryState.tsx b/apps/studio/components/ui/ErrorBoundary/GlobalErrorBoundaryState.tsx index 4efebda3cb..94f1bd2eaf 100644 --- a/apps/studio/components/ui/ErrorBoundary/GlobalErrorBoundaryState.tsx +++ b/apps/studio/components/ui/ErrorBoundary/GlobalErrorBoundaryState.tsx @@ -2,9 +2,9 @@ import { isError } from 'lodash' import Link from 'next/link' import { useRouter } from 'next/router' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import { ClientSideExceptionHandler } from './ClientSideExceptionHandler' import { InsertBeforeRemoveChildErrorHandler } from './InsertBeforeRemoveChildErrorHandler' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' export type FallbackProps = { error: unknown diff --git a/apps/studio/components/ui/ErrorBoundary/InsertBeforeRemoveChildErrorHandler.tsx b/apps/studio/components/ui/ErrorBoundary/InsertBeforeRemoveChildErrorHandler.tsx index 77501d94a1..3e19a3125e 100644 --- a/apps/studio/components/ui/ErrorBoundary/InsertBeforeRemoveChildErrorHandler.tsx +++ b/apps/studio/components/ui/ErrorBoundary/InsertBeforeRemoveChildErrorHandler.tsx @@ -1,11 +1,11 @@ import { SupportCategories } from '@supabase/shared-types/out/constants' import { Blocks, ExternalLink } from 'lucide-react' import { useRouter } from 'next/router' - -import { SupportLink } from 'components/interfaces/Support/SupportLink' -import { detectBrowser } from 'lib/helpers' import { Button } from 'ui' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' +import { detectBrowser } from '@/lib/helpers' + interface InsertBeforeRemoveChildErrorHandlerProps { message: string sentryIssueId: string diff --git a/apps/studio/components/ui/ErrorCodeTooltip/ErrorCodeTooltip.tsx b/apps/studio/components/ui/ErrorCodeTooltip/ErrorCodeTooltip.tsx index 55dad7672c..2cd68d1e77 100644 --- a/apps/studio/components/ui/ErrorCodeTooltip/ErrorCodeTooltip.tsx +++ b/apps/studio/components/ui/ErrorCodeTooltip/ErrorCodeTooltip.tsx @@ -1,16 +1,8 @@ +import { ExternalLink } from 'lucide-react' +import { useTheme } from 'next-themes' import Image from 'next/image' import Link from 'next/link' import { useState } from 'react' -import { useTheme } from 'next-themes' -import { ExternalLink } from 'lucide-react' - -import { useErrorCodesQuery } from 'data/content-api/docs-error-codes-query' -import { Service } from 'data/graphql/graphql' -import { BASE_PATH } from 'lib/constants' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { AiAssistantDropdown } from 'components/ui/AiAssistantDropdown' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { cn, DropdownMenuItem, @@ -21,7 +13,15 @@ import { InfoIcon, } from 'ui' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' + import { getErrorCodeInfo } from './ErrorCodeTooltip.utils' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { AiAssistantDropdown } from '@/components/ui/AiAssistantDropdown' +import { useErrorCodesQuery } from '@/data/content-api/docs-error-codes-query' +import { Service } from '@/data/graphql/graphql' +import { BASE_PATH } from '@/lib/constants' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' interface ErrorCodeTooltipProps { errorCode: string diff --git a/apps/studio/components/ui/ErrorCodeTooltip/ErrorCodeTooltip.utils.test.ts b/apps/studio/components/ui/ErrorCodeTooltip/ErrorCodeTooltip.utils.test.ts index af759daeb9..75db663b72 100644 --- a/apps/studio/components/ui/ErrorCodeTooltip/ErrorCodeTooltip.utils.test.ts +++ b/apps/studio/components/ui/ErrorCodeTooltip/ErrorCodeTooltip.utils.test.ts @@ -1,7 +1,8 @@ -import { describe, it, expect } from 'vitest' -import { Service } from 'data/graphql/graphql' import { ERROR_CODE_DOCS_URLS } from 'shared-data' +import { describe, expect, it } from 'vitest' + import { getErrorCodeInfo } from './ErrorCodeTooltip.utils' +import { Service } from '@/data/graphql/graphql' describe('getErrorCodeInfo', () => { describe('when service is undefined', () => { diff --git a/apps/studio/components/ui/ErrorCodeTooltip/ErrorCodeTooltip.utils.ts b/apps/studio/components/ui/ErrorCodeTooltip/ErrorCodeTooltip.utils.ts index de48e2533c..67a64235c3 100644 --- a/apps/studio/components/ui/ErrorCodeTooltip/ErrorCodeTooltip.utils.ts +++ b/apps/studio/components/ui/ErrorCodeTooltip/ErrorCodeTooltip.utils.ts @@ -1,11 +1,12 @@ import { - ERROR_CODES, ERROR_CODE_DOCS_URLS, + ERROR_CODES, HTTP_ERROR_CODES, type ErrorCodeDefinition, type ErrorCodeService, } from 'shared-data' -import { Service } from 'data/graphql/graphql' + +import { Service } from '@/data/graphql/graphql' const SERVICE_MAP: Partial> = { [Service.Auth]: 'auth', diff --git a/apps/studio/components/ui/FeatureBanner.tsx b/apps/studio/components/ui/FeatureBanner.tsx index a55e8d8daf..00c175202b 100644 --- a/apps/studio/components/ui/FeatureBanner.tsx +++ b/apps/studio/components/ui/FeatureBanner.tsx @@ -1,11 +1,11 @@ +import { useParams } from 'common/hooks' +import { HTMLMotionProps, motion } from 'framer-motion' import { X } from 'lucide-react' import { ReactNode } from 'react' -import { motion, HTMLMotionProps } from 'framer-motion' - -import { useParams } from 'common/hooks' -import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' import { Button, cn } from 'ui' +import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage' + // Base props common to all feature banners interface BaseFeatureBannerProps extends HTMLMotionProps<'div'> { children: ReactNode diff --git a/apps/studio/components/ui/FileExplorerAndEditor/FileExplorerAndEditor.utils.ts b/apps/studio/components/ui/FileExplorerAndEditor/FileExplorerAndEditor.utils.ts index 33f1665da1..716c40289d 100644 --- a/apps/studio/components/ui/FileExplorerAndEditor/FileExplorerAndEditor.utils.ts +++ b/apps/studio/components/ui/FileExplorerAndEditor/FileExplorerAndEditor.utils.ts @@ -1,6 +1,7 @@ -import { formatBytes } from '@/lib/helpers' import { BlobReader, BlobWriter, TextWriter, ZipReader } from '@zip.js/zip.js' + import { FileAction, type FileActionResult, type FileData } from './FileExplorerAndEditor.types' +import { formatBytes } from '@/lib/helpers' // Configuration for zip file extraction export const ZIP_EXTRACTION_CONFIG = { diff --git a/apps/studio/components/ui/FileExplorerAndEditor/index.tsx b/apps/studio/components/ui/FileExplorerAndEditor/index.tsx index 409051918b..2cc5acfa96 100644 --- a/apps/studio/components/ui/FileExplorerAndEditor/index.tsx +++ b/apps/studio/components/ui/FileExplorerAndEditor/index.tsx @@ -1,5 +1,4 @@ import { IS_PLATFORM } from 'common' -import { AIEditor } from 'components/ui/AIEditor' import { AnimatePresence, motion } from 'framer-motion' import { Plus } from 'lucide-react' import { useCallback, useEffect, useState } from 'react' @@ -15,6 +14,7 @@ import { isZipFile, } from './FileExplorerAndEditor.utils' import { FileExplorerAndEditorRow } from './FileExplorerAndEditorRow' +import { AIEditor } from '@/components/ui/AIEditor' interface FileExplorerAndEditorProps { files: FileData[] diff --git a/apps/studio/components/ui/Forms/FormPanel.tsx b/apps/studio/components/ui/Forms/FormPanel.tsx index f780aab052..8d292bfc41 100644 --- a/apps/studio/components/ui/Forms/FormPanel.tsx +++ b/apps/studio/components/ui/Forms/FormPanel.tsx @@ -1,4 +1,4 @@ -import { HTMLAttributes, forwardRef } from 'react' +import { forwardRef, HTMLAttributes } from 'react' import { cn } from 'ui' interface Props { diff --git a/apps/studio/components/ui/FunctionSelector.tsx b/apps/studio/components/ui/FunctionSelector.tsx index 80838d4d25..e9ad159ea9 100644 --- a/apps/studio/components/ui/FunctionSelector.tsx +++ b/apps/studio/components/ui/FunctionSelector.tsx @@ -1,9 +1,4 @@ import { useParams } from 'common' -import { - DatabaseFunctionsData, - useDatabaseFunctionsQuery, -} from 'data/database-functions/database-functions-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { uniqBy } from 'lodash' import { Check, ChevronsUpDown, Plus } from 'lucide-react' import Link from 'next/link' @@ -27,6 +22,12 @@ import { ScrollArea, } from 'ui' +import { + DatabaseFunctionsData, + useDatabaseFunctionsQuery, +} from '@/data/database-functions/database-functions-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' + type DatabaseFunction = DatabaseFunctionsData[number] interface FunctionSelectorProps { diff --git a/apps/studio/components/ui/GrafanaPromoBanner.tsx b/apps/studio/components/ui/GrafanaPromoBanner.tsx index c3bbab5918..1a8c7339e1 100644 --- a/apps/studio/components/ui/GrafanaPromoBanner.tsx +++ b/apps/studio/components/ui/GrafanaPromoBanner.tsx @@ -1,12 +1,12 @@ +import { useParams } from 'common' import { BookOpen } from 'lucide-react' import Link from 'next/link' - -import { useParams } from 'common' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { BASE_PATH, DOCS_URL } from 'lib/constants' import { Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, Button, cn } from 'ui' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { BASE_PATH, DOCS_URL } from '@/lib/constants' + const GrafanaPromoBanner = () => (
diff --git a/apps/studio/components/ui/HelpPanel/HelpButton.tsx b/apps/studio/components/ui/HelpPanel/HelpButton.tsx index fdab54fd2b..f2d4d691e5 100644 --- a/apps/studio/components/ui/HelpPanel/HelpButton.tsx +++ b/apps/studio/components/ui/HelpPanel/HelpButton.tsx @@ -1,12 +1,13 @@ -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { HelpCircle } from 'lucide-react' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { cn } from 'ui' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' + export const HelpButton = () => { const { toggleSidebar, activeSidebar } = useSidebarManagerSnapshot() const { data: project } = useSelectedProjectQuery() diff --git a/apps/studio/components/ui/HelpPanel/HelpOptionsList.tsx b/apps/studio/components/ui/HelpPanel/HelpOptionsList.tsx index 278f355846..9d218634fd 100644 --- a/apps/studio/components/ui/HelpPanel/HelpOptionsList.tsx +++ b/apps/studio/components/ui/HelpPanel/HelpOptionsList.tsx @@ -1,6 +1,3 @@ -import type { SupportFormUrlKeys } from 'components/interfaces/Support/SupportForm.utils' -import { SupportLink } from 'components/interfaces/Support/SupportLink' -import { DOCS_URL } from 'lib/constants' import { Activity, BookOpen, Mail, Wrench } from 'lucide-react' import { useRouter } from 'next/router' import SVG from 'react-inlinesvg' @@ -8,6 +5,9 @@ import { AiIconAnimation, ButtonGroup, ButtonGroupItem } from 'ui' import type { HelpOptionId } from './HelpPanel.constants' import { HELP_OPTION_IDS } from './HelpPanel.constants' +import type { SupportFormUrlKeys } from '@/components/interfaces/Support/SupportForm.utils' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' +import { DOCS_URL } from '@/lib/constants' const DISCORD_URL = 'https://discord.supabase.com' const STATUS_URL = 'https://status.supabase.com' diff --git a/apps/studio/components/ui/HelpPanel/HelpPanel.tsx b/apps/studio/components/ui/HelpPanel/HelpPanel.tsx index 264450d190..e206e13a4b 100644 --- a/apps/studio/components/ui/HelpPanel/HelpPanel.tsx +++ b/apps/studio/components/ui/HelpPanel/HelpPanel.tsx @@ -1,18 +1,18 @@ import { IS_PLATFORM } from 'common' -import type { SupportFormUrlKeys } from 'components/interfaces/Support/SupportForm.utils' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { X } from 'lucide-react' import Image from 'next/image' import { useRouter } from 'next/router' import SVG from 'react-inlinesvg' -import { useAiAssistantStateSnapshot } from 'state/ai-assistant-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' import { Button, cn, Separator } from 'ui' import styleHandler from 'ui/src/lib/theme/styleHandler' import { ASSISTANT_SUGGESTIONS } from './HelpPanel.constants' import { HelpSection } from './HelpSection' +import type { SupportFormUrlKeys } from '@/components/interfaces/Support/SupportForm.utils' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { useAiAssistantStateSnapshot } from '@/state/ai-assistant-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' export const HelpPanel = ({ onClose, diff --git a/apps/studio/components/ui/HelpPanel/HelpSection.tsx b/apps/studio/components/ui/HelpPanel/HelpSection.tsx index 7aea2451dc..7aff02ec04 100644 --- a/apps/studio/components/ui/HelpPanel/HelpSection.tsx +++ b/apps/studio/components/ui/HelpPanel/HelpSection.tsx @@ -1,8 +1,8 @@ -import type { SupportFormUrlKeys } from 'components/interfaces/Support/SupportForm.utils' import { cn } from 'ui' import { HelpOptionsList } from './HelpOptionsList' import type { HelpOptionId } from './HelpPanel.constants' +import type { SupportFormUrlKeys } from '@/components/interfaces/Support/SupportForm.utils' type HelpSectionProps = { excludeIds?: HelpOptionId[] diff --git a/apps/studio/components/ui/InfiniteList.tsx b/apps/studio/components/ui/InfiniteList.tsx index 64ed180bf6..3ef24f3ebf 100644 --- a/apps/studio/components/ui/InfiniteList.tsx +++ b/apps/studio/components/ui/InfiniteList.tsx @@ -1,14 +1,14 @@ -import { Virtualizer, useVirtualizer } from '@tanstack/react-virtual' +import { useVirtualizer, Virtualizer } from '@tanstack/react-virtual' import { - CSSProperties, ComponentPropsWithRef, ComponentType, - ElementType, - ReactNode, - Ref, createContext, createElement, + CSSProperties, + ElementType, memo, + ReactNode, + Ref, useContext, useEffect, useMemo, @@ -16,8 +16,7 @@ import { type ComponentProps, type PropsWithChildren, } from 'react' - -import { Skeleton, cn } from 'ui' +import { cn, Skeleton } from 'ui' // Regular memo erases generics, so this helper adds them back // any here is intentional to allow for generic components and does not affect diff --git a/apps/studio/components/ui/InformationBox.tsx b/apps/studio/components/ui/InformationBox.tsx index d5029d7a1c..99e493da3e 100644 --- a/apps/studio/components/ui/InformationBox.tsx +++ b/apps/studio/components/ui/InformationBox.tsx @@ -1,7 +1,6 @@ import { ExternalLink, Maximize2, Minimize2 } from 'lucide-react' import Link from 'next/link' import { forwardRef, ReactNode, useState } from 'react' - import { Button } from 'ui' interface InformationBoxProps { diff --git a/apps/studio/components/ui/Logs/ChartIntervalDropdown.tsx b/apps/studio/components/ui/Logs/ChartIntervalDropdown.tsx index 24b11d79c9..71bc5f1e00 100644 --- a/apps/studio/components/ui/Logs/ChartIntervalDropdown.tsx +++ b/apps/studio/components/ui/Logs/ChartIntervalDropdown.tsx @@ -1,5 +1,3 @@ -import { InlineLink } from 'components/ui/InlineLink' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' import { ChevronDown } from 'lucide-react' import { Button, @@ -14,6 +12,8 @@ import { } from 'ui' import { CHART_INTERVALS } from './logs.utils' +import { InlineLink } from '@/components/ui/InlineLink' +import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' function getDaysRequired(startValue: number, startUnit: string): number { if (startUnit === 'day') return startValue diff --git a/apps/studio/components/ui/Logs/LogsExplorerHeader.tsx b/apps/studio/components/ui/Logs/LogsExplorerHeader.tsx index 2af86431e4..b0fbb5d596 100644 --- a/apps/studio/components/ui/Logs/LogsExplorerHeader.tsx +++ b/apps/studio/components/ui/Logs/LogsExplorerHeader.tsx @@ -1,21 +1,21 @@ import { BookOpen, Check, Copy, ExternalLink, List, X } from 'lucide-react' import Link from 'next/link' import { useState } from 'react' - -import { LOGS_EXPLORER_DOCS_URL } from 'components/interfaces/Settings/Logs/Logs.constants' -import Table from 'components/to-be-cleaned/Table' -import { DOCS_URL } from 'lib/constants' import { logConstants } from 'shared-data' import { Button, + copyToClipboard, SidePanel, Tabs, Tooltip, TooltipContent, TooltipTrigger, - copyToClipboard, } from 'ui' + import { DocsButton } from '../DocsButton' +import { LOGS_EXPLORER_DOCS_URL } from '@/components/interfaces/Settings/Logs/Logs.constants' +import Table from '@/components/to-be-cleaned/Table' +import { DOCS_URL } from '@/lib/constants' export interface LogsExplorerHeaderProps { subtitle?: string diff --git a/apps/studio/components/ui/Logs/logs.utils.ts b/apps/studio/components/ui/Logs/logs.utils.ts index 5369cbe4c1..69c5680495 100644 --- a/apps/studio/components/ui/Logs/logs.utils.ts +++ b/apps/studio/components/ui/Logs/logs.utils.ts @@ -1,4 +1,4 @@ -import type { ChartIntervals } from 'types' +import type { ChartIntervals } from '@/types' export const CHART_INTERVALS: ChartIntervals[] = [ { diff --git a/apps/studio/components/ui/ObservabilityLink.tsx b/apps/studio/components/ui/ObservabilityLink.tsx index ccbe805a04..bd6f450bfb 100644 --- a/apps/studio/components/ui/ObservabilityLink.tsx +++ b/apps/studio/components/ui/ObservabilityLink.tsx @@ -1,6 +1,7 @@ -import { DOCS_URL } from 'lib/constants' import Link from 'next/link' +import { DOCS_URL } from '@/lib/constants' + export const ObservabilityLink = () => { return (
diff --git a/apps/studio/components/ui/OrganizationProjectSelector.tsx b/apps/studio/components/ui/OrganizationProjectSelector.tsx index 10e55d027c..094cac353c 100644 --- a/apps/studio/components/ui/OrganizationProjectSelector.tsx +++ b/apps/studio/components/ui/OrganizationProjectSelector.tsx @@ -1,7 +1,5 @@ import { keepPreviousData } from '@tanstack/react-query' import { useDebounce, useIntersectionObserver } from '@uidotdev/usehooks' -import { OrgProject, useOrgProjectsInfiniteQuery } from 'data/projects/org-projects-infinite-query' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { ChevronsUpDown, HelpCircle } from 'lucide-react' import { ReactNode, useEffect, useId, useMemo, useRef, useState } from 'react' import { @@ -23,6 +21,11 @@ import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { EmbeddedProjectList } from './OrganizationProjectSelector/EmbeddedProjectList' import { ProjectCommandItem } from './OrganizationProjectSelector/ProjectCommandItem' +import { + OrgProject, + useOrgProjectsInfiniteQuery, +} from '@/data/projects/org-projects-infinite-query' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' interface OrganizationProjectSelectorSelectorProps { slug?: string diff --git a/apps/studio/components/ui/OrganizationProjectSelector/EmbeddedProjectList.tsx b/apps/studio/components/ui/OrganizationProjectSelector/EmbeddedProjectList.tsx index adf75e1f90..40c8bc891c 100644 --- a/apps/studio/components/ui/OrganizationProjectSelector/EmbeddedProjectList.tsx +++ b/apps/studio/components/ui/OrganizationProjectSelector/EmbeddedProjectList.tsx @@ -1,8 +1,8 @@ -import type { OrgProject } from 'data/projects/org-projects-infinite-query' import type { ReactNode } from 'react' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { ProjectCommandItem } from './ProjectCommandItem' +import type { OrgProject } from '@/data/projects/org-projects-infinite-query' export interface EmbeddedProjectListProps { projects: OrgProject[] diff --git a/apps/studio/components/ui/OrganizationProjectSelector/ProjectCommandItem.tsx b/apps/studio/components/ui/OrganizationProjectSelector/ProjectCommandItem.tsx index 2a6ecad8f5..1f7b39463a 100644 --- a/apps/studio/components/ui/OrganizationProjectSelector/ProjectCommandItem.tsx +++ b/apps/studio/components/ui/OrganizationProjectSelector/ProjectCommandItem.tsx @@ -1,8 +1,9 @@ -import type { OrgProject } from 'data/projects/org-projects-infinite-query' import { Check } from 'lucide-react' import { ReactNode } from 'react' import { cn, CommandItem_Shadcn_ } from 'ui' +import type { OrgProject } from '@/data/projects/org-projects-infinite-query' + export interface ProjectCommandItemProps { project: OrgProject selectedRef: string | undefined diff --git a/apps/studio/components/ui/OveragesBanner/OveragesBanner.utils.ts b/apps/studio/components/ui/OveragesBanner/OveragesBanner.utils.ts index c67a16f795..766064ef1d 100644 --- a/apps/studio/components/ui/OveragesBanner/OveragesBanner.utils.ts +++ b/apps/studio/components/ui/OveragesBanner/OveragesBanner.utils.ts @@ -1,4 +1,4 @@ -import type { OrgMetricsUsage } from 'data/usage/org-usage-query' +import type { OrgMetricsUsage } from '@/data/usage/org-usage-query' export const getResourcesExceededLimitsOrg = (usageMetrics: OrgMetricsUsage[]): string[] => { if (!usageMetrics.length) return [] diff --git a/apps/studio/components/ui/PartnerIcon.tsx b/apps/studio/components/ui/PartnerIcon.tsx index ec66d2f1e0..cbe9018a20 100644 --- a/apps/studio/components/ui/PartnerIcon.tsx +++ b/apps/studio/components/ui/PartnerIcon.tsx @@ -1,7 +1,8 @@ -import { MANAGED_BY } from 'lib/constants/infrastructure' -import type { Organization } from 'types' import { cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' + import { PARTNER_TO_NAME } from './PartnerManagedResource' +import { MANAGED_BY } from '@/lib/constants/infrastructure' +import type { Organization } from '@/types' interface PartnerIconProps { organization: Pick diff --git a/apps/studio/components/ui/PartnerManagedResource.tsx b/apps/studio/components/ui/PartnerManagedResource.tsx index 137a7b9b7f..e319fe99a6 100644 --- a/apps/studio/components/ui/PartnerManagedResource.tsx +++ b/apps/studio/components/ui/PartnerManagedResource.tsx @@ -1,10 +1,10 @@ import { ExternalLink } from 'lucide-react' - -import { useVercelRedirectQuery } from 'data/integrations/vercel-redirect-query' -import { useAwsRedirectQuery } from 'data/integrations/aws-redirect-query' import { Alert_Shadcn_, AlertTitle_Shadcn_, Button } from 'ui' + import PartnerIcon from './PartnerIcon' -import { MANAGED_BY, ManagedBy } from 'lib/constants/infrastructure' +import { useAwsRedirectQuery } from '@/data/integrations/aws-redirect-query' +import { useVercelRedirectQuery } from '@/data/integrations/vercel-redirect-query' +import { MANAGED_BY, ManagedBy } from '@/lib/constants/infrastructure' interface PartnerManagedResourceProps { managedBy: ManagedBy diff --git a/apps/studio/components/ui/PasswordStrengthBar.tsx b/apps/studio/components/ui/PasswordStrengthBar.tsx index f77c23d00c..74a207b35e 100644 --- a/apps/studio/components/ui/PasswordStrengthBar.tsx +++ b/apps/studio/components/ui/PasswordStrengthBar.tsx @@ -1,6 +1,6 @@ -import { PASSWORD_STRENGTH_COLOR, PASSWORD_STRENGTH_PERCENTAGE } from 'lib/constants' -import { PasswordStrengthScore } from 'lib/password-strength' import { InlineLinkClassName } from './InlineLink' +import { PASSWORD_STRENGTH_COLOR, PASSWORD_STRENGTH_PERCENTAGE } from '@/lib/constants' +import { PasswordStrengthScore } from '@/lib/password-strength' interface Props { passwordStrengthScore: PasswordStrengthScore diff --git a/apps/studio/components/ui/ProductMenu/ProductMenuItem.tsx b/apps/studio/components/ui/ProductMenu/ProductMenuItem.tsx index f4222de82d..d5c983f953 100644 --- a/apps/studio/components/ui/ProductMenu/ProductMenuItem.tsx +++ b/apps/studio/components/ui/ProductMenu/ProductMenuItem.tsx @@ -1,5 +1,6 @@ import Link from 'next/link' import { Badge, Button, Menu } from 'ui' + import { ProductMenuGroupItem } from './ProductMenu.types' interface ProductMenuItemProps { diff --git a/apps/studio/components/ui/ProfileImage.tsx b/apps/studio/components/ui/ProfileImage.tsx index c499e4a90e..1bb36b31d4 100644 --- a/apps/studio/components/ui/ProfileImage.tsx +++ b/apps/studio/components/ui/ProfileImage.tsx @@ -1,7 +1,6 @@ +import { User } from 'icons' import Image from 'next/image' import { ReactNode, useState } from 'react' - -import { User } from 'icons' import { cn } from 'ui' interface ProfileImageProps { diff --git a/apps/studio/components/ui/ProjectSettings/DisplayApiSettings.tsx b/apps/studio/components/ui/ProjectSettings/DisplayApiSettings.tsx index bf97e459a8..a5fa6984e8 100644 --- a/apps/studio/components/ui/ProjectSettings/DisplayApiSettings.tsx +++ b/apps/studio/components/ui/ProjectSettings/DisplayApiSettings.tsx @@ -1,18 +1,18 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { JwtSecretUpdateStatus } from '@supabase/shared-types/out/events' +import { useFlag, useParams } from 'common' import { AlertCircle, Loader2 } from 'lucide-react' import Link from 'next/link' import { useMemo } from 'react' import { toast } from 'sonner' - -import { useFlag, useParams } from 'common' -import Panel from 'components/ui/Panel' -import { useJwtSecretUpdatingStatusQuery } from 'data/config/jwt-secret-updating-status-query' -import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { Input } from 'ui-patterns/DataInputs/Input' import { FormLayout } from 'ui-patterns/form/Layout/FormLayout' + import { getLastUsedAPIKeys, useLastUsedAPIKeysLogQuery } from './DisplayApiSettings.utils' +import Panel from '@/components/ui/Panel' +import { useJwtSecretUpdatingStatusQuery } from '@/data/config/jwt-secret-updating-status-query' +import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' export const DisplayApiSettings = ({ showTitle = true, diff --git a/apps/studio/components/ui/ProjectSettings/DisplayApiSettings.utils.ts b/apps/studio/components/ui/ProjectSettings/DisplayApiSettings.utils.ts index 2036b9f52d..68343a8811 100644 --- a/apps/studio/components/ui/ProjectSettings/DisplayApiSettings.utils.ts +++ b/apps/studio/components/ui/ProjectSettings/DisplayApiSettings.utils.ts @@ -1,7 +1,7 @@ import dayjs from 'dayjs' import { useRef } from 'react' -import useLogsQuery from 'hooks/analytics/useLogsQuery' +import useLogsQuery from '@/hooks/analytics/useLogsQuery' export function useLastUsedAPIKeysLogQuery({ projectRef, diff --git a/apps/studio/components/ui/ProjectSettings/DisplayConfigSettings.tsx b/apps/studio/components/ui/ProjectSettings/DisplayConfigSettings.tsx index b42a18f47f..f6b4e1f09e 100644 --- a/apps/studio/components/ui/ProjectSettings/DisplayConfigSettings.tsx +++ b/apps/studio/components/ui/ProjectSettings/DisplayConfigSettings.tsx @@ -1,14 +1,14 @@ import { JwtSecretUpdateStatus } from '@supabase/shared-types/out/events' +import { useParams } from 'common' import { AlertCircle, Loader } from 'lucide-react' import { PropsWithChildren } from 'react' - -import { useParams } from 'common' -import Panel from 'components/ui/Panel' -import { useJwtSecretUpdatingStatusQuery } from 'data/config/jwt-secret-updating-status-query' -import { useProjectPostgrestConfigQuery } from 'data/config/project-postgrest-config-query' -import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' import { Input } from 'ui' +import Panel from '@/components/ui/Panel' +import { useJwtSecretUpdatingStatusQuery } from '@/data/config/jwt-secret-updating-status-query' +import { useProjectPostgrestConfigQuery } from '@/data/config/project-postgrest-config-query' +import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' + export const DisplayConfigSettings = () => { const { ref: projectRef } = useParams() const { diff --git a/apps/studio/components/ui/ProjectSettings/ToggleLegacyApiKeys.tsx b/apps/studio/components/ui/ProjectSettings/ToggleLegacyApiKeys.tsx index 1a1890655e..7b2fe7a3af 100644 --- a/apps/studio/components/ui/ProjectSettings/ToggleLegacyApiKeys.tsx +++ b/apps/studio/components/ui/ProjectSettings/ToggleLegacyApiKeys.tsx @@ -1,16 +1,7 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { useParams } from 'common' import { useState } from 'react' import { toast } from 'sonner' - -import { useParams } from 'common' -import { ButtonTooltip } from 'components/ui/ButtonTooltip' -import { TextConfirmModal } from 'components/ui/TextConfirmModalWrapper' -import { useToggleLegacyAPIKeysMutation } from 'data/api-keys/legacy-api-key-toggle-mutation' -import { useLegacyAPIKeysStatusQuery } from 'data/api-keys/legacy-api-keys-status-query' -import { useLegacyJWTSigningKeyQuery } from 'data/jwt-signing-keys/legacy-jwt-signing-key-query' -import { useAuthorizedAppsQuery } from 'data/oauth/authorized-apps-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { AlertDialog, AlertDialogAction, @@ -21,7 +12,16 @@ import { AlertDialogHeader, AlertDialogTitle, } from 'ui' + import Panel from '../Panel' +import { ButtonTooltip } from '@/components/ui/ButtonTooltip' +import { TextConfirmModal } from '@/components/ui/TextConfirmModalWrapper' +import { useToggleLegacyAPIKeysMutation } from '@/data/api-keys/legacy-api-key-toggle-mutation' +import { useLegacyAPIKeysStatusQuery } from '@/data/api-keys/legacy-api-keys-status-query' +import { useLegacyJWTSigningKeyQuery } from '@/data/jwt-signing-keys/legacy-jwt-signing-key-query' +import { useAuthorizedAppsQuery } from '@/data/oauth/authorized-apps-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' export const ToggleLegacyApiKeysPanel = () => { const { ref: projectRef } = useParams() diff --git a/apps/studio/components/ui/ProjectUpgradeFailedBanner.tsx b/apps/studio/components/ui/ProjectUpgradeFailedBanner.tsx index 12c2b5bde9..68794ad6df 100644 --- a/apps/studio/components/ui/ProjectUpgradeFailedBanner.tsx +++ b/apps/studio/components/ui/ProjectUpgradeFailedBanner.tsx @@ -1,16 +1,16 @@ +import { SupportCategories } from '@supabase/shared-types/out/constants' import { DatabaseUpgradeStatus } from '@supabase/shared-types/out/events' +import { useParams } from 'common' import dayjs from 'dayjs' -import { guessLocalTimezone } from 'lib/dayjs' import { X } from 'lucide-react' import { useEffect, useState } from 'react' - -import { SupportCategories } from '@supabase/shared-types/out/constants' -import { useParams } from 'common' -import { SupportLink } from 'components/interfaces/Support/SupportLink' -import { useProjectUpgradingStatusQuery } from 'data/config/project-upgrade-status-query' -import { IS_PLATFORM } from 'lib/constants' import { Alert, Button } from 'ui' + import { InlineLink } from './InlineLink' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' +import { useProjectUpgradingStatusQuery } from '@/data/config/project-upgrade-status-query' +import { IS_PLATFORM } from '@/lib/constants' +import { guessLocalTimezone } from '@/lib/dayjs' // [Joshen] Think twice about the category though - it doesn't correspond diff --git a/apps/studio/components/ui/QueryBlock/BlockViewConfiguration.tsx b/apps/studio/components/ui/QueryBlock/BlockViewConfiguration.tsx index c61080a29f..cf51fa36aa 100644 --- a/apps/studio/components/ui/QueryBlock/BlockViewConfiguration.tsx +++ b/apps/studio/components/ui/QueryBlock/BlockViewConfiguration.tsx @@ -1,4 +1,3 @@ -import { ChartConfig } from 'components/interfaces/SQLEditor/UtilityPanel/ChartConfig' import { BarChart2, Settings2, Table } from 'lucide-react' import { Checkbox_Shadcn_, @@ -16,6 +15,7 @@ import { } from 'ui' import { ButtonTooltip } from '../ButtonTooltip' +import { ChartConfig } from '@/components/interfaces/SQLEditor/UtilityPanel/ChartConfig' interface BlockViewConfigurationProps { columns: string[] diff --git a/apps/studio/components/ui/QueryBlock/EditQueryButton.tsx b/apps/studio/components/ui/QueryBlock/EditQueryButton.tsx index 2664e35f97..ec248dcd49 100644 --- a/apps/studio/components/ui/QueryBlock/EditQueryButton.tsx +++ b/apps/studio/components/ui/QueryBlock/EditQueryButton.tsx @@ -1,16 +1,7 @@ import { useParams } from 'common' -import { useIsInlineEditorEnabled } from 'components/interfaces/Account/Preferences/InlineEditorSettings' -import useNewQuery from 'components/interfaces/SQLEditor/hooks' -import { DiffType } from 'components/interfaces/SQLEditor/SQLEditor.types' -import { SIDEBAR_KEYS } from 'components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { Edit } from 'lucide-react' import { useRouter } from 'next/router' import { ComponentProps } from 'react' -import { editorPanelState } from 'state/editor-panel-state' -import { useSidebarManagerSnapshot } from 'state/sidebar-manager-state' -import { useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' import { cn, DropdownMenu, @@ -21,6 +12,15 @@ import { } from 'ui' import { ButtonTooltip } from '../ButtonTooltip' +import { useIsInlineEditorEnabled } from '@/components/interfaces/Account/Preferences/InlineEditorSettings' +import useNewQuery from '@/components/interfaces/SQLEditor/hooks' +import { DiffType } from '@/components/interfaces/SQLEditor/SQLEditor.types' +import { SIDEBAR_KEYS } from '@/components/layouts/ProjectLayout/LayoutSidebar/LayoutSidebarProvider' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { editorPanelState } from '@/state/editor-panel-state' +import { useSidebarManagerSnapshot } from '@/state/sidebar-manager-state' +import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' interface EditQueryButtonProps { id?: string diff --git a/apps/studio/components/ui/QueryBlock/QueryBlock.tsx b/apps/studio/components/ui/QueryBlock/QueryBlock.tsx index a2508829e8..72c5d52ecb 100644 --- a/apps/studio/components/ui/QueryBlock/QueryBlock.tsx +++ b/apps/studio/components/ui/QueryBlock/QueryBlock.tsx @@ -1,6 +1,3 @@ -import { ReportBlockContainer } from 'components/interfaces/Reports/ReportBlock/ReportBlockContainer' -import { ChartConfig } from 'components/interfaces/SQLEditor/UtilityPanel/ChartConfig' -import Results from 'components/interfaces/SQLEditor/UtilityPanel/Results' import dayjs from 'dayjs' import { Code, Play } from 'lucide-react' import { DragEvent, ReactNode, useEffect, useMemo, useRef, useState } from 'react' @@ -15,6 +12,9 @@ import { SqlWarningAdmonition } from '../SqlWarningAdmonition' import { BlockViewConfiguration } from './BlockViewConfiguration' import { EditQueryButton } from './EditQueryButton' import { checkHasNonPositiveValues, formatLogTick, getCumulativeResults } from './QueryBlock.utils' +import { ReportBlockContainer } from '@/components/interfaces/Reports/ReportBlock/ReportBlockContainer' +import { ChartConfig } from '@/components/interfaces/SQLEditor/UtilityPanel/ChartConfig' +import Results from '@/components/interfaces/SQLEditor/UtilityPanel/Results' export const DEFAULT_CHART_CONFIG: ChartConfig = { type: 'bar', diff --git a/apps/studio/components/ui/QueryBlock/QueryBlock.utils.ts b/apps/studio/components/ui/QueryBlock/QueryBlock.utils.ts index dc3cb9f415..10ebd76b9f 100644 --- a/apps/studio/components/ui/QueryBlock/QueryBlock.utils.ts +++ b/apps/studio/components/ui/QueryBlock/QueryBlock.utils.ts @@ -1,4 +1,4 @@ -import { ChartConfig } from 'components/interfaces/SQLEditor/UtilityPanel/ChartConfig' +import { ChartConfig } from '@/components/interfaces/SQLEditor/UtilityPanel/ChartConfig' export const checkHasNonPositiveValues = (data: Record[], key: string): boolean => data.some((row) => (row[key] as number) <= 0) diff --git a/apps/studio/components/ui/RequestUpgradeToBillingOwners.tsx b/apps/studio/components/ui/RequestUpgradeToBillingOwners.tsx index a8f57a2a92..08c36fbd93 100644 --- a/apps/studio/components/ui/RequestUpgradeToBillingOwners.tsx +++ b/apps/studio/components/ui/RequestUpgradeToBillingOwners.tsx @@ -1,13 +1,4 @@ import { zodResolver } from '@hookform/resolvers/zod' -import { useOrganizationRolesV2Query } from 'data/organization-members/organization-roles-query' -import { useOrganizationMembersQuery } from 'data/organizations/organization-members-query' -import { - PlanRequest, - useSendUpgradeRequestMutation, -} from 'data/organizations/request-upgrade-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { useTrack } from 'lib/telemetry/track' import { PropsWithChildren, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' @@ -34,6 +25,16 @@ import { import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import z from 'zod' +import { useOrganizationRolesV2Query } from '@/data/organization-members/organization-roles-query' +import { useOrganizationMembersQuery } from '@/data/organizations/organization-members-query' +import { + PlanRequest, + useSendUpgradeRequestMutation, +} from '@/data/organizations/request-upgrade-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' +import { useTrack } from '@/lib/telemetry/track' + const FormSchema = z.object({ note: z.string().optional(), }) diff --git a/apps/studio/components/ui/Resource/ResourceItem.tsx b/apps/studio/components/ui/Resource/ResourceItem.tsx index 4ee3a6debb..d4f612a66d 100644 --- a/apps/studio/components/ui/Resource/ResourceItem.tsx +++ b/apps/studio/components/ui/Resource/ResourceItem.tsx @@ -1,6 +1,5 @@ import { ChevronRight, MoreVertical } from 'lucide-react' import { forwardRef, HTMLAttributes, ReactNode } from 'react' - import { Button, CardContent, diff --git a/apps/studio/components/ui/Resource/ResourceList.tsx b/apps/studio/components/ui/Resource/ResourceList.tsx index 0e52f77d1e..9bd90cdc76 100644 --- a/apps/studio/components/ui/Resource/ResourceList.tsx +++ b/apps/studio/components/ui/Resource/ResourceList.tsx @@ -1,5 +1,4 @@ import { forwardRef, HTMLAttributes, ReactNode } from 'react' - import { Card } from 'ui' export interface ResourceListProps extends HTMLAttributes { diff --git a/apps/studio/components/ui/ResourceExhaustionWarningBanner/ResourceExhaustionWarningBanner.constants.ts b/apps/studio/components/ui/ResourceExhaustionWarningBanner/ResourceExhaustionWarningBanner.constants.ts index 802b4bcd9b..287241c113 100644 --- a/apps/studio/components/ui/ResourceExhaustionWarningBanner/ResourceExhaustionWarningBanner.constants.ts +++ b/apps/studio/components/ui/ResourceExhaustionWarningBanner/ResourceExhaustionWarningBanner.constants.ts @@ -1,4 +1,4 @@ -import { DOCS_URL } from 'lib/constants' +import { DOCS_URL } from '@/lib/constants' interface ResourceWarningMessage { // should match pathnames, ex: ('/', 'project/[ref]/auth', 'project/[ref]/database', '/project/[ref]/settings/api') diff --git a/apps/studio/components/ui/ResourceExhaustionWarningBanner/ResourceExhaustionWarningBanner.tsx b/apps/studio/components/ui/ResourceExhaustionWarningBanner/ResourceExhaustionWarningBanner.tsx index bb8f56feff..ac7826eff8 100644 --- a/apps/studio/components/ui/ResourceExhaustionWarningBanner/ResourceExhaustionWarningBanner.tsx +++ b/apps/studio/components/ui/ResourceExhaustionWarningBanner/ResourceExhaustionWarningBanner.tsx @@ -1,12 +1,12 @@ +import { useParams } from 'common' import { AlertTriangle, ExternalLink } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' +import { Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, Button, cn } from 'ui' -import { useParams } from 'common' -import { useResourceWarningsQuery } from 'data/usage/resource-warnings-query' -import { AlertDescription_Shadcn_, AlertTitle_Shadcn_, Alert_Shadcn_, Button, cn } from 'ui' import { RESOURCE_WARNING_MESSAGES } from './ResourceExhaustionWarningBanner.constants' import { getWarningContent } from './ResourceExhaustionWarningBanner.utils' +import { useResourceWarningsQuery } from '@/data/usage/resource-warnings-query' export const ResourceExhaustionWarningBanner = () => { const { ref } = useParams() diff --git a/apps/studio/components/ui/ResourceExhaustionWarningBanner/ResourceExhaustionWarningBanner.utils.ts b/apps/studio/components/ui/ResourceExhaustionWarningBanner/ResourceExhaustionWarningBanner.utils.ts index 23e35345f3..671d61616e 100644 --- a/apps/studio/components/ui/ResourceExhaustionWarningBanner/ResourceExhaustionWarningBanner.utils.ts +++ b/apps/studio/components/ui/ResourceExhaustionWarningBanner/ResourceExhaustionWarningBanner.utils.ts @@ -1,5 +1,5 @@ -import type { ResourceWarning } from 'data/usage/resource-warnings-query' import { RESOURCE_WARNING_MESSAGES } from './ResourceExhaustionWarningBanner.constants' +import type { ResourceWarning } from '@/data/usage/resource-warnings-query' export const getWarningContent = ( resourceWarnings: ResourceWarning, diff --git a/apps/studio/components/ui/SchemaComboBox.tsx b/apps/studio/components/ui/SchemaComboBox.tsx index 4b96692a21..c7115d67d2 100644 --- a/apps/studio/components/ui/SchemaComboBox.tsx +++ b/apps/studio/components/ui/SchemaComboBox.tsx @@ -1,25 +1,25 @@ import { Check, ChevronsUpDown } from 'lucide-react' import { useState } from 'react' - -import { useSchemasQuery } from 'data/database/schemas-query' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { + Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, - Alert_Shadcn_, Button, + Command_Shadcn_, CommandEmpty_Shadcn_, CommandGroup_Shadcn_, CommandInput_Shadcn_, CommandItem_Shadcn_, CommandList_Shadcn_, - Command_Shadcn_, + Popover_Shadcn_, PopoverContent_Shadcn_, PopoverTrigger_Shadcn_, - Popover_Shadcn_, ScrollArea, } from 'ui' +import { useSchemasQuery } from '@/data/database/schemas-query' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' + interface SchemaComboBoxProps { className?: string disabled?: boolean diff --git a/apps/studio/components/ui/SchemaSelector.tsx b/apps/studio/components/ui/SchemaSelector.tsx index d934529a2e..4c9462def5 100644 --- a/apps/studio/components/ui/SchemaSelector.tsx +++ b/apps/studio/components/ui/SchemaSelector.tsx @@ -1,7 +1,4 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' -import { useSchemasQuery } from 'data/database/schemas-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { Check, ChevronsUpDown, Plus } from 'lucide-react' import { useState } from 'react' import { @@ -23,6 +20,10 @@ import { Skeleton, } from 'ui' +import { useSchemasQuery } from '@/data/database/schemas-query' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' + interface SchemaSelectorProps { className?: string disabled?: boolean diff --git a/apps/studio/components/ui/SingleStat.tsx b/apps/studio/components/ui/SingleStat.tsx index 371f4965c2..1a4775f448 100644 --- a/apps/studio/components/ui/SingleStat.tsx +++ b/apps/studio/components/ui/SingleStat.tsx @@ -1,10 +1,11 @@ -import { useSendEventMutation } from 'data/telemetry/send-event-mutation' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' -import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import Link from 'next/link' import type { ReactNode } from 'react' import { cn } from 'ui' +import { useSendEventMutation } from '@/data/telemetry/send-event-mutation' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' +import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' + type SingleStatProps = { icon: ReactNode label: ReactNode diff --git a/apps/studio/components/ui/SqlEditor.tsx b/apps/studio/components/ui/SqlEditor.tsx index 8dc3157e6d..47a674e483 100644 --- a/apps/studio/components/ui/SqlEditor.tsx +++ b/apps/studio/components/ui/SqlEditor.tsx @@ -1,10 +1,10 @@ import Editor, { OnChange, useMonaco } from '@monaco-editor/react' import { noop } from 'lodash' import { useEffect, useRef } from 'react' - -import { formatSql } from 'lib/formatSql' import { LogoLoader } from 'ui' +import { formatSql } from '@/lib/formatSql' + // [Joshen] We should deprecate this and use CodeEditor instead interface SqlEditorProps { diff --git a/apps/studio/components/ui/ToggleSpendCapButton.tsx b/apps/studio/components/ui/ToggleSpendCapButton.tsx index b587530dc1..a6d78a83b2 100644 --- a/apps/studio/components/ui/ToggleSpendCapButton.tsx +++ b/apps/studio/components/ui/ToggleSpendCapButton.tsx @@ -1,11 +1,11 @@ import Link from 'next/link' import { PropsWithChildren } from 'react' - -import { SupportLink } from 'components/interfaces/Support/SupportLink' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { Button } from 'ui' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' + interface ToggleSpendCapButtonProps { action?: 'disable' | 'enable' type?: 'default' | 'primary' diff --git a/apps/studio/components/ui/UnknownInterface.tsx b/apps/studio/components/ui/UnknownInterface.tsx index 0baf1c5a40..c4e694e363 100644 --- a/apps/studio/components/ui/UnknownInterface.tsx +++ b/apps/studio/components/ui/UnknownInterface.tsx @@ -1,5 +1,4 @@ import Link from 'next/link' - import { Button, cn } from 'ui' import { Admonition } from 'ui-patterns' diff --git a/apps/studio/components/ui/UpgradePlanButton.tsx b/apps/studio/components/ui/UpgradePlanButton.tsx index 5043fe54bf..b5d87a2ab2 100644 --- a/apps/studio/components/ui/UpgradePlanButton.tsx +++ b/apps/studio/components/ui/UpgradePlanButton.tsx @@ -1,15 +1,15 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useFlag, useParams } from 'common' -import { SupportLink } from 'components/interfaces/Support/SupportLink' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import Link from 'next/link' import { PropsWithChildren } from 'react' import { Button } from 'ui' import { ButtonTooltip } from './ButtonTooltip' import { RequestUpgradeToBillingOwners } from './RequestUpgradeToBillingOwners' +import { SupportLink } from '@/components/interfaces/Support/SupportLink' +import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' +import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' +import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' export const PLAN_REQUEST_EMPTY_PLACEHOLDER = '' diff --git a/apps/studio/components/ui/VirtualizedTable.tsx b/apps/studio/components/ui/VirtualizedTable.tsx index 13aec730a4..c57c5cfd6b 100644 --- a/apps/studio/components/ui/VirtualizedTable.tsx +++ b/apps/studio/components/ui/VirtualizedTable.tsx @@ -1,5 +1,6 @@ import type { VirtualItem, Virtualizer } from '@tanstack/react-virtual' import { useVirtualizer } from '@tanstack/react-virtual' +import { mergeRefs } from 'common' import type { HTMLAttributes, ReactElement, ReactNode, Ref } from 'react' import { cloneElement, @@ -11,8 +12,6 @@ import { useMemo, useRef, } from 'react' - -import { mergeRefs } from 'common' import { cn, Table, diff --git a/prettier.config.mjs b/prettier.config.mjs index 2c42fb5224..3b1892de86 100644 --- a/prettier.config.mjs +++ b/prettier.config.mjs @@ -17,14 +17,20 @@ let options = { ], } +const sortImportsOptions = { + plugins: ['prettier-plugin-sql-cst', '@ianvs/prettier-plugin-sort-imports'], + importOrder: ['', '', '^(@|\\.{1,2})/(.*)$'], +} + // Disable sorting imports when running a prettier command in CI. This is to make the sorting work in editors -// for easier migration. +// for easier migration. Studio components are always sorted regardless of this flag. if (process.env.SORT_IMPORTS !== 'false') { - options = { - ...options, - plugins: [...options.plugins, '@ianvs/prettier-plugin-sort-imports'], - importOrder: ['', '', '^(@|\\.{1,2})/(.*)$'], - } + options = { ...options, ...sortImportsOptions } +} else { + options.overrides.push({ + files: 'apps/studio/components/**/*.{js,jsx,ts,tsx}', + options: sortImportsOptions, + }) } export default options