windmill-components 1.504.0 → 1.504.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/package/components/AppWrapper.svelte +0 -3
  2. package/package/components/{DBManagerDrawerButton.svelte → DBManagerDrawer.svelte} +38 -38
  3. package/package/components/DBManagerDrawer.svelte.d.ts +7 -0
  4. package/package/components/DarkModeObserver.svelte +30 -16
  5. package/package/components/DarkModeObserver.svelte.d.ts +9 -4
  6. package/package/components/Dev.svelte +1 -1
  7. package/package/components/EditorBar.svelte +108 -67
  8. package/package/components/FlowBuilder.svelte +2 -3
  9. package/package/components/FlowStatusViewerInner.svelte +19 -0
  10. package/package/components/FlowWrapper.svelte +0 -3
  11. package/package/components/ItemPicker.svelte +1 -1
  12. package/package/components/ItemPicker.svelte.d.ts +1 -1
  13. package/package/components/MoveDrawer.svelte.d.ts +2 -2
  14. package/package/components/ResourcePicker.svelte +11 -4
  15. package/package/components/S3FilePicker.svelte +10 -3
  16. package/package/components/S3FilePicker.svelte.d.ts +6 -4
  17. package/package/components/ScriptBuilder.svelte +3 -1
  18. package/package/components/ScriptEditor.svelte +31 -3
  19. package/package/components/ScriptEditor.svelte.d.ts +3 -1
  20. package/package/components/ScriptWrapper.svelte +0 -3
  21. package/package/components/ShareModal.svelte.d.ts +1 -1
  22. package/package/components/apps/editor/AppEditor.svelte +1 -1
  23. package/package/components/apps/editor/AppEditorHeader.svelte +1 -1
  24. package/package/components/apps/editor/GridEditor.svelte +1 -1
  25. package/package/components/apps/editor/SubGridEditor.svelte +1 -1
  26. package/package/components/apps/editor/component/componentCallbacks.svelte.js +1 -1
  27. package/package/components/apps/editor/componentsPanel/ComponentList.svelte +1 -1
  28. package/package/components/apps/editor/settingsPanel/ComponentPanel.svelte +1 -1
  29. package/package/components/apps/editor/settingsPanel/DeleteComponent.svelte +1 -1
  30. package/package/components/apps/types.d.ts +2 -2
  31. package/package/components/assets/AssetsDropdownButton.svelte +178 -0
  32. package/package/components/assets/AssetsDropdownButton.svelte.d.ts +16 -0
  33. package/package/components/assets/AssetsUsageDrawer.svelte +43 -0
  34. package/package/components/assets/AssetsUsageDrawer.svelte.d.ts +12 -0
  35. package/package/components/assets/lib.d.ts +16 -0
  36. package/package/components/assets/lib.js +60 -0
  37. package/package/components/auditLogs/AuditLogsFilters.svelte.d.ts +1 -1
  38. package/package/components/common/OnChange.svelte +18 -0
  39. package/package/components/common/OnChange.svelte.d.ts +21 -0
  40. package/package/components/common/button/UndoRedo.svelte +2 -2
  41. package/package/components/common/button/UndoRedo.svelte.d.ts +5 -6
  42. package/package/components/copilot/chat/script/core.js +4 -4
  43. package/package/components/custom_ui.d.ts +1 -0
  44. package/package/components/flows/content/FlowModuleComponent.svelte +20 -1
  45. package/package/components/flows/types.d.ts +15 -1
  46. package/package/components/graph/FlowGraphV2.svelte +111 -8
  47. package/package/components/graph/FlowGraphV2.svelte.d.ts +2 -0
  48. package/package/components/graph/graphBuilder.svelte.d.ts +14 -1
  49. package/package/components/graph/renderers/edges/BaseEdge.svelte +10 -1
  50. package/package/components/graph/renderers/edges/EmptyEdge.svelte +7 -1
  51. package/package/components/graph/renderers/edges/EmptyEdge.svelte.d.ts +3 -0
  52. package/package/components/graph/renderers/nodes/AssetNode.svelte +257 -0
  53. package/package/components/graph/renderers/nodes/AssetNode.svelte.d.ts +21 -0
  54. package/package/components/graph/renderers/nodes/AssetsOverflowedNode.svelte +55 -0
  55. package/package/components/graph/renderers/nodes/AssetsOverflowedNode.svelte.d.ts +7 -0
  56. package/package/components/icons/AssetGenericIcon.svelte +16 -0
  57. package/package/components/icons/AssetGenericIcon.svelte.d.ts +10 -0
  58. package/package/components/icons/AssetResIcon.svelte +32 -0
  59. package/package/components/icons/AssetResIcon.svelte.d.ts +9 -0
  60. package/package/components/icons/AssetS3Icon.svelte +30 -0
  61. package/package/components/icons/AssetS3Icon.svelte.d.ts +9 -0
  62. package/package/components/icons/AssetVarIcon.svelte +31 -0
  63. package/package/components/icons/AssetVarIcon.svelte.d.ts +9 -0
  64. package/package/components/meltComponents/Popover.svelte +2 -0
  65. package/package/components/meltComponents/Popover.svelte.d.ts +2 -0
  66. package/package/components/schema/EditableSchemaSdkWrapper.svelte +1 -4
  67. package/package/components/script_builder.d.ts +2 -0
  68. package/package/components/settings/WorkspaceOperatorSettings.svelte +20 -17
  69. package/package/components/sidebar/OperatorMenu.svelte +5 -0
  70. package/package/components/sidebar/SidebarContent.svelte +9 -1
  71. package/package/components/tutorials/app/AppTutorial.svelte +1 -1
  72. package/package/components/tutorials/app/ConnectionTutorial.svelte +1 -1
  73. package/package/gen/schemas.gen.d.ts +69 -1
  74. package/package/gen/schemas.gen.js +69 -1
  75. package/package/gen/services.gen.d.ts +20 -1
  76. package/package/gen/services.gen.js +37 -0
  77. package/package/gen/types.gen.d.ts +103 -0
  78. package/package/history.svelte.d.ts +2 -2
  79. package/package/history.svelte.js +6 -6
  80. package/package/infer.d.ts +2 -0
  81. package/package/infer.js +31 -5
  82. package/package/svelte5Utils.svelte.d.ts +2 -1
  83. package/package/svelte5Utils.svelte.js +3 -2
  84. package/package/utils.d.ts +12 -0
  85. package/package/utils.js +22 -0
  86. package/package.json +5 -5
  87. package/package/components/DBManagerDrawerButton.svelte.d.ts +0 -9
