windmill-components 1.537.1 → 1.542.4
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/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/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,181 @@
|
|
|
1
|
+
<script lang="ts">import {} from 'svelte';
|
|
2
|
+
import Select from './select/Select.svelte';
|
|
3
|
+
import { fetchAvailableModels, AI_PROVIDERS } from './copilot/lib';
|
|
4
|
+
import { workspaceStore } from '../stores';
|
|
5
|
+
import { get } from 'svelte/store';
|
|
6
|
+
import ToggleButtonGroup from './common/toggleButton-v2/ToggleButtonGroup.svelte';
|
|
7
|
+
import ToggleButton from './common/toggleButton-v2/ToggleButton.svelte';
|
|
8
|
+
import ResourcePicker from './ResourcePicker.svelte';
|
|
9
|
+
let { value = $bindable(), disabled = false, actions } = $props();
|
|
10
|
+
// Initialize value if undefined
|
|
11
|
+
if (!value) {
|
|
12
|
+
const providers = Object.keys(AI_PROVIDERS);
|
|
13
|
+
value = {
|
|
14
|
+
kind: providers.length > 0 ? providers[0] : undefined,
|
|
15
|
+
resource: undefined,
|
|
16
|
+
model: undefined
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
let loading = $state(false);
|
|
20
|
+
let availableModels = $state([]);
|
|
21
|
+
let filterText = $state('');
|
|
22
|
+
let modelsCache = new Map();
|
|
23
|
+
// Reactive items for the Select component
|
|
24
|
+
let items = $derived.by(() => {
|
|
25
|
+
const r = availableModels.map((model) => ({
|
|
26
|
+
label: model,
|
|
27
|
+
value: model
|
|
28
|
+
}));
|
|
29
|
+
if (value?.model && !availableModels.find((model) => model === value.model)) {
|
|
30
|
+
r.push({
|
|
31
|
+
label: value.model,
|
|
32
|
+
value: value.model
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return r;
|
|
36
|
+
});
|
|
37
|
+
// Provider options for the toggle button group
|
|
38
|
+
const providerOptions = Object.entries(AI_PROVIDERS).map(([key, details]) => ({
|
|
39
|
+
value: key,
|
|
40
|
+
label: details.label
|
|
41
|
+
}));
|
|
42
|
+
async function loadModels(signal) {
|
|
43
|
+
const provider = value?.kind;
|
|
44
|
+
const resourceValue = value?.resource;
|
|
45
|
+
const resourcePath = resourceValueToPath(resourceValue);
|
|
46
|
+
if (!provider || !resourcePath) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
loading = true;
|
|
50
|
+
if (modelsCache.has(provider)) {
|
|
51
|
+
availableModels = modelsCache.get(provider) || [];
|
|
52
|
+
loading = false;
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
const workspace = get(workspaceStore) || '';
|
|
57
|
+
const models = await fetchAvailableModels(resourcePath, workspace, provider, signal);
|
|
58
|
+
if (signal?.aborted) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
availableModels = models;
|
|
62
|
+
modelsCache.set(provider, models);
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
if (signal?.aborted) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
// Fall back to default models for this provider
|
|
69
|
+
const defaultModels = AI_PROVIDERS[provider]?.defaultModels || [];
|
|
70
|
+
availableModels = defaultModels;
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
if (!signal?.aborted) {
|
|
74
|
+
loading = false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Reload models when provider or resourcePath changes
|
|
79
|
+
$effect(() => {
|
|
80
|
+
const abortController = new AbortController();
|
|
81
|
+
const provider = value?.kind;
|
|
82
|
+
const resourceValue = value?.resource;
|
|
83
|
+
const resourcePath = resourceValueToPath(resourceValue);
|
|
84
|
+
filterText = '';
|
|
85
|
+
if (provider && resourcePath) {
|
|
86
|
+
loadModels(abortController.signal);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
const defaultModels = provider ? AI_PROVIDERS[provider]?.defaultModels || [] : [];
|
|
90
|
+
availableModels = defaultModels;
|
|
91
|
+
loading = false;
|
|
92
|
+
}
|
|
93
|
+
return () => {
|
|
94
|
+
abortController.abort();
|
|
95
|
+
};
|
|
96
|
+
});
|
|
97
|
+
// Handle provider selection
|
|
98
|
+
function onProviderChange(selectedProvider) {
|
|
99
|
+
if (value) {
|
|
100
|
+
value.kind = selectedProvider;
|
|
101
|
+
value.resource = undefined;
|
|
102
|
+
value.model = undefined;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Helper functions to handle $res: prefix like ObjectResourceInput does
|
|
106
|
+
function isResource(resourceValue) {
|
|
107
|
+
return (typeof resourceValue === 'string' &&
|
|
108
|
+
resourceValue.length >= '$res:'.length &&
|
|
109
|
+
resourceValue.startsWith('$res:'));
|
|
110
|
+
}
|
|
111
|
+
function resourceValueToPath(resourceValue) {
|
|
112
|
+
if (isResource(resourceValue)) {
|
|
113
|
+
return resourceValue.substring('$res:'.length);
|
|
114
|
+
}
|
|
115
|
+
return resourceValue;
|
|
116
|
+
}
|
|
117
|
+
function pathToResourceValue(path) {
|
|
118
|
+
if (path == undefined) {
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
return `$res:${path}`;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
</script>
|
|
126
|
+
|
|
127
|
+
<div class="w-full flex flex-col gap-3">
|
|
128
|
+
<!-- Provider Selection -->
|
|
129
|
+
<div class="flex flex-col gap-2">
|
|
130
|
+
<ToggleButtonGroup selected={value?.kind} onSelected={onProviderChange} {disabled} wrap>
|
|
131
|
+
{#snippet children({ item })}
|
|
132
|
+
{#each providerOptions as option}
|
|
133
|
+
<ToggleButton value={option.value} label={option.label} {item} />
|
|
134
|
+
{/each}
|
|
135
|
+
{/snippet}
|
|
136
|
+
</ToggleButtonGroup>
|
|
137
|
+
</div>
|
|
138
|
+
|
|
139
|
+
<!-- Resource Selection -->
|
|
140
|
+
<div class="flex flex-col border border-gray-200 rounded-md p-2 gap-2">
|
|
141
|
+
<div class="flex flex-col gap-1">
|
|
142
|
+
<p class="text-sm font-medium text-primary">resource</p>
|
|
143
|
+
<ResourcePicker
|
|
144
|
+
bind:value={
|
|
145
|
+
() => resourceValueToPath(value?.resource),
|
|
146
|
+
(v) => {
|
|
147
|
+
if (value) {
|
|
148
|
+
value.resource = pathToResourceValue(v)
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
resourceType={value?.kind}
|
|
153
|
+
disabled={disabled || !value?.kind}
|
|
154
|
+
placeholder="Select resource"
|
|
155
|
+
selectFirst={true}
|
|
156
|
+
/>
|
|
157
|
+
</div>
|
|
158
|
+
|
|
159
|
+
<!-- Model Selection -->
|
|
160
|
+
<div class="flex flex-col gap-1">
|
|
161
|
+
<p class="text-sm font-medium text-primary">model</p>
|
|
162
|
+
<Select
|
|
163
|
+
{items}
|
|
164
|
+
bind:value={value.model}
|
|
165
|
+
placeholder="Select model"
|
|
166
|
+
disabled={disabled || !value?.kind || !resourceValueToPath(value?.resource)}
|
|
167
|
+
onCreateItem={(r) => {
|
|
168
|
+
availableModels.push(r)
|
|
169
|
+
value.model = r
|
|
170
|
+
}}
|
|
171
|
+
createText="Press enter to use custom model"
|
|
172
|
+
{loading}
|
|
173
|
+
clearable={false}
|
|
174
|
+
noItemsMsg={'No models available'}
|
|
175
|
+
bind:filterText
|
|
176
|
+
/>
|
|
177
|
+
</div>
|
|
178
|
+
</div>
|
|
179
|
+
|
|
180
|
+
{@render actions?.()}
|
|
181
|
+
</div>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Snippet } from 'svelte';
|
|
2
|
+
import type { AIProvider } from '../gen';
|
|
3
|
+
interface ProviderValue {
|
|
4
|
+
kind?: AIProvider;
|
|
5
|
+
resource?: string;
|
|
6
|
+
model?: string;
|
|
7
|
+
}
|
|
8
|
+
interface Props {
|
|
9
|
+
value: ProviderValue | undefined;
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
actions?: Snippet;
|
|
12
|
+
}
|
|
13
|
+
declare const AiProviderPicker: import("svelte").Component<Props, {}, "value">;
|
|
14
|
+
type AiProviderPicker = ReturnType<typeof AiProviderPicker>;
|
|
15
|
+
export default AiProviderPicker;
|
|
@@ -86,14 +86,14 @@ async function getVariable(path) {
|
|
|
86
86
|
<div class="relative">
|
|
87
87
|
{#if JSON.stringify(value).length > 120}
|
|
88
88
|
<button
|
|
89
|
-
class="text-xs absolute top-0 right-
|
|
89
|
+
class="text-xs absolute top-0 right-8 text-tertiary"
|
|
90
90
|
onclick={() => {
|
|
91
91
|
jsonViewerContent = value
|
|
92
92
|
jsonViewer?.toggleDrawer()
|
|
93
93
|
}}><Expand size={18} /></button
|
|
94
94
|
>
|
|
95
95
|
{/if}
|
|
96
|
-
<div class="max-h-60 overflow-auto">
|
|
96
|
+
<div class="max-h-60 overflow-auto" style="scrollbar-gutter: stable">
|
|
97
97
|
<ObjectViewer collapsed={false} topBrackets={true} pureViewer={true} json={value} />
|
|
98
98
|
</div>
|
|
99
99
|
</div>
|
|
@@ -23,13 +23,14 @@ import ToggleButton from './common/toggleButton-v2/ToggleButton.svelte';
|
|
|
23
23
|
import SchemaFormDnd from './schema/SchemaFormDND.svelte';
|
|
24
24
|
import SchemaForm from './SchemaForm.svelte';
|
|
25
25
|
import { deepEqual } from 'fast-equals';
|
|
26
|
-
import
|
|
26
|
+
import DynamicInput from './DynamicInput.svelte';
|
|
27
27
|
import MultiSelect from './select/MultiSelect.svelte';
|
|
28
28
|
import { safeSelectItems } from './select/utils.svelte';
|
|
29
29
|
import S3ArgInput from './common/fileUpload/S3ArgInput.svelte';
|
|
30
30
|
import { base } from '../base';
|
|
31
31
|
import { workspaceStore } from '../stores';
|
|
32
32
|
import { getJsonSchemaFromResource } from './schema/jsonSchemaResource.svelte';
|
|
33
|
+
import AIProviderPicker from './AIProviderPicker.svelte';
|
|
33
34
|
let { label = '', value = $bindable(), defaultValue = $bindable(undefined), description = $bindable(undefined), format = $bindable(undefined), contentEncoding = undefined, type = undefined, oneOf = $bindable(undefined), required = false, pattern = $bindable(undefined), valid = $bindable(undefined), enum_ = $bindable(undefined), disabled = false, itemsType = $bindable(undefined), displayHeader = true, properties = $bindable(undefined), nestedRequired = undefined, autofocus = null, compact = false, password = false, pickForField = $bindable(undefined), variableEditor = undefined, itemPicker = undefined, noMargin = false, extra = {}, minW = true, prettifyHeader = false, resourceTypes, disablePortal = false, showSchemaExplorer = false, simpleTooltip = undefined, customErrorMessage = undefined, onlyMaskPassword = false, nullable = false, title = $bindable(undefined), placeholder = $bindable(undefined), order = $bindable(undefined), editor = $bindable(undefined), orderEditable = false, shouldDispatchChanges = false, noDefaultOnSelectFirst = false, helperScript = undefined, otherArgs = {}, lightHeader = false, diffStatus = undefined, hideNested = false, nestedParent = undefined, nestedClasses = '', displayType = true, css = undefined, appPath = undefined, computeS3ForceViewerPolicies = undefined, workspace = undefined, actions } = $props();
|
|
34
35
|
$effect(() => {
|
|
35
36
|
if (description == undefined) {
|
|
@@ -206,6 +207,10 @@ export function focus() {
|
|
|
206
207
|
el.style.height = el.scrollHeight + 50 + 'px';
|
|
207
208
|
}
|
|
208
209
|
}
|
|
210
|
+
const EMAIL_PATTERN = '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$';
|
|
211
|
+
const IPV4_PATTERN = '^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$';
|
|
212
|
+
const UUID_PATTERN = '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$';
|
|
213
|
+
const IPV6_PATTERN = '^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$';
|
|
209
214
|
function validateInput(pattern, v, required) {
|
|
210
215
|
if (nullable && emptyString(v)) {
|
|
211
216
|
error = '';
|
|
@@ -232,6 +237,18 @@ function validateInput(pattern, v, required) {
|
|
|
232
237
|
!valid && (valid = true);
|
|
233
238
|
}
|
|
234
239
|
}
|
|
240
|
+
else if (type == 'string' && format == 'email' && !testRegex(EMAIL_PATTERN, v)) {
|
|
241
|
+
error = 'invalid email address';
|
|
242
|
+
}
|
|
243
|
+
else if (type == 'string' && format == 'ipv4' && !testRegex(IPV4_PATTERN, v)) {
|
|
244
|
+
error = 'invalid IPv4 address';
|
|
245
|
+
}
|
|
246
|
+
else if (type == 'string' && format == 'ipv6' && !testRegex(IPV6_PATTERN, v)) {
|
|
247
|
+
error = 'invalid IPv6 address';
|
|
248
|
+
}
|
|
249
|
+
else if (type == 'string' && format == 'uuid' && !testRegex(UUID_PATTERN, v)) {
|
|
250
|
+
error = 'invalid UUID';
|
|
251
|
+
}
|
|
235
252
|
else if (pattern && !testRegex(pattern, v)) {
|
|
236
253
|
if (!emptyString(customErrorMessage)) {
|
|
237
254
|
error = customErrorMessage ?? '';
|
|
@@ -506,6 +523,19 @@ onDestroy(() => {
|
|
|
506
523
|
editTab="inputEditor"
|
|
507
524
|
noPreview
|
|
508
525
|
addPropertyInEditorTab
|
|
526
|
+
on:delete={(e) => {
|
|
527
|
+
// Handle property deletion
|
|
528
|
+
if (value && value.properties && value.properties[e.detail]) {
|
|
529
|
+
delete value.properties[e.detail]
|
|
530
|
+
// Also remove from order array if it exists
|
|
531
|
+
if (value.order) {
|
|
532
|
+
value.order = value.order.filter((key) => key !== e.detail)
|
|
533
|
+
}
|
|
534
|
+
// Update the value to trigger reactivity
|
|
535
|
+
value = { ...value }
|
|
536
|
+
dispatch('change')
|
|
537
|
+
}
|
|
538
|
+
}}
|
|
509
539
|
/>
|
|
510
540
|
{/await}
|
|
511
541
|
{:else if inputCat == 'object' && format?.startsWith('jsonschema-')}
|
|
@@ -733,14 +763,8 @@ onDestroy(() => {
|
|
|
733
763
|
/>
|
|
734
764
|
</div>
|
|
735
765
|
</div>
|
|
736
|
-
{:else if inputCat == '
|
|
737
|
-
<
|
|
738
|
-
name={label}
|
|
739
|
-
{otherArgs}
|
|
740
|
-
{helperScript}
|
|
741
|
-
bind:value
|
|
742
|
-
entrypoint={format?.substring('dynselect_'.length) ?? ''}
|
|
743
|
-
/>
|
|
766
|
+
{:else if inputCat == 'dynamic'}
|
|
767
|
+
<DynamicInput name={label} {otherArgs} {helperScript} bind:value format={format ?? ''} />
|
|
744
768
|
{:else if inputCat == 'resource-object' && resourceTypes == undefined}
|
|
745
769
|
<span class="text-2xs text-tertiary">Loading resource types...</span>
|
|
746
770
|
{:else if inputCat == 'resource-object' && (resourceTypes == undefined || (format && format?.split('-').length > 1 && resourceTypes.includes(format?.substring('resource-'.length))))}
|
|
@@ -1084,6 +1108,8 @@ onDestroy(() => {
|
|
|
1084
1108
|
: undefined}
|
|
1085
1109
|
{showSchemaExplorer}
|
|
1086
1110
|
/>
|
|
1111
|
+
{:else if inputCat == 'ai-provider'}
|
|
1112
|
+
<AIProviderPicker bind:value {disabled} {actions} />
|
|
1087
1113
|
{:else if inputCat == 'email'}
|
|
1088
1114
|
<input
|
|
1089
1115
|
{autofocus}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { EnumType, SchemaProperty } from '../common';
|
|
2
|
-
import { type
|
|
2
|
+
import { type DynamicInput as DynamicInputTypes } from '../utils';
|
|
3
3
|
import type ItemPicker from './ItemPicker.svelte';
|
|
4
4
|
import type SimpleEditor from './SimpleEditor.svelte';
|
|
5
5
|
import type VariableEditor from './VariableEditor.svelte';
|
|
@@ -58,7 +58,7 @@ interface Props {
|
|
|
58
58
|
orderEditable?: boolean;
|
|
59
59
|
shouldDispatchChanges?: boolean;
|
|
60
60
|
noDefaultOnSelectFirst?: boolean;
|
|
61
|
-
helperScript?:
|
|
61
|
+
helperScript?: DynamicInputTypes.HelperScript;
|
|
62
62
|
otherArgs?: Record<string, any>;
|
|
63
63
|
lightHeader?: boolean;
|
|
64
64
|
diffStatus?: SchemaDiff | undefined;
|
|
@@ -99,8 +99,8 @@ declare const ArgInput: $$__sveltets_2_IsomorphicComponent<Props, {
|
|
|
99
99
|
acceptChange: CustomEvent<any>;
|
|
100
100
|
rejectChange: CustomEvent<any>;
|
|
101
101
|
blur: CustomEvent<any>;
|
|
102
|
-
keydownCmdEnter: CustomEvent<any>;
|
|
103
102
|
change: CustomEvent<any>;
|
|
103
|
+
keydownCmdEnter: CustomEvent<any>;
|
|
104
104
|
} & {
|
|
105
105
|
[evt: string]: CustomEvent<any>;
|
|
106
106
|
}, {}, {
|
|
@@ -23,6 +23,33 @@ async function loadCustomTags() {
|
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
const dispatch = createEventDispatcher();
|
|
26
|
+
const customTagRegex = /^([\w-]+)\(((?:[\w-]+\+)*[\w-]+|(?:\^[\w-]+)+)\)$/;
|
|
27
|
+
const dynamicTagRegex = /\$args\[((?:\w+\.)*\w+)\]/;
|
|
28
|
+
let dynamicTag = $derived.by(() => {
|
|
29
|
+
let r = newTag.trim();
|
|
30
|
+
if (r == '')
|
|
31
|
+
return undefined;
|
|
32
|
+
let matched = r.match(dynamicTagRegex);
|
|
33
|
+
return matched?.[1];
|
|
34
|
+
});
|
|
35
|
+
let extractedCustomTag = $derived.by(() => {
|
|
36
|
+
let r = newTag.trim();
|
|
37
|
+
if (r == '')
|
|
38
|
+
return undefined;
|
|
39
|
+
let matched = r.match(customTagRegex);
|
|
40
|
+
console.log(matched);
|
|
41
|
+
let tag = matched?.[1];
|
|
42
|
+
let workspaces_raw = matched?.[2];
|
|
43
|
+
let tag_type = workspaces_raw?.includes('^') ? 'exclude' : 'include';
|
|
44
|
+
if (tag_type == 'exclude') {
|
|
45
|
+
workspaces_raw = workspaces_raw?.slice(1);
|
|
46
|
+
}
|
|
47
|
+
let workspaces = workspaces_raw?.split(tag_type == 'include' ? '+' : '^');
|
|
48
|
+
if (!workspaces_raw || workspaces_raw?.length == 0) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
return { tag, workspaces, tag_type };
|
|
52
|
+
});
|
|
26
53
|
loadCustomTags();
|
|
27
54
|
</script>
|
|
28
55
|
|
|
@@ -55,6 +82,53 @@ loadCustomTags();
|
|
|
55
82
|
{/each}
|
|
56
83
|
</div>
|
|
57
84
|
<input type="text" bind:value={newTag} />
|
|
85
|
+
{#if extractedCustomTag}
|
|
86
|
+
<div class="text-2xs text-tertiary p-2 bg-gray-50 rounded border">
|
|
87
|
+
<div class="font-medium mb-1">Workspace specific tag</div>
|
|
88
|
+
<div>
|
|
89
|
+
<b>Tag:</b>
|
|
90
|
+
{extractedCustomTag.tag}
|
|
91
|
+
</div>
|
|
92
|
+
<div>
|
|
93
|
+
<b>Workspaces:</b>
|
|
94
|
+
{#if extractedCustomTag.tag_type == 'include'}
|
|
95
|
+
{extractedCustomTag.workspaces?.join(', ')}
|
|
96
|
+
{:else}
|
|
97
|
+
All workspaces except {extractedCustomTag.workspaces?.join(', ')}
|
|
98
|
+
{/if}
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|
|
101
|
+
{:else if newTag.trim()}
|
|
102
|
+
{#if newTag.includes('(') || newTag.includes(')') || newTag.includes('+') || newTag.includes('^') || ((newTag.includes('.') || newTag.includes('$args[')) && !dynamicTag)}
|
|
103
|
+
<div class="text-2xs text-tertiary p-2 bg-gray-50 rounded border">
|
|
104
|
+
<div class="font-medium mb-1 text-red-500">Invalid tag</div>
|
|
105
|
+
<div>
|
|
106
|
+
<b>Tag:</b>
|
|
107
|
+
{newTag.trim()}
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
{:else}
|
|
111
|
+
<div class="text-2xs text-tertiary p-2 bg-gray-50 rounded border">
|
|
112
|
+
<div class="font-medium mb-1">
|
|
113
|
+
{#if newTag.includes('$workspace') || newTag.includes('$args')}
|
|
114
|
+
Dynamic tag
|
|
115
|
+
{:else}
|
|
116
|
+
Simple tag
|
|
117
|
+
{/if}
|
|
118
|
+
</div>
|
|
119
|
+
<div>
|
|
120
|
+
<b>Tag:</b>
|
|
121
|
+
{newTag.trim()}
|
|
122
|
+
</div>
|
|
123
|
+
{#if newTag.includes('$workspace') && !dynamicTag}
|
|
124
|
+
<div>Interpolated tag based on workspace id the job was created in </div>
|
|
125
|
+
{/if}
|
|
126
|
+
{#if dynamicTag}
|
|
127
|
+
<div>Interpolated tag based on args input of <b>{dynamicTag}</b></div>
|
|
128
|
+
{/if}
|
|
129
|
+
</div>
|
|
130
|
+
{/if}
|
|
131
|
+
{/if}
|
|
58
132
|
|
|
59
133
|
<Button
|
|
60
134
|
variant="contained"
|
|
@@ -87,13 +161,25 @@ loadCustomTags();
|
|
|
87
161
|
></span
|
|
88
162
|
>
|
|
89
163
|
<span class="text-2xs text-tertiary"
|
|
90
|
-
>To exclude 'workspace1' and 'workspace2' from a tag, use <pre
|
|
91
|
-
|
|
164
|
+
>To exclude 'workspace1' and 'workspace2' from a tag, use <pre class="inline"
|
|
165
|
+
>tag(^workspace1^workspace2)</pre
|
|
92
166
|
></span
|
|
93
167
|
>
|
|
94
168
|
<span class="text-2xs text-tertiary"
|
|
95
|
-
>For
|
|
169
|
+
>For <a
|
|
170
|
+
href="https://www.windmill.dev/docs/core_concepts/worker_groups#dynamic-tag"
|
|
171
|
+
target="_blank">dynamic tags</a
|
|
172
|
+
>
|
|
173
|
+
based on the workspace, use <pre class="inline">$workspace</pre>, e.g:
|
|
96
174
|
<pre class="inline">tag-$workspace</pre></span
|
|
97
175
|
>
|
|
176
|
+
<span class="text-2xs text-tertiary"
|
|
177
|
+
>For <a
|
|
178
|
+
href="https://www.windmill.dev/docs/core_concepts/worker_groups#dynamic-tag"
|
|
179
|
+
target="_blank">dynamic tags</a
|
|
180
|
+
>
|
|
181
|
+
based on args input, use <pre class="inline">$args[a.b.c]</pre> where
|
|
182
|
+
<pre class="inline">a.b.c</pre> is the path to the value in the args object</span
|
|
183
|
+
>
|
|
98
184
|
{/if}
|
|
99
185
|
</div>
|
|
@@ -1,14 +1,9 @@
|
|
|
1
1
|
<script lang="ts">import 'chartjs-adapter-date-fns';
|
|
2
2
|
import zoomPlugin from 'chartjs-plugin-zoom';
|
|
3
3
|
import { Chart as ChartJS, CategoryScale, Legend, LineElement, LinearScale, PointElement, TimeScale, Title, Tooltip } from 'chart.js';
|
|
4
|
-
import { createEventDispatcher } from 'svelte';
|
|
5
4
|
import { getDbClockNow } from '../forLater';
|
|
6
5
|
import { Line } from './chartjs-wrappers/chartJs';
|
|
7
|
-
|
|
8
|
-
export let maxIsNow = false;
|
|
9
|
-
export let minTimeSet = undefined;
|
|
10
|
-
export let maxTimeSet = undefined;
|
|
11
|
-
const dispatch = createEventDispatcher();
|
|
6
|
+
let { extendedJobs = undefined, maxIsNow = false, minTimeSet = undefined, maxTimeSet = undefined, onZoom } = $props();
|
|
12
7
|
function calculateTimeSeries(extendedJobs) {
|
|
13
8
|
const timeline = new Map();
|
|
14
9
|
extendedJobs.jobs.forEach((j) => {
|
|
@@ -40,7 +35,7 @@ function calculateTimeSeries(extendedJobs) {
|
|
|
40
35
|
}
|
|
41
36
|
const s = timeline.get(startTime);
|
|
42
37
|
s.count += 1;
|
|
43
|
-
s.id_started.push('
|
|
38
|
+
s.id_started.push('unknown');
|
|
44
39
|
if (j.duration_ms != undefined) {
|
|
45
40
|
const jc = j;
|
|
46
41
|
const endTime = startTime + jc.duration_ms;
|
|
@@ -79,32 +74,13 @@ function calculateTimeSeries(extendedJobs) {
|
|
|
79
74
|
}
|
|
80
75
|
return result;
|
|
81
76
|
}
|
|
82
|
-
let intervals = undefined;
|
|
83
|
-
$: intervals = extendedJobs ? calculateTimeSeries(extendedJobs) : undefined;
|
|
84
77
|
ChartJS.register(Title, Tooltip, Legend, zoomPlugin, LineElement, CategoryScale, LinearScale, PointElement, TimeScale);
|
|
85
|
-
$: data = {
|
|
86
|
-
datasets: [
|
|
87
|
-
{
|
|
88
|
-
borderColor: '#4ade80',
|
|
89
|
-
backgroundColor: '#f8717100',
|
|
90
|
-
pointRadius: 0,
|
|
91
|
-
label: 'running',
|
|
92
|
-
showLine: true,
|
|
93
|
-
stepped: true,
|
|
94
|
-
data: intervals?.map((job) => ({
|
|
95
|
-
x: job.time,
|
|
96
|
-
y: job.count,
|
|
97
|
-
id: job.msg
|
|
98
|
-
})) ?? []
|
|
99
|
-
}
|
|
100
|
-
]
|
|
101
|
-
};
|
|
102
78
|
const zoomOptions = {
|
|
103
79
|
pan: {
|
|
104
80
|
enabled: true,
|
|
105
81
|
modifierKey: 'ctrl',
|
|
106
82
|
onPanComplete: ({ chart }) => {
|
|
107
|
-
|
|
83
|
+
onZoom({
|
|
108
84
|
min: addSeconds(new Date(chart.scales.x.min), -1),
|
|
109
85
|
max: addSeconds(new Date(chart.scales.x.max), 1)
|
|
110
86
|
});
|
|
@@ -116,16 +92,13 @@ const zoomOptions = {
|
|
|
116
92
|
},
|
|
117
93
|
mode: 'x',
|
|
118
94
|
onZoom: ({ chart }) => {
|
|
119
|
-
|
|
95
|
+
onZoom({
|
|
120
96
|
min: addSeconds(new Date(chart.scales.x.min), -1),
|
|
121
97
|
max: addSeconds(new Date(chart.scales.x.max), 1)
|
|
122
98
|
});
|
|
123
99
|
}
|
|
124
100
|
}
|
|
125
101
|
};
|
|
126
|
-
let minTime = addSeconds(new Date(), -300);
|
|
127
|
-
let maxTime = getDbClockNow();
|
|
128
|
-
$: computeMinMaxTime(intervals, minTimeSet, maxTimeSet);
|
|
129
102
|
function minJobTime(intervals) {
|
|
130
103
|
return intervals[0].time;
|
|
131
104
|
}
|
|
@@ -136,31 +109,46 @@ function computeMinMaxTime(intervals, minTimeSet, maxTimeSet) {
|
|
|
136
109
|
let minTimeSetDate = minTimeSet ? new Date(minTimeSet) : undefined;
|
|
137
110
|
let maxTimeSetDate = maxTimeSet ? new Date(maxTimeSet) : undefined;
|
|
138
111
|
if (minTimeSetDate && maxTimeSetDate) {
|
|
139
|
-
|
|
140
|
-
maxTime = maxTimeSetDate;
|
|
141
|
-
return;
|
|
112
|
+
return { min: minTimeSetDate, max: maxTimeSetDate };
|
|
142
113
|
}
|
|
143
114
|
if (intervals == undefined || intervals?.length == 0) {
|
|
144
|
-
minTime = minTimeSetDate ?? addSeconds(new Date(), -300);
|
|
145
|
-
maxTime = maxTimeSetDate ?? getDbClockNow();
|
|
146
|
-
return;
|
|
115
|
+
const minTime = minTimeSetDate ?? addSeconds(new Date(), -300);
|
|
116
|
+
const maxTime = maxTimeSetDate ?? getDbClockNow();
|
|
117
|
+
return { min: minTime, max: maxTime };
|
|
147
118
|
}
|
|
148
119
|
const maxJob = maxIsNow ? getDbClockNow() : maxJobTime(intervals);
|
|
149
120
|
const minJob = minJobTime(intervals);
|
|
150
121
|
const diff = (maxJob.getTime() - minJob.getTime()) / 20000;
|
|
151
|
-
minTime = minTimeSetDate ?? addSeconds(minJob, -diff);
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
maxTime = maxTimeSetDate ?? addSeconds(maxJob, diff);
|
|
157
|
-
}
|
|
122
|
+
const minTime = minTimeSetDate ?? addSeconds(minJob, -diff);
|
|
123
|
+
const maxTime = maxIsNow
|
|
124
|
+
? (maxTimeSetDate ?? maxJob)
|
|
125
|
+
: (maxTimeSetDate ?? addSeconds(maxJob, diff));
|
|
126
|
+
return { min: minTime, max: maxTime };
|
|
158
127
|
}
|
|
159
128
|
function addSeconds(date, seconds) {
|
|
160
129
|
date.setTime(date.getTime() + seconds * 1000);
|
|
161
130
|
return date;
|
|
162
131
|
}
|
|
163
|
-
|
|
132
|
+
const intervals = $derived(extendedJobs ? calculateTimeSeries(extendedJobs) : undefined);
|
|
133
|
+
let data = $derived({
|
|
134
|
+
datasets: [
|
|
135
|
+
{
|
|
136
|
+
borderColor: '#4ade80',
|
|
137
|
+
backgroundColor: '#f8717100',
|
|
138
|
+
pointRadius: 0,
|
|
139
|
+
label: 'running',
|
|
140
|
+
showLine: true,
|
|
141
|
+
stepped: true,
|
|
142
|
+
data: intervals?.map((job) => ({
|
|
143
|
+
x: job.time,
|
|
144
|
+
y: job.count,
|
|
145
|
+
id: job.msg
|
|
146
|
+
})) ?? []
|
|
147
|
+
}
|
|
148
|
+
]
|
|
149
|
+
});
|
|
150
|
+
const minMaxTimes = $derived(computeMinMaxTime(intervals, minTimeSet, maxTimeSet));
|
|
151
|
+
let options = $derived({
|
|
164
152
|
responsive: true,
|
|
165
153
|
maintainAspectRatio: false,
|
|
166
154
|
plugins: {
|
|
@@ -182,8 +170,8 @@ $: options = {
|
|
|
182
170
|
grid: {
|
|
183
171
|
display: false
|
|
184
172
|
},
|
|
185
|
-
min:
|
|
186
|
-
max:
|
|
173
|
+
min: minMaxTimes.min,
|
|
174
|
+
max: minMaxTimes.max
|
|
187
175
|
},
|
|
188
176
|
y: {
|
|
189
177
|
grid: {
|
|
@@ -204,7 +192,7 @@ $: options = {
|
|
|
204
192
|
intersect: false,
|
|
205
193
|
mode: 'index'
|
|
206
194
|
}
|
|
207
|
-
};
|
|
195
|
+
});
|
|
208
196
|
</script>
|
|
209
197
|
|
|
210
198
|
<div class="relative max-h-40">
|
|
@@ -1,27 +1,15 @@
|
|
|
1
1
|
import 'chartjs-adapter-date-fns';
|
|
2
2
|
import type { ExtendedJobs } from '../gen';
|
|
3
|
-
interface
|
|
4
|
-
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
5
|
-
$$bindings?: Bindings;
|
|
6
|
-
} & Exports;
|
|
7
|
-
(internal: unknown, props: Props & {
|
|
8
|
-
$$events?: Events;
|
|
9
|
-
$$slots?: Slots;
|
|
10
|
-
}): Exports & {
|
|
11
|
-
$set?: any;
|
|
12
|
-
$on?: any;
|
|
13
|
-
};
|
|
14
|
-
z_$$bindings?: Bindings;
|
|
15
|
-
}
|
|
16
|
-
declare const ConcurrentJobsChart: $$__sveltets_2_IsomorphicComponent<{
|
|
3
|
+
interface Props {
|
|
17
4
|
extendedJobs?: ExtendedJobs | undefined;
|
|
18
5
|
maxIsNow?: boolean;
|
|
19
6
|
minTimeSet?: string | undefined;
|
|
20
7
|
maxTimeSet?: string | undefined;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
|
|
8
|
+
onZoom: (zoom: {
|
|
9
|
+
min: Date;
|
|
10
|
+
max: Date;
|
|
11
|
+
}) => void;
|
|
12
|
+
}
|
|
13
|
+
declare const ConcurrentJobsChart: import("svelte").Component<Props, {}, "">;
|
|
14
|
+
type ConcurrentJobsChart = ReturnType<typeof ConcurrentJobsChart>;
|
|
27
15
|
export default ConcurrentJobsChart;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<script lang="ts">import DropdownV2 from './DropdownV2.svelte';
|
|
2
|
+
import { ChevronDown } from 'lucide-svelte';
|
|
3
|
+
import { twMerge } from 'tailwind-merge';
|
|
4
|
+
let { items = [], extraLabel, selected, selectedDisplayName, btnClasses } = $props();
|
|
5
|
+
const filteredItems = $derived(items.filter((item) => item.id !== selected));
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
<DropdownV2 items={filteredItems}>
|
|
9
|
+
{#snippet buttonReplacement()}
|
|
10
|
+
<div
|
|
11
|
+
class={twMerge(
|
|
12
|
+
'p-2 h-8 flex flex-row items-center gap-2 border hover:bg-surface-hover cursor-pointer rounded-md',
|
|
13
|
+
btnClasses
|
|
14
|
+
)}
|
|
15
|
+
>
|
|
16
|
+
<div class="flex flex-row items-center gap-1 pr-2 justify-between w-full">
|
|
17
|
+
<span class="text-xs whitespace-nowrap">
|
|
18
|
+
{selectedDisplayName ?? items.find((item) => item.id === selected)?.displayName ?? ''}
|
|
19
|
+
</span>
|
|
20
|
+
|
|
21
|
+
{@render extraLabel?.()}
|
|
22
|
+
</div>
|
|
23
|
+
<ChevronDown size={12} />
|
|
24
|
+
</div>
|
|
25
|
+
{/snippet}
|
|
26
|
+
</DropdownV2>
|