windmill-components 1.504.5 → 1.510.1

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 (202) hide show
  1. package/package/ata/index.js +1 -1
  2. package/package/components/AppConnectInner.svelte +161 -29
  3. package/package/components/ArgInput.svelte +33 -103
  4. package/package/components/AuthSettings.svelte +45 -1
  5. package/package/components/Dev.svelte +31 -24
  6. package/package/components/DisplayResult.svelte +53 -26
  7. package/package/components/DisplayResult.svelte.d.ts +1 -1
  8. package/package/components/DynSelect.svelte +3 -3
  9. package/package/components/Editor.svelte +7 -4
  10. package/package/components/EditorBar.svelte +2 -2
  11. package/package/components/ErrorOrRecoveryHandler.svelte +73 -67
  12. package/package/components/ErrorOrRecoveryHandler.svelte.d.ts +8 -24
  13. package/package/components/FlowBuilder.svelte +11 -2
  14. package/package/components/FlowJobResult.svelte +12 -17
  15. package/package/components/FlowJobResult.svelte.d.ts +5 -18
  16. package/package/components/FlowPreviewContent.svelte +13 -10
  17. package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
  18. package/package/components/FlowPreviewResult.svelte +14 -6
  19. package/package/components/FlowStatusViewer.svelte +11 -24
  20. package/package/components/FlowStatusViewer.svelte.d.ts +19 -18
  21. package/package/components/FlowStatusViewerInner.svelte +110 -131
  22. package/package/components/FlowStatusViewerInner.svelte.d.ts +20 -18
  23. package/package/components/GitDiffPreview.svelte +55 -0
  24. package/package/components/GitDiffPreview.svelte.d.ts +13 -0
  25. package/package/components/HistoricInputs.svelte +2 -2
  26. package/package/components/InitGitRepoPopover.svelte +410 -0
  27. package/package/components/InitGitRepoPopover.svelte.d.ts +13 -0
  28. package/package/components/InstanceSetting.svelte +21 -9
  29. package/package/components/InstanceSettings.svelte +16 -3
  30. package/package/components/JobLoader.svelte +567 -0
  31. package/package/components/JobLoader.svelte.d.ts +53 -0
  32. package/package/components/JobLogs.svelte +6 -4
  33. package/package/components/JobLogs.svelte.d.ts +5 -18
  34. package/package/components/LightweightResourcePicker.svelte +18 -39
  35. package/package/components/LightweightResourcePicker.svelte.d.ts +6 -22
  36. package/package/components/LogViewer.svelte +35 -41
  37. package/package/components/LogViewer.svelte.d.ts +6 -20
  38. package/package/components/ModulePreviewResultViewer.svelte +3 -1
  39. package/package/components/ModulePreviewResultViewer.svelte.d.ts +1 -0
  40. package/package/components/ModuleTest.svelte +16 -11
  41. package/package/components/PullGitRepoPopover.svelte +355 -0
  42. package/package/components/PullGitRepoPopover.svelte.d.ts +18 -0
  43. package/package/components/S3FilePicker.svelte +5 -3
  44. package/package/components/SavedInputs.svelte +2 -2
  45. package/package/components/ScriptBuilder.svelte +4 -3
  46. package/package/components/ScriptEditor.svelte +34 -31
  47. package/package/components/ScriptEditor.svelte.d.ts +3 -3
  48. package/package/components/ServiceLogsInner.svelte +2 -1
  49. package/package/components/ServiceLogsInner.svelte.d.ts +1 -0
  50. package/package/components/UserSettings.svelte +1 -1
  51. package/package/components/WorkerTagSelect.svelte +32 -3
  52. package/package/components/apps/components/buttons/AppButton.svelte +7 -1
  53. package/package/components/apps/components/buttons/AppButton.svelte.d.ts +1 -0
  54. package/package/components/apps/components/display/AppCustomComponent.svelte +1 -1
  55. package/package/components/apps/components/display/AppDisplayComponentByJobId.svelte +16 -11
  56. package/package/components/apps/components/display/AppJobIdLogComponent.svelte +13 -10
  57. package/package/components/apps/components/display/AppMenu.svelte +5 -0
  58. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +3 -3
  59. package/package/components/apps/components/display/dbtable/DeleteRow.svelte +3 -3
  60. package/package/components/apps/components/display/dbtable/InsertRowRunnable.svelte +3 -3
  61. package/package/components/apps/components/display/dbtable/UpdateCell.svelte +3 -3
  62. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +3 -3
  63. package/package/components/apps/components/helpers/RunnableComponent.svelte +65 -54
  64. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +5 -5
  65. package/package/components/apps/components/inputs/AppUserResource.svelte +26 -8
  66. package/package/components/apps/editor/AppEditorHeader.svelte +11 -5
  67. package/package/components/apps/editor/AppJobsDrawer.svelte +5 -5
  68. package/package/components/apps/editor/RunnableJobPanel.svelte +4 -4
  69. package/package/components/apps/editor/component/components.d.ts +12 -0
  70. package/package/components/apps/editor/component/components.js +19 -7
  71. package/package/components/assets/AssetButtons.svelte +38 -0
  72. package/package/components/assets/AssetButtons.svelte.d.ts +15 -0
  73. package/package/components/assets/AssetsDropdownButton.svelte +60 -72
  74. package/package/components/assets/AssetsDropdownButton.svelte.d.ts +3 -4
  75. package/package/components/assets/AssetsUsageDrawer.svelte +10 -10
  76. package/package/components/assets/JobAssetsViewer.svelte +79 -0
  77. package/package/components/assets/JobAssetsViewer.svelte.d.ts +7 -0
  78. package/package/components/assets/README_DEV.md +0 -0
  79. package/package/components/assets/lib.d.ts +9 -1
  80. package/package/components/assets/lib.js +48 -7
  81. package/package/components/common/fileUpload/FileUpload.svelte +126 -84
  82. package/package/components/common/fileUpload/FileUpload.svelte.d.ts +13 -3
  83. package/package/components/common/fileUpload/S3ArgInput.svelte +111 -0
  84. package/package/components/common/fileUpload/S3ArgInput.svelte.d.ts +21 -0
  85. package/package/components/common/table/ScriptRow.svelte +3 -1
  86. package/package/components/copilot/autocomplete/Autocompletor.js +23 -5
  87. package/package/components/copilot/chat/AIChatDisplay.svelte +8 -0
  88. package/package/components/copilot/chat/AIChatManager.svelte.js +13 -8
  89. package/package/components/copilot/chat/flow/ModuleAcceptReject.svelte +5 -5
  90. package/package/components/copilot/chat/flow/core.d.ts +1 -1
  91. package/package/components/copilot/chat/flow/core.js +2 -38
  92. package/package/components/copilot/chat/navigator/apiTools.d.ts +8 -0
  93. package/package/components/copilot/chat/navigator/apiTools.js +95 -15
  94. package/package/components/copilot/chat/navigator/core.d.ts +1 -1
  95. package/package/components/copilot/chat/navigator/core.js +2 -1
  96. package/package/components/copilot/chat/script/core.d.ts +11 -2
  97. package/package/components/copilot/chat/script/core.js +135 -1
  98. package/package/components/copilot/chat/shared.d.ts +10 -0
  99. package/package/components/copilot/chat/shared.js +56 -0
  100. package/package/components/copilot/lib.d.ts +1 -0
  101. package/package/components/copilot/lib.js +27 -9
  102. package/package/components/custom_ui.d.ts +1 -0
  103. package/package/components/flows/FlowAssetsHandler.svelte +133 -0
  104. package/package/components/flows/FlowAssetsHandler.svelte.d.ts +14 -0
  105. package/package/components/flows/content/FlowModuleComponent.svelte +16 -18
  106. package/package/components/flows/flowStore.d.ts +1 -1
  107. package/package/components/flows/map/FlowModuleSchemaItem.svelte +1 -0
  108. package/package/components/flows/propPicker/OutputPicker.svelte +9 -4
  109. package/package/components/flows/scheduleUtils.js +1 -1
  110. package/package/components/flows/types.d.ts +2 -1
  111. package/package/components/graph/FlowGraphV2.svelte +8 -104
  112. package/package/components/graph/FlowGraphV2.svelte.d.ts +0 -2
  113. package/package/components/graph/graphBuilder.svelte.d.ts +6 -3
  114. package/package/components/graph/graphBuilder.svelte.js +35 -9
  115. package/package/components/graph/renderers/edges/BaseEdge.svelte +2 -5
  116. package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +1 -0
  117. package/package/components/graph/renderers/nodes/AssetNode.svelte +23 -20
  118. package/package/components/graph/renderers/nodes/AssetNode.svelte.d.ts +5 -10
  119. package/package/components/graph/renderers/nodes/AssetsOverflowedNode.svelte +1 -1
  120. package/package/components/graph/util.js +1 -1
  121. package/package/components/home/ItemsList.svelte +2 -0
  122. package/package/components/icons/AssetGenericIcon.svelte +0 -3
  123. package/package/components/jobs/JobPreview.svelte +10 -6
  124. package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +13 -12
  125. package/package/components/runs/BatchReRunOptionsPane.svelte +5 -1
  126. package/package/components/runs/JobPreview.svelte +26 -16
  127. package/package/components/runs/{JobLoader.svelte.d.ts → JobsLoader.svelte.d.ts} +3 -3
  128. package/package/components/runs/NoWorkerWithTagWarning.svelte +2 -2
  129. package/package/components/runs/NoWorkerWithTagWarning.svelte.d.ts +1 -0
  130. package/package/components/runs/RunsFilter.svelte.d.ts +1 -1
  131. package/package/components/schema/AddPropertyFormV2.svelte +42 -33
  132. package/package/components/schema/AddPropertyFormV2.svelte.d.ts +1 -0
  133. package/package/components/schema/AddPropertyV2.svelte +2 -1
  134. package/package/components/schema/AddPropertyV2.svelte.d.ts +1 -0
  135. package/package/components/schema/EditableSchemaWrapper.svelte +3 -1
  136. package/package/components/schema/editable_schema_wrapper.d.ts +3 -0
  137. package/package/components/scriptEditor/LogPanel.svelte +3 -2
  138. package/package/components/script_builder.d.ts +2 -2
  139. package/package/components/settings/CreateToken.svelte +76 -41
  140. package/package/components/settings/CreateToken.svelte.d.ts +1 -1
  141. package/package/components/settings/ScopeSelector.svelte +613 -0
  142. package/package/components/settings/ScopeSelector.svelte.d.ts +8 -0
  143. package/package/components/settings/TokenDisplay.svelte +103 -0
  144. package/package/components/settings/TokenDisplay.svelte.d.ts +10 -0
  145. package/package/components/settings/TokensTable.svelte +70 -349
  146. package/package/components/sidebar/CriticalAlertModal.svelte +3 -0
  147. package/package/components/triggers/DeleteTriggerButton.svelte +1 -1
  148. package/package/components/triggers/TriggerEditorToolbar.svelte +3 -3
  149. package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte +55 -0
  150. package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte.d.ts +13 -0
  151. package/package/components/triggers/TriggersEditor.svelte +45 -3
  152. package/package/components/triggers/TriggersWrapper.svelte +2 -2
  153. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +43 -2
  154. package/package/components/triggers/gcp/utils.js +9 -1
  155. package/package/components/triggers/http/OpenAPISpecGenerator.svelte +1 -0
  156. package/package/components/triggers/http/RouteEditorInner.svelte +208 -164
  157. package/package/components/triggers/http/RouteEditorInner.svelte.d.ts +6 -2
  158. package/package/components/triggers/http/utils.js +9 -3
  159. package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +43 -2
  160. package/package/components/triggers/kafka/utils.js +9 -1
  161. package/package/components/triggers/mqtt/MqttEditorConfigSection.svelte +4 -132
  162. package/package/components/triggers/mqtt/MqttEditorConfigSection.svelte.d.ts +2 -5
  163. package/package/components/triggers/mqtt/MqttTriggerEditorInner.svelte +178 -9
  164. package/package/components/triggers/mqtt/utils.js +9 -1
  165. package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +43 -2
  166. package/package/components/triggers/nats/utils.js +9 -1
  167. package/package/components/triggers/postgres/PostgresTriggerEditorInner.svelte +41 -2
  168. package/package/components/triggers/postgres/utils.js +9 -1
  169. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +34 -88
  170. package/package/components/triggers/sqs/SqsTriggerEditorInner.svelte +43 -2
  171. package/package/components/triggers/sqs/utils.js +9 -1
  172. package/package/components/triggers/utils.js +12 -0
  173. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +43 -2
  174. package/package/components/triggers/websocket/utils.js +11 -1
  175. package/package/components/workspaceSettings/AISettings.svelte +0 -2
  176. package/package/components/workspaceSettings/FilterList.svelte +56 -0
  177. package/package/components/workspaceSettings/FilterList.svelte.d.ts +8 -0
  178. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +785 -0
  179. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte.d.ts +18 -0
  180. package/package/gen/core/OpenAPI.js +1 -1
  181. package/package/gen/schemas.gen.d.ts +305 -23
  182. package/package/gen/schemas.gen.js +305 -23
  183. package/package/gen/services.gen.d.ts +33 -1
  184. package/package/gen/services.gen.js +66 -2
  185. package/package/gen/types.gen.d.ts +216 -11
  186. package/package/history.svelte.js +0 -2
  187. package/package/hub.d.ts +1 -0
  188. package/package/hubPaths.json +5 -2
  189. package/package/infer.js +16 -10
  190. package/package/svelte5Utils.svelte.d.ts +1 -0
  191. package/package/svelte5Utils.svelte.js +25 -18
  192. package/package/toast.js +10 -0
  193. package/package/utils.d.ts +3 -2
  194. package/package/utils.js +20 -5
  195. package/package.json +11 -11
  196. package/package/components/ResultJobLoader.svelte +0 -219
  197. package/package/components/ResultJobLoader.svelte.d.ts +0 -52
  198. package/package/components/TestJobLoader.svelte +0 -274
  199. package/package/components/TestJobLoader.svelte.d.ts +0 -43
  200. package/package/components/icons/AssetVarIcon.svelte +0 -31
  201. package/package/components/icons/AssetVarIcon.svelte.d.ts +0 -9
  202. /package/package/components/runs/{JobLoader.svelte → JobsLoader.svelte} +0 -0
