windmill-components 1.444.1 → 1.447.4

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 (229) hide show
  1. package/package/autosize.js +1 -1
  2. package/package/components/AppConnectInner.svelte +2 -1
  3. package/package/components/ArgInput.svelte +37 -24
  4. package/package/components/CapturesInputs.svelte +16 -0
  5. package/package/components/CapturesInputs.svelte.d.ts +21 -0
  6. package/package/components/Dev.svelte +7 -1
  7. package/package/components/EditableSchemaForm.svelte +369 -290
  8. package/package/components/EditableSchemaForm.svelte.d.ts +12 -2
  9. package/package/components/Editor.svelte +5 -7
  10. package/package/components/FirstStepInputs.svelte +111 -0
  11. package/package/components/FirstStepInputs.svelte.d.ts +17 -0
  12. package/package/components/FlowBuilder.svelte +28 -7
  13. package/package/components/FlowPreviewContent.svelte +72 -1
  14. package/package/components/FlowPreviewContent.svelte.d.ts +1 -0
  15. package/package/components/GfmMarkdown.svelte +93 -2
  16. package/package/components/HighlightCode.svelte +2 -0
  17. package/package/components/HistoricInputs.svelte +193 -0
  18. package/package/components/HistoricInputs.svelte.d.ts +20 -0
  19. package/package/components/InfiniteList.svelte +161 -0
  20. package/package/components/InfiniteList.svelte.d.ts +40 -0
  21. package/package/components/LightweightArgInput.svelte +19 -15
  22. package/package/components/MoveDrawer.svelte +2 -1
  23. package/package/components/Path.svelte +7 -1
  24. package/package/components/Path.svelte.d.ts +1 -1
  25. package/package/components/ResourcePicker.svelte +2 -1
  26. package/package/components/ResourcePicker.svelte.d.ts +1 -0
  27. package/package/components/ResultJobLoader.svelte.d.ts +1 -1
  28. package/package/components/SaveInputsButton.svelte +53 -0
  29. package/package/components/SaveInputsButton.svelte.d.ts +24 -0
  30. package/package/components/SavedInputs.svelte +33 -61
  31. package/package/components/SavedInputsPicker.svelte +264 -0
  32. package/package/components/SavedInputsPicker.svelte.d.ts +20 -0
  33. package/package/components/ScheduleEditorInner.svelte +0 -1
  34. package/package/components/SchemaForm.svelte +22 -3
  35. package/package/components/ScriptBuilder.svelte +595 -562
  36. package/package/components/ScriptEditor.svelte +10 -3
  37. package/package/components/ScriptEditor.svelte.d.ts +5 -2
  38. package/package/components/ScriptSchema.svelte +1 -2
  39. package/package/components/Section.svelte +6 -4
  40. package/package/components/ShareModal.svelte.d.ts +2 -2
  41. package/package/components/SimpleEditor.svelte +39 -7
  42. package/package/components/SimpleEditor.svelte.d.ts +1 -4
  43. package/package/components/StringTypeNarrowing.svelte +3 -1
  44. package/package/components/TestConnection.svelte +5 -0
  45. package/package/components/TestJobLoader.svelte.d.ts +1 -1
  46. package/package/components/WorkerGroup.svelte +2 -1
  47. package/package/components/apps/components/inputs/AppS3FileInput.svelte +1 -0
  48. package/package/components/apps/editor/component/components.d.ts +79 -79
  49. package/package/components/apps/editor/component/default-codes.d.ts +1 -1
  50. package/package/components/apps/editor/component/default-codes.js +10 -10
  51. package/package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +2 -1
  52. package/package/components/apps/inputType.d.ts +2 -2
  53. package/package/components/common/button/Button.svelte +10 -52
  54. package/package/components/common/button/PulseButton.svelte +81 -0
  55. package/package/components/common/button/PulseButton.svelte.d.ts +34 -0
  56. package/package/components/common/button/RoundIconButton.svelte +11 -0
  57. package/package/components/common/button/RoundIconButton.svelte.d.ts +19 -0
  58. package/package/components/common/button/model.d.ts +1 -0
  59. package/package/components/common/button/model.js +47 -0
  60. package/package/components/common/fileUpload/FileUpload.svelte +3 -1
  61. package/package/components/common/fileUpload/FileUpload.svelte.d.ts +1 -0
  62. package/package/components/common/languageIcons/LanguageIcon.svelte +3 -0
  63. package/package/components/common/layout/List.svelte +10 -4
  64. package/package/components/common/layout/List.svelte.d.ts +1 -0
  65. package/package/components/common/tabs/Tab.svelte +14 -1
  66. package/package/components/common/tabs/Tab.svelte.d.ts +1 -0
  67. package/package/components/copilot/ScriptGen.svelte +1 -1
  68. package/package/components/copilot/lib.js +1 -1
  69. package/package/components/copilot/prompts/edit.yaml +1 -1
  70. package/package/components/copilot/prompts/editPrompt.js +1 -1
  71. package/package/components/copilot/prompts/fix.yaml +1 -1
  72. package/package/components/copilot/prompts/fixPrompt.js +1 -1
  73. package/package/components/copilot/prompts/gen.yaml +1 -1
  74. package/package/components/copilot/prompts/genPrompt.js +1 -1
  75. package/package/components/custom_ui.d.ts +1 -0
  76. package/package/components/details/DetailPageDetailPanel.svelte +20 -19
  77. package/package/components/details/DetailPageDetailPanel.svelte.d.ts +4 -1
  78. package/package/components/details/DetailPageLayout.svelte +4 -1
  79. package/package/components/details/DetailPageLayout.svelte.d.ts +3 -0
  80. package/package/components/details/DetailPageTriggerPanel.svelte +84 -63
  81. package/package/components/details/DetailPageTriggerPanel.svelte.d.ts +3 -1
  82. package/package/components/details/EmailTriggerConfigSection.svelte +1 -1
  83. package/package/components/details/EmailTriggerConfigSection.svelte.d.ts +2 -1
  84. package/package/components/details/EmailTriggerPanel.svelte +2 -0
  85. package/package/components/details/EmailTriggerPanel.svelte.d.ts +2 -0
  86. package/package/components/flows/FlowEditor.svelte +8 -2
  87. package/package/components/flows/FlowEditor.svelte.d.ts +1 -0
  88. package/package/components/flows/common/FlowCard.svelte +12 -6
  89. package/package/components/flows/content/DynamicInputHelpBox.svelte +1 -0
  90. package/package/components/flows/content/FlowEditorPanel.svelte +15 -9
  91. package/package/components/flows/content/FlowEditorPanel.svelte.d.ts +1 -0
  92. package/package/components/flows/content/FlowInput.svelte +449 -98
  93. package/package/components/flows/content/FlowInput.svelte.d.ts +2 -0
  94. package/package/components/flows/content/FlowInputEditor.svelte +46 -0
  95. package/package/components/flows/content/FlowInputEditor.svelte.d.ts +25 -0
  96. package/package/components/flows/content/FlowInputsQuick.svelte +1 -1
  97. package/package/components/flows/content/FlowLoop.svelte +192 -194
  98. package/package/components/flows/content/FlowModuleComponent.svelte +372 -382
  99. package/package/components/flows/content/FlowModuleMock.svelte +6 -7
  100. package/package/components/flows/content/FlowPathViewer.svelte +2 -1
  101. package/package/components/flows/content/FlowSettings.svelte +25 -3
  102. package/package/components/flows/content/FlowWhileLoop.svelte +97 -99
  103. package/package/components/flows/flowStore.d.ts +13 -0
  104. package/package/components/flows/flowStore.js +41 -0
  105. package/package/components/flows/header/FlowPreviewButtons.svelte +10 -4
  106. package/package/components/flows/header/FlowPreviewButtons.svelte.d.ts +4 -2
  107. package/package/components/flows/header/FlowYamlEditor.svelte +3 -0
  108. package/package/components/flows/map/FlowModuleSchemaItem.svelte +8 -58
  109. package/package/components/flows/map/FlowModuleSchemaItemViewer.svelte +67 -0
  110. package/package/components/flows/map/FlowModuleSchemaItemViewer.svelte.d.ts +24 -0
  111. package/package/components/flows/map/FlowModuleSchemaMap.svelte +2 -2
  112. package/package/components/flows/pickers/FlowScriptPicker.svelte +1 -1
  113. package/package/components/flows/previousResults.d.ts +1 -1
  114. package/package/components/flows/previousResults.js +7 -2
  115. package/package/components/flows/types.d.ts +7 -0
  116. package/package/components/flows/utils.d.ts +1 -0
  117. package/package/components/flows/utils.js +3 -0
  118. package/package/components/graph/graphBuilder.js +1 -1
  119. package/package/components/graph/renderers/triggers/TriggersBadge.svelte +22 -8
  120. package/package/components/graph/renderers/triggers/TriggersBadge.svelte.d.ts +1 -1
  121. package/package/components/icons/NatsIcon.svelte +19 -0
  122. package/package/components/icons/NatsIcon.svelte.d.ts +18 -0
  123. package/package/components/icons/OracleDBIcon.svelte +15 -0
  124. package/package/components/icons/OracleDBIcon.svelte.d.ts +25 -0
  125. package/package/components/icons/index.d.ts +7 -1
  126. package/package/components/icons/index.js +8 -2
  127. package/package/components/meltComponents/ButtonDropDown.svelte +32 -0
  128. package/package/components/meltComponents/ButtonDropDown.svelte.d.ts +27 -0
  129. package/package/components/meltComponents/Popover.svelte +7 -4
  130. package/package/components/meltComponents/Popover.svelte.d.ts +1 -0
  131. package/package/components/runs/RunsFilter.svelte +2 -2
  132. package/package/components/schema/AddPropertyFormV2.svelte +46 -0
  133. package/package/components/schema/AddPropertyFormV2.svelte.d.ts +18 -0
  134. package/package/components/schema/AddPropertyV2.svelte +151 -0
  135. package/package/components/schema/AddPropertyV2.svelte.d.ts +25 -0
  136. package/package/components/schema/EditableSchemaDrawer.svelte +17 -8
  137. package/package/components/schema/EditableSchemaWrapper.svelte +58 -14
  138. package/package/components/schema/EditableSchemaWrapper.svelte.d.ts +0 -1
  139. package/package/components/schema/FlowPropertyEditor.svelte +8 -3
  140. package/package/components/schema/JobSchemaPicker.svelte +32 -0
  141. package/package/components/schema/JobSchemaPicker.svelte.d.ts +19 -0
  142. package/package/components/schema/PropertyEditor.svelte +9 -1
  143. package/package/components/schema/RunningJobSchemaPicker.svelte +67 -0
  144. package/package/components/schema/RunningJobSchemaPicker.svelte.d.ts +21 -0
  145. package/package/components/schema/SchemaFormDND.svelte +1 -1
  146. package/package/components/schema/SchemaPicker.svelte +92 -0
  147. package/package/components/schema/SchemaPicker.svelte.d.ts +23 -0
  148. package/package/components/schema/SchemaPickerRow.svelte +95 -0
  149. package/package/components/schema/SchemaPickerRow.svelte.d.ts +22 -0
  150. package/package/components/scriptEditor/LogPanel.svelte +1 -1
  151. package/package/components/settings/ChangeWorkspaceColor.svelte +103 -0
  152. package/package/components/settings/ChangeWorkspaceColor.svelte.d.ts +16 -0
  153. package/package/components/settings/ChangeWorkspaceId.svelte +1 -0
  154. package/package/components/settings/ChangeWorkspaceName.svelte +4 -0
  155. package/package/components/sidebar/MenuButton.svelte +5 -2
  156. package/package/components/sidebar/MenuButton.svelte.d.ts +1 -0
  157. package/package/components/sidebar/SidebarContent.svelte +8 -0
  158. package/package/components/sidebar/WorkspaceMenu.svelte +40 -21
  159. package/package/components/table/DataTable.svelte +43 -3
  160. package/package/components/table/DataTable.svelte.d.ts +2 -0
  161. package/package/components/table/Head.svelte +1 -1
  162. package/package/components/table/Row.svelte +11 -1
  163. package/package/components/table/Row.svelte.d.ts +3 -0
  164. package/package/components/table/index.d.ts +3 -0
  165. package/package/components/table/index.js +3 -0
  166. package/package/components/triggers/CaptureButton.svelte +38 -4
  167. package/package/components/triggers/CaptureButton.svelte.d.ts +3 -1
  168. package/package/components/triggers/CaptureIcon.svelte +7 -4
  169. package/package/components/triggers/CaptureIcon.svelte.d.ts +7 -13
  170. package/package/components/triggers/CaptureSection.svelte +50 -17
  171. package/package/components/triggers/CaptureSection.svelte.d.ts +5 -3
  172. package/package/components/triggers/CaptureTable.svelte +239 -186
  173. package/package/components/triggers/CaptureTable.svelte.d.ts +9 -11
  174. package/package/components/triggers/CaptureWrapper.svelte +126 -109
  175. package/package/components/triggers/CaptureWrapper.svelte.d.ts +3 -1
  176. package/package/components/triggers/KafkaTriggerEditorInner.svelte +1 -0
  177. package/package/components/triggers/KafkaTriggersConfigSection.svelte +16 -4
  178. package/package/components/triggers/KafkaTriggersConfigSection.svelte.d.ts +3 -1
  179. package/package/components/triggers/KafkaTriggersPanel.svelte +2 -0
  180. package/package/components/triggers/KafkaTriggersPanel.svelte.d.ts +2 -0
  181. package/package/components/triggers/NatsTriggerEditor.svelte +19 -0
  182. package/package/components/triggers/NatsTriggerEditor.svelte.d.ts +21 -0
  183. package/package/components/triggers/NatsTriggerEditorInner.svelte +239 -0
  184. package/package/components/triggers/NatsTriggerEditorInner.svelte.d.ts +21 -0
  185. package/package/components/triggers/NatsTriggersConfigSection.svelte +276 -0
  186. package/package/components/triggers/NatsTriggersConfigSection.svelte.d.ts +37 -0
  187. package/package/components/triggers/NatsTriggersPanel.svelte +126 -0
  188. package/package/components/triggers/NatsTriggersPanel.svelte.d.ts +26 -0
  189. package/package/components/triggers/RouteEditorConfigSection.svelte +12 -2
  190. package/package/components/triggers/RouteEditorConfigSection.svelte.d.ts +5 -1
  191. package/package/components/triggers/RouteEditorInner.svelte +5 -0
  192. package/package/components/triggers/RoutesPanel.svelte +4 -0
  193. package/package/components/triggers/RoutesPanel.svelte.d.ts +3 -0
  194. package/package/components/triggers/TriggersEditor.svelte +146 -97
  195. package/package/components/triggers/TriggersEditor.svelte.d.ts +2 -0
  196. package/package/components/triggers/TriggersEditorSection.svelte +19 -13
  197. package/package/components/triggers/TriggersEditorSection.svelte.d.ts +3 -0
  198. package/package/components/triggers/TriggersWrapper.svelte +7 -3
  199. package/package/components/triggers/TriggersWrapper.svelte.d.ts +2 -1
  200. package/package/components/triggers/WebhooksConfigSection.svelte +7 -6
  201. package/package/components/triggers/WebhooksConfigSection.svelte.d.ts +2 -1
  202. package/package/components/triggers/WebhooksPanel.svelte +2 -0
  203. package/package/components/triggers/WebhooksPanel.svelte.d.ts +2 -0
  204. package/package/components/triggers/WebsocketEditorConfigSection.svelte +3 -1
  205. package/package/components/triggers/WebsocketEditorConfigSection.svelte.d.ts +2 -1
  206. package/package/components/triggers/WebsocketTriggersPanel.svelte +2 -0
  207. package/package/components/triggers/WebsocketTriggersPanel.svelte.d.ts +2 -0
  208. package/package/components/triggers.d.ts +2 -1
  209. package/package/components/triggers.js +2 -0
  210. package/package/components/vscode.js +12 -8
  211. package/package/consts.d.ts +1 -0
  212. package/package/consts.js +18 -0
  213. package/package/gen/core/OpenAPI.js +1 -1
  214. package/package/gen/schemas.gen.d.ts +207 -13
  215. package/package/gen/schemas.gen.js +207 -13
  216. package/package/gen/services.gen.d.ts +118 -10
  217. package/package/gen/services.gen.js +237 -17
  218. package/package/gen/types.gen.d.ts +400 -40
  219. package/package/hubPaths.json +2 -1
  220. package/package/infer.js +11 -2
  221. package/package/monaco_workers/build_workers.js +39 -37
  222. package/package/monaco_workers/graphql.worker.bundle.js +18371 -36513
  223. package/package/script_helpers.d.ts +5 -2
  224. package/package/script_helpers.js +46 -8
  225. package/package/scripts.js +4 -0
  226. package/package/stores.d.ts +2 -1
  227. package/package/stores.js +2 -1
  228. package/package.json +14 -16
  229. package/package/monaco_workers/graphql.worker.bundle.d.ts +0 -0
