windmill-components 1.389.2 → 1.394.3

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 (158) hide show
  1. package/package/assets/app.css +4 -3
  2. package/package/components/AppConnectInner.svelte +18 -10
  3. package/package/components/ArgInfo.svelte +1 -1
  4. package/package/components/ArgInput.svelte +22 -2
  5. package/package/components/AutheliaSetting.svelte +1 -0
  6. package/package/components/AuthentikSetting.svelte +1 -0
  7. package/package/components/BoundedInputNumber +0 -0
  8. package/package/components/CliHelpBox.svelte +2 -2
  9. package/package/components/DateInput.svelte +1 -0
  10. package/package/components/DisplayResult.svelte +39 -31
  11. package/package/components/Editor.svelte +0 -21
  12. package/package/components/ErrorOrRecoveryHandler.svelte +7 -1
  13. package/package/components/ErrorOrRecoveryHandler.svelte.d.ts +1 -1
  14. package/package/components/FlowBuilder.svelte +2 -2
  15. package/package/components/FlowGraphViewerStep.svelte +22 -0
  16. package/package/components/FlowJobResult.svelte +1 -0
  17. package/package/components/FlowMetadata.svelte +3 -2
  18. package/package/components/FlowStatusViewer.svelte +2 -0
  19. package/package/components/FlowStatusViewer.svelte.d.ts +2 -0
  20. package/package/components/FlowStatusViewerInner.svelte +10 -5
  21. package/package/components/FlowStatusViewerInner.svelte.d.ts +1 -0
  22. package/package/components/FolderEditor.svelte +1 -1
  23. package/package/components/IdEditorInput.svelte +82 -0
  24. package/package/components/IdEditorInput.svelte.d.ts +26 -0
  25. package/package/components/InputTransformForm.svelte +10 -10
  26. package/package/components/InputTransformForm.svelte.d.ts +4 -1
  27. package/package/components/InputTransformSchemaForm.svelte.d.ts +3 -1
  28. package/package/components/InstanceSettings.svelte +73 -12
  29. package/package/components/ItemPicker.svelte +1 -0
  30. package/package/components/KanidmSetting.svelte +1 -0
  31. package/package/components/KeycloakSetting.svelte +1 -0
  32. package/package/components/LightweightArgInput.svelte +2 -0
  33. package/package/components/LogViewer.svelte +206 -0
  34. package/package/components/ModulePreview.svelte.d.ts +3 -1
  35. package/package/components/ModulePreviewForm.svelte +2 -2
  36. package/package/components/ModulePreviewForm.svelte.d.ts +4 -1
  37. package/package/components/OAuthSetting.svelte +11 -10
  38. package/package/components/ObjectStoreConfigSettings.svelte +6 -6
  39. package/package/components/OktaSetting.svelte +1 -0
  40. package/package/components/Password.svelte +30 -35
  41. package/package/components/RunChart.svelte +16 -0
  42. package/package/components/RunChart.svelte.d.ts +2 -0
  43. package/package/components/SavedInputs.svelte +4 -4
  44. package/package/components/ScheduleEditorInner.svelte +145 -2
  45. package/package/components/SchemaForm.svelte +1 -2
  46. package/package/components/ScriptBuilder.svelte +1 -0
  47. package/package/components/TestConnection.svelte +24 -6
  48. package/package/components/TestJobLoader.svelte +2 -0
  49. package/package/components/ZitadelSetting.svelte +1 -0
  50. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +0 -1
  51. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte.d.ts +1 -2
  52. package/package/components/apps/components/display/table/AppAggridInfiniteTableEe.svelte +0 -2
  53. package/package/components/apps/components/display/table/AppAggridInfiniteTableEe.svelte.d.ts +1 -2
  54. package/package/components/apps/components/display/table/AppAggridTable.svelte +6 -2
  55. package/package/components/apps/components/inputs/AppSelect.svelte +18 -17
  56. package/package/components/apps/editor/AppEditor.svelte +1 -1
  57. package/package/components/apps/editor/AppPreview.svelte +3 -6
  58. package/package/components/apps/editor/AppReportsDrawer.svelte +17 -5
  59. package/package/components/apps/editor/DeploymentHistory.svelte +1 -0
  60. package/package/components/apps/editor/component/Component.svelte +0 -2
  61. package/package/components/apps/editor/componentsPanel/themeUtils.js +18 -7
  62. package/package/components/apps/editor/contextPanel/SubGridOutput.svelte +1 -0
  63. package/package/components/apps/editor/contextPanel/components/IdEditor.svelte +13 -67
  64. package/package/components/apps/editor/contextPanel/components/IdEditor.svelte.d.ts +1 -2
  65. package/package/components/apps/editor/settingsPanel/ComponentPanel.svelte +0 -1
  66. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphEditor.svelte +0 -1
  67. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphEditor.svelte.d.ts +0 -1
  68. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphNode.svelte +1 -1
  69. package/package/components/apps/editor/settingsPanel/decisionTree/InsertDecisionTreeNode.svelte +2 -2
  70. package/package/components/apps/editor/settingsPanel/inputEditor/IconSelectInput.svelte +1 -0
  71. package/package/components/apps/svelte-select/lib/Select.svelte +1 -0
  72. package/package/components/build_workers.js +24 -18
  73. package/package/components/common/button/Button.svelte +3 -4
  74. package/package/components/common/button/model.d.ts +1 -1
  75. package/package/components/common/button/model.js +6 -0
  76. package/package/components/common/clearableInput/ClearableInput.svelte +1 -0
  77. package/package/components/common/menu/MenuItem.svelte +1 -0
  78. package/package/components/common/modal/AlwaysMountedModal.svelte +1 -0
  79. package/package/components/common/stepper/Stepper.svelte +1 -0
  80. package/package/components/copilot/StepInputsGen.svelte +2 -2
  81. package/package/components/copilot/StepInputsGen.svelte.d.ts +3 -1
  82. package/package/components/copilot/lib.js +2 -2
  83. package/package/components/details/ClipboardPanel.svelte +1 -0
  84. package/package/components/flows/content/DynamicInputHelpBox.svelte +4 -1
  85. package/package/components/flows/content/FlowConstants.svelte +3 -3
  86. package/package/components/flows/content/FlowEditorPanel.svelte +1 -1
  87. package/package/components/flows/content/FlowModuleComponent.svelte +2 -2
  88. package/package/components/flows/content/FlowModuleHeader.svelte +5 -45
  89. package/package/components/flows/content/FlowModuleWorkerTagSelect.svelte +47 -0
  90. package/package/components/flows/content/FlowModuleWorkerTagSelect.svelte.d.ts +16 -0
  91. package/package/components/flows/content/FlowSettings.svelte +1 -0
  92. package/package/components/flows/flowModuleNextId.js +1 -1
  93. package/package/components/flows/flowState.d.ts +1 -1
  94. package/package/components/flows/flowStateUtils.d.ts +1 -1
  95. package/package/components/flows/flowStateUtils.js +1 -1
  96. package/package/components/flows/flowStore.d.ts +1 -0
  97. package/package/components/flows/flowStore.js +5 -0
  98. package/package/components/flows/map/FlowJobsMenu.svelte +0 -1
  99. package/package/components/flows/map/FlowJobsMenu.svelte.d.ts +0 -1
  100. package/package/components/flows/map/FlowModuleSchemaItem.svelte +103 -19
  101. package/package/components/flows/map/FlowModuleSchemaItem.svelte.d.ts +1 -0
  102. package/package/components/flows/map/FlowModuleSchemaMap.svelte +31 -1
  103. package/package/components/flows/map/InsertModuleButton.svelte +5 -5
  104. package/package/components/flows/map/InsertTriggerButton.svelte +2 -2
  105. package/package/components/flows/map/MapItem.svelte +4 -0
  106. package/package/components/flows/map/MapItem.svelte.d.ts +1 -0
  107. package/package/components/flows/map/VirtualItem.svelte +15 -7
  108. package/package/components/flows/map/VirtualItem.svelte.d.ts +2 -1
  109. package/package/components/flows/previousResults.js +1 -1
  110. package/package/components/flows/utils.d.ts +3 -3
  111. package/package/components/flows/utils.js +2 -2
  112. package/package/components/graph/FlowGraphV2.svelte +4 -0
  113. package/package/components/graph/FlowGraphV2.svelte.d.ts +1 -0
  114. package/package/components/graph/graphBuilder.d.ts +1 -0
  115. package/package/components/graph/graphBuilder.js +2 -4
  116. package/package/components/graph/renderers/edges/BaseEdge.svelte +2 -2
  117. package/package/components/graph/renderers/nodes/BranchAllStart.svelte +2 -1
  118. package/package/components/graph/renderers/nodes/BranchOneStart.svelte +3 -3
  119. package/package/components/graph/renderers/nodes/BranchOneStart.svelte.d.ts +1 -0
  120. package/package/components/graph/renderers/nodes/InputNode.svelte +2 -2
  121. package/package/components/graph/renderers/nodes/ModuleNode.svelte +6 -2
  122. package/package/components/graph/util.d.ts +1 -1
  123. package/package/components/graph/util.js +7 -2
  124. package/package/components/icons/AzureIcon.svelte +1 -1
  125. package/package/components/icons/FunkwhaleIcon.svelte +1 -19
  126. package/package/components/icons/JumpCloudIcon.svelte +12 -0
  127. package/package/components/icons/JumpCloudIcon.svelte.d.ts +17 -0
  128. package/package/components/icons/KeycloakIcon.svelte +20 -0
  129. package/package/components/icons/KeycloakIcon.svelte.d.ts +17 -0
  130. package/package/components/icons/MailchimpIcon.svelte +1 -1
  131. package/package/components/icons/ZitadelIcon.svelte +76 -0
  132. package/package/components/icons/ZitadelIcon.svelte.d.ts +17 -0
  133. package/package/components/icons/index.d.ts +7 -1
  134. package/package/components/icons/index.js +8 -2
  135. package/package/components/instanceSettings.d.ts +1 -1
  136. package/package/components/instanceSettings.js +24 -15
  137. package/package/components/runs/JobLoader.svelte +17 -6
  138. package/package/components/runs/JobLoader.svelte.d.ts +2 -0
  139. package/package/components/runs/RunRow.svelte +7 -7
  140. package/package/components/runs/RunsFilter.svelte +8 -1
  141. package/package/components/runs/RunsTable.svelte +30 -8
  142. package/package/components/runs/RunsTable.svelte.d.ts +2 -0
  143. package/package/components/schema/PropertyEditor.svelte +0 -5
  144. package/package/components/settings/WorkspaceUserSettings.svelte +1 -1
  145. package/package/components/sidebar/MenuLink.svelte +2 -1
  146. package/package/components/sidebar/WorkspaceMenu.svelte +4 -1
  147. package/package/components/sidebar/changelogs.js +30 -0
  148. package/package/components/tutorials/FlowBuilderTutorialsForLoop.svelte +2 -2
  149. package/package/gen/core/OpenAPI.js +1 -1
  150. package/package/gen/schemas.gen.d.ts +21 -0
  151. package/package/gen/schemas.gen.js +21 -0
  152. package/package/gen/services.gen.d.ts +11 -12
  153. package/package/gen/services.gen.js +19 -24
  154. package/package/gen/types.gen.d.ts +62 -37
  155. package/package/hub.d.ts +1 -0
  156. package/package/hubPaths.json +11 -8
  157. package/package.json +4 -4
  158. package/package/windmill_fetch.d.ts.txt +0 -16966
