windmill-components 1.542.4 → 1.550.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package/common.d.ts +4 -1
- package/package/components/AIAgentLogViewer.svelte +1 -1
- package/package/components/ArgEnum.svelte +14 -5
- package/package/components/ArgInput.svelte +23 -15
- package/package/components/ArgInput.svelte.d.ts +1 -1
- package/package/components/ChannelSelector.svelte +92 -18
- package/package/components/ChannelSelector.svelte.d.ts +2 -0
- package/package/components/ConnectionSection.svelte +12 -1
- package/package/components/Dev.svelte +18 -5
- package/package/components/Dev.svelte.d.ts +23 -1
- package/package/components/DisplayResult.svelte +36 -23
- package/package/components/DropdownV2.svelte +8 -2
- package/package/components/DropdownV2.svelte.d.ts +1 -0
- package/package/components/DynamicInput.svelte +10 -10
- package/package/components/EditableSchemaForm.svelte +21 -7
- package/package/components/EditorSettings.svelte +11 -9
- package/package/components/ErrorOrRecoveryHandler.svelte +14 -20
- package/package/components/FlowHistoryJobPicker.svelte +3 -0
- package/package/components/FlowHistoryJobPicker.svelte.d.ts +1 -0
- package/package/components/FlowJobResult.svelte +5 -5
- package/package/components/FlowLogRow.svelte +2 -2
- package/package/components/FlowLogViewer.svelte +228 -57
- package/package/components/FlowLogViewer.svelte.d.ts +16 -5
- package/package/components/FlowLogViewerWrapper.svelte +56 -3
- package/package/components/FlowLogViewerWrapper.svelte.d.ts +4 -3
- package/package/components/FlowLoopIterationPreview.svelte +4 -4
- package/package/components/FlowMetadata.svelte +3 -4
- package/package/components/FlowMetadata.svelte.d.ts +4 -18
- package/package/components/FlowPreviewContent.svelte +9 -3
- package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
- package/package/components/FlowStatusViewer.svelte +62 -59
- package/package/components/FlowStatusViewer.svelte.d.ts +2 -2
- package/package/components/FlowStatusViewerInner.svelte +186 -94
- package/package/components/FlowStatusViewerInner.svelte.d.ts +10 -3
- package/package/components/FlowTimeline.svelte +110 -131
- package/package/components/FlowTimeline.svelte.d.ts +13 -4
- package/package/components/FlowTimelineBar.svelte +227 -0
- package/package/components/FlowTimelineBar.svelte.d.ts +24 -0
- package/package/components/InputTransformForm.svelte +119 -3
- package/package/components/InputTransformForm.svelte.d.ts +3 -0
- package/package/components/InputTransformSchemaForm.svelte +5 -1
- package/package/components/InputTransformSchemaForm.svelte.d.ts +2 -0
- package/package/components/InstanceSetting.svelte +17 -42
- package/package/components/InstanceSettings.svelte +12 -21
- package/package/components/JobArgs.svelte +15 -16
- package/package/components/JobArgs.svelte.d.ts +4 -18
- package/package/components/JobLoader.svelte +23 -42
- package/package/components/JobLoader.svelte.d.ts +2 -0
- package/package/components/JobStatus.svelte +1 -1
- package/package/components/JobStatus.svelte.d.ts +4 -18
- package/package/components/ModulePreviewResultViewer.svelte +1 -7
- package/package/components/NextcloudSetting.svelte +6 -1
- package/package/components/Password.svelte +7 -11
- package/package/components/Password.svelte.d.ts +5 -20
- package/package/components/PasswordArgInput.svelte +35 -15
- package/package/components/PasswordArgInput.svelte.d.ts +4 -18
- package/package/components/QueuePosition.svelte +6 -2
- package/package/components/RunForm.svelte +5 -14
- package/package/components/S3ArrayHelperButton.svelte +12 -0
- package/package/components/S3ArrayHelperButton.svelte.d.ts +8 -0
- package/package/components/ScriptEditor.svelte +5 -6
- package/package/components/StringTypeNarrowing.svelte +39 -24
- package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
- package/package/components/TeamSelector.svelte +83 -37
- package/package/components/TeamSelector.svelte.d.ts +0 -1
- package/package/components/apps/components/buttons/AppButton.svelte +11 -1
- package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +13 -4
- package/package/components/apps/components/display/table/SyncColumnDefs.svelte +2 -2
- package/package/components/apps/components/display/table/utils.js +1 -1
- package/package/components/apps/components/helpers/RefreshButton.svelte +5 -1
- package/package/components/apps/components/helpers/RunnableComponent.svelte +0 -2
- package/package/components/apps/components/helpers/RunnableWrapper.svelte.d.ts +1 -0
- package/package/components/apps/components/layout/AppTabs.svelte +116 -71
- package/package/components/apps/components/layout/AppTabs.svelte.d.ts +1 -0
- package/package/components/apps/editor/component/ComponentInner.svelte +1 -0
- package/package/components/apps/editor/component/components.d.ts +16 -1
- package/package/components/apps/editor/component/components.js +22 -2
- package/package/components/apps/editor/settingsPanel/ComponentPanel.svelte +2 -0
- package/package/components/apps/editor/settingsPanel/GridTab.svelte +19 -1
- package/package/components/apps/editor/settingsPanel/GridTab.svelte.d.ts +3 -1
- package/package/components/apps/editor/settingsPanel/GridTabHidden.svelte +52 -0
- package/package/components/apps/editor/settingsPanel/GridTabHidden.svelte.d.ts +9 -0
- package/package/components/auditLogs/AuditLogsFilters.svelte +6 -0
- package/package/components/auditLogs/AuditLogsTable.svelte +17 -7
- package/package/components/auditLogs/AuditLogsTable.svelte.d.ts +1 -0
- package/package/components/common/CloseButton.svelte +2 -2
- package/package/components/common/CloseButton.svelte.d.ts +1 -0
- package/package/components/common/layout/List.svelte +3 -7
- package/package/components/common/layout/List.svelte.d.ts +7 -29
- package/package/components/common/popup/PopupV2.svelte +8 -25
- package/package/components/common/popup/PopupV2.svelte.d.ts +4 -2
- package/package/components/common/table/ScriptRow.svelte +22 -2
- package/package/components/copilot/FlowCopilotInputsModal.svelte +26 -23
- package/package/components/copilot/chat/AIChatManager.svelte.js +3 -2
- package/package/components/copilot/chat/ProviderModelSelector.svelte +1 -1
- package/package/components/copilot/chat/flow/FlowAIChat.svelte +4 -2
- package/package/components/copilot/chat/script/core.d.ts +4 -4
- package/package/components/copilot/chat/script/core.js +93 -34
- package/package/components/copilot/lib.d.ts +1 -0
- package/package/components/copilot/lib.js +6 -3
- package/package/components/custom_ui.d.ts +2 -0
- package/package/components/flows/FlowProgressBar.svelte +16 -16
- package/package/components/flows/FlowProgressBar.svelte.d.ts +7 -22
- package/package/components/flows/content/FlowInputsQuick.svelte +3 -2
- package/package/components/flows/content/FlowInputsQuick.svelte.d.ts +1 -0
- package/package/components/flows/content/FlowModuleComponent.svelte +24 -1
- package/package/components/flows/flowInfers.js +34 -8
- package/package/components/flows/flowStore.d.ts +4 -1
- package/package/components/flows/map/FlowJobsMenu.svelte +3 -3
- package/package/components/flows/map/FlowJobsMenu.svelte.d.ts +1 -1
- package/package/components/flows/map/InsertModuleButton.svelte +4 -14
- package/package/components/flows/map/InsertModuleButton.svelte.d.ts +0 -1
- package/package/components/flows/map/InsertModuleInner.svelte +17 -20
- package/package/components/flows/map/MapItem.svelte +1 -1
- package/package/components/flows/pickers/PickHubScriptQuick.svelte +38 -52
- package/package/components/flows/pickers/PickHubScriptQuick.svelte.d.ts +1 -0
- package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte +27 -15
- package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte.d.ts +1 -0
- package/package/components/flows/propPicker/OutputPicker.svelte +2 -0
- package/package/components/git_sync/DetectionFlow.svelte +33 -44
- package/package/components/git_sync/DetectionFlow.svelte.d.ts +1 -0
- package/package/components/git_sync/GitSyncContext.svelte.d.ts +22 -0
- package/package/components/git_sync/GitSyncContext.svelte.js +145 -5
- package/package/components/git_sync/GitSyncModeDisplay.svelte +14 -0
- package/package/components/git_sync/GitSyncModeDisplay.svelte.d.ts +9 -0
- package/package/components/git_sync/GitSyncRepositoryCard.svelte +365 -253
- package/package/components/git_sync/GitSyncRepositoryCard.svelte.d.ts +10 -1
- package/package/components/git_sync/GitSyncSection.svelte +134 -14
- package/package/components/git_sync/PullWorkspaceModal.svelte +24 -32
- package/package/components/git_sync/PushWorkspaceModal.svelte +24 -32
- package/package/components/graph/model.d.ts +5 -5
- package/package/components/graph/renderers/edges/EmptyEdge.svelte +3 -10
- package/package/components/graph/renderers/edges/EmptyEdge.svelte.d.ts +4 -18
- package/package/components/graph/renderers/nodes/AIToolNode.svelte +2 -2
- package/package/components/graph/renderers/nodes/NewAIToolNode.svelte +5 -10
- package/package/components/home/ItemsList.svelte +1 -1
- package/package/components/jobs/JobProgressBar.svelte +27 -21
- package/package/components/jobs/JobProgressBar.svelte.d.ts +9 -24
- package/package/components/meltComponents/MenuSingleItem.svelte +3 -8
- package/package/components/meltComponents/MenuSingleItem.svelte.d.ts +0 -3
- package/package/components/meltComponents/Popover.svelte +3 -2
- package/package/components/meltComponents/Popover.svelte.d.ts +1 -0
- package/package/components/meltComponents/Tooltip.svelte +1 -1
- package/package/components/progressBar/ProgressBar.svelte +39 -53
- package/package/components/progressBar/ProgressBar.svelte.d.ts +11 -26
- package/package/components/runs/JobsLoader.svelte +1 -1
- package/package/components/runs/NoWorkerWithTagWarning.svelte +3 -3
- package/package/components/runs/NoWorkerWithTagWarning.svelte.d.ts +1 -1
- package/package/components/schema/AddPropertyV2.svelte +7 -4
- package/package/components/schema/PropertyEditor.svelte.d.ts +1 -1
- package/package/components/select/MultiSelect.svelte +2 -2
- package/package/components/select/MultiSelect.svelte.d.ts +1 -0
- package/package/components/settings/WorkspaceUserSettings.svelte +92 -1
- package/package/components/sidebar/MenuLink.svelte +2 -1
- package/package/components/sidebar/MenuLink.svelte.d.ts +1 -0
- package/package/components/sidebar/SidebarContent.svelte +27 -27
- package/package/components/table/Cell.svelte +7 -14
- package/package/components/table/Cell.svelte.d.ts +13 -35
- package/package/components/triggers/AddTriggersButton.svelte +1 -0
- package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte +1 -1
- package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte.d.ts +2 -1
- package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +28 -5
- package/package/components/triggers/gcp/utils.js +1 -0
- package/package/components/triggers/schedules/ScheduleEditorInner.svelte +1 -0
- package/package/components/triggers/webhook/WebhooksConfigSection.svelte +143 -63
- package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +22 -0
- package/package/components/triggers/websocket/utils.js +1 -0
- package/package/components/workspaceSettings/AISettings.svelte +8 -2
- package/package/components/workspaceSettings/AISettings.svelte.d.ts +2 -1
- package/package/components/workspaceSettings/ModelTokenLimits.svelte +165 -0
- package/package/components/workspaceSettings/ModelTokenLimits.svelte.d.ts +8 -0
- package/package/components/workspaceSettings/StorageSettings.svelte +123 -51
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/schemas.gen.d.ts +141 -16
- package/package/gen/schemas.gen.js +144 -16
- package/package/gen/services.gen.d.ts +62 -42
- package/package/gen/services.gen.js +131 -82
- package/package/gen/types.gen.d.ts +218 -144
- package/package/hubPaths.json +2 -1
- package/package/services/JobManager.js +10 -7
- package/package/stores.d.ts +1 -0
- package/package/stores.js +6 -3
- package/package/timelineCompute.svelte.d.ts +21 -0
- package/package/timelineCompute.svelte.js +113 -0
- package/package/utils.d.ts +15 -8
- package/package/utils.js +62 -12
- package/package/workspace_settings.d.ts +13 -8
- package/package/workspace_settings.js +46 -11
- package/package.json +2 -2
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
</script>
|
|
9
9
|
|
|
10
10
|
<script lang="ts">import { createEventDispatcher, getContext, untrack } from 'svelte';
|
|
11
|
+
import { computeShow } from '../utils';
|
|
11
12
|
import ArgInput from './ArgInput.svelte';
|
|
12
13
|
import FieldHeader from './FieldHeader.svelte';
|
|
13
14
|
import DynamicInputHelpBox from './flows/content/DynamicInputHelpBox.svelte';
|
|
@@ -27,11 +28,13 @@ import StepInputGen from './copilot/StepInputGen.svelte';
|
|
|
27
28
|
import { twMerge } from 'tailwind-merge';
|
|
28
29
|
import FlowPlugConnect from './FlowPlugConnect.svelte';
|
|
29
30
|
import { deepEqual } from 'fast-equals';
|
|
30
|
-
|
|
31
|
+
import S3ArrayHelperButton from './S3ArrayHelperButton.svelte';
|
|
32
|
+
let { schema = $bindable(), arg = $bindable(), argName = $bindable(), headerTooltip = undefined, headerTooltipIconClass = '', HeaderTooltipIcon = InfoIcon, extraLib = $bindable('missing extraLib'), inputCheck = $bindable(true), previousModuleId, pickForField = $bindable(undefined), variableEditor = undefined, itemPicker = undefined, noDynamicToggle = false, argExtra = {}, pickableProperties = undefined, enableAi = false, hideHelpButton = false, class: className = '', editor = $bindable(undefined), otherArgs = {}, helperScript = undefined } = $props();
|
|
31
33
|
let monaco = $state(undefined);
|
|
32
34
|
let monacoTemplate = $state(undefined);
|
|
33
35
|
let argInput = $state(undefined);
|
|
34
36
|
let focusedPrev = false;
|
|
37
|
+
let hidden = $state(false);
|
|
35
38
|
const variableMatch = (value) => value.match(/^variable\('([^']+)'\)$/);
|
|
36
39
|
const resourceMatch = (value) => value.match(/^resource\('([^']+)'\)$/);
|
|
37
40
|
const dispatch = createEventDispatcher();
|
|
@@ -144,6 +147,46 @@ function handleKeyUp(e) {
|
|
|
144
147
|
function isStaticTemplate(inputCat) {
|
|
145
148
|
return inputCat === 'string' || inputCat === 'sql' || inputCat == 'yaml';
|
|
146
149
|
}
|
|
150
|
+
function appendPathToArrayExpr(currentExpr, path) {
|
|
151
|
+
const trimmedExpr = currentExpr?.trim() || '';
|
|
152
|
+
let newExpr = trimmedExpr;
|
|
153
|
+
if (trimmedExpr.startsWith('[') && trimmedExpr.endsWith(']')) {
|
|
154
|
+
// Parse existing array and append new item
|
|
155
|
+
const innerContent = trimmedExpr.slice(1, -1).trim();
|
|
156
|
+
if (innerContent) {
|
|
157
|
+
newExpr = `[${innerContent}, ${path}]`;
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
newExpr = `[${path}]`;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
// Create new array with single item
|
|
165
|
+
newExpr = `[${path}]`;
|
|
166
|
+
}
|
|
167
|
+
arg.expr = newExpr;
|
|
168
|
+
arg.type = 'javascript';
|
|
169
|
+
// Update Monaco editor after setting the expression
|
|
170
|
+
tick().then(() => {
|
|
171
|
+
monaco?.setCode(newExpr);
|
|
172
|
+
});
|
|
173
|
+
// Dispatch change
|
|
174
|
+
dispatch('change', { argName, arg });
|
|
175
|
+
}
|
|
176
|
+
async function switchToJsAndConnect(onPath) {
|
|
177
|
+
// Switch to JavaScript mode
|
|
178
|
+
propertyType = 'javascript';
|
|
179
|
+
arg.type = 'javascript';
|
|
180
|
+
arg.expr = arg.expr || '[]';
|
|
181
|
+
arg.value = undefined;
|
|
182
|
+
// Wait for the component to re-render and Monaco to be available
|
|
183
|
+
await tick();
|
|
184
|
+
// Activate connect mode
|
|
185
|
+
focusProp?.(argName, 'connect', (path) => {
|
|
186
|
+
onPath(path);
|
|
187
|
+
return true;
|
|
188
|
+
});
|
|
189
|
+
}
|
|
147
190
|
function connectProperty(rawValue) {
|
|
148
191
|
// Extract path from variable('x') or resource('x') format
|
|
149
192
|
const varMatch = variableMatch(rawValue);
|
|
@@ -167,6 +210,41 @@ function connectProperty(rawValue) {
|
|
|
167
210
|
monaco?.setCode(arg.expr);
|
|
168
211
|
}
|
|
169
212
|
}
|
|
213
|
+
function handleFieldVisibility(schema, arg, otherArgs) {
|
|
214
|
+
const schemaProperty = schema?.properties?.[argName];
|
|
215
|
+
if (schemaProperty?.showExpr) {
|
|
216
|
+
// Build args object with current field value and other context
|
|
217
|
+
const currentValue = propertyType === 'static' ? arg?.value : arg?.expr;
|
|
218
|
+
// Convert otherArgs from InputTransform objects to their actual values
|
|
219
|
+
const contextArgs = {
|
|
220
|
+
[argName]: currentValue
|
|
221
|
+
};
|
|
222
|
+
// Extract values from InputTransform objects in otherArgs
|
|
223
|
+
Object.keys(otherArgs ?? {}).forEach((key) => {
|
|
224
|
+
const otherArg = otherArgs[key];
|
|
225
|
+
const otherArgValue = otherArg.type === 'static' ? otherArg.value : otherArg.expr;
|
|
226
|
+
contextArgs[key] = otherArgValue;
|
|
227
|
+
});
|
|
228
|
+
const shouldShow = computeShow(argName, schemaProperty.showExpr, contextArgs);
|
|
229
|
+
if (shouldShow) {
|
|
230
|
+
hidden = false;
|
|
231
|
+
}
|
|
232
|
+
else if (!hidden) {
|
|
233
|
+
hidden = true;
|
|
234
|
+
// Clear the arg value when hidden (following SchemaForm pattern)
|
|
235
|
+
if (arg) {
|
|
236
|
+
arg.value = undefined;
|
|
237
|
+
arg.expr = undefined;
|
|
238
|
+
}
|
|
239
|
+
// Make sure validation passes when hidden
|
|
240
|
+
inputCheck = true;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
// No showExpr, always show
|
|
245
|
+
hidden = false;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
170
248
|
function onFocus() {
|
|
171
249
|
focused = true;
|
|
172
250
|
if (isStaticTemplate(inputCat)) {
|
|
@@ -257,10 +335,19 @@ $effect(() => {
|
|
|
257
335
|
$effect(() => {
|
|
258
336
|
schema?.properties?.[argName]?.default && untrack(() => setDefaultCode());
|
|
259
337
|
});
|
|
338
|
+
$effect.pre(() => {
|
|
339
|
+
// Monitor changes that affect field visibility
|
|
340
|
+
JSON.stringify(schema);
|
|
341
|
+
JSON.stringify(arg);
|
|
342
|
+
JSON.stringify(otherArgs);
|
|
343
|
+
untrack(() => handleFieldVisibility(schema, arg, otherArgs));
|
|
344
|
+
});
|
|
260
345
|
let connecting = $derived($propPickerConfig?.propName == argName && $propPickerConfig?.insertionMode == 'connect');
|
|
346
|
+
let shouldShowS3ArrayHelper = $derived(inputCat === 'list' &&
|
|
347
|
+
['s3object', 's3_object'].includes(schema?.properties?.[argName]?.items?.resourceType));
|
|
261
348
|
</script>
|
|
262
349
|
|
|
263
|
-
{#if arg != undefined}
|
|
350
|
+
{#if arg != undefined && !hidden}
|
|
264
351
|
<div
|
|
265
352
|
class={twMerge(
|
|
266
353
|
'pl-2 pt-2 pb-2 ml-2 relative hover:bg-surface hover:shadow-md transition-all duration-200',
|
|
@@ -334,6 +421,7 @@ let connecting = $derived($propPickerConfig?.propName == argName && $propPickerC
|
|
|
334
421
|
on:selected={(e) => {
|
|
335
422
|
if (e.detail == propertyType) return
|
|
336
423
|
const staticTemplate = isStaticTemplate(inputCat)
|
|
424
|
+
|
|
337
425
|
if (e.detail === 'javascript') {
|
|
338
426
|
if (arg.expr == undefined) {
|
|
339
427
|
arg.expr = getDefaultExpr(
|
|
@@ -411,6 +499,7 @@ let connecting = $derived($propPickerConfig?.propName == argName && $propPickerC
|
|
|
411
499
|
</Button>
|
|
412
500
|
{:else}
|
|
413
501
|
<ToggleButton
|
|
502
|
+
disabled={inputCat === 'dynamic'}
|
|
414
503
|
small
|
|
415
504
|
light
|
|
416
505
|
tooltip="JavaScript expression ('flow_input' or 'results')."
|
|
@@ -423,7 +512,7 @@ let connecting = $derived($propPickerConfig?.propName == argName && $propPickerC
|
|
|
423
512
|
</ToggleButtonGroup>
|
|
424
513
|
</div>
|
|
425
514
|
|
|
426
|
-
{#if propPickerWrapperContext}
|
|
515
|
+
{#if propPickerWrapperContext && inputCat !== 'dynamic'}
|
|
427
516
|
<FlowPlugConnect
|
|
428
517
|
id="flow-editor-plug"
|
|
429
518
|
{connecting}
|
|
@@ -524,7 +613,22 @@ let connecting = $derived($propPickerConfig?.propName == argName && $propPickerC
|
|
|
524
613
|
nullable={schema.properties[argName].nullable}
|
|
525
614
|
bind:title={schema.properties[argName].title}
|
|
526
615
|
bind:placeholder={schema.properties[argName].placeholder}
|
|
616
|
+
{helperScript}
|
|
617
|
+
otherArgs={Object.fromEntries(
|
|
618
|
+
Object.entries(otherArgs).map(([key, transform]) => [
|
|
619
|
+
key,
|
|
620
|
+
transform?.type === 'static' ? transform.value : transform?.expr
|
|
621
|
+
])
|
|
622
|
+
)}
|
|
527
623
|
/>
|
|
624
|
+
|
|
625
|
+
{#if shouldShowS3ArrayHelper}
|
|
626
|
+
<S3ArrayHelperButton
|
|
627
|
+
{connecting}
|
|
628
|
+
onClick={() =>
|
|
629
|
+
switchToJsAndConnect((path) => appendPathToArrayExpr(arg.expr, path))}
|
|
630
|
+
/>
|
|
631
|
+
{/if}
|
|
528
632
|
{:else if arg.expr != undefined}
|
|
529
633
|
<div class="border mt-2">
|
|
530
634
|
<SimpleEditor
|
|
@@ -554,6 +658,18 @@ let connecting = $derived($propPickerConfig?.propName == argName && $propPickerC
|
|
|
554
658
|
{#if !hideHelpButton}
|
|
555
659
|
<DynamicInputHelpBox />
|
|
556
660
|
{/if}
|
|
661
|
+
|
|
662
|
+
{#if shouldShowS3ArrayHelper}
|
|
663
|
+
<S3ArrayHelperButton
|
|
664
|
+
{connecting}
|
|
665
|
+
onClick={() =>
|
|
666
|
+
focusProp?.(argName, 'connect', (path) => {
|
|
667
|
+
appendPathToArrayExpr(arg.expr, path)
|
|
668
|
+
return true
|
|
669
|
+
})}
|
|
670
|
+
/>
|
|
671
|
+
{/if}
|
|
672
|
+
|
|
557
673
|
<div class="mb-2"></div>
|
|
558
674
|
{:else}
|
|
559
675
|
Not recognized input type {argName} ({arg.expr}, {propertyType})
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Schema } from '../common';
|
|
2
|
+
import type { DynamicInput as DynamicInputTypes } from '../utils';
|
|
2
3
|
import SimpleEditor from './SimpleEditor.svelte';
|
|
3
4
|
import type VariableEditor from './VariableEditor.svelte';
|
|
4
5
|
import type ItemPicker from './ItemPicker.svelte';
|
|
@@ -27,6 +28,8 @@ interface Props {
|
|
|
27
28
|
hideHelpButton?: boolean;
|
|
28
29
|
class?: string;
|
|
29
30
|
editor?: SimpleEditor | undefined;
|
|
31
|
+
otherArgs?: Record<string, InputTransform>;
|
|
32
|
+
helperScript?: DynamicInputTypes.HelperScript | undefined;
|
|
30
33
|
}
|
|
31
34
|
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
32
35
|
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
@@ -8,7 +8,7 @@ import InputTransformForm from './InputTransformForm.svelte';
|
|
|
8
8
|
import ItemPicker from './ItemPicker.svelte';
|
|
9
9
|
import VariableEditor from './VariableEditor.svelte';
|
|
10
10
|
import { Plus } from 'lucide-svelte';
|
|
11
|
-
let { schema = $bindable(), args = $bindable({}), isValid = $bindable(true), extraLib = $bindable('missing extraLib'), previousModuleId = undefined, filter = undefined, noDynamicToggle = false, pickableProperties = undefined, enableAi = false, class: clazz = '' } = $props();
|
|
11
|
+
let { schema = $bindable(), args = $bindable({}), isValid = $bindable(true), extraLib = $bindable('missing extraLib'), previousModuleId = undefined, filter = undefined, noDynamicToggle = false, pickableProperties = undefined, enableAi = false, class: clazz = '', helperScript = undefined } = $props();
|
|
12
12
|
let inputCheck = $state({});
|
|
13
13
|
$effect(() => {
|
|
14
14
|
isValid = allTrue(inputCheck) ?? false;
|
|
@@ -80,6 +80,10 @@ $effect(() => {
|
|
|
80
80
|
{noDynamicToggle}
|
|
81
81
|
{pickableProperties}
|
|
82
82
|
{enableAi}
|
|
83
|
+
{helperScript}
|
|
84
|
+
otherArgs={Object.fromEntries(
|
|
85
|
+
Object.entries(args ?? {}).filter(([key]) => key !== argName)
|
|
86
|
+
)}
|
|
83
87
|
/>
|
|
84
88
|
</div>
|
|
85
89
|
{/if}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Schema } from '../common';
|
|
2
2
|
import { type InputTransform } from '../gen';
|
|
3
|
+
import { type DynamicInput as DynamicInputTypes } from '../utils';
|
|
3
4
|
import type { PickableProperties } from './flows/previousResults';
|
|
4
5
|
interface Props {
|
|
5
6
|
schema: Schema | {
|
|
@@ -14,6 +15,7 @@ interface Props {
|
|
|
14
15
|
pickableProperties?: PickableProperties | undefined;
|
|
15
16
|
enableAi?: boolean;
|
|
16
17
|
class?: string;
|
|
18
|
+
helperScript?: DynamicInputTypes.HelperScript;
|
|
17
19
|
}
|
|
18
20
|
declare const InputTransformSchemaForm: import("svelte").Component<Props, {
|
|
19
21
|
setArgs: (nargs: Record<string, InputTransform | any>) => void;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
<script lang="ts">import { isCloudHosted } from '../cloud';
|
|
2
2
|
import { enterpriseLicense, isCriticalAlertsUIOpen } from '../stores';
|
|
3
|
-
import { AlertCircle, AlertTriangle, BadgeCheck, BadgeX, Info, Plus,
|
|
3
|
+
import { AlertCircle, AlertTriangle, BadgeCheck, BadgeX, Info, Plus, Slack, X } from 'lucide-svelte';
|
|
4
4
|
import Tooltip from './Tooltip.svelte';
|
|
5
5
|
import ObjectStoreConfigSettings from './ObjectStoreConfigSettings.svelte';
|
|
6
6
|
import { sendUserToast } from '../toast';
|
|
7
7
|
import ConfirmButton from './ConfirmButton.svelte';
|
|
8
|
-
import { ConfigService, IndexSearchService, SettingService
|
|
8
|
+
import { ConfigService, IndexSearchService, SettingService } from '../gen';
|
|
9
9
|
import { Button, SecondsInput, Skeleton } from './common';
|
|
10
10
|
import Password from './Password.svelte';
|
|
11
11
|
import { classNames } from '../utils';
|
|
@@ -28,7 +28,6 @@ if ((setting.fieldType == 'select' || setting.fieldType == 'select_python') &&
|
|
|
28
28
|
$values[setting.key] = 'default';
|
|
29
29
|
}
|
|
30
30
|
let latestKeyRenewalAttempt = $state(null);
|
|
31
|
-
let isFetching = $state(false);
|
|
32
31
|
function showSetting(setting, values) {
|
|
33
32
|
if (setting == 'dev_instance') {
|
|
34
33
|
if (values['license_key'] == undefined) {
|
|
@@ -120,29 +119,16 @@ async function fetch_available_python_versions() {
|
|
|
120
119
|
if (setting.fieldType == 'select_python') {
|
|
121
120
|
fetch_available_python_versions();
|
|
122
121
|
}
|
|
123
|
-
async function fetchTeams() {
|
|
124
|
-
if (isFetching)
|
|
125
|
-
return;
|
|
126
|
-
isFetching = true;
|
|
127
|
-
try {
|
|
128
|
-
$values['teams'] = await TeamsService.syncTeams();
|
|
129
|
-
}
|
|
130
|
-
catch (error) {
|
|
131
|
-
console.error('Error fetching teams:', error);
|
|
132
|
-
}
|
|
133
|
-
finally {
|
|
134
|
-
isFetching = false;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
122
|
function handleTeamChange(teamItem, i) {
|
|
138
|
-
const team = (teamItem && $values['teams'].find((team) => team.team_id === teamItem.team_id)) || null;
|
|
139
123
|
$values['critical_error_channels'][i] = {
|
|
140
|
-
teams_channel:
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
124
|
+
teams_channel: teamItem
|
|
125
|
+
? {
|
|
126
|
+
team_id: teamItem.team_id,
|
|
127
|
+
team_name: teamItem.team_name,
|
|
128
|
+
channel_id: undefined, // Will be set when channel is selected
|
|
129
|
+
channel_name: undefined
|
|
130
|
+
}
|
|
131
|
+
: undefined
|
|
146
132
|
};
|
|
147
133
|
}
|
|
148
134
|
function handleChannelChange(channel, i) {
|
|
@@ -333,7 +319,7 @@ function handleChannelChange(channel, i) {
|
|
|
333
319
|
<Password
|
|
334
320
|
small
|
|
335
321
|
placeholder={setting.placeholder}
|
|
336
|
-
|
|
322
|
+
onKeyDown={() => {
|
|
337
323
|
licenseKeyChanged = true
|
|
338
324
|
}}
|
|
339
325
|
bind:password={$values[setting.key]}
|
|
@@ -501,9 +487,6 @@ function handleChannelChange(channel, i) {
|
|
|
501
487
|
[e.target['value']]: ''
|
|
502
488
|
}
|
|
503
489
|
}
|
|
504
|
-
if (e.target?.['value'] === 'teams_channel') {
|
|
505
|
-
fetchTeams()
|
|
506
|
-
}
|
|
507
490
|
}}
|
|
508
491
|
value={(() => {
|
|
509
492
|
if (!v) return 'email'
|
|
@@ -535,8 +518,6 @@ function handleChannelChange(channel, i) {
|
|
|
535
518
|
containerClass="w-44"
|
|
536
519
|
minWidth="140px"
|
|
537
520
|
showRefreshButton={false}
|
|
538
|
-
placeholder="Select team"
|
|
539
|
-
teams={$values['teams']}
|
|
540
521
|
bind:selectedTeam={
|
|
541
522
|
() =>
|
|
542
523
|
$values['critical_error_channels'][i]?.teams_channel
|
|
@@ -555,12 +536,8 @@ function handleChannelChange(channel, i) {
|
|
|
555
536
|
{#if $values['critical_error_channels'][i]?.teams_channel?.team_id}
|
|
556
537
|
<ChannelSelector
|
|
557
538
|
containerClass=""
|
|
558
|
-
placeholder="
|
|
559
|
-
|
|
560
|
-
(team) =>
|
|
561
|
-
team.team_id ===
|
|
562
|
-
$values['critical_error_channels'][i]?.teams_channel?.team_id
|
|
563
|
-
)?.channels ?? []}
|
|
539
|
+
placeholder="Search channels"
|
|
540
|
+
teamId={$values['critical_error_channels'][i]?.teams_channel?.team_id}
|
|
564
541
|
bind:selectedChannel={
|
|
565
542
|
() =>
|
|
566
543
|
$values['critical_error_channels'][i]?.teams_channel?.channel_id
|
|
@@ -575,13 +552,10 @@ function handleChannelChange(channel, i) {
|
|
|
575
552
|
: undefined,
|
|
576
553
|
(channel) => handleChannelChange(channel, i)
|
|
577
554
|
}
|
|
555
|
+
onError={(e) =>
|
|
556
|
+
sendUserToast('Failed to load channels: ' + e.message, true)}
|
|
578
557
|
/>
|
|
579
558
|
{/if}
|
|
580
|
-
<div>
|
|
581
|
-
<button onclick={fetchTeams} class="flex items-center gap-1 mt-2">
|
|
582
|
-
<RefreshCcw size={16} class={isFetching ? 'animate-spin' : ''} />
|
|
583
|
-
</button>
|
|
584
|
-
</div>
|
|
585
559
|
</div>
|
|
586
560
|
{:else}
|
|
587
561
|
<input
|
|
@@ -624,7 +598,8 @@ function handleChannelChange(channel, i) {
|
|
|
624
598
|
if ($values[setting.key] == undefined || !Array.isArray($values[setting.key])) {
|
|
625
599
|
$values[setting.key] = []
|
|
626
600
|
}
|
|
627
|
-
|
|
601
|
+
// Start with a typed default to avoid invalid primitives in the array
|
|
602
|
+
$values[setting.key] = $values[setting.key].concat({ email: '' })
|
|
628
603
|
}}
|
|
629
604
|
id="arg-input-add-item"
|
|
630
605
|
startIcon={{ icon: Plus }}
|
|
@@ -62,24 +62,6 @@ async function loadSettings() {
|
|
|
62
62
|
if (nvalues['critical_error_channels'] == undefined) {
|
|
63
63
|
nvalues['critical_error_channels'] = [];
|
|
64
64
|
}
|
|
65
|
-
else {
|
|
66
|
-
let teams = (await SettingService.getGlobal({ key: 'teams' })) ?? [];
|
|
67
|
-
nvalues['teams'] = teams;
|
|
68
|
-
nvalues['critical_error_channels'] = nvalues['critical_error_channels'].map((el) => {
|
|
69
|
-
if (el.teams_channel) {
|
|
70
|
-
const team = teams.find((team) => team.team_name === el.teams_channel.team_name) || null;
|
|
71
|
-
return {
|
|
72
|
-
teams_channel: {
|
|
73
|
-
team_id: team?.team_id,
|
|
74
|
-
team_name: team?.team_name,
|
|
75
|
-
channel_id: team?.channels.find((channel) => channel.channel_id === el.teams_channel.channel_id)?.channel_id,
|
|
76
|
-
channel_name: team?.channels.find((channel) => channel.channel_id === el.teams_channel.channel_id)?.channel_name
|
|
77
|
-
}
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
return el;
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
65
|
$values = nvalues;
|
|
84
66
|
loading = false;
|
|
85
67
|
// populate snowflake account identifier from db
|
|
@@ -94,12 +76,21 @@ export async function saveSettings() {
|
|
|
94
76
|
snowflakeAccountIdentifier) {
|
|
95
77
|
setupSnowflakeUrls();
|
|
96
78
|
}
|
|
97
|
-
// Remove empty or invalid
|
|
79
|
+
// Remove empty or invalid entries for critical error channels
|
|
98
80
|
$values.critical_error_channels = $values.critical_error_channels.filter((entry) => {
|
|
99
|
-
if (entry
|
|
81
|
+
if (!entry || typeof entry !== 'object')
|
|
82
|
+
return false;
|
|
83
|
+
if ('teams_channel' in entry) {
|
|
100
84
|
return isValidTeamsChannel(entry.teams_channel);
|
|
101
85
|
}
|
|
102
|
-
|
|
86
|
+
if ('slack_channel' in entry) {
|
|
87
|
+
return (typeof entry.slack_channel === 'string' && entry.slack_channel.trim() !== '');
|
|
88
|
+
}
|
|
89
|
+
if ('email' in entry) {
|
|
90
|
+
return typeof entry.email === 'string' && entry.email.trim() !== '';
|
|
91
|
+
}
|
|
92
|
+
// Unknown shape
|
|
93
|
+
return false;
|
|
103
94
|
});
|
|
104
95
|
let shouldReloadPage = false;
|
|
105
96
|
if ($values) {
|
|
@@ -11,13 +11,10 @@ import Row from './table/Row.svelte';
|
|
|
11
11
|
import HighlightTheme from './HighlightTheme.svelte';
|
|
12
12
|
import { deepEqual } from 'fast-equals';
|
|
13
13
|
import { isWindmillTooBigObject } from './job_args';
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
let jsonViewer;
|
|
19
|
-
let runLocally;
|
|
20
|
-
let jsonStr = '';
|
|
14
|
+
let { id = undefined, args, argLabel = undefined, workspace = undefined } = $props();
|
|
15
|
+
let jsonViewer = $state();
|
|
16
|
+
let runLocally = $state();
|
|
17
|
+
let jsonStr = $state('');
|
|
21
18
|
function pythonCode() {
|
|
22
19
|
return `
|
|
23
20
|
if __name__ == "__main__":
|
|
@@ -47,9 +44,9 @@ ${Object.entries(args)
|
|
|
47
44
|
}
|
|
48
45
|
</script>
|
|
49
46
|
|
|
50
|
-
{#if args && typeof args === 'object' && deepEqual( Object.keys(args), ['reason'] ) && args['reason'] == 'PREPROCESSOR_ARGS_ARE_DISCARDED'}
|
|
47
|
+
{#if args && typeof args === 'object' && deepEqual( Object.keys(args ?? {}), ['reason'] ) && args['reason'] == 'PREPROCESSOR_ARGS_ARE_DISCARDED'}
|
|
51
48
|
Preprocessor args are discarded
|
|
52
|
-
{:else if id && workspace && args && typeof args === 'object' && deepEqual( Object.keys(args), ['reason'] ) && args['reason'] == 'WINDMILL_TOO_BIG'}
|
|
49
|
+
{:else if id && workspace && args && typeof args === 'object' && deepEqual( Object.keys(args ?? {}), ['reason'] ) && args['reason'] == 'WINDMILL_TOO_BIG'}
|
|
53
50
|
The args are too big in size to be able to fetch alongside job. Please <a
|
|
54
51
|
href="/api/w/{workspace}/jobs_u/get_args/{id}"
|
|
55
52
|
target="_blank">download the JSON file to view them</a
|
|
@@ -62,26 +59,28 @@ ${Object.entries(args)
|
|
|
62
59
|
<Cell head first>{argLabel ?? 'Arg'}</Cell>
|
|
63
60
|
<Cell head last>Value</Cell>
|
|
64
61
|
</tr>
|
|
65
|
-
|
|
62
|
+
{#snippet headerAction()}
|
|
66
63
|
<button
|
|
67
|
-
|
|
64
|
+
onclick={() => {
|
|
68
65
|
jsonStr = JSON.stringify(args, null, 4)
|
|
69
|
-
jsonViewer
|
|
66
|
+
jsonViewer?.openDrawer()
|
|
70
67
|
}}
|
|
71
68
|
>
|
|
72
69
|
<Expand size={18} />
|
|
73
70
|
</button>
|
|
74
|
-
|
|
71
|
+
{/snippet}
|
|
75
72
|
</Head>
|
|
76
73
|
|
|
77
74
|
<tbody class="divide-y w-full">
|
|
78
|
-
{#if args && Object.keys(args).length > 0}
|
|
79
|
-
{#each Object.entries(args).sort((a, b) => a[0]
|
|
75
|
+
{#if args && typeof args === 'object' && Object.keys(args ?? {}).length > 0}
|
|
76
|
+
{#each Object.entries(args ?? {}).sort( (a, b) => a?.[0]?.localeCompare(b?.[0]) ) as [arg, value]}
|
|
80
77
|
<Row>
|
|
81
78
|
<Cell first>{arg}</Cell>
|
|
82
79
|
<Cell><ArgInfo {value} /></Cell>
|
|
83
80
|
</Row>
|
|
84
81
|
{/each}
|
|
82
|
+
{:else if args && typeof args !== 'object'}
|
|
83
|
+
<Row><Cell>Argument is not an object (type: {typeof args})</Cell></Row>
|
|
85
84
|
{:else if args}
|
|
86
85
|
<Row><Cell>No arguments</Cell></Row>
|
|
87
86
|
{:else}
|
|
@@ -116,7 +115,7 @@ ${Object.entries(args)
|
|
|
116
115
|
Download
|
|
117
116
|
</Button>
|
|
118
117
|
<Button
|
|
119
|
-
on:click={runLocally
|
|
118
|
+
on:click={() => runLocally?.openDrawer()}
|
|
120
119
|
color="light"
|
|
121
120
|
size="xs"
|
|
122
121
|
startIcon={{ icon: ChevronRightSquare }}
|
|
@@ -1,23 +1,9 @@
|
|
|
1
|
-
interface
|
|
2
|
-
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
3
|
-
$$bindings?: Bindings;
|
|
4
|
-
} & Exports;
|
|
5
|
-
(internal: unknown, props: Props & {
|
|
6
|
-
$$events?: Events;
|
|
7
|
-
$$slots?: Slots;
|
|
8
|
-
}): Exports & {
|
|
9
|
-
$set?: any;
|
|
10
|
-
$on?: any;
|
|
11
|
-
};
|
|
12
|
-
z_$$bindings?: Bindings;
|
|
13
|
-
}
|
|
14
|
-
declare const JobArgs: $$__sveltets_2_IsomorphicComponent<{
|
|
1
|
+
interface Props {
|
|
15
2
|
id?: string | undefined;
|
|
16
3
|
args: any;
|
|
17
4
|
argLabel?: string | undefined;
|
|
18
5
|
workspace?: string | undefined;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
type JobArgs = InstanceType<typeof JobArgs>;
|
|
6
|
+
}
|
|
7
|
+
declare const JobArgs: import("svelte").Component<Props, {}, "">;
|
|
8
|
+
type JobArgs = ReturnType<typeof JobArgs>;
|
|
23
9
|
export default JobArgs;
|