windmill-components 1.542.4 → 1.550.0

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 (189) hide show
  1. package/package/common.d.ts +4 -1
  2. package/package/components/AIAgentLogViewer.svelte +1 -1
  3. package/package/components/ArgEnum.svelte +14 -5
  4. package/package/components/ArgInput.svelte +23 -15
  5. package/package/components/ArgInput.svelte.d.ts +1 -1
  6. package/package/components/ChannelSelector.svelte +92 -18
  7. package/package/components/ChannelSelector.svelte.d.ts +2 -0
  8. package/package/components/ConnectionSection.svelte +12 -1
  9. package/package/components/Dev.svelte +18 -5
  10. package/package/components/Dev.svelte.d.ts +23 -1
  11. package/package/components/DisplayResult.svelte +36 -23
  12. package/package/components/DropdownV2.svelte +8 -2
  13. package/package/components/DropdownV2.svelte.d.ts +1 -0
  14. package/package/components/DynamicInput.svelte +10 -10
  15. package/package/components/EditableSchemaForm.svelte +21 -7
  16. package/package/components/EditorSettings.svelte +11 -9
  17. package/package/components/ErrorOrRecoveryHandler.svelte +14 -20
  18. package/package/components/FlowHistoryJobPicker.svelte +3 -0
  19. package/package/components/FlowHistoryJobPicker.svelte.d.ts +1 -0
  20. package/package/components/FlowJobResult.svelte +5 -5
  21. package/package/components/FlowLogRow.svelte +2 -2
  22. package/package/components/FlowLogViewer.svelte +228 -57
  23. package/package/components/FlowLogViewer.svelte.d.ts +16 -5
  24. package/package/components/FlowLogViewerWrapper.svelte +56 -3
  25. package/package/components/FlowLogViewerWrapper.svelte.d.ts +4 -3
  26. package/package/components/FlowLoopIterationPreview.svelte +4 -4
  27. package/package/components/FlowMetadata.svelte +3 -4
  28. package/package/components/FlowMetadata.svelte.d.ts +4 -18
  29. package/package/components/FlowPreviewContent.svelte +9 -3
  30. package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
  31. package/package/components/FlowStatusViewer.svelte +62 -59
  32. package/package/components/FlowStatusViewer.svelte.d.ts +2 -2
  33. package/package/components/FlowStatusViewerInner.svelte +186 -94
  34. package/package/components/FlowStatusViewerInner.svelte.d.ts +10 -3
  35. package/package/components/FlowTimeline.svelte +110 -131
  36. package/package/components/FlowTimeline.svelte.d.ts +13 -4
  37. package/package/components/FlowTimelineBar.svelte +227 -0
  38. package/package/components/FlowTimelineBar.svelte.d.ts +24 -0
  39. package/package/components/InputTransformForm.svelte +119 -3
  40. package/package/components/InputTransformForm.svelte.d.ts +3 -0
  41. package/package/components/InputTransformSchemaForm.svelte +5 -1
  42. package/package/components/InputTransformSchemaForm.svelte.d.ts +2 -0
  43. package/package/components/InstanceSetting.svelte +17 -42
  44. package/package/components/InstanceSettings.svelte +12 -21
  45. package/package/components/JobArgs.svelte +15 -16
  46. package/package/components/JobArgs.svelte.d.ts +4 -18
  47. package/package/components/JobLoader.svelte +23 -42
  48. package/package/components/JobLoader.svelte.d.ts +2 -0
  49. package/package/components/JobStatus.svelte +1 -1
  50. package/package/components/JobStatus.svelte.d.ts +4 -18
  51. package/package/components/ModulePreviewResultViewer.svelte +1 -7
  52. package/package/components/NextcloudSetting.svelte +6 -1
  53. package/package/components/Password.svelte +7 -11
  54. package/package/components/Password.svelte.d.ts +5 -20
  55. package/package/components/PasswordArgInput.svelte +35 -15
  56. package/package/components/PasswordArgInput.svelte.d.ts +4 -18
  57. package/package/components/QueuePosition.svelte +6 -2
  58. package/package/components/RunForm.svelte +5 -14
  59. package/package/components/S3ArrayHelperButton.svelte +12 -0
  60. package/package/components/S3ArrayHelperButton.svelte.d.ts +8 -0
  61. package/package/components/ScriptEditor.svelte +5 -6
  62. package/package/components/StringTypeNarrowing.svelte +39 -24
  63. package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
  64. package/package/components/TeamSelector.svelte +83 -37
  65. package/package/components/TeamSelector.svelte.d.ts +0 -1
  66. package/package/components/apps/components/buttons/AppButton.svelte +11 -1
  67. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +13 -4
  68. package/package/components/apps/components/display/table/SyncColumnDefs.svelte +2 -2
  69. package/package/components/apps/components/display/table/utils.js +1 -1
  70. package/package/components/apps/components/helpers/RefreshButton.svelte +5 -1
  71. package/package/components/apps/components/helpers/RunnableComponent.svelte +0 -2
  72. package/package/components/apps/components/helpers/RunnableWrapper.svelte.d.ts +1 -0
  73. package/package/components/apps/components/layout/AppTabs.svelte +116 -71
  74. package/package/components/apps/components/layout/AppTabs.svelte.d.ts +1 -0
  75. package/package/components/apps/editor/component/ComponentInner.svelte +1 -0
  76. package/package/components/apps/editor/component/components.d.ts +16 -1
  77. package/package/components/apps/editor/component/components.js +22 -2
  78. package/package/components/apps/editor/settingsPanel/ComponentPanel.svelte +2 -0
  79. package/package/components/apps/editor/settingsPanel/GridTab.svelte +19 -1
  80. package/package/components/apps/editor/settingsPanel/GridTab.svelte.d.ts +3 -1
  81. package/package/components/apps/editor/settingsPanel/GridTabHidden.svelte +52 -0
  82. package/package/components/apps/editor/settingsPanel/GridTabHidden.svelte.d.ts +9 -0
  83. package/package/components/auditLogs/AuditLogsFilters.svelte +6 -0
  84. package/package/components/auditLogs/AuditLogsTable.svelte +17 -7
  85. package/package/components/auditLogs/AuditLogsTable.svelte.d.ts +1 -0
  86. package/package/components/common/CloseButton.svelte +2 -2
  87. package/package/components/common/CloseButton.svelte.d.ts +1 -0
  88. package/package/components/common/layout/List.svelte +3 -7
  89. package/package/components/common/layout/List.svelte.d.ts +7 -29
  90. package/package/components/common/popup/PopupV2.svelte +8 -25
  91. package/package/components/common/popup/PopupV2.svelte.d.ts +4 -2
  92. package/package/components/common/table/ScriptRow.svelte +22 -2
  93. package/package/components/copilot/FlowCopilotInputsModal.svelte +26 -23
  94. package/package/components/copilot/chat/AIChatManager.svelte.js +3 -2
  95. package/package/components/copilot/chat/ProviderModelSelector.svelte +1 -1
  96. package/package/components/copilot/chat/flow/FlowAIChat.svelte +4 -2
  97. package/package/components/copilot/chat/script/core.d.ts +4 -4
  98. package/package/components/copilot/chat/script/core.js +93 -34
  99. package/package/components/copilot/lib.d.ts +1 -0
  100. package/package/components/copilot/lib.js +6 -3
  101. package/package/components/custom_ui.d.ts +2 -0
  102. package/package/components/flows/FlowProgressBar.svelte +16 -16
  103. package/package/components/flows/FlowProgressBar.svelte.d.ts +7 -22
  104. package/package/components/flows/content/FlowInputsQuick.svelte +3 -2
  105. package/package/components/flows/content/FlowInputsQuick.svelte.d.ts +1 -0
  106. package/package/components/flows/content/FlowModuleComponent.svelte +24 -1
  107. package/package/components/flows/flowInfers.js +34 -8
  108. package/package/components/flows/flowStore.d.ts +4 -1
  109. package/package/components/flows/map/FlowJobsMenu.svelte +3 -3
  110. package/package/components/flows/map/FlowJobsMenu.svelte.d.ts +1 -1
  111. package/package/components/flows/map/InsertModuleButton.svelte +4 -14
  112. package/package/components/flows/map/InsertModuleButton.svelte.d.ts +0 -1
  113. package/package/components/flows/map/InsertModuleInner.svelte +17 -20
  114. package/package/components/flows/map/MapItem.svelte +1 -1
  115. package/package/components/flows/pickers/PickHubScriptQuick.svelte +38 -52
  116. package/package/components/flows/pickers/PickHubScriptQuick.svelte.d.ts +1 -0
  117. package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte +27 -15
  118. package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte.d.ts +1 -0
  119. package/package/components/flows/propPicker/OutputPicker.svelte +2 -0
  120. package/package/components/git_sync/DetectionFlow.svelte +33 -44
  121. package/package/components/git_sync/DetectionFlow.svelte.d.ts +1 -0
  122. package/package/components/git_sync/GitSyncContext.svelte.d.ts +22 -0
  123. package/package/components/git_sync/GitSyncContext.svelte.js +145 -5
  124. package/package/components/git_sync/GitSyncModeDisplay.svelte +14 -0
  125. package/package/components/git_sync/GitSyncModeDisplay.svelte.d.ts +9 -0
  126. package/package/components/git_sync/GitSyncRepositoryCard.svelte +365 -253
  127. package/package/components/git_sync/GitSyncRepositoryCard.svelte.d.ts +10 -1
  128. package/package/components/git_sync/GitSyncSection.svelte +134 -14
  129. package/package/components/git_sync/PullWorkspaceModal.svelte +24 -32
  130. package/package/components/git_sync/PushWorkspaceModal.svelte +24 -32
  131. package/package/components/graph/model.d.ts +5 -5
  132. package/package/components/graph/renderers/edges/EmptyEdge.svelte +3 -10
  133. package/package/components/graph/renderers/edges/EmptyEdge.svelte.d.ts +4 -18
  134. package/package/components/graph/renderers/nodes/AIToolNode.svelte +2 -2
  135. package/package/components/graph/renderers/nodes/NewAIToolNode.svelte +5 -10
  136. package/package/components/home/ItemsList.svelte +1 -1
  137. package/package/components/jobs/JobProgressBar.svelte +27 -21
  138. package/package/components/jobs/JobProgressBar.svelte.d.ts +9 -24
  139. package/package/components/meltComponents/MenuSingleItem.svelte +3 -8
  140. package/package/components/meltComponents/MenuSingleItem.svelte.d.ts +0 -3
  141. package/package/components/meltComponents/Popover.svelte +3 -2
  142. package/package/components/meltComponents/Popover.svelte.d.ts +1 -0
  143. package/package/components/meltComponents/Tooltip.svelte +1 -1
  144. package/package/components/progressBar/ProgressBar.svelte +39 -53
  145. package/package/components/progressBar/ProgressBar.svelte.d.ts +11 -26
  146. package/package/components/runs/JobsLoader.svelte +1 -1
  147. package/package/components/runs/NoWorkerWithTagWarning.svelte +3 -3
  148. package/package/components/runs/NoWorkerWithTagWarning.svelte.d.ts +1 -1
  149. package/package/components/schema/AddPropertyV2.svelte +7 -4
  150. package/package/components/schema/PropertyEditor.svelte.d.ts +1 -1
  151. package/package/components/select/MultiSelect.svelte +2 -2
  152. package/package/components/select/MultiSelect.svelte.d.ts +1 -0
  153. package/package/components/settings/WorkspaceUserSettings.svelte +92 -1
  154. package/package/components/sidebar/MenuLink.svelte +2 -1
  155. package/package/components/sidebar/MenuLink.svelte.d.ts +1 -0
  156. package/package/components/sidebar/SidebarContent.svelte +27 -27
  157. package/package/components/table/Cell.svelte +7 -14
  158. package/package/components/table/Cell.svelte.d.ts +13 -35
  159. package/package/components/triggers/AddTriggersButton.svelte +1 -0
  160. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte +1 -1
  161. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte.d.ts +2 -1
  162. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +28 -5
  163. package/package/components/triggers/gcp/utils.js +1 -0
  164. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +1 -0
  165. package/package/components/triggers/webhook/WebhooksConfigSection.svelte +143 -63
  166. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +22 -0
  167. package/package/components/triggers/websocket/utils.js +1 -0
  168. package/package/components/workspaceSettings/AISettings.svelte +8 -2
  169. package/package/components/workspaceSettings/AISettings.svelte.d.ts +2 -1
  170. package/package/components/workspaceSettings/ModelTokenLimits.svelte +165 -0
  171. package/package/components/workspaceSettings/ModelTokenLimits.svelte.d.ts +8 -0
  172. package/package/components/workspaceSettings/StorageSettings.svelte +123 -51
  173. package/package/gen/core/OpenAPI.js +1 -1
  174. package/package/gen/schemas.gen.d.ts +141 -16
  175. package/package/gen/schemas.gen.js +144 -16
  176. package/package/gen/services.gen.d.ts +62 -42
  177. package/package/gen/services.gen.js +131 -82
  178. package/package/gen/types.gen.d.ts +218 -144
  179. package/package/hubPaths.json +2 -1
  180. package/package/services/JobManager.js +10 -7
  181. package/package/stores.d.ts +1 -0
  182. package/package/stores.js +6 -3
  183. package/package/timelineCompute.svelte.d.ts +21 -0
  184. package/package/timelineCompute.svelte.js +113 -0
  185. package/package/utils.d.ts +15 -8
  186. package/package/utils.js +62 -12
  187. package/package/workspace_settings.d.ts +13 -8
  188. package/package/workspace_settings.js +46 -11
  189. package/package.json +2 -2
