From 2f13eb4eb837b60ef7a5c72b0951c30488fda71d Mon Sep 17 00:00:00 2001 From: Diego Imbert Date: Fri, 27 Jun 2025 14:06:32 +0200 Subject: [PATCH] +S3 Object editor bar --- frontend/src/lib/components/EditorBar.svelte | 47 +++++++++++++++++-- .../src/lib/components/S3FilePicker.svelte | 4 ++ frontend/src/lib/components/custom_ui.ts | 1 + frontend/src/lib/utils.ts | 5 ++ 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/frontend/src/lib/components/EditorBar.svelte b/frontend/src/lib/components/EditorBar.svelte index c48b519f72..b5e5281665 100644 --- a/frontend/src/lib/components/EditorBar.svelte +++ b/frontend/src/lib/components/EditorBar.svelte @@ -29,6 +29,7 @@ import { DiffIcon, DollarSign, + File, History, Library, Link, @@ -38,7 +39,7 @@ Save, Users } from 'lucide-svelte' - import { capitalize, toCamel } from '$lib/utils' + import { capitalize, formatS3Object, toCamel } from '$lib/utils' import type { Schema, SchemaProperty, SupportedLanguage } from '$lib/common' import ScriptVersionHistory from './ScriptVersionHistory.svelte' import ScriptGen from './copilot/ScriptGen.svelte' @@ -48,6 +49,7 @@ import ResourceEditorDrawer from './ResourceEditorDrawer.svelte' import type { EditorBarUi } from './custom_ui' import EditorSettings from './EditorSettings.svelte' + import S3FilePicker from './S3FilePicker.svelte' interface Props { lang: SupportedLanguage | 'bunnative' | undefined @@ -109,6 +111,7 @@ let resourceTypePicker: ItemPicker | undefined = $state() let variableEditor: VariableEditor | undefined = $state() let resourceEditor: ResourceEditorDrawer | undefined = $state() + let s3FilePicker: S3FilePicker | undefined = $state() let showContextVarPicker = $derived( [ @@ -168,6 +171,8 @@ ].includes(lang ?? '') ) + let showS3Picker = $derived(['duckdb'].includes(lang ?? '')) + let showResourceTypePicker = $derived( ['typescript', 'javascript'].includes(scriptLangToEditorLang(lang)) || lang === 'python3' || @@ -582,8 +587,14 @@ JsonNode ${windmillPathToCamelCaseName(path)} = JsonNode.Parse(await client.GetS editor.insertAtCursor(`(Wmill.getResource("${path}"))`) // for related places search: ADD_NEW_LANG } else if (lang == 'duckdb') { - let t = resType == 'postgresql' ? 'postgres' : resType - editor.insertAtCursor(`ATTACH '$res:${path}' AS db (TYPE ${t});`) + let t = { postgresql: 'postgres', mysql: 'mysql', bigquery: 'bigquery' }[resType] + if (!t) { + sendUserToast(`Resource type ${resType} is not supported in DuckDB`, true) + editor.insertAtCursor(`'$res:${path}'`) + return + } else { + editor.insertAtCursor(`ATTACH '$res:${path}' AS db (TYPE ${t});`) + } } sendUserToast(`${path} inserted at cursor`) @@ -630,6 +641,20 @@ JsonNode ${windmillPathToCamelCaseName(path)} = JsonNode.Parse(await client.GetS + { + if (lang === 'duckdb') { + let s = `'${formatS3Object(s3obj.detail)}'` + if (s3obj.detail?.s3.endsWith('.json')) s = `read_json(${s})` + if (s3obj.detail?.s3.endsWith('.csv')) s = `read_csv(${s})` + if (s3obj.detail?.s3.endsWith('.parquet')) s = `read_parquet(${s})` + editor?.insertAtCursor(s) + } + }} +/> +
{/if} + {#if showS3Picker && customUi?.s3object != false} + + {/if} + {#if showResourceTypePicker && customUi?.type != false}