windmill-components 1.537.1 → 1.542.5
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.
- package/package/components/AIProviderPicker.svelte +181 -0
- package/package/components/AIProviderPicker.svelte.d.ts +15 -0
- package/package/components/ArgInfo.svelte +2 -2
- package/package/components/ArgInput.svelte +35 -9
- package/package/components/ArgInput.svelte.d.ts +3 -3
- package/package/components/AssignableTagsInner.svelte +89 -3
- package/package/components/ConcurrentJobsChart.svelte +36 -48
- package/package/components/ConcurrentJobsChart.svelte.d.ts +8 -20
- package/package/components/CustomPopover.svelte.d.ts +1 -1
- package/package/components/DropdownSelect.svelte +26 -0
- package/package/components/DropdownSelect.svelte.d.ts +11 -0
- package/package/components/DropdownV2Inner.svelte +1 -1
- package/package/components/{DynSelect.svelte → DynamicInput.svelte} +47 -15
- package/package/components/DynamicInput.svelte.d.ts +11 -0
- package/package/components/EditableSchemaForm.svelte +119 -95
- package/package/components/EditableSchemaForm.svelte.d.ts +4 -4
- package/package/components/Editor.svelte +86 -93
- package/package/components/Editor.svelte.d.ts +4 -3
- package/package/components/EditorBar.svelte +2 -5
- package/package/components/EditorSettings.svelte +11 -9
- package/package/components/FlowBuilder.svelte +3 -3
- package/package/components/FlowLogRow.svelte +64 -0
- package/package/components/FlowLogRow.svelte.d.ts +15 -0
- package/package/components/FlowLogViewer.svelte +406 -373
- package/package/components/FlowLogViewer.svelte.d.ts +5 -1
- package/package/components/FlowLogViewerWrapper.svelte +44 -1
- package/package/components/FlowLoopIterationPreview.svelte.d.ts +1 -1
- package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
- package/package/components/FlowStatusViewerInner.svelte +34 -3
- package/package/components/FolderPicker.svelte +1 -1
- package/package/components/InputTransformForm.svelte +20 -10
- package/package/components/JobArgs.svelte +1 -1
- package/package/components/JobLoader.svelte.d.ts +1 -1
- package/package/components/JobStatus.svelte +2 -0
- package/package/components/LogSnippetViewer.svelte +3 -3
- package/package/components/LogSnippetViewer.svelte.d.ts +1 -1
- package/package/components/LogViewer.svelte +87 -71
- package/package/components/LogViewer.svelte.d.ts +1 -0
- package/package/components/Path.svelte +7 -1
- package/package/components/Path.svelte.d.ts +1 -1
- package/package/components/PrefixedInput.svelte +120 -0
- package/package/components/PrefixedInput.svelte.d.ts +8 -0
- package/package/components/QueuePosition.svelte +81 -0
- package/package/components/QueuePosition.svelte.d.ts +8 -0
- package/package/components/ResourceNarrowing.svelte +13 -0
- package/package/components/ResourceNarrowing.svelte.d.ts +6 -0
- package/package/components/ResourceTypePicker.svelte +49 -74
- package/package/components/RunChart.svelte +74 -89
- package/package/components/RunChart.svelte.d.ts +10 -22
- package/package/components/S3FilePicker.svelte +1 -1
- package/package/components/SchemaForm.svelte.d.ts +2 -2
- package/package/components/ScriptBuilder.svelte +2 -1
- package/package/components/ScriptEditor.svelte +4 -3
- package/package/components/ScriptEditor.svelte.d.ts +2 -1
- package/package/components/ServiceLogsInner.svelte +1 -1
- package/package/components/ShareModal.svelte.d.ts +1 -1
- package/package/components/SimpleEditor.svelte +4 -67
- package/package/components/StringTypeNarrowing.svelte +5 -10
- package/package/components/TemplateEditor.svelte +2 -16
- package/package/components/TimeAgo.svelte +1 -1
- package/package/components/TimeAgo.svelte.d.ts +1 -0
- package/package/components/Toggle.svelte +2 -1
- package/package/components/Toggle.svelte.d.ts +2 -1
- package/package/components/WorkerRepl.svelte +1 -1
- package/package/components/apps/components/display/AppNavbarItem.svelte +2 -1
- package/package/components/apps/components/display/table/AppAggridTable.svelte +44 -48
- package/package/components/apps/components/display/table/SyncColumnDefs.svelte +101 -19
- package/package/components/apps/components/display/table/SyncColumnDefs.svelte.d.ts +5 -2
- package/package/components/apps/components/display/table/utils.js +36 -5
- package/package/components/apps/components/inputs/currency/CurrencyInput.svelte +10 -5
- package/package/components/apps/editor/AppEditor.svelte +4 -3
- package/package/components/apps/editor/AppEditorHeader.svelte +0 -1
- package/package/components/apps/editor/GridViewer.svelte.d.ts +11 -4
- package/package/components/apps/editor/SettingsPanel.svelte +2 -2
- package/package/components/apps/editor/componentsPanel/ListItem.svelte +2 -2
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte.d.ts +1 -1
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte.d.ts +1 -1
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte.d.ts +1 -1
- package/package/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte +26 -3
- package/package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte +1 -1
- package/package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +13 -5
- package/package/components/apps/svelte-grid/Grid.svelte.d.ts +30 -11
- package/package/components/assets/JobAssetsViewer.svelte +28 -24
- package/package/components/auditLogs/AuditLogsTable.svelte +2 -6
- package/package/components/chartjs-wrappers/Chart.svelte.d.ts +14 -7
- package/package/components/common/OnChange.svelte.d.ts +11 -4
- package/package/components/common/badge/Badge.svelte +9 -2
- package/package/components/common/badge/Badge.svelte.d.ts +2 -1
- package/package/components/common/calendarPicker/CalendarPicker.svelte +5 -1
- package/package/components/common/calendarPicker/CalendarPicker.svelte.d.ts +5 -4
- package/package/components/common/drawer/Disposable.svelte +9 -11
- package/package/components/common/drawer/Drawer.svelte +3 -4
- package/package/components/common/drawer/Drawer.svelte.d.ts +1 -0
- package/package/components/common/menu/MenuItem.svelte.d.ts +2 -2
- package/package/components/common/modal/Modal.svelte.d.ts +1 -1
- package/package/components/common/tabs/TabContent.svelte +2 -7
- package/package/components/common/tabs/TabContent.svelte.d.ts +5 -27
- package/package/components/common/toggleButton-v2/ToggleButtonGroup.svelte +9 -3
- package/package/components/common/toggleButton-v2/ToggleButtonGroup.svelte.d.ts +1 -0
- package/package/components/common/toggleButton-v2/ToggleButtonMore.svelte +8 -4
- package/package/components/common/toggleButton-v2/ToggleButtonMore.svelte.d.ts +1 -0
- package/package/components/copilot/MetadataGen.svelte +1 -1
- package/package/components/copilot/chat/AIChatManager.svelte.js +24 -102
- package/package/components/copilot/chat/AssistantMessage.svelte +0 -4
- package/package/components/copilot/chat/anthropic.d.ts +15 -0
- package/package/components/copilot/chat/anthropic.js +208 -0
- package/package/components/copilot/chat/api/apiTools.d.ts +2 -2
- package/package/components/copilot/chat/api/apiTools.js +10 -7
- package/package/components/copilot/chat/api/core.d.ts +1 -1
- package/package/components/copilot/chat/api/core.js +7 -2
- package/package/components/copilot/chat/ask/core.d.ts +1 -1
- package/package/components/copilot/chat/ask/core.js +7 -2
- package/package/components/copilot/chat/flow/core.d.ts +1 -1
- package/package/components/copilot/chat/flow/core.js +14 -4
- package/package/components/copilot/chat/monaco-adapter.d.ts +6 -5
- package/package/components/copilot/chat/navigator/core.d.ts +1 -1
- package/package/components/copilot/chat/navigator/core.js +7 -2
- package/package/components/copilot/chat/script/CodeDisplay.svelte +10 -111
- package/package/components/copilot/chat/script/core.d.ts +5 -4
- package/package/components/copilot/chat/script/core.js +131 -19
- package/package/components/copilot/chat/shared.d.ts +7 -7
- package/package/components/copilot/lib.d.ts +29 -8
- package/package/components/copilot/lib.js +199 -24
- package/package/components/custom_ui.d.ts +1 -0
- package/package/components/flows/content/FlowInput.svelte +5 -5
- package/package/components/flows/content/FlowModuleComponent.svelte +5 -2
- package/package/components/flows/content/FlowModuleEarlyStop.svelte +47 -17
- package/package/components/flows/content/FlowModuleSleep.svelte +4 -1
- package/package/components/flows/content/FlowModuleSuspend.svelte +0 -1
- package/package/components/flows/content/FlowModuleTimeout.svelte +50 -10
- package/package/components/flows/content/FlowModuleTimeout.svelte.d.ts +1 -0
- package/package/components/flows/content/FlowRetries.svelte +108 -3
- package/package/components/flows/content/FlowRetries.svelte.d.ts +3 -2
- package/package/components/flows/flowInfers.js +8 -35
- package/package/components/flows/flowStore.d.ts +45 -1
- package/package/components/flows/flowStore.js +1 -1
- package/package/components/flows/map/FlowJobsMenu.svelte +3 -3
- package/package/components/flows/map/FlowModuleSchemaItem.svelte +61 -54
- package/package/components/flows/map/FlowModuleSchemaItem.svelte.d.ts +1 -1
- package/package/components/flows/map/FlowModuleSchemaItemViewer.svelte +1 -1
- package/package/components/flows/map/InsertModuleButton.svelte +1 -0
- package/package/components/flows/map/InsertModuleInner.svelte +12 -15
- package/package/components/flows/map/InsertModuleInner.svelte.d.ts +10 -9
- package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +1 -1
- package/package/components/git_sync/DetectionFlow.svelte +15 -17
- package/package/components/git_sync/GitSyncContext.svelte.js +1 -1
- package/package/components/git_sync/GitSyncRepositoryCard.svelte +0 -1
- package/package/components/graph/graphBuilder.svelte.d.ts +5 -1
- package/package/components/graph/renderers/edges/BaseEdge.svelte +9 -1
- package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +4 -1
- package/package/components/graph/renderers/nodes/BranchAllStart.svelte +2 -3
- package/package/components/graph/renderers/nodes/BranchOneStart.svelte +2 -3
- package/package/components/graph/renderers/triggers/TriggerButton.svelte.d.ts +1 -1
- package/package/components/graph/renderers/triggers/TriggersBadge.svelte +3 -1
- package/package/components/graph/renderers/triggers/TriggersWrapper.svelte +34 -24
- package/package/components/graph/renderers/triggers/TriggersWrapper.svelte.d.ts +1 -2
- package/package/components/home/ItemsList.svelte +17 -13
- package/package/components/home/TreeView.svelte +21 -27
- package/package/components/home/TreeView.svelte.d.ts +2 -29
- package/package/components/home/TreeViewRoot.svelte +11 -23
- package/package/components/home/TreeViewRoot.svelte.d.ts +15 -13
- package/package/components/icons/GitIcon.svelte +10 -2
- package/package/components/icons/GitIcon.svelte.d.ts +1 -0
- package/package/components/meltComponents/MeltButton.svelte.d.ts +1 -1
- package/package/components/meltComponents/Popover.svelte +23 -3
- package/package/components/meltComponents/Popover.svelte.d.ts +2 -1
- package/package/components/monacoLanguagesOptions.d.ts +3 -0
- package/package/components/monacoLanguagesOptions.js +109 -0
- package/package/components/propertyPicker/ObjectViewer.svelte +7 -2
- package/package/components/propertyPicker/PropPicker.svelte +1 -1
- package/package/components/propertyPicker/utils.js +14 -7
- package/package/components/runs/JobRunsPreview.svelte +212 -177
- package/package/components/runs/JobsLoader.svelte +2 -2
- package/package/components/runs/JobsLoader.svelte.d.ts +1 -1
- package/package/components/runs/NoWorkerWithTagWarning.svelte +18 -5
- package/package/components/runs/RunBadges.svelte +100 -0
- package/package/components/runs/RunBadges.svelte.d.ts +12 -0
- package/package/components/runs/RunLabels.svelte +86 -0
- package/package/components/runs/RunLabels.svelte.d.ts +10 -0
- package/package/components/runs/RunOption.svelte +20 -0
- package/package/components/runs/RunOption.svelte.d.ts +10 -0
- package/package/components/runs/RunRow.svelte +239 -151
- package/package/components/runs/RunRow.svelte.d.ts +12 -9
- package/package/components/runs/RunsBatchActionsDropdown.svelte +13 -17
- package/package/components/runs/RunsBatchActionsDropdown.svelte.d.ts +5 -18
- package/package/components/runs/RunsFilter.svelte +369 -243
- package/package/components/runs/RunsFilter.svelte.d.ts +2 -0
- package/package/components/runs/RunsQueue.svelte +96 -25
- package/package/components/runs/RunsQueue.svelte.d.ts +7 -21
- package/package/components/runs/RunsTable.svelte +62 -71
- package/package/components/runs/RunsTable.svelte.d.ts +2 -1
- package/package/components/runs/runs-grid.css +95 -0
- package/package/components/schema/EditableSchemaDrawer.svelte +12 -12
- package/package/components/schema/FlowPropertyEditor.svelte +197 -206
- package/package/components/schema/PropertyEditor.svelte +33 -35
- package/package/components/schema/SchemaFormDND.svelte.d.ts +2 -2
- package/package/components/search/GlobalSearchModal.svelte +8 -1
- package/package/components/select/DraggableTags.svelte.d.ts +17 -7
- package/package/components/select/MultiSelect.svelte.d.ts +21 -11
- package/package/components/select/Select.svelte +2 -1
- package/package/components/select/Select.svelte.d.ts +25 -13
- package/package/components/select/SelectDropdown.svelte.d.ts +14 -7
- package/package/components/settings/TokenDisplay.svelte +1 -1
- package/package/components/sidebar/OperatorMenu.svelte +5 -0
- package/package/components/sidebar/SidebarContent.svelte +48 -2
- package/package/components/sidebar/WorkspaceMenu.svelte +116 -17
- package/package/components/toast.js +6 -3
- package/package/components/triggers/AddTriggersButton.svelte +7 -6
- package/package/components/triggers/CaptureWrapper.svelte +19 -3
- package/package/components/triggers/TriggerLabel.svelte +8 -0
- package/package/components/triggers/TriggerTokens.svelte +1 -1
- package/package/components/triggers/TriggersEditor.svelte +9 -5
- package/package/components/triggers/TriggersTable.svelte +2 -2
- package/package/components/triggers/TriggersWrapper.svelte +16 -5
- package/package/components/triggers/TriggersWrapper.svelte.d.ts +3 -19
- package/package/components/{details/EmailTriggerCaptures.svelte → triggers/email/DefaultEmailCapture.svelte} +5 -5
- package/package/components/{details/EmailTriggerCaptures.svelte.d.ts → triggers/email/DefaultEmailCapture.svelte.d.ts} +4 -4
- package/package/components/{details/EmailTriggerConfigSection.svelte → triggers/email/DefaultEmailConfigSection.svelte} +24 -14
- package/package/components/triggers/email/DefaultEmailConfigSection.svelte.d.ts +13 -0
- package/package/components/triggers/email/DefaultEmailPanel.svelte +71 -0
- package/package/components/triggers/email/DefaultEmailPanel.svelte.d.ts +11 -0
- package/package/components/triggers/email/EmailCapture.svelte +39 -0
- package/package/components/triggers/email/EmailCapture.svelte.d.ts +43 -0
- package/package/components/triggers/email/EmailTriggerEditor.svelte +20 -0
- package/package/components/triggers/email/EmailTriggerEditor.svelte.d.ts +11 -0
- package/package/components/triggers/email/EmailTriggerEditorConfigSection.svelte +133 -0
- package/package/components/triggers/email/EmailTriggerEditorConfigSection.svelte.d.ts +14 -0
- package/package/components/triggers/email/EmailTriggerEditorInner.svelte +335 -0
- package/package/components/triggers/email/EmailTriggerEditorInner.svelte.d.ts +22 -0
- package/package/components/triggers/email/EmailTriggerPanel.svelte +61 -0
- package/package/components/triggers/email/EmailTriggerPanel.svelte.d.ts +14 -0
- package/package/components/triggers/email/utils.d.ts +4 -0
- package/package/components/triggers/email/utils.js +52 -0
- package/package/components/triggers/http/RouteEditorConfigSection.svelte +1 -1
- package/package/components/triggers/http/utils.js +1 -1
- package/package/components/triggers/triggers.svelte.d.ts +1 -0
- package/package/components/triggers/triggers.svelte.js +24 -2
- package/package/components/triggers/utils.js +19 -5
- package/package/components/triggers.d.ts +1 -1
- package/package/components/triggers.js +2 -0
- package/package/components/wizards/AgGridWizard.svelte +85 -80
- package/package/components/workspaceSettings/AISettings.svelte +74 -22
- package/package/components/workspaceSettings/AISettings.svelte.d.ts +2 -1
- package/package/components/workspaceSettings/CreateWorkspace.svelte +395 -0
- package/package/components/workspaceSettings/CreateWorkspace.svelte.d.ts +6 -0
- package/package/components/workspaceSettings/DucklakeSettings.svelte +3 -1
- package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +1 -1
- package/package/components/workspaceSettings/StorageSettings.svelte +69 -48
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/schemas.gen.d.ts +142 -3
- package/package/gen/schemas.gen.js +144 -3
- package/package/gen/services.gen.d.ts +129 -1
- package/package/gen/services.gen.js +267 -1
- package/package/gen/types.gen.d.ts +434 -8
- package/package/hubPaths.json +4 -2
- package/package/infer.js +1 -1
- package/package/keyboardChain.d.ts +5 -0
- package/package/keyboardChain.js +40 -0
- package/package/services/JobManager.js +2 -2
- package/package/stores.d.ts +3 -1
- package/package/stores.js +8 -5
- package/package/utils/workspaceHierarchy.d.ts +27 -0
- package/package/utils/workspaceHierarchy.js +101 -0
- package/package/utils.d.ts +6 -3
- package/package/utils.js +30 -15
- package/package/workspace_settings.js +2 -3
- package/package.json +9 -11
- package/package/components/DynSelect.svelte.d.ts +0 -11
- package/package/components/ObjectTypeNarrowing.svelte +0 -18
- package/package/components/ObjectTypeNarrowing.svelte.d.ts +0 -22
- package/package/components/details/DetailPageTriggerPanel.svelte +0 -121
- package/package/components/details/DetailPageTriggerPanel.svelte.d.ts +0 -20
- package/package/components/details/EmailTriggerConfigSection.svelte.d.ts +0 -12
- package/package/components/details/EmailTriggerPanel.svelte +0 -76
- package/package/components/details/EmailTriggerPanel.svelte.d.ts +0 -26
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
<script lang="ts">"use strict";
|
|
2
|
+
let { prefix = '', value = $bindable(''), placeholder = '', class: className = '', ...restProps } = $props();
|
|
3
|
+
let inputElement = $state(null);
|
|
4
|
+
let internalValue = $state(prefix + value);
|
|
5
|
+
// Update internal value when prop changes
|
|
6
|
+
$effect(() => {
|
|
7
|
+
internalValue = prefix + value;
|
|
8
|
+
});
|
|
9
|
+
function handleInput(e) {
|
|
10
|
+
const newValue = e.target.value;
|
|
11
|
+
// Ensure the value always starts with the prefix
|
|
12
|
+
if (newValue.startsWith(prefix)) {
|
|
13
|
+
internalValue = newValue;
|
|
14
|
+
value = newValue.slice(prefix.length);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
internalValue = prefix;
|
|
18
|
+
value = '';
|
|
19
|
+
// Reset cursor position
|
|
20
|
+
if (inputElement) {
|
|
21
|
+
inputElement.value = prefix;
|
|
22
|
+
inputElement.setSelectionRange(prefix.length, prefix.length);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function handleKeyDown(e) {
|
|
27
|
+
const cursorPos = e.target.selectionStart;
|
|
28
|
+
const selectionEnd = e.target.selectionEnd;
|
|
29
|
+
// Prevent backspace if cursor is at or before prefix end
|
|
30
|
+
if (e.key === 'Backspace') {
|
|
31
|
+
if (cursorPos <= prefix.length && selectionEnd <= prefix.length) {
|
|
32
|
+
e.preventDefault();
|
|
33
|
+
}
|
|
34
|
+
else if (cursorPos <= prefix.length && selectionEnd > prefix.length) {
|
|
35
|
+
// If selection spans across prefix, only delete after prefix
|
|
36
|
+
e.preventDefault();
|
|
37
|
+
const newValue = prefix + internalValue.slice(selectionEnd);
|
|
38
|
+
internalValue = newValue;
|
|
39
|
+
value = newValue.slice(prefix.length);
|
|
40
|
+
// Set cursor position after prefix
|
|
41
|
+
setTimeout(() => {
|
|
42
|
+
inputElement.setSelectionRange(prefix.length, prefix.length);
|
|
43
|
+
}, 0);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Prevent delete key within prefix
|
|
47
|
+
if (e.key === 'Delete' && cursorPos < prefix.length) {
|
|
48
|
+
e.preventDefault();
|
|
49
|
+
}
|
|
50
|
+
// Prevent selecting all (Ctrl+A) from selecting the prefix
|
|
51
|
+
if ((e.ctrlKey || e.metaKey) && e.key === 'a') {
|
|
52
|
+
e.preventDefault();
|
|
53
|
+
inputElement.setSelectionRange(prefix.length, internalValue.length);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function handleClick() {
|
|
57
|
+
// Prevent cursor from being placed within prefix
|
|
58
|
+
if ((inputElement.selectionStart ?? 0) < prefix.length) {
|
|
59
|
+
inputElement.setSelectionRange(prefix.length, prefix.length);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function handleFocus() {
|
|
63
|
+
// Ensure cursor starts after prefix when focusing
|
|
64
|
+
if ((inputElement.selectionStart ?? 0) < prefix.length) {
|
|
65
|
+
inputElement.setSelectionRange(prefix.length, prefix.length);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function handlePaste(e) {
|
|
69
|
+
e.preventDefault();
|
|
70
|
+
const pasteData = e.clipboardData.getData('text');
|
|
71
|
+
const cursorPos = inputElement.selectionStart ?? 0;
|
|
72
|
+
const selectionEnd = inputElement.selectionEnd ?? 0;
|
|
73
|
+
if (cursorPos < prefix.length) {
|
|
74
|
+
// Paste at the end of prefix
|
|
75
|
+
internalValue = prefix + pasteData + internalValue.slice(prefix.length);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
// Normal paste
|
|
79
|
+
internalValue =
|
|
80
|
+
internalValue.slice(0, cursorPos) + pasteData + internalValue.slice(selectionEnd);
|
|
81
|
+
}
|
|
82
|
+
value = internalValue.slice(prefix.length);
|
|
83
|
+
// Set cursor position after pasted content
|
|
84
|
+
const newCursorPos = Math.max(prefix.length, cursorPos) + pasteData.length;
|
|
85
|
+
setTimeout(() => {
|
|
86
|
+
inputElement.setSelectionRange(newCursorPos, newCursorPos);
|
|
87
|
+
}, 0);
|
|
88
|
+
}
|
|
89
|
+
</script>
|
|
90
|
+
|
|
91
|
+
<input
|
|
92
|
+
bind:this={inputElement}
|
|
93
|
+
type="text"
|
|
94
|
+
{placeholder}
|
|
95
|
+
class="prefixed-input {className}"
|
|
96
|
+
value={internalValue}
|
|
97
|
+
oninput={handleInput}
|
|
98
|
+
onkeydown={handleKeyDown}
|
|
99
|
+
onclick={handleClick}
|
|
100
|
+
onfocus={handleFocus}
|
|
101
|
+
onpaste={handlePaste}
|
|
102
|
+
{...restProps}
|
|
103
|
+
/>
|
|
104
|
+
|
|
105
|
+
<style>
|
|
106
|
+
.prefixed-input {
|
|
107
|
+
/* Default styles - can be overridden by class prop */
|
|
108
|
+
padding: 8px 12px;
|
|
109
|
+
border: 1px solid #ccc;
|
|
110
|
+
border-radius: 4px;
|
|
111
|
+
font-size: 14px;
|
|
112
|
+
width: 100%;
|
|
113
|
+
box-sizing: border-box;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.prefixed-input:focus {
|
|
117
|
+
outline: none;
|
|
118
|
+
border-color: #4caf50;
|
|
119
|
+
box-shadow: 0 0 0 2px rgba(76, 175, 80, 0.1);
|
|
120
|
+
}</style>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
declare const PrefixedInput: import("svelte").Component<{
|
|
2
|
+
prefix?: string;
|
|
3
|
+
value?: string;
|
|
4
|
+
placeholder?: string;
|
|
5
|
+
class?: string;
|
|
6
|
+
} & Record<string, any>, {}, "value">;
|
|
7
|
+
type PrefixedInput = ReturnType<typeof PrefixedInput>;
|
|
8
|
+
export default PrefixedInput;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
<script lang="ts">import { JobService } from '../gen';
|
|
2
|
+
import { workspaceStore } from '../stores';
|
|
3
|
+
let { jobId, workspaceId, minimal = false } = $props();
|
|
4
|
+
let queuePositionInterval;
|
|
5
|
+
let queueState = $state(undefined);
|
|
6
|
+
let fetchingQueuePosition = false;
|
|
7
|
+
let workspace = $derived(workspaceId ?? $workspaceStore);
|
|
8
|
+
let scheduledFor = $state(undefined);
|
|
9
|
+
let scheduledForTimeout;
|
|
10
|
+
$effect(() => {
|
|
11
|
+
if (jobId && workspace) {
|
|
12
|
+
clearTimeout(scheduledForTimeout);
|
|
13
|
+
queueState = undefined;
|
|
14
|
+
scheduledForTimeout = setTimeout(() => {
|
|
15
|
+
try {
|
|
16
|
+
JobService.getScheduledFor({
|
|
17
|
+
workspace: workspace,
|
|
18
|
+
id: jobId
|
|
19
|
+
}).then((response) => {
|
|
20
|
+
scheduledFor = response;
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
console.error('Failed to fetch scheduled for:', error);
|
|
25
|
+
}
|
|
26
|
+
}, 2000);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
$effect(() => {
|
|
30
|
+
// Fetch queue position when loading and we have jobId
|
|
31
|
+
if (scheduledFor) {
|
|
32
|
+
// Initial fetch
|
|
33
|
+
fetchQueuePosition();
|
|
34
|
+
// Set up interval to refresh every 2 seconds
|
|
35
|
+
queuePositionInterval = setInterval(() => {
|
|
36
|
+
fetchQueuePosition();
|
|
37
|
+
}, 5000);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
// Clear interval when not loading
|
|
41
|
+
if (queuePositionInterval) {
|
|
42
|
+
clearInterval(queuePositionInterval);
|
|
43
|
+
queuePositionInterval = undefined;
|
|
44
|
+
}
|
|
45
|
+
queueState = undefined;
|
|
46
|
+
}
|
|
47
|
+
return () => {
|
|
48
|
+
if (queuePositionInterval) {
|
|
49
|
+
scheduledForTimeout && clearTimeout(scheduledForTimeout);
|
|
50
|
+
clearInterval(queuePositionInterval);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
async function fetchQueuePosition() {
|
|
55
|
+
if (!workspace || !scheduledFor || fetchingQueuePosition)
|
|
56
|
+
return;
|
|
57
|
+
try {
|
|
58
|
+
fetchingQueuePosition = true;
|
|
59
|
+
queueState = await JobService.getQueuePosition({
|
|
60
|
+
workspace: workspace,
|
|
61
|
+
scheduledFor: scheduledFor
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
console.error('Failed to fetch queue position:', error);
|
|
66
|
+
queueState = undefined;
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
fetchingQueuePosition = false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
</script>
|
|
73
|
+
|
|
74
|
+
{#if queueState}
|
|
75
|
+
<div class="text-small ml-4">
|
|
76
|
+
<span class="text-orange-600">Queue position: <b>{queueState.position}</b></span>
|
|
77
|
+
{#if !minimal}
|
|
78
|
+
<span class="ml-2 text-tertiary">(Waiting for an available worker)</span>
|
|
79
|
+
{/if}
|
|
80
|
+
</div>
|
|
81
|
+
{/if}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
type $$ComponentProps = {
|
|
2
|
+
jobId: string;
|
|
3
|
+
workspaceId?: string | undefined;
|
|
4
|
+
minimal?: boolean;
|
|
5
|
+
};
|
|
6
|
+
declare const QueuePosition: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
7
|
+
type QueuePosition = ReturnType<typeof QueuePosition>;
|
|
8
|
+
export default QueuePosition;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<script lang="ts">import ResourceTypePicker from './ResourceTypePicker.svelte';
|
|
2
|
+
let { format = $bindable() } = $props();
|
|
3
|
+
let resource = $state(format?.startsWith('resource-') ? format.substring('resource-'.length) : undefined);
|
|
4
|
+
</script>
|
|
5
|
+
|
|
6
|
+
<ResourceTypePicker
|
|
7
|
+
on:click={(e) => {
|
|
8
|
+
resource = e.detail
|
|
9
|
+
format = `resource-${resource ?? ''}`
|
|
10
|
+
}}
|
|
11
|
+
value={resource}
|
|
12
|
+
nonePickable={true}
|
|
13
|
+
/>
|
|
@@ -3,8 +3,6 @@ import { ResourceService } from '../gen';
|
|
|
3
3
|
import { workspaceStore } from '../stores';
|
|
4
4
|
import IconedResourceType from './IconedResourceType.svelte';
|
|
5
5
|
import { Button, ClearableInput } from './common';
|
|
6
|
-
import Popover from './meltComponents/Popover.svelte';
|
|
7
|
-
import { offset, flip, shift } from 'svelte-floating-ui/dom';
|
|
8
6
|
import Label from './Label.svelte';
|
|
9
7
|
import Tooltip from './Tooltip.svelte';
|
|
10
8
|
import Badge from './common/badge/Badge.svelte';
|
|
@@ -30,84 +28,61 @@ let search = $state('');
|
|
|
30
28
|
let filteredResources = $derived(resources.filter((r) => r.toLowerCase().includes(search.toLowerCase())));
|
|
31
29
|
</script>
|
|
32
30
|
|
|
33
|
-
<Label label="Resource type" class="w-full
|
|
31
|
+
<Label label="Resource type" class="w-full mb-4">
|
|
34
32
|
{#snippet header()}
|
|
35
33
|
<Tooltip light small>Select a resource type to narrow down the object type.</Tooltip>
|
|
34
|
+
|
|
35
|
+
<div class="flex flex-row items-center w-full justify-between">
|
|
36
|
+
<Badge color={!value ? 'gray' : 'blue'}>
|
|
37
|
+
{value ?? 'None'}
|
|
38
|
+
</Badge>
|
|
39
|
+
</div>
|
|
36
40
|
{/snippet}
|
|
37
41
|
|
|
38
|
-
|
|
39
|
-
<
|
|
40
|
-
<Button
|
|
41
|
-
size="xs"
|
|
42
|
-
color="light"
|
|
43
|
-
on:click={() => onClick(undefined)}
|
|
44
|
-
disabled={notPickable || value === undefined}
|
|
45
|
-
>
|
|
46
|
-
Clear
|
|
47
|
-
</Button>
|
|
48
|
-
<Popover
|
|
49
|
-
floatingConfig={{
|
|
50
|
-
strategy: 'fixed',
|
|
51
|
-
placement: 'left-end',
|
|
52
|
-
middleware: [offset(8), flip(), shift()]
|
|
53
|
-
}}
|
|
54
|
-
contentClasses="flex flex-col gap-2 h-full p-4 max-h-[40vh] w-[500px]"
|
|
55
|
-
>
|
|
56
|
-
{#snippet trigger()}
|
|
57
|
-
<Button nonCaptureEvent size="xs" color="dark">Select resource type</Button>
|
|
58
|
-
{/snippet}
|
|
59
|
-
{#snippet content({ close })}
|
|
60
|
-
<ClearableInput bind:value={search} placeholder="Search resource..." />
|
|
42
|
+
<div class="mt-2">
|
|
43
|
+
<ClearableInput bind:value={search} placeholder="Search resource..." />
|
|
61
44
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
45
|
+
<div class="overflow-y-scroll max-h-[330px] h-full mt-1">
|
|
46
|
+
<div
|
|
47
|
+
class="grid sm:grid-cols-2 md:grid-cols-3 gap-x-2 gap-y-1 items-center overflow-x-hidden"
|
|
48
|
+
>
|
|
49
|
+
{#if nonePickable && search === ''}
|
|
50
|
+
{@const isPicked = value === undefined}
|
|
51
|
+
<Button
|
|
52
|
+
size="sm"
|
|
53
|
+
variant="border"
|
|
54
|
+
color={isPicked ? 'blue' : 'light'}
|
|
55
|
+
btnClasses={isPicked ? '!border-2' : 'm-[1px]'}
|
|
56
|
+
disabled={notPickable}
|
|
57
|
+
on:click={() => {
|
|
58
|
+
onClick(undefined)
|
|
59
|
+
close()
|
|
60
|
+
}}
|
|
61
|
+
>
|
|
62
|
+
None
|
|
63
|
+
</Button>
|
|
64
|
+
{/if}
|
|
65
|
+
{#each filteredResources as r}
|
|
66
|
+
{@const isPicked = value === r}
|
|
67
|
+
<Button
|
|
68
|
+
size="sm"
|
|
69
|
+
variant="border"
|
|
70
|
+
color={isPicked ? 'blue' : 'light'}
|
|
71
|
+
btnClasses={isPicked ? '!border-2' : 'm-[1px]'}
|
|
72
|
+
disabled={notPickable}
|
|
73
|
+
on:click={() => {
|
|
74
|
+
onClick(r)
|
|
75
|
+
close()
|
|
76
|
+
}}
|
|
77
|
+
>
|
|
78
|
+
<IconedResourceType name={r} after={true} width="20px" height="20px" />
|
|
79
|
+
</Button>
|
|
80
|
+
{/each}
|
|
98
81
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
</div>
|
|
104
|
-
{/snippet}
|
|
105
|
-
</Popover>
|
|
82
|
+
{#if filteredResources.length === 0 && search !== ''}
|
|
83
|
+
<div class="text-tertiary text-sm">No resources found</div>
|
|
84
|
+
{/if}
|
|
85
|
+
</div>
|
|
106
86
|
</div>
|
|
107
|
-
{/snippet}
|
|
108
|
-
<div class="flex flex-row items-center w-full justify-between">
|
|
109
|
-
<Badge color={!value ? 'gray' : 'blue'}>
|
|
110
|
-
{value ?? 'None'}
|
|
111
|
-
</Badge>
|
|
112
87
|
</div>
|
|
113
88
|
</Label>
|
|
@@ -2,60 +2,23 @@
|
|
|
2
2
|
import zoomPlugin from 'chartjs-plugin-zoom';
|
|
3
3
|
import Tooltip2 from './Tooltip.svelte';
|
|
4
4
|
import { Chart as ChartJS, Title, Tooltip, Legend, LineElement, CategoryScale, LinearScale, PointElement, TimeScale, LogarithmicScale } from 'chart.js';
|
|
5
|
-
import { createEventDispatcher } from 'svelte';
|
|
6
5
|
import { getDbClockNow } from '../forLater';
|
|
7
6
|
import Button from './common/button/Button.svelte';
|
|
8
7
|
import { Scatter } from './chartjs-wrappers/chartJs';
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
export let minTimeSet = undefined;
|
|
12
|
-
export let maxTimeSet = undefined;
|
|
13
|
-
export let selectedIds = [];
|
|
14
|
-
export let canSelect = true;
|
|
15
|
-
export let lastFetchWentToEnd = false;
|
|
16
|
-
const dispatch = createEventDispatcher();
|
|
8
|
+
import DarkModeObserver from './DarkModeObserver.svelte';
|
|
9
|
+
let { jobs = [], maxIsNow = false, minTimeSet = undefined, maxTimeSet = undefined, selectedIds = $bindable([]), canSelect = true, lastFetchWentToEnd = false, onPointClicked, onLoadExtra, onZoom } = $props();
|
|
17
10
|
const SUCCESS_COLOR = '#4ade80';
|
|
18
11
|
// const SUCCESS_COLOR_TRANSPARENT = '#c9b638'
|
|
19
|
-
const SUCCESS_COLOR_TRANSPARENT = mergeColors(SUCCESS_COLOR,
|
|
12
|
+
const SUCCESS_COLOR_TRANSPARENT = $derived(mergeColors(SUCCESS_COLOR, getBackgroundColor(), 0.8));
|
|
20
13
|
const FAIL_COLOR = '#f87171';
|
|
21
|
-
const FAIL_COLOR_TRANSPARENT = mergeColors(FAIL_COLOR,
|
|
22
|
-
$: success = jobs?.filter((x) => x.success);
|
|
23
|
-
$: failed = jobs?.filter((x) => !x.success);
|
|
14
|
+
const FAIL_COLOR_TRANSPARENT = $derived(mergeColors(FAIL_COLOR, getBackgroundColor(), 0.8));
|
|
24
15
|
ChartJS.register(Title, Tooltip, Legend, zoomPlugin, LineElement, CategoryScale, LinearScale, LogarithmicScale, PointElement, TimeScale);
|
|
25
|
-
$: data = {
|
|
26
|
-
datasets: [
|
|
27
|
-
{
|
|
28
|
-
borderColor: 'rgba(99,0,125, 0)',
|
|
29
|
-
backgroundColor: FAIL_COLOR,
|
|
30
|
-
radius: 3,
|
|
31
|
-
label: 'Failed',
|
|
32
|
-
data: failed?.map((job) => ({
|
|
33
|
-
x: job.started_at,
|
|
34
|
-
y: job.duration_ms,
|
|
35
|
-
id: job.id,
|
|
36
|
-
path: job.script_path
|
|
37
|
-
})) ?? []
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
borderColor: 'rgba(99,0,125, 0)',
|
|
41
|
-
backgroundColor: SUCCESS_COLOR,
|
|
42
|
-
radius: 3,
|
|
43
|
-
label: 'Successful',
|
|
44
|
-
data: success?.map((job) => ({
|
|
45
|
-
x: job.started_at,
|
|
46
|
-
y: job.duration_ms,
|
|
47
|
-
id: job.id,
|
|
48
|
-
path: job.script_path
|
|
49
|
-
})) ?? []
|
|
50
|
-
}
|
|
51
|
-
]
|
|
52
|
-
};
|
|
53
16
|
const zoomOptions = {
|
|
54
17
|
pan: {
|
|
55
18
|
enabled: true,
|
|
56
19
|
modifierKey: 'ctrl',
|
|
57
20
|
onPanComplete: ({ chart }) => {
|
|
58
|
-
|
|
21
|
+
onZoom({
|
|
59
22
|
min: addSeconds(new Date(chart.scales.x.min), -1),
|
|
60
23
|
max: addSeconds(new Date(chart.scales.x.max), 1)
|
|
61
24
|
});
|
|
@@ -67,20 +30,20 @@ const zoomOptions = {
|
|
|
67
30
|
},
|
|
68
31
|
mode: 'x',
|
|
69
32
|
onZoom: ({ chart }) => {
|
|
70
|
-
|
|
33
|
+
onZoom({
|
|
71
34
|
min: addSeconds(new Date(chart.scales.x.min), -1),
|
|
72
35
|
max: addSeconds(new Date(chart.scales.x.max), 1)
|
|
73
36
|
});
|
|
74
37
|
}
|
|
75
38
|
}
|
|
76
39
|
};
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
ChartJS.defaults.
|
|
81
|
-
|
|
82
|
-
function
|
|
83
|
-
return
|
|
40
|
+
let darkMode = $state(false);
|
|
41
|
+
$effect(() => {
|
|
42
|
+
ChartJS.defaults.color = darkMode ? '#ccc' : '#666';
|
|
43
|
+
ChartJS.defaults.borderColor = darkMode ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.1)';
|
|
44
|
+
});
|
|
45
|
+
function getBackgroundColor() {
|
|
46
|
+
return darkMode ? '#2e3440' : '#ffffff';
|
|
84
47
|
}
|
|
85
48
|
function hexToRgb(hexColor) {
|
|
86
49
|
hexColor = hexColor.replace(/^#/, '');
|
|
@@ -106,22 +69,9 @@ function mergeColors(color1, color2, slider) {
|
|
|
106
69
|
const blendedRgb = rgb1.map((c1, i) => Math.round(c1 * (1 - slider) + rgb2[i] * slider));
|
|
107
70
|
return rgbToHex(blendedRgb);
|
|
108
71
|
}
|
|
109
|
-
function highlightSelectedPoints(ids) {
|
|
110
|
-
if (!canSelect || ids.length === 0) {
|
|
111
|
-
data.datasets[0].backgroundColor = FAIL_COLOR;
|
|
112
|
-
data.datasets[1].backgroundColor = SUCCESS_COLOR;
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
data.datasets[0].backgroundColor = data.datasets[0].data.map((p) => ids.includes(p.id) ? FAIL_COLOR : FAIL_COLOR_TRANSPARENT);
|
|
116
|
-
data.datasets[1].backgroundColor = data.datasets[1].data.map((p) => ids.includes(p.id) ? SUCCESS_COLOR : SUCCESS_COLOR_TRANSPARENT);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
72
|
function getPath(x) {
|
|
120
73
|
return x.path;
|
|
121
74
|
}
|
|
122
|
-
let minTime = addSeconds(new Date(), -300);
|
|
123
|
-
let maxTime = getDbClockNow();
|
|
124
|
-
$: computeMinMaxTime(jobs, minTimeSet, maxTimeSet);
|
|
125
75
|
function minJobTime(jobs) {
|
|
126
76
|
let min = new Date(jobs[0].started_at);
|
|
127
77
|
for (const job of jobs) {
|
|
@@ -147,31 +97,69 @@ function computeMinMaxTime(jobs, minTimeSet, maxTimeSet) {
|
|
|
147
97
|
let minTimeSetDate = minTimeSet ? new Date(minTimeSet) : undefined;
|
|
148
98
|
let maxTimeSetDate = maxTimeSet ? new Date(maxTimeSet) : undefined;
|
|
149
99
|
if (minTimeSetDate && maxTimeSetDate) {
|
|
150
|
-
minTime
|
|
151
|
-
maxTime = maxTimeSetDate;
|
|
152
|
-
return;
|
|
100
|
+
return { minTime: minTimeSetDate, maxTime: maxTimeSetDate };
|
|
153
101
|
}
|
|
154
102
|
if (jobs == undefined || jobs?.length == 0) {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
return;
|
|
103
|
+
const computedMinTime = minTimeSetDate ?? addSeconds(new Date(), -300);
|
|
104
|
+
const computedMaxTime = maxTimeSetDate ?? getDbClockNow();
|
|
105
|
+
return { minTime: computedMinTime, maxTime: computedMaxTime };
|
|
158
106
|
}
|
|
159
107
|
const maxJob = maxIsNow ? getDbClockNow() : maxJobTime(jobs);
|
|
160
108
|
const minJob = minJobTime(jobs);
|
|
161
109
|
const diff = (maxJob.getTime() - minJob.getTime()) / 20000;
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
maxTime = maxTimeSetDate ?? addSeconds(maxJob, diff);
|
|
168
|
-
}
|
|
110
|
+
let computedMinTime = minTimeSetDate ?? addSeconds(minJob, -diff);
|
|
111
|
+
let computedMaxTime = maxIsNow
|
|
112
|
+
? (maxTimeSetDate ?? maxJob)
|
|
113
|
+
: (maxTimeSetDate ?? addSeconds(maxJob, diff));
|
|
114
|
+
return { minTime: computedMinTime, maxTime: computedMaxTime };
|
|
169
115
|
}
|
|
170
116
|
function addSeconds(date, seconds) {
|
|
171
117
|
date.setTime(date.getTime() + seconds * 1000);
|
|
172
118
|
return date;
|
|
173
119
|
}
|
|
174
|
-
|
|
120
|
+
let success = $derived(jobs?.filter((x) => x.success));
|
|
121
|
+
let failed = $derived(jobs?.filter((x) => !x.success));
|
|
122
|
+
let data = $derived.by(() => {
|
|
123
|
+
const data = {
|
|
124
|
+
datasets: [
|
|
125
|
+
{
|
|
126
|
+
borderColor: 'rgba(99,0,125, 0)',
|
|
127
|
+
backgroundColor: FAIL_COLOR,
|
|
128
|
+
radius: 3,
|
|
129
|
+
label: 'Failed',
|
|
130
|
+
data: failed?.map((job) => ({
|
|
131
|
+
x: job.started_at,
|
|
132
|
+
y: job.duration_ms,
|
|
133
|
+
id: job.id,
|
|
134
|
+
path: job.script_path
|
|
135
|
+
})) ?? []
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
borderColor: 'rgba(99,0,125, 0)',
|
|
139
|
+
backgroundColor: SUCCESS_COLOR,
|
|
140
|
+
radius: 3,
|
|
141
|
+
label: 'Successful',
|
|
142
|
+
data: success?.map((job) => ({
|
|
143
|
+
x: job.started_at,
|
|
144
|
+
y: job.duration_ms,
|
|
145
|
+
id: job.id,
|
|
146
|
+
path: job.script_path
|
|
147
|
+
})) ?? []
|
|
148
|
+
}
|
|
149
|
+
]
|
|
150
|
+
};
|
|
151
|
+
if (!canSelect || selectedIds.length === 0) {
|
|
152
|
+
data.datasets[0].backgroundColor = FAIL_COLOR;
|
|
153
|
+
data.datasets[1].backgroundColor = SUCCESS_COLOR;
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
data.datasets[0].backgroundColor = data.datasets[0].data.map((p) => selectedIds.includes(p.id) ? FAIL_COLOR : FAIL_COLOR_TRANSPARENT);
|
|
157
|
+
data.datasets[1].backgroundColor = data.datasets[1].data.map((p) => selectedIds.includes(p.id) ? SUCCESS_COLOR : SUCCESS_COLOR_TRANSPARENT);
|
|
158
|
+
}
|
|
159
|
+
return data;
|
|
160
|
+
});
|
|
161
|
+
const minMaxTime = $derived.by(() => computeMinMaxTime(jobs, minTimeSet, maxTimeSet));
|
|
162
|
+
let scatterOptions = $derived({
|
|
175
163
|
responsive: true,
|
|
176
164
|
maintainAspectRatio: false,
|
|
177
165
|
plugins: {
|
|
@@ -187,11 +175,11 @@ $: scatterOptions = {
|
|
|
187
175
|
}
|
|
188
176
|
}
|
|
189
177
|
},
|
|
190
|
-
onClick: (
|
|
178
|
+
onClick: (_e, u) => {
|
|
191
179
|
if (canSelect) {
|
|
192
180
|
const ids = u.map((j) => data.datasets[j.datasetIndex].data[j.index].id);
|
|
193
181
|
selectedIds = ids;
|
|
194
|
-
|
|
182
|
+
onPointClicked(ids);
|
|
195
183
|
}
|
|
196
184
|
},
|
|
197
185
|
scales: {
|
|
@@ -200,8 +188,8 @@ $: scatterOptions = {
|
|
|
200
188
|
grid: {
|
|
201
189
|
display: false
|
|
202
190
|
},
|
|
203
|
-
min: minTime,
|
|
204
|
-
max: maxTime
|
|
191
|
+
min: minMaxTime.minTime,
|
|
192
|
+
max: minMaxTime.maxTime
|
|
205
193
|
},
|
|
206
194
|
y: {
|
|
207
195
|
grid: {
|
|
@@ -215,10 +203,11 @@ $: scatterOptions = {
|
|
|
215
203
|
}
|
|
216
204
|
},
|
|
217
205
|
animation: false
|
|
218
|
-
};
|
|
219
|
-
$: data && scatterOptions && highlightSelectedPoints(selectedIds);
|
|
206
|
+
});
|
|
220
207
|
</script>
|
|
221
208
|
|
|
209
|
+
<DarkModeObserver bind:darkMode />
|
|
210
|
+
|
|
222
211
|
<!-- {JSON.stringify(minTime)}
|
|
223
212
|
{JSON.stringify(maxTime)}
|
|
224
213
|
|
|
@@ -228,12 +217,8 @@ $: data && scatterOptions && highlightSelectedPoints(selectedIds);
|
|
|
228
217
|
<!-- {JSON.stringify(jobs?.map((x) => x.started_at))} -->
|
|
229
218
|
<div class="relative max-h-40">
|
|
230
219
|
{#if !lastFetchWentToEnd}
|
|
231
|
-
<div class="absolute top-[-
|
|
232
|
-
><Button
|
|
233
|
-
size="xs"
|
|
234
|
-
color="transparent"
|
|
235
|
-
variant="contained"
|
|
236
|
-
on:click={() => dispatch('loadExtra')}
|
|
220
|
+
<div class="absolute top-[-26px] left-[160px]"
|
|
221
|
+
><Button size="xs" color="transparent" variant="contained" on:click={() => onLoadExtra()}
|
|
237
222
|
>Load more <Tooltip2
|
|
238
223
|
>There are more jobs to load but only the first 1000 were fetched</Tooltip2
|
|
239
224
|
></Button
|