windmill-components 1.13.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/LICENSE +661 -0
- package/common.d.ts +29 -0
- package/components/ArgInfo.svelte +48 -0
- package/components/ArgInput.svelte +277 -0
- package/components/AutosizedTextarea.svelte +34 -0
- package/components/Badge.svelte +12 -0
- package/components/Button.svelte +82 -0
- package/components/ButtonAndDropdown.svelte +25 -0
- package/components/CenteredPage.svelte +5 -0
- package/components/ChevronButton.svelte +21 -0
- package/components/DisplayResult.svelte +101 -0
- package/components/Dropdown.svelte +108 -0
- package/components/Editor.svelte +370 -0
- package/components/FieldHeader.svelte +21 -0
- package/components/FlowBuilder.svelte +202 -0
- package/components/FlowEditor.svelte +95 -0
- package/components/FlowPreview.svelte +141 -0
- package/components/FlowStatusViewer.svelte +137 -0
- package/components/GroupModal.svelte +90 -0
- package/components/IconedResourceType.svelte +32 -0
- package/components/InviteGlobalUser.svelte +56 -0
- package/components/InviteUser.svelte +48 -0
- package/components/ItemPicker.svelte +58 -0
- package/components/JobStatus.svelte +38 -0
- package/components/Modal.svelte +94 -0
- package/components/ModuleStep.svelte +64 -0
- package/components/Multiselect.svelte +327 -0
- package/components/ObjectResourceInput.svelte +62 -0
- package/components/ObjectTypeNarrowing.svelte +25 -0
- package/components/PageHeader.svelte +29 -0
- package/components/Password.svelte +45 -0
- package/components/Path.svelte +129 -0
- package/components/RadioButton.svelte +117 -0
- package/components/Required.svelte +11 -0
- package/components/ResourceEditor.svelte +260 -0
- package/components/ResourcePicker.svelte +21 -0
- package/components/ResourceTypePicker.svelte +71 -0
- package/components/RunForm.svelte +127 -0
- package/components/SchemaEditor.svelte +221 -0
- package/components/SchemaForm.svelte +166 -0
- package/components/SchemaModal.svelte +160 -0
- package/components/SchemaViewer.svelte +76 -0
- package/components/ScriptBuilder.svelte +293 -0
- package/components/ScriptEditor.svelte +669 -0
- package/components/ScriptPicker.svelte +110 -0
- package/components/ScriptSchema.svelte +71 -0
- package/components/ShareModal.svelte +135 -0
- package/components/SharedBadge.svelte +54 -0
- package/components/StringTypeNarrowing.svelte +101 -0
- package/components/Switch.svelte +61 -0
- package/components/TableCustom.svelte +39 -0
- package/components/TableSimple.svelte +66 -0
- package/components/Tabs.svelte +21 -0
- package/components/Tooltip.svelte +93 -0
- package/components/VariableEditor.svelte +159 -0
- package/components/icons/DbIcon.svelte +12 -0
- package/components/icons/Mail.svelte +62 -0
- package/components/icons/Mysql.svelte +77 -0
- package/components/icons/PostgresIcon.svelte +57 -0
- package/components/icons/Slack.svelte +26 -0
- package/gen/core/ApiError.d.ts +8 -0
- package/gen/core/ApiRequestOptions.d.ts +13 -0
- package/gen/core/ApiResult.d.ts +7 -0
- package/gen/core/CancelablePromise.d.ts +26 -0
- package/gen/core/OpenAPI.d.ts +16 -0
- package/gen/core/request.d.ts +13 -0
- package/gen/index.d.ts +59 -0
- package/gen/models/AuditLog.d.ts +32 -0
- package/gen/models/CompletedJob.d.ts +48 -0
- package/gen/models/ContextualVariable.d.ts +5 -0
- package/gen/models/CreateResource.d.ts +6 -0
- package/gen/models/CreateVariable.d.ts +6 -0
- package/gen/models/CreateWorkspace.d.ts +6 -0
- package/gen/models/EditResource.d.ts +5 -0
- package/gen/models/EditResourceType.d.ts +4 -0
- package/gen/models/EditSchedule.d.ts +7 -0
- package/gen/models/EditVariable.d.ts +6 -0
- package/gen/models/EditWorkspaceUser.d.ts +3 -0
- package/gen/models/Flow.d.ts +13 -0
- package/gen/models/FlowModule.d.ts +6 -0
- package/gen/models/FlowModuleValue.d.ts +10 -0
- package/gen/models/FlowPreview.d.ts +7 -0
- package/gen/models/FlowStatus.d.ts +6 -0
- package/gen/models/FlowStatusModule.d.ts +15 -0
- package/gen/models/FlowValue.d.ts +5 -0
- package/gen/models/GlobalUserInfo.d.ts +14 -0
- package/gen/models/Group.d.ts +6 -0
- package/gen/models/InputTransform.d.ts +12 -0
- package/gen/models/Job.d.ts +11 -0
- package/gen/models/ListableVariable.d.ts +8 -0
- package/gen/models/Login.d.ts +4 -0
- package/gen/models/MainArgSignature.d.ts +14 -0
- package/gen/models/NewSchedule.d.ts +9 -0
- package/gen/models/NewToken.d.ts +4 -0
- package/gen/models/NewUser.d.ts +5 -0
- package/gen/models/Preview.d.ts +13 -0
- package/gen/models/QueuedJob.d.ts +47 -0
- package/gen/models/Resource.d.ts +8 -0
- package/gen/models/ResourceType.d.ts +6 -0
- package/gen/models/Schedule.d.ts +13 -0
- package/gen/models/Script.d.ts +29 -0
- package/gen/models/ScriptArgs.d.ts +1 -0
- package/gen/models/TruncatedToken.d.ts +7 -0
- package/gen/models/User.d.ts +10 -0
- package/gen/models/UserWorkspaceList.d.ts +8 -0
- package/gen/models/WorkerPing.d.ts +8 -0
- package/gen/models/Workspace.d.ts +6 -0
- package/gen/models/WorkspaceInvite.d.ts +5 -0
- package/gen/services/AdminService.d.ts +35 -0
- package/gen/services/AuditService.d.ts +37 -0
- package/gen/services/FlowService.d.ts +82 -0
- package/gen/services/GranularAclService.d.ts +42 -0
- package/gen/services/GroupService.d.ts +94 -0
- package/gen/services/JobService.d.ts +217 -0
- package/gen/services/ResourceService.d.ts +116 -0
- package/gen/services/ScheduleService.d.ts +73 -0
- package/gen/services/ScriptService.d.ts +165 -0
- package/gen/services/SettingsService.d.ts +15 -0
- package/gen/services/UserService.d.ts +211 -0
- package/gen/services/VariableService.d.ts +66 -0
- package/gen/services/WorkerService.d.ts +15 -0
- package/gen/services/WorkspaceService.d.ts +137 -0
- package/infer.d.ts +2 -0
- package/lib/components/ArgInfo.svelte.d.ts +16 -0
- package/lib/components/ArgInput.svelte.d.ts +37 -0
- package/lib/components/AutosizedTextarea.svelte.d.ts +19 -0
- package/lib/components/Badge.svelte.d.ts +20 -0
- package/lib/components/Button.svelte.d.ts +23 -0
- package/lib/components/ButtonAndDropdown.svelte.d.ts +23 -0
- package/lib/components/CenteredPage.svelte.d.ts +23 -0
- package/lib/components/ChevronButton.svelte.d.ts +19 -0
- package/lib/components/DisplayResult.svelte.d.ts +16 -0
- package/lib/components/Dropdown.svelte.d.ts +22 -0
- package/lib/components/Editor.svelte.d.ts +38 -0
- package/lib/components/FieldHeader.svelte.d.ts +23 -0
- package/lib/components/FlowBuilder.svelte.d.ts +18 -0
- package/lib/components/FlowEditor.svelte.d.ts +19 -0
- package/lib/components/FlowPreview.svelte.d.ts +21 -0
- package/lib/components/FlowStatusViewer.svelte.d.ts +18 -0
- package/lib/components/GroupModal.svelte.d.ts +17 -0
- package/lib/components/IconedResourceType.svelte.d.ts +19 -0
- package/lib/components/InviteGlobalUser.svelte.d.ts +19 -0
- package/lib/components/InviteUser.svelte.d.ts +19 -0
- package/lib/components/ItemPicker.svelte.d.ts +24 -0
- package/lib/components/JobStatus.svelte.d.ts +17 -0
- package/lib/components/Modal.svelte.d.ts +28 -0
- package/lib/components/ModuleStep.svelte.d.ts +26 -0
- package/lib/components/Multiselect.svelte.d.ts +33 -0
- package/lib/components/ObjectResourceInput.svelte.d.ts +17 -0
- package/lib/components/ObjectTypeNarrowing.svelte.d.ts +16 -0
- package/lib/components/PageHeader.svelte.d.ts +20 -0
- package/lib/components/Password.svelte.d.ts +18 -0
- package/lib/components/Path.svelte.d.ts +26 -0
- package/lib/components/RadioButton.svelte.d.ts +21 -0
- package/lib/components/Required.svelte.d.ts +17 -0
- package/lib/components/ResourceEditor.svelte.d.ts +22 -0
- package/lib/components/ResourcePicker.svelte.d.ts +17 -0
- package/lib/components/ResourceTypePicker.svelte.d.ts +19 -0
- package/lib/components/RunForm.svelte.d.ts +22 -0
- package/lib/components/SchemaEditor.svelte.d.ts +22 -0
- package/lib/components/SchemaForm.svelte.d.ts +23 -0
- package/lib/components/SchemaModal.svelte.d.ts +44 -0
- package/lib/components/SchemaViewer.svelte.d.ts +17 -0
- package/lib/components/ScriptBuilder.svelte.d.ts +20 -0
- package/lib/components/ScriptEditor.svelte.d.ts +28 -0
- package/lib/components/ScriptPicker.svelte.d.ts +21 -0
- package/lib/components/ScriptSchema.svelte.d.ts +22 -0
- package/lib/components/ShareModal.svelte.d.ts +21 -0
- package/lib/components/SharedBadge.svelte.d.ts +17 -0
- package/lib/components/StringTypeNarrowing.svelte.d.ts +18 -0
- package/lib/components/Switch.svelte.d.ts +31 -0
- package/lib/components/TableCustom.svelte.d.ts +25 -0
- package/lib/components/TableSimple.svelte.d.ts +24 -0
- package/lib/components/Tabs.svelte.d.ts +20 -0
- package/lib/components/Tooltip.svelte.d.ts +20 -0
- package/lib/components/VariableEditor.svelte.d.ts +21 -0
- package/lib/components/icons/DbIcon.svelte.d.ts +17 -0
- package/lib/components/icons/Mail.svelte.d.ts +17 -0
- package/lib/components/icons/Mysql.svelte.d.ts +17 -0
- package/lib/components/icons/PostgresIcon.svelte.d.ts +17 -0
- package/lib/components/icons/Slack.svelte.d.ts +17 -0
- package/package.json +110 -0
- package/stores.d.ts +19 -0
- package/utils.d.ts +60 -0
package/common.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export declare type OwnerKind = 'group' | 'user';
|
|
2
|
+
export declare type ActionKind = 'Create' | 'Update' | 'Delete' | 'Execute';
|
|
3
|
+
export interface SchemaProperty {
|
|
4
|
+
type: string | undefined;
|
|
5
|
+
description: string;
|
|
6
|
+
pattern?: string;
|
|
7
|
+
default?: any;
|
|
8
|
+
enum?: string[];
|
|
9
|
+
contentEncoding?: 'base64' | 'binary';
|
|
10
|
+
format?: string;
|
|
11
|
+
items?: {
|
|
12
|
+
type?: 'string' | 'number' | 'bytes';
|
|
13
|
+
contentEncoding?: 'base64';
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export declare type Schema = {
|
|
17
|
+
$schema: string;
|
|
18
|
+
type: string;
|
|
19
|
+
properties: {
|
|
20
|
+
[name: string]: SchemaProperty;
|
|
21
|
+
};
|
|
22
|
+
required: string[];
|
|
23
|
+
};
|
|
24
|
+
export declare type Meta = {
|
|
25
|
+
ownerKind: OwnerKind;
|
|
26
|
+
owner: string;
|
|
27
|
+
name: string;
|
|
28
|
+
};
|
|
29
|
+
export declare function pathToMeta(path: string): Meta;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<script>import { truncate } from '../../utils';
|
|
2
|
+
import Modal from './Modal.svelte';
|
|
3
|
+
import Tooltip from './Tooltip.svelte';
|
|
4
|
+
import json from 'svelte-highlight/languages/json';
|
|
5
|
+
import github from 'svelte-highlight/styles/github';
|
|
6
|
+
import { Highlight } from 'svelte-highlight';
|
|
7
|
+
import { ResourceService } from '../../gen';
|
|
8
|
+
import { workspaceStore } from '../../stores';
|
|
9
|
+
export let value;
|
|
10
|
+
let resourceViewer;
|
|
11
|
+
let resource;
|
|
12
|
+
function isString(value) {
|
|
13
|
+
return typeof value === 'string' || value instanceof String;
|
|
14
|
+
}
|
|
15
|
+
async function getResource(path) {
|
|
16
|
+
resource = await ResourceService.getResource({ workspace: $workspaceStore, path });
|
|
17
|
+
}
|
|
18
|
+
let asJson = JSON.stringify(value, null, 4);
|
|
19
|
+
</script>
|
|
20
|
+
|
|
21
|
+
<svelte:head>
|
|
22
|
+
{@html github}
|
|
23
|
+
</svelte:head>
|
|
24
|
+
|
|
25
|
+
<Modal bind:this={resourceViewer}>
|
|
26
|
+
<div slot="title">{resource.path}</div>
|
|
27
|
+
<div slot="content">
|
|
28
|
+
<Highlight language={json} code={JSON.stringify(resource.value, null, 4)} />
|
|
29
|
+
</div>
|
|
30
|
+
</Modal>
|
|
31
|
+
|
|
32
|
+
{#if value == '<function call>'}
|
|
33
|
+
{'<function call>'}<Tooltip
|
|
34
|
+
>The arg was none and the default argument of the script is a function call, hence the actual
|
|
35
|
+
value used for this arg was the output of the script's function call for this arg</Tooltip
|
|
36
|
+
>
|
|
37
|
+
{:else if isString(value) && value.startsWith('$res:')}
|
|
38
|
+
<button
|
|
39
|
+
class="text-xs text-blue-500"
|
|
40
|
+
on:click={async () => {
|
|
41
|
+
await getResource(value.substring('$res:'.length))
|
|
42
|
+
resourceViewer.openModal()
|
|
43
|
+
}}>{value}</button
|
|
44
|
+
>{:else if asJson.length > 40}
|
|
45
|
+
{truncate(asJson, 40)}<Tooltip>{asJson}</Tooltip>
|
|
46
|
+
{:else}
|
|
47
|
+
{asJson}
|
|
48
|
+
{/if}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
<script>import Tooltip from './Tooltip.svelte';
|
|
2
|
+
import { slide } from 'svelte/transition';
|
|
3
|
+
import { faChevronDown, faChevronUp, faMinus, faPlus } from '@fortawesome/free-solid-svg-icons';
|
|
4
|
+
import StringTypeNarrowing from './StringTypeNarrowing.svelte';
|
|
5
|
+
import Icon from 'svelte-awesome';
|
|
6
|
+
import ResourcePicker from './ResourcePicker.svelte';
|
|
7
|
+
import ObjectTypeNarrowing from './ObjectTypeNarrowing.svelte';
|
|
8
|
+
import ObjectResourceInput from './ObjectResourceInput.svelte';
|
|
9
|
+
import FieldHeader from './FieldHeader.svelte';
|
|
10
|
+
export let label = '';
|
|
11
|
+
export let value;
|
|
12
|
+
export let defaultValue = undefined;
|
|
13
|
+
export let description = '';
|
|
14
|
+
export let format = '';
|
|
15
|
+
export let contentEncoding = '';
|
|
16
|
+
export let type = undefined;
|
|
17
|
+
export let required = false;
|
|
18
|
+
export let pattern;
|
|
19
|
+
export let valid = required ? false : true;
|
|
20
|
+
export let minRows = 1;
|
|
21
|
+
export let maxRows = 10;
|
|
22
|
+
export let enum_ = undefined;
|
|
23
|
+
export let disabled = false;
|
|
24
|
+
export let editableSchema = false;
|
|
25
|
+
export let itemsType = undefined;
|
|
26
|
+
export let displayHeader = true;
|
|
27
|
+
let seeEditable = enum_ != undefined || pattern != undefined;
|
|
28
|
+
$: minHeight = `${1 + minRows * 1.2}em`;
|
|
29
|
+
$: maxHeight = maxRows ? `${1 + maxRows * 1.2}em` : `auto`;
|
|
30
|
+
$: validateInput(pattern, value);
|
|
31
|
+
let error = '';
|
|
32
|
+
let rawValue;
|
|
33
|
+
$: {
|
|
34
|
+
if (rawValue) {
|
|
35
|
+
try {
|
|
36
|
+
value = JSON.parse(rawValue);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
error = err.toString();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
$: {
|
|
44
|
+
if (!type || type == 'object' || (type == 'array' && itemsType?.type == undefined)) {
|
|
45
|
+
evalValueToRaw();
|
|
46
|
+
}
|
|
47
|
+
if (defaultValue) {
|
|
48
|
+
let stringified = JSON.stringify(defaultValue, null, 4);
|
|
49
|
+
if (stringified.length > 50) {
|
|
50
|
+
minRows = 3;
|
|
51
|
+
}
|
|
52
|
+
if (type != 'string') {
|
|
53
|
+
minRows = Math.max(minRows, Math.min(stringified.split(/\r\n|\r|\n/).length + 1, maxRows));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export function evalValueToRaw() {
|
|
58
|
+
rawValue = JSON.stringify(value, null, 4);
|
|
59
|
+
}
|
|
60
|
+
function fileChanged(e, cb) {
|
|
61
|
+
let t = e.target;
|
|
62
|
+
if (t && 'files' in t && t.files.length > 0) {
|
|
63
|
+
let reader = new FileReader();
|
|
64
|
+
reader.onload = (e) => {
|
|
65
|
+
cb(e.target.result.split('base64,')[1]);
|
|
66
|
+
};
|
|
67
|
+
reader.readAsDataURL(t.files[0]);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
cb(undefined);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function validateInput(pattern, v) {
|
|
74
|
+
if (required && v == undefined) {
|
|
75
|
+
error = 'This field is required';
|
|
76
|
+
valid = false;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
if (pattern && !testRegex(pattern, v)) {
|
|
80
|
+
error = `Should match ${pattern}`;
|
|
81
|
+
valid = false;
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
error = '';
|
|
85
|
+
valid = true;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function testRegex(pattern, value) {
|
|
90
|
+
try {
|
|
91
|
+
const regex = new RegExp(pattern);
|
|
92
|
+
return regex.test(value);
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
$: {
|
|
99
|
+
if (value == undefined) {
|
|
100
|
+
value = defaultValue;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
</script>
|
|
104
|
+
|
|
105
|
+
<div class="flex flex-col w-full">
|
|
106
|
+
<div>
|
|
107
|
+
{#if displayHeader}
|
|
108
|
+
<FieldHeader {label} {required} {type} {contentEncoding} {format} {itemsType} />
|
|
109
|
+
{/if}
|
|
110
|
+
{#if editableSchema}
|
|
111
|
+
<div class="my-1 text-xs border-solid border border-gray-400 rounded p-2">
|
|
112
|
+
<span
|
|
113
|
+
class="underline"
|
|
114
|
+
on:click={() => {
|
|
115
|
+
seeEditable = !seeEditable
|
|
116
|
+
}}
|
|
117
|
+
>Customize argument<Icon
|
|
118
|
+
class="ml-2"
|
|
119
|
+
data={seeEditable ? faChevronUp : faChevronDown}
|
|
120
|
+
scale={0.7}
|
|
121
|
+
/></span
|
|
122
|
+
>
|
|
123
|
+
|
|
124
|
+
{#if seeEditable}
|
|
125
|
+
<div transition:slide class="mt-2">
|
|
126
|
+
<label class="text-gray-700"
|
|
127
|
+
>Description
|
|
128
|
+
<textarea rows="1" bind:value={description} placeholder="Edit description" />
|
|
129
|
+
{#if type == 'string' && !contentEncoding && format != 'date-time'}
|
|
130
|
+
<StringTypeNarrowing bind:format bind:pattern bind:enum_ />
|
|
131
|
+
{:else if type == 'object'}
|
|
132
|
+
<ObjectTypeNarrowing bind:format />
|
|
133
|
+
{:else if type == 'array'}
|
|
134
|
+
<select bind:value={itemsType}>
|
|
135
|
+
<option value={undefined}>No specific item type</option>
|
|
136
|
+
<option value={{ type: 'string' }}> Items are strings</option>
|
|
137
|
+
<option value={{ type: 'number' }}>Items are numbers</option>
|
|
138
|
+
<option value={{ type: 'string', contentEncoding: 'base64' }}
|
|
139
|
+
>Items are bytes</option
|
|
140
|
+
>
|
|
141
|
+
</select>
|
|
142
|
+
{/if}
|
|
143
|
+
</label>
|
|
144
|
+
</div>
|
|
145
|
+
{/if}
|
|
146
|
+
</div>
|
|
147
|
+
<span class="text-2xs">Preview:</span>
|
|
148
|
+
{/if}
|
|
149
|
+
|
|
150
|
+
<div class="grid grid-cols-2">
|
|
151
|
+
<div class="text-sm italic pb-1">
|
|
152
|
+
{description}
|
|
153
|
+
</div>
|
|
154
|
+
<div class="text-right text-xs {error === '' ? 'text-white' : 'font-bold text-red-600'}">
|
|
155
|
+
{error === '' ? '...' : error}
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
<div class="container">
|
|
159
|
+
{#if type == 'number' || type == 'integer'}
|
|
160
|
+
<input
|
|
161
|
+
{disabled}
|
|
162
|
+
type="number"
|
|
163
|
+
class={valid
|
|
164
|
+
? ''
|
|
165
|
+
: 'border border-red-700 border-opacity-30 focus:border-red-700 focus:border-opacity-30 bg-red-100'}
|
|
166
|
+
placeholder={defaultValue}
|
|
167
|
+
bind:value
|
|
168
|
+
/>
|
|
169
|
+
{:else if type == 'boolean'}
|
|
170
|
+
<input
|
|
171
|
+
{disabled}
|
|
172
|
+
type="checkbox"
|
|
173
|
+
class={valid
|
|
174
|
+
? ''
|
|
175
|
+
: 'border border-red-700 border-opacity-30 focus:border-red-700 focus:border-opacity-30 bg-red-100'}
|
|
176
|
+
bind:checked={value}
|
|
177
|
+
/>
|
|
178
|
+
{#if type == 'boolean' && value == undefined}
|
|
179
|
+
<span> Not set</span>
|
|
180
|
+
{/if}
|
|
181
|
+
{:else if type == 'array' && itemsType?.type != undefined}
|
|
182
|
+
{#each value ?? [] as v}
|
|
183
|
+
<div class="flex flex-row max-w-md">
|
|
184
|
+
{#if itemsType.type == 'number'}
|
|
185
|
+
<input type="number" bind:value={v} />
|
|
186
|
+
{:else if itemsType.type == 'string' && itemsType.contentEncoding == 'base64'}
|
|
187
|
+
<input
|
|
188
|
+
type="file"
|
|
189
|
+
class="my-6"
|
|
190
|
+
on:change={(x) => fileChanged(x, (val) => (v = val))}
|
|
191
|
+
multiple={false}
|
|
192
|
+
/>
|
|
193
|
+
{:else}
|
|
194
|
+
<input type="text" bind:value={v} />
|
|
195
|
+
{/if}
|
|
196
|
+
<button
|
|
197
|
+
class="default-button-secondary mx-6"
|
|
198
|
+
on:click={() => {
|
|
199
|
+
value = value.filter((el) => el != v)
|
|
200
|
+
if (value.length == 0) {
|
|
201
|
+
value = undefined
|
|
202
|
+
}
|
|
203
|
+
}}><Icon data={faMinus} class="mb-1" /></button
|
|
204
|
+
>
|
|
205
|
+
</div>
|
|
206
|
+
{/each}
|
|
207
|
+
<button
|
|
208
|
+
class="default-button-secondary mt-1"
|
|
209
|
+
on:click={() => {
|
|
210
|
+
if (value == undefined) {
|
|
211
|
+
value = []
|
|
212
|
+
}
|
|
213
|
+
value = value.concat('')
|
|
214
|
+
}}>Add item <Icon data={faPlus} class="mb-1" /></button
|
|
215
|
+
><span class="ml-2">{(value ?? []).length} item(s)</span>
|
|
216
|
+
{:else if type == 'object' && format?.startsWith('resource')}
|
|
217
|
+
<ObjectResourceInput {format} bind:value />
|
|
218
|
+
{:else if !type || type == 'object' || type == 'array'}
|
|
219
|
+
<textarea
|
|
220
|
+
{disabled}
|
|
221
|
+
style="min-height: {minHeight}; max-height: {maxHeight}"
|
|
222
|
+
class="col-span-10 {valid
|
|
223
|
+
? ''
|
|
224
|
+
: 'border border-red-700 border-opacity-30 focus:border-red-700 focus:border-opacity-30 bg-red-100'}"
|
|
225
|
+
placeholder={JSON.stringify(defaultValue, null, 4)}
|
|
226
|
+
bind:value={rawValue}
|
|
227
|
+
/>
|
|
228
|
+
{:else if type == 'string' && enum_}
|
|
229
|
+
<select {disabled} class="px-6" bind:value>
|
|
230
|
+
{#each enum_ as e}
|
|
231
|
+
<option>{e}</option>
|
|
232
|
+
{/each}
|
|
233
|
+
</select>
|
|
234
|
+
{:else if type == 'string' && format == 'date-time'}
|
|
235
|
+
<input class="inline-block" type="datetime-local" bind:value />
|
|
236
|
+
{:else if type == 'string' && contentEncoding == 'base64'}
|
|
237
|
+
<input
|
|
238
|
+
type="file"
|
|
239
|
+
class="my-6"
|
|
240
|
+
on:change={(x) => fileChanged(x, (val) => (value = val))}
|
|
241
|
+
multiple={false}
|
|
242
|
+
/>
|
|
243
|
+
{:else if type == 'string' && format?.startsWith('resource')}
|
|
244
|
+
<ResourcePicker
|
|
245
|
+
bind:value
|
|
246
|
+
resourceType={format.split('-').length > 1
|
|
247
|
+
? format.substring('resource-'.length)
|
|
248
|
+
: undefined}
|
|
249
|
+
/>
|
|
250
|
+
{:else}
|
|
251
|
+
<textarea
|
|
252
|
+
{disabled}
|
|
253
|
+
style="height: {minHeight}; max-height: {maxHeight}"
|
|
254
|
+
class="col-span-10 {valid
|
|
255
|
+
? ''
|
|
256
|
+
: 'border border-red-700 border-opacity-30 focus:border-red-700 focus:border-opacity-30 bg-red-100'}"
|
|
257
|
+
placeholder={defaultValue}
|
|
258
|
+
bind:value
|
|
259
|
+
/>
|
|
260
|
+
{/if}
|
|
261
|
+
{#if !required}
|
|
262
|
+
<div class="flex flex-row-reverse">
|
|
263
|
+
<button
|
|
264
|
+
{disabled}
|
|
265
|
+
class="default-button-secondary items-center leading-4 py-0 my-px px-1 float-right"
|
|
266
|
+
on:click={() => (value = undefined)}
|
|
267
|
+
>Reset<Tooltip class="pl-1" position={'above'} direction={'left'}
|
|
268
|
+
>Reset to default value
|
|
269
|
+
</Tooltip></button
|
|
270
|
+
>
|
|
271
|
+
</div>
|
|
272
|
+
{/if}
|
|
273
|
+
</div>
|
|
274
|
+
</div>
|
|
275
|
+
</div>
|
|
276
|
+
|
|
277
|
+
<style></style>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<script>export let value;
|
|
2
|
+
export let placeholder = '';
|
|
3
|
+
export let minRows = 1;
|
|
4
|
+
export let maxRows = 20;
|
|
5
|
+
$: minHeight = `${1 + minRows * 1.2}em`;
|
|
6
|
+
$: maxHeight = maxRows ? `${1 + maxRows * 1.2}em` : `auto`;
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<div class="container">
|
|
10
|
+
<pre aria-hidden="true" style="min-height: {minHeight}; max-height: {maxHeight}">
|
|
11
|
+
{value + '\n'}
|
|
12
|
+
</pre>
|
|
13
|
+
<textarea class="col-span-10 resize" bind:value {placeholder} />
|
|
14
|
+
</div>
|
|
15
|
+
|
|
16
|
+
<style>
|
|
17
|
+
.container {
|
|
18
|
+
position: relative;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
pre,
|
|
22
|
+
textarea {
|
|
23
|
+
font-family: inherit;
|
|
24
|
+
padding: 0.5em;
|
|
25
|
+
box-sizing: border-box;
|
|
26
|
+
line-height: 1.2;
|
|
27
|
+
overflow: hidden;
|
|
28
|
+
}
|
|
29
|
+
textarea {
|
|
30
|
+
position: absolute;
|
|
31
|
+
width: 100%;
|
|
32
|
+
height: 100%;
|
|
33
|
+
top: 0;
|
|
34
|
+
}</style>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<script>import Tooltip from './Tooltip.svelte';
|
|
2
|
+
export let twBgColor = 'bg-blue-200';
|
|
3
|
+
export let twTextColor = 'text-gray-700';
|
|
4
|
+
export let tooltip = undefined;
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<span class="{twBgColor} {twTextColor} text-2xs rounded px-1 whitespace-nowrap">
|
|
8
|
+
<slot />
|
|
9
|
+
{#if tooltip && tooltip != ''}
|
|
10
|
+
<Tooltip>{tooltip}</Tooltip>
|
|
11
|
+
{/if}
|
|
12
|
+
</span>
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
<script>import { faArchive, faEdit, faList, faPlay, faShare, faTrash } from '@fortawesome/free-solid-svg-icons';
|
|
2
|
+
import { createEventDispatcher } from 'svelte';
|
|
3
|
+
import Icon from 'svelte-awesome';
|
|
4
|
+
export let category;
|
|
5
|
+
export let disabled = false;
|
|
6
|
+
const dispatch = createEventDispatcher();
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<button
|
|
10
|
+
class="{$$props.class} inline-flex items-center default-button py-0 px-1 {category} default-button-secondary"
|
|
11
|
+
on:click={() => {
|
|
12
|
+
dispatch('click')
|
|
13
|
+
}}
|
|
14
|
+
{disabled}
|
|
15
|
+
>
|
|
16
|
+
<div class="inline-flex items-center justify-center">
|
|
17
|
+
{#if category === 'delete'}
|
|
18
|
+
<Icon data={faTrash} scale={0.5} />
|
|
19
|
+
<slot name="text">
|
|
20
|
+
<span class="pl-1">Delete</span>
|
|
21
|
+
</slot>
|
|
22
|
+
{:else if category === 'list'}
|
|
23
|
+
<Icon data={faList} scale={0.5} />
|
|
24
|
+
<slot name="text">
|
|
25
|
+
<span class="pl-1">List</span>
|
|
26
|
+
</slot>
|
|
27
|
+
{:else if category === 'run'}
|
|
28
|
+
<Icon data={faPlay} scale={0.5} />
|
|
29
|
+
<slot name="text">
|
|
30
|
+
<span class="pl-1">Run</span>
|
|
31
|
+
</slot>
|
|
32
|
+
{:else if category === 'edit'}
|
|
33
|
+
<Icon data={faEdit} scale={0.5} />
|
|
34
|
+
<slot name="text-gray-500">
|
|
35
|
+
<span class="pl-1">Edit</span>
|
|
36
|
+
</slot>
|
|
37
|
+
{:else if category === 'archive'}
|
|
38
|
+
<Icon data={faArchive} scale={0.5} />
|
|
39
|
+
<slot name="text">
|
|
40
|
+
<span class="pl-1">Archive</span>
|
|
41
|
+
</slot>
|
|
42
|
+
{:else if category === 'share'}
|
|
43
|
+
<Icon data={faShare} scale={0.5} />
|
|
44
|
+
<slot name="text">
|
|
45
|
+
<span class="pl-1">Share</span>
|
|
46
|
+
</slot>
|
|
47
|
+
{/if}
|
|
48
|
+
</div>
|
|
49
|
+
</button>
|
|
50
|
+
|
|
51
|
+
<style>
|
|
52
|
+
.delete, .archive {
|
|
53
|
+
background-color: transparent
|
|
54
|
+
}
|
|
55
|
+
.delete:hover, .archive:hover {
|
|
56
|
+
--tw-bg-opacity: 1;
|
|
57
|
+
background-color: rgb(220 38 38 / var(--tw-bg-opacity))
|
|
58
|
+
}
|
|
59
|
+
.delete, .archive {
|
|
60
|
+
font-weight: 400;
|
|
61
|
+
--tw-text-opacity: 1;
|
|
62
|
+
color: rgb(220 38 38 / var(--tw-text-opacity))
|
|
63
|
+
}
|
|
64
|
+
.delete:hover, .archive:hover {
|
|
65
|
+
--tw-text-opacity: 1;
|
|
66
|
+
color: rgb(255 255 255 / var(--tw-text-opacity))
|
|
67
|
+
}
|
|
68
|
+
.delete, .archive {
|
|
69
|
+
border-radius: 0.25rem;
|
|
70
|
+
--tw-border-opacity: 1;
|
|
71
|
+
border-color: rgb(220 38 38 / var(--tw-border-opacity))
|
|
72
|
+
}
|
|
73
|
+
.delete:hover, .archive:hover {
|
|
74
|
+
border-color: transparent
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.edit:hover, .play:hover, .list:hover, .share:hover {
|
|
78
|
+
--tw-bg-opacity: 1;
|
|
79
|
+
background-color: rgb(59 130 246 / var(--tw-bg-opacity));
|
|
80
|
+
--tw-text-opacity: 1;
|
|
81
|
+
color: rgb(255 255 255 / var(--tw-text-opacity))
|
|
82
|
+
}</style>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<script>import { faSortDown } from '@fortawesome/free-solid-svg-icons';
|
|
2
|
+
import { createEventDispatcher } from 'svelte';
|
|
3
|
+
import Icon from 'svelte-awesome';
|
|
4
|
+
import Dropdown from './Dropdown.svelte';
|
|
5
|
+
export let dropdownItems = [];
|
|
6
|
+
const dispatch = createEventDispatcher();
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<div class="bg-blue-500 rounded-sm {$$props.class} inline-block py-0 my-0 ">
|
|
10
|
+
<button
|
|
11
|
+
class="inline pl-2 text-white text-sm py-0 my-0"
|
|
12
|
+
on:click={() => {
|
|
13
|
+
dispatch('clickMain')
|
|
14
|
+
}}><slot name="name">Add script</slot></button
|
|
15
|
+
>
|
|
16
|
+
<Dropdown
|
|
17
|
+
{dropdownItems}
|
|
18
|
+
class="border-l border-gray-300 px-2 inline-block py-0 my-0"
|
|
19
|
+
on:click={() => dispatch('clickDropdown')}
|
|
20
|
+
>
|
|
21
|
+
<div slot="name" class="py-0 my-0">
|
|
22
|
+
<Icon class="text-white align-top py-0 my-0" data={faSortDown} />
|
|
23
|
+
</div>
|
|
24
|
+
</Dropdown>
|
|
25
|
+
</div>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<script>import { faChevronDown, faChevronUp } from '@fortawesome/free-solid-svg-icons';
|
|
2
|
+
import Icon from 'svelte-awesome';
|
|
3
|
+
export let text;
|
|
4
|
+
export let viewOptions = false;
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<button
|
|
8
|
+
type="submit"
|
|
9
|
+
class="mr-6 text-sm underline text-gray-700 inline-flex items-center"
|
|
10
|
+
on:click={() => {
|
|
11
|
+
viewOptions = !viewOptions
|
|
12
|
+
}}
|
|
13
|
+
>
|
|
14
|
+
<div>
|
|
15
|
+
{text}
|
|
16
|
+
<Icon data={viewOptions ? faChevronUp : faChevronDown} scale={0.5} />
|
|
17
|
+
</div>
|
|
18
|
+
</button>
|
|
19
|
+
{#if viewOptions}
|
|
20
|
+
<slot />
|
|
21
|
+
{/if}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
<script>import { Highlight } from 'svelte-highlight';
|
|
2
|
+
import github from 'svelte-highlight/styles/github';
|
|
3
|
+
import { json } from 'svelte-highlight/languages';
|
|
4
|
+
import TableCustom from './TableCustom.svelte';
|
|
5
|
+
export let result;
|
|
6
|
+
let resultKind = inferResultKind(result);
|
|
7
|
+
function isArray(obj) {
|
|
8
|
+
return Object.prototype.toString.call(obj) === '[object Array]';
|
|
9
|
+
}
|
|
10
|
+
function isRectangularArray(obj) {
|
|
11
|
+
if (!isArray(obj) || obj.length == 0) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
if (!Object.values(obj)
|
|
15
|
+
.map(isArray)
|
|
16
|
+
.reduce((a, b) => a && b)) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
let innerSize = obj[0].length;
|
|
20
|
+
return Object.values(obj)
|
|
21
|
+
.map((x) => x.length == innerSize)
|
|
22
|
+
.reduce((a, b) => a && b);
|
|
23
|
+
}
|
|
24
|
+
function asListOfList(obj) {
|
|
25
|
+
return obj;
|
|
26
|
+
}
|
|
27
|
+
function inferResultKind(result) {
|
|
28
|
+
if (result) {
|
|
29
|
+
try {
|
|
30
|
+
let keys = Object.keys(result);
|
|
31
|
+
if (keys.length == 1 && isRectangularArray(result[keys[0]])) {
|
|
32
|
+
return 'table-row';
|
|
33
|
+
}
|
|
34
|
+
else if (keys.map((k) => isArray(result[k])).reduce((a, b) => a && b)) {
|
|
35
|
+
return 'table-col';
|
|
36
|
+
}
|
|
37
|
+
else if (keys.length == 1 && keys[0] == 'png') {
|
|
38
|
+
return 'png';
|
|
39
|
+
}
|
|
40
|
+
else if (keys.length == 1 && keys[0] == 'file') {
|
|
41
|
+
return 'file';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (err) { }
|
|
45
|
+
}
|
|
46
|
+
return 'json';
|
|
47
|
+
}
|
|
48
|
+
</script>
|
|
49
|
+
|
|
50
|
+
<svelte:head>
|
|
51
|
+
{@html github}
|
|
52
|
+
</svelte:head>
|
|
53
|
+
{#if Object.keys(result).length > 0}<div>
|
|
54
|
+
The result keys are: <b>{Object.keys(result).join(', ')}</b>
|
|
55
|
+
</div>
|
|
56
|
+
{/if}
|
|
57
|
+
{#if resultKind == 'table-col'}
|
|
58
|
+
<div class="grid grid-flow-col-dense border border-gray-200 rounded-md ">
|
|
59
|
+
{#each Object.keys(result) as col}
|
|
60
|
+
<div class="flex flex-col min-w-full">
|
|
61
|
+
<div class="px-12 text-left uppercase border-b bg-gray-50 overflow-hidden rounded-t-md ">
|
|
62
|
+
{col}
|
|
63
|
+
</div>
|
|
64
|
+
{#each result[col] as item}
|
|
65
|
+
<div class="px-12 text-left">{item}</div>
|
|
66
|
+
{/each}
|
|
67
|
+
</div>
|
|
68
|
+
{/each}
|
|
69
|
+
</div>
|
|
70
|
+
{:else if resultKind == 'table-row'}<div
|
|
71
|
+
class="grid grid-flow-col-dense border border-gray-200 rounded-md "
|
|
72
|
+
>
|
|
73
|
+
<TableCustom>
|
|
74
|
+
<tbody slot="body">
|
|
75
|
+
{#each asListOfList(Object.values(result)[0]) as row}
|
|
76
|
+
<tr>
|
|
77
|
+
{#each row as v}
|
|
78
|
+
<td>{v ?? ''}</td>
|
|
79
|
+
{/each}
|
|
80
|
+
</tr>
|
|
81
|
+
{/each}
|
|
82
|
+
</tbody>
|
|
83
|
+
</TableCustom>
|
|
84
|
+
</div>
|
|
85
|
+
{:else if resultKind == 'png'}
|
|
86
|
+
<div class="h-full">
|
|
87
|
+
Result is an image: <img
|
|
88
|
+
alt="png rendered"
|
|
89
|
+
class="w-auto h-full"
|
|
90
|
+
src="data:image/png;base64,{result.png}"
|
|
91
|
+
/>
|
|
92
|
+
</div>
|
|
93
|
+
{:else if resultKind == 'file'}
|
|
94
|
+
<div>
|
|
95
|
+
Result is a file: <a
|
|
96
|
+
download="windmill.file"
|
|
97
|
+
href="data:application/octet-stream;base64,{result.file}">Download</a
|
|
98
|
+
>
|
|
99
|
+
</div>
|
|
100
|
+
{:else}<Highlight language={json} code={JSON.stringify(result, null, 4).replace(/\\n/g, '\n')} />
|
|
101
|
+
{/if}
|