diff --git a/frontend/e2e/DbManagerPage.ts b/frontend/e2e/DbManagerPage.ts index 5c79a1177b..861a37c868 100644 --- a/frontend/e2e/DbManagerPage.ts +++ b/frontend/e2e/DbManagerPage.ts @@ -1,11 +1,14 @@ // Assumes the db manager was already opened import { expect, Page } from '@playwright/test' +import type { DbFeatures } from '../src/lib/components/apps/components/display/dbtable/dbFeatures' export class DbManagerPage { page: Page - constructor(page: Page) { + features: DbFeatures + constructor(page: Page, features: DbFeatures) { this.page = page + this.features = features } async runTest() { diff --git a/frontend/e2e/datatable.spec.ts b/frontend/e2e/datatable.spec.ts index 5ce90460b1..6dac483a89 100644 --- a/frontend/e2e/datatable.spec.ts +++ b/frontend/e2e/datatable.spec.ts @@ -1,5 +1,6 @@ import { test, expect, Page } from '@playwright/test' import { DbManagerPage } from './DbManagerPage' +import { getDbFeatures } from '../src/lib/components/apps/components/display/dbtable/dbFeatures' async function setupNewDataTable(page: Page): Promise<{ datatableId: string }> { // Generate unique ID with timestamp @@ -78,6 +79,9 @@ test('create new data table, add a new table, CRUD rows and delete the table', a const lastRow = table.locator('tr').nth(-2) lastRow.locator('button:has-text("Manage")').click() - let dbManagerPage = new DbManagerPage(page) + let dbManagerPage = new DbManagerPage( + page, + getDbFeatures({ type: 'database', resourceType: 'postgresql', resourcePath: '' }) + ) await dbManagerPage.runTest() }) diff --git a/frontend/src/lib/components/DBManager.svelte b/frontend/src/lib/components/DBManager.svelte index b75df41af3..5c5ce7608d 100644 --- a/frontend/src/lib/components/DBManager.svelte +++ b/frontend/src/lib/components/DBManager.svelte @@ -4,7 +4,7 @@ import { Pane, Splitpanes } from 'svelte-splitpanes' import { ClearableInput, Drawer, DrawerContent } from './common' import { sendUserToast } from '$lib/toast' - import { type ColumnDef, type DbFeatures } from './apps/components/display/dbtable/utils' + import { type ColumnDef } from './apps/components/display/dbtable/utils' import DBTable from './DBTable.svelte' import type { IDbSchemaOps, IDbTableOps } from './dbOps' import DropdownV2 from './DropdownV2.svelte' @@ -22,6 +22,7 @@ } from './apps/components/display/dbtable/queries/alterTable' import { resource } from 'runed' import { capitalize, onlyAlphaNumAndUnderscore, pluralize } from '$lib/utils' + import type { DbFeatures } from './apps/components/display/dbtable/dbFeatures' /** Represents a selected table with its schema */ export interface SelectedTable { diff --git a/frontend/src/lib/components/DBManagerContent.svelte b/frontend/src/lib/components/DBManagerContent.svelte index 470401cef3..2e81ca71eb 100644 --- a/frontend/src/lib/components/DBManagerContent.svelte +++ b/frontend/src/lib/components/DBManagerContent.svelte @@ -2,11 +2,7 @@ import { dbSchemas, workspaceStore, type DBSchema } from '$lib/stores' import { sendUserToast, sortArray } from '$lib/utils' import { Loader2 } from 'lucide-svelte' - import { - dbSupportsSchemas, - getDbFeatures, - type TableMetadata - } from './apps/components/display/dbtable/utils' + import { dbSupportsSchemas, type TableMetadata } from './apps/components/display/dbtable/utils' import DbManager from './DBManager.svelte' import { dbSchemaOpsWithPreviewScripts, @@ -26,6 +22,7 @@ } from './apps/components/display/dbtable/metadata' import type { SelectedTable } from './DBManager.svelte' + import { getDbFeatures } from './apps/components/display/dbtable/dbFeatures' interface Props { input?: DbInput diff --git a/frontend/src/lib/components/DBTableEditor.svelte b/frontend/src/lib/components/DBTableEditor.svelte index e2a52fb454..f1897e0442 100644 --- a/frontend/src/lib/components/DBTableEditor.svelte +++ b/frontend/src/lib/components/DBTableEditor.svelte @@ -45,11 +45,7 @@ import { Cell } from './table' import DataTable from './table/DataTable.svelte' import Head from './table/Head.svelte' - import { - datatypeHasLength, - dbSupportsSchemas, - type DbFeatures - } from './apps/components/display/dbtable/utils' + import { datatypeHasLength, dbSupportsSchemas } from './apps/components/display/dbtable/utils' import { DB_TYPES } from '$lib/consts' import Popover from './meltComponents/Popover.svelte' import Tooltip from './meltComponents/Tooltip.svelte' @@ -70,6 +66,7 @@ datatypeDefaultLength } from './apps/components/display/dbtable/tableEditor' import Alert from './common/alert/Alert.svelte' + import type { DbFeatures } from './apps/components/display/dbtable/dbFeatures' type Props = { dbType: DbType diff --git a/frontend/src/lib/components/apps/components/display/dbtable/dbFeatures.ts b/frontend/src/lib/components/apps/components/display/dbtable/dbFeatures.ts new file mode 100644 index 0000000000..9905a2ce8e --- /dev/null +++ b/frontend/src/lib/components/apps/components/display/dbtable/dbFeatures.ts @@ -0,0 +1,31 @@ +// Separate file to import in both frontend and e2e + +import type { DbInput } from '../../../../dbTypes' + +export type DbFeatures = { + foreignKeys?: boolean + primaryKeys?: boolean + defaultValues?: boolean + defaultToNotNull?: boolean +} + +export function getDbFeatures(dbInput: DbInput): Required { + const def: Required = { + foreignKeys: true, + primaryKeys: true, + defaultValues: true, + defaultToNotNull: true + } + + if (dbInput.type == 'ducklake') return { ...def, foreignKeys: false, primaryKeys: false } + + if (dbInput.resourceType == 'bigquery') + return { + foreignKeys: false, + primaryKeys: true, + defaultValues: false, + defaultToNotNull: false + } + + return { ...def } +} diff --git a/frontend/src/lib/components/apps/components/display/dbtable/utils.ts b/frontend/src/lib/components/apps/components/display/dbtable/utils.ts index 4ac6421037..bfec141cea 100644 --- a/frontend/src/lib/components/apps/components/display/dbtable/utils.ts +++ b/frontend/src/lib/components/apps/components/display/dbtable/utils.ts @@ -7,7 +7,7 @@ import { type IntrospectionQuery } from 'graphql' -import type { DbInput, DbType } from '$lib/components/dbTypes' +import type { DbType } from '$lib/components/dbTypes' export enum ColumnIdentity { ByDefault = 'By Default', @@ -428,31 +428,3 @@ export function sqlDataTypeToJsTypeHeuristic(datatype: string): string { return 'any' } } - -export type DbFeatures = { - foreignKeys?: boolean - primaryKeys?: boolean - defaultValues?: boolean - defaultToNotNull?: boolean -} - -export function getDbFeatures(dbInput: DbInput): Required { - const def: Required = { - foreignKeys: true, - primaryKeys: true, - defaultValues: true, - defaultToNotNull: true - } - - if (dbInput.type == 'ducklake') return { ...def, foreignKeys: false, primaryKeys: false } - - if (dbInput.resourceType == 'bigquery') - return { - foreignKeys: false, - primaryKeys: true, - defaultValues: false, - defaultToNotNull: false - } - - return { ...def } -}