windmill-components 1.511.1 → 1.522.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 (232) hide show
  1. package/package/components/AppConnectInner.svelte.d.ts +1 -1
  2. package/package/components/ArgInput.svelte +42 -14
  3. package/package/components/ArgInput.svelte.d.ts +2 -10
  4. package/package/components/AssignableTagsInner.svelte +5 -0
  5. package/package/components/AuthSettings.svelte +4 -2
  6. package/package/components/AuthSettings.svelte.d.ts +1 -0
  7. package/package/components/DBManagerDrawer.svelte +154 -151
  8. package/package/components/DBManagerDrawer.svelte.d.ts +2 -2
  9. package/package/components/DBTable.svelte +3 -3
  10. package/package/components/DBTable.svelte.d.ts +1 -0
  11. package/package/components/DBTableEditor.svelte +7 -7
  12. package/package/components/DBTableEditor.svelte.d.ts +1 -1
  13. package/package/components/DeployWorkspace.svelte +1 -1
  14. package/package/components/DisplayResult.svelte +34 -8
  15. package/package/components/DisplayResult.svelte.d.ts +4 -1
  16. package/package/components/DynSelect.svelte +58 -34
  17. package/package/components/DynSelect.svelte.d.ts +3 -11
  18. package/package/components/EditableSchemaForm.svelte +126 -6
  19. package/package/components/EditableSchemaForm.svelte.d.ts +5 -1
  20. package/package/components/Editor.svelte +1 -1
  21. package/package/components/EditorBar.svelte +82 -4
  22. package/package/components/ErrorOrRecoveryHandler.svelte +76 -8
  23. package/package/components/ErrorOrRecoveryHandler.svelte.d.ts +2 -1
  24. package/package/components/ExploreAssetButton.svelte +14 -4
  25. package/package/components/ExploreAssetButton.svelte.d.ts +1 -0
  26. package/package/components/FlowJobResult.svelte +3 -3
  27. package/package/components/FlowJobResult.svelte.d.ts +1 -0
  28. package/package/components/FlowPreviewContent.svelte +9 -1
  29. package/package/components/FlowPreviewResult.svelte +4 -1
  30. package/package/components/FlowPreviewResult.svelte.d.ts +1 -0
  31. package/package/components/FlowStatusViewerInner.svelte +21 -3
  32. package/package/components/FlowStatusViewerInner.svelte.d.ts +7 -1
  33. package/package/components/FolderEditor.svelte +1 -1
  34. package/package/components/GitDiffPreview.svelte +14 -18
  35. package/package/components/GitDiffPreview.svelte.d.ts +2 -8
  36. package/package/components/GitHubAppIntegration.svelte +3 -1
  37. package/package/components/IdEditorInput.svelte +25 -22
  38. package/package/components/IdEditorInput.svelte.d.ts +11 -23
  39. package/package/components/InstanceSetting.svelte +7 -2
  40. package/package/components/InstanceSettings.svelte +1 -0
  41. package/package/components/JobLoader.svelte +48 -5
  42. package/package/components/JobLoader.svelte.d.ts +7 -2
  43. package/package/components/Login.svelte +8 -2
  44. package/package/components/MemoryFootprintViewer.svelte +1 -1
  45. package/package/components/ModulePreviewResultViewer.svelte +2 -2
  46. package/package/components/MoveDrawer.svelte.d.ts +2 -2
  47. package/package/components/NextcloudSetting.svelte +84 -0
  48. package/package/components/NextcloudSetting.svelte.d.ts +7 -0
  49. package/package/components/ObjectResourceInput.svelte +3 -2
  50. package/package/components/ObjectResourceInput.svelte.d.ts +1 -0
  51. package/package/components/ParqetCsvTableRenderer.svelte +1 -1
  52. package/package/components/ResourceEditor.svelte +1 -1
  53. package/package/components/ResourcePicker.svelte +8 -1
  54. package/package/components/ResourcePicker.svelte.d.ts +1 -0
  55. package/package/components/ResultStreamDisplay.svelte +5 -0
  56. package/package/components/ResultStreamDisplay.svelte.d.ts +5 -0
  57. package/package/components/RunForm.svelte +9 -1
  58. package/package/components/SchemaForm.svelte +2 -2
  59. package/package/components/SchemaForm.svelte.d.ts +2 -10
  60. package/package/components/ScriptBuilder.svelte +13 -8
  61. package/package/components/ScriptBuilder.svelte.d.ts +1 -1
  62. package/package/components/ScriptEditor.svelte.d.ts +1 -1
  63. package/package/components/ScriptWrapper.svelte +1 -1
  64. package/package/components/ShareModal.svelte.d.ts +1 -1
  65. package/package/components/SimpleAgTable.svelte +2 -0
  66. package/package/components/SimpleAgTable.svelte.d.ts +2 -0
  67. package/package/components/SqlRepl.svelte +21 -7
  68. package/package/components/SqlRepl.svelte.d.ts +2 -2
  69. package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
  70. package/package/components/WorkerTagSelect.svelte +70 -1
  71. package/package/components/apps/components/display/AppDisplayComponent.svelte +13 -1
  72. package/package/components/apps/components/display/AppText.svelte +2 -2
  73. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +8 -1
  74. package/package/components/apps/components/display/dbtable/InsertRow.svelte +5 -4
  75. package/package/components/apps/components/display/dbtable/queries/count.js +11 -1
  76. package/package/components/apps/components/display/dbtable/queries/createTable.d.ts +1 -1
  77. package/package/components/apps/components/display/dbtable/queries/createTable.js +3 -3
  78. package/package/components/apps/components/display/dbtable/queries/delete.js +7 -0
  79. package/package/components/apps/components/display/dbtable/queries/insert.js +2 -0
  80. package/package/components/apps/components/display/dbtable/queries/select.js +14 -0
  81. package/package/components/apps/components/display/dbtable/queries/update.js +7 -0
  82. package/package/components/apps/components/display/dbtable/utils.d.ts +6 -5
  83. package/package/components/apps/components/display/dbtable/utils.js +52 -28
  84. package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte +1 -1
  85. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +1 -0
  86. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte.d.ts +1 -0
  87. package/package/components/apps/components/display/table/AppAggridTable.svelte +5 -4
  88. package/package/components/apps/components/display/table/AppAggridTable.svelte.d.ts +1 -0
  89. package/package/components/apps/components/display/table/utils.js +7 -4
  90. package/package/components/apps/components/helpers/HiddenComponent.svelte +2 -2
  91. package/package/components/apps/components/helpers/RunnableComponent.svelte +4 -1
  92. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +2 -1
  93. package/package/components/apps/components/inputs/AppS3FileInput.svelte +2 -2
  94. package/package/components/apps/components/layout/AppDecisionTree.svelte +1 -1
  95. package/package/components/apps/components/layout/AppStepper.svelte +1 -1
  96. package/package/components/apps/components/layout/AppTabs.svelte +1 -1
  97. package/package/components/apps/editor/AppEditorHeader.svelte +13 -2
  98. package/package/components/apps/editor/GridViewer.svelte +1 -0
  99. package/package/components/apps/editor/RunnableJobPanelInner.svelte +2 -1
  100. package/package/components/apps/editor/contextPanel/components/IdEditor.svelte +7 -7
  101. package/package/components/apps/editor/contextPanel/components/IdEditor.svelte.d.ts +7 -19
  102. package/package/components/apps/editor/contextPanel/components/OutputHeader.svelte +8 -12
  103. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte.d.ts +1 -1
  104. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte.d.ts +1 -1
  105. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte.d.ts +1 -1
  106. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphEditor.svelte +3 -3
  107. package/package/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte +1 -3
  108. package/package/components/assets/AssetsDropdownButton.svelte +1 -1
  109. package/package/components/assets/JobAssetsViewer.svelte +2 -2
  110. package/package/components/assets/lib.js +4 -0
  111. package/package/components/auditLogs/AuditLogsFilters.svelte +7 -9
  112. package/package/components/common/button/Button.svelte +4 -3
  113. package/package/components/common/button/Button.svelte.d.ts +1 -0
  114. package/package/components/common/confirmationModal/ConfirmationModal.svelte +6 -5
  115. package/package/components/common/confirmationModal/ConfirmationModal.svelte.d.ts +6 -11
  116. package/package/components/common/confirmationModal/asyncConfirmationModal.svelte.d.ts +26 -0
  117. package/package/components/common/confirmationModal/asyncConfirmationModal.svelte.js +50 -0
  118. package/package/components/common/modal/Modal.svelte +2 -5
  119. package/package/components/common/tabs/TabsV2.svelte +2 -1
  120. package/package/components/common/tabs/TabsV2.svelte.d.ts +1 -0
  121. package/package/components/copilot/chat/AIChatManager.svelte.js +61 -7
  122. package/package/components/copilot/chat/ContextTextarea.svelte +1 -1
  123. package/package/components/copilot/chat/script/core.js +28 -29
  124. package/package/components/copilot/chat/shared.d.ts +1 -1
  125. package/package/components/copilot/chat/shared.js +8 -2
  126. package/package/components/custom_ui.d.ts +2 -0
  127. package/package/components/dbOps.d.ts +20 -8
  128. package/package/components/dbOps.js +85 -40
  129. package/package/components/details/DetailPageHeader.svelte +0 -2
  130. package/package/components/flows/content/FlowInput.svelte +5 -0
  131. package/package/components/flows/content/FlowModuleScript.svelte +0 -1
  132. package/package/components/flows/idUtils.js +2 -1
  133. package/package/components/flows/map/FlowModuleSchemaItem.svelte +3 -3
  134. package/package/components/flows/map/FlowModuleSchemaMap.svelte +5 -0
  135. package/package/components/flows/map/InsertModuleButton.svelte +4 -1
  136. package/package/components/flows/propPicker/OutputBadge.svelte +5 -1
  137. package/package/components/flows/propPicker/OutputPickerInner.svelte +9 -5
  138. package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +6 -2
  139. package/package/components/flows/propPicker/StepHistory.svelte +4 -1
  140. package/package/components/git_sync/DetectionFlow.svelte +202 -0
  141. package/package/components/git_sync/DetectionFlow.svelte.d.ts +6 -0
  142. package/package/components/git_sync/GitSyncContext.svelte.d.ts +82 -0
  143. package/package/components/git_sync/GitSyncContext.svelte.js +461 -0
  144. package/package/components/git_sync/GitSyncModalManager.svelte +99 -0
  145. package/package/components/git_sync/GitSyncModalManager.svelte.d.ts +18 -0
  146. package/package/components/git_sync/GitSyncRepositoryCard.svelte +339 -0
  147. package/package/components/git_sync/GitSyncRepositoryCard.svelte.d.ts +6 -0
  148. package/package/components/git_sync/GitSyncRepositoryList.svelte +17 -0
  149. package/package/components/git_sync/GitSyncRepositoryList.svelte.d.ts +18 -0
  150. package/package/components/git_sync/GitSyncSection.svelte +89 -0
  151. package/package/components/git_sync/GitSyncSection.svelte.d.ts +3 -0
  152. package/package/components/git_sync/GitSyncSuccessModal.svelte +58 -0
  153. package/package/components/git_sync/GitSyncSuccessModal.svelte.d.ts +7 -0
  154. package/package/components/git_sync/PullWorkspaceModal.svelte +575 -0
  155. package/package/components/git_sync/PullWorkspaceModal.svelte.d.ts +15 -0
  156. package/package/components/git_sync/PushWorkspaceModal.svelte +320 -0
  157. package/package/components/git_sync/PushWorkspaceModal.svelte.d.ts +12 -0
  158. package/package/components/graph/FlowGraphV2.svelte +5 -1
  159. package/package/components/graph/graphBuilder.svelte.js +1 -1
  160. package/package/components/graph/renderers/nodes/AssetNode.svelte +4 -4
  161. package/package/components/icons/AssetDucklakeIcon.svelte +28 -0
  162. package/package/components/icons/AssetDucklakeIcon.svelte.d.ts +9 -0
  163. package/package/components/icons/AssetGenericIcon.svelte +3 -0
  164. package/package/components/icons/DucklakeIcon.svelte +18 -0
  165. package/package/components/icons/DucklakeIcon.svelte.d.ts +6 -0
  166. package/package/components/instanceSettings.js +11 -3
  167. package/package/components/runs/JobPreview.svelte +2 -2
  168. package/package/components/runs/NoWorkerWithTagWarning.svelte +3 -3
  169. package/package/components/runs/RunsFilter.svelte.d.ts +1 -1
  170. package/package/components/schema/FlowPropertyEditor.svelte +3 -2
  171. package/package/components/schema/FlowPropertyEditor.svelte.d.ts +1 -1
  172. package/package/components/schema/PropertyEditor.svelte +0 -2
  173. package/package/components/schema/PropertyEditor.svelte.d.ts +1 -1
  174. package/package/components/schema/SchemaFormDND.svelte +2 -1
  175. package/package/components/schema/SchemaFormDND.svelte.d.ts +2 -0
  176. package/package/components/scriptEditor/LogPanel.svelte +5 -3
  177. package/package/components/scriptEditor/LogPanel.svelte.d.ts +5 -1
  178. package/package/components/select/Select.svelte +7 -4
  179. package/package/components/select/Select.svelte.d.ts +5 -0
  180. package/package/components/select/SelectDropdown.svelte +2 -1
  181. package/package/components/select/SelectDropdown.svelte.d.ts +3 -0
  182. package/package/components/sidebar/changelogs.js +5 -0
  183. package/package/components/table/AutoDataTable.svelte +6 -4
  184. package/package/components/table/AutoDataTable.svelte.d.ts +1 -0
  185. package/package/components/table/DataTable.svelte +12 -10
  186. package/package/components/table/DataTable.svelte.d.ts +1 -0
  187. package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte.d.ts +2 -2
  188. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte +1 -1
  189. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte.d.ts +2 -1
  190. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +50 -11
  191. package/package/components/triggers/gcp/utils.js +1 -0
  192. package/package/components/triggers/http/utils.js +1 -1
  193. package/package/components/triggers/kafka/utils.js +1 -1
  194. package/package/components/triggers/mqtt/utils.js +1 -1
  195. package/package/components/triggers/nats/utils.js +1 -1
  196. package/package/components/triggers/postgres/utils.js +1 -1
  197. package/package/components/triggers/sqs/utils.js +1 -1
  198. package/package/components/triggers/utils.js +2 -1
  199. package/package/components/triggers/webhook/WebhooksConfigSection.svelte +24 -26
  200. package/package/components/triggers/webhook/WebhooksPanel.svelte +1 -15
  201. package/package/components/triggers/websocket/utils.js +1 -1
  202. package/package/components/workspaceSettings/AISettings.svelte +52 -36
  203. package/package/components/workspaceSettings/DucklakeSettings.svelte +321 -0
  204. package/package/components/workspaceSettings/DucklakeSettings.svelte.d.ts +23 -0
  205. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +122 -499
  206. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte.d.ts +8 -10
  207. package/package/consts.js +2 -1
  208. package/package/gen/core/OpenAPI.js +1 -1
  209. package/package/gen/schemas.gen.d.ts +7 -6
  210. package/package/gen/schemas.gen.js +7 -6
  211. package/package/gen/services.gen.d.ts +19 -1
  212. package/package/gen/services.gen.js +38 -0
  213. package/package/gen/types.gen.d.ts +78 -3
  214. package/package/git-sync.d.ts +36 -0
  215. package/package/git-sync.js +1 -0
  216. package/package/hub.d.ts +1 -0
  217. package/package/hubPaths.json +5 -2
  218. package/package/infer.js +3 -2
  219. package/package/script_helpers.d.ts +2 -2
  220. package/package/script_helpers.js +29 -11
  221. package/package/services/JobManager.d.ts +28 -0
  222. package/package/services/JobManager.js +114 -0
  223. package/package/stores.d.ts +1 -1
  224. package/package/utils.d.ts +18 -1
  225. package/package/utils.js +55 -2
  226. package/package.json +5 -4
  227. package/package/components/InitGitRepoPopover.svelte +0 -410
  228. package/package/components/InitGitRepoPopover.svelte.d.ts +0 -13
  229. package/package/components/PullGitRepoPopover.svelte +0 -355
  230. package/package/components/PullGitRepoPopover.svelte.d.ts +0 -18
  231. package/package/inferArgSig.d.ts +0 -42
  232. package/package/inferArgSig.js +0 -198
