windmill-components 1.542.4 → 1.550.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 (189) hide show
  1. package/package/common.d.ts +4 -1
  2. package/package/components/AIAgentLogViewer.svelte +1 -1
  3. package/package/components/ArgEnum.svelte +14 -5
  4. package/package/components/ArgInput.svelte +23 -15
  5. package/package/components/ArgInput.svelte.d.ts +1 -1
  6. package/package/components/ChannelSelector.svelte +92 -18
  7. package/package/components/ChannelSelector.svelte.d.ts +2 -0
  8. package/package/components/ConnectionSection.svelte +12 -1
  9. package/package/components/Dev.svelte +18 -5
  10. package/package/components/Dev.svelte.d.ts +23 -1
  11. package/package/components/DisplayResult.svelte +36 -23
  12. package/package/components/DropdownV2.svelte +8 -2
  13. package/package/components/DropdownV2.svelte.d.ts +1 -0
  14. package/package/components/DynamicInput.svelte +10 -10
  15. package/package/components/EditableSchemaForm.svelte +21 -7
  16. package/package/components/EditorSettings.svelte +11 -9
  17. package/package/components/ErrorOrRecoveryHandler.svelte +14 -20
  18. package/package/components/FlowHistoryJobPicker.svelte +3 -0
  19. package/package/components/FlowHistoryJobPicker.svelte.d.ts +1 -0
  20. package/package/components/FlowJobResult.svelte +5 -5
  21. package/package/components/FlowLogRow.svelte +2 -2
  22. package/package/components/FlowLogViewer.svelte +228 -57
  23. package/package/components/FlowLogViewer.svelte.d.ts +16 -5
  24. package/package/components/FlowLogViewerWrapper.svelte +56 -3
  25. package/package/components/FlowLogViewerWrapper.svelte.d.ts +4 -3
  26. package/package/components/FlowLoopIterationPreview.svelte +4 -4
  27. package/package/components/FlowMetadata.svelte +3 -4
  28. package/package/components/FlowMetadata.svelte.d.ts +4 -18
  29. package/package/components/FlowPreviewContent.svelte +9 -3
  30. package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
  31. package/package/components/FlowStatusViewer.svelte +62 -59
  32. package/package/components/FlowStatusViewer.svelte.d.ts +2 -2
  33. package/package/components/FlowStatusViewerInner.svelte +186 -94
  34. package/package/components/FlowStatusViewerInner.svelte.d.ts +10 -3
  35. package/package/components/FlowTimeline.svelte +110 -131
  36. package/package/components/FlowTimeline.svelte.d.ts +13 -4
  37. package/package/components/FlowTimelineBar.svelte +227 -0
  38. package/package/components/FlowTimelineBar.svelte.d.ts +24 -0
  39. package/package/components/InputTransformForm.svelte +119 -3
  40. package/package/components/InputTransformForm.svelte.d.ts +3 -0
  41. package/package/components/InputTransformSchemaForm.svelte +5 -1
  42. package/package/components/InputTransformSchemaForm.svelte.d.ts +2 -0
  43. package/package/components/InstanceSetting.svelte +17 -42
  44. package/package/components/InstanceSettings.svelte +12 -21
  45. package/package/components/JobArgs.svelte +15 -16
  46. package/package/components/JobArgs.svelte.d.ts +4 -18
  47. package/package/components/JobLoader.svelte +23 -42
  48. package/package/components/JobLoader.svelte.d.ts +2 -0
  49. package/package/components/JobStatus.svelte +1 -1
  50. package/package/components/JobStatus.svelte.d.ts +4 -18
  51. package/package/components/ModulePreviewResultViewer.svelte +1 -7
  52. package/package/components/NextcloudSetting.svelte +6 -1
  53. package/package/components/Password.svelte +7 -11
  54. package/package/components/Password.svelte.d.ts +5 -20
  55. package/package/components/PasswordArgInput.svelte +35 -15
  56. package/package/components/PasswordArgInput.svelte.d.ts +4 -18
  57. package/package/components/QueuePosition.svelte +6 -2
  58. package/package/components/RunForm.svelte +5 -14
  59. package/package/components/S3ArrayHelperButton.svelte +12 -0
  60. package/package/components/S3ArrayHelperButton.svelte.d.ts +8 -0
  61. package/package/components/ScriptEditor.svelte +5 -6
  62. package/package/components/StringTypeNarrowing.svelte +39 -24
  63. package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
  64. package/package/components/TeamSelector.svelte +83 -37
  65. package/package/components/TeamSelector.svelte.d.ts +0 -1
  66. package/package/components/apps/components/buttons/AppButton.svelte +11 -1
  67. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +13 -4
  68. package/package/components/apps/components/display/table/SyncColumnDefs.svelte +2 -2
  69. package/package/components/apps/components/display/table/utils.js +1 -1
  70. package/package/components/apps/components/helpers/RefreshButton.svelte +5 -1
  71. package/package/components/apps/components/helpers/RunnableComponent.svelte +0 -2
  72. package/package/components/apps/components/helpers/RunnableWrapper.svelte.d.ts +1 -0
  73. package/package/components/apps/components/layout/AppTabs.svelte +116 -71
  74. package/package/components/apps/components/layout/AppTabs.svelte.d.ts +1 -0
  75. package/package/components/apps/editor/component/ComponentInner.svelte +1 -0
  76. package/package/components/apps/editor/component/components.d.ts +16 -1
  77. package/package/components/apps/editor/component/components.js +22 -2
  78. package/package/components/apps/editor/settingsPanel/ComponentPanel.svelte +2 -0
  79. package/package/components/apps/editor/settingsPanel/GridTab.svelte +19 -1
  80. package/package/components/apps/editor/settingsPanel/GridTab.svelte.d.ts +3 -1
  81. package/package/components/apps/editor/settingsPanel/GridTabHidden.svelte +52 -0
  82. package/package/components/apps/editor/settingsPanel/GridTabHidden.svelte.d.ts +9 -0
  83. package/package/components/auditLogs/AuditLogsFilters.svelte +6 -0
  84. package/package/components/auditLogs/AuditLogsTable.svelte +17 -7
  85. package/package/components/auditLogs/AuditLogsTable.svelte.d.ts +1 -0
  86. package/package/components/common/CloseButton.svelte +2 -2
  87. package/package/components/common/CloseButton.svelte.d.ts +1 -0
  88. package/package/components/common/layout/List.svelte +3 -7
  89. package/package/components/common/layout/List.svelte.d.ts +7 -29
  90. package/package/components/common/popup/PopupV2.svelte +8 -25
  91. package/package/components/common/popup/PopupV2.svelte.d.ts +4 -2
  92. package/package/components/common/table/ScriptRow.svelte +22 -2
  93. package/package/components/copilot/FlowCopilotInputsModal.svelte +26 -23
  94. package/package/components/copilot/chat/AIChatManager.svelte.js +3 -2
  95. package/package/components/copilot/chat/ProviderModelSelector.svelte +1 -1
  96. package/package/components/copilot/chat/flow/FlowAIChat.svelte +4 -2
  97. package/package/components/copilot/chat/script/core.d.ts +4 -4
  98. package/package/components/copilot/chat/script/core.js +93 -34
  99. package/package/components/copilot/lib.d.ts +1 -0
  100. package/package/components/copilot/lib.js +6 -3
  101. package/package/components/custom_ui.d.ts +2 -0
  102. package/package/components/flows/FlowProgressBar.svelte +16 -16
  103. package/package/components/flows/FlowProgressBar.svelte.d.ts +7 -22
  104. package/package/components/flows/content/FlowInputsQuick.svelte +3 -2
  105. package/package/components/flows/content/FlowInputsQuick.svelte.d.ts +1 -0
  106. package/package/components/flows/content/FlowModuleComponent.svelte +24 -1
  107. package/package/components/flows/flowInfers.js +34 -8
  108. package/package/components/flows/flowStore.d.ts +4 -1
  109. package/package/components/flows/map/FlowJobsMenu.svelte +3 -3
  110. package/package/components/flows/map/FlowJobsMenu.svelte.d.ts +1 -1
  111. package/package/components/flows/map/InsertModuleButton.svelte +4 -14
  112. package/package/components/flows/map/InsertModuleButton.svelte.d.ts +0 -1
  113. package/package/components/flows/map/InsertModuleInner.svelte +17 -20
  114. package/package/components/flows/map/MapItem.svelte +1 -1
  115. package/package/components/flows/pickers/PickHubScriptQuick.svelte +38 -52
  116. package/package/components/flows/pickers/PickHubScriptQuick.svelte.d.ts +1 -0
  117. package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte +27 -15
  118. package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte.d.ts +1 -0
  119. package/package/components/flows/propPicker/OutputPicker.svelte +2 -0
  120. package/package/components/git_sync/DetectionFlow.svelte +33 -44
  121. package/package/components/git_sync/DetectionFlow.svelte.d.ts +1 -0
  122. package/package/components/git_sync/GitSyncContext.svelte.d.ts +22 -0
  123. package/package/components/git_sync/GitSyncContext.svelte.js +145 -5
  124. package/package/components/git_sync/GitSyncModeDisplay.svelte +14 -0
  125. package/package/components/git_sync/GitSyncModeDisplay.svelte.d.ts +9 -0
  126. package/package/components/git_sync/GitSyncRepositoryCard.svelte +365 -253
  127. package/package/components/git_sync/GitSyncRepositoryCard.svelte.d.ts +10 -1
  128. package/package/components/git_sync/GitSyncSection.svelte +134 -14
  129. package/package/components/git_sync/PullWorkspaceModal.svelte +24 -32
  130. package/package/components/git_sync/PushWorkspaceModal.svelte +24 -32
  131. package/package/components/graph/model.d.ts +5 -5
  132. package/package/components/graph/renderers/edges/EmptyEdge.svelte +3 -10
  133. package/package/components/graph/renderers/edges/EmptyEdge.svelte.d.ts +4 -18
  134. package/package/components/graph/renderers/nodes/AIToolNode.svelte +2 -2
  135. package/package/components/graph/renderers/nodes/NewAIToolNode.svelte +5 -10
  136. package/package/components/home/ItemsList.svelte +1 -1
  137. package/package/components/jobs/JobProgressBar.svelte +27 -21
  138. package/package/components/jobs/JobProgressBar.svelte.d.ts +9 -24
  139. package/package/components/meltComponents/MenuSingleItem.svelte +3 -8
  140. package/package/components/meltComponents/MenuSingleItem.svelte.d.ts +0 -3
  141. package/package/components/meltComponents/Popover.svelte +3 -2
  142. package/package/components/meltComponents/Popover.svelte.d.ts +1 -0
  143. package/package/components/meltComponents/Tooltip.svelte +1 -1
  144. package/package/components/progressBar/ProgressBar.svelte +39 -53
  145. package/package/components/progressBar/ProgressBar.svelte.d.ts +11 -26
  146. package/package/components/runs/JobsLoader.svelte +1 -1
  147. package/package/components/runs/NoWorkerWithTagWarning.svelte +3 -3
  148. package/package/components/runs/NoWorkerWithTagWarning.svelte.d.ts +1 -1
  149. package/package/components/schema/AddPropertyV2.svelte +7 -4
  150. package/package/components/schema/PropertyEditor.svelte.d.ts +1 -1
  151. package/package/components/select/MultiSelect.svelte +2 -2
  152. package/package/components/select/MultiSelect.svelte.d.ts +1 -0
  153. package/package/components/settings/WorkspaceUserSettings.svelte +92 -1
  154. package/package/components/sidebar/MenuLink.svelte +2 -1
  155. package/package/components/sidebar/MenuLink.svelte.d.ts +1 -0
  156. package/package/components/sidebar/SidebarContent.svelte +27 -27
  157. package/package/components/table/Cell.svelte +7 -14
  158. package/package/components/table/Cell.svelte.d.ts +13 -35
  159. package/package/components/triggers/AddTriggersButton.svelte +1 -0
  160. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte +1 -1
  161. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte.d.ts +2 -1
  162. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +28 -5
  163. package/package/components/triggers/gcp/utils.js +1 -0
  164. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +1 -0
  165. package/package/components/triggers/webhook/WebhooksConfigSection.svelte +143 -63
  166. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +22 -0
  167. package/package/components/triggers/websocket/utils.js +1 -0
  168. package/package/components/workspaceSettings/AISettings.svelte +8 -2
  169. package/package/components/workspaceSettings/AISettings.svelte.d.ts +2 -1
  170. package/package/components/workspaceSettings/ModelTokenLimits.svelte +165 -0
  171. package/package/components/workspaceSettings/ModelTokenLimits.svelte.d.ts +8 -0
  172. package/package/components/workspaceSettings/StorageSettings.svelte +123 -51
  173. package/package/gen/core/OpenAPI.js +1 -1
  174. package/package/gen/schemas.gen.d.ts +141 -16
  175. package/package/gen/schemas.gen.js +144 -16
  176. package/package/gen/services.gen.d.ts +62 -42
  177. package/package/gen/services.gen.js +131 -82
  178. package/package/gen/types.gen.d.ts +218 -144
  179. package/package/hubPaths.json +2 -1
  180. package/package/services/JobManager.js +10 -7
  181. package/package/stores.d.ts +1 -0
  182. package/package/stores.js +6 -3
  183. package/package/timelineCompute.svelte.d.ts +21 -0
  184. package/package/timelineCompute.svelte.js +113 -0
  185. package/package/utils.d.ts +15 -8
  186. package/package/utils.js +62 -12
  187. package/package/workspace_settings.d.ts +13 -8
  188. package/package/workspace_settings.js +46 -11
  189. package/package.json +2 -2
