From 69c316576c785037c37b949dcbc709fca01d7d01 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 11 Feb 2025 15:57:36 +0100 Subject: [PATCH 01/14] add grants to v2 tables --- backend/migrations/20250205131516_v2_grant.down.sql | 1 + backend/migrations/20250205131516_v2_grant.up.sql | 6 ++++++ 2 files changed, 7 insertions(+) create mode 100644 backend/migrations/20250205131516_v2_grant.down.sql create mode 100644 backend/migrations/20250205131516_v2_grant.up.sql diff --git a/backend/migrations/20250205131516_v2_grant.down.sql b/backend/migrations/20250205131516_v2_grant.down.sql new file mode 100644 index 0000000000..d2f607c5b8 --- /dev/null +++ b/backend/migrations/20250205131516_v2_grant.down.sql @@ -0,0 +1 @@ +-- Add down migration script here diff --git a/backend/migrations/20250205131516_v2_grant.up.sql b/backend/migrations/20250205131516_v2_grant.up.sql new file mode 100644 index 0000000000..3d58575b41 --- /dev/null +++ b/backend/migrations/20250205131516_v2_grant.up.sql @@ -0,0 +1,6 @@ +-- Add up migration script here +GRANT ALL ON v2_as_queue TO windmill_admin; +GRANT ALL ON v2_as_queue TO windmill_user; + +GRANT ALL ON v2_as_completed_job TO windmill_admin; +GRANT ALL ON v2_as_completed_job TO windmill_user; From 6357ed3d5e1188bb92ccaf4710e526ab2ec7e874 Mon Sep 17 00:00:00 2001 From: wendrul <53628737+wendrul@users.noreply.github.com> Date: Tue, 11 Feb 2025 16:08:19 +0100 Subject: [PATCH 02/14] fix: Remove cache dir mount and mount only the cache executable (Rust, C#) (#5270) --- backend/windmill-worker/nsjail/run.csharp.config.proto | 5 ++--- backend/windmill-worker/nsjail/run.rust.config.proto | 5 ++--- backend/windmill-worker/src/csharp_executor.rs | 1 + backend/windmill-worker/src/rust_executor.rs | 1 + 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/windmill-worker/nsjail/run.csharp.config.proto b/backend/windmill-worker/nsjail/run.csharp.config.proto index 4a6de952a7..389448eff0 100644 --- a/backend/windmill-worker/nsjail/run.csharp.config.proto +++ b/backend/windmill-worker/nsjail/run.csharp.config.proto @@ -104,10 +104,9 @@ mount { iface_no_lo: true mount { - src: "{CACHE_DIR}" - dst: "/tmp/.cache/csharp" + src: "{CACHE_DIR}/{CACHE_HASH}" + dst: "/tmp/.cache/csharp/{CACHE_HASH}" is_bind: true - rw: true mandatory: false } diff --git a/backend/windmill-worker/nsjail/run.rust.config.proto b/backend/windmill-worker/nsjail/run.rust.config.proto index 502011049c..3357cd88a9 100644 --- a/backend/windmill-worker/nsjail/run.rust.config.proto +++ b/backend/windmill-worker/nsjail/run.rust.config.proto @@ -97,10 +97,9 @@ mount { iface_no_lo: true mount { - src: "{CACHE_DIR}" - dst: "/tmp/.cache/rust" + src: "{CACHE_DIR}/{CACHE_HASH}" + dst: "/tmp/.cache/rust/{CACHE_HASH}" is_bind: true - rw: true mandatory: false } diff --git a/backend/windmill-worker/src/csharp_executor.rs b/backend/windmill-worker/src/csharp_executor.rs index 61f53ab65a..5694920e88 100644 --- a/backend/windmill-worker/src/csharp_executor.rs +++ b/backend/windmill-worker/src/csharp_executor.rs @@ -543,6 +543,7 @@ pub async fn handle_csharp_job( &NSJAIL_CONFIG_RUN_CSHARP_CONTENT .replace("{JOB_DIR}", job_dir) .replace("{CACHE_DIR}", CSHARP_CACHE_DIR) + .replace("{CACHE_HASH}", &hash) .replace("{CLONE_NEWUSER}", &(!*DISABLE_NUSER).to_string()) .replace("{SHARED_MOUNT}", shared_mount), )?; diff --git a/backend/windmill-worker/src/rust_executor.rs b/backend/windmill-worker/src/rust_executor.rs index 639adc709a..95fd822100 100644 --- a/backend/windmill-worker/src/rust_executor.rs +++ b/backend/windmill-worker/src/rust_executor.rs @@ -353,6 +353,7 @@ pub async fn handle_rust_job( &NSJAIL_CONFIG_RUN_RUST_CONTENT .replace("{JOB_DIR}", job_dir) .replace("{CACHE_DIR}", RUST_CACHE_DIR) + .replace("{CACHE_HASH}", &hash) .replace("{CLONE_NEWUSER}", &(!*DISABLE_NUSER).to_string()) .replace("{SHARED_MOUNT}", shared_mount), )?; From aae3683fe90adc0eea055238f7776b96140706bd Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 11 Feb 2025 18:05:24 +0100 Subject: [PATCH 03/14] feat: improve large apps performances (#5265) --- .../components/buttons/AppFormButton.svelte | 144 +-- .../display/AppAccordionList.svelte | 85 +- .../components/display/AppCarouselList.svelte | 223 ++-- .../display/AppCustomComponent.svelte | 2 + .../apps/components/display/AppHtml.svelte | 46 +- .../components/display/AppMarkdown.svelte | 60 +- .../apps/components/display/AppText.svelte | 6 +- .../apps/components/display/PlotlyHtml.svelte | 28 +- .../components/display/PlotlyHtmlV2.svelte | 28 +- .../components/display/VegaLiteHtml.svelte | 14 +- .../display/dbtable/AppDbExplorer.svelte | 1 + .../helpers/NonRunnableComponent.svelte | 2 - .../layout/AppConditionalWrapper.svelte | 49 +- .../components/layout/AppContainer.svelte | 49 +- .../components/layout/AppDecisionTree.svelte | 109 +- .../apps/components/layout/AppDrawer.svelte | 188 ++-- .../apps/components/layout/AppList.svelte | 261 ++--- .../apps/components/layout/AppModal.svelte | 165 +-- .../components/layout/AppSplitpanes.svelte | 96 +- .../apps/components/layout/AppStepper.svelte | 191 ++-- .../apps/components/layout/AppTabs.svelte | 222 ++-- .../components/apps/editor/AppPreview.svelte | 4 - .../components/apps/editor/GridEditor.svelte | 5 +- .../components/apps/editor/GridViewer.svelte | 36 +- .../apps/editor/SubGridEditor.svelte | 296 +++--- .../apps/editor/component/Component.svelte | 976 +----------------- .../editor/component/ComponentInner.svelte | 778 ++++++++++++++ .../editor/component/ComponentRendered.svelte | 219 ++++ .../components/apps/svelte-grid/Grid.svelte | 232 +++-- .../apps/svelte-grid/MoveResize.svelte | 3 +- 30 files changed, 2374 insertions(+), 2144 deletions(-) create mode 100644 frontend/src/lib/components/apps/editor/component/ComponentInner.svelte create mode 100644 frontend/src/lib/components/apps/editor/component/ComponentRendered.svelte diff --git a/frontend/src/lib/components/apps/components/buttons/AppFormButton.svelte b/frontend/src/lib/components/apps/components/buttons/AppFormButton.svelte index 68b52e515c..453d964d45 100644 --- a/frontend/src/lib/components/apps/components/buttons/AppFormButton.svelte +++ b/frontend/src/lib/components/apps/components/buttons/AppFormButton.svelte @@ -89,75 +89,79 @@ configuration={configuration[key]} /> {/each} - -
- - {#if noInputs} -
- Run forms are associated with a runnable that has user inputs. -
- Once a script or flow is chosen, set some Runnable Inputs to - - User Input - - +{#if render} + +
+ + {#if noInputs} +
+ Run forms are associated with a runnable that has user inputs. +
+ Once a script or flow is chosen, set some Runnable Inputs to + + User Input + + +
+ {/if} +
+
- {/if} -
- -
-
-
-
+ +
+ - - {#if errorsMessage} -
{errorsMessage}
- {/if} - -
+ + {#if errorsMessage} +
{errorsMessage}
+ {/if} + +
+{:else} + +{/if} diff --git a/frontend/src/lib/components/apps/components/display/AppAccordionList.svelte b/frontend/src/lib/components/apps/components/display/AppAccordionList.svelte index 2966cf418d..e322e9e783 100644 --- a/frontend/src/lib/components/apps/components/display/AppAccordionList.svelte +++ b/frontend/src/lib/components/apps/components/display/AppAccordionList.svelte @@ -18,17 +18,21 @@ export let initializing: boolean | undefined export let componentContainerHeight: number - type AccordionListValue = { header: string; [key: string]: any }; + type AccordionListValue = { header: string; [key: string]: any } type InternalAccordionListInput = AppInput & { - value: AccordionListValue[]; - }; + value: AccordionListValue[] + } - $: accordionInput = componentInput as InternalAccordionListInput; + $: accordionInput = componentInput as InternalAccordionListInput const { app, focusedGrid, selectedComponent, worldStore, connectingInput } = getContext('AppViewerContext') + let everRender = render + + $: render && !everRender && (everRender = true) + let activeIndex: number = 0 const outputs = initOutput($worldStore, id, { @@ -61,7 +65,6 @@ activeIndex = activeIndex === index ? -1 : index outputs.activeIndex.set(activeIndex) } - {#each Object.keys(css ?? {}) as key (key)} @@ -85,27 +88,27 @@ bind:initializing bind:result > -
- {#if $app.subgrids?.[`${id}-0`]} - {#if Array.isArray(result) && result.length > 0} - {#each result ?? [] as value, index} -
- - {#if activeIndex === index} -
+ {#if everRender} +
+ {#if $app.subgrids?.[`${id}-0`]} + {#if Array.isArray(result) && result.length > 0} + {#each result ?? [] as value, index} +
+ +
{ if (!inputs[id]) { @@ -133,8 +136,8 @@ >
- {/if} -
- {/each} - {:else} - - - - {#if !Array.isArray(result)} -
Input data is not an array
+
+ {/each} + {:else} + + + + {#if !Array.isArray(result)} +
Input data is not an array
+ {/if} {/if} {/if} - {/if} -
+
+ {:else if $app.subgrids} + + + + {/if} diff --git a/frontend/src/lib/components/apps/components/display/AppCarouselList.svelte b/frontend/src/lib/components/apps/components/display/AppCarouselList.svelte index 8ce89208dd..a8a2dce0e9 100644 --- a/frontend/src/lib/components/apps/components/display/AppCarouselList.svelte +++ b/frontend/src/lib/components/apps/components/display/AppCarouselList.svelte @@ -27,6 +27,9 @@ const { app, focusedGrid, selectedComponent, worldStore, connectingInput } = getContext('AppViewerContext') + let everRender = render + $: render && !everRender && (everRender = true) + const outputs = initOutput($worldStore, id, { result: undefined, loading: false, @@ -90,117 +93,123 @@ bind:initializing bind:result > -
- {#if $app.subgrids?.[`${id}-0`]} - {#if Array.isArray(result) && result.length > 0} - {#key result} - { - currentPageIndex = event.detail - $focusedGrid = { - parentComponentId: id, - subGridIndex: event.detail - } - }} - > -
-
- -
-
-
-
- -
-
- {#each result ?? [] as value, index} -
- { - if (!inputs[id]) { - inputs[id] = { [index]: value } - } else { - inputs[id] = { ...inputs[id], [index]: value } - } - outputs?.inputs.set(inputs, true) - }} - onRemove={(id) => { - if (inputs?.[id] == undefined) { - return - } - if (index == 0) { - delete inputs[id] - inputs = { ...inputs } - } else { - delete inputs[id][index] - inputs[id] = { ...inputs[id] } - } - outputs?.inputs.set(inputs, true) - }} - {value} - {index} - > - { - if (!$connectingInput.opened) { - $selectedComponent = [id] + if (currentPageIndex > 0) { + carousel.goTo(currentPageIndex - 1) + } else { + carousel.goTo(pagesCount - 1) } - onFocus() }} - /> - + > + + +
- {/each} - - {/key} - {:else} - - - - {#if !Array.isArray(result)} -
Input data is not an array
+
+
+ +
+
+ {#each result ?? [] as value, index} +
+ { + if (!inputs[id]) { + inputs[id] = { [index]: value } + } else { + inputs[id] = { ...inputs[id], [index]: value } + } + outputs?.inputs.set(inputs, true) + }} + onRemove={(id) => { + if (inputs?.[id] == undefined) { + return + } + if (index == 0) { + delete inputs[id] + inputs = { ...inputs } + } else { + delete inputs[id][index] + inputs[id] = { ...inputs[id] } + } + outputs?.inputs.set(inputs, true) + }} + {value} + {index} + > + { + if (!$connectingInput.opened) { + $selectedComponent = [id] + } + onFocus() + }} + /> + +
+ {/each} + + {/key} + {:else} + + + + {#if !Array.isArray(result)} +
Input data is not an array
+ {/if} {/if} {/if} - {/if} -
+
+ {:else if $app.subgrids} + + + + {/if} diff --git a/frontend/src/lib/components/apps/components/display/AppCustomComponent.svelte b/frontend/src/lib/components/apps/components/display/AppCustomComponent.svelte index d481de1a1b..192cf569ef 100644 --- a/frontend/src/lib/components/apps/components/display/AppCustomComponent.svelte +++ b/frontend/src/lib/components/apps/components/display/AppCustomComponent.svelte @@ -119,4 +119,6 @@
+{:else} + {/if} diff --git a/frontend/src/lib/components/apps/components/display/AppHtml.svelte b/frontend/src/lib/components/apps/components/display/AppHtml.svelte index 7d0b4e873c..7a79efc6f2 100644 --- a/frontend/src/lib/components/apps/components/display/AppHtml.svelte +++ b/frontend/src/lib/components/apps/components/display/AppHtml.svelte @@ -35,25 +35,29 @@ /> {/each} -
{ - e?.preventDefault() - }} - class="h-full w-full" -> - { + e?.preventDefault() + }} + class="h-full w-full" > -
- {#key result} - {@html result} - {/key} -
-
-
+ +
+ {#key result} + {@html result} + {/key} +
+
+ +{:else} + +{/if} diff --git a/frontend/src/lib/components/apps/components/display/AppMarkdown.svelte b/frontend/src/lib/components/apps/components/display/AppMarkdown.svelte index 8ff485a4ae..bdd6fc1658 100644 --- a/frontend/src/lib/components/apps/components/display/AppMarkdown.svelte +++ b/frontend/src/lib/components/apps/components/display/AppMarkdown.svelte @@ -62,32 +62,36 @@ /> {/each} -
{ - e?.preventDefault() - }} - class={classNames( - 'h-full w-full overflow-y-auto prose max-w-full', - resolvedConfig?.size ? proseMapping[resolvedConfig.size] : '', - css?.container?.class, - ' dark:prose-invert', - 'wm-markdown' - )} - style={css?.container?.style} -> - { + e?.preventDefault() + }} + class={classNames( + 'h-full w-full overflow-y-auto prose max-w-full', + resolvedConfig?.size ? proseMapping[resolvedConfig.size] : '', + css?.container?.class, + ' dark:prose-invert', + 'wm-markdown' + )} + style={css?.container?.style} > - {#if result} - {#key result} - - {/key} - {/if} - -
+ + {#if result} + {#key result} + + {/key} + {/if} + + +{:else} + +{/if} diff --git a/frontend/src/lib/components/apps/components/display/AppText.svelte b/frontend/src/lib/components/apps/components/display/AppText.svelte index 78e10402b6..f83b5ab6a8 100644 --- a/frontend/src/lib/components/apps/components/display/AppText.svelte +++ b/frontend/src/lib/components/apps/components/display/AppText.svelte @@ -217,7 +217,7 @@ {:else}
{#if resolvedConfig.copyButton && result} -
+
+ {/if} + +
{/if} - {#if getFirstNode(nodes)?.id !== currentNodeId} - - {/if} - -
+{:else if $app.subgrids} + {#each Object.values(nodes) ?? [] as _node, i} + + {/each} +{/if} diff --git a/frontend/src/lib/components/apps/components/layout/AppDrawer.svelte b/frontend/src/lib/components/apps/components/layout/AppDrawer.svelte index e5e73536d0..9504399bc7 100644 --- a/frontend/src/lib/components/apps/components/layout/AppDrawer.svelte +++ b/frontend/src/lib/components/apps/components/layout/AppDrawer.svelte @@ -24,6 +24,9 @@ export let onOpenRecomputeIds: string[] | undefined = undefined export let onCloseRecomputeIds: string[] | undefined = undefined + let everRender = render + $: render && !everRender && (everRender = true) + const { app, focusedGrid, @@ -77,98 +80,103 @@ {/each} - -
- - - -
- - - { - outputs?.open.set(true) - onOpenRecomputeIds?.forEach((id) => $runnableComponents?.[id]?.cb?.map((cb) => cb?.())) - }} - on:close={() => { - outputs?.open.set(false) - onCloseRecomputeIds?.forEach((id) => $runnableComponents?.[id]?.cb?.map((cb) => cb?.())) - }} - > - { - appDrawer?.toggleDrawer() - $focusedGrid = undefined - }} - fullScreen={$mode !== 'dnd'} - > -
+ +
-
-
-
+ + +
+{/if} + +{#if everRender} + + { + outputs?.open.set(true) + onOpenRecomputeIds?.forEach((id) => $runnableComponents?.[id]?.cb?.map((cb) => cb?.())) + }} + on:close={() => { + outputs?.open.set(false) + onCloseRecomputeIds?.forEach((id) => $runnableComponents?.[id]?.cb?.map((cb) => cb?.())) + }} + > + { + appDrawer?.toggleDrawer() + $focusedGrid = undefined + }} + fullScreen={$mode !== 'dnd'} + > +
{ + e?.stopPropagation() + if (!$connectingInput.opened) { + $selectedComponent = [id] + $focusedGrid = { + parentComponentId: id, + subGridIndex: 0 + } + } + }} + > + {#if $app.subgrids?.[`${id}-0`]} + { + if (!$connectingInput.opened) { + $selectedComponent = [id] + $focusedGrid = { + parentComponentId: id, + subGridIndex: 0 + } + } + }} + /> + {/if} +
+
+
+
+{:else if $app.subgrids?.[`${id}-0`]} + +{/if} diff --git a/frontend/src/lib/components/apps/components/layout/AppList.svelte b/frontend/src/lib/components/apps/components/layout/AppList.svelte index a0e708670c..44e0a56509 100644 --- a/frontend/src/lib/components/apps/components/layout/AppList.svelte +++ b/frontend/src/lib/components/apps/components/layout/AppList.svelte @@ -26,6 +26,9 @@ getContext('AppViewerContext') let page = 0 + let everRender = render + $: render && !everRender && (everRender = true) + const outputs = initOutput($worldStore, id, { result: undefined, loading: false, @@ -72,8 +75,8 @@ const l = initialData ? initialData.length : 0 if (mode === 'auto') { const pageSize: number = configuration.auto.pageSize ?? 0 - const shouldDisplayPagination = pageSize < l ?? false - const total = Math.ceil(l / pageSize ?? 0) + const shouldDisplayPagination = (pageSize ?? 0) < l + const total = Math.ceil(l / (pageSize ?? 0)) return { shouldDisplayPagination, @@ -136,136 +139,144 @@ bind:result bind:loading > -
+ {#if everRender}
- {#if $app.subgrids?.[`${id}-0`]} - {#if Array.isArray(result) && result.length > 0} - {#each result ?? [] as value, index (index)} - {@const inRange = index <= pagination.maxIndex && index >= pagination.indexOffset} -
- { - if (!inputs[id]) { - inputs[id] = { [index]: value } - } else { - inputs[id] = { ...inputs[id], [index]: value } - } - outputs?.inputs.set(inputs, true) - }} - onRemove={(id) => { - if (inputs?.[id] == undefined) { - return - } - if (index == 0) { - delete inputs[id] - inputs = { ...inputs } - } else { - delete inputs[id][index] - inputs[id] = { ...inputs[id] } - } - outputs?.inputs.set(inputs, true) - }} - {value} - {index} +
+ {#if $app.subgrids?.[`${id}-0`]} + {#if Array.isArray(result) && result.length > 0} + {#each result ?? [] as value, index (index)} + {@const inRange = index <= pagination.maxIndex && index >= pagination.indexOffset} +
- { - if (!$connectingInput.opened) { - $selectedComponent = [id] + { + if (!inputs[id]) { + inputs[id] = { [index]: value } + } else { + inputs[id] = { ...inputs[id], [index]: value } } - onFocus() + outputs?.inputs.set(inputs, true) }} - /> - -
- {/each} - {:else} - - - - {#if !Array.isArray(result)} -
Input data is not an array
+ onRemove={(id) => { + if (inputs?.[id] == undefined) { + return + } + if (index == 0) { + delete inputs[id] + inputs = { ...inputs } + } else { + delete inputs[id][index] + inputs[id] = { ...inputs[id] } + } + outputs?.inputs.set(inputs, true) + }} + {value} + {index} + > + { + if (!$connectingInput.opened) { + $selectedComponent = [id] + } + onFocus() + }} + /> + +
+ {/each} + {:else} + + + + {#if !Array.isArray(result)} +
Input data is not an array
+ {/if} {/if} {/if} +
+ {#if pagination.shouldDisplayPagination} +
+ + +
{page + 1} {pagination.total > 0 ? `of ${pagination.total}` : ''}
+
{/if}
- {#if pagination.shouldDisplayPagination} -
- - -
{page + 1} {pagination.total > 0 ? `of ${pagination.total}` : ''}
-
- {/if} -
+ {:else if $app.subgrids} + + + + {/if}
diff --git a/frontend/src/lib/components/apps/components/layout/AppModal.svelte b/frontend/src/lib/components/apps/components/layout/AppModal.svelte index 1a4bd62cce..ccb25145a6 100644 --- a/frontend/src/lib/components/apps/components/layout/AppModal.svelte +++ b/frontend/src/lib/components/apps/components/layout/AppModal.svelte @@ -40,6 +40,9 @@ breakpoint } = getContext('AppViewerContext') + let everRender = render + $: render && !everRender && (everRender = true) + //used so that we can count number of outputs setup for first refresh const outputs = initOutput($worldStore, id, { open: false @@ -110,7 +113,7 @@ /> {/each} -{#if render} +{#if everRender}
-{/if} - - { - outputs?.open.set(true) - onOpenRecomputeIds?.forEach((id) => $runnableComponents?.[id]?.cb?.map((cb) => cb?.())) - }} - on:close={() => { - outputs?.open.set(false) - onCloseRecomputeIds?.forEach((id) => $runnableComponents?.[id]?.cb?.map((cb) => cb?.())) - }} - > -
+ { + outputs?.open.set(true) + onOpenRecomputeIds?.forEach((id) => $runnableComponents?.[id]?.cb?.map((cb) => cb?.())) + }} + on:close={() => { + outputs?.open.set(false) + onCloseRecomputeIds?.forEach((id) => $runnableComponents?.[id]?.cb?.map((cb) => cb?.())) + }} >
{ - if ($mode !== 'dnd' && !unclickableOutside) { - handleClickAway(e) - } - }} + class={twMerge( + `${ + $mode == 'dnd' ? 'absolute' : 'fixed' + } top-0 bottom-0 left-0 right-0 transition-all duration-50`, + open ? ' bg-black bg-opacity-60' : 'h-0 overflow-hidden invisible' + )} + style="z-index: {zIndex}" + bind:clientHeight={wrapperHeight} >
-
{resolvedConfig.modalTitle}
-
- -
-
- -
{ - e?.stopPropagation() - if (!$connectingInput.opened) { - $selectedComponent = [id] - $focusedGrid = { - parentComponentId: id, - subGridIndex: 0 - } + style={css?.popup?.style} + class={twMerge('mx-24 mt-8 bg-surface rounded-lg relative', css?.popup?.class)} + use:clickOutside={false} + on:click_outside={(e) => { + if ($mode !== 'dnd' && !unclickableOutside) { + handleClickAway(e) } }} > - {#if $app.subgrids?.[`${id}-0`]} - { - if (!$connectingInput.opened) { - $selectedComponent = [id] - $focusedGrid = { - parentComponentId: id, - subGridIndex: 0 - } +
+
{resolvedConfig.modalTitle}
+
+ +
+
+ +
{ + e?.stopPropagation() + if (!$connectingInput.opened) { + $selectedComponent = [id] + $focusedGrid = { + parentComponentId: id, + subGridIndex: 0 } - }} - /> - {/if} + } + }} + > + {#if $app.subgrids?.[`${id}-0`]} + { + if (!$connectingInput.opened) { + $selectedComponent = [id] + $focusedGrid = { + parentComponentId: id, + subGridIndex: 0 + } + } + }} + /> + {/if} +
-
-
-
+ + +{:else if $app.subgrids?.[`${id}-0`]} + +{/if} diff --git a/frontend/src/lib/components/apps/components/layout/AppSplitpanes.svelte b/frontend/src/lib/components/apps/components/layout/AppSplitpanes.svelte index 384000a06b..90dbf14618 100644 --- a/frontend/src/lib/components/apps/components/layout/AppSplitpanes.svelte +++ b/frontend/src/lib/components/apps/components/layout/AppSplitpanes.svelte @@ -25,6 +25,10 @@ //used so that we can count number of outputs setup for first refresh initOutput($worldStore, id, {}) + let everRender = render + + $: render && !everRender && (everRender = true) + function onFocus() { $focusedGrid = { parentComponentId: id, @@ -82,47 +86,53 @@ -
- {#key sumedup} - - {#each sumedup as paneSize, index (index)} - -
{ - $selectedComponent = [id] - $focusedGrid = { - parentComponentId: id, - subGridIndex: index - } - }} - > - {#if $app.subgrids?.[`${id}-${index}`]} - { - if (!$connectingInput.opened) { - $selectedComponent = [id] - $focusedGrid = { - parentComponentId: id, - subGridIndex: index +{#if everRender} +
+ {#key sumedup} + + {#each sumedup as paneSize, index (index)} + +
{ + $selectedComponent = [id] + $focusedGrid = { + parentComponentId: id, + subGridIndex: index + } + }} + > + {#if $app.subgrids?.[`${id}-${index}`]} + { + if (!$connectingInput.opened) { + $selectedComponent = [id] + $focusedGrid = { + parentComponentId: id, + subGridIndex: index + } } - } - }} - /> - {/if} -
-
- {/each} -
- {/key} -
+ }} + /> + {/if} +
+
+ {/each} +
+ {/key} +
+{:else} + {#each sumedup as _paneSize, index (index)} + + {/each} +{/if} diff --git a/frontend/src/lib/components/apps/components/layout/AppStepper.svelte b/frontend/src/lib/components/apps/components/layout/AppStepper.svelte index 9a15955ec6..eb47b3e928 100644 --- a/frontend/src/lib/components/apps/components/layout/AppStepper.svelte +++ b/frontend/src/lib/components/apps/components/layout/AppStepper.svelte @@ -36,6 +36,9 @@ runnableComponents } = getContext('AppViewerContext') + let everRender = render + $: render && !everRender && (everRender = true) + let selected = tabs[0] let tabHeight: number = 0 let footerHeight: number = 0 @@ -155,97 +158,109 @@ bind:result errorHandledByComponent={true} > -
-
- { - const index = e.detail.index - if (index <= maxReachedIndex || $mode === 'dnd') { - runStep(index) - } - }} - {tabs} - {selectedIndex} - {maxReachedIndex} - {statusByStep} - hasValidations={Boolean(runnableComponent)} - /> -
- -
- {#if $app.subgrids} - {#each tabs ?? [] as _res, i} - { - if (!$connectingInput.opened) { - $selectedComponent = [id] - handleTabSelection() + {#if everRender} +
+ {#if render} +
+ { + const index = e.detail.index + if (index <= maxReachedIndex || $mode === 'dnd') { + runStep(index) } }} + {tabs} + {selectedIndex} + {maxReachedIndex} + {statusByStep} + hasValidations={Boolean(runnableComponent)} /> - {/each} +
+ {/if} + +
+ {#if $app.subgrids} + {#each tabs ?? [] as _res, i} + { + if (!$connectingInput.opened) { + $selectedComponent = [id] + handleTabSelection() + } + }} + /> + {/each} + {/if} +
+ + {#if render} +
+
+
+ + Step {selectedIndex + 1} of {tabs.length} + +
+
+ + + +
+
+
{/if}
- -
-
-
- - Step {selectedIndex + 1} of {tabs.length} - -
-
- - - -
-
-
-
+ {:else if $app.subgrids} + {#each tabs ?? [] as _res, i} + + {/each} + {/if} diff --git a/frontend/src/lib/components/apps/components/layout/AppTabs.svelte b/frontend/src/lib/components/apps/components/layout/AppTabs.svelte index 553e6db4f1..f57d7c46f0 100644 --- a/frontend/src/lib/components/apps/components/layout/AppTabs.svelte +++ b/frontend/src/lib/components/apps/components/layout/AppTabs.svelte @@ -29,6 +29,8 @@ components['tabscomponent'].initialData.configuration, configuration ) + let everRender = render + $: render && !everRender && (everRender = true) const { app, @@ -117,128 +119,134 @@ /> {/each} -
- {#if !resolvedConfig.tabsKind || resolvedConfig.tabsKind == 'tabs' || (resolvedConfig.tabsKind == 'invisibleOnView' && $mode == 'dnd')} -
- + {#if !resolvedConfig.tabsKind || resolvedConfig.tabsKind == 'tabs' || (resolvedConfig.tabsKind == 'invisibleOnView' && $mode == 'dnd')} +
+ + {#each tabs ?? [] as res, index} + + {res} + + {/each} + +
+ {:else if resolvedConfig.tabsKind == 'sidebar'} +
- {#each tabs ?? [] as res, index} - - {res} - - {/each} - -
- {:else if resolvedConfig.tabsKind == 'sidebar'} -
- {#each tabs ?? [] as res} - - {/each} -
- {/if} - {#if resolvedConfig.tabsKind == 'accordion'} -
- {#each tabs ?? [] as res, index} -
+ {#each tabs ?? [] as res} - {#if selected == res} -
- { - if (!$connectingInput.opened) { - $selectedComponent = [id] - handleTabSelection() - } - }} - /> -
- {/if} -
- {/each} -
- {:else} -
- {#if $app.subgrids} - {#each tabs ?? [] as _res, i} - { - if (!$connectingInput.opened) { - $selectedComponent = [id] - handleTabSelection() - } - }} - /> {/each} - {/if} -
- {/if} -
+
+ {/if} + {#if resolvedConfig.tabsKind == 'accordion'} +
+ {#each tabs ?? [] as res, index} +
+ + {#if selected == res} +
+ { + if (!$connectingInput.opened) { + $selectedComponent = [id] + handleTabSelection() + } + }} + /> +
+ {/if} +
+ {/each} +
+ {:else} +
+ {#if $app.subgrids} + {#each tabs ?? [] as _res, i} + { + if (!$connectingInput.opened) { + $selectedComponent = [id] + handleTabSelection() + } + }} + /> + {/each} + {/if} +
+ {/if} +
+{:else if $app.subgrids} + {#each tabs ?? [] as _res, i} + + {/each} +{/if} diff --git a/frontend/src/lib/components/apps/editor/AppPreview.svelte b/frontend/src/lib/components/apps/editor/AppPreview.svelte index e286988b42..ca1841c7b2 100644 --- a/frontend/src/lib/components/apps/editor/AppPreview.svelte +++ b/frontend/src/lib/components/apps/editor/AppPreview.svelte @@ -15,7 +15,6 @@ import GridViewer from './GridViewer.svelte' import Component from './component/Component.svelte' import { twMerge } from 'tailwind-merge' - import { columnConfiguration } from '../gridUtils' import { deepEqual } from 'fast-equals' import { dfs, maxHeight } from './appUtils' import { BG_PREFIX, migrateApp } from '../utils' @@ -292,8 +291,6 @@ allIdsInPath={$allIdsInPath} items={app.grid} let:dataItem - let:hidden - cols={columnConfiguration} {maxRow} breakpoint={$breakpoint} > @@ -308,7 +305,6 @@ selected={false} locked={true} fullHeight={dataItem?.[$breakpoint === 'sm' ? 3 : 12]?.fullHeight} - {hidden} /> diff --git a/frontend/src/lib/components/apps/editor/GridEditor.svelte b/frontend/src/lib/components/apps/editor/GridEditor.svelte index 5460f92cdc..9407e8714a 100644 --- a/frontend/src/lib/components/apps/editor/GridEditor.svelte +++ b/frontend/src/lib/components/apps/editor/GridEditor.svelte @@ -1,7 +1,7 @@
- {#if xPerPx} + {#if xPerPx && getComputedCols} {#each items as item (item.id)} {@const onTop = allIdsInPath?.includes(item.id)} {@const width = @@ -103,10 +117,14 @@ : ''} top: {top}px; left: {left}px;" > {#if item[getComputedCols]} -
{/each} + {:else if showSkeleton} +
{/if}
diff --git a/frontend/src/lib/components/apps/editor/SubGridEditor.svelte b/frontend/src/lib/components/apps/editor/SubGridEditor.svelte index 76cd8167eb..96b4b6cbb8 100644 --- a/frontend/src/lib/components/apps/editor/SubGridEditor.svelte +++ b/frontend/src/lib/components/apps/editor/SubGridEditor.svelte @@ -3,7 +3,7 @@ import { classNames } from '$lib/utils' import { createEventDispatcher, getContext, onDestroy } from 'svelte' import { twMerge } from 'tailwind-merge' - import { columnConfiguration, gridColumns, isFixed, toggleFixed } from '../gridUtils' + import { gridColumns, isFixed, toggleFixed } from '../gridUtils' import Grid from '../svelte-grid/Grid.svelte' import type { AppEditorContext, AppViewerContext, GridItem } from '../types' import { @@ -53,6 +53,10 @@ let isActive = false let sber = editorContext?.componentActive?.subscribe((x) => (isActive = x)) + let everVisible = visible + + $: visible && !everVisible && (everVisible = true) + onDestroy(() => { sber?.() }) @@ -173,160 +177,156 @@ } - - +{/if} diff --git a/frontend/src/lib/components/apps/editor/component/Component.svelte b/frontend/src/lib/components/apps/editor/component/Component.svelte index 6d4d0a396e..51d1891cd1 100644 --- a/frontend/src/lib/components/apps/editor/component/Component.svelte +++ b/frontend/src/lib/components/apps/editor/component/Component.svelte @@ -1,969 +1,39 @@ - - - - -
{ - outTimeout && clearTimeout(outTimeout) - if (component.id !== $hoverStore) { - $hoverStore = component.id - } - }} - on:mouseout|stopPropagation={mouseOut} - class={twMerge( - 'h-full flex flex-col w-full component relative', - initializing ? 'overflow-hidden h-0' : '', - hidden && $mode === 'preview' ? 'hidden' : '' - )} - data-connection-button -> - {#if locked && componentActive && $componentActive && moveMode === 'move' && componentDraggedId && componentDraggedId !== component.id && cachedAreOnTheSameSubgrid} -
-
- -
Anchored: The component cannot be moved.
-
-
- {:else if moveMode === 'insert' && isContainer(component.type) && componentDraggedId && componentDraggedId !== component.id && cachedComponentDraggedIsNotChild} -
- {/if} - {#if $mode !== 'preview'} - { - outTimeout && clearTimeout(outTimeout) - - if (component.id !== $hoverStore) { - $hoverStore = component.id - } - }} - hover={$hoverStore === component.id} - {component} - {selected} - {fullHeight} - connecting={$connectingInput.opened} - on:lock - on:expand - on:fillHeight - {locked} - {inlineEditorOpened} - hasInlineEditor={component.type === 'textcomponent' && - component.componentInput && - component.componentInput.type !== 'connected'} - on:triggerInlineEditor={() => { - inlineEditorOpened = !inlineEditorOpened - }} - {errorHandledByComponent} - {componentContainerWidth} - /> - {/if} - - {#if ismoving} -
- -
- {/if} -
- {#if component.type === 'displaycomponent'} - - {:else if component.type === 'logcomponent'} - - {:else if component.type === 'jobidlogcomponent'} - - {:else if component.type === 'flowstatuscomponent'} - - {:else if component.type === 'jobidflowstatuscomponent'} - - {:else if component.type === 'barchartcomponent'} - - {:else if component.type === 'timeseriescomponent'} - - {:else if component.type === 'htmlcomponent'} - - {:else if component.type === 'customcomponent'} - - {:else if component.type === 'mardowncomponent'} - - {:else if component.type === 'vegalitecomponent'} - - {:else if component.type === 'plotlycomponent'} - - {:else if component.type === 'plotlycomponentv2'} - - {:else if component.type === 'scatterchartcomponent'} - - {:else if component.type === 'piechartcomponent'} - - {:else if component.type === 'agchartscomponent'} - - {:else if component.type === 'agchartscomponentee'} - - {:else if component.type === 'tablecomponent'} - - {:else if component.type === 'dbexplorercomponent'} - - {:else if component.type === 'aggridcomponent'} - - {:else if component.type === 'aggridcomponentee'} - - {:else if component.type === 'aggridinfinitecomponent'} - - {:else if component.type === 'aggridinfinitecomponentee'} - - {:else if component.type === 'textcomponent'} - - {:else if component.type === 'buttoncomponent'} - - {:else if component.type === 'downloadcomponent'} - - {:else if component.type === 'selectcomponent' || component.type === 'resourceselectcomponent'} - - {:else if component.type === 'userresourcecomponent'} - - {:else if component.type === 'multiselectcomponent'} - - {:else if component.type === 'multiselectcomponentv2'} - - {:else if component.type === 'formcomponent'} - - {:else if component.type === 'formbuttoncomponent'} - - {:else if component.type === 'checkboxcomponent'} - - {:else if component.type === 'textinputcomponent'} - - {:else if component.type === 'quillcomponent'} - - {:else if component.type === 'textareainputcomponent'} - - {:else if component.type === 'emailinputcomponent'} - - {:else if component.type === 'passwordinputcomponent'} - - {:else if component.type === 'dateinputcomponent'} - - {:else if component.type === 'timeinputcomponent'} - - {:else if component.type === 'datetimeinputcomponent'} - - {:else if component.type === 'numberinputcomponent'} - - {:else if component.type === 'currencycomponent'} - - {:else if component.type === 'slidercomponent'} - - {:else if component.type === 'dateslidercomponent'} - - {:else if component.type === 'horizontaldividercomponent'} - - {:else if component.type === 'verticaldividercomponent'} - - {:else if component.type === 'rangecomponent'} - - {:else if component.type === 'tabscomponent' && component.tabs} - - {:else if component.type === 'steppercomponent' && component.tabs} - - {:else if component.type === 'conditionalwrapper' && component.conditions} - - {:else if component.type === 'containercomponent'} - - {:else if component.type === 'listcomponent'} - - {:else if component.type === 'verticalsplitpanescomponent'} - - {:else if component.type === 'horizontalsplitpanescomponent'} - - {:else if component.type === 'iconcomponent'} - - {:else if component.type === 'fileinputcomponent'} - - {:else if component.type === 's3fileinputcomponent'} - - {:else if component.type === 'imagecomponent'} - - {:else if component.type === 'drawercomponent'} - - {:else if component.type === 'mapcomponent'} - - {:else if component.type === 'pdfcomponent'} - - {:else if component.type === 'modalcomponent'} - - {:else if component.type === 'schemaformcomponent'} - - {:else if component.type === 'selecttabcomponent'} - - {:else if component.type === 'selectstepcomponent'} - - {:else if component.type === 'chartjscomponent'} - - {:else if component.type === 'chartjscomponentv2'} - - {:else if component.type === 'carousellistcomponent'} - - {:else if component.type === 'accordionlistcomponent'} - - {:else if component.type === 'statcomponent'} - - {:else if component.type === 'menucomponent'} - - {:else if component.type === 'decisiontreecomponent' && component.nodes} - - {:else if component.type === 'alertcomponent'} - - {:else if component.type === 'navbarcomponent'} - - {:else if component.type === 'dateselectcomponent'} - - {:else if component.type === 'jobiddisplaycomponent'} - - {:else if component.type === 'recomputeallcomponent'} - - {/if} -
-
-{#if initializing} - - -
{ - if (component.id !== $hoverStore) { - $hoverStore = component.id - } - }} - on:mouseout|stopPropagation={() => { - if ($hoverStore !== undefined) { - $hoverStore = undefined - } - }} - class="absolute inset-0 center-center flex-col bg- border animate-skeleton" +{#if everRender} + +{:else} + {/if} diff --git a/frontend/src/lib/components/apps/editor/component/ComponentInner.svelte b/frontend/src/lib/components/apps/editor/component/ComponentInner.svelte new file mode 100644 index 0000000000..9973ebbcbf --- /dev/null +++ b/frontend/src/lib/components/apps/editor/component/ComponentInner.svelte @@ -0,0 +1,778 @@ + + +{#if component.type === 'displaycomponent'} + +{:else if component.type === 'logcomponent'} + +{:else if component.type === 'jobidlogcomponent'} + +{:else if component.type === 'flowstatuscomponent'} + +{:else if component.type === 'jobidflowstatuscomponent'} + +{:else if component.type === 'barchartcomponent'} + +{:else if component.type === 'timeseriescomponent'} + +{:else if component.type === 'htmlcomponent'} + +{:else if component.type === 'customcomponent'} + +{:else if component.type === 'mardowncomponent'} + +{:else if component.type === 'vegalitecomponent'} + +{:else if component.type === 'plotlycomponent'} + +{:else if component.type === 'plotlycomponentv2'} + +{:else if component.type === 'scatterchartcomponent'} + +{:else if component.type === 'piechartcomponent'} + +{:else if component.type === 'agchartscomponent'} + +{:else if component.type === 'agchartscomponentee'} + +{:else if component.type === 'tablecomponent'} + +{:else if component.type === 'dbexplorercomponent'} + +{:else if component.type === 'aggridcomponent'} + +{:else if component.type === 'aggridcomponentee'} + +{:else if component.type === 'aggridinfinitecomponent'} + +{:else if component.type === 'aggridinfinitecomponentee'} + +{:else if component.type === 'textcomponent'} + +{:else if component.type === 'buttoncomponent'} + +{:else if component.type === 'downloadcomponent'} + +{:else if component.type === 'selectcomponent' || component.type === 'resourceselectcomponent'} + +{:else if component.type === 'userresourcecomponent'} + +{:else if component.type === 'multiselectcomponent'} + +{:else if component.type === 'multiselectcomponentv2'} + +{:else if component.type === 'formcomponent'} + +{:else if component.type === 'formbuttoncomponent'} + +{:else if component.type === 'checkboxcomponent'} + +{:else if component.type === 'textinputcomponent'} + +{:else if component.type === 'quillcomponent'} + +{:else if component.type === 'textareainputcomponent'} + +{:else if component.type === 'emailinputcomponent'} + +{:else if component.type === 'passwordinputcomponent'} + +{:else if component.type === 'dateinputcomponent'} + +{:else if component.type === 'timeinputcomponent'} + +{:else if component.type === 'datetimeinputcomponent'} + +{:else if component.type === 'numberinputcomponent'} + +{:else if component.type === 'currencycomponent'} + +{:else if component.type === 'slidercomponent'} + +{:else if component.type === 'dateslidercomponent'} + +{:else if component.type === 'horizontaldividercomponent'} + +{:else if component.type === 'verticaldividercomponent'} + +{:else if component.type === 'rangecomponent'} + +{:else if component.type === 'tabscomponent' && component.tabs} + +{:else if component.type === 'steppercomponent' && component.tabs} + +{:else if component.type === 'conditionalwrapper' && component.conditions} + +{:else if component.type === 'containercomponent'} + +{:else if component.type === 'listcomponent'} + +{:else if component.type === 'verticalsplitpanescomponent'} + +{:else if component.type === 'horizontalsplitpanescomponent'} + +{:else if component.type === 'iconcomponent'} + +{:else if component.type === 'fileinputcomponent'} + +{:else if component.type === 's3fileinputcomponent'} + +{:else if component.type === 'imagecomponent'} + +{:else if component.type === 'drawercomponent'} + +{:else if component.type === 'mapcomponent'} + +{:else if component.type === 'pdfcomponent'} + +{:else if component.type === 'modalcomponent'} + +{:else if component.type === 'schemaformcomponent'} + +{:else if component.type === 'selecttabcomponent'} + +{:else if component.type === 'selectstepcomponent'} + +{:else if component.type === 'chartjscomponent'} + +{:else if component.type === 'chartjscomponentv2'} + +{:else if component.type === 'carousellistcomponent'} + +{:else if component.type === 'accordionlistcomponent'} + +{:else if component.type === 'statcomponent'} + +{:else if component.type === 'menucomponent'} + +{:else if component.type === 'decisiontreecomponent' && component.nodes} + +{:else if component.type === 'alertcomponent'} + +{:else if component.type === 'navbarcomponent'} + +{:else if component.type === 'dateselectcomponent'} + +{:else if component.type === 'jobiddisplaycomponent'} + +{:else if component.type === 'recomputeallcomponent'} + +{/if} diff --git a/frontend/src/lib/components/apps/editor/component/ComponentRendered.svelte b/frontend/src/lib/components/apps/editor/component/ComponentRendered.svelte new file mode 100644 index 0000000000..0a7c79fd1b --- /dev/null +++ b/frontend/src/lib/components/apps/editor/component/ComponentRendered.svelte @@ -0,0 +1,219 @@ + + + + + + +
{ + outTimeout && clearTimeout(outTimeout) + if (component.id !== $hoverStore) { + $hoverStore = component.id + } + }} + on:mouseout|stopPropagation={mouseOut} + class={twMerge( + 'h-full flex flex-col w-full component relative', + initializing ? 'overflow-hidden h-0' : '' + )} + data-connection-button +> + {#if render} + {#if locked && componentActive && $componentActive && moveMode === 'move' && componentDraggedId && componentDraggedId !== component.id && cachedAreOnTheSameSubgrid} +
+
+ +
Anchored: The component cannot be moved.
+
+
+ {:else if moveMode === 'insert' && isContainer(component.type) && componentDraggedId && componentDraggedId !== component.id && cachedComponentDraggedIsNotChild} +
+ {/if} + {#if $mode !== 'preview'} + { + outTimeout && clearTimeout(outTimeout) + + if (component.id !== $hoverStore) { + $hoverStore = component.id + } + }} + hover={$hoverStore === component.id} + {component} + {selected} + {fullHeight} + connecting={$connectingInput.opened} + on:lock + on:expand + on:fillHeight + {locked} + {inlineEditorOpened} + hasInlineEditor={component.type === 'textcomponent' && + component.componentInput && + component.componentInput.type !== 'connected'} + on:triggerInlineEditor={() => { + inlineEditorOpened = !inlineEditorOpened + }} + {errorHandledByComponent} + {componentContainerWidth} + /> + {/if} + + {#if ismoving} +
+ +
+ {/if} + {/if} +
+ +
+
+{#if initializing && render && showSkeleton} + + +
{ + if (component.id !== $hoverStore) { + $hoverStore = component.id + } + }} + on:mouseout|stopPropagation={() => { + if ($hoverStore !== undefined) { + $hoverStore = undefined + } + }} + class="absolute inset-0 center-center flex-col border animate-skeleton dark:bg-frost-900/50 [animation-delay:1000ms]" + /> +{/if} diff --git a/frontend/src/lib/components/apps/svelte-grid/Grid.svelte b/frontend/src/lib/components/apps/svelte-grid/Grid.svelte index 6a4d0da8d1..fa74b33d9a 100644 --- a/frontend/src/lib/components/apps/svelte-grid/Grid.svelte +++ b/frontend/src/lib/components/apps/svelte-grid/Grid.svelte @@ -9,6 +9,8 @@ -
- -
+{#if !noButton} +
+ +
+{/if} diff --git a/frontend/src/lib/components/triggers/TriggersEditor.svelte b/frontend/src/lib/components/triggers/TriggersEditor.svelte index 29d739036b..68bf72a88b 100644 --- a/frontend/src/lib/components/triggers/TriggersEditor.svelte +++ b/frontend/src/lib/components/triggers/TriggersEditor.svelte @@ -140,7 +140,18 @@
{:else if $selectedTrigger === 'postgres'}
- +
{:else if $selectedTrigger === 'kafka' || $selectedTrigger === 'nats'}
diff --git a/frontend/src/lib/components/triggers/TriggersEditorSection.svelte b/frontend/src/lib/components/triggers/TriggersEditorSection.svelte index f684bf69a0..8c01f3468e 100644 --- a/frontend/src/lib/components/triggers/TriggersEditorSection.svelte +++ b/frontend/src/lib/components/triggers/TriggersEditorSection.svelte @@ -31,7 +31,8 @@ webhook: 'Webhook', kafka: '+ New Kafka trigger', email: 'Email trigger', - nats: '+ New NATS trigger' + nats: '+ New NATS trigger', + postgres: '+ New Postgres trigger' } const { captureOn } = getContext('TriggerContext') diff --git a/frontend/src/lib/components/triggers/TriggersWrapper.svelte b/frontend/src/lib/components/triggers/TriggersWrapper.svelte index 90db46c6d9..150414795a 100644 --- a/frontend/src/lib/components/triggers/TriggersWrapper.svelte +++ b/frontend/src/lib/components/triggers/TriggersWrapper.svelte @@ -8,6 +8,7 @@ import EmailTriggerConfigSection from '../details/EmailTriggerConfigSection.svelte' import KafkaTriggersConfigSection from './kafka/KafkaTriggersConfigSection.svelte' import NatsTriggersConfigSection from './nats/NatsTriggersConfigSection.svelte' + import PostgresEditorConfigSection from './postgres/PostgresEditorConfigSection.svelte' export let triggerType: CaptureTriggerKind = 'webhook' export let cloudDisabled: boolean = false @@ -30,6 +31,14 @@ bind:url_runnable_args={args.url_runnable_args} showCapture={false} /> + {:else if triggerType === 'postgres'} + {:else if triggerType === 'webhook'} + import { Button } from '$lib/components/common' + import Tooltip from '$lib/components/Tooltip.svelte' + import { PostgresTriggerService } from '$lib/gen' + import { workspaceStore } from '$lib/stores' + import { sendUserToast } from '$lib/toast' + import { emptyString } from '$lib/utils' + + let loadingConfiguration = false + + const checkDatabaseConfiguration = async () => { + if (emptyString(postgres_resource_path)) { + sendUserToast('You must first pick a database resource', true) + return + } + try { + const invalidConfig = !(await PostgresTriggerService.isValidPostgresConfiguration({ + workspace: $workspaceStore!, + path: postgres_resource_path + })) + + let msg = 'Database is in logical mode. Triggers can be used.' + + if (invalidConfig) { + msg = + 'Database is NOT in logical mode. Triggers cannot be used. Refer to the PostgreSQL documentation for configuration requirements.' + } + + sendUserToast(msg, invalidConfig) + } catch (error) { + sendUserToast(error.body, true) + } + + loadingConfiguration = false + } + + const checkConnectionAndDatabaseConfiguration = async () => { + try { + loadingConfiguration = true + if (checkConnection) { + await checkConnection() + } + await checkDatabaseConfiguration() + } catch (error) { + sendUserToast(error.body, true) + } + loadingConfiguration = false + } + + export let can_write: boolean + export let postgres_resource_path: string + export let checkConnection: any | undefined = undefined + + console.log('dbg check connection', checkConnection) + + +{#if postgres_resource_path} +
+ +
+{/if} diff --git a/frontend/src/lib/components/triggers/postgres/PostgresEditorConfigSection.svelte b/frontend/src/lib/components/triggers/postgres/PostgresEditorConfigSection.svelte new file mode 100644 index 0000000000..d6a6340584 --- /dev/null +++ b/frontend/src/lib/components/triggers/postgres/PostgresEditorConfigSection.svelte @@ -0,0 +1,158 @@ + + +
+ {#if showCapture && captureInfo} + + {/if} +
+
+
+

+ Pick a database to connect to +

+ { + if (emptyString(postgres_resource_path)) { + selectedTable = 'specific' + publication = { ...DEFAULT_PUBLICATION } + } + }} + /> + {#if postgres_resource_path} + + + {/if} +
+ {#if postgres_resource_path} + + + {/if} +
+
+
diff --git a/frontend/src/lib/components/triggers/postgres/PostgresTriggerEditor.svelte b/frontend/src/lib/components/triggers/postgres/PostgresTriggerEditor.svelte index d5f410e594..9b46ac2b0b 100644 --- a/frontend/src/lib/components/triggers/postgres/PostgresTriggerEditor.svelte +++ b/frontend/src/lib/components/triggers/postgres/PostgresTriggerEditor.svelte @@ -9,10 +9,10 @@ drawer?.openEdit(ePath, isFlow) } - export async function openNew(is_flow: boolean, initial_script_path?: string) { + export async function openNew(is_flow: boolean, initial_script_path?: string, defaultValues?: Record) { open = true await tick() - drawer?.openNew(is_flow, initial_script_path) + drawer?.openNew(is_flow, initial_script_path, defaultValues) } let drawer: PostgresTriggerEditorInner diff --git a/frontend/src/lib/components/triggers/postgres/PostgresTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/postgres/PostgresTriggerEditorInner.svelte index 14310d1e9d..71919774c9 100644 --- a/frontend/src/lib/components/triggers/postgres/PostgresTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/postgres/PostgresTriggerEditorInner.svelte @@ -10,7 +10,7 @@ import { canWrite, emptyString, emptyStringTrimmed, sendUserToast } from '$lib/utils' import { createEventDispatcher } from 'svelte' import Section from '$lib/components/Section.svelte' - import { Loader2, Save } from 'lucide-svelte' + import { Loader2, Save, X } from 'lucide-svelte' import Label from '$lib/components/Label.svelte' import Toggle from '$lib/components/Toggle.svelte' import ResourcePicker from '$lib/components/ResourcePicker.svelte' @@ -25,6 +25,8 @@ import Tabs from '$lib/components/common/tabs/Tabs.svelte' import Tab from '$lib/components/common/tabs/Tab.svelte' import RelationPicker from './RelationPicker.svelte' + import { invalidRelations } from './utils' + import CheckPostgresRequirement from './CheckPostgresRequirement.svelte' let drawer: Drawer let is_flow: boolean = false @@ -53,13 +55,7 @@ let publicationItems: string[] = [] let transactionType: string[] = ['Insert', 'Update', 'Delete'] let selectedTable: 'all' | 'specific' = 'specific' - let tab: 'advanced' | 'basic' - let config: { isLogical: boolean; show: boolean } = { isLogical: false, show: false } - let loadingConfiguration = false - $: table_to_track = selectedTable === 'all' ? [] : relations - $: if (postgres_resource_path === undefined) { - config.show = false - } + let tab: 'advanced' | 'basic' = 'basic' async function createPublication() { try { const message = await PostgresTriggerService.createPostgresPublication({ @@ -68,7 +64,7 @@ workspace: $workspaceStore!, requestBody: { transaction_to_track: transaction_to_track, - table_to_track + table_to_track: relations } }) @@ -107,7 +103,6 @@ dirtyPath = false selectedPublicationAction = 'get' selectedSlotAction = 'get' - config.show = false selectedPublicationAction = selectedPublicationAction selectedSlotAction = selectedSlotAction relations = [] @@ -121,7 +116,11 @@ } } - export async function openNew(nis_flow: boolean, fixedScriptPath_?: string) { + export async function openNew( + nis_flow: boolean, + fixedScriptPath_?: string, + defaultValues?: Record + ) { drawerLoading = true try { selectedPublicationAction = 'create' @@ -137,16 +136,17 @@ script_path = fixedScriptPath path = '' initialPath = '' - replication_slot_name = '' - publication_name = '' - postgres_resource_path = '' + postgres_resource_path = defaultValues?.postgres_resource_path ?? '' edit = false dirtyPath = false - config.show = false publication_name = `windmill_publication_${random_adj()}` replication_slot_name = `windmill_replication_${random_adj()}` - transaction_to_track = ['Insert', 'Update', 'Delete'] - relations = [ + transaction_to_track = defaultValues?.publication.transaction_to_track || [ + 'Insert', + 'Update', + 'Delete' + ] + relations = defaultValues?.publication.table_to_track || [ { schema_name: 'public', table_to_track: [] @@ -184,6 +184,15 @@ } async function updateTrigger(): Promise { + if ( + selectedTable === 'specific' && + invalidRelations(relations, { + showError: true, + trackSchemaTableError: true + }) === true + ) { + return + } if (edit) { await PostgresTriggerService.updatePostgresTrigger({ workspace: $workspaceStore!, @@ -200,7 +209,7 @@ tab === 'basic' ? { transaction_to_track, - table_to_track + table_to_track: relations } : undefined } @@ -219,7 +228,7 @@ publication_name: tab === 'basic' ? undefined : publication_name, publication: { transaction_to_track, - table_to_track + table_to_track: relations } } }) @@ -256,24 +265,6 @@ sendUserToast(error.body, true) } } - - const checkDatabaseConfiguration = async () => { - if (emptyString(postgres_resource_path)) { - sendUserToast('You must first pick a database resource', true) - return - } - try { - loadingConfiguration = true - config.isLogical = await PostgresTriggerService.isValidPostgresConfiguration({ - workspace: $workspaceStore!, - path: postgres_resource_path - }) - config.show = true - } catch (error) { - sendUserToast(error.body, true) - } - loadingConfiguration = false - } @@ -311,9 +302,10 @@ disabled={pathError != '' || emptyString(postgres_resource_path) || emptyString(script_path) || - ((emptyString(replication_slot_name) || emptyString(publication_name)) && - tab === 'advanced') || - (relations.length === 0 && tab === 'basic') || + (tab === 'advanced' && emptyString(replication_slot_name)) || + emptyString(publication_name) || + (selectedTable !== 'all' && tab === 'basic' && relations.length === 0) || + transaction_to_track.length === 0 || !can_write} on:click={updateTrigger} > @@ -327,74 +319,28 @@

Loading...

{:else} -
- - {#if edit} - Changes can take up to 30 seconds to take effect. - {:else} - New postgres triggers can take up to 30 seconds to start listening. - {/if} - -
+ + {#if edit} + Changes can take up to 30 seconds to take effect. + {:else} + New postgres triggers can take up to 30 seconds to start listening. + {/if} +
-
- -
- -
-

- Pick a database to connect to -

-
- - {#if postgres_resource_path} - - {#if config.show} - - {#if config.isLogical} - Your database is correctly configured with logical replication enabled. You can - proceed with using the streaming feature - {:else} - Logical replication is not enabled on your database. To use this feature, your - Postgres database must have wal_level configured as 'logical' in your - database configuration. - {/if} - - {/if} - {/if} -
-
+
-

+

Pick a script or flow to be triggered

@@ -411,6 +357,7 @@ {#if script_path === undefined && is_flow === false}
- {#if postgres_resource_path} -
-
-

- Choose which table of your database to track as well as what kind of transaction - should fire the script.
- You must pick a database resource first to make the configuration of your trigger - -

-
-

- Choose the types of database transactions that should trigger a script or flow. - You can select from Insert, Update, - Delete, or any combination of these operations to define when the - trigger should activate. -

+
+

+ Pick a database to connect to +

+
+
+ + +
+ + {#if postgres_resource_path} +
-
-

- Select the tables to track. You can choose to track - all tables in your database, - all tables within a specific schema, - specific tables in a schema, or even - specific columns of a table. Additionally, you can apply a - filter to retrieve only rows that do not match the specified criteria. -

+ ulOptionsClass={'!bg-surface !text-sm'} + ulSelectedClass="!text-sm" + outerDivClass="!bg-surface !min-h-[38px] !border-[#d1d5db]" + placeholder="Select transactions" + --sms-options-margin="4px" + --sms-open-z-index="100" + > + +
+ +
+
+ + +
-
-
- {/if} + + {/if} +
+
{/if} diff --git a/frontend/src/lib/components/triggers/postgres/PostgresTriggersPanel.svelte b/frontend/src/lib/components/triggers/postgres/PostgresTriggersPanel.svelte index 15742bd04c..cd707bb5d3 100644 --- a/frontend/src/lib/components/triggers/postgres/PostgresTriggersPanel.svelte +++ b/frontend/src/lib/components/triggers/postgres/PostgresTriggersPanel.svelte @@ -1,29 +1,48 @@ -
- - - - +
+
+
+ { + if (selectedTable === 'all') { + cached = relations + relations = [] + } else { + relations = cached + } + }} + bind:selected={selectedTable} + > + + + +
+
{#if selectedTable !== 'all'} {#if relations && relations.length > 0} - {#each relations as v, i} -
-
- - {#each v.table_to_track as table_to_track, j} -
-
- - -
+
- -
- {/each} + {/each} +
{/if} -
- + + + +
{/if}
diff --git a/frontend/src/lib/components/triggers/postgres/utils.ts b/frontend/src/lib/components/triggers/postgres/utils.ts new file mode 100644 index 0000000000..6b4e3e91b5 --- /dev/null +++ b/frontend/src/lib/components/triggers/postgres/utils.ts @@ -0,0 +1,102 @@ +import type { Relations } from '$lib/gen' +import { sendUserToast } from '$lib/toast' +import { emptyString } from '$lib/utils' + +type RelationError = { + schemaIndex: number + tableIndex: number + schemaError: boolean + tableError: boolean + schemaName?: string + trackAllTablesInSchema: boolean + trackSpecificColumnsInTable: boolean + duplicateSchemaName: boolean | undefined +} +export function invalidRelations( + relations: Relations[], + options?: { + trackSchemaTableError?: boolean + showError?: boolean + } +): boolean { + let error: RelationError = { + schemaIndex: -1, + tableIndex: -1, + schemaError: false, + tableError: false, + trackAllTablesInSchema: false, + trackSpecificColumnsInTable: false, + duplicateSchemaName: undefined + } + + const duplicateName: Set = new Set() + for (const [schemaIndex, relation] of relations.entries()) { + error.schemaIndex = schemaIndex + 1 + error.schemaName = relation.schema_name + if (emptyString(relation.schema_name)) { + error.schemaError = true + break + } else { + if (duplicateName.has(relation.schema_name)) { + error.duplicateSchemaName = true + break + } + duplicateName.add(relation.schema_name) + const tableToTrack = relation.table_to_track + if (tableToTrack.length > 0) { + for (const [tableIndex, table] of tableToTrack.entries()) { + if (emptyString(table.table_name)) { + error.tableError = true + error.tableIndex = tableIndex + 1 + break + } + if ( + !error.trackSpecificColumnsInTable && + table.columns_name && + table.columns_name.length > 0 + ) { + error.trackSpecificColumnsInTable = true + } + } + if (error.tableError) { + break + } + } else if (!error.trackAllTablesInSchema) { + error.trackAllTablesInSchema = true + } + + if ( + options?.trackSchemaTableError && + error.trackAllTablesInSchema && + error.trackSpecificColumnsInTable + ) { + break + } + } + } + const errorFound = + error.tableError || + error.schemaError || + error.duplicateSchemaName || + ((options?.trackSchemaTableError ?? false) && + error.trackAllTablesInSchema && + error.trackSpecificColumnsInTable) + if ((options?.showError ?? false) && errorFound) { + let errorMessage: string = '' + + if (error.schemaError) { + errorMessage = `Schema Error: Please enter a name for schema number ${error.schemaIndex}` + } else if (error.tableError) { + errorMessage = `Table Error: Please enter a name for table number ${error.tableIndex} inside schema number ${error.schemaIndex}` + errorMessage += emptyString(error.schemaName) ? '' : ` named: ${error.schemaName}` + } else if (error.duplicateSchemaName) { + errorMessage = `Schema Error: schema name '${error.schemaName}' is already taken` + } else { + errorMessage = + 'Configuration Error: Schema-level tracking and specific table tracking with column selection cannot be used together. Refer to the documentation for valid configurations.' + } + sendUserToast(errorMessage, true) + } + + return errorFound +} diff --git a/frontend/src/lib/script_helpers.ts b/frontend/src/lib/script_helpers.ts index a314073626..3cf9735a7f 100644 --- a/frontend/src/lib/script_helpers.ts +++ b/frontend/src/lib/script_helpers.ts @@ -705,7 +705,7 @@ class Nats(TypedDict): length: int class WmTrigger(TypedDict): - kind: Literal["http", "email", "webhook", "websocket", "kafka", "nats"] + kind: Literal["http", "email", "webhook", "websocket", "kafka", "nats", "postgres"] http: Http | None websocket: Websocket | None kafka: Kafka | None diff --git a/frontend/src/routes/(root)/(logged)/postgres_triggers/+page.svelte b/frontend/src/routes/(root)/(logged)/postgres_triggers/+page.svelte index c69a447f3b..76bb1f4bac 100644 --- a/frontend/src/routes/(root)/(logged)/postgres_triggers/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/postgres_triggers/+page.svelte @@ -389,7 +389,7 @@ displayName: canWrite ? 'Share' : 'See Permissions', icon: Share, action: () => { - shareModal.openDrawer(path, 'websocket_trigger') + shareModal.openDrawer(path, 'postgres_trigger') } } ]} From 15a1582f5e86d81aa8247a7d58be38264c3e0666 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 11 Feb 2025 19:13:46 +0100 Subject: [PATCH 05/14] subgrid fix --- .../layout/AppConditionalWrapper.svelte | 2 + .../apps/components/layout/AppList.svelte | 130 +++++++++--------- .../apps/editor/SubGridEditor.svelte | 4 + 3 files changed, 70 insertions(+), 66 deletions(-) diff --git a/frontend/src/lib/components/apps/components/layout/AppConditionalWrapper.svelte b/frontend/src/lib/components/apps/components/layout/AppConditionalWrapper.svelte index cc6c38a364..5862a9883e 100644 --- a/frontend/src/lib/components/apps/components/layout/AppConditionalWrapper.svelte +++ b/frontend/src/lib/components/apps/components/layout/AppConditionalWrapper.svelte @@ -122,7 +122,9 @@ {/if}
{:else if $app.subgrids} + {JSON.stringify(resolvedConditions)} {#each resolvedConditions ?? [] as _res, i} + {i} {/each} {/if} diff --git a/frontend/src/lib/components/apps/components/layout/AppList.svelte b/frontend/src/lib/components/apps/components/layout/AppList.svelte index 44e0a56509..6498410036 100644 --- a/frontend/src/lib/components/apps/components/layout/AppList.svelte +++ b/frontend/src/lib/components/apps/components/layout/AppList.svelte @@ -153,75 +153,73 @@ ? 'divide-y flex-col' : 'flex-col'}" > - {#if $app.subgrids?.[`${id}-0`]} - {#if Array.isArray(result) && result.length > 0} - {#each result ?? [] as value, index (index)} - {@const inRange = index <= pagination.maxIndex && index >= pagination.indexOffset} -
0} + {#each result ?? [] as value, index (index)} + {@const inRange = index <= pagination.maxIndex && index >= pagination.indexOffset} +
+ { + if (!inputs[id]) { + inputs[id] = { [index]: value } + } else { + inputs[id] = { ...inputs[id], [index]: value } + } + outputs?.inputs.set(inputs, true) + }} + onRemove={(id) => { + if (inputs?.[id] == undefined) { + return + } + if (index == 0) { + delete inputs[id] + inputs = { ...inputs } + } else { + delete inputs[id][index] + inputs[id] = { ...inputs[id] } + } + outputs?.inputs.set(inputs, true) + }} + {value} + {index} > - { - if (!inputs[id]) { - inputs[id] = { [index]: value } - } else { - inputs[id] = { ...inputs[id], [index]: value } + { + if (!$connectingInput.opened) { + $selectedComponent = [id] } - outputs?.inputs.set(inputs, true) + onFocus() }} - onRemove={(id) => { - if (inputs?.[id] == undefined) { - return - } - if (index == 0) { - delete inputs[id] - inputs = { ...inputs } - } else { - delete inputs[id][index] - inputs[id] = { ...inputs[id] } - } - outputs?.inputs.set(inputs, true) - }} - {value} - {index} - > - { - if (!$connectingInput.opened) { - $selectedComponent = [id] - } - onFocus() - }} - /> - -
- {/each} - {:else} - - - - {#if !Array.isArray(result)} -
Input data is not an array
- {/if} + /> + +
+ {/each} + {:else} + + + + {#if !Array.isArray(result)} +
Input data is not an array
{/if} {/if}
diff --git a/frontend/src/lib/components/apps/editor/SubGridEditor.svelte b/frontend/src/lib/components/apps/editor/SubGridEditor.svelte index 96b4b6cbb8..30cb92bfa6 100644 --- a/frontend/src/lib/components/apps/editor/SubGridEditor.svelte +++ b/frontend/src/lib/components/apps/editor/SubGridEditor.svelte @@ -329,4 +329,8 @@ {/if}
+{:else} + {#each $app?.subgrids?.[subGridId] ?? [] as item} + + {/each} {/if} From 9cdc1a2a34afabaeb4189c206c5d5401cd097c79 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 11 Feb 2025 19:14:22 +0100 Subject: [PATCH 06/14] subgrid fix --- .../apps/components/layout/AppConditionalWrapper.svelte | 2 -- 1 file changed, 2 deletions(-) diff --git a/frontend/src/lib/components/apps/components/layout/AppConditionalWrapper.svelte b/frontend/src/lib/components/apps/components/layout/AppConditionalWrapper.svelte index 5862a9883e..cc6c38a364 100644 --- a/frontend/src/lib/components/apps/components/layout/AppConditionalWrapper.svelte +++ b/frontend/src/lib/components/apps/components/layout/AppConditionalWrapper.svelte @@ -122,9 +122,7 @@ {/if} {:else if $app.subgrids} - {JSON.stringify(resolvedConditions)} {#each resolvedConditions ?? [] as _res, i} - {i} {/each} {/if} From c4b4cc51fc734242f6a7164a794e4419dbb45e5c Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 11 Feb 2025 19:38:03 +0100 Subject: [PATCH 07/14] fix nit on conditionnal wrapper in disabled subcomponents --- .../apps/components/helpers/eval.ts | 23 ++++++++----------- .../layout/AppConditionalWrapper.svelte | 2 +- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/frontend/src/lib/components/apps/components/helpers/eval.ts b/frontend/src/lib/components/apps/components/helpers/eval.ts index ede329350b..78147dc22b 100644 --- a/frontend/src/lib/components/apps/components/helpers/eval.ts +++ b/frontend/src/lib/components/apps/components/helpers/eval.ts @@ -28,17 +28,15 @@ function create_context_function_template( return ` return async function (context, state, createProxy, goto, setTab, recompute, getAgGrid, setValue, setSelectedIndex, openModal, closeModal, open, close, validate, invalidate, validateAll, clearFiles, showToast, waitJob, askNewResource, downloadFile) { "use strict"; -${ - contextKeys && contextKeys.length > 0 - ? `let ${contextKeys.map((key) => ` ${key} = createProxy('${key}', context['${key}'])`)};` - : `` -} -${ - hasReturnAsLastLine - ? eval_string - : ` +${contextKeys && contextKeys.length > 0 + ? `let ${contextKeys.map((key) => ` ${key} = createProxy('${key}', context['${key}'])`)};` + : `` + } +${hasReturnAsLastLine + ? eval_string + : ` return ${eval_string.startsWith('return ') ? eval_string.substring(7) : eval_string}` -} + } } ` @@ -271,9 +269,8 @@ export async function eval_like( if (typeof input === 'object' && input.s3) { const workspaceId = computeGlobalContext(worldStore).ctx.workspace - const s3href = `${base}/api/w/${workspaceId}/job_helpers/download_s3_file?file_key=${ - input?.s3 - }${input?.storage ? `&storage=${input.storage}` : ''}` + const s3href = `${base}/api/w/${workspaceId}/job_helpers/download_s3_file?file_key=${input?.s3 + }${input?.storage ? `&storage=${input.storage}` : ''}` downloadFile(s3href, filename || input.s3) } else if (typeof input === 'string') { if (input.startsWith('data:')) { diff --git a/frontend/src/lib/components/apps/components/layout/AppConditionalWrapper.svelte b/frontend/src/lib/components/apps/components/layout/AppConditionalWrapper.svelte index cc6c38a364..915a1963b6 100644 --- a/frontend/src/lib/components/apps/components/layout/AppConditionalWrapper.svelte +++ b/frontend/src/lib/components/apps/components/layout/AppConditionalWrapper.svelte @@ -43,7 +43,7 @@ let css = initCss($app.css?.conditionalwrapper, customCss) - let resolvedConditions: boolean[] = [] + let resolvedConditions: boolean[] = conditions.map((_x) => false) let selectedConditionIndex = 0 function handleResolvedConditions() { From bb11bfe874fe4543d87da8a9334b6376b056a323 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 11 Feb 2025 19:43:33 +0100 Subject: [PATCH 08/14] clarify frontend draft storage error message --- frontend/src/lib/components/apps/editor/AppEditor.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/lib/components/apps/editor/AppEditor.svelte b/frontend/src/lib/components/apps/editor/AppEditor.svelte index a1acf8e681..fcaf9af1db 100644 --- a/frontend/src/lib/components/apps/editor/AppEditor.svelte +++ b/frontend/src/lib/components/apps/editor/AppEditor.svelte @@ -225,7 +225,7 @@ try { localStorage.setItem(path != '' ? `app-${path}` : 'app', encodeState($appStore)) } catch (err) { - console.error(err) + console.error('Error storing frontend draft in localStorage', err) } }, 500) } From 7c4b8a7e1dca870b51b60f33a352d344ef34218f Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 11 Feb 2025 20:38:13 +0100 Subject: [PATCH 09/14] feat: lazy mode --- .../apps/editor/AppEditorHeader.svelte | 17 ++++++- .../apps/editor/RecomputeAllComponents.svelte | 23 ++++++--- .../apps/editor/RecomputeAllWrapper.svelte | 12 +---- .../apps/editor/SubGridEditor.svelte | 2 +- .../editor/contextPanel/LazyModePanel.svelte | 50 +++++++++++++++++++ frontend/src/lib/components/apps/types.ts | 13 ++--- 6 files changed, 92 insertions(+), 25 deletions(-) create mode 100644 frontend/src/lib/components/apps/editor/contextPanel/LazyModePanel.svelte diff --git a/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte b/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte index eaeeb096ba..ad4312efbf 100644 --- a/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte +++ b/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte @@ -31,7 +31,8 @@ FileClock, Sun, Moon, - SunMoon + SunMoon, + Zap } from 'lucide-svelte' import { createEventDispatcher, getContext } from 'svelte' import { Pane, Splitpanes } from 'svelte-splitpanes' @@ -92,6 +93,7 @@ import { isCloudHosted } from '$lib/cloud' import { base } from '$lib/base' import ClipboardPanel from '$lib/components/details/ClipboardPanel.svelte' + import LazyModePanel from './contextPanel/LazyModePanel.svelte' async function hash(message) { try { @@ -175,6 +177,7 @@ let inputsDrawerOpen = fromHub let historyBrowserDrawerOpen = false let debugAppDrawerOpen = false + let lazyDrawerOpen = false let deploymentMsg: string | undefined = undefined function closeSaveDrawer() { @@ -871,6 +874,13 @@ action: () => { debugAppDrawerOpen = true } + }, + { + displayName: 'Lazy mode', + icon: Zap, + action: () => { + lazyDrawerOpen = true + } } ] @@ -1267,6 +1277,11 @@ + + (lazyDrawerOpen = false)}> + + + import { getContext, onMount } from 'svelte' - import type { AppEditorContext, AppViewerContext } from '../types' - import { allItems } from '../utils' + import type { App, AppEditorContext, AppViewerContext } from '../types' + import { allItems, BG_PREFIX } from '../utils' import RecomputeAllButton from './RecomputeAllButton.svelte' const { runnableComponents, app, initialized, recomputeAllContext } = @@ -13,10 +13,21 @@ let firstLoad = false let progressTimer: NodeJS.Timeout | undefined = undefined - $: !firstLoad && - $initialized.initializedComponents?.length == - allItems($app.grid, $app.subgrids).length + ($app.hiddenInlineScripts?.length ?? 0) && - refresh() + $: !firstLoad && canInitializeAll($initialized?.initializedComponents, $app) && refresh() + + function canInitializeAll(initialized: string[] | undefined, app: App) { + if (app.lazyInitRequire == undefined) { + return ( + initialized?.length == + allItems(app.grid, app.subgrids).length + (app.hiddenInlineScripts?.length ?? 0) + ) + } else { + return ( + app.hiddenInlineScripts?.every((x, i) => initialized?.includes(BG_PREFIX + i)) && + app.lazyInitRequire?.every((x) => initialized?.includes(x)) + ) + } + } $: $recomputeAllContext.componentNumber = Object.values($runnableComponents).filter((x) => x.autoRefresh).length ?? 0 diff --git a/frontend/src/lib/components/apps/editor/RecomputeAllWrapper.svelte b/frontend/src/lib/components/apps/editor/RecomputeAllWrapper.svelte index 83c1fef5be..46a464d71b 100644 --- a/frontend/src/lib/components/apps/editor/RecomputeAllWrapper.svelte +++ b/frontend/src/lib/components/apps/editor/RecomputeAllWrapper.svelte @@ -1,8 +1,6 @@
-{:else} +{:else if $app.lazyInitRequire == undefined} {#each $app?.subgrids?.[subGridId] ?? [] as item} {/each} diff --git a/frontend/src/lib/components/apps/editor/contextPanel/LazyModePanel.svelte b/frontend/src/lib/components/apps/editor/contextPanel/LazyModePanel.svelte new file mode 100644 index 0000000000..0ae456e7f8 --- /dev/null +++ b/frontend/src/lib/components/apps/editor/contextPanel/LazyModePanel.svelte @@ -0,0 +1,50 @@ + + +
+ + Lazy mode is a feature that allows you to lazy render components which is ideal for apps with + many components where most are not directly visible to the user. +
+ When lazy mode is enabled, components are not rendered until they are needed. This can significantly + improve the performance of your app, especially on mobile devices. +
+ You can enable lazy mode below, but you will need to declare the list of components whose initialization + is expected to see initialized before the initial refresh of the app happens. +
+ + { + $app.lazyInitRequire = e.detail ? [] : undefined + code = JSON.stringify($app.lazyInitRequire) + }} + options={{ + right: 'Lazy mode' + }} + /> + +
+ {#if $app.lazyInitRequire} + + + {'e.g: ["a", "b"]'}, no need to put background runnables ids + + {:else} + Without lazy mode, all components' initialization will be waited on the initial refresh. + {/if} +
+
diff --git a/frontend/src/lib/components/apps/types.ts b/frontend/src/lib/components/apps/types.ts index 7debc557f1..c20fe5e561 100644 --- a/frontend/src/lib/components/apps/types.ts +++ b/frontend/src/lib/components/apps/types.ts @@ -139,13 +139,13 @@ export type HiddenRunnable = { export type AppTheme = | { - type: 'path' - path: string - } + type: 'path' + path: string + } | { - type: 'inlined' - css: string - } + type: 'inlined' + css: string + } export type App = { grid: GridItem[] @@ -162,6 +162,7 @@ export type App = { css?: Partial>> subgrids?: Record theme: AppTheme | undefined + lazyInitRequire?: string[] | undefined hideLegacyTopBar?: boolean | undefined mobileViewOnSmallerScreens?: boolean | undefined version?: number From 09950fb3fb970142c8788c10f110ad5a306e12d3 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 11 Feb 2025 20:41:17 +0100 Subject: [PATCH 10/14] nit lazy mode --- .../components/apps/editor/contextPanel/LazyModePanel.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/lib/components/apps/editor/contextPanel/LazyModePanel.svelte b/frontend/src/lib/components/apps/editor/contextPanel/LazyModePanel.svelte index 0ae456e7f8..f60f053fe9 100644 --- a/frontend/src/lib/components/apps/editor/contextPanel/LazyModePanel.svelte +++ b/frontend/src/lib/components/apps/editor/contextPanel/LazyModePanel.svelte @@ -25,7 +25,7 @@ { $app.lazyInitRequire = e.detail ? [] : undefined code = JSON.stringify($app.lazyInitRequire) @@ -36,7 +36,7 @@ />
- {#if $app.lazyInitRequire} + {#if $app.lazyInitRequire != undefined} {'e.g: ["a", "b"]'}, no need to put background runnables ids From 4da0fc69183630dbe7adffc0321e8e98670966a7 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 11 Feb 2025 20:47:43 +0100 Subject: [PATCH 11/14] nit --- frontend/src/lib/components/apps/editor/SubGridEditor.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/lib/components/apps/editor/SubGridEditor.svelte b/frontend/src/lib/components/apps/editor/SubGridEditor.svelte index 34505f83fd..093fb41032 100644 --- a/frontend/src/lib/components/apps/editor/SubGridEditor.svelte +++ b/frontend/src/lib/components/apps/editor/SubGridEditor.svelte @@ -331,6 +331,6 @@ {:else if $app.lazyInitRequire == undefined} {#each $app?.subgrids?.[subGridId] ?? [] as item} - + {/each} {/if} From 3a490728a818a9d5f509c163115dea369661028f Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 11 Feb 2025 20:47:56 +0100 Subject: [PATCH 12/14] chore(main): release 1.460.0 (#5272) * chore(main): release 1.460.0 * Apply automatic changes --------- Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com> --- CHANGELOG.md | 14 ++ backend/Cargo.lock | 175 +++++++++++------- backend/Cargo.toml | 4 +- backend/windmill-api/openapi.yaml | 2 +- benchmarks/lib.ts | 2 +- cli/main.ts | 2 +- frontend/package-lock.json | 4 +- frontend/package.json | 2 +- lsp/Pipfile | 4 +- openflow.openapi.yaml | 2 +- .../WindmillClient/WindmillClient.psd1 | 2 +- python-client/wmill/pyproject.toml | 2 +- python-client/wmill_pg/pyproject.toml | 2 +- typescript-client/jsr.json | 2 +- typescript-client/package.json | 2 +- version.txt | 2 +- 16 files changed, 135 insertions(+), 88 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8dec2071f2..5624b84212 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## [1.460.0](https://github.com/windmill-labs/windmill/compare/v1.459.0...v1.460.0) (2025-02-11) + + +### Features + +* add postgres trigger captures ([#5165](https://github.com/windmill-labs/windmill/issues/5165)) ([57cfa40](https://github.com/windmill-labs/windmill/commit/57cfa4045bf9aa7c2ef625cf3b24067567466aff)) +* improve large apps performances ([#5265](https://github.com/windmill-labs/windmill/issues/5265)) ([aae3683](https://github.com/windmill-labs/windmill/commit/aae3683fe90adc0eea055238f7776b96140706bd)) +* lazy mode ([7c4b8a7](https://github.com/windmill-labs/windmill/commit/7c4b8a7e1dca870b51b60f33a352d344ef34218f)) + + +### Bug Fixes + +* Remove cache dir mount and mount only the cache executable (Rust, C#) ([#5270](https://github.com/windmill-labs/windmill/issues/5270)) ([6357ed3](https://github.com/windmill-labs/windmill/commit/6357ed3d5e1188bb92ccaf4710e526ab2ec7e874)) + ## [1.459.0](https://github.com/windmill-labs/windmill/compare/v1.458.4...v1.459.0) (2025-02-10) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 335f1a7fa5..e38bf4fb5e 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -1025,7 +1025,7 @@ dependencies = [ "addr2line", "cfg-if", "libc", - "miniz_oxide 0.8.3", + "miniz_oxide 0.8.4", "object", "rustc-demangle", "windows-targets 0.52.6", @@ -1474,9 +1474,9 @@ dependencies = [ [[package]] name = "bzip2-sys" -version = "0.1.11+1.0.8" +version = "0.1.12+1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +checksum = "72ebc2f1a417f01e1da30ef264ee86ae31d2dcd2d603ea283d3c244a883ca2a9" dependencies = [ "cc", "libc", @@ -1668,9 +1668,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.28" +version = "4.5.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e77c3243bd94243c03672cb5154667347c457ca271254724f9f393aee1c05ff" +checksum = "8acebd8ad879283633b343856142139f2da2317c96b05b4dd6181c61e2480184" dependencies = [ "clap_builder", "clap_derive", @@ -1678,9 +1678,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.27" +version = "4.5.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" +checksum = "f6ba32cbda51c7e1dfd49acc1457ba1a7dec5b64fe360e828acb13ca8dc9c2f9" dependencies = [ "anstream", "anstyle", @@ -2776,7 +2776,7 @@ checksum = "688175eed35e7b3053ec114227894ef24786855405d8844058a48bffa997d85a" dependencies = [ "deno_core", "deno_native_certs", - "rustls 0.23.22", + "rustls 0.23.23", "rustls-pemfile 2.2.0", "rustls-tokio-stream", "rustls-webpki 0.102.8", @@ -3345,7 +3345,7 @@ checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", "libz-sys", - "miniz_oxide 0.8.3", + "miniz_oxide 0.8.4", ] [[package]] @@ -4302,7 +4302,7 @@ dependencies = [ "http 1.2.0", "hyper 1.6.0", "hyper-util", - "rustls 0.23.22", + "rustls 0.23.23", "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", @@ -5077,7 +5077,7 @@ dependencies = [ "base64 0.22.1", "gethostname", "mail-builder", - "rustls 0.23.22", + "rustls 0.23.23", "rustls-pki-types", "smtp-proto", "tokio", @@ -5265,9 +5265,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" +checksum = "b3b1c9bd4fe1f0f8b387f6eb9eb3b4a1aa26185e5750efb9140301703f62cd1b" dependencies = [ "adler2", ] @@ -5808,9 +5808,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-src" -version = "300.4.1+3.4.0" +version = "300.4.2+3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faa4eac4138c62414b5622d1b31c5c304f34b406b013c079c2bbc652fdd6678c" +checksum = "168ce4e058f975fe43e89d9ccf78ca668601887ae736090aacc23ae353c298e2" dependencies = [ "cc", ] @@ -5842,13 +5842,27 @@ dependencies = [ "tracing", ] +[[package]] +name = "opentelemetry" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "236e667b670a5cdf90c258f5a55794ec5ac5027e960c224bff8367a59e1e6426" +dependencies = [ + "futures-core", + "futures-sink", + "js-sys", + "pin-project-lite", + "thiserror 2.0.11", + "tracing", +] + [[package]] name = "opentelemetry-appender-tracing" version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5feffc321035ad94088a7e5333abb4d84a8726e54a802e736ce9dd7237e85b" dependencies = [ - "opentelemetry", + "opentelemetry 0.27.1", "tracing", "tracing-core", "tracing-subscriber", @@ -5863,9 +5877,9 @@ dependencies = [ "async-trait", "futures-core", "http 1.2.0", - "opentelemetry", + "opentelemetry 0.27.1", "opentelemetry-proto", - "opentelemetry_sdk", + "opentelemetry_sdk 0.27.1", "prost", "thiserror 1.0.69", "tokio", @@ -5879,17 +5893,17 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6e05acbfada5ec79023c85368af14abd0b307c015e9064d249b2a950ef459a6" dependencies = [ - "opentelemetry", - "opentelemetry_sdk", + "opentelemetry 0.27.1", + "opentelemetry_sdk 0.27.1", "prost", "tonic", ] [[package]] name = "opentelemetry-semantic-conventions" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc1b6902ff63b32ef6c489e8048c5e253e2e4a803ea3ea7e783914536eb15c52" +checksum = "2fb3a2f78c2d55362cd6c313b8abedfbc0142ab3c2676822068fd2ab7d51f9b7" [[package]] name = "opentelemetry_sdk" @@ -5902,11 +5916,29 @@ dependencies = [ "futures-executor", "futures-util", "glob", - "opentelemetry", + "opentelemetry 0.27.1", "percent-encoding", "rand 0.8.5", "serde_json", "thiserror 1.0.69", +] + +[[package]] +name = "opentelemetry_sdk" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84dfad6042089c7fc1f6118b7040dc2eb4ab520abbf410b79dc481032af39570" +dependencies = [ + "async-trait", + "futures-channel", + "futures-executor", + "futures-util", + "glob", + "opentelemetry 0.28.0", + "percent-encoding", + "rand 0.8.5", + "serde_json", + "thiserror 2.0.11", "tokio", "tokio-stream", "tracing", @@ -6425,7 +6457,7 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ - "toml_edit 0.22.23", + "toml_edit 0.22.24", ] [[package]] @@ -6708,7 +6740,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash 2.1.1", - "rustls 0.23.22", + "rustls 0.23.23", "socket2", "thiserror 2.0.11", "tokio", @@ -6726,7 +6758,7 @@ dependencies = [ "rand 0.8.5", "ring 0.17.8", "rustc-hash 2.1.1", - "rustls 0.23.22", + "rustls 0.23.23", "rustls-pki-types", "slab", "thiserror 2.0.11", @@ -7129,7 +7161,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.22", + "rustls 0.23.23", "rustls-native-certs 0.8.1", "rustls-pemfile 2.2.0", "rustls-pki-types", @@ -7395,9 +7427,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.22" +version = "0.23.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb9263ab4eb695e42321db096e3b8fbd715a59b154d5c88d82db2175b681ba7" +checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" dependencies = [ "log", "once_cell", @@ -7479,7 +7511,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22557157d7395bc30727745b365d923f1ecc230c4c80b176545f3f4f08c46e33" dependencies = [ "futures", - "rustls 0.23.22", + "rustls 0.23.23", "socket2", "tokio", ] @@ -7786,12 +7818,13 @@ dependencies = [ [[package]] name = "serde-aux" -version = "4.5.0" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d2e8bfba469d06512e11e3311d4d051a4a387a5b42d010404fecf3200321c95" +checksum = "5290c39c5f6992b9dddbda28541d965dba46468294e6018a408fa297e6c602de" dependencies = [ "chrono", "serde", + "serde-value", "serde_json", ] @@ -8375,7 +8408,7 @@ dependencies = [ "memchr", "once_cell", "percent-encoding", - "rustls 0.23.22", + "rustls 0.23.23", "rustls-pemfile 2.2.0", "serde", "serde_json", @@ -9679,7 +9712,7 @@ version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ - "rustls 0.23.22", + "rustls 0.23.23", "tokio", ] @@ -9791,7 +9824,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.23", + "toml_edit 0.22.24", ] [[package]] @@ -9818,15 +9851,15 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.23" +version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02a8b472d1a3d7c18e2d61a489aee3453fd9031c33e4f55bd533f4a7adca1bee" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ "indexmap 2.7.1", "serde", "serde_spanned", "toml_datetime", - "winnow 0.7.1", + "winnow 0.7.2", ] [[package]] @@ -10056,8 +10089,8 @@ checksum = "97a971f6058498b5c0f1affa23e7ea202057a7301dbff68e968b2d578bcbd053" dependencies = [ "js-sys", "once_cell", - "opentelemetry", - "opentelemetry_sdk", + "opentelemetry 0.27.1", + "opentelemetry_sdk 0.27.1", "smallvec", "tracing", "tracing-core", @@ -10453,7 +10486,7 @@ dependencies = [ "log", "native-tls", "once_cell", - "rustls 0.23.22", + "rustls 0.23.23", "rustls-pki-types", "serde", "serde_json", @@ -10858,7 +10891,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windmill" -version = "1.458.4" +version = "1.460.0" dependencies = [ "anyhow", "axum", @@ -10901,7 +10934,7 @@ dependencies = [ [[package]] name = "windmill-api" -version = "1.458.4" +version = "1.460.0" dependencies = [ "anyhow", "argon2", @@ -10994,7 +11027,7 @@ dependencies = [ [[package]] name = "windmill-api-client" -version = "1.458.4" +version = "1.460.0" dependencies = [ "base64 0.22.1", "chrono", @@ -11012,7 +11045,7 @@ dependencies = [ [[package]] name = "windmill-audit" -version = "1.458.4" +version = "1.460.0" dependencies = [ "chrono", "serde", @@ -11025,7 +11058,7 @@ dependencies = [ [[package]] name = "windmill-autoscaling" -version = "1.458.4" +version = "1.460.0" dependencies = [ "anyhow", "serde", @@ -11039,7 +11072,7 @@ dependencies = [ [[package]] name = "windmill-common" -version = "1.458.4" +version = "1.460.0" dependencies = [ "anyhow", "async-stream", @@ -11066,11 +11099,11 @@ dependencies = [ "magic-crypt", "mail-send", "object_store", - "opentelemetry", + "opentelemetry 0.27.1", "opentelemetry-appender-tracing", "opentelemetry-otlp", "opentelemetry-semantic-conventions", - "opentelemetry_sdk", + "opentelemetry_sdk 0.28.0", "pin-project-lite", "prometheus", "quick_cache", @@ -11098,7 +11131,7 @@ dependencies = [ [[package]] name = "windmill-git-sync" -version = "1.458.4" +version = "1.460.0" dependencies = [ "regex", "serde", @@ -11112,7 +11145,7 @@ dependencies = [ [[package]] name = "windmill-indexer" -version = "1.458.4" +version = "1.460.0" dependencies = [ "anyhow", "bytes", @@ -11135,7 +11168,7 @@ dependencies = [ [[package]] name = "windmill-macros" -version = "1.458.4" +version = "1.460.0" dependencies = [ "itertools 0.14.0", "lazy_static", @@ -11147,7 +11180,7 @@ dependencies = [ [[package]] name = "windmill-parser" -version = "1.458.4" +version = "1.460.0" dependencies = [ "convert_case 0.6.0", "serde", @@ -11156,7 +11189,7 @@ dependencies = [ [[package]] name = "windmill-parser-bash" -version = "1.458.4" +version = "1.460.0" dependencies = [ "anyhow", "lazy_static", @@ -11168,7 +11201,7 @@ dependencies = [ [[package]] name = "windmill-parser-csharp" -version = "1.458.4" +version = "1.460.0" dependencies = [ "anyhow", "serde_json", @@ -11180,7 +11213,7 @@ dependencies = [ [[package]] name = "windmill-parser-go" -version = "1.458.4" +version = "1.460.0" dependencies = [ "anyhow", "gosyn", @@ -11192,7 +11225,7 @@ dependencies = [ [[package]] name = "windmill-parser-graphql" -version = "1.458.4" +version = "1.460.0" dependencies = [ "anyhow", "lazy_static", @@ -11204,7 +11237,7 @@ dependencies = [ [[package]] name = "windmill-parser-php" -version = "1.458.4" +version = "1.460.0" dependencies = [ "anyhow", "itertools 0.14.0", @@ -11215,7 +11248,7 @@ dependencies = [ [[package]] name = "windmill-parser-py" -version = "1.458.4" +version = "1.460.0" dependencies = [ "anyhow", "itertools 0.14.0", @@ -11226,7 +11259,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-imports" -version = "1.458.4" +version = "1.460.0" dependencies = [ "anyhow", "async-recursion", @@ -11246,7 +11279,7 @@ dependencies = [ [[package]] name = "windmill-parser-rust" -version = "1.458.4" +version = "1.460.0" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -11263,7 +11296,7 @@ dependencies = [ [[package]] name = "windmill-parser-sql" -version = "1.458.4" +version = "1.460.0" dependencies = [ "anyhow", "lazy_static", @@ -11275,7 +11308,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts" -version = "1.458.4" +version = "1.460.0" dependencies = [ "anyhow", "lazy_static", @@ -11293,7 +11326,7 @@ dependencies = [ [[package]] name = "windmill-parser-wasm" -version = "1.458.4" +version = "1.460.0" dependencies = [ "anyhow", "getrandom 0.2.15", @@ -11315,7 +11348,7 @@ dependencies = [ [[package]] name = "windmill-parser-yaml" -version = "1.458.4" +version = "1.460.0" dependencies = [ "anyhow", "serde_json", @@ -11325,7 +11358,7 @@ dependencies = [ [[package]] name = "windmill-queue" -version = "1.458.4" +version = "1.460.0" dependencies = [ "anyhow", "async-recursion", @@ -11358,7 +11391,7 @@ dependencies = [ [[package]] name = "windmill-sql-datatype-parser-wasm" -version = "1.458.4" +version = "1.460.0" dependencies = [ "wasm-bindgen", "wasm-bindgen-test", @@ -11368,7 +11401,7 @@ dependencies = [ [[package]] name = "windmill-worker" -version = "1.458.4" +version = "1.460.0" dependencies = [ "anyhow", "async-recursion", @@ -11405,7 +11438,7 @@ dependencies = [ "nix", "object_store", "once_cell", - "opentelemetry", + "opentelemetry 0.27.1", "oracle", "pem 3.0.4", "postgres-native-tls 0.5.1", @@ -11652,9 +11685,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86e376c75f4f43f44db463cf729e0d3acbf954d13e22c51e26e4c264b4ab545f" +checksum = "59690dea168f2198d1a3b0cac23b8063efcd11012f10ae4698f284808c8ef603" dependencies = [ "memchr", ] diff --git a/backend/Cargo.toml b/backend/Cargo.toml index fe9c780d14..ba97c07be3 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "windmill" -version = "1.458.4" +version = "1.460.0" authors.workspace = true edition.workspace = true @@ -30,7 +30,7 @@ members = [ ] [workspace.package] -version = "1.458.4" +version = "1.460.0" authors = ["Ruben Fiszel "] edition = "2021" diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index a710904334..980ac64eca 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.458.4 + version: 1.460.0 title: Windmill API contact: diff --git a/benchmarks/lib.ts b/benchmarks/lib.ts index 7221d958bb..a0985351a5 100644 --- a/benchmarks/lib.ts +++ b/benchmarks/lib.ts @@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts"; import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts"; import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts"; -export const VERSION = "v1.458.4"; +export const VERSION = "v1.460.0"; export async function login(email: string, password: string): Promise { return await windmill.UserService.login({ diff --git a/cli/main.ts b/cli/main.ts index aad1a2ec83..622cbed0bf 100644 --- a/cli/main.ts +++ b/cli/main.ts @@ -62,7 +62,7 @@ export { // } // }); -export const VERSION = "1.458.4"; +export const VERSION = "1.460.0"; const command = new Command() .name("wmill") diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 1d4f18629b..3286a321fd 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "windmill-components", - "version": "1.458.4", + "version": "1.460.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "windmill-components", - "version": "1.458.4", + "version": "1.460.0", "license": "AGPL-3.0", "dependencies": { "@anthropic-ai/sdk": "^0.32.1", diff --git a/frontend/package.json b/frontend/package.json index 5f29a86923..04ea910822 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "windmill-components", - "version": "1.458.4", + "version": "1.460.0", "scripts": { "dev": "vite dev", "build": "vite build", diff --git a/lsp/Pipfile b/lsp/Pipfile index 4808e50712..4a4e123f81 100644 --- a/lsp/Pipfile +++ b/lsp/Pipfile @@ -4,8 +4,8 @@ verify_ssl = true name = "pypi" [packages] -wmill = ">=1.458.4" -wmill_pg = ">=1.458.4" +wmill = ">=1.460.0" +wmill_pg = ">=1.460.0" sendgrid = "*" mysql-connector-python = "*" pymongo = "*" diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index 252d9ced7e..2b05e1695e 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.458.4 + version: 1.460.0 title: OpenFlow Spec contact: name: Ruben Fiszel diff --git a/powershell-client/WindmillClient/WindmillClient.psd1 b/powershell-client/WindmillClient/WindmillClient.psd1 index 4964ae3ec4..4e67ebe729 100644 --- a/powershell-client/WindmillClient/WindmillClient.psd1 +++ b/powershell-client/WindmillClient/WindmillClient.psd1 @@ -12,7 +12,7 @@ RootModule = 'WindmillClient.psm1' # Version number of this module. - ModuleVersion = '1.458.4' + ModuleVersion = '1.460.0' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/python-client/wmill/pyproject.toml b/python-client/wmill/pyproject.toml index 03ec4e6c26..e2c95e9f4c 100644 --- a/python-client/wmill/pyproject.toml +++ b/python-client/wmill/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill" -version = "1.458.4" +version = "1.460.0" description = "A client library for accessing Windmill server wrapping the Windmill client API" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/python-client/wmill_pg/pyproject.toml b/python-client/wmill_pg/pyproject.toml index 871e6fa5c4..b1d3612145 100644 --- a/python-client/wmill_pg/pyproject.toml +++ b/python-client/wmill_pg/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill-pg" -version = "1.458.4" +version = "1.460.0" description = "An extension client for the wmill client library focused on pg" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/typescript-client/jsr.json b/typescript-client/jsr.json index 6d21e4d8c7..27fe399e7a 100644 --- a/typescript-client/jsr.json +++ b/typescript-client/jsr.json @@ -1,6 +1,6 @@ { "name": "@windmill/windmill", - "version": "1.458.4", + "version": "1.460.0", "exports": "./src/index.ts", "publish": { "exclude": ["!src", "./s3Types.ts", "./client.ts"] diff --git a/typescript-client/package.json b/typescript-client/package.json index 5357cc3dd2..5c36777045 100644 --- a/typescript-client/package.json +++ b/typescript-client/package.json @@ -1,7 +1,7 @@ { "name": "windmill-client", "description": "Windmill SDK client for browsers and Node.js", - "version": "1.458.4", + "version": "1.460.0", "author": "Ruben Fiszel", "license": "Apache 2.0", "devDependencies": { diff --git a/version.txt b/version.txt index d22eaab6f1..75369ae609 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.459.0 +1.460.0 From e92a90907f41568e4e04c932e1fbef64ab4c48a9 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 12 Feb 2025 12:11:57 +0100 Subject: [PATCH 13/14] fix: pin opentelemetry to 0.27.1 --- backend/Cargo.lock | 72 +++++++++++++--------------------------------- backend/Cargo.toml | 4 +-- 2 files changed, 22 insertions(+), 54 deletions(-) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index e38bf4fb5e..377df7996c 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -5842,27 +5842,13 @@ dependencies = [ "tracing", ] -[[package]] -name = "opentelemetry" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "236e667b670a5cdf90c258f5a55794ec5ac5027e960c224bff8367a59e1e6426" -dependencies = [ - "futures-core", - "futures-sink", - "js-sys", - "pin-project-lite", - "thiserror 2.0.11", - "tracing", -] - [[package]] name = "opentelemetry-appender-tracing" version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5feffc321035ad94088a7e5333abb4d84a8726e54a802e736ce9dd7237e85b" dependencies = [ - "opentelemetry 0.27.1", + "opentelemetry", "tracing", "tracing-core", "tracing-subscriber", @@ -5877,9 +5863,9 @@ dependencies = [ "async-trait", "futures-core", "http 1.2.0", - "opentelemetry 0.27.1", + "opentelemetry", "opentelemetry-proto", - "opentelemetry_sdk 0.27.1", + "opentelemetry_sdk", "prost", "thiserror 1.0.69", "tokio", @@ -5893,17 +5879,17 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6e05acbfada5ec79023c85368af14abd0b307c015e9064d249b2a950ef459a6" dependencies = [ - "opentelemetry 0.27.1", - "opentelemetry_sdk 0.27.1", + "opentelemetry", + "opentelemetry_sdk", "prost", "tonic", ] [[package]] name = "opentelemetry-semantic-conventions" -version = "0.28.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fb3a2f78c2d55362cd6c313b8abedfbc0142ab3c2676822068fd2ab7d51f9b7" +checksum = "bc1b6902ff63b32ef6c489e8048c5e253e2e4a803ea3ea7e783914536eb15c52" [[package]] name = "opentelemetry_sdk" @@ -5916,29 +5902,11 @@ dependencies = [ "futures-executor", "futures-util", "glob", - "opentelemetry 0.27.1", + "opentelemetry", "percent-encoding", "rand 0.8.5", "serde_json", "thiserror 1.0.69", -] - -[[package]] -name = "opentelemetry_sdk" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84dfad6042089c7fc1f6118b7040dc2eb4ab520abbf410b79dc481032af39570" -dependencies = [ - "async-trait", - "futures-channel", - "futures-executor", - "futures-util", - "glob", - "opentelemetry 0.28.0", - "percent-encoding", - "rand 0.8.5", - "serde_json", - "thiserror 2.0.11", "tokio", "tokio-stream", "tracing", @@ -6608,9 +6576,9 @@ dependencies = [ [[package]] name = "prost" -version = "0.13.4" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c0fef6c4230e4ccf618a35c59d7ede15dea37de8427500f50aff708806e42ec" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" dependencies = [ "bytes", "prost-derive", @@ -6618,12 +6586,12 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.13.4" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "157c5a9d7ea5c2ed2d9fb8f495b64759f7816c7eaea54ba3978f0d63000162e3" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" dependencies = [ "anyhow", - "itertools 0.13.0", + "itertools 0.14.0", "proc-macro2", "quote", "syn 2.0.98", @@ -6631,9 +6599,9 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.13.4" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2f1e56baa61e93533aebc21af4d2134b70f66275e0fcdf3cbe43d77ff7e8fc" +checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" dependencies = [ "prost", ] @@ -10089,8 +10057,8 @@ checksum = "97a971f6058498b5c0f1affa23e7ea202057a7301dbff68e968b2d578bcbd053" dependencies = [ "js-sys", "once_cell", - "opentelemetry 0.27.1", - "opentelemetry_sdk 0.27.1", + "opentelemetry", + "opentelemetry_sdk", "smallvec", "tracing", "tracing-core", @@ -11099,11 +11067,11 @@ dependencies = [ "magic-crypt", "mail-send", "object_store", - "opentelemetry 0.27.1", + "opentelemetry", "opentelemetry-appender-tracing", "opentelemetry-otlp", "opentelemetry-semantic-conventions", - "opentelemetry_sdk 0.28.0", + "opentelemetry_sdk", "pin-project-lite", "prometheus", "quick_cache", @@ -11438,7 +11406,7 @@ dependencies = [ "nix", "object_store", "once_cell", - "opentelemetry 0.27.1", + "opentelemetry", "oracle", "pem 3.0.4", "postgres-native-tls 0.5.1", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index ba97c07be3..2bbb4399c1 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -315,10 +315,10 @@ async-stream = "^0" opentelemetry = "0.27.0" tracing-opentelemetry = "0.28.0" -opentelemetry_sdk = { version = "*", features = ["rt-tokio"] } +opentelemetry_sdk = { version = "0.27.1", features = ["rt-tokio"] } opentelemetry-otlp = { version = "0.27.0", features = ["grpc-tonic", "tls"] } opentelemetry-appender-tracing = "0.27.0" -opentelemetry-semantic-conventions = { version = "*", features = ["semconv_experimental"] } +opentelemetry-semantic-conventions = { version = "0.27.0", features = ["semconv_experimental"] } bollard = "0.18.1" From 55cff6d2d2de341b4ea9db5e1fca4c46fee2d107 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 12 Feb 2025 12:16:14 +0100 Subject: [PATCH 14/14] chore(main): release 1.460.1 (#5274) * chore(main): release 1.460.1 * Apply automatic changes --------- Co-authored-by: rubenfiszel <275584+rubenfiszel@users.noreply.github.com> --- CHANGELOG.md | 7 +++ backend/Cargo.lock | 50 +++++++++---------- backend/Cargo.toml | 4 +- backend/windmill-api/openapi.yaml | 2 +- benchmarks/lib.ts | 2 +- cli/main.ts | 2 +- frontend/package-lock.json | 4 +- frontend/package.json | 2 +- lsp/Pipfile | 4 +- openflow.openapi.yaml | 2 +- .../WindmillClient/WindmillClient.psd1 | 2 +- python-client/wmill/pyproject.toml | 2 +- python-client/wmill_pg/pyproject.toml | 2 +- typescript-client/jsr.json | 2 +- typescript-client/package.json | 2 +- version.txt | 2 +- 16 files changed, 49 insertions(+), 42 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5624b84212..fc17ef924d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [1.460.1](https://github.com/windmill-labs/windmill/compare/v1.460.0...v1.460.1) (2025-02-12) + + +### Bug Fixes + +* pin opentelemetry to 0.27.1 ([e92a909](https://github.com/windmill-labs/windmill/commit/e92a90907f41568e4e04c932e1fbef64ab4c48a9)) + ## [1.460.0](https://github.com/windmill-labs/windmill/compare/v1.459.0...v1.460.0) (2025-02-11) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 377df7996c..a6473bff94 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -10859,7 +10859,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windmill" -version = "1.460.0" +version = "1.460.1" dependencies = [ "anyhow", "axum", @@ -10902,7 +10902,7 @@ dependencies = [ [[package]] name = "windmill-api" -version = "1.460.0" +version = "1.460.1" dependencies = [ "anyhow", "argon2", @@ -10995,7 +10995,7 @@ dependencies = [ [[package]] name = "windmill-api-client" -version = "1.460.0" +version = "1.460.1" dependencies = [ "base64 0.22.1", "chrono", @@ -11013,7 +11013,7 @@ dependencies = [ [[package]] name = "windmill-audit" -version = "1.460.0" +version = "1.460.1" dependencies = [ "chrono", "serde", @@ -11026,7 +11026,7 @@ dependencies = [ [[package]] name = "windmill-autoscaling" -version = "1.460.0" +version = "1.460.1" dependencies = [ "anyhow", "serde", @@ -11040,7 +11040,7 @@ dependencies = [ [[package]] name = "windmill-common" -version = "1.460.0" +version = "1.460.1" dependencies = [ "anyhow", "async-stream", @@ -11099,7 +11099,7 @@ dependencies = [ [[package]] name = "windmill-git-sync" -version = "1.460.0" +version = "1.460.1" dependencies = [ "regex", "serde", @@ -11113,7 +11113,7 @@ dependencies = [ [[package]] name = "windmill-indexer" -version = "1.460.0" +version = "1.460.1" dependencies = [ "anyhow", "bytes", @@ -11136,7 +11136,7 @@ dependencies = [ [[package]] name = "windmill-macros" -version = "1.460.0" +version = "1.460.1" dependencies = [ "itertools 0.14.0", "lazy_static", @@ -11148,7 +11148,7 @@ dependencies = [ [[package]] name = "windmill-parser" -version = "1.460.0" +version = "1.460.1" dependencies = [ "convert_case 0.6.0", "serde", @@ -11157,7 +11157,7 @@ dependencies = [ [[package]] name = "windmill-parser-bash" -version = "1.460.0" +version = "1.460.1" dependencies = [ "anyhow", "lazy_static", @@ -11169,7 +11169,7 @@ dependencies = [ [[package]] name = "windmill-parser-csharp" -version = "1.460.0" +version = "1.460.1" dependencies = [ "anyhow", "serde_json", @@ -11181,7 +11181,7 @@ dependencies = [ [[package]] name = "windmill-parser-go" -version = "1.460.0" +version = "1.460.1" dependencies = [ "anyhow", "gosyn", @@ -11193,7 +11193,7 @@ dependencies = [ [[package]] name = "windmill-parser-graphql" -version = "1.460.0" +version = "1.460.1" dependencies = [ "anyhow", "lazy_static", @@ -11205,7 +11205,7 @@ dependencies = [ [[package]] name = "windmill-parser-php" -version = "1.460.0" +version = "1.460.1" dependencies = [ "anyhow", "itertools 0.14.0", @@ -11216,7 +11216,7 @@ dependencies = [ [[package]] name = "windmill-parser-py" -version = "1.460.0" +version = "1.460.1" dependencies = [ "anyhow", "itertools 0.14.0", @@ -11227,7 +11227,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-imports" -version = "1.460.0" +version = "1.460.1" dependencies = [ "anyhow", "async-recursion", @@ -11247,7 +11247,7 @@ dependencies = [ [[package]] name = "windmill-parser-rust" -version = "1.460.0" +version = "1.460.1" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -11264,7 +11264,7 @@ dependencies = [ [[package]] name = "windmill-parser-sql" -version = "1.460.0" +version = "1.460.1" dependencies = [ "anyhow", "lazy_static", @@ -11276,7 +11276,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts" -version = "1.460.0" +version = "1.460.1" dependencies = [ "anyhow", "lazy_static", @@ -11294,7 +11294,7 @@ dependencies = [ [[package]] name = "windmill-parser-wasm" -version = "1.460.0" +version = "1.460.1" dependencies = [ "anyhow", "getrandom 0.2.15", @@ -11316,7 +11316,7 @@ dependencies = [ [[package]] name = "windmill-parser-yaml" -version = "1.460.0" +version = "1.460.1" dependencies = [ "anyhow", "serde_json", @@ -11326,7 +11326,7 @@ dependencies = [ [[package]] name = "windmill-queue" -version = "1.460.0" +version = "1.460.1" dependencies = [ "anyhow", "async-recursion", @@ -11359,7 +11359,7 @@ dependencies = [ [[package]] name = "windmill-sql-datatype-parser-wasm" -version = "1.460.0" +version = "1.460.1" dependencies = [ "wasm-bindgen", "wasm-bindgen-test", @@ -11369,7 +11369,7 @@ dependencies = [ [[package]] name = "windmill-worker" -version = "1.460.0" +version = "1.460.1" dependencies = [ "anyhow", "async-recursion", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 2bbb4399c1..21060519be 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "windmill" -version = "1.460.0" +version = "1.460.1" authors.workspace = true edition.workspace = true @@ -30,7 +30,7 @@ members = [ ] [workspace.package] -version = "1.460.0" +version = "1.460.1" authors = ["Ruben Fiszel "] edition = "2021" diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 980ac64eca..a34706a011 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.460.0 + version: 1.460.1 title: Windmill API contact: diff --git a/benchmarks/lib.ts b/benchmarks/lib.ts index a0985351a5..7e4f36a358 100644 --- a/benchmarks/lib.ts +++ b/benchmarks/lib.ts @@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts"; import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts"; import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts"; -export const VERSION = "v1.460.0"; +export const VERSION = "v1.460.1"; export async function login(email: string, password: string): Promise { return await windmill.UserService.login({ diff --git a/cli/main.ts b/cli/main.ts index 622cbed0bf..bd377e5168 100644 --- a/cli/main.ts +++ b/cli/main.ts @@ -62,7 +62,7 @@ export { // } // }); -export const VERSION = "1.460.0"; +export const VERSION = "1.460.1"; const command = new Command() .name("wmill") diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 3286a321fd..6edef5b202 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "windmill-components", - "version": "1.460.0", + "version": "1.460.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "windmill-components", - "version": "1.460.0", + "version": "1.460.1", "license": "AGPL-3.0", "dependencies": { "@anthropic-ai/sdk": "^0.32.1", diff --git a/frontend/package.json b/frontend/package.json index 04ea910822..167351899e 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "windmill-components", - "version": "1.460.0", + "version": "1.460.1", "scripts": { "dev": "vite dev", "build": "vite build", diff --git a/lsp/Pipfile b/lsp/Pipfile index 4a4e123f81..b02c64fb49 100644 --- a/lsp/Pipfile +++ b/lsp/Pipfile @@ -4,8 +4,8 @@ verify_ssl = true name = "pypi" [packages] -wmill = ">=1.460.0" -wmill_pg = ">=1.460.0" +wmill = ">=1.460.1" +wmill_pg = ">=1.460.1" sendgrid = "*" mysql-connector-python = "*" pymongo = "*" diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index 2b05e1695e..876fc85dcc 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.460.0 + version: 1.460.1 title: OpenFlow Spec contact: name: Ruben Fiszel diff --git a/powershell-client/WindmillClient/WindmillClient.psd1 b/powershell-client/WindmillClient/WindmillClient.psd1 index 4e67ebe729..4098939492 100644 --- a/powershell-client/WindmillClient/WindmillClient.psd1 +++ b/powershell-client/WindmillClient/WindmillClient.psd1 @@ -12,7 +12,7 @@ RootModule = 'WindmillClient.psm1' # Version number of this module. - ModuleVersion = '1.460.0' + ModuleVersion = '1.460.1' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/python-client/wmill/pyproject.toml b/python-client/wmill/pyproject.toml index e2c95e9f4c..96c744abf6 100644 --- a/python-client/wmill/pyproject.toml +++ b/python-client/wmill/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill" -version = "1.460.0" +version = "1.460.1" description = "A client library for accessing Windmill server wrapping the Windmill client API" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/python-client/wmill_pg/pyproject.toml b/python-client/wmill_pg/pyproject.toml index b1d3612145..a2274c752b 100644 --- a/python-client/wmill_pg/pyproject.toml +++ b/python-client/wmill_pg/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "wmill-pg" -version = "1.460.0" +version = "1.460.1" description = "An extension client for the wmill client library focused on pg" license = "Apache-2.0" homepage = "https://windmill.dev" diff --git a/typescript-client/jsr.json b/typescript-client/jsr.json index 27fe399e7a..705982e0f9 100644 --- a/typescript-client/jsr.json +++ b/typescript-client/jsr.json @@ -1,6 +1,6 @@ { "name": "@windmill/windmill", - "version": "1.460.0", + "version": "1.460.1", "exports": "./src/index.ts", "publish": { "exclude": ["!src", "./s3Types.ts", "./client.ts"] diff --git a/typescript-client/package.json b/typescript-client/package.json index 5c36777045..2ab30279c3 100644 --- a/typescript-client/package.json +++ b/typescript-client/package.json @@ -1,7 +1,7 @@ { "name": "windmill-client", "description": "Windmill SDK client for browsers and Node.js", - "version": "1.460.0", + "version": "1.460.1", "author": "Ruben Fiszel", "license": "Apache 2.0", "devDependencies": { diff --git a/version.txt b/version.txt index 75369ae609..3194fbf29a 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.460.0 +1.460.1