@@ -1,30 +1,15 @@
1
1
  <script lang="ts">import Toggle from '../Toggle.svelte';
2
- import { Filter, Save, Eye, Loader2, CheckCircle2, XCircle, Check } from 'lucide-svelte';
2
+ import { Filter, Terminal, ChevronDown, ChevronUp, Edit3 } from 'lucide-svelte';
3
3
  import Tooltip from '../Tooltip.svelte';
4
- import yaml from 'js-yaml';
5
- import hubPaths from '../../hubPaths.json';
6
- import { JobService } from '../../gen';
7
- import { workspaceStore } from '../../stores';
8
- import { Button } from '../common';
9
- import { sendUserToast } from '../../toast';
10
4
  import FilterList from './FilterList.svelte';
11
5
  import { Tabs, Tab } from '../common';
12
- let { git_repo_resource_path = $bindable(''), include_path = $bindable(['f/**']), include_type = $bindable(['script', 'flow', 'app', 'folder']), exclude_types_override = $bindable([]), isLegacyRepo = false, yamlText = $bindable(''), onSettingsChange = (settings) => { }, excludes = $bindable([]), extraIncludes = $bindable([]) } = $props();
6
+ import { workspaceStore } from '../../stores';
7
+ let { git_repo_resource_path = $bindable(''), include_path = $bindable(['f/**']), include_type = $bindable(['script', 'flow', 'app', 'folder']), exclude_types_override = $bindable([]), isLegacyRepo = false, excludes = $bindable([]), extraIncludes = $bindable([]), isInitialSetup = false, requiresMigration = false, actions = undefined, useIndividualBranch = false } = $props();
13
8
  // Component state
