windmill-components 1.405.0 → 1.406.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/package/assets/app.css +20 -0
  2. package/package/components/AppConnectLightweightResourcePicker.svelte +66 -0
  3. package/package/components/AppConnectLightweightResourcePicker.svelte.d.ts +21 -0
  4. package/package/components/ArgInput.svelte +6 -2
  5. package/package/components/ArgInput.svelte.d.ts +1 -0
  6. package/package/components/CustomPopover.svelte +1 -1
  7. package/package/components/DisplayResult.svelte +1 -1
  8. package/package/components/FlowBuilder.svelte +2 -0
  9. package/package/components/FlowBuilder.svelte.d.ts +1 -0
  10. package/package/components/FlowInputViewer.svelte +25 -0
  11. package/package/components/FlowInputViewer.svelte.d.ts +19 -0
  12. package/package/components/FlowJobResult.svelte +8 -1
  13. package/package/components/FlowJobResult.svelte.d.ts +1 -0
  14. package/package/components/FlowMetadata.svelte +2 -2
  15. package/package/components/FlowPreviewContent.svelte +2 -1
  16. package/package/components/FlowStatusViewer.svelte +3 -1
  17. package/package/components/FlowStatusViewer.svelte.d.ts +1 -0
  18. package/package/components/FlowStatusViewerInner.svelte +4 -1
  19. package/package/components/FlowViewer.svelte +2 -21
  20. package/package/components/LightweightResourcePicker.svelte +34 -30
  21. package/package/components/LogViewer.svelte +4 -3
  22. package/package/components/LogViewer.svelte.d.ts +1 -0
  23. package/package/components/ManualPopover.svelte +1 -1
  24. package/package/components/ObjectResourceInput.svelte +5 -2
  25. package/package/components/ObjectResourceInput.svelte.d.ts +2 -0
  26. package/package/components/Popover.svelte +1 -1
  27. package/package/components/Portal.svelte +7 -8
  28. package/package/components/Portal.svelte.d.ts +3 -7
  29. package/package/components/QueueMetricsDrawer.svelte +368 -3
  30. package/package/components/QueueMetricsDrawer.svelte.d.ts +2 -0
  31. package/package/components/ResourceEditor.svelte +4 -5
  32. package/package/components/ResourcePicker.svelte +14 -9
  33. package/package/components/ResourcePicker.svelte.d.ts +1 -0
  34. package/package/components/RunForm.svelte +1 -1
  35. package/package/components/SavedInputs.svelte +2 -2
  36. package/package/components/ScriptVersionHistory.svelte +54 -59
  37. package/package/components/TestConnection.svelte +1 -0
  38. package/package/components/TimeAgo.svelte +5 -6
  39. package/package/components/TimeAgo.svelte.d.ts +1 -1
  40. package/package/components/apps/components/buttons/AppButton.svelte +1 -1
  41. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +1 -1
  42. package/package/components/apps/components/inputs/AppMultiSelect.svelte +1 -1
  43. package/package/components/apps/components/inputs/AppMultiSelectV2.svelte +1 -1
  44. package/package/components/apps/components/layout/AppDrawer.svelte +1 -1
  45. package/package/components/apps/components/layout/AppModal.svelte +1 -1
  46. package/package/components/apps/editor/AppEditor.svelte +11 -3
  47. package/package/components/apps/editor/GridEditor.svelte +57 -4
  48. package/package/components/apps/editor/GridEditor.svelte.d.ts +8 -0
  49. package/package/components/apps/editor/GridEditorMenu.svelte +1 -1
  50. package/package/components/apps/editor/SubGridEditor.svelte +82 -3
  51. package/package/components/apps/editor/SubGridEditor.svelte.d.ts +16 -0
  52. package/package/components/apps/editor/appUtils.d.ts +19 -2
  53. package/package/components/apps/editor/appUtils.js +103 -7
  54. package/package/components/apps/editor/component/Component.svelte +36 -8
  55. package/package/components/apps/editor/component/Component.svelte.d.ts +3 -1
  56. package/package/components/apps/editor/contextPanel/components/OutputHeader.svelte +1 -1
  57. package/package/components/apps/svelte-grid/Grid.svelte +235 -12
  58. package/package/components/apps/svelte-grid/Grid.svelte.d.ts +7 -7
  59. package/package/components/apps/svelte-grid/MoveResize.svelte +104 -11
  60. package/package/components/apps/svelte-grid/MoveResize.svelte.d.ts +7 -0
  61. package/package/components/apps/svelte-grid/utils/item.d.ts +4 -1
  62. package/package/components/apps/svelte-grid/utils/item.js +2 -3
  63. package/package/components/apps/svelte-select/lib/ConditionalPortal.svelte +1 -1
  64. package/package/components/apps/svelte-select/lib/ConditionalPortalGlobal.svelte +1 -1
  65. package/package/components/common/button/ButtonDropdown.svelte +1 -1
  66. package/package/components/common/drawer/ConditionalPortal.svelte +1 -1
  67. package/package/components/common/menu/MenuV2.svelte +1 -1
  68. package/package/components/common/modal/AlwaysMountedModal.svelte +1 -1
  69. package/package/components/common/popup/PopupV2.svelte +1 -1
  70. package/package/components/copilot/StepGenQuick.svelte +3 -2
  71. package/package/components/copilot/StepGenQuick.svelte.d.ts +1 -0
  72. package/package/components/custom_ui.d.ts +1 -0
  73. package/package/components/details/Menu.svelte +1 -1
  74. package/package/components/flows/CreateActionsApp.svelte +1 -1
  75. package/package/components/flows/FlowEditor.svelte +2 -1
  76. package/package/components/flows/FlowEditor.svelte.d.ts +1 -0
  77. package/package/components/flows/FlowHistory.svelte +10 -195
  78. package/package/components/flows/FlowHistory.svelte.d.ts +0 -1
  79. package/package/components/flows/FlowHistoryInner.svelte +200 -0
  80. package/package/components/flows/FlowHistoryInner.svelte.d.ts +19 -0
  81. package/package/components/flows/content/FlowEditorPanel.svelte +2 -1
  82. package/package/components/flows/content/FlowEditorPanel.svelte.d.ts +1 -0
  83. package/package/components/flows/content/FlowInput.svelte +66 -58
  84. package/package/components/flows/content/FlowInput.svelte.d.ts +1 -0
  85. package/package/components/flows/content/FlowModuleScript.svelte +1 -1
  86. package/package/components/flows/header/FlowYamlEditor.svelte +6 -2
  87. package/package/components/flows/map/FlowModuleSchemaMap.svelte +3 -2
  88. package/package/components/flows/map/InsertModuleButton.svelte +1 -1
  89. package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte +1 -1
  90. package/package/components/graph/model.d.ts +1 -0
  91. package/package/components/icons/WindmillIcon.svelte +119 -105
  92. package/package/components/icons/store.d.ts +4 -0
  93. package/package/components/icons/store.js +1 -0
  94. package/package/components/multiselect/MultiSelectWrapper.svelte +1 -1
  95. package/package/components/propertyPicker/ObjectViewer.svelte +1 -1
  96. package/package/components/runs/RunRow.svelte +3 -7
  97. package/package/components/schema/FlowPropertyEditor.svelte +1 -0
  98. package/package/components/search/GlobalSearchModal.svelte +1 -1
  99. package/package/script_helpers.d.ts +37 -38
  100. package/package/script_helpers.js +100 -38
  101. package/package.json +23 -1
  102. package/package/init_scripts/python_failure_module.d.ts +0 -2
  103. package/package/init_scripts/python_failure_module.js +0 -8
  104. package/package/init_scripts/python_init_code.d.ts +0 -2
  105. package/package/init_scripts/python_init_code.js +0 -40
  106. package/package/init_scripts/python_init_code_clear.d.ts +0 -2
  107. package/package/init_scripts/python_init_code_clear.js +0 -5
  108. package/package/init_scripts/python_init_code_trigger.d.ts +0 -2
  109. package/package/init_scripts/python_init_code_trigger.js +0 -14
