windmill-components 1.383.8 → 1.389.1

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 (195) hide show
  1. package/package/assets/app.css +25 -1
  2. package/package/components/ArgInput.svelte +2 -1
  3. package/package/components/ChangeInstanceUsername.svelte +9 -108
  4. package/package/components/ChangeInstanceUsernameInner.svelte +112 -0
  5. package/package/components/ChangeInstanceUsernameInner.svelte.d.ts +21 -0
  6. package/package/components/DiffDrawer.svelte +27 -20
  7. package/package/components/DiffEditor.svelte +13 -1
  8. package/package/components/DisplayResult.svelte +39 -9
  9. package/package/components/DropdownV2.svelte +4 -26
  10. package/package/components/DropdownV2.svelte.d.ts +9 -1
  11. package/package/components/DropdownV2Inner.svelte +42 -0
  12. package/package/components/DropdownV2Inner.svelte.d.ts +40 -0
  13. package/package/components/Editor.svelte +142 -128
  14. package/package/components/Editor.svelte.d.ts +5 -4
  15. package/package/components/EditorBar.svelte +9 -11
  16. package/package/components/EditorSettings.svelte +44 -0
  17. package/package/components/EditorSettings.svelte.d.ts +17 -0
  18. package/package/components/EditorTheme.svelte +1 -1
  19. package/package/components/ErrorOrRecoveryHandler.svelte +27 -20
  20. package/package/components/FlowBuilder.svelte +17 -3
  21. package/package/components/FlowBuilder.svelte.d.ts +3 -0
  22. package/package/components/FlowGraphViewerStep.svelte +1 -1
  23. package/package/components/FlowStatusViewer.svelte +3 -1
  24. package/package/components/FlowStatusViewer.svelte.d.ts +1 -0
  25. package/package/components/FlowStatusViewerInner.svelte +5 -2
  26. package/package/components/FlowViewerInner.svelte +3 -7
  27. package/package/components/FormatOnSave.svelte +12 -29
  28. package/package/components/GraphqlSchemaViewer.svelte +1 -1
  29. package/package/components/GraphqlSchemaViewer.svelte.d.ts +1 -1
  30. package/package/components/HighlightCode.svelte +3 -0
  31. package/package/components/InstanceNameEditor.svelte +64 -0
  32. package/package/components/InstanceNameEditor.svelte.d.ts +23 -0
  33. package/package/components/LightweightArgInput.svelte +6 -11
  34. package/package/components/LogViewer.svelte +37 -29
  35. package/package/components/LogViewer.svelte.d.ts +2 -0
  36. package/package/components/ObjectResourceInput.svelte +1 -1
  37. package/package/components/ObjectResourceInput.svelte.d.ts +1 -0
  38. package/package/components/Path.svelte +3 -3
  39. package/package/components/QueueMetricsDrawer.svelte +6 -218
  40. package/package/components/QueueMetricsDrawer.svelte.d.ts +2 -3
  41. package/package/components/QueueMetricsDrawerInner.svelte +211 -0
  42. package/package/components/QueueMetricsDrawerInner.svelte.d.ts +15 -0
  43. package/package/components/ResourceEditorDrawer.svelte +14 -11
  44. package/package/components/ResourceEditorDrawer.svelte.d.ts +1 -1
  45. package/package/components/ResultJobLoader.svelte.d.ts +1 -1
  46. package/package/components/S3FilePicker.svelte +20 -8
  47. package/package/components/ScheduleEditorInner.svelte +497 -469
  48. package/package/components/ScriptBuilder.svelte +12 -1
  49. package/package/components/ScriptBuilder.svelte.d.ts +3 -0
  50. package/package/components/ScriptEditor.svelte +2 -0
  51. package/package/components/ScriptEditor.svelte.d.ts +2 -1
  52. package/package/components/ServiceLogsInner.svelte +511 -0
  53. package/package/components/ServiceLogsInner.svelte.d.ts +20 -0
  54. package/package/components/SimpleEditor.svelte +75 -37
  55. package/package/components/SimpleEditor.svelte.d.ts +9 -3
  56. package/package/components/Summary.svelte +33 -31
  57. package/package/components/Summary.svelte.d.ts +1 -0
  58. package/package/components/SuperadminSettings.svelte +28 -10
  59. package/package/components/TemplateEditor.svelte +1 -1
  60. package/package/components/TestJobLoader.svelte.d.ts +1 -1
  61. package/package/components/VimMode.svelte +16 -0
  62. package/package/components/VimMode.svelte.d.ts +14 -0
  63. package/package/components/WorkerTagPicker.svelte +4 -1
  64. package/package/components/WorkspaceGroup.svelte +139 -68
  65. package/package/components/WorkspaceGroup.svelte.d.ts +3 -0
  66. package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte +19 -2
  67. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +1 -0
  68. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte.d.ts +2 -1
  69. package/package/components/apps/components/display/table/AppAggridInfiniteTableEe.svelte +2 -0
  70. package/package/components/apps/components/display/table/AppAggridInfiniteTableEe.svelte.d.ts +2 -1
  71. package/package/components/apps/components/display/table/AppAggridTable.svelte +45 -3
  72. package/package/components/apps/components/display/table/AppAggridTable.svelte.d.ts +2 -1
  73. package/package/components/apps/components/display/table/AppAggridTableEe.svelte +2 -0
  74. package/package/components/apps/components/display/table/AppAggridTableEe.svelte.d.ts +2 -1
  75. package/package/components/apps/editor/AppEditor.svelte +239 -92
  76. package/package/components/apps/editor/AppEditorBottomPanel.svelte +22 -0
  77. package/package/components/apps/editor/AppEditorBottomPanel.svelte.d.ts +24 -0
  78. package/package/components/apps/editor/AppEditorHeader.svelte +44 -2
  79. package/package/components/apps/editor/AppEditorHeader.svelte.d.ts +9 -0
  80. package/package/components/apps/editor/AppExportButton.svelte +1 -1
  81. package/package/components/apps/editor/AppPreview.svelte +4 -0
  82. package/package/components/apps/editor/DeploymentHistory.svelte +7 -3
  83. package/package/components/apps/editor/GridEditor.svelte +4 -13
  84. package/package/components/apps/editor/RunnableJobPanel.svelte +25 -58
  85. package/package/components/apps/editor/RunnableJobPanel.svelte.d.ts +10 -1
  86. package/package/components/apps/editor/RunnalbeJobPanelInner.svelte +56 -0
  87. package/package/components/apps/editor/RunnalbeJobPanelInner.svelte.d.ts +18 -0
  88. package/package/components/apps/editor/SubGridEditor.svelte +3 -1
  89. package/package/components/apps/editor/component/Component.svelte +26 -4
  90. package/package/components/apps/editor/component/Component.svelte.d.ts +1 -0
  91. package/package/components/apps/editor/component/components.d.ts +5 -0
  92. package/package/components/apps/editor/componentsPanel/CssProperty.svelte +2 -0
  93. package/package/components/apps/editor/componentsPanel/tailwindUtils.js +267 -1
  94. package/package/components/apps/editor/contextPanel/ContextPanel.svelte +9 -1
  95. package/package/components/apps/editor/contextPanel/ContextPanel.svelte.d.ts +2 -0
  96. package/package/components/apps/editor/inlineScriptsPanel/CacheTtlPopup.svelte +1 -0
  97. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +4 -0
  98. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanel.svelte +7 -2
  99. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanel.svelte.d.ts +5 -1
  100. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte +14 -2
  101. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte.d.ts +1 -0
  102. package/package/components/apps/editor/settingsPanel/ComponentPanel.svelte +25 -5
  103. package/package/components/apps/editor/settingsPanel/HideButton.svelte +47 -0
  104. package/package/components/apps/editor/settingsPanel/HideButton.svelte.d.ts +22 -0
  105. package/package/components/apps/editor/settingsPanel/TableActions.svelte +43 -4
  106. package/package/components/apps/editor/settingsPanel/TableActions.svelte.d.ts +2 -1
  107. package/package/components/apps/editor/settingsPanel/inputEditor/JsonEditor.svelte +2 -1
  108. package/package/components/apps/editor/settingsPanel/inputEditor/JsonEditor.svelte.d.ts +1 -0
  109. package/package/components/apps/svelte-grid/Grid.svelte +6 -2
  110. package/package/components/apps/svelte-grid/Grid.svelte.d.ts +1 -0
  111. package/package/components/apps/svelte-grid/MoveResize.svelte +11 -3
  112. package/package/components/apps/svelte-grid/MoveResize.svelte.d.ts +1 -0
  113. package/package/components/apps/svelte-grid/utils/item.d.ts +4 -1
  114. package/package/components/apps/svelte-grid/utils/item.js +11 -4
  115. package/package/components/build_workers.d.ts +1 -1
  116. package/package/components/build_workers.js +16 -122
  117. package/package/components/common/button/Button.svelte.d.ts +2 -2
  118. package/package/components/common/calendarPicker/CalendarPicker.svelte +6 -2
  119. package/package/components/common/calendarPicker/CalendarPicker.svelte.d.ts +2 -0
  120. package/package/components/common/drawer/ConditionalPortal.svelte +2 -1
  121. package/package/components/common/drawer/ConditionalPortal.svelte.d.ts +1 -0
  122. package/package/components/common/languageIcons/LanguageIcon.svelte +5 -2
  123. package/package/components/common/popup/Popup.svelte +2 -1
  124. package/package/components/common/popup/Popup.svelte.d.ts +1 -0
  125. package/package/components/common/table/AppRow.svelte +11 -8
  126. package/package/components/common/table/AppRow.svelte.d.ts +1 -2
  127. package/package/components/common/table/FlowRow.svelte +3 -3
  128. package/package/components/common/table/FlowRow.svelte.d.ts +1 -2
  129. package/package/components/common/table/RawAppRow.svelte +3 -3
  130. package/package/components/common/table/RawAppRow.svelte.d.ts +1 -2
  131. package/package/components/common/table/ScriptRow.svelte +3 -3
  132. package/package/components/common/table/ScriptRow.svelte.d.ts +1 -2
  133. package/package/components/copilot/CodeCompletionStatus.svelte +21 -46
  134. package/package/components/copilot/StepGen.svelte +2 -1
  135. package/package/components/custom_ui.d.ts +4 -1
  136. package/package/components/flows/CreateActionsApp.svelte +11 -8
  137. package/package/components/flows/CreateActionsFlow.svelte +11 -8
  138. package/package/components/flows/FlowEditor.svelte +1 -2
  139. package/package/components/flows/FlowEditor.svelte.d.ts +0 -1
  140. package/package/components/flows/FlowHistory.svelte +6 -3
  141. package/package/components/flows/content/FlowModuleComponent.svelte +1 -0
  142. package/package/components/flows/content/FlowModuleScript.svelte +15 -11
  143. package/package/components/flows/content/FlowSettings.svelte +1 -4
  144. package/package/components/flows/content/ScriptEditorDrawer.svelte +3 -0
  145. package/package/components/flows/header/FlowYamlEditor.svelte +55 -0
  146. package/package/components/flows/header/FlowYamlEditor.svelte.d.ts +17 -0
  147. package/package/components/flows/map/InsertTriggerButton.svelte +1 -1
  148. package/package/components/flows/map/InsertTriggerButton.svelte.d.ts +1 -0
  149. package/package/components/flows/map/VirtualItem.svelte +1 -1
  150. package/package/components/flows/pickers/PickHubScript.svelte +1 -0
  151. package/package/components/flows/types.d.ts +7 -6
  152. package/package/components/flows/utils.d.ts +9 -0
  153. package/package/components/flows/utils.js +21 -0
  154. package/package/components/graph/graphBuilder.js +1 -0
  155. package/package/components/graph/model.d.ts +1 -0
  156. package/package/components/graph/renderers/edges/BaseEdge.svelte +16 -0
  157. package/package/components/graph/renderers/nodes/BranchOneStart.svelte +1 -1
  158. package/package/components/graph/renderers/nodes/NoBranchNode.svelte +5 -1
  159. package/package/components/graph/renderers/nodes/NoBranchNode.svelte.d.ts +1 -0
  160. package/package/components/home/Item.svelte +0 -17
  161. package/package/components/home/deploy_ui.d.ts +2 -0
  162. package/package/components/home/deploy_ui.js +21 -0
  163. package/package/components/icons/RustIcon.svelte +70 -0
  164. package/package/components/icons/RustIcon.svelte.d.ts +25 -0
  165. package/package/components/icons/rust-logo.svg +1 -0
  166. package/package/components/instanceSettings.js +2 -2
  167. package/package/components/monaco_keybindings.d.ts +3 -0
  168. package/package/components/monaco_keybindings.js +9 -0
  169. package/package/components/preview/FlowPreviewStatus.svelte +6 -2
  170. package/package/components/runs/JobLoader.svelte +12 -3
  171. package/package/components/runs/JobLoader.svelte.d.ts +1 -1
  172. package/package/components/runs/ManuelDatePicker.svelte +31 -44
  173. package/package/components/runs/ManuelDatePicker.svelte.d.ts +6 -2
  174. package/package/components/runs/RunsFilter.svelte +4 -1
  175. package/package/components/runs/RunsFilter.svelte.d.ts +1 -0
  176. package/package/components/search/GlobalSearchModal.svelte +36 -25
  177. package/package/components/vscode.js +1 -1
  178. package/package/components/wizards/TableActionsWizard.svelte +84 -0
  179. package/package/components/wizards/TableActionsWizard.svelte.d.ts +22 -0
  180. package/package/editorUtils.js +2 -0
  181. package/package/gen/core/OpenAPI.js +1 -1
  182. package/package/gen/schemas.gen.d.ts +8 -8
  183. package/package/gen/schemas.gen.js +8 -8
  184. package/package/gen/services.gen.d.ts +4 -0
  185. package/package/gen/services.gen.js +16 -0
  186. package/package/gen/types.gen.d.ts +20 -8
  187. package/package/infer.d.ts +1 -1
  188. package/package/infer.js +48 -7
  189. package/package/script_helpers.d.ts +1 -0
  190. package/package/script_helpers.js +39 -1
  191. package/package/scripts.d.ts +1 -1
  192. package/package/scripts.js +12 -4
  193. package/package/stores.d.ts +5 -1
  194. package/package/stores.js +7 -2
  195. package/package.json +18 -9