@@ -114,14 +114,14 @@ async function testConnection() {
114
114
  <input type="text" bind:value={bucket_config.region} />
115
115
  </label>
116
116
  <label class="block pb-2">
117
- <span class="text-primary font-semibold text-sm">Access Key ID</span>
117
+ <span class="text-primary font-semibold text-sm">Access key ID</span>
118
118
  <span class="text-tertiary text-2xs"
119
119
  >If left empty, will be derived automatically from $AWS_ACCESS_KEY_ID, pod or ec2 profile</span
120
120
  >
121
121
  <input type="text" bind:value={bucket_config.access_key} />
122
122
  </label>
123
123
  <label class="block pb-2">
124
- <span class="text-primary font-semibold text-sm">Secret Key</span>
124
+ <span class="text-primary font-semibold text-sm">Secret key</span>
125
125
  <span class="text-tertiary text-2xs"
126
126
  >If left empty, will be derived automatically from $AWS_SECRET_KEY, pod or ec2 profile</span
127
127
  >
@@ -137,20 +137,20 @@ async function testConnection() {
137
137
  <div class="block pb-2">
138
138
  <span class="text-tertiary text-2xs">Disable if using https only policy</span>
139
139
  <div>
140
- <Toggle bind:checked={bucket_config.allow_http} options={{ right: 'allow http' }} />
140
+ <Toggle bind:checked={bucket_config.allow_http} options={{ right: 'Allow http' }} />
141
141
  </div>
142
142
  </div>
143
143
  {:else if bucket_config.type === 'Azure'}
144
144
  <label class="block pb-2">
145
- <span class="text-primary font-semibold text-sm">Account Name</span>
145
+ <span class="text-primary font-semibold text-sm">Account name</span>
146
146
  <input type="text" placeholder="account-name" bind:value={bucket_config.accountName} />
147
147
  </label>
148
148
  <label class="block pb-2">
149
- <span class="text-primary font-semibold text-sm">Container Name</span>
149
+ <span class="text-primary font-semibold text-sm">Container name</span>
150
150
  <input type="text" placeholder="container-name" bind:value={bucket_config.containerName} />
151
151
  </label>
152
152
  <label class="block pb-2">
153
- <span class="text-primary font-semibold text-sm">Access Key</span>
153
+ <span class="text-primary font-semibold text-sm">Access key</span>
154
154
  <input type="password" autocomplete="new-password" bind:value={bucket_config.accessKey} />
155
155
  </label>
156
156
  <label class="block pb-2">
@@ -29,6 +29,7 @@ function changeDomain(domain, custom) {
29
29
  </script>
30
30
 
31
31
  <div class="flex flex-col gap-1">
32
+ <!-- svelte-ignore a11y-label-has-associated-control -->
32
33
  <label class="text-sm font-medium text-primary flex gap-4 items-center"
33
34
  ><div class="w-[120px]"><IconedResourceType name="okta" after={true} /></div><Toggle
34
35
  checked={enabled}
@@ -5,49 +5,44 @@ export let placeholder = '******';
5
5
  export let disabled = false;
6
6
  export let required = false;
7
7
  export let small = false;
8
- onMount(() => {
9
- const passwordToggle = document.querySelector('.js-password-toggle');
10
- if (passwordToggle) {
11
- passwordToggle.addEventListener('change', function () {
12
- const password = document.querySelector('.js-password'), passwordLabel = document.querySelector('.js-password-label');
13
- if (password.type === 'password') {
14
- password.type = 'text';
15
- passwordLabel.innerHTML = 'hide';
16
- }
17
- else {
18
- password.type = 'password';
19
- passwordLabel.innerHTML = 'show';
20
- }
21
- password.focus();
22
- });
23
- }
24
- else {
25
- throw Error('Password component is undefined');
26
- }
27
- });
28
8
  $: red = required && (password == '' || password == undefined);
9
+ let hideValue = true;
10
+ let randomId = (Math.random() * 10e15).toString(16);
29
11
  </script>
30
12
 
31
13
  <div class="relative w-full {small ? 'max-w-lg' : ''}">
32
14
  <div class="absolute inset-y-0 right-0 flex items-center px-2">
33
- <input class="!hidden js-password-toggle" id="toggle" type="checkbox" />
15
+ <input bind:checked={hideValue} class="!hidden" id={randomId} type="checkbox" />
34
16
  <label
35
- class="bg-surface-secondary hover:bg-gray-400 rounded px-2 py-1 text-sm text-tertiary font-mono cursor-pointer js-password-label"
36
- for="toggle">show</label
17
+ class="bg-surface-secondary hover:bg-gray-400 rounded px-2 py-1 text-sm text-tertiary font-mono cursor-pointer"
18
+ for={randomId}>{hideValue ? 'show' : 'hide'}</label
37
19
  >
38
20
  </div>
39
- <input
40
- class="block {small ? '!text-2xs' : 'w-full'} px-2 py-1 {red
41
- ? '!border-red-500'
42
- : ''} text-sm js-password h-9"
43
- id="password"
44
- type="password"
45
- bind:value={password}
46
- on:keydown
47
- autocomplete="new-password"
48
- {placeholder}
49
- {disabled}
50
- />
21
+ {#if hideValue}
22
+ <input
23
+ class="block {small ? '!text-2xs' : 'w-full'} px-2 py-1 {red
24
+ ? '!border-red-500'
25
+ : ''} text-sm h-9"
26
+ type="password"
27
+ bind:value={password}
28
+ on:keydown
29
+ autocomplete="new-password"
30
+ {placeholder}
31
+ {disabled}
32
+ />
33
+ {:else}
34
+ <input
35
+ class="block {small ? '!text-2xs' : 'w-full'} px-2 py-1 {red
36
+ ? '!border-red-500'
37
+ : ''} text-sm h-9"
38
+ type="text"
39
+ bind:value={password}
40
+ on:keydown
41
+ autocomplete="new-password"
42
+ {placeholder}
43
+ {disabled}
44
+ />
45
+ {/if}
51
46
  </div>
52
47
  {#if red}
53
48
  <div class="text-red-600 text-2xs grow">This field is required</div>
@@ -1,15 +1,18 @@
1
1
  <script>import { Scatter } from 'svelte-chartjs';
2
2
  import 'chartjs-adapter-date-fns';
3
3
  import zoomPlugin from 'chartjs-plugin-zoom';
4
+ import Tooltip2 from './Tooltip.svelte';
4
5
  import { Chart as ChartJS, Title, Tooltip, Legend, LineElement, CategoryScale, LinearScale, PointElement, TimeScale, LogarithmicScale } from 'chart.js';
5
6
  import { createEventDispatcher } from 'svelte';
6
7
  import { getDbClockNow } from '../forLater';
8
+ import Button from './common/button/Button.svelte';
7
9
  export let jobs = [];
8
10
  export let maxIsNow = false;
9
11
  export let minTimeSet = undefined;
10
12
  export let maxTimeSet = undefined;
11
13
  export let selectedIds = [];
12
14
  export let canSelect = true;
15
+ export let lastFetchWentToEnd = false;
13
16
  const dispatch = createEventDispatcher();
14
17
  const SUCCESS_COLOR = '#4ade80';
15
18
  // const SUCCESS_COLOR_TRANSPARENT = '#c9b638'
@@ -220,5 +223,18 @@ $: data && scatterOptions && highlightSelectedPoints(selectedIds);
220
223
  {maxTime} -->
221
224
  <!-- {JSON.stringify(jobs?.map((x) => x.started_at))} -->
222
225
  <div class="relative max-h-40">
226
+ {#if !lastFetchWentToEnd}
227
+ <div class="absolute top-[-10px] left-[60px]"
228
+ ><Button
229
+ size="xs"
230
+ color="transparent"
231
+ variant="contained"
232
+ on:click={() => dispatch('loadExtra')}
233
+ >Load more <Tooltip2
234
+ >There are more jobs to load but only the first 1000 were fetched</Tooltip2
235
+ ></Button
236
+ ></div
237
+ >
238
+ {/if}
223
239
  <Scatter {data} options={scatterOptions} />
224
240
  </div>
@@ -9,8 +9,10 @@ declare const __propDef: {
9
9
  maxTimeSet?: string | undefined;
10
10
  selectedIds?: string[] | undefined;
11
11
  canSelect?: boolean | undefined;
12
+ lastFetchWentToEnd?: boolean | undefined;
12
13
  };
13
14
  events: {
15
+ loadExtra: CustomEvent<any>;
14
16
  zoom: CustomEvent<any>;
15
17
  } & {
16
18
  [evt: string]: CustomEvent<any>;
@@ -192,7 +192,7 @@ async function loadLargeArgs(id, input, allowLarge) {
192
192
  <div class="w-full flex flex-col gap-1 h-full overflow-y-auto p">
193
193
  {#if savedInputs === undefined}
194
194
  <Skeleton layout={[[8]]} />
195
- {:else if savedInputs.length > 0}
195
+ {:else if savedInputs?.length > 0}
196
196
  {#each savedInputs as i}
197
197
  <button
198
198
  class={classNames(
@@ -293,7 +293,7 @@ async function loadLargeArgs(id, input, allowLarge) {
293
293
  <div class="w-full flex flex-col gap-1 p-0 h-full overflow-y-auto">
294
294
  {#if loading && (jobs == undefined || jobs?.length == 0)}
295
295
  <div class="text-left text-tertiary text-xs">Loading current runs...</div>
296
- {:else if jobs.length > 0}
296
+ {:else if jobs?.length > 0}
297
297
  {#each jobs as i (i.id)}
298
298
  <button
299
299
  class={classNames(
@@ -348,7 +348,7 @@ async function loadLargeArgs(id, input, allowLarge) {
348
348
  </div>
349
349
  </button>
350
350
  {/each}
351
- {#if jobs.length == 5}
351
+ {#if jobs?.length == 5}
352
352
  <div class="text-left text-tertiary text-xs"
353
353
  >... there may be more runs not displayed here as the limit is 5</div
354
354
  >
@@ -361,7 +361,7 @@ async function loadLargeArgs(id, input, allowLarge) {
361
361
  <div class="w-full flex flex-col gap-1 p-0 h-full overflow-y-auto">
362
362
  {#if previousInputs === undefined}
363
363
  <Skeleton layout={[[8]]} />
364
- {:else if previousInputs.length > 0}
364
+ {:else if previousInputs?.length > 0}
365
365
  {#each previousInputs as i (i.id)}
366
366
  <button
367
367
  class={classNames(
@@ -39,6 +39,11 @@ let recoveryHandlerCustomInitialPath = undefined;
39
39
  let recoveryHandlerSelected = 'slack';
40
40
  let recoveryHandlerItemKind = 'script';
41
41
  let recoveryHandlerExtraArgs = {};
42
+ let successHandlerPath = undefined;
43
+ let successHandlerCustomInitialPath = undefined;
44
+ let successHandlerSelected = 'slack';
45
+ let successHandlerItemKind = 'script';
46
+ let successHandlerExtraArgs = {};
42
47
  let failedTimes = 1;
43
48
  let failedExact = false;
44
49
  let recoveredTimes = 1;
@@ -80,6 +85,7 @@ export async function openNew(nis_flow, initial_script_path) {
80
85
  showPauseUntil = false;
81
86
  let defaultErrorHandlerMaybe = undefined;
82
87
  let defaultRecoveryHandlerMaybe = undefined;
88
+ let defaultSuccessHandlerMaybe = undefined;
83
89
  if ($workspaceStore) {
84
90
  defaultErrorHandlerMaybe = (await SettingService.getGlobal({
85
91
  key: 'default_error_handler_' + $workspaceStore
@@ -87,6 +93,9 @@ export async function openNew(nis_flow, initial_script_path) {
87
93
  defaultRecoveryHandlerMaybe = (await SettingService.getGlobal({
88
94
  key: 'default_recovery_handler_' + $workspaceStore
89
95
  }));
96
+ defaultSuccessHandlerMaybe = (await SettingService.getGlobal({
97
+ key: 'default_success_handler_' + $workspaceStore
98
+ }));
90
99
  }
91
100
  edit = false;
92
101
  itemKind = nis_flow ? 'flow' : 'script';
@@ -137,6 +146,22 @@ export async function openNew(nis_flow, initial_script_path) {
137
146
  recoveryHandlerSelected = 'slack';
138
147
  recoveredTimes = 1;
139
148
  }
149
+ if (defaultSuccessHandlerMaybe !== undefined && defaultSuccessHandlerMaybe !== null) {
150
+ let splitted = defaultSuccessHandlerMaybe['successHandlerPath'].split('/');
151
+ successHandlerItemKind = splitted[0];
152
+ successHandlerPath = splitted.slice(1)?.join('/');
153
+ successHandlerExtraArgs = defaultSuccessHandlerMaybe['successHandlerExtraArgs'];
154
+ successHandlerCustomInitialPath = successHandlerPath;
155
+ successHandlerSelected = isSlackHandler('success', successHandlerPath) ? 'slack' : 'custom';
156
+ recoveredTimes = defaultSuccessHandlerMaybe['recoveredTimes'];
157
+ }
158
+ else {
159
+ successHandlerPath = undefined;
160
+ successHandlerItemKind = 'script';
161
+ successHandlerExtraArgs = {};
162
+ successHandlerCustomInitialPath = undefined;
163
+ successHandlerSelected = 'slack';
164
+ }
140
165
  timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
141
166
  }
142
167
  finally {
@@ -232,6 +257,32 @@ async function saveAsDefaultRecoveryHandler(overrideExisting) {
232
257
  }
233
258
  }
234
259
  }
260
+ async function saveAsDefaultSuccessHandler(overrideExisting) {
261
+ if (!$enterpriseLicense) {
262
+ sendUserToast(`Setting default success handler is an enterprise edition feature`, true);
263
+ return;
264
+ }
265
+ if ($workspaceStore) {
266
+ await ScheduleService.setDefaultErrorOrRecoveryHandler({
267
+ workspace: $workspaceStore,
268
+ requestBody: {
269
+ handler_type: 'success',
270
+ override_existing: overrideExisting,
271
+ path: successHandlerPath === undefined
272
+ ? undefined
273
+ : `${successHandlerItemKind}/${successHandlerPath}`,
274
+ extra_args: successHandlerExtraArgs,
275
+ number_of_occurence: recoveredTimes
276
+ }
277
+ });
278
+ if (successHandlerPath !== undefined) {
279
+ sendUserToast(`Default success handler saved to ${successHandlerPath}`, false);
280
+ }
281
+ else {
282
+ sendUserToast(`Default success handler reset`, false);
283
+ }
284
+ }
285
+ }
235
286
  let can_write = true;
236
287
  async function loadSchedule() {
237
288
  loading = true;
@@ -290,6 +341,21 @@ async function loadSchedule() {
290
341
  recoveryHandlerSelected = 'slack';
291
342
  recoveryHandlerExtraArgs = {};
292
343
  }
344
+ if (s.on_success) {
345
+ let splitted = s.on_success.split('/');
346
+ successHandlerItemKind = splitted[0];
347
+ successHandlerPath = splitted.slice(1)?.join('/');
348
+ successHandlerCustomInitialPath = successHandlerPath;
349
+ successHandlerExtraArgs = s.on_success_extra_args ?? {};
350
+ successHandlerSelected = isSlackHandler('success', successHandlerPath) ? 'slack' : 'custom';
351
+ }
352
+ else {
353
+ successHandlerPath = undefined;
354
+ successHandlerItemKind = 'script';
355
+ successHandlerCustomInitialPath = undefined;
356
+ successHandlerSelected = 'slack';
357
+ successHandlerExtraArgs = {};
358
+ }
293
359
  args = s.args ?? {};
294
360
  can_write = canWrite(s.path, s.extra_perms, $userStore);
295
361
  tag = s.tag;
@@ -306,6 +372,9 @@ async function scheduleScript() {
306
372
  if (recoveryHandlerPath !== undefined && isSlackHandler('recovery', recoveryHandlerPath)) {
307
373
  recoveryHandlerExtraArgs['slack'] = '$res:f/slack_bot/bot_token';
308
374
  }
375
+ if (successHandlerPath !== undefined && isSlackHandler('success', successHandlerPath)) {
376
+ successHandlerExtraArgs['slack'] = '$res:f/slack_bot/bot_token';
377
+ }
309
378
  if (edit) {
310
379
  await ScheduleService.updateSchedule({
311
380
  workspace: $workspaceStore,
@@ -323,6 +392,10 @@ async function scheduleScript() {
323
392
  : undefined,
324
393
  on_recovery_times: recoveredTimes,
325
394
  on_recovery_extra_args: recoveryHandlerPath ? recoveryHandlerExtraArgs : {},
395
+ on_success: successHandlerPath
396
+ ? `${successHandlerItemKind}/${successHandlerPath}`
397
+ : undefined,
398
+ on_success_extra_args: successHandlerPath ? successHandlerExtraArgs : {},
326
399
  ws_error_handler_muted: wsErrorHandlerMuted,
327
400
  retry: retry,
328
401
  summary: summary != '' ? summary : undefined,
@@ -353,6 +426,10 @@ async function scheduleScript() {
353
426
  : undefined,
354
427
  on_recovery_times: recoveredTimes,
355
428
  on_recovery_extra_args: recoveryHandlerPath ? recoveryHandlerExtraArgs : {},
429
+ on_success: successHandlerPath
430
+ ? `${successHandlerItemKind}/${successHandlerPath}`
431
+ : undefined,
432
+ on_success_extra_args: successHandlerPath ? successHandlerExtraArgs : {},
356
433
  ws_error_handler_muted: wsErrorHandlerMuted,
357
434
  retry: retry,
358
435
  summary: summary != '' ? summary : undefined,
@@ -371,9 +448,12 @@ function isSlackHandler(isSlackHandler, scriptPath) {
371
448
  return (scriptPath.startsWith('hub/') &&
372
449
  scriptPath.endsWith('/workspace-or-schedule-error-handler-slack'));
373
450
  }
374
- else {
451
+ else if (isSlackHandler == 'recovery') {
375
452
  return (scriptPath.startsWith('hub/') && scriptPath.endsWith('/schedule-recovery-handler-slack'));
376
453
  }
454
+ else {
455
+ return scriptPath.startsWith('hub/') && scriptPath.endsWith('/schedule-success-handler-slack');
456
+ }
377
457
  }
378
458
  $: {
379
459
  if ($workspaceStore) {
@@ -602,6 +682,7 @@ $: !showPauseUntil && (paused_until = undefined);
602
682
  <Tabs bind:selected={optionTabSelected}>
603
683
  <Tab value="error_handler">Error Handler</Tab>
604
684
  <Tab value="recovery_handler">Recovery Handler</Tab>
685
+ <Tab value="success_handler">Success Handler</Tab>
605
686
  {#if itemKind === 'script'}
606
687
  <Tab value="retries">Retries</Tab>
607
688
  <Tab value="tag">Custom tag</Tab>
@@ -749,7 +830,7 @@ $: !showPauseUntil && (paused_until = undefined);
749
830
  bind:handlerPath={recoveryHandlerPath}
750
831
  customInitialScriptPath={recoveryHandlerCustomInitialPath}
751
832
  slackToggleText="Alert channel when error recovered"
752
- customScriptTemplate="/scripts/add?hub=hub%2F2421%2Fwindmill%2Fschedule_recovery_handler_template"
833
+ customScriptTemplate="/scripts/add?hub=hub%2F2794%2Fwindmill%2Fschedule_recovery_handler_template"
753
834
  bind:customHandlerKind={recoveryHandlerItemKind}
754
835
  bind:handlerExtraArgs={recoveryHandlerExtraArgs}
755
836
  >
@@ -801,6 +882,68 @@ $: !showPauseUntil && (paused_until = undefined);
801
882
  </div>
802
883
  </div>
803
884
  </Section>
885
+ {:else if optionTabSelected === 'success_handler'}
886
+ <Section label="Success handler">
887
+ <svelte:fragment slot="header">
888
+ <div class="flex flex-row gap-2">
889
+ {#if !$enterpriseLicense}<span class="text-normal text-2xs">(ee only)</span
890
+ >{/if}
891
+ </div>
892
+ </svelte:fragment>
893
+ <svelte:fragment slot="action">
894
+ <div class="flex flex-row items-center text-tertiary text-2xs gap-2">
895
+ defaults
896
+ <Dropdown
897
+ items={[
898
+ {
899
+ displayName: `Override future schedules only`,
900
+ action: () => saveAsDefaultSuccessHandler(false)
901
+ },
902
+ {
903
+ displayName: 'Override all existing',
904
+ type: 'delete',
905
+ action: () => saveAsDefaultSuccessHandler(true)
906
+ }
907
+ ]}
908
+ >
909
+ <svelte:fragment>
910
+ <Save size={12} class="mr-1" />
911
+ Set as default
912
+ </svelte:fragment>
913
+ </Dropdown>
914
+ </div>
915
+ </svelte:fragment>
916
+ <ErrorOrRecoveryHandler
917
+ isEditable={can_write && !emptyString($enterpriseLicense)}
918
+ errorOrRecovery="success"
919
+ bind:handlerSelected={successHandlerSelected}
920
+ bind:handlerPath={successHandlerPath}
921
+ customInitialScriptPath={successHandlerCustomInitialPath}
922
+ slackToggleText="Alert channel when successful"
923
+ customScriptTemplate="/scripts/add?hub=hub%2F9071%2Fwindmill%2Fschedule_success_handler_template"
924
+ bind:customHandlerKind={successHandlerItemKind}
925
+ bind:handlerExtraArgs={successHandlerExtraArgs}
926
+ >
927
+ <svelte:fragment slot="custom-tab-tooltip">
928
+ <Tooltip>
929
+ <div class="flex gap-20 items-start mt-3">
930
+ <div class=" text-sm"
931
+ >The following args will be passed to the success handler:
932
+ <ul class="mt-1 ml-2">
933
+ <li><b>path</b>: The path of the script or flow that succeeded.</li>
934
+ <li><b>is_flow</b>: Whether the runnable is a flow.</li>
935
+ <li><b>schedule_path</b>: The path of the schedule.</li>
936
+ <li><b>success_result</b>: The result of the successful job</li>
937
+ <li
938
+ ><b>success_started_at</b>: The start datetime of the successful job</li
939
+ >
940
+ </ul>
941
+ </div>
942
+ </div>
943
+ </Tooltip>
944
+ </svelte:fragment>
945
+ </ErrorOrRecoveryHandler>
946
+ </Section>
804
947
  {:else if optionTabSelected === 'retries'}
805
948
  <Section label="Retries">
806
949
  <svelte:fragment slot="header">
@@ -13,7 +13,6 @@ import { createEventDispatcher } from 'svelte';
13
13
  import LightweightArgInput from './LightweightArgInput.svelte';
14
14
  import { deepEqual } from 'fast-equals';
15
15
  import { dragHandleZone } from '@windmill-labs/svelte-dnd-action';
16
- import { flip } from 'svelte/animate';
17
16
  export let schema;
18
17
  export let schemaSkippedValues = [];
19
18
  export let schemaFieldTooltip = {};
@@ -125,7 +124,7 @@ $: fields = items ?? keys.map((x) => ({ id: x, value: x }));
125
124
  {#if keys.length > 0}
126
125
  {#each fields as item, i (item.id)}
127
126
  {@const argName = item.value}
128
- <div animate:flip={{ duration: 200 }}>
127
+ <div>
129
128
  <!-- svelte-ignore a11y-click-events-have-key-events -->
130
129
  {#if !schemaSkippedValues.includes(argName) && Object.keys(schema?.properties ?? {}).includes(argName)}
131
130
  <!-- svelte-ignore a11y-no-static-element-interactions -->
@@ -947,6 +947,7 @@ function langToLanguage(lang) {
947
947
  <div class="flex flex-row gap-2 grow max-w-md">
948
948
  <div class="center-center">
949
949
  <button
950
+ disabled={customUi?.topBar?.settings == false}
950
951
  on:click={async () => {
951
952
  metadataOpen = true
952
953
  }}
@@ -36,18 +36,36 @@ const scripts = {
36
36
  },
37
37
  s3: {
38
38
  code: `
39
- import { S3Client } from "https://deno.land/x/s3_lite_client@0.6.1/mod.ts";
39
+ import * as wmill from "windmill-client"
40
40
 
41
41
  type S3 = object
42
42
 
43
43
  export async function main(s3: S3) {
44
- const s3client = new S3Client(s3);
45
- for await (const obj of s3client.listObjects({ prefix: "/" })) {
46
- console.log(obj);
47
- }
44
+ return fetch(process.env["BASE_URL"] + '/api/settings/test_object_storage_config', {
45
+ method: 'POST',
46
+ headers: {
47
+ 'Content-Type': 'application/json',
48
+ Authorization: 'Bearer ' + process.env["WM_TOKEN"],
49
+ },
50
+ body: JSON.stringify({
51
+ type: "S3",
52
+ bucket: s3.bucket,
53
+ endpoint: s3.endPoint,
54
+ port: s3.port,
55
+ allow_http: !s3.useSSL,
56
+ access_key: s3.accessKey,
57
+ secret_key: s3.secretKey,
58
+ path_style: s3.pathStyle,
59
+ }),
60
+ }).then(async (res) => {
61
+ if (!res.ok) {
62
+ throw new Error(await res.text())
63
+ }
64
+ return res.text()
65
+ })
48
66
  }
49
67
  `,
50
- lang: 'deno',
68
+ lang: 'bun',
51
69
  argName: 's3'
52
70
  },
53
71
  graphql: {
@@ -68,6 +68,7 @@ export async function runFlowByPath(path, args) {
68
68
  }
69
69
  export async function getLogs() {
70
70
  if (job) {
71
+ console.log('getLogs');
71
72
  const getUpdate = await JobService.getJobUpdates({
72
73
  workspace: workspace,
73
74
  id: job.id,
@@ -135,6 +136,7 @@ async function loadTestJob(id) {
135
136
  try {
136
137
  if (job && `running` in job) {
137
138
  const offset = logOffset == 0 ? (job.logs?.length ? job.logs?.length + 1 : 0) : logOffset;
139
+ console.log('getLogs');
138
140
  let previewJobUpdates = await JobService.getJobUpdates({
139
141
  workspace: workspace,
140
142
  id,
@@ -25,6 +25,7 @@ function changeOrg(org) {
25
25
  </script>
26
26
 
27
27
  <div class="flex flex-col gap-1">
28
+ <!-- svelte-ignore a11y-label-has-associated-control -->
28
29
  <label class="text-sm font-medium text-primary flex gap-4 items-center"
29
30
  ><div class="w-[120px]"><IconedResourceType name={'zitadel'} after={true} /></div><Toggle
30
31
  checked={enabled}
@@ -19,7 +19,6 @@ export let initializing = undefined;
19
19
  export let render;
20
20
  export let customCss = undefined;
21
21
  export let actions = undefined;
22
- export let actionsOrder = undefined;
23
22
  let runnableComponent = undefined;
24
23
  function clear() {
25
24
  setTimeout(() => {
@@ -1,6 +1,6 @@
1
1
  import { SvelteComponent } from "svelte";
2
2
  import type { AppInput } from '../../../inputType';
3
- import type { ComponentCustomCSS, RichConfiguration, RichConfigurations } from '../../../types';
3
+ import type { ComponentCustomCSS, RichConfigurations } from '../../../types';
4
4
  import { type TableAction } from '../../../editor/component';
5
5
  import 'ag-grid-community/styles/ag-grid.css';
6
6
  import './theme/windmill-theme.css';
@@ -13,7 +13,6 @@ declare const __propDef: {
13
13
  render: boolean;
14
14
  customCss?: ComponentCustomCSS<'aggridinfinitecomponent'> | undefined;
15
15
  actions?: TableAction[] | undefined;
16
- actionsOrder?: RichConfiguration | undefined;
17
16
  };
18
17
  events: {
19
18
  [evt: string]: CustomEvent<any>;
@@ -13,7 +13,6 @@ export let initializing = undefined;
13
13
  export let render;
14
14
  export let customCss = undefined;
15
15
  export let actions = [];
16
- export let actionsOrder = undefined;
17
16
  let loaded = false;
18
17
  async function load() {
19
18
  await import('ag-grid-enterprise');
@@ -33,7 +32,6 @@ load();
33
32
  {render}
34
33
  {customCss}
35
34
  {actions}
36
- {actionsOrder}
37
35
  />
38
36
  {:else}
39
37
  <Loader2 class="animate-spin" />
@@ -1,6 +1,6 @@
1
1
  import { SvelteComponent } from "svelte";
2
2
  import type { AppInput } from '../../../inputType';
3
- import type { ComponentCustomCSS, RichConfiguration, RichConfigurations } from '../../../types';
3
+ import type { ComponentCustomCSS, RichConfigurations } from '../../../types';
4
4
  import 'ag-grid-community/styles/ag-grid.css';
5
5
  import 'ag-grid-community/styles/ag-theme-alpine.css';
6
6
  import type { TableAction } from '../../../editor/component';
@@ -14,7 +14,6 @@ declare const __propDef: {
14
14
  render: boolean;
15
15
  customCss?: ComponentCustomCSS<'aggridinfinitecomponentee'> | undefined;
16
16
  actions?: TableAction[] | undefined;
17
- actionsOrder?: RichConfiguration | undefined;
18
17
  };
19
18
  events: {
20
19
  [evt: string]: CustomEvent<any>;
@@ -402,6 +402,7 @@ let loading = false;
402
402
  let refreshCount = 0;
403
403
  let footerRenderCount = 0;
404
404
  let computedOrder = undefined;
405
+ let footerHeight = 0;
405
406
  </script>
406
407
 
407
408
  {#if actionsOrder}
@@ -458,7 +459,7 @@ let computedOrder = undefined;
458
459
  on:pointerdown|stopPropagation={() => {
459
460
  $selectedComponent = [id]
460
461
  }}
461
- style:height="{clientHeight}px"
462
+ style:height="{clientHeight - (resolvedConfig.footer ? footerHeight : 0)}px"
462
463
  style:width="{clientWidth}px"
463
464
  class="ag-theme-alpine relative"
464
465
  class:ag-theme-alpine-dark={$darkMode}
@@ -490,7 +491,10 @@ let computedOrder = undefined;
490
491
  </div>
491
492
  {#if resolvedConfig.footer}
492
493
  {#key footerRenderCount}
493
- <div class="flex gap-1 w-full justify-between items-center text-sm text-secondary/80 p-2">
494
+ <div
495
+ class="flex gap-1 w-full justify-between items-center text-sm text-secondary/80 p-2"
496
+ bind:clientHeight={footerHeight}
497
+ >
494
498
  <div>
495
499
  <Popover>
496
500
  <svelte:fragment slot="text">Download</svelte:fragment>