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
@@ -1,5 +1,5 @@
1
1
  <script>import { setInputCat as computeInputCat, debounce, emptyString, getSchemaFromProperties } from '../utils';
2
- import { DollarSign, Pipette, Plus, X } from 'lucide-svelte';
2
+ import { DollarSign, Pipette, Plus, X, Check } from 'lucide-svelte';
3
3
  import { createEventDispatcher, onMount, tick } from 'svelte';
4
4
  import Multiselect from 'svelte-multiselect';
5
5
  import { fade } from 'svelte/transition';
@@ -71,6 +71,10 @@ export let noDefaultOnSelectFirst = false;
71
71
  export let helperScript = undefined;
72
72
  export let otherArgs = {};
73
73
  export let lightHeader = false;
74
+ export let diffStatus = undefined;
75
+ export let hideNested = false;
76
+ export let nestedParent = undefined;
77
+ export let nestedClasses = '';
74
78
  $: inputCat = computeInputCat(type, format, itemsType?.type, enum_, contentEncoding);
75
79
  let oneOfSelected = undefined;
76
80
  async function updateOneOfSelected(oneOf) {
@@ -297,288 +301,457 @@ $: shouldDispatchChanges && debounced(value);
297
301
  />
298
302
 
299
303
  <!-- svelte-ignore a11y-autofocus -->
300
- <div class="flex flex-col w-full {minW ? 'min-w-[250px]' : ''}">
301
- <div>
302
- {#if displayHeader}
303
- <FieldHeader
304
- prettify={prettifyHeader}
305
- label={title && !emptyString(title) ? title : label}
306
- {disabled}
307
- {required}
308
- {type}
309
- {contentEncoding}
310
- {format}
311
- {simpleTooltip}
312
- {lightHeader}
313
- />
314
- {/if}
304
+ <div
305
+ class={twMerge(
306
+ 'flex flex-col w-full rounded-md px-2 relative',
307
+ minW ? 'min-w-[250px]' : '',
308
+ diffStatus?.diff == 'added'
309
+ ? 'bg-green-300 dark:bg-green-800'
310
+ : diffStatus?.diff === 'removed'
311
+ ? 'bg-red-300 dark:bg-red-800'
312
+ : diffStatus?.diff === 'same'
313
+ ? 'bg-surface'
314
+ : diffStatus?.diff === 'modified' || typeof diffStatus?.diff === 'object'
315
+ ? 'border-2 border-green-500 bg-surface'
316
+ : ''
317
+ )}
318
+ >
319
+ {#if diffStatus && typeof diffStatus === 'object' && diffStatus.diff !== 'same'}
320
+ <div
321
+ class="absolute top-0 right-2 rounded-md rounded-t-none flex flex-row overflow-hidden bg-surface"
322
+ data-schema-picker
323
+ >
324
+ <button
325
+ class="p-1 bg-green-500 text-white hover:bg-green-600"
326
+ on:click|preventDefault|stopPropagation={() => {
327
+ dispatch('acceptChange', { label, nestedParent })
328
+ }}
329
+ >
330
+ <Check size={14} />
331
+ </button>
332
+ <button
333
+ class="p-1 hover:bg-red-500 hover:text-white"
334
+ on:click|preventDefault|stopPropagation={() => {
335
+ dispatch('rejectChange', { label, nestedParent })
336
+ }}
337
+ >
338
+ <X size={14} />
339
+ </button>
340
+ </div>
341
+ {/if}
342
+ {#if displayHeader}
343
+ <FieldHeader
344
+ prettify={prettifyHeader}
345
+ label={title && !emptyString(title) ? title : label}
346
+ {disabled}
347
+ {required}
348
+ {type}
349
+ {contentEncoding}
350
+ {format}
351
+ {simpleTooltip}
352
+ {lightHeader}
353
+ />
354
+ {/if}
315
355
 
316
- {#if description}
317
- <div class="text-xs italic pb-1 text-secondary">
318
- <pre class="font-main whitespace-normal">{description}</pre>
319
- </div>
320
- {/if}
356
+ {#if description}
357
+ <div class="text-xs italic pb-1 text-secondary">
358
+ <pre class="font-main whitespace-normal">{description}</pre>
359
+ </div>
360
+ {/if}
321
361
 
322
- <div class="flex space-x-1">
323
- {#if inputCat == 'number'}
324
- {#if extra['min'] != undefined && extra['max'] != undefined}
325
- <Range bind:value min={extra['min']} max={extra['max']} {defaultValue} />
326
- {:else if extra['seconds'] !== undefined}
327
- <SecondsInput bind:seconds={value} on:focus />
328
- {:else if extra?.currency}
329
- <CurrencyInput
330
- inputClasses={{
331
- formatted: 'px-2 w-full py-1.5 text-black dark:text-white',
332
- wrapper: 'w-full windmillapp',
333
- formattedZero: 'text-black dark:text-white'
334
- }}
335
- noColor
336
- bind:value
337
- currency={extra?.currency}
338
- locale={extra?.currencyLocale ?? 'en-US'}
339
- />
340
- {:else}
341
- <div class="relative w-full">
342
- <input
343
- {autofocus}
344
- on:focus
345
- on:blur
346
- {disabled}
347
- type="number"
348
- on:keydown={() => {
349
- ignoreValueUndefined = true
350
- }}
351
- class={valid
352
- ? ''
353
- : 'border border-red-700 border-opacity-30 focus:border-red-700 focus:border-opacity-30 bg-red-100'}
354
- placeholder={placeholder ?? defaultValue ?? ''}
355
- bind:value
356
- min={extra['min']}
357
- max={extra['max']}
358
- />
359
- </div>
360
- {/if}
361
- {:else if inputCat == 'boolean'}
362
- <div class="w-full">
363
- <Toggle
364
- on:pointerdown={(e) => {
365
- e?.stopPropagation()
366
- }}
362
+ <div class="flex space-x-1">
363
+ {#if inputCat == 'number'}
364
+ {#if extra['min'] != undefined && extra['max'] != undefined}
365
+ <Range bind:value min={extra['min']} max={extra['max']} {defaultValue} />
366
+ {:else if extra['seconds'] !== undefined}
367
+ <SecondsInput bind:seconds={value} on:focus />
368
+ {:else if extra?.currency}
369
+ <CurrencyInput
370
+ inputClasses={{
371
+ formatted: 'px-2 w-full py-1.5 text-black dark:text-white',
372
+ wrapper: 'w-full windmillapp',
373
+ formattedZero: 'text-black dark:text-white'
374
+ }}
375
+ noColor
376
+ bind:value
377
+ currency={extra?.currency}
378
+ locale={extra?.currencyLocale ?? 'en-US'}
379
+ />
380
+ {:else}
381
+ <div class="relative w-full">
382
+ <input
383
+ {autofocus}
384
+ on:focus
385
+ on:blur
367
386
  {disabled}
387
+ type="number"
388
+ on:keydown={() => {
389
+ ignoreValueUndefined = true
390
+ }}
368
391
  class={valid
369
392
  ? ''
370
393
  : 'border border-red-700 border-opacity-30 focus:border-red-700 focus:border-opacity-30 bg-red-100'}
371
- bind:checked={value}
394
+ placeholder={placeholder ?? defaultValue ?? ''}
395
+ bind:value
396
+ min={extra['min']}
397
+ max={extra['max']}
372
398
  />
373
- {#if type == 'boolean' && value == undefined}
374
- <span>&nbsp; Not set</span>
375
- {/if}
376
399
  </div>
377
- {:else if inputCat == 'list' && !isListJson}
378
- <div class="w-full flex gap-4">
379
- <div class="w-full">
380
- {#if Array.isArray(itemsType?.multiselect) && Array.isArray(value)}
381
- <div class="items-start">
382
- <Multiselect
383
- ulOptionsClass={'p-2 !bg-surface-secondary'}
384
- {disabled}
385
- bind:selected={value}
386
- options={itemsType?.multiselect ?? []}
387
- selectedOptionsDraggable={true}
388
- on:open={() => {
389
- dispatch('focus')
390
- }}
391
- />
392
- </div>
393
- {:else if itemsType?.enum != undefined && Array.isArray(itemsType?.enum) && Array.isArray(value)}
394
- <div class="items-start">
395
- <Multiselect
396
- ulOptionsClass={'p-2 !bg-surface-secondary'}
397
- {disabled}
398
- bind:selected={value}
399
- options={itemsType?.enum ?? []}
400
- selectedOptionsDraggable={true}
401
- on:open={() => {
402
- dispatch('focus')
403
- }}
404
- />
405
- </div>
406
- {:else}
407
- <div class="w-full">
408
- {#key redraw}
409
- {#if Array.isArray(value)}
410
- {#each value ?? [] as v, i}
411
- {#if i < itemsLimit}
412
- <div class="flex max-w-md mt-1 w-full items-center">
413
- {#if itemsType?.type == 'number'}
414
- <input type="number" bind:value={v} id="arg-input-number-array" />
415
- {:else if itemsType?.type == 'string' && itemsType?.contentEncoding == 'base64'}
416
- <input
417
- type="file"
418
- class="my-6"
419
- on:change={(x) => fileChanged(x, (val) => (value[i] = val))}
420
- multiple={false}
421
- />
422
- {:else if itemsType?.type == 'object' && itemsType?.resourceType === undefined && itemsType?.properties === undefined}
423
- <JsonEditor code={JSON.stringify(v, null, 2)} bind:value={v} />
424
- {:else if Array.isArray(itemsType?.enum)}
425
- <ArgEnum
426
- required
427
- create={extra['disableCreate'] != true}
428
- on:focus={() => {
429
- dispatch('focus')
430
- }}
431
- on:blur={(e) => {
432
- dispatch('blur')
433
- }}
434
- {defaultValue}
435
- {valid}
400
+ {/if}
401
+ {:else if inputCat == 'boolean'}
402
+ <div class="w-full">
403
+ <Toggle
404
+ on:pointerdown={(e) => {
405
+ e?.stopPropagation()
406
+ }}
407
+ {disabled}
408
+ class={valid
409
+ ? ''
410
+ : 'border border-red-700 border-opacity-30 focus:border-red-700 focus:border-opacity-30 bg-red-100'}
411
+ bind:checked={value}
412
+ />
413
+ {#if type == 'boolean' && value == undefined}
414
+ <span>&nbsp; Not set</span>
415
+ {/if}
416
+ </div>
417
+ {:else if inputCat == 'list' && !isListJson}
418
+ <div class="w-full flex gap-4">
419
+ <div class="w-full">
420
+ {#if Array.isArray(itemsType?.multiselect) && Array.isArray(value)}
421
+ <div class="items-start">
422
+ <Multiselect
423
+ ulOptionsClass={'p-2 !bg-surface-secondary'}
424
+ {disabled}
425
+ bind:selected={value}
426
+ options={itemsType?.multiselect ?? []}
427
+ selectedOptionsDraggable={true}
428
+ on:open={() => {
429
+ dispatch('focus')
430
+ }}
431
+ />
432
+ </div>
433
+ {:else if itemsType?.enum != undefined && Array.isArray(itemsType?.enum) && Array.isArray(value)}
434
+ <div class="items-start">
435
+ <Multiselect
436
+ ulOptionsClass={'p-2 !bg-surface-secondary'}
437
+ {disabled}
438
+ bind:selected={value}
439
+ options={itemsType?.enum ?? []}
440
+ selectedOptionsDraggable={true}
441
+ on:open={() => {
442
+ dispatch('focus')
443
+ }}
444
+ />
445
+ </div>
446
+ {:else}
447
+ <div class="w-full">
448
+ {#key redraw}
449
+ {#if Array.isArray(value)}
450
+ {#each value ?? [] as v, i}
451
+ {#if i < itemsLimit}
452
+ <div class="flex max-w-md mt-1 w-full items-center">
453
+ {#if itemsType?.type == 'number'}
454
+ <input type="number" bind:value={v} id="arg-input-number-array" />
455
+ {:else if itemsType?.type == 'string' && itemsType?.contentEncoding == 'base64'}
456
+ <input
457
+ type="file"
458
+ class="my-6"
459
+ on:change={(x) => fileChanged(x, (val) => (value[i] = val))}
460
+ multiple={false}
461
+ />
462
+ {:else if itemsType?.type == 'object' && itemsType?.resourceType === undefined && itemsType?.properties === undefined}
463
+ <JsonEditor code={JSON.stringify(v, null, 2)} bind:value={v} />
464
+ {:else if Array.isArray(itemsType?.enum)}
465
+ <ArgEnum
466
+ required
467
+ create={extra['disableCreate'] != true}
468
+ on:focus={() => {
469
+ dispatch('focus')
470
+ }}
471
+ on:blur={(e) => {
472
+ dispatch('blur')
473
+ }}
474
+ {defaultValue}
475
+ {valid}
476
+ {disabled}
477
+ {autofocus}
478
+ bind:value={v}
479
+ enum_={itemsType?.enum ?? []}
480
+ enumLabels={extra['enumLabels']}
481
+ />
482
+ {:else if itemsType?.type == 'resource' && itemsType?.resourceType && resourceTypes?.includes(itemsType.resourceType)}
483
+ <ObjectResourceInput
484
+ value={v ? `$res:${v}` : undefined}
485
+ bind:path={v}
486
+ format={'resource-' + itemsType?.resourceType}
487
+ defaultValue={undefined}
488
+ />
489
+ {:else if itemsType?.type == 'resource'}
490
+ <JsonEditor
491
+ bind:editor
492
+ on:focus={(e) => {
493
+ dispatch('focus')
494
+ }}
495
+ on:blur={(e) => {
496
+ dispatch('blur')
497
+ }}
498
+ code={JSON.stringify(v, null, 2)}
499
+ bind:value={v}
500
+ />
501
+ {:else if itemsType?.type === 'object' && itemsType?.properties}
502
+ <div class="p-8 border rounded-md w-full">
503
+ <SchemaForm
504
+ {onlyMaskPassword}
505
+ {disablePortal}
436
506
  {disabled}
437
- {autofocus}
438
- bind:value={v}
439
- enum_={itemsType?.enum ?? []}
440
- enumLabels={extra['enumLabels']}
441
- />
442
- {:else if itemsType?.type == 'resource' && itemsType?.resourceType && resourceTypes?.includes(itemsType.resourceType)}
443
- <ObjectResourceInput
444
- value={v ? `$res:${v}` : undefined}
445
- bind:path={v}
446
- format={'resource-' + itemsType?.resourceType}
447
- defaultValue={undefined}
448
- />
449
- {:else if itemsType?.type == 'resource'}
450
- <JsonEditor
451
- bind:editor
452
- on:focus={(e) => {
453
- dispatch('focus')
454
- }}
455
- on:blur={(e) => {
456
- dispatch('blur')
457
- }}
458
- code={JSON.stringify(v, null, 2)}
459
- bind:value={v}
507
+ schema={getSchemaFromProperties(itemsType?.properties)}
508
+ bind:args={v}
460
509
  />
461
- {:else if itemsType?.type === 'object' && itemsType?.properties}
462
- <div class="p-8 border rounded-md w-full">
463
- <SchemaForm
464
- {onlyMaskPassword}
465
- {disablePortal}
466
- {disabled}
467
- schema={getSchemaFromProperties(itemsType?.properties)}
468
- bind:args={v}
469
- />
470
- </div>
471
- {:else}
472
- <input type="text" bind:value={v} id="arg-input-array" />
473
- {/if}
474
- <button
475
- transition:fade|local={{ duration: 100 }}
476
- class="rounded-full p-1 bg-surface-secondary duration-200 hover:bg-surface-hover ml-2"
477
- aria-label="Clear"
478
- on:click={() => {
479
- value = value.filter((_, index) => index !== i)
480
- redraw += 1
481
- }}
482
- >
483
- <X size={14} />
484
- </button>
485
- </div>
486
- {/if}
487
- {/each}
488
- {#if value.length > itemsLimit}
489
- <button on:click={() => (itemsLimit += 50)} class="text-xs py-2 text-blue-600"
490
- >{itemsLimit}/{value.length}: Load 50 more...</button
491
- >
510
+ </div>
511
+ {:else}
512
+ <input type="text" bind:value={v} id="arg-input-array" />
513
+ {/if}
514
+ <button
515
+ transition:fade|local={{ duration: 100 }}
516
+ class="rounded-full p-1 bg-surface-secondary duration-200 hover:bg-surface-hover ml-2"
517
+ aria-label="Clear"
518
+ on:click={() => {
519
+ value = value.filter((_, index) => index !== i)
520
+ redraw += 1
521
+ }}
522
+ >
523
+ <X size={14} />
524
+ </button>
525
+ </div>
492
526
  {/if}
527
+ {/each}
528
+ {#if value.length > itemsLimit}
529
+ <button on:click={() => (itemsLimit += 50)} class="text-xs py-2 text-blue-600"
530
+ >{itemsLimit}/{value.length}: Load 50 more...</button
531
+ >
493
532
  {/if}
494
- {/key}
495
- </div>
496
- <div class="flex mt-2 gap-20 items-baseline">
497
- <Button
498
- variant="border"
499
- color="light"
500
- size="xs"
501
- btnClasses="mt-1"
502
- on:click={() => {
503
- if (value == undefined || !Array.isArray(value)) {
504
- value = []
505
- }
506
- if (itemsType?.type == 'number') {
507
- value = value.concat(0)
508
- } else if (
509
- itemsType?.type == 'object' ||
510
- (itemsType?.type == 'resource' &&
511
- !(
512
- itemsType?.resourceType &&
513
- resourceTypes?.includes(itemsType?.resourceType)
514
- ))
515
- ) {
516
- value = value.concat({})
517
- } else {
518
- value = value.concat('')
519
- }
520
- }}
521
- id="arg-input-add-item"
522
- startIcon={{ icon: Plus }}
523
- >
524
- Add item
525
- </Button>
526
- </div>
527
- {/if}
528
- </div>
529
- <div class="mt-2 mr-4">
530
- <Toggle
531
- on:change={(e) => {
532
- // Once the user has changed the input type, we should not change it back automatically
533
- if (!hasIsListJsonChanged) {
534
- hasIsListJsonChanged = true
535
- }
533
+ {/if}
534
+ {/key}
535
+ </div>
536
+ <div class="flex mt-2 gap-20 items-baseline">
537
+ <Button
538
+ variant="border"
539
+ color="light"
540
+ size="xs"
541
+ btnClasses="mt-1"
542
+ on:click={() => {
543
+ if (value == undefined || !Array.isArray(value)) {
544
+ value = []
545
+ }
546
+ if (itemsType?.type == 'number') {
547
+ value = value.concat(0)
548
+ } else if (
549
+ itemsType?.type == 'object' ||
550
+ (itemsType?.type == 'resource' &&
551
+ !(
552
+ itemsType?.resourceType && resourceTypes?.includes(itemsType?.resourceType)
553
+ ))
554
+ ) {
555
+ value = value.concat({})
556
+ } else {
557
+ value = value.concat('')
558
+ }
559
+ }}
560
+ id="arg-input-add-item"
561
+ startIcon={{ icon: Plus }}
562
+ >
563
+ Add item
564
+ </Button>
565
+ </div>
566
+ {/if}
567
+ </div>
568
+ <div class="mt-2 mr-4">
569
+ <Toggle
570
+ on:change={(e) => {
571
+ // Once the user has changed the input type, we should not change it back automatically
572
+ if (!hasIsListJsonChanged) {
573
+ hasIsListJsonChanged = true
574
+ }
536
575
 
537
- evalValueToRaw()
538
- isListJson = !isListJson
539
- }}
540
- checked={isListJson}
541
- textClass="text-secondary"
542
- size="xs"
543
- options={{ right: 'json' }}
544
- />
545
- </div>
576
+ evalValueToRaw()
577
+ isListJson = !isListJson
578
+ }}
579
+ checked={isListJson}
580
+ textClass="text-secondary"
581
+ size="xs"
582
+ options={{ right: 'json' }}
583
+ />
546
584
  </div>
547
- {:else if inputCat == 'dynselect'}
548
- <DynSelect
549
- name={label}
550
- args={otherArgs}
551
- {helperScript}
552
- bind:value
553
- entrypoint={format.substring('dynselect_'.length)}
554
- />
555
- {:else if inputCat == 'resource-object' && resourceTypes == undefined}
556
- <span class="text-2xs text-tertiary">Loading resource types...</span>
557
- {:else if inputCat == 'resource-object' && (resourceTypes == undefined || (format.split('-').length > 1 && resourceTypes.includes(format.substring('resource-'.length))))}
558
- <ObjectResourceInput
559
- {defaultValue}
560
- selectFirst={!noDefaultOnSelectFirst}
561
- {disablePortal}
562
- {format}
563
- bind:value
564
- bind:editor
565
- on:clear={() => {
566
- defaultValue = null
567
- }}
568
- {showSchemaExplorer}
585
+ </div>
586
+ {:else if inputCat == 'dynselect'}
587
+ <DynSelect
588
+ name={label}
589
+ args={otherArgs}
590
+ {helperScript}
591
+ bind:value
592
+ entrypoint={format.substring('dynselect_'.length)}
593
+ />
594
+ {:else if inputCat == 'resource-object' && resourceTypes == undefined}
595
+ <span class="text-2xs text-tertiary">Loading resource types...</span>
596
+ {:else if inputCat == 'resource-object' && (resourceTypes == undefined || (format.split('-').length > 1 && resourceTypes.includes(format.substring('resource-'.length))))}
597
+ <ObjectResourceInput
598
+ {defaultValue}
599
+ selectFirst={!noDefaultOnSelectFirst}
600
+ {disablePortal}
601
+ {format}
602
+ bind:value
603
+ bind:editor
604
+ on:clear={() => {
605
+ defaultValue = null
606
+ }}
607
+ {showSchemaExplorer}
608
+ />
609
+ {:else if inputCat == 'resource-object' && format.split('-').length > 1 && format
610
+ .replace('resource-', '')
611
+ .replace('_', '')
612
+ .toLowerCase() == 's3object'}
613
+ <div class="flex flex-col w-full gap-1">
614
+ <Toggle
615
+ class="flex justify-end"
616
+ bind:checked={s3FileUploadRawMode}
617
+ size="xs"
618
+ options={{ left: 'Raw S3 object input' }}
569
619
  />
570
- {:else if inputCat == 'resource-object' && format.split('-').length > 1 && format
571
- .replace('resource-', '')
572
- .replace('_', '')
573
- .toLowerCase() == 's3object'}
574
- <div class="flex flex-col w-full gap-1">
575
- <Toggle
576
- class="flex justify-end"
577
- bind:checked={s3FileUploadRawMode}
620
+ {#if s3FileUploadRawMode}
621
+ <JsonEditor
622
+ bind:editor
623
+ on:focus={(e) => {
624
+ dispatch('focus')
625
+ }}
626
+ on:blur={(e) => {
627
+ dispatch('blur')
628
+ }}
629
+ code={JSON.stringify(value ?? defaultValue ?? { s3: '' }, null, 2)}
630
+ bind:value
631
+ />
632
+ <Button
633
+ variant="border"
634
+ color="light"
578
635
  size="xs"
579
- options={{ left: 'Raw S3 object input' }}
636
+ btnClasses="mt-1"
637
+ on:click={() => {
638
+ s3FilePicker?.open?.(value)
639
+ }}
640
+ startIcon={{ icon: Pipette }}
641
+ >
642
+ Choose an object from the catalog
643
+ </Button>
644
+ {:else}
645
+ <FileUpload
646
+ allowMultiple={false}
647
+ randomFileKey={true}
648
+ on:addition={(evt) => {
649
+ value = {
650
+ s3: evt.detail?.path ?? '',
651
+ filename: evt.detail?.filename ?? ''
652
+ }
653
+ }}
654
+ on:deletion={(evt) => {
655
+ value = {
656
+ s3: ''
657
+ }
658
+ }}
659
+ defaultValue={defaultValue?.s3}
580
660
  />
581
- {#if s3FileUploadRawMode}
661
+ {/if}
662
+ </div>
663
+ {:else if inputCat == 'object' || inputCat == 'resource-object' || isListJson}
664
+ {#if oneOf && oneOf.length >= 2}
665
+ <div class="flex flex-col gap-2 w-full">
666
+ {#if oneOf && oneOf.length >= 2}
667
+ <ToggleButtonGroup
668
+ bind:selected={oneOfSelected}
669
+ on:selected={() => {
670
+ value = { label: oneOfSelected }
671
+ redraw += 1
672
+ }}
673
+ >
674
+ {#each oneOf as obj}
675
+ <ToggleButton value={obj.title} label={obj.title} />
676
+ {/each}
677
+ </ToggleButtonGroup>
678
+ {#if oneOfSelected}
679
+ {@const objIdx = oneOf.findIndex((o) => o.title === oneOfSelected)}
680
+ {@const obj = oneOf[objIdx]}
681
+ {#if obj && obj.properties && Object.keys(obj.properties).length > 0}
682
+ {#key redraw}
683
+ <div class="py-4 pr-2 pl-6 border rounded w-full">
684
+ {#if orderEditable}
685
+ <SchemaFormDnd
686
+ {nestedClasses}
687
+ {onlyMaskPassword}
688
+ {disablePortal}
689
+ {disabled}
690
+ schema={{
691
+ properties: obj.properties,
692
+ order: obj.order,
693
+ $schema: '',
694
+ required: obj.required ?? [],
695
+ type: 'object'
696
+ }}
697
+ bind:args={value}
698
+ dndType={`nested-${title}`}
699
+ schemaSkippedValues={['label']}
700
+ on:reorder={(e) => {
701
+ if (oneOf && oneOf[objIdx]) {
702
+ const keys = e.detail
703
+ oneOf[objIdx].order = keys
704
+ }
705
+ }}
706
+ on:change={() => {
707
+ dispatch('nestedChange')
708
+ }}
709
+ on:nestedChange
710
+ {shouldDispatchChanges}
711
+ />
712
+ {:else}
713
+ <SchemaForm
714
+ {nestedClasses}
715
+ {onlyMaskPassword}
716
+ {disablePortal}
717
+ {disabled}
718
+ schemaSkippedValues={['label']}
719
+ schema={{
720
+ properties: obj.properties,
721
+ order: obj.order,
722
+ $schema: '',
723
+ required: obj.required ?? [],
724
+ type: 'object'
725
+ }}
726
+ bind:args={value}
727
+ {shouldDispatchChanges}
728
+ on:change={() => {
729
+ dispatch('nestedChange')
730
+ }}
731
+ on:nestedChange
732
+ />
733
+ {/if}
734
+ </div>
735
+ {/key}
736
+ {:else if disabled}
737
+ <textarea disabled />
738
+ {:else}
739
+ <JsonEditor
740
+ bind:editor
741
+ on:focus={(e) => {
742
+ dispatch('focus')
743
+ }}
744
+ on:blur={(e) => {
745
+ dispatch('blur')
746
+ }}
747
+ code={rawValue}
748
+ bind:value
749
+ />
750
+ {/if}
751
+ {/if}
752
+ {:else if disabled}
753
+ <textarea disabled />
754
+ {:else}
582
755
  <JsonEditor
583
756
  bind:editor
584
757
  on:focus={(e) => {
@@ -587,365 +760,269 @@ $: shouldDispatchChanges && debounced(value);
587
760
  on:blur={(e) => {
588
761
  dispatch('blur')
589
762
  }}
590
- code={JSON.stringify(value ?? defaultValue ?? { s3: '' }, null, 2)}
763
+ code={rawValue}
591
764
  bind:value
592
765
  />
593
- <Button
594
- variant="border"
595
- color="light"
596
- size="xs"
597
- btnClasses="mt-1"
598
- on:click={() => {
599
- s3FilePicker?.open?.(value)
766
+ {/if}
767
+ </div>
768
+ {:else if properties && Object.keys(properties).length > 0 && inputCat !== 'list'}
769
+ <div class={hideNested ? 'hidden' : 'py-4 pr-2 pl-6 border rounded-md w-full'}>
770
+ {#if orderEditable}
771
+ <SchemaFormDnd
772
+ {nestedClasses}
773
+ {onlyMaskPassword}
774
+ {disablePortal}
775
+ {disabled}
776
+ schema={{
777
+ properties,
778
+ $schema: '',
779
+ required: nestedRequired ?? [],
780
+ type: 'object',
781
+ order
600
782
  }}
601
- startIcon={{ icon: Pipette }}
602
- >
603
- Choose an object from the catalog
604
- </Button>
605
- {:else}
606
- <FileUpload
607
- allowMultiple={false}
608
- randomFileKey={true}
609
- on:addition={(evt) => {
610
- value = {
611
- s3: evt.detail?.path ?? '',
612
- filename: evt.detail?.filename ?? ''
613
- }
783
+ bind:args={value}
784
+ dndType={`nested-${title}`}
785
+ on:reorder={(e) => {
786
+ const keys = e.detail
787
+ order = keys
614
788
  }}
615
- on:deletion={(evt) => {
616
- value = {
617
- s3: ''
618
- }
789
+ on:change={() => {
790
+ dispatch('nestedChange')
619
791
  }}
620
- defaultValue={defaultValue?.s3}
792
+ diff={diffStatus && typeof diffStatus.diff === 'object' ? diffStatus.diff : {}}
793
+ on:acceptChange={(e) => {
794
+ dispatch('acceptChange', e.detail)
795
+ }}
796
+ on:rejectChange={(e) => {
797
+ dispatch('rejectChange', e.detail)
798
+ }}
799
+ on:nestedChange
800
+ nestedParent={{ label, nestedParent }}
801
+ {shouldDispatchChanges}
621
802
  />
622
- {/if}
623
- </div>
624
- {:else if inputCat == 'object' || inputCat == 'resource-object' || isListJson}
625
- {#if oneOf && oneOf.length >= 2}
626
- <div class="flex flex-col gap-2 w-full">
627
- {#if oneOf && oneOf.length >= 2}
628
- <ToggleButtonGroup
629
- bind:selected={oneOfSelected}
630
- on:selected={() => {
631
- value = { label: oneOfSelected }
632
- redraw += 1
633
- }}
634
- >
635
- {#each oneOf as obj}
636
- <ToggleButton value={obj.title} label={obj.title} />
637
- {/each}
638
- </ToggleButtonGroup>
639
- {#if oneOfSelected}
640
- {@const objIdx = oneOf.findIndex((o) => o.title === oneOfSelected)}
641
- {@const obj = oneOf[objIdx]}
642
- {#if obj && obj.properties && Object.keys(obj.properties).length > 0}
643
- {#key redraw}
644
- <div class="p-4 pl-8 border rounded w-full">
645
- {#if orderEditable}
646
- <SchemaFormDnd
647
- {onlyMaskPassword}
648
- {disablePortal}
649
- {disabled}
650
- schema={{
651
- properties: obj.properties,
652
- order: obj.order,
653
- $schema: '',
654
- required: obj.required ?? [],
655
- type: 'object'
656
- }}
657
- args={value}
658
- dndType={`nested-${title}`}
659
- on:reorder={(e) => {
660
- if (oneOf && oneOf[objIdx]) {
661
- const keys = e.detail
662
- oneOf[objIdx].order = keys
663
- }
664
- }}
665
- on:change
666
- />
667
- {:else}
668
- <SchemaForm
669
- {onlyMaskPassword}
670
- {disablePortal}
671
- {disabled}
672
- schemaSkippedValues={['label']}
673
- schema={{
674
- properties: obj.properties,
675
- order: obj.order,
676
- $schema: '',
677
- required: obj.required ?? [],
678
- type: 'object'
679
- }}
680
- bind:args={value}
681
- />
682
- {/if}
683
- </div>
684
- {/key}
685
- {:else if disabled}
686
- <textarea disabled />
687
- {:else}
688
- <JsonEditor
689
- bind:editor
690
- on:focus={(e) => {
691
- dispatch('focus')
692
- }}
693
- on:blur={(e) => {
694
- dispatch('blur')
695
- }}
696
- code={rawValue}
697
- bind:value
698
- />
699
- {/if}
700
- {/if}
701
- {:else if disabled}
702
- <textarea disabled />
703
- {:else}
704
- <JsonEditor
705
- bind:editor
706
- on:focus={(e) => {
707
- dispatch('focus')
708
- }}
709
- on:blur={(e) => {
710
- dispatch('blur')
711
- }}
712
- code={rawValue}
713
- bind:value
714
- />
715
- {/if}
716
- </div>
717
- {:else if properties && Object.keys(properties).length > 0 && inputCat !== 'list'}
718
- <div class="p-4 pl-8 border rounded-md w-full">
719
- {#if orderEditable}
720
- <SchemaFormDnd
721
- {onlyMaskPassword}
722
- {disablePortal}
723
- {disabled}
724
- schema={{
725
- properties,
726
- $schema: '',
727
- required: nestedRequired ?? [],
728
- type: 'object',
729
- order
730
- }}
731
- args={value}
732
- dndType={`nested-${title}`}
733
- on:reorder={(e) => {
734
- const keys = e.detail
735
- order = keys
736
- }}
737
- on:change
738
- />
739
- {:else}
740
- <SchemaForm
741
- {onlyMaskPassword}
742
- {disablePortal}
743
- {disabled}
744
- schema={{
745
- properties,
746
- order,
747
- $schema: '',
748
- required: nestedRequired ?? [],
749
- type: 'object'
750
- }}
751
- bind:args={value}
752
- />
753
- {/if}
754
- </div>
755
- {:else if disabled}
756
- <textarea disabled />
757
- {:else}
758
- <JsonEditor
759
- bind:editor
760
- on:focus={(e) => {
761
- dispatch('focus')
762
- }}
763
- on:blur={(e) => {
764
- dispatch('blur')
765
- }}
766
- code={rawValue}
767
- bind:value
768
- />
769
- {/if}
770
- {#if inputCat == 'list'}
771
- <div class="block">
772
- <Toggle
773
- on:change={(e) => {
774
- isListJson = !isListJson
803
+ {:else}
804
+ <SchemaForm
805
+ {nestedClasses}
806
+ {onlyMaskPassword}
807
+ {disablePortal}
808
+ {disabled}
809
+ schema={{
810
+ properties,
811
+ order,
812
+ $schema: '',
813
+ required: nestedRequired ?? [],
814
+ type: 'object'
815
+ }}
816
+ bind:args={value}
817
+ diff={diffStatus && typeof diffStatus.diff === 'object' ? diffStatus.diff : {}}
818
+ nestedParent={{ label, nestedParent }}
819
+ on:acceptChange={(e) => {
820
+ dispatch('acceptChange', e.detail)
821
+ }}
822
+ on:rejectChange={(e) => {
823
+ dispatch('rejectChange', e.detail)
775
824
  }}
776
- checked={isListJson}
777
- textClass="text-secondary"
778
- size="xs"
779
- options={{ right: 'json' }}
825
+ on:change={() => {
826
+ dispatch('nestedChange')
827
+ }}
828
+ on:nestedChange
829
+ {shouldDispatchChanges}
780
830
  />
781
- </div>
782
- {/if}
783
- {:else if inputCat == 'enum'}
784
- <div class="flex flex-row w-full gap-1">
785
- <ArgEnum
786
- {required}
787
- create={extra['disableCreate'] != true}
788
- {defaultValue}
789
- {valid}
790
- {disabled}
791
- bind:value
792
- {enum_}
793
- {autofocus}
794
- on:focus={() => {
795
- dispatch('focus')
796
- }}
797
- on:blur={(e) => {
798
- dispatch('blur')
799
- }}
800
- enumLabels={extra['enumLabels']}
801
- />
831
+ {/if}
802
832
  </div>
803
- {:else if inputCat == 'date'}
804
- {#if format === 'date'}
805
- <DateInput {autofocus} bind:value dateFormat={extra?.['dateFormat']} />
806
- {:else}
807
- <DateTimeInput useDropdown {autofocus} bind:value />
808
- {/if}
809
- {:else if inputCat == 'sql' || inputCat == 'yaml'}
810
- <div class="border my-1 mb-4 w-full border-primary">
811
- <SimpleEditor
812
- on:focus={(e) => {
813
- dispatch('focus')
814
- }}
815
- on:blur={(e) => {
816
- dispatch('blur')
833
+ {:else if disabled}
834
+ <textarea disabled />
835
+ {:else}
836
+ <JsonEditor
837
+ bind:editor
838
+ on:focus={(e) => {
839
+ dispatch('focus')
840
+ }}
841
+ on:blur={(e) => {
842
+ dispatch('blur')
843
+ }}
844
+ code={rawValue}
845
+ bind:value
846
+ />
847
+ {/if}
848
+ {#if inputCat == 'list'}
849
+ <div class="block">
850
+ <Toggle
851
+ on:change={(e) => {
852
+ isListJson = !isListJson
817
853
  }}
818
- bind:this={editor}
819
- lang={inputCat}
820
- bind:code={value}
821
- autoHeight
822
- />
823
- </div>
824
- {:else if inputCat == 'base64'}
825
- <div class="flex flex-col my-6 w-full">
826
- <input
827
- {autofocus}
828
- type="file"
829
- on:change={(x) => fileChanged(x, (val) => (value = val))}
830
- multiple={false}
854
+ checked={isListJson}
855
+ textClass="text-secondary"
856
+ size="xs"
857
+ options={{ right: 'json' }}
831
858
  />
832
- {#if value?.length}
833
- <div class="text-2xs text-tertiary mt-1"
834
- >File length: {value.length} base64 chars ({(value.length / 1024 / 1024).toFixed(
835
- 2
836
- )}MB)</div
837
- >
838
- {/if}
839
859
  </div>
840
- {:else if inputCat == 'resource-string'}
841
- <ResourcePicker
842
- selectFirst={noDefaultOnSelectFirst}
843
- {disablePortal}
860
+ {/if}
861
+ {:else if inputCat == 'enum'}
862
+ <div class="flex flex-row w-full gap-1">
863
+ <ArgEnum
864
+ {required}
865
+ create={extra['disableCreate'] != true}
866
+ {defaultValue}
867
+ {valid}
868
+ {disabled}
844
869
  bind:value
845
- initialValue={defaultValue}
846
- resourceType={format && format.split('-').length > 1
847
- ? format.substring('resource-'.length)
848
- : undefined}
849
- {showSchemaExplorer}
870
+ {enum_}
871
+ {autofocus}
872
+ on:focus={() => {
873
+ dispatch('focus')
874
+ }}
875
+ on:blur={(e) => {
876
+ dispatch('blur')
877
+ }}
878
+ enumLabels={extra['enumLabels']}
850
879
  />
851
- {:else if inputCat == 'email'}
880
+ </div>
881
+ {:else if inputCat == 'date'}
882
+ {#if format === 'date'}
883
+ <DateInput {autofocus} bind:value dateFormat={extra?.['dateFormat']} />
884
+ {:else}
885
+ <DateTimeInput useDropdown {autofocus} bind:value />
886
+ {/if}
887
+ {:else if inputCat == 'sql' || inputCat == 'yaml'}
888
+ <div class="border my-1 mb-4 w-full border-primary">
889
+ <SimpleEditor
890
+ on:focus={(e) => {
891
+ dispatch('focus')
892
+ }}
893
+ on:blur={(e) => {
894
+ dispatch('blur')
895
+ }}
896
+ bind:this={editor}
897
+ lang={inputCat}
898
+ bind:code={value}
899
+ autoHeight
900
+ />
901
+ </div>
902
+ {:else if inputCat == 'base64'}
903
+ <div class="flex flex-col my-6 w-full">
852
904
  <input
853
905
  {autofocus}
854
- on:focus
855
- on:blur
856
- {disabled}
857
- type="email"
858
- class={valid
859
- ? ''
860
- : 'border border-red-700 border-opacity-30 focus:border-red-700 focus:border-opacity-3'}
861
- placeholder={placeholder ?? defaultValue ?? ''}
862
- bind:value
906
+ type="file"
907
+ on:change={(x) => fileChanged(x, (val) => (value = val))}
908
+ multiple={false}
863
909
  />
864
- {:else if inputCat == 'string'}
865
- <div class="flex flex-col w-full">
866
- <div class="flex flex-row w-full items-center justify-between relative">
867
- {#if password || extra?.['password'] == true}
868
- {#if onlyMaskPassword}
869
- {#if value && typeof value == 'string' && value?.startsWith('$var:')}
870
- <input type="text" bind:value />
871
- {:else}
872
- <Password
873
- {disabled}
874
- bind:password={value}
875
- placeholder={placeholder ?? defaultValue ?? ''}
876
- />
877
- {/if}
910
+ {#if value?.length}
911
+ <div class="text-2xs text-tertiary mt-1"
912
+ >File length: {value.length} base64 chars ({(value.length / 1024 / 1024).toFixed(
913
+ 2
914
+ )}MB)</div
915
+ >
916
+ {/if}
917
+ </div>
918
+ {:else if inputCat == 'resource-string'}
919
+ <ResourcePicker
920
+ selectFirst={noDefaultOnSelectFirst}
921
+ {disablePortal}
922
+ bind:value
923
+ initialValue={defaultValue}
924
+ resourceType={format && format.split('-').length > 1
925
+ ? format.substring('resource-'.length)
926
+ : undefined}
927
+ {showSchemaExplorer}
928
+ />
929
+ {:else if inputCat == 'email'}
930
+ <input
931
+ {autofocus}
932
+ on:focus
933
+ on:blur
934
+ {disabled}
935
+ type="email"
936
+ class={valid
937
+ ? ''
938
+ : 'border border-red-700 border-opacity-30 focus:border-red-700 focus:border-opacity-3'}
939
+ placeholder={placeholder ?? defaultValue ?? ''}
940
+ bind:value
941
+ />
942
+ {:else if inputCat == 'string'}
943
+ <div class="flex flex-col w-full">
944
+ <div class="flex flex-row w-full items-center justify-between relative">
945
+ {#if password || extra?.['password'] == true}
946
+ {#if onlyMaskPassword}
947
+ {#if value && typeof value == 'string' && value?.startsWith('$var:')}
948
+ <input type="text" bind:value />
878
949
  {:else}
879
- <PasswordArgInput {disabled} bind:value />
880
- {/if}
881
- {:else}
882
- {#key extra?.['minRows']}
883
- <textarea
884
- {autofocus}
885
- rows={extra?.['minRows'] ? extra['minRows']?.toString() : '1'}
886
- bind:this={el}
887
- on:focus={(e) => {
888
- dispatch('focus')
889
- }}
890
- on:blur={(e) => {
891
- dispatch('blur')
892
- }}
893
- use:autosize
894
- on:keydown={onKeyDown}
950
+ <Password
895
951
  {disabled}
896
- class={twMerge(
897
- 'w-full',
898
- valid
899
- ? ''
900
- : 'border border-red-700 border-opacity-30 focus:border-red-700 focus:border-opacity-3'
901
- )}
952
+ bind:password={value}
902
953
  placeholder={placeholder ?? defaultValue ?? ''}
903
- bind:value
904
954
  />
905
- {/key}
906
- {#if !disabled && itemPicker && extra?.['disableVariablePicker'] != true}
907
- <!-- svelte-ignore a11y-click-events-have-key-events -->
908
- <button
909
- class="absolute right-1 top-1 py-1 min-w-min !px-2 items-center text-gray-800 bg-surface-secondary border rounded center-center hover:bg-gray-300 transition-all cursor-pointer"
910
- on:click={() => {
911
- pickForField = label
912
- itemPicker?.openDrawer?.()
913
- }}
914
- title="Insert a Variable"
915
- >
916
- <DollarSign class="!text-tertiary" size={14} />
917
- </button>
918
955
  {/if}
956
+ {:else}
957
+ <PasswordArgInput {disabled} bind:value />
958
+ {/if}
959
+ {:else}
960
+ {#key extra?.['minRows']}
961
+ <textarea
962
+ {autofocus}
963
+ rows={extra?.['minRows'] ? extra['minRows']?.toString() : '1'}
964
+ bind:this={el}
965
+ on:focus={(e) => {
966
+ dispatch('focus')
967
+ }}
968
+ on:blur={(e) => {
969
+ dispatch('blur')
970
+ }}
971
+ use:autosize
972
+ on:keydown={onKeyDown}
973
+ {disabled}
974
+ class={twMerge(
975
+ 'w-full',
976
+ valid
977
+ ? ''
978
+ : 'border border-red-700 border-opacity-30 focus:border-red-700 focus:border-opacity-3'
979
+ )}
980
+ placeholder={placeholder ?? defaultValue ?? ''}
981
+ bind:value
982
+ />
983
+ {/key}
984
+ {#if !disabled && itemPicker && extra?.['disableVariablePicker'] != true}
985
+ <!-- svelte-ignore a11y-click-events-have-key-events -->
986
+ <button
987
+ class="absolute right-1 top-1 py-1 min-w-min !px-2 items-center text-gray-800 bg-surface-secondary border rounded center-center hover:bg-gray-300 transition-all cursor-pointer"
988
+ on:click={() => {
989
+ pickForField = label
990
+ itemPicker?.openDrawer?.()
991
+ }}
992
+ title="Insert a Variable"
993
+ >
994
+ <DollarSign class="!text-tertiary" size={14} />
995
+ </button>
919
996
  {/if}
920
- </div>
921
- {#if variableEditor}
922
- <div class="text-sm text-tertiary">
923
- {#if value && typeof value == 'string' && value?.startsWith('$var:')}
924
- Linked to variable <button
925
- class="text-blue-500 underline"
926
- on:click={() => variableEditor?.editVariable?.(value.slice(5))}
927
- >{value.slice(5)}</button
928
- >
929
- {/if}
930
- </div>
931
997
  {/if}
932
998
  </div>
933
- {/if}
934
- <slot name="actions" />
935
- </div>
936
-
937
- {#if !compact || (error && error != '')}
938
- <div class="text-right text-xs text-red-600 dark:text-red-400">
939
- {#if disabled || error === ''}
940
- &nbsp;
941
- {:else}
942
- {error}
999
+ {#if variableEditor}
1000
+ <div class="text-sm text-tertiary">
1001
+ {#if value && typeof value == 'string' && value?.startsWith('$var:')}
1002
+ Linked to variable <button
1003
+ class="text-blue-500 underline"
1004
+ on:click={() => variableEditor?.editVariable?.(value.slice(5))}
1005
+ >{value.slice(5)}</button
1006
+ >
1007
+ {/if}
1008
+ </div>
943
1009
  {/if}
944
1010
  </div>
945
- {:else if !noMargin}
946
- <div class="mb-2" />
947
1011
  {/if}
1012
+ <slot name="actions" />
948
1013
  </div>
1014
+
1015
+ {#if !compact || (error && error != '')}
1016
+ <div class="text-right text-xs text-red-600 dark:text-red-400">
1017
+ {#if disabled || error === ''}
1018
+ &nbsp;
1019
+ {:else}
1020
+ {error}
1021
+ {/if}
1022
+ </div>
1023
+ {:else if !noMargin}
1024
+ <div class="mb-2" />
1025
+ {/if}
949
1026
  </div>
950
1027
 
951
1028
  <style>