windmill-components 1.447.7 → 1.448.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/package/autosize.js +3 -8
  2. package/package/components/AppConnectInner.svelte +7 -1
  3. package/package/components/ArgInput.svelte +673 -596
  4. package/package/components/ArgInput.svelte.d.ts +11 -0
  5. package/package/components/AssignableTags.svelte +2 -1
  6. package/package/components/AssignableTags.svelte.d.ts +1 -0
  7. package/package/components/AssignableTagsInner.svelte +5 -1
  8. package/package/components/AssignableTagsInner.svelte.d.ts +3 -1
  9. package/package/components/AuthSettings.svelte +1 -1
  10. package/package/components/AuthSettings.svelte.d.ts +1 -0
  11. package/package/components/EditableSchemaForm.svelte +61 -29
  12. package/package/components/EditableSchemaForm.svelte.d.ts +9 -0
  13. package/package/components/FirstStepInputs.svelte +3 -1
  14. package/package/components/FlowPreviewContent.svelte +46 -45
  15. package/package/components/HistoricInputs.svelte +2 -0
  16. package/package/components/InstanceSettings.svelte +5 -1
  17. package/package/components/Range.svelte +5 -4
  18. package/package/components/Range.svelte.d.ts +2 -0
  19. package/package/components/RunFormAdvancedPopup.svelte +2 -2
  20. package/package/components/SavedInputsPicker.svelte +6 -0
  21. package/package/components/SchemaForm.svelte +70 -4
  22. package/package/components/SchemaForm.svelte.d.ts +11 -0
  23. package/package/components/ScriptBuilder.svelte +9 -1
  24. package/package/components/ScriptEditor.svelte.d.ts +2 -2
  25. package/package/components/ScriptPicker.svelte.d.ts +1 -1
  26. package/package/components/SimpleEditor.svelte +3 -1
  27. package/package/components/TestConnection.svelte +1 -1
  28. package/package/components/WorkerGroup.svelte +21 -0
  29. package/package/components/WorkerTagPicker.svelte +2 -2
  30. package/package/components/WorkerTagSelect.svelte +2 -2
  31. package/package/components/apps/components/display/table/AppAggridTable.svelte +3 -1
  32. package/package/components/apps/editor/component/components.d.ts +79 -79
  33. package/package/components/details/EmailTriggerConfigSection.svelte.d.ts +1 -1
  34. package/package/components/flows/content/FlowEditorPanel.svelte +2 -2
  35. package/package/components/flows/content/FlowInput.svelte +193 -130
  36. package/package/components/flows/content/FlowInputEditor.svelte +12 -36
  37. package/package/components/flows/content/FlowInputEditor.svelte.d.ts +1 -5
  38. package/package/components/flows/content/FlowInputsQuick.svelte.d.ts +1 -1
  39. package/package/components/flows/content/FlowModuleWorkerTagSelect.svelte +2 -2
  40. package/package/components/flows/flowStateUtils.d.ts +1 -2
  41. package/package/components/flows/flowStateUtils.js +1 -1
  42. package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte.d.ts +1 -1
  43. package/package/components/meltComponents/SideBarTab.svelte +60 -0
  44. package/package/components/meltComponents/SideBarTab.svelte.d.ts +24 -0
  45. package/package/components/runs/NoWorkerWithTagWarning.svelte +5 -1
  46. package/package/components/schema/AddProperty.svelte +3 -1
  47. package/package/components/schema/AddPropertyV2.svelte +5 -8
  48. package/package/components/schema/AddPropertyV2.svelte.d.ts +3 -0
  49. package/package/components/schema/EditableSchemaDrawer.svelte +12 -3
  50. package/package/components/schema/EditableSchemaWrapper.svelte +5 -0
  51. package/package/components/schema/SchemaFormDND.svelte +25 -9
  52. package/package/components/schema/SchemaFormDND.svelte.d.ts +12 -0
  53. package/package/components/schema/schemaUtils.d.ts +26 -0
  54. package/package/components/schema/schemaUtils.js +185 -0
  55. package/package/components/settings/PremiumInfo.svelte +212 -30
  56. package/package/components/triggers/CaptureSection.svelte.d.ts +1 -1
  57. package/package/components/triggers/CaptureTable.svelte +10 -2
  58. package/package/components/triggers/CaptureWrapper.svelte +2 -1
  59. package/package/components/triggers/KafkaTriggersConfigSection.svelte.d.ts +1 -1
  60. package/package/components/triggers/NatsTriggersConfigSection.svelte.d.ts +1 -1
  61. package/package/components/triggers/RouteEditorConfigSection.svelte +3 -2
  62. package/package/components/triggers/RouteEditorConfigSection.svelte.d.ts +2 -1
  63. package/package/components/triggers/RoutesPanel.svelte +2 -0
  64. package/package/components/triggers/RoutesPanel.svelte.d.ts +1 -0
  65. package/package/components/triggers/TriggersEditor.svelte +3 -1
  66. package/package/components/triggers/TriggersEditor.svelte.d.ts +1 -0
  67. package/package/components/triggers/TriggersEditorSection.svelte +0 -1
  68. package/package/components/triggers/TriggersWrapper.svelte +1 -1
  69. package/package/components/triggers/WebhooksConfigSection.svelte +9 -9
  70. package/package/components/triggers/WebhooksConfigSection.svelte.d.ts +2 -2
  71. package/package/components/triggers/WebhooksPanel.svelte +2 -2
  72. package/package/components/triggers/WebhooksPanel.svelte.d.ts +1 -1
  73. package/package/components/triggers/WebsocketEditorConfigSection.svelte.d.ts +1 -1
  74. package/package/gen/core/OpenAPI.js +1 -1
  75. package/package/gen/schemas.gen.d.ts +2 -2
  76. package/package/gen/schemas.gen.js +2 -2
  77. package/package/gen/services.gen.d.ts +22 -2
  78. package/package/gen/services.gen.js +44 -2
  79. package/package/gen/types.gen.d.ts +62 -2
  80. package/package/script_helpers.d.ts +1 -1
  81. package/package/script_helpers.js +7 -7
  82. package/package.json +11 -3
