windmill-components 1.352.9 → 1.362.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 (208) hide show
  1. package/package/assets/app.css +8 -45
  2. package/package/components/ApiConnectForm.svelte +1 -0
  3. package/package/components/ArgInput.svelte +5 -1
  4. package/package/components/ChangeInstanceUsername.svelte +20 -12
  5. package/package/components/ContentSearchInner.svelte +359 -0
  6. package/package/components/{ContentSearch.svelte.d.ts → ContentSearchInner.svelte.d.ts} +9 -5
  7. package/package/components/CustomPopover.svelte +73 -0
  8. package/package/components/CustomPopover.svelte.d.ts +29 -0
  9. package/package/components/DateTimeInput.svelte +29 -3
  10. package/package/components/DateTimeInput.svelte.d.ts +4 -0
  11. package/package/components/Dev.svelte +8 -3
  12. package/package/components/DurationMs.svelte +2 -2
  13. package/package/components/FlowBuilder.svelte +122 -24
  14. package/package/components/FlowBuilder.svelte.d.ts +1 -0
  15. package/package/components/FlowGraphViewerStep.svelte +2 -2
  16. package/package/components/FlowJobResult.svelte +5 -3
  17. package/package/components/FlowStatusViewer.svelte +4 -3
  18. package/package/components/FlowStatusViewerInner.svelte +265 -160
  19. package/package/components/FlowStatusViewerInner.svelte.d.ts +15 -2
  20. package/package/components/HighlightTheme.svelte +75 -77
  21. package/package/components/InputTransformForm.svelte +2 -0
  22. package/package/components/JobArgs.svelte +59 -44
  23. package/package/components/JobArgs.svelte.d.ts +2 -0
  24. package/package/components/LightweightArgInput.svelte +27 -2
  25. package/package/components/Path.svelte +3 -8
  26. package/package/components/Popover.svelte +1 -1
  27. package/package/components/ResourceEditor.svelte +3 -2
  28. package/package/components/ResourceEditorDrawer.svelte +4 -1
  29. package/package/components/ResourcePicker.svelte +1 -0
  30. package/package/components/RunChart.svelte +6 -3
  31. package/package/components/RunChart.svelte.d.ts +1 -0
  32. package/package/components/RunForm.svelte +24 -23
  33. package/package/components/RunForm.svelte.d.ts +0 -2
  34. package/package/components/SavedInputs.svelte +50 -39
  35. package/package/components/ScheduleEditorInner.svelte +26 -4
  36. package/package/components/ScriptBuilder.svelte +47 -22
  37. package/package/components/ScriptBuilder.svelte.d.ts +1 -0
  38. package/package/components/SearchItems.svelte +5 -4
  39. package/package/components/Summary.svelte +74 -0
  40. package/package/components/Summary.svelte.d.ts +16 -0
  41. package/package/components/apps/components/display/AppMarkdown.svelte +3 -2
  42. package/package/components/apps/components/display/AppMenu.svelte +2 -2
  43. package/package/components/apps/components/display/AppNavbar.svelte +94 -0
  44. package/package/components/apps/components/display/AppNavbar.svelte.d.ts +24 -0
  45. package/package/components/apps/components/display/AppNavbarItem.svelte +146 -0
  46. package/package/components/apps/components/display/AppNavbarItem.svelte.d.ts +27 -0
  47. package/package/components/apps/components/display/ResolveNavbarItemPath.svelte +21 -0
  48. package/package/components/apps/components/display/ResolveNavbarItemPath.svelte.d.ts +20 -0
  49. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +16 -0
  50. package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte +12 -16
  51. package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte.d.ts +1 -0
  52. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +5 -0
  53. package/package/components/apps/components/display/table/AppAggridTable.svelte +28 -6
  54. package/package/components/apps/components/display/table/AppAggridTableActions.svelte +68 -43
  55. package/package/components/apps/components/inputs/AppDateSelect.svelte +284 -0
  56. package/package/components/apps/components/inputs/AppDateSelect.svelte.d.ts +21 -0
  57. package/package/components/apps/components/inputs/AppDateTimeInput.svelte +2 -0
  58. package/package/components/apps/components/inputs/AppFileInput.svelte +22 -27
  59. package/package/components/apps/components/inputs/AppFileInput.svelte.d.ts +1 -0
  60. package/package/components/apps/components/inputs/AppTextInput.svelte +1 -1
  61. package/package/components/apps/components/layout/AppDecisionTree.svelte +32 -30
  62. package/package/components/apps/components/layout/AppModal.svelte +17 -6
  63. package/package/components/apps/editor/AppDeploymentHistory.svelte +2 -3
  64. package/package/components/apps/editor/AppDeploymentHistory.svelte.d.ts +3 -2
  65. package/package/components/apps/editor/AppEditor.svelte +9 -2
  66. package/package/components/apps/editor/AppEditorHeader.svelte +7 -10
  67. package/package/components/apps/editor/AppPreview.svelte +12 -3
  68. package/package/components/apps/editor/AppPreview.svelte.d.ts +2 -0
  69. package/package/components/apps/editor/DecisionTreeDebug.svelte +92 -68
  70. package/package/components/apps/editor/DeploymentHistory.svelte +0 -2
  71. package/package/components/apps/editor/appUtils.d.ts +1 -0
  72. package/package/components/apps/editor/appUtils.js +17 -0
  73. package/package/components/apps/editor/component/Component.svelte +23 -0
  74. package/package/components/apps/editor/component/components.d.ts +205 -3
  75. package/package/components/apps/editor/component/components.js +160 -1
  76. package/package/components/apps/editor/component/default-codes.js +13 -13
  77. package/package/components/apps/editor/component/sets.js +4 -2
  78. package/package/components/apps/editor/componentsPanel/ComponentList.svelte +12 -12
  79. package/package/components/apps/editor/componentsPanel/cssUtils.js +39 -3
  80. package/package/components/apps/editor/componentsPanel/quickStyleProperties.js +6 -0
  81. package/package/components/apps/editor/contextPanel/ComponentOutput.svelte +2 -2
  82. package/package/components/apps/editor/contextPanel/ContextPanel.svelte +6 -0
  83. package/package/components/apps/editor/contextPanel/components/OutputHeader.svelte +11 -0
  84. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte +4 -0
  85. package/package/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte +21 -8
  86. package/package/components/apps/editor/settingsPanel/ComponentPanel.svelte +64 -20
  87. package/package/components/apps/editor/settingsPanel/ContextVariables.svelte +48 -15
  88. package/package/components/apps/editor/settingsPanel/ContextVariables.svelte.d.ts +1 -0
  89. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphEditor.svelte +25 -5
  90. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphNode.svelte +2 -1
  91. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphNode.svelte.d.ts +1 -0
  92. package/package/components/apps/editor/settingsPanel/DocLink.svelte +33 -0
  93. package/package/components/apps/editor/settingsPanel/DocLink.svelte.d.ts +19 -0
  94. package/package/components/apps/editor/settingsPanel/GridNavbar.svelte +192 -0
  95. package/package/components/apps/editor/settingsPanel/GridNavbar.svelte.d.ts +18 -0
  96. package/package/components/apps/editor/settingsPanel/GridTab.svelte +2 -2
  97. package/package/components/apps/editor/settingsPanel/RefreshDatabaseStudioTable.svelte +17 -0
  98. package/package/components/apps/editor/settingsPanel/RefreshDatabaseStudioTable.svelte.d.ts +16 -0
  99. package/package/components/apps/editor/settingsPanel/TableActions.svelte +81 -38
  100. package/package/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte +12 -5
  101. package/package/components/apps/editor/settingsPanel/inputEditor/IconSelectInput.svelte +11 -12
  102. package/package/components/apps/editor/settingsPanel/inputEditor/IconSelectInput.svelte.d.ts +4 -2
  103. package/package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +4 -1
  104. package/package/components/apps/editor/settingsPanel/secondaryMenu/SecondaryMenu.svelte +7 -1
  105. package/package/components/apps/inputType.d.ts +2 -2
  106. package/package/components/apps/svelte-select/lib/Select.svelte +2 -3
  107. package/package/components/apps/types.d.ts +3 -0
  108. package/package/components/auditLogs/AuditLogsTable.svelte +2 -2
  109. package/package/components/common/CloseButton.svelte +10 -10
  110. package/package/components/common/CloseButton.svelte.d.ts +6 -14
  111. package/package/components/common/calendarPicker/CalendarPicker.svelte +5 -0
  112. package/package/components/common/calendarPicker/CalendarPicker.svelte.d.ts +2 -0
  113. package/package/components/common/confirmationModal/UnsavedConfirmationModal.svelte +7 -1
  114. package/package/components/common/fileInput/FileInput.svelte +2 -0
  115. package/package/components/common/fileInput/FileInput.svelte.d.ts +1 -0
  116. package/package/components/common/popup/Popup.svelte +4 -3
  117. package/package/components/common/popup/Popup.svelte.d.ts +1 -0
  118. package/package/components/common/table/AppRow.svelte +3 -10
  119. package/package/components/common/table/FlowRow.svelte +12 -1
  120. package/package/components/copilot/IteratorGen.svelte +1 -1
  121. package/package/components/copilot/PredicateGen.svelte +1 -1
  122. package/package/components/copilot/StepInputGen.svelte +8 -3
  123. package/package/components/copilot/StepInputsGen.svelte +5 -2
  124. package/package/components/details/WebhooksPanel.svelte +32 -1
  125. package/package/components/details/WebhooksPanel.svelte.d.ts +2 -11
  126. package/package/components/flows/FlowHistory.svelte +208 -0
  127. package/package/components/flows/FlowHistory.svelte.d.ts +21 -0
  128. package/package/components/flows/content/FlowBranchesAllWrapper.svelte +1 -1
  129. package/package/components/flows/content/FlowBranchesOneWrapper.svelte +1 -1
  130. package/package/components/flows/content/FlowEditorPanel.svelte +1 -1
  131. package/package/components/flows/content/FlowLoop.svelte +23 -26
  132. package/package/components/flows/content/FlowModuleComponent.svelte +2 -18
  133. package/package/components/flows/content/FlowModuleEarlyStop.svelte +10 -4
  134. package/package/components/flows/content/FlowModuleHeader.svelte +3 -4
  135. package/package/components/flows/content/FlowModuleScript.svelte +1 -1
  136. package/package/components/flows/content/FlowModuleSleep.svelte +1 -0
  137. package/package/components/flows/content/FlowModuleSuspend.svelte +1 -1
  138. package/package/components/flows/content/SuspendDrawer.svelte +7 -7
  139. package/package/components/flows/flowStateUtils.js +2 -1
  140. package/package/components/flows/flowStore.js +1 -1
  141. package/package/components/flows/header/FlowImportExportMenu.svelte +3 -16
  142. package/package/components/flows/header/FlowImportExportMenu.svelte.d.ts +4 -1
  143. package/package/components/flows/map/FlowJobsMenu.svelte +69 -0
  144. package/package/components/flows/map/FlowJobsMenu.svelte.d.ts +22 -0
  145. package/package/components/flows/map/FlowModuleSchemaItem.svelte +7 -4
  146. package/package/components/flows/map/FlowModuleSchemaItem.svelte.d.ts +1 -0
  147. package/package/components/flows/map/MapItem.svelte +20 -0
  148. package/package/components/flows/map/MapItem.svelte.d.ts +9 -0
  149. package/package/components/flows/map/VirtualItem.svelte +4 -2
  150. package/package/components/flows/map/VirtualItem.svelte.d.ts +1 -0
  151. package/package/components/flows/previousResults.d.ts +9 -0
  152. package/package/components/flows/previousResults.js +42 -8
  153. package/package/components/flows/propPicker/PropPickerWrapper.svelte +2 -0
  154. package/package/components/flows/propPicker/PropPickerWrapper.svelte.d.ts +1 -0
  155. package/package/components/flows/types.d.ts +1 -1
  156. package/package/components/graph/FlowGraph.svelte +80 -42
  157. package/package/components/graph/FlowGraph.svelte.d.ts +1 -0
  158. package/package/components/graph/model.d.ts +6 -1
  159. package/package/components/graph/svelvet/container/controllers/middleware.js +4 -4
  160. package/package/components/graph/svelvet/container/views/GraphView.svelte +2 -0
  161. package/package/components/graph/svelvet/edges/views/Edges/EdgeText.svelte +24 -25
  162. package/package/components/graph/util.d.ts +1 -1
  163. package/package/components/graph/util.js +1 -2
  164. package/package/components/home/ItemsList.svelte +22 -19
  165. package/package/components/jobs/JobPreview.svelte +11 -2
  166. package/package/components/propertyPicker/PropPicker.svelte +30 -0
  167. package/package/components/propertyPicker/PropPickerResult.svelte +14 -1
  168. package/package/components/propertyPicker/PropPickerResult.svelte.d.ts +1 -0
  169. package/package/components/runs/JobLoader.svelte +21 -8
  170. package/package/components/runs/JobLoader.svelte.d.ts +2 -0
  171. package/package/components/runs/JobPreview.svelte +5 -1
  172. package/package/components/runs/RunRow.svelte +12 -8
  173. package/package/components/runs/RunsFilter.svelte +2 -4
  174. package/package/components/runs/RunsFilter.svelte.d.ts +0 -1
  175. package/package/components/runs/RunsTable.svelte +63 -29
  176. package/package/components/runs/RunsTable.svelte.d.ts +1 -0
  177. package/package/components/schema/EditableSchemaWrapper.svelte +9 -1
  178. package/package/components/schema/PropertyEditor.svelte +1 -1
  179. package/package/components/search/GlobalSearchModal.svelte +559 -0
  180. package/package/components/search/GlobalSearchModal.svelte.d.ts +17 -0
  181. package/package/components/search/QuickMenuItem.svelte +76 -0
  182. package/package/components/search/QuickMenuItem.svelte.d.ts +27 -0
  183. package/package/components/sidebar/MenuButton.svelte +11 -0
  184. package/package/components/sidebar/MenuButton.svelte.d.ts +4 -0
  185. package/package/components/sidebar/changelogs.js +35 -0
  186. package/package/components/wizards/AppPicker.svelte +68 -0
  187. package/package/components/wizards/AppPicker.svelte.d.ts +17 -0
  188. package/package/components/wizards/NavbarWizard.svelte +131 -0
  189. package/package/components/wizards/NavbarWizard.svelte.d.ts +19 -0
  190. package/package/defaults.d.ts +1 -1
  191. package/package/defaults.js +1 -1
  192. package/package/es6.d.ts.txt +370 -1
  193. package/package/gen/core/OpenAPI.js +1 -1
  194. package/package/gen/schemas.gen.d.ts +42 -3
  195. package/package/gen/schemas.gen.js +42 -3
  196. package/package/gen/services.gen.d.ts +80 -5
  197. package/package/gen/services.gen.js +149 -8
  198. package/package/gen/types.gen.d.ts +265 -11
  199. package/package/inferArgSig.js +4 -0
  200. package/package/script_helpers.d.ts +3 -3
  201. package/package/script_helpers.js +46 -22
  202. package/package/stores.d.ts +1 -1
  203. package/package/stores.js +1 -1
  204. package/package/utils.d.ts +7 -23
  205. package/package/utils.js +54 -33
  206. package/package/windmill_fetch.d.ts.txt +6 -6
  207. package/package.json +3 -11
  208. package/package/components/ContentSearch.svelte +0 -355
