windmill-components 1.444.2 → 1.447.5

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 +1 -0
  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
@@ -1,12 +1,15 @@
1
- <script>
2
- import { ScanIcon } from 'lucide-svelte'
1
+ <script>import { ScanIcon } from 'lucide-svelte';
2
+ export let size = 14;
3
+ export let variant = undefined;
3
4
  </script>
4
5
 
5
6
  <div class="relative">
6
- <ScanIcon size="14" />
7
+ <ScanIcon {size} />
7
8
  <div class="absolute inset-0 flex items-center justify-center">
8
9
  <svg
9
- class="text-red-500"
10
+ class={variant === 'redDot' ? 'text-red-500' : ''}
11
+ width={size}
12
+ height={size}
10
13
  viewBox="0 0 24 24"
11
14
  fill="currentColor"
12
15
  xmlns="http://www.w3.org/2000/svg"
@@ -1,23 +1,17 @@
1
- /** @typedef {typeof __propDef.props} CaptureIconProps */
2
- /** @typedef {typeof __propDef.events} CaptureIconEvents */
3
- /** @typedef {typeof __propDef.slots} CaptureIconSlots */
4
- export default class CaptureIcon extends SvelteComponent<{
5
- [x: string]: never;
6
- }, {
7
- [evt: string]: CustomEvent<any>;
8
- }, {}> {
9
- }
10
- export type CaptureIconProps = typeof __propDef.props;
11
- export type CaptureIconEvents = typeof __propDef.events;
12
- export type CaptureIconSlots = typeof __propDef.slots;
13
1
  import { SvelteComponent } from "svelte";
14
2
  declare const __propDef: {
15
3
  props: {
16
- [x: string]: never;
4
+ size?: number | undefined;
5
+ variant?: 'redDot' | undefined;
17
6
  };
18
7
  events: {
19
8
  [evt: string]: CustomEvent<any>;
20
9
  };
21
10
  slots: {};
22
11
  };
12
+ export type CaptureIconProps = typeof __propDef.props;
13
+ export type CaptureIconEvents = typeof __propDef.events;
14
+ export type CaptureIconSlots = typeof __propDef.slots;
15
+ export default class CaptureIcon extends SvelteComponent<CaptureIconProps, CaptureIconEvents, CaptureIconSlots> {
16
+ }
23
17
  export {};
@@ -3,11 +3,12 @@
3
3
 
4
4
  <script>import { slide } from 'svelte/transition';
5
5
  import AnimatedButton from '../common/button/AnimatedButton.svelte';
6
+ import PulseButton from '../common/button/PulseButton.svelte';
6
7
  import Button from '../common/button/Button.svelte';
7
8
  import { CircleStop } from 'lucide-svelte';
8
9
  import ConnectionIndicator, {} from '../common/alert/ConnectionIndicator.svelte';
9
10
  import CaptureTable from './CaptureTable.svelte';
10
- import { createEventDispatcher } from 'svelte';
11
+ import { createEventDispatcher, onDestroy, getContext } from 'svelte';
11
12
  import CaptureIcon from './CaptureIcon.svelte';
12
13
  import Tooltip from '../Tooltip.svelte';
13
14
  export let disabled;
@@ -15,25 +16,56 @@ export let captureType;
15
16
  export let captureInfo;
16
17
  export let captureTable;
17
18
  const dispatch = createEventDispatcher();
19
+ const { showCaptureHint } = getContext('TriggerContext');
20
+ onDestroy(() => {
21
+ if (captureInfo.active) {
22
+ dispatch('captureToggle');
23
+ }
24
+ });
25
+ function handleUpdateSchema(e) {
26
+ dispatch('updateSchema', {
27
+ payloadData: e.detail.payloadData,
28
+ redirect: e.detail.redirect
29
+ });
30
+ }
31
+ let openingDuration = 400;
32
+ let pulseButton;
33
+ function updateShowCaptureHint(show) {
34
+ if (show) {
35
+ $showCaptureHint = false;
36
+ setTimeout(() => {
37
+ pulseButton?.triggerPulse(1);
38
+ }, 300);
39
+ }
40
+ }
41
+ $: updateShowCaptureHint($showCaptureHint);
18
42
  </script>
