windmill-components 1.35.43 → 1.36.0

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 (134) hide show
  1. package/components/AppConnect.svelte +85 -59
  2. package/components/ArgInput.svelte +31 -14
  3. package/components/Button.svelte +15 -48
  4. package/components/Button.svelte.d.ts +1 -1
  5. package/components/CronInput.svelte +1 -1
  6. package/components/DisplayResult.svelte +31 -29
  7. package/components/Dropdown.svelte +9 -7
  8. package/components/Editor.svelte +10 -14
  9. package/components/EditorBar.svelte +115 -91
  10. package/components/FlowBuilder.svelte +63 -74
  11. package/components/FlowPreviewContent.svelte +44 -24
  12. package/components/FlowStatusViewer.svelte +2 -5
  13. package/components/FlowViewer.svelte +12 -10
  14. package/components/GroupModal.svelte +10 -1
  15. package/components/HighlightCode.svelte +4 -3
  16. package/components/InputTransformForm.svelte +15 -14
  17. package/components/InputTransformsViewer.svelte +1 -1
  18. package/components/InviteGlobalUser.svelte +8 -8
  19. package/components/InviteUser.svelte +9 -9
  20. package/components/ItemPicker.svelte +36 -29
  21. package/components/ItemPicker.svelte.d.ts +2 -1
  22. package/components/JobStatus.svelte +2 -1
  23. package/components/ModulePreview.svelte +7 -8
  24. package/components/Path.svelte +1 -1
  25. package/components/RadioButton.svelte +3 -2
  26. package/components/ResourceEditor.svelte +22 -34
  27. package/components/ResourceTypePicker.svelte +23 -34
  28. package/components/RunForm.svelte +23 -31
  29. package/components/SchemaEditor.svelte +16 -10
  30. package/components/SchemaForm.svelte +3 -1
  31. package/components/SchemaForm.svelte.d.ts +1 -0
  32. package/components/SchemaModal.svelte +18 -7
  33. package/components/ScriptBuilder.svelte +22 -17
  34. package/components/ScriptEditor.svelte +2 -1
  35. package/components/ScriptPicker.svelte +21 -11
  36. package/components/ScriptSchema.svelte +8 -11
  37. package/components/ScriptSchema.svelte.d.ts +0 -1
  38. package/components/ShareModal.svelte +6 -6
  39. package/components/SimpleEditor.svelte +10 -10
  40. package/components/StringTypeNarrowing.svelte +24 -30
  41. package/components/TestJobLoader.svelte +15 -7
  42. package/components/Tooltip.svelte +1 -1
  43. package/components/VariableEditor.svelte +15 -24
  44. package/components/common/actionRow/ActionRow.svelte +11 -6
  45. package/components/common/actionRow/ActionRow.svelte.d.ts +1 -0
  46. package/components/common/badge/Badge.svelte +2 -8
  47. package/components/common/badge/model.d.ts +1 -1
  48. package/components/common/button/Button.svelte +7 -4
  49. package/components/common/button/Button.svelte.d.ts +2 -0
  50. package/components/common/confirmationModal/ConfirmationModal.svelte +19 -2
  51. package/components/common/confirmationModal/UnsavedConfirmationModal.svelte +41 -0
  52. package/components/common/confirmationModal/UnsavedConfirmationModal.svelte.d.ts +14 -0
  53. package/components/common/confirmationModal/dirtyStore.d.ts +1 -0
  54. package/components/common/confirmationModal/dirtyStore.js +2 -0
  55. package/components/flows/FlowEditor.svelte +7 -7
  56. package/components/flows/FlowEditor.svelte.d.ts +3 -1
  57. package/components/flows/common/FlowCardHeader.svelte +1 -1
  58. package/components/flows/content/FlowEditorPanel.svelte +5 -6
  59. package/components/flows/content/FlowEditorPanel.svelte.d.ts +3 -1
  60. package/components/flows/content/FlowFailureModule.svelte +2 -4
  61. package/components/flows/content/FlowInput.svelte +5 -1
  62. package/components/flows/content/FlowInputs.svelte +27 -12
  63. package/components/flows/content/FlowInputs.svelte.d.ts +1 -0
  64. package/components/flows/content/FlowLoop.svelte +155 -25
  65. package/components/flows/content/FlowLoop.svelte.d.ts +5 -1
  66. package/components/flows/content/FlowLoopWrapper.svelte +9 -0
  67. package/components/flows/content/FlowLoopWrapper.svelte.d.ts +14 -0
  68. package/components/flows/content/FlowModule.svelte +31 -10
  69. package/components/flows/content/FlowModule.svelte.d.ts +1 -1
  70. package/components/flows/content/FlowModuleEarlyStop.svelte +76 -0
  71. package/components/flows/content/FlowModuleEarlyStop.svelte.d.ts +17 -0
  72. package/components/flows/content/FlowModuleHeader.svelte +90 -1
  73. package/components/flows/content/FlowModuleHeader.svelte.d.ts +3 -0
  74. package/components/flows/content/FlowModuleSuspend.svelte +27 -0
  75. package/components/flows/content/FlowModuleSuspend.svelte.d.ts +17 -0
  76. package/components/flows/content/FlowModuleWrapper.svelte +4 -6
  77. package/components/flows/content/FlowRetries.svelte +18 -18
  78. package/components/flows/content/FlowRetries.svelte.d.ts +4 -1
  79. package/components/flows/content/FlowSettings.svelte +39 -12
  80. package/components/flows/content/FlowSettings.svelte.d.ts +1 -0
  81. package/components/flows/content/RemoveStepConfirmationModal.svelte +1 -1
  82. package/components/flows/flowStateUtils.d.ts +1 -1
  83. package/components/flows/flowStateUtils.js +2 -2
  84. package/components/flows/header/FlowImportExportMenu.svelte +4 -5
  85. package/components/flows/header/FlowPreviewButtons.svelte +24 -16
  86. package/components/flows/map/FlowErrorHandlerItem.svelte +14 -8
  87. package/components/flows/map/FlowModuleSchemaItem.svelte +41 -19
  88. package/components/flows/map/FlowModuleSchemaItem.svelte.d.ts +6 -1
  89. package/components/flows/map/FlowModuleSchemaMap.svelte +86 -6
  90. package/components/flows/pickers/PickHubScript.svelte +2 -1
  91. package/components/flows/propPicker/PropPickerWrapper.svelte +3 -1
  92. package/components/flows/propPicker/PropPickerWrapper.svelte.d.ts +2 -0
  93. package/components/flows/types.d.ts +0 -1
  94. package/components/flows/utils.d.ts +2 -0
  95. package/components/flows/utils.js +19 -0
  96. package/components/icons/AirtableIcon.svelte +1 -1
  97. package/components/icons/DiscordIcon.svelte +1 -1
  98. package/components/icons/GCloudIcon.svelte +1 -1
  99. package/components/icons/GItlabIcon.svelte +1 -1
  100. package/components/icons/GSheetsIcon.svelte +1 -1
  101. package/components/icons/GcalIcon.svelte +1 -1
  102. package/components/icons/GdriveIcon.svelte +1 -1
  103. package/components/icons/GithubIcon.svelte +1 -1
  104. package/components/icons/GmailIcon.svelte +1 -1
  105. package/components/icons/MastodonIcon.svelte +1 -1
  106. package/components/icons/MatrixIcon.svelte +1 -1
  107. package/components/icons/PostgresIcon.svelte +1 -1
  108. package/components/icons/S3Icon.svelte +1 -1
  109. package/components/icons/Slack.svelte +1 -1
  110. package/components/icons/TogglIcon.svelte +8 -46
  111. package/components/jobs/JobDetail.svelte +1 -1
  112. package/components/propertyPicker/ObjectViewer.svelte +9 -12
  113. package/components/propertyPicker/ObjectViewer.svelte.d.ts +1 -0
  114. package/components/propertyPicker/PropPicker.svelte +85 -14
  115. package/components/script_editor/LogPanel.svelte +1 -1
  116. package/editorUtils.d.ts +3 -0
  117. package/editorUtils.js +1 -0
  118. package/gen/core/OpenAPI.js +1 -1
  119. package/gen/index.d.ts +1 -0
  120. package/gen/models/FlowModule.d.ts +2 -0
  121. package/gen/models/FlowValue.d.ts +0 -11
  122. package/gen/models/Retry.d.ts +11 -0
  123. package/gen/models/Retry.js +4 -0
  124. package/package.json +18 -15
  125. package/script_helpers.d.ts +4 -1
  126. package/script_helpers.js +48 -4
  127. package/utils.d.ts +2 -2
  128. package/utils.js +31 -18
  129. package/components/flows/content/FlowModuleAdvancedSettings.svelte +0 -64
  130. package/components/flows/content/FlowModuleAdvancedSettings.svelte.d.ts +0 -17
  131. package/components/flows/header/FlowEditorHeader.svelte +0 -23
  132. package/components/flows/header/FlowEditorHeader.svelte.d.ts +0 -14
  133. package/components/flows/header/FlowStatus.svelte +0 -36
  134. package/components/flows/header/FlowStatus.svelte.d.ts +0 -14