@@ -4,6 +4,7 @@ import type ItemPicker from './ItemPicker.svelte';
4
4
  import SimpleEditor from './SimpleEditor.svelte';
5
5
  import type VariableEditor from './VariableEditor.svelte';
6
6
  import type { Script } from '../gen';
7
+ import type { SchemaDiff } from './schema/schemaUtils';
7
8
  declare const __propDef: {
8
9
  props: {
9
10
  label?: string | undefined;
@@ -69,11 +70,21 @@ declare const __propDef: {
69
70
  } | undefined;
70
71
  otherArgs?: Record<string, any> | undefined;
71
72
  lightHeader?: boolean | undefined;
73
+ diffStatus?: SchemaDiff | undefined;
74
+ hideNested?: boolean | undefined;
75
+ nestedParent?: {
76
+ label: string;
77
+ nestedParent: any | undefined;
78
+ } | undefined;
79
+ nestedClasses?: string | undefined;
72
80
  focus?: (() => void) | undefined;
73
81
  };
74
82
  events: {
75
83
  focus: CustomEvent<any>;
76
84
  blur: CustomEvent<any>;
85
+ nestedChange: CustomEvent<any>;
86
+ acceptChange: CustomEvent<any>;
87
+ rejectChange: CustomEvent<any>;
77
88
  change: CustomEvent<any>;
78
89
  } & {
79
90
  [evt: string]: CustomEvent<any>;
@@ -5,6 +5,7 @@ import AssignableTagsInner from './AssignableTagsInner.svelte';
5
5
  export let placement = 'bottom-end';
6
6
  export let color = 'dark';
7
7
  export let disabled = false;
8
+ export let showWorkspaceRestriction = false;
8
9
  </script>
9
10
 
10
11
  <Popup
@@ -24,5 +25,5 @@ export let disabled = false;
24
25
  >
25
26
  </Button>
26
27
  </svelte:fragment>
27
- <AssignableTagsInner on:refresh />
28
+ <AssignableTagsInner {showWorkspaceRestriction} on:refresh />
28
29
  </Popup>
@@ -4,6 +4,7 @@ declare const __propDef: {
4
4
  placement?: "top-end" | "bottom-end" | undefined;
5
5
  color?: "dark" | "nord" | undefined;
6
6
  disabled?: boolean | undefined;
7
+ showWorkspaceRestriction?: boolean | undefined;
7
8
  };
8
9
  events: {
9
10
  refresh: CustomEvent<any>;
@@ -7,11 +7,15 @@ import NoWorkerWithTagWarning from './runs/NoWorkerWithTagWarning.svelte';
7
7
  import { CUSTOM_TAGS_SETTING } from '../consts';
8
8
  import { base } from '../base';
9
9
  import { createEventDispatcher } from 'svelte';
10
+ export let showWorkspaceRestriction = false;
10
11
  let newTag = '';
11
12
  let customTags = undefined;
12
13
  async function loadCustomTags() {
13
14
  try {
14
- customTags = (await WorkerService.getCustomTags()) ?? [];
15
+ customTags =
16
+ (await WorkerService.getCustomTags({
17
+ showWorkspaceRestriction
18
+ })) ?? [];
15
19
  }
16
20
  catch (err) {
17
21
  sendUserToast(`Could not load global cache: ${err}`, true);
@@ -1,6 +1,8 @@
1
1
  import { SvelteComponent } from "svelte";
2
2
  declare const __propDef: {
3
- props: Record<string, never>;
3
+ props: {
4
+ showWorkspaceRestriction?: boolean | undefined;
5
+ };
4
6
  events: {
5
7
  refresh: CustomEvent<any>;
6
8
  } & {
@@ -15,6 +15,7 @@ import Toggle from './Toggle.svelte';
15
15
  import { ExternalLink, Plus } from 'lucide-svelte';
16
16
  export let snowflakeAccountIdentifier = '';
17
17
  export let oauths = {};
18
+ export let requirePreexistingUserForOauth = false;
18
19
  const windmillBuiltins = [
19
20
  'github',
20
21
  'gitlab',
@@ -39,7 +40,6 @@ let oauth_name = undefined;
39
40
  let clientName = '';
40
41
  let resourceName = '';
41
42
  let tab = 'sso';
42
- let requirePreexistingUserForOauth = false;
43
43
  </script>
44
44
 
45
45
  <div>
@@ -3,6 +3,7 @@ declare const __propDef: {
3
3
  props: {
4
4
  snowflakeAccountIdentifier?: string | undefined;
5
5
  oauths?: Record<string, any> | undefined;
6
+ requirePreexistingUserForOauth?: boolean | undefined;
6
7
  };
7
8
  events: {
8
9
  [evt: string]: CustomEvent<any>;
@@ -38,6 +38,9 @@ export let editTab;
38
38
  export let previewSchema = undefined;
39
39
  export let editPanelInitialSize = undefined;
40
40
  export let editPanelSize = 0;
41
+ export let diff = {};
42
+ export let disableDnd = false;
43
+ export let shouldDispatchChanges = false;
41
44
  const dispatch = createEventDispatcher();
42
45
  let clazz = '';
43
46
  export { clazz as class };
@@ -193,6 +196,10 @@ $: updatePanelSizes($editPanelSizeSmooth, $inputPanelSizeSmooth);
193
196
  $: !!editTab ? openEditTab() : closeEditTab();
194
197
  let pannelButtonWidth = 0;
195
198
  export let pannelExtraButtonWidth = 0;
199
+ export function updateJson() {
200
+ schemaString = JSON.stringify(schema, null, '\t');
201
+ editor?.setCode(schemaString);
202
+ }
196
203
  </script>
197
204
 
198
205
  <div class="w-full h-full">
@@ -208,37 +215,60 @@ export let pannelExtraButtonWidth = 0;
208
215
  <Splitpanes class="splitter-hidden w-full">
209
216
  {#if !noPreview}
210
217
  <Pane bind:size={inputPanelSize} minSize={20}>
211
- <div class="flex flex-col pr-2 gap-2">
218
+ <div
219
+ class="h-full flex flex-col gap-2 {$$slots.openEditTab && editPanelSize > 0
220
+ ? 'pr-[38px]'
221
+ : 'pr-2'}"
222
+ >
212
223
  {#if $$slots.addProperty}
213
- <div class="w-full justify-left pr-2">
214
- <div style={`width: calc(100% - ${pannelButtonWidth - pannelExtraButtonWidth}px);`}>
224
+ <div class="w-full justify-left pr-2 grow-0">
225
+ <div
226
+ style={editPanelSize > 0
227
+ ? `width: 100%;`
228
+ : `width: calc(100% - ${pannelButtonWidth - pannelExtraButtonWidth}px);`}
229
+ >
215
230
  <slot name="addProperty" />
216
231
  </div>
217
232
  </div>
218
233
  {/if}
219
234
 
220
- <SchemaFormDnd
221
- schema={previewSchema ? previewSchema : schema}
222
- {dndType}
223
- bind:args
224
- on:click={(e) => {
225
- opened = e.detail
226
- }}
227
- on:reorder={(e) => {
228
- schema.order = e.detail
229
- schema = schema
230
- dispatch('change', schema)
231
- }}
232
- on:change={() => {
233
- schema = schema
234
- dispatch('change', schema)
235
- }}
236
- {lightweightMode}
237
- prettifyHeader={isAppInput}
238
- disabled={!!previewSchema}
239
- />
235
+ <div
236
+ class="min-h-0 overflow-y-auto grow rounded-md {$$slots.runButton
237
+ ? 'flex flex-col gap-2'
238
+ : ''}"
239
+ >
240
+ <SchemaFormDnd
241
+ nestedClasses={'flex flex-col gap-1'}
242
+ schema={previewSchema ? previewSchema : schema}
243
+ {dndType}
244
+ {disableDnd}
245
+ bind:args
246
+ on:click={(e) => {
247
+ opened = e.detail
248
+ }}
249
+ on:reorder={(e) => {
250
+ schema.order = e.detail
251
+ schema = schema
252
+ dispatch('change', schema)
253
+ }}
254
+ on:change={() => {
255
+ schema = schema
256
+ dispatch('change', schema)
257
+ }}
258
+ {lightweightMode}
259
+ prettifyHeader={isAppInput}
260
+ disabled={!!previewSchema}
261
+ {diff}
262
+ on:acceptChange
263
+ on:rejectChange
264
+ on:nestedChange={() => {
265
+ dispatch('change', schema)
266
+ }}
267
+ {shouldDispatchChanges}
268
+ />
240
269
 
241
- <slot name="runButton" />
270
+ <slot name="runButton" />
271
+ </div>
242
272
  </div>
243
273
  </Pane>
244
274
  {/if}
@@ -386,7 +416,6 @@ export let pannelExtraButtonWidth = 0;
386
416
  {isAppInput}
387
417
  on:change={() => {
388
418
  schema = schema
389
- // console.log('schema', schema)
390
419
  dispatch('change', schema)
391
420
  }}
392
421
  >
@@ -401,8 +430,6 @@ export let pannelExtraButtonWidth = 0;
401
430
  const isS3 = e.detail == 'S3'
402
431
  const isOneOf = e.detail == 'oneOf'
403
432
 
404
- selected = e.detail
405
-
406
433
  const emptyProperty = {
407
434
  contentEncoding: undefined,
408
435
  enum_: undefined,
@@ -469,8 +496,12 @@ export let pannelExtraButtonWidth = 0;
469
496
  type: e.detail
470
497
  }
471
498
  }
472
- schema = schema
473
- dispatch('change', schema)
499
+ // No better solution than this, needs future rework
500
+ setTimeout(() => {
501
+ schema = schema
502
+ dispatch('change', schema)
503
+ }, 100)
504
+ dispatch('schemaChange')
474
505
  }}
475
506
  >
476
507
  {#each [['String', 'string'], ['Number', 'number'], ['Integer', 'integer'], ['Object', 'object'], ['OneOf', 'oneOf'], ['Array', 'array'], ['Boolean', 'boolean'], ['S3 Object', 'S3']] as x}
@@ -519,6 +550,7 @@ export let pannelExtraButtonWidth = 0;
519
550
  on:schemaChange={(e) => {
520
551
  schema = schema
521
552
  dispatch('change', schema)
553
+ dispatch('schemaChange')
522
554
  }}
523
555
  />
524
556
  {/if}
@@ -1,5 +1,6 @@
1
1
  import { SvelteComponent } from "svelte";
2
2
  import type { Schema } from '../common';
3
+ import type { SchemaDiff } from './schema/schemaUtils';
3
4
  declare const __propDef: {
4
5
  props: {
5
6
  schema: Schema | any;
@@ -20,16 +21,23 @@ declare const __propDef: {
20
21
  previewSchema?: Record<string, any> | undefined;
21
22
  editPanelInitialSize?: number | undefined;
22
23
  editPanelSize?: number | undefined;
24
+ diff?: Record<string, SchemaDiff> | undefined;
25
+ disableDnd?: boolean | undefined;
26
+ shouldDispatchChanges?: boolean | undefined;
23
27
  class?: string | undefined;
24
28
  setDefaults?: (() => void) | undefined;
25
29
  openField?: ((key: string) => void) | undefined;
26
30
  deleteField?: ((key: string) => void) | undefined;
27
31
  pannelExtraButtonWidth?: number | undefined;
32
+ updateJson?: (() => void) | undefined;
28
33
  };
29
34
  events: {
35
+ acceptChange: CustomEvent<any>;
36
+ rejectChange: CustomEvent<any>;
30
37
  click: MouseEvent;
31
38
  change: CustomEvent<any>;
32
39
  delete: CustomEvent<any>;
40
+ schemaChange: CustomEvent<any>;
33
41
  editPanelSizeChanged: CustomEvent<any>;
34
42
  } & {
35
43
  [evt: string]: CustomEvent<any>;
@@ -48,5 +56,6 @@ export default class EditableSchemaForm extends SvelteComponent<EditableSchemaFo
48
56
  get setDefaults(): () => void;
49
57
  get openField(): (key: string) => void;
50
58
  get deleteField(): (key: string) => void;
59
+ get updateJson(): () => void;
51
60
  }
52
61
  export {};
@@ -24,7 +24,7 @@ async function loadSchema() {
24
24
  error = e;
25
25
  }
26
26
  }
27
- loadSchema();
27
+ $: $flowStore && $flowStateStore && loadSchema();
28
28
  function handleClick() {
29
29
  selected = !selected;
30
30
  dispatch('select', selected ? schema : undefined);
@@ -41,6 +41,8 @@ function handleKeydown(event) {
41
41
  if (event.key === 'Escape' && selected) {
42
42
  selected = false;
43
43
  dispatch('select', undefined);
44
+ event.stopPropagation();
45
+ event.preventDefault();
44
46
  }
45
47
  }
46
48
  let firstUpdate = true;
@@ -26,6 +26,7 @@ let selectedJobStepType = 'single';
26
26
  let isRunning = false;
27
27
  let jobProgressReset;
28
28
  export function test() {
29
+ renderCount++;
29
30
  runPreview($previewArgs, undefined);
30
31
  }
31
32
  const { selectedId, previewArgs, flowStateStore, flowStore, pathStore, initialPath, customUi, executionCount } = getContext('FlowEditorContext');
@@ -126,53 +127,53 @@ let selectedCapture = undefined;
126
127
  on:close={captureLibraryDrawer?.toggleDrawer}
127
128
  >
128
129
  <div class="h-full flex flex-col gap-2">
129
- <CapturesInputs
130
- flowPath={$pathStore}
131
- headless={false}
132
- addButton={true}
133
- on:select={(e) => {
134
- selectedCapture = e.detail
135
- }}
136
- on:openTriggers={(e) => {
137
- dispatch('openTriggers', e.detail)
138
- captureLibraryDrawer?.closeDrawer()
139
- }}
140
- />
130
+ <div class="min-h-0 grow h-full">
131
+ <CapturesInputs
132
+ flowPath={$pathStore}
133
+ headless={false}
134
+ addButton={true}
135
+ on:select={(e) => {
136
+ selectedCapture = e.detail
137
+ }}
138
+ on:openTriggers={(e) => {
139
+ dispatch('openTriggers', e.detail)
140
+ captureLibraryDrawer?.closeDrawer()
141
+ }}
142
+ />
143
+ </div>
141
144
 
142
- <div class="h-full overflow-hidden min-h-0 flex flex-col justify-between">
143
- <div class="w-full flex flex-col min-h-0 gap-2 px-2 py-2 grow">
144
- <div class="w-full flex flex-col">
145
- <Button
146
- color="blue"
147
- btnClasses="w-full"
148
- size="sm"
149
- spacingSize="xl"
150
- on:click={async () => {
151
- $previewArgs = JSON.parse(JSON.stringify(selectedCapture))
152
- captureLibraryDrawer?.closeDrawer()
153
- renderCount++
154
- }}
155
- disabled={!selectedCapture}
145
+ <div class="w-full flex flex-col gap-2 px-2 py-2 h-[50%]">
146
+ <div class="w-full flex flex-col">
147
+ <Button
148
+ color="blue"
149
+ btnClasses="w-full"
150
+ size="sm"
151
+ spacingSize="xl"
152
+ on:click={async () => {
153
+ $previewArgs = JSON.parse(JSON.stringify(selectedCapture))
154
+ captureLibraryDrawer?.closeDrawer()
155
+ renderCount++
156
+ }}
157
+ disabled={!selectedCapture}
158
+ >
159
+ <ArrowLeftIcon class="w-4 h-4 mr-2" />
160
+ Use input
161
+ </Button>
162
+ </div>
163
+ <div class="w-full min-h-0 grow overflow-auto">
164
+ {#if typeof selectedCapture == 'string' && selectedCapture == 'WINDMILL_TOO_BIG'}
165
+ <div class="text-secondary mt-2">
166
+ Payload too big to preview but can still be loaded</div
156
167
  >
157
- <ArrowLeftIcon class="w-4 h-4 mr-2" />
158
- Use input
159
- </Button>
160
- </div>
161
- <div class="w-full min-h-0 grow overflow-auto">
162
- {#if typeof selectedCapture == 'string' && selectedCapture == 'WINDMILL_TOO_BIG'}
163
- <div class="text-secondary mt-2">
164
- Payload too big to preview but can still be loaded</div
165
- >
166
- {:else if Object.keys(selectedCapture || {}).length > 0}
167
- <div class=" overflow-auto h-full p-2">
168
- <ObjectViewer json={selectedCapture} />
169
- </div>
170
- {:else}
171
- <div class="text-center text-tertiary">
172
- Select an Input to preview scripts arguments
173
- </div>
174
- {/if}
175
- </div>
168
+ {:else if Object.keys(selectedCapture || {}).length > 0}
169
+ <div class=" overflow-auto h-full p-2">
170
+ <ObjectViewer json={selectedCapture} />
171
+ </div>
172
+ {:else}
173
+ <div class="text-center text-tertiary">
174
+ Select an Input to preview scripts arguments
175
+ </div>
176
+ {/if}
176
177
  </div>
177
178
  </div>
178
179
  </div>
@@ -81,6 +81,8 @@ function handleKeydown(event) {
81
81
  if (event.key === 'Escape' && selected) {
82
82
  selected = undefined;
83
83
  dispatch('select', undefined);
84
+ event.stopPropagation();
85
+ event.preventDefault();
84
86
  }
85
87
  }
86
88
  function handleError(e) {
@@ -238,7 +238,11 @@ async function sendStats() {
238
238
  >
239
239
  {/if}
240
240
  {:else if category == 'Auth/OAuth'}
241
- <AuthSettings bind:oauths bind:snowflakeAccountIdentifier>
241
+ <AuthSettings
242
+ bind:oauths
243
+ bind:snowflakeAccountIdentifier
244
+ bind:requirePreexistingUserForOauth
245
+ >
242
246
  <svelte:fragment slot="scim">
243
247
  <div class="flex-col flex gap-2 pb-4">
244
248
  {#each scimSamlSetting as setting}
@@ -5,6 +5,8 @@ export let initialValue = 0;
5
5
  export let value = typeof initialValue === 'string' ? parseInt(initialValue) : initialValue;
6
6
  export let disabled = false;
7
7
  export let defaultValue = undefined;
8
+ export let format = (v) => `${v}`;
9
+ export let hideInput = false;
8
10
  let step = 1;
9
11
  let slider;
10
12
  function calculateAxisStep(min, max) {
@@ -15,9 +17,6 @@ $: if (value === null) {
15
17
  value = 0;
16
18
  }
17
19
  $: axisStep = calculateAxisStep(min, max);
18
- const format = (v, i, p) => {
19
- return `${v}`;
20
- };
21
20
  function handleKeyDown(event) {
22
21
  if (disabled)
23
22
  return;
@@ -75,7 +74,9 @@ $: handleWidth = `${Math.max(max.toString().length ?? 2, 2)}em`;
75
74
  {/if}
76
75
  </div>
77
76
 
78
- <input bind:value type="number" class="!w-16 h-8 !text-xs mb-6" {max} {min} {disabled} />
77
+ {#if !hideInput}
78
+ <input bind:value type="number" class="!w-16 h-8 !text-xs mb-6" {max} {min} {disabled} />
79
+ {/if}
79
80
  </div>
80
81
 
81
82
  <style>
@@ -7,6 +7,8 @@ declare const __propDef: {
7
7
  value?: number | undefined;
8
8
  disabled?: boolean | undefined;
9
9
  defaultValue?: number | undefined;
10
+ format?: ((value: number) => string) | undefined;
11
+ hideInput?: boolean | undefined;
10
12
  };
11
13
  events: {
12
14
  pointerdown: PointerEvent;
@@ -3,7 +3,7 @@ import Label from './Label.svelte';
3
3
  import CloseButton from './common/CloseButton.svelte';
4
4
  import Toggle from './Toggle.svelte';
5
5
  import Tooltip from './Tooltip.svelte';
6
- import { userStore, workerTags } from '../stores';
6
+ import { userStore, workerTags, workspaceStore } from '../stores';
7
7
  import { Button } from './common';
8
8
  import { WorkerService } from '../gen';
9
9
  import DateTimeInput from './DateTimeInput.svelte';
@@ -14,7 +14,7 @@ export let overrideTag;
14
14
  loadWorkerGroups();
15
15
  async function loadWorkerGroups() {
16
16
  if (!$workerTags) {
17
- $workerTags = await WorkerService.getCustomTags();
17
+ $workerTags = await WorkerService.getCustomTags({ workspace: $workspaceStore });
18
18
  }
19
19
  }
20
20
  </script>
@@ -97,16 +97,22 @@ async function getPropPickerElements() {
97
97
  function handleKeydown(event) {
98
98
  if (event.key === 'Escape' && isEditing) {
99
99
  setEditing(null);
100
+ event.stopPropagation();
101
+ event.preventDefault();
100
102
  }
101
103
  else if (event.key === 'Escape' && selectedInput) {
102
104
  selectedInput = null;
103
105
  selectedArgs = undefined;
104
106
  dispatch('select', undefined);
107
+ event.stopPropagation();
108
+ event.preventDefault();
105
109
  }
106
110
  if (event.key === 'Enter' && isEditing) {
107
111
  updateInput(isEditing).then(() => {
108
112
  setEditing(null);
109
113
  });
114
+ event.stopPropagation();
115
+ event.preventDefault();
110
116
  }
111
117
  }
112
118
  function setEditing(input) {
@@ -38,6 +38,10 @@ export let dndConfig = undefined;
38
38
  export let items = undefined;
39
39
  export let helperScript = undefined;
40
40
  export let lightHeader = false;
41
+ export let diff = {};
42
+ export let nestedParent = undefined;
43
+ export let shouldDispatchChanges = false;
44
+ export let nestedClasses = '';
41
45
  const dispatch = createEventDispatcher();
42
46
  let inputCheck = {};
43
47
  $: if (args == undefined || typeof args !== 'object') {
@@ -136,7 +140,9 @@ $: isValid = allTrue(inputCheck ?? {});
136
140
  {/if}
137
141
 
138
142
  <div
139
- class="w-full {$$props.class} {flexWrap ? 'flex flex-row flex-wrap gap-x-6 ' : ''}"
143
+ class="w-full {$$props.class} {flexWrap
144
+ ? 'flex flex-row flex-wrap gap-x-6 '
145
+ : ''} {nestedClasses}"
140
146
  use:dragHandleZone={dndConfig ?? { items: [], dragDisabled: true }}
141
147
  on:finalize
142
148
  on:consider
@@ -144,12 +150,61 @@ $: isValid = allTrue(inputCheck ?? {});
144
150
  {#if keys.length > 0}
145
151
  {#each fields as item, i (item.id)}
146
152
  {@const argName = item.value}
147
- <div>
153
+ <div
154
+ class={typeof diff[argName] === 'object' && diff[argName].diff !== 'same'
155
+ ? 'bg-red-300 dark:bg-red-800 rounded-md'
156
+ : ''}
157
+ >
148
158
  <!-- svelte-ignore a11y-click-events-have-key-events -->
149
159
  {#if !schemaSkippedValues.includes(argName) && keys.includes(argName)}
160
+ {#if typeof diff[argName] === 'object' && diff[argName].oldSchema}
161
+ {@const formerProperty = diff[argName].oldSchema}
162
+ <ArgInput
163
+ {disablePortal}
164
+ {resourceTypes}
165
+ {prettifyHeader}
166
+ autofocus={i == 0 && autofocus ? true : null}
167
+ label={argName}
168
+ description={formerProperty?.description}
169
+ value={args[argName]}
170
+ type={formerProperty?.type}
171
+ oneOf={formerProperty?.oneOf}
172
+ required={formerProperty?.required}
173
+ pattern={formerProperty?.pattern}
174
+ valid={inputCheck[argName]}
175
+ defaultValue={structuredClone(formerProperty?.default)}
176
+ enum_={formerProperty?.enum}
177
+ format={formerProperty?.format}
178
+ contentEncoding={formerProperty?.contentEncoding}
179
+ customErrorMessage={formerProperty?.customErrorMessage}
180
+ properties={formerProperty?.properties}
181
+ order={formerProperty?.order}
182
+ nestedRequired={formerProperty?.required}
183
+ itemsType={formerProperty?.items}
184
+ disabled={disabledArgs.includes(argName) || disabled || formerProperty?.disabled}
185
+ {compact}
186
+ {variableEditor}
187
+ {itemPicker}
188
+ {pickForField}
189
+ password={linkedSecret == argName}
190
+ extra={formerProperty}
191
+ {showSchemaExplorer}
192
+ simpleTooltip={schemaFieldTooltip[argName]}
193
+ {onlyMaskPassword}
194
+ nullable={formerProperty?.nullable}
195
+ title={formerProperty?.title}
196
+ placeholder={formerProperty?.placeholder}
197
+ orderEditable={dndConfig != undefined}
198
+ otherArgs={args}
199
+ {helperScript}
200
+ {lightHeader}
201
+ hideNested={typeof diff[argName].diff === 'object'}
202
+ diffStatus={undefined}
203
+ />
204
+ {/if}
150
205
  <!-- svelte-ignore a11y-no-static-element-interactions -->
151
206
  <div
152
- class="flex flex-row items-center bg-surface"
207
+ class="flex flex-row items-center"
153
208
  on:click={() => {
154
209
  dispatch('click', argName)
155
210
  }}
@@ -214,7 +269,14 @@ $: isValid = allTrue(inputCheck ?? {});
214
269
  </LightweightArgInput>
215
270
  {:else}
216
271
  <ArgInput
217
- on:change={() => dispatch('change')}
272
+ on:change={() => {
273
+ dispatch('change')
274
+ }}
275
+ on:nestedChange={() => {
276
+ dispatch('nestedChange')
277
+ }}
278
+ on:acceptChange={(e) => dispatch('acceptChange', e.detail)}
279
+ on:rejectChange={(e) => dispatch('rejectChange', e.detail)}
218
280
  {disablePortal}
219
281
  {resourceTypes}
220
282
  {prettifyHeader}
@@ -255,6 +317,10 @@ $: isValid = allTrue(inputCheck ?? {});
255
317
  otherArgs={args}
256
318
  {helperScript}
257
319
  {lightHeader}
320
+ diffStatus={diff[argName] ?? undefined}
321
+ {nestedParent}
322
+ {shouldDispatchChanges}
323
+ {nestedClasses}
258
324
  >
259
325
  <svelte:fragment slot="actions">
260
326
  <slot name="actions" />
@@ -2,6 +2,7 @@ import { SvelteComponent } from "svelte";
2
2
  import type { Schema } from '../common';
3
3
  import { type Script } from '../gen';
4
4
  import { type Options as DndOptions } from '@windmill-labs/svelte-dnd-action';
5
+ import type { SchemaDiff } from './schema/schemaUtils';
5
6
  declare const __propDef: {
6
7
  props: {
7
8
  [x: string]: any;
@@ -41,6 +42,13 @@ declare const __propDef: {
41
42
  hash: string;
42
43
  } | undefined;
43
44
  lightHeader?: boolean | undefined;
45
+ diff?: Record<string, SchemaDiff> | undefined;
46
+ nestedParent?: {
47
+ label: string;
48
+ nestedParent: any | undefined;
49
+ } | undefined;
50
+ shouldDispatchChanges?: boolean | undefined;
51
+ nestedClasses?: string | undefined;
44
52
  setDefaults?: (() => void) | undefined;
45
53
  };
46
54
  events: {
@@ -48,6 +56,9 @@ declare const __propDef: {
48
56
  consider: Event | ClipboardEvent | CompositionEvent | UIEvent | FocusEvent | InputEvent | SubmitEvent | FormDataEvent | KeyboardEvent | MouseEvent | DragEvent | TouchEvent | PointerEvent | WheelEvent | AnimationEvent | TransitionEvent | ErrorEvent | ProgressEvent<EventTarget> | SecurityPolicyViolationEvent;
49
57
  click: CustomEvent<any>;
50
58
  change: CustomEvent<any>;
59
+ nestedChange: CustomEvent<any>;
60
+ acceptChange: CustomEvent<any>;
61
+ rejectChange: CustomEvent<any>;
51
62
  } & {
52
63
  [evt: string]: CustomEvent<any>;
53
64
  };