@@ -8,6 +8,7 @@
8
8
  </script>
9
9
 
10
10
  <script lang="ts">import { createEventDispatcher, getContext, untrack } from 'svelte';
11
+ import { computeShow } from '../utils';
11
12
  import ArgInput from './ArgInput.svelte';
12
13
  import FieldHeader from './FieldHeader.svelte';
13
14
  import DynamicInputHelpBox from './flows/content/DynamicInputHelpBox.svelte';
@@ -27,11 +28,13 @@ import StepInputGen from './copilot/StepInputGen.svelte';
27
28
  import { twMerge } from 'tailwind-merge';
28
29
  import FlowPlugConnect from './FlowPlugConnect.svelte';
29
30
  import { deepEqual } from 'fast-equals';
30
- let { schema = $bindable(), arg = $bindable(), argName = $bindable(), headerTooltip = undefined, headerTooltipIconClass = '', HeaderTooltipIcon = InfoIcon, extraLib = $bindable('missing extraLib'), inputCheck = $bindable(true), previousModuleId, pickForField = $bindable(undefined), variableEditor = undefined, itemPicker = undefined, noDynamicToggle = false, argExtra = {}, pickableProperties = undefined, enableAi = false, hideHelpButton = false, class: className = '', editor = $bindable(undefined) } = $props();
31
+ import S3ArrayHelperButton from './S3ArrayHelperButton.svelte';
32
+ let { schema = $bindable(), arg = $bindable(), argName = $bindable(), headerTooltip = undefined, headerTooltipIconClass = '', HeaderTooltipIcon = InfoIcon, extraLib = $bindable('missing extraLib'), inputCheck = $bindable(true), previousModuleId, pickForField = $bindable(undefined), variableEditor = undefined, itemPicker = undefined, noDynamicToggle = false, argExtra = {}, pickableProperties = undefined, enableAi = false, hideHelpButton = false, class: className = '', editor = $bindable(undefined), otherArgs = {}, helperScript = undefined } = $props();
31
33
  let monaco = $state(undefined);
