From a274fd85bcfb55c67f41a4781ff7a6247fda11a4 Mon Sep 17 00:00:00 2001 From: Diego Imbert Date: Fri, 4 Sep 2026 12:36:53 +0200 Subject: [PATCH] fix(datatables): a role belongs to the data table it was chosen on MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit An app's default data table can be changed after it is created, and both editors that change it kept the role picked for the previous one — so its queries named a role that data table has never heard of. The rule is one function now, used by both, and the selector lists schemas as the role rather than as whatever the data table resolves to by default. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01S5arH3G2Sa1Qqm32veJQ1n --- backend/ee-repo-ref.txt | 2 +- .../chat/DatatableCreationPolicy.svelte | 12 +++- .../raw_apps/DefaultDatabaseSelector.svelte | 11 +++- .../raw_apps/RawAppDataTableList.svelte | 4 ++ .../components/raw_apps/RawAppEditor.svelte | 7 ++- .../components/raw_apps/RawAppSidebar.svelte | 3 + .../raw_apps/datatableUtils.svelte.ts | 55 ++++++------------- .../raw_apps/datatableUtils.test.ts | 16 ++++++ 8 files changed, 63 insertions(+), 47 deletions(-) create mode 100644 frontend/src/lib/components/raw_apps/datatableUtils.test.ts diff --git a/backend/ee-repo-ref.txt b/backend/ee-repo-ref.txt index e6df7f7752..99c1bc506d 100644 --- a/backend/ee-repo-ref.txt +++ b/backend/ee-repo-ref.txt @@ -1 +1 @@ -4c6cbb234019db102c44a91ada36c4a197721aa4 +cc8e28e80bb352269c576ff82b8e679d7a505444 diff --git a/frontend/src/lib/components/copilot/chat/DatatableCreationPolicy.svelte b/frontend/src/lib/components/copilot/chat/DatatableCreationPolicy.svelte index 65abb0e1c5..6c89e79525 100644 --- a/frontend/src/lib/components/copilot/chat/DatatableCreationPolicy.svelte +++ b/frontend/src/lib/components/copilot/chat/DatatableCreationPolicy.svelte @@ -6,7 +6,10 @@ const aiChatManager = getAiChatManager() import DefaultDatabaseSelector from '$lib/components/raw_apps/DefaultDatabaseSelector.svelte' import { workspaceStore } from '$lib/stores' - import { createDatatablesResource } from '$lib/components/raw_apps/datatableUtils.svelte' + import { + createDatatablesResource, + roleAfterDatatableChange + } from '$lib/components/raw_apps/datatableUtils.svelte' // Load available datatables from workspace using shared utility const datatables = createDatatablesResource(() => $workspaceStore) @@ -37,8 +40,10 @@ } function handleDefaultChange(datatable: string | undefined, schema: string | undefined) { - aiChatManager.datatableCreationPolicy.datatable = datatable - aiChatManager.datatableCreationPolicy.schema = schema + const policy = aiChatManager.datatableCreationPolicy + policy.role = roleAfterDatatableChange(policy.datatable, datatable, policy.role) + policy.datatable = datatable + policy.schema = schema } @@ -67,6 +72,7 @@ diff --git a/frontend/src/lib/components/raw_apps/DefaultDatabaseSelector.svelte b/frontend/src/lib/components/raw_apps/DefaultDatabaseSelector.svelte index 66e3ab0355..16ca39841f 100644 --- a/frontend/src/lib/components/raw_apps/DefaultDatabaseSelector.svelte +++ b/frontend/src/lib/components/raw_apps/DefaultDatabaseSelector.svelte @@ -4,8 +4,8 @@ import Select from '$lib/components/select/Select.svelte' import { workspaceStore } from '$lib/stores' import { + createDatatableAccessResource, createDatatablesResource, - createSchemasResource, toDatatableItems, toSchemaItems } from './datatableUtils.svelte' @@ -20,6 +20,9 @@ datatable: string | undefined /** Currently selected schema */ schema: string | undefined + /** The data table role the app's queries run as, if it names one. What a + * role may see is what the schema list has to be read as. */ + role?: string | undefined /** Callback when either value changes */ onChange?: (datatable: string | undefined, schema: string | undefined) => void /** Description text to show in the popover */ @@ -29,19 +32,21 @@ let { datatable, schema, + role = undefined, onChange, description = 'Set the default datatable and schema for new tables. This is where AI will create new tables when needed.' }: Props = $props() // Load available datatables and schemas using shared utilities const datatables = createDatatablesResource(() => opWs) - const schemas = createSchemasResource( + const access = createDatatableAccessResource( () => datatable, + () => role, () => opWs ) const datatableItems = $derived(toDatatableItems(datatables.current)) - const schemaItems = $derived(toSchemaItems(schemas.current)) + const schemaItems = $derived(toSchemaItems(access.current.schemas)) // Track datatable changes to reset schema let previousDatatable = $state(undefined) diff --git a/frontend/src/lib/components/raw_apps/RawAppDataTableList.svelte b/frontend/src/lib/components/raw_apps/RawAppDataTableList.svelte index b874f37d17..a985ae410b 100644 --- a/frontend/src/lib/components/raw_apps/RawAppDataTableList.svelte +++ b/frontend/src/lib/components/raw_apps/RawAppDataTableList.svelte @@ -16,6 +16,8 @@ defaultDatatable?: string | undefined /** Default schema for new tables */ defaultSchema?: string | undefined + /** The data table role the app's queries run as, if it names one. */ + defaultRole?: string | undefined onAdd?: () => void onRemove?: (index: number) => void onSelect?: (ref: DataTableRef, index: number) => void @@ -31,6 +33,7 @@ dataTableRefs = [], defaultDatatable = undefined, defaultSchema = undefined, + defaultRole = undefined, onAdd, onRemove, onSelect, @@ -95,6 +98,7 @@ {/if} diff --git a/frontend/src/lib/components/raw_apps/RawAppEditor.svelte b/frontend/src/lib/components/raw_apps/RawAppEditor.svelte index 2b8f3b464f..43242dcd0d 100644 --- a/frontend/src/lib/components/raw_apps/RawAppEditor.svelte +++ b/frontend/src/lib/components/raw_apps/RawAppEditor.svelte @@ -1,4 +1,5 @@