@@ -1,225 +1,13 @@
1
1
  <script>import { Drawer, DrawerContent } from './common';
2
- import 'chartjs-adapter-date-fns';
3
- import { Line } from 'svelte-chartjs';
4
- import { Chart as ChartJS, Title, Tooltip, Legend, LineElement, CategoryScale, LinearScale, PointElement, LogarithmicScale, TimeScale } from 'chart.js';
5
- import { WorkerService } from '../gen';
6
- import { superadmin } from '../stores';
7
- import Skeleton from './common/skeleton/Skeleton.svelte';
8
- import DarkModeObserver from './DarkModeObserver.svelte';
9
- import Alert from './common/alert/Alert.svelte';
10
- export let drawer;
11
- let isOpen = false;
12
- let loading = true;
13
- const colorTuples = [
14
- ['#7EB26D', 'rgba(126, 178, 109, 0.2)'],
15
- ['#EAB839', 'rgba(234, 184, 57, 0.2)'],
16
- ['#6ED0E0', 'rgba(110, 208, 224, 0.2)'],
17
- ['#EF843C', 'rgba(239, 132, 60, 0.2)'],
18
- ['#E24D42', 'rgba(226, 77, 66, 0.2)'],
19
- ['#1F78C1', 'rgba(31, 120, 193, 0.2)'],
20
- ['#BA43A9', 'rgba(186, 67, 169, 0.2)'],
21
- ['#705DA0', 'rgba(112, 93, 160, 0.2)'],
22
- ['#508642', 'rgba(80, 134, 66, 0.2)'],
23
- ['#CCA300', 'rgba(204, 163, 0, 0.2)'],
24
- ['#447EBC', 'rgba(68, 126, 188, 0.2)'],
25
- ['#C15C17', 'rgba(193, 92, 23, 0.2)'],
26
- ['#890F02', 'rgba(137, 15, 2, 0.2)'],
27
- ['#666666', 'rgba(102, 102, 102, 0.2)'],
28
- ['#44AA99', 'rgba(68, 170, 153, 0.2)'],
29
- ['#6D8764', 'rgba(109, 135, 100, 0.2)'],
30
- ['#555555', 'rgba(85, 85, 85, 0.2)'],
31
- ['#B3B3B3', 'rgba(179, 179, 179, 0.2)'],
32
- ['#008C9E', 'rgba(0, 140, 158, 0.2)'],
33
- ['#6BBA70', 'rgba(107, 186, 112, 0.2)']
34
- ];
35
- function getColors(labels) {
36
- const colors = labels.map((_, i) => colorTuples[i % colorTuples.length]);
37
- return Object.fromEntries(colors.map((c, i) => [labels[i], c]));
2
+ import QueueMetricsDrawerInner from './QueueMetricsDrawerInner.svelte';
3
+ let drawer;
4
+ export function openDrawer() {
5
+ drawer?.openDrawer();
38
6
  }
39
- ChartJS.register(Title, Tooltip, Legend, LineElement, LinearScale, PointElement, CategoryScale, TimeScale, LogarithmicScale);
40
- let countData = undefined;
41
- let delayData = undefined;
42
- let minDate = new Date();
43
- let noMetrics = false;
44
- function fillData(data, zero = 0) {
45
- // fill holes with 0
46
- const sorted = [];
47
- for (const el of [
48
- ...data,
49
- {
50
- created_at: new Date().toISOString(),
51
- value: zero
52
- }
53
- ]) {
54
- const last = sorted.length > 0 ? new Date(sorted[sorted.length - 1].created_at).getTime() : undefined;
55
- const currentTs = new Date(el.created_at).getTime();
56
- if (last && currentTs - last > 1000 * 60 * 2) {
57
- const numElements = Math.floor((currentTs - last) / (1000 * 30));
58
- for (let i = 1; i < numElements; i++) {
59
- sorted.push({
60
- created_at: new Date(last + i * (1000 * 30)).toISOString(),
61
- value: zero
62
- });
63
- }
64
- }
65
- sorted.push(el);
66
- }
67
- // remove high frequency data points for similar values
68
- const light = [];
69
- for (const el of sorted) {
70
- const last = light.length > 0 ? light[light.length - 1] : undefined;
71
- if (!last ||
72
- Math.abs((el.value - last.value) / last.value) > 0.1 ||
73
- new Date(el.created_at).getTime() - new Date(last.created_at).getTime() > 1000 * 60 * 15) {
74
- light.push(el);
75
- }
76
- }
77
- return light;
78
- }
79
- async function loadMetrics() {
80
- loading = true;
81
- let metrics = await WorkerService.getQueueMetrics();
82
- if (metrics.length == 0) {
83
- noMetrics = true;
84
- loading = false;
85
- return;
86
- }
87
- const labels = metrics
88
- .map((m) => m.id.slice(12))
89
- .filter((v, i, a) => a.indexOf(v) === i)
90
- .sort();
91
- const labelColors = getColors(labels);
92
- countData = {
93
- datasets: metrics
94
- .filter((m) => m.id.startsWith('queue_count_'))
95
- .map((m) => {
96
- const [color, bgColor] = labelColors[m.id.slice(12)];
97
- return {
98
- label: m.id.slice(12),
99
- backgroundColor: bgColor,
100
- borderColor: color,
101
- data: fillData(m.values).map((v) => ({ x: v.created_at, y: v.value }))
102
- };
103
- })
104
- };
105
- delayData = {
106
- datasets: metrics
107
- .filter((m) => m.id.startsWith('queue_delay_'))
108
- .map((m) => {
109
- const [color, bgColor] = labelColors[m.id.slice(12)];
110
- return {
111
- label: m.id.slice(12),
112
- borderColor: color,
113
- backgroundColor: bgColor,
114
- data: fillData(m.values, 1).map((v) => ({
115
- x: v.created_at,
116
- y: v.value
117
- }))
118
- };
119
- })
120
- };
121
- minDate = new Date(Math.min(...countData.datasets.map((d) => new Date(d.data[0].x).getTime())));
122
- loading = false;
123
- }
124
- $: if ($superadmin && isOpen) {
125
- loadMetrics();
126
- }
127
- else {
128
- countData = undefined;
129
- delayData = undefined;
130
- }
131
- let darkMode = false;
132
- $: ChartJS.defaults.color = darkMode ? '#ccc' : '#666';
133
- $: ChartJS.defaults.borderColor = darkMode ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.1)';
134
7
  </script>