@@ -1,32 +1,25 @@
1
+ <script lang="ts" module>"use strict";
2
+ let refreshCount = $state({ val: 0 });
3
+ </script>
4
+
1
5
  <script lang="ts">import { createEventDispatcher, getContext } from 'svelte';
2
6
  import StepGenQuick from '../../copilot/StepGenQuick.svelte';
3
7
  import FlowInputsQuick from '../content/FlowInputsQuick.svelte';
4
8
  import ToggleHubWorkspaceQuick from '../../ToggleHubWorkspaceQuick.svelte';
5
9
  import TopLevelNode from '../pickers/TopLevelNode.svelte';
6
- // import type { Writable } from 'svelte/store'
10
+ import RefreshButton from '../../common/button/RefreshButton.svelte';
7
11
  const dispatch = createEventDispatcher();
8
12
  let { stop = false, funcDesc = $bindable(''), disableAi = false, kind = 'script', allowTrigger = true, scriptOnly = false } = $props();
9
13
  let customUi = getContext('customUi');
10
14
  let selectedKind = $state(kind);
11
15
  let preFilter = $state('all');
12
16
  let loading = $state(false);
13
- let small = $state(false);
17
+ let small = $derived(kind === 'preprocessor' || kind === 'failure');
14
18
  let width = $state(0);