14
9
  let collapsed = $state(false);
15
- let editAsYaml = $state(false);
16
- let yamlError = $state('');
17
- let isPullMode = $state(false);
18
- // Preview/Push state
19
- let previewResult = $state(null);
20
- let previewJobId = $state(null);
21
- let previewJobStatus = $state(undefined);
22
- let pushJobId = $state(null);
23
- let pushJobStatus = $state(undefined);
24
- let isPreviewLoading = $state(false);
25
- let isPushing = $state(false);
26
- let previewError = $state('');
27
- let previewSettingsSnapshot = $state(null);
10
+ let showCliInstructions = $state(false);
11
+ // Determine if component should be editable or read-only
12
+ const isEditable = $derived(isInitialSetup || requiresMigration);
28
13
  // Compute effective include types (include_type minus exclude_types_override for legacy repos only)
29
14
  const effectiveIncludeTypes = $derived(isLegacyRepo
30
15
  ? include_type.filter((type) => !exclude_types_override.includes(type))
@@ -80,352 +65,6 @@ function updateIncludeType(key, value) {
80
65
  function capitalize(str) {
81
66
  return str.charAt(0).toUpperCase() + str.slice(1);
82
67
  }
83
- // Simple JSON-based UI state helper
84
- function getUIState() {
85
- return {
86
- include_path,
87
- exclude_path: excludes,
88
- extra_include_path: extraIncludes,
89
- include_type
90
- };
91
- }
92
- // Apply settings from backend format (used by both local git repo and backend settings)
93
- function fromBackendFormat(settings) {
94
- include_path = settings.include_path || [];
95
- excludes = settings.exclude_path || [];
96
- extraIncludes = settings.extra_include_path || [];
97
- include_type = settings.include_type || [];
98
- }
99
- // Simplified YAML parsing for manual editing
100
- function fromYaml(yamlStr) {
101
- yamlError = '';
102
- try {
103
- const parsed = yaml.load(yamlStr);
104
- if (!parsed || typeof parsed !== 'object') {
105
- throw new Error('Invalid YAML structure');
106
- }
107
- const obj = parsed;
108
- yamlText = yamlStr;
109
- // Extract includes - reset to default if not present
110
- if (obj.includes && Array.isArray(obj.includes)) {
111
- include_path = obj.includes.map((p) => {
112
- if (typeof p !== 'string') {
113
- throw new Error('includes must contain only strings');
114
- }
115
- // Handle quoted strings
116
- if (/^['"].*['"]$/.test(p)) {
117
- return p.slice(1, -1).replace(/''/g, "'");
118
- }
119
- return p;
120
- });
121
- }
122
- else {
123
- // Reset to default if includes is not present
124
- include_path = ['f/**'];
125
- }
126
- // Build the type set based on the YAML flags
127
- const newTypes = new Set();
128
- // Always include core types (these are fundamental and not controlled by flags)
129
- newTypes.add('script');
130
- newTypes.add('flow');
131
- newTypes.add('app');
132
- newTypes.add('folder');
133
- // Handle skip flags (if skipX is false or undefined, include the type)
134
- if (obj.skipResourceTypes !== true)
135
- newTypes.add('resourcetype');
136
- if (obj.skipResources !== true)
137
- newTypes.add('resource');
138
- if (obj.skipVariables !== true)
139
- newTypes.add('variable');
140
- if (obj.skipSecrets !== true)
141
- newTypes.add('secret');
142
- // Handle include flags (if includeX is true, include the type)
143
- if (obj.includeSchedules === true)
144
- newTypes.add('schedule');
145
- if (obj.includeTriggers === true)
146
- newTypes.add('trigger');
147
- if (obj.includeUsers === true)
148
- newTypes.add('user');
149
- if (obj.includeGroups === true)
150
- newTypes.add('group');
151
- if (obj.includeSettings === true)
152
- newTypes.add('settings');
153
- if (obj.includeKey === true)
154
- newTypes.add('key');
155
- // Apply business rule: secrets can only be included if variables are included
156
- // This matches the UI behavior where turning off variables also turns off secrets
157
- if (!newTypes.has('variable')) {
158
- newTypes.delete('secret');
159
- }
160
- include_type = Array.from(newTypes);
161
- }
162
- catch (e) {
163
- yamlError = e.message || 'Invalid YAML';
164
- console.error('Error parsing YAML:', e);
165
- }
166
- }
167
- // Simple YAML generation for manual editing mode
168
- function generateYamlFromUI() {
169
- try {
170
- const validIncludePath = include_path;
171
- const validExcludePath = excludes;
172
- const validExtraInclude = extraIncludes;
173
- // Basic YAML structure - let the CLI handle the proper normalization
174
- let config = {
175
- includes: validIncludePath,
176
- excludes: validExcludePath,
177
- extraIncludes: validExtraInclude,
178
- codebases: []
179
- };
180
- // Let the CLI handle the optimization of skip/include flags
181
- // Just convert the UI state directly
182
- if (!include_type.includes('variable'))
183
- config.skipVariables = true;
184
- if (!include_type.includes('resource'))
185
- config.skipResources = true;
186
- if (!include_type.includes('secret'))
187
- config.skipSecrets = true;
188
- if (!include_type.includes('resourcetype'))
189
- config.skipResourceTypes = true;
190
- if (include_type.includes('schedule'))
191
- config.includeSchedules = true;
192
- if (include_type.includes('trigger'))
193
- config.includeTriggers = true;
194
- if (include_type.includes('user'))
195
- config.includeUsers = true;
196
- if (include_type.includes('group'))
197
- config.includeGroups = true;
198
- if (include_type.includes('settings'))
199
- config.includeSettings = true;
200
- if (include_type.includes('key'))
201
- config.includeKey = true;
202
- return yaml.dump(config, {
203
- indent: 2,
204
- lineWidth: -1,
205
- quotingType: '"',
206
- forceQuotes: false,
207
- noRefs: true
208
- });
209
- }
210
- catch (e) {
211
- console.warn('Failed to generate YAML:', e);
212
- yamlError = e.message || 'Failed to generate YAML';
213
- return `includes:
214
- - f/**
215
- excludes: []
216
- extraIncludes: []
217
- codebases: []`;
218
- }
219
- }
220
- function switchToYaml() {
221
- yamlText = generateYamlFromUI();
222
- yamlError = '';
223
- editAsYaml = true;
224
- }
225
- function switchToUI() {
226
- fromYaml(yamlText);
227
- if (!yamlError) {
228
- editAsYaml = false;
229
- }
230
- }
231
- // Simplified preview function - always uses JSON approach
232
- async function previewFiltersToGitRepo() {
233
- isPreviewLoading = true;
234
- previewError = '';
235
- previewResult = null;
236
- previewJobId = null;
237
- previewJobStatus = undefined;
238
- // Take a snapshot of current settings
239
- previewSettingsSnapshot = JSON.stringify({
240
- include_path,
241
- excludes,
242
- extraIncludes,
243
- include_type
244
- });
245
- try {
246
- const workspace = $workspaceStore;
247
- if (!workspace)
248
- return;
249
- // Always pass UI state as JSON - the backend now handles this uniformly
250
- const payloadObj = {
251
- workspace_id: workspace,
252
- repo_url_resource_path: git_repo_resource_path,
253
- only_wmill_yaml: true,
254
- dry_run: true,
255
- pull: isPullMode,
256
- settings_json: JSON.stringify(getUIState())
257
- };
258
- const jobId = await JobService.runScriptByPath({
259
- workspace,
260
- path: hubPaths.gitInitRepo,
261
- requestBody: payloadObj,
262
- skipPreprocessor: true
263
- });
264
- previewJobId = jobId;
265
- previewJobStatus = 'running';
266
- let jobSuccess = false;
267
- let result = {};
268
- await (await import('../../utils')).tryEvery({
269
- tryCode: async () => {
270
- const testResult = await JobService.getCompletedJob({ workspace, id: jobId });
271
- jobSuccess = !!testResult.success;
272
- if (jobSuccess) {
273
- const jobResult = await JobService.getCompletedJobResult({ workspace, id: jobId });
274
- result = jobResult;
275
- }
276
- },
277
- timeoutCode: async () => {
278
- try {
279
- await JobService.cancelQueuedJob({
280
- workspace,
281
- id: jobId,
282
- requestBody: { reason: 'Preview job timed out after 5s' }
283
- });
284
- }
285
- catch (err) { }
286
- },
287
- interval: 500,
288
- timeout: 10000
289
- });
290
- previewJobStatus = jobSuccess ? 'success' : 'failure';
291
- if (jobSuccess) {
292
- previewResult = result;
293
- }
294
- else {
295
- previewError = 'Preview failed';
296
- }
297
- }
298
- catch (e) {
299
- previewJobStatus = 'failure';
300
- previewError = e?.message || 'Preview failed';
301
- previewResult = null;
302
- }
303
- finally {
304
- isPreviewLoading = false;
305
- }
306
- }
307
- // Simplified push function - always uses JSON approach
308
- async function pushFiltersToGitRepo() {
309
- if (isPullMode) {
310
- // In pull mode, apply the local settings (from git repo) to UI
311
- if (previewResult?.local) {
312
- try {
313
- fromBackendFormat(previewResult.local);
314
- yamlText = generateYamlFromUI();
315
- onSettingsChange({ yaml: yamlText });
316
- sendUserToast('Changes applied - remember to save repository settings to persist changes');
317
- // Clear the preview state after applying settings
318
- previewResult = null;
319
- previewJobId = null;
320
- previewJobStatus = undefined;
321
- previewError = '';
322
- }
323
- catch (e) {
324
- previewError = 'Failed to apply pulled settings: ' + e.message;
325
- }
326
- }
327
- return;
328
- }
329
- // Push mode - send current UI state as JSON
330
- isPushing = true;
331
- pushJobId = null;
332
- pushJobStatus = undefined;
333
- try {
334
- const workspace = $workspaceStore;
335
- if (!workspace)
336
- return;
337
- const payloadObj = {
338
- workspace_id: workspace,
339
- repo_url_resource_path: git_repo_resource_path,
340
- dry_run: false,
341
- pull: isPullMode,
342
- only_wmill_yaml: true,
343
- settings_json: JSON.stringify(getUIState())
344
- };
345
- const jobId = await JobService.runScriptByPath({
346
- workspace,
347
- path: hubPaths.gitInitRepo,
348
- requestBody: payloadObj,
349
- skipPreprocessor: true
350
- });
351
- pushJobId = jobId;
352
- pushJobStatus = 'running';
353
- let jobSuccess = false;
354
- await (await import('../../utils')).tryEvery({
355
- tryCode: async () => {
356
- const testResult = await JobService.getCompletedJob({ workspace, id: jobId });
357
- jobSuccess = !!testResult.success;
358
- },
359
- timeoutCode: async () => {
360
- try {
361
- await JobService.cancelQueuedJob({
362
- workspace,
363
- id: jobId,
364
- requestBody: { reason: 'Push job timed out after 5s' }
365
- });
366
- }
367
- catch (err) { }
368
- },
369
- interval: 500,
370
- timeout: 10000
371
- });
372
- pushJobStatus = jobSuccess ? 'success' : 'failure';
373
- if (jobSuccess) {
374
- // Reset preview state after successful push
375
- previewResult = null;
376
- previewJobId = null;
377
- previewJobStatus = undefined;
378
- previewError = '';
379
- }
380
- }
381
- catch (e) {
382
- pushJobStatus = 'failure';
383
- }
384
- finally {
385
- isPushing = false;
386
- }
387
- }
388
- // Simplified export function for backward compatibility
389
- export function toYaml() {
390
- return generateYamlFromUI();
391
- }
392
- export function setSettings(settings) {
393
- yamlText = settings.yaml;
394
- fromYaml(settings.yaml);
395
- }
396
- $effect(() => {
397
- // Reset preview state when switching modes
398
- if (isPullMode !== undefined) {
399
- previewResult = null;
400
- previewJobId = null;
401
- previewJobStatus = undefined;
402
- pushJobId = null;
403
- pushJobStatus = undefined;
404
- isPreviewLoading = false;
405
- isPushing = false;
406
- previewError = '';
407
- }
408
- });
409
- // Reset preview state when settings change (making preview stale)
410
- $effect(() => {
411
- // Track all the settings that affect the preview
412
- const currentSettings = JSON.stringify({
413
- include_path,
414
- excludes,
415
- extraIncludes,
416
- include_type
417
- });
418
- // If we have an existing preview result and settings have changed from snapshot, clear it
419
- if (previewResult !== null &&
420
- previewSettingsSnapshot !== null &&
421
- currentSettings !== previewSettingsSnapshot) {
422
- previewResult = null;
423
- previewJobId = null;
424
- previewJobStatus = undefined;
425
- previewError = '';
426
- previewSettingsSnapshot = null;
427
- }
428
- });
429
68
  </script>
430
69
 
431
70
  <div class="rounded-lg shadow-sm border p-0 w-full">
@@ -434,18 +73,19 @@ $effect(() => {
434
73
  <div class="flex items-center gap-2">
435
74
  <Filter size={18} class="text-primary" />
436
75
  <span class="font-semibold text-sm">Git Sync filter settings</span>
76
+ {#if isLegacyRepo}
77
+ <Tooltip>
78
+ This repository uses legacy configuration format and inherits settings from workspace-level defaults. Excluded types are filtered out from inherited types. Save to migrate to the new format.
79
+ </Tooltip>
80
+ {:else if !isEditable}
81
+ <Tooltip documentationLink="https://www.windmill.dev/docs/advanced/cli/sync#wmillyaml">
82
+ These settings are controlled by the wmill.yaml file in your git repository. Click "Pull from repo" to check for settings drift and pull settings from repo.
83
+ </Tooltip>
84
+ {/if}
437
85
  </div>
438
86
  <div class="flex items-center gap-2">
439
- {#if !collapsed}
440
- <button
441
- class="text-xs px-2 py-1 rounded border border-gray-300 bg-surface-primary hover:bg-surface-secondary"
442
- onclick={editAsYaml ? switchToUI : switchToYaml}
443
- >
444
- {editAsYaml ? 'Edit in UI' : 'Edit as YAML'}
445
- </button>
446
- {/if}
447
87
  <button
448
- class="text-gray-500 hover:text-primary focus:outline-none"
88
+ class="text-secondary hover:text-primary focus:outline-none"
449
89
  onclick={() => (collapsed = !collapsed)}
450
90
  aria-label="Toggle collapse"
451
91
  >
@@ -484,18 +124,8 @@ $effect(() => {
484
124
  </div>
485
125
  </div>
486
126
  {#if !collapsed}
487
- {#if editAsYaml}
488
- <div class="px-4 py-4">
489
- <textarea
490
- class="w-full h-64 font-mono text-xs border rounded p-2 bg-gray-50 focus:outline-none focus:ring-2 focus:ring-primary"
491
- spellcheck="false"
492
- bind:value={yamlText}
493
- ></textarea>
494
- {#if yamlError}
495
- <div class="text-xs text-red-600 mt-2">{yamlError}</div>
496
- {/if}
497
- </div>
498
- {:else}
127
+ {#if isEditable}
128
+ <!-- Editable mode -->
499
129
  <div class="px-4 py-2">
500
130
  <div class="grid grid-cols-1 md:grid-cols-2 md:gap-32">
501
131
  <div class="flex flex-col gap-2">
@@ -661,124 +291,117 @@ $effect(() => {
661
291
  </div>
662
292
  </div>
663
293
  </div>
664
- <div class="mt-6 flex flex-col gap-2 p-2">
665
- <div class="flex flex-col gap-2 mb-2">
666
- <Toggle
667
- size="sm"
668
- bind:checked={isPullMode}
669
- options={{
670
- left: 'Push',
671
- right: 'Pull'
672
- }}
673
- />
674
- <span class="text-xs text-tertiary">
675
- {isPullMode ? 'Pull settings from Git repository' : 'Push settings to Git repository'}
676
- </span>
294
+ <div class="mt-6 p-2 border-t">
295
+ <div class="text-xs text-tertiary mb-2">
296
+ {isInitialSetup ? 'Configure initial sync settings' : 'Review migration settings'}
677
297
  </div>
678
- <div class="flex gap-2 items-center">
679
- <Button
680
- size="sm"
681
- on:click={previewFiltersToGitRepo}
682
- disabled={isPreviewLoading || isPushing}
683
- startIcon={{
684
- icon: isPreviewLoading ? Loader2 : Eye,
685
- classes: isPreviewLoading ? 'animate-spin' : ''
686
- }}
687
- >
688
- {isPreviewLoading ? 'Previewing...' : 'Preview'}
689
- </Button>
690
- {#if previewResult?.hasChanges && (previewResult?.isInitialSetup || (previewResult?.diff && Object.keys(previewResult.diff).length > 0))}
691
- <Button
692
- size="sm"
693
- on:click={pushFiltersToGitRepo}
694
- disabled={isPushing || isPreviewLoading}
695
- color={isPullMode ? 'dark' : 'red'}
696
- startIcon={{
697
- icon: isPushing ? Loader2 : isPullMode ? Check : Save,
698
- classes: isPushing ? 'animate-spin' : ''
699
- }}
700
- >
701
- {isPushing
702
- ? isPullMode
703
- ? 'Applying...'
704
- : 'Pushing...'
705
- : isPullMode
706
- ? 'Apply'
707
- : 'Push Settings to Git'}
708
- </Button>
709
- {/if}
298
+ </div>
299
+ {:else}
300
+ <!-- Read-only view -->
301
+ <div class="px-4 py-2">
302
+ <div class="grid grid-cols-1 md:grid-cols-2 md:gap-8">
303
+ <div class="flex flex-col gap-3">
304
+ <div>
305
+ <h4 class="font-semibold text-sm mb-1">Include Paths</h4>
306
+ {#if include_path.length > 0}
307
+ <div class="flex flex-wrap gap-1 text-xs">
308
+ {#each include_path as path}
309
+ <span class="bg-surface-secondary text-primary rounded-full px-2 py-1">{path}</span>
310
+ {/each}
311
+ </div>
312
+ {:else}
313
+ <div class="text-tertiary text-xs">No include paths configured</div>
314
+ {/if}
315
+ </div>
316
+
317
+ <div>
318
+ <h4 class="font-semibold text-sm mb-1">Exclude Paths</h4>
319
+ {#if excludes.length > 0}
320
+ <div class="flex flex-wrap gap-1 text-xs">
321
+ {#each excludes as path}
322
+ <span class="bg-red-100 text-red-800 rounded-full px-2 py-1">{path}</span>
323
+ {/each}
324
+ </div>
325
+ {:else}
326
+ <div class="text-tertiary text-xs">No exclude paths configured</div>
327
+ {/if}
328
+ </div>
329
+ </div>
330
+
331
+ <div class="flex flex-col gap-2">
332
+ <h4 class="font-semibold text-sm">Included Types</h4>
333
+ <div class="grid grid-cols-2 gap-x-4 gap-y-1 text-xs">
334
+ {#each Object.entries(typeToggles) as [key, enabled]}
335
+ <div class="flex items-center gap-1">
336
+ <div class={enabled ? 'text-green-600' : 'text-gray-400'}>
337
+ {enabled ? '✓' : '✗'}
338
+ </div>
339
+ <span class={enabled ? 'text-primary' : 'text-tertiary'}>
340
+ {capitalize(key)}
341
+ </span>
342
+ </div>
343
+ {/each}
344
+ </div>
345
+ </div>
710
346
  </div>
711
- {#if previewError}
712
- <div class="text-xs text-red-600 mt-2">{previewError}</div>
713
- {/if}
714
- {#if previewJobId}
715
- <div class="flex items-center gap-2 text-xs text-tertiary mt-1">
716
- {#if previewJobStatus === 'running'}
717
- <Loader2 class="animate-spin" size={14} />
718
- {:else if previewJobStatus === 'success'}
719
- <CheckCircle2 size={14} class="text-green-600" />
720
- {:else if previewJobStatus === 'failure'}
721
- <XCircle size={14} class="text-red-700" />
722
- {/if}
723
- Preview job:
724
- <a
725
- target="_blank"
726
- class="underline"
727
- href={`/run/${previewJobId}?workspace=${$workspaceStore}`}>{previewJobId}</a
728
- >
347
+
348
+ <!-- Actions slot for custom buttons -->
349
+ {#if actions}
350
+ <div class="flex justify-start mt-4">
351
+ {@render actions()}
729
352
  </div>
730
353
  {/if}
731
- {#if previewResult}
732
- <div
733
- class="border rounded p-2 text-xs max-h-40 overflow-y-auto bg-surface-secondary mt-2"
354
+
355
+ <!-- CLI Instructions (collapsible) -->
356
+ <div class="border-t pt-2 mt-4">
357
+ <button
358
+ class="flex items-center gap-2 text-sm text-secondary hover:text-primary transition-colors"
359
+ onclick={() => showCliInstructions = !showCliInstructions}
734
360
  >
735
- <div class="font-semibold text-[11px] mb-1 text-tertiary">Preview of changes:</div>
736
- {#if previewResult.isInitialSetup}
737
- <div class="mt-2 text-green-600">
738
- {previewResult.message || 'wmill.yaml will be created with repository settings'}
739
- </div>
740
- {:else if previewResult.hasChanges && previewResult.diff && Object.keys(previewResult.diff).length > 0}
741
- <div class="mt-2 space-y-1">
742
- {#each Object.entries(previewResult.diff) as [field, change]}
743
- <div class="flex items-start gap-2 text-2xs">
744
- <span class="font-mono text-tertiary min-w-0 flex-shrink-0">{field}:</span>
745
- <div class="min-w-0 flex-1">
746
- {#if Array.isArray(change.from) || Array.isArray(change.to)}
747
- <div class="space-y-0.5">
748
- <div class="text-red-600">- {JSON.stringify(change.from)}</div>
749
- <div class="text-green-600">+ {JSON.stringify(change.to)}</div>
750
- </div>
751
- {:else}
752
- <span class="text-red-600">{JSON.stringify(change.from)}</span>
753
- <span class="text-tertiary"> → </span>
754
- <span class="text-green-600">{JSON.stringify(change.to)}</span>
755
- {/if}
756
- </div>
757
- </div>
758
- {/each}
759
- </div>
361
+ <Terminal size={16} />
362
+ <span>Update settings with CLI</span>
363
+ <Edit3 size={14} class="text-tertiary" />
364
+ {#if showCliInstructions}
365
+ <ChevronUp size={16} />
760
366
  {:else}
761
- <div class="mt-2 text-tertiary">No changes found! The file is up to date.</div>
367
+ <ChevronDown size={16} />
762
368
  {/if}
763
- </div>
764
- {/if}
765
- {#if pushJobId}
766
- <div class="flex items-center gap-2 text-xs text-tertiary mt-1">
767
- {#if pushJobStatus === 'running'}
768
- <Loader2 class="animate-spin" size={14} />
769
- {:else if pushJobStatus === 'success'}
770
- <CheckCircle2 size={14} class="text-green-600" />
771
- {:else if pushJobStatus === 'failure'}
772
- <XCircle size={14} class="text-red-700" />
773
- {/if}
774
- Push job:
775
- <a
776
- target="_blank"
777
- class="underline"
778
- href={`/run/${pushJobId}?workspace=${$workspaceStore}`}>{pushJobId}</a
779
- >
780
- </div>
781
- {/if}
369
+ </button>
370
+
371
+ {#if showCliInstructions}
372
+ <div class="mt-3 bg-surface-secondary rounded-lg p-3">
373
+ <div class="text-xs text-tertiary mb-2">
374
+ These filter settings are sourced from the <code class="bg-surface px-1 py-0.5 rounded">wmill.yaml</code> file in your git repository.
375
+ To modify them, edit the file in your repository, commit the changes, and sync using the commands below. Learn more about <a href="https://www.windmill.dev/docs/advanced/cli/sync#wmillyaml" target="_blank" rel="noopener noreferrer">the wmill.yaml format</a>
376
+ </div>
377
+ <pre class="text-xs bg-surface p-3 rounded overflow-x-auto whitespace-pre-wrap break-all">
378
+ # Make sure your repo is up to date
379
+ git pull
380
+
381
+ # Edit wmill.yaml file
382
+ vim wmill.yaml
383
+
384
+ # Commit changes
385
+ git add wmill.yaml
386
+ git commit
387
+ git push
388
+
389
+ # Push changes to workspace or click the pull settings button above{#if useIndividualBranch}
390
+ wmill gitsync-settings push --workspace {$workspaceStore} --repository {git_repo_resource_path} --promotion main{:else}
391
+ wmill gitsync-settings push --workspace {$workspaceStore} --repository {git_repo_resource_path}{/if}</pre>
392
+ {#if useIndividualBranch}
393
+ <div class="text-xs text-tertiary mt-3">
394
+ <div class="font-medium mb-1">Promotion Mode Configuration:</div>
395
+ <div>You can add promotion-specific overrides in your <code class="bg-surface px-1 py-0.5 rounded">wmill.yaml</code> file:</div>
396
+ <pre class="text-xs bg-surface p-2 rounded mt-2 overflow-x-auto">git_branches:
397
+ main:
398
+ promotionOverrides:
399
+ # Add your promotion-specific settings here</pre>
400
+ </div>
401
+ {/if}
402
+ </div>
403
+ {/if}
404
+ </div>
782
405
  </div>
783
406
  {/if}
784
407
  {/if}