diff --git a/apps/design-system/__registry__/default/block/chart-bar-interactive.tsx b/apps/design-system/__registry__/default/block/chart-bar-interactive.tsx index fca68de5bc732..128664bb431e8 100644 --- a/apps/design-system/__registry__/default/block/chart-bar-interactive.tsx +++ b/apps/design-system/__registry__/default/block/chart-bar-interactive.tsx @@ -146,7 +146,8 @@ export default function Component() { {['desktop', 'mobile'].map((key) => { const chart = key as keyof typeof chartConfig return ( - - ) -} - -export { SkipToContent } diff --git a/apps/docs/components/WrapperDashboardIntegration.tsx b/apps/docs/components/WrapperDashboardIntegration.tsx index 8ec6fcd727dc5..4e423f93b2aa8 100644 --- a/apps/docs/components/WrapperDashboardIntegration.tsx +++ b/apps/docs/components/WrapperDashboardIntegration.tsx @@ -1,6 +1,6 @@ import Link from 'next/link' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' export function WrapperDashboardIntegration({ title, path }: { title: string; path: string }) { return ( diff --git a/apps/docs/content/guides/database/custom-postgres-config.mdx b/apps/docs/content/guides/database/custom-postgres-config.mdx index b6a02132e20c9..bf233cb012837 100644 --- a/apps/docs/content/guides/database/custom-postgres-config.mdx +++ b/apps/docs/content/guides/database/custom-postgres-config.mdx @@ -48,28 +48,28 @@ show "statement_timeout"; Some settings can only be modified by a superuser. Supabase pre-enables the [`supautils` extension](/blog/roles-postgres-hooks#setting-up-the-supautils-extension), which allows the `postgres` role to retain certain superuser privileges. It enables modification of the below reserved configurations at the `role` level: -| Setting | Description | -| ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `auto_explain.*` | Configures the [auto_explain module](https://www.postgresql.org/docs/current/auto-explain.html). Can be configured to log execution plans for queries expected to exceed x seconds, including function queries. | -| `deadlock_timeout` | Sets the time to wait on a lock before checking for deadlock. | -| `log_lock_waits` | Controls whether a log message is produced when a session waits longer than [deadlock_timeout](https://www.postgresql.org/docs/current/runtime-config-locks.html#GUC-DEADLOCK-TIMEOUT) to acquire a lock. | -| `log_min_duration_statement` | Causes the duration of each completed statement to be logged if the statement ran for at least the specified amount of time. | -| `log_min_messages` | Minimum severity level of messages to log. | -| `log_parameter_max_length` | Sets the maximum length in bytes of data logged for bind parameter values when logging statements. | -| `log_replication_commands` | Logs all replication commands | -| `log_statement` | Controls which SQL statements are logged. Valid values are `none` (off), `ddl`, `mod`, and `all` (all statements). | -| `log_temp_files` | Controls logging of temporary file names and sizes. | -| `pg_net.batch_size` | Sets how many requests the [pg_net extension](/docs/guides/database/extensions/pg_net) can make per second | -| `pg_net.ttl` | Sets how long the [pg_net extension](/docs/guides/database/extensions/pg_net) saves responses | -| `pg_stat_statements.*` | Configures the [pg_stat_statements extension](https://www.postgresql.org/docs/current/pgstatstatements.html). | -| `pgaudit.*` | Configures the [PGAudit extension](/docs/guides/database/extensions/pgaudit). The `log_parameter` is still restricted to protect secrets | -| `pgrst.*` | [`PostgREST` settings](https://docs.postgrest.org/en/stable/references/configuration.html#db-aggregates-enabled) | -| `plan_filter.*` | Configures the [pg_plan_filter extension](/docs/guides/database/extensions/pg_plan_filter) | -| `safeupdate.enabled` | Enables the [safeupdate extension](https://github.com/eradman/pg-safeupdate), which requires a `WHERE` clause on `UPDATE` and `DELETE` statements. | -| `session_replication_role` | Sets the session's behavior for triggers and rewrite rules. | -| `track_functions` | Controls whether function call counts and timing are tracked. Valid values are `none`, `pl` (only procedural-language functions), and `all`. | -| `track_io_timing` | Collects timing statistics for database I/O activity. | -| `wal_compression` | This parameter enables compression of WAL using the specified compression method. | +| Setting | Description | +| ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `auto_explain.*` | Configures the [auto_explain module](https://www.postgresql.org/docs/current/auto-explain.html). Can be configured to log execution plans for queries expected to exceed x seconds, including function queries. | +| `deadlock_timeout` | Sets the time to wait on a lock before checking for deadlock. | +| `log_duration` | Logs how long a query ran for, but not the entire query itself. | +| `log_lock_waits` | Controls whether a log message is produced when a session waits longer than [deadlock_timeout](https://www.postgresql.org/docs/current/runtime-config-locks.html#GUC-DEADLOCK-TIMEOUT) to acquire a lock. | +| `log_min_duration_statement` | Logs the duration and text of completed statements whose execution time meets or exceeds the specified threshold | +| `log_min_error_statement` | Determines if the query that induced a log should be recorded as a subfield based on the event's [severity level](https://www.postgresql.org/docs/current/runtime-config-logging.html#RUNTIME-CONFIG-SEVERITY-LEVELS) | +| `log_min_messages` | Minimum severity level of messages to log. | +| `log_parameter_max_length` | Sets the maximum length in bytes of data logged for bind parameter values when logging statements. | +| `log_replication_commands` | Logs all replication commands | +| `log_statement` | Controls which SQL statements are logged. Valid values are `none` (off), `ddl`, `mod`, and `all` (all statements). | +| `log_temp_files` | Controls logging of temporary file names and sizes. | +| `pg_stat_statements.*` | Configures the [pg_stat_statements extension](https://www.postgresql.org/docs/current/pgstatstatements.html). | +| `pgaudit.*` | Configures the [PGAudit extension](/docs/guides/database/extensions/pgaudit). The `log_parameter` is still restricted to protect secrets | +| `pgrst.*` | [`PostgREST` settings](https://docs.postgrest.org/en/stable/references/configuration.html#db-aggregates-enabled) | +| `plan_filter.*` | Configures the [pg_plan_filter extension](/docs/guides/database/extensions/pg_plan_filter) | +| `safeupdate.enabled` | Enables the [safeupdate extension](https://github.com/eradman/pg-safeupdate), which requires a `WHERE` clause on `UPDATE` and `DELETE` statements. | +| `session_replication_role` | Sets the session's behavior for triggers and rewrite rules. | +| `track_functions` | Controls whether function call counts and timing are tracked. Valid values are `none`, `pl` (only procedural-language functions), and `all`. | +| `track_io_timing` | Collects timing statistics for database I/O activity. | +| `wal_compression` | This parameter enables compression of WAL using the specified compression method. | For example, to enable `log_nested_statements` for the `postgres` role, execute: @@ -123,10 +123,20 @@ Use the examples below with `supabase postgres-config update --project-ref
-
{children}
+
{children}
{!isExpanded && (
)} @@ -133,7 +133,7 @@ function ExpandableContent({ children }: { children: ReactNode }) { tabIndex={0} type="button" onClick={() => setIsExpanded((expanded) => !expanded)} - className="mt-2 text-sm text-brand-link transition-colors hover:text-brand focus-ring" + className="mt-2 cursor-pointer text-sm text-brand-link transition-colors hover:text-foreground focus-ring" aria-expanded={isExpanded} > {isExpanded ? 'Show less' : 'Show more'} @@ -167,7 +167,7 @@ function PromptBody({ ) return ( -
+
{prompt.expandable ? {content} : content}
) @@ -296,16 +296,32 @@ function PromptPanel({ children, className }: PromptPanelProps) { {header} - {prompts.map((prompt) => ( - - - - ))} + {/* Stack panes in one grid cell so the panel keeps the tallest tab's height. */} +
+ {prompts.map((prompt) => { + const isActive = prompt.value === activeTab + + return ( + + + + ) + })} +
) } diff --git a/apps/docs/layouts/MainSkeleton.tsx b/apps/docs/layouts/MainSkeleton.tsx index 93cc70fa00c19..5ae70b4386cd9 100644 --- a/apps/docs/layouts/MainSkeleton.tsx +++ b/apps/docs/layouts/MainSkeleton.tsx @@ -290,7 +290,7 @@ const Container = memo(function Container({ id={DOCS_CONTENT_CONTAINER_ID} tabIndex={-1} className={cn( - 'w-full transition-all ease-out relative scroll-mt-(--header-height)', + 'w-full transition-all ease-out relative scroll-mt-(--header-height) outline-hidden', // desktop override any margin styles 'lg:ml-0', className diff --git a/apps/docs/lib/mdx/plugins/remarkAdmonition.ts b/apps/docs/lib/mdx/plugins/remarkAdmonition.ts index 74fbcf4bb518b..fcdd3db06ec21 100644 --- a/apps/docs/lib/mdx/plugins/remarkAdmonition.ts +++ b/apps/docs/lib/mdx/plugins/remarkAdmonition.ts @@ -1,6 +1,6 @@ import type { BlockContent, Content, Paragraph, Root } from 'mdast' import type { MdxJsxFlowElement } from 'mdast-util-mdx' -import type { AdmonitionProps } from 'ui-patterns/admonition' +import type { AdmonitionProps } from 'ui-patterns/Admonition' import type { Node } from 'unist' import { visit } from 'unist-util-visit' diff --git a/apps/docs/public/humans.txt b/apps/docs/public/humans.txt index 47fd7062104b8..b9b05b1ecbfaa 100644 --- a/apps/docs/public/humans.txt +++ b/apps/docs/public/humans.txt @@ -59,8 +59,8 @@ Chris Chapman (Chappie) Chris Copplestone Chris Gwilliams Chris Martin +Chris Opland Chris Stockton -Chris Ward Christian Funkhouser Claudiu Dragalina-Paraipan Clayton Kast @@ -70,6 +70,7 @@ Colum Ferry Craig Cannon Cuong Do Dane Harrigan +Daniel Guerra Daniel Mitterdorfer Daniel Velázquez Lara Danny White diff --git a/apps/lite-studio/app/routes/projects.$ref.tsx b/apps/lite-studio/app/routes/projects.$ref.tsx index 3605a8f0224b3..5a6ace7ad705d 100644 --- a/apps/lite-studio/app/routes/projects.$ref.tsx +++ b/apps/lite-studio/app/routes/projects.$ref.tsx @@ -14,7 +14,7 @@ import { TabsList, TabsTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { PageHeader, PageHeaderDescription, diff --git a/apps/studio/CLAUDE.md b/apps/studio/CLAUDE.md index 892cbf8e93d8d..53de52db8915a 100644 --- a/apps/studio/CLAUDE.md +++ b/apps/studio/CLAUDE.md @@ -69,6 +69,7 @@ Older Studio code predates some of these conventions. For new or modified code, - **Memoization is not the default**: `useMemo`/`useCallback` only for measured expense or referential stability a memoized child depends on. - **TypeScript**: avoid `as` casts — where external data enters, parse it with zod (`schema.parse`/`safeParse`) instead. Model multi-state values as discriminated unions (`{ status: 'success'; data: T } | { status: 'error'; error: Error }`) rather than independent boolean flags. - **Naming**: prop callbacks are `onX`, internal handlers are `handleX`. Custom hooks return objects, not tuples. +- **Refactoring**: when you move or extract code into a new module, update every importer to point at the new location directly — do **not** leave a re-export shim in the old file "for backward compatibility." It's a one-line import change per consumer, and keeping shims around makes the codebase messy and the true source of a symbol ambiguous. ## Defaults that differ here diff --git a/apps/studio/components/grid/MsSqlValidation.tsx b/apps/studio/components/grid/MsSqlValidation.tsx index 8a5a92fff5735..befb1a9100a78 100644 --- a/apps/studio/components/grid/MsSqlValidation.tsx +++ b/apps/studio/components/grid/MsSqlValidation.tsx @@ -1,5 +1,5 @@ import type { ComponentType, ReactNode } from 'react' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import type { Filter, Sort } from './types' import { isMsSqlForeignTable, type Entity } from '@/data/table-editor/table-editor-types' diff --git a/apps/studio/components/grid/components/grid/GridError.tsx b/apps/studio/components/grid/components/grid/GridError.tsx index 955dd170d9b41..3af62b209bb2d 100644 --- a/apps/studio/components/grid/components/grid/GridError.tsx +++ b/apps/studio/components/grid/components/grid/GridError.tsx @@ -3,7 +3,7 @@ import { useParams } from 'common' import { ChevronDown } from 'lucide-react' import { useCallback } from 'react' import { Button, Collapsible, CollapsibleContent, CollapsibleTrigger } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { isFilterRelatedError } from './GridError.utils' import { useTableFilter } from '@/components/grid/hooks/useTableFilter' diff --git a/apps/studio/components/grid/components/header/ExportDialog.tsx b/apps/studio/components/grid/components/header/ExportDialog.tsx index 2553eefde3214..3f881e5fa2dfd 100644 --- a/apps/studio/components/grid/components/header/ExportDialog.tsx +++ b/apps/studio/components/grid/components/header/ExportDialog.tsx @@ -15,7 +15,7 @@ import { TabsList, TabsTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { CodeBlock } from 'ui-patterns/CodeBlock' import { Filter, Sort, SupaTable } from '@/components/grid/types' diff --git a/apps/studio/components/interfaces/APIKeys/CreateNewAPIKeysButton.tsx b/apps/studio/components/interfaces/APIKeys/CreateNewAPIKeysButton.tsx index bb22c34e8280f..bc7d2d67e6fcc 100644 --- a/apps/studio/components/interfaces/APIKeys/CreateNewAPIKeysButton.tsx +++ b/apps/studio/components/interfaces/APIKeys/CreateNewAPIKeysButton.tsx @@ -13,7 +13,7 @@ import { AlertDialogTitle, Button, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { useAPIKeyCreateMutation } from '@/data/api-keys/api-key-create-mutation' diff --git a/apps/studio/components/interfaces/APIKeys/PublishableAPIKeys.tsx b/apps/studio/components/interfaces/APIKeys/PublishableAPIKeys.tsx index b594ae89e54be..0c4b3ecfb5280 100644 --- a/apps/studio/components/interfaces/APIKeys/PublishableAPIKeys.tsx +++ b/apps/studio/components/interfaces/APIKeys/PublishableAPIKeys.tsx @@ -13,7 +13,7 @@ import { TableHeader, TableRow, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { APIKeyRow } from './APIKeyRow' diff --git a/apps/studio/components/interfaces/Account/AccessTokens/AccessTokenNewBanner/AccessTokenNewBanner.tsx b/apps/studio/components/interfaces/Account/AccessTokens/AccessTokenNewBanner/AccessTokenNewBanner.tsx index 2046c267ba3ae..d88ea7f2698dc 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/AccessTokenNewBanner/AccessTokenNewBanner.tsx +++ b/apps/studio/components/interfaces/Account/AccessTokens/AccessTokenNewBanner/AccessTokenNewBanner.tsx @@ -1,7 +1,7 @@ import { X } from 'lucide-react' import { toast } from 'sonner' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { Input } from 'ui-patterns/DataInputs/Input' import { useGroupedPermissions } from '../hooks/useGroupedPermissions' diff --git a/apps/studio/components/interfaces/Account/AccessTokens/Classic/NewTokenDialog.tsx b/apps/studio/components/interfaces/Account/AccessTokens/Classic/NewTokenDialog.tsx index fb289f932edbc..b66bc48a412d0 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/Classic/NewTokenDialog.tsx +++ b/apps/studio/components/interfaces/Account/AccessTokens/Classic/NewTokenDialog.tsx @@ -24,7 +24,7 @@ import { SelectValue, WarningIcon, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { z } from 'zod' diff --git a/apps/studio/components/interfaces/Account/AccessTokens/Scoped/NewScopedTokenSheet.tsx b/apps/studio/components/interfaces/Account/AccessTokens/Scoped/NewScopedTokenSheet.tsx index 31efd63cd9b55..0288f218f3342 100644 --- a/apps/studio/components/interfaces/Account/AccessTokens/Scoped/NewScopedTokenSheet.tsx +++ b/apps/studio/components/interfaces/Account/AccessTokens/Scoped/NewScopedTokenSheet.tsx @@ -17,7 +17,7 @@ import { SheetHeader, SheetTitle, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { CUSTOM_EXPIRY_VALUE, diff --git a/apps/studio/components/interfaces/Advisors/CreateRuleSheet.tsx b/apps/studio/components/interfaces/Advisors/CreateRuleSheet.tsx index ceef2a9f4729f..f188769bf9fa1 100644 --- a/apps/studio/components/interfaces/Advisors/CreateRuleSheet.tsx +++ b/apps/studio/components/interfaces/Advisors/CreateRuleSheet.tsx @@ -27,7 +27,7 @@ import { TooltipContent, TooltipTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import * as z from 'zod' diff --git a/apps/studio/components/interfaces/ApiAuthorization/ApiAuthorization.Approved.tsx b/apps/studio/components/interfaces/ApiAuthorization/ApiAuthorization.Approved.tsx index 5ca755035e2b5..d44e05044ef5b 100644 --- a/apps/studio/components/interfaces/ApiAuthorization/ApiAuthorization.Approved.tsx +++ b/apps/studio/components/interfaces/ApiAuthorization/ApiAuthorization.Approved.tsx @@ -1,6 +1,6 @@ import dayjs from 'dayjs' import type { ReactNode } from 'react' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { AuthorizeConnectLogo, diff --git a/apps/studio/components/interfaces/ApiAuthorization/ApiAuthorization.Error.tsx b/apps/studio/components/interfaces/ApiAuthorization/ApiAuthorization.Error.tsx index 1789962add40d..7aa0935ad0c29 100644 --- a/apps/studio/components/interfaces/ApiAuthorization/ApiAuthorization.Error.tsx +++ b/apps/studio/components/interfaces/ApiAuthorization/ApiAuthorization.Error.tsx @@ -1,7 +1,7 @@ import Link from 'next/link' import type { ReactNode } from 'react' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { InterstitialLayout, SupabaseLogo } from '@/components/layouts/InterstitialLayout' import type { ResourceError } from '@/data/api-authorization/api-authorization-query' diff --git a/apps/studio/components/interfaces/ApiAuthorization/ApiAuthorization.Form.tsx b/apps/studio/components/interfaces/ApiAuthorization/ApiAuthorization.Form.tsx index 17b9c1cb8e301..334ffc539a7ac 100644 --- a/apps/studio/components/interfaces/ApiAuthorization/ApiAuthorization.Form.tsx +++ b/apps/studio/components/interfaces/ApiAuthorization/ApiAuthorization.Form.tsx @@ -15,7 +15,7 @@ import { SelectTrigger, SelectValue, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import type { ApprovalState, IApprovalFormSchema } from './ApiAuthorization.Schema' diff --git a/apps/studio/components/interfaces/ApiAuthorization/ApiAuthorization.Invalid.tsx b/apps/studio/components/interfaces/ApiAuthorization/ApiAuthorization.Invalid.tsx index 66c2f0c7c519c..5759641e5592c 100644 --- a/apps/studio/components/interfaces/ApiAuthorization/ApiAuthorization.Invalid.tsx +++ b/apps/studio/components/interfaces/ApiAuthorization/ApiAuthorization.Invalid.tsx @@ -1,7 +1,7 @@ import Link from 'next/link' import type { ReactNode } from 'react' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { InterstitialLayout, SupabaseLogo } from '@/components/layouts/InterstitialLayout' diff --git a/apps/studio/components/interfaces/Auth/AuditLogsForm.tsx b/apps/studio/components/interfaces/Auth/AuditLogsForm.tsx index 7715bf6ca478a..94c27c95537d2 100644 --- a/apps/studio/components/interfaces/Auth/AuditLogsForm.tsx +++ b/apps/studio/components/interfaces/Auth/AuditLogsForm.tsx @@ -5,7 +5,7 @@ import { useEffect } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' import { Button, Card, CardContent, CardFooter, Form, FormControl, FormField, Switch } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { PageSection, diff --git a/apps/studio/components/interfaces/Auth/AuthProvidersForm/ProviderForm.tsx b/apps/studio/components/interfaces/Auth/AuthProvidersForm/ProviderForm.tsx index 673a94855ad0b..06e8cd5edd5b6 100644 --- a/apps/studio/components/interfaces/Auth/AuthProvidersForm/ProviderForm.tsx +++ b/apps/studio/components/interfaces/Auth/AuthProvidersForm/ProviderForm.tsx @@ -18,7 +18,7 @@ import { SheetSection, SheetTitle, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { Input } from 'ui-patterns/DataInputs/Input' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' diff --git a/apps/studio/components/interfaces/Auth/CustomAuthProviders/CustomAuthProvidersList.tsx b/apps/studio/components/interfaces/Auth/CustomAuthProviders/CustomAuthProvidersList.tsx index a2a71318107b2..ade0cd694ace0 100644 --- a/apps/studio/components/interfaces/Auth/CustomAuthProviders/CustomAuthProvidersList.tsx +++ b/apps/studio/components/interfaces/Auth/CustomAuthProviders/CustomAuthProvidersList.tsx @@ -26,7 +26,7 @@ import { TableHeadSort, TableRow, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { CreateOrUpdateCustomProviderSheet } from './CreateOrUpdateCustomProviderSheet' diff --git a/apps/studio/components/interfaces/Auth/EmailTemplates/CustomEmailTemplateRestrictionAdmonition.tsx b/apps/studio/components/interfaces/Auth/EmailTemplates/CustomEmailTemplateRestrictionAdmonition.tsx index d7cd05b278149..63a04b6ced915 100644 --- a/apps/studio/components/interfaces/Auth/EmailTemplates/CustomEmailTemplateRestrictionAdmonition.tsx +++ b/apps/studio/components/interfaces/Auth/EmailTemplates/CustomEmailTemplateRestrictionAdmonition.tsx @@ -8,7 +8,7 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' diff --git a/apps/studio/components/interfaces/Auth/EmailTemplates/EmailTemplates.tsx b/apps/studio/components/interfaces/Auth/EmailTemplates/EmailTemplates.tsx index 5f503ec80ad56..ca2ce5edff4a1 100644 --- a/apps/studio/components/interfaces/Auth/EmailTemplates/EmailTemplates.tsx +++ b/apps/studio/components/interfaces/Auth/EmailTemplates/EmailTemplates.tsx @@ -7,7 +7,7 @@ import { useEffect } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' import { Button, Card, CardContent, CardFooter, Form, FormControl, FormField, Switch } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { PageSection, PageSectionContent, diff --git a/apps/studio/components/interfaces/Auth/EmailTemplates/ResetTemplateDialog.tsx b/apps/studio/components/interfaces/Auth/EmailTemplates/ResetTemplateDialog.tsx index 233e993f0421a..e613873104b79 100644 --- a/apps/studio/components/interfaces/Auth/EmailTemplates/ResetTemplateDialog.tsx +++ b/apps/studio/components/interfaces/Auth/EmailTemplates/ResetTemplateDialog.tsx @@ -15,7 +15,7 @@ import { AlertDialogTrigger, Button, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { type AuthTemplate } from './EmailTemplates.types' import { getAuthTemplateType } from './EmailTemplates.utils' diff --git a/apps/studio/components/interfaces/Auth/EmailTemplates/SendEmailHookActiveAdmonition.tsx b/apps/studio/components/interfaces/Auth/EmailTemplates/SendEmailHookActiveAdmonition.tsx index 85aeb69b711bc..4f733d0fe59f5 100644 --- a/apps/studio/components/interfaces/Auth/EmailTemplates/SendEmailHookActiveAdmonition.tsx +++ b/apps/studio/components/interfaces/Auth/EmailTemplates/SendEmailHookActiveAdmonition.tsx @@ -1,7 +1,7 @@ import { useParams } from 'common' import Link from 'next/link' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { InlineLink } from '@/components/ui/InlineLink' import { DOCS_URL } from '@/lib/constants' diff --git a/apps/studio/components/interfaces/Auth/EmailTemplates/SpamValidation.tsx b/apps/studio/components/interfaces/Auth/EmailTemplates/SpamValidation.tsx index 0538087f09975..6ba73ea496273 100644 --- a/apps/studio/components/interfaces/Auth/EmailTemplates/SpamValidation.tsx +++ b/apps/studio/components/interfaces/Auth/EmailTemplates/SpamValidation.tsx @@ -1,6 +1,6 @@ import { AnimatePresence, motion } from 'framer-motion' import { CardContent, Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { Markdown } from '@/components/interfaces/Markdown' import { ValidateSpamResponse } from '@/data/auth/validate-spam-mutation' diff --git a/apps/studio/components/interfaces/Auth/EmailTemplates/TemplateEditor.tsx b/apps/studio/components/interfaces/Auth/EmailTemplates/TemplateEditor.tsx index dadfc4561dea3..e3eeeb8abb2b0 100644 --- a/apps/studio/components/interfaces/Auth/EmailTemplates/TemplateEditor.tsx +++ b/apps/studio/components/interfaces/Auth/EmailTemplates/TemplateEditor.tsx @@ -19,7 +19,7 @@ import { TooltipContent, TooltipTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import z from 'zod' diff --git a/apps/studio/components/interfaces/Auth/Hooks/CreateHookSheet.tsx b/apps/studio/components/interfaces/Auth/Hooks/CreateHookSheet.tsx index 8b2561a7c6530..4495b281c8c91 100644 --- a/apps/studio/components/interfaces/Auth/Hooks/CreateHookSheet.tsx +++ b/apps/studio/components/interfaces/Auth/Hooks/CreateHookSheet.tsx @@ -27,7 +27,7 @@ import { SheetTitle, Switch, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { InfoTooltip } from 'ui-patterns/info-tooltip' import * as z from 'zod' diff --git a/apps/studio/components/interfaces/Auth/OAuthApps/NewOAuthAppBanner.tsx b/apps/studio/components/interfaces/Auth/OAuthApps/NewOAuthAppBanner.tsx index 96554d1f4e319..61fa445a04302 100644 --- a/apps/studio/components/interfaces/Auth/OAuthApps/NewOAuthAppBanner.tsx +++ b/apps/studio/components/interfaces/Auth/OAuthApps/NewOAuthAppBanner.tsx @@ -2,7 +2,7 @@ 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 { Admonition } from 'ui-patterns/Admonition' import { Input } from 'ui-patterns/DataInputs/Input' interface NewOAuthAppBannerProps { diff --git a/apps/studio/components/interfaces/Auth/OAuthApps/OAuthAppsList.tsx b/apps/studio/components/interfaces/Auth/OAuthApps/OAuthAppsList.tsx index 5a85a8a018301..66d689a2ca4ef 100644 --- a/apps/studio/components/interfaces/Auth/OAuthApps/OAuthAppsList.tsx +++ b/apps/studio/components/interfaces/Auth/OAuthApps/OAuthAppsList.tsx @@ -24,7 +24,7 @@ import { TableHeadSort, TableRow, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { TimestampInfo } from 'ui-patterns/TimestampInfo' diff --git a/apps/studio/components/interfaces/Auth/OAuthApps/OAuthServerSettingsForm.tsx b/apps/studio/components/interfaces/Auth/OAuthApps/OAuthServerSettingsForm.tsx index 9c77405434d7b..0ecd8ea5d033b 100644 --- a/apps/studio/components/interfaces/Auth/OAuthApps/OAuthServerSettingsForm.tsx +++ b/apps/studio/components/interfaces/Auth/OAuthApps/OAuthServerSettingsForm.tsx @@ -16,7 +16,7 @@ import { Input, Switch, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { PageSection, PageSectionContent } from 'ui-patterns/PageSection' diff --git a/apps/studio/components/interfaces/Auth/SmtpForm/SmtpForm.tsx b/apps/studio/components/interfaces/Auth/SmtpForm/SmtpForm.tsx index b2570e7036791..997cec88e847d 100644 --- a/apps/studio/components/interfaces/Auth/SmtpForm/SmtpForm.tsx +++ b/apps/studio/components/interfaces/Auth/SmtpForm/SmtpForm.tsx @@ -19,7 +19,7 @@ import { InputGroupText, Switch, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { Input as PasswordInput } from 'ui-patterns/DataInputs/Input' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { PageSection, PageSectionContent } from 'ui-patterns/PageSection' diff --git a/apps/studio/components/interfaces/Auth/Users/UserLogs.tsx b/apps/studio/components/interfaces/Auth/Users/UserLogs.tsx index beaa3fcd4fbb6..574f355de8e3d 100644 --- a/apps/studio/components/interfaces/Auth/Users/UserLogs.tsx +++ b/apps/studio/components/interfaces/Auth/Users/UserLogs.tsx @@ -4,7 +4,7 @@ import Link from 'next/link' import { useQueryState } from 'nuqs' import { useEffect } from 'react' import { Button, cn, CriticalIcon, Separator } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { TimestampInfo } from 'ui-patterns/TimestampInfo' diff --git a/apps/studio/components/interfaces/Auth/Users/UserOverview.tsx b/apps/studio/components/interfaces/Auth/Users/UserOverview.tsx index 2b7808c3da2a2..1a4da14e9e042 100644 --- a/apps/studio/components/interfaces/Auth/Users/UserOverview.tsx +++ b/apps/studio/components/interfaces/Auth/Users/UserOverview.tsx @@ -6,7 +6,7 @@ import Link from 'next/link' import { ComponentProps, ReactNode, useEffect, useState } from 'react' import { toast } from 'sonner' import { Button, cn, Separator } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { PROVIDERS_SCHEMAS } from '../AuthProvidersFormValidation' diff --git a/apps/studio/components/interfaces/Billing/NoProjectsOnPaidOrgInfo.tsx b/apps/studio/components/interfaces/Billing/NoProjectsOnPaidOrgInfo.tsx index 1686bdf5b0f33..471917a2ca22f 100644 --- a/apps/studio/components/interfaces/Billing/NoProjectsOnPaidOrgInfo.tsx +++ b/apps/studio/components/interfaces/Billing/NoProjectsOnPaidOrgInfo.tsx @@ -1,5 +1,5 @@ import Link from 'next/link' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { useOrgProjectsInfiniteQuery } from '@/data/projects/org-projects-infinite-query' import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' diff --git a/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/DeletePaymentMethodModal.tsx b/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/DeletePaymentMethodModal.tsx index 5d70043695bd7..d8d83b3a8ec3c 100644 --- a/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/DeletePaymentMethodModal.tsx +++ b/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/DeletePaymentMethodModal.tsx @@ -10,7 +10,7 @@ import { AlertDialogHeader, AlertDialogTitle, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { useOrganizationPaymentMethodDeleteMutation } from '@/data/organizations/organization-payment-method-delete-mutation' import type { OrganizationPaymentMethod } from '@/data/organizations/organization-payment-methods-query' diff --git a/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/PaymentMethods.tsx b/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/PaymentMethods.tsx index 85b92a6c18adc..fda065cad1117 100644 --- a/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/PaymentMethods.tsx +++ b/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/PaymentMethods.tsx @@ -4,7 +4,7 @@ import { CreditCardIcon, ExternalLink, Plus } from 'lucide-react' import { useState } from 'react' import { toast } from 'sonner' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import ChangePaymentMethodModal from './ChangePaymentMethodModal' diff --git a/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/StripePaymentConnection.tsx b/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/StripePaymentConnection.tsx index a980ff2eb6003..e4eb1b951f5a5 100644 --- a/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/StripePaymentConnection.tsx +++ b/apps/studio/components/interfaces/Billing/Payment/PaymentMethods/StripePaymentConnection.tsx @@ -1,6 +1,6 @@ import { ExternalLink } from 'lucide-react' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import PartnerIcon from '@/components/ui/PartnerIcon' import { MANAGED_BY } from '@/lib/constants/infrastructure' diff --git a/apps/studio/components/interfaces/Billing/Usage/UsageWarningAlerts/DiskIOBandwidthWarnings.tsx b/apps/studio/components/interfaces/Billing/Usage/UsageWarningAlerts/DiskIOBandwidthWarnings.tsx index 76fd9d3bbdb8d..21a1d5428c3c9 100644 --- a/apps/studio/components/interfaces/Billing/Usage/UsageWarningAlerts/DiskIOBandwidthWarnings.tsx +++ b/apps/studio/components/interfaces/Billing/Usage/UsageWarningAlerts/DiskIOBandwidthWarnings.tsx @@ -1,6 +1,6 @@ import Link from 'next/link' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' // [Joshen] In the future, conditionals should be from resource exhaustion endpoint as single source of truth interface DiskIOBandwidthWarningsProps { diff --git a/apps/studio/components/interfaces/BranchManagement/OutOfDateNotice.tsx b/apps/studio/components/interfaces/BranchManagement/OutOfDateNotice.tsx index 7186cf000786d..493ae385d397a 100644 --- a/apps/studio/components/interfaces/BranchManagement/OutOfDateNotice.tsx +++ b/apps/studio/components/interfaces/BranchManagement/OutOfDateNotice.tsx @@ -12,7 +12,7 @@ import { AlertDialogTrigger, Button, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' import { useTrack } from '@/lib/telemetry/track' diff --git a/apps/studio/components/interfaces/ConnectSheet/ConnectStepsSection.tsx b/apps/studio/components/interfaces/ConnectSheet/ConnectStepsSection.tsx index dd9d6c301fd54..808e91f795042 100644 --- a/apps/studio/components/interfaces/ConnectSheet/ConnectStepsSection.tsx +++ b/apps/studio/components/interfaces/ConnectSheet/ConnectStepsSection.tsx @@ -3,7 +3,7 @@ import dynamic from 'next/dynamic' import Link from 'next/link' import { useMemo, useRef, type ComponentType } from 'react' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import type { diff --git a/apps/studio/components/interfaces/Database/Backups/BackupsList.tsx b/apps/studio/components/interfaces/Database/Backups/BackupsList.tsx index edac39d4c1196..dadc2ee082014 100644 --- a/apps/studio/components/interfaces/Database/Backups/BackupsList.tsx +++ b/apps/studio/components/interfaces/Database/Backups/BackupsList.tsx @@ -4,7 +4,7 @@ import { Clock } from 'lucide-react' import { useRouter } from 'next/router' import { useState } from 'react' import { toast } from 'sonner' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { TimestampInfo } from 'ui-patterns/TimestampInfo' diff --git a/apps/studio/components/interfaces/Database/Backups/BackupsStorageAlert.tsx b/apps/studio/components/interfaces/Database/Backups/BackupsStorageAlert.tsx index c2edcd30ddd22..b6ec9b1e88147 100644 --- a/apps/studio/components/interfaces/Database/Backups/BackupsStorageAlert.tsx +++ b/apps/studio/components/interfaces/Database/Backups/BackupsStorageAlert.tsx @@ -1,4 +1,4 @@ -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' export const BackupsStorageAlert = () => { return ( diff --git a/apps/studio/components/interfaces/Database/Extensions/EnableExtensionModal.tsx b/apps/studio/components/interfaces/Database/Extensions/EnableExtensionModal.tsx index 5e63927a2eb75..3a142bfdb1760 100644 --- a/apps/studio/components/interfaces/Database/Extensions/EnableExtensionModal.tsx +++ b/apps/studio/components/interfaces/Database/Extensions/EnableExtensionModal.tsx @@ -23,7 +23,7 @@ import { SelectTrigger, SelectValue, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import * as z from 'zod' diff --git a/apps/studio/components/interfaces/Database/Extensions/ExtensionRow.tsx b/apps/studio/components/interfaces/Database/Extensions/ExtensionRow.tsx index 55123bf7d7b95..f8df8b3956116 100644 --- a/apps/studio/components/interfaces/Database/Extensions/ExtensionRow.tsx +++ b/apps/studio/components/interfaces/Database/Extensions/ExtensionRow.tsx @@ -5,7 +5,7 @@ import { useState } from 'react' import { extensions } from 'shared-data' import { toast } from 'sonner' import { Button, Switch, TableCell, TableRow, Tooltip, TooltipContent, TooltipTrigger } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ConfirmationModal } from 'ui-patterns/Dialogs/ConfirmationModal' import { EnableExtensionModal } from './EnableExtensionModal' diff --git a/apps/studio/components/interfaces/Database/Indexes/CreateIndexSidePanel.tsx b/apps/studio/components/interfaces/Database/Indexes/CreateIndexSidePanel.tsx index f563566b069fb..934d7e178a72c 100644 --- a/apps/studio/components/interfaces/Database/Indexes/CreateIndexSidePanel.tsx +++ b/apps/studio/components/interfaces/Database/Indexes/CreateIndexSidePanel.tsx @@ -33,7 +33,7 @@ import { SheetSection, SheetTitle, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { MultiSelector, diff --git a/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx b/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx index b893c62e324be..7c29d537f9d20 100644 --- a/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx +++ b/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx @@ -16,7 +16,7 @@ import { TooltipContent, TooltipTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { Input } from 'ui-patterns/DataInputs/Input' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { TimestampInfo } from 'ui-patterns/TimestampInfo' diff --git a/apps/studio/components/interfaces/Database/Policies/Policies.tsx b/apps/studio/components/interfaces/Database/Policies/Policies.tsx index a12159fdfe1ee..e260bd4382e88 100644 --- a/apps/studio/components/interfaces/Database/Policies/Policies.tsx +++ b/apps/studio/components/interfaces/Database/Policies/Policies.tsx @@ -4,7 +4,7 @@ import Link from 'next/link' import { useCallback, useState } from 'react' import { toast } from 'sonner' import { Button, Card, CardContent } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { usePoliciesData } from './PoliciesDataContext' diff --git a/apps/studio/components/interfaces/Database/Policies/PolicyTableRow/index.tsx b/apps/studio/components/interfaces/Database/Policies/PolicyTableRow/index.tsx index 9b04640fe635f..6f3a774677850 100644 --- a/apps/studio/components/interfaces/Database/Policies/PolicyTableRow/index.tsx +++ b/apps/studio/components/interfaces/Database/Policies/PolicyTableRow/index.tsx @@ -12,7 +12,7 @@ import { TableHeader, TableRow, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { usePoliciesData } from '../PoliciesDataContext' diff --git a/apps/studio/components/interfaces/Database/ProtectedSchemaWarning.tsx b/apps/studio/components/interfaces/Database/ProtectedSchemaWarning.tsx index 556c808c992b0..1f8b0b7bfc6a1 100644 --- a/apps/studio/components/interfaces/Database/ProtectedSchemaWarning.tsx +++ b/apps/studio/components/interfaces/Database/ProtectedSchemaWarning.tsx @@ -10,7 +10,7 @@ import { DialogTitle, DialogTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { INTERNAL_SCHEMAS, useIsProtectedSchema } from '@/hooks/useProtectedSchemas' diff --git a/apps/studio/components/interfaces/Database/Publications/PublicationsTables.tsx b/apps/studio/components/interfaces/Database/Publications/PublicationsTables.tsx index 05646721e50cc..349c810127249 100644 --- a/apps/studio/components/interfaces/Database/Publications/PublicationsTables.tsx +++ b/apps/studio/components/interfaces/Database/Publications/PublicationsTables.tsx @@ -3,7 +3,7 @@ import { useParams } from 'common' import { Search } from 'lucide-react' import { useMemo, useRef, useState } from 'react' import { Card, Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { Input } from 'ui-patterns/DataInputs/Input' import { PublicationTablesSkeleton } from './PublicationSkeleton' diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/AnalyticsBucket/Fields.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/AnalyticsBucket/Fields.tsx index 51c0746c7acfb..dff62c342a4b4 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/AnalyticsBucket/Fields.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/AnalyticsBucket/Fields.tsx @@ -15,7 +15,7 @@ import { SelectTrigger, WarningIcon, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { Input as PasswordInput } from 'ui-patterns/DataInputs/Input' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/DuckLake/Fields.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/DuckLake/Fields.tsx index 2e02ce5bc4d4b..e124836790115 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/DuckLake/Fields.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/DuckLake/Fields.tsx @@ -22,7 +22,7 @@ import { SelectTrigger, WarningIcon, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { Input as PasswordInput } from 'ui-patterns/DataInputs/Input' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' 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 2d3f65b37f5cd..912156d765b7a 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/PublicationSelection.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/PublicationSelection.tsx @@ -2,7 +2,7 @@ import { useParams } from 'common' import { useMemo } from 'react' import type { UseFormReturn } from 'react-hook-form' import { FormControl, FormField } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import type { DestinationPanelSchemaType } from './DestinationForm.schema' diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/TableCopySelection.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/TableCopySelection.tsx index ecdd1e339d749..2db3fed60bafc 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/TableCopySelection.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/TableCopySelection.tsx @@ -2,7 +2,7 @@ import { useParams } from 'common' import { useMemo } from 'react' import type { UseFormReturn } from 'react-hook-form' import { FormControl, FormField, Select, SelectContent, SelectItem, SelectTrigger } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { MultiSelector } from 'ui-patterns/multi-select' 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 6ff0e0a4d75cc..1cdf154134957 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/ValidationFailuresSection.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/ValidationFailuresSection.tsx @@ -1,6 +1,6 @@ import { useParams } from 'common' import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Badge, Card } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { Markdown } from '@/components/interfaces/Markdown' import { InlineLink } from '@/components/ui/InlineLink' diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/index.test.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/index.test.tsx index 8a2c7caf74ece..675c129e84b45 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/index.test.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/index.test.tsx @@ -85,7 +85,7 @@ vi.mock('ui', () => ({ TooltipTrigger: ({ children }: PropsWithChildren) => {children}, })) -vi.mock('ui-patterns/admonition', () => ({ +vi.mock('ui-patterns/Admonition', () => ({ Admonition: ({ children }: PropsWithChildren) =>
{children}
, })) 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 03780cc60767f..079ac93f64d7c 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/index.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/index.tsx @@ -22,7 +22,7 @@ import { TooltipContent, TooltipTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import * as z from 'zod' 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 cfd10104d3d32..f029406a6027a 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicaForm/ReadReplicaEligibilityWarnings.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicaForm/ReadReplicaEligibilityWarnings.tsx @@ -4,7 +4,7 @@ import Link from 'next/link' import { useEffect, useState } from 'react' import { toast } from 'sonner' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { useCheckEligibilityDeployReplica } from './useCheckEligibilityDeployReplica' import { SupportLink } from '@/components/interfaces/Support/SupportLink' diff --git a/apps/studio/components/interfaces/Database/Replication/Destinations.tsx b/apps/studio/components/interfaces/Database/Replication/Destinations.tsx index 6e0ab94fd3ab2..fec2cc142af38 100644 --- a/apps/studio/components/interfaces/Database/Replication/Destinations.tsx +++ b/apps/studio/components/interfaces/Database/Replication/Destinations.tsx @@ -20,7 +20,7 @@ import { TableHeader, TableRow, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { Input } from 'ui-patterns/DataInputs/Input' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' diff --git a/apps/studio/components/interfaces/Database/Replication/DisablePipelinesDialog.tsx b/apps/studio/components/interfaces/Database/Replication/DisablePipelinesDialog.tsx index 9b666d6bf01f8..db2d4a997382a 100644 --- a/apps/studio/components/interfaces/Database/Replication/DisablePipelinesDialog.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DisablePipelinesDialog.tsx @@ -12,7 +12,7 @@ import { AlertDialogHeader, AlertDialogTitle, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { useDeleteReplicationTenantMutation } from '@/data/replication/delete-tenant-mutation' diff --git a/apps/studio/components/interfaces/Database/Replication/EnablePipelinesCallout.tsx b/apps/studio/components/interfaces/Database/Replication/EnablePipelinesCallout.tsx index 5adf07d8d66b0..6d3637ac4b93b 100644 --- a/apps/studio/components/interfaces/Database/Replication/EnablePipelinesCallout.tsx +++ b/apps/studio/components/interfaces/Database/Replication/EnablePipelinesCallout.tsx @@ -13,7 +13,7 @@ import { DialogTitle, DialogTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { DestinationType } from './DestinationPanel/DestinationPanel.types' import { DocsButton } from '@/components/ui/DocsButton' diff --git a/apps/studio/components/interfaces/Database/RestoreToNewProject/RestoreToNewProject.tsx b/apps/studio/components/interfaces/Database/RestoreToNewProject/RestoreToNewProject.tsx index 40da5f66a2a48..81f29c2018494 100644 --- a/apps/studio/components/interfaces/Database/RestoreToNewProject/RestoreToNewProject.tsx +++ b/apps/studio/components/interfaces/Database/RestoreToNewProject/RestoreToNewProject.tsx @@ -3,7 +3,7 @@ import { Loader2 } from 'lucide-react' import Link from 'next/link' import { useEffect, useState } from 'react' import { Alert, AlertDescription, AlertTitle, Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { PreviousRestoreItem } from './PreviousRestoreItem' diff --git a/apps/studio/components/interfaces/Database/Schemas/SchemaGraph.tsx b/apps/studio/components/interfaces/Database/Schemas/SchemaGraph.tsx index 2dcbf39311bbd..9598732384d59 100644 --- a/apps/studio/components/interfaces/Database/Schemas/SchemaGraph.tsx +++ b/apps/studio/components/interfaces/Database/Schemas/SchemaGraph.tsx @@ -38,7 +38,7 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { SidePanelEditor } from '../../TableGridEditor/SidePanelEditor/SidePanelEditor' import { DefaultEdge } from './DefaultEdge' diff --git a/apps/studio/components/interfaces/DiskManagement/DiskManagementForm.tsx b/apps/studio/components/interfaces/DiskManagement/DiskManagementForm.tsx index 778a790c3253c..c78aab5d4e119 100644 --- a/apps/studio/components/interfaces/DiskManagement/DiskManagementForm.tsx +++ b/apps/studio/components/interfaces/DiskManagement/DiskManagementForm.tsx @@ -17,7 +17,7 @@ import { Form, Separator, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormFooterChangeBadge } from '../DataWarehouse/FormFooterChangeBadge' import { CreateDiskStorageSchema, DiskStorageSchemaType } from './DiskManagement.schema' diff --git a/apps/studio/components/interfaces/DiskManagement/DiskManagementPanelForm.tsx b/apps/studio/components/interfaces/DiskManagement/DiskManagementPanelForm.tsx index 8257d48faedaf..03a04ecb40de8 100644 --- a/apps/studio/components/interfaces/DiskManagement/DiskManagementPanelForm.tsx +++ b/apps/studio/components/interfaces/DiskManagement/DiskManagementPanelForm.tsx @@ -1,7 +1,7 @@ import { useParams } from 'common' import Link from 'next/link' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { PageSection, PageSectionContent, diff --git a/apps/studio/components/interfaces/DiskManagement/fields/AutoScaleFields.tsx b/apps/studio/components/interfaces/DiskManagement/fields/AutoScaleFields.tsx index 08aecb8389d1b..e6a675e6ddace 100644 --- a/apps/studio/components/interfaces/DiskManagement/fields/AutoScaleFields.tsx +++ b/apps/studio/components/interfaces/DiskManagement/fields/AutoScaleFields.tsx @@ -8,7 +8,7 @@ import { InputGroupAddon, InputGroupText, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { DiskStorageSchemaType } from '../DiskManagement.schema' diff --git a/apps/studio/components/interfaces/DiskManagement/fields/ComputeSizeField.tsx b/apps/studio/components/interfaces/DiskManagement/fields/ComputeSizeField.tsx index e6639c9831abe..acd1cf8a1ae37 100644 --- a/apps/studio/components/interfaces/DiskManagement/fields/ComputeSizeField.tsx +++ b/apps/studio/components/interfaces/DiskManagement/fields/ComputeSizeField.tsx @@ -14,7 +14,7 @@ import { TooltipContent, TooltipTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ComputeBadge } from 'ui-patterns/ComputeBadge' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' diff --git a/apps/studio/components/interfaces/DiskManagement/ui/ComputeSizeRecommendationSection.tsx b/apps/studio/components/interfaces/DiskManagement/ui/ComputeSizeRecommendationSection.tsx index bf6c05bb26f97..2bd6436943dc1 100644 --- a/apps/studio/components/interfaces/DiskManagement/ui/ComputeSizeRecommendationSection.tsx +++ b/apps/studio/components/interfaces/DiskManagement/ui/ComputeSizeRecommendationSection.tsx @@ -2,7 +2,7 @@ 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 { Admonition } from 'ui-patterns/Admonition' import { DiskStorageSchemaType } from '../DiskManagement.schema' import { diff --git a/apps/studio/components/interfaces/DiskManagement/ui/DiskTypeRecommendationSection.tsx b/apps/studio/components/interfaces/DiskManagement/ui/DiskTypeRecommendationSection.tsx index f5f9ba7df38e3..3b8da212df0ae 100644 --- a/apps/studio/components/interfaces/DiskManagement/ui/DiskTypeRecommendationSection.tsx +++ b/apps/studio/components/interfaces/DiskManagement/ui/DiskTypeRecommendationSection.tsx @@ -1,7 +1,7 @@ import { AnimatePresence, motion } from 'framer-motion' import { ReactNode } from 'react' import { UseFormReturn } from 'react-hook-form' -import { Admonition } from 'ui-patterns/admonition' +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/FormMessage.tsx b/apps/studio/components/interfaces/DiskManagement/ui/FormMessage.tsx index 4352448e33cff..81cb935bfbd5a 100644 --- a/apps/studio/components/interfaces/DiskManagement/ui/FormMessage.tsx +++ b/apps/studio/components/interfaces/DiskManagement/ui/FormMessage.tsx @@ -1,5 +1,5 @@ import { AnimatePresence, motion } from 'framer-motion' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' interface FormMessageProps { message: string diff --git a/apps/studio/components/interfaces/DiskManagement/ui/SpendCapDisabledSection.tsx b/apps/studio/components/interfaces/DiskManagement/ui/SpendCapDisabledSection.tsx index fde0d5b5e8c42..284c0cbc53f1a 100644 --- a/apps/studio/components/interfaces/DiskManagement/ui/SpendCapDisabledSection.tsx +++ b/apps/studio/components/interfaces/DiskManagement/ui/SpendCapDisabledSection.tsx @@ -1,7 +1,7 @@ import { AnimatePresence, motion } from 'framer-motion' import Link from 'next/link' import { AlertDescription, AlertTitle, buttonVariants, cn } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' diff --git a/apps/studio/components/interfaces/Docs/PublicSchemaNotEnabledAlert.tsx b/apps/studio/components/interfaces/Docs/PublicSchemaNotEnabledAlert.tsx index 0059b22d52e25..562d4e9c87b74 100644 --- a/apps/studio/components/interfaces/Docs/PublicSchemaNotEnabledAlert.tsx +++ b/apps/studio/components/interfaces/Docs/PublicSchemaNotEnabledAlert.tsx @@ -1,7 +1,7 @@ import { useParams } from 'common' import Link from 'next/link' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' const PublicSchemaNotEnabledAlert = () => { const { ref: projectRef } = useParams() diff --git a/apps/studio/components/interfaces/Functions/EdgeFunctionRecentInvocations.tsx b/apps/studio/components/interfaces/Functions/EdgeFunctionRecentInvocations.tsx index e88ccfffdacb5..df0ea659a7eaa 100644 --- a/apps/studio/components/interfaces/Functions/EdgeFunctionRecentInvocations.tsx +++ b/apps/studio/components/interfaces/Functions/EdgeFunctionRecentInvocations.tsx @@ -3,7 +3,7 @@ import { Clock, ExternalLink, RefreshCw } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' import { Button, cn } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { TimestampInfo } from 'ui-patterns/TimestampInfo' diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CreateCronJobSheet.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CreateCronJobSheet.tsx index 8bcc3fc00c1ad..1e98e0e3d25aa 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CreateCronJobSheet.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CreateCronJobSheet/CreateCronJobSheet.tsx @@ -23,7 +23,7 @@ import { SheetTitle, WarningIcon, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { CRONJOB_DEFINITIONS } from '../CronJobs.constants' diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.CleanupNotice.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.CleanupNotice.tsx index 1280039dd02f3..b32c636fbade9 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.CleanupNotice.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobsTab.CleanupNotice.tsx @@ -19,7 +19,7 @@ import { TooltipContent, TooltipTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { CodeBlock } from 'ui-patterns/CodeBlock' import { CLEANUP_INTERVALS } from './CronJobsTab.constants' diff --git a/apps/studio/components/interfaces/Integrations/DataApi/DataApiURLSettings.tsx b/apps/studio/components/interfaces/Integrations/DataApi/DataApiURLSettings.tsx index db601d2f0c5e1..685d90f948a6f 100644 --- a/apps/studio/components/interfaces/Integrations/DataApi/DataApiURLSettings.tsx +++ b/apps/studio/components/interfaces/Integrations/DataApi/DataApiURLSettings.tsx @@ -1,7 +1,7 @@ import { useParams } from 'common' import { AlertCircle } from 'lucide-react' import { Alert, AlertTitle, cn } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { DataApiEnableSwitch } from '@/components/interfaces/Settings/API/DataApiEnableSwitch' import { DataApiProjectUrlCard } from '@/components/interfaces/Settings/API/DataApiProjectUrlCard' diff --git a/apps/studio/components/interfaces/Integrations/GraphQL/IntrospectionDisabledNotice.tsx b/apps/studio/components/interfaces/Integrations/GraphQL/IntrospectionDisabledNotice.tsx index 93a6b91e333a3..224f4cdb7116d 100644 --- a/apps/studio/components/interfaces/Integrations/GraphQL/IntrospectionDisabledNotice.tsx +++ b/apps/studio/components/interfaces/Integrations/GraphQL/IntrospectionDisabledNotice.tsx @@ -2,7 +2,7 @@ import { LOCAL_STORAGE_KEYS, useParams } from 'common' import { ChevronDown, ChevronUp } from 'lucide-react' import { useState } from 'react' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { PG_GRAPHQL_CONFIG_DOCS_URL } from './constants' import { IntrospectionConfirmModal } from './IntrospectionConfirmModal' diff --git a/apps/studio/components/interfaces/Integrations/Integration/ConnectedResourceGroupSection.tsx b/apps/studio/components/interfaces/Integrations/Integration/ConnectedResourceGroupSection.tsx index 39e3e2aab3fdf..48047caf06903 100644 --- a/apps/studio/components/interfaces/Integrations/Integration/ConnectedResourceGroupSection.tsx +++ b/apps/studio/components/interfaces/Integrations/Integration/ConnectedResourceGroupSection.tsx @@ -1,7 +1,7 @@ import { Settings, Trash2, TriangleAlert } from 'lucide-react' import Link from 'next/link' import { Badge, Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { type ResourceGroup } from './MarketplaceIntegrationSettingsTab.types' import { type ConnectedResource } from '@/components/interfaces/Integrations/Landing/Landing.utils' diff --git a/apps/studio/components/interfaces/Integrations/Integration/LegacyIntegrationPage.tsx b/apps/studio/components/interfaces/Integrations/Integration/LegacyIntegrationPage.tsx index 5f201f69ebe25..42f3529de9125 100644 --- a/apps/studio/components/interfaces/Integrations/Integration/LegacyIntegrationPage.tsx +++ b/apps/studio/components/interfaces/Integrations/Integration/LegacyIntegrationPage.tsx @@ -9,7 +9,7 @@ import { NavMenu, NavMenuItem, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { PageContainer } from 'ui-patterns/PageContainer' import { PageHeader, diff --git a/apps/studio/components/interfaces/Integrations/Integration/MarketplaceIntegrationSettingsTab.tsx b/apps/studio/components/interfaces/Integrations/Integration/MarketplaceIntegrationSettingsTab.tsx index 414eb7eb4404b..eaef1bf5bc524 100644 --- a/apps/studio/components/interfaces/Integrations/Integration/MarketplaceIntegrationSettingsTab.tsx +++ b/apps/studio/components/interfaces/Integrations/Integration/MarketplaceIntegrationSettingsTab.tsx @@ -1,6 +1,6 @@ import { useState } from 'react' import { toast } from 'sonner' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' diff --git a/apps/studio/components/interfaces/Integrations/Marketplace/MarketplaceDetail.tsx b/apps/studio/components/interfaces/Integrations/Marketplace/MarketplaceDetail.tsx index 15b18ce88717d..9e03a5d9f5cd2 100644 --- a/apps/studio/components/interfaces/Integrations/Marketplace/MarketplaceDetail.tsx +++ b/apps/studio/components/interfaces/Integrations/Marketplace/MarketplaceDetail.tsx @@ -1,7 +1,7 @@ import { ArrowUpRight, BookOpen, Gauge, Settings } from 'lucide-react' import { useRouter } from 'next/router' import { Button, cn } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { GenericSkeletonLoader, ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { MarketplaceDetailBreadrumbs } from './MarketplaceDetailBreadcrumbs' diff --git a/apps/studio/components/interfaces/Integrations/Queues/CreateQueueSheet/PgPartmanCallout.tsx b/apps/studio/components/interfaces/Integrations/Queues/CreateQueueSheet/PgPartmanCallout.tsx index eeeb99a4ad470..e032bbbfaa185 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/CreateQueueSheet/PgPartmanCallout.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/CreateQueueSheet/PgPartmanCallout.tsx @@ -1,6 +1,6 @@ import { useState } from 'react' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { usePgPartmanStatus } from '../usePgPartmanStatus' import { EnableExtensionModal } from '@/components/interfaces/Database/Extensions/EnableExtensionModal' diff --git a/apps/studio/components/interfaces/Integrations/Queues/CreateQueueSheet/RlsSection.tsx b/apps/studio/components/interfaces/Integrations/Queues/CreateQueueSheet/RlsSection.tsx index 8524e773ffcfa..8b0c04209db32 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/CreateQueueSheet/RlsSection.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/CreateQueueSheet/RlsSection.tsx @@ -1,6 +1,6 @@ import { UseFormReturn } from 'react-hook-form' import { Badge, FormControl, FormField, SheetSection, Switch } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { CreateQueueForm } from './CreateQueueSheet.schema' diff --git a/apps/studio/components/interfaces/Integrations/Queues/OverviewTab.tsx b/apps/studio/components/interfaces/Integrations/Queues/OverviewTab.tsx index 26fc8374fc808..27aa2fef5b254 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/OverviewTab.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/OverviewTab.tsx @@ -1,7 +1,7 @@ import { useParams } from 'common' import Link from 'next/link' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { IntegrationOverviewTab } from '../Integration/IntegrationOverviewTab' import { RequiredExtensionsSection } from '../Integration/RequiredExtensionsSection' diff --git a/apps/studio/components/interfaces/Integrations/Queues/QueuesSettings.tsx b/apps/studio/components/interfaces/Integrations/Queues/QueuesSettings.tsx index 3f99d8f060ee0..d6f2349c6d094 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/QueuesSettings.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/QueuesSettings.tsx @@ -5,7 +5,7 @@ import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' import { Button, Form, FormControl, FormField, FormItem, Switch } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { z } from 'zod' diff --git a/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/QueueSettings.tsx b/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/QueueSettings.tsx index 2b16556511db2..b1496a1dc3c0b 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/QueueSettings.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/SingleQueue/QueueSettings.tsx @@ -25,7 +25,7 @@ import { TooltipContent, TooltipTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { pgmqArchiveTable, pgmqQueueTable } from '../Queues.utils' diff --git a/apps/studio/components/interfaces/Integrations/Queues/UpgradeDatabaseAlert.tsx b/apps/studio/components/interfaces/Integrations/Queues/UpgradeDatabaseAlert.tsx index 7c6ffc398cb10..b953b74630ce0 100644 --- a/apps/studio/components/interfaces/Integrations/Queues/UpgradeDatabaseAlert.tsx +++ b/apps/studio/components/interfaces/Integrations/Queues/UpgradeDatabaseAlert.tsx @@ -1,6 +1,6 @@ import Link from 'next/link' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' diff --git a/apps/studio/components/interfaces/Integrations/Vercel/VercelIntegrationInterstitial.tsx b/apps/studio/components/interfaces/Integrations/Vercel/VercelIntegrationInterstitial.tsx index f6c8960261f64..6b57a41255b91 100644 --- a/apps/studio/components/interfaces/Integrations/Vercel/VercelIntegrationInterstitial.tsx +++ b/apps/studio/components/interfaces/Integrations/Vercel/VercelIntegrationInterstitial.tsx @@ -1,6 +1,6 @@ import Link from 'next/link' import { Button, HoverCard, HoverCardContent, HoverCardTrigger } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ENV_VAR_RAW_KEYS } from './Integrations-Vercel.constants' import { LogoPair, PartnerLogo, SupabaseLogo } from '@/components/layouts/InterstitialLayout' diff --git a/apps/studio/components/interfaces/Integrations/Webhooks/OverviewTab.tsx b/apps/studio/components/interfaces/Integrations/Webhooks/OverviewTab.tsx index 454acf34276fc..ad20f391e684d 100644 --- a/apps/studio/components/interfaces/Integrations/Webhooks/OverviewTab.tsx +++ b/apps/studio/components/interfaces/Integrations/Webhooks/OverviewTab.tsx @@ -1,7 +1,7 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' import { toast } from 'sonner' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { IntegrationOverviewTab } from '../Integration/IntegrationOverviewTab' diff --git a/apps/studio/components/interfaces/Integrations/Wrappers/CreateWrapperSheet.tsx b/apps/studio/components/interfaces/Integrations/Wrappers/CreateWrapperSheet.tsx index d231545c0092f..c4a38b2e5ed4c 100644 --- a/apps/studio/components/interfaces/Integrations/Wrappers/CreateWrapperSheet.tsx +++ b/apps/studio/components/interfaces/Integrations/Wrappers/CreateWrapperSheet.tsx @@ -18,7 +18,7 @@ import { SheetTitle, WarningIcon, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import * as z from 'zod' diff --git a/apps/studio/components/interfaces/Integrations/Wrappers/OverviewTab.tsx b/apps/studio/components/interfaces/Integrations/Wrappers/OverviewTab.tsx index 464467d0de7a0..ea61852ace7f1 100644 --- a/apps/studio/components/interfaces/Integrations/Wrappers/OverviewTab.tsx +++ b/apps/studio/components/interfaces/Integrations/Wrappers/OverviewTab.tsx @@ -4,7 +4,7 @@ import Link from 'next/link' import { parseAsBoolean, useQueryState } from 'nuqs' import { useState } from 'react' import { Button, Sheet, SheetContent } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { IntegrationOverviewTab } from '../Integration/IntegrationOverviewTab' import { RequiredExtensionsSection } from '../Integration/RequiredExtensionsSection' diff --git a/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/OverviewTab.tsx b/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/OverviewTab.tsx index e05b84a39ea28..c2b4962f9c064 100644 --- a/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/OverviewTab.tsx +++ b/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/OverviewTab.tsx @@ -17,7 +17,7 @@ import { SheetSection, SheetTitle, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { Input } from 'ui-patterns/DataInputs/Input' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' diff --git a/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/StripeSyncSettingsPage.tsx b/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/StripeSyncSettingsPage.tsx index 69d538bec1489..d6f70d14cd650 100644 --- a/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/StripeSyncSettingsPage.tsx +++ b/apps/studio/components/interfaces/Integrations/templates/StripeSyncEngine/StripeSyncSettingsPage.tsx @@ -3,7 +3,7 @@ import { formatRelative } from 'date-fns' import { BadgeCheck, RefreshCwIcon } from 'lucide-react' import Link from 'next/link' import { Button, Card, CardContent, CardHeader, CardTitle } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { PageSection, PageSectionContent, diff --git a/apps/studio/components/interfaces/JwtSecrets/jwt-settings.tsx b/apps/studio/components/interfaces/JwtSecrets/jwt-settings.tsx index 24d12cb3adf12..6184fcaffcde2 100644 --- a/apps/studio/components/interfaces/JwtSecrets/jwt-settings.tsx +++ b/apps/studio/components/interfaces/JwtSecrets/jwt-settings.tsx @@ -46,7 +46,7 @@ import { FormControl, FormField, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { Input } from 'ui-patterns/DataInputs/Input' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { FormLayout } from 'ui-patterns/form/Layout/FormLayout' diff --git a/apps/studio/components/interfaces/Linter/GraphqlExposureLintCTA.tsx b/apps/studio/components/interfaces/Linter/GraphqlExposureLintCTA.tsx index 5d9ccfb4690ca..f3373c1ae4c2f 100644 --- a/apps/studio/components/interfaces/Linter/GraphqlExposureLintCTA.tsx +++ b/apps/studio/components/interfaces/Linter/GraphqlExposureLintCTA.tsx @@ -4,7 +4,7 @@ import { EyeOff, Lock } from 'lucide-react' import { useState } from 'react' import { toast } from 'sonner' import { Badge, Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { InlineLink } from '@/components/ui/InlineLink' diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/CostControl/CostControl.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/CostControl/CostControl.tsx index 0c095da853106..9cb79b0c33e7e 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/CostControl/CostControl.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/CostControl/CostControl.tsx @@ -5,7 +5,7 @@ import { useTheme } from 'next-themes' import Image from 'next/image' import Link from 'next/link' import { Alert, AlertTitle, Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { ProjectUpdateDisabledTooltip } from '../ProjectUpdateDisabledTooltip' diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/CostControl/SpendCapSidePanel.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/CostControl/SpendCapSidePanel.tsx index 082f5728550ee..0cf99a92b9038 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/CostControl/SpendCapSidePanel.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/CostControl/SpendCapSidePanel.tsx @@ -8,7 +8,7 @@ import { useEffect, useState } from 'react' import { pricing } from 'shared-data/pricing' import { toast } from 'sonner' import { Button, cn, Collapsible, CollapsibleContent, CollapsibleTrigger, SidePanel } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import Table from '@/components/to-be-cleaned/Table' import { useOrgSubscriptionQuery } from '@/data/subscriptions/org-subscription-query' diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/CreditCodeRedemption.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/CreditCodeRedemption.tsx index 95c44733543ca..cb95d666deca6 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/CreditCodeRedemption.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/CreditCodeRedemption.tsx @@ -22,7 +22,7 @@ import { Input, Separator, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { TimestampInfo } from 'ui-patterns/TimestampInfo' diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/DowngradeModal.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/DowngradeModal.tsx index 76a9ccbfbd310..5b4dd4f5ed970 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/DowngradeModal.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/DowngradeModal.tsx @@ -10,7 +10,7 @@ import { DialogSectionSeparator, DialogTitle, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { isBeforeFreeTierTemplateBlockCutoff } from '@/components/interfaces/Auth/EmailTemplates/EmailTemplates.utils' import { getComputeSize, OrgProject } from '@/data/projects/org-projects-infinite-query' diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/ExitSurveyModal.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/ExitSurveyModal.tsx index f34dc2f63adf9..093a5f52f79ba 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/ExitSurveyModal.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/ExitSurveyModal.tsx @@ -13,7 +13,7 @@ import { DialogTitle, TextArea, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ProjectUpdateDisabledTooltip } from '../ProjectUpdateDisabledTooltip' import { CANCELLATION_REASONS } from '@/components/interfaces/Billing/Billing.constants' diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/Subscription.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/Subscription.tsx index 811ea8e7061a8..f620c0f3be807 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/Subscription.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/Subscription.tsx @@ -2,7 +2,7 @@ import { PermissionAction, SupportCategories } from '@supabase/shared-types/out/ import { useFlag, useParams } from 'common' import Link from 'next/link' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { Restriction } from '../Restriction' diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/SubscriptionPlanUpdateDialog.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/SubscriptionPlanUpdateDialog.tsx index d0ce8da62a681..f67b5a04540aa 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/SubscriptionPlanUpdateDialog.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/Subscription/SubscriptionPlanUpdateDialog.tsx @@ -8,7 +8,7 @@ import { useMemo, useRef, useState } from 'react' import { plans as subscriptionsPlans } from 'shared-data/plans' import { toast } from 'sonner' import { Button, cn, Dialog, DialogContent } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { InfoTooltip } from 'ui-patterns/info-tooltip' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' diff --git a/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceOnboarding.components.tsx b/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceOnboarding.components.tsx index 97d226169d9e6..6c679a14c1f4e 100644 --- a/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceOnboarding.components.tsx +++ b/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceOnboarding.components.tsx @@ -1,6 +1,6 @@ import { type ReactNode } from 'react' import { Card, CardContent } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import type { diff --git a/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceOnboarding.tsx b/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceOnboarding.tsx index ff6449a20c644..1dd3511cd3d6f 100644 --- a/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceOnboarding.tsx +++ b/apps/studio/components/interfaces/Organization/CloudMarketplace/AwsMarketplaceOnboarding.tsx @@ -2,7 +2,7 @@ import Link from 'next/link' import { useEffect, useMemo, useState } from 'react' import { toast } from 'sonner' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { diff --git a/apps/studio/components/interfaces/Organization/GeneralSettings/OrganizationDeletePanel.tsx b/apps/studio/components/interfaces/Organization/GeneralSettings/OrganizationDeletePanel.tsx index fb4379b66acb0..9eadf9704f44a 100644 --- a/apps/studio/components/interfaces/Organization/GeneralSettings/OrganizationDeletePanel.tsx +++ b/apps/studio/components/interfaces/Organization/GeneralSettings/OrganizationDeletePanel.tsx @@ -1,4 +1,4 @@ -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { DeleteOrganizationButton } from './DeleteOrganizationButton' import PartnerManagedResource from '@/components/ui/PartnerManagedResource' diff --git a/apps/studio/components/interfaces/Organization/NewOrg/UpgradeExistingOrganizationCallout.tsx b/apps/studio/components/interfaces/Organization/NewOrg/UpgradeExistingOrganizationCallout.tsx index baf14b36a668d..49bc82bc8b78e 100644 --- a/apps/studio/components/interfaces/Organization/NewOrg/UpgradeExistingOrganizationCallout.tsx +++ b/apps/studio/components/interfaces/Organization/NewOrg/UpgradeExistingOrganizationCallout.tsx @@ -1,4 +1,4 @@ -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { InlineLink } from '@/components/ui/InlineLink' import Panel from '@/components/ui/Panel' diff --git a/apps/studio/components/interfaces/Organization/OAuthApps/DeleteAppModal.tsx b/apps/studio/components/interfaces/Organization/OAuthApps/DeleteAppModal.tsx index 1005c82abb46b..b79b9fdc10806 100644 --- a/apps/studio/components/interfaces/Organization/OAuthApps/DeleteAppModal.tsx +++ b/apps/studio/components/interfaces/Organization/OAuthApps/DeleteAppModal.tsx @@ -10,7 +10,7 @@ import { AlertDialogFooter, AlertDialogTitle, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { useOAuthAppDeleteMutation } from '@/data/oauth/oauth-app-delete-mutation' import type { OAuthApp } from '@/data/oauth/oauth-apps-query' diff --git a/apps/studio/components/interfaces/Organization/OAuthApps/RevokeAppModal.tsx b/apps/studio/components/interfaces/Organization/OAuthApps/RevokeAppModal.tsx index b39ac78d0718f..47784797f7da5 100644 --- a/apps/studio/components/interfaces/Organization/OAuthApps/RevokeAppModal.tsx +++ b/apps/studio/components/interfaces/Organization/OAuthApps/RevokeAppModal.tsx @@ -11,7 +11,7 @@ import { AlertDialogHeader, AlertDialogTitle, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { InlineLink } from '@/components/ui/InlineLink' import { useAuthorizedAppRevokeMutation } from '@/data/oauth/authorized-app-revoke-mutation' diff --git a/apps/studio/components/interfaces/Organization/OrgNotFound.tsx b/apps/studio/components/interfaces/Organization/OrgNotFound.tsx index ae68260ed6796..8413d552af75c 100644 --- a/apps/studio/components/interfaces/Organization/OrgNotFound.tsx +++ b/apps/studio/components/interfaces/Organization/OrgNotFound.tsx @@ -1,5 +1,5 @@ import { Skeleton } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { OrganizationCard } from './OrganizationCard' import { useOrganizationsQuery } from '@/data/organizations/organizations-query' diff --git a/apps/studio/components/interfaces/Organization/ProjectClaim/confirm.tsx b/apps/studio/components/interfaces/Organization/ProjectClaim/confirm.tsx index d85feaf490aad..7d129542db962 100644 --- a/apps/studio/components/interfaces/Organization/ProjectClaim/confirm.tsx +++ b/apps/studio/components/interfaces/Organization/ProjectClaim/confirm.tsx @@ -5,7 +5,7 @@ import Image from 'next/image' import { useRouter } from 'next/router' import { toast } from 'sonner' import { Button, cn, Collapsible, CollapsibleContent, CollapsibleTrigger } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ScopeSection } from '../OAuthApps/AuthorizeRequesterDetails' import { PERMISSIONS_DESCRIPTIONS } from '../OAuthApps/OAuthApps.constants' diff --git a/apps/studio/components/interfaces/Organization/SSO/SSOConfig.tsx b/apps/studio/components/interfaces/Organization/SSO/SSOConfig.tsx index 8df56451a7dc9..614282dc5a178 100644 --- a/apps/studio/components/interfaces/Organization/SSO/SSOConfig.tsx +++ b/apps/studio/components/interfaces/Organization/SSO/SSOConfig.tsx @@ -5,7 +5,7 @@ import { useEffect, useEffectEvent, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' import { Button, Card, CardContent, CardFooter, Form, FormControl, FormField, Switch } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import z from 'zod' diff --git a/apps/studio/components/interfaces/Organization/SecuritySettings.tsx b/apps/studio/components/interfaces/Organization/SecuritySettings.tsx index a6f01b4adeebf..61a52e643d29d 100644 --- a/apps/studio/components/interfaces/Organization/SecuritySettings.tsx +++ b/apps/studio/components/interfaces/Organization/SecuritySettings.tsx @@ -6,7 +6,7 @@ import { useEffect } from 'react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' import { Button, Card, CardContent, CardFooter, Form, FormControl, FormField, Switch } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { z } from 'zod' diff --git a/apps/studio/components/interfaces/Organization/TeamSettings/InviteMemberButton.tsx b/apps/studio/components/interfaces/Organization/TeamSettings/InviteMemberButton.tsx index c5d1fab5de4fd..aae070a349596 100644 --- a/apps/studio/components/interfaces/Organization/TeamSettings/InviteMemberButton.tsx +++ b/apps/studio/components/interfaces/Organization/TeamSettings/InviteMemberButton.tsx @@ -30,7 +30,7 @@ import { SheetTrigger, Switch, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import * as z from 'zod' diff --git a/apps/studio/components/interfaces/Organization/TeamSettings/MembersView.tsx b/apps/studio/components/interfaces/Organization/TeamSettings/MembersView.tsx index d5ee5abab4ca4..867e13c2e2790 100644 --- a/apps/studio/components/interfaces/Organization/TeamSettings/MembersView.tsx +++ b/apps/studio/components/interfaces/Organization/TeamSettings/MembersView.tsx @@ -13,7 +13,7 @@ import { TableHeader, TableRow, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { MemberRow } from './MemberRow' diff --git a/apps/studio/components/interfaces/Organization/TeamSettings/TeamSettings.tsx b/apps/studio/components/interfaces/Organization/TeamSettings/TeamSettings.tsx index 7acaeaaf2847a..afa81dc142669 100644 --- a/apps/studio/components/interfaces/Organization/TeamSettings/TeamSettings.tsx +++ b/apps/studio/components/interfaces/Organization/TeamSettings/TeamSettings.tsx @@ -1,7 +1,7 @@ import { useParams } from 'common' import { Search } from 'lucide-react' import { useState } from 'react' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { Input } from 'ui-patterns/DataInputs/Input' import { InviteMemberButton } from './InviteMemberButton' diff --git a/apps/studio/components/interfaces/Organization/Usage/Usage.constants.tsx b/apps/studio/components/interfaces/Organization/Usage/Usage.constants.tsx index 2468418d307b0..6fccdd780451e 100644 --- a/apps/studio/components/interfaces/Organization/Usage/Usage.constants.tsx +++ b/apps/studio/components/interfaces/Organization/Usage/Usage.constants.tsx @@ -1,5 +1,5 @@ import { ReactNode } from 'react' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { USAGE_APPROACHING_THRESHOLD } from '@/components/interfaces/Billing/Billing.constants' import { EgressType, PricingMetric } from '@/data/analytics/org-daily-stats-query' diff --git a/apps/studio/components/interfaces/Organization/Usage/Usage.tsx b/apps/studio/components/interfaces/Organization/Usage/Usage.tsx index bad4f5d35ccb4..436a2894f77f2 100644 --- a/apps/studio/components/interfaces/Organization/Usage/Usage.tsx +++ b/apps/studio/components/interfaces/Organization/Usage/Usage.tsx @@ -6,7 +6,7 @@ import Link from 'next/link' import { useQueryState } from 'nuqs' import { useMemo, useState } from 'react' import { Button, cn, CommandGroup, CommandItem } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { Restriction } from '../BillingSettings/Restriction' diff --git a/apps/studio/components/interfaces/OrganizationInvite/OrganizationInvite.tsx b/apps/studio/components/interfaces/OrganizationInvite/OrganizationInvite.tsx index 28de171f71597..ebffc046a6c04 100644 --- a/apps/studio/components/interfaces/OrganizationInvite/OrganizationInvite.tsx +++ b/apps/studio/components/interfaces/OrganizationInvite/OrganizationInvite.tsx @@ -4,7 +4,7 @@ import { useRouter } from 'next/router' import type { ReactNode } from 'react' import { toast } from 'sonner' import { Button, Card, CardContent } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { diff --git a/apps/studio/components/interfaces/OrganizationInvite/OrganizationInviteError.tsx b/apps/studio/components/interfaces/OrganizationInvite/OrganizationInviteError.tsx index c4b9407749961..f4d747fb56e74 100644 --- a/apps/studio/components/interfaces/OrganizationInvite/OrganizationInviteError.tsx +++ b/apps/studio/components/interfaces/OrganizationInvite/OrganizationInviteError.tsx @@ -1,6 +1,6 @@ import { useRouter } from 'next/router' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { OrganizationInviteByToken } from '@/data/organization-members/organization-invitation-token-query' import { useSignOut } from '@/lib/auth' diff --git a/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksPage.tsx b/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksPage.tsx index 815751dc7b4ee..fc9a0c6f7e96b 100644 --- a/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksPage.tsx +++ b/apps/studio/components/interfaces/Platform/Webhooks/PlatformWebhooksPage.tsx @@ -21,7 +21,7 @@ import { DropdownMenuTrigger, Label, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { Input } from 'ui-patterns/DataInputs/Input' import { PageContainer } from 'ui-patterns/PageContainer' import { PageSection, PageSectionContent } from 'ui-patterns/PageSection' diff --git a/apps/studio/components/interfaces/Project/APIKeys.tsx b/apps/studio/components/interfaces/Project/APIKeys.tsx index 2a652fed5b32d..da544374048b0 100644 --- a/apps/studio/components/interfaces/Project/APIKeys.tsx +++ b/apps/studio/components/interfaces/Project/APIKeys.tsx @@ -3,7 +3,7 @@ import { JwtSecretUpdateStatus } from '@supabase/shared-types/out/events' import { useParams } from 'common' import { Loader } from 'lucide-react' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { Input } from 'ui-patterns/DataInputs/Input' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' diff --git a/apps/studio/components/interfaces/ProjectCreation/AdvancedConfiguration.tsx b/apps/studio/components/interfaces/ProjectCreation/AdvancedConfiguration.tsx index c9a621a4d72c1..ef41eea090df5 100644 --- a/apps/studio/components/interfaces/ProjectCreation/AdvancedConfiguration.tsx +++ b/apps/studio/components/interfaces/ProjectCreation/AdvancedConfiguration.tsx @@ -12,7 +12,7 @@ import { TooltipContent, TooltipTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { CollapsibleCardSection } from 'ui-patterns/CollapsibleCardSection' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' diff --git a/apps/studio/components/interfaces/ProjectCreation/FreeProjectLimitWarning.tsx b/apps/studio/components/interfaces/ProjectCreation/FreeProjectLimitWarning.tsx index e3b8389232c73..1531bdae9caac 100644 --- a/apps/studio/components/interfaces/ProjectCreation/FreeProjectLimitWarning.tsx +++ b/apps/studio/components/interfaces/ProjectCreation/FreeProjectLimitWarning.tsx @@ -1,4 +1,4 @@ -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import Panel from '@/components/ui/Panel' import { UpgradePlanButton } from '@/components/ui/UpgradePlanButton' diff --git a/apps/studio/components/interfaces/ProjectCreation/ProjectCreationForm.tsx b/apps/studio/components/interfaces/ProjectCreation/ProjectCreationForm.tsx index 671882df1961c..897ba9b4c8e67 100644 --- a/apps/studio/components/interfaces/ProjectCreation/ProjectCreationForm.tsx +++ b/apps/studio/components/interfaces/ProjectCreation/ProjectCreationForm.tsx @@ -9,7 +9,7 @@ import { useForm, useFormState } from 'react-hook-form' import { type CloudProvider } from 'shared-data' import { toast } from 'sonner' import { Button, cn, Form, useWatch } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { z } from 'zod' diff --git a/apps/studio/components/interfaces/ProjectCreation/RegionSelector.tsx b/apps/studio/components/interfaces/ProjectCreation/RegionSelector.tsx index 25cd97d922e5a..9352468a9285c 100644 --- a/apps/studio/components/interfaces/ProjectCreation/RegionSelector.tsx +++ b/apps/studio/components/interfaces/ProjectCreation/RegionSelector.tsx @@ -18,7 +18,7 @@ import { TooltipContent, TooltipTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { CreateProjectForm } from './ProjectCreation.schema' diff --git a/apps/studio/components/interfaces/ProjectCreation/SecurityOptions.tsx b/apps/studio/components/interfaces/ProjectCreation/SecurityOptions.tsx index 0751b10900780..077aef30f78de 100644 --- a/apps/studio/components/interfaces/ProjectCreation/SecurityOptions.tsx +++ b/apps/studio/components/interfaces/ProjectCreation/SecurityOptions.tsx @@ -13,7 +13,7 @@ import { TooltipTrigger, useWatch, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { CreateProjectForm } from './ProjectCreation.schema' diff --git a/apps/studio/components/interfaces/QueryPerformance/QueryIndexes.tsx b/apps/studio/components/interfaces/QueryPerformance/QueryIndexes.tsx index c6c64a67590b6..5902c8753f1df 100644 --- a/apps/studio/components/interfaces/QueryPerformance/QueryIndexes.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/QueryIndexes.tsx @@ -14,7 +14,7 @@ import { CollapsibleContent, CollapsibleTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { CodeBlock } from 'ui-patterns/CodeBlock' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' diff --git a/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceGrid.tsx b/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceGrid.tsx index 487d5d85a918d..d75953f56b5b5 100644 --- a/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceGrid.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/QueryPerformanceGrid.tsx @@ -19,7 +19,7 @@ import { TabsList, TabsTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { CodeBlock } from 'ui-patterns/CodeBlock' import { InfoTooltip } from 'ui-patterns/info-tooltip' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' diff --git a/apps/studio/components/interfaces/QueryPerformance/WithStatements/WithStatements.tsx b/apps/studio/components/interfaces/QueryPerformance/WithStatements/WithStatements.tsx index 3c04b93c5536d..49dc2e9cf9b2e 100644 --- a/apps/studio/components/interfaces/QueryPerformance/WithStatements/WithStatements.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/WithStatements/WithStatements.tsx @@ -5,7 +5,7 @@ import { parseAsString, useQueryStates } from 'nuqs' import { useEffect, useMemo, useState } from 'react' import { toast } from 'sonner' import { Button, cn, LoadingLine } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { Markdown } from '../../Markdown' diff --git a/apps/studio/components/interfaces/Realtime/RealtimeSettings.tsx b/apps/studio/components/interfaces/Realtime/RealtimeSettings.tsx index c806b61489f7b..0833ed8fda39e 100644 --- a/apps/studio/components/interfaces/Realtime/RealtimeSettings.tsx +++ b/apps/studio/components/interfaces/Realtime/RealtimeSettings.tsx @@ -20,7 +20,7 @@ import { InputGroupText, Switch, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import * as z from 'zod' diff --git a/apps/studio/components/interfaces/RedeemCredits/RedeemCredits.tsx b/apps/studio/components/interfaces/RedeemCredits/RedeemCredits.tsx index f11b028ad1ff7..3a13806a49135 100644 --- a/apps/studio/components/interfaces/RedeemCredits/RedeemCredits.tsx +++ b/apps/studio/components/interfaces/RedeemCredits/RedeemCredits.tsx @@ -2,7 +2,7 @@ import { FeatureFlagContext } from 'common' import { useRouter } from 'next/router' import { ReactNode, useContext, useEffect, useRef, useState } from 'react' import { Button, Card, CardContent } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { OrganizationSelector } from '../Connect/OrganizationSelector' diff --git a/apps/studio/components/interfaces/SQLEditor/MonacoEditor.tsx b/apps/studio/components/interfaces/SQLEditor/MonacoEditor.tsx index a8639b27d3341..5054f2bf66f70 100644 --- a/apps/studio/components/interfaces/SQLEditor/MonacoEditor.tsx +++ b/apps/studio/components/interfaces/SQLEditor/MonacoEditor.tsx @@ -2,7 +2,7 @@ import { Monaco, OnMount } from '@monaco-editor/react' import { LOCAL_STORAGE_KEYS } from 'common' import { noop } from 'lodash' import { RefObject, useRef } from 'react' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import type { IStandaloneCodeEditor } from './SQLEditor.types' import { useSnippetEditor } from './useSnippetEditor' diff --git a/apps/studio/components/interfaces/SQLEditor/SQLEditor.utils.test.ts b/apps/studio/components/interfaces/SQLEditor/SQLEditor.utils.test.ts index 9c6865b0c790c..982ef10bb1606 100644 --- a/apps/studio/components/interfaces/SQLEditor/SQLEditor.utils.test.ts +++ b/apps/studio/components/interfaces/SQLEditor/SQLEditor.utils.test.ts @@ -16,6 +16,7 @@ import { checkAlterDatabaseConnection, checkDestructiveQuery, computeErrorHighlightLine, + createSqlSnippetSkeletonV2, deriveSnippetIdentity, extractDebugContext, filterTablesCoveredByEnsureRLSTrigger, @@ -433,6 +434,35 @@ describe('SQLEditor.utils.ts:buildCompletionRequestBody', () => { }) }) +describe('SQLEditor.utils.ts:createSqlSnippetSkeletonV2', () => { + const baseArgs = { name: 'Untitled', sql: 'select 1', owner_id: 1, project_id: 1 } + + test('defaults to a database (sql) snippet', () => { + const snippet = createSqlSnippetSkeletonV2(baseArgs) + expect(snippet.type).toBe('sql') + expect(snippet.content?.unchecked_sql).toBe('select 1') + expect(snippet.status).toBe('new') + }) + + test('builds a database snippet when source is explicitly "database"', () => { + const snippet = createSqlSnippetSkeletonV2({ ...baseArgs, source: 'database' }) + expect(snippet.type).toBe('sql') + }) + + test('builds a logs (log_sql) snippet when source is "logs"', () => { + const snippet = createSqlSnippetSkeletonV2({ ...baseArgs, source: 'logs' }) + expect(snippet.type).toBe('log_sql') + expect(snippet.content?.unchecked_sql).toBe('select 1') + }) + + test('sets content_id to the snippet id for both sources', () => { + const db = createSqlSnippetSkeletonV2({ ...baseArgs, idOverride: 'db-id' }) + const logs = createSqlSnippetSkeletonV2({ ...baseArgs, idOverride: 'logs-id', source: 'logs' }) + expect(db.content?.content_id).toBe('db-id') + expect(logs.content?.content_id).toBe('logs-id') + }) +}) + describe('SQLEditor.utils.ts:planDiffRequestApplication', () => { test('replaces the editor content when it is empty', () => { const plan = planDiffRequestApplication({ diff --git a/apps/studio/components/interfaces/SQLEditor/SQLEditor.utils.ts b/apps/studio/components/interfaces/SQLEditor/SQLEditor.utils.ts index 2c47067791b0e..de83b8a48e585 100644 --- a/apps/studio/components/interfaces/SQLEditor/SQLEditor.utils.ts +++ b/apps/studio/components/interfaces/SQLEditor/SQLEditor.utils.ts @@ -7,6 +7,7 @@ import { } from '@supabase/pg-meta' import { TABLE_EVENT_ACTIONS } from 'common/telemetry-constants' +import type { SqlSnippetSource } from './querySource' import { alterDatabasePreventConnectionStatements, destructiveSqlRegex, @@ -23,6 +24,7 @@ import { } from './SQLEditor.types' import type { SnippetWithContent } from '@/data/content/sql-folders-query' import type { DatabaseEventTrigger } from '@/data/database-event-triggers/database-event-triggers-query' +import { untrustedLogSql, type UntrustedLogSqlFragment } from '@/data/logs/safe-analytics-sql' import type { Database } from '@/data/read-replicas/replicas-query' import { generateUuid } from '@/lib/api/snippets.browser' import { removeCommentsFromSql } from '@/lib/helpers' @@ -72,6 +74,7 @@ export const createSqlSnippetSkeletonV2 = ({ project_id, folder_id, idOverride, + source = 'database', }: { name: string sql: string @@ -83,10 +86,14 @@ export const createSqlSnippetSkeletonV2 = ({ * with a known id, such as to prevent flicker in the SQL editor when adding new unsaved snippets. */ idOverride?: string + /** + * Which backend the new snippet targets. + */ + source?: SqlSnippetSource }): SnippetWithContent => { const id = idOverride ?? generateUuid([folder_id, `${name}.sql`]) - return { + const base = { ...NEW_SQL_SNIPPET_SKELETON, id, owner_id, @@ -96,12 +103,29 @@ export const createSqlSnippetSkeletonV2 = ({ favorite: false, inserted_at: new Date().toISOString(), updated_at: new Date().toISOString(), + status: 'new' as const, + } + + if (source === 'logs') { + return { + ...base, + type: 'log_sql', + content: { + schema_version: NEW_SQL_SNIPPET_SKELETON.content.schema_version, + content_id: id ?? '', + unchecked_sql: untrustedLogSql(sql ?? ''), + }, + } + } + + return { + ...base, + type: 'sql', content: { ...NEW_SQL_SNIPPET_SKELETON.content, content_id: id ?? '', unchecked_sql: untrustedSql(sql ?? ''), - } as any, - status: 'new', + }, } } @@ -511,7 +535,11 @@ export function buildDebugPromptText(sql: string, errorMessage: string): string return `${prompt}\n\nSQL Query:\n\`\`\`sql\n${sql}\n\`\`\`` } -type DebugSnippet = { snippet: { content?: { unchecked_sql?: UntrustedSqlFragment } } } | undefined +// Accepts either brand: the debug flow only reads the SQL as text (it's stripped +// and interpolated into a prompt), so a logs-branded fragment is fine here. +type DebugSnippet = + | { snippet: { content?: { unchecked_sql?: UntrustedSqlFragment | UntrustedLogSqlFragment } } } + | undefined type DebugResult = { error?: { message?: string } } | undefined /** diff --git a/apps/studio/components/interfaces/SQLEditor/SQLEditorControllers.tsx b/apps/studio/components/interfaces/SQLEditor/SQLEditorControllers.tsx index 03aeffa3f24b3..26fdb9232069b 100644 --- a/apps/studio/components/interfaces/SQLEditor/SQLEditorControllers.tsx +++ b/apps/studio/components/interfaces/SQLEditor/SQLEditorControllers.tsx @@ -147,8 +147,9 @@ export const SQLEditorControllersProvider = ({ children }: PropsWithChildren) => // Reads the SQL to run from the editor as an UntrustedSqlFragment. Promotion // to safety (acceptUntrustedSql) happens at each user-action site, never here. const readEditorSql = useCallback((): UntrustedSqlFragment | undefined => { - const snippet = getSqlEditorV2StateSnapshot().snippets[id] - return editor.getSql(snippet?.snippet.content?.unchecked_sql) + const snippet = getSqlEditorV2StateSnapshot().snippets[id]?.snippet + const fallback = snippet?.type === 'log_sql' ? undefined : snippet?.content?.unchecked_sql + return editor.getSql(fallback) }, [editor, id]) const { executeQuery, isExecuting, potentialIssues, resetPotentialIssues } = diff --git a/apps/studio/components/interfaces/SQLEditor/UtilityPanel/ChartConfig.tsx b/apps/studio/components/interfaces/SQLEditor/UtilityPanel/ChartConfig.tsx index 74f7d6e743751..58c50b5fb89e9 100644 --- a/apps/studio/components/interfaces/SQLEditor/UtilityPanel/ChartConfig.tsx +++ b/apps/studio/components/interfaces/SQLEditor/UtilityPanel/ChartConfig.tsx @@ -20,7 +20,7 @@ import { TooltipContent, TooltipTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ButtonTooltip } from '@/components/ui/ButtonTooltip' import BarChart from '@/components/ui/Charts/BarChart' diff --git a/apps/studio/components/interfaces/SQLEditor/querySource.test.ts b/apps/studio/components/interfaces/SQLEditor/querySource.test.ts new file mode 100644 index 0000000000000..9c63333f64eb5 --- /dev/null +++ b/apps/studio/components/interfaces/SQLEditor/querySource.test.ts @@ -0,0 +1,230 @@ +import dayjs from 'dayjs' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' + +import { + datePickerValueToLogDateRange, + DEFAULT_LOG_DATE_RANGE, + getSnippetSource, + isoDateTimeString, + logDateRangeToDatePickerValue, + resolveLogRunRange, + type LogDateRange, +} from './querySource' +import { + EXPLORER_DATEPICKER_HELPERS, + getDefaultHelper, +} from '@/components/interfaces/Settings/Logs/Logs.constants' +import { generateHelpersFromInput } from '@/components/interfaces/Settings/Logs/Logs.datePickerHelpers' +import type { DatePickerValue } from '@/components/interfaces/Settings/Logs/Logs.DatePickers' +import type { DatetimeHelper } from '@/components/interfaces/Settings/Logs/Logs.types' + +/** Build the `DatePickerValue` the Logs picker submits when a helper is selected. */ +const valueFromHelper = (helper: DatetimeHelper): DatePickerValue => ({ + from: helper.calcFrom(), + to: helper.calcTo(), + isHelper: true, + text: helper.text, +}) + +/** The single dynamic helper produced from typed input like "2h" / "30m". */ +const dynamicHelper = (input: string): DatetimeHelper => { + const generated = generateHelpersFromInput(input) + if (!generated || generated.length !== 1) { + throw new Error(`Expected a single dynamic helper for "${input}"`) + } + return generated[0] +} + +describe('querySource.ts:getSnippetSource', () => { + it('maps log_sql to the logs source', () => { + expect(getSnippetSource({ type: 'log_sql' })).toBe('logs') + }) + + it('maps sql to the database source', () => { + expect(getSnippetSource({ type: 'sql' })).toBe('database') + }) + + it('maps report to the database source', () => { + expect(getSnippetSource({ type: 'report' })).toBe('database') + }) +}) + +describe('querySource.ts:isoDateTimeString', () => { + it('accepts a valid ISO datetime', () => { + const raw = '2025-01-01T12:00:00.000Z' + expect(isoDateTimeString(raw)).toBe(raw) + }) + + it('rejects an empty string', () => { + expect(isoDateTimeString('')).toBeNull() + }) + + it('rejects junk', () => { + expect(isoDateTimeString('not-a-date')).toBeNull() + expect(isoDateTimeString('2025-13-45T99:99:99Z')).toBeNull() + }) +}) + +describe('querySource.ts:datePickerValueToLogDateRange', () => { + it('parses every static preset into a relative range', () => { + const cases: Array<[string, { amount: number; unit: 'minute' | 'hour' | 'day' }]> = [ + ['Last hour', { amount: 1, unit: 'hour' }], + ['Last 3 hours', { amount: 3, unit: 'hour' }], + ['Last 24 hours', { amount: 24, unit: 'hour' }], + ['Last 3 days', { amount: 3, unit: 'day' }], + ['Last 7 days', { amount: 7, unit: 'day' }], + ] + + for (const [text, last] of cases) { + const helper = EXPLORER_DATEPICKER_HELPERS.find((h) => h.text === text) + expect(helper, `preset "${text}" exists`).toBeDefined() + expect(datePickerValueToLogDateRange(valueFromHelper(helper!))).toEqual({ + kind: 'relative', + last, + }) + } + }) + + it('parses dynamic helpers ("2h", "30m", "7d") into relative ranges', () => { + expect(datePickerValueToLogDateRange(valueFromHelper(dynamicHelper('2h')))).toEqual({ + kind: 'relative', + last: { amount: 2, unit: 'hour' }, + }) + expect(datePickerValueToLogDateRange(valueFromHelper(dynamicHelper('30m')))).toEqual({ + kind: 'relative', + last: { amount: 30, unit: 'minute' }, + }) + expect(datePickerValueToLogDateRange(valueFromHelper(dynamicHelper('7d')))).toEqual({ + kind: 'relative', + last: { amount: 7, unit: 'day' }, + }) + }) + + it('treats a preset (calcTo() === "") as relative — the empty end means "now"', () => { + const lastHour = getDefaultHelper(EXPLORER_DATEPICKER_HELPERS) + const value = valueFromHelper(lastHour) + expect(value.to).toBe('') + expect(datePickerValueToLogDateRange(value)).toEqual({ + kind: 'relative', + last: { amount: 1, unit: 'hour' }, + }) + }) + + it('degrades an unparseable helper to an absolute range using from/now (never empty)', () => { + vi.useFakeTimers() + const now = new Date('2025-01-01T12:00:00.000Z') + vi.setSystemTime(now) + + const from = '2024-12-31T00:00:00.000Z' + const result = datePickerValueToLogDateRange({ + from, + to: '', + isHelper: true, + text: 'Some custom label', + }) + + expect(result).toEqual({ + kind: 'absolute', + from, + to: dayjs(now).toISOString(), + }) + }) + + it('maps a custom (non-helper) pick to an absolute range with both endpoints', () => { + const from = '2025-01-01T00:00:00.000Z' + const to = '2025-01-02T00:00:00.000Z' + expect(datePickerValueToLogDateRange({ from, to, isHelper: false })).toEqual({ + kind: 'absolute', + from, + to, + }) + }) + + it('falls back to the default range when the value has no usable from', () => { + expect(datePickerValueToLogDateRange({ from: '', to: '', isHelper: false })).toEqual( + DEFAULT_LOG_DATE_RANGE + ) + }) +}) + +describe('querySource.ts:logDateRangeToDatePickerValue', () => { + beforeEach(() => { + vi.useFakeTimers() + vi.setSystemTime(new Date('2025-01-01T12:00:00.000Z')) + }) + + it('renders a relative range exactly as the picker would emit the helper', () => { + const value = logDateRangeToDatePickerValue({ + kind: 'relative', + last: { amount: 1, unit: 'hour' }, + }) + expect(value).toEqual({ + from: dayjs().subtract(1, 'hour').toISOString(), + to: dayjs().toISOString(), + isHelper: true, + text: 'Last 1 hour', + }) + }) + + it('pluralizes the label for amounts greater than one', () => { + expect( + logDateRangeToDatePickerValue({ kind: 'relative', last: { amount: 3, unit: 'day' } }).text + ).toBe('Last 3 days') + }) + + it('round-trips through datePickerValueToLogDateRange', () => { + const range: LogDateRange = { kind: 'relative', last: { amount: 30, unit: 'minute' } } + expect(datePickerValueToLogDateRange(logDateRangeToDatePickerValue(range))).toEqual(range) + }) + + it('passes an absolute range through as a non-helper value', () => { + const range: LogDateRange = { + kind: 'absolute', + from: isoDateTimeString('2025-01-01T00:00:00.000Z')!, + to: isoDateTimeString('2025-01-02T00:00:00.000Z')!, + } + expect(logDateRangeToDatePickerValue(range)).toEqual({ + from: '2025-01-01T00:00:00.000Z', + to: '2025-01-02T00:00:00.000Z', + isHelper: false, + }) + }) +}) + +describe('querySource.ts:resolveLogRunRange', () => { + afterEach(() => { + vi.useRealTimers() + }) + + it('re-resolves a relative range against the current time', () => { + vi.useFakeTimers() + const now = new Date('2025-06-15T08:30:00.000Z') + vi.setSystemTime(now) + + expect(resolveLogRunRange({ kind: 'relative', last: { amount: 2, unit: 'hour' } })).toEqual({ + from: dayjs(now).subtract(2, 'hour').toISOString(), + to: dayjs(now).toISOString(), + }) + }) + + it('re-resolves the same relative range differently as time advances', () => { + vi.useFakeTimers() + vi.setSystemTime(new Date('2025-06-15T08:00:00.000Z')) + const first = resolveLogRunRange({ kind: 'relative', last: { amount: 1, unit: 'hour' } }) + + vi.setSystemTime(new Date('2025-06-15T10:00:00.000Z')) + const second = resolveLogRunRange({ kind: 'relative', last: { amount: 1, unit: 'hour' } }) + + expect(first).not.toEqual(second) + expect(second.to).toBe(dayjs('2025-06-15T10:00:00.000Z').toISOString()) + }) + + it('passes an absolute range through unchanged', () => { + const from = isoDateTimeString('2025-01-01T00:00:00.000Z')! + const to = isoDateTimeString('2025-01-02T00:00:00.000Z')! + expect(resolveLogRunRange({ kind: 'absolute', from, to })).toEqual({ + from: '2025-01-01T00:00:00.000Z', + to: '2025-01-02T00:00:00.000Z', + }) + }) +}) diff --git a/apps/studio/components/interfaces/SQLEditor/querySource.ts b/apps/studio/components/interfaces/SQLEditor/querySource.ts new file mode 100644 index 0000000000000..af6d1d169a2fc --- /dev/null +++ b/apps/studio/components/interfaces/SQLEditor/querySource.ts @@ -0,0 +1,144 @@ +import dayjs from 'dayjs' + +import { generateDynamicHelper } from '@/components/interfaces/Settings/Logs/Logs.datePickerHelpers' +import type { Unit } from '@/components/interfaces/Settings/Logs/Logs.datePickerHelpers' +import type { DatePickerValue } from '@/components/interfaces/Settings/Logs/Logs.DatePickers' +import type { ResolvedLogDateRange } from '@/components/interfaces/Settings/Logs/logsDateRange' +import type { Snippet } from '@/data/content/sql-folders-query' + +/** + * Domain view of where a snippet's query runs. Derived from the content TYPE: + * a `log_sql` snippet always targets the logs backend and a `sql` (or `report`) + * snippet always targets the user's Postgres database. A snippet's source is + * immutable — switching backends means creating a new snippet, not toggling this + * value. + */ +export type SqlSnippetSource = 'database' | 'logs' + +/** + * The single reader every surface (AI, reports, tabs, nav, execution) uses to + * decide where a snippet runs. `'log_sql'` → `'logs'`; everything else (`'sql'`, + * `'report'`) → `'database'`. Accepts the raw `Snippet['type']` so a snippet of + * any content type maps to a source without narrowing first. + */ +export function getSnippetSource(snippet: Pick): SqlSnippetSource { + return snippet.type === 'log_sql' ? 'logs' : 'database' +} + +/** + * An ISO-8601 datetime proven valid at construction via a dayjs parse. Absolute + * log ranges carry these instead of raw strings so an unvalidated datetime can + * never reach execution. + */ +export type IsoDateTimeString = string & { readonly __isoDateTimeBrand: unique symbol } + +/** + * Validate a raw string as an ISO datetime, returning the branded value or null. + * The sole construction site for `IsoDateTimeString` outside `now`. + */ +export function isoDateTimeString(raw: string): IsoDateTimeString | null { + if (!raw) return null + return dayjs(raw).isValid() ? (raw as IsoDateTimeString) : null +} + +/** `now` as a branded ISO datetime — `toISOString()` is always valid ISO-8601. */ +function nowIsoDateTime(): IsoDateTimeString { + return dayjs().toISOString() as IsoDateTimeString +} + +/** + * The units a relative log range is expressed in. Aliases the Logs date picker's + * `Unit` so the two stay in lockstep rather than drifting as parallel unions. + */ +export type RelativeTimeUnit = Unit + +/** + * A log query's time range. Relative ranges are structural (amount + unit) and + * re-resolve against `now` at every run — so a saved "last hour" always means the + * hour before the run, not the hour before the snippet was opened. Absolute ranges + * carry validated ISO datetimes and pass through unchanged. + */ +export type LogDateRange = + | { kind: 'relative'; last: { amount: number; unit: RelativeTimeUnit } } + | { kind: 'absolute'; from: IsoDateTimeString; to: IsoDateTimeString } + +/** The range a freshly opened logs snippet starts with: the last hour. */ +export const DEFAULT_LOG_DATE_RANGE: LogDateRange = { + kind: 'relative', + last: { amount: 1, unit: 'hour' }, +} + +/** + * Parse a date-picker helper's label (e.g. "Last hour", "Last 3 hours", "Last 30 + * minutes") into a relative amount/unit. Covers both the static presets in + * `EXPLORER_DATEPICKER_HELPERS` and the dynamic helpers `generateHelpersFromInput` + * produces from typed input like "2h"/"30m". A label with no number means one unit + * ("Last hour"). Returns null for any other label. + */ +function parseRelativeHelperLabel( + text: string | undefined +): { amount: number; unit: RelativeTimeUnit } | null { + if (!text) return null + const match = text + .trim() + .toLowerCase() + .match(/^last\s+(?:(\d+)\s+)?(minute|hour|day)s?$/) + if (!match) return null + const amount = match[1] ? parseInt(match[1], 10) : 1 + if (!Number.isFinite(amount) || amount <= 0) return null + const unit = match[2] + if (unit !== 'minute' && unit !== 'hour' && unit !== 'day') return null + return { amount, unit } +} + +/** + * Convert a Logs date-picker value into a `LogDateRange`. Helper picks (presets and + * dynamic "2h"/"30m" helpers) become relative ranges by parsing the helper label; + * a preset's `calcTo()` resolves to `''` (meaning "now"), which the relative variant + * models implicitly. Everything else — custom calendar picks, or a helper whose label + * we can't parse — becomes an absolute range with validated ISO datetimes, degrading + * via `from`/now rather than rejecting an empty string. A value with no usable `from` + * falls back to the default range. + */ +export function datePickerValueToLogDateRange(value: DatePickerValue): LogDateRange { + if (value.isHelper) { + const relative = parseRelativeHelperLabel(value.text) + if (relative) return { kind: 'relative', last: relative } + } + + const from = isoDateTimeString(value.from) + if (from === null) return DEFAULT_LOG_DATE_RANGE + const to = isoDateTimeString(value.to) ?? nowIsoDateTime() + return { kind: 'absolute', from, to } +} + +/** + * Render a `LogDateRange` back into a Logs date-picker value for display. Relative + * ranges reuse the picker's own `generateDynamicHelper` to derive the resolved + * `from`/`to` and matching "Last N unit(s)" label, so the value is byte-for-byte + * what the picker itself would emit for that helper. Absolute ranges pass their + * datetimes through. + */ +export function logDateRangeToDatePickerValue(range: LogDateRange): DatePickerValue { + if (range.kind === 'relative') { + const helper = generateDynamicHelper(range.last.amount, range.last.unit) + return { from: helper.calcFrom(), to: helper.calcTo(), isHelper: true, text: helper.text } + } + return { from: range.from, to: range.to, isHelper: false } +} + +/** + * Resolve a `LogDateRange` to concrete ISO endpoints for a run. Relative ranges + * re-resolve against `now` (so "last hour" is always the hour before the run); + * absolute ranges pass through. Reuses the Logs `ResolvedLogDateRange` shape. + */ +export function resolveLogRunRange(range: LogDateRange): ResolvedLogDateRange { + if (range.kind === 'relative') { + const now = dayjs() + return { + from: now.subtract(range.last.amount, range.last.unit).toISOString(), + to: now.toISOString(), + } + } + return { from: range.from, to: range.to } +} diff --git a/apps/studio/components/interfaces/SQLEditor/usePrettifyQuery.ts b/apps/studio/components/interfaces/SQLEditor/usePrettifyQuery.ts index 60c415e79d3bb..9a70c33303425 100644 --- a/apps/studio/components/interfaces/SQLEditor/usePrettifyQuery.ts +++ b/apps/studio/components/interfaces/SQLEditor/usePrettifyQuery.ts @@ -25,7 +25,9 @@ export function usePrettifyQuery({ id, isDiffOpen }: { id: string; isDiffOpen: b const snippet = state.snippets[id] if (editor.isReady() && project) { - const sql = editor.getSql(snippet?.snippet.content?.unchecked_sql) + const fallback = + snippet?.snippet.type === 'log_sql' ? undefined : snippet?.snippet.content?.unchecked_sql + const sql = editor.getSql(fallback) if (sql === undefined) return const formattedSql = formatSql(sql) diff --git a/apps/studio/components/interfaces/Settings/API/PostgrestConfig.tsx b/apps/studio/components/interfaces/Settings/API/PostgrestConfig.tsx index c1a1c146c322c..a6801719455bc 100644 --- a/apps/studio/components/interfaces/Settings/API/PostgrestConfig.tsx +++ b/apps/studio/components/interfaces/Settings/API/PostgrestConfig.tsx @@ -23,7 +23,7 @@ import { Switch, useWatch, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { MultiSelector, diff --git a/apps/studio/components/interfaces/Settings/Addons/Addons.tsx b/apps/studio/components/interfaces/Settings/Addons/Addons.tsx index 22b304adde18b..3f2090f4edcb0 100644 --- a/apps/studio/components/interfaces/Settings/Addons/Addons.tsx +++ b/apps/studio/components/interfaces/Settings/Addons/Addons.tsx @@ -13,7 +13,7 @@ import { TooltipContent, TooltipTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { PageContainer } from 'ui-patterns/PageContainer' import { PageSection } from 'ui-patterns/PageSection' diff --git a/apps/studio/components/interfaces/Settings/Addons/IPv4SidePanel.tsx b/apps/studio/components/interfaces/Settings/Addons/IPv4SidePanel.tsx index b27ec4e139d89..e2800d7d2fd38 100644 --- a/apps/studio/components/interfaces/Settings/Addons/IPv4SidePanel.tsx +++ b/apps/studio/components/interfaces/Settings/Addons/IPv4SidePanel.tsx @@ -3,7 +3,7 @@ import { useParams } from 'common' import { useEffect, useState } from 'react' import { toast } from 'sonner' import { cn, RadioGroup, RadioGroupLargeItem, SidePanel } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { TaxDisclaimer } from '@/components/interfaces/Billing/TaxDisclaimer' import { DocsButton } from '@/components/ui/DocsButton' diff --git a/apps/studio/components/interfaces/Settings/Database/ConnectionPooling/ConnectionPooling.tsx b/apps/studio/components/interfaces/Settings/Database/ConnectionPooling/ConnectionPooling.tsx index 1d89f386db3aa..a3a32de1a34be 100644 --- a/apps/studio/components/interfaces/Settings/Database/ConnectionPooling/ConnectionPooling.tsx +++ b/apps/studio/components/interfaces/Settings/Database/ConnectionPooling/ConnectionPooling.tsx @@ -21,7 +21,7 @@ import { InputGroupText, Separator, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { PageSection, diff --git a/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessConfiguration.tsx b/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessConfiguration.tsx index 6c4cb135cf3c9..ff497a0cf1e64 100644 --- a/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessConfiguration.tsx +++ b/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessConfiguration.tsx @@ -23,7 +23,7 @@ import { TooltipContent, TooltipTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormLayout } from 'ui-patterns/form/Layout/FormLayout' import { PageSection, diff --git a/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessDeleteDialog.tsx b/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessDeleteDialog.tsx index 5a6054390695b..b1a707ea06140 100644 --- a/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessDeleteDialog.tsx +++ b/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessDeleteDialog.tsx @@ -9,7 +9,7 @@ import { AlertDialogHeader, AlertDialogTitle, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import type { JitUserRule } from './JitDbAccess.types' diff --git a/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessRoleGrantFields.tsx b/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessRoleGrantFields.tsx index 619f7721e2e33..c08ef8702d6fa 100644 --- a/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessRoleGrantFields.tsx +++ b/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessRoleGrantFields.tsx @@ -9,7 +9,7 @@ import { SelectValue, WarningIcon, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { SingleValueFieldArray } from 'ui-patterns/form/SingleValueFieldArray/SingleValueFieldArray' import { TimestampInfo } from 'ui-patterns/TimestampInfo' diff --git a/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessRuleSheet.tsx b/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessRuleSheet.tsx index 3b5af9abac3b4..3c29635c1a565 100644 --- a/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessRuleSheet.tsx +++ b/apps/studio/components/interfaces/Settings/Database/JitDatabaseAccess/JitDbAccessRuleSheet.tsx @@ -22,7 +22,7 @@ import { SheetHeader, SheetTitle, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { z } from 'zod' diff --git a/apps/studio/components/interfaces/Settings/Database/NetworkRestrictions/RemoveRestrictionModal.tsx b/apps/studio/components/interfaces/Settings/Database/NetworkRestrictions/RemoveRestrictionModal.tsx index 5c1bfb0a53f44..3a8530c2dc214 100644 --- a/apps/studio/components/interfaces/Settings/Database/NetworkRestrictions/RemoveRestrictionModal.tsx +++ b/apps/studio/components/interfaces/Settings/Database/NetworkRestrictions/RemoveRestrictionModal.tsx @@ -10,7 +10,7 @@ import { AlertDialogHeader, AlertDialogTitle, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { useNetworkRestrictionsQuery } from '@/data/network-restrictions/network-restrictions-query' import { useNetworkRestrictionsApplyMutation } from '@/data/network-restrictions/network-retrictions-apply-mutation' diff --git a/apps/studio/components/interfaces/Settings/Database/SSLConfiguration.tsx b/apps/studio/components/interfaces/Settings/Database/SSLConfiguration.tsx index 42ec83780b756..f624b5e415b6d 100644 --- a/apps/studio/components/interfaces/Settings/Database/SSLConfiguration.tsx +++ b/apps/studio/components/interfaces/Settings/Database/SSLConfiguration.tsx @@ -22,7 +22,7 @@ import { TooltipContent, TooltipTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormLayout } from 'ui-patterns/form/Layout/FormLayout' import { PageSection, diff --git a/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainActivate.tsx b/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainActivate.tsx index 78c2e33341ed9..018e17b728e20 100644 --- a/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainActivate.tsx +++ b/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainActivate.tsx @@ -1,7 +1,7 @@ import { useState } from 'react' import { toast } from 'sonner' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { DocsButton } from '@/components/ui/DocsButton' diff --git a/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainVerify.tsx b/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainVerify.tsx index 3a6498fa977cc..0f12e3d8628cc 100644 --- a/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainVerify.tsx +++ b/apps/studio/components/interfaces/Settings/General/CustomDomainConfig/CustomDomainVerify.tsx @@ -3,7 +3,7 @@ import { AlertCircle, RefreshCw } from 'lucide-react' import { useEffect } from 'react' import { toast } from 'sonner' import { Alert, AlertDescription, AlertTitle, Button, WarningIcon } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { DNSRecord } from './DNSRecord' import { DNSTableHeaders } from './DNSTableHeaders' diff --git a/apps/studio/components/interfaces/Settings/General/DashboardPreferences.tsx b/apps/studio/components/interfaces/Settings/General/DashboardPreferences.tsx index c6b6c44044080..ffcacaf06a851 100644 --- a/apps/studio/components/interfaces/Settings/General/DashboardPreferences.tsx +++ b/apps/studio/components/interfaces/Settings/General/DashboardPreferences.tsx @@ -21,7 +21,7 @@ import { FormControl, FormField, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { PageSection, diff --git a/apps/studio/components/interfaces/Settings/General/General.tsx b/apps/studio/components/interfaces/Settings/General/General.tsx index f804a93bbed2c..7bcba9057d3b7 100644 --- a/apps/studio/components/interfaces/Settings/General/General.tsx +++ b/apps/studio/components/interfaces/Settings/General/General.tsx @@ -4,7 +4,7 @@ import { IS_PLATFORM, useParams } from 'common' import { useForm } from 'react-hook-form' import { toast } from 'sonner' import { Button, Card, CardContent, CardFooter, Form, FormControl, FormField, Input } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { Input as PasswordInput } from 'ui-patterns/DataInputs/Input' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { diff --git a/apps/studio/components/interfaces/Settings/General/Infrastructure/ProjectUpgradeAlert.tsx b/apps/studio/components/interfaces/Settings/General/Infrastructure/ProjectUpgradeAlert.tsx index 17a3c53814b53..c3ca078fe072c 100644 --- a/apps/studio/components/interfaces/Settings/General/Infrastructure/ProjectUpgradeAlert.tsx +++ b/apps/studio/components/interfaces/Settings/General/Infrastructure/ProjectUpgradeAlert.tsx @@ -30,7 +30,7 @@ import { SelectTrigger, SelectValue, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { z } from 'zod' diff --git a/apps/studio/components/interfaces/Settings/General/TransferProjectPanel/TransferProjectButton.tsx b/apps/studio/components/interfaces/Settings/General/TransferProjectPanel/TransferProjectButton.tsx index e6e265d6eaef5..9d49006f54feb 100644 --- a/apps/studio/components/interfaces/Settings/General/TransferProjectPanel/TransferProjectButton.tsx +++ b/apps/studio/components/interfaces/Settings/General/TransferProjectPanel/TransferProjectButton.tsx @@ -23,7 +23,7 @@ import { SelectValue, WarningIcon, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { ButtonTooltip } from '@/components/ui/ButtonTooltip' diff --git a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureActivity.tsx b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureActivity.tsx index fb40475c70916..d56d563379cc5 100644 --- a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureActivity.tsx +++ b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureActivity.tsx @@ -5,7 +5,7 @@ import { BarChart2, ChartLine, ExternalLink } from 'lucide-react' import Link from 'next/link' import { Fragment, useMemo, useState } from 'react' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { INFRA_ACTIVITY_METRICS } from './Infrastructure.constants' diff --git a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureInfo.tsx b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureInfo.tsx index 5274d4ac83b4d..aacf582ae327f 100644 --- a/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureInfo.tsx +++ b/apps/studio/components/interfaces/Settings/Infrastructure/InfrastructureInfo.tsx @@ -9,7 +9,7 @@ import { TooltipContent, TooltipTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' diff --git a/apps/studio/components/interfaces/Settings/Infrastructure/UpgradeWarnings.tsx b/apps/studio/components/interfaces/Settings/Infrastructure/UpgradeWarnings.tsx index db1ca7378d64d..a5204a403db44 100644 --- a/apps/studio/components/interfaces/Settings/Infrastructure/UpgradeWarnings.tsx +++ b/apps/studio/components/interfaces/Settings/Infrastructure/UpgradeWarnings.tsx @@ -1,7 +1,7 @@ import { useParams } from 'common' import Link from 'next/link' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { InlineLink } from '@/components/ui/InlineLink' import { diff --git a/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLinkForm.tsx b/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLinkForm.tsx index 62d1dea190e17..2dc4c3473763a 100644 --- a/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLinkForm.tsx +++ b/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLinkForm.tsx @@ -17,7 +17,7 @@ import { SheetSection, SheetTitle, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { InlineLink } from '@/components/ui/InlineLink' diff --git a/apps/studio/components/interfaces/Settings/Integrations/GithubIntegration/GitHubIntegrationConnectionForm.tsx b/apps/studio/components/interfaces/Settings/Integrations/GithubIntegration/GitHubIntegrationConnectionForm.tsx index eb672742b9885..ddf5df5a7278f 100644 --- a/apps/studio/components/interfaces/Settings/Integrations/GithubIntegration/GitHubIntegrationConnectionForm.tsx +++ b/apps/studio/components/interfaces/Settings/Integrations/GithubIntegration/GitHubIntegrationConnectionForm.tsx @@ -17,7 +17,7 @@ import { Input, Switch, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import * as z from 'zod' diff --git a/apps/studio/components/interfaces/Settings/Integrations/IntegrationsSettings.tsx b/apps/studio/components/interfaces/Settings/Integrations/IntegrationsSettings.tsx index 5422d72ba50aa..80405ab50b3c7 100644 --- a/apps/studio/components/interfaces/Settings/Integrations/IntegrationsSettings.tsx +++ b/apps/studio/components/interfaces/Settings/Integrations/IntegrationsSettings.tsx @@ -1,5 +1,5 @@ import { Card } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { AWSPrivateLinkSection } from './AWSPrivateLink/AWSPrivateLinkSection' import { GitHubSection } from './GithubIntegration/GithubSection' diff --git a/apps/studio/components/interfaces/Settings/Integrations/VercelIntegration/VercelIntegrationConnectionForm.tsx b/apps/studio/components/interfaces/Settings/Integrations/VercelIntegration/VercelIntegrationConnectionForm.tsx index a968219bc5bee..b1b656f579e91 100644 --- a/apps/studio/components/interfaces/Settings/Integrations/VercelIntegration/VercelIntegrationConnectionForm.tsx +++ b/apps/studio/components/interfaces/Settings/Integrations/VercelIntegration/VercelIntegrationConnectionForm.tsx @@ -17,7 +17,7 @@ import { Input, Switch, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import * as z from 'zod' diff --git a/apps/studio/components/interfaces/Settings/Logs/Logs.DatePickers.tsx b/apps/studio/components/interfaces/Settings/Logs/Logs.DatePickers.tsx index 1c1c6975f5289..811191d918a2c 100644 --- a/apps/studio/components/interfaces/Settings/Logs/Logs.DatePickers.tsx +++ b/apps/studio/components/interfaces/Settings/Logs/Logs.DatePickers.tsx @@ -17,6 +17,7 @@ import { } from 'ui' import { LOGS_LARGE_DATE_RANGE_DAYS_THRESHOLD } from './Logs.constants' +import { generateHelpersFromInput } from './Logs.datePickerHelpers' import type { DatetimeHelper } from './Logs.types' import { ButtonTooltip } from '@/components/ui/ButtonTooltip' import { TimeSplitInput } from '@/components/ui/DatePicker/TimeSplitInput' @@ -24,65 +25,6 @@ import { ShortcutTooltip } from '@/components/ui/ShortcutTooltip' import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements' import type { ShortcutId } from '@/state/shortcuts/registry' -type Unit = 'minute' | 'hour' | 'day' - -export type ParsedCustomInput = - | { type: 'number'; value: number } - | { type: 'unit'; value: number; unit: Unit } - | { type: 'invalid' } - -export const parseCustomInput = (input: string): ParsedCustomInput => { - const trimmed = input.trim().toLowerCase() - if (!trimmed) return { type: 'invalid' } - - // Try to match "number + optional space + unit prefix" - const match = trimmed.match(/^(\d+)\s*([a-z]*)$/) - if (!match) return { type: 'invalid' } - - const [, numStr, unitStr] = match - const value = parseInt(numStr, 10) - - if (isNaN(value) || value <= 0) return { type: 'invalid' } - - if (!unitStr) { - return { type: 'number', value } - } - - // Match if unitStr is a prefix of any unit name or its first letter - const units: Unit[] = ['minute', 'hour', 'day'] - const matchedUnit = units.find((u) => u.startsWith(unitStr) || u[0] === unitStr) - - if (!matchedUnit) return { type: 'invalid' } - - return { type: 'unit', value, unit: matchedUnit } -} - -export const generateDynamicHelper = (value: number, unit: Unit): DatetimeHelper => { - return { - text: `Last ${value} ${unit}${value === 1 ? '' : 's'}`, - calcFrom: () => dayjs().subtract(value, unit).toISOString(), - calcTo: () => dayjs().toISOString(), - } -} - -export const generateDynamicHelpers = (value: number): DatetimeHelper[] => { - const units: Unit[] = ['minute', 'hour', 'day'] - return units.map((unit) => generateDynamicHelper(value, unit)) -} - -export const generateHelpersFromInput = (input: string): DatetimeHelper[] | null => { - const parsed = parseCustomInput(input) - - switch (parsed.type) { - case 'number': - return generateDynamicHelpers(parsed.value) - case 'unit': - return [generateDynamicHelper(parsed.value, parsed.unit)] - case 'invalid': - return null - } -} - export type DatePickerValue = { to: string from: string diff --git a/apps/studio/components/interfaces/Settings/Logs/Logs.datePickerHelpers.ts b/apps/studio/components/interfaces/Settings/Logs/Logs.datePickerHelpers.ts new file mode 100644 index 0000000000000..422a2f040339c --- /dev/null +++ b/apps/studio/components/interfaces/Settings/Logs/Logs.datePickerHelpers.ts @@ -0,0 +1,73 @@ +import dayjs from 'dayjs' + +import type { DatetimeHelper } from './Logs.types' + +/** + * Framework-free date-range helpers shared by the Logs date picker + * (`Logs.DatePickers.tsx`) and the SQL editor's logs query-source domain + * (`SQLEditor/querySource.ts`). Kept in a pure `.ts` module — depending only on + * dayjs — so both a React component and a valtio-free domain module can import it + * without pulling in the picker's UI. + */ + +/** The relative-range units the picker and the logs domain both speak. */ +export type Unit = 'minute' | 'hour' | 'day' + +export type ParsedCustomInput = + | { type: 'number'; value: number } + | { type: 'unit'; value: number; unit: Unit } + | { type: 'invalid' } + +export const parseCustomInput = (input: string): ParsedCustomInput => { + const trimmed = input.trim().toLowerCase() + if (!trimmed) return { type: 'invalid' } + + // Try to match "number + optional space + unit prefix" + const match = trimmed.match(/^(\d+)\s*([a-z]*)$/) + if (!match) return { type: 'invalid' } + + const [, numStr, unitStr] = match + const value = Number.parseInt(numStr, 10) + + // Only finite positive values may reach generateDynamicHelper(): Number.isFinite + // rejects NaN and Infinity outright, and the <= 0 guard keeps out non-positive. + if (!Number.isFinite(value) || value <= 0) return { type: 'invalid' } + + if (!unitStr) { + return { type: 'number', value } + } + + // Match if unitStr is a prefix of any unit name or its first letter + const units: Unit[] = ['minute', 'hour', 'day'] + const matchedUnit = units.find((u) => u.startsWith(unitStr) || u[0] === unitStr) + + if (!matchedUnit) return { type: 'invalid' } + + return { type: 'unit', value, unit: matchedUnit } +} + +export const generateDynamicHelper = (value: number, unit: Unit): DatetimeHelper => { + return { + text: `Last ${value} ${unit}${value === 1 ? '' : 's'}`, + calcFrom: () => dayjs().subtract(value, unit).toISOString(), + calcTo: () => dayjs().toISOString(), + } +} + +export const generateDynamicHelpers = (value: number): DatetimeHelper[] => { + const units: Unit[] = ['minute', 'hour', 'day'] + return units.map((unit) => generateDynamicHelper(value, unit)) +} + +export const generateHelpersFromInput = (input: string): DatetimeHelper[] | null => { + const parsed = parseCustomInput(input) + + switch (parsed.type) { + case 'number': + return generateDynamicHelpers(parsed.value) + case 'unit': + return [generateDynamicHelper(parsed.value, parsed.unit)] + case 'invalid': + return null + } +} diff --git a/apps/studio/components/interfaces/Settings/Logs/LogsExplorerOtelBanner.tsx b/apps/studio/components/interfaces/Settings/Logs/LogsExplorerOtelBanner.tsx index 1c52f2f52657c..4f9bac9cd3460 100644 --- a/apps/studio/components/interfaces/Settings/Logs/LogsExplorerOtelBanner.tsx +++ b/apps/studio/components/interfaces/Settings/Logs/LogsExplorerOtelBanner.tsx @@ -1,5 +1,5 @@ import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' interface LogsExplorerOtelBannerProps { isRewriting: boolean diff --git a/apps/studio/components/interfaces/SignIn/ForgotPasswordWizard.tsx b/apps/studio/components/interfaces/SignIn/ForgotPasswordWizard.tsx index f86c6c13bedff..265926f1da5b1 100644 --- a/apps/studio/components/interfaces/SignIn/ForgotPasswordWizard.tsx +++ b/apps/studio/components/interfaces/SignIn/ForgotPasswordWizard.tsx @@ -5,7 +5,7 @@ import { useRef, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' import { Button, Form, FormControl, FormField, Input } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import * as z from 'zod' diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/BucketCallouts.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/BucketCallouts.tsx index 3876dbf344bda..21f797b422264 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/BucketCallouts.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/BucketCallouts.tsx @@ -1,6 +1,6 @@ import Link from 'next/link' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { SimpleConfigurationDetails } from './SimpleConfigurationDetails' import { WrapperMeta } from '@/components/interfaces/Integrations/Wrappers/Wrappers.types' diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/SimpleConfigurationDetails.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/SimpleConfigurationDetails.tsx index 6000042a6bf7a..357ed760bcda9 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/SimpleConfigurationDetails.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/SimpleConfigurationDetails.tsx @@ -1,6 +1,6 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { Card } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { DESCRIPTIONS, LABELS, OPTION_ORDER } from './AnalyticsBucketDetails.constants' import { CopyEnvButton } from './CopyEnvButton' diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/UpdateCatalogTokenDialog.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/UpdateCatalogTokenDialog.tsx index 21dc8212a496f..ed73ce414f949 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/UpdateCatalogTokenDialog.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/UpdateCatalogTokenDialog.tsx @@ -20,7 +20,7 @@ import { SelectTrigger, SelectValue, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/CreateAnalyticsBucketForm.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/CreateAnalyticsBucketForm.tsx index d9327afd52704..f48a5d1de58ac 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/CreateAnalyticsBucketForm.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/CreateAnalyticsBucketForm.tsx @@ -14,7 +14,7 @@ import { SheetFooter, SheetSection, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import z from 'zod' diff --git a/apps/studio/components/interfaces/Storage/BucketsPickerDialog/BucketsPicker.tsx b/apps/studio/components/interfaces/Storage/BucketsPickerDialog/BucketsPicker.tsx index b527971903e56..595cb64317e0a 100644 --- a/apps/studio/components/interfaces/Storage/BucketsPickerDialog/BucketsPicker.tsx +++ b/apps/studio/components/interfaces/Storage/BucketsPickerDialog/BucketsPicker.tsx @@ -11,7 +11,7 @@ import { DropdownMenuRadioItem, DropdownMenuTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { Input } from 'ui-patterns/DataInputs/Input' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' diff --git a/apps/studio/components/interfaces/Storage/CreateBucketModal.tsx b/apps/studio/components/interfaces/Storage/CreateBucketModal.tsx index 411204e7e6d51..58d90f9592189 100644 --- a/apps/studio/components/interfaces/Storage/CreateBucketModal.tsx +++ b/apps/studio/components/interfaces/Storage/CreateBucketModal.tsx @@ -24,7 +24,7 @@ import { SelectValue, Switch, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import z from 'zod' diff --git a/apps/studio/components/interfaces/Storage/EditBucketModal.tsx b/apps/studio/components/interfaces/Storage/EditBucketModal.tsx index d0a3a8f047b46..cdab844adfed9 100644 --- a/apps/studio/components/interfaces/Storage/EditBucketModal.tsx +++ b/apps/studio/components/interfaces/Storage/EditBucketModal.tsx @@ -24,7 +24,7 @@ import { SelectValue, Switch, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { z } from 'zod' diff --git a/apps/studio/components/interfaces/Storage/EmptyBucketModal.tsx b/apps/studio/components/interfaces/Storage/EmptyBucketModal.tsx index edbb38a5c85d3..15d5646f10bba 100644 --- a/apps/studio/components/interfaces/Storage/EmptyBucketModal.tsx +++ b/apps/studio/components/interfaces/Storage/EmptyBucketModal.tsx @@ -10,7 +10,7 @@ import { DialogSectionSeparator, DialogTitle, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { useBucketEmptyMutation } from '@/data/storage/bucket-empty-mutation' import type { Bucket } from '@/data/storage/buckets-query' diff --git a/apps/studio/components/interfaces/Storage/FilesBuckets/index.tsx b/apps/studio/components/interfaces/Storage/FilesBuckets/index.tsx index db17240ed8495..da0f7aea3a550 100644 --- a/apps/studio/components/interfaces/Storage/FilesBuckets/index.tsx +++ b/apps/studio/components/interfaces/Storage/FilesBuckets/index.tsx @@ -12,7 +12,7 @@ import { DropdownMenuRadioItem, DropdownMenuTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { Input } from 'ui-patterns/DataInputs/Input' import { PageContainer } from 'ui-patterns/PageContainer' import { PageSection, PageSectionContent } from 'ui-patterns/PageSection' diff --git a/apps/studio/components/interfaces/Storage/PublicBucketWarning.tsx b/apps/studio/components/interfaces/Storage/PublicBucketWarning.tsx index 555d5cc5d7e41..1626a35fd76bf 100644 --- a/apps/studio/components/interfaces/Storage/PublicBucketWarning.tsx +++ b/apps/studio/components/interfaces/Storage/PublicBucketWarning.tsx @@ -4,7 +4,7 @@ import { LOCAL_STORAGE_KEYS, safeLocalStorage } from 'common' import { useEffect, useState, type ReactNode } from 'react' import { toast } from 'sonner' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { CodeBlock } from 'ui-patterns/CodeBlock' import { ConfirmationModal } from 'ui-patterns/Dialogs/ConfirmationModal' diff --git a/apps/studio/components/interfaces/Storage/StorageBucketsError.tsx b/apps/studio/components/interfaces/Storage/StorageBucketsError.tsx index 1ae65ef4d8d1c..4af7100ec2e25 100644 --- a/apps/studio/components/interfaces/Storage/StorageBucketsError.tsx +++ b/apps/studio/components/interfaces/Storage/StorageBucketsError.tsx @@ -1,7 +1,7 @@ import { SupportCategories } from '@supabase/shared-types/out/constants' import { useParams } from 'common' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { SupportLink } from '../Support/SupportLink' import type { ResponseError } from '@/types' diff --git a/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.tsx b/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.tsx index 245ef42366086..3a3bf7ca63f24 100644 --- a/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.tsx +++ b/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.tsx @@ -21,7 +21,7 @@ import { SelectValue, Switch, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { PageContainer } from 'ui-patterns/PageContainer' import { PageSection, PageSectionContent } from 'ui-patterns/PageSection' diff --git a/apps/studio/components/interfaces/Storage/VectorBuckets/CreateVectorBucketDialog.tsx b/apps/studio/components/interfaces/Storage/VectorBuckets/CreateVectorBucketDialog.tsx index f35171dd7715a..9746240bb6a6e 100644 --- a/apps/studio/components/interfaces/Storage/VectorBuckets/CreateVectorBucketDialog.tsx +++ b/apps/studio/components/interfaces/Storage/VectorBuckets/CreateVectorBucketDialog.tsx @@ -17,7 +17,7 @@ import { FormField, Input, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import z from 'zod' diff --git a/apps/studio/components/interfaces/Storage/VectorBuckets/CreateVectorTableSheet.tsx b/apps/studio/components/interfaces/Storage/VectorBuckets/CreateVectorTableSheet.tsx index 8bf96c3df3e47..7ce7052975314 100644 --- a/apps/studio/components/interfaces/Storage/VectorBuckets/CreateVectorTableSheet.tsx +++ b/apps/studio/components/interfaces/Storage/VectorBuckets/CreateVectorTableSheet.tsx @@ -23,7 +23,7 @@ import { SheetTitle, SheetTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import z from 'zod' diff --git a/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/VectorBucketCallouts.tsx b/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/VectorBucketCallouts.tsx index 05b68cda2453b..a39c18f825446 100644 --- a/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/VectorBucketCallouts.tsx +++ b/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/VectorBucketCallouts.tsx @@ -1,7 +1,7 @@ import Link from 'next/link' import { toast } from 'sonner' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { WrapperMeta } from '@/components/interfaces/Integrations/Wrappers/Wrappers.types' import { ScaffoldSection } from '@/components/layouts/Scaffold' diff --git a/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/VectorBucketTableExamplesSheet.tsx b/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/VectorBucketTableExamplesSheet.tsx index d50be9764c427..75b8469bc02b2 100644 --- a/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/VectorBucketTableExamplesSheet.tsx +++ b/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketDetails/VectorBucketTableExamplesSheet.tsx @@ -22,7 +22,7 @@ import { SheetTitle, SheetTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { CodeBlock } from 'ui-patterns/CodeBlock' import { useS3VectorsWrapperExtension } from '../useS3VectorsWrapper' diff --git a/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketsLocalDisabledState.tsx b/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketsLocalDisabledState.tsx index b58bd8fd8fb14..abc33955152eb 100644 --- a/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketsLocalDisabledState.tsx +++ b/apps/studio/components/interfaces/Storage/VectorBuckets/VectorBucketsLocalDisabledState.tsx @@ -1,4 +1,4 @@ -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { CodeBlock } from 'ui-patterns/CodeBlock' const CONFIG_SNIPPET = `[storage.vector] diff --git a/apps/studio/components/interfaces/Support/CategoryAndSeverityInfo.tsx b/apps/studio/components/interfaces/Support/CategoryAndSeverityInfo.tsx index 34e243e3226f1..c8e07af7646ac 100644 --- a/apps/studio/components/interfaces/Support/CategoryAndSeverityInfo.tsx +++ b/apps/studio/components/interfaces/Support/CategoryAndSeverityInfo.tsx @@ -12,7 +12,7 @@ import { SelectTrigger, SelectValue, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { diff --git a/apps/studio/components/interfaces/Support/IncidentAdmonition.tsx b/apps/studio/components/interfaces/Support/IncidentAdmonition.tsx index a0e59404a07f5..4680a9ea453c5 100644 --- a/apps/studio/components/interfaces/Support/IncidentAdmonition.tsx +++ b/apps/studio/components/interfaces/Support/IncidentAdmonition.tsx @@ -2,7 +2,7 @@ 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 { Admonition } from 'ui-patterns/Admonition' import { useIncidentStatusQuery } from '@/data/platform/incident-status-query' import { processIncidentData } from '@/data/platform/incident-status-utils' diff --git a/apps/studio/components/interfaces/Support/LinkSupportTicketPage.tsx b/apps/studio/components/interfaces/Support/LinkSupportTicketPage.tsx index b41c76a478bd9..014111b314b2b 100644 --- a/apps/studio/components/interfaces/Support/LinkSupportTicketPage.tsx +++ b/apps/studio/components/interfaces/Support/LinkSupportTicketPage.tsx @@ -3,7 +3,7 @@ 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/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { LinkSupportTicketForm } from './LinkSupportTicketForm' diff --git a/apps/studio/components/interfaces/Support/MessageField.tsx b/apps/studio/components/interfaces/Support/MessageField.tsx index 41f13db835a1d..522d9efc257da 100644 --- a/apps/studio/components/interfaces/Support/MessageField.tsx +++ b/apps/studio/components/interfaces/Support/MessageField.tsx @@ -2,7 +2,7 @@ import type { UseFormReturn } from 'react-hook-form' // End of third-party imports import { FormControl, FormField, TextArea } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { IPV4SuggestionAlert } from './IPV4SuggestionAlert' diff --git a/apps/studio/components/interfaces/Support/ProjectAndPlanInfo.tsx b/apps/studio/components/interfaces/Support/ProjectAndPlanInfo.tsx index f587e28a2a572..5f0fa748e0b7d 100644 --- a/apps/studio/components/interfaces/Support/ProjectAndPlanInfo.tsx +++ b/apps/studio/components/interfaces/Support/ProjectAndPlanInfo.tsx @@ -7,7 +7,7 @@ import Link from 'next/link' import type { UseFormReturn } from 'react-hook-form' import { toast } from 'sonner' import { Button, cn, CommandGroup, CommandItem, FormControl, FormField } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' diff --git a/apps/studio/components/interfaces/Support/SupportFormPage.tsx b/apps/studio/components/interfaces/Support/SupportFormPage.tsx index b7ed6b91e2622..3962d3fbf3512 100644 --- a/apps/studio/components/interfaces/Support/SupportFormPage.tsx +++ b/apps/studio/components/interfaces/Support/SupportFormPage.tsx @@ -6,7 +6,7 @@ import type { UseFormReturn } from 'react-hook-form' import SVG from 'react-inlinesvg' import { toast } from 'sonner' import { Button, cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { AIAssistantOption } from './AIAssistantOption' import { DiscordCTACard } from './DiscordCTACard' diff --git a/apps/studio/components/interfaces/SupportEmailVerification/SupportEmailVerification.tsx b/apps/studio/components/interfaces/SupportEmailVerification/SupportEmailVerification.tsx index 76c46d62b1330..013b23ab711da 100644 --- a/apps/studio/components/interfaces/SupportEmailVerification/SupportEmailVerification.tsx +++ b/apps/studio/components/interfaces/SupportEmailVerification/SupportEmailVerification.tsx @@ -1,6 +1,6 @@ import { useParams } from 'common' import { useEffect } from 'react' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { InterstitialLayout, SupabaseLogo } from '@/components/layouts/InterstitialLayout' diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ApiAccessToggle.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ApiAccessToggle.tsx index 756de361299dc..6128fb98ef9ff 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ApiAccessToggle.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/ApiAccessToggle.tsx @@ -13,7 +13,7 @@ import { } from 'react' import { usePreviousDistinct } from 'react-use' import { Button, Switch } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { Input } from 'ui-patterns/DataInputs/Input' import { getApiEndpoint } from '@/components/interfaces/Integrations/DataApi/DataApi.utils' diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableEditor.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableEditor.tsx index a8313d0cd1a66..b1f32ee4873a5 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableEditor.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/TableEditor/TableEditor.tsx @@ -2,7 +2,7 @@ import { isEmpty, noop } from 'lodash' import { useContext, useEffect, useMemo, useRef, useState } from 'react' import { toast } from 'sonner' import { Badge, Checkbox, Input, SidePanel } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { ActionBar } from '../ActionBar' diff --git a/apps/studio/components/interfaces/TableGridEditor/TableGridEditor.tsx b/apps/studio/components/interfaces/TableGridEditor/TableGridEditor.tsx index b0a2f2d4c54f6..3df3be4c575e0 100644 --- a/apps/studio/components/interfaces/TableGridEditor/TableGridEditor.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/TableGridEditor.tsx @@ -5,7 +5,7 @@ import { useRouter } from 'next/router' import { parseAsString, useQueryState } from 'nuqs' import { useCallback } from 'react' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import DeleteConfirmationDialogs from './DeleteConfirmationDialogs' diff --git a/apps/studio/components/layouts/DefaultLayout.tsx b/apps/studio/components/layouts/DefaultLayout.tsx index 0d507baaca380..734493bb7bba0 100644 --- a/apps/studio/components/layouts/DefaultLayout.tsx +++ b/apps/studio/components/layouts/DefaultLayout.tsx @@ -1,14 +1,8 @@ import { useBreakpoint, useParams } from 'common' import { useRouter } from 'next/router' import { PropsWithChildren, useEffect, useState } from 'react' -import { - buttonVariants, - cn, - ResizablePanel, - ResizablePanelGroup, - SidebarProvider, - usePanelRef, -} from 'ui' +import { ResizablePanel, ResizablePanelGroup, SidebarProvider, usePanelRef } from 'ui' +import { SkipToContent } from 'ui-patterns/SkipToContent' import { BannerStack } from '../ui/BannerStack/BannerStack' import { LayoutHeader } from './Navigation/LayoutHeader/LayoutHeader' @@ -101,19 +95,7 @@ export const DefaultLayout = ({
- - Skip to content - + {/* Top Banner */}
@@ -144,7 +126,7 @@ export const DefaultLayout = ({ maxSize={`${contentMaxSizePercentage}`} defaultSize={`${contentMaxSizePercentage}`} > -
+
{children}
diff --git a/apps/studio/components/layouts/Navigation/LayoutHeader/FeedbackDropdown/FeedbackWidget.tsx b/apps/studio/components/layouts/Navigation/LayoutHeader/FeedbackDropdown/FeedbackWidget.tsx index 3dc429217f343..8532b9db1a6fa 100644 --- a/apps/studio/components/layouts/Navigation/LayoutHeader/FeedbackDropdown/FeedbackWidget.tsx +++ b/apps/studio/components/layouts/Navigation/LayoutHeader/FeedbackDropdown/FeedbackWidget.tsx @@ -17,7 +17,7 @@ import { PopoverSeparator, TextArea, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { convertB64toBlob, diff --git a/apps/studio/components/layouts/Navigation/LayoutHeader/LayoutHeader.tsx b/apps/studio/components/layouts/Navigation/LayoutHeader/LayoutHeader.tsx index b1e0b34bd3d85..6668e5a79b973 100644 --- a/apps/studio/components/layouts/Navigation/LayoutHeader/LayoutHeader.tsx +++ b/apps/studio/components/layouts/Navigation/LayoutHeader/LayoutHeader.tsx @@ -235,7 +235,7 @@ export const LayoutHeader = ({ showShortcut={commandMenuEnabled} placeholder="Search..." className={cn( - 'hidden md:flex md:min-w-32 xl:min-w-32 rounded-full bg-transparent', + 'hidden md:flex md:min-w-32 xl:min-w-32 rounded-full', '[&_.command-shortcut]:border-none', '[&_.command-shortcut]:pr-2', '[&_.command-shortcut]:bg-transparent', @@ -262,13 +262,14 @@ export const LayoutHeader = ({
diff --git a/apps/studio/components/layouts/Navigation/LayoutHeader/LocalVersionPopover.tsx b/apps/studio/components/layouts/Navigation/LayoutHeader/LocalVersionPopover.tsx index 428fe5b008311..1ce8c1140a678 100644 --- a/apps/studio/components/layouts/Navigation/LayoutHeader/LocalVersionPopover.tsx +++ b/apps/studio/components/layouts/Navigation/LayoutHeader/LocalVersionPopover.tsx @@ -17,7 +17,7 @@ import { TabsList, TabsTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { SimpleCodeBlock } from 'ui-patterns/SimpleCodeBlock' import { getSemver, semverGte, semverLte } from './LocalVersionPopover.utils' diff --git a/apps/studio/components/layouts/ProjectLayout/PausedState/PauseDisabledState.tsx b/apps/studio/components/layouts/ProjectLayout/PausedState/PauseDisabledState.tsx index dc9a1e9b99697..ab60e5398e84f 100644 --- a/apps/studio/components/layouts/ProjectLayout/PausedState/PauseDisabledState.tsx +++ b/apps/studio/components/layouts/ProjectLayout/PausedState/PauseDisabledState.tsx @@ -1,6 +1,6 @@ import { useParams } from 'common' import { ExternalLink } from 'lucide-react' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { TimestampInfo } from 'ui-patterns/TimestampInfo' import { DownloadBackupsSection } from './DownloadBackupsSection' diff --git a/apps/studio/components/layouts/ProjectLayout/RestoringState.tsx b/apps/studio/components/layouts/ProjectLayout/RestoringState.tsx index b9de7da682607..a223931bb4b37 100644 --- a/apps/studio/components/layouts/ProjectLayout/RestoringState.tsx +++ b/apps/studio/components/layouts/ProjectLayout/RestoringState.tsx @@ -3,7 +3,7 @@ import { LOCAL_STORAGE_KEYS, useParams } from 'common' import { CheckCircle, Download, Loader } from 'lucide-react' import { useEffect, useState } from 'react' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { SupportLink } from '@/components/interfaces/Support/SupportLink' import { ButtonTooltip } from '@/components/ui/ButtonTooltip' diff --git a/apps/studio/components/ui/AIAssistantPanel/AIAssistant.tsx b/apps/studio/components/ui/AIAssistantPanel/AIAssistant.tsx index dffa621856ecb..aafba624bafe6 100644 --- a/apps/studio/components/ui/AIAssistantPanel/AIAssistant.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/AIAssistant.tsx @@ -8,7 +8,7 @@ import { Eraser, Pencil, X } from 'lucide-react' import { useRouter } from 'next/router' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { Button, cn, KeyboardShortcut } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { AlertError } from '../AlertError' import { ButtonTooltip } from '../ButtonTooltip' diff --git a/apps/studio/components/ui/AIAssistantPanel/AIAssistantHeader.tsx b/apps/studio/components/ui/AIAssistantPanel/AIAssistantHeader.tsx index 8725e83dcb1ba..49351c8a205b4 100644 --- a/apps/studio/components/ui/AIAssistantPanel/AIAssistantHeader.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/AIAssistantHeader.tsx @@ -20,7 +20,7 @@ import { DropdownMenuTrigger, Input, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ButtonTooltip } from '../ButtonTooltip' import { ShortcutPills, ShortcutTooltip } from '../ShortcutTooltip' diff --git a/apps/studio/components/ui/AlertError.tsx b/apps/studio/components/ui/AlertError.tsx index 9c521678ff6cd..9506899bff5bf 100644 --- a/apps/studio/components/ui/AlertError.tsx +++ b/apps/studio/components/ui/AlertError.tsx @@ -1,7 +1,7 @@ import { SupportCategories } from '@supabase/shared-types/out/constants' import { PropsWithChildren, useEffect, useRef } from 'react' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { SupportLink } from '@/components/interfaces/Support/SupportLink' import { isDashboardErrorSampled } from '@/lib/telemetry/error-sampling' diff --git a/apps/studio/components/ui/AlphaNotice.tsx b/apps/studio/components/ui/AlphaNotice.tsx index fe53c97d71d70..19de807b20292 100644 --- a/apps/studio/components/ui/AlphaNotice.tsx +++ b/apps/studio/components/ui/AlphaNotice.tsx @@ -2,7 +2,7 @@ import { ExternalLink } from 'lucide-react' import Link from 'next/link' import { PropsWithChildren } from 'react' import { Badge, Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { BASE_PATH } from '@/lib/constants' diff --git a/apps/studio/components/ui/AutoEnableRLSNotice.tsx b/apps/studio/components/ui/AutoEnableRLSNotice.tsx index 368678b418fe5..170e91a91158e 100644 --- a/apps/studio/components/ui/AutoEnableRLSNotice.tsx +++ b/apps/studio/components/ui/AutoEnableRLSNotice.tsx @@ -15,7 +15,7 @@ import { DialogTitle, DialogTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { CodeBlock } from 'ui-patterns/CodeBlock' import { AUTO_ENABLE_RLS_EVENT_TRIGGER_SQL } from '@/components/interfaces/Database/Triggers/EventTriggersList/EventTriggers.constants' diff --git a/apps/studio/components/ui/EdgeFunctionBlock/EdgeFunctionBlock.tsx b/apps/studio/components/ui/EdgeFunctionBlock/EdgeFunctionBlock.tsx index 8591de05fc8df..ae71ae1b38c25 100644 --- a/apps/studio/components/ui/EdgeFunctionBlock/EdgeFunctionBlock.tsx +++ b/apps/studio/components/ui/EdgeFunctionBlock/EdgeFunctionBlock.tsx @@ -2,7 +2,7 @@ import { Code } from 'lucide-react' import Link from 'next/link' import type { DragEvent, ReactNode } from 'react' import { Button, cn } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { CodeBlock, type CodeBlockLang } from 'ui-patterns/CodeBlock' import { ReportBlockContainer } from '@/components/interfaces/Reports/ReportBlock/ReportBlockContainer' diff --git a/apps/studio/components/ui/EditorPanel/EditorPanel.tsx b/apps/studio/components/ui/EditorPanel/EditorPanel.tsx index f4a244209b22a..9df6699fcd01e 100644 --- a/apps/studio/components/ui/EditorPanel/EditorPanel.tsx +++ b/apps/studio/components/ui/EditorPanel/EditorPanel.tsx @@ -34,7 +34,7 @@ import { PopoverTrigger, SQL_ICON, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { CodeBlock } from 'ui-patterns/CodeBlock' import { containsUnknownFunction, isReadOnlySelect } from '../AIAssistantPanel/AIAssistant.utils' diff --git a/apps/studio/components/ui/ErrorBoundary/ClientSideExceptionHandler.tsx b/apps/studio/components/ui/ErrorBoundary/ClientSideExceptionHandler.tsx index f5e37a2d175b3..1b4534fa3925a 100644 --- a/apps/studio/components/ui/ErrorBoundary/ClientSideExceptionHandler.tsx +++ b/apps/studio/components/ui/ErrorBoundary/ClientSideExceptionHandler.tsx @@ -3,7 +3,7 @@ import { safeLocalStorage, safeSessionStorage } from 'common' import { ExternalLink } from 'lucide-react' import { useRouter } from 'next/router' import { Button, cn } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import CopyButton from '../CopyButton' import { InlineLinkClassName } from '../InlineLink' diff --git a/apps/studio/components/ui/HighAvailability/HighAvailabilityDisabledSectionNotice.tsx b/apps/studio/components/ui/HighAvailability/HighAvailabilityDisabledSectionNotice.tsx index 50188ff985610..29e7c1f7eeea9 100644 --- a/apps/studio/components/ui/HighAvailability/HighAvailabilityDisabledSectionNotice.tsx +++ b/apps/studio/components/ui/HighAvailability/HighAvailabilityDisabledSectionNotice.tsx @@ -1,5 +1,5 @@ import type { ReactNode } from 'react' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { useHighAvailability } from '@/hooks/misc/useHighAvailability' diff --git a/apps/studio/components/ui/HighQueryCost.tsx b/apps/studio/components/ui/HighQueryCost.tsx index 4d9432f08ef23..eb78467da387e 100644 --- a/apps/studio/components/ui/HighQueryCost.tsx +++ b/apps/studio/components/ui/HighQueryCost.tsx @@ -14,7 +14,7 @@ import { TooltipContent, TooltipTrigger, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { DocsButton } from './DocsButton' import { InlineLinkClassName } from './InlineLink' diff --git a/apps/studio/components/ui/NoPermission.tsx b/apps/studio/components/ui/NoPermission.tsx index 90d8c3c32bd11..e736079d8901c 100644 --- a/apps/studio/components/ui/NoPermission.tsx +++ b/apps/studio/components/ui/NoPermission.tsx @@ -1,4 +1,4 @@ -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' interface NoPermissionProps { resourceText: string diff --git a/apps/studio/components/ui/ProjectUpgradeFailedBanner.tsx b/apps/studio/components/ui/ProjectUpgradeFailedBanner.tsx index 53b24331c066a..510c2c8fcaa64 100644 --- a/apps/studio/components/ui/ProjectUpgradeFailedBanner.tsx +++ b/apps/studio/components/ui/ProjectUpgradeFailedBanner.tsx @@ -4,7 +4,7 @@ import { LOCAL_STORAGE_KEYS, useParams } from 'common' import dayjs from 'dayjs' import { X } from 'lucide-react' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ButtonTooltip } from './ButtonTooltip' import { InlineLink } from './InlineLink' diff --git a/apps/studio/components/ui/SqlWarningAdmonition.tsx b/apps/studio/components/ui/SqlWarningAdmonition.tsx index d8cb41f532444..18f4e0a47db11 100644 --- a/apps/studio/components/ui/SqlWarningAdmonition.tsx +++ b/apps/studio/components/ui/SqlWarningAdmonition.tsx @@ -1,5 +1,5 @@ import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' export interface SqlWarningAdmonitionProps { warningType: 'hasWriteOperation' | 'hasUnknownFunctions' diff --git a/apps/studio/components/ui/UnknownInterface.tsx b/apps/studio/components/ui/UnknownInterface.tsx index fcbf30d68f8f3..92b565f0ab22b 100644 --- a/apps/studio/components/ui/UnknownInterface.tsx +++ b/apps/studio/components/ui/UnknownInterface.tsx @@ -1,6 +1,6 @@ import Link from 'next/link' import { Button, cn } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' export const UnknownInterface = ({ urlBack, diff --git a/apps/studio/components/ui/UpgradeToPro.tsx b/apps/studio/components/ui/UpgradeToPro.tsx index b8e6b0f81a046..4c8ddac9616df 100644 --- a/apps/studio/components/ui/UpgradeToPro.tsx +++ b/apps/studio/components/ui/UpgradeToPro.tsx @@ -1,6 +1,6 @@ import { ReactNode } from 'react' import { cn } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { DocsButton } from './DocsButton' import { UpgradePlanButton } from './UpgradePlanButton' diff --git a/apps/studio/data/content/content-id-query.ts b/apps/studio/data/content/content-id-query.ts index 681e7c645ca14..37547ab58fe51 100644 --- a/apps/studio/data/content/content-id-query.ts +++ b/apps/studio/data/content/content-id-query.ts @@ -2,7 +2,7 @@ import { useQuery } from '@tanstack/react-query' import { components } from 'api-types' import type { Content } from './content-query' -import { remapSqlContentField } from './content-remap' +import { remapSqlContentField, remapWireSnippet } from './content-remap' import { contentKeys } from './keys' import type { SnippetWithContent } from './sql-folders-query' import { get, handleError } from '@/data/fetchers' @@ -51,8 +51,7 @@ export async function getSqlSnippetById( }) if (error) throw handleError(error) - const snippet = remapSqlContentField(data as unknown as Omit) - return { ...snippet, status: 'saved' } + return remapWireSnippet(data, 'saved') } export type SqlSnippetByIdData = Awaited> diff --git a/apps/studio/data/content/content-remap.ts b/apps/studio/data/content/content-remap.ts index 63141b9bf2ba0..e3f4b397ef18f 100644 --- a/apps/studio/data/content/content-remap.ts +++ b/apps/studio/data/content/content-remap.ts @@ -7,6 +7,8 @@ // and logs SQL can never cross execution paths. Branding is per-type and never mixed. import { untrustedSql } from '@supabase/pg-meta' +import type { SnippetStatus } from './snippet-status' +import type { SnippetWithContent } from './sql-folders-query' import { untrustedLogSql } from '@/data/logs/safe-analytics-sql' function isSqlContentType(type: string): type is 'sql' | 'log_sql' { @@ -28,6 +30,17 @@ export function remapSqlContentFields(items: Array(item: T): T { if (!isSqlContentType(item.type)) return item diff --git a/apps/studio/data/content/content-upsert-mutation.ts b/apps/studio/data/content/content-upsert-mutation.ts index 26640dbb06679..8ce336b7684ba 100644 --- a/apps/studio/data/content/content-upsert-mutation.ts +++ b/apps/studio/data/content/content-upsert-mutation.ts @@ -2,9 +2,9 @@ import { useMutation, useQueryClient } from '@tanstack/react-query' import { toast } from 'sonner' import type { Content } from './content-query' -import { remapSqlContentField, unmapSqlContentField } from './content-remap' +import { remapWireSnippet, unmapSqlContentField } from './content-remap' import { contentKeys } from './keys' -import type { Snippet, SnippetWithContent } from './sql-folders-query' +import type { SnippetWithContent } from './sql-folders-query' import type { components } from '@/data/api' import { handleError, put } from '@/data/fetchers' import type { ResponseError, UseCustomMutationOptions } from '@/types' @@ -31,9 +31,9 @@ export async function upsertContent( signal, }) if (error) handleError(error) + if (!data) return null - const snippet = data as Snippet | null - return snippet === null ? null : { ...remapSqlContentField(snippet), status: 'saved' } + return remapWireSnippet(data, 'saved') } export type UpsertContentData = Awaited> diff --git a/apps/studio/data/content/sql-folders-query.ts b/apps/studio/data/content/sql-folders-query.ts index 36d31c6a505fc..85d2ec4b5b11a 100644 --- a/apps/studio/data/content/sql-folders-query.ts +++ b/apps/studio/data/content/sql-folders-query.ts @@ -4,7 +4,12 @@ import { components } from 'api-types' import { contentKeys } from './keys' import type { SnippetStatus } from './snippet-status' import { get, handleError } from '@/data/fetchers' -import type { ResponseError, SqlSnippets, UseCustomInfiniteQueryOptions } from '@/types' +import type { + LogSqlSnippets, + ResponseError, + SqlSnippets, + UseCustomInfiniteQueryOptions, +} from '@/types' export type SnippetFolderResponse = components['schemas']['GetUserContentFolderResponse']['data'] export type SnippetFolder = @@ -12,10 +17,25 @@ export type SnippetFolder = export type Snippet = components['schemas']['GetUserContentFolderResponse']['data']['contents'][number] -export interface SnippetWithContent extends Snippet { - content?: SqlSnippets.Content - status: SnippetStatus -} +// The SQL editor's loaded-snippet type. Discriminated on `type` so database SQL +// (`SqlSnippets.Content`, Postgres brand) and logs SQL (`LogSqlSnippets.Content`, +// logs brand) can never cross execution paths: reading `snippet.content.unchecked_sql` +// on the union yields the widened brand, forcing callers that need one specific +// brand to narrow on `type` first. The shared field names (`content_id`, +// `unchecked_sql`, `schema_version`) keep the many read sites that only need the +// SQL text compiling unchanged. +// +// `report` is included because the content endpoints' wire type carries it, but +// it deliberately has NO SQL content (`content?: never`): report bodies are +// `Dashboards.Content` and are loaded through the separate `Content` union +// (data/content/content-query.ts), never with SQL here. Modelling it as `never` +// (rather than reusing `SqlSnippets.Content`) keeps that honest while letting the +// broadly-typed rows the content/folder queries return assign without a cast. +export type SnippetWithContent = Omit & { status: SnippetStatus } & ( + | { type: 'sql'; content?: SqlSnippets.Content } + | { type: 'log_sql'; content?: LogSqlSnippets.Content } + | { type: 'report'; content?: never } + ) // Attaches the 'saved' lifecycle status to a snippet as it crosses from the // database into the app. Generic so it preserves any loaded content on the diff --git a/apps/studio/data/content/sql-snippets-query.ts b/apps/studio/data/content/sql-snippets-query.ts index afd112f9535c8..ef4aac6673c34 100644 --- a/apps/studio/data/content/sql-snippets-query.ts +++ b/apps/studio/data/content/sql-snippets-query.ts @@ -3,9 +3,9 @@ import { InfiniteData, useInfiniteQuery } from '@tanstack/react-query' import { Content } from './content-query' import { remapSqlContentFields } from './content-remap' import { contentKeys } from './keys' -import { SNIPPET_PAGE_LIMIT, withSavedStatus, type Snippet } from './sql-folders-query' +import { SNIPPET_PAGE_LIMIT, withSavedStatus, type SnippetWithContent } from './sql-folders-query' import { get } from '@/data/fetchers' -import type { SqlSnippets, UseCustomInfiniteQueryOptions } from '@/types' +import type { UseCustomInfiniteQueryOptions } from '@/types' export type SqlSnippet = Extract @@ -49,9 +49,7 @@ export async function getSqlSnippets( throw error } - const snippets = remapSqlContentFields( - data.data as unknown as Array - ) + const snippets = remapSqlContentFields(data.data as unknown as SnippetWithContent[]) return { cursor: data.cursor, contents: snippets.map(withSavedStatus), diff --git a/apps/studio/pages/account/security.tsx b/apps/studio/pages/account/security.tsx index c52cf4547289b..db7ec4be0b798 100644 --- a/apps/studio/pages/account/security.tsx +++ b/apps/studio/pages/account/security.tsx @@ -1,6 +1,6 @@ import { Lock } from 'lucide-react' import { Badge, Card, CardContent, CardHeader } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { PageContainer } from 'ui-patterns/PageContainer' import { PageHeader, diff --git a/apps/studio/pages/claim-project.tsx b/apps/studio/pages/claim-project.tsx index 25cc7aa8e7ea8..1ba8c0bfd3d4b 100644 --- a/apps/studio/pages/claim-project.tsx +++ b/apps/studio/pages/claim-project.tsx @@ -1,7 +1,7 @@ import { useParams } from 'common' import Head from 'next/head' import { PropsWithChildren, useMemo, useState } from 'react' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { ProjectClaimBenefits } from '@/components/interfaces/Organization/ProjectClaim/benefits' diff --git a/apps/studio/pages/cli/login.tsx b/apps/studio/pages/cli/login.tsx index 3ef79b48dd92c..e663e16ca980b 100644 --- a/apps/studio/pages/cli/login.tsx +++ b/apps/studio/pages/cli/login.tsx @@ -5,7 +5,7 @@ import Link from 'next/link' import { useRouter } from 'next/router' import { useEffect, useEffectEvent, useRef, useState, type ReactNode } from 'react' import { Button, Card, CardContent } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { diff --git a/apps/studio/pages/integrations/vercel/install.tsx b/apps/studio/pages/integrations/vercel/install.tsx index 7eea86d25b10c..fb2365a97304b 100644 --- a/apps/studio/pages/integrations/vercel/install.tsx +++ b/apps/studio/pages/integrations/vercel/install.tsx @@ -15,7 +15,7 @@ import { SelectTrigger, SelectValue, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { diff --git a/apps/studio/pages/org/[slug]/index.tsx b/apps/studio/pages/org/[slug]/index.tsx index 4673219bb6c7a..26fbcb40c3a9e 100644 --- a/apps/studio/pages/org/[slug]/index.tsx +++ b/apps/studio/pages/org/[slug]/index.tsx @@ -1,7 +1,7 @@ import { useIsMFAEnabled } from 'common' import Link from 'next/link' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ProjectList } from '@/components/interfaces/Home/ProjectList/ProjectList' import { HomePageActions } from '@/components/interfaces/HomePageActions' diff --git a/apps/studio/pages/partners/stripe/projects/login.tsx b/apps/studio/pages/partners/stripe/projects/login.tsx index bb1afc2a829d0..20ea5f7d6527a 100644 --- a/apps/studio/pages/partners/stripe/projects/login.tsx +++ b/apps/studio/pages/partners/stripe/projects/login.tsx @@ -5,7 +5,7 @@ import Head from 'next/head' import { useRouter } from 'next/router' import { useEffect } from 'react' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' import { diff --git a/apps/studio/pages/project/[ref]/auth/templates/[templateId].tsx b/apps/studio/pages/project/[ref]/auth/templates/[templateId].tsx index 93a4c95abb0be..4f5254f12f861 100644 --- a/apps/studio/pages/project/[ref]/auth/templates/[templateId].tsx +++ b/apps/studio/pages/project/[ref]/auth/templates/[templateId].tsx @@ -21,7 +21,7 @@ import { FormField, Switch, } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { PageContainer } from 'ui-patterns/PageContainer' import { diff --git a/apps/studio/pages/project/[ref]/database/backups/pitr.tsx b/apps/studio/pages/project/[ref]/database/backups/pitr.tsx index 1c7d72cbf30ce..f62c4ffa2770c 100644 --- a/apps/studio/pages/project/[ref]/database/backups/pitr.tsx +++ b/apps/studio/pages/project/[ref]/database/backups/pitr.tsx @@ -2,7 +2,7 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' import { AlertCircle, DatabaseBackup } from 'lucide-react' import { Alert, AlertDescription, AlertTitle } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { PageContainer } from 'ui-patterns/PageContainer' import { PageHeader, diff --git a/apps/studio/pages/project/[ref]/database/backups/scheduled.tsx b/apps/studio/pages/project/[ref]/database/backups/scheduled.tsx index dd77bf41bda33..547e0018607ac 100644 --- a/apps/studio/pages/project/[ref]/database/backups/scheduled.tsx +++ b/apps/studio/pages/project/[ref]/database/backups/scheduled.tsx @@ -1,7 +1,7 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useParams } from 'common' import { Info } from 'lucide-react' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { PageContainer } from 'ui-patterns/PageContainer' import { PageHeader, diff --git a/apps/studio/pages/project/[ref]/functions/index.tsx b/apps/studio/pages/project/[ref]/functions/index.tsx index 9f6d74bc2fa97..b0a026a30a45a 100644 --- a/apps/studio/pages/project/[ref]/functions/index.tsx +++ b/apps/studio/pages/project/[ref]/functions/index.tsx @@ -4,7 +4,7 @@ import { useRouter } from 'next/router' import { parseAsString, parseAsStringLiteral, useQueryState } from 'nuqs' import React, { useMemo, useRef, type PropsWithChildren } from 'react' import { Button, Card, Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { Input } from 'ui-patterns/DataInputs/Input' import { PageContainer } from 'ui-patterns/PageContainer' import { diff --git a/apps/studio/pages/project/[ref]/functions/secrets.tsx b/apps/studio/pages/project/[ref]/functions/secrets.tsx index de49ba0b3c986..9f1afd218946e 100644 --- a/apps/studio/pages/project/[ref]/functions/secrets.tsx +++ b/apps/studio/pages/project/[ref]/functions/secrets.tsx @@ -1,5 +1,5 @@ import type { PropsWithChildren } from 'react' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { PageContainer } from 'ui-patterns/PageContainer' import { PageHeader, diff --git a/apps/studio/pages/project/[ref]/integrations/[id]/[pageId]/[childId]/index.tsx b/apps/studio/pages/project/[ref]/integrations/[id]/[pageId]/[childId]/index.tsx index 2e88ba89ded54..ffd3ad8e31845 100644 --- a/apps/studio/pages/project/[ref]/integrations/[id]/[pageId]/[childId]/index.tsx +++ b/apps/studio/pages/project/[ref]/integrations/[id]/[pageId]/[childId]/index.tsx @@ -1,7 +1,7 @@ import { useParams } from 'common' import { useRouter } from 'next/router' import { useEffect, useMemo } from 'react' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { PageContainer } from 'ui-patterns/PageContainer' import { PageHeader, diff --git a/apps/studio/pages/project/[ref]/merge.tsx b/apps/studio/pages/project/[ref]/merge.tsx index 3200df9cf704b..f662734cac269 100644 --- a/apps/studio/pages/project/[ref]/merge.tsx +++ b/apps/studio/pages/project/[ref]/merge.tsx @@ -5,7 +5,7 @@ import { useRouter } from 'next/router' import { useCallback, useEffect, useMemo, useState } from 'react' import { toast } from 'sonner' import { Button, cn, NavMenu, NavMenuItem } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ConfirmationModal } from 'ui-patterns/Dialogs/ConfirmationModal' import { useIsPgDeltaDiffEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext' diff --git a/apps/studio/pages/project/[ref]/observability/query-performance.tsx b/apps/studio/pages/project/[ref]/observability/query-performance.tsx index d3ffbb10055b6..00f6b34768a27 100644 --- a/apps/studio/pages/project/[ref]/observability/query-performance.tsx +++ b/apps/studio/pages/project/[ref]/observability/query-performance.tsx @@ -1,6 +1,6 @@ import { useParams } from 'common' import { parseAsArrayOf, parseAsInteger, parseAsJson, parseAsString, useQueryStates } from 'nuqs' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { OBSERVABILITY_DOCS_HREFS } from '@/components/interfaces/Observability/Observability.constants' import { useIndexAdvisorStatus } from '@/components/interfaces/QueryPerformance/hooks/useIsIndexAdvisorStatus' diff --git a/apps/studio/pages/project/[ref]/settings/api-keys/index.tsx b/apps/studio/pages/project/[ref]/settings/api-keys/index.tsx index 3e895b1ba5514..6e9cd5389c708 100644 --- a/apps/studio/pages/project/[ref]/settings/api-keys/index.tsx +++ b/apps/studio/pages/project/[ref]/settings/api-keys/index.tsx @@ -2,7 +2,7 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { IS_PLATFORM, useParams } from 'common' import { useMemo } from 'react' import { Separator } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { ApiKeysCreateCallout, diff --git a/apps/studio/pages/project/[ref]/sql/[id].tsx b/apps/studio/pages/project/[ref]/sql/[id].tsx index 9657ec98a0b58..f40ea989fbfd9 100644 --- a/apps/studio/pages/project/[ref]/sql/[id].tsx +++ b/apps/studio/pages/project/[ref]/sql/[id].tsx @@ -5,7 +5,7 @@ import { useRouter } from 'next/router' import { useEffect } from 'react' import { toast } from 'sonner' import { Button } from 'ui' -import { Admonition } from 'ui-patterns/admonition' +import { Admonition } from 'ui-patterns/Admonition' import { SQLEditor } from '@/components/interfaces/SQLEditor/SQLEditor' import { generateSnippetTitle } from '@/components/interfaces/SQLEditor/SQLEditor.constants' diff --git a/apps/studio/state/sql-editor/sql-editor-rules.test.ts b/apps/studio/state/sql-editor/sql-editor-rules.test.ts index 0f8ec256e6a5e..a46f443f61d44 100644 --- a/apps/studio/state/sql-editor/sql-editor-rules.test.ts +++ b/apps/studio/state/sql-editor/sql-editor-rules.test.ts @@ -10,11 +10,35 @@ import { type LoadedSnippet, } from './sql-editor-rules' import type { SnippetWithContent } from '@/data/content/sql-folders-query' +import { untrustedLogSql } from '@/data/logs/safe-analytics-sql' -function makeSnippet(overrides: Omit, 'content'> = {}): LoadedSnippet { +function makeLogSnippet(): LoadedSnippet { + return { + id: 'log-snippet-1', + name: 'My Logs Query', + description: '', + visibility: 'user', + project_id: 42, + owner_id: 7, + folder_id: null, + favorite: false, + status: 'saved', + inserted_at: '2024-01-01T00:00:00.000Z', + updated_at: '2024-01-01T00:00:00.000Z', + type: 'log_sql', + content: { + content_id: 'log-snippet-1', + schema_version: '1', + unchecked_sql: untrustedLogSql('select * from logs'), + }, + } +} + +function makeSnippet( + overrides: Omit, 'content' | 'type'> = {} +): LoadedSnippet { return { id: 'snippet-1', - type: 'sql', name: 'My Query', description: 'A description', visibility: 'user', @@ -26,6 +50,7 @@ function makeSnippet(overrides: Omit, 'content'> = { inserted_at: '2024-01-01T00:00:00.000Z', updated_at: '2024-01-01T00:00:00.000Z', ...overrides, + type: 'sql', content: { content_id: 'snippet-1', schema_version: '1', @@ -96,6 +121,17 @@ describe('validateMoveToFolder', () => { }) describe('buildUpsertPayload', () => { + it('emits the snippet type — sql for a database snippet', () => { + const payload = buildUpsertPayload(makeSnippet(), 'snippet-1') + expect(payload.type).toBe('sql') + }) + + it('emits the snippet type — log_sql for a logs snippet (not silently rewritten to sql)', () => { + const payload = buildUpsertPayload(makeLogSnippet(), 'log-snippet-1') + expect(payload.type).toBe('log_sql') + expect((payload.content as { content_id: string }).content_id).toBe('log-snippet-1') + }) + it('passes through provided values', () => { const snippet = makeSnippet() const payload = buildUpsertPayload(snippet, 'snippet-1') diff --git a/apps/studio/state/sql-editor/sql-editor-rules.ts b/apps/studio/state/sql-editor/sql-editor-rules.ts index b1c52682d28ed..2702e251b5d31 100644 --- a/apps/studio/state/sql-editor/sql-editor-rules.ts +++ b/apps/studio/state/sql-editor/sql-editor-rules.ts @@ -51,7 +51,7 @@ export function buildUpsertPayload(snippet: LoadedSnippet, id: string): UpsertCo snippet return { id, - type: 'sql', + type: snippet.type, name: name ?? 'Untitled', description: description ?? '', visibility: visibility ?? 'user', diff --git a/apps/studio/state/sql-editor/sql-editor-save-scheduler.test.ts b/apps/studio/state/sql-editor/sql-editor-save-scheduler.test.ts index 00dc272a8043f..ba39dbda6d4ff 100644 --- a/apps/studio/state/sql-editor/sql-editor-save-scheduler.test.ts +++ b/apps/studio/state/sql-editor/sql-editor-save-scheduler.test.ts @@ -5,11 +5,16 @@ import { afterEach, describe, expect, it, vi } from 'vitest' import { createSaveScheduler, type SaveMode } from './sql-editor-save-scheduler' import type { StateSnippet, StateSnippetFolder } from './types' +import type { SqlSnippets } from '@/types' // Valtio notifies subscribers on a microtask; flush past it before asserting. const flush = () => new Promise((resolve) => setTimeout(resolve, 0)) -function makeStateSnippet(overrides: Partial = {}): StateSnippet { +function makeStateSnippet( + overrides: Omit, 'type' | 'content'> & { + content?: SqlSnippets.Content + } = {} +): StateSnippet { return { projectRef: 'ref', splitSizes: [50, 50], diff --git a/apps/studio/state/sql-editor/sql-editor-save.test.ts b/apps/studio/state/sql-editor/sql-editor-save.test.ts index 506dbfcc7edff..30f5a6da77f11 100644 --- a/apps/studio/state/sql-editor/sql-editor-save.test.ts +++ b/apps/studio/state/sql-editor/sql-editor-save.test.ts @@ -4,8 +4,13 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { createSaveMechanism, type SaveMechanismStore } from './sql-editor-save' import type { StateSnippet } from './types' import type { SnippetFolder } from '@/data/content/sql-folders-query' +import type { SqlSnippets } from '@/types' -function makeStateSnippet(overrides: Partial = {}): StateSnippet { +function makeStateSnippet( + overrides: Omit, 'type' | 'content'> & { + content?: SqlSnippets.Content + } = {} +): StateSnippet { return { projectRef: 'ref', splitSizes: [50, 50], diff --git a/apps/studio/state/sql-editor/sql-editor-session-state.ts b/apps/studio/state/sql-editor/sql-editor-session-state.ts index 338e7eb365146..38aeafc030c19 100644 --- a/apps/studio/state/sql-editor/sql-editor-session-state.ts +++ b/apps/studio/state/sql-editor/sql-editor-session-state.ts @@ -1,10 +1,12 @@ import { proxy, ref, snapshot, useSnapshot } from 'valtio' +import type { LogDateRange } from '@/components/interfaces/SQLEditor/querySource' + /** - * Ephemeral, per-session SQL editor state that is NOT persisted: query results - * and the row limit. Kept separate from the snippet/folder store (which deals - * with persistence) because none of this is saved — it lives only for the - * current editing session. + * Ephemeral, per-session SQL editor state that is NOT persisted: query results, + * the row limit, and the per-snippet logs time range. Kept separate from the + * snippet/folder store (which deals with persistence) because none of this is + * saved — it lives only for the current editing session. */ export const sqlEditorSessionState = proxy({ /** @@ -29,6 +31,18 @@ export const sqlEditorSessionState = proxy({ setLimit: (value: number) => (sqlEditorSessionState.limit = value), + /** + * The logs time range for a logs snippet, keyed by snippet id. Session state — + * never written to snippet content — so it works on read-only shared snippets + * and resets on reload. An unset snippet has no entry; read sites fall back to + * `DEFAULT_LOG_DATE_RANGE`. + */ + logRange: {} as { [snippetId: string]: LogDateRange }, + + setLogRange: (id: string, range: LogDateRange) => { + sqlEditorSessionState.logRange[id] = range + }, + addResult: (id: string, results: any[], autoLimit?: number) => { // Use ref() to prevent Valtio from creating proxies for each row object. // This is critical for large result sets - without ref(), Valtio wraps every @@ -49,6 +63,7 @@ export const sqlEditorSessionState = proxy({ /** Drop all session state for a snippet (called when the snippet is removed). */ clearForSnippet: (id: string) => { delete sqlEditorSessionState.results[id] + delete sqlEditorSessionState.logRange[id] }, }) diff --git a/apps/studio/state/sql-editor/sql-editor-state.test.ts b/apps/studio/state/sql-editor/sql-editor-state.test.ts index ba59013f006cc..3bceae2105a24 100644 --- a/apps/studio/state/sql-editor/sql-editor-state.test.ts +++ b/apps/studio/state/sql-editor/sql-editor-state.test.ts @@ -3,14 +3,36 @@ import { beforeEach, describe, expect, it } from 'vitest' import { sqlEditorState } from './sql-editor-state' import type { SnippetWithContent } from '@/data/content/sql-folders-query' +import { untrustedLogSql } from '@/data/logs/safe-analytics-sql' + +function makeLogSnippet(id: string): SnippetWithContent { + return { + id, + name: 'My Logs Query', + description: '', + visibility: 'user', + project_id: 42, + owner_id: 7, + folder_id: null, + favorite: false, + status: 'saved', + inserted_at: '2024-01-01T00:00:00.000Z', + updated_at: '2024-01-01T00:00:00.000Z', + type: 'log_sql', + content: { + content_id: id, + schema_version: '1', + unchecked_sql: untrustedLogSql('select * from logs'), + }, + } +} function makeSnippet( id: string, - overrides: Omit, 'content'> = {} + overrides: Omit, 'content' | 'type'> = {} ): SnippetWithContent { return { id, - type: 'sql', name: 'My Query', description: 'A description', visibility: 'user', @@ -22,6 +44,7 @@ function makeSnippet( inserted_at: '2024-01-01T00:00:00.000Z', updated_at: '2024-01-01T00:00:00.000Z', ...overrides, + type: 'sql', content: { content_id: id, schema_version: '1', @@ -70,3 +93,32 @@ describe('addFavorite / removeFavorite', () => { expect(sqlEditorState.needsSaving.has('missing')).toBe(false) }) }) + +describe('setSql — source-aware branding', () => { + beforeEach(() => { + for (const id of Object.keys(sqlEditorState.snippets)) { + delete sqlEditorState.snippets[id] + } + sqlEditorState.needsSaving.clear() + }) + + it('updates the SQL of a database snippet and marks it for saving', () => { + sqlEditorState.addSnippet({ projectRef: 'ref', snippet: makeSnippet('db-1') }) + + sqlEditorState.setSql({ id: 'db-1', sql: 'select 2' }) + + expect(sqlEditorState.snippets['db-1'].snippet.content?.unchecked_sql).toBe('select 2') + expect(sqlEditorState.needsSaving.has('db-1')).toBe(true) + }) + + it('updates the SQL of a logs snippet and marks it for saving', () => { + sqlEditorState.addSnippet({ projectRef: 'ref', snippet: makeLogSnippet('logs-1') }) + + sqlEditorState.setSql({ id: 'logs-1', sql: 'select count(*) from logs' }) + + expect(sqlEditorState.snippets['logs-1'].snippet.content?.unchecked_sql).toBe( + 'select count(*) from logs' + ) + expect(sqlEditorState.needsSaving.has('logs-1')).toBe(true) + }) +}) diff --git a/apps/studio/state/sql-editor/sql-editor-state.ts b/apps/studio/state/sql-editor/sql-editor-state.ts index c0073c6df9f74..c3519a75ea84a 100644 --- a/apps/studio/state/sql-editor/sql-editor-state.ts +++ b/apps/studio/state/sql-editor/sql-editor-state.ts @@ -14,6 +14,7 @@ import { sqlEditorSessionState } from './sql-editor-session-state' import type { StateSnippet, StateSnippetFolder } from './types' import type { SnippetWithContent } from '@/data/content/sql-folders-query' import { Snippet, SnippetFolder } from '@/data/content/sql-folders-query' +import { untrustedLogSql } from '@/data/logs/safe-analytics-sql' export const sqlEditorState = proxy({ // ======================================================================== @@ -84,7 +85,7 @@ export const sqlEditorState = proxy({ skipSave = false, }: { id: string - snippet: Partial + snippet: Omit, 'type'> skipSave?: boolean }) => { if (sqlEditorState.snippets[id]) { @@ -127,7 +128,11 @@ export const sqlEditorState = proxy({ }) => { let snippet = sqlEditorState.snippets[id]?.snippet if (snippet?.content) { - snippet.content.unchecked_sql = untrustedSql(sql) + if (snippet.type === 'log_sql') { + snippet.content.unchecked_sql = untrustedLogSql(sql) + } else { + snippet.content.unchecked_sql = untrustedSql(sql) + } // Mark dirty immediately so `status` (not the transient needsSaving queue) // is the durable source of truth for unsaved changes, even before the // debounced save begins. diff --git a/apps/studio/tests/features/logs/Logs.Datepickers.test.tsx b/apps/studio/tests/features/logs/Logs.Datepickers.test.tsx index 654a4d52a8c0c..09e328d5f4ec5 100644 --- a/apps/studio/tests/features/logs/Logs.Datepickers.test.tsx +++ b/apps/studio/tests/features/logs/Logs.Datepickers.test.tsx @@ -11,9 +11,9 @@ import { generateDynamicHelper, generateDynamicHelpers, generateHelpersFromInput, - LogsDatePicker, parseCustomInput, -} from '@/components/interfaces/Settings/Logs/Logs.DatePickers' +} from '@/components/interfaces/Settings/Logs/Logs.datePickerHelpers' +import { LogsDatePicker } from '@/components/interfaces/Settings/Logs/Logs.DatePickers' import { DatetimeHelper } from '@/components/interfaces/Settings/Logs/Logs.types' dayjs.extend(timezone) diff --git a/apps/studio/tests/lib/sql-editor-test-utils.tsx b/apps/studio/tests/lib/sql-editor-test-utils.tsx index 3be4957d80b96..0f4a6cf855e24 100644 --- a/apps/studio/tests/lib/sql-editor-test-utils.tsx +++ b/apps/studio/tests/lib/sql-editor-test-utils.tsx @@ -5,6 +5,7 @@ import { http, HttpResponse } from 'msw' import { NuqsTestingAdapter } from 'nuqs/adapters/testing' import type { ReactNode } from 'react' +import type { SqlSnippetSource } from '@/components/interfaces/SQLEditor/querySource' import type { ContentDiff, DiffController, @@ -147,6 +148,7 @@ export function seedSnippet({ sql = '', ownerId = 1, projectId = 1, + source = 'database', }: { id: string projectRef?: string @@ -154,6 +156,7 @@ export function seedSnippet({ sql?: string ownerId?: number projectId?: number + source?: SqlSnippetSource }) { const snippet = createSqlSnippetSkeletonV2({ name, @@ -161,6 +164,7 @@ export function seedSnippet({ owner_id: ownerId, project_id: projectId, idOverride: id, + source, }) sqlEditorState.addSnippet({ projectRef, snippet }) return snippet diff --git a/apps/www/app/(home)/layout.tsx b/apps/www/app/(home)/layout.tsx index 61677b56677b0..0e005f310f9c2 100644 --- a/apps/www/app/(home)/layout.tsx +++ b/apps/www/app/(home)/layout.tsx @@ -1,15 +1,19 @@ import Footer from '~/components/Footer' import Nav from '~/components/Nav' +import { SkipToContent } from 'ui-patterns/SkipToContent' import { ThemeForcer } from './ThemeForcer' export default function HomeLayout({ children }: { children: React.ReactNode }) { return ( <> +