@@ -3,6 +3,7 @@ declare const __propDef: {
3
3
  props: {
4
4
  [x: string]: any;
5
5
  applyPageWidth?: boolean | undefined;
6
+ stickToTop?: boolean | undefined;
6
7
  };
7
8
  events: {
8
9
  [evt: string]: CustomEvent<any>;
@@ -24,16 +24,12 @@ const colors = {
24
24
  green: 'bg-green-100 text-green-800 dark:bg-green-200 dark:text-green-900',
25
25
  yellow: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-200 dark:text-yellow-900',
26
26
  indigo: 'bg-indigo-100 text-indigo-800 dark:bg-indigo-200 dark:text-indigo-900',
27
- purple: 'bg-purple-100 text-purple-800 dark:bg-purple-200 dark:text-purple-900',
28
- pink: 'bg-pink-100 text-pink-800 dark:bg-pink-200 dark:text-pink-900',
29
27
  ['dark-gray']: 'bg-gray-500 text-gray-100',
30
28
  ['dark-blue']: 'bg-blue-500 text-blue-100',
31
29
  ['dark-red']: 'bg-red-500 text-white',
32
30
  ['dark-green']: 'bg-green-500 text-green-100',
33
31
  ['dark-yellow']: 'bg-yellow-300 text-yellow-800',
34
- ['dark-indigo']: 'bg-indigo-500 text-indigo-100',
35
- ['dark-purple']: 'bg-purple-500 text-purple-100',
36
- ['dark-pink']: 'bg-pink-500 text-pink-100'
32
+ ['dark-indigo']: 'bg-indigo-500 text-indigo-100'
37
33
  };
38
34
  const hovers = {
39
35
  gray: 'hover:bg-gray-200 dark:hover:bg-gray-300',
@@ -41,9 +37,7 @@ const hovers = {
41
37
  red: 'hover:bg-red-200 dark:hover:bg-red-300',
42
38
  green: 'hover:bg-green-200 dark:hover:bg-green-300',
43
39
  yellow: 'hover:bg-yellow-200 dark:hover:bg-yellow-300',
44
- indigo: 'hover:bg-indigo-200 dark:hover:bg-indigo-300',
45
- purple: 'hover:bg-purple-200 dark:hover:bg-purple-300',
46
- pink: 'hover:bg-pink-200 dark:hover:bg-pink-300'
40
+ indigo: 'hover:bg-indigo-200 dark:hover:bg-indigo-300'
47
41
  };
48
42
  $: badgeClass = classNames(baseClass, large ? 'text-sm font-medium' : 'text-xs font-semibold', colors[color], href &&
49
43
  (color.startsWith(ColorModifier) ? hovers[color.replace(ColorModifier, '')] : hovers[color]), rounded ? 'rounded-full px-2 py-1' : 'rounded px-2.5 py-0.5', index
@@ -1,5 +1,5 @@
1
1
  import type { IconProps } from 'svelte-awesome/components/Icon.svelte';
2
- declare type BaseColor = 'blue' | 'gray' | 'red' | 'green' | 'yellow' | 'indigo' | 'purple' | 'pink';
2
+ declare type BaseColor = 'blue' | 'gray' | 'red' | 'green' | 'yellow' | 'indigo';
3
3
  export declare const ColorModifier = "dark-";
4
4
  export declare type BadgeColor = BaseColor | `${typeof ColorModifier}${BaseColor}`;
5
5
  export interface BadgeIconProps extends IconProps {
@@ -10,6 +10,7 @@ export let disabled = false;
10
10
  export let href = undefined;
11
11
  export let target = '_self';
12
12
  export let iconOnly = false;
13
+ export let id = '';
13
14
  export let startIcon = undefined;
14
15
  export let endIcon = undefined;
15
16
  // Order of classes: border, border modifier, bg, bg modifier, text, text modifier, everything else
@@ -19,8 +20,8 @@ const colorVariants = {
19
20
  contained: 'bg-blue-500 hover:bg-blue-700 text-white focus:ring-blue-300'
20
21
  },
21
22
  red: {
22
- border: 'border-red-500 hover:border-red-700 bg-white hover:bg-red-100 text-red-500 hover:text-red-700 focus:ring-red-300',
23
- contained: 'bg-red-500 hover:bg-red-700 text-white focus:ring-red-300'
23
+ border: 'border-red-600 hover:border-red-700 bg-white hover:bg-red-100 text-red-600 hover:text-red-700 focus:ring-red-300',
24
+ contained: 'bg-red-600 hover:bg-red-700 text-white focus:ring-red-300'
24
25
  },
25
26
  dark: {
26
27
  border: 'border-gray-800 hover:border-gray-900 bg-white hover:bg-gray-200 text-gray-800 hover:text-gray-900 focus:ring-gray-300',
@@ -46,7 +47,7 @@ const spacingClasses = {
46
47
  xl: 'px-4 py-2'
47
48
  };
48
49
  const iconScale = {
49
- xs: 0.7,
50
+ xs: 0.6,
50
51
  sm: 0.8,
51
52
  md: 1,
52
53
  lg: 1.1,
@@ -56,10 +57,12 @@ $: buttonProps = {
56
57
  class: classNames(colorVariants[color][variant], variant === 'border' ? 'border' : '', fontSizeClasses[size], spacingClasses[spacingSize], 'focus:ring-4 font-medium', 'rounded-md', 'flex justify-center items-center text-center whitespace-nowrap', btnClasses, disabled ? 'pointer-events-none cursor-default filter grayscale' : ''),
57
58
  disabled
58
59
  };
60
+ $: isSmall = size === 'xs' || size === 'sm';
59
61
  </script>
60
62
 
61
63
  {#if href}
62
64
  <button
65
+ {id}
63
66
  type="button"
64
67
  on:click|stopPropagation={() => goto(href ?? '#')}
65
68
  {target}
@@ -85,7 +88,7 @@ $: buttonProps = {
85
88
  {/if}
86
89
  </button>
87
90
  {:else}
88
- <button type="button" on:click|stopPropagation {...buttonProps}>
91
+ <button {id} type="button" on:click|stopPropagation {...buttonProps} {...$$restProps}>
89
92
  {#if startIcon}
90
93
  <Icon
91
94
  data={startIcon.icon}
@@ -2,6 +2,7 @@ import { SvelteComponentTyped } from "svelte";
2
2
  import type { Button } from './model';
3
3
  declare const __propDef: {
4
4
  props: {
5
+ [x: string]: any;
5
6
  size?: Button.Size | undefined;
6
7
  spacingSize?: Button.Size | undefined;
7
8
  color?: Button.Color | undefined;
@@ -11,6 +12,7 @@ declare const __propDef: {
11
12
  href?: string | undefined;
12
13
  target?: Button.Target | undefined;
13
14
  iconOnly?: boolean | undefined;
15
+ id?: string | undefined;
14
16
  startIcon?: {
15
17
  icon: any;
16
18
  classes?: string;
@@ -4,12 +4,27 @@ import { createEventDispatcher } from 'svelte';
4
4
  import Icon from 'svelte-awesome';
5
5
  import { fade } from 'svelte/transition';
6
6
  import Button from '../button/Button.svelte';
7
+ import Badge from '../badge/Badge.svelte';
7
8
  export let title;
8
9
  export let confirmationText;
9
10
  export let open = false;
10
11
  const dispatch = createEventDispatcher();
12
+ function onKeyDown(event) {
13
+ if (open) {
14
+ switch (event.key) {
15
+ case 'Enter':
16
+ dispatch('confirmed');
17
+ break;
18
+ case 'Escape':
19
+ dispatch('canceled');
20
+ break;
21
+ }
22
+ }
23
+ }
11
24
  </script>
12
25
 
26
+ <svelte:window on:keydown={onKeyDown} />
27
+
13
28
  {#if open}
14
29
  <div transition:fade={{ duration: 100 }} class={'relative z-50'} role="dialog">
15
30
  <div
@@ -44,9 +59,11 @@ const dispatch = createEventDispatcher();
44
59
  </div>
45
60
  <div class="flex items-center space-x-2 flex-row-reverse space-x-reverse mt-4">
46
61
  <Button on:click={() => dispatch('confirmed')} color="red" size="sm">
47
- {confirmationText}
62
+ <span>{confirmationText} <Badge>Enter</Badge></span>
63
+ </Button>
64
+ <Button on:click={() => dispatch('canceled')} color="light" size="sm">
65
+ <span>Cancel <Badge color="dark-gray">Escape</Badge></span>
48
66
  </Button>
49
- <Button on:click={() => dispatch('canceled')} color="light" size="sm">Cancel</Button>
50
67
  </div>
51
68
  </div>
52
69
  </div>
@@ -0,0 +1,41 @@
1
+ <script>import ConfirmationModal from './ConfirmationModal.svelte';
2
+ import { beforeNavigate, goto } from '$app/navigation';
3
+ import { onDestroy } from 'svelte/internal';
4
+ import { dirtyStore } from './dirtyStore';
5
+ let navigationState = undefined;
6
+ $: open = Boolean(navigationState);
7
+ beforeNavigate((newNavigationState) => {
8
+ if (!navigationState &&
9
+ $dirtyStore &&
10
+ newNavigationState.to?.pathname !== newNavigationState.from.pathname) {
11
+ navigationState = newNavigationState;
12
+ newNavigationState.cancel();
13
+ }
14
+ });
15
+ onDestroy(() => {
16
+ $dirtyStore = false;
17
+ });
18
+ </script>
19
+
20
+ <ConfirmationModal
21
+ {open}
22
+ title="Unsaved changes detected"
23
+ confirmationText="Discard changes"
24
+ on:canceled={() => {
25
+ if (navigationState) {
26
+ navigationState.cancel()
27
+ }
28
+ navigationState = undefined
29
+ }}
30
+ on:confirmed={() => {
31
+ if (navigationState?.to) {
32
+ goto(navigationState.to)
33
+ }
34
+ $dirtyStore = false
35
+ navigationState = undefined
36
+ }}
37
+ >
38
+ <div class="flex flex-col w-full space-y-4">
39
+ <span>Are you sure you want to discard change you have made?</span>
40
+ </div>
41
+ </ConfirmationModal>
@@ -0,0 +1,14 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {};
4
+ events: {
5
+ [evt: string]: CustomEvent<any>;
6
+ };
7
+ slots: {};
8
+ };
9
+ export declare type UnsavedConfirmationModalProps = typeof __propDef.props;
10
+ export declare type UnsavedConfirmationModalEvents = typeof __propDef.events;
11
+ export declare type UnsavedConfirmationModalSlots = typeof __propDef.slots;
12
+ export default class UnsavedConfirmationModal extends SvelteComponentTyped<UnsavedConfirmationModalProps, UnsavedConfirmationModalEvents, UnsavedConfirmationModalSlots> {
13
+ }
14
+ export {};
@@ -0,0 +1 @@
1
+ export declare const dirtyStore: import("svelte/store").Writable<boolean>;
@@ -0,0 +1,2 @@
1
+ import { writable } from 'svelte/store';
2
+ export const dirtyStore = writable(false);
@@ -1,18 +1,18 @@
1
1
  <!-- Flow Editor: Top level component -->
2
2
  <script>import { HSplitPane } from 'svelte-split-pane';
3
- import FlowEditorHeader from './header/FlowEditorHeader.svelte';
4
3
  import FlowEditorPanel from './content/FlowEditorPanel.svelte';
5
4
  import FlowModuleSchemaMap from './map/FlowModuleSchemaMap.svelte';
6
5
  import { flowStore } from './flowStore';
7
6
  import { flowStateStore } from './flowState';
7
+ import FlowPreviewButtons from './header/FlowPreviewButtons.svelte';
8
+ export let initialPath;
8
9
  </script>
9
10
 
10
- <FlowEditorHeader />
11
-
12
- <div class="h-full overflow-hidden">
11
+ <div class="h-full overflow-hidden border-t">
13
12
  <HSplitPane leftPaneSize="25%" rightPaneSize="75%" minLeftPaneSize="20%" minRightPaneSize="40%">
14
- <left slot="left" class="h-full ">
15
- <div class="h-full overflow-auto p-4 bg-gray-50">
13
+ <left slot="left" class="h-full flex flex-col ">
14
+ <FlowPreviewButtons />
15
+ <div class="grow overflow-auto p-4 bg-gray-50">
16
16
  {#if $flowStore.value.modules && $flowStateStore.modules}
17
17
  <FlowModuleSchemaMap
18
18
  bind:modules={$flowStore.value.modules}
@@ -23,7 +23,7 @@ import { flowStateStore } from './flowState';
23
23
  </left>
24
24
  <right slot="right" class="h-full">
25
25
  <div class="h-full overflow-auto bg-white ">
26
- <FlowEditorPanel />
26
+ <FlowEditorPanel {initialPath} />
27
27
  </div>
28
28
  </right>
29
29
  </HSplitPane>
@@ -1,6 +1,8 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
2
  declare const __propDef: {
3
- props: {};
3
+ props: {
4
+ initialPath: string;
5
+ };
4
6
  events: {
5
7
  [evt: string]: CustomEvent<any>;
6
8
  };
@@ -33,7 +33,7 @@ const languageColors = {
33
33
  </span>
34
34
  {/if}
35
35
  {#if title}
36
- <span class="text-xs font-bold text-gray-900 flex flex-col">{title}</span>
36
+ <div class="text-sm font-bold text-gray-900">{title}</div>
37
37
  {/if}
38
38
  <slot />
39
39
  </div>
@@ -2,20 +2,19 @@
2
2
  import FlowModuleWrapper from './FlowModuleWrapper.svelte';
3
3
  import FlowSettings from './FlowSettings.svelte';
4
4
  import FlowInput from './FlowInput.svelte';
5
- import FlowLoop from './FlowLoop.svelte';
6
5
  import FlowFailureModule from './FlowFailureModule.svelte';
6
+ import FlowLoopWrapper from './FlowLoopWrapper.svelte';
7
+ export let initialPath;
7
8
  const { selectedId } = getContext('FlowEditorContext');
8
9
  </script>
9
10
 
10
11
  {#key $selectedId}
11
12
  {#if $selectedId === 'settings'}
12
- <FlowSettings />
13
+ <FlowSettings {initialPath} />
13
14
  {:else if $selectedId === 'settings-schedule'}
14
- <FlowSettings defaultTab="schedule" />
15
- {:else if $selectedId === 'settings-retries'}
16
- <FlowSettings defaultTab="retries" />
15
+ <FlowSettings {initialPath} defaultTab="schedule" />
17
16
  {:else if $selectedId.includes('loop')}
18
- <FlowLoop />
17
+ <FlowLoopWrapper />
19
18
  {:else if $selectedId === 'inputs'}
20
19
  <FlowInput />
21
20
  {:else if $selectedId === 'failure'}
@@ -1,6 +1,8 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
2
  declare const __propDef: {
3
- props: {};
3
+ props: {
4
+ initialPath: string;
5
+ };
4
6
  events: {
5
7
  [evt: string]: CustomEvent<any>;
6
8
  };
@@ -1,17 +1,15 @@
1
- <script>import { getContext } from 'svelte';
2
- import { flowStateStore } from '../flowState';
1
+ <script>import { flowStateStore } from '../flowState';
3
2
  import { flowStore } from '../flowStore';
4
3
  import FlowModule from './FlowModule.svelte';
5
- const { previewArgs } = getContext('FlowEditorContext');
6
4
  </script>
7
5
 
8
6
  {#if $flowStore.value.failure_module}
9
7
  <FlowModule
10
- previewArgs={previewArgs}
11
8
  bind:flowModule={$flowStore.value.failure_module}
12
9
  bind:flowModuleState={$flowStateStore.failureModule}
13
10
  on:delete={() => {
14
11
  $flowStore.value.failure_module = undefined
15
12
  }}
13
+ failureModule={true}
16
14
  />
17
15
  {/if}
@@ -1,5 +1,6 @@
1
1
  <script>import { flowStore } from '../flowStore';
2
2
  import SchemaEditor from '../../SchemaEditor.svelte';
3
+ import SchemaForm from '../../SchemaForm.svelte';
3
4
  import { emptySchema } from '../../../utils';
4
5
  import FlowCard from '../common/FlowCard.svelte';
5
6
  import CopyFirstStepSchema from './CopyFirstStepSchema.svelte';
@@ -15,8 +16,11 @@ import CopyFirstStepSchema from './CopyFirstStepSchema.svelte';
15
16
  on:change={() => {
16
17
  $flowStore = $flowStore
17
18
  }}
18
- schema={$flowStore?.schema ?? emptySchema()}
19
+ bind:schema={$flowStore.schema}
19
20
  />
20
21
  </div>
21
22
  </div>
23
+ <div class="p-6">
24
+ <SchemaForm bind:schema={$flowStore.schema} editableSchema={true} />
25
+ </div>
22
26
  </FlowCard>
@@ -6,6 +6,7 @@ import PickHubScript from '../pickers/PickHubScript.svelte';
6
6
  import PickScript from '../pickers/PickScript.svelte';
7
7
  export let shouldDisableLoopCreation = false;
8
8
  export let shouldDisableTriggerScripts = false;
9
+ export let failureModule;
9
10
  const dispatch = createEventDispatcher();
10
11
  </script>
11
12
 
@@ -15,8 +16,8 @@ const dispatch = createEventDispatcher();
15
16
  {/if}
16
17
 
17
18
  <div class="grid sm:grid-col-2 lg:grid-cols-3 gap-4">
18
- <PickScript kind={Script.kind.SCRIPT} on:pick />
19
- <PickHubScript kind={Script.kind.SCRIPT} on:pick />
19
+ <PickScript kind={failureModule ? Script.kind.FAILURE : Script.kind.SCRIPT} on:pick />
20
+ <PickHubScript kind={failureModule ? Script.kind.FAILURE : Script.kind.SCRIPT} on:pick />
20
21
 
21
22
  <FlowScriptPicker
22
23
  label={`Create a for-loop here`}
@@ -26,20 +27,26 @@ const dispatch = createEventDispatcher();
26
27
  on:click={() => dispatch('loop')}
27
28
  />
28
29
 
29
- <FlowScriptPicker
30
- label={`New PostgreSQL query`}
31
- icon={faCode}
32
- iconColor="text-blue-800"
33
- on:click={() =>
34
- dispatch('new', { language: RawScript.language.DENO, kind: 'script', subkind: 'pgsql' })}
35
- />
30
+ {#if !failureModule}
31
+ <FlowScriptPicker
32
+ label={`New PostgreSQL query`}
33
+ icon={faCode}
34
+ iconColor="text-blue-800"
35
+ on:click={() =>
36
+ dispatch('new', { language: RawScript.language.DENO, kind: 'script', subkind: 'pgsql' })}
37
+ />
38
+ {/if}
36
39
 
37
40
  <FlowScriptPicker
38
41
  label="New Python script (3.10)"
39
42
  icon={faCode}
40
43
  iconColor="text-green-500"
41
44
  on:click={() =>
42
- dispatch('new', { language: RawScript.language.PYTHON3, kind: 'script', subkind: 'flow' })}
45
+ dispatch('new', {
46
+ language: RawScript.language.PYTHON3,
47
+ kind: 'script',
48
+ subkind: failureModule ? 'failure' : 'flow'
49
+ })}
43
50
  />
44
51
 
45
52
  <FlowScriptPicker
@@ -47,7 +54,11 @@ const dispatch = createEventDispatcher();
47
54
  icon={faCode}
48
55
  iconColor="text-blue-800"
49
56
  on:click={() =>
50
- dispatch('new', { language: RawScript.language.DENO, kind: 'script', subkind: 'flow' })}
57
+ dispatch('new', {
58
+ language: RawScript.language.DENO,
59
+ kind: 'script',
60
+ subkind: failureModule ? 'failure' : 'flow'
61
+ })}
51
62
  />
52
63
 
53
64
  <FlowScriptPicker
@@ -55,7 +66,11 @@ const dispatch = createEventDispatcher();
55
66
  icon={faCode}
56
67
  iconColor="text-blue-700"
57
68
  on:click={() =>
58
- dispatch('new', { language: RawScript.language.GO, kind: 'script', subkind: 'flow' })}
69
+ dispatch('new', {
70
+ language: RawScript.language.GO,
71
+ kind: 'script',
72
+ subkind: failureModule ? 'failure' : 'flow'
73
+ })}
59
74
  />
60
75
  </div>
61
76
 
@@ -3,6 +3,7 @@ declare const __propDef: {
3
3
  props: {
4
4
  shouldDisableLoopCreation?: boolean | undefined;
5
5
  shouldDisableTriggerScripts?: boolean | undefined;
6
+ failureModule: boolean;
6
7
  };
7
8
  events: {
8
9
  pick: CustomEvent<any>;
@@ -4,35 +4,165 @@ import Toggle from '../../Toggle.svelte';
4
4
  import SimpleEditor from '../../SimpleEditor.svelte';
5
5
  import Tooltip from '../../Tooltip.svelte';
6
6
  import { flowStore } from '../flowStore';
7
- const { selectedId } = getContext('FlowEditorContext');
8
- const [prefix, index] = $selectedId.split('-');
7
+ import { getStepPropPicker } from '../flowStateUtils';
8
+ import { flowStateStore } from '../flowState';
9
+ import PropPickerWrapper from '../propPicker/PropPickerWrapper.svelte';
10
+ import { VSplitPane } from 'svelte-split-pane';
11
+ import FlowModuleEarlyStop from './FlowModuleEarlyStop.svelte';
12
+ import FlowModuleSuspend from './FlowModuleSuspend.svelte';
13
+ import FlowRetries from './FlowRetries.svelte';
14
+ import { Button, Tab, TabContent, Tabs } from '../../common';
15
+ const { previewArgs } = getContext('FlowEditorContext');
16
+ export let mod;
17
+ export let index;
18
+ let editor = undefined;
19
+ let monacos = {};
20
+ let selected = 'retries';
21
+ let inputTransformName = '';
22
+ $: mod = $flowStore.value.modules[index];
23
+ $: pickableProperties = getStepPropPicker([Number(index)], $flowStore.schema, $flowStateStore, $previewArgs).pickableProperties;
9
24
  </script>
10
25
 
11
26
  <FlowCard title="For loop">
27
+ <div slot="header" class="grow">
28
+ <input bind:value={mod.summary} placeholder={'Summary'} />
29
+ </div>
12
30
  <div>
13
- <div class="p-6 flex flex-col">
14
- {#if $flowStore.value.modules[index].value.type === 'forloopflow'}
15
- <span class="mb-2 text-sm font-bold"
16
- >Iterator expression
17
- <Tooltip>
18
- List to iterate over. For more information see the
19
- <a href="https://docs.windmill.dev/docs/getting_started/flows#for-loops">docs.</a>
20
- </Tooltip>
21
- </span>
22
- <SimpleEditor
23
- lang="javascript"
24
- bind:code={$flowStore.value.modules[index].value.iterator.expr}
25
- class="few-lines-editor"
26
- />
27
- <span class="mb-2 text-sm font-bold">Skip failures</span>
28
-
29
- <Toggle
30
- bind:checked={$flowStore.value.modules[index].value.skip_failures}
31
- options={{
32
- right: 'Skip failures'
33
- }}
34
- />
35
- {/if}
31
+ <div class="overflow-hidden flex-grow">
32
+ <VSplitPane topPanelSize="50%" downPanelSize="40%" minTopPaneSize="20%" minDownPaneSize="20%">
33
+ <top slot="top">
34
+ <div class="p-6 flex flex-col">
35
+ {#if mod.value.type === 'forloopflow'}
36
+ <span class="mb-2 text-sm font-bold"
37
+ >Iterator expression
38
+ <Tooltip>
39
+ List to iterate over. For more information see the
40
+ <a href="https://docs.windmill.dev/docs/getting_started/flows#for-loops">docs.</a>
41
+ </Tooltip>
42
+ </span>
43
+
44
+ {#if mod.value.iterator.type == 'javascript'}
45
+ <div class="border w-full">
46
+ <PropPickerWrapper
47
+ {pickableProperties}
48
+ on:select={({ detail }) => {
49
+ editor?.insertAtCursor(detail)
50
+ }}
51
+ >
52
+ <SimpleEditor
53
+ bind:this={editor}
54
+ lang="javascript"
55
+ bind:code={mod.value.iterator.expr}
56
+ class="small-editor"
57
+ shouldBindKey={false}
58
+ />
59
+ </PropPickerWrapper>
60
+ </div>
61
+ {:else}
62
+ <Button
63
+ on:click={() => {
64
+ if (mod.value.type === 'forloopflow') mod.value.iterator.type = 'javascript'
65
+ }}
66
+ />
67
+ {/if}
68
+
69
+ <span class="my-2 text-sm font-bold">Skip failures</span>
70
+
71
+ <Toggle
72
+ bind:checked={mod.value.skip_failures}
73
+ options={{
74
+ right: 'Skip failures'
75
+ }}
76
+ />
77
+ <span class="my-2 text-sm font-bold"
78
+ >Pass specific flow context as loop flow input</span
79
+ >
80
+ <div class="flex flex-row mt-4 w-80 max-w-full"
81
+ ><input
82
+ bind:value={inputTransformName}
83
+ placeholder="Argument name"
84
+ type="text"
85
+ class="w-20"
86
+ /><Button
87
+ disabled={inputTransformName == ''}
88
+ btnClasses="ml-2"
89
+ on:click={() =>
90
+ (mod.input_transforms[inputTransformName] = { type: 'javascript', expr: '' })}
91
+ >+</Button
92
+ ></div
93
+ >
94
+
95
+ {#each Object.keys(mod.input_transforms) as key}
96
+ <div class="flex flex-row my-2">
97
+ <span class="my-2 text-sm font-bold">{key}</span>
98
+
99
+ <Button
100
+ btnClasses="ml-4"
101
+ on:click={() => {
102
+ delete mod.input_transforms[key]
103
+ mod.input_transforms = mod.input_transforms
104
+ }}>-</Button
105
+ >
106
+ </div>
107
+ <div class="border w-full">
108
+ {#if mod.input_transforms[key].type == 'javascript'}
109
+ <PropPickerWrapper
110
+ {pickableProperties}
111
+ on:select={({ detail }) => {
112
+ monacos[key]?.insertAtCursor(detail)
113
+ }}
114
+ >
115
+ <SimpleEditor
116
+ bind:this={monacos[key]}
117
+ lang="javascript"
118
+ bind:code={mod.input_transforms[key]['expr']}
119
+ class="small-editor"
120
+ shouldBindKey={false}
121
+ />
122
+ </PropPickerWrapper>
123
+ {:else}
124
+ <Button
125
+ on:click={() => {
126
+ mod.input_transforms[key].type = 'javascript'
127
+ mod.input_transforms[key]['expr'] = ''
128
+ }}
129
+ />
130
+ {/if}
131
+ </div>
132
+ {/each}
133
+ {/if}
134
+ </div></top
135
+ >
136
+ <down slot="down" class="flex flex-col flex-1 h-full">
137
+ <Tabs bind:selected>
138
+ <Tab value="retries">Retries</Tab>
139
+ <Tab value="early-stop">Early Stop</Tab>
140
+ <Tab value="suspend">Suspend</Tab>
141
+
142
+ <svelte:fragment slot="content">
143
+ <div class="overflow-hidden bg-white" style="height:calc(100% - 32px);">
144
+ <TabContent value="retries" class="flex flex-col flex-1 h-full">
145
+ <div class="p-4 overflow-y-auto">
146
+ <FlowRetries bind:flowModule={mod} />
147
+ </div>
148
+ </TabContent>
149
+
150
+ <TabContent value="early-stop" class="flex flex-col flex-1 h-full">
151
+ <div class="p-4 overflow-y-auto">
152
+ <FlowModuleEarlyStop bind:flowModule={mod} />
153
+ </div>
154
+ </TabContent>
155
+
156
+ <TabContent value="suspend" class="flex flex-col flex-1 h-full">
157
+ <div class="p-4 overflow-y-auto">
158
+ <FlowModuleSuspend bind:flowModule={mod} />
159
+ </div>
160
+ </TabContent>
161
+ </div>
162
+ </svelte:fragment>
163
+ </Tabs>
164
+ </down>
165
+ </VSplitPane>
36
166
  </div>
37
167
  </div>
38
168
  </FlowCard>
@@ -1,6 +1,10 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
+ import type { FlowModule } from '../../../gen/models/FlowModule';
2
3
  declare const __propDef: {
3
- props: {};
4
+ props: {
5
+ mod: FlowModule;
6
+ index: number;
7
+ };
4
8
  events: {
5
9
  [evt: string]: CustomEvent<any>;
6
10
  };
@@ -0,0 +1,9 @@
1
+ <script>import { getContext } from 'svelte';
2
+ import { flowStore } from '../flowStore';
3
+ import { selectedIdToIndexes } from '../utils';
4
+ import FlowLoop from './FlowLoop.svelte';
5
+ const { selectedId } = getContext('FlowEditorContext');
6
+ $: index = selectedIdToIndexes($selectedId)[0];
7
+ </script>
8
+
9
+ <FlowLoop bind:mod={$flowStore.value.modules[index]} {index} />