135
8
 
136
- <DarkModeObserver bind:darkMode />
137
-
138
- <Drawer bind:this={drawer} bind:open={isOpen}>
9
+ <Drawer bind:this={drawer}>
139
10
  <DrawerContent title="Queue Metrics" on:close={drawer.closeDrawer}>
140
- {#if loading}
141
- <Skeleton layout={[[20]]} />
142
- {:else if noMetrics}
143
- <p class="text-secondary">No jobs delayed by more than 3 seconds in the last 14 days</p>
144
- {:else}
145
- <div class="flex flex-col gap-4">
146
- {#if countData}
147
- <Line
148
- data={countData}
149
- options={{
150
- animation: false,
151
- plugins: {
152
- title: {
153
- display: true,
154
- text: 'Number of delayed jobs per tag (> 3s)'
155
- }
156
- },
157
- scales: {
158
- x: {
159
- type: 'time',
160
- min: minDate.toISOString(),
161
- max: new Date().toISOString()
162
- },
163
- y: {
164
- title: {
165
- display: true,
166
- text: 'count'
167
- }
168
- }
169
- }
170
- }}
171
- />
172
- {/if}
173
- {#if delayData}
174
- <Line
175
- data={delayData}
176
- options={{
177
- animation: false,
178
- plugins: {
179
- title: {
180
- display: true,
181
- text: 'Queue delay per tag (> 3s)'
182
- },
183
- tooltip: {
184
- callbacks: {
185
- label: function (context) {
186
- // @ts-ignore
187
- if (context.raw.y === 1) {
188
- return context.dataset.label + ': 0'
189
- } else {
190
- // @ts-ignore
191
- return context.dataset.label + ': ' + context.raw.y
192
- }
193
- }
194
- }
195
- }
196
- },
197
- scales: {
198
- x: {
199
- type: 'time',
200
- min: minDate.toISOString(),
201
- max: new Date().toISOString()
202
- },
203
-
204
- y: {
205
- type: 'logarithmic',
206
- title: {
207
- display: true,
208
- text: 'delay (s)'
209
- },
210
- ticks: {
211
- callback: (value, _) => (value === 1 ? '0' : value)
212
- }
213
- }
214
- }
215
- }}
216
- />
217
- {/if}
218
- <Alert title="Info">
219
- Only tags for jobs that have been delayed by more than 3 seconds in the last 14 days are
220
- included in the graph.
221
- </Alert>
222
- </div>
223
- {/if}
11
+ <QueueMetricsDrawerInner />
224
12
  </DrawerContent>
225
13
  </Drawer>
@@ -1,9 +1,7 @@
1
1
  import { SvelteComponent } from "svelte";
2
- import { Drawer } from './common';
3
- import 'chartjs-adapter-date-fns';
4
2
  declare const __propDef: {
5
3
  props: {
6
- drawer: Drawer;
4
+ openDrawer?: (() => void) | undefined;
7
5
  };
8
6
  events: {
9
7
  [evt: string]: CustomEvent<any>;
@@ -14,5 +12,6 @@ export type QueueMetricsDrawerProps = typeof __propDef.props;
14
12
  export type QueueMetricsDrawerEvents = typeof __propDef.events;
15
13
  export type QueueMetricsDrawerSlots = typeof __propDef.slots;
16
14
  export default class QueueMetricsDrawer extends SvelteComponent<QueueMetricsDrawerProps, QueueMetricsDrawerEvents, QueueMetricsDrawerSlots> {
15
+ get openDrawer(): () => void;
17
16
  }
18
17
  export {};
@@ -0,0 +1,211 @@
1
+ <script>import 'chartjs-adapter-date-fns';
2
+ import { Line } from 'svelte-chartjs';
3
+ import { Chart as ChartJS, Title, Tooltip, Legend, LineElement, CategoryScale, LinearScale, PointElement, LogarithmicScale, TimeScale } from 'chart.js';
4
+ import { WorkerService } from '../gen';
5
+ import Skeleton from './common/skeleton/Skeleton.svelte';
6
+ import DarkModeObserver from './DarkModeObserver.svelte';
7
+ import Alert from './common/alert/Alert.svelte';
8
+ let loading = true;
9
+ const colorTuples = [
10
+ ['#7EB26D', 'rgba(126, 178, 109, 0.2)'],
11
+ ['#EAB839', 'rgba(234, 184, 57, 0.2)'],
12
+ ['#6ED0E0', 'rgba(110, 208, 224, 0.2)'],
13
+ ['#EF843C', 'rgba(239, 132, 60, 0.2)'],
14
+ ['#E24D42', 'rgba(226, 77, 66, 0.2)'],
15
+ ['#1F78C1', 'rgba(31, 120, 193, 0.2)'],
16
+ ['#BA43A9', 'rgba(186, 67, 169, 0.2)'],
17
+ ['#705DA0', 'rgba(112, 93, 160, 0.2)'],
18
+ ['#508642', 'rgba(80, 134, 66, 0.2)'],
19
+ ['#CCA300', 'rgba(204, 163, 0, 0.2)'],
20
+ ['#447EBC', 'rgba(68, 126, 188, 0.2)'],
21
+ ['#C15C17', 'rgba(193, 92, 23, 0.2)'],
22
+ ['#890F02', 'rgba(137, 15, 2, 0.2)'],
23
+ ['#666666', 'rgba(102, 102, 102, 0.2)'],
24
+ ['#44AA99', 'rgba(68, 170, 153, 0.2)'],
25
+ ['#6D8764', 'rgba(109, 135, 100, 0.2)'],
26
+ ['#555555', 'rgba(85, 85, 85, 0.2)'],
27
+ ['#B3B3B3', 'rgba(179, 179, 179, 0.2)'],
28
+ ['#008C9E', 'rgba(0, 140, 158, 0.2)'],
29
+ ['#6BBA70', 'rgba(107, 186, 112, 0.2)']
30
+ ];
31
+ function getColors(labels) {
32
+ const colors = labels.map((_, i) => colorTuples[i % colorTuples.length]);
33
+ return Object.fromEntries(colors.map((c, i) => [labels[i], c]));
34
+ }
35
+ ChartJS.register(Title, Tooltip, Legend, LineElement, LinearScale, PointElement, CategoryScale, TimeScale, LogarithmicScale);
36
+ let countData = undefined;
37
+ let delayData = undefined;
38
+ let minDate = new Date();
39
+ let noMetrics = false;
40
+ function fillData(data, zero = 0) {
41
+ // fill holes with 0
42
+ const sorted = [];
43
+ for (const el of [
44
+ ...data,
45
+ {
46
+ created_at: new Date().toISOString(),
47
+ value: zero
48
+ }
49
+ ]) {
50
+ const last = sorted.length > 0 ? new Date(sorted[sorted.length - 1].created_at).getTime() : undefined;
51
+ const currentTs = new Date(el.created_at).getTime();
52
+ if (last && currentTs - last > 1000 * 60 * 2) {
53
+ const numElements = Math.floor((currentTs - last) / (1000 * 30));
54
+ for (let i = 1; i < numElements; i++) {
55
+ sorted.push({
56
+ created_at: new Date(last + i * (1000 * 30)).toISOString(),
57
+ value: zero
58
+ });
59
+ }
60
+ }
61
+ sorted.push(el);
62
+ }
63
+ // remove high frequency data points for similar values
64
+ const light = [];
65
+ for (const el of sorted) {
66
+ const last = light.length > 0 ? light[light.length - 1] : undefined;
67
+ if (!last ||
68
+ Math.abs((el.value - last.value) / last.value) > 0.1 ||
69
+ new Date(el.created_at).getTime() - new Date(last.created_at).getTime() > 1000 * 60 * 15) {
70
+ light.push(el);
71
+ }
72
+ }
73
+ return light;
74
+ }
75
+ async function loadMetrics() {
76
+ loading = true;
77
+ let metrics = await WorkerService.getQueueMetrics();
78
+ if (metrics.length == 0) {
79
+ noMetrics = true;
80
+ loading = false;
81
+ return;
82
+ }
83
+ const labels = metrics
84
+ .map((m) => m.id.slice(12))
85
+ .filter((v, i, a) => a.indexOf(v) === i)
86
+ .sort();
87
+ const labelColors = getColors(labels);
88
+ countData = {
89
+ datasets: metrics
90
+ .filter((m) => m.id.startsWith('queue_count_'))
91
+ .map((m) => {
92
+ const [color, bgColor] = labelColors[m.id.slice(12)];
93
+ return {
94
+ label: m.id.slice(12),
95
+ backgroundColor: bgColor,
96
+ borderColor: color,
97
+ data: fillData(m.values).map((v) => ({ x: v.created_at, y: v.value }))
98
+ };
99
+ })
100
+ };
101
+ delayData = {
102
+ datasets: metrics
103
+ .filter((m) => m.id.startsWith('queue_delay_'))
104
+ .map((m) => {
105
+ const [color, bgColor] = labelColors[m.id.slice(12)];
106
+ return {
107
+ label: m.id.slice(12),
108
+ borderColor: color,
109
+ backgroundColor: bgColor,
110
+ data: fillData(m.values, 1).map((v) => ({
111
+ x: v.created_at,
112
+ y: v.value
113
+ }))
114
+ };
115
+ })
116
+ };
117
+ minDate = new Date(Math.min(...countData.datasets.map((d) => new Date(d.data[0].x).getTime())));
118
+ loading = false;
119
+ }
120
+ loadMetrics();
121
+ let darkMode = false;
122
+ $: ChartJS.defaults.color = darkMode ? '#ccc' : '#666';
123
+ $: ChartJS.defaults.borderColor = darkMode ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.1)';
124
+ </script>
125
+
126
+ <DarkModeObserver bind:darkMode />
127
+
128
+ {#if loading}
129
+ <Skeleton layout={[[20]]} />
130
+ {:else if noMetrics}
131
+ <p class="text-secondary">No jobs delayed by more than 3 seconds in the last 14 days</p>
132
+ {:else}
133
+ <div class="flex flex-col gap-4">
134
+ {#if countData}
135
+ <Line
136
+ data={countData}
137
+ options={{
138
+ animation: false,
139
+ plugins: {
140
+ title: {
141
+ display: true,
142
+ text: 'Number of delayed jobs per tag (> 3s)'
143
+ }
144
+ },
145
+ scales: {
146
+ x: {
147
+ type: 'time',
148
+ min: minDate.toISOString(),
149
+ max: new Date().toISOString()
150
+ },
151
+ y: {
152
+ title: {
153
+ display: true,
154
+ text: 'count'
155
+ }
156
+ }
157
+ }
158
+ }}
159
+ />
160
+ {/if}
161
+ {#if delayData}
162
+ <Line
163
+ data={delayData}
164
+ options={{
165
+ animation: false,
166
+ plugins: {
167
+ title: {
168
+ display: true,
169
+ text: 'Queue delay per tag (> 3s)'
170
+ },
171
+ tooltip: {
172
+ callbacks: {
173
+ label: function (context) {
174
+ // @ts-ignore
175
+ if (context.raw.y === 1) {
176
+ return context.dataset.label + ': 0'
177
+ } else {
178
+ // @ts-ignore
179
+ return context.dataset.label + ': ' + context.raw.y
180
+ }
181
+ }
182
+ }
183
+ }
184
+ },
185
+ scales: {
186
+ x: {
187
+ type: 'time',
188
+ min: minDate.toISOString(),
189
+ max: new Date().toISOString()
190
+ },
191
+
192
+ y: {
193
+ type: 'logarithmic',
194
+ title: {
195
+ display: true,
196
+ text: 'delay (s)'
197
+ },
198
+ ticks: {
199
+ callback: (value, _) => (value === 1 ? '0' : value)
200
+ }
201
+ }
202
+ }
203
+ }}
204
+ />
205
+ {/if}
206
+ <Alert title="Info">
207
+ Only tags for jobs that have been delayed by more than 3 seconds in the last 14 days are
208
+ included in the graph.
209
+ </Alert>
210
+ </div>
211
+ {/if}
@@ -0,0 +1,15 @@
1
+ import { SvelteComponent } from "svelte";
2
+ import 'chartjs-adapter-date-fns';
3
+ declare const __propDef: {
4
+ props: Record<string, never>;
5
+ events: {
6
+ [evt: string]: CustomEvent<any>;
7
+ };
8
+ slots: {};
9
+ };
10
+ export type QueueMetricsDrawerInnerProps = typeof __propDef.props;
11
+ export type QueueMetricsDrawerInnerEvents = typeof __propDef.events;
12
+ export type QueueMetricsDrawerInnerSlots = typeof __propDef.slots;
13
+ export default class QueueMetricsDrawerInner extends SvelteComponent<QueueMetricsDrawerInnerProps, QueueMetricsDrawerInnerEvents, QueueMetricsDrawerInnerSlots> {
14
+ }
15
+ export {};
@@ -1,7 +1,6 @@
1
- <script>import ResourceEditor from './ResourceEditor.svelte';
2
- import { Button, Drawer } from './common';
1
+ <script>import { Button, Drawer } from './common';
3
2
  import DrawerContent from './common/drawer/DrawerContent.svelte';
4
- import { Save } from 'lucide-svelte';
3
+ import { Loader2, Save } from 'lucide-svelte';
5
4
  let drawer;
6
5
  let canSave = true;
7
6
  let resource_type = undefined;
@@ -24,14 +23,18 @@ export async function initNew(resourceType) {
24
23
 
25
24
  <Drawer bind:this={drawer} size="800px">
26
25
  <DrawerContent title={path ? 'Edit ' + path : 'Add a resource'} on:close={drawer.closeDrawer}>
27
- <ResourceEditor
28
- {newResource}
29
- {path}
30
- {resource_type}
31
- on:refresh
32
- bind:this={resourceEditor}
33
- bind:canSave
34
- />
26
+ {#await import('./ResourceEditor.svelte')}
27
+ <Loader2 class="animate-spin" />
28
+ {:then Module}
29
+ <Module.default
30
+ {newResource}
31
+ {path}
32
+ {resource_type}
33
+ on:refresh
34
+ bind:this={resourceEditor}
35
+ bind:canSave
36
+ />
37
+ {/await}
35
38
  <svelte:fragment slot="actions">
36
39
  <Button
37
40
  startIcon={{ icon: Save }}
@@ -5,7 +5,7 @@ declare const __propDef: {
5
5
  initNew?: ((resourceType: string) => Promise<void>) | undefined;
6
6
  };
7
7
  events: {
8
- refresh: CustomEvent<any>;
8
+ refresh: any;
9
9
  } & {
10
10
  [evt: string]: CustomEvent<any>;
11
11
  };
@@ -81,7 +81,7 @@ export default class ResultJobLoader extends SvelteComponent<ResultJobLoaderProp
81
81
  cancel: () => void;
82
82
  error: (err: Error) => void;
83
83
  } | undefined) => Promise<string>;
84
- get runPreview(): (path: string | undefined, code: string, lang: "python3" | "deno" | "go" | "bash" | "powershell" | "postgresql" | "mysql" | "bigquery" | "snowflake" | "mssql" | "graphql" | "nativets" | "bun" | "php", args: Record<string, any>, tag: string | undefined, callbacks?: {
84
+ get runPreview(): (path: string | undefined, code: string, lang: "python3" | "deno" | "go" | "bash" | "powershell" | "postgresql" | "mysql" | "bigquery" | "snowflake" | "mssql" | "graphql" | "nativets" | "bun" | "php" | "rust", args: Record<string, any>, tag: string | undefined, callbacks?: {
85
85
  done: (x: any) => void;
86
86
  cancel: () => void;
87
87
  error: (err: Error) => void;
@@ -540,8 +540,20 @@ function selectItem(index, toggleCollapsed = true) {
540
540
  {/if}
541
541
 
542
542
  <div class="flex flex-col h-full w-full overflow-auto text-xs p-4 bg-surface-secondary">
543
- {#if fileMetadata !== undefined && filePreview !== undefined}
543
+ {#if fileMetadata?.fileKey.endsWith('.png') || fileMetadata?.fileKey.endsWith('.jpg') || fileMetadata?.fileKey.endsWith('.jpeg') || fileMetadata?.fileKey.endsWith('.webp')}
544
+ <div>
545
+ <img
546
+ src={`/api/w/${$workspaceStore}/job_helpers/load_image_preview?file_key=${fileMetadata.fileKey}` +
547
+ (storage ? `&storage=${storage}` : '')}
548
+ alt="S3 preview"
549
+ />
550
+ </div>
551
+ {:else if filePreviewLoading}
544
552
  <div class="flex h-6 items-center text-tertiary mb-4">
553
+ <Loader2 size={12} class="animate-spin mr-1" /> File preview loading
554
+ </div>
555
+ {:else if fileMetadata !== undefined && filePreview !== undefined}
556
+ <div class="flex items-center text-tertiary mb-4">
545
557
  {#if filePreview.contentType === 'Unknown'}
546
558
  Type of file not supported for preview.
547
559
  {:else if filePreview.contentType === 'Csv'}
@@ -585,13 +597,13 @@ function selectItem(index, toggleCollapsed = true) {
585
597
  Previewing a {filePreview.contentType?.toLowerCase()} file.
586
598
  {/if}
587
599
  </div>
588
- <pre class="grow whitespace-no-wrap break-words"
589
- >{#if !emptyString(filePreview.contentPreview)}{filePreview.contentPreview}{:else if filePreview.contentType !== undefined}Preview impossible.{/if}</pre
590
- >
591
- {:else if filePreviewLoading}
592
- <div class="flex h-6 items-center text-tertiary mb-4">
593
- <Loader2 size={12} class="animate-spin mr-1" /> File preview loading
594
- </div>
600
+ <pre class="grow whitespace-no-wrap break-words">
601
+ {#if !emptyString(filePreview.contentPreview)}
602
+ {filePreview.contentPreview}
603
+ {:else if filePreview.contentType !== undefined}
604
+ Preview impossible.
605
+ {/if}
606
+ </pre>
595
607
  {/if}
596
608
  </div>
597
609
  </div>