windmill-components 1.503.1 → 1.503.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/AppWrapper.svelte +3 -0
- package/package/components/Dev.svelte +94 -4
- package/package/components/FlowBuilder.svelte +89 -7
- package/package/components/FlowPreviewContent.svelte +309 -278
- package/package/components/FlowPreviewContent.svelte.d.ts +33 -19
- package/package/components/FlowPreviewResult.svelte +74 -0
- package/package/components/FlowPreviewResult.svelte.d.ts +21 -0
- package/package/components/FlowStatusViewer.svelte +3 -1
- package/package/components/FlowStatusViewer.svelte.d.ts +2 -0
- package/package/components/FlowStatusViewerInner.svelte +15 -70
- package/package/components/FlowStatusWaitingForEvents.svelte +5 -2
- package/package/components/FlowStatusWaitingForEvents.svelte.d.ts +1 -0
- package/package/components/FlowWrapper.svelte +3 -0
- package/package/components/ModuleTest.svelte +26 -24
- package/package/components/ResourcePicker.svelte +11 -3
- package/package/components/ScriptWrapper.svelte +3 -0
- package/package/components/common/button/Button.svelte +2 -1
- package/package/components/common/button/Button.svelte.d.ts +2 -1
- package/package/components/flows/FlowEditor.svelte +23 -2
- package/package/components/flows/FlowEditor.svelte.d.ts +23 -3
- package/package/components/flows/content/FlowEditorPanel.svelte +4 -3
- package/package/components/flows/content/FlowEditorPanel.svelte.d.ts +12 -2
- package/package/components/flows/content/FlowInput.svelte +2 -2
- package/package/components/flows/content/FlowInput.svelte.d.ts +1 -1
- package/package/components/flows/content/FlowResult.svelte +35 -0
- package/package/components/flows/content/FlowResult.svelte.d.ts +17 -0
- package/package/components/flows/header/FlowPreviewButtons.svelte +81 -46
- package/package/components/flows/map/FlowGraphPreviewButton.svelte +94 -0
- package/package/components/flows/map/FlowGraphPreviewButton.svelte.d.ts +17 -0
- package/package/components/flows/map/FlowModuleSchemaItem.svelte +296 -285
- package/package/components/flows/map/FlowModuleSchemaItem.svelte.d.ts +6 -0
- package/package/components/flows/map/FlowModuleSchemaMap.svelte +20 -1
- package/package/components/flows/map/FlowModuleSchemaMap.svelte.d.ts +20 -1
- package/package/components/flows/map/MapItem.svelte +25 -3
- package/package/components/flows/map/MapItem.svelte.d.ts +6 -1
- package/package/components/flows/map/VirtualItem.svelte +55 -3
- package/package/components/flows/map/VirtualItem.svelte.d.ts +13 -1
- package/package/components/flows/map/VirtualItemWrapper.svelte +33 -29
- package/package/components/flows/map/VirtualItemWrapper.svelte.d.ts +1 -0
- package/package/components/flows/propPicker/OutputPicker.svelte +17 -2
- package/package/components/flows/propPicker/OutputPicker.svelte.d.ts +4 -0
- package/package/components/flows/propPicker/OutputPickerInner.svelte +2 -2
- package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +1 -0
- package/package/components/flows/types.d.ts +3 -0
- package/package/components/flows/utils.d.ts +9 -0
- package/package/components/flows/utils.js +39 -0
- package/package/components/graph/FlowGraphV2.svelte +27 -4
- package/package/components/graph/FlowGraphV2.svelte.d.ts +18 -2
- package/package/components/graph/ViewportResizer.svelte +33 -1
- package/package/components/graph/ViewportResizer.svelte.d.ts +5 -1
- package/package/components/graph/graphBuilder.svelte.d.ts +26 -1
- package/package/components/graph/graphBuilder.svelte.js +13 -3
- package/package/components/graph/renderers/edges/BaseEdge.svelte +69 -2
- package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +10 -0
- package/package/components/graph/renderers/nodes/InputNode.svelte +19 -1
- package/package/components/graph/renderers/nodes/ModuleNode.svelte +17 -2
- package/package/components/graph/renderers/nodes/ResultNode.svelte +9 -8
- package/package/components/modulesTest.svelte.d.ts +12 -0
- package/package/components/modulesTest.svelte.js +8 -0
- package/package/components/preview/FlowPreviewStatus.svelte +9 -4
- package/package/components/preview/FlowPreviewStatus.svelte.d.ts +6 -18
- package/package/components/schema/EditableSchemaSdkWrapper.svelte +3 -0
- package/package/components/workspaceSettings/AISettings.svelte +1 -0
- package/package/gen/schemas.gen.d.ts +0 -3
- package/package/gen/schemas.gen.js +0 -3
- package/package/gen/types.gen.d.ts +0 -1
- package/package/utils.js +2 -0
- package/package.json +1 -1
- package/package/components/flows/header/FlowPreviewButtons.svelte.d.ts +0 -26
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import type { Flow } from '../../../gen';
|
|
1
|
+
import type { Flow, Job } from '../../../gen';
|
|
2
2
|
import { type Trigger } from '../../triggers/utils';
|
|
3
|
+
import type { Writable } from 'svelte/store';
|
|
4
|
+
import type { DurationStatus } from '../../graph';
|
|
3
5
|
interface Props {
|
|
4
6
|
noEditor?: boolean;
|
|
5
7
|
enableAi?: boolean;
|
|
@@ -11,7 +13,15 @@ interface Props {
|
|
|
11
13
|
onDeployTrigger?: (trigger: Trigger) => void;
|
|
12
14
|
forceTestTab?: Record<string, boolean>;
|
|
13
15
|
highlightArg?: Record<string, string | undefined>;
|
|
14
|
-
|
|
16
|
+
onTestFlow?: () => void;
|
|
17
|
+
job?: Job;
|
|
18
|
+
isOwner?: boolean;
|
|
19
|
+
localDurationStatuses?: Writable<Record<string, DurationStatus>>;
|
|
20
|
+
suspendStatus?: Writable<Record<string, {
|
|
21
|
+
job: Job;
|
|
22
|
+
nb: number;
|
|
23
|
+
}>>;
|
|
24
|
+
onOpenDetails?: () => void;
|
|
15
25
|
}
|
|
16
26
|
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> {
|
|
17
27
|
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
@@ -21,7 +21,7 @@ import SideBarTab from '../../meltComponents/SideBarTab.svelte';
|
|
|
21
21
|
import CaptureTable from '../../triggers/CaptureTable.svelte';
|
|
22
22
|
import { isObjectTooBig } from '../../../utils';
|
|
23
23
|
import { refreshStateStore } from '../../../svelte5Utils.svelte';
|
|
24
|
-
let { noEditor, disabled,
|
|
24
|
+
let { noEditor, disabled, onTestFlow } = $props();
|
|
25
25
|
const { flowStore, previewArgs, pathStore, initialPathStore, fakeInitialPath, flowInputEditorState } = getContext('FlowEditorContext');
|
|
26
26
|
let addPropertyV2 = $state(undefined);
|
|
27
27
|
let previewSchema = $state(undefined);
|
|
@@ -159,7 +159,7 @@ function runPreview() {
|
|
|
159
159
|
if (previewArguments) {
|
|
160
160
|
previewArgs.val = structuredClone($state.snapshot(previewArguments));
|
|
161
161
|
}
|
|
162
|
-
|
|
162
|
+
onTestFlow?.();
|
|
163
163
|
}
|
|
164
164
|
function updatePreviewSchemaAndArgs(payload) {
|
|
165
165
|
if (isObjectTooBig(payload)) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
interface Props {
|
|
2
2
|
noEditor: boolean;
|
|
3
3
|
disabled: boolean;
|
|
4
|
-
|
|
4
|
+
onTestFlow?: () => void;
|
|
5
5
|
}
|
|
6
6
|
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> {
|
|
7
7
|
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
<script lang="ts">import FlowPreviewResult from '../../FlowPreviewResult.svelte';
|
|
2
|
+
import { workspaceStore } from '../../../stores';
|
|
3
|
+
import FlowCard from '../common/FlowCard.svelte';
|
|
4
|
+
import Button from '../../common/button/Button.svelte';
|
|
5
|
+
let { job, isOwner, localDurationStatuses, suspendStatus, noEditor, onOpenDetails } = $props();
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
<FlowCard {noEditor} title="Flow result">
|
|
9
|
+
{#if job && isOwner !== undefined && localDurationStatuses && suspendStatus}
|
|
10
|
+
<div class="px-4 py-2">
|
|
11
|
+
<FlowPreviewResult
|
|
12
|
+
{job}
|
|
13
|
+
workspaceId={$workspaceStore}
|
|
14
|
+
{isOwner}
|
|
15
|
+
hideFlowResult={false}
|
|
16
|
+
hideDownloadLogs={false}
|
|
17
|
+
{localDurationStatuses}
|
|
18
|
+
innerModules={[]}
|
|
19
|
+
{suspendStatus}
|
|
20
|
+
{extra}
|
|
21
|
+
hideJobId
|
|
22
|
+
/>
|
|
23
|
+
</div>
|
|
24
|
+
{:else}
|
|
25
|
+
<p class="p-4 text-secondary">The result of the flow will be the result of the last node.</p>
|
|
26
|
+
{/if}
|
|
27
|
+
</FlowCard>
|
|
28
|
+
|
|
29
|
+
{#snippet extra()}
|
|
30
|
+
<div class="flex justify-end">
|
|
31
|
+
<Button variant="border" color="light" size="xs" on:click={() => onOpenDetails?.()}
|
|
32
|
+
>Open details</Button
|
|
33
|
+
>
|
|
34
|
+
</div>
|
|
35
|
+
{/snippet}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { DurationStatus } from '../../graph';
|
|
2
|
+
import type { Job } from '../../../gen';
|
|
3
|
+
import type { Writable } from 'svelte/store';
|
|
4
|
+
interface Props {
|
|
5
|
+
job?: Job;
|
|
6
|
+
isOwner?: boolean;
|
|
7
|
+
localDurationStatuses?: Writable<Record<string, DurationStatus>>;
|
|
8
|
+
suspendStatus?: Writable<Record<string, {
|
|
9
|
+
job: Job;
|
|
10
|
+
nb: number;
|
|
11
|
+
}>>;
|
|
12
|
+
noEditor: boolean;
|
|
13
|
+
onOpenDetails?: () => void;
|
|
14
|
+
}
|
|
15
|
+
declare const FlowResult: import("svelte").Component<Props, {}, "">;
|
|
16
|
+
type FlowResult = ReturnType<typeof FlowResult>;
|
|
17
|
+
export default FlowResult;
|
|
@@ -4,12 +4,20 @@ import FlowPreviewContent from '../../FlowPreviewContent.svelte';
|
|
|
4
4
|
import { createEventDispatcher, tick } from 'svelte';
|
|
5
5
|
import { getContext } from 'svelte';
|
|
6
6
|
import { Play } from 'lucide-svelte';
|
|
7
|
-
import { writable } from 'svelte/store';
|
|
8
7
|
import { aiChatManager } from '../../copilot/chat/AIChatManager.svelte';
|
|
9
|
-
let { loading = false } = $props();
|
|
8
|
+
let { loading = false, onRunPreview, onJobDone } = $props();
|
|
10
9
|
const { selectedId } = getContext('FlowEditorContext');
|
|
11
|
-
let
|
|
10
|
+
let flowPreviewContent = $state(undefined);
|
|
11
|
+
let preventEscape = $state(false);
|
|
12
|
+
let selectedJobStep = $state(undefined);
|
|
13
|
+
let selectedJobStepIsTopLevel = $state(undefined);
|
|
14
|
+
let selectedJobStepType = $state('single');
|
|
15
|
+
let branchOrIterationN = $state(0);
|
|
16
|
+
let scrollTop = $state(0);
|
|
12
17
|
let previewMode = $state('whole');
|
|
18
|
+
let upToId = $state(undefined);
|
|
19
|
+
let previewOpen = $state(false);
|
|
20
|
+
let deferContent = $state(false);
|
|
13
21
|
export async function openPreview(test = false) {
|
|
14
22
|
if (!previewOpen) {
|
|
15
23
|
previewOpen = true;
|
|
@@ -18,50 +26,75 @@ export async function openPreview(test = false) {
|
|
|
18
26
|
if (!test)
|
|
19
27
|
return;
|
|
20
28
|
}
|
|
29
|
+
previewMode = 'whole';
|
|
21
30
|
flowPreviewContent?.test();
|
|
22
31
|
}
|
|
32
|
+
export async function runPreview() {
|
|
33
|
+
if (!previewOpen) {
|
|
34
|
+
deferContent = true;
|
|
35
|
+
await tick();
|
|
36
|
+
}
|
|
37
|
+
previewMode = 'whole';
|
|
38
|
+
flowPreviewContent?.refresh();
|
|
39
|
+
flowPreviewContent?.test();
|
|
40
|
+
}
|
|
41
|
+
export function cancelTest() {
|
|
42
|
+
flowPreviewContent?.cancelTest();
|
|
43
|
+
}
|
|
23
44
|
const dispatch = createEventDispatcher();
|
|
24
|
-
let flowPreviewContent = $state(undefined);
|
|
25
|
-
let jobId = $state(undefined);
|
|
26
|
-
let job = $state(undefined);
|
|
27
|
-
let preventEscape = $state(false);
|
|
28
|
-
let selectedJobStep = $state(undefined);
|
|
29
|
-
let selectedJobStepIsTopLevel = $state(undefined);
|
|
30
|
-
let selectedJobStepType = $state('single');
|
|
31
|
-
let branchOrIterationN = $state(0);
|
|
32
|
-
let scrollTop = $state(0);
|
|
33
45
|
let rightColumnSelect = $state('timeline');
|
|
34
|
-
let
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
46
|
+
let upToDisabled = $derived.by(() => {
|
|
47
|
+
const upToSelected = upToId ?? $selectedId;
|
|
48
|
+
return (upToSelected == undefined ||
|
|
49
|
+
[
|
|
50
|
+
'settings',
|
|
51
|
+
'settings-metadata',
|
|
52
|
+
'settings-schedule',
|
|
53
|
+
'settings-retries',
|
|
54
|
+
'settings-same-worker',
|
|
55
|
+
'settings-graph',
|
|
56
|
+
'settings-worker-group',
|
|
57
|
+
'settings-cache',
|
|
58
|
+
'settings-concurrency',
|
|
59
|
+
'settings-early-stop',
|
|
60
|
+
'settings-early-return',
|
|
61
|
+
'inputs',
|
|
62
|
+
'schedules',
|
|
63
|
+
'failure',
|
|
64
|
+
'preprocessor',
|
|
65
|
+
'constants',
|
|
66
|
+
'Result',
|
|
67
|
+
'Input',
|
|
68
|
+
'triggers'
|
|
69
|
+
].includes(upToSelected) ||
|
|
70
|
+
upToSelected?.includes('branch') ||
|
|
71
|
+
aiChatManager.flowAiChatHelpers?.getModuleAction(upToSelected) === 'removed');
|
|
72
|
+
});
|
|
73
|
+
export async function testUpTo(id, openPreview = false) {
|
|
74
|
+
upToId = id;
|
|
61
75
|
if (upToDisabled)
|
|
62
76
|
return;
|
|
77
|
+
if (openPreview) {
|
|
78
|
+
previewOpen = true;
|
|
79
|
+
}
|
|
80
|
+
else if (!previewOpen) {
|
|
81
|
+
deferContent = true;
|
|
82
|
+
await tick();
|
|
83
|
+
}
|
|
63
84
|
previewMode = 'upTo';
|
|
64
|
-
|
|
85
|
+
flowPreviewContent?.refresh();
|
|
86
|
+
if (!openPreview) {
|
|
87
|
+
flowPreviewContent?.test();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
export function getPreviewMode() {
|
|
91
|
+
return previewMode;
|
|
92
|
+
}
|
|
93
|
+
export function getPreviewOpen() {
|
|
94
|
+
return previewOpen;
|
|
95
|
+
}
|
|
96
|
+
export function getFlowPreviewContent() {
|
|
97
|
+
return flowPreviewContent;
|
|
65
98
|
}
|
|
66
99
|
</script>
|
|
67
100
|
|
|
@@ -81,7 +114,7 @@ export function testUpTo() {
|
|
|
81
114
|
? [
|
|
82
115
|
{
|
|
83
116
|
label: 'Test up to ' + $selectedId,
|
|
84
|
-
onClick: testUpTo
|
|
117
|
+
onClick: () => testUpTo($selectedId, true)
|
|
85
118
|
}
|
|
86
119
|
]
|
|
87
120
|
: undefined}
|
|
@@ -90,22 +123,20 @@ export function testUpTo() {
|
|
|
90
123
|
</Button>
|
|
91
124
|
|
|
92
125
|
{#if !loading}
|
|
93
|
-
<Drawer bind:open={previewOpen} size="75%" {preventEscape}>
|
|
126
|
+
<Drawer bind:open={previewOpen} size="75%" {preventEscape} alwaysOpen={deferContent}>
|
|
94
127
|
<FlowPreviewContent
|
|
95
128
|
bind:this={flowPreviewContent}
|
|
96
|
-
bind:localModuleStates
|
|
97
|
-
bind:localDurationStatuses
|
|
98
129
|
open={previewOpen}
|
|
99
130
|
bind:scrollTop
|
|
100
131
|
bind:previewMode
|
|
101
|
-
bind:job
|
|
102
|
-
bind:jobId
|
|
103
132
|
bind:selectedJobStep
|
|
104
133
|
bind:selectedJobStepIsTopLevel
|
|
105
134
|
bind:selectedJobStepType
|
|
106
135
|
bind:branchOrIterationN
|
|
107
136
|
bind:rightColumnSelect
|
|
108
137
|
on:close={() => {
|
|
138
|
+
// keep the data in the preview content
|
|
139
|
+
deferContent = true
|
|
109
140
|
previewOpen = false
|
|
110
141
|
}}
|
|
111
142
|
on:openTriggers={(e) => {
|
|
@@ -113,6 +144,10 @@ export function testUpTo() {
|
|
|
113
144
|
dispatch('openTriggers', e.detail)
|
|
114
145
|
}}
|
|
115
146
|
bind:preventEscape
|
|
147
|
+
{onRunPreview}
|
|
148
|
+
render={previewOpen}
|
|
149
|
+
{onJobDone}
|
|
150
|
+
{upToId}
|
|
116
151
|
/>
|
|
117
152
|
</Drawer>
|
|
118
153
|
{/if}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
<script lang="ts">import { Button } from '../../common';
|
|
2
|
+
import { fade } from 'svelte/transition';
|
|
3
|
+
import { Loader2, Play, X } from 'lucide-svelte';
|
|
4
|
+
import { twMerge } from 'tailwind-merge';
|
|
5
|
+
import Popover from '../../Popover.svelte';
|
|
6
|
+
let { isRunning, hover, selected, individualStepTests, job, showJobStatus, flowHasChanged, onTestFlow, onCancelTestFlow, onOpenPreview, onHideJobStatus } = $props();
|
|
7
|
+
const flowPreviewJob = $derived(showJobStatus ? job : undefined);
|
|
8
|
+
const wide = $derived(hover || selected || flowPreviewJob || individualStepTests);
|
|
9
|
+
</script>
|
|
10
|
+
|
|
11
|
+
{#if !isRunning}
|
|
12
|
+
<Button
|
|
13
|
+
size="sm"
|
|
14
|
+
color="dark"
|
|
15
|
+
btnClasses={twMerge(
|
|
16
|
+
'relative p-1.5 h-[36px] transition-all duration-200',
|
|
17
|
+
wide ? 'w-[120px]' : 'w-[44.5px]'
|
|
18
|
+
)}
|
|
19
|
+
on:click={() => {
|
|
20
|
+
onTestFlow?.()
|
|
21
|
+
}}
|
|
22
|
+
>
|
|
23
|
+
{#if isRunning}
|
|
24
|
+
<Loader2 size={16} class="animate-spin" />
|
|
25
|
+
{:else}
|
|
26
|
+
<Play size={16} />
|
|
27
|
+
{/if}
|
|
28
|
+
{#if wide}
|
|
29
|
+
<span transition:fade={{ duration: 100 }} class="text-xs">Test flow</span>
|
|
30
|
+
{/if}
|
|
31
|
+
</Button>
|
|
32
|
+
{#if wide && (flowPreviewJob || individualStepTests)}
|
|
33
|
+
<div
|
|
34
|
+
class="flex flex-row items-center shadow-sm rounded-md mt-1"
|
|
35
|
+
in:fade={{ duration: 100, delay: 200 }}
|
|
36
|
+
style={`width: ${wide ? '120px' : '44.5px'}`}
|
|
37
|
+
>
|
|
38
|
+
<Popover class="grow min-w-0">
|
|
39
|
+
<button
|
|
40
|
+
class={twMerge(
|
|
41
|
+
'text-xs rounded-md rounded-r-none px-1.5 h-[24px] w-full bg-surface flex flex-row items-center gap-2 justify-center transition-all duration-200 ',
|
|
42
|
+
'hover:bg-surface-hover text-gray-400 hover:text-primary'
|
|
43
|
+
)}
|
|
44
|
+
onclick={onOpenPreview}
|
|
45
|
+
>
|
|
46
|
+
{#if flowPreviewJob && !flowHasChanged}
|
|
47
|
+
<div
|
|
48
|
+
class={twMerge(
|
|
49
|
+
'rounded-full h-2 w-2',
|
|
50
|
+
'success' in flowPreviewJob && flowPreviewJob.success
|
|
51
|
+
? 'bg-green-400'
|
|
52
|
+
: 'bg-red-400'
|
|
53
|
+
)}
|
|
54
|
+
title={'success' in flowPreviewJob && flowPreviewJob.success ? 'Success' : 'Failed'}
|
|
55
|
+
>
|
|
56
|
+
</div>
|
|
57
|
+
{/if}
|
|
58
|
+
<span class={twMerge('text-xs truncate', flowHasChanged && 'text-orange-600')} dir="rtl">
|
|
59
|
+
{!individualStepTests && !flowHasChanged && flowPreviewJob
|
|
60
|
+
? flowPreviewJob.id.slice(-5)
|
|
61
|
+
: '~'}
|
|
62
|
+
</span>
|
|
63
|
+
</button>
|
|
64
|
+
{#snippet text()}
|
|
65
|
+
{#if !individualStepTests && !flowHasChanged}
|
|
66
|
+
See run details
|
|
67
|
+
{:else}
|
|
68
|
+
Open preview
|
|
69
|
+
{/if}
|
|
70
|
+
{/snippet}
|
|
71
|
+
</Popover>
|
|
72
|
+
<button
|
|
73
|
+
class="h-[24px] px-1.5 bg-surface rounded-md rounded-l-none text-gray-400 hover:bg-red-500 hover:text-white"
|
|
74
|
+
title="Hide jobs status"
|
|
75
|
+
onclick={onHideJobStatus}
|
|
76
|
+
>
|
|
77
|
+
<X size={14} />
|
|
78
|
+
</button>
|
|
79
|
+
</div>
|
|
80
|
+
{/if}
|
|
81
|
+
{:else}
|
|
82
|
+
<Button
|
|
83
|
+
size="xs"
|
|
84
|
+
color="red"
|
|
85
|
+
variant="contained"
|
|
86
|
+
btnClasses="h-[34px] w-[120px] p-1.5"
|
|
87
|
+
on:click={async () => {
|
|
88
|
+
onCancelTestFlow?.()
|
|
89
|
+
}}
|
|
90
|
+
>
|
|
91
|
+
<Loader2 size={16} class="animate-spin" />
|
|
92
|
+
<span transition:fade={{ duration: 100 }} class="text-xs">Cancel</span>
|
|
93
|
+
</Button>
|
|
94
|
+
{/if}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Job } from '../../../gen';
|
|
2
|
+
interface Props {
|
|
3
|
+
isRunning?: boolean;
|
|
4
|
+
hover?: boolean;
|
|
5
|
+
selected?: boolean;
|
|
6
|
+
individualStepTests?: boolean;
|
|
7
|
+
showJobStatus?: boolean;
|
|
8
|
+
job?: Job;
|
|
9
|
+
flowHasChanged?: boolean;
|
|
10
|
+
onTestFlow?: () => void;
|
|
11
|
+
onCancelTestFlow?: () => void;
|
|
12
|
+
onOpenPreview?: () => void;
|
|
13
|
+
onHideJobStatus?: () => void;
|
|
14
|
+
}
|
|
15
|
+
declare const FlowGraphPreviewButton: import("svelte").Component<Props, {}, "">;
|
|
16
|
+
type FlowGraphPreviewButton = ReturnType<typeof FlowGraphPreviewButton>;
|
|
17
|
+
export default FlowGraphPreviewButton;
|