19
43
 
20
- <div transition:slide class="pb-4">
44
+ <div transition:slide={{ duration: openingDuration }} class="pb-12 overflow-hidden">
21
45
  <div class="border p-4 rounded-lg">
22
46
  <div class="flex flex-col gap-1 mb-4">
23
47
  <div class="flex flex-row items-center justify-start gap-1">
24
- <AnimatedButton animate={captureInfo.active} baseRadius="6px" wrapperClasses="ml-[-2px]">
25
- <Button
26
- size="xs2"
27
- on:click={() => dispatch('captureToggle')}
28
- variant="border"
29
- {disabled}
30
- color="light"
31
- startIcon={{ icon: captureInfo.active ? CircleStop : CaptureIcon }}
32
- btnClasses={captureInfo.active ? 'text-blue-500 hover:text-blue-500' : ''}
33
- >
34
- {captureInfo.active ? 'Stop' : 'Start capturing'}
35
- </Button>
36
- </AnimatedButton>
48
+ <PulseButton bind:this={pulseButton} numberOfPulses={1} pulseDuration={1}>
49
+ <AnimatedButton animate={captureInfo.active} baseRadius="6px" wrapperClasses="ml-[-2px]">
50
+ <Button
51
+ size="xs2"
52
+ on:click={() => dispatch('captureToggle')}
53
+ variant="border"
54
+ {disabled}
55
+ color="light"
56
+ btnClasses={captureInfo.active ? 'text-blue-500 hover:text-blue-500' : ''}
57
+ >
58
+ <div class="flex flex-row items-center gap-1 w-28 justify-center">
59
+ {#if captureInfo.active}
60
+ <CircleStop size={14} />
61
+ {:else}
62
+ <CaptureIcon variant="redDot" size={14} />
63
+ {/if}
64
+ {captureInfo.active ? 'Stop' : 'Start capturing'}
65
+ </div>
66
+ </Button>
67
+ </AnimatedButton>
68
+ </PulseButton>
37
69
 
38
70
  {#if captureInfo.active}
39
71
  <ConnectionIndicator connectionInfo={captureInfo.connectionInfo} />
@@ -68,9 +100,10 @@ const dispatch = createEventDispatcher();
68
100
  path={captureInfo.path}
69
101
  canEdit={true}
70
102
  on:applyArgs
71
- on:updateSchema
103
+ on:updateSchema={handleUpdateSchema}
72
104
  on:addPreprocessor
73
- maxHeight={300}
105
+ on:testWithArgs
106
+ fullHeight={false}
74
107
  />
75
108
  </div>
76
109
  </div>
@@ -9,6 +9,7 @@ export type CaptureInfo = {
9
9
  };
10
10
  import { type ConnectionInfo } from '../common/alert/ConnectionIndicator.svelte';
11
11
  import CaptureTable from './CaptureTable.svelte';
12
+ import type { CaptureTriggerKind } from '../../gen';
12
13
  declare const __propDef: {
13
14
  props: {
14
15
  disabled: boolean;
@@ -21,12 +22,13 @@ declare const __propDef: {
21
22
  kind: "main" | "preprocessor";
22
23
  args: Record<string, any> | undefined;
23
24
  }>;
25
+ addPreprocessor: CustomEvent<null>;
26
+ testWithArgs: CustomEvent<any>;
27
+ captureToggle: CustomEvent<undefined>;
24
28
  updateSchema: CustomEvent<{
25
- schema: any;
29
+ payloadData: Record<string, any>;
26
30
  redirect: boolean;
27
31
  }>;
28
- addPreprocessor: CustomEvent<null>;
29
- captureToggle: CustomEvent<undefined>;
30
32
  } & {
31
33
  [evt: string]: CustomEvent<any>;
32
34
  };
@@ -1,224 +1,277 @@
1
1
  <script>import Label from '../Label.svelte';
2
- import { Clipboard, Info, Trash2, Plus } from 'lucide-svelte';
2
+ import { Info, Trash2 } from 'lucide-svelte';
3
3
  import ToggleButton from '../common/toggleButton-v2/ToggleButton.svelte';
4
4
  import ToggleButtonGroup from '../common/toggleButton-v2/ToggleButtonGroup.svelte';
5
- import { copyToClipboard } from '../../utils';
6
5
  import Button from '../common/button/Button.svelte';
7
6
  import CustomPopover from '../CustomPopover.svelte';
8
- import { convert } from '@redocly/json-to-json-schema';
9
- import SchemaViewer from '../SchemaViewer.svelte';
7
+ import { Webhook, Route, Unplug, Mail, Play } from 'lucide-svelte';
8
+ import KafkaIcon from '../icons/KafkaIcon.svelte';
10
9
  import { isObject } from '../../utils';
11
- import { createEventDispatcher } from 'svelte';
10
+ import { createEventDispatcher, onDestroy } from 'svelte';
12
11
  import {} from '../triggers';
13
12
  import { CaptureService } from '../../gen';
14
13
  import { workspaceStore } from '../../stores';
15
14
  import {} from '../../gen';
16
- import { captureTriggerKindToTriggerKind } from '../triggers';
17
- import { twMerge } from 'tailwind-merge';
18
- import { slide } from 'svelte/transition';
15
+ import CaptureButton from './CaptureButton.svelte';
16
+ import InfiniteList from '../InfiniteList.svelte';
17
+ import { sendUserToast } from '../../utils';
18
+ import SchemaPickerRow from '../schema/SchemaPickerRow.svelte';
19
+ import { clickOutside } from '../../utils';
19
20
  export let path;
20
21
  export let hasPreprocessor = false;
21
22
  export let canHavePreprocessor = false;
22
23
  export let isFlow = false;
23
- export let captureType = 'webhook';
24
+ export let captureType = undefined;
24
25
  export let headless = false;
25
26
  export let addButton = false;
26
- export let hideCapturesWhenEmpty = false;
27
27
  export let canEdit = false;
28
- export let maxHeight = undefined;
29
- let captures = [];
28
+ export let fullHeight = true;
29
+ let selected = undefined;
30
30
  let testKind = 'main';
31
+ let isEmpty = true;
32
+ let infiniteList = null;
33
+ let firstClick = true;
34
+ let capturesLength = 0;
31
35
  $: hasPreprocessor && (testKind = 'preprocessor');
32
- let deleteLoading = null;
33
- async function deleteCapture(id) {
34
- deleteLoading = id;
35
- try {
36
+ const dispatch = createEventDispatcher();
37
+ export async function loadCaptures(refresh = false) {
38
+ await infiniteList?.loadData(refresh ? 'refresh' : 'loadMore');
39
+ }
40
+ function initLoadCaptures(testKind = 'main') {
41
+ const loadInputsPageFn = async (page, perPage) => {
42
+ const captures = await CaptureService.listCaptures({
43
+ workspace: $workspaceStore,
44
+ runnableKind: isFlow ? 'flow' : 'script',
45
+ path: path ?? '',
46
+ triggerKind: captureType,
47
+ page,
48
+ perPage
49
+ });
50
+ let capturesWithPayload = captures.map((capture) => {
51
+ const payload = isObject(capture.payload) ? capture.payload : {};
52
+ const triggerExtra = isObject(capture.trigger_extra) ? capture.trigger_extra : {};
53
+ return {
54
+ ...capture,
55
+ payloadData: testKind === 'preprocessor'
56
+ ? {
57
+ ...payload,
58
+ ...triggerExtra
59
+ }
60
+ : { ...payload }
61
+ };
62
+ });
63
+ return capturesWithPayload;
64
+ };
65
+ infiniteList?.setLoader(loadInputsPageFn);
66
+ const deleteInputFn = async (id) => {
36
67
  await CaptureService.deleteCapture({
37
68
  workspace: $workspaceStore,
38
69
  id
39
70
  });
40
- refreshCaptures();
71
+ };
72
+ infiniteList?.setDeleteItemFn(deleteInputFn);
73
+ }
74
+ function handleSelect(capture) {
75
+ if (selected === capture.id) {
76
+ deselect();
41
77
  }
42
- finally {
43
- deleteLoading = null;
78
+ else {
79
+ selected = capture.id;
80
+ dispatch('select', capture.payloadData);
44
81
  }
45
82
  }
46
- const dispatch = createEventDispatcher();
47
- export async function refreshCaptures() {
48
- captures = await CaptureService.listCaptures({
49
- workspace: $workspaceStore,
50
- runnableKind: isFlow ? 'flow' : 'script',
51
- path,
52
- triggerKind: captureType !== 'all' ? captureType : undefined
53
- });
83
+ function deselect() {
84
+ selected = undefined;
85
+ dispatch('select', undefined);
54
86
  }
55
- refreshCaptures();
87
+ onDestroy(() => {
88
+ deselect();
89
+ });
90
+ const captureKindToIcon = {
91
+ webhook: Webhook,
92
+ http: Route,
93
+ email: Mail,
94
+ websocket: Unplug,
95
+ kafka: KafkaIcon
96
+ };
97
+ async function getPropPickerElements() {
98
+ return Array.from(document.querySelectorAll('[data-schema-picker], [data-schema-picker] *'));
99
+ }
100
+ function handleKeydown(event) {
101
+ if (event.key === 'Escape' && selected) {
102
+ deselect();
103
+ }
104
+ }
105
+ function handleError(error) {
106
+ if (error.type === 'delete') {
107
+ sendUserToast(`Failed to delete capture: ${error.error}`, true);
108
+ }
109
+ else if (error.type === 'load') {
110
+ sendUserToast(`Failed to load captures: ${error.error}`, true);
111
+ }
112
+ }
113
+ $: path && infiniteList && initLoadCaptures();
56
114
  </script>
57
115
 
58
- {#if captures.length > 0 || !hideCapturesWhenEmpty}
59
- <Label
60
- label="Captures"
61
- {headless}
62
- class={twMerge(
63
- 'flex flex-col h-full divide-y gap-1',
64
- maxHeight ? `max-h-[${maxHeight}px]` : ''
65
- )}
66
- >
67
- <svelte:fragment slot="header">
68
- {#if addButton && captureType !== 'all'}
69
- <Button
70
- size="xs2"
71
- color="light"
72
- variant="contained"
73
- iconOnly
74
- startIcon={{ icon: Plus }}
75
- on:click={() => {
76
- if (captureType !== 'all') {
77
- dispatch('openTriggers', {
78
- kind: captureTriggerKindToTriggerKind(captureType),
79
- config: {}
80
- })
81
- }
82
- }}
83
- />
84
- {/if}
85
- </svelte:fragment>
86
- <svelte:fragment slot="action">
87
- {#if canHavePreprocessor}
88
- <div>
89
- <ToggleButtonGroup bind:selected={testKind} class="h-full">
90
- <ToggleButton value="main" label={isFlow ? 'Flow' : 'Main'} small />
91
- <ToggleButton
92
- value="preprocessor"
93
- label="Preprocessor"
94
- small
95
- tooltip="When the runnable has a preprocessor, it receives additional information about the request"
96
- />
97
- </ToggleButtonGroup>
98
- </div>
99
- {/if}
100
- </svelte:fragment>
101
- <div class="flex flex-col gap-1 pt-2 grow overflow-y-auto">
102
- {#if captures.length === 0}
103
- <div class="text-xs text-secondary">
104
- {captureType === 'all' ? 'No captures yet' : `No ${captureType} captures yet`}
105
- </div>
106
- {:else}
107
- {#each captures as capture}
108
- {@const payload = isObject(capture.payload) ? capture.payload : {}}
109
- {@const triggerExtra = isObject(capture.trigger_extra) ? capture.trigger_extra : {}}
110
- {@const payloadData =
111
- testKind === 'preprocessor'
112
- ? {
113
- ...payload,
114
- ...triggerExtra
115
- }
116
- : payload}
117
- {@const schema =
118
- isFlow && testKind === 'main'
119
- ? { required: [], properties: {}, ...convert(payloadData) }
120
- : {}}
121
- <div class="flex flex-row gap-1" transition:slide>
122
- <div class="text-xs border p-2 rounded-md overflow-auto grow whitespace-nowrap">
123
- {JSON.stringify(payloadData)}
124
- </div>
125
- <Button
126
- size="xs2"
127
- color="light"
128
- variant="border"
129
- on:click={() => {
130
- copyToClipboard(JSON.stringify(payloadData))
131
- }}
132
- iconOnly
133
- startIcon={{ icon: Clipboard }}
134
- />
116
+ <svelte:window on:keydown={handleKeydown} />
135
117
 
136
- {#if isFlow && testKind === 'main'}
137
- <CustomPopover>
138
- <Button
139
- size="xs"
140
- color="light"
141
- variant="border"
142
- on:click={() => {
143
- dispatch('updateSchema', { schema, redirect: true })
144
- }}
145
- wrapperClasses="h-full"
146
- >
147
- Apply schema
148
- </Button>
118
+ <Label label="Trigger captures" {headless} class="h-full flex flex-col gap-1">
119
+ <svelte:fragment slot="header">
120
+ {#if addButton}
121
+ <div class="inline-block">
122
+ <CaptureButton small={true} on:openTriggers />
123
+ </div>
124
+ {/if}
125
+ </svelte:fragment>
126
+ <svelte:fragment slot="action">
127
+ {#if canHavePreprocessor && !isEmpty}
128
+ <div>
129
+ <ToggleButtonGroup
130
+ bind:selected={testKind}
131
+ class="h-full"
132
+ on:selected={(e) => {
133
+ initLoadCaptures(e.detail)
134
+ }}
135
+ >
136
+ <ToggleButton value="main" label={isFlow ? 'Flow' : 'Main'} small />
137
+ <ToggleButton
138
+ value="preprocessor"
139
+ label="Preprocessor"
140
+ small
141
+ tooltip="When the runnable has a preprocessor, it receives additional information about the request"
142
+ />
143
+ </ToggleButtonGroup>
144
+ </div>
145
+ {/if}
146
+ </svelte:fragment>
149
147
 
150
- <svelte:fragment slot="overlay">
151
- {#if schema}
152
- <div class="min-w-[400px]">
153
- <SchemaViewer {schema} />
154
- </div>
155
- {/if}
156
- </svelte:fragment>
157
- </CustomPopover>
158
- {/if}
148
+ <div
149
+ class={fullHeight ? 'h-full' : capturesLength > 7 ? 'h-[300px]' : 'h-fit'}
150
+ use:clickOutside={{ capture: false, exclude: getPropPickerElements }}
151
+ on:click_outside={() => {
152
+ if (firstClick) {
153
+ firstClick = false
154
+ return
155
+ }
156
+ deselect()
157
+ }}
158
+ >
159
+ <InfiniteList
160
+ bind:this={infiniteList}
161
+ selectedItemId={selected}
162
+ bind:isEmpty
163
+ on:error={(e) => handleError(e.detail)}
164
+ on:select={(e) => handleSelect(e.detail)}
165
+ bind:length={capturesLength}
166
+ >
167
+ <svelte:fragment slot="columns">
168
+ <colgroup>
169
+ <col class="w-8" />
170
+ <col class="w-20" />
171
+ <col />
172
+ </colgroup>
173
+ </svelte:fragment>
174
+ <svelte:fragment let:item let:hover>
175
+ {@const captureIcon = captureKindToIcon[item.trigger_kind]}
176
+ <SchemaPickerRow
177
+ date={item.created_at}
178
+ payloadData={item.payloadData}
179
+ selected={selected === item.id}
180
+ hovering={hover}
181
+ >
182
+ <svelte:fragment slot="start">
183
+ <div class="center-center">
184
+ <svelte:component this={captureIcon} size={12} />
185
+ </div>
186
+ </svelte:fragment>
159
187
 
160
- {#if testKind === 'preprocessor' && !hasPreprocessor}
161
- <CustomPopover noPadding>
162
- <Button
163
- size="xs"
164
- color="dark"
165
- disabled
166
- endIcon={{
167
- icon: Info
168
- }}
169
- wrapperClasses="h-full"
170
- >
171
- Apply args
172
- </Button>
173
- <svelte:fragment slot="overlay">
174
- <div class="text-sm p-2 flex flex-col gap-1 items-start">
175
- <p>You need to add a preprocessor to use preprocessor captures as args</p>
188
+ <svelte:fragment slot="extra">
189
+ {#if canEdit}
190
+ <div class="flex flex-row items-center gap-2 px-2">
191
+ {#if testKind === 'preprocessor' && !hasPreprocessor}
192
+ <CustomPopover noPadding>
176
193
  <Button
177
- size="xs"
194
+ size="xs2"
178
195
  color="dark"
179
- on:click={() => {
180
- dispatch('addPreprocessor')
196
+ disabled
197
+ endIcon={{
198
+ icon: Info
181
199
  }}
200
+ wrapperClasses="h-full"
182
201
  >
183
- Add preprocessor
202
+ Apply args
184
203
  </Button>
185
- </div>
186
- </svelte:fragment>
187
- </CustomPopover>
188
- {:else}
189
- <Button
190
- size="xs"
191
- color="dark"
192
- on:click={() => {
193
- if (isFlow && testKind === 'main') {
194
- dispatch('updateSchema', { schema, redirect: false })
195
- }
196
- dispatch('applyArgs', {
197
- kind: testKind,
198
- args: payloadData
199
- })
200
- }}
201
- disabled={testKind === 'preprocessor' && !hasPreprocessor}
202
- >
203
- {isFlow && testKind === 'main' ? 'Apply schema and args' : 'Apply args'}
204
- </Button>
205
- {/if}
206
-
207
- {#if canEdit}
208
- <Button
209
- size="xs2"
210
- color="red"
211
- iconOnly
212
- startIcon={{ icon: Trash2 }}
213
- loading={deleteLoading === capture.id}
214
- on:click={() => {
215
- deleteCapture(capture.id)
216
- }}
217
- />
204
+ <svelte:fragment slot="overlay">
205
+ <div class="text-sm p-2 flex flex-col gap-1 items-start">
206
+ <p> You need to add a preprocessor to use preprocessor captures as args </p>
207
+ <Button
208
+ size="xs2"
209
+ color="dark"
210
+ on:click={() => {
211
+ dispatch('addPreprocessor')
212
+ }}
213
+ >
214
+ Add preprocessor
215
+ </Button>
216
+ </div>
217
+ </svelte:fragment>
218
+ </CustomPopover>
219
+ {:else}
220
+ <Button
221
+ size="xs2"
222
+ color={hover || selected === item.id ? 'dark' : 'light'}
223
+ dropdownItems={[
224
+ {
225
+ label: 'Use as input schema',
226
+ onClick: () => {
227
+ dispatch('updateSchema', {
228
+ payloadData: item.payloadData,
229
+ redirect: true,
230
+ args: true
231
+ })
232
+ },
233
+ disabled: !isFlow || testKind !== 'main'
234
+ }
235
+ ].filter((item) => !item.disabled)}
236
+ on:click={() => {
237
+ if (isFlow && testKind === 'main') {
238
+ dispatch('testWithArgs', item.payloadData)
239
+ } else {
240
+ dispatch('applyArgs', {
241
+ kind: testKind,
242
+ args: item.payloadData
243
+ })
244
+ }
245
+ }}
246
+ disabled={testKind === 'preprocessor' && !hasPreprocessor}
247
+ title={isFlow && testKind === 'main'
248
+ ? 'Test flow with args'
249
+ : 'Apply args to preprocessor'}
250
+ startIcon={isFlow && testKind === 'main' ? { icon: Play } : {}}
251
+ >
252
+ {isFlow && testKind === 'main' ? 'Test' : 'Apply args'}
253
+ </Button>
254
+ {/if}
255
+ <Button
256
+ size="xs2"
257
+ color="light"
258
+ variant="contained"
259
+ iconOnly
260
+ startIcon={{ icon: Trash2 }}
261
+ loading={item.isDeleting}
262
+ on:click={() => {
263
+ infiniteList?.deleteItem(item.id)
264
+ }}
265
+ btnClasses="hover:text-white hover:bg-red-500 text-red-500"
266
+ />
267
+ </div>
218
268
  {/if}
219
- </div>
220
- {/each}
221
- {/if}
222
- </div>
223
- </Label>
224
- {/if}
269
+ </svelte:fragment>
270
+ </SchemaPickerRow>
271
+ </svelte:fragment>
272
+ <svelte:fragment slot="empty">
273
+ <div class="text-center text-xs text-tertiary">No captures yet</div>
274
+ </svelte:fragment>
275
+ </InfiniteList>
276
+ </div>
277
+ </Label>