From 23c2813b62554fa90aba570b5eaecb8218b34943 Mon Sep 17 00:00:00 2001 From: Diego Imbert <70353967+diegoimbert@users.noreply.github.com> Date: Fri, 6 Mar 2026 17:32:50 +0100 Subject: [PATCH] fix: Database studio fixes (#8251) * disable dynamic fields for db studio config * Fix SQL safe interpolated arg * Fix db studio not passing AppEditorContext to modal * Fix db studio modal grid not being able to move/resize components --- .../parsers/windmill-parser-sql/src/lib.rs | 34 +++++++++++++++++- .../table/AppAggridExplorerTable.svelte | 18 ++++++++-- .../components/apps/editor/AppEditor.svelte | 5 +-- .../apps/editor/component/components.ts | 36 ++++++++++++------- .../apps/svelte-grid/MoveResize.svelte | 4 +-- 5 files changed, 75 insertions(+), 22 deletions(-) diff --git a/backend/parsers/windmill-parser-sql/src/lib.rs b/backend/parsers/windmill-parser-sql/src/lib.rs index cc86ea595c..56cccbabfe 100644 --- a/backend/parsers/windmill-parser-sql/src/lib.rs +++ b/backend/parsers/windmill-parser-sql/src/lib.rs @@ -238,7 +238,7 @@ lazy_static::lazy_static! { // used for `unsafe` sql interpolation // -- %%name%% (type) = default - static ref RE_ARG_SQL_INTERPOLATION: Regex = Regex::new(r#"(?m)^--\s*%%([a-z_][a-z0-9_]*)%%\s*([\s\w\/]+)?(?: ?\= ?(.+))? *(?:\r|\n|$)"#).unwrap(); + static ref RE_ARG_SQL_INTERPOLATION: Regex = Regex::new(r#"(?m)^--\s*%%([a-z_][a-z0-9_]*)%%[ \t]*([\w][\w \t\/]*)?(?: ?\= ?(.+))? *(?:\r|\n|$)"#).unwrap(); } fn parsed_default(parsed_typ: &Typ, default: String) -> Option { @@ -1547,4 +1547,36 @@ SELECT $1::integer; Ok(()) } + + #[test] + fn test_parse_pgsql_safe_interpolated_args() -> anyhow::Result<()> { + // There was a bug where enum would be "angrycreative"/"bishop"/"test SELECT x" + let code = r#" +-- %%table_name%% angrycreative/bishop/test +SELECT x +"#; + assert_eq!( + parse_pgsql_sig(code)?, + MainArgSignature { + star_args: false, + star_kwargs: false, + args: vec![Arg { + otyp: Some("__sanitized_enum__".to_string()), + name: "table_name".to_string(), + typ: Typ::Str(Some(vec![ + "angrycreative".to_string(), + "bishop".to_string(), + "test".to_string() + ])), + default: None, + has_default: false, + oidx: None, + },], + no_main_func: None, + has_preprocessor: None + } + ); + + Ok(()) + } } diff --git a/frontend/src/lib/components/apps/components/display/table/AppAggridExplorerTable.svelte b/frontend/src/lib/components/apps/components/display/table/AppAggridExplorerTable.svelte index 9179f394e0..a8fd095fd9 100644 --- a/frontend/src/lib/components/apps/components/display/table/AppAggridExplorerTable.svelte +++ b/frontend/src/lib/components/apps/components/display/table/AppAggridExplorerTable.svelte @@ -4,7 +4,12 @@ import { type GridApi, createGrid, type IDatasource } from 'ag-grid-community' import { sendUserToast } from '$lib/utils' import { createEventDispatcher, getContext, mount, unmount, untrack } from 'svelte' - import type { AppViewerContext, ComponentCustomCSS, ContextPanelContext } from '../../../types' + import { + type AppEditorContext, + type AppViewerContext, + type ComponentCustomCSS, + type ContextPanelContext + } from '../../../types' import type { TableAction, components } from '$lib/components/apps/editor/component' import { deepEqual } from 'fast-equals' @@ -62,9 +67,15 @@ const context = getContext('AppViewerContext') const contextPanel = getContext('ContextPanel') + const editorContext = getContext('AppEditorContext') const { app, selectedComponent, componentControl, darkMode, mode } = context - let css = $state(initCss($app.css?.aggridcomponent, untrack(() => customCss))) + let css = $state( + initCss( + $app.css?.aggridcomponent, + untrack(() => customCss) + ) + ) let selectedRowIndex = -1 @@ -151,7 +162,8 @@ const componentContext = new Map([ ['AppViewerContext', context], - ['ContextPanel', contextPanel] + ['ContextPanel', contextPanel], + ['AppEditorContext', editorContext] ]) const taComponent = withProps(AppAggridTableActions, { diff --git a/frontend/src/lib/components/apps/editor/AppEditor.svelte b/frontend/src/lib/components/apps/editor/AppEditor.svelte index 8b62618fa5..e919f7d484 100644 --- a/frontend/src/lib/components/apps/editor/AppEditor.svelte +++ b/frontend/src/lib/components/apps/editor/AppEditor.svelte @@ -280,10 +280,7 @@ } } catch {} } else { - const drawerAlreadyHandledFocusedGrid = - item?.data.type === 'drawercomponent' && - $focusedGrid?.parentComponentId === befSelected - if (!drawerAlreadyHandledFocusedGrid) { + if ($focusedGrid?.parentComponentId !== befSelected) { $focusedGrid = undefined } } diff --git a/frontend/src/lib/components/apps/editor/component/components.ts b/frontend/src/lib/components/apps/editor/component/components.ts index df6d1b2a0e..707d992799 100644 --- a/frontend/src/lib/components/apps/editor/component/components.ts +++ b/frontend/src/lib/components/apps/editor/component/components.ts @@ -4159,14 +4159,16 @@ This is a paragraph. type: 'static', fieldType: 'resource', subFieldType: 'mysql', - value: '' + value: '', + allowTypeChange: false } as StaticAppInput, table: { fieldType: 'select', subFieldType: 'db-table', type: 'static', selectOptions: [], - value: undefined + value: undefined, + allowTypeChange: false } }, ms_sql_server: { @@ -4174,14 +4176,16 @@ This is a paragraph. type: 'static', fieldType: 'resource', subFieldType: 'ms_sql_server', - value: '' + value: '', + allowTypeChange: false } as StaticAppInput, table: { fieldType: 'select', subFieldType: 'db-table', type: 'static', selectOptions: [], - value: undefined + value: undefined, + allowTypeChange: false } }, snowflake: { @@ -4189,14 +4193,16 @@ This is a paragraph. type: 'static', fieldType: 'resource', subFieldType: 'snowflake', - value: '' + value: '', + allowTypeChange: false } as StaticAppInput, table: { fieldType: 'select', subFieldType: 'db-table', type: 'static', selectOptions: [], - value: undefined + value: undefined, + allowTypeChange: false } }, bigquery: { @@ -4204,14 +4210,16 @@ This is a paragraph. type: 'static', fieldType: 'resource', subFieldType: 'bigquery', - value: '' + value: '', + allowTypeChange: false } as StaticAppInput, table: { fieldType: 'select', subFieldType: 'db-table', type: 'static', selectOptions: [], - value: undefined + value: undefined, + allowTypeChange: false } }, ducklake: { @@ -4219,14 +4227,16 @@ This is a paragraph. type: 'static', fieldType: 'ducklake', subFieldType: 'ducklake', - value: '' + value: '', + allowTypeChange: false } as StaticAppInput, table: { fieldType: 'select', subFieldType: 'db-table', type: 'static', selectOptions: [], - value: undefined + value: undefined, + allowTypeChange: false } }, datatable: { @@ -4234,14 +4244,16 @@ This is a paragraph. type: 'static', fieldType: 'datatable', subFieldType: 'datatable', - value: '' + value: '', + allowTypeChange: false } as StaticAppInput, table: { fieldType: 'select', subFieldType: 'db-table', type: 'static', selectOptions: [], - value: undefined + value: undefined, + allowTypeChange: false } } } diff --git a/frontend/src/lib/components/apps/svelte-grid/MoveResize.svelte b/frontend/src/lib/components/apps/svelte-grid/MoveResize.svelte index d138023eed..15c98ef83c 100644 --- a/frontend/src/lib/components/apps/svelte-grid/MoveResize.svelte +++ b/frontend/src/lib/components/apps/svelte-grid/MoveResize.svelte @@ -221,7 +221,7 @@ const pointerdown = ({ clientX, clientY }) => { dragClosure = () => { dragClosure = undefined - ctx.componentActive.set(true) + ctx?.componentActive.set(true) initX = (clientX / $scale) * 100 initY = (clientY / $scale) * 100 @@ -401,7 +401,7 @@ }, 50) const pointerup = (e) => { - ctx.componentActive.set(false) + ctx?.componentActive.set(false) stopAutoscroll() window.removeEventListener('pointerdown', pointerdown)