windmill-components 1.379.3 → 1.382.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 (175) hide show
  1. package/package/components/ArgInput.svelte +33 -3
  2. package/package/components/DisplayResult.svelte +17 -5
  3. package/package/components/ErrorOrRecoveryHandler.svelte +3 -2
  4. package/package/components/FlowBuilder.svelte +3 -0
  5. package/package/components/FlowBuilder.svelte.d.ts +1 -0
  6. package/package/components/FlowGraphViewer.svelte +6 -5
  7. package/package/components/FlowJobResult.svelte +4 -2
  8. package/package/components/FlowJobResult.svelte.d.ts +2 -0
  9. package/package/components/FlowStatusViewerInner.svelte +17 -6
  10. package/package/components/FlowViewer.svelte +1 -0
  11. package/package/components/HighlightCode.svelte +2 -2
  12. package/package/components/ModulePreviewForm.svelte +1 -1
  13. package/package/components/ObjectResourceInput.svelte +7 -2
  14. package/package/components/ObjectResourceInput.svelte.d.ts +2 -0
  15. package/package/components/ResourcePicker.svelte +60 -48
  16. package/package/components/ScriptVersionHistory.svelte +63 -7
  17. package/package/components/apps/components/display/dbtable/DbExplorerCount.svelte +3 -2
  18. package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte +22 -5
  19. package/package/components/apps/components/display/table/AppAggridTable.svelte +14 -5
  20. package/package/components/apps/components/display/table/AppAggridTableActions.svelte +23 -8
  21. package/package/components/apps/components/display/table/AppAggridTableActions.svelte.d.ts +5 -3
  22. package/package/components/apps/components/display/table/utils.js +8 -7
  23. package/package/components/apps/components/helpers/RunnableComponent.svelte +13 -1
  24. package/package/components/apps/components/helpers/eval.js +31 -25
  25. package/package/components/apps/editor/AppEditorHeader.svelte +1 -0
  26. package/package/components/apps/editor/AppReportsDrawer.svelte +4 -3
  27. package/package/components/apps/editor/component/components.d.ts +1 -1
  28. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphEditor.svelte +0 -1
  29. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphHeader.svelte +55 -45
  30. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphHeader.svelte.d.ts +7 -9
  31. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphNode.svelte +66 -59
  32. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphNode.svelte.d.ts +9 -11
  33. package/package/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte +213 -254
  34. package/package/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte.d.ts +0 -1
  35. package/package/components/apps/editor/settingsPanel/decisionTree/nodeHelpers.d.ts +1 -1
  36. package/package/components/apps/editor/settingsPanel/decisionTree/nodeHelpers.js +2 -6
  37. package/package/components/details/DetailPageDetailPanel.svelte +9 -1
  38. package/package/components/details/DetailPageDetailPanel.svelte.d.ts +2 -1
  39. package/package/components/details/DetailPageLayout.svelte +2 -0
  40. package/package/components/details/DetailPageLayout.svelte.d.ts +3 -0
  41. package/package/components/details/EmailTriggerPanel.svelte +128 -0
  42. package/package/components/details/EmailTriggerPanel.svelte.d.ts +20 -0
  43. package/package/components/details/WebhooksPanel.svelte +7 -68
  44. package/package/components/flows/FlowHistory.svelte +1 -0
  45. package/package/components/flows/content/FlowInputs.svelte +0 -1
  46. package/package/components/flows/content/FlowModuleScript.svelte +33 -3
  47. package/package/components/flows/content/FlowModuleScript.svelte.d.ts +2 -0
  48. package/package/components/flows/content/FlowModuleSuspend.svelte +15 -0
  49. package/package/components/flows/flowInfers.js +1 -1
  50. package/package/components/flows/map/FlowJobsMenu.svelte +39 -44
  51. package/package/components/flows/map/FlowModuleSchemaItem.svelte +1 -2
  52. package/package/components/flows/map/FlowModuleSchemaMap.svelte +4 -3
  53. package/package/components/flows/map/InsertModuleButton.svelte +16 -9
  54. package/package/components/flows/map/MapItem.svelte +3 -97
  55. package/package/components/flows/map/MapItem.svelte.d.ts +0 -5
  56. package/package/components/flows/map/VirtualItem.svelte +6 -159
  57. package/package/components/flows/map/VirtualItem.svelte.d.ts +0 -15
  58. package/package/components/graph/FlowGraphV2.svelte +256 -0
  59. package/package/components/graph/{FlowGraph.svelte.d.ts → FlowGraphV2.svelte.d.ts} +8 -8
  60. package/package/components/graph/graphBuilder.d.ts +15 -0
  61. package/package/components/graph/graphBuilder.js +337 -0
  62. package/package/components/graph/index.d.ts +0 -1
  63. package/package/components/graph/index.js +0 -1
  64. package/package/components/graph/model.d.ts +1 -8
  65. package/package/components/graph/renderers/edges/BaseEdge.svelte +109 -0
  66. package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +35 -0
  67. package/package/components/graph/renderers/edges/DataflowEdge.svelte +37 -0
  68. package/package/components/graph/renderers/edges/DataflowEdge.svelte.d.ts +29 -0
  69. package/package/components/graph/renderers/edges/EmptyEdge.svelte +22 -0
  70. package/package/components/graph/renderers/edges/EmptyEdge.svelte.d.ts +23 -0
  71. package/package/components/graph/renderers/nodes/BranchAllStart.svelte +44 -0
  72. package/package/components/graph/renderers/nodes/BranchAllStart.svelte.d.ts +29 -0
  73. package/package/components/graph/renderers/nodes/BranchOneStart.svelte +41 -0
  74. package/package/components/graph/renderers/nodes/BranchOneStart.svelte.d.ts +29 -0
  75. package/package/components/graph/renderers/nodes/ForLoopEndNode.svelte +19 -0
  76. package/package/components/graph/renderers/nodes/ForLoopEndNode.svelte.d.ts +24 -0
  77. package/package/components/graph/renderers/nodes/ForLoopStartNode.svelte +20 -0
  78. package/package/components/graph/renderers/nodes/ForLoopStartNode.svelte.d.ts +25 -0
  79. package/package/components/graph/renderers/nodes/InputNode.svelte +74 -0
  80. package/package/components/graph/renderers/nodes/InputNode.svelte.d.ts +23 -0
  81. package/package/components/graph/renderers/nodes/ModuleNode.svelte +71 -0
  82. package/package/components/graph/renderers/nodes/ModuleNode.svelte.d.ts +41 -0
  83. package/package/components/graph/renderers/nodes/NoBranchNode.svelte +20 -0
  84. package/package/components/graph/renderers/nodes/NoBranchNode.svelte.d.ts +27 -0
  85. package/package/components/graph/renderers/nodes/NodeWrapper.svelte +21 -0
  86. package/package/components/graph/renderers/nodes/NodeWrapper.svelte.d.ts +22 -0
  87. package/package/components/graph/renderers/nodes/ResultNode.svelte +24 -0
  88. package/package/components/graph/renderers/nodes/ResultNode.svelte.d.ts +22 -0
  89. package/package/components/graph/renderers/nodes/branchAllEndNode.svelte +19 -0
  90. package/package/components/graph/renderers/nodes/branchAllEndNode.svelte.d.ts +26 -0
  91. package/package/components/graph/renderers/nodes/branchOneEndNode.svelte +19 -0
  92. package/package/components/graph/renderers/nodes/branchOneEndNode.svelte.d.ts +24 -0
  93. package/package/components/graph/renderers/utils.d.ts +8 -0
  94. package/package/components/graph/renderers/utils.js +26 -0
  95. package/package/components/graph/util.d.ts +1 -2
  96. package/package/components/graph/util.js +2 -8
  97. package/package/components/home/Item.svelte +1 -1
  98. package/package/components/runs/RunsFilter.svelte +15 -17
  99. package/package/forLater.js +8 -4
  100. package/package/gen/core/OpenAPI.js +1 -1
  101. package/package/gen/schemas.gen.d.ts +3 -0
  102. package/package/gen/schemas.gen.js +3 -0
  103. package/package/gen/services.gen.d.ts +22 -3
  104. package/package/gen/services.gen.js +38 -2
  105. package/package/gen/types.gen.d.ts +69 -6
  106. package/package/hub.d.ts +11 -0
  107. package/package/hub.js +2 -0
  108. package/package/hubPaths.json +9 -0
  109. package/package/init_scripts/python_failure_module.d.ts +1 -1
  110. package/package/init_scripts/python_failure_module.js +4 -3
  111. package/package/script_helpers.d.ts +2 -2
  112. package/package/script_helpers.js +11 -9
  113. package/package.json +2 -1
  114. package/package/components/graph/FlowGraph.svelte +0 -614
  115. package/package/components/graph/svelvet/LICENSE +0 -21
  116. package/package/components/graph/svelvet/container/README.md +0 -7
  117. package/package/components/graph/svelvet/container/controllers/middleware.d.ts +0 -11
  118. package/package/components/graph/svelvet/container/controllers/middleware.js +0 -87
  119. package/package/components/graph/svelvet/container/models/index.d.ts +0 -0
  120. package/package/components/graph/svelvet/container/models/index.js +0 -1
  121. package/package/components/graph/svelvet/container/views/GraphView.svelte +0 -262
  122. package/package/components/graph/svelvet/container/views/GraphView.svelte.d.ts +0 -26
  123. package/package/components/graph/svelvet/container/views/Svelvet.svelte +0 -121
  124. package/package/components/graph/svelvet/container/views/Svelvet.svelte.d.ts +0 -36
  125. package/package/components/graph/svelvet/customCss/controllers/getCss.d.ts +0 -2
  126. package/package/components/graph/svelvet/customCss/controllers/getCss.js +0 -46
  127. package/package/components/graph/svelvet/d3/controllers/d3.d.ts +0 -5
  128. package/package/components/graph/svelvet/d3/controllers/d3.js +0 -59
  129. package/package/components/graph/svelvet/edges/controllers/anchorCbDev.d.ts +0 -4
  130. package/package/components/graph/svelvet/edges/controllers/anchorCbDev.js +0 -92
  131. package/package/components/graph/svelvet/edges/controllers/anchorCbUser.d.ts +0 -57
  132. package/package/components/graph/svelvet/edges/controllers/anchorCbUser.js +0 -73
  133. package/package/components/graph/svelvet/edges/controllers/util.d.ts +0 -37
  134. package/package/components/graph/svelvet/edges/controllers/util.js +0 -71
  135. package/package/components/graph/svelvet/edges/models/Anchor.d.ts +0 -48
  136. package/package/components/graph/svelvet/edges/models/Anchor.js +0 -122
  137. package/package/components/graph/svelvet/edges/models/Edge.d.ts +0 -48
  138. package/package/components/graph/svelvet/edges/models/Edge.js +0 -109
  139. package/package/components/graph/svelvet/edges/types/types.d.ts +0 -18
  140. package/package/components/graph/svelvet/edges/types/types.js +0 -1
  141. package/package/components/graph/svelvet/edges/views/Edges/BaseEdge.svelte +0 -104
  142. package/package/components/graph/svelvet/edges/views/Edges/BaseEdge.svelte.d.ts +0 -18
  143. package/package/components/graph/svelvet/edges/views/Edges/EdgeText.svelte +0 -42
  144. package/package/components/graph/svelvet/edges/views/Edges/EdgeText.svelte.d.ts +0 -17
  145. package/package/components/graph/svelvet/edges/views/Edges/SimpleBezierEdge.svelte +0 -151
  146. package/package/components/graph/svelvet/edges/views/Edges/SimpleBezierEdge.svelte.d.ts +0 -17
  147. package/package/components/graph/svelvet/edges/views/Edges/SmoothStepEdge.svelte +0 -157
  148. package/package/components/graph/svelvet/edges/views/Edges/SmoothStepEdge.svelte.d.ts +0 -60
  149. package/package/components/graph/svelvet/edges/views/Edges/StepEdge.svelte +0 -8
  150. package/package/components/graph/svelvet/edges/views/Edges/StepEdge.svelte.d.ts +0 -25
  151. package/package/components/graph/svelvet/edges/views/Edges/types.d.ts +0 -52
  152. package/package/components/graph/svelvet/edges/views/Edges/types.js +0 -1
  153. package/package/components/graph/svelvet/edges/views/Edges/utils.d.ts +0 -33
  154. package/package/components/graph/svelvet/edges/views/Edges/utils.js +0 -31
  155. package/package/components/graph/svelvet/nodes/controllers/util.d.ts +0 -9
  156. package/package/components/graph/svelvet/nodes/controllers/util.js +0 -13
  157. package/package/components/graph/svelvet/nodes/models/Node.d.ts +0 -74
  158. package/package/components/graph/svelvet/nodes/models/Node.js +0 -156
  159. package/package/components/graph/svelvet/nodes/views/Node.svelte +0 -84
  160. package/package/components/graph/svelvet/nodes/views/Node.svelte.d.ts +0 -21
  161. package/package/components/graph/svelvet/store/controllers/storeApi.d.ts +0 -25
  162. package/package/components/graph/svelvet/store/controllers/storeApi.js +0 -91
  163. package/package/components/graph/svelvet/store/controllers/userApi.d.ts +0 -3
  164. package/package/components/graph/svelvet/store/controllers/userApi.js +0 -18
  165. package/package/components/graph/svelvet/store/controllers/util.d.ts +0 -24
  166. package/package/components/graph/svelvet/store/controllers/util.js +0 -148
  167. package/package/components/graph/svelvet/store/models/store.d.ts +0 -13
  168. package/package/components/graph/svelvet/store/models/store.js +0 -12
  169. package/package/components/graph/svelvet/store/types/types.d.ts +0 -127
  170. package/package/components/graph/svelvet/store/types/types.js +0 -1
  171. package/package/components/graph/svelvet/types/README.md +0 -3
  172. package/package/components/graph/svelvet/types/index.d.ts +0 -2
  173. package/package/components/graph/svelvet/types/index.js +0 -1
  174. package/package/components/graph/svelvet/types/types.d.ts +0 -50
  175. package/package/components/graph/svelvet/types/types.js +0 -18