@@ -1,4 +1,5 @@
1
1
  import { SvelteComponent } from "svelte";
2
+ import { type GridShadow } from '../editor/appUtils';
2
3
  declare const __propDef: {
3
4
  props: {
4
5
  sensor: any;
@@ -23,6 +24,9 @@ declare const __propDef: {
23
24
  h: number;
24
25
  } | undefined;
25
26
  overlapped?: string | undefined;
27
+ moveMode?: "move" | "insert" | undefined;
28
+ type?: string | undefined;
29
+ fakeShadow?: GridShadow | undefined;
26
30
  inActivate?: (() => void) | undefined;
27
31
  initmove?: (() => void) | undefined;
28
32
  updateMove?: ((newCoordDiff: any, clientY: any) => void) | undefined;
@@ -31,6 +35,9 @@ declare const __propDef: {
31
35
  initmove: CustomEvent<any>;
32
36
  move: CustomEvent<any>;
33
37
  repaint: CustomEvent<any>;
38
+ dropped: CustomEvent<any>;
39
+ resizeStart: CustomEvent<any>;
40
+ resizeEnd: CustomEvent<any>;
34
41
  } & {
35
42
  [evt: string]: CustomEvent<any>;
36
43
  };
@@ -7,7 +7,10 @@ export declare function findFreeSpaceForItem<T>(matrix: FilledItem<T>[][], item:
7
7
  };
8
8
  export declare function moveItem(active: any, items: any, cols: any): {
9
9
  items: any;
10
- overlap: boolean;
10
+ overlap?: undefined;
11
+ } | {
12
+ items: any;
13
+ overlap: undefined;
11
14
  };
12
15
  export declare function normalize(items: any, col: any): any;
13
16
  export declare function adjust<T>(items: FilledItem<T>[], col: any): FilledItem<T>[];
@@ -107,8 +107,7 @@ export function moveItem(active, items, cols) {
107
107
  // If found fixed, reset the active to its original position
108
108
  if (fixed) {
109
109
  return {
110
- items: items,
111
- overlap: closeBlocks.length > 0
110
+ items: items
112
111
  };
113
112
  }
114
113
  // Update items
@@ -136,7 +135,7 @@ export function moveItem(active, items, cols) {
136
135
  // Return result
137
136
  return {
138
137
  items: tempItems,
139
- overlap: false
138
+ overlap: undefined
140
139
  };
141
140
  }
142
141
  // Helper function
@@ -6,7 +6,7 @@ $: target = $mode === 'preview' ? '#app-editor-select' : 'body';
6
6
  </script>
7
7
 
8
8
  {#if condition}
9
- <Portal {target}><slot /></Portal>
9
+ <Portal name="conditional-portal-select" {target}><slot /></Portal>
10
10
  {:else}
11
11
  <slot />
12
12
  {/if}
@@ -3,7 +3,7 @@ export let condition = false;
3
3
  </script>
4
4
 
5
5
  {#if condition}
6
- <Portal><slot /></Portal>
6
+ <Portal name="conditional-portal-global"><slot /></Portal>
7
7
  {:else}
8
8
  <slot />
9
9
  {/if}
@@ -37,7 +37,7 @@ const popperOptions = {
37
37
  </MenuButton>
38
38
  </span>
39
39
 
40
- <Portal {target}>
40
+ <Portal name="button-dropdown" {target}>
41
41
  <div use:popperContent={popperOptions} class="z-[6000]">
42
42
  <Transition
43
43
  show={open}
@@ -4,7 +4,7 @@ export let target = undefined;
4
4
  </script>
5
5
 
6
6
  {#if condition}
7
- <Portal {target}><slot /></Portal>
7
+ <Portal name="conditional-portal" {target}><slot /></Portal>
8
8
  {:else}
9
9
  <slot />
10
10
  {/if}
@@ -22,7 +22,7 @@ const [floatingRef, floatingContent] = createFloatingActions({
22
22
  <slot name="trigger" />
23
23
  </MenuButton>
24
24
  </div>
25
- <Portal>
25
+ <Portal name="menu-v2">
26
26
  <div use:floatingContent class="z-[6000]">
27
27
  <Transition
28
28
  {open}
@@ -16,7 +16,7 @@ export function open() {
16
16
  }
17
17
  </script>
18
18
 
19
- <Portal target="#app-editor-top-level-drawer">
19
+ <Portal name="always-mounted" target="#app-editor-top-level-drawer">
20
20
  <div
21
21
  class={twMerge(
22
22
  `${
@@ -35,7 +35,7 @@ function pointerdown() {
35
35
  <slot {pointerup} {pointerdown} name="button" />
36
36
  </div>
37
37
 
38
- <Portal {target}>
38
+ <Portal name="popup-v2" {target}>
39
39
  {#if open}
40
40
  <div
41
41
  class="border rounded-lg shadow-lg bg-surface z5000"
@@ -8,6 +8,7 @@ export let funcDesc;
8
8
  export let trigger = false;
9
9
  export let loading = false;
10
10
  export let preFilter;
11
+ export let disableAi = false;
11
12
  let scripts = undefined;
12
13
  export let filteredItems = [];
13
14
  $: prefilteredItems = scripts ?? [];
@@ -43,14 +44,14 @@ onMount(() => {
43
44
  bind:this={input}
44
45
  type="text"
45
46
  bind:value={funcDesc}
46
- placeholder="Search {trigger ? 'triggers' : 'scripts'} or AI gen"
47
+ placeholder="Search {trigger ? 'triggers' : 'scripts'} {disableAi ? '' : 'or AI gen'}"
47
48
  />
48
49
  </div>
49
50
  <div class="absolute inset-y-0 right-3 flex items-center pointer-events-none">
50
51
  {#if loading}
51
52
  <Loader2 size={16} class="animate-spin text-gray-400" />
52
53
  {/if}
53
- {#if funcDesc?.length === 0 && !loading}
54
+ {#if funcDesc?.length === 0 && !loading && !disableAi}
54
55
  <Wand2 size={14} class="fill-current opacity-70 text-violet-800 dark:text-violet-400" />
55
56
  {/if}
56
57
  </div>
@@ -6,6 +6,7 @@ declare const __propDef: {
6
6
  trigger?: boolean | undefined;
7
7
  loading?: boolean | undefined;
8
8
  preFilter: string;
9
+ disableAi?: boolean | undefined;
9
10
  filteredItems?: any[] | (Script & {
10
11
  marked?: string | undefined;
11
12
  })[] | undefined;
@@ -34,6 +34,7 @@ export type FlowBuilderWhitelabelCustomUi = {
34
34
  languages?: (SupportedLanguage | 'docker' | 'bunnative')[];
35
35
  scriptFork?: boolean;
36
36
  editorBar?: EditorBarUi;
37
+ downloadLogs?: boolean;
37
38
  };
38
39
  export type EditorBarUi = {
39
40
  contextVar?: boolean;
@@ -34,7 +34,7 @@ const popperOptions = {
34
34
  </MenuButton>
35
35
  </span>
36
36
 
37
- <Portal>
37
+ <Portal name="menu">
38
38
  <div use:popperContent={popperOptions} class="z-[2000]">
39
39
  <Transition
40
40
  show={open}
@@ -66,7 +66,7 @@ async function importRawApp() {
66
66
  }
67
67
  ]}
68
68
  >
69
- <div class="flex flex-row">
69
+ <div class="flex flex-row items-center">
70
70
  App <LayoutDashboard class="ml-1.5" size={18} />
71
71
  </div>
72
72
  </Button>
@@ -11,6 +11,7 @@ export let disableStaticInputs = false;
11
11
  export let disableTutorials = false;
12
12
  export let disableAi = false;
13
13
  export let disableSettings = false;
14
+ export let disabledFlowInputs = false;
14
15
  export let smallErrorHandler = false;
15
16
  let size = 50;
16
17
  const { currentStepStore: copilotCurrentStepStore } = getContext('FlowCopilotContext');
@@ -53,7 +54,7 @@ const { currentStepStore: copilotCurrentStepStore } = getContext('FlowCopilotCon
53
54
  </div>
54
55
  </div>
55
56
  {:else}
56
- <FlowEditorPanel enableAi={!disableAi} />
57
+ <FlowEditorPanel {disabledFlowInputs} enableAi={!disableAi} />
57
58
  {/if}
58
59
  </Pane>
59
60
  </Splitpanes>
@@ -6,6 +6,7 @@ declare const __propDef: {
6
6
  disableTutorials?: boolean | undefined;
7
7
  disableAi?: boolean | undefined;
8
8
  disableSettings?: boolean | undefined;
9
+ disabledFlowInputs?: boolean | undefined;
9
10
  smallErrorHandler?: boolean | undefined;
10
11
  };
11
12
  events: {
@@ -1,76 +1,13 @@
1
- <script>import { Pane, Splitpanes } from 'svelte-splitpanes';
2
- import PanelSection from '../apps/editor/settingsPanel/common/PanelSection.svelte';
3
- import { classNames, displayDate, emptyString, sendUserToast } from '../../utils';
4
- import { FlowService } from '../../gen';
5
- import { workspaceStore } from '../../stores';
6
- import { Skeleton } from '../common';
1
+ <script>import { createEventDispatcher } from 'svelte';
7
2
  import Drawer from '../common/drawer/Drawer.svelte';
8
3
  import DrawerContent from '../common/drawer/DrawerContent.svelte';
9
- import Button from '../common/button/Button.svelte';
10
- import { ArrowRight, Loader2, Pencil, X } from 'lucide-svelte';
11
- import { createEventDispatcher } from 'svelte';
4
+ import FlowHistoryInner from './FlowHistoryInner.svelte';
12
5
  export let path;
13
6
  let drawer;
14
- let loading = false;
15
- let versions = [];
16
- let selectedVersion = undefined;
17
- let selected = undefined;
18
- let deploymentMsgUpdateMode = false;
19
- let deploymentMsgUpdate = undefined;
20
7
  export function open() {
21
- loadVersions();
22
8
  drawer.openDrawer();
23
9
  }
24
- async function loadFlow(version) {
25
- selected = await FlowService.getFlowVersion({
26
- workspace: $workspaceStore,
27
- version,
28
- path
29
- });
30
- }
31
- async function loadVersions() {
32
- loading = true;
33
- versions = await FlowService.getFlowHistory({
34
- workspace: $workspaceStore,
35
- path: path
36
- });
37
- loading = false;
38
- }
39
- async function updateDeploymentMsg(version) {
40
- if (selectedVersion === undefined ||
41
- version === undefined ||
42
- emptyString(deploymentMsgUpdate)) {
43
- return;
44
- }
45
- await FlowService.updateFlowHistory({
46
- workspace: $workspaceStore,
47
- version,
48
- path,
49
- requestBody: {
50
- deployment_msg: deploymentMsgUpdate
51
- }
52
- });
53
- selectedVersion.deployment_msg = deploymentMsgUpdate;
54
- deploymentMsgUpdateMode = false;
55
- loadVersions();
56
- }
57
10
  const dispatch = createEventDispatcher();
58
- async function restoreVersion(flow) {
59
- if (!flow)
60
- return;
61
- await FlowService.updateFlow({
62
- workspace: $workspaceStore,
63
- requestBody: {
64
- ...flow,
65
- path
66
- },
67
- path
68
- });
69
- dispatch('historyRestore');
70
- drawer?.closeDrawer();
71
- sendUserToast('Flow restored from previous deployment');
72
- }
73
- $: selectedVersion !== undefined && loadFlow(selectedVersion.id);
74
11
  </script>
75
12
 
76
13
  <Drawer bind:this={drawer} size="1200px">
@@ -79,136 +16,14 @@ $: selectedVersion !== undefined && loadFlow(selectedVersion.id);
79
16
  drawer?.closeDrawer()
80
17
  }}
81
18
  noPadding
19
+ title="Deployment History"
82
20
  >
83
- <Splitpanes class="!overflow-visible">
84
- <Pane size={20}>
85
- <PanelSection title="Past Deployments">
86
- <div class="flex flex-col gap-2 w-full">
87
- {#if !loading}
88
- {#if versions.length > 0}
89
- <div class="flex gap-2 flex-col">
90
- {#each versions ?? [] as version}
91
- <!-- svelte-ignore a11y-click-events-have-key-events -->
92
- <div
93
- class={classNames(
94
- 'border flex gap-1 truncate justify-between flex-row w-full items-center p-2 rounded-md cursor-pointer hover:bg-blue-50 hover:text-blue-400',
95
- selectedVersion?.id == version.id ? 'bg-blue-100 text-blue-600' : ''
96
- )}
97
- role="button"
98
- tabindex="0"
99
- on:click={() => {
100
- selectedVersion = version
101
- }}
102
- >
103
- <span class="text-xs truncate">
104
- {#if emptyString(version.deployment_msg)}Version {version.id}{:else}{version.deployment_msg}{/if}
105
- </span>
106
- </div>
107
- {/each}
108
- </div>
109
- {:else}
110
- <div class="text-sm text-tertiary">No items</div>
111
- {/if}
112
- {:else}
113
- <Skeleton layout={[[40], [40], [40], [40], [40]]} />
114
- {/if}
115
- </div>
116
- </PanelSection>
117
- </Pane>
118
- <Pane size={80}>
119
- <div class="h-full w-full overflow-auto">
120
- {#if selectedVersion}
121
- {#if selected}
122
- <div class="px-2 flex flex-col gap-2">
123
- <span class="flex flex-row text-sm p-1 text-tertiary">
124
- {#if deploymentMsgUpdateMode}
125
- <div class="flex w-full">
126
- <input
127
- type="text"
128
- bind:value={deploymentMsgUpdate}
129
- class="!w-auto grow"
130
- on:click|stopPropagation={() => {}}
131
- on:keydown|stopPropagation
132
- on:keypress|stopPropagation={({ key }) => {
133
- if (key === 'Enter') updateDeploymentMsg(selectedVersion?.id)
134
- }}
135
- />
136
- <Button
137
- size="xs"
138
- color="blue"
139
- buttonType="button"
140
- btnClasses="!p-1 !w-[34px] !ml-1"
141
- aria-label="Save Deployment Message"
142
- on:click={() => {
143
- updateDeploymentMsg(selectedVersion?.id)
144
- }}
145
- >
146
- <ArrowRight size={14} />
147
- </Button>
148
- <Button
149
- size="xs"
150
- color="light"
151
- buttonType="button"
152
- btnClasses="!p-1 !w-[34px] !ml-1"
153
- aria-label="Abort"
154
- on:click={() => {
155
- deploymentMsgUpdateMode = false
156
- deploymentMsgUpdate = undefined
157
- }}
158
- >
159
- <X size={14} />
160
- </Button>
161
- </div>
162
- {:else}
163
- {#if selectedVersion.deployment_msg}
164
- {selectedVersion.deployment_msg}
165
- {:else}
166
- Deployed {displayDate(selected.edited_at)} by {selected.edited_by}
167
- {/if}
168
- <button
169
- on:click={() => {
170
- deploymentMsgUpdate = selectedVersion?.deployment_msg
171
- deploymentMsgUpdateMode = true
172
- }}
173
- title="Update commit message"
174
- class="flex items-center px-1 rounded-sm hover:text-primary text-secondary h-5"
175
- aria-label="Update commit message"
176
- >
177
- <Pencil size={14} />
178
- </button>
179
- {/if}
180
- </span>
181
- <div class="flex p-1 gap-2">
182
- <Button
183
- size="xs"
184
- on:click={() =>
185
- window.open(
186
- `/flows/add?template_id=${selectedVersion?.id}&template=${path}`,
187
- '_blank'
188
- )}
189
- >
190
- Restore as fork
191
- </Button>
192
- <Button size="xs" on:click={() => restoreVersion(selected)}
193
- >Redeploy with that version
194
- </Button>
195
- </div>
196
- {#await import('../FlowViewer.svelte')}
197
- <Loader2 class="animate-spin" />
198
- {:then Module}
199
- <Module.default flow={selected} />
200
- {/await}
201
- </div>
202
- {:else}
203
- <Skeleton layout={[[40]]} />
204
- {/if}
205
- {:else}
206
- <div class="text-sm p-2 text-tertiary"
207
- >Select a deployment version to see its details</div
208
- >
209
- {/if}
210
- </div>
211
- </Pane>
212
- </Splitpanes>
21
+ <FlowHistoryInner
22
+ on:historyRestore={() => {
23
+ drawer.closeDrawer()
24
+ dispatch('historyRestore')
25
+ }}
26
+ {path}
27
+ />
213
28
  </DrawerContent>
214
29
  </Drawer>
@@ -5,7 +5,6 @@ declare const __propDef: {
5
5
  open?: (() => void) | undefined;
6
6
  };
7
7
  events: {
8
- keydown: KeyboardEvent;
9
8
  historyRestore: CustomEvent<any>;
10
9
  } & {
11
10
  [evt: string]: CustomEvent<any>;
@@ -0,0 +1,200 @@
1
+ <script>import { Pane, Splitpanes } from 'svelte-splitpanes';
2
+ import { classNames, displayDate, emptyString, sendUserToast } from '../../utils';
3
+ import { FlowService } from '../../gen';
4
+ import { workspaceStore } from '../../stores';
5
+ import { Skeleton } from '../common';
6
+ import Button from '../common/button/Button.svelte';
7
+ import { ArrowRight, Loader2, Pencil, X } from 'lucide-svelte';
8
+ import { createEventDispatcher } from 'svelte';
9
+ export let path;
10
+ let loading = false;
11
+ let versions = [];
12
+ let selectedVersion = undefined;
13
+ let selected = undefined;
14
+ let deploymentMsgUpdateMode = false;
15
+ let deploymentMsgUpdate = undefined;
16
+ async function loadFlow(version) {
17
+ selected = await FlowService.getFlowVersion({
18
+ workspace: $workspaceStore,
19
+ version,
20
+ path
21
+ });
22
+ }
23
+ async function loadVersions() {
24
+ loading = true;
25
+ versions = await FlowService.getFlowHistory({
26
+ workspace: $workspaceStore,
27
+ path: path
28
+ });
29
+ loading = false;
30
+ }
31
+ async function updateDeploymentMsg(version) {
32
+ if (selectedVersion === undefined ||
33
+ version === undefined ||
34
+ emptyString(deploymentMsgUpdate)) {
35
+ return;
36
+ }
37
+ await FlowService.updateFlowHistory({
38
+ workspace: $workspaceStore,
39
+ version,
40
+ path,
41
+ requestBody: {
42
+ deployment_msg: deploymentMsgUpdate
43
+ }
44
+ });
45
+ selectedVersion.deployment_msg = deploymentMsgUpdate;
46
+ deploymentMsgUpdateMode = false;
47
+ loadVersions();
48
+ }
49
+ const dispatch = createEventDispatcher();
50
+ async function restoreVersion(flow) {
51
+ if (!flow)
52
+ return;
53
+ await FlowService.updateFlow({
54
+ workspace: $workspaceStore,
55
+ requestBody: {
56
+ ...flow,
57
+ path
58
+ },
59
+ path
60
+ });
61
+ dispatch('historyRestore');
62
+ sendUserToast('Flow restored from previous deployment');
63
+ }
64
+ loadVersions();
65
+ $: selectedVersion !== undefined && loadFlow(selectedVersion.id);
66
+ </script>
67
+
68
+ <Splitpanes class="!overflow-visible">
69
+ <Pane size={20}>
70
+ <div class="flex flex-col gap-2 w-full px-2 py-2">
71
+ {#if !loading}
72
+ {#if versions.length > 0}
73
+ <div class="flex gap-2 flex-col">
74
+ {#each versions ?? [] as version}
75
+ <!-- svelte-ignore a11y-click-events-have-key-events -->
76
+ <div
77
+ class={classNames(
78
+ 'border flex gap-1 truncate justify-between flex-row w-full items-center p-2 rounded-md cursor-pointer hover:bg-surface-hover hover:text-primary',
79
+ selectedVersion?.id == version.id ? 'bg-surface-selected text-primary' : ''
80
+ )}
81
+ role="button"
82
+ tabindex="0"
83
+ on:click={() => {
84
+ selectedVersion = version
85
+ }}
86
+ >
87
+ <span class="text-xs truncate">
88
+ {#if emptyString(version.deployment_msg)}Version {version.id}{:else}{version.deployment_msg}{/if}
89
+ </span>
90
+ </div>
91
+ {/each}
92
+ </div>
93
+ {:else}
94
+ <div class="text-sm text-tertiary">No items</div>
95
+ {/if}
96
+ {:else}
97
+ <Skeleton layout={[[40], [40], [40], [40], [40]]} />
98
+ {/if}
99
+ </div>
100
+ </Pane>
101
+ <Pane size={80}>
102
+ <div class="h-full w-full overflow-auto pt-2">
103
+ {#if selectedVersion}
104
+ {#if selected}
105
+ <div class="px-2 flex flex-col gap-2">
106
+ <div class="flex justify-between">
107
+ <span class="flex flex-row text-sm p-1 text-tertiary">
108
+ {#if deploymentMsgUpdateMode}
109
+ <div class="flex w-full">
110
+ <input
111
+ type="text"
112
+ bind:value={deploymentMsgUpdate}
113
+ class="!w-auto grow"
114
+ on:click|stopPropagation={() => {}}
115
+ on:keydown|stopPropagation
116
+ on:keypress|stopPropagation={({ key }) => {
117
+ if (key === 'Enter') updateDeploymentMsg(selectedVersion?.id)
118
+ }}
119
+ />
120
+ <Button
121
+ size="xs"
122
+ color="blue"
123
+ buttonType="button"
124
+ btnClasses="!p-1 !w-[34px] !ml-1"
125
+ aria-label="Save Deployment Message"
126
+ on:click={() => {
127
+ updateDeploymentMsg(selectedVersion?.id)
128
+ }}
129
+ >
130
+ <ArrowRight size={14} />
131
+ </Button>
132
+ <Button
133
+ size="xs"
134
+ color="light"
135
+ buttonType="button"
136
+ btnClasses="!p-1 !w-[34px] !ml-1"
137
+ aria-label="Abort"
138
+ on:click={() => {
139
+ deploymentMsgUpdateMode = false
140
+ deploymentMsgUpdate = undefined
141
+ }}
142
+ >
143
+ <X size={14} />
144
+ </Button>
145
+ </div>
146
+ {:else}
147
+ {#if selectedVersion.deployment_msg}
148
+ {selectedVersion.deployment_msg}
149
+ {:else}
150
+ Deployed {displayDate(selected.edited_at)} by {selected.edited_by}
151
+ {/if}
152
+ <button
153
+ on:click={() => {
154
+ deploymentMsgUpdate = selectedVersion?.deployment_msg
155
+ deploymentMsgUpdateMode = true
156
+ }}
157
+ title="Update commit message"
158
+ class="flex items-center px-1 rounded-sm hover:text-primary text-secondary h-5"
159
+ aria-label="Update commit message"
160
+ >
161
+ <Pencil size={14} />
162
+ </button>
163
+ {/if}
164
+ </span>
165
+ <div class="flex p-1 gap-2">
166
+ <div class="flex">
167
+ <Button
168
+ size="sm"
169
+ color="dark"
170
+ on:click={() =>
171
+ window.open(
172
+ `/flows/add?template_id=${selectedVersion?.id}&template=${path}`,
173
+ '_blank'
174
+ )}
175
+ >
176
+ Restore as fork
177
+ </Button>
178
+ </div>
179
+ <div class="flex">
180
+ <Button size="sm" color="dark" on:click={() => restoreVersion(selected)}
181
+ >Redeploy with that version
182
+ </Button>
183
+ </div>
184
+ </div>
185
+ </div>
186
+ {#await import('../FlowViewer.svelte')}
187
+ <Loader2 class="animate-spin" />
188
+ {:then Module}
189
+ <Module.default flow={selected} />
190
+ {/await}
191
+ </div>
192
+ {:else}
193
+ <Skeleton layout={[[40]]} />
194
+ {/if}
195
+ {:else}
196
+ <div class="text-sm p-2 text-tertiary">Select a deployment version to see its details</div>
197
+ {/if}
198
+ </div>
199
+ </Pane>
200
+ </Splitpanes>
@@ -0,0 +1,19 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ path: string;
5
+ };
6
+ events: {
7
+ keydown: KeyboardEvent;
8
+ historyRestore: CustomEvent<any>;
9
+ } & {
10
+ [evt: string]: CustomEvent<any>;
11
+ };
12
+ slots: {};
13
+ };
14
+ export type FlowHistoryInnerProps = typeof __propDef.props;
15
+ export type FlowHistoryInnerEvents = typeof __propDef.events;
16
+ export type FlowHistoryInnerSlots = typeof __propDef.slots;
17
+ export default class FlowHistoryInner extends SvelteComponent<FlowHistoryInnerProps, FlowHistoryInnerEvents, FlowHistoryInnerSlots> {
18
+ }
19
+ export {};