windmill-components 1.389.3 → 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
@@ -1,7 +1,7 @@
1
1
  export const settings = {
2
2
  Core: [
3
3
  {
4
- label: 'Base Url',
4
+ label: 'Base url',
5
5
  description: 'Public base url of the instance',
6
6
  key: 'base_url',
7
7
  fieldType: 'text',
@@ -24,7 +24,7 @@ export const settings = {
24
24
  placeholder: 'mail.windmill.com'
25
25
  },
26
26
  {
27
- label: 'Request Size Limit In MB',
27
+ label: 'Request size limit in MB',
28
28
  description: 'Maximum size of HTTP requests in MB.',
29
29
  cloudonly: true,
30
30
  key: 'request_size_limit_mb',
@@ -41,7 +41,7 @@ export const settings = {
41
41
  cloudonly: false
42
42
  },
43
43
  {
44
- label: 'Max Timeout for sync endpoints',
44
+ label: 'Max timeout for sync endpoints',
45
45
  key: 'timeout_wait_result',
46
46
  cloudonly: true,
47
47
  fieldType: 'seconds',
@@ -49,8 +49,8 @@ export const settings = {
49
49
  storage: 'config'
50
50
  },
51
51
  {
52
- label: 'License Key',
53
- description: 'License Key required to use the EE (switch image for windmill-ee)',
52
+ label: 'License key',
53
+ description: 'License key required to use the EE (switch image for windmill-ee)',
54
54
  key: 'license_key',
55
55
  fieldType: 'license_key',
56
56
  placeholder: 'only needed to prepare upgrade to EE',
@@ -65,7 +65,7 @@ export const settings = {
65
65
  ee_only: 'This is only relevant for EE'
66
66
  },
67
67
  {
68
- label: 'Retention Period in secs',
68
+ label: 'Retention period in secs',
69
69
  key: 'retention_period_secs',
70
70
  description: 'How long to keep the jobs data in the database (max 30 days on CE)',
71
71
  fieldType: 'seconds',
@@ -76,14 +76,14 @@ export const settings = {
76
76
  },
77
77
  {
78
78
  label: 'Expose metrics',
79
- description: 'Expose prometheus metrics for workers and servers on port 8001 at /metrics',
79
+ description: 'Expose Prometheus metrics for workers and servers on port 8001 at /metrics',
80
80
  key: 'expose_metrics',
81
81
  fieldType: 'boolean',
82
82
  storage: 'setting',
83
83
  ee_only: ''
84
84
  },
85
85
  {
86
- label: 'S3/Azure for Python/Go Cache & Large Logs',
86
+ label: 'S3/Azure for Python/Go cache & large logs',
87
87
  description: 'Bucket to store large logs and global cache for Python and Go.',
88
88
  key: 'object_store_cache_config',
89
89
  fieldType: 'object_store_config',
@@ -91,8 +91,8 @@ export const settings = {
91
91
  ee_only: ''
92
92
  },
93
93
  {
94
- label: 'Critical Alert Channels',
95
- description: 'Channels to send critical alerts to. SMTP must be configured for the email channel.',
94
+ label: 'Critical alert channels',
95
+ description: 'Channels to send critical alerts to. SMTP must be configured for the email channel. A Slack workspace must be connected to the instance for the Slack channel.',
96
96
  key: 'critical_error_channels',
97
97
  fieldType: 'critical_error_channels',
98
98
  storage: 'setting',
@@ -107,8 +107,8 @@ export const settings = {
107
107
  ee_only: ''
108
108
  },
109
109
  {
110
- label: 'Private hub base url',
111
- description: 'Base url of your private hub instance, without trailing slash',
110
+ label: 'Private Hub base url',
111
+ description: 'Base url of your private Hub instance, without trailing slash',
112
112
  placeholder: 'https://hub.company.com',
113
113
  key: 'hub_base_url',
114
114
  fieldType: 'text',
@@ -197,9 +197,18 @@ export const settings = {
197
197
  storage: 'config'
198
198
  }
199
199
  ],
200
+ Slack: [
201
+ {
202
+ label: 'Slack',
203
+ key: 'slack',
204
+ fieldType: 'slack_connect',
205
+ storage: 'setting',
206
+ ee_only: ''
207
+ }
208
+ ],
200
209
  'SCIM/SAML': [
201
210
  {
202
- label: 'SCIM Token',
211
+ label: 'SCIM token',
203
212
  description: 'Token used to authenticate requests from the IdP',
204
213
  key: 'scim_token',
205
214
  fieldType: 'text',
@@ -219,14 +228,14 @@ export const settings = {
219
228
  ],
220
229
  Debug: [
221
230
  {
222
- label: 'Keep Job Directories',
231
+ label: 'Keep job directories',
223
232
  key: 'keep_job_dir',
224
233
  fieldType: 'boolean',
225
234
  tooltip: 'Keep Job directories after execution at /tmp/windmill/<worker>/<job_id>',
226
235
  storage: 'setting'
227
236
  },
228
237
  {
229
- label: 'Expose Debug Metrics',
238
+ label: 'Expose debug metrics',
230
239
  key: 'expose_debug_metrics',
231
240
  fieldType: 'boolean',
232
241
  tooltip: 'Expose additional metrics (require metrics to be enabled)',
@@ -105,7 +105,19 @@ function computeJobKinds(jobKindsCat) {
105
105
  }
106
106
  }
107
107
  let loadingFetch = false;
108
- async function fetchJobs(startedBefore, startedAfter, startedAfterCompletedJobs) {
108
+ export async function loadExtraJobs() {
109
+ if (jobs && jobs.length > 0) {
110
+ const lastJob = jobs[jobs.length - 1];
111
+ // const minCreated = lastJob?.created_at
112
+ const minCreated = new Date(new Date(lastJob.created_at).getTime() - 1).toISOString();
113
+ let olderJobs = await fetchJobs(undefined, minTs, undefined, minCreated);
114
+ jobs = jobs.concat(olderJobs);
115
+ computeCompletedJobs();
116
+ return olderJobs?.length < 1000;
117
+ }
118
+ return false;
119
+ }
120
+ async function fetchJobs(startedBefore, startedAfter, startedAfterCompletedJobs, createdBefore) {
109
121
  loadingFetch = true;
110
122
  try {
111
123
  let scriptPathStart = folder === null || folder === '' ? undefined : `f/${folder}/`;
@@ -117,6 +129,7 @@ async function fetchJobs(startedBefore, startedAfter, startedAfterCompletedJobs)
117
129
  createdOrStartedAfterCompletedJobs: startedAfterCompletedJobs,
118
130
  schedulePath,
119
131
  scriptPathExact,
132
+ createdBefore,
120
133
  createdBy: user === null || user === '' ? undefined : user,
121
134
  scriptPathStart: scriptPathStart,
122
135
  jobKinds,
@@ -128,9 +141,7 @@ async function fetchJobs(startedBefore, startedAfter, startedAfterCompletedJobs)
128
141
  : undefined,
129
142
  isSkipped: isSkipped ? undefined : false,
130
143
  // isFlowStep: jobKindsCat != 'all' ? false : undefined,
131
- hasNullParent: scriptPathExact != undefined || scriptPathStart != undefined || jobKindsCat != 'all'
132
- ? true
133
- : undefined,
144
+ hasNullParent: jobKindsCat != 'all' ? true : undefined,
134
145
  label: label === null || label === '' ? undefined : label,
135
146
  tag: tag === null || tag === '' ? undefined : tag,
136
147
  isNotSchedule: showSchedules == false ? true : undefined,
@@ -229,7 +240,7 @@ async function loadJobsIntern(shouldGetCount) {
229
240
  // lookback won't be needed anymore (just filter ended_at > minTs instead
230
241
  const extendedMinTs = subtractDaysFromDateString(minTs, lookback);
231
242
  if (concurrencyKey == null || concurrencyKey === '') {
232
- let newJobs = await fetchJobs(maxTs, undefined, extendedMinTs);
243
+ let newJobs = await fetchJobs(maxTs, undefined, extendedMinTs, undefined);
233
244
  extendedJobs = { jobs: newJobs, obscured_jobs: [] };
234
245
  // Filter on minTs here and not in the backend
235
246
  // to get enough data for the concurrency graph
@@ -328,7 +339,7 @@ async function syncer() {
328
339
  loading = true;
329
340
  let newJobs;
330
341
  if (concurrencyKey == null || concurrencyKey === '') {
331
- newJobs = await fetchJobs(maxTs, minTs ?? ts, undefined);
342
+ newJobs = await fetchJobs(maxTs, minTs ?? ts, undefined, undefined);
332
343
  }
333
344
  else {
334
345
  // Obscured jobs have no ids, so we have to do the full request
@@ -39,6 +39,7 @@ declare const __propDef: {
39
39
  } | undefined) | undefined;
40
40
  lookback?: number | undefined;
41
41
  perPage?: number | undefined;
42
+ loadExtraJobs?: (() => Promise<boolean>) | undefined;
42
43
  loadJobs?: ((nMinTs: string | undefined, nMaxTs: string | undefined, reset: boolean, shouldGetCount?: boolean) => Promise<void>) | undefined;
43
44
  };
44
45
  events: {
@@ -50,6 +51,7 @@ export type JobLoaderProps = typeof __propDef.props;
50
51
  export type JobLoaderEvents = typeof __propDef.events;
51
52
  export type JobLoaderSlots = typeof __propDef.slots;
52
53
  export default class JobLoader extends SvelteComponent<JobLoaderProps, JobLoaderEvents, JobLoaderSlots> {
54
+ get loadExtraJobs(): () => Promise<boolean>;
53
55
  get loadJobs(): (nMinTs: string | undefined, nMaxTs: string | undefined, reset: boolean, shouldGetCount?: boolean | undefined) => Promise<void>;
54
56
  }
55
57
  export {};
@@ -193,14 +193,14 @@ function isJobCancelable(j) {
193
193
  {/if}
194
194
  </div>
195
195
  {#if containsLabel}
196
- <div class="w-3/12 flex justify-start">
196
+ <div class="w-3/12 flex justify-start px-0.5">
197
197
  {#if job && job?.['labels']}
198
198
  <div class="flex flex-row items-center gap-1 overflow-x-auto">
199
199
  {#if Array.isArray(job?.['labels'])}
200
200
  {#each job?.['labels'] as label}
201
201
  <Button
202
202
  variant="border"
203
- size="xs2"
203
+ size="xs3"
204
204
  btnClasses={twMerge(
205
205
  activeLabel == label ? 'bg-blue-50 dark:bg-blue-900/50' : '',
206
206
  '!text-2xs !font-normal truncate max-w-28'
@@ -209,9 +209,9 @@ function isJobCancelable(j) {
209
209
  on:click={() => {
210
210
  dispatch('filterByLabel', label)
211
211
  }}
212
+ endIcon={{ icon: ListFilter }}
212
213
  >
213
214
  {label}
214
- <ListFilter size={10} />
215
215
  </Button>
216
216
  {/each}
217
217
  {/if}
@@ -229,7 +229,7 @@ function isJobCancelable(j) {
229
229
  btnClasses="font-normal"
230
230
  on:click={() => scheduleEditor?.openEdit(job.schedule_path ?? '', job.job_kind == 'flow')}
231
231
  >
232
- <div class="truncate text-ellipsis text-left">
232
+ <div class="truncate text-ellipsis text-left" title={job.schedule_path}>
233
233
  {truncateRev(job.schedule_path, 20)}
234
234
  </div>
235
235
  </Button>
@@ -245,15 +245,15 @@ function isJobCancelable(j) {
245
245
  </div>
246
246
  {:else}
247
247
  <div class="flex flex-row gap-1 items-center">
248
- <div class="text-xs">
249
- {job.created_by}
248
+ <div class="text-xs truncate text-ellipsis text-left" title={job.created_by}>
249
+ {truncateRev(job.created_by ?? '', 20)}
250
250
  </div>
251
251
  {#if !isExternal}
252
252
  <Button
253
253
  size="xs2"
254
254
  color="light"
255
255
  on:click={() => {
256
- dispatch('filterByUser', job.created_by)
256
+ dispatch('filterByUser', job.created_by ?? '')
257
257
  }}
258
258
  >
259
259
  <ListFilter size={10} />
@@ -249,6 +249,7 @@ let tagTimeout = undefined;
249
249
  ></span
250
250
  >
251
251
 
252
+ <!-- svelte-ignore a11y-autofocus -->
252
253
  <input
253
254
  autofocus
254
255
  type="text"
@@ -290,6 +291,7 @@ let tagTimeout = undefined;
290
291
  </Tooltip></span
291
292
  >
292
293
 
294
+ <!-- svelte-ignore a11y-autofocus -->
293
295
  <input
294
296
  autofocus
295
297
  type="text"
@@ -323,6 +325,7 @@ let tagTimeout = undefined;
323
325
  {/if}
324
326
  <span class="text-xs absolute -top-4"> Tag </span>
325
327
 
328
+ <!-- svelte-ignore a11y-autofocus -->
326
329
  <input
327
330
  autofocus
328
331
  type="text"
@@ -356,6 +359,7 @@ let tagTimeout = undefined;
356
359
  {/if}
357
360
  <span class="text-xs absolute -top-4"> Schedule Path </span>
358
361
 
362
+ <!-- svelte-ignore a11y-autofocus -->
359
363
  <input
360
364
  autofocus
361
365
  type="text"
@@ -470,7 +474,7 @@ let tagTimeout = undefined;
470
474
  <CloseButton on:close={() => close(null)} />
471
475
  </svelte:fragment>
472
476
 
473
- <div class="w-80 flex flex-col gap-4">
477
+ <div class="w-102 flex flex-col gap-4">
474
478
  {#if mobile}
475
479
  <Label label="Filter by">
476
480
  <ToggleButtonGroup
@@ -603,6 +607,7 @@ let tagTimeout = undefined;
603
607
  </button>
604
608
  {/if}
605
609
 
610
+ <!-- svelte-ignore a11y-autofocus -->
606
611
  <input
607
612
  autofocus
608
613
  type="text"
@@ -637,6 +642,7 @@ let tagTimeout = undefined;
637
642
  </button>
638
643
  {/if}
639
644
 
645
+ <!-- svelte-ignore a11y-autofocus -->
640
646
  <input
641
647
  autofocus
642
648
  type="text"
@@ -671,6 +677,7 @@ let tagTimeout = undefined;
671
677
  </button>
672
678
  {/if}
673
679
 
680
+ <!-- svelte-ignore a11y-autofocus -->
674
681
  <input
675
682
  autofocus
676
683
  type="text"
@@ -16,6 +16,7 @@ export let selectedIds = [];
16
16
  export let selectedWorkspace = undefined;
17
17
  export let activeLabel = null;
18
18
  // const loadMoreQuantity: number = 100
19
+ export let lastFetchWentToEnd = false;
19
20
  function getTime(job) {
20
21
  return job['started_at'] ?? job['scheduled_for'] ?? job['created_at'];
21
22
  }
@@ -123,9 +124,12 @@ function selectAll() {
123
124
  let cancelableJobCount = 0;
124
125
  $: isSelectingJobsToCancel && (allSelected = selectedIds.length === cancelableJobCount);
125
126
  $: isSelectingJobsToCancel && (cancelableJobCount = jobs?.filter(isJobCancelable).length ?? 0);
126
- function jobCountString(jobCount) {
127
+ function jobCountString(jobCount, lastFetchWentToEnd) {
128
+ if (jobCount === undefined) {
129
+ return '';
130
+ }
127
131
  const jc = jobCount;
128
- const isTruncated = jc >= 1000;
132
+ const isTruncated = jc >= 1000 && !lastFetchWentToEnd;
129
133
  return `${jc}${isTruncated ? '+' : ''} job${jc != 1 ? 's' : ''}`;
130
134
  }
131
135
  function computeHeight() {
@@ -166,14 +170,14 @@ const dispatch = createEventDispatcher();
166
170
  {#if showExternalJobs && externalJobs.length > 0}
167
171
  <div class="w-1/12 text-2xs">
168
172
  <div class="flex flex-row">
169
- {jobs && jobCountString(jobs.length + externalJobs.length)}<Tooltip
170
- >{externalJobs.length} jobs obscured</Tooltip
171
- >
173
+ {jobs
174
+ ? jobCountString(jobs.length + externalJobs.length, lastFetchWentToEnd)
175
+ : ''}<Tooltip>{externalJobs.length} jobs obscured</Tooltip>
172
176
  </div>
173
177
  </div>
174
178
  {:else if $workspaceStore !== 'admins' && omittedObscuredJobs}
175
179
  <div class="w-1/12 text-2xs flex flex-row">
176
- {jobs && jobCountString(jobs.length)}
180
+ {jobs ? jobCountString(jobs.length, lastFetchWentToEnd) : ''}
177
181
  <Popover>
178
182
  <AlertTriangle size={16} class="ml-0.5 text-yellow-500" />
179
183
  <svelte:fragment slot="text">
@@ -183,9 +187,11 @@ const dispatch = createEventDispatcher();
183
187
  </Popover>
184
188
  </div>
185
189
  {:else}
186
- <div class="w-1/12 text-2xs">{jobs && jobCountString(jobs.length)}</div>
190
+ <div class="w-1/12 text-2xs"
191
+ >{jobs ? jobCountString(jobs.length, lastFetchWentToEnd) : ''}</div
192
+ >
187
193
  {/if}
188
- <div class="w-4/12 text-xs font-semibold">Timestamp</div>
194
+ <div class="w-4/12 text-xs font-semibold" />
189
195
  <div class="w-4/12 text-xs font-semibold">Path</div>
190
196
  {#if containsLabel}
191
197
  <div class="w-3/12 text-xs font-semibold">Label</div>
@@ -262,6 +268,22 @@ const dispatch = createEventDispatcher();
262
268
  </div>
263
269
  {/if}
264
270
  </div>
271
+ <div slot="footer"
272
+ >{#if !lastFetchWentToEnd && jobs && jobs.length >= 1000}
273
+ <button
274
+ class="text-xs text-blue-600 text-center w-full pb-2"
275
+ on:click={() => {
276
+ dispatch('loadExtra')
277
+ }}>Load next 1000 jobs</button
278
+ >
279
+ {/if}</div
280
+ >
265
281
  </VirtualList>
266
282
  {/if}
267
283
  </div>
284
+
285
+ <style>
286
+ :global(.virtual-list-wrapper:hover::-webkit-scrollbar) {
287
+ width: 8px !important;
288
+ height: 8px !important;
289
+ }</style>
@@ -10,6 +10,7 @@ declare const __propDef: {
10
10
  selectedIds?: string[] | undefined;
11
11
  selectedWorkspace?: string | undefined;
12
12
  activeLabel?: string | null | undefined;
13
+ lastFetchWentToEnd?: boolean | undefined;
13
14
  };
14
15
  events: {
15
16
  focus: FocusEvent;
@@ -20,6 +21,7 @@ declare const __propDef: {
20
21
  filterByConcurrencyKey: CustomEvent<any>;
21
22
  filterBySchedule: CustomEvent<any>;
22
23
  select: CustomEvent<any>;
24
+ loadExtra: CustomEvent<any>;
23
25
  } & {
24
26
  [evt: string]: CustomEvent<any>;
25
27
  };
@@ -202,9 +202,4 @@ function updateSchema() {
202
202
  input::-webkit-inner-spin-button {
203
203
  -webkit-appearance: none !important;
204
204
  margin: 0;
205
- }
206
-
207
- /* Firefox */
208
- input[type='number'] {
209
- -moz-appearance: textfield !important;
210
205
  }</style>
@@ -290,7 +290,7 @@ $: showInvites = invites?.length > 0 || (auto_invite_domain != undefined && !aut
290
290
  {#if filteredUsers}
291
291
  {#each filteredUsers.slice(0, nbDisplayed) as { email, username, is_admin, operator, disabled } (email)}
292
292
  <tr class="!hover:bg-surface-hover">
293
- <Cell first>{truncate(email, 20)}</Cell>
293
+ <Cell first><a href="mailto:{email}">{truncate(email, 20)}</a></Cell>
294
294
  <Cell>{truncate(username, 30)}</Cell>
295
295
  <Cell
296
296
  >{#if usage?.[email] != undefined}{usage?.[email]}{:else}<Loader2
@@ -1,6 +1,7 @@
1
1
  <script>import { classNames } from '../../utils';
2
2
  import { navigating, page } from '$app/stores';
3
3
  import Popover from '../Popover.svelte';
4
+ import { base } from '$app/paths';
4
5
  export let label;
5
6
  export let href;
6
7
  export let icon = undefined;
@@ -9,7 +10,7 @@ export let disabled = false;
9
10
  export let lightMode = false;
10
11
  let isSelected = false;
11
12
  navigating.subscribe(() => {
12
- if (href === '/') {
13
+ if (href === `${base}/`) {
13
14
  isSelected = $page.url.pathname === href;
14
15
  }
15
16
  else {
@@ -26,10 +26,13 @@ async function toggleSwitchWorkspace(id) {
26
26
  const isOnEditPage = editPages.some((editPage) => $page.route.id?.includes(editPage) ?? false);
27
27
  if (!isOnEditPage) {
28
28
  switchWorkspace(id);
29
+ if ($page.url.searchParams.get('workspace')) {
30
+ $page.url.searchParams.set('workspace', id);
31
+ }
29
32
  }
30
33
  else {
31
- await goto('/');
32
34
  switchWorkspace(id);
35
+ await goto('/');
33
36
  }
34
37
  }
35
38
  </script>
@@ -1,4 +1,34 @@
1
1
  const changelogs = [
2
+ {
3
+ label: 'Directly edit flow YAML',
4
+ href: 'https://www.windmill.dev/changelog/flow-yaml-editor',
5
+ date: '2024-09-02'
6
+ },
7
+ {
8
+ label: 'Critical alert channels',
9
+ href: 'https://www.windmill.dev/changelog/critical-alert-channels',
10
+ date: '2024-09-01'
11
+ },
12
+ {
13
+ label: 'See service logs directly in Windmill',
14
+ href: 'https://www.windmill.dev/changelog/service-logs',
15
+ date: '2024-09-01'
16
+ },
17
+ {
18
+ label: 'Vim support for Monaco/webeditor',
19
+ href: 'https://www.windmill.dev/changelog/vim-support',
20
+ date: '2024-08-28'
21
+ },
22
+ {
23
+ label: 'Hide / Show App Editor Panels',
24
+ href: 'https://www.windmill.dev/changelog/hide-show-app-panels',
25
+ date: '2024-08-26'
26
+ },
27
+ {
28
+ label: 'Email triggers',
29
+ href: 'https://www.windmill.dev/changelog/email-triggers',
30
+ date: '2024-08-06'
31
+ },
2
32
  {
3
33
  label: 'Continue on disapproval/timeout',
4
34
  href: 'https://www.windmill.dev/changelog/continue-on-disapproval',
@@ -130,8 +130,8 @@ export function runTutorial(indexToInsertAt) {
130
130
  }
131
131
 
132
132
  $flowStateStore[newId] = emptyFlowModuleState()
133
-
134
- $flowStateStore[newId].schema.properties = {
133
+ let schema = $flowStateStore[newId].schema ?? { properties: {} }
134
+ schema.properties = {
135
135
  x: {
136
136
  type: 'string',
137
137
  description: '',
@@ -21,7 +21,7 @@ export const OpenAPI = {
21
21
  PASSWORD: undefined,
22
22
  TOKEN: undefined,
23
23
  USERNAME: undefined,
24
- VERSION: '1.388.0',
24
+ VERSION: '1.394.3',
25
25
  WITH_CREDENTIALS: false,
26
26
  interceptors: {
27
27
  request: new Interceptors(),
@@ -1251,6 +1251,12 @@ export declare const $Schedule: {
1251
1251
  readonly on_recovery_extra_args: {
1252
1252
  readonly $ref: "#/components/schemas/ScriptArgs";
1253
1253
  };
1254
+ readonly on_success: {
1255
+ readonly type: "string";
1256
+ };
1257
+ readonly on_success_extra_args: {
1258
+ readonly $ref: "#/components/schemas/ScriptArgs";
1259
+ };
1254
1260
  readonly ws_error_handler_muted: {
1255
1261
  readonly type: "boolean";
1256
1262
  };
@@ -1345,6 +1351,12 @@ export declare const $NewSchedule: {
1345
1351
  readonly on_recovery_extra_args: {
1346
1352
  readonly $ref: "#/components/schemas/ScriptArgs";
1347
1353
  };
1354
+ readonly on_success: {
1355
+ readonly type: "string";
1356
+ };
1357
+ readonly on_success_extra_args: {
1358
+ readonly $ref: "#/components/schemas/ScriptArgs";
1359
+ };
1348
1360
  readonly ws_error_handler_muted: {
1349
1361
  readonly type: "boolean";
1350
1362
  };
@@ -1400,6 +1412,12 @@ export declare const $EditSchedule: {
1400
1412
  readonly on_recovery_extra_args: {
1401
1413
  readonly $ref: "#/components/schemas/ScriptArgs";
1402
1414
  };
1415
+ readonly on_success: {
1416
+ readonly type: "string";
1417
+ };
1418
+ readonly on_success_extra_args: {
1419
+ readonly $ref: "#/components/schemas/ScriptArgs";
1420
+ };
1403
1421
  readonly ws_error_handler_muted: {
1404
1422
  readonly type: "boolean";
1405
1423
  };
@@ -2762,6 +2780,9 @@ export declare const $PathScript: {
2762
2780
  readonly type: "string";
2763
2781
  readonly enum: readonly ["script"];
2764
2782
  };
2783
+ readonly tag_override: {
2784
+ readonly type: "string";
2785
+ };
2765
2786
  };
2766
2787
  readonly required: readonly ["type", "path", "input_transforms"];
2767
2788
  };
@@ -1281,6 +1281,12 @@ export const $Schedule = {
1281
1281
  on_recovery_extra_args: {
1282
1282
  '$ref': '#/components/schemas/ScriptArgs'
1283
1283
  },
1284
+ on_success: {
1285
+ type: 'string'
1286
+ },
1287
+ on_success_extra_args: {
1288
+ '$ref': '#/components/schemas/ScriptArgs'
1289
+ },
1284
1290
  ws_error_handler_muted: {
1285
1291
  type: 'boolean'
1286
1292
  },
@@ -1378,6 +1384,12 @@ export const $NewSchedule = {
1378
1384
  on_recovery_extra_args: {
1379
1385
  '$ref': '#/components/schemas/ScriptArgs'
1380
1386
  },
1387
+ on_success: {
1388
+ type: 'string'
1389
+ },
1390
+ on_success_extra_args: {
1391
+ '$ref': '#/components/schemas/ScriptArgs'
1392
+ },
1381
1393
  ws_error_handler_muted: {
1382
1394
  type: 'boolean'
1383
1395
  },
@@ -1433,6 +1445,12 @@ export const $EditSchedule = {
1433
1445
  on_recovery_extra_args: {
1434
1446
  '$ref': '#/components/schemas/ScriptArgs'
1435
1447
  },
1448
+ on_success: {
1449
+ type: 'string'
1450
+ },
1451
+ on_success_extra_args: {
1452
+ '$ref': '#/components/schemas/ScriptArgs'
1453
+ },
1436
1454
  ws_error_handler_muted: {
1437
1455
  type: 'boolean'
1438
1456
  },
@@ -2815,6 +2833,9 @@ export const $PathScript = {
2815
2833
  type: {
2816
2834
  type: 'string',
2817
2835
  enum: ['script']
2836
+ },
2837
+ tag_override: {
2838
+ type: 'string'
2818
2839
  }
2819
2840
  },
2820
2841
  required: ['type', 'path', 'input_transforms']