windmill-components 1.379.4 → 1.382.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package/components/ArgInput.svelte +33 -3
- package/package/components/DisplayResult.svelte +17 -5
- package/package/components/ErrorOrRecoveryHandler.svelte +3 -2
- package/package/components/FlowBuilder.svelte +3 -0
- package/package/components/FlowBuilder.svelte.d.ts +1 -0
- package/package/components/FlowGraphViewer.svelte +6 -5
- package/package/components/FlowJobResult.svelte +4 -2
- package/package/components/FlowJobResult.svelte.d.ts +2 -0
- package/package/components/FlowStatusViewerInner.svelte +17 -6
- package/package/components/FlowViewer.svelte +1 -0
- package/package/components/HighlightCode.svelte +2 -2
- package/package/components/ModulePreviewForm.svelte +1 -1
- package/package/components/ObjectResourceInput.svelte +7 -2
- package/package/components/ObjectResourceInput.svelte.d.ts +2 -0
- package/package/components/ResourcePicker.svelte +60 -48
- package/package/components/ScriptVersionHistory.svelte +63 -7
- package/package/components/apps/components/display/dbtable/DbExplorerCount.svelte +3 -2
- package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte +22 -5
- package/package/components/apps/components/display/table/AppAggridTable.svelte +14 -5
- package/package/components/apps/components/display/table/AppAggridTableActions.svelte +23 -8
- package/package/components/apps/components/display/table/AppAggridTableActions.svelte.d.ts +5 -3
- package/package/components/apps/components/display/table/utils.js +8 -7
- package/package/components/apps/components/helpers/RunnableComponent.svelte +13 -1
- package/package/components/apps/components/helpers/eval.js +31 -25
- package/package/components/apps/editor/AppEditorHeader.svelte +1 -0
- package/package/components/apps/editor/AppReportsDrawer.svelte +4 -3
- package/package/components/apps/editor/component/components.d.ts +1 -1
- package/package/components/apps/editor/settingsPanel/DecisionTreeGraphEditor.svelte +0 -1
- package/package/components/apps/editor/settingsPanel/DecisionTreeGraphHeader.svelte +55 -45
- package/package/components/apps/editor/settingsPanel/DecisionTreeGraphHeader.svelte.d.ts +7 -9
- package/package/components/apps/editor/settingsPanel/DecisionTreeGraphNode.svelte +66 -59
- package/package/components/apps/editor/settingsPanel/DecisionTreeGraphNode.svelte.d.ts +9 -11
- package/package/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte +213 -254
- package/package/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte.d.ts +0 -1
- package/package/components/apps/editor/settingsPanel/decisionTree/nodeHelpers.d.ts +1 -1
- package/package/components/apps/editor/settingsPanel/decisionTree/nodeHelpers.js +2 -6
- package/package/components/details/DetailPageDetailPanel.svelte +9 -1
- package/package/components/details/DetailPageDetailPanel.svelte.d.ts +2 -1
- package/package/components/details/DetailPageLayout.svelte +2 -0
- package/package/components/details/DetailPageLayout.svelte.d.ts +3 -0
- package/package/components/details/EmailTriggerPanel.svelte +128 -0
- package/package/components/details/EmailTriggerPanel.svelte.d.ts +20 -0
- package/package/components/details/WebhooksPanel.svelte +7 -68
- package/package/components/flows/FlowHistory.svelte +1 -0
- package/package/components/flows/content/FlowInputs.svelte +0 -1
- package/package/components/flows/content/FlowModuleScript.svelte +33 -3
- package/package/components/flows/content/FlowModuleScript.svelte.d.ts +2 -0
- package/package/components/flows/content/FlowModuleSuspend.svelte +15 -0
- package/package/components/flows/flowInfers.js +1 -1
- package/package/components/flows/map/FlowJobsMenu.svelte +39 -44
- package/package/components/flows/map/FlowModuleSchemaItem.svelte +1 -2
- package/package/components/flows/map/FlowModuleSchemaMap.svelte +4 -3
- package/package/components/flows/map/InsertModuleButton.svelte +16 -9
- package/package/components/flows/map/MapItem.svelte +3 -97
- package/package/components/flows/map/MapItem.svelte.d.ts +0 -5
- package/package/components/flows/map/VirtualItem.svelte +6 -159
- package/package/components/flows/map/VirtualItem.svelte.d.ts +0 -15
- package/package/components/graph/FlowGraphV2.svelte +256 -0
- package/package/components/graph/{FlowGraph.svelte.d.ts → FlowGraphV2.svelte.d.ts} +8 -8
- package/package/components/graph/graphBuilder.d.ts +15 -0
- package/package/components/graph/graphBuilder.js +337 -0
- package/package/components/graph/index.d.ts +0 -1
- package/package/components/graph/index.js +0 -1
- package/package/components/graph/model.d.ts +1 -8
- package/package/components/graph/renderers/edges/BaseEdge.svelte +109 -0
- package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +35 -0
- package/package/components/graph/renderers/edges/DataflowEdge.svelte +37 -0
- package/package/components/graph/renderers/edges/DataflowEdge.svelte.d.ts +29 -0
- package/package/components/graph/renderers/edges/EmptyEdge.svelte +22 -0
- package/package/components/graph/renderers/edges/EmptyEdge.svelte.d.ts +23 -0
- package/package/components/graph/renderers/nodes/BranchAllStart.svelte +44 -0
- package/package/components/graph/renderers/nodes/BranchAllStart.svelte.d.ts +29 -0
- package/package/components/graph/renderers/nodes/BranchOneStart.svelte +41 -0
- package/package/components/graph/renderers/nodes/BranchOneStart.svelte.d.ts +29 -0
- package/package/components/graph/renderers/nodes/ForLoopEndNode.svelte +19 -0
- package/package/components/graph/renderers/nodes/ForLoopEndNode.svelte.d.ts +24 -0
- package/package/components/graph/renderers/nodes/ForLoopStartNode.svelte +20 -0
- package/package/components/graph/renderers/nodes/ForLoopStartNode.svelte.d.ts +25 -0
- package/package/components/graph/renderers/nodes/InputNode.svelte +74 -0
- package/package/components/graph/renderers/nodes/InputNode.svelte.d.ts +23 -0
- package/package/components/graph/renderers/nodes/ModuleNode.svelte +71 -0
- package/package/components/graph/renderers/nodes/ModuleNode.svelte.d.ts +41 -0
- package/package/components/graph/renderers/nodes/NoBranchNode.svelte +20 -0
- package/package/components/graph/renderers/nodes/NoBranchNode.svelte.d.ts +27 -0
- package/package/components/graph/renderers/nodes/NodeWrapper.svelte +21 -0
- package/package/components/graph/renderers/nodes/NodeWrapper.svelte.d.ts +22 -0
- package/package/components/graph/renderers/nodes/ResultNode.svelte +24 -0
- package/package/components/graph/renderers/nodes/ResultNode.svelte.d.ts +22 -0
- package/package/components/graph/renderers/nodes/branchAllEndNode.svelte +19 -0
- package/package/components/graph/renderers/nodes/branchAllEndNode.svelte.d.ts +26 -0
- package/package/components/graph/renderers/nodes/branchOneEndNode.svelte +19 -0
- package/package/components/graph/renderers/nodes/branchOneEndNode.svelte.d.ts +24 -0
- package/package/components/graph/renderers/utils.d.ts +8 -0
- package/package/components/graph/renderers/utils.js +26 -0
- package/package/components/graph/util.d.ts +1 -2
- package/package/components/graph/util.js +2 -8
- package/package/components/runs/RunsFilter.svelte +15 -17
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/schemas.gen.d.ts +3 -0
- package/package/gen/schemas.gen.js +3 -0
- package/package/gen/services.gen.d.ts +22 -3
- package/package/gen/services.gen.js +38 -2
- package/package/gen/types.gen.d.ts +69 -6
- package/package/hub.d.ts +11 -0
- package/package/hub.js +2 -0
- package/package/hubPaths.json +9 -0
- package/package/init_scripts/python_failure_module.d.ts +1 -1
- package/package/init_scripts/python_failure_module.js +4 -3
- package/package/script_helpers.d.ts +2 -2
- package/package/script_helpers.js +11 -9
- package/package.json +2 -1
- package/package/components/graph/FlowGraph.svelte +0 -614
- package/package/components/graph/svelvet/LICENSE +0 -21
- package/package/components/graph/svelvet/container/README.md +0 -7
- package/package/components/graph/svelvet/container/controllers/middleware.d.ts +0 -11
- package/package/components/graph/svelvet/container/controllers/middleware.js +0 -87
- package/package/components/graph/svelvet/container/models/index.d.ts +0 -0
- package/package/components/graph/svelvet/container/models/index.js +0 -1
- package/package/components/graph/svelvet/container/views/GraphView.svelte +0 -262
- package/package/components/graph/svelvet/container/views/GraphView.svelte.d.ts +0 -26
- package/package/components/graph/svelvet/container/views/Svelvet.svelte +0 -121
- package/package/components/graph/svelvet/container/views/Svelvet.svelte.d.ts +0 -36
- package/package/components/graph/svelvet/customCss/controllers/getCss.d.ts +0 -2
- package/package/components/graph/svelvet/customCss/controllers/getCss.js +0 -46
- package/package/components/graph/svelvet/d3/controllers/d3.d.ts +0 -5
- package/package/components/graph/svelvet/d3/controllers/d3.js +0 -59
- package/package/components/graph/svelvet/edges/controllers/anchorCbDev.d.ts +0 -4
- package/package/components/graph/svelvet/edges/controllers/anchorCbDev.js +0 -92
- package/package/components/graph/svelvet/edges/controllers/anchorCbUser.d.ts +0 -57
- package/package/components/graph/svelvet/edges/controllers/anchorCbUser.js +0 -73
- package/package/components/graph/svelvet/edges/controllers/util.d.ts +0 -37
- package/package/components/graph/svelvet/edges/controllers/util.js +0 -71
- package/package/components/graph/svelvet/edges/models/Anchor.d.ts +0 -48
- package/package/components/graph/svelvet/edges/models/Anchor.js +0 -122
- package/package/components/graph/svelvet/edges/models/Edge.d.ts +0 -48
- package/package/components/graph/svelvet/edges/models/Edge.js +0 -109
- package/package/components/graph/svelvet/edges/types/types.d.ts +0 -18
- package/package/components/graph/svelvet/edges/types/types.js +0 -1
- package/package/components/graph/svelvet/edges/views/Edges/BaseEdge.svelte +0 -104
- package/package/components/graph/svelvet/edges/views/Edges/BaseEdge.svelte.d.ts +0 -18
- package/package/components/graph/svelvet/edges/views/Edges/EdgeText.svelte +0 -42
- package/package/components/graph/svelvet/edges/views/Edges/EdgeText.svelte.d.ts +0 -17
- package/package/components/graph/svelvet/edges/views/Edges/SimpleBezierEdge.svelte +0 -151
- package/package/components/graph/svelvet/edges/views/Edges/SimpleBezierEdge.svelte.d.ts +0 -17
- package/package/components/graph/svelvet/edges/views/Edges/SmoothStepEdge.svelte +0 -157
- package/package/components/graph/svelvet/edges/views/Edges/SmoothStepEdge.svelte.d.ts +0 -60
- package/package/components/graph/svelvet/edges/views/Edges/StepEdge.svelte +0 -8
- package/package/components/graph/svelvet/edges/views/Edges/StepEdge.svelte.d.ts +0 -25
- package/package/components/graph/svelvet/edges/views/Edges/types.d.ts +0 -52
- package/package/components/graph/svelvet/edges/views/Edges/types.js +0 -1
- package/package/components/graph/svelvet/edges/views/Edges/utils.d.ts +0 -33
- package/package/components/graph/svelvet/edges/views/Edges/utils.js +0 -31
- package/package/components/graph/svelvet/nodes/controllers/util.d.ts +0 -9
- package/package/components/graph/svelvet/nodes/controllers/util.js +0 -13
- package/package/components/graph/svelvet/nodes/models/Node.d.ts +0 -74
- package/package/components/graph/svelvet/nodes/models/Node.js +0 -156
- package/package/components/graph/svelvet/nodes/views/Node.svelte +0 -84
- package/package/components/graph/svelvet/nodes/views/Node.svelte.d.ts +0 -21
- package/package/components/graph/svelvet/store/controllers/storeApi.d.ts +0 -25
- package/package/components/graph/svelvet/store/controllers/storeApi.js +0 -91
- package/package/components/graph/svelvet/store/controllers/userApi.d.ts +0 -3
- package/package/components/graph/svelvet/store/controllers/userApi.js +0 -18
- package/package/components/graph/svelvet/store/controllers/util.d.ts +0 -24
- package/package/components/graph/svelvet/store/controllers/util.js +0 -148
- package/package/components/graph/svelvet/store/models/store.d.ts +0 -13
- package/package/components/graph/svelvet/store/models/store.js +0 -12
- package/package/components/graph/svelvet/store/types/types.d.ts +0 -127
- package/package/components/graph/svelvet/store/types/types.js +0 -1
- package/package/components/graph/svelvet/types/README.md +0 -3
- package/package/components/graph/svelvet/types/index.d.ts +0 -2
- package/package/components/graph/svelvet/types/index.js +0 -1
- package/package/components/graph/svelvet/types/types.d.ts +0 -50
- package/package/components/graph/svelvet/types/types.js +0 -18
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
<script>import Tooltip from '../Tooltip.svelte';
|
|
2
|
+
import { enterpriseLicense, userStore, workspaceStore } from '../../stores';
|
|
3
|
+
import { Button } from '../common';
|
|
4
|
+
import { SCRIPT_VIEW_SHOW_CREATE_TOKEN_BUTTON } from '../../consts';
|
|
5
|
+
import UserSettings from '../UserSettings.svelte';
|
|
6
|
+
import ClipboardPanel from './ClipboardPanel.svelte';
|
|
7
|
+
import { generateRandomString } from '../../utils';
|
|
8
|
+
import HighlightTheme from '../HighlightTheme.svelte';
|
|
9
|
+
import Alert from '../common/alert/Alert.svelte';
|
|
10
|
+
import { SettingService } from '../../gen';
|
|
11
|
+
import { base32 } from 'rfc4648';
|
|
12
|
+
import ToggleButton from '../common/toggleButton-v2/ToggleButton.svelte';
|
|
13
|
+
import ToggleButtonGroup from '../common/toggleButton-v2/ToggleButtonGroup.svelte';
|
|
14
|
+
import { AlertTriangle } from 'lucide-svelte';
|
|
15
|
+
import Skeleton from '../common/skeleton/Skeleton.svelte';
|
|
16
|
+
let userSettings;
|
|
17
|
+
export let token;
|
|
18
|
+
export let scopes = [];
|
|
19
|
+
export let isFlow = false;
|
|
20
|
+
export let hash = undefined;
|
|
21
|
+
export let path;
|
|
22
|
+
let emailDomain = null;
|
|
23
|
+
let loading = true;
|
|
24
|
+
async function getEmailDomain() {
|
|
25
|
+
emailDomain =
|
|
26
|
+
(await SettingService.getGlobal({
|
|
27
|
+
key: 'email_domain'
|
|
28
|
+
})) ?? null;
|
|
29
|
+
loading = false;
|
|
30
|
+
}
|
|
31
|
+
getEmailDomain();
|
|
32
|
+
let requestType = 'path';
|
|
33
|
+
function emailAddress() {
|
|
34
|
+
const pathOrHash = requestType === 'hash' ? hash : path.replaceAll('/', '.');
|
|
35
|
+
const plainPrefix = `${$workspaceStore}+${(requestType === 'hash' ? 'hash.' : isFlow ? 'flow.' : '') + pathOrHash}+${token}`;
|
|
36
|
+
const encodedPrefix = base32
|
|
37
|
+
.stringify(new TextEncoder().encode(plainPrefix), {
|
|
38
|
+
pad: false
|
|
39
|
+
})
|
|
40
|
+
.toLowerCase();
|
|
41
|
+
return `${pathOrHash}+${encodedPrefix}@${emailDomain}`;
|
|
42
|
+
}
|
|
43
|
+
</script>
|
|
44
|
+
|
|
45
|
+
<HighlightTheme />
|
|
46
|
+
|
|
47
|
+
<UserSettings
|
|
48
|
+
bind:this={userSettings}
|
|
49
|
+
on:tokenCreated={(e) => {
|
|
50
|
+
token = e.detail
|
|
51
|
+
}}
|
|
52
|
+
newTokenLabel={`${$userStore?.username ?? 'superadmin'}-${generateRandomString(4)}`}
|
|
53
|
+
{scopes}
|
|
54
|
+
/>
|
|
55
|
+
|
|
56
|
+
<div class="p-2 flex flex-col w-full gap-4">
|
|
57
|
+
{#if loading}
|
|
58
|
+
<Skeleton layout={[[18]]} />
|
|
59
|
+
{:else}
|
|
60
|
+
{#if emailDomain}
|
|
61
|
+
{#if SCRIPT_VIEW_SHOW_CREATE_TOKEN_BUTTON}
|
|
62
|
+
<div class="my-2">
|
|
63
|
+
<div class="flex flex-row justify-between gap-2">
|
|
64
|
+
<input
|
|
65
|
+
bind:value={token}
|
|
66
|
+
placeholder="paste your token here once created to alter examples below"
|
|
67
|
+
class="!text-xs"
|
|
68
|
+
/>
|
|
69
|
+
<Button size="xs" color="light" variant="border" on:click={userSettings.openDrawer}>
|
|
70
|
+
Create an Email-specific Token
|
|
71
|
+
<Tooltip light>
|
|
72
|
+
The token will have a scope such that it can only be used to trigger this script. It
|
|
73
|
+
is safe to share as it cannot be used to impersonate you.
|
|
74
|
+
</Tooltip>
|
|
75
|
+
</Button>
|
|
76
|
+
</div>
|
|
77
|
+
{#if token === 'TOKEN_TO_CREATE'}
|
|
78
|
+
<div class="flex flex-row gap-1 text-xs text-red-500 items-center mt-1">
|
|
79
|
+
<AlertTriangle size="12" />
|
|
80
|
+
Create/input a valid token before copying the email address below
|
|
81
|
+
</div>
|
|
82
|
+
{/if}
|
|
83
|
+
</div>
|
|
84
|
+
{/if}
|
|
85
|
+
|
|
86
|
+
{#if !isFlow}
|
|
87
|
+
<div class="flex flex-col gap-2">
|
|
88
|
+
<div class="flex flex-row justify-between">
|
|
89
|
+
<div class="text-xs font-semibold flex flex-row items-center">Call method</div>
|
|
90
|
+
<ToggleButtonGroup class="h-[30px] w-auto" bind:selected={requestType}>
|
|
91
|
+
<ToggleButton label="By path" value="path" />
|
|
92
|
+
<ToggleButton label="By hash" value="hash" />
|
|
93
|
+
</ToggleButtonGroup>
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
{/if}
|
|
97
|
+
<div class="flex flex-col gap-4">
|
|
98
|
+
{#key requestType}
|
|
99
|
+
{#key token}
|
|
100
|
+
<div class="flex flex-col gap-2">
|
|
101
|
+
<ClipboardPanel title="Email address" content={emailAddress()} />
|
|
102
|
+
</div>
|
|
103
|
+
{/key}
|
|
104
|
+
{/key}
|
|
105
|
+
<Alert title="Email trigger" size="xs">
|
|
106
|
+
To trigger the job by email, send an email to the address above. The job will receive two
|
|
107
|
+
arguments: `raw_email` containing the raw email as string, and `parsed_email` containing
|
|
108
|
+
the parsed email as an object.
|
|
109
|
+
</Alert>
|
|
110
|
+
</div>
|
|
111
|
+
{:else}
|
|
112
|
+
<div>
|
|
113
|
+
<Alert title="Email triggers are disabled" size="xs" type="warning">
|
|
114
|
+
Ask an instance superadmin to setup the instance for email triggering (<a
|
|
115
|
+
target="_blank"
|
|
116
|
+
href="https://windmill.dev/docs/advanced/email_triggers">docs</a
|
|
117
|
+
>) and to set the email domain in the instance settings.
|
|
118
|
+
</Alert>
|
|
119
|
+
</div>
|
|
120
|
+
{/if}
|
|
121
|
+
|
|
122
|
+
{#if !$enterpriseLicense}
|
|
123
|
+
<Alert title="Community Edition limitations" type="warning" size="xs">
|
|
124
|
+
Email triggers on Windmill Community Edition are limited to 100 emails per day.
|
|
125
|
+
</Alert>
|
|
126
|
+
{/if}
|
|
127
|
+
{/if}
|
|
128
|
+
</div>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { SvelteComponent } from "svelte";
|
|
2
|
+
declare const __propDef: {
|
|
3
|
+
props: {
|
|
4
|
+
token: string;
|
|
5
|
+
scopes?: string[] | undefined;
|
|
6
|
+
isFlow?: boolean | undefined;
|
|
7
|
+
hash?: string | undefined;
|
|
8
|
+
path: string;
|
|
9
|
+
};
|
|
10
|
+
events: {
|
|
11
|
+
[evt: string]: CustomEvent<any>;
|
|
12
|
+
};
|
|
13
|
+
slots: {};
|
|
14
|
+
};
|
|
15
|
+
export type EmailTriggerPanelProps = typeof __propDef.props;
|
|
16
|
+
export type EmailTriggerPanelEvents = typeof __propDef.events;
|
|
17
|
+
export type EmailTriggerPanelSlots = typeof __propDef.slots;
|
|
18
|
+
export default class EmailTriggerPanel extends SvelteComponent<EmailTriggerPanelProps, EmailTriggerPanelEvents, EmailTriggerPanelSlots> {
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
@@ -13,10 +13,7 @@ import { typescript } from 'svelte-highlight/languages';
|
|
|
13
13
|
import ClipboardPanel from './ClipboardPanel.svelte';
|
|
14
14
|
import { copyToClipboard, generateRandomString } from '../../utils';
|
|
15
15
|
import HighlightTheme from '../HighlightTheme.svelte';
|
|
16
|
-
import Alert from '../common/alert/Alert.svelte';
|
|
17
|
-
import { SettingService } from '../../gen';
|
|
18
16
|
import { base } from '../../base';
|
|
19
|
-
import { base32 } from 'rfc4648';
|
|
20
17
|
let userSettings;
|
|
21
18
|
export let token;
|
|
22
19
|
export let args;
|
|
@@ -26,14 +23,6 @@ export let hash = undefined;
|
|
|
26
23
|
export let path;
|
|
27
24
|
let selectedTab = 'rest';
|
|
28
25
|
let webhooks;
|
|
29
|
-
let emailDomain = null;
|
|
30
|
-
async function getEmailDomain() {
|
|
31
|
-
emailDomain =
|
|
32
|
-
(await SettingService.getGlobal({
|
|
33
|
-
key: 'email_domain'
|
|
34
|
-
})) ?? null;
|
|
35
|
-
}
|
|
36
|
-
getEmailDomain();
|
|
37
26
|
$: webhooks = isFlow ? computeFlowWebhooks(path) : computeScriptWebhooks(hash, path);
|
|
38
27
|
function computeScriptWebhooks(hash, path) {
|
|
39
28
|
let webhookBase = `${$page.url.origin}${base}/api/w/${$workspaceStore}/jobs`;
|
|
@@ -70,9 +59,6 @@ $: if (webhookType === 'async' && requestType === 'get_path') {
|
|
|
70
59
|
// Request type is not supported for async webhooks
|
|
71
60
|
requestType = 'hash';
|
|
72
61
|
}
|
|
73
|
-
$: if (webhookType === 'sync' && selectedTab === 'email') {
|
|
74
|
-
webhookType = 'async';
|
|
75
|
-
}
|
|
76
62
|
$: url =
|
|
77
63
|
webhooks[webhookType][requestType] +
|
|
78
64
|
(tokenType === 'query'
|
|
@@ -92,16 +78,6 @@ function headers() {
|
|
|
92
78
|
}
|
|
93
79
|
return headers;
|
|
94
80
|
}
|
|
95
|
-
function emailAddress() {
|
|
96
|
-
const pathOrHash = requestType === 'hash' ? hash : path.replaceAll('/', '.');
|
|
97
|
-
const plainPrefix = `${$workspaceStore}+${(requestType === 'hash' ? 'hash.' : isFlow ? 'flow.' : '') + pathOrHash}+${token}`;
|
|
98
|
-
const encodedPrefix = base32
|
|
99
|
-
.stringify(new TextEncoder().encode(plainPrefix), {
|
|
100
|
-
pad: false
|
|
101
|
-
})
|
|
102
|
-
.toLowerCase();
|
|
103
|
-
return `${pathOrHash}+${encodedPrefix}@${emailDomain}`;
|
|
104
|
-
}
|
|
105
81
|
function fetchCode() {
|
|
106
82
|
if (webhookType === 'sync') {
|
|
107
83
|
return `
|
|
@@ -238,7 +214,6 @@ done`}`;
|
|
|
238
214
|
label="Sync"
|
|
239
215
|
value="sync"
|
|
240
216
|
tooltip="Triggers the execution, wait for the job to complete and return it as a response."
|
|
241
|
-
disabled={selectedTab === 'email'}
|
|
242
217
|
/>
|
|
243
218
|
</ToggleButtonGroup>
|
|
244
219
|
</div>
|
|
@@ -269,15 +244,13 @@ done`}`;
|
|
|
269
244
|
/>
|
|
270
245
|
</ToggleButtonGroup>
|
|
271
246
|
</div>
|
|
272
|
-
|
|
273
|
-
<div class="flex flex-row
|
|
274
|
-
|
|
275
|
-
<
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
</div>
|
|
280
|
-
{/if}
|
|
247
|
+
<div class="flex flex-row justify-between">
|
|
248
|
+
<div class="text-xs font-semibold flex flex-row items-center">Token configuration</div>
|
|
249
|
+
<ToggleButtonGroup class="h-[30px] w-auto" bind:selected={tokenType}>
|
|
250
|
+
<ToggleButton label="Token in Headers" value="headers" />
|
|
251
|
+
<ToggleButton label="Token in Query" value="query" />
|
|
252
|
+
</ToggleButtonGroup>
|
|
253
|
+
</div>
|
|
281
254
|
</div>
|
|
282
255
|
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
|
283
256
|
<!-- svelte-ignore a11y-no-static-element-interactions -->
|
|
@@ -287,7 +260,6 @@ done`}`;
|
|
|
287
260
|
<Tab value="curl" size="xs">Curl</Tab>
|
|
288
261
|
{/if}
|
|
289
262
|
<Tab value="fetch" size="xs">Fetch</Tab>
|
|
290
|
-
<Tab value="email" size="xs">Email</Tab>
|
|
291
263
|
|
|
292
264
|
<svelte:fragment slot="content">
|
|
293
265
|
{#key token}
|
|
@@ -346,39 +318,6 @@ done`}`;
|
|
|
346
318
|
{/key}{/key}{/key}{/key}
|
|
347
319
|
{/key}
|
|
348
320
|
</TabContent>
|
|
349
|
-
<TabContent value="email">
|
|
350
|
-
{#if emailDomain}
|
|
351
|
-
<div class="flex flex-col gap-4">
|
|
352
|
-
{#key args}
|
|
353
|
-
{#key requestType}
|
|
354
|
-
{#key webhookType}
|
|
355
|
-
{#key tokenType}
|
|
356
|
-
{#key token}
|
|
357
|
-
<div class="flex flex-col gap-2">
|
|
358
|
-
<ClipboardPanel title="Email address" content={emailAddress()} />
|
|
359
|
-
</div>
|
|
360
|
-
{/key}
|
|
361
|
-
{/key}
|
|
362
|
-
{/key}
|
|
363
|
-
{/key}
|
|
364
|
-
{/key}
|
|
365
|
-
<Alert title="Email triggers" size="xs">
|
|
366
|
-
To trigger the job by email, send an email to the address above. The job will
|
|
367
|
-
receive two arguments: `raw_email` containing the raw email as string, and
|
|
368
|
-
`parsed_email` containing the parsed email as an object.
|
|
369
|
-
</Alert>
|
|
370
|
-
</div>
|
|
371
|
-
{:else}
|
|
372
|
-
<div>
|
|
373
|
-
<Alert title="Email triggers are disabled" size="xs" kind="danger">
|
|
374
|
-
Ask an instance superadmin to setup the instance for email triggering (<a
|
|
375
|
-
target="_blank"
|
|
376
|
-
href="https://windmill.dev/docs/advanced/email_triggers">docs</a
|
|
377
|
-
>) and to set the email domain in the instance settings.
|
|
378
|
-
</Alert>
|
|
379
|
-
</div>
|
|
380
|
-
{/if}
|
|
381
|
-
</TabContent>
|
|
382
321
|
{/key}
|
|
383
322
|
</svelte:fragment>
|
|
384
323
|
</Tabs>
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
<script>import
|
|
1
|
+
<script>import DiffEditor from '../../DiffEditor.svelte';
|
|
2
|
+
import HighlightCode from '../../HighlightCode.svelte';
|
|
2
3
|
import TimeAgo from '../../TimeAgo.svelte';
|
|
3
4
|
import { ScriptService } from '../../../gen';
|
|
4
|
-
import { getScriptByPath } from '../../../scripts';
|
|
5
|
+
import { getScriptByPath, scriptLangToEditorLang } from '../../../scripts';
|
|
5
6
|
import { workspaceStore } from '../../../stores';
|
|
6
7
|
export let path;
|
|
7
8
|
export let hash = undefined;
|
|
9
|
+
export let previousHash = undefined;
|
|
8
10
|
export let showDate = false;
|
|
9
11
|
export let showAllCode = true;
|
|
10
12
|
let code;
|
|
13
|
+
let previousCode;
|
|
11
14
|
let language;
|
|
12
15
|
let lock = undefined;
|
|
13
16
|
let date = undefined;
|
|
@@ -28,10 +31,24 @@ async function loadCode(path, hash) {
|
|
|
28
31
|
console.error(e);
|
|
29
32
|
}
|
|
30
33
|
}
|
|
34
|
+
async function loadPreviousCode(previousHash) {
|
|
35
|
+
try {
|
|
36
|
+
const previousScript = await ScriptService.getScriptByHash({
|
|
37
|
+
workspace: $workspaceStore,
|
|
38
|
+
hash: previousHash
|
|
39
|
+
});
|
|
40
|
+
previousCode = previousScript.content;
|
|
41
|
+
}
|
|
42
|
+
catch (e) {
|
|
43
|
+
console.error(e);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
31
46
|
$: path && loadCode(path, hash);
|
|
47
|
+
$: path && previousHash && loadPreviousCode(previousHash);
|
|
32
48
|
function toggleShowAll() {
|
|
33
49
|
showAllCode = !showAllCode;
|
|
34
50
|
}
|
|
51
|
+
export let showDiff = false;
|
|
35
52
|
</script>
|
|
36
53
|
|
|
37
54
|
<div class="flex flex-col flex-1 h-full overflow-auto p-2">
|
|
@@ -41,7 +58,20 @@ function toggleShowAll() {
|
|
|
41
58
|
{#if notFound}
|
|
42
59
|
<div class="text-red-400">script not found at {path} in workspace {$workspaceStore}</div>
|
|
43
60
|
{:else if showAllCode}
|
|
44
|
-
|
|
61
|
+
{#if showDiff}
|
|
62
|
+
{#key previousCode + code}
|
|
63
|
+
<DiffEditor
|
|
64
|
+
class="h-screen"
|
|
65
|
+
readOnly
|
|
66
|
+
automaticLayout
|
|
67
|
+
defaultLang={scriptLangToEditorLang(language)}
|
|
68
|
+
defaultOriginal={previousCode}
|
|
69
|
+
defaultModified={code}
|
|
70
|
+
/>
|
|
71
|
+
{/key}
|
|
72
|
+
{:else}
|
|
73
|
+
<HighlightCode {language} {code} />
|
|
74
|
+
{/if}
|
|
45
75
|
{:else}
|
|
46
76
|
<div class="code-container h-full">
|
|
47
77
|
<HighlightCode {language} code={code?.split('\n').slice(0, 10).join('\n')} />
|
|
@@ -3,8 +3,10 @@ declare const __propDef: {
|
|
|
3
3
|
props: {
|
|
4
4
|
path: string;
|
|
5
5
|
hash?: string | undefined;
|
|
6
|
+
previousHash?: string | undefined;
|
|
6
7
|
showDate?: boolean | undefined;
|
|
7
8
|
showAllCode?: boolean | undefined;
|
|
9
|
+
showDiff?: boolean | undefined;
|
|
8
10
|
};
|
|
9
11
|
events: {
|
|
10
12
|
[evt: string]: CustomEvent<any>;
|
|
@@ -106,6 +106,21 @@ let jsonView = false;
|
|
|
106
106
|
<SecondsInput disabled />
|
|
107
107
|
{/if}
|
|
108
108
|
</Label>
|
|
109
|
+
|
|
110
|
+
<Toggle
|
|
111
|
+
options={{
|
|
112
|
+
right: 'Continue on disapproval/timeout',
|
|
113
|
+
rightTooltip:
|
|
114
|
+
'Instead of failing the flow and bubbling up the error, continue to the next step which would allow to put a branchone right after to handle both cases separately. If any disapproval/timeout event is received, the resume payload will be similar to every error result in Winmdill, an object containing an `error` field which you can use to distinguish between approvals and disapproval/timeouts'
|
|
115
|
+
}}
|
|
116
|
+
checked={Boolean(flowModule.suspend?.continue_on_disapprove_timeout)}
|
|
117
|
+
disabled={!Boolean(flowModule.suspend)}
|
|
118
|
+
on:change={(e) => {
|
|
119
|
+
if (flowModule.suspend) {
|
|
120
|
+
flowModule.suspend.continue_on_disapprove_timeout = e.detail
|
|
121
|
+
}
|
|
122
|
+
}}
|
|
123
|
+
/>
|
|
109
124
|
</div>
|
|
110
125
|
{:else if suspendTabSelected === 'permissions'}
|
|
111
126
|
<div class="flex flex-col mt-4 gap-4">
|
|
@@ -26,7 +26,7 @@ export async function loadSchemaFromModule(module) {
|
|
|
26
26
|
if (JSON.stringify(keys.sort()) !== JSON.stringify(Object.keys(input_transforms).sort())) {
|
|
27
27
|
input_transforms = keys.reduce((accu, key) => {
|
|
28
28
|
let nv = input_transforms[key] ??
|
|
29
|
-
(module.id == 'failure' && ['message', 'name'].includes(key)
|
|
29
|
+
(module.id == 'failure' && ['message', 'name', 'step_id'].includes(key)
|
|
30
30
|
? { type: 'javascript', expr: `error.${key}` }
|
|
31
31
|
: {
|
|
32
32
|
type: 'static',
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
<script>import
|
|
1
|
+
<script>import Menu from '../../common/menu/MenuV2.svelte';
|
|
2
2
|
import { createEventDispatcher } from 'svelte';
|
|
3
3
|
import { ListFilter } from 'lucide-svelte';
|
|
4
|
+
import { MenuItem } from '@rgossiaux/svelte-headlessui';
|
|
4
5
|
const dispatch = createEventDispatcher();
|
|
5
6
|
export let open = undefined;
|
|
6
7
|
export let index;
|
|
@@ -20,50 +21,44 @@ function onKeydown(event) {
|
|
|
20
21
|
}
|
|
21
22
|
</script>
|
|
22
23
|
|
|
23
|
-
<Menu
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
>
|
|
31
|
-
<button
|
|
32
|
-
title="Pick an iteration"
|
|
33
|
-
slot="trigger"
|
|
34
|
-
id={`flow-editor-iteration picker-${index}`}
|
|
35
|
-
type="button"
|
|
36
|
-
class=" text-xs bg-surface border-[1px] border-gray-300 dark:border-gray-500 focus:outline-none
|
|
24
|
+
<Menu>
|
|
25
|
+
<div slot="trigger">
|
|
26
|
+
<button
|
|
27
|
+
title="Pick an iteration"
|
|
28
|
+
id={`flow-editor-iteration picker-${index}`}
|
|
29
|
+
type="button"
|
|
30
|
+
class=" text-xs bg-surface border-[1px] border-gray-300 dark:border-gray-500 focus:outline-none
|
|
37
31
|
hover:bg-surface-hover focus:ring-4 focus:ring-surface-selected font-medium rounded-sm w-[40px] gap-1 h-[20px]
|
|
38
32
|
flex items-center justify-center {flowJobsSuccess?.[selected] == false
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
<div id="flow-editor-insert-module">
|
|
46
|
-
<div class="font-mono divide-y text-xs w-full text-secondary max-h-[200px] overflow-auto">
|
|
47
|
-
<input autofocus type="number" bind:value={filter} on:keydown={onKeydown} />
|
|
48
|
-
{#each flowJobs ?? [] as id, idx (id)}
|
|
49
|
-
{#if filter == undefined || (idx + 1).toString().includes(filter.toString())}
|
|
50
|
-
<button
|
|
51
|
-
class="w-full text-left py-1 pl-2 min-w-20 hover:bg-surface-hover whitespace-nowrap flex flex-row gap-2 items-center {flowJobsSuccess?.[
|
|
52
|
-
idx
|
|
53
|
-
] == false
|
|
54
|
-
? 'text-red-400'
|
|
55
|
-
: ''}"
|
|
56
|
-
on:pointerdown={() => {
|
|
57
|
-
close()
|
|
58
|
-
dispatch('selectedIteration', { index: idx, id })
|
|
59
|
-
}}
|
|
60
|
-
role="menuitem"
|
|
61
|
-
tabindex="-1"
|
|
62
|
-
>
|
|
63
|
-
#{idx + 1}
|
|
64
|
-
</button>
|
|
65
|
-
{/if}
|
|
66
|
-
{/each}
|
|
67
|
-
</div>
|
|
33
|
+
? 'text-red-400'
|
|
34
|
+
: 'text-secondary'}"
|
|
35
|
+
>
|
|
36
|
+
#{selected == -1 ? '?' : selected + 1}
|
|
37
|
+
<ListFilter size={15} />
|
|
38
|
+
</button>
|
|
68
39
|
</div>
|
|
40
|
+
<MenuItem disabled>
|
|
41
|
+
<input type="number" bind:value={filter} on:keydown={onKeydown} />
|
|
42
|
+
</MenuItem>
|
|
43
|
+
{#each flowJobs ?? [] as id, idx (id)}
|
|
44
|
+
{#if filter == undefined || (idx + 1).toString().includes(filter.toString())}
|
|
45
|
+
<MenuItem>
|
|
46
|
+
<button
|
|
47
|
+
class="text-primary text-xs w-full text-left py-1 pl-2 hover:bg-surface-hover whitespace-nowrap flex flex-row gap-2 items-center {flowJobsSuccess?.[
|
|
48
|
+
idx
|
|
49
|
+
] == false
|
|
50
|
+
? 'text-red-400'
|
|
51
|
+
: ''}"
|
|
52
|
+
on:pointerdown={() => {
|
|
53
|
+
//close()
|
|
54
|
+
dispatch('selectedIteration', { index: idx, id })
|
|
55
|
+
}}
|
|
56
|
+
role="menuitem"
|
|
57
|
+
tabindex="-1"
|
|
58
|
+
>
|
|
59
|
+
#{idx + 1}
|
|
60
|
+
</button>
|
|
61
|
+
</MenuItem>
|
|
62
|
+
{/if}
|
|
63
|
+
{/each}
|
|
69
64
|
</Menu>
|
|
@@ -126,9 +126,8 @@ const { currentStepStore: copilotCurrentStepStore } = getContext('FlowCopilotCon
|
|
|
126
126
|
>
|
|
127
127
|
{#if $$slots.icon}
|
|
128
128
|
<slot name="icon" />
|
|
129
|
-
<span class="mr-2" />
|
|
130
129
|
{/if}
|
|
131
|
-
<div class="
|
|
130
|
+
<div class="truncate" class:font-bold={bold}>{label}</div>
|
|
132
131
|
<div class="flex items-center space-x-2">
|
|
133
132
|
{#if id}
|
|
134
133
|
<Badge color="indigo">{id}</Badge>
|
|
@@ -4,7 +4,6 @@ import { emptyFlowModuleState, initFlowStepWarnings } from '../utils';
|
|
|
4
4
|
import FlowSettingsItem from './FlowSettingsItem.svelte';
|
|
5
5
|
import FlowConstantsItem from './FlowConstantsItem.svelte';
|
|
6
6
|
import { dfs } from '../dfs';
|
|
7
|
-
import { FlowGraph } from '../../graph';
|
|
8
7
|
import FlowErrorHandlerItem from './FlowErrorHandlerItem.svelte';
|
|
9
8
|
import { push } from '../../../history';
|
|
10
9
|
import ConfirmationModal from '../../common/confirmationModal/ConfirmationModal.svelte';
|
|
@@ -15,6 +14,7 @@ import { copilotInfo, tutorialsToDo } from '../../../stores';
|
|
|
15
14
|
import FlowTutorials from '../../FlowTutorials.svelte';
|
|
16
15
|
import { ignoredTutorials } from '../../tutorials/ignoredTutorials';
|
|
17
16
|
import { tutorialInProgress } from '../../../tutorialUtils';
|
|
17
|
+
import FlowGraphV2 from '../../graph/FlowGraphV2.svelte';
|
|
18
18
|
export let modules;
|
|
19
19
|
export let sidebarSize = undefined;
|
|
20
20
|
export let disableStaticInputs = false;
|
|
@@ -203,13 +203,12 @@ async function updateFlowInputsStore() {
|
|
|
203
203
|
</div>
|
|
204
204
|
|
|
205
205
|
<div class="z-10 flex-auto grow" bind:clientHeight={minHeight}>
|
|
206
|
-
<
|
|
206
|
+
<FlowGraphV2
|
|
207
207
|
{disableAi}
|
|
208
208
|
insertable
|
|
209
209
|
scroll
|
|
210
210
|
{minHeight}
|
|
211
211
|
moving={$moving?.module.id}
|
|
212
|
-
rebuildOnChange={$flowStore}
|
|
213
212
|
maxHeight={minHeight}
|
|
214
213
|
modules={$flowStore.value?.modules}
|
|
215
214
|
{selectedId}
|
|
@@ -219,7 +218,9 @@ async function updateFlowInputsStore() {
|
|
|
219
218
|
dependents = getDependentComponents(e.id, $flowStore)
|
|
220
219
|
const cb = () => {
|
|
221
220
|
push(history, $flowStore)
|
|
221
|
+
|
|
222
222
|
selectNextId(e.id)
|
|
223
|
+
|
|
223
224
|
removeAtId($flowStore.value.modules, e.id)
|
|
224
225
|
|
|
225
226
|
if ($flowInputsStore) {
|
|
@@ -3,6 +3,7 @@ import { createEventDispatcher, getContext } from 'svelte';
|
|
|
3
3
|
import { CheckCircle2, Code, Cross, GitBranch, Repeat, Square, Zap } from 'lucide-svelte';
|
|
4
4
|
import StepGen from '../../copilot/StepGen.svelte';
|
|
5
5
|
import BarsStaggered from '../../icons/BarsStaggered.svelte';
|
|
6
|
+
import { twMerge } from 'tailwind-merge';
|
|
6
7
|
const dispatch = createEventDispatcher();
|
|
7
8
|
export let trigger = false;
|
|
8
9
|
export let stop = false;
|
|
@@ -23,15 +24,21 @@ let customUi = getContext('customUi');
|
|
|
23
24
|
placement="bottom-center"
|
|
24
25
|
let:close
|
|
25
26
|
>
|
|
26
|
-
<
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
27
|
+
<svelte:fragment slot="trigger">
|
|
28
|
+
<button
|
|
29
|
+
title="Add step"
|
|
30
|
+
id={`flow-editor-add-step-${index}`}
|
|
31
|
+
type="button"
|
|
32
|
+
class={twMerge(
|
|
33
|
+
'w-6 h-6 flex items-center justify-center',
|
|
34
|
+
'border border-gray-300 dark:border-gray-500',
|
|
35
|
+
'text-primary text-sm',
|
|
36
|
+
'bg-surface focus:outline-none hover:bg-surface-hover focus:ring-4 focus:ring-surface-selected rounded-full '
|
|
37
|
+
)}
|
|
38
|
+
>
|
|
39
|
+
<Cross size={14} />
|
|
40
|
+
</button>
|
|
41
|
+
</svelte:fragment>
|
|
35
42
|
<div id="flow-editor-insert-module">
|
|
36
43
|
<StepGen on:insert {index} bind:funcDesc bind:open {close} {modules} {disableAi} />
|
|
37
44
|
|