@@ -0,0 +1,239 @@
1
+ <script>import { Alert, Button } from '../common';
2
+ import Drawer from '../common/drawer/Drawer.svelte';
3
+ import DrawerContent from '../common/drawer/DrawerContent.svelte';
4
+ import Path from '../Path.svelte';
5
+ import Required from '../Required.svelte';
6
+ import ScriptPicker from '../ScriptPicker.svelte';
7
+ import { NatsTriggerService } from '../../gen';
8
+ import { usedTriggerKinds, userStore, workspaceStore } from '../../stores';
9
+ import { canWrite, emptyString, sendUserToast } from '../../utils';
10
+ import { createEventDispatcher } from 'svelte';
11
+ import Section from '../Section.svelte';
12
+ import { Loader2, Save } from 'lucide-svelte';
13
+ import Label from '../Label.svelte';
14
+ import Toggle from '../Toggle.svelte';
15
+ import NatsTriggersConfigSection from './NatsTriggersConfigSection.svelte';
16
+ let drawer;
17
+ let is_flow = false;
18
+ let initialPath = '';
19
+ let edit = true;
20
+ let itemKind = 'script';
21
+ let script_path = '';
22
+ let initialScriptPath = '';
23
+ let fixedScriptPath = '';
24
+ let path = '';
25
+ let pathError = '';
26
+ let enabled = false;
27
+ let dirtyPath = false;
28
+ let can_write = true;
29
+ let drawerLoading = true;
30
+ let defaultValues = undefined;
31
+ let args = {};
32
+ const dispatch = createEventDispatcher();
33
+ $: is_flow = itemKind === 'flow';
34
+ export async function openEdit(ePath, isFlow) {
35
+ drawerLoading = true;
36
+ try {
37
+ drawer?.openDrawer();
38
+ initialPath = ePath;
39
+ itemKind = isFlow ? 'flow' : 'script';
40
+ edit = true;
41
+ dirtyPath = false;
42
+ await loadTrigger();
43
+ }
44
+ catch (err) {
45
+ sendUserToast(`Could not load nats trigger: ${err}`, true);
46
+ }
47
+ finally {
48
+ drawerLoading = false;
49
+ }
50
+ }
51
+ export async function openNew(nis_flow, fixedScriptPath_, nDefaultValues) {
52
+ drawerLoading = true;
53
+ try {
54
+ drawer?.openDrawer();
55
+ is_flow = nis_flow;
56
+ edit = false;
57
+ itemKind = nis_flow ? 'flow' : 'script';
58
+ args.nats_resource_path = nDefaultValues?.nats_resource_path ?? '';
59
+ args.subjects = nDefaultValues?.subjects ?? [''];
60
+ args.use_jetstream = nDefaultValues?.use_jetstream ?? false;
61
+ args.stream_name = args.use_jetstream ? nDefaultValues?.stream_name ?? '' : undefined;
62
+ args.consumer_name = args.use_jetstream ? nDefaultValues?.consumer_name ?? '' : undefined;
63
+ initialScriptPath = '';
64
+ fixedScriptPath = fixedScriptPath_ ?? '';
65
+ script_path = fixedScriptPath;
66
+ path = '';
67
+ initialPath = '';
68
+ dirtyPath = false;
69
+ defaultValues = nDefaultValues;
70
+ }
71
+ finally {
72
+ drawerLoading = false;
73
+ }
74
+ }
75
+ async function loadTrigger() {
76
+ const s = await NatsTriggerService.getNatsTrigger({
77
+ workspace: $workspaceStore,
78
+ path: initialPath
79
+ });
80
+ script_path = s.script_path;
81
+ initialScriptPath = s.script_path;
82
+ is_flow = s.is_flow;
83
+ path = s.path;
84
+ args.nats_resource_path = s.nats_resource_path;
85
+ args.stream_name = s.stream_name;
86
+ args.consumer_name = s.consumer_name;
87
+ args.subjects = s.subjects;
88
+ args.use_jetstream = s.use_jetstream;
89
+ enabled = s.enabled;
90
+ can_write = canWrite(s.path, s.extra_perms, $userStore);
91
+ }
92
+ async function updateTrigger() {
93
+ if (edit) {
94
+ await NatsTriggerService.updateNatsTrigger({
95
+ workspace: $workspaceStore,
96
+ path: initialPath,
97
+ requestBody: {
98
+ path,
99
+ script_path,
100
+ is_flow,
101
+ nats_resource_path: args.nats_resource_path,
102
+ stream_name: args.stream_name,
103
+ consumer_name: args.consumer_name,
104
+ subjects: args.subjects,
105
+ use_jetstream: args.use_jetstream
106
+ }
107
+ });
108
+ sendUserToast(`Nats trigger ${path} updated`);
109
+ }
110
+ else {
111
+ await NatsTriggerService.createNatsTrigger({
112
+ workspace: $workspaceStore,
113
+ requestBody: {
114
+ path,
115
+ script_path,
116
+ is_flow,
117
+ enabled: true,
118
+ nats_resource_path: args.nats_resource_path,
119
+ stream_name: args.stream_name,
120
+ consumer_name: args.consumer_name,
121
+ subjects: args.subjects,
122
+ use_jetstream: args.use_jetstream
123
+ }
124
+ });
125
+ sendUserToast(`Nats trigger ${path} created`);
126
+ }
127
+ if (!$usedTriggerKinds.includes('nats')) {
128
+ $usedTriggerKinds = [...$usedTriggerKinds, 'nats'];
129
+ }
130
+ dispatch('update');
131
+ drawer.closeDrawer();
132
+ }
133
+ function useDefaultValues() {
134
+ if (args.nats_resource_path && args.nats_resource_path != '') {
135
+ return false;
136
+ }
137
+ if (!defaultValues) {
138
+ return false;
139
+ }
140
+ return (defaultValues.servers &&
141
+ defaultValues.servers.length > 0 &&
142
+ defaultValues.servers.some((broker) => broker.trim() !== ''));
143
+ }
144
+ let isValid = false;
145
+ </script>
146
+
147
+ <Drawer size="800px" bind:this={drawer}>
148
+ <DrawerContent
149
+ title={edit
150
+ ? can_write
151
+ ? `Edit NATS trigger ${initialPath}`
152
+ : `NATS trigger ${initialPath}`
153
+ : 'New NATS trigger'}
154
+ on:close={drawer.closeDrawer}
155
+ >
156
+ <svelte:fragment slot="actions">
157
+ {#if !drawerLoading}
158
+ {#if edit}
159
+ <div class="mr-8 center-center -mt-1">
160
+ <Toggle
161
+ disabled={!can_write}
162
+ checked={enabled}
163
+ options={{ right: 'enable', left: 'disable' }}
164
+ on:change={async (e) => {
165
+ await NatsTriggerService.setNatsTriggerEnabled({
166
+ path: initialPath,
167
+ workspace: $workspaceStore ?? '',
168
+ requestBody: { enabled: e.detail }
169
+ })
170
+ sendUserToast(`${e.detail ? 'enabled' : 'disabled'} NATS trigger ${initialPath}`)
171
+ }}
172
+ />
173
+ </div>
174
+ {/if}
175
+ {#if can_write}
176
+ <Button
177
+ startIcon={{ icon: Save }}
178
+ disabled={pathError != '' || emptyString(script_path) || !can_write || !isValid}
179
+ on:click={updateTrigger}
180
+ >
181
+ Save
182
+ </Button>
183
+ {/if}
184
+ {/if}
185
+ </svelte:fragment>
186
+ {#if drawerLoading}
187
+ <Loader2 class="animate-spin" />
188
+ {:else}
189
+ <Alert title="Info" type="info">
190
+ {#if edit}
191
+ Changes can take up to 30 seconds to take effect.
192
+ {:else}
193
+ NATS consumers can take up to 30 seconds to start.
194
+ {/if}
195
+ </Alert>
196
+ <div class="flex flex-col gap-12 mt-6">
197
+ <div class="flex flex-col gap-4">
198
+ <Label label="Path">
199
+ <Path
200
+ bind:dirty={dirtyPath}
201
+ bind:error={pathError}
202
+ bind:path
203
+ {initialPath}
204
+ checkInitialPathExistence={!edit}
205
+ namePlaceholder="nats_trigger"
206
+ kind="nats_trigger"
207
+ disabled={!can_write}
208
+ />
209
+ </Label>
210
+ </div>
211
+
212
+ <NatsTriggersConfigSection
213
+ {path}
214
+ bind:args
215
+ bind:isValid
216
+ defaultValues={useDefaultValues() ? defaultValues : undefined}
217
+ />
218
+
219
+ <Section label="Runnable">
220
+ <p class="text-xs mb-1 text-tertiary">
221
+ Pick a script or flow to be triggered<Required required={true} />
222
+ </p>
223
+ <div class="flex flex-row mb-2">
224
+ <ScriptPicker
225
+ disabled={fixedScriptPath != '' || !can_write}
226
+ initialPath={fixedScriptPath || initialScriptPath}
227
+ kinds={['script']}
228
+ allowFlow={true}
229
+ bind:itemKind
230
+ bind:scriptPath={script_path}
231
+ allowRefresh={can_write}
232
+ allowEdit={!$userStore?.operator}
233
+ />
234
+ </div>
235
+ </Section>
236
+ </div>
237
+ {/if}
238
+ </DrawerContent>
239
+ </Drawer>
@@ -0,0 +1,21 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ openEdit?: ((ePath: string, isFlow: boolean) => Promise<void>) | undefined;
5
+ openNew?: ((nis_flow: boolean, fixedScriptPath_?: string, nDefaultValues?: Record<string, any>) => Promise<void>) | undefined;
6
+ };
7
+ events: {
8
+ update: CustomEvent<any>;
9
+ } & {
10
+ [evt: string]: CustomEvent<any>;
11
+ };
12
+ slots: {};
13
+ };
14
+ export type NatsTriggerEditorInnerProps = typeof __propDef.props;
15
+ export type NatsTriggerEditorInnerEvents = typeof __propDef.events;
16
+ export type NatsTriggerEditorInnerSlots = typeof __propDef.slots;
17
+ export default class NatsTriggerEditorInner extends SvelteComponent<NatsTriggerEditorInnerProps, NatsTriggerEditorInnerEvents, NatsTriggerEditorInnerSlots> {
18
+ get openEdit(): (ePath: string, isFlow: boolean) => Promise<void>;
19
+ get openNew(): (nis_flow: boolean, fixedScriptPath_?: string | undefined, nDefaultValues?: Record<string, any> | undefined) => Promise<void>;
20
+ }
21
+ export {};
@@ -0,0 +1,276 @@
1
+ <script>import ResourcePicker from '../ResourcePicker.svelte';
2
+ import { Boxes } from 'lucide-svelte';
3
+ import Section from '../Section.svelte';
4
+ import Subsection from '../Subsection.svelte';
5
+ import ToggleButton from '../common/toggleButton-v2/ToggleButton.svelte';
6
+ import ToggleButtonGroup from '../common/toggleButton-v2/ToggleButtonGroup.svelte';
7
+ import SchemaForm from '../SchemaForm.svelte';
8
+ import CaptureSection, {} from './CaptureSection.svelte';
9
+ import CaptureTable from './CaptureTable.svelte';
10
+ import { workspaceStore } from '../../stores';
11
+ export let defaultValues = undefined;
12
+ export let headless = false;
13
+ export let args = {};
14
+ export let staticInputDisabled = true;
15
+ export let showCapture = false;
16
+ export let captureInfo = undefined;
17
+ export let captureTable = undefined;
18
+ export let isValid = false;
19
+ export let path;
20
+ let selected = staticInputDisabled ? 'resource' : 'static';
21
+ const connnectionSchema = {
22
+ $schema: 'http://json-schema.org/draft-07/schema#',
23
+ type: 'object',
24
+ properties: {
25
+ servers: {
26
+ type: 'array',
27
+ items: {
28
+ type: 'string'
29
+ },
30
+ title: 'Servers',
31
+ default: ['']
32
+ },
33
+ require_tls: {
34
+ type: 'boolean',
35
+ title: 'Require TLS',
36
+ default: false
37
+ },
38
+ auth: {
39
+ type: 'object',
40
+ title: 'Authentication',
41
+ default: {
42
+ label: 'NO_AUTH'
43
+ },
44
+ oneOf: [
45
+ {
46
+ type: 'object',
47
+ title: 'NO_AUTH',
48
+ properties: {
49
+ label: {
50
+ enum: ['NO_AUTH'],
51
+ type: 'string'
52
+ }
53
+ }
54
+ },
55
+ {
56
+ type: 'object',
57
+ order: ['token'],
58
+ title: 'TOKEN',
59
+ required: ['token'],
60
+ properties: {
61
+ label: {
62
+ enum: ['TOKEN'],
63
+ type: 'string'
64
+ },
65
+ token: {
66
+ type: 'string',
67
+ password: true
68
+ }
69
+ }
70
+ },
71
+ {
72
+ type: 'object',
73
+ title: 'USER_PASSWORD',
74
+ required: ['user', 'password'],
75
+ properties: {
76
+ label: {
77
+ enum: ['USER_PASSWORD'],
78
+ type: 'string'
79
+ },
80
+ user: {
81
+ type: 'string'
82
+ },
83
+ password: {
84
+ type: 'string',
85
+ password: true
86
+ }
87
+ }
88
+ },
89
+ {
90
+ type: 'object',
91
+ order: ['nkey'],
92
+ title: 'NKEY',
93
+ required: ['nkey'],
94
+ properties: {
95
+ label: {
96
+ enum: ['NKEY'],
97
+ type: 'string'
98
+ },
99
+ seed: {
100
+ type: 'string',
101
+ password: true
102
+ }
103
+ }
104
+ },
105
+ {
106
+ type: 'object',
107
+ title: 'JWT',
108
+ required: ['jwt', 'seed'],
109
+ properties: {
110
+ label: {
111
+ enum: ['JWT'],
112
+ type: 'string'
113
+ },
114
+ jwt: {
115
+ type: 'string',
116
+ password: true
117
+ },
118
+ seed: {
119
+ type: 'string',
120
+ password: true
121
+ }
122
+ }
123
+ }
124
+ ]
125
+ }
126
+ },
127
+ required: ['servers', 'auth', 'require_tls']
128
+ };
129
+ const argsSchema = {
130
+ $schema: 'http://json-schema.org/draft-07/schema#',
131
+ type: 'object',
132
+ properties: {
133
+ subjects: {
134
+ type: 'array',
135
+ items: {
136
+ type: 'string'
137
+ },
138
+ nullable: false,
139
+ title: 'Subjects',
140
+ default: [''],
141
+ description: 'The subjects to listen to. If not using JetStream, only one subject is supported.'
142
+ },
143
+ use_jetstream: {
144
+ type: 'boolean',
145
+ title: 'Use JetStream',
146
+ default: false,
147
+ description: 'Whether to use JetStream (durable push-consumer)'
148
+ },
149
+ stream_name: {
150
+ type: 'string',
151
+ title: 'Stream name',
152
+ pattern: '^((\\$var:[\\w-\\/]+)|[a-zA-Z0-9-_]+)$',
153
+ customErrorMessage: 'Invalid stream name',
154
+ showExpr: 'fields.use_jetstream',
155
+ description: 'Required if using JetStream. If the stream already exists, it will be updated to include the specified subjects if not already present. Otherwise, it will be created.'
156
+ },
157
+ consumer_name: {
158
+ type: 'string',
159
+ title: 'Consumer name',
160
+ pattern: '^((\\$var:[\\w-\\/]+)|[a-zA-Z0-9-_]+)$',
161
+ customErrorMessage: 'Invalid consumer name',
162
+ showExpr: 'fields.use_jetstream',
163
+ description: 'Required is using JetStream. If a consumer with the same name already exists, it will be overwritten. It is also used as the deliver subject.'
164
+ }
165
+ },
166
+ required: ['subjects', 'use_jetstream', 'stream_name', 'consumer_name']
167
+ };
168
+ let connectionValid = false;
169
+ let otherArgsValid = false;
170
+ let globalError = '';
171
+ $: globalError =
172
+ !args.use_jetstream && args.subjects && args.subjects.length > 1
173
+ ? 'Only one subject is supported if not using JetStream.'
174
+ : '';
175
+ $: isValid =
176
+ (selected === 'resource'
177
+ ? !!args.nats_resource_path
178
+ : connectionValid &&
179
+ args.servers &&
180
+ args.servers.length > 0 &&
181
+ args.servers.every((b) => b.length > 0) &&
182
+ args.require_tls !== undefined &&
183
+ args.require_tls !== null) &&
184
+ otherArgsValid &&
185
+ args.subjects &&
186
+ args.subjects.length > 0 &&
187
+ args.subjects.every((b) => /^[a-zA-Z0-9-_.*>]+$/.test(b)) &&
188
+ globalError === '';
189
+ $: usingResource = !!args.nats_resource_path;
190
+ $: usingResource && (selected = 'resource');
191
+ function setStreamAndConsumerNames() {
192
+ if (!args.stream_name) {
193
+ args.stream_name = `windmill_stream-${$workspaceStore}-${path.replaceAll('/', '__')}`;
194
+ }
195
+ if (!args.consumer_name) {
196
+ args.consumer_name = `windmill_consumer-${$workspaceStore}-${path.replaceAll('/', '__')}`;
197
+ }
198
+ }
199
+ $: useJetStream = args.use_jetstream;
200
+ $: useJetStream && setStreamAndConsumerNames();
201
+ </script>
202
+
203
+ <div>
204
+ {#if showCapture && captureInfo}
205
+ <CaptureSection
206
+ captureType="nats"
207
+ disabled={!isValid}
208
+ {captureInfo}
209
+ on:captureToggle
210
+ on:applyArgs
211
+ on:updateSchema
212
+ on:addPreprocessor
213
+ bind:captureTable
214
+ />
215
+ {/if}
216
+ <Section label="NATS" {headless}>
217
+ <div class="flex flex-col w-full gap-4">
218
+ <div class="block grow w-full">
219
+ <Subsection label="Connection">
220
+ <svelte:fragment slot="header">
221
+ {#if !staticInputDisabled}
222
+ <ToggleButtonGroup
223
+ bind:selected
224
+ class="h-full"
225
+ on:selected={(ev) => {
226
+ if (ev.detail === 'static') {
227
+ delete args.nats_resource_path
228
+ args.require_tls = false
229
+ args.servers = ['']
230
+ args.auth = {
231
+ label: 'NO_AUTH'
232
+ }
233
+ } else {
234
+ delete args.servers
235
+ delete args.auth
236
+ delete args.require_tls
237
+ }
238
+ }}
239
+ >
240
+ <ToggleButton value="static" label="Static" small={true} />
241
+ <ToggleButton value="resource" label="Resource" icon={Boxes} small={true} />
242
+ </ToggleButtonGroup>
243
+ {/if}
244
+ </svelte:fragment>
245
+
246
+ {#if selected === 'resource'}
247
+ <ResourcePicker
248
+ resourceType="nats"
249
+ bind:value={args.nats_resource_path}
250
+ {defaultValues}
251
+ />
252
+ {:else}
253
+ <SchemaForm
254
+ schema={connnectionSchema}
255
+ bind:args
256
+ bind:isValid={connectionValid}
257
+ lightHeader={true}
258
+ />
259
+ {/if}
260
+ </Subsection>
261
+ </div>
262
+
263
+ <div class="block grow w-full">
264
+ <Subsection headless={true}>
265
+ <SchemaForm
266
+ schema={argsSchema}
267
+ bind:args
268
+ bind:isValid={otherArgsValid}
269
+ lightHeader={true}
270
+ />
271
+ </Subsection>
272
+ <span class="text-xs text-red-500">{globalError}</span>
273
+ </div>
274
+ </div>
275
+ </Section>
276
+ </div>
@@ -0,0 +1,37 @@
1
+ import { SvelteComponent } from "svelte";
2
+ import { type CaptureInfo } from './CaptureSection.svelte';
3
+ import CaptureTable from './CaptureTable.svelte';
4
+ declare const __propDef: {
5
+ props: {
6
+ defaultValues?: Record<string, any> | undefined;
7
+ headless?: boolean | undefined;
8
+ args?: Record<string, any> | undefined;
9
+ staticInputDisabled?: boolean | undefined;
10
+ showCapture?: boolean | undefined;
11
+ captureInfo?: CaptureInfo | undefined;
12
+ captureTable?: CaptureTable | undefined;
13
+ isValid?: boolean | undefined;
14
+ path: string;
15
+ };
16
+ events: {
17
+ captureToggle: CustomEvent<undefined>;
18
+ applyArgs: CustomEvent<{
19
+ kind: "main" | "preprocessor";
20
+ args: Record<string, any> | undefined;
21
+ }>;
22
+ updateSchema: CustomEvent<{
23
+ payloadData: Record<string, any>;
24
+ redirect: boolean;
25
+ }>;
26
+ addPreprocessor: CustomEvent<null>;
27
+ } & {
28
+ [evt: string]: CustomEvent<any>;
29
+ };
30
+ slots: {};
31
+ };
32
+ export type NatsTriggersConfigSectionProps = typeof __propDef.props;
33
+ export type NatsTriggersConfigSectionEvents = typeof __propDef.events;
34
+ export type NatsTriggersConfigSectionSlots = typeof __propDef.slots;
35
+ export default class NatsTriggersConfigSection extends SvelteComponent<NatsTriggersConfigSectionProps, NatsTriggersConfigSectionEvents, NatsTriggersConfigSectionSlots> {
36
+ }
37
+ export {};
@@ -0,0 +1,126 @@
1
+ <script>import { enterpriseLicense, userStore, workspaceStore } from '../../stores';
2
+ import { NatsTriggerService } from '../../gen';
3
+ import { canWrite } from '../../utils';
4
+ import Alert from '../common/alert/Alert.svelte';
5
+ import { getContext, onMount } from 'svelte';
6
+ import NatsTriggerEditor from './NatsTriggerEditor.svelte';
7
+ import { isCloudHosted } from '../../cloud';
8
+ import TriggersEditorSection from './TriggersEditorSection.svelte';
9
+ import Section from '../Section.svelte';
10
+ import Skeleton from '../common/skeleton/Skeleton.svelte';
11
+ import Description from '../Description.svelte';
12
+ export let isFlow;
13
+ export let path;
14
+ export let newItem = false;
15
+ export let isEditor = false;
16
+ export let canHavePreprocessor = false;
17
+ export let hasPreprocessor = false;
18
+ let natsTriggerEditor;
19
+ $: path && loadTriggers();
20
+ const { triggersCount, selectedTrigger, defaultValues } = getContext('TriggerContext');
21
+ onMount(() => {
22
+ if (defaultValues &&
23
+ $selectedTrigger === 'nats' &&
24
+ Object.keys($defaultValues ?? {}).length > 0) {
25
+ natsTriggerEditor.openNew(isFlow, path, $defaultValues);
26
+ defaultValues.set(undefined);
27
+ }
28
+ });
29
+ let natsTriggers = undefined;
30
+ export async function loadTriggers() {
31
+ try {
32
+ natsTriggers = (await NatsTriggerService.listNatsTriggers({
33
+ workspace: $workspaceStore ?? '',
34
+ path,
35
+ isFlow
36
+ })).map((x) => {
37
+ return { canWrite: canWrite(x.path, x.extra_perms, $userStore), ...x };
38
+ });
39
+ $triggersCount = { ...($triggersCount ?? {}), nats_count: natsTriggers?.length };
40
+ }
41
+ catch (e) {
42
+ console.error('impossible to load nats triggers', e);
43
+ }
44
+ }
45
+ let data = {
46
+ natsTriggers: [],
47
+ newItem
48
+ };
49
+ function saveTrigger(path, args) {
50
+ natsTriggerEditor?.openNew(isFlow, path, args);
51
+ }
52
+ </script>
53
+
54
+ <NatsTriggerEditor
55
+ on:update={() => {
56
+ loadTriggers()
57
+ }}
58
+ bind:this={natsTriggerEditor}
59
+ />
60
+
61
+ {#if !$enterpriseLicense}
62
+ <Alert title="EE Only" type="warning" size="xs">
63
+ Nats triggers are an enterprise only feature.
64
+ </Alert>
65
+ {:else if isCloudHosted()}
66
+ <Alert title="Not compatible with multi-tenant cloud" type="warning" size="xs">
67
+ Nats triggers are disabled in the multi-tenant cloud.
68
+ </Alert>
69
+ {:else}
70
+ <div class="flex flex-col gap-4">
71
+ <Description link="https://www.windmill.dev/docs/core_concepts/nats_triggers">
72
+ NATS triggers execute scripts and flows in response to messages published to NATS subjects.
73
+ </Description>
74
+ <TriggersEditorSection
75
+ on:saveTrigger={(e) => {
76
+ saveTrigger(path, e.detail.config)
77
+ }}
78
+ on:applyArgs
79
+ on:addPreprocessor
80
+ cloudDisabled={false}
81
+ triggerType="nats"
82
+ {isFlow}
83
+ {data}
84
+ {path}
85
+ {isEditor}
86
+ {canHavePreprocessor}
87
+ {hasPreprocessor}
88
+ {newItem}
89
+ />
90
+
91
+ {#if !newItem}
92
+ {#if natsTriggers}
93
+ <Section label="NATS Triggers">
94
+ {#if natsTriggers.length == 0}
95
+ <div class="text-xs text-secondary text-center"> No nats triggers </div>
96
+ {:else}
97
+ <div class="flex flex-col divide-y pt-2">
98
+ {#each natsTriggers as natsTrigger (natsTrigger.path)}
99
+ <div class="grid grid-cols-5 text-2xs items-center py-2">
100
+ <div class="col-span-2 truncate">{natsTrigger.path}</div>
101
+ <div class="col-span-2 truncate">
102
+ {natsTrigger.nats_resource_path}
103
+ </div>
104
+ <div class="flex justify-end">
105
+ <button
106
+ on:click={() => natsTriggerEditor?.openEdit(natsTrigger.path, isFlow)}
107
+ class="px-2"
108
+ >
109
+ {#if natsTrigger.canWrite}
110
+ Edit
111
+ {:else}
112
+ View
113
+ {/if}
114
+ </button>
115
+ </div>
116
+ </div>
117
+ {/each}
118
+ </div>
119
+ {/if}
120
+ </Section>
121
+ {:else}
122
+ <Skeleton layout={[[8]]} />
123
+ {/if}
124
+ {/if}
125
+ </div>
126
+ {/if}