@@ -1,9 +1,6 @@
1
1
  <script lang="ts">import AppEditor from './apps/editor/AppEditor.svelte';
2
2
  let { app: oldApp, ...props } = $props();
3
3
  let app = $state(oldApp);
4
- $effect(() => {
5
- app = oldApp;
6
- });
7
4
  </script>
8
5
 
9
6
  <AppEditor {app} {...props} />
@@ -3,10 +3,9 @@ import Button from './common/button/Button.svelte';
3
3
  import Drawer from './common/drawer/Drawer.svelte';
4
4
  import DrawerContent from './common/drawer/DrawerContent.svelte';
5
5
  import { sendUserToast, sortArray } from '../utils';
6
- import { ArrowLeft, Database, Expand, Loader2, Minimize, RefreshCcw } from 'lucide-svelte';
6
+ import { ArrowLeft, Expand, Loader2, Minimize, RefreshCcw } from 'lucide-svelte';
7
7
  import { dbSupportsSchemas, getDbSchemas, getLanguageByResourceType, loadAllTablesMetaData, loadTableMetaData } from './apps/components/display/dbtable/utils';
8
8
  import DbManager from './DBManager.svelte';
9
- import { Alert } from './common';
10
9
  import { dbDeleteTableActionWithPreviewScript, dbTableOpsWithPreviewScripts } from './dbOps';
11
10
  import { makeCreateTableQuery } from './apps/components/display/dbtable/queries/createTable';
12
11
  import { runScriptAndPollResult } from './jobs/utils';
@@ -14,10 +13,21 @@ import { Pane, Splitpanes } from 'svelte-splitpanes';
14
13
  import SqlRepl from './SqlRepl.svelte';
15
14
  import SimpleAgTable from './SimpleAgTable.svelte';
16
15
  import { untrack } from 'svelte';
17
- let { resourceType, resourcePath } = $props();
18
- let dbSchema = $derived(resourcePath in $dbSchemas ? $dbSchemas[resourcePath] : undefined);
19
- let isDrawerOpen = $state(false);
20
- let shouldDisplayError = $derived(resourcePath && resourcePath in $dbSchemas && !$dbSchemas[resourcePath]);
16
+ let resourceType = $state(undefined);
17
+ let resourcePath = $state(undefined);
18
+ let open = $derived(resourcePath && resourceType);
19
+ export function openDrawer(_resourceType, _resourcePath) {
20
+ resourceType = _resourceType;
21
+ resourcePath = _resourcePath;
22
+ getSchema();
23
+ }
24
+ export function closeDrawer() {
25
+ resourceType = undefined;
26
+ resourcePath = undefined;
27
+ refreshCount = 0;
28
+ refreshing = false;
29
+ }
30
+ let dbSchema = $derived(resourcePath && resourcePath in $dbSchemas ? $dbSchemas[resourcePath] : undefined);
21
31
  // `refreshCount` is a derived state. `refreshing` is the source of truth
