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.
Files changed (184) hide show
  1. package/LICENSE +661 -0
  2. package/common.d.ts +29 -0
  3. package/components/ArgInfo.svelte +48 -0
  4. package/components/ArgInput.svelte +277 -0
  5. package/components/AutosizedTextarea.svelte +34 -0
  6. package/components/Badge.svelte +12 -0
  7. package/components/Button.svelte +82 -0
  8. package/components/ButtonAndDropdown.svelte +25 -0
  9. package/components/CenteredPage.svelte +5 -0
  10. package/components/ChevronButton.svelte +21 -0
  11. package/components/DisplayResult.svelte +101 -0
  12. package/components/Dropdown.svelte +108 -0
  13. package/components/Editor.svelte +370 -0
  14. package/components/FieldHeader.svelte +21 -0
  15. package/components/FlowBuilder.svelte +202 -0
  16. package/components/FlowEditor.svelte +95 -0
  17. package/components/FlowPreview.svelte +141 -0
  18. package/components/FlowStatusViewer.svelte +137 -0
  19. package/components/GroupModal.svelte +90 -0
  20. package/components/IconedResourceType.svelte +32 -0
  21. package/components/InviteGlobalUser.svelte +56 -0
  22. package/components/InviteUser.svelte +48 -0
  23. package/components/ItemPicker.svelte +58 -0
  24. package/components/JobStatus.svelte +38 -0
  25. package/components/Modal.svelte +94 -0
  26. package/components/ModuleStep.svelte +64 -0
  27. package/components/Multiselect.svelte +327 -0
  28. package/components/ObjectResourceInput.svelte +62 -0
  29. package/components/ObjectTypeNarrowing.svelte +25 -0
  30. package/components/PageHeader.svelte +29 -0
  31. package/components/Password.svelte +45 -0
  32. package/components/Path.svelte +129 -0
  33. package/components/RadioButton.svelte +117 -0
  34. package/components/Required.svelte +11 -0
  35. package/components/ResourceEditor.svelte +260 -0
  36. package/components/ResourcePicker.svelte +21 -0
  37. package/components/ResourceTypePicker.svelte +71 -0
  38. package/components/RunForm.svelte +127 -0
  39. package/components/SchemaEditor.svelte +221 -0
  40. package/components/SchemaForm.svelte +166 -0
  41. package/components/SchemaModal.svelte +160 -0
  42. package/components/SchemaViewer.svelte +76 -0
  43. package/components/ScriptBuilder.svelte +293 -0
  44. package/components/ScriptEditor.svelte +669 -0
  45. package/components/ScriptPicker.svelte +110 -0
  46. package/components/ScriptSchema.svelte +71 -0
  47. package/components/ShareModal.svelte +135 -0
  48. package/components/SharedBadge.svelte +54 -0
  49. package/components/StringTypeNarrowing.svelte +101 -0
  50. package/components/Switch.svelte +61 -0
  51. package/components/TableCustom.svelte +39 -0
  52. package/components/TableSimple.svelte +66 -0
  53. package/components/Tabs.svelte +21 -0
  54. package/components/Tooltip.svelte +93 -0
  55. package/components/VariableEditor.svelte +159 -0
  56. package/components/icons/DbIcon.svelte +12 -0
  57. package/components/icons/Mail.svelte +62 -0
  58. package/components/icons/Mysql.svelte +77 -0
  59. package/components/icons/PostgresIcon.svelte +57 -0
  60. package/components/icons/Slack.svelte +26 -0
  61. package/gen/core/ApiError.d.ts +8 -0
  62. package/gen/core/ApiRequestOptions.d.ts +13 -0
  63. package/gen/core/ApiResult.d.ts +7 -0
  64. package/gen/core/CancelablePromise.d.ts +26 -0
  65. package/gen/core/OpenAPI.d.ts +16 -0
  66. package/gen/core/request.d.ts +13 -0
  67. package/gen/index.d.ts +59 -0
  68. package/gen/models/AuditLog.d.ts +32 -0
  69. package/gen/models/CompletedJob.d.ts +48 -0
  70. package/gen/models/ContextualVariable.d.ts +5 -0
  71. package/gen/models/CreateResource.d.ts +6 -0
  72. package/gen/models/CreateVariable.d.ts +6 -0
  73. package/gen/models/CreateWorkspace.d.ts +6 -0
  74. package/gen/models/EditResource.d.ts +5 -0
  75. package/gen/models/EditResourceType.d.ts +4 -0
  76. package/gen/models/EditSchedule.d.ts +7 -0
  77. package/gen/models/EditVariable.d.ts +6 -0
  78. package/gen/models/EditWorkspaceUser.d.ts +3 -0
  79. package/gen/models/Flow.d.ts +13 -0
  80. package/gen/models/FlowModule.d.ts +6 -0
  81. package/gen/models/FlowModuleValue.d.ts +10 -0
  82. package/gen/models/FlowPreview.d.ts +7 -0
  83. package/gen/models/FlowStatus.d.ts +6 -0
  84. package/gen/models/FlowStatusModule.d.ts +15 -0
  85. package/gen/models/FlowValue.d.ts +5 -0
  86. package/gen/models/GlobalUserInfo.d.ts +14 -0
  87. package/gen/models/Group.d.ts +6 -0
  88. package/gen/models/InputTransform.d.ts +12 -0
  89. package/gen/models/Job.d.ts +11 -0
  90. package/gen/models/ListableVariable.d.ts +8 -0
  91. package/gen/models/Login.d.ts +4 -0
  92. package/gen/models/MainArgSignature.d.ts +14 -0
  93. package/gen/models/NewSchedule.d.ts +9 -0
  94. package/gen/models/NewToken.d.ts +4 -0
  95. package/gen/models/NewUser.d.ts +5 -0
  96. package/gen/models/Preview.d.ts +13 -0
  97. package/gen/models/QueuedJob.d.ts +47 -0
  98. package/gen/models/Resource.d.ts +8 -0
  99. package/gen/models/ResourceType.d.ts +6 -0
  100. package/gen/models/Schedule.d.ts +13 -0
  101. package/gen/models/Script.d.ts +29 -0
  102. package/gen/models/ScriptArgs.d.ts +1 -0
  103. package/gen/models/TruncatedToken.d.ts +7 -0
  104. package/gen/models/User.d.ts +10 -0
  105. package/gen/models/UserWorkspaceList.d.ts +8 -0
  106. package/gen/models/WorkerPing.d.ts +8 -0
  107. package/gen/models/Workspace.d.ts +6 -0
  108. package/gen/models/WorkspaceInvite.d.ts +5 -0
  109. package/gen/services/AdminService.d.ts +35 -0
  110. package/gen/services/AuditService.d.ts +37 -0
  111. package/gen/services/FlowService.d.ts +82 -0
  112. package/gen/services/GranularAclService.d.ts +42 -0
  113. package/gen/services/GroupService.d.ts +94 -0
  114. package/gen/services/JobService.d.ts +217 -0
  115. package/gen/services/ResourceService.d.ts +116 -0
  116. package/gen/services/ScheduleService.d.ts +73 -0
  117. package/gen/services/ScriptService.d.ts +165 -0
  118. package/gen/services/SettingsService.d.ts +15 -0
  119. package/gen/services/UserService.d.ts +211 -0
  120. package/gen/services/VariableService.d.ts +66 -0
  121. package/gen/services/WorkerService.d.ts +15 -0
  122. package/gen/services/WorkspaceService.d.ts +137 -0
  123. package/infer.d.ts +2 -0
  124. package/lib/components/ArgInfo.svelte.d.ts +16 -0
  125. package/lib/components/ArgInput.svelte.d.ts +37 -0
  126. package/lib/components/AutosizedTextarea.svelte.d.ts +19 -0
  127. package/lib/components/Badge.svelte.d.ts +20 -0
  128. package/lib/components/Button.svelte.d.ts +23 -0
  129. package/lib/components/ButtonAndDropdown.svelte.d.ts +23 -0
  130. package/lib/components/CenteredPage.svelte.d.ts +23 -0
  131. package/lib/components/ChevronButton.svelte.d.ts +19 -0
  132. package/lib/components/DisplayResult.svelte.d.ts +16 -0
  133. package/lib/components/Dropdown.svelte.d.ts +22 -0
  134. package/lib/components/Editor.svelte.d.ts +38 -0
  135. package/lib/components/FieldHeader.svelte.d.ts +23 -0
  136. package/lib/components/FlowBuilder.svelte.d.ts +18 -0
  137. package/lib/components/FlowEditor.svelte.d.ts +19 -0
  138. package/lib/components/FlowPreview.svelte.d.ts +21 -0
  139. package/lib/components/FlowStatusViewer.svelte.d.ts +18 -0
  140. package/lib/components/GroupModal.svelte.d.ts +17 -0
  141. package/lib/components/IconedResourceType.svelte.d.ts +19 -0
  142. package/lib/components/InviteGlobalUser.svelte.d.ts +19 -0
  143. package/lib/components/InviteUser.svelte.d.ts +19 -0
  144. package/lib/components/ItemPicker.svelte.d.ts +24 -0
  145. package/lib/components/JobStatus.svelte.d.ts +17 -0
  146. package/lib/components/Modal.svelte.d.ts +28 -0
  147. package/lib/components/ModuleStep.svelte.d.ts +26 -0
  148. package/lib/components/Multiselect.svelte.d.ts +33 -0
  149. package/lib/components/ObjectResourceInput.svelte.d.ts +17 -0
  150. package/lib/components/ObjectTypeNarrowing.svelte.d.ts +16 -0
  151. package/lib/components/PageHeader.svelte.d.ts +20 -0
  152. package/lib/components/Password.svelte.d.ts +18 -0
  153. package/lib/components/Path.svelte.d.ts +26 -0
  154. package/lib/components/RadioButton.svelte.d.ts +21 -0
  155. package/lib/components/Required.svelte.d.ts +17 -0
  156. package/lib/components/ResourceEditor.svelte.d.ts +22 -0
  157. package/lib/components/ResourcePicker.svelte.d.ts +17 -0
  158. package/lib/components/ResourceTypePicker.svelte.d.ts +19 -0
  159. package/lib/components/RunForm.svelte.d.ts +22 -0
  160. package/lib/components/SchemaEditor.svelte.d.ts +22 -0
  161. package/lib/components/SchemaForm.svelte.d.ts +23 -0
  162. package/lib/components/SchemaModal.svelte.d.ts +44 -0
  163. package/lib/components/SchemaViewer.svelte.d.ts +17 -0
  164. package/lib/components/ScriptBuilder.svelte.d.ts +20 -0
  165. package/lib/components/ScriptEditor.svelte.d.ts +28 -0
  166. package/lib/components/ScriptPicker.svelte.d.ts +21 -0
  167. package/lib/components/ScriptSchema.svelte.d.ts +22 -0
  168. package/lib/components/ShareModal.svelte.d.ts +21 -0
  169. package/lib/components/SharedBadge.svelte.d.ts +17 -0
  170. package/lib/components/StringTypeNarrowing.svelte.d.ts +18 -0
  171. package/lib/components/Switch.svelte.d.ts +31 -0
  172. package/lib/components/TableCustom.svelte.d.ts +25 -0
  173. package/lib/components/TableSimple.svelte.d.ts +24 -0
  174. package/lib/components/Tabs.svelte.d.ts +20 -0
  175. package/lib/components/Tooltip.svelte.d.ts +20 -0
  176. package/lib/components/VariableEditor.svelte.d.ts +21 -0
  177. package/lib/components/icons/DbIcon.svelte.d.ts +17 -0
  178. package/lib/components/icons/Mail.svelte.d.ts +17 -0
  179. package/lib/components/icons/Mysql.svelte.d.ts +17 -0
  180. package/lib/components/icons/PostgresIcon.svelte.d.ts +17 -0
  181. package/lib/components/icons/Slack.svelte.d.ts +17 -0
  182. package/package.json +110 -0
  183. package/stores.d.ts +19 -0
  184. 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>&nbsp; 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 &nbsp;<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,5 @@
1
+ <div class="max-w-screen-lg flex grow w-full h-full xl:-ml-20">
2
+ <div class="grow w-full h-full">
3
+ <slot />
4
+ </div>
5
+ </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}