@@ -0,0 +1,559 @@
1
+ <script>import { onDestroy, onMount, tick } from 'svelte';
2
+ import { AppService, FlowService, IndexSearchService, RawAppService, ScriptService } from '../../gen';
3
+ import { clickOutside, displayDateOnly, isMac, sendUserToast } from '../../utils';
4
+ import TimeAgo from '../TimeAgo.svelte';
5
+ import { BoxesIcon, CalendarIcon, Code2Icon, DollarSignIcon, HomeIcon, LayoutDashboardIcon, Loader2, PlayIcon, Search, SearchCode } from 'lucide-svelte';
6
+ import JobPreview from '../runs/JobPreview.svelte';
7
+ import Portal from 'svelte-portal';
8
+ import { twMerge } from 'tailwind-merge';
9
+ import ContentSearchInner from '../ContentSearchInner.svelte';
10
+ import { goto } from '$app/navigation';
11
+ import QuickMenuItem from '../search/QuickMenuItem.svelte';
12
+ import { enterpriseLicense, workspaceStore } from '../../stores';
13
+ import uFuzzy from '@leeoniya/ufuzzy';
14
+ import BarsStaggered from '../icons/BarsStaggered.svelte';
15
+ import { scroll_into_view_if_needed_polyfill } from '../multiselect/utils';
16
+ import { Alert } from '../common';
17
+ let open = false;
18
+ let searchTerm = '';
19
+ let textInput;
20
+ let selectedWorkspace = undefined;
21
+ let contentSearch = undefined;
22
+ const RUNS_PREFIX = '>';
23
+ const LOGS_PREFIX = '!';
24
+ const CONTENT_SEARCH_PREFIX = '#';
25
+ const SWITCH_MODE_PREFIX = '?';
26
+ let tab = 'default';
27
+ let switchModeItems = [
28
+ {
29
+ search_id: 'switchto:run-search',
30
+ label: 'Search across completed runs',
31
+ action: () => switchMode('runs'),
32
+ shortcutKey: RUNS_PREFIX,
33
+ icon: Search
34
+ },
35
+ {
36
+ search_id: 'switchto:content-search',
37
+ label: 'Search scripts/flows/apps based on content',
38
+ action: () => switchMode('content'),
39
+ shortcutKey: CONTENT_SEARCH_PREFIX,
40
+ icon: SearchCode
41
+ },
42
+ {
43
+ search_id: 'switchto:log-search',
44
+ label: 'Search windmill logs',
45
+ action: () => switchMode('logs'),
46
+ shortcutKey: LOGS_PREFIX,
47
+ icon: Search
48
+ }
49
+ ];
50
+ let defaultMenuItems = [
51
+ { search_id: 'nav:home', label: 'Go to Home', action: () => gotoPage('/'), icon: HomeIcon },
52
+ { search_id: 'nav:runs', label: 'Go to Runs', action: () => gotoPage('/runs'), icon: PlayIcon },
53
+ {
54
+ search_id: 'nav:variables',
55
+ label: 'Go to Variables',
56
+ action: () => gotoPage('/variables'),
57
+ icon: DollarSignIcon
58
+ },
59
+ {
60
+ search_id: 'nav:resources',
61
+ label: 'Go to Resources',
62
+ action: () => gotoPage('/resources'),
63
+ icon: BoxesIcon
64
+ },
65
+ {
66
+ search_id: 'nav:schedules',
67
+ label: 'Go to Schedules',
68
+ action: () => gotoPage('/schedules'),
69
+ icon: CalendarIcon
70
+ },
71
+ ...switchModeItems
72
+ ];
73
+ let itemMap = {
74
+ default: defaultMenuItems,
75
+ 'switch-mode': switchModeItems,
76
+ runs: [],
77
+ content: [],
78
+ logs: []
79
+ };
80
+ $: tab === 'content' && contentSearch?.open();
81
+ async function switchPrompt(tab) {
82
+ if (tab === 'default') {
83
+ searchTerm = '';
84
+ }
85
+ if (tab === 'runs') {
86
+ searchTerm = RUNS_PREFIX;
87
+ }
88
+ if (tab === 'content') {
89
+ searchTerm = CONTENT_SEARCH_PREFIX;
90
+ }
91
+ if (tab === 'switch-mode') {
92
+ searchTerm = SWITCH_MODE_PREFIX;
93
+ }
94
+ if (tab === 'logs') {
95
+ searchTerm = LOGS_PREFIX;
96
+ }
97
+ selectedItem = selectItem(0);
98
+ textInput.focus();
99
+ }
100
+ function removePrefix(str, prefix) {
101
+ if (str.startsWith(prefix)) {
102
+ return str.substring(prefix.length);
103
+ }
104
+ return str;
105
+ }
106
+ let opts = {};
107
+ let uf = new uFuzzy(opts);
108
+ let defaultMenuItemLabels = defaultMenuItems.map((item) => item.label);
109
+ let switchModeItemLabels = switchModeItems.map((item) => item.label);
110
+ function fuzzyFilter(filter, items, itemsPlainText) {
111
+ if (filter === '') {
112
+ return items;
113
+ }
114
+ let idxs = uf.filter(itemsPlainText, filter) ?? [];
115
+ let info;
116
+ // parts is undefined error happens when filter is similar
117
+ // to `.>!` (string with no letters but some symbols)
118
+ try {
119
+ info = uf.info(idxs, itemsPlainText, filter);
120
+ }
121
+ catch (e) {
122
+ return items;
123
+ }
124
+ let order = uf.sort(info, itemsPlainText, filter);
125
+ let r = [];
126
+ for (let o of order) {
127
+ r.push(items[info.idx[o]]);
128
+ }
129
+ return r;
130
+ }
131
+ let debounceTimeout = undefined;
132
+ const debouncePeriod = 1000;
133
+ let loadingCompletedRuns = false;
134
+ async function handleSearch() {
135
+ if (tab !== 'default' &&
136
+ (searchTerm === '' ||
137
+ ![RUNS_PREFIX, LOGS_PREFIX, CONTENT_SEARCH_PREFIX, SWITCH_MODE_PREFIX].includes(searchTerm[0]))) {
138
+ _switchMode('default');
139
+ }
140
+ if (tab != 'switch-mode' && searchTerm.length > 0 && searchTerm[0] === SWITCH_MODE_PREFIX) {
141
+ _switchMode('switch-mode');
142
+ }
143
+ if (tab != 'logs' && searchTerm.length > 0 && searchTerm[0] === LOGS_PREFIX) {
144
+ _switchMode('logs');
145
+ }
146
+ if (tab != 'runs' && searchTerm.length > 0 && searchTerm[0] === RUNS_PREFIX) {
147
+ _switchMode('runs');
148
+ }
149
+ if (tab != 'content' && searchTerm.length > 0 && searchTerm[0] === CONTENT_SEARCH_PREFIX) {
150
+ _switchMode('content');
151
+ }
152
+ if (tab === 'default') {
153
+ itemMap['default'] = fuzzyFilter(searchTerm, defaultMenuItems, defaultMenuItemLabels);
154
+ if (combinedItems) {
155
+ itemMap['default'] = itemMap['default'].concat(fuzzyFilter(searchTerm, combinedItems, combinedItems.map((i) => `${i.path} ${i.summary}`)));
156
+ }
157
+ }
158
+ if (tab === 'switch-mode') {
159
+ itemMap['switch-mode'] = fuzzyFilter(removePrefix(searchTerm, SWITCH_MODE_PREFIX), switchModeItems, switchModeItemLabels);
160
+ }
161
+ if (tab === 'runs') {
162
+ const s = removePrefix(searchTerm, RUNS_PREFIX);
163
+ clearTimeout(debounceTimeout);
164
+ loadingCompletedRuns = true;
165
+ debounceTimeout = setTimeout(async () => {
166
+ clearTimeout(debounceTimeout);
167
+ let searchResults;
168
+ try {
169
+ searchResults = await IndexSearchService.searchJobsIndex({
170
+ searchQuery: s,
171
+ workspace: $workspaceStore
172
+ });
173
+ itemMap['runs'] = searchResults.hits;
174
+ }
175
+ catch (e) {
176
+ sendUserToast(e, true);
177
+ }
178
+ loadingCompletedRuns = false;
179
+ selectedItem = selectItem(0);
180
+ }, debouncePeriod);
181
+ }
182
+ selectedItem = selectItem(0);
183
+ }
184
+ function selectItem(index) {
185
+ if (!itemMap[tab] || itemMap[tab].length <= index) {
186
+ return undefined;
187
+ }
188
+ onHover(itemMap[tab][index]);
189
+ return itemMap[tab][index];
190
+ }
191
+ let selectedItem;
192
+ async function handleKeydown(event) {
193
+ if ((!isMac() ? event.ctrlKey : event.metaKey) && event.key === 'k') {
194
+ event.preventDefault();
195
+ await openModal();
196
+ }
197
+ if (open) {
198
+ if (event.key === 'Escape') {
199
+ event.preventDefault();
200
+ if (searchTerm.length != 0 || tab != 'default') {
201
+ switchMode('default');
202
+ textInput?.focus();
203
+ }
204
+ else {
205
+ open = false;
206
+ }
207
+ }
208
+ if (event.key === 'ArrowDown') {
209
+ event.preventDefault();
210
+ let idx = itemMap[tab].indexOf(selectedItem);
211
+ if (idx != -1) {
212
+ idx = (idx + 1) % itemMap[tab].length;
213
+ selectedItem = selectItem(idx);
214
+ let el = document.getElementById(selectedItem.search_id);
215
+ if (el)
216
+ scroll_into_view_if_needed_polyfill(el, false);
217
+ }
218
+ }
219
+ else if (event.key === 'ArrowUp') {
220
+ event.preventDefault();
221
+ let idx = itemMap[tab].indexOf(selectedItem);
222
+ if (idx != -1) {
223
+ idx = (idx - 1 + itemMap[tab].length) % itemMap[tab].length;
224
+ selectedItem = selectItem(idx);
225
+ let el = document.getElementById(selectedItem.search_id);
226
+ if (el)
227
+ scroll_into_view_if_needed_polyfill(el, false);
228
+ }
229
+ }
230
+ }
231
+ }
232
+ //internal, should not be called outside of the handleSearch function
233
+ function _switchMode(mode) {
234
+ selectedItem = undefined;
235
+ tab = mode;
236
+ }
237
+ // Used by callbacks, call this to change the mode
238
+ function switchMode(mode) {
239
+ switchPrompt(mode);
240
+ textInput.focus();
241
+ }
242
+ function gotoWindmillItemPage(e) {
243
+ let path;
244
+ switch (e.type) {
245
+ case 'flow':
246
+ path = `/flows/get/${e.path}`;
247
+ break;
248
+ case 'script':
249
+ path = `/scripts/get/${e.path}`;
250
+ break;
251
+ case 'app':
252
+ path = `/apps/get/${e.path}`;
253
+ break;
254
+ case 'raw_app':
255
+ path = `/raw_apps/get/${e.path}`;
256
+ break;
257
+ default:
258
+ path = '/';
259
+ }
260
+ gotoPage(path);
261
+ }
262
+ function gotoPage(path) {
263
+ open = false;
264
+ searchTerm = '';
265
+ goto(path);
266
+ }
267
+ onMount(() => {
268
+ window.addEventListener('keydown', handleKeydown);
269
+ });
270
+ onDestroy(() => {
271
+ window.removeEventListener('keydown', handleKeydown);
272
+ });
273
+ $: searchTerm, handleSearch();
274
+ function placeholderFromPrefix(text) {
275
+ switch (text) {
276
+ case '':
277
+ return ' Search or type `?` for search options';
278
+ case RUNS_PREFIX:
279
+ return ' Search across completed runs';
280
+ case LOGS_PREFIX:
281
+ return ' Search across completed runs';
282
+ case CONTENT_SEARCH_PREFIX:
283
+ return ' Search flows/scripts/apps by content';
284
+ default:
285
+ return '';
286
+ }
287
+ }
288
+ let combinedItems = undefined;
289
+ async function fetchCombinedItems() {
290
+ const scripts = await ScriptService.listScripts({
291
+ workspace: $workspaceStore
292
+ });
293
+ const flows = await FlowService.listFlows({
294
+ workspace: $workspaceStore
295
+ });
296
+ const apps = await AppService.listApps({ workspace: $workspaceStore });
297
+ const raw_apps = await RawAppService.listRawApps({ workspace: $workspaceStore });
298
+ let combinedItems = [
299
+ ...flows.map((x) => ({
300
+ ...x,
301
+ type: 'flow',
302
+ time: new Date(x.edited_at).getTime(),
303
+ search_id: x.path
304
+ })),
305
+ ...scripts.map((x) => ({
306
+ ...x,
307
+ type: 'script',
308
+ time: new Date(x.created_at).getTime(),
309
+ search_id: x.path
310
+ })),
311
+ ...apps.map((x) => ({
312
+ ...x,
313
+ type: 'app',
314
+ time: new Date(x.edited_at).getTime(),
315
+ search_id: x.path
316
+ })),
317
+ ...raw_apps.map((x) => ({
318
+ ...x,
319
+ type: 'raw_app',
320
+ time: new Date(x.edited_at).getTime(),
321
+ search_id: x.path
322
+ }))
323
+ ].sort((a, b) => (a.starred != b.starred ? (a.starred ? -1 : 1) : a.time - b.time > 0 ? -1 : 1));
324
+ return combinedItems;
325
+ }
326
+ function iconForWindmillItem(type) {
327
+ switch (type) {
328
+ case 'flow':
329
+ return BarsStaggered;
330
+ case 'script':
331
+ return Code2Icon;
332
+ case 'app':
333
+ return LayoutDashboardIcon;
334
+ case 'raw_app':
335
+ return LayoutDashboardIcon;
336
+ }
337
+ }
338
+ function onHover(selectedItem) {
339
+ if (tab === 'runs') {
340
+ selectedWorkspace = selectedItem?.document?.workspace_id[0];
341
+ }
342
+ }
343
+ export async function openSearchWithPrefilledText(text) {
344
+ await openModal();
345
+ searchTerm = text ?? searchTerm;
346
+ await handleSearch();
347
+ }
348
+ async function openModal() {
349
+ open = !open;
350
+ await tick();
351
+ if (open) {
352
+ if (combinedItems == undefined) {
353
+ combinedItems = await fetchCombinedItems();
354
+ handleSearch();
355
+ }
356
+ selectedItem = selectItem(0);
357
+ textInput.focus();
358
+ textInput.select();
359
+ }
360
+ }
361
+ </script>
362
+
363
+ {#if open}
364
+ <Portal>
365
+ <div
366
+ class={twMerge(
367
+ `fixed top-0 bottom-0 left-0 right-0 transition-all duration-50`,
368
+ ' bg-black bg-opacity-40',
369
+ 'z-[1100]'
370
+ )}
371
+ >
372
+ <div
373
+ class={'max-w-4xl lg:mx-auto mx-10 mt-40 bg-surface rounded-lg relative'}
374
+ use:clickOutside={false}
375
+ on:click_outside={() => {
376
+ open = false
377
+ }}
378
+ >
379
+ <div class="py-2 items-center">
380
+ <div class="px-4 flex flex-row gap-1 items-center pb-1 mb-2 border-b">
381
+ <Search />
382
+ <div class="relative inline-block w-full">
383
+ <input
384
+ id="quickSearchInput"
385
+ bind:this={textInput}
386
+ type="text"
387
+ class="quick-search-input"
388
+ bind:value={searchTerm}
389
+ />
390
+ <label
391
+ for="quickSearchInput"
392
+ class="absolute top-1/2 left-2 transform -translate-y-1/2 pointer-events-none text-gray-400 transition-all duration-200 whitespace-pre"
393
+ >{placeholderFromPrefix(searchTerm)}</label
394
+ >
395
+ </div>
396
+ </div>
397
+ <div class="px-4 overflow-scroll max-h-[30rem]">
398
+ {#if tab === 'default' || tab === 'switch-mode'}
399
+ {#each (itemMap[tab] ?? []).filter((e) => defaultMenuItems.includes(e)) as el}
400
+ <QuickMenuItem
401
+ on:select={el?.action}
402
+ on:hover={() => (selectedItem = el)}
403
+ id={el?.search_id}
404
+ hovered={el?.search_id === selectedItem?.search_id}
405
+ label={el?.label}
406
+ icon={el?.icon}
407
+ shortcutKey={el?.shortcutKey}
408
+ />
409
+ {/each}
410
+ {/if}
411
+ {#if tab === 'default'}
412
+ {#if (itemMap[tab] ?? []).filter((e) => (combinedItems ?? []).includes(e)).length > 0}
413
+ <div class="mt-2 pt-2 pb-1 px-1 text-xs text-sm font-bold border-t text-tertiary"
414
+ >Flows/Scripts/Apps</div
415
+ >
416
+ {/if}
417
+ {#each (itemMap[tab] ?? []).filter((e) => (combinedItems ?? []).includes(e)) as el}
418
+ <QuickMenuItem
419
+ on:select={() => gotoWindmillItemPage(el)}
420
+ on:hover={() => (selectedItem = el)}
421
+ id={el?.search_id}
422
+ hovered={el?.path === selectedItem?.path}
423
+ label={(el.summary ? `${el.summary} - ` : '') +
424
+ el.path +
425
+ (el.starred ? ' ★' : '')}
426
+ icon={iconForWindmillItem(el.type)}
427
+ />
428
+ {/each}
429
+ {#if (itemMap[tab] ?? []).length === 0}
430
+ <div class="flex w-full justify-center items-center h-48">
431
+ <div class="text-tertiary text-center">
432
+ <div class="text-2xl font-bold">Nothing found</div>
433
+ <div class="text-sm">Tip: press `esc` to quickly clear the search bar</div>
434
+ </div>
435
+ </div>
436
+ {/if}
437
+ {:else if tab === 'content'}
438
+ <ContentSearchInner
439
+ classNameInner="max-h-[20rem]"
440
+ search={removePrefix(searchTerm, '#')}
441
+ bind:this={contentSearch}
442
+ />
443
+ {:else if tab === 'logs'}
444
+ <div class="p-2">
445
+ <Alert title="Service log search is coming soon" type="info">
446
+ Full text search on windmill's service logs is coming soon
447
+ </Alert>
448
+ </div>
449
+ {:else if tab === 'runs'}
450
+ <div class="flex h-96">
451
+ {#if loadingCompletedRuns}
452
+ <div class="flex w-full justify-center items-center h-48">
453
+ <div class="text-tertiary text-center">
454
+ <Loader2 size={34} class="animate-spin" />
455
+ </div>
456
+ </div>
457
+ {:else if itemMap['runs'] && itemMap['runs'].length > 0}
458
+ <div class="w-5/12 overflow-scroll">
459
+ {#each itemMap['runs'] ?? [] as r}
460
+ <QuickMenuItem
461
+ on:hover={() => {
462
+ selectedItem = r
463
+ selectedWorkspace = r?.document.workspace_id[0]
464
+ }}
465
+ on:select={() => {
466
+ open = false
467
+ goto(`/run/${r?.document.id[0]}`)
468
+ }}
469
+ id={r?.document.id[0]}
470
+ hovered={selectedItem && r?.document.id[0] === selectedItem?.document.id[0]}
471
+ icon={r?.icon}
472
+ >
473
+ <svelte:fragment slot="itemReplacement">
474
+ <button
475
+ class={twMerge(
476
+ `w-full flex items-center justify-between gap-1 py-2 px-2 text-left border rounded-sm transition-a`,
477
+ r?.document.id === selectedItem?.document?.id
478
+ ? 'bg-surface-hover'
479
+ : ''
480
+ )}
481
+ on:click={() => {}}
482
+ >
483
+ <div
484
+ class="w-full h-full items-center text-xs font-normal grid grid-cols-10 gap-0 min-w-0"
485
+ >
486
+ <div class="col-span-1">
487
+ <div
488
+ class="rounded-full w-2 h-2 {r?.document.success[0]
489
+ ? 'bg-green-400'
490
+ : 'bg-red-400'}"
491
+ />
492
+ </div>
493
+ <div class="col-span-5">
494
+ {r?.document.script_path}
495
+ </div>
496
+ <div
497
+ class="whitespace-nowrap col-span-2 !text-tertiary !text-2xs overflow-hidden text-ellipsis flex-shrink text-center"
498
+ >
499
+ {displayDateOnly(new Date(r?.document.created_at[0]))}
500
+ </div>
501
+ <div
502
+ class="whitespace-nowrap col-span-2 !text-tertiary !text-2xs overflow-hidden text-ellipsis flex-shrink text-center"
503
+ >
504
+ <TimeAgo date={r?.document.created_at[0] ?? ''} />
505
+ </div>
506
+ </div>
507
+ </button>
508
+ </svelte:fragment>
509
+ </QuickMenuItem>
510
+ {/each}
511
+ </div>
512
+ {#if selectedItem === undefined}
513
+ select a result to preview
514
+ {:else}
515
+ <div class="w-7/12 overflow-y-scroll">
516
+ <JobPreview
517
+ id={selectedItem?.document?.id[0]}
518
+ workspace={selectedWorkspace}
519
+ />
520
+ </div>
521
+ {/if}
522
+ {:else}
523
+ <div class="flex w-full justify-center items-center h-96">
524
+ <div class="text-tertiary text-center">
525
+ <div class="text-2xl font-bold">No runs found</div>
526
+ <div class="text-sm">There were no completed runs that match your query</div>
527
+ <div class="text-sm"
528
+ >Note that new runs might take a while to become searchable (by default
529
+ ~5min)</div
530
+ >
531
+ {#if !$enterpriseLicense}
532
+ <div class="py-6" />
533
+
534
+ <Alert title="This is an EE feature" type="warning">
535
+ Full-text search on jobs is only available on EE.
536
+ </Alert>
537
+ {/if}
538
+ </div>
539
+ </div>
540
+ {/if}
541
+ </div>
542
+ {/if}
543
+ </div>
544
+ </div>
545
+ </div>
546
+ </div>
547
+ </Portal>
548
+ {/if}
549
+
550
+ <style>
551
+ .quick-search-input {
552
+ outline: none;
553
+ border: none !important;
554
+ box-shadow: none !important;
555
+ }
556
+
557
+ .quick-search-input:focus-visible {
558
+ outline: none !important;
559
+ }</style>
@@ -0,0 +1,17 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ openSearchWithPrefilledText?: ((text?: string) => Promise<void>) | undefined;
5
+ };
6
+ events: {
7
+ [evt: string]: CustomEvent<any>;
8
+ };
9
+ slots: {};
10
+ };
11
+ export type GlobalSearchModalProps = typeof __propDef.props;
12
+ export type GlobalSearchModalEvents = typeof __propDef.events;
13
+ export type GlobalSearchModalSlots = typeof __propDef.slots;
14
+ export default class GlobalSearchModal extends SvelteComponent<GlobalSearchModalProps, GlobalSearchModalEvents, GlobalSearchModalSlots> {
15
+ get openSearchWithPrefilledText(): (text?: string | undefined) => Promise<void>;
16
+ }
17
+ export {};
@@ -0,0 +1,76 @@
1
+ <script>import { isMac } from '../../utils';
2
+ import { createEventDispatcher, onDestroy, onMount } from 'svelte';
3
+ import { twMerge } from 'tailwind-merge';
4
+ export let hovered = false;
5
+ export let id;
6
+ export let label = '';
7
+ export let icon = undefined;
8
+ export let shortcutKey = undefined;
9
+ const dispatch = createEventDispatcher();
10
+ onMount(() => {
11
+ window.addEventListener('keydown', handleKeydown);
12
+ });
13
+ onDestroy(() => {
14
+ window.removeEventListener('keydown', handleKeydown);
15
+ });
16
+ async function handleKeydown(event) {
17
+ if (hovered && event.key === 'Enter') {
18
+ event.preventDefault();
19
+ runAction();
20
+ }
21
+ }
22
+ function runAction() {
23
+ dispatch('select');
24
+ }
25
+ export let kbdClass = '';
26
+ export let small = true;
27
+ if (small) {
28
+ kbdClass = twMerge(kbdClass, '!text-[10px] px-1', false && isMac() ? '!text-lg ' : 'text-xs', 'leading-none');
29
+ }
30
+ else {
31
+ kbdClass += ' !text-xs px-1.5';
32
+ }
33
+ </script>
34
+
35
+ <div
36
+ {id}
37
+ on:click|stopPropagation={runAction}
38
+ on:mouseenter={() => dispatch('hover')}
39
+ class={`rounded-md w-full ${hovered ? 'bg-surface-hover' : ''}`}
40
+ >
41
+ {#if $$slots.itemReplacement}
42
+ <slot name="itemReplacement" />
43
+ {:else}
44
+ <div class="flex flex-row gap-2 items-center px-1 py-0.5 rounded-md pr-6 font-light">
45
+ <div class="w-4">
46
+ {#if icon}
47
+ <svelte:component this={icon} size={14} />
48
+ {:else if shortcutKey != undefined}
49
+ <div class="font-bold flex items-center justify-center w-full">
50
+ <span
51
+ class="h-4 center-center ml-0.5 rounded border bg-surface-secondary text-primary shadow-sm font-light transition-all group-hover:border-primary-500 group-hover:text-primary-inverse"
52
+ >
53
+ <kbd class={kbdClass}>
54
+ {shortcutKey}
55
+ </kbd>
56
+ </span>
57
+ </div>
58
+ {/if}
59
+ </div>
60
+ {label}
61
+ {#if shortcutKey != undefined}
62
+ <div class="ml-auto">
63
+ <div class="font-bold flex items-center justify-center w-full">
64
+ <span
65
+ class="flex h-4 center-center ml-0.5 rounded border bg-surface-secondary text-primary shadow-sm font-light transition-all group-hover:border-primary-500 group-hover:text-primary-inverse"
66
+ >
67
+ <kbd class={kbdClass}>
68
+ {shortcutKey}
69
+ </kbd>
70
+ </span>
71
+ </div>
72
+ </div>
73
+ {/if}
74
+ </div>
75
+ {/if}
76
+ </div>
@@ -0,0 +1,27 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ hovered?: boolean | undefined;
5
+ id: string;
6
+ label?: string | undefined;
7
+ icon?: any;
8
+ shortcutKey?: string | undefined;
9
+ kbdClass?: string | undefined;
10
+ small?: boolean | undefined;
11
+ };
12
+ events: {
13
+ hover: CustomEvent<any>;
14
+ select: CustomEvent<any>;
15
+ } & {
16
+ [evt: string]: CustomEvent<any>;
17
+ };
18
+ slots: {
19
+ itemReplacement: {};
20
+ };
21
+ };
22
+ export type QuickMenuItemProps = typeof __propDef.props;
23
+ export type QuickMenuItemEvents = typeof __propDef.events;
24
+ export type QuickMenuItemSlots = typeof __propDef.slots;
25
+ export default class QuickMenuItem extends SvelteComponent<QuickMenuItemProps, QuickMenuItemEvents, QuickMenuItemSlots> {
26
+ }
27
+ export {};