@@ -3,32 +3,61 @@ import { WorkerService } from '../gen';
3
3
  import { createEventDispatcher } from 'svelte';
4
4
  import Select from './select/Select.svelte';
5
5
  import { safeSelectItems } from './select/utils.svelte';
6
+ import { Button } from './common';
7
+ import { RotateCw } from 'lucide-svelte';
8
+ import { sendUserToast } from '../toast';
6
9
  let { tag = $bindable(), noLabel = false, nullTag = undefined, disabled = false, placeholder, inputClass } = $props();
10
+ let loading = $state(false);
7
11
  loadWorkerGroups();
8
12
  const dispatch = createEventDispatcher();
9
13
  async function loadWorkerGroups() {
10
- if (!$workerTags) {
11
- $workerTags = await WorkerService.getCustomTags({ workspace: $workspaceStore });
14
+ loading = true;
15
+ try {
16
+ if (!$workerTags) {
17
+ $workerTags = await WorkerService.getCustomTags({ workspace: $workspaceStore });
18
+ }
12
19
  }
20
+ catch (e) {
21
+ $workerTags = [];
22
+ sendUserToast('Error loading custom tags', true);
23
+ }
24
+ loading = false;
13
25
  }
14
26
  let items = $derived([
15
27
  // ...(tag ? ['reset to default'] : [nullTag ? `default: ${nullTag}` : '']),
16
28
  ...(tag && tag != '' && !($workerTags ?? []).includes(tag) ? [tag] : []),
17
29
  ...($workerTags ?? [])
18
30
  ]);
31
+ let open = $state(false);
19
32
  </script>
20
33
 
21
- <div class="flex gap-1 items-center">
34
+ <div class="flex gap-1 items-center relative">
22
35
  {#if !noLabel}
23
36
  <div class="text-tertiary text-2xs">{placeholder ?? 'tag'}</div>
24
37
  {/if}
25
38
  <Select
26
39
  clearable
27
40
  class="w-full"
41
+ bind:open
28
42
  {inputClass}
29
43
  {disabled}
30
44
  placeholder={nullTag ? nullTag : (placeholder ?? 'lang default')}
31
45
  items={safeSelectItems(items)}
32
46
  bind:value={() => tag, (value) => ((tag = value), dispatch('change', value))}
33
47
  />
48
+ {#if open}
49
+ <div class="absolute top-0 -right-12">
50
+ <Button
51
+ iconOnly
52
+ variant="border"
53
+ color="dark"
54
+ size="xs"
55
+ startIcon={{ icon: RotateCw, classes: loading ? 'animate-spin' : '' }}
56
+ on:click={async () => {
57
+ loadWorkerGroups()
58
+ open = true
59
+ }}
60
+ ></Button>
61
+ </div>
62
+ {/if}
34
63
  </div>
@@ -11,7 +11,7 @@ import ResolveStyle from '../helpers/ResolveStyle.svelte';
11
11
  import { initCss } from '../../utils';
12
12
  import ConfirmationModal from '../../../common/confirmationModal/ConfirmationModal.svelte';
13
13
  import Portal from '../../../Portal.svelte';
14
- let { id, componentInput, configuration, recomputeIds = undefined, extraQueryParams = {}, horizontalAlignment = undefined, verticalAlignment = undefined, noWFull = false, preclickAction = undefined, customCss = undefined, render, errorHandledByComponent = $bindable(false), extraKey = undefined, isMenuItem = false, noInitialize = false, replaceCallback = false, controls = undefined } = $props();
14
+ let { id, componentInput, configuration, recomputeIds = undefined, extraQueryParams = {}, horizontalAlignment = undefined, verticalAlignment = undefined, noWFull = false, preclickAction = undefined, customCss = undefined, render, errorHandledByComponent = $bindable(false), extraKey = undefined, isMenuItem = false, noInitialize = false, replaceCallback = false, controls = undefined, onDone = undefined } = $props();
15
15
  const { worldStore, app, componentControl, selectedComponent } = getContext('AppViewerContext');
16
16
  const rowContext = getContext('RowWrapperContext');
17
17
  const rowInputs = getContext('RowInputs');
@@ -159,6 +159,12 @@ let errorsMessage = $derived(Object.values(errors)
159
159
  listInputs.set(id, inputOutput)
160
160
  }
161
161
  }}
162
+ on:done={() => {
163
+ onDone?.()
164
+ }}
165
+ on:doneError={() => {
166
+ onDone?.()
167
+ }}
162
168
  refreshOnStart={resolvedConfig.triggerOnAppLoad}
163
169
  {replaceCallback}
164
170
  >
@@ -21,6 +21,7 @@ interface Props {
21
21
  left: () => boolean;
22
22
  right: () => boolean | string;
23
23
  } | undefined;
24
+ onDone?: () => void;
24
25
  }