15
19
  let height = $state(0);
16
20
  let displayPath = $derived(width > 650 || height > 400);
17
- $effect(() => {
18
- small = kind === 'preprocessor' || kind === 'failure';
19
- });
20
21
  </script>
21
22
 
22
- <!-- <Menu transitionDuration={0} pointerDown bind:show={open} noMinW {placement} let:close> -->
23
-
24
- <!-- {floatingConfig}
25
- floatingClasses="mt-2"
26
- containerClasses="border rounded-lg shadow-lg bg-surface"
27
- noTransition
28
- shouldUsePortal={true} -->
29
-
30
23
  <div
31
24
  id="flow-editor-insert-module"
32
25
  class="flex flex-col h-[400px] {small
@@ -53,6 +46,7 @@ shouldUsePortal={true} -->
53
46
  {#if selectedKind != 'preprocessor' && selectedKind != 'flow'}
54
47
  <ToggleHubWorkspaceQuick bind:selected={preFilter} />
55
48
  {/if}
49
+ <RefreshButton {loading} on:click={() => (refreshCount.val += 1)} />
56
50
  </div>
57
51
 
58
52
  <div class="flex flex-row grow min-h-0">
@@ -128,13 +122,15 @@ shouldUsePortal={true} -->
128
122
  dispatch('new', { kind: 'branchall' })
129
123
  }}