@@ -0,0 +1,128 @@
1
+ <script>import Tooltip from '../Tooltip.svelte';
2
+ import { enterpriseLicense, userStore, workspaceStore } from '../../stores';
3
+ import { Button } from '../common';
4
+ import { SCRIPT_VIEW_SHOW_CREATE_TOKEN_BUTTON } from '../../consts';
5
+ import UserSettings from '../UserSettings.svelte';
6
+ import ClipboardPanel from './ClipboardPanel.svelte';
7
+ import { generateRandomString } from '../../utils';
8
+ import HighlightTheme from '../HighlightTheme.svelte';
9
+ import Alert from '../common/alert/Alert.svelte';
10
+ import { SettingService } from '../../gen';
11
+ import { base32 } from 'rfc4648';
12
+ import ToggleButton from '../common/toggleButton-v2/ToggleButton.svelte';
13
+ import ToggleButtonGroup from '../common/toggleButton-v2/ToggleButtonGroup.svelte';
14
+ import { AlertTriangle } from 'lucide-svelte';
15
+ import Skeleton from '../common/skeleton/Skeleton.svelte';
16
+ let userSettings;
17
+ export let token;
18
+ export let scopes = [];
19
+ export let isFlow = false;
20
+ export let hash = undefined;
21
+ export let path;
22
+ let emailDomain = null;
23
+ let loading = true;
24
+ async function getEmailDomain() {
25
+ emailDomain =
26
+ (await SettingService.getGlobal({
27
+ key: 'email_domain'
28
+ })) ?? null;
29
+ loading = false;
30
+ }
31
+ getEmailDomain();
32
+ let requestType = 'path';
33
+ function emailAddress() {
34
+ const pathOrHash = requestType === 'hash' ? hash : path.replaceAll('/', '.');
35
+ const plainPrefix = `${$workspaceStore}+${(requestType === 'hash' ? 'hash.' : isFlow ? 'flow.' : '') + pathOrHash}+${token}`;
36
+ const encodedPrefix = base32
37
+ .stringify(new TextEncoder().encode(plainPrefix), {
38
+ pad: false
39
+ })
40
+ .toLowerCase();
41
+ return `${pathOrHash}+${encodedPrefix}@${emailDomain}`;
42
+ }
43
+ </script>
44
+
45
+ <HighlightTheme />
46
+
47
+ <UserSettings
48
+ bind:this={userSettings}
49
+ on:tokenCreated={(e) => {
50
+ token = e.detail
51
+ }}
52
+ newTokenLabel={`${$userStore?.username ?? 'superadmin'}-${generateRandomString(4)}`}
53
+ {scopes}
54
+ />
55
+
56
+ <div class="p-2 flex flex-col w-full gap-4">
57
+ {#if loading}
58
+ <Skeleton layout={[[18]]} />
59
+ {:else}
60
+ {#if emailDomain}
61
+ {#if SCRIPT_VIEW_SHOW_CREATE_TOKEN_BUTTON}
62
+ <div class="my-2">
63
+ <div class="flex flex-row justify-between gap-2">
64
+ <input
65
+ bind:value={token}
66
+ placeholder="paste your token here once created to alter examples below"
67
+ class="!text-xs"
68
+ />
69
+ <Button size="xs" color="light" variant="border" on:click={userSettings.openDrawer}>
70
+ Create an Email-specific Token
71
+ <Tooltip light>
72
+ The token will have a scope such that it can only be used to trigger this script. It
73
+ is safe to share as it cannot be used to impersonate you.
74
+ </Tooltip>
75
+ </Button>
76
+ </div>
77
+ {#if token === 'TOKEN_TO_CREATE'}
78
+ <div class="flex flex-row gap-1 text-xs text-red-500 items-center mt-1">
79
+ <AlertTriangle size="12" />
80
+ Create/input a valid token before copying the email address below
81
+ </div>
82
+ {/if}
83
+ </div>
84
+ {/if}
85
+
86
+ {#if !isFlow}
87
+ <div class="flex flex-col gap-2">
88
+ <div class="flex flex-row justify-between">
89
+ <div class="text-xs font-semibold flex flex-row items-center">Call method</div>
90
+ <ToggleButtonGroup class="h-[30px] w-auto" bind:selected={requestType}>
91
+ <ToggleButton label="By path" value="path" />
92
+ <ToggleButton label="By hash" value="hash" />
93
+ </ToggleButtonGroup>
94
+ </div>
95
+ </div>
96
+ {/if}
97
+ <div class="flex flex-col gap-4">
98
+ {#key requestType}
99
+ {#key token}
100
+ <div class="flex flex-col gap-2">
101
+ <ClipboardPanel title="Email address" content={emailAddress()} />
102
+ </div>
103
+ {/key}
104
+ {/key}
105
+ <Alert title="Email trigger" size="xs">
106
+ To trigger the job by email, send an email to the address above. The job will receive two
107
+ arguments: `raw_email` containing the raw email as string, and `parsed_email` containing
108
+ the parsed email as an object.
109
+ </Alert>
110
+ </div>
111
+ {:else}
112
+ <div>
113
+ <Alert title="Email triggers are disabled" size="xs" type="warning">
114
+ Ask an instance superadmin to setup the instance for email triggering (<a
115
+ target="_blank"
116
+ href="https://windmill.dev/docs/advanced/email_triggers">docs</a
117
+ >) and to set the email domain in the instance settings.
118
+ </Alert>
119
+ </div>
120
+ {/if}
121
+
122
+ {#if !$enterpriseLicense}
123
+ <Alert title="Community Edition limitations" type="warning" size="xs">
124
+ Email triggers on Windmill Community Edition are limited to 100 emails per day.
125
+ </Alert>
126
+ {/if}
127
+ {/if}
128
+ </div>
@@ -0,0 +1,20 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ token: string;
5
+ scopes?: string[] | undefined;
6
+ isFlow?: boolean | undefined;
7
+ hash?: string | undefined;
8
+ path: string;
9
+ };
10
+ events: {
11
+ [evt: string]: CustomEvent<any>;
12
+ };
13
+ slots: {};
14
+ };
15
+ export type EmailTriggerPanelProps = typeof __propDef.props;
16
+ export type EmailTriggerPanelEvents = typeof __propDef.events;
17
+ export type EmailTriggerPanelSlots = typeof __propDef.slots;
18
+ export default class EmailTriggerPanel extends SvelteComponent<EmailTriggerPanelProps, EmailTriggerPanelEvents, EmailTriggerPanelSlots> {
19
+ }
20
+ export {};
@@ -13,10 +13,7 @@ import { typescript } from 'svelte-highlight/languages';
13
13
  import ClipboardPanel from './ClipboardPanel.svelte';
14
14
  import { copyToClipboard, generateRandomString } from '../../utils';
15
15
  import HighlightTheme from '../HighlightTheme.svelte';
16
- import Alert from '../common/alert/Alert.svelte';
17
- import { SettingService } from '../../gen';
18
16
  import { base } from '../../base';
19
- import { base32 } from 'rfc4648';
20
17
  let userSettings;
21
18
  export let token;
22
19
  export let args;
@@ -26,14 +23,6 @@ export let hash = undefined;
26
23
  export let path;
27
24
  let selectedTab = 'rest';
28
25
  let webhooks;
29
- let emailDomain = null;
30
- async function getEmailDomain() {
31
- emailDomain =
32
- (await SettingService.getGlobal({
33
- key: 'email_domain'
34
- })) ?? null;
35
- }
36
- getEmailDomain();
37
26
  $: webhooks = isFlow ? computeFlowWebhooks(path) : computeScriptWebhooks(hash, path);
38
27
  function computeScriptWebhooks(hash, path) {
39
28
  let webhookBase = `${$page.url.origin}${base}/api/w/${$workspaceStore}/jobs`;
@@ -70,9 +59,6 @@ $: if (webhookType === 'async' && requestType === 'get_path') {
70
59
  // Request type is not supported for async webhooks
71
60
  requestType = 'hash';
72
61
  }
73
- $: if (webhookType === 'sync' && selectedTab === 'email') {
74
- webhookType = 'async';
75
- }
76
62
  $: url =
77
63
  webhooks[webhookType][requestType] +
78
64
  (tokenType === 'query'
@@ -92,16 +78,6 @@ function headers() {
92
78
  }
93
79
  return headers;
94
80
  }
95
- function emailAddress() {
96
- const pathOrHash = requestType === 'hash' ? hash : path.replaceAll('/', '.');
97
- const plainPrefix = `${$workspaceStore}+${(requestType === 'hash' ? 'hash.' : isFlow ? 'flow.' : '') + pathOrHash}+${token}`;
98
- const encodedPrefix = base32
99
- .stringify(new TextEncoder().encode(plainPrefix), {
100
- pad: false
101
- })
102
- .toLowerCase();
103
- return `${pathOrHash}+${encodedPrefix}@${emailDomain}`;
104
- }
105
81
  function fetchCode() {
106
82
  if (webhookType === 'sync') {
107
83
  return `
@@ -238,7 +214,6 @@ done`}`;
238
214
  label="Sync"
239
215
  value="sync"
240
216
  tooltip="Triggers the execution, wait for the job to complete and return it as a response."
241
- disabled={selectedTab === 'email'}
242
217
  />
243
218
  </ToggleButtonGroup>
244
219
  </div>
@@ -269,15 +244,13 @@ done`}`;
269
244
  />
270
245
  </ToggleButtonGroup>
271
246
  </div>
272
- {#if selectedTab !== 'email'}
273
- <div class="flex flex-row justify-between">
274
- <div class="text-xs font-semibold flex flex-row items-center">Token configuration</div>
275
- <ToggleButtonGroup class="h-[30px] w-auto" bind:selected={tokenType}>
276
- <ToggleButton label="Token in Headers" value="headers" />
277
- <ToggleButton label="Token in Query" value="query" />
278
- </ToggleButtonGroup>
279
- </div>
280
- {/if}
247
+ <div class="flex flex-row justify-between">
248
+ <div class="text-xs font-semibold flex flex-row items-center">Token configuration</div>
249
+ <ToggleButtonGroup class="h-[30px] w-auto" bind:selected={tokenType}>
250
+ <ToggleButton label="Token in Headers" value="headers" />
251
+ <ToggleButton label="Token in Query" value="query" />
252
+ </ToggleButtonGroup>
253
+ </div>
281
254
  </div>
282
255
  <!-- svelte-ignore a11y-click-events-have-key-events -->
283
256
  <!-- svelte-ignore a11y-no-static-element-interactions -->
@@ -287,7 +260,6 @@ done`}`;
287
260
  <Tab value="curl" size="xs">Curl</Tab>
288
261
  {/if}
289
262
  <Tab value="fetch" size="xs">Fetch</Tab>
290
- <Tab value="email" size="xs">Email</Tab>
291
263
 
292
264
  <svelte:fragment slot="content">
293
265
  {#key token}
@@ -346,39 +318,6 @@ done`}`;
346
318
  {/key}{/key}{/key}{/key}
347
319
  {/key}
348
320
  </TabContent>
349
- <TabContent value="email">
350
- {#if emailDomain}
351
- <div class="flex flex-col gap-4">
352
- {#key args}
353
- {#key requestType}
354
- {#key webhookType}
355
- {#key tokenType}
356
- {#key token}
357
- <div class="flex flex-col gap-2">
358
- <ClipboardPanel title="Email address" content={emailAddress()} />
359
- </div>
360
- {/key}
361
- {/key}
362
- {/key}
363
- {/key}
364
- {/key}
365
- <Alert title="Email triggers" size="xs">
366
- To trigger the job by email, send an email to the address above. The job will
367
- receive two arguments: `raw_email` containing the raw email as string, and
368
- `parsed_email` containing the parsed email as an object.
369
- </Alert>
370
- </div>
371
- {:else}
372
- <div>
373
- <Alert title="Email triggers are disabled" size="xs" kind="danger">
374
- Ask an instance superadmin to setup the instance for email triggering (<a
375
- target="_blank"
376
- href="https://windmill.dev/docs/advanced/email_triggers">docs</a
377
- >) and to set the email domain in the instance settings.
378
- </Alert>
379
- </div>
380
- {/if}
381
- </TabContent>
382
321
  {/key}
383
322
  </svelte:fragment>
384
323
  </Tabs>
@@ -79,6 +79,7 @@ $: selectedVersion !== undefined && loadFlow(selectedVersion.id);
79
79
  on:close={() => {
80
80
  drawer?.closeDrawer()
81
81
  }}
82
+ noPadding
82
83
  >
83
84
  <Splitpanes class="!overflow-visible">
84
85
  <Pane size={20}>
@@ -209,7 +209,6 @@ let customUi = getContext('customUi');
209
209
  return
210
210
  }
211
211
  }
212
- console.log(lang, kind)
213
212
  dispatch('new', {
214
213
  language: lang == 'docker' ? 'bash' : lang,
215
214
  kind,
@@ -1,13 +1,16 @@
1
- <script>import HighlightCode from '../../HighlightCode.svelte';
1
+ <script>import DiffEditor from '../../DiffEditor.svelte';
2
+ import HighlightCode from '../../HighlightCode.svelte';
2
3
  import TimeAgo from '../../TimeAgo.svelte';
3
4
  import { ScriptService } from '../../../gen';
4
- import { getScriptByPath } from '../../../scripts';
5
+ import { getScriptByPath, scriptLangToEditorLang } from '../../../scripts';
5
6
  import { workspaceStore } from '../../../stores';
6
7
  export let path;
7
8
  export let hash = undefined;
9
+ export let previousHash = undefined;
8
10
  export let showDate = false;
9
11
  export let showAllCode = true;
10
12
  let code;
13
+ let previousCode;
11
14
  let language;
12
15
  let lock = undefined;
13
16
  let date = undefined;
@@ -28,10 +31,24 @@ async function loadCode(path, hash) {
28
31
  console.error(e);
29
32
  }
30
33
  }
34
+ async function loadPreviousCode(previousHash) {
35
+ try {
36
+ const previousScript = await ScriptService.getScriptByHash({
37
+ workspace: $workspaceStore,
38
+ hash: previousHash
39
+ });
40
+ previousCode = previousScript.content;
41
+ }
42
+ catch (e) {
43
+ console.error(e);
44
+ }
45
+ }
31
46
  $: path && loadCode(path, hash);
47
+ $: path && previousHash && loadPreviousCode(previousHash);
32
48
  function toggleShowAll() {
33
49
  showAllCode = !showAllCode;
34
50
  }
51
+ export let showDiff = false;
35
52
  </script>
36
53
 
37
54
  <div class="flex flex-col flex-1 h-full overflow-auto p-2">
@@ -41,7 +58,20 @@ function toggleShowAll() {
41
58
  {#if notFound}
42
59
  <div class="text-red-400">script not found at {path} in workspace {$workspaceStore}</div>
43
60
  {:else if showAllCode}
44
- <HighlightCode {language} {code} />
61
+ {#if showDiff}
62
+ {#key previousCode + code}
63
+ <DiffEditor
64
+ class="h-screen"
65
+ readOnly
66
+ automaticLayout
67
+ defaultLang={scriptLangToEditorLang(language)}
68
+ defaultOriginal={previousCode}
69
+ defaultModified={code}
70
+ />
71
+ {/key}
72
+ {:else}
73
+ <HighlightCode {language} {code} />
74
+ {/if}
45
75
  {:else}
46
76
  <div class="code-container h-full">
47
77
  <HighlightCode {language} code={code?.split('\n').slice(0, 10).join('\n')} />
@@ -3,8 +3,10 @@ declare const __propDef: {
3
3
  props: {
4
4
  path: string;
5
5
  hash?: string | undefined;
6
+ previousHash?: string | undefined;
6
7
  showDate?: boolean | undefined;
7
8
  showAllCode?: boolean | undefined;
9
+ showDiff?: boolean | undefined;
8
10
  };
9
11
  events: {
10
12
  [evt: string]: CustomEvent<any>;
@@ -106,6 +106,21 @@ let jsonView = false;
106
106
  <SecondsInput disabled />
107
107
  {/if}
108
108
  </Label>
109
+
110
+ <Toggle
111
+ options={{
112
+ right: 'Continue on disapproval/timeout',
113
+ rightTooltip:
114
+ 'Instead of failing the flow and bubbling up the error, continue to the next step which would allow to put a branchone right after to handle both cases separately. If any disapproval/timeout event is received, the resume payload will be similar to every error result in Winmdill, an object containing an `error` field which you can use to distinguish between approvals and disapproval/timeouts'
115
+ }}
116
+ checked={Boolean(flowModule.suspend?.continue_on_disapprove_timeout)}
117
+ disabled={!Boolean(flowModule.suspend)}
118
+ on:change={(e) => {
119
+ if (flowModule.suspend) {
120
+ flowModule.suspend.continue_on_disapprove_timeout = e.detail
121
+ }
122
+ }}
123
+ />
109
124
  </div>
110
125
  {:else if suspendTabSelected === 'permissions'}
111
126
  <div class="flex flex-col mt-4 gap-4">
@@ -26,7 +26,7 @@ export async function loadSchemaFromModule(module) {
26
26
  if (JSON.stringify(keys.sort()) !== JSON.stringify(Object.keys(input_transforms).sort())) {
27
27
  input_transforms = keys.reduce((accu, key) => {
28
28
  let nv = input_transforms[key] ??
29
- (module.id == 'failure' && ['message', 'name'].includes(key)
29
+ (module.id == 'failure' && ['message', 'name', 'step_id'].includes(key)
30
30
  ? { type: 'javascript', expr: `error.${key}` }
31
31
  : {
32
32
  type: 'static',
@@ -1,6 +1,7 @@
1
- <script>import { Menu } from '../../common';
1
+ <script>import Menu from '../../common/menu/MenuV2.svelte';
2
2
  import { createEventDispatcher } from 'svelte';
3
3
  import { ListFilter } from 'lucide-svelte';
4
+ import { MenuItem } from '@rgossiaux/svelte-headlessui';
4
5
  const dispatch = createEventDispatcher();
5
6
  export let open = undefined;
6
7
  export let index;
@@ -20,50 +21,44 @@ function onKeydown(event) {
20
21
  }
21
22
  </script>
22
23
 
23
- <Menu
24
- transitionDuration={0}
25
- pointerDown
26
- bind:show={open}
27
- noMinW
28
- placement="bottom-center"
29
- let:close
30
- >
31
- <button
32
- title="Pick an iteration"
33
- slot="trigger"
34
- id={`flow-editor-iteration picker-${index}`}
35
- type="button"
36
- class=" text-xs bg-surface border-[1px] border-gray-300 dark:border-gray-500 focus:outline-none
24
+ <Menu>
25
+ <div slot="trigger">
26
+ <button
27
+ title="Pick an iteration"
28
+ id={`flow-editor-iteration picker-${index}`}
29
+ type="button"
30
+ class=" text-xs bg-surface border-[1px] border-gray-300 dark:border-gray-500 focus:outline-none
37
31
  hover:bg-surface-hover focus:ring-4 focus:ring-surface-selected font-medium rounded-sm w-[40px] gap-1 h-[20px]
38
32
  flex items-center justify-center {flowJobsSuccess?.[selected] == false
39
- ? 'text-red-400'
40
- : 'text-secondary'}"
41
- >
42
- #{selected == -1 ? '?' : selected + 1}
43
- <ListFilter size={15} />
44
- </button>
45
- <div id="flow-editor-insert-module">
46
- <div class="font-mono divide-y text-xs w-full text-secondary max-h-[200px] overflow-auto">
47
- <input autofocus type="number" bind:value={filter} on:keydown={onKeydown} />
48
- {#each flowJobs ?? [] as id, idx (id)}
49
- {#if filter == undefined || (idx + 1).toString().includes(filter.toString())}
50
- <button
51
- class="w-full text-left py-1 pl-2 min-w-20 hover:bg-surface-hover whitespace-nowrap flex flex-row gap-2 items-center {flowJobsSuccess?.[
52
- idx
53
- ] == false
54
- ? 'text-red-400'
55
- : ''}"
56
- on:pointerdown={() => {
57
- close()
58
- dispatch('selectedIteration', { index: idx, id })
59
- }}
60
- role="menuitem"
61
- tabindex="-1"
62
- >
63
- #{idx + 1}
64
- </button>
65
- {/if}
66
- {/each}
67
- </div>
33
+ ? 'text-red-400'
34
+ : 'text-secondary'}"
35
+ >
36
+ #{selected == -1 ? '?' : selected + 1}
37
+ <ListFilter size={15} />
38
+ </button>
68
39
  </div>
40
+ <MenuItem disabled>
41
+ <input type="number" bind:value={filter} on:keydown={onKeydown} />
42
+ </MenuItem>
43
+ {#each flowJobs ?? [] as id, idx (id)}
44
+ {#if filter == undefined || (idx + 1).toString().includes(filter.toString())}
45
+ <MenuItem>
46
+ <button
47
+ class="text-primary text-xs w-full text-left py-1 pl-2 hover:bg-surface-hover whitespace-nowrap flex flex-row gap-2 items-center {flowJobsSuccess?.[
48
+ idx
49
+ ] == false
50
+ ? 'text-red-400'
51
+ : ''}"
52
+ on:pointerdown={() => {
53
+ //close()
54
+ dispatch('selectedIteration', { index: idx, id })
55
+ }}
56
+ role="menuitem"
57
+ tabindex="-1"
58
+ >
59
+ #{idx + 1}
60
+ </button>
61
+ </MenuItem>
62
+ {/if}
63
+ {/each}
69
64
  </Menu>
@@ -126,9 +126,8 @@ const { currentStepStore: copilotCurrentStepStore } = getContext('FlowCopilotCon
126
126
  >
127
127
  {#if $$slots.icon}
128
128
  <slot name="icon" />
129
- <span class="mr-2" />
130
129
  {/if}
131
- <div class="flex-1 truncate" class:font-bold={bold}>{label}</div>
130
+ <div class="truncate" class:font-bold={bold}>{label}</div>
132
131
  <div class="flex items-center space-x-2">
133
132
  {#if id}
134
133
  <Badge color="indigo">{id}</Badge>
@@ -4,7 +4,6 @@ import { emptyFlowModuleState, initFlowStepWarnings } from '../utils';
4
4
  import FlowSettingsItem from './FlowSettingsItem.svelte';
5
5
  import FlowConstantsItem from './FlowConstantsItem.svelte';
6
6
  import { dfs } from '../dfs';
7
- import { FlowGraph } from '../../graph';
8
7
  import FlowErrorHandlerItem from './FlowErrorHandlerItem.svelte';
9
8
  import { push } from '../../../history';
10
9
  import ConfirmationModal from '../../common/confirmationModal/ConfirmationModal.svelte';
@@ -15,6 +14,7 @@ import { copilotInfo, tutorialsToDo } from '../../../stores';
15
14
  import FlowTutorials from '../../FlowTutorials.svelte';
16
15
  import { ignoredTutorials } from '../../tutorials/ignoredTutorials';
17
16
  import { tutorialInProgress } from '../../../tutorialUtils';
17
+ import FlowGraphV2 from '../../graph/FlowGraphV2.svelte';
18
18
  export let modules;
19
19
  export let sidebarSize = undefined;
20
20
  export let disableStaticInputs = false;
@@ -203,13 +203,12 @@ async function updateFlowInputsStore() {
203
203
  </div>
204
204
 
205
205
  <div class="z-10 flex-auto grow" bind:clientHeight={minHeight}>
206
- <FlowGraph
206
+ <FlowGraphV2
207
207
  {disableAi}
208
208
  insertable
209
209
  scroll
210
210
  {minHeight}
211
211
  moving={$moving?.module.id}
212
- rebuildOnChange={$flowStore}
213
212
  maxHeight={minHeight}
214
213
  modules={$flowStore.value?.modules}
215
214
  {selectedId}
@@ -219,7 +218,9 @@ async function updateFlowInputsStore() {
219
218
  dependents = getDependentComponents(e.id, $flowStore)
220
219
  const cb = () => {
221
220
  push(history, $flowStore)
221
+
222
222
  selectNextId(e.id)
223
+
223
224
  removeAtId($flowStore.value.modules, e.id)
224
225
 
225
226
  if ($flowInputsStore) {
@@ -3,6 +3,7 @@ import { createEventDispatcher, getContext } from 'svelte';
3
3
  import { CheckCircle2, Code, Cross, GitBranch, Repeat, Square, Zap } from 'lucide-svelte';
4
4
  import StepGen from '../../copilot/StepGen.svelte';
5
5
  import BarsStaggered from '../../icons/BarsStaggered.svelte';
6
+ import { twMerge } from 'tailwind-merge';
6
7
  const dispatch = createEventDispatcher();
7
8
  export let trigger = false;
8
9
  export let stop = false;
@@ -23,15 +24,21 @@ let customUi = getContext('customUi');
23
24
  placement="bottom-center"
24
25
  let:close
25
26
  >
26
- <button
27
- title="Add step"
28
- slot="trigger"
29
- id={`flow-editor-add-step-${index}`}
30
- type="button"
31
- class="text-primary bg-surface border-[1px] mx-[1px] border-gray-300 dark:border-gray-500 focus:outline-none hover:bg-surface-hover focus:ring-4 focus:ring-surface-selected font-medium rounded-full text-sm w-[25px] h-[25px] flex items-center justify-center"
32
- >
33
- <Cross class="mx-[5px]" size={15} />
34
- </button>
27
+ <svelte:fragment slot="trigger">
28
+ <button
29
+ title="Add step"
30
+ id={`flow-editor-add-step-${index}`}
31
+ type="button"
32
+ class={twMerge(
33
+ 'w-6 h-6 flex items-center justify-center',
34
+ 'border border-gray-300 dark:border-gray-500',
35
+ 'text-primary text-sm',
36
+ 'bg-surface focus:outline-none hover:bg-surface-hover focus:ring-4 focus:ring-surface-selected rounded-full '
37
+ )}
38
+ >
39
+ <Cross size={14} />
40
+ </button>
41
+ </svelte:fragment>
35
42
  <div id="flow-editor-insert-module">
36
43
  <StepGen on:insert {index} bind:funcDesc bind:open {close} {modules} {disableAi} />
37
44