25
26
  declare const AppButton: import("svelte").Component<Props, {}, "errorHandledByComponent">;
26
27
  type AppButton = ReturnType<typeof AppButton>;
@@ -84,7 +84,7 @@ $effect(() => {
84
84
  <InitializeComponent {id} />
85
85
  <div class="w-full h-full overflow-auto {customComponent?.name ?? 'no_name'}">
86
86
  <RunnableWrapper {outputs} render autoRefresh {componentInput} {id} bind:result>
87
- {#if !loaded}
87
+ {#if !loaded && render}
88
88
  <Loader2 class="animate-spin" />
89
89
  {/if}
90
90
  <div id={divId}></div>
@@ -3,7 +3,7 @@ import { twMerge } from 'tailwind-merge';
3
3
  import { initConfig, initOutput } from '../../editor/appUtils';
4
4
  import { IS_APP_PUBLIC_CONTEXT_KEY } from '../../types';
5
5
  import { initCss } from '../../utils';
6
- import TestJobLoader from '../../../TestJobLoader.svelte';
6
+ import JobLoader from '../../../JobLoader.svelte';
7
7
  import { components } from '../../editor/component';
8
8
  import ResolveConfig from '../helpers/ResolveConfig.svelte';
9
9
  import ResolveStyle from '../helpers/ResolveStyle.svelte';
@@ -21,7 +21,7 @@ const outputs = initOutput($worldStore, id, {
21
21
  });
22
22
  initializing = false;
23
23
  let css = $state(initCss($app.css?.jobiddisplaycomponent, customCss));
24
- let testJobLoader = $state(undefined);
24
+ let jobLoader = $state(undefined);
25
25
  let testIsLoading = $state(false);
26
26
  let testJob = $state(undefined);
27
27
  $effect(() => {
@@ -30,12 +30,22 @@ $effect(() => {
30
30
  outputs.loading.set(true);
31
31
  const jobId = resolvedConfig?.['jobId'];
32
32
  if (jobId) {
33
- testJobLoader?.watchJob(jobId);
33
+ jobLoader?.watchJob(jobId, {
34
+ done(x) {
35
+ onDone(x);
36
+ }
37
+ });
34
38
  }
35
39
  });
36
40
  }
37
41
  });
38
42
  let result = $state(undefined);
43
+ function onDone(job) {
44
+ outputs.loading.set(false);
45
+ outputs.jobId.set(job.id);
46
+ outputs.result.set(job.result);
47
+ result = job.result;
48
+ }
39
49
  </script>
40
50
 
41
51
  {#each Object.keys(components['jobiddisplaycomponent'].initialData.configuration) as key (key)}
@@ -57,17 +67,12 @@ let result = $state(undefined);
57
67
  />
58
68
  {/each}
59
69
 
60
- <TestJobLoader
70
+ <JobLoader
71
+ noCode={true}
61
72
  workspaceOverride={workspace}
62
- bind:this={testJobLoader}
73
+ bind:this={jobLoader}
63
74
  bind:isLoading={testIsLoading}
64
75
  bind:job={testJob}
65
- on:done={(e) => {
66
- outputs.loading.set(false)
67
- outputs.jobId.set(e.detail.id)
68
- outputs.result.set(e.detail.result)
69
- result = e.detail.result
70
- }}
71
76
  />
72
77
 
73
78
  <InitializeComponent {id} />
@@ -3,7 +3,7 @@ import { twMerge } from 'tailwind-merge';
3
3
  import { initConfig, initOutput } from '../../editor/appUtils';
4
4
  import { initCss } from '../../utils';
5
5
  import LogViewer from '../../../LogViewer.svelte';
6
- import TestJobLoader from '../../../TestJobLoader.svelte';
6
+ import JobLoader from '../../../JobLoader.svelte';
7
7
  import { components } from '../../editor/component';
8
8
  import ResolveConfig from '../helpers/ResolveConfig.svelte';
9
9
  import ResolveStyle from '../helpers/ResolveStyle.svelte';
@@ -23,7 +23,7 @@ const outputs = initOutput($worldStore, id, {
23
23
  });
24
24
  initializing = false;
25
25
  let css = $state(initCss($app.css?.jobidlogcomponent, customCss));
26
- let testJobLoader = $state(undefined);
26
+ let jobLoader = $state(undefined);
27
27
  let testIsLoading = $state(false);
28
28
  let testJob = $state(undefined);
29
29
  $effect(() => {
@@ -32,7 +32,14 @@ $effect(() => {
32
32
  outputs.loading.set(true);
33
33
  const jobId = resolvedConfig?.['jobId'];
34
34
  if (jobId) {
35
- testJobLoader?.watchJob(jobId);
35
+ let callbacks = {
36
+ done(x) {
37
+ outputs.loading.set(false);
38
+ outputs.jobId.set(x.id);
39
+ outputs.result.set(x.result);
40
+ }
41
+ };
42
+ jobLoader?.watchJob(jobId, callbacks);
36
43
  }
37
44
  });
38
45
  }
@@ -58,16 +65,12 @@ $effect(() => {
58
65
  />
59
66
  {/each}
60
67
 
61
- <TestJobLoader
68
+ <JobLoader
69
+ noCode={true}
62
70
  workspaceOverride={workspace}
63
- bind:this={testJobLoader}
71
+ bind:this={jobLoader}
64
72
  bind:isLoading={testIsLoading}
65
73
  bind:job={testJob}
66
- on:done={(e) => {
67
- outputs.loading.set(false)
68
- outputs.jobId.set(e.detail.id)
69
- outputs.result.set(e.detail.result)
70
- }}
71
74
  />
72
75
 
73
76
  <InitializeComponent {id} />
@@ -38,6 +38,7 @@ $effect(() => {
38
38
  $effect(() => {
39
39
  resolvedConfig.afterIcon && afterIconComponent && untrack(() => handleAfterIcon());
40
40
  });
41
+ let menu = $state();
41
42
  </script>
42
43
 
43
44
  <InitializeComponent {id} />
@@ -66,6 +67,7 @@ $effect(() => {
66
67
  <Menubar class={resolvedConfig.fillContainer ? 'w-full h-full' : ''}>
67
68
  {#snippet children({ createMenu })}
68
69
  <Menu
70
+ bind:this={menu}
69
71
  {createMenu}
70
72
  placement="bottom-end"
71
73
  justifyEnd={false}
@@ -134,6 +136,9 @@ $effect(() => {
134
136
  componentInput={actionButton.componentInput}
135
137
  noWFull={false}
136
138
  isMenuItem={true}
139
+ onDone={() => {
140
+ menu?.close()
141
+ }}
137
142
  />
138
143
  </div>
139
144
  {/if}
@@ -150,7 +150,7 @@ let datasource = $state({
150
150
  return;
151
151
  }
152
152
  runnableComponent?.runComponent(undefined, undefined, undefined, currentParams, {
153
- done: (items) => {
153
+ onDone: (items) => {
154
154
  let lastRow = -1;
155
155
  if (datasource?.rowCount && datasource.rowCount <= params.endRow) {
156
156
  lastRow = datasource.rowCount;
@@ -178,10 +178,10 @@ let datasource = $state({
178
178
  params.failCallback();
179
179
  }
180
180
  },
181
- cancel: () => {
181
+ onCancel: () => {
182
182
  params.failCallback();
183
183
  },
184
- error: () => {
184
+ onError: (error) => {
185
185
  params.failCallback();
186
186
  }
187
187
  });
@@ -26,14 +26,14 @@ export async function triggerDelete(resource, table, allColumns, data, dbType) {
26
26
  ndata[x.field] = data[x.field];
27
27
  });
28
28
  await runnableComponent?.runComponent(undefined, undefined, undefined, { ...ndata }, {
29
- done: (x) => {
29
+ onDone: (_x) => {
30
30
  sendUserToast('Row deleted', false);
31
31
  dispatch('deleted');
32
32
  },
33
- cancel: () => {
33
+ onCancel: () => {
34
34
  sendUserToast('Error deleting row', true);
35
35
  },
36
- error: () => {
36
+ onError: () => {
37
37
  sendUserToast('Error updating row', true);
38
38
  }
39
39
  });
@@ -23,14 +23,14 @@ export async function insertRow(resource, workspace, table, columns, values, res
23
23
  await tick();
24
24
  if (runnableComponent) {
25
25
  await runnableComponent?.runComponent(undefined, undefined, undefined, values, {
26
- done: (x) => {
26
+ onDone: (_x) => {
27
27
  dispatch('insert');
28
28
  sendUserToast('Row inserted', false);
29
29
  },
30
- cancel: () => {
30
+ onCancel: () => {
31
31
  sendUserToast('Error inserting row', true);
32
32
  },
33
- error: () => {
33
+ onError: () => {
34
34
  sendUserToast('Error inserting row', true);
35
35
  }
36
36
  });
@@ -27,13 +27,13 @@ export async function triggerUpdate(resource, table, column, allColumns, valueTo
27
27
  });
28
28
  ndata[column.field] = oldValue;
29
29
  await runnableComponent?.runComponent(undefined, undefined, undefined, { value_to_update: valueToUpdate, ...ndata }, {
30
- done: (x) => {
30
+ onDone: (x) => {
31
31
  sendUserToast('Value updated', false);
32
32
  },
33
- cancel: () => {
33
+ onCancel: () => {
34
34
  sendUserToast('Error updating value', true);
35
35
  },
36
- error: () => {
36
+ onError: () => {
37
37
  sendUserToast('Error updating value', true);
38
38
  }
39
39
  });
@@ -67,7 +67,7 @@ const datasource = $state({
67
67
  return;
68
68
  }
69
69
  runnableComponent?.runComponent(undefined, undefined, undefined, currentParams, {
70
- done: (items) => {
70
+ onDone: (items) => {
71
71
  let lastRow = -1;
72
72
  if (datasource?.rowCount && datasource.rowCount <= params.endRow) {
73
73
  lastRow = datasource.rowCount;
@@ -92,10 +92,10 @@ const datasource = $state({
92
92
  params.failCallback();
93
93
  }
94
94
  },
95
- cancel: () => {
95
+ onCancel: () => {
96
96
  params.failCallback();
97
97
  },
98
- error: () => {
98
+ onError: () => {
99
99
  params.failCallback();
100
100
  }
101
101
  });
@@ -8,7 +8,6 @@ import { createEventDispatcher, getContext, onDestroy, onMount, untrack } from '
8
8
  import { computeGlobalContext, eval_like } from './eval';
9
9
  import InputValue from './InputValue.svelte';
10
10
  import { collectOneOfFields, selectId } from '../../editor/appUtils';
11
- import ResultJobLoader from '../../../ResultJobLoader.svelte';
12
11
  import { userStore } from '../../../../stores';
13
12
  import { get } from 'svelte/store';
14
13
  import RefreshButton from './RefreshButton.svelte';
@@ -16,6 +15,7 @@ import { ctxRegex } from '../../utils';
16
15
  import { computeWorkspaceS3FileInputPolicy } from '../../editor/appUtilsS3';
17
16
  import { executeRunnable } from './executeRunnable';
18
17
  import SchemaForm from '../../../SchemaForm.svelte';
18
+ import JobLoader, {} from '../../../JobLoader.svelte';
19
19
  let { id, fields, runnable, transformer, extraQueryParams = {}, autoRefresh = true, result = $bindable(undefined), forceSchemaDisplay = false, wrapperClass = '', wrapperStyle = '', render, outputs, extraKey = '', initializing = false, recomputeOnInputChanged = true, loading = $bindable(false), refreshOnStart = false, recomputableByRefreshButton, errorHandledByComponent = false, hideRefreshButton = false, hasChildrens, allowConcurentRequests = false, noInitialize = false, overrideCallback = undefined, overrideAutoRefresh = false, replaceCallback = false, children } = $props();
20
20
  const { worldStore, runnableComponents, workspace, appPath, isEditor, jobs, jobsById, noBackend, errorByComponent, mode, stateId, state: stateStore, componentControl, initialized, selectedComponent, app, connectingInput, bgRuns, recomputeAllContext } = getContext('AppViewerContext');
21
21
  const editorContext = getContext('AppEditorContext');
@@ -34,7 +34,7 @@ function setDebouncedExecute() {
34
34
  executeTimeout && clearTimeout(executeTimeout);
35
35
  executeTimeout = setTimeout(() => {
36
36
  console.debug('debounce execute');
37
- executeComponent(true);
37
+ executeComponent();
38
38
  }, 200);
39
39
  }
40
40
  function computeStaticValues() {
@@ -56,6 +56,57 @@ function refreshOnStaticChange() {
56
56
  // $: sendUserToast('args' + JSON.stringify(runnableInputValues) + Boolean(extraQueryParams) || args)
57
57
  // $: console.log(runnableInputValues)
58
58
  let firstRefresh = true;
59
+ function genCallbacks({ onDone, onCancel, onError }) {
60
+ const callbacks = {
61
+ started({ id }) {
62
+ console.log('started', id);
63
+ loading = true;
64
+ outputs.jobId?.set(id);
65
+ dispatch('started', id);
66
+ },
67
+ doneWithoutCompute(r) {
68
+ onDone?.(r);
69
+ },
70
+ doneResult({ id, result }) {
71
+ onDone?.(result);
72
+ lastJobId = id;
73
+ setResult(result, id);
74
+ loading = false;
75
+ dispatch('done', { id, result });
76
+ },
77
+ cancel({ id }) {
78
+ onCancel?.();
79
+ let jobId = id;
80
+ console.debug('cancel', jobId);
81
+ let job = $jobsById[jobId];
82
+ if (job && job.created_at && !job.duration_ms) {
83
+ $jobsById[jobId] = {
84
+ ...job,
85
+ started_at: job.started_at ?? Date.now(),
86
+ duration_ms: Date.now() - (job.started_at ?? job.created_at)
87
+ };
88
+ }
89
+ dispatch('cancel', { id });
90
+ },
91
+ doneError({ id, error }) {
92
+ onError?.(error);
93
+ setResult({ error }, id);
94
+ loading = false;
95
+ dispatch('doneError', { id, error });
96
+ }
97
+ };
98
+ if (isEditor) {
99
+ callbacks.running = ({ id }) => {
100
+ console.log('running', id);
101
+ let jobId = id;
102
+ let job = $jobsById[jobId];
103
+ if (job && !job.started_at) {
104
+ $jobsById[jobId] = { ...job, started_at: Date.now() };
105
+ }
106
+ };
107
+ }
108
+ return callbacks;
109
+ }
59
110
  function refreshIfAutoRefresh(src) {
60
111
  // console.log(
61
112
  // 'refreshIfAutoRefresh',
@@ -151,7 +202,7 @@ async function executeComponent(noToast = false, inlineScriptOverride, setRunnab
151
202
  let jobId;
152
203
  console.debug(`Executing ${id}`);
153
204
  if (iterContext && $iterContext.disabled) {
154
- callbacks?.done({});
205
+ callbacks?.onDone?.({});
155
206
  console.debug(`Skipping execution of ${id} because it is part of a disabled list`);
156
207
  return;
157
208
  }
@@ -185,7 +236,7 @@ async function executeComponent(noToast = false, inlineScriptOverride, setRunnab
185
236
  await setResult(r, job);
186
237
  }
187
238
  loading = false;
188
- callbacks?.done(r);
239
+ callbacks?.onDone?.(r);
189
240
  if (setRunnableJobEditorPanel && editorContext) {
190
241
  editorContext.runnableJobEditorPanel.update((p) => {
191
242
  return {
@@ -200,16 +251,16 @@ async function executeComponent(noToast = false, inlineScriptOverride, setRunnab
200
251
  if (!noToast) {
201
252
  sendUserToast('This app is not connected to a windmill backend, it is a static preview');
202
253
  }
203
- callbacks?.done({});
254
+ callbacks?.onDone?.({});
204
255
  return;
205
256
  }
206
257
  if (runnable?.type === 'runnableByName' && !runnable.inlineScript) {
207
- callbacks?.done({});
258
+ callbacks?.onDone?.({});
208
259
  return;
209
260
  }
210
261
  if (!resultJobLoader) {
211
262
  console.warn('No test job loader');
212
- callbacks?.done({});
263
+ callbacks?.onDone?.({});
213
264
  return;
214
265
  }
215
266
  try {
@@ -219,7 +270,7 @@ async function executeComponent(noToast = false, inlineScriptOverride, setRunnab
219
270
  addJob(uuid);
220
271
  }
221
272
  return uuid;
222
- }, callbacks);
273
+ }, genCallbacks(callbacks ?? {}));
223
274
  if (setRunnableJobEditorPanel && editorContext) {
224
275
  editorContext.runnableJobEditorPanel.update((p) => {
225
276
  return {
@@ -234,7 +285,7 @@ async function executeComponent(noToast = false, inlineScriptOverride, setRunnab
234
285
  let error = e.body ?? e.message;
235
286
  updateResult({ error });
236
287
  $errorByComponent[id] = { error };
237
- callbacks?.done({ error });
288
+ callbacks?.onError?.({ error });
238
289
  sendUserToast(error, true);
239
290
  loading = false;
240
291
  }
@@ -301,9 +352,6 @@ export async function runComponent(noToast = true, inlineScriptOverride, setRunn
301
352
  $errorByComponent[id] = { error };
302
353
  }
303
354
  }
304
- async function setJobId(jobId) {
305
- outputs.jobId?.set(jobId);
306
- }
307
355
  function recordJob(jobId, result, jobError, transformer) {
308
356
  const error = jobError ?? JSON.stringify(transformer?.error, null, 4);
309
357
  if (isEditor && jobId) {
@@ -415,13 +463,13 @@ onMount(() => {
415
463
  dispatch('recompute');
416
464
  rejectCb = reject;
417
465
  executeComponent(true, inlineScript, setRunnableJobEditorPanel, undefined, {
418
- done: (x) => {
466
+ onDone: (x) => {
419
467
  resolve(x);
420
468
  },
421
- cancel: () => {
469
+ onCancel: () => {
422
470
  reject();
423
471
  },
424
- error: (e) => {
472
+ onError: (e) => {
425
473
  console.error(e);
426
474
  reject(e);
427
475
  }
@@ -570,47 +618,10 @@ $effect(() => {
570
618
  {/each}
571
619
  {/if}
572
620
 
573
- <ResultJobLoader
621
+ <JobLoader
574
622
  {allowConcurentRequests}
575
- {isEditor}
576
- on:started={(e) => {
577
- console.log('started', e.detail)
578
- loading = true
579
- setJobId(e.detail)
580
- dispatch('started', e.detail)
581
- }}
623
+ onlyResult
582
624
  workspaceOverride={workspace}
583
- on:done={(e) => {
584
- lastJobId = e.detail.id
585
- setResult(e.detail.result, e.detail.id)
586
- loading = false
587
- dispatch('done', { id: e.detail?.id, result: e.detail?.result })
588
- }}
589
- on:cancel={(e) => {
590
- let jobId = e.detail
591
- console.debug('cancel', jobId)
592
- let job = $jobsById[jobId]
593
- if (job && job.created_at && !job.duration_ms) {
594
- $jobsById[jobId] = {
595
- ...job,
596
- started_at: job.started_at ?? Date.now(),
597
- duration_ms: Date.now() - (job.started_at ?? job.created_at)
598
- }
599
- }
600
- dispatch('cancel', { id: e.detail })
601
- }}
602
- on:running={(e) => {
603
- let jobId = e.detail
604
- let job = $jobsById[jobId]
605
- if (job && !job.started_at) {
606
- $jobsById[jobId] = { ...job, started_at: Date.now() }
607
- }
608
- }}
609
- on:doneError={(e) => {
610
- setResult({ error: e.detail.error }, e.detail.id)
611
- loading = false
612
- dispatch('doneError', { id: e.detail.id, result: e.detail.result })
613
- }}
614
625
  bind:this={resultJobLoader}
615
626
  />
616
627
 
@@ -36,10 +36,10 @@ interface Props {
36
36
  replaceCallback?: boolean;
37
37
  children?: import('svelte').Snippet;
38
38
  }
39
- type Callbacks = {
40
- done: (x: any) => void;
41
- cancel: () => void;
42
- error: (e: any) => void;
39
+ type RunnableCallback = {
40
+ onDone?: (r: any) => void;
41
+ onCancel?: () => void;
42
+ onError?: (e: any) => void;
43
43
  };
44
44
  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> {
45
45
  new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
@@ -92,7 +92,7 @@ declare const RunnableComponent: $$__sveltets_2_IsomorphicComponent<Props, {
92
92
  };
93
93
  force_viewer_allow_user_resources?: Array<(string)>;
94
94
  }>;
95
- runComponent: (noToast?: boolean, inlineScriptOverride?: InlineScript, setRunnableJobEditorPanel?: boolean, dynamicArgsOverride?: Record<string, any>, callbacks?: Callbacks) => Promise<string | undefined>;
95
+ runComponent: (noToast?: boolean, inlineScriptOverride?: InlineScript, setRunnableJobEditorPanel?: boolean, dynamicArgsOverride?: Record<string, any>, callbacks?: RunnableCallback) => Promise<string | undefined>;
96
96
  }, "result" | "loading">;
97
97
  type RunnableComponent = InstanceType<typeof RunnableComponent>;
98
98
  export default RunnableComponent;
@@ -1,4 +1,4 @@
1
- <script lang="ts">import { getContext, onDestroy } from 'svelte';
1
+ <script lang="ts">import { getContext, onDestroy, untrack } from 'svelte';
2
2
  import { initConfig, initOutput } from '../../editor/appUtils';
3
3
  import { initCss } from '../../utils';
4
4
  import AlignWrapper from '../helpers/AlignWrapper.svelte';
@@ -9,7 +9,7 @@ import ResolveStyle from '../helpers/ResolveStyle.svelte';
9
9
  import { twMerge } from 'tailwind-merge';
10
10
  import LightweightResourcePicker from '../../../LightweightResourcePicker.svelte';
11
11
  let { id, configuration, verticalAlignment = undefined, customCss = undefined, render } = $props();
12
- const { app, worldStore, componentControl } = getContext('AppViewerContext');
12
+ const { app, worldStore, componentControl, isEditor, mode } = getContext('AppViewerContext');
13
13
  let resolvedConfig = $state(initConfig(components['userresourcecomponent'].initialData.configuration, configuration));
14
14
  const iterContext = getContext('ListWrapperContext');
15
15
  const listInputs = getContext('ListInputs');
@@ -18,8 +18,29 @@ let outputs = initOutput($worldStore, id, {
18
18
  });
19
19
  let css = $state(initCss($app.css?.['userresourcecomponent'], customCss));
20
20
  let classInput = $derived(twMerge('windmillapp w-full px-2', css?.input?.class ?? '', 'wm-input', 'wm-user-resource-select'));
21
- let value = $state(outputs.result.peak()?.replace('$res:', ''));
22
- value && assignValue(outputs.result.peak());
21
+ function getDefaultValue() {
22
+ if (resolvedConfig.defaultValue && typeof resolvedConfig.defaultValue === 'string') {
23
+ const nval = resolvedConfig.defaultValue;
24
+ return nval.replace('$res:', '');
25
+ }
26
+ return undefined;
27
+ }
28
+ let value = $state(outputs.result.peak()?.replace('$res:', '') ?? getDefaultValue());
29
+ $effect(() => {
30
+ value;
31
+ untrack(() => assignValue(value));
32
+ });
33
+ let lastDefaultValue = $state(getDefaultValue());
34
+ $effect(() => {
35
+ // when in dnd mode, we react to the default value being changed for better UX
36
+ if (isEditor && $mode === 'dnd') {
37
+ const currentDefaultValue = getDefaultValue(); // reactive
38
+ if (lastDefaultValue !== currentDefaultValue) {
39
+ value = currentDefaultValue;
40
+ lastDefaultValue = currentDefaultValue;
41
+ }
42
+ }
43
+ });
23
44
  onDestroy(() => {
24
45
  listInputs?.remove(id);
25
46
  });
@@ -76,10 +97,7 @@ let resourcePicker = $state(undefined);
76
97
  <LightweightResourcePicker
77
98
  expressOAuthSetup={resolvedConfig.expressOauthSetup}
78
99
  bind:this={resourcePicker}
79
- {value}
80
- on:change={(e) => {
81
- assignValue(e.detail)
82
- }}
100
+ bind:value
83
101
  disabled={resolvedConfig.disabled}
84
102
  resourceType={resolvedConfig.resourceType}
85
103
  />