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
@@ -17,7 +17,7 @@ declare const __propDef: {
17
17
  events: {
18
18
  captureToggle: CustomEvent<undefined>;
19
19
  applyArgs: CustomEvent<{
20
- kind: "main" | "preprocessor";
20
+ kind: "preprocessor" | "main";
21
21
  args: Record<string, any> | undefined;
22
22
  }>;
23
23
  updateSchema: CustomEvent<{
@@ -71,8 +71,7 @@ onMount(() => {
71
71
  on:applyArgs
72
72
  on:addPreprocessor={async () => {
73
73
  await insertNewPreprocessorModule(flowStore, flowStateStore, {
74
- language: 'bun',
75
- subkind: 'preprocessor'
74
+ language: 'bun'
76
75
  })
77
76
  $selectedId = 'preprocessor'
78
77
  }}
@@ -88,6 +87,7 @@ onMount(() => {
88
87
  }
89
88
  }}
90
89
  on:testWithArgs
90
+ args={$previewArgs}
91
91
  currentPath={$pathStore}
92
92
  {initialPath}
93
93
  schema={$flowStore.schema}
@@ -1,6 +1,6 @@
1
1
  <script>import { Button } from '../../common';
2
2
  import { ButtonType } from '../../common/button/model';
3
- import { getContext } from 'svelte';
3
+ import { getContext, tick } from 'svelte';
4
4
  import FlowCard from '../common/FlowCard.svelte';
5
5
  import Drawer from '../../common/drawer/Drawer.svelte';
6
6
  import SimpleEditor from '../../SimpleEditor.svelte';
@@ -12,14 +12,15 @@ import FlowInputViewer from '../../FlowInputViewer.svelte';
12
12
  import HistoricInputs from '../../HistoricInputs.svelte';
13
13
  import SavedInputsPicker from '../../SavedInputsPicker.svelte';
14
14
  import FirstStepInputs from '../../FirstStepInputs.svelte';
15
- import { CornerDownLeft, Pen, ChevronRight, ChevronDown, Plus, History, Braces, Code, Save, X } from 'lucide-svelte';
15
+ import { CornerDownLeft, Pen, ChevronRight, Plus, History, Braces, Code, Save, X, Check } from 'lucide-svelte';
16
16
  import CaptureIcon from '../../triggers/CaptureIcon.svelte';
17
17
  import FlowPreviewContent from '../../FlowPreviewContent.svelte';
18
18
  import FlowInputEditor from './FlowInputEditor.svelte';
19
19
  import CapturesInputs from '../../CapturesInputs.svelte';
20
20
  import { twMerge } from 'tailwind-merge';
21
- import ButtonDropDown from '../../meltComponents/ButtonDropDown.svelte';
22
21
  import CaptureButton from '../../triggers/CaptureButton.svelte';
22
+ import { getFullPath, setNestedProperty, getNestedProperty, schemaFromDiff, computeDiff, applyDiff } from '../../schema/schemaUtils';
23
+ import SideBarTab from '../../meltComponents/SideBarTab.svelte';
23
24
  export let noEditor;
24
25
  export let disabled;
25
26
  const { flowStore, previewArgs, pathStore, initialPath, flowInputEditorState } = getContext('FlowEditorContext');
@@ -28,9 +29,13 @@ let addProperty = undefined;
28
29
  let previewSchema = undefined;
29
30
  let payloadData = undefined;
30
31
  let previewArguments = $previewArgs;
31
- let editOptionsOpen = false;
32
32
  let dropdownItems = [];
33
+ let diff = {};
33
34
  let editPanelSize = $flowInputEditorState?.editPanelSize ?? 0;
35
+ let selectedSchema = undefined;
36
+ let runDisabled = false;
37
+ let editableSchemaForm = undefined;
38
+ let savedPreviewArgs = undefined;
34
39
  function updateEditPanelSize(size) {
35
40
  if (!$flowInputEditorState)
36
41
  return;
@@ -50,7 +55,8 @@ const getDropdownItems = () => {
50
55
  },
51
56
  disabled: !$flowInputEditorState?.selectedTab ||
52
57
  $flowInputEditorState?.selectedTab === 'inputEditor',
53
- icon: Pen
58
+ icon: Pen,
59
+ selected: $flowInputEditorState?.selectedTab === 'inputEditor'
54
60
  },
55
61
  {
56
62
  label: 'Trigger captures',
@@ -58,7 +64,8 @@ const getDropdownItems = () => {
58
64
  handleEditSchema('captures');
59
65
  },
60
66
  disabled: $flowInputEditorState?.selectedTab === 'captures',
61
- icon: CaptureIcon
67
+ icon: CaptureIcon,
68
+ selected: $flowInputEditorState?.selectedTab === 'captures'
62
69
  },
63
70
  {
64
71
  label: 'History',
@@ -66,7 +73,8 @@ const getDropdownItems = () => {
66
73
  handleEditSchema('history');
67
74
  },
68
75
  disabled: $flowInputEditorState?.selectedTab === 'history',
69
- icon: History
76
+ icon: History,
77
+ selected: $flowInputEditorState?.selectedTab === 'history'
70
78
  },
71
79
  {
72
80
  label: 'Json payload',
@@ -74,14 +82,16 @@ const getDropdownItems = () => {
74
82
  handleEditSchema('json');
75
83
  },
76
84
  disabled: $flowInputEditorState?.selectedTab === 'json',
77
- icon: Braces
85
+ icon: Braces,
86
+ selected: $flowInputEditorState?.selectedTab === 'json'
78
87
  },
79
88
  {
80
89
  label: "First step's inputs",
81
90
  onClick: () => {
82
91
  handleEditSchema('firstStepInputs');
83
92
  },
84
- icon: Code
93
+ icon: Code,
94
+ selected: $flowInputEditorState?.selectedTab === 'firstStepInputs'
85
95
  },
86
96
  {
87
97
  label: 'Saved inputs',
@@ -89,9 +99,10 @@ const getDropdownItems = () => {
89
99
  handleEditSchema('savedInputs');
90
100
  },
91
101
  disabled: $flowInputEditorState?.selectedTab === 'savedInputs',
92
- icon: Save
102
+ icon: Save,
103
+ selected: $flowInputEditorState?.selectedTab === 'savedInputs'
93
104
  }
94
- ].filter((item) => !item.disabled);
105
+ ];
95
106
  };
96
107
  function handleEditSchema(editTab) {
97
108
  if (!$flowInputEditorState) {
@@ -107,7 +118,8 @@ function handleEditSchema(editTab) {
107
118
  $flowInputEditorState.selectedTab = undefined;
108
119
  }
109
120
  }
110
- function schemaFromPayload(payload) {
121
+ function schemaFromPayload(payloadData) {
122
+ const payload = structuredClone(payloadData);
111
123
  const parsed = JSON.parse(JSON.stringify(payload));
112
124
  if (!parsed) {
113
125
  sendUserToast('Invalid Schema', true);
@@ -130,76 +142,81 @@ function handleKeydown(event) {
130
142
  if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {
131
143
  runPreview();
132
144
  }
145
+ else if (event.key === 'Enter' && previewSchema && !preventEnter) {
146
+ applySchemaAndArgs();
147
+ connectFirstNode();
148
+ event.stopPropagation();
149
+ event.preventDefault();
150
+ }
133
151
  }
134
152
  function runPreview() {
135
153
  if (previewArguments) {
136
- $previewArgs = previewArguments;
154
+ $previewArgs = structuredClone(previewArguments);
137
155
  }
138
156
  previewOpen = true;
139
157
  flowPreviewContent?.test();
140
158
  }
141
159
  function updatePreviewSchemaAndArgs(payload) {
142
- payloadData = payload;
143
160
  if (!payload) {
161
+ payloadData = undefined;
162
+ selectedSchema = undefined;
144
163
  updatePreviewArguments(undefined);
145
- previewSchema = undefined;
164
+ updatePreviewSchema(undefined);
146
165
  return;
147
166
  }
148
- previewSchema = schemaFromPayload(payload);
149
- updatePreviewArguments(payload);
167
+ payloadData = structuredClone(payload);
168
+ selectedSchema = schemaFromPayload(payloadData);
169
+ updatePreviewSchema(selectedSchema);
170
+ updatePreviewArguments(payloadData);
150
171
  }
151
- function applySchemaAndArgs() {
152
- if (!previewSchema) {
172
+ async function updatePreviewSchema(newSchema) {
173
+ if (!newSchema) {
174
+ previewSchema = undefined;
175
+ if (runDisabled) {
176
+ await tick();
177
+ runDisabled = false;
178
+ }
179
+ diff = {};
153
180
  return;
154
181
  }
155
- $flowStore.schema = previewSchema;
182
+ diff = {};
183
+ const diffSchema = computeDiff(newSchema, $flowStore.schema);
184
+ diff = diffSchema;
185
+ previewSchema = schemaFromDiff(diffSchema, $flowStore.schema);
186
+ runDisabled = true;
187
+ }
188
+ async function applySchemaAndArgs() {
189
+ $flowStore.schema = applyDiff($flowStore.schema, diff);
156
190
  if (previewArguments) {
157
- $previewArgs = previewArguments;
191
+ savedPreviewArgs = structuredClone(previewArguments);
158
192
  }
159
- if ($flowInputEditorState) {
160
- $flowInputEditorState.selectedTab = undefined;
161
- }
162
- }
163
- function applySchema() {
164
- $flowStore.schema = previewSchema;
193
+ updatePreviewSchemaAndArgs(undefined);
165
194
  if ($flowInputEditorState) {
166
195
  $flowInputEditorState.selectedTab = undefined;
167
196
  }
168
197
  }
169
198
  function updatePreviewArguments(payloadData) {
170
199
  if (!payloadData) {
171
- previewArguments = $previewArgs;
200
+ previewArguments = savedPreviewArgs;
172
201
  return;
173
202
  }
174
- previewArguments = payloadData;
203
+ savedPreviewArgs = structuredClone(previewArguments);
204
+ previewArguments = structuredClone(payloadData);
175
205
  }
176
- let jsonValid = false;
177
206
  function updatePayloadFromJson(jsonInput) {
178
207
  if (jsonInput === undefined || jsonInput === null || jsonInput.trim() === '') {
179
208
  updatePreviewSchemaAndArgs(undefined);
180
- jsonValid = false;
181
209
  return;
182
210
  }
183
211
  try {
184
212
  const parsed = JSON.parse(jsonInput);
185
213
  updatePreviewSchemaAndArgs(parsed);
186
- jsonValid = true;
187
214
  }
188
215
  catch (error) {
189
216
  updatePreviewSchemaAndArgs(undefined);
190
- jsonValid = false;
191
217
  }
192
218
  }
193
219
  let tabButtonWidth = 0;
194
- const TAB_TITLES = {
195
- inputEditor: 'Input editor',
196
- captures: 'Captures',
197
- history: 'History',
198
- savedInputs: 'Saved inputs',
199
- json: 'JSON',
200
- firstStepInputs: 'First step',
201
- undefined: ''
202
- };
203
220
  let connectFirstNode = () => { };
204
221
  let init = false;
205
222
  function initPayloadData() {
@@ -211,6 +228,44 @@ function initPayloadData() {
211
228
  }
212
229
  $: $flowInputEditorState && ((dropdownItems = getDropdownItems()), initPayloadData());
213
230
  let preventEnter = false;
231
+ async function acceptChange(arg) {
232
+ handleChange(arg, $flowStore.schema, diff, (newSchema) => {
233
+ $flowStore.schema = newSchema;
234
+ });
235
+ }
236
+ async function rejectChange(arg) {
237
+ const revertDiff = computeDiff($flowStore.schema, selectedSchema);
238
+ handleChange(arg, selectedSchema, revertDiff, (newSchema) => {
239
+ selectedSchema = newSchema;
240
+ });
241
+ }
242
+ function handleChange(arg, currentSchema, diffSchema, updateCurrentSchema) {
243
+ if (!diff || !currentSchema) {
244
+ return;
245
+ }
246
+ const path = getFullPath(arg);
247
+ const parentPath = path.slice(0, -1);
248
+ const diffStatus = getNestedProperty({ diff: diffSchema }, path, 'diff');
249
+ const schema = getNestedProperty(currentSchema, parentPath, 'properties');
250
+ const localDiff = {
251
+ [arg.label]: diffStatus
252
+ };
253
+ const schemaUpdated = applyDiff(schema, localDiff);
254
+ if (parentPath.length > 0) {
255
+ setNestedProperty(currentSchema, parentPath, schemaUpdated);
256
+ }
257
+ else {
258
+ updateCurrentSchema(schemaUpdated);
259
+ }
260
+ diff = computeDiff(selectedSchema, $flowStore.schema);
261
+ previewSchema = schemaFromDiff(diff, $flowStore.schema);
262
+ }
263
+ function resetArgs() {
264
+ if (!previewSchema) {
265
+ previewArguments = undefined;
266
+ savedPreviewArgs = undefined;
267
+ }
268
+ }
214
269
  </script>
215
270
 
216
271
  <!-- Add svelte:window to listen for keyboard events -->
@@ -231,6 +286,7 @@ let preventEnter = false;
231
286
  {#if !disabled}
232
287
  <div class="py-2 px-4 h-full">
233
288
  <EditableSchemaForm
289
+ bind:this={editableSchemaForm}
234
290
  bind:schema={$flowStore.schema}
235
291
  isFlowInput
236
292
  on:edit={(e) => {
@@ -246,78 +302,84 @@ let preventEnter = false;
246
302
  bind:editPanelSize
247
303
  editPanelInitialSize={$flowInputEditorState?.editPanelSize}
248
304
  pannelExtraButtonWidth={$flowInputEditorState?.editPanelSize ? tabButtonWidth : 0}
305
+ {diff}
306
+ disableDnd={!!previewSchema}
307
+ on:rejectChange={(e) => {
308
+ rejectChange(e.detail).then(() => {
309
+ updatePreviewSchema(selectedSchema)
310
+ })
311
+ }}
312
+ on:acceptChange={(e) => {
313
+ acceptChange(e.detail).then(() => {
314
+ updatePreviewSchema(selectedSchema)
315
+ })
316
+ }}
317
+ shouldDispatchChanges={true}
318
+ on:change={() => {
319
+ previewArguments = previewArguments
320
+ if (!previewSchema) {
321
+ savedPreviewArgs = structuredClone(previewArguments)
322
+ }
323
+ }}
324
+ on:schemaChange={() => {
325
+ resetArgs()
326
+ }}
249
327
  >
250
328
  <svelte:fragment slot="openEditTab">
251
- <div
252
- class={twMerge(
253
- 'flex flex-row divide-x rounded-md bg-surface overflow-hidden',
254
- !!$flowInputEditorState?.selectedTab ? 'rounded-r-none' : '',
255
- ButtonType.ColorVariants.blue.divider
256
- )}
257
- >
258
- <button
259
- on:click={() => {
260
- handleEditSchema()
261
- }}
262
- title={!!$flowInputEditorState?.selectedTab
263
- ? 'Close input editor'
264
- : 'Open input editor'}
265
- class={ButtonType.ColorVariants.blue.contained}
266
- >
267
- <div class="p-2 center-center">
268
- <svelte:component
269
- this={!!$flowInputEditorState?.selectedTab ? ChevronRight : Pen}
270
- size={14}
271
- />
272
- </div>
273
- </button>
274
-
275
- <ButtonDropDown
276
- {dropdownItems}
277
- closeOnClick={true}
278
- bind:open={editOptionsOpen}
279
- placement="bottom-end"
280
- >
281
- <div
282
- class={twMerge(
283
- 'p-2 center-center hover:bg-surface-hover',
284
- ButtonType.ColorVariants.blue.contained,
285
- 'flex flex-row items-center rounded-br-md',
286
- 'transition-all duration-150 ease-in-out overflow-hidden whitespace-nowrap',
287
- !!$flowInputEditorState?.selectedTab ? 'w-[122px] px-3' : 'w-[30px]'
288
- )}
289
- bind:clientWidth={tabButtonWidth}
290
- >
291
- <div class="flex flex-row items-center gap-1 justify-between w-full">
292
- {#if !!$flowInputEditorState?.selectedTab}
293
- <h2 class="text-xs">{TAB_TITLES[$flowInputEditorState?.selectedTab]}</h2>
294
- {/if}
295
- <ChevronDown size={14} />
296
- </div>
297
- </div>
298
- </ButtonDropDown>
329
+ <div class={twMerge('flex flex-row divide-x', ButtonType.ColorVariants.blue.divider)}>
330
+ <SideBarTab {dropdownItems} fullMenu={!!$flowInputEditorState?.selectedTab}>
331
+ <svelte:fragment slot="close button">
332
+ <button
333
+ on:click={() => {
334
+ handleEditSchema()
335
+ }}
336
+ title={!!$flowInputEditorState?.selectedTab
337
+ ? 'Close input editor'
338
+ : 'Open input editor'}
339
+ class={twMerge(
340
+ ButtonType.ColorVariants.blue.contained,
341
+ !!$flowInputEditorState?.selectedTab
342
+ ? 'rounded-tl-md border-l border-t'
343
+ : 'rounded-md border'
344
+ )}
345
+ >
346
+ <div class="p-2 center-center">
347
+ <svelte:component
348
+ this={!!$flowInputEditorState?.selectedTab ? ChevronRight : Pen}
349
+ size={14}
350
+ />
351
+ </div>
352
+ </button>
353
+ </svelte:fragment>
354
+ </SideBarTab>
299
355
  </div>
300
356
  </svelte:fragment>
301
357
  <svelte:fragment slot="addProperty">
302
358
  {#if !!previewSchema}
303
- <div
304
- class={twMerge(
305
- 'bg-blue-50 border-blue-200 border dark:bg-blue-900/40 dark:border-blue-700/40 text-xs p-2 w-full flex flex-row gap-2 items-center justify-left rounded-md',
306
- 'text-blue-700 dark:text-blue-100',
307
- 'relative'
308
- )}
309
- >
310
- <span> Preview only, update schema to save.</span>
311
- <div class="flex flex-row items-center gap-2 absolute right-2">
312
- <Button
313
- variant="contained"
314
- color="light"
315
- size="xs2"
316
- startIcon={{ icon: X }}
317
- shortCut={{ key: 'esc', withoutModifier: true }}
318
- nonCaptureEvent
319
- />
320
- </div>
359
+ <div class="flex flex-row items-center gap-2 right-2 justify-end">
360
+ <Button
361
+ size="xs"
362
+ color="green"
363
+ disabled={!previewSchema}
364
+ shortCut={{ Icon: CornerDownLeft, hide: false, withoutModifier: true }}
365
+ startIcon={{ icon: Check }}
366
+ on:click={() => {
367
+ applySchemaAndArgs()
368
+ connectFirstNode()
369
+ }}
370
+ >
371
+ {Object.values(diff).every((el) => el.diff === 'same')
372
+ ? 'Apply args'
373
+ : 'Update schema'}
374
+ </Button>
375
+ <Button
376
+ variant="border"
377
+ color="light"
378
+ size="xs"
379
+ startIcon={{ icon: X }}
380
+ shortCut={{ key: 'esc', withoutModifier: true }}
381
+ nonCaptureEvent
382
+ />
321
383
  </div>
322
384
  {:else}
323
385
  <AddPropertyV2
@@ -325,6 +387,14 @@ let preventEnter = false;
325
387
  bind:this={addProperty}
326
388
  on:change={() => {
327
389
  $flowStore = $flowStore
390
+ if (editableSchemaForm) {
391
+ editableSchemaForm.updateJson()
392
+ }
393
+ }}
394
+ on:addNew={(e) => {
395
+ handleEditSchema('inputEditor')
396
+ editableSchemaForm?.openField(e.detail)
397
+ $flowStore = $flowStore
328
398
  }}
329
399
  >
330
400
  <svelte:fragment slot="trigger">
@@ -340,9 +410,7 @@ let preventEnter = false;
340
410
  <svelte:fragment slot="extraTab">
341
411
  {#if $flowInputEditorState?.selectedTab === 'history'}
342
412
  <FlowInputEditor
343
- disabled={!payloadData}
344
- on:applySchemaAndArgs={applySchemaAndArgs}
345
- on:applySchema={applySchema}
413
+ title="History"
346
414
  on:destroy={() => {
347
415
  updatePreviewSchemaAndArgs(undefined)
348
416
  }}
@@ -358,12 +426,10 @@ let preventEnter = false;
358
426
  </FlowInputEditor>
359
427
  {:else if $flowInputEditorState?.selectedTab === 'captures'}
360
428
  <FlowInputEditor
361
- disabled={!payloadData}
362
- on:applySchemaAndArgs={applySchemaAndArgs}
363
- on:applySchema={applySchema}
364
429
  on:destroy={() => {
365
430
  updatePreviewSchemaAndArgs(undefined)
366
431
  }}
432
+ title="Trigger captures"
367
433
  >
368
434
  <svelete:fragment slot="action">
369
435
  <div class="center-center">
@@ -379,13 +445,10 @@ let preventEnter = false;
379
445
  </FlowInputEditor>
380
446
  {:else if $flowInputEditorState?.selectedTab === 'savedInputs'}
381
447
  <FlowInputEditor
382
- {preventEnter}
383
- disabled={!payloadData}
384
- on:applySchemaAndArgs={applySchemaAndArgs}
385
- on:applySchema={applySchema}
386
448
  on:destroy={() => {
387
449
  updatePreviewSchemaAndArgs(undefined)
388
450
  }}
451
+ title="Saved inputs"
389
452
  >
390
453
  <SavedInputsPicker
391
454
  flowPath={initialPath}
@@ -400,13 +463,10 @@ let preventEnter = false;
400
463
  </FlowInputEditor>
401
464
  {:else if $flowInputEditorState?.selectedTab === 'json'}
402
465
  <FlowInputEditor
403
- {preventEnter}
404
- disabled={!jsonValid}
405
- on:applySchemaAndArgs={applySchemaAndArgs}
406
- on:applySchema={applySchema}
407
466
  on:destroy={() => {
408
467
  updatePreviewSchemaAndArgs(undefined)
409
468
  }}
469
+ title="Json payload"
410
470
  >
411
471
  <SimpleEditor
412
472
  on:focus={() => {
@@ -432,22 +492,25 @@ let preventEnter = false;
432
492
  </FlowInputEditor>
433
493
  {:else if $flowInputEditorState?.selectedTab === 'firstStepInputs'}
434
494
  <FlowInputEditor
435
- disabled={!previewSchema}
436
- on:applySchemaAndArgs={() => {
437
- applySchemaAndArgs()
438
- connectFirstNode()
439
- }}
440
- on:applySchema={applySchema}
441
495
  on:destroy={() => {
442
496
  updatePreviewSchemaAndArgs(undefined)
497
+ connectFirstNode = () => {}
443
498
  }}
499
+ title="First step's inputs"
444
500
  >
445
501
  <FirstStepInputs
446
502
  on:connectFirstNode={({ detail }) => {
447
503
  connectFirstNode = detail.connectFirstNode
448
504
  }}
449
505
  on:select={(e) => {
450
- previewSchema = e.detail ?? undefined
506
+ if (e.detail) {
507
+ const diffSchema = computeDiff(e.detail, $flowStore.schema)
508
+ diff = diffSchema
509
+ previewSchema = schemaFromDiff(diffSchema, $flowStore.schema)
510
+ runDisabled = true
511
+ } else {
512
+ updatePreviewSchemaAndArgs(undefined)
513
+ }
451
514
  }}
452
515
  />
453
516
  </FlowInputEditor>
@@ -458,7 +521,7 @@ let preventEnter = false;
458
521
  <Button
459
522
  color="dark"
460
523
  btnClasses="w-fit"
461
- disabled={!!previewSchema}
524
+ disabled={runDisabled}
462
525
  size="xs"
463
526
  shortCut={{ Icon: CornerDownLeft, hide: false }}
464
527
  on:click={() => {
@@ -1,46 +1,22 @@
1
1
  <script>import { createEventDispatcher, onDestroy } from 'svelte';
2
- import Section from '../../Section.svelte';
3
- import Button from '../../common/button/Button.svelte';
4
- import { CornerDownLeft, Save } from 'lucide-svelte';
5
- export let name = '';
6
- export let disabled = false;
7
- export let preventEnter = false;
8
2
  const dispatch = createEventDispatcher();
9
- function applySchemaAndArgs() {
10
- dispatch('applySchemaAndArgs');
11
- }
3
+ export let title = '';
12
4
  onDestroy(() => {
13
5
  dispatch('destroy');
14
6
  });
15
7
  </script>
16
8
 
17
- <svelte:window
18
- on:keydown={(e) => {
19
- if (e.key === 'Enter' && !preventEnter) {
20
- applySchemaAndArgs()
21
- e.preventDefault()
22
- }
23
- }}
24
- />
9
+ <div class="flex flex-col h-full px-3 pb-3">
10
+ <div
11
+ class="items-center grow-0 flex flex-row justify-between gap-2 data-schema-picker min-h-[40px]"
12
+ >
13
+ <h2 class="font-semibold text-secondary text-sm flex flex-row items-center gap-1 leading-6">
14
+ {title}
15
+ </h2>
16
+ <slot name="action" />
17
+ </div>
25
18
 
26
- <div class="h-full p-2">
27
- <Section label={name} class="h-full" small={true}>
28
- <svelte:fragment slot="header">
29
- <slot name="header" />
30
- </svelte:fragment>
31
- <svelte:fragment slot="action">
32
- <div class="flex flex-row gap-2 data-schema-picker">
33
- <slot name="action" />
34
- <Button
35
- size="xs2"
36
- color="dark"
37
- {disabled}
38
- shortCut={{ Icon: CornerDownLeft, hide: false, withoutModifier: true }}
39
- startIcon={{ icon: Save }}
40
- on:click={applySchemaAndArgs}>Update schema</Button
41
- >
42
- </div>
43
- </svelte:fragment>
19
+ <div class="w-full min-h-0 grow">
44
20
  <slot />
45
- </Section>
21
+ </div>
46
22
  </div>
@@ -1,18 +1,14 @@
1
1
  import { SvelteComponent } from "svelte";
2
2
  declare const __propDef: {
3
3
  props: {
4
- name?: string | undefined;
5
- disabled?: boolean | undefined;
6
- preventEnter?: boolean | undefined;
4
+ title?: string | undefined;
7
5
  };
8
6
  events: {
9
- applySchemaAndArgs: CustomEvent<any>;
10
7
  destroy: CustomEvent<any>;
11
8
  } & {
12
9
  [evt: string]: CustomEvent<any>;
13
10
  };
14
11
  slots: {
15
- header: {};
16
12
  action: {};
17
13
  default: {};
18
14
  };
@@ -13,7 +13,7 @@ declare const __propDef: {
13
13
  loading?: boolean | undefined;
14
14
  small?: boolean | undefined;
15
15
  kind: 'trigger' | 'script' | 'preprocessor' | 'failure' | 'approval';
16
- selectedKind?: "script" | "failure" | "trigger" | "approval" | "flow" | "preprocessor" | undefined;
16
+ selectedKind?: "script" | "failure" | "trigger" | "approval" | "preprocessor" | "flow" | undefined;
17
17
  displayPath?: boolean | undefined;
18
18
  };
19
19
  events: {
@@ -1,5 +1,5 @@
1
1
  <script>import { getContext } from 'svelte';
2
- import { workerTags } from '../../../stores';
2
+ import { workerTags, workspaceStore } from '../../../stores';
3
3
  import { WorkerService } from '../../../gen';
4
4
  import WorkerTagSelect from '../../WorkerTagSelect.svelte';
5
5
  export let tag;
@@ -8,7 +8,7 @@ const { flowStore, selectedId } = getContext('FlowEditorContext');
8
8
  loadWorkerGroups();
9
9
  async function loadWorkerGroups() {
10
10
  if (!$workerTags) {
11
- $workerTags = await WorkerService.getCustomTags();
11
+ $workerTags = await WorkerService.getCustomTags({ workspace: $workspaceStore });
12
12
  }
13
13
  }
14
14
  </script>