22
32
  let refreshCount = $state(0);
23
33
  $effect(() => {
@@ -32,18 +42,17 @@ $effect(() => {
32
42
  const refresh = () => !refreshing && (refreshing = true);
33
43
  let expand = $state(false);
34
44
  $effect(() => {
35
- if (!isDrawerOpen)
45
+ if (!open)
36
46
  expand = false;
37
47
  });
38
48
  async function getSchema() {
39
- if ($dbSchemas[resourcePath] && !refreshing)
49
+ if (!resourcePath || !resourceType || ($dbSchemas[resourcePath] && !refreshing))
40
50
  return;
41
51
  try {
42
52
  const oldDbSchema = $dbSchemas[resourcePath];
43
53
  await getDbSchemas(resourceType, resourcePath, $workspaceStore, $dbSchemas, (message) => {
44
- if (isDrawerOpen) {
54
+ if (open)
45
55
  sendUserToast(message, true);
46
- }
47
56
  });
48
57
  // avoid infinite loop on error due to the way getDbSchemas is implemented
49
58
  // and relying on an assignement side effect
@@ -64,6 +73,8 @@ let replResultData = $state(undefined);
64
73
  let cachedColDefs = {};
65
74
  let cachedLastRefreshCount = 0;
66
75
  async function getColDefs(tableKey) {
76
+ if (!resourcePath || !resourceType)
77
+ return [];
67
78
  if (cachedLastRefreshCount !== refreshCount)
68
79
  cachedColDefs = {};
69
80
  cachedLastRefreshCount = refreshCount;
@@ -96,37 +107,26 @@ async function getColDefs(tableKey) {
96
107
  }}
97
108
  />
98
109
 
99
- {#if shouldDisplayError}
100
- <Alert type="error" size="xs" title="Schema not available" class="mt-2">
101
- Schema could not be loaded. Please check the permissions of the resource.
102
- </Alert>
103
- {:else}
104
- <Button
105
- size="xs"
106
- variant="border"
107
- spacingSize="xs2"
108
- btnClasses="mt-1 w-24"
109
- on:click={async () => {
110
- if (!dbSchema || !$workspaceStore) refreshing = true
111
- isDrawerOpen = true
112
- }}
113
- >
114
- <Database size={18} /> Manager
115
- </Button>
116
- <Drawer bind:open={isDrawerOpen} size={expand ? `${windowWidth}px` : '1200px'} preventEscape>
110
+ <Drawer
111
+ bind:open
112
+ size={expand ? `${windowWidth}px` : '1200px'}
113
+ preventEscape
114
+ on:close={closeDrawer}
115
+ >
116
+ {#key [resourceType, resourcePath, dbSchema]}
117
117
  <DrawerContent
118
118
  title={replResultData ? 'Query Result' : 'Database Manager'}
119
119
  on:close={() => {
120
120
  if (replResultData) {
121
121
  replResultData = undefined
122
122
  } else {
123
- isDrawerOpen = false
123
+ closeDrawer()
124
124
  }
125
125
  }}
126
126
  CloseIcon={replResultData ? ArrowLeft : undefined}
127
127
  noPadding
128
128
  >
129
- {#if dbSchema && $workspaceStore}
129
+ {#if dbSchema && $workspaceStore && resourceType && resourcePath}
130
130
  <Splitpanes horizontal>
131
131
  <Pane class="relative">
132
132
  <!-- svelte-ignore a11y_click_events_have_key_events -->
@@ -157,8 +157,8 @@ async function getColDefs(tableKey) {
157
157
  dbTableOpsWithPreviewScripts({
158
158
  colDefs,
159
159
  tableKey,
160
- resourcePath,
161
- resourceType,
160
+ resourcePath: resourcePath!,
161
+ resourceType: resourceType!,
162
162
  workspace: $workspaceStore
163
163
  })}
164
164
  dbTableActionsFactory={[
@@ -170,16 +170,16 @@ async function getColDefs(tableKey) {
170
170
  ]}
171
171
  {refresh}
172
172
  dbTableEditorPropsFactory={({ selectedSchemaKey }) => ({
173
- resourceType,
173
+ resourceType: resourceType!,
174
174
  previewSql: (values) =>
175
- makeCreateTableQuery(values, resourceType, selectedSchemaKey),
175
+ makeCreateTableQuery(values, resourceType!, selectedSchemaKey),
176
176
  async onConfirm(values) {
177
177
  await runScriptAndPollResult({
178
178
  workspace: $workspaceStore,
179
179
  requestBody: {
180
180
  args: { database: '$res:' + resourcePath },
181
- content: makeCreateTableQuery(values, resourceType, selectedSchemaKey),
182
- language: getLanguageByResourceType(resourceType)
181
+ content: makeCreateTableQuery(values, resourceType!, selectedSchemaKey),
182
+ language: getLanguageByResourceType(resourceType!)
183
183
  }
184
184
  })
185
185
  refresh()
@@ -234,5 +234,5 @@ async function getColDefs(tableKey) {
234
234
  />
235
235
  {/snippet}
236
236
  </DrawerContent>
237
- </Drawer>
238
- {/if}
237
+ {/key}
238
+ </Drawer>
@@ -0,0 +1,7 @@
1
+ import { type DbType } from './apps/components/display/dbtable/utils';
2
+ declare const DbManagerDrawer: import("svelte").Component<Record<string, never>, {
3
+ openDrawer: (_resourceType: DbType, _resourcePath: string) => void;
4
+ closeDrawer: () => void;
5
+ }, "">;
6
+ type DbManagerDrawer = ReturnType<typeof DbManagerDrawer>;
7
+ export default DbManagerDrawer;
@@ -1,22 +1,36 @@
1
+ <script module lang="ts">export function useIsDarkMode({ onChange } = {}) {
2
+ let isDarkMode = $state({ val: false });
3
+ let observer = undefined;
4
+ onMount(() => {
5
+ isDarkMode.val = document.documentElement.classList.contains('dark');
6
+ observer = new MutationObserver((mutationsList) => {
7
+ for (let mutation of mutationsList) {
8
+ if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
9
+ const newDarkMode = document.documentElement.classList.contains('dark');
10
+ onChange?.(newDarkMode);
11
+ isDarkMode.val = newDarkMode;
12
+ }
13
+ }
14
+ });
15
+ observer.observe(document.documentElement, { attributes: true });
16
+ });
17
+ onDestroy(() => {
18
+ observer?.disconnect();
19
+ });
20
+ return isDarkMode;
21
+ }
22
+ </script>
23
+
1
24
  <script lang="ts">import { onMount, onDestroy } from 'svelte';
2
25
  import { createEventDispatcher } from 'svelte';
3
- export let darkMode = false;
26
+ let { darkMode = $bindable(false) } = $props();
4
27
  const dispatch = createEventDispatcher();
5
- let observer = undefined;
6
- onMount(() => {
7
- darkMode = document.documentElement.classList.contains('dark');
8
- observer = new MutationObserver((mutationsList, observer) => {
9
- for (let mutation of mutationsList) {
10
- if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
11
- const newDarkMode = document.documentElement.classList.contains('dark');
12
- dispatch('change', newDarkMode);
13
- darkMode = newDarkMode;
14
- }
15
- }
16
- });
17
- observer.observe(document.documentElement, { attributes: true });
28
+ let isDarkMode = useIsDarkMode({
29
+ onChange: (newDarkMode) => dispatch('change', newDarkMode)
18
30
  });
19
- onDestroy(() => {
20
- observer?.disconnect();
31
+ $effect(() => {
32
+ if (darkMode !== isDarkMode.val) {
33
+ darkMode = isDarkMode.val;
34
+ }
21
35
  });
22
36
  </script>
@@ -1,3 +1,10 @@
1
+ import type { StateStore } from '../utils';
2
+ export declare function useIsDarkMode({ onChange }?: {
3
+ onChange?: (newDarkMode: boolean) => void;
4
+ }): StateStore<boolean>;
5
+ type $$ComponentProps = {
6
+ darkMode?: boolean;
7
+ };
1
8
  interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
9
  new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
10
  $$bindings?: Bindings;
@@ -11,12 +18,10 @@ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> =
11
18
  };
12
19
  z_$$bindings?: Bindings;
13
20
  }
14
- declare const DarkModeObserver: $$__sveltets_2_IsomorphicComponent<{
15
- darkMode?: boolean;
16
- }, {
21
+ declare const DarkModeObserver: $$__sveltets_2_IsomorphicComponent<$$ComponentProps, {
17
22
  change: CustomEvent<any>;
18
23
  } & {
19
24
  [evt: string]: CustomEvent<any>;
20
- }, {}, {}, string>;
25
+ }, {}, {}, "darkMode">;
21
26
  type DarkModeObserver = InstanceType<typeof DarkModeObserver>;
22
27
  export default DarkModeObserver;
@@ -17,7 +17,7 @@ import FlowModuleSchemaMap from './flows/map/FlowModuleSchemaMap.svelte';
17
17
  import FlowEditorPanel from './flows/content/FlowEditorPanel.svelte';
18
18
  import { deepEqual } from 'fast-equals';
19
19
  import { writable } from 'svelte/store';
20
- import { initHistory } from '../history';
20
+ import { initHistory } from '../history.svelte';
21
21
  import { dfs } from './flows/dfs';
22
22
  import { loadSchemaFromModule } from './flows/flowInfers';
23
23
  import { CornerDownLeft, Play } from 'lucide-svelte';
@@ -20,14 +20,15 @@ import { createEventDispatcher, untrack } from 'svelte';
20
20
  import { sendUserToast } from '../toast';
21
21
  import { getScriptByPath, scriptLangToEditorLang } from '../scripts';
22
22
  import Toggle from './Toggle.svelte';
23
- import { DiffIcon, DollarSign, History, Library, Link, Package, Plus, RotateCw, Save, Users } from 'lucide-svelte';
24
- import { capitalize, toCamel } from '../utils';
23
+ import { DiffIcon, DollarSign, File, History, Library, Link, Package, Plus, RotateCw, Save, Users } from 'lucide-svelte';
24
+ import { capitalize, formatS3Object, toCamel } from '../utils';
25
25
  import ScriptVersionHistory from './ScriptVersionHistory.svelte';
26
26
  import ScriptGen from './copilot/ScriptGen.svelte';
27
27
  import { getResetCode } from '../script_helpers';
28
28
  import Popover from './Popover.svelte';
29
29
  import ResourceEditorDrawer from './ResourceEditorDrawer.svelte';
30
30
  import EditorSettings from './EditorSettings.svelte';
31
+ import S3FilePicker from './S3FilePicker.svelte';
31
32
  let { lang, editor, websocketAlive, iconOnly = false, validCode = true, kind = 'script', template = 'script', collabMode = false, collabLive = false, collabUsers = [], scriptPath = undefined, diffEditor = undefined, args, noHistory = false, saveToWorkspace = false, customUi = {}, lastDeployedCode = undefined, diffMode = false, showHistoryDrawer = $bindable(false), right, openAiChat = false } = $props();
32
33
  let contextualVariablePicker = $state();
33
34
  let variablePicker = $state();
@@ -35,70 +36,61 @@ let resourcePicker = $state();
35
36
  let resourceTypePicker = $state();
36
37
  let variableEditor = $state();
37
38
  let resourceEditor = $state();
38
- let showContextVarPicker = $state(false);
39
- let showVarPicker = $state(false);
40
- let showResourcePicker = $state(false);
41
- let showResourceTypePicker = $state(false);
42
- run(() => {
43
- showContextVarPicker = [
44
- 'python3',
45
- 'bash',
46
- 'powershell',
47
- 'go',
48
- 'deno',
49
- 'bun',
50
- 'bunnative',
51
- 'nativets',
52
- 'php',
53
- 'rust',
54
- 'csharp',
55
- 'nu',
56
- 'java'
57
- // for related places search: ADD_NEW_LANG
58
- ].includes(lang ?? '');
59
- });
60
- run(() => {
61
- showVarPicker = [
62
- 'python3',
63
- 'bash',
64
- 'powershell',
65
- 'go',
66
- 'deno',
67
- 'bun',
68
- 'bunnative',
69
- 'nativets',
70
- 'php',
71
- 'rust',
72
- 'csharp',
73
- 'nu',
74
- 'java'
75
- // for related places search: ADD_NEW_LANG
76
- ].includes(lang ?? '');
77
- });
78
- run(() => {
79
- showResourcePicker = [
80
- 'python3',
81
- 'bash',
82
- 'powershell',
83
- 'go',
84
- 'deno',
85
- 'bun',
86
- 'bunnative',
87
- 'nativets',
88
- 'php',
89
- 'rust',
90
- 'csharp',
91
- 'nu',
92
- 'java'
93
- // for related places search: ADD_NEW_LANG
94
- ].includes(lang ?? '');
95
- });
96
- run(() => {
97
- showResourceTypePicker =
98
- ['typescript', 'javascript'].includes(scriptLangToEditorLang(lang)) ||
99
- lang === 'python3' ||
100
- lang === 'php';
101
- });
39
+ let s3FilePicker = $state();
40
+ let showContextVarPicker = $derived([
41
+ 'python3',
42
+ 'bash',
43
+ 'powershell',
44
+ 'go',
45
+ 'deno',
46
+ 'bun',
47
+ 'bunnative',
48
+ 'nativets',
49
+ 'php',
50
+ 'rust',
51
+ 'csharp',
52
+ 'nu',
53
+ 'java'
54
+ // for related places search: ADD_NEW_LANG
55
+ ].includes(lang ?? ''));
56
+ let showVarPicker = $derived([
57
+ 'python3',
58
+ 'bash',
59
+ 'powershell',
60
+ 'go',
61
+ 'deno',
62
+ 'bun',
63
+ 'bunnative',
64
+ 'nativets',
65
+ 'php',
66
+ 'rust',
67
+ 'csharp',
68
+ 'nu',
69
+ 'java'
70
+ // for related places search: ADD_NEW_LANG
71
+ ].includes(lang ?? ''));
72
+ let showResourcePicker = $derived([
73
+ 'python3',
74
+ 'bash',
75
+ 'powershell',
76
+ 'go',
77
+ 'deno',
78
+ 'bun',
79
+ 'bunnative',
80
+ 'nativets',
81
+ 'php',
82
+ 'rust',
83
+ 'csharp',
84
+ 'nu',
85
+ 'java',
86
+ 'duckdb'
87
+ // for related places search: ADD_NEW_LANG
88
+ ].includes(lang ?? ''));
89
+ let showS3Picker = $derived(['duckdb', 'python3'].includes(lang ?? '') ||
90
+ ['typescript', 'javascript'].includes(scriptLangToEditorLang(lang)));
91
+ let showResourceTypePicker = $derived(['typescript', 'javascript'].includes(scriptLangToEditorLang(lang)) ||
92
+ lang === 'python3' ||
93
+ lang === 'php');
102
94
  let codeViewer = $state();
103
95
  let codeObj = $state(undefined);
104
96
  function addEditorActions() {
@@ -444,7 +436,7 @@ string ${windmillPathToCamelCaseName(path)} = await client.GetStringAsync(uri);
444
436
 
445
437
  <ItemPicker
446
438
  bind:this={resourcePicker}
447
- pickCallback={(path, _) => {
439
+ pickCallback={(path, _, resType) => {
448
440
  if (!editor) return
449
441
  if (lang == 'deno') {
450
442
  if (!editor.getCode().includes('import * as wmill from')) {
@@ -504,6 +496,15 @@ JsonNode ${windmillPathToCamelCaseName(path)} = JsonNode.Parse(await client.GetS
504
496
  } else if (lang == 'java') {
505
497
  editor.insertAtCursor(`(Wmill.getResource("${path}"))`)
506
498
  // for related places search: ADD_NEW_LANG
499
+ } else if (lang == 'duckdb') {
500
+ let t = { postgresql: 'postgres', mysql: 'mysql', bigquery: 'bigquery' }[resType]
501
+ if (!t) {
502
+ sendUserToast(`Resource type ${resType} is not supported in DuckDB`, true)
503
+ editor.insertAtCursor(`'$res:${path}'`)
504
+ return
505
+ } else {
506
+ editor.insertAtCursor(`ATTACH '$res:${path}' AS db (TYPE ${t});`)
507
+ }
507
508
  }
508
509
 
509
510
  sendUserToast(`${path} inserted at cursor`)
@@ -550,6 +551,30 @@ JsonNode ${windmillPathToCamelCaseName(path)} = JsonNode.Parse(await client.GetS
550
551
  <ResourceEditorDrawer bind:this={resourceEditor} on:refresh={resourcePicker.openDrawer} />
551
552
  <VariableEditor bind:this={variableEditor} on:create={variablePicker.openDrawer} />
552
553
 
554
+ <S3FilePicker
555
+ bind:this={s3FilePicker}
556
+ readOnlyMode={false}
557
+ on:selectAndClose={(s3obj) => {
558
+ let s = `'${formatS3Object(s3obj.detail)}'`
559
+ if (lang === 'duckdb') {
560
+ if (s3obj.detail?.s3.endsWith('.json')) s = `read_json(${s})`
561
+ if (s3obj.detail?.s3.endsWith('.csv')) s = `read_csv(${s})`
562
+ if (s3obj.detail?.s3.endsWith('.parquet')) s = `read_parquet(${s})`
563
+ editor?.insertAtCursor(s)
564
+ } else if (lang === 'python3') {
565
+ if (!editor?.getCode().includes('import wmill')) {
566
+ editor?.insertAtBeginning('import wmill\n')
567
+ }
568
+ editor?.insertAtCursor(`wmill.load_s3_file(${s})`)
569
+ } else if (['javascript', 'typescript'].includes(scriptLangToEditorLang(lang))) {
570
+ if (!editor?.getCode().includes('import * as wmill from')) {
571
+ editor?.insertAtBeginning(`import * as wmill from "npm:windmill-client@1"\n`)
572
+ }
573
+ editor?.insertAtCursor(`wmill.loadS3File(${s})`)
574
+ }
575
+ }}
576
+ />
577
+
553
578
  <div class="flex justify-between items-center overflow-y-auto w-full p-0.5">
554
579
  <div class="flex items-center">
555
580
  <div
@@ -589,6 +614,22 @@ JsonNode ${windmillPathToCamelCaseName(path)} = JsonNode.Parse(await client.GetS
589
614
  </Button>
590
615
  {/if}
591
616
 
617
+ {#if showS3Picker && customUi?.s3object != false}
618
+ <Button
619
+ aiId="editor-bar-add-s3-object"
620
+ aiDescription="Add S3 Object"
621
+ title="Add S3 object"
622
+ color="light"
623
+ on:click={() => s3FilePicker?.open()}
624
+ size="xs"
625
+ btnClasses="!font-medium text-tertiary"
626
+ spacingSize="md"
627
+ startIcon={{ icon: File }}
628
+ {iconOnly}
629
+ >+S3 Object
630
+ </Button>
631
+ {/if}
632
+
592
633
  {#if showResourcePicker && customUi?.resource != false}
593
634
  <Button
594
635
  aiId="editor-bar-add-resource"
@@ -785,10 +785,9 @@ const flowHasChanged = $derived(flowPreviewContent?.flowHasChanged());
785
785
  redoProps={{ disabled: $history.index === $history.history.length - 1 }}
786
786
  on:undo={() => {
787
787
  const currentModules = flowStore.val?.value?.modules
788
-
789
- console.log('debug before', $state.snapshot(flowStore.val))
788
+ console.log('undo before', flowStore.val, JSON.stringify(flowStore.val, null, 2))
790
789
  flowStore.val = undo(history, flowStore.val)
791
- console.log('debug after', $state.snapshot(flowStore.val))
790
+ console.log('undo after', flowStore.val, JSON.stringify(flowStore.val, null, 2))
792
791
 
793
792
  const newModules = flowStore.val?.value?.modules
794
793
  const restoredModules = newModules?.filter(
@@ -20,6 +20,7 @@ import Alert from './common/alert/Alert.svelte';
20
20
  import FlowGraphViewerStep from './FlowGraphViewerStep.svelte';
21
21
  import FlowGraphV2 from './graph/FlowGraphV2.svelte';
22
22
  import { buildPrefix } from './graph/graphBuilder.svelte';
23
+ import { parseAssetFromString } from './assets/lib';
23
24
  import FlowPreviewResult from './FlowPreviewResult.svelte';
24
25
  const dispatch = createEventDispatcher();
25
26
  let { flowStateStore, retryStatus, suspendStatus, hideDownloadInGraph, hideTimeline, hideNodeDefinition, hideDownloadLogs, hideJobId } = getContext('FlowStatusViewer');
@@ -51,6 +52,23 @@ export let rightColumnSelect = 'timeline';
51
52
  export let localModuleStates = writable({});
52
53
  export let localDurationStatuses = writable({});
53
54
  let recursiveRefresh = {};
55
+ $: inputAssets = parseInputAssets(job?.args ?? {});
56
+ function parseInputAssets(args) {
57
+ const arr = [];
58
+ for (const v of Object.values(args)) {
59
+ if (typeof v === 'string') {
60
+ const asset = parseAssetFromString(v);
61
+ if (asset)
62
+ arr.push(asset);
63
+ }
64
+ else if (v && typeof v === 'object' && typeof v['s3'] === 'string') {
65
+ const s3 = v['s3'];
66
+ const storage = typeof v['storage'] == 'string' ? v['storage'] : undefined;
67
+ arr.push({ kind: 's3object', path: `${storage ?? ''}/${s3}` });
68
+ }
69
+ }
70
+ return arr;
71
+ }
54
72
  let jobResults = flowJobIds?.flowJobs?.map((x, id) => `iter #${id + 1} not loaded by frontend yet`) ?? [];
55
73
  let retry_selected = '';
56
74
  let timeout = undefined;
@@ -1015,6 +1033,7 @@ let subflowsSize = 500;
1015
1033
  </div>
1016
1034
 
1017
1035
  <FlowGraphV2
1036
+ {inputAssets}
1018
1037
  {selectedId}
1019
1038
  triggerNode={true}
1020
1039
  download={!hideDownloadInGraph}
@@ -2,9 +2,6 @@
2
2
  import FlowBuilder from './FlowBuilder.svelte';
3
3
  let { flowStore: oldFlowStore, disableAi, light, ...props } = $props();
4
4
  let flowStore = $state(oldFlowStore);
5
- $effect(() => {
6
- flowStore = oldFlowStore;
7
- });
8
5
  let trialRender = $state(true);
9
6
  if (light) {
10
7
  setTimeout(() => {
@@ -96,7 +96,7 @@ let refreshing = $state(false);
96
96
  if (closeOnClick) {
97
97
  drawer?.closeDrawer()
98
98
  }
99
- pickCallback(obj['path'], obj[extraField])
99
+ pickCallback(obj['path'], obj[extraField], extraField2 ? obj[extraField2] : '')
100
100
  }}
101
101
  >
102
102
  {#if `app` in obj}
@@ -1,6 +1,6 @@
1
1
  type Item = Record<string, any>;
2
2
  interface Props {
3
- pickCallback: (path: string, f: string) => void;
3
+ pickCallback: (path: string, extraField: string, extraField2: string) => void;
4
4
  loadItems: () => Promise<Item[] | undefined>;
5
5
  extraField?: string;
6
6
  extraField2?: string | undefined;
@@ -12,13 +12,13 @@ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> =
12
12
  z_$$bindings?: Bindings;
13
13
  }
14
14
  declare const MoveDrawer: $$__sveltets_2_IsomorphicComponent<{
15
- openDrawer?: (initialPath_l: string, summary_l: string | undefined, kind_l: "script" | "flow" | "resource" | "schedule" | "app" | "variable" | "raw_app") => Promise<void>;
15
+ openDrawer?: (initialPath_l: string, summary_l: string | undefined, kind_l: "resource" | "script" | "flow" | "schedule" | "app" | "variable" | "raw_app") => Promise<void>;
16
16
  }, {
17
17
  update: CustomEvent<any>;
18
18
  } & {
19
19
  [evt: string]: CustomEvent<any>;
20
20
  }, {}, {
21
- openDrawer: (initialPath_l: string, summary_l: string | undefined, kind_l: "script" | "flow" | "resource" | "schedule" | "app" | "variable" | "raw_app") => Promise<void>;
21
+ openDrawer: (initialPath_l: string, summary_l: string | undefined, kind_l: "resource" | "script" | "flow" | "schedule" | "app" | "variable" | "raw_app") => Promise<void>;
22
22
  }, string>;
23
23
  type MoveDrawer = InstanceType<typeof MoveDrawer>;
24
24
  export default MoveDrawer;
@@ -4,11 +4,11 @@ import { onMount, untrack } from 'svelte';
4
4
  import AppConnect from './AppConnectDrawer.svelte';
5
5
  import ResourceEditorDrawer from './ResourceEditorDrawer.svelte';
6
6
  import { Button } from './common';
7
- import DBManagerDrawerButton from './DBManagerDrawerButton.svelte';
8
7
  import { Pen, Plus, RotateCw } from 'lucide-svelte';
9
8
  import { sendUserToast } from '../toast';
10
- import { isDbType } from './apps/components/display/dbtable/utils';
11
9
  import Select from './select/Select.svelte';
10
+ import DbManagerDrawer from './DBManagerDrawer.svelte';
11
+ import ExploreAssetButton, { assetCanBeExplored } from '../../routes/(root)/(logged)/assets/ExploreAssetButton.svelte';
12
12
  let { initialValue = $bindable(undefined), value = $bindable(undefined), valueType = $bindable(undefined), resourceType = undefined, disabled = false, disablePortal = false, showSchemaExplorer = false, selectFirst = false, expressOAuthSetup = false, defaultValues = undefined, placeholder = undefined, onClear = undefined } = $props();
13
13
  if (initialValue && value == undefined) {
14
14
  console.log('initialValue', initialValue);
@@ -97,6 +97,7 @@ $effect(() => {
97
97
  });
98
98
  let appConnect = $state();
99
99
  let resourceEditor = $state();
100
+ let dbManagerDrawer = $state();
100
101
  </script>
101
102
 
102
103
  <AppConnect
@@ -203,7 +204,13 @@ let resourceEditor = $state();
203
204
  iconOnly
204
205
  />
205
206
  </div>
206
- {#if showSchemaExplorer && isDbType(resourceType) && value}
207
- <DBManagerDrawerButton {resourceType} resourcePath={value} />
207
+ {#if showSchemaExplorer && value && assetCanBeExplored({ kind: 'resource', path: value }, { resource_type: resourceType })}
208
+ <ExploreAssetButton
209
+ _resourceMetadata={{ resource_type: resourceType }}
210
+ asset={{ kind: 'resource', path: value }}
211
+ {dbManagerDrawer}
212
+ />
208
213
  {/if}
209
214
  </div>
215
+
216
+ <DbManagerDrawer bind:this={dbManagerDrawer} />