32
34
  let monacoTemplate = $state(undefined);
33
35
  let argInput = $state(undefined);
34
36
  let focusedPrev = false;
37
+ let hidden = $state(false);
35
38
  const variableMatch = (value) => value.match(/^variable\('([^']+)'\)$/);
36
39
  const resourceMatch = (value) => value.match(/^resource\('([^']+)'\)$/);
37
40
  const dispatch = createEventDispatcher();
@@ -144,6 +147,46 @@ function handleKeyUp(e) {
144
147
  function isStaticTemplate(inputCat) {
145
148
  return inputCat === 'string' || inputCat === 'sql' || inputCat == 'yaml';
146
149
  }
150
+ function appendPathToArrayExpr(currentExpr, path) {
151
+ const trimmedExpr = currentExpr?.trim() || '';
152
+ let newExpr = trimmedExpr;
153
+ if (trimmedExpr.startsWith('[') && trimmedExpr.endsWith(']')) {
154
+ // Parse existing array and append new item
155
+ const innerContent = trimmedExpr.slice(1, -1).trim();
156
+ if (innerContent) {
157
+ newExpr = `[${innerContent}, ${path}]`;
158
+ }
159
+ else {
160
+ newExpr = `[${path}]`;
161
+ }
162
+ }
163
+ else {
164
+ // Create new array with single item
165
+ newExpr = `[${path}]`;
166
+ }
167
+ arg.expr = newExpr;
168
+ arg.type = 'javascript';
169
+ // Update Monaco editor after setting the expression
170
+ tick().then(() => {
171
+ monaco?.setCode(newExpr);
172
+ });
173
+ // Dispatch change
174
+ dispatch('change', { argName, arg });
175
+ }
176
+ async function switchToJsAndConnect(onPath) {
177
+ // Switch to JavaScript mode
178
+ propertyType = 'javascript';
179
+ arg.type = 'javascript';
180
+ arg.expr = arg.expr || '[]';
181
+ arg.value = undefined;
182
+ // Wait for the component to re-render and Monaco to be available
183
+ await tick();
184
+ // Activate connect mode
185
+ focusProp?.(argName, 'connect', (path) => {
186
+ onPath(path);
187
+ return true;
188
+ });
189
+ }
147
190
  function connectProperty(rawValue) {
148
191
  // Extract path from variable('x') or resource('x') format
149
192
  const varMatch = variableMatch(rawValue);
@@ -167,6 +210,41 @@ function connectProperty(rawValue) {
167
210
  monaco?.setCode(arg.expr);
168
211
  }
169
212
  }
213
+ function handleFieldVisibility(schema, arg, otherArgs) {
214
+ const schemaProperty = schema?.properties?.[argName];
215
+ if (schemaProperty?.showExpr) {
216
+ // Build args object with current field value and other context
217
+ const currentValue = propertyType === 'static' ? arg?.value : arg?.expr;
218
+ // Convert otherArgs from InputTransform objects to their actual values
219
+ const contextArgs = {
220
+ [argName]: currentValue
221
+ };
222
+ // Extract values from InputTransform objects in otherArgs
223
+ Object.keys(otherArgs ?? {}).forEach((key) => {
224
+ const otherArg = otherArgs[key];
225
+ const otherArgValue = otherArg.type === 'static' ? otherArg.value : otherArg.expr;
226
+ contextArgs[key] = otherArgValue;
227
+ });
228
+ const shouldShow = computeShow(argName, schemaProperty.showExpr, contextArgs);
229
+ if (shouldShow) {
230
+ hidden = false;
231
+ }
232
+ else if (!hidden) {
233
+ hidden = true;
234
+ // Clear the arg value when hidden (following SchemaForm pattern)
235
+ if (arg) {
236
+ arg.value = undefined;
237
+ arg.expr = undefined;
238
+ }
239
+ // Make sure validation passes when hidden
240
+ inputCheck = true;
241
+ }
242
+ }
243
+ else {
244
+ // No showExpr, always show
245
+ hidden = false;
246
+ }
247
+ }
170
248
  function onFocus() {
171
249
  focused = true;
172
250
  if (isStaticTemplate(inputCat)) {
@@ -257,10 +335,19 @@ $effect(() => {
257
335
  $effect(() => {
258
336
  schema?.properties?.[argName]?.default && untrack(() => setDefaultCode());
259
337
  });
338
+ $effect.pre(() => {
339
+ // Monitor changes that affect field visibility
340
+ JSON.stringify(schema);
341
+ JSON.stringify(arg);
342
+ JSON.stringify(otherArgs);
343
+ untrack(() => handleFieldVisibility(schema, arg, otherArgs));
344
+ });
260
345
  let connecting = $derived($propPickerConfig?.propName == argName && $propPickerConfig?.insertionMode == 'connect');
346
+ let shouldShowS3ArrayHelper = $derived(inputCat === 'list' &&
347
+ ['s3object', 's3_object'].includes(schema?.properties?.[argName]?.items?.resourceType));
261
348
  </script>
262
349
 
263
- {#if arg != undefined}
350
+ {#if arg != undefined && !hidden}
264
351
  <div
265
352
  class={twMerge(
266
353
  'pl-2 pt-2 pb-2 ml-2 relative hover:bg-surface hover:shadow-md transition-all duration-200',
@@ -334,6 +421,7 @@ let connecting = $derived($propPickerConfig?.propName == argName && $propPickerC
334
421
  on:selected={(e) => {
335
422
  if (e.detail == propertyType) return
336
423
  const staticTemplate = isStaticTemplate(inputCat)
424
+
337
425
  if (e.detail === 'javascript') {
338
426
  if (arg.expr == undefined) {
339
427
  arg.expr = getDefaultExpr(
@@ -411,6 +499,7 @@ let connecting = $derived($propPickerConfig?.propName == argName && $propPickerC
411
499
  </Button>
412
500
  {:else}
413
501
  <ToggleButton
502
+ disabled={inputCat === 'dynamic'}
414
503
  small
415
504
  light
416
505
  tooltip="JavaScript expression ('flow_input' or 'results')."
@@ -423,7 +512,7 @@ let connecting = $derived($propPickerConfig?.propName == argName && $propPickerC
423
512
  </ToggleButtonGroup>
424
513
  </div>
425
514
 
426
- {#if propPickerWrapperContext}
515
+ {#if propPickerWrapperContext && inputCat !== 'dynamic'}
427
516
  <FlowPlugConnect
428
517
  id="flow-editor-plug"
429
518
  {connecting}
@@ -524,7 +613,22 @@ let connecting = $derived($propPickerConfig?.propName == argName && $propPickerC
524
613
  nullable={schema.properties[argName].nullable}
525
614
  bind:title={schema.properties[argName].title}
526
615
  bind:placeholder={schema.properties[argName].placeholder}
616
+ {helperScript}
617
+ otherArgs={Object.fromEntries(
618
+ Object.entries(otherArgs).map(([key, transform]) => [
619
+ key,
620
+ transform?.type === 'static' ? transform.value : transform?.expr
621
+ ])
622
+ )}
527
623
  />
624
+
625
+ {#if shouldShowS3ArrayHelper}
626
+ <S3ArrayHelperButton
627
+ {connecting}
628
+ onClick={() =>
629
+ switchToJsAndConnect((path) => appendPathToArrayExpr(arg.expr, path))}
630
+ />
631
+ {/if}
528
632
  {:else if arg.expr != undefined}
529
633
  <div class="border mt-2">
530
634
  <SimpleEditor
@@ -554,6 +658,18 @@ let connecting = $derived($propPickerConfig?.propName == argName && $propPickerC
554
658
  {#if !hideHelpButton}
555
659
  <DynamicInputHelpBox />
556
660
  {/if}
661
+
662
+ {#if shouldShowS3ArrayHelper}
663
+ <S3ArrayHelperButton
664
+ {connecting}
665
+ onClick={() =>
666
+ focusProp?.(argName, 'connect', (path) => {
667
+ appendPathToArrayExpr(arg.expr, path)
668
+ return true
669
+ })}
670
+ />
671
+ {/if}
672
+
557
673
  <div class="mb-2"></div>
558
674
  {:else}
559
675
  Not recognized input type {argName} ({arg.expr}, {propertyType})
@@ -1,4 +1,5 @@
1
1
  import type { Schema } from '../common';
2
+ import type { DynamicInput as DynamicInputTypes } from '../utils';
2
3
  import SimpleEditor from './SimpleEditor.svelte';
3
4
  import type VariableEditor from './VariableEditor.svelte';
4
5
  import type ItemPicker from './ItemPicker.svelte';
@@ -27,6 +28,8 @@ interface Props {
27
28
  hideHelpButton?: boolean;
28
29
  class?: string;
29
30
  editor?: SimpleEditor | undefined;
31
+ otherArgs?: Record<string, InputTransform>;
32
+ helperScript?: DynamicInputTypes.HelperScript | undefined;
30
33
  }
31
34
  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> {
32
35
  new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
@@ -8,7 +8,7 @@ import InputTransformForm from './InputTransformForm.svelte';
8
8
  import ItemPicker from './ItemPicker.svelte';
9
9
  import VariableEditor from './VariableEditor.svelte';
10
10
  import { Plus } from 'lucide-svelte';
11
- let { schema = $bindable(), args = $bindable({}), isValid = $bindable(true), extraLib = $bindable('missing extraLib'), previousModuleId = undefined, filter = undefined, noDynamicToggle = false, pickableProperties = undefined, enableAi = false, class: clazz = '' } = $props();
11
+ let { schema = $bindable(), args = $bindable({}), isValid = $bindable(true), extraLib = $bindable('missing extraLib'), previousModuleId = undefined, filter = undefined, noDynamicToggle = false, pickableProperties = undefined, enableAi = false, class: clazz = '', helperScript = undefined } = $props();
12
12
  let inputCheck = $state({});
13
13
  $effect(() => {
14
14
  isValid = allTrue(inputCheck) ?? false;
@@ -80,6 +80,10 @@ $effect(() => {
80
80
  {noDynamicToggle}
81
81
  {pickableProperties}
82
82
  {enableAi}
83
+ {helperScript}
84
+ otherArgs={Object.fromEntries(
85
+ Object.entries(args ?? {}).filter(([key]) => key !== argName)
86
+ )}
83
87
  />
84
88
  </div>
85
89
  {/if}
@@ -1,5 +1,6 @@
1
1
  import type { Schema } from '../common';
2
2
  import { type InputTransform } from '../gen';
3
+ import { type DynamicInput as DynamicInputTypes } from '../utils';
3
4
  import type { PickableProperties } from './flows/previousResults';
4
5
  interface Props {
5
6
  schema: Schema | {
@@ -14,6 +15,7 @@ interface Props {
14
15
  pickableProperties?: PickableProperties | undefined;
15
16
  enableAi?: boolean;
16
17
  class?: string;
18
+ helperScript?: DynamicInputTypes.HelperScript;
17
19
  }
18
20
  declare const InputTransformSchemaForm: import("svelte").Component<Props, {
19
21
  setArgs: (nargs: Record<string, InputTransform | any>) => void;
@@ -1,11 +1,11 @@
1
1
  <script lang="ts">import { isCloudHosted } from '../cloud';
2
2
  import { enterpriseLicense, isCriticalAlertsUIOpen } from '../stores';
3
- import { AlertCircle, AlertTriangle, BadgeCheck, BadgeX, Info, Plus, RefreshCcw, Slack, X } from 'lucide-svelte';
3
+ import { AlertCircle, AlertTriangle, BadgeCheck, BadgeX, Info, Plus, Slack, X } from 'lucide-svelte';
4
4
  import Tooltip from './Tooltip.svelte';
5
5
  import ObjectStoreConfigSettings from './ObjectStoreConfigSettings.svelte';
6
6
  import { sendUserToast } from '../toast';
7
7
  import ConfirmButton from './ConfirmButton.svelte';
8
- import { ConfigService, IndexSearchService, SettingService, TeamsService } from '../gen';
8
+ import { ConfigService, IndexSearchService, SettingService } from '../gen';
9
9
  import { Button, SecondsInput, Skeleton } from './common';
10
10
  import Password from './Password.svelte';
11
11
  import { classNames } from '../utils';
@@ -28,7 +28,6 @@ if ((setting.fieldType == 'select' || setting.fieldType == 'select_python') &&
28
28
  $values[setting.key] = 'default';
29
29
  }
30
30
  let latestKeyRenewalAttempt = $state(null);
31
- let isFetching = $state(false);
32
31
  function showSetting(setting, values) {
33
32
  if (setting == 'dev_instance') {
34
33
  if (values['license_key'] == undefined) {
@@ -120,29 +119,16 @@ async function fetch_available_python_versions() {
120
119
  if (setting.fieldType == 'select_python') {
121
120
  fetch_available_python_versions();
122
121
  }
123
- async function fetchTeams() {
124
- if (isFetching)
125
- return;
126
- isFetching = true;
127
- try {
128
- $values['teams'] = await TeamsService.syncTeams();
129
- }
130
- catch (error) {
131
- console.error('Error fetching teams:', error);
132
- }
133
- finally {
134
- isFetching = false;
135
- }
136
- }
137
122
  function handleTeamChange(teamItem, i) {
138
- const team = (teamItem && $values['teams'].find((team) => team.team_id === teamItem.team_id)) || null;
139
123
  $values['critical_error_channels'][i] = {
140
- teams_channel: {
141
- team_id: team?.team_id,
142
- team_name: team?.team_name,
143
- channel_id: team?.channels[0]?.channel_id,
144
- channel_name: team?.channels[0]?.channel_name
145
- }
124
+ teams_channel: teamItem
125
+ ? {
126
+ team_id: teamItem.team_id,
127
+ team_name: teamItem.team_name,
128
+ channel_id: undefined, // Will be set when channel is selected
129
+ channel_name: undefined
130
+ }
131
+ : undefined
146
132
  };
147
133
  }
148
134
  function handleChannelChange(channel, i) {
@@ -333,7 +319,7 @@ function handleChannelChange(channel, i) {
333
319
  <Password
334
320
  small
335
321
  placeholder={setting.placeholder}
336
- on:keydown={() => {
322
+ onKeyDown={() => {
337
323
  licenseKeyChanged = true
338
324
  }}
339
325
  bind:password={$values[setting.key]}
@@ -501,9 +487,6 @@ function handleChannelChange(channel, i) {
501
487
  [e.target['value']]: ''
502
488
  }
503
489
  }
504
- if (e.target?.['value'] === 'teams_channel') {
505
- fetchTeams()
506
- }
507
490
  }}
508
491
  value={(() => {
509
492
  if (!v) return 'email'
@@ -535,8 +518,6 @@ function handleChannelChange(channel, i) {
535
518
  containerClass="w-44"
536
519
  minWidth="140px"
537
520
  showRefreshButton={false}
538
- placeholder="Select team"
539
- teams={$values['teams']}
540
521
  bind:selectedTeam={
541
522
  () =>
542
523
  $values['critical_error_channels'][i]?.teams_channel
@@ -555,12 +536,8 @@ function handleChannelChange(channel, i) {
555
536
  {#if $values['critical_error_channels'][i]?.teams_channel?.team_id}
556
537
  <ChannelSelector
557
538
  containerClass=""
558
- placeholder="Select channel"
559
- channels={$values['teams'].find(
560
- (team) =>
561
- team.team_id ===
562
- $values['critical_error_channels'][i]?.teams_channel?.team_id
563
- )?.channels ?? []}
539
+ placeholder="Search channels"
540
+ teamId={$values['critical_error_channels'][i]?.teams_channel?.team_id}
564
541
  bind:selectedChannel={
565
542
  () =>
566
543
  $values['critical_error_channels'][i]?.teams_channel?.channel_id
@@ -575,13 +552,10 @@ function handleChannelChange(channel, i) {
575
552
  : undefined,
576
553
  (channel) => handleChannelChange(channel, i)
577
554
  }
555
+ onError={(e) =>
556
+ sendUserToast('Failed to load channels: ' + e.message, true)}
578
557
  />
579
558
  {/if}
580
- <div>
581
- <button onclick={fetchTeams} class="flex items-center gap-1 mt-2">
582
- <RefreshCcw size={16} class={isFetching ? 'animate-spin' : ''} />
583
- </button>
584
- </div>
585
559
  </div>
586
560
  {:else}
587
561
  <input
@@ -624,7 +598,8 @@ function handleChannelChange(channel, i) {
624
598
  if ($values[setting.key] == undefined || !Array.isArray($values[setting.key])) {
625
599
  $values[setting.key] = []
626
600
  }
627
- $values[setting.key] = $values[setting.key].concat('')
601
+ // Start with a typed default to avoid invalid primitives in the array
602
+ $values[setting.key] = $values[setting.key].concat({ email: '' })
628
603
  }}
629
604
  id="arg-input-add-item"
630
605
  startIcon={{ icon: Plus }}
@@ -62,24 +62,6 @@ async function loadSettings() {
62
62
  if (nvalues['critical_error_channels'] == undefined) {
63
63
  nvalues['critical_error_channels'] = [];
64
64
  }
65
- else {
66
- let teams = (await SettingService.getGlobal({ key: 'teams' })) ?? [];
67
- nvalues['teams'] = teams;
68
- nvalues['critical_error_channels'] = nvalues['critical_error_channels'].map((el) => {
69
- if (el.teams_channel) {
70
- const team = teams.find((team) => team.team_name === el.teams_channel.team_name) || null;
71
- return {
72
- teams_channel: {
73
- team_id: team?.team_id,
74
- team_name: team?.team_name,
75
- channel_id: team?.channels.find((channel) => channel.channel_id === el.teams_channel.channel_id)?.channel_id,
76
- channel_name: team?.channels.find((channel) => channel.channel_id === el.teams_channel.channel_id)?.channel_name
77
- }
78
- };
79
- }
80
- return el;
81
- });
82
- }
83
65
  $values = nvalues;
84
66
  loading = false;
85
67
  // populate snowflake account identifier from db
@@ -94,12 +76,21 @@ export async function saveSettings() {
94
76
  snowflakeAccountIdentifier) {
95
77
  setupSnowflakeUrls();
96
78
  }
97
- // Remove empty or invalid teams_channel entries
79
+ // Remove empty or invalid entries for critical error channels
98
80
  $values.critical_error_channels = $values.critical_error_channels.filter((entry) => {
99
- if (entry && typeof entry == 'object' && 'teams_channel' in entry) {
81
+ if (!entry || typeof entry !== 'object')
82
+ return false;
83
+ if ('teams_channel' in entry) {
100
84
  return isValidTeamsChannel(entry.teams_channel);
101
85
  }
102
- return true;
86
+ if ('slack_channel' in entry) {
87
+ return (typeof entry.slack_channel === 'string' && entry.slack_channel.trim() !== '');
88
+ }
89
+ if ('email' in entry) {
90
+ return typeof entry.email === 'string' && entry.email.trim() !== '';
91
+ }
92
+ // Unknown shape
93
+ return false;
103
94
  });
104
95
  let shouldReloadPage = false;
105
96
  if ($values) {
@@ -11,13 +11,10 @@ import Row from './table/Row.svelte';
11
11
  import HighlightTheme from './HighlightTheme.svelte';
12
12
  import { deepEqual } from 'fast-equals';
13
13
  import { isWindmillTooBigObject } from './job_args';
14
- export let id = undefined;
15
- export let args;
16
- export let argLabel = undefined;
17
- export let workspace = undefined;
18
- let jsonViewer;
19
- let runLocally;
20
- let jsonStr = '';
14
+ let { id = undefined, args, argLabel = undefined, workspace = undefined } = $props();
15
+ let jsonViewer = $state();
16
+ let runLocally = $state();
17
+ let jsonStr = $state('');
21
18
  function pythonCode() {
22
19
  return `
23
20
  if __name__ == "__main__":
@@ -47,9 +44,9 @@ ${Object.entries(args)
47
44
  }
48
45
  </script>
49
46
 
50
- {#if args && typeof args === 'object' && deepEqual( Object.keys(args), ['reason'] ) && args['reason'] == 'PREPROCESSOR_ARGS_ARE_DISCARDED'}
47
+ {#if args && typeof args === 'object' && deepEqual( Object.keys(args ?? {}), ['reason'] ) && args['reason'] == 'PREPROCESSOR_ARGS_ARE_DISCARDED'}
51
48
  Preprocessor args are discarded
52
- {:else if id && workspace && args && typeof args === 'object' && deepEqual( Object.keys(args), ['reason'] ) && args['reason'] == 'WINDMILL_TOO_BIG'}
49
+ {:else if id && workspace && args && typeof args === 'object' && deepEqual( Object.keys(args ?? {}), ['reason'] ) && args['reason'] == 'WINDMILL_TOO_BIG'}
53
50
  The args are too big in size to be able to fetch alongside job. Please <a
54
51
  href="/api/w/{workspace}/jobs_u/get_args/{id}"
55
52
  target="_blank">download the JSON file to view them</a
@@ -62,26 +59,28 @@ ${Object.entries(args)
62
59
  <Cell head first>{argLabel ?? 'Arg'}</Cell>
63
60
  <Cell head last>Value</Cell>
64
61
  </tr>
65
- <svelte:fragment slot="headerAction">
62
+ {#snippet headerAction()}
66
63
  <button
67
- on:click={() => {
64
+ onclick={() => {
68
65
  jsonStr = JSON.stringify(args, null, 4)
69
- jsonViewer.openDrawer()
66
+ jsonViewer?.openDrawer()
70
67
  }}
71
68
  >
72
69
  <Expand size={18} />
73
70
  </button>
74
- </svelte:fragment>
71
+ {/snippet}
75
72
  </Head>
76
73
 
77
74
  <tbody class="divide-y w-full">
78
- {#if args && Object.keys(args).length > 0}
79
- {#each Object.entries(args).sort((a, b) => a[0].localeCompare(b[0])) as [arg, value]}
75
+ {#if args && typeof args === 'object' && Object.keys(args ?? {}).length > 0}
76
+ {#each Object.entries(args ?? {}).sort( (a, b) => a?.[0]?.localeCompare(b?.[0]) ) as [arg, value]}
80
77
  <Row>
81
78
  <Cell first>{arg}</Cell>
82
79
  <Cell><ArgInfo {value} /></Cell>
83
80
  </Row>
84
81
  {/each}
82
+ {:else if args && typeof args !== 'object'}
83
+ <Row><Cell>Argument is not an object (type: {typeof args})</Cell></Row>
85
84
  {:else if args}
86
85
  <Row><Cell>No arguments</Cell></Row>
87
86
  {:else}
@@ -116,7 +115,7 @@ ${Object.entries(args)
116
115
  Download
117
116
  </Button>
118
117
  <Button
119
- on:click={runLocally.openDrawer}
118
+ on:click={() => runLocally?.openDrawer()}
120
119
  color="light"
121
120
  size="xs"
122
121
  startIcon={{ icon: ChevronRightSquare }}
@@ -1,23 +1,9 @@
1
- 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
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
- $$bindings?: Bindings;
4
- } & Exports;
5
- (internal: unknown, props: Props & {
6
- $$events?: Events;
7
- $$slots?: Slots;
8
- }): Exports & {
9
- $set?: any;
10
- $on?: any;
11
- };
12
- z_$$bindings?: Bindings;
13
- }
14
- declare const JobArgs: $$__sveltets_2_IsomorphicComponent<{
1
+ interface Props {
15
2
  id?: string | undefined;
16
3
  args: any;
17
4
  argLabel?: string | undefined;
18
5
  workspace?: string | undefined;
19
- }, {
20
- [evt: string]: CustomEvent<any>;
21
- }, {}, {}, string>;
22
- type JobArgs = InstanceType<typeof JobArgs>;
6
+ }
7
+ declare const JobArgs: import("svelte").Component<Props, {}, "">;
8
+ type JobArgs = ReturnType<typeof JobArgs>;
23
9
  export default JobArgs;