130
124
  />
131
- <TopLevelNode
132
- label="AI Agent"
133
- on:select={() => {
134
- dispatch('close')
135
- dispatch('new', { kind: 'aiagent' })
136
- }}
137
- />
125
+ {#if customUi?.aiAgent != false}
126
+ <TopLevelNode
127
+ label="AI Agent"
128
+ on:select={() => {
129
+ dispatch('close')
130
+ dispatch('new', { kind: 'aiagent' })
131
+ }}
132
+ />
133
+ {/if}
138
134
  </div>
139
135
  {/if}
140
136
 
@@ -154,6 +150,7 @@ shouldUsePortal={true} -->
154
150
  {preFilter}
155
151
  {small}
156
152
  {displayPath}
153
+ refreshCount={refreshCount.val}
157
154
  />
158
155
  </div>
159
156
  </div>
@@ -40,7 +40,7 @@ let parentLoop = $derived(flowStore?.val && mod ? checkIfParentLoop(flowStore.va
40
40
  <div
41
41
  class={twMerge(
42
42
  'absolute z-10 right-0 -top-4 center-center text-tertiary text-2xs',
43
- editMode ? 'text-gray-400 dark:text-gray-500 text-2xs font-normal mr-2' : ''
43
+ editMode ? 'text-gray-400 dark:text-gray-500 text-2xs font-normal mr-2 right-10' : ''
44
44
  )}
45
45
  >
46
46
  {msToSec(duration_ms)}s
@@ -1,73 +1,65 @@
1
+ <script module lang="ts">"use strict";
2
+ let listHubIntegrationsCached = createCache(({ kind }) => IntegrationService.listHubIntegrations({ kind }), { initial: { kind: 'script', refreshCount: 0 }, invalidateMs: 1000 * 60 });
3
+ let listHubScriptsCached = createCache(async ({ filter, kind, appFilter }) => filter.length > 0
4
+ ? await ScriptService.queryHubScripts({ text: filter, limit: 40, kind })
5
+ : ((await ScriptService.getTopHubScripts({ limit: 40, kind, app: appFilter })).asks ?? []), {
6
+ initial: { filter: '', kind: 'script', appFilter: undefined, refreshCount: 0 },
7
+ invalidateMs: 1000 * 60
8
+ });
9
+ </script>
10
+
1
11
  <script lang="ts">import { createEventDispatcher, untrack } from 'svelte';
2
12
  import { Skeleton } from '../../common';
3
- import { classNames } from '../../../utils';
13
+ import { classNames, createCache } from '../../../utils';
4
14
  import { APP_TO_ICON_COMPONENT } from '../../icons';
5
15
  import { IntegrationService, ScriptService } from '../../../gen';
6
16
  import { Circle } from 'lucide-svelte';
7
17
  import Popover from '../../Popover.svelte';
18
+ import { usePromise } from '../../../svelte5Utils.svelte';
8
19
  let hubNotAvailable = $state(false);
9
20
  const dispatch = createEventDispatcher();
10
- let { kind = 'script', filter = $bindable(''), loading = $bindable(false), selected = undefined, appFilter = undefined, items = $bindable([]), displayPath = false, apps = $bindable([]) } = $props();
11
- let allApps = [];
21
+ let { kind = 'script', filter = $bindable(''), loading = $bindable(false), selected = undefined, appFilter = undefined, items = $bindable([]), displayPath = false, apps = $bindable([]), refreshCount = 0 } = $props();
22
+ let allApps = $state([]);
23
+ $effect(() => {
24
+ if (filter.length > 0) {
25
+ apps = Array.from(new Set(items?.map((x) => x.app) ?? [])).sort();
26
+ }
27
+ else {
28
+ apps = allApps;
29
+ }
30
+ });
12
31
  async function getAllApps(filterKind) {
13
32
  try {
14
33
  hubNotAvailable = false;
15
- allApps = (await IntegrationService.listHubIntegrations({
16
- kind: filterKind
17
- })).map((x) => x.name);
18
- apps = allApps;
34
+ allApps = (await listHubIntegrationsCached({ kind: filterKind, refreshCount })).map((x) => x.name);
19
35
  }
20
36
  catch (err) {
21
37
  console.error('Hub is not available');
22
38
  allApps = [];
23
- apps = [];
24
39
  hubNotAvailable = true;
25
40
  }
26
41
  }
27
- let startTs = 0;
28
- async function applyFilter(filter, filterKind, appFilter) {
29
- try {
30
- loading = true;
31
- hubNotAvailable = false;
32
- const ts = Date.now();
33
- startTs = ts;
34
- await new Promise((resolved, rejected) => setTimeout(resolved, 200));
35
- if (ts < startTs)
42
+ let hubScriptsFilteredPromise = usePromise(() => listHubScriptsCached({ appFilter, filter, kind, refreshCount }), { loadInit: false });
43
+ $effect(() => {
44
+ ;
45
+ [filter, kind, appFilter, refreshCount];
46
+ hubScriptsFilteredPromise.refresh();
47
+ });
48
+ $effect(() => {
49
+ loading = hubScriptsFilteredPromise.status === 'loading';
50
+ hubNotAvailable = !!hubScriptsFilteredPromise.error;
51
+ const scripts = hubScriptsFilteredPromise.value;
52
+ untrack(() => {
53
+ if (!scripts)
36
54
  return;
37
- const scripts = filter.length > 0
38
- ? await ScriptService.queryHubScripts({
39
- text: `${filter}`,
40
- limit: 40,
41
- kind: filterKind
42
- })
43
- : ((await ScriptService.getTopHubScripts({
44
- limit: 40,
45
- kind: filterKind,
46
- app: appFilter
47
- })).asks ?? []);
48
55
  const mappedItems = scripts.map((x) => ({
49
56
  ...x,
50
57
  path: `hub/${x.version_id}/${x.app}/${x.summary.toLowerCase().replaceAll(/\s+/g, '_')}`,
51
58
  summary: `${x.summary} (${x.app})`
52
59
  }));
53
- if (filter.length > 0) {
54
- apps = Array.from(new Set(mappedItems?.map((x) => x.app) ?? [])).sort();
55
- }
56
- else {
57
- apps = allApps;
58
- }
59
60
  items = appFilter ? mappedItems.filter((x) => x.app === appFilter) : mappedItems;
60
- if (ts === startTs) {
61
- loading = false;
62
- }
63
- hubNotAvailable = false;
64
- }
65
- catch (err) {
66
- hubNotAvailable = true;
67
- console.error('Hub not available');
68
- loading = false;
69
- }
70
- }
61
+ });
62
+ });
71
63
  function onKeyDown(e) {
72
64
  if (selected != undefined &&
73
65
  items &&
@@ -81,13 +73,7 @@ function onKeyDown(e) {
81
73
  }
82
74
  $effect(() => {
83
75
  ;
84
- [filter, kind, appFilter];
85
- untrack(() => {
86
- applyFilter(filter, kind, appFilter);
87
- });
88
- });
89
- $effect(() => {
90
- kind;
76
+ [kind, refreshCount];
91
77
  untrack(() => {
92
78
  getAllApps(kind);
93
79
  });
@@ -16,6 +16,7 @@ interface Props {
16
16
  }[];
17
17
  displayPath?: boolean;
18
18
  apps?: string[];
19
+ refreshCount?: number;
19
20
  }
20
21
  interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
21
22
  new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
@@ -1,25 +1,36 @@
1
+ <script module lang="ts">"use strict";
2
+ let initialWorkspace = get(workspaceStore);
3
+ let loadItemsCached = createCache(({ workspace, kind, isTemplate }) => workspace
4
+ ? kind == 'flow'
5
+ ? FlowService.listFlows({ workspace })
6
+ : ScriptService.listScripts({ workspace, kinds: kind, isTemplate })
7
+ : undefined, initialWorkspace
8
+ ? {
9
+ initial: {
10
+ workspace: initialWorkspace,
11
+ kind: 'script',
12
+ isTemplate: undefined,
13
+ refreshCount: 0
14
+ },
15
+ invalidateMs: 1000 * 60
16
+ }
17
+ : {});
18
+ </script>
19
+
1
20
  <script lang="ts">import { workspaceStore } from '../../../stores';
2
21
  import { createEventDispatcher, untrack } from 'svelte';
3
22
  import { FlowService, ScriptService } from '../../../gen';
4
23
  import SearchItems from '../../SearchItems.svelte';
5
24
  import { Skeleton } from '../../common';
6
- import { emptyString } from '../../../utils';
25
+ import { createCache, emptyString } from '../../../utils';
7
26
  import { Code2 } from 'lucide-svelte';
8
27
  import BarsStaggered from '../../icons/BarsStaggered.svelte';
9
28
  import Popover from '../../Popover.svelte';
10
- let items = $state(undefined);
29
+ import { usePromise } from '../../../svelte5Utils.svelte';
30
+ import { get } from 'svelte/store';
31
+ let items = usePromise(async () => await loadItemsCached({ workspace: $workspaceStore, kind, isTemplate, refreshCount }), { loadInit: false, clearValueOnRefresh: false });
11
32
  let filteredItems = $state(undefined);
12
- async function loadItems() {
13
- items =
14
- kind == 'flow'
15
- ? await FlowService.listFlows({ workspace: $workspaceStore })
16
- : await ScriptService.listScripts({
17
- workspace: $workspaceStore,
18
- kinds: kind,
19
- isTemplate
20
- });
21
- }
22
- let { kind = 'script', isTemplate = undefined, selected = undefined, displayPath = false, filteredWithOwner = $bindable(undefined), filter = '', owners = $bindable([]), ownerFilter = $bindable(undefined) } = $props();
33
+ let { kind = 'script', isTemplate = undefined, selected = undefined, displayPath = false, filteredWithOwner = $bindable(undefined), filter = '', owners = $bindable([]), ownerFilter = $bindable(undefined), refreshCount = 0 } = $props();
23
34
  const dispatch = createEventDispatcher();
24
35
  let lockHash = false;
25
36
  function onKeyDown(e) {
@@ -39,7 +50,8 @@ function onKeyDown(e) {
39
50
  }
40
51
  }
41
52
  $effect(() => {
42
- $workspaceStore && kind && untrack(() => loadItems());
53
+ refreshCount;
54
+ $workspaceStore && kind && untrack(() => items.refresh());
43
55
  });
44
56
  $effect(() => {
45
57
  if ($workspaceStore) {
@@ -69,7 +81,7 @@ $effect(() => {
69
81
 
70
82
  <SearchItems
71
83
  {filter}
72
- {items}
84
+ items={items.value}
73
85
  bind:filteredItems
74
86
  f={(x) => (emptyString(x.summary) ? x.path : x.summary + ' (' + x.path + ')')}
75
87
  />
@@ -18,6 +18,7 @@ interface Props {
18
18
  kind: 'inline' | 'owner' | 'integrations';
19
19
  name: string | undefined;
20
20
  } | undefined;
21
+ refreshCount?: number;
21
22
  }
22
23
  interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
23
24
  new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
@@ -102,6 +102,7 @@ onMount(() => {
102
102
  <div class="flex flex-row items-center justify-center w-full h-full">
103
103
  {#if showInput}
104
104
  <Popover
105
+ enableFlyTransition
105
106
  floatingConfig={{
106
107
  placement: 'bottom',
107
108
  gutter: 0,
@@ -144,6 +145,7 @@ onMount(() => {
144
145
  {/if}
145
146
 
146
147
  <Popover
148
+ enableFlyTransition
147
149
  floatingConfig={{
148
150
  placement: 'bottom',
149
151
  gutter: 0,
@@ -5,10 +5,34 @@ import GitSyncFilterSettings from '../workspaceSettings/GitSyncFilterSettings.sv
5
5
  import Toggle from '../Toggle.svelte';
6
6
  import { sendUserToast } from '../../toast';
7
7
  import { workspaceStore } from '../../stores';
8
- let { idx } = $props();
8
+ import GitSyncModeDisplay from './GitSyncModeDisplay.svelte';
9
+ let { idx, mode } = $props();
9
10
  const gitSyncContext = getGitSyncContext();
10
11
  const repo = $derived(gitSyncContext.getRepository(idx));
12
+ let targetBranch = $state('main');
13
+ // Update target branch when repository changes
14
+ $effect(() => {
15
+ const abortController = new AbortController();
16
+ if (repo?.git_repo_resource_path) {
17
+ gitSyncContext.getTargetBranch(repo).then(branch => {
18
+ if (!abortController.signal.aborted) {
19
+ targetBranch = branch;
20
+ }
21
+ }).catch(error => {
22
+ if (!abortController.signal.aborted) {
23
+ console.warn('Failed to get target branch:', error);
24
+ }
25
+ });
26
+ }
27
+ return () => {
28
+ abortController.abort();
29
+ };
30
+ });
11
31
  async function handleDetect() {
32
+ if (!repo) {
33
+ sendUserToast('Repository not found', true);
34
+ return;
35
+ }
12
36
  try {
13
37
  await gitSyncContext.detectRepository(idx);
14
38
  }
@@ -43,24 +67,13 @@ async function handleSaveConnection() {
43
67
  }
44
68
  </script>
45
69
 
70
+
46
71
  {#if repo}
47
72
  <div class="space-y-4">
48
73
  {#if !repo.detectionState || repo.detectionState === 'idle'}
49
- <!-- Step 1: Show toggles first, then check button -->
50
- <div class="space-y-3">
51
- <Toggle
52
- disabled={!repo.git_repo_resource_path}
53
- bind:checked={repo.use_individual_branch}
54
- options={{
55
- left: 'Sync mode',
56
- leftTooltip: 'Changes will be committed directly to the branch',
57
- right: 'Promotion mode',
58
- rightTooltip:
59
- "Changes will be made to a new branch per deployed object (prefixed with 'wm_deploy/')"
60
- }}
61
- />
62
-
63
- {#if repo.use_individual_branch}
74
+ <!-- Folder grouping option for promotion mode -->
75
+ {#if mode === 'promotion'}
76
+ <div class="space-y-3">
64
77
  <Toggle
65
78
  disabled={!repo.git_repo_resource_path}
66
79
  bind:checked={repo.group_by_folder}
@@ -70,8 +83,8 @@ async function handleSaveConnection() {
70
83
  'Instead of creating a branch per object, Windmill will create a branch per folder containing objects being deployed.'
71
84
  }}
72
85
  />
73
- {/if}
74
- </div>
86
+ </div>
87
+ {/if}
75
88
 
76
89
  <!-- Check repo settings button -->
77
90
  <div class="flex justify-start">
@@ -110,19 +123,7 @@ async function handleSaveConnection() {
110
123
  useIndividualBranch={repo.use_individual_branch}
111
124
  />
112
125
 
113
- <!-- Display mode settings as prominent text -->
114
- <div class="text-base">
115
- {#if repo.use_individual_branch}
116
- <div
117
- ><span class="font-bold">Promotion:</span> Creating branches whose promotion target is main</div
118
- >
119
- {#if repo.group_by_folder}
120
- <div class="text-sm text-tertiary mt-1">Grouped by folder</div>
121
- {/if}
122
- {:else}
123
- <div>Sync: <span class="font-bold">Syncing back to branch main</span></div>
124
- {/if}
125
- </div>
126
+ <GitSyncModeDisplay {mode} {targetBranch} repository={repo} />
126
127
 
127
128
  <!-- Initialize button -->
128
129
  <div class="flex justify-start">
@@ -149,19 +150,7 @@ async function handleSaveConnection() {
149
150
  useIndividualBranch={repo.use_individual_branch}
150
151
  />
151
152
 
152
- <!-- Display mode settings as prominent text -->
153
- <div class="text-base">
154
- {#if repo.use_individual_branch}
155
- <div
156
- ><span class="font-bold">Promotion:</span> Creating branches whose promotion target is main</div
157
- >
158
- {#if repo.group_by_folder}
159
- <div class="text-sm text-tertiary mt-1">Grouped by folder</div>
160
- {/if}
161
- {:else}
162
- <div>Sync: <span class="font-bold">Syncing back to branch main</span></div>
163
- {/if}
164
- </div>
153
+ <GitSyncModeDisplay {mode} {targetBranch} repository={repo} />
165
154
 
166
155
  <!-- Save connection button -->
167
156
  <div class="flex justify-start">
@@ -1,5 +1,6 @@
1
1
  type $$ComponentProps = {
2
2
  idx: number;
3
+ mode?: 'sync' | 'promotion';
3
4
  };
4
5
  declare const DetectionFlow: import("svelte").Component<$$ComponentProps, {}, "">;
5
6
  type DetectionFlow = ReturnType<typeof DetectionFlow>;
@@ -12,6 +12,8 @@ export type GitSyncRepository = BackendGitRepositorySettings & {
12
12
  detectionJobId?: string;
13
13
  detectionJobStatus?: 'running' | 'success' | 'failure';
14
14
  _trackedPath?: string;
15
+ _targetBranch?: string;
16
+ _detectionTimestamp?: number;
15
17
  };
16
18
  export type GitSyncTestJob = {
17
19
  jobId: string;
@@ -60,7 +62,10 @@ export declare function createGitSyncContext(workspace: string): {
60
62
  readonly hasUnsavedConnections: boolean;
61
63
  readonly hasWorkspaceLevelSettings: boolean;
62
64
  addRepository: () => void;
65
+ addSyncRepository: () => void;
66
+ addPromotionRepository: () => void;
63
67
  removeRepository: (idx: number) => Promise<void>;
68
+ removeRepositoryByPath: (resourcePath: string) => Promise<void>;
64
69
  getRepository: (idx: number) => GitSyncRepository;
65
70
  getValidation: (idx: number) => ValidationState;
66
71
  revertRepository: (idx: number) => void;
@@ -76,6 +81,23 @@ export declare function createGitSyncContext(workspace: string): {
76
81
  closeSuccessModal: () => void;
77
82
  loadSettings: () => Promise<void>;
78
83
  saveRepository: (idx: number, savedWithoutInit?: boolean) => Promise<void>;
84
+ getPrimarySyncRepository: () => {
85
+ repo: GitSyncRepository;
86
+ idx: number;
87
+ } | null;
88
+ getPrimaryPromotionRepository: () => {
89
+ repo: GitSyncRepository;
90
+ idx: number;
91
+ } | null;
92
+ getSecondarySyncRepositories: () => {
93
+ repo: GitSyncRepository;
94
+ idx: number;
95
+ }[];
96
+ getLegacyPromotionRepositories: () => {
97
+ repo: GitSyncRepository;
98
+ idx: number;
99
+ }[];
100
+ getTargetBranch: (repo: GitSyncRepository) => Promise<string>;
79
101
  };
80
102
  export type GitSyncContextType = ReturnType<typeof createGitSyncContext>;
81
103
  export declare function setGitSyncContext(workspace: string): GitSyncContextType;