windmill-components 1.21.0 → 1.28.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.
Files changed (251) hide show
  1. package/components/AppConnect.svelte +93 -47
  2. package/components/AppConnect.svelte.d.ts +2 -2
  3. package/components/ArgInfo.svelte +0 -5
  4. package/components/ArgInput.svelte +91 -66
  5. package/components/ArgInput.svelte.d.ts +8 -3
  6. package/components/Button.svelte +4 -4
  7. package/components/CenteredPage.svelte +1 -1
  8. package/components/CollapseLink.svelte +12 -0
  9. package/components/CollapseLink.svelte.d.ts +19 -0
  10. package/components/CronInput.svelte +84 -0
  11. package/components/CronInput.svelte.d.ts +18 -0
  12. package/components/DisplayResult.svelte +23 -7
  13. package/components/Editor.svelte +144 -61
  14. package/components/Editor.svelte.d.ts +2 -0
  15. package/components/EditorBar.svelte +215 -0
  16. package/components/EditorBar.svelte.d.ts +23 -0
  17. package/components/FlowBuilder.svelte +151 -79
  18. package/components/FlowEditor.svelte +77 -130
  19. package/components/FlowEditor.svelte.d.ts +3 -2
  20. package/components/FlowJobResult.svelte +1 -1
  21. package/components/FlowPreview.svelte +18 -24
  22. package/components/FlowPreviewContent.svelte +68 -0
  23. package/components/FlowPreviewContent.svelte.d.ts +21 -0
  24. package/components/FlowStatusViewer.svelte +85 -37
  25. package/components/FlowStatusViewer.svelte.d.ts +3 -2
  26. package/components/FlowViewer.svelte +100 -26
  27. package/components/FlowViewer.svelte.d.ts +8 -3
  28. package/components/IconedResourceType.svelte +30 -5
  29. package/components/InputTransformForm.svelte +209 -0
  30. package/components/InputTransformForm.svelte.d.ts +26 -0
  31. package/components/InviteGlobalUser.svelte +2 -2
  32. package/components/InviteUser.svelte +2 -2
  33. package/components/JobStatus.svelte +32 -25
  34. package/components/Modal.svelte +47 -43
  35. package/components/ModuleStep.svelte +100 -54
  36. package/components/ObjectResourceInput.svelte +58 -38
  37. package/components/ObjectTypeNarrowing.svelte +4 -19
  38. package/components/Path.svelte +3 -3
  39. package/components/Path.svelte.d.ts +1 -1
  40. package/components/RadioButton.svelte +11 -96
  41. package/components/RadioButton.svelte.d.ts +4 -2
  42. package/components/ResourceEditor.svelte +5 -6
  43. package/components/ResourceEditor.svelte.d.ts +2 -2
  44. package/components/ResourcePicker.svelte +25 -2
  45. package/components/ResourcePicker.svelte.d.ts +3 -0
  46. package/components/ResourceTypePicker.svelte +17 -29
  47. package/components/ResourceTypePicker.svelte.d.ts +1 -0
  48. package/components/RunForm.svelte +14 -15
  49. package/components/RunForm.svelte.d.ts +1 -1
  50. package/components/SchemaEditor.svelte +87 -71
  51. package/components/SchemaEditor.svelte.d.ts +2 -0
  52. package/components/SchemaEditorProperty.svelte +11 -0
  53. package/components/SchemaEditorProperty.svelte.d.ts +17 -0
  54. package/components/SchemaForm.svelte +21 -127
  55. package/components/SchemaForm.svelte.d.ts +3 -4
  56. package/components/SchemaModal.svelte +20 -33
  57. package/components/SchemaModal.svelte.d.ts +1 -1
  58. package/components/SchemaViewer.svelte +5 -7
  59. package/components/ScriptBuilder.svelte +41 -44
  60. package/components/ScriptEditor.svelte +76 -248
  61. package/components/ScriptPicker.svelte +13 -26
  62. package/components/ScriptPicker.svelte.d.ts +1 -1
  63. package/components/ScriptSchema.svelte +0 -5
  64. package/components/ShareModal.svelte +1 -1
  65. package/components/SharedBadge.svelte +12 -10
  66. package/components/StringTypeNarrowing.svelte +8 -4
  67. package/components/StringTypeNarrowing.svelte.d.ts +1 -0
  68. package/components/TableCustom.svelte +7 -9
  69. package/components/TableSimple.svelte +1 -1
  70. package/components/Toggle.svelte +8 -10
  71. package/components/Toggle.svelte.d.ts +5 -11
  72. package/components/Tooltip.svelte +56 -82
  73. package/components/Tooltip.svelte.d.ts +1 -5
  74. package/components/VariableEditor.svelte +21 -6
  75. package/components/flows/CopyFirstStepSchema.svelte +7 -5
  76. package/components/flows/DynamicInputHelpBox.svelte +1 -1
  77. package/components/flows/FlowBox.svelte +3 -0
  78. package/components/flows/FlowBox.svelte.d.ts +23 -0
  79. package/components/flows/FlowBoxHeader.svelte +9 -0
  80. package/components/flows/FlowBoxHeader.svelte.d.ts +18 -0
  81. package/components/flows/FlowInput.svelte +20 -0
  82. package/components/flows/FlowInput.svelte.d.ts +14 -0
  83. package/components/flows/FlowInputs.svelte +7 -3
  84. package/components/flows/FlowModuleHeader.svelte +44 -41
  85. package/components/flows/FlowModuleHeader.svelte.d.ts +1 -1
  86. package/components/flows/FlowSettings.svelte +174 -0
  87. package/components/flows/FlowSettings.svelte.d.ts +21 -0
  88. package/components/flows/flowStore.d.ts +5 -2
  89. package/components/flows/flowStore.js +65 -9
  90. package/components/flows/pickers/FlowScriptPicker.svelte +6 -1
  91. package/components/flows/pickers/FlowScriptPicker.svelte.d.ts +1 -0
  92. package/components/flows/utils.d.ts +11 -11
  93. package/components/flows/utils.js +103 -63
  94. package/components/icons/AirtableIcon.svelte +17 -0
  95. package/components/icons/AirtableIcon.svelte.d.ts +17 -0
  96. package/components/icons/GCloudIcon.svelte +16 -0
  97. package/components/icons/GCloudIcon.svelte.d.ts +17 -0
  98. package/components/icons/GItlabIcon.svelte +16 -0
  99. package/components/icons/GItlabIcon.svelte.d.ts +17 -0
  100. package/components/icons/GSheetsIcon.svelte +16 -0
  101. package/components/icons/GSheetsIcon.svelte.d.ts +17 -0
  102. package/components/icons/GcalIcon.svelte +16 -0
  103. package/components/icons/GcalIcon.svelte.d.ts +17 -0
  104. package/components/icons/GdriveIcon.svelte +16 -0
  105. package/components/icons/GdriveIcon.svelte.d.ts +17 -0
  106. package/components/icons/GmailIcon.svelte +16 -0
  107. package/components/icons/GmailIcon.svelte.d.ts +17 -0
  108. package/components/icons/PostgresIcon.svelte +8 -49
  109. package/components/icons/Slack.svelte +9 -18
  110. package/components/icons/TogglIcon.svelte +59 -0
  111. package/components/icons/TogglIcon.svelte.d.ts +17 -0
  112. package/components/propertyPicker/ObjectViewer.svelte +35 -37
  113. package/components/propertyPicker/ObjectViewer.svelte.d.ts +1 -0
  114. package/components/propertyPicker/OverlayPropertyPicker.svelte +53 -53
  115. package/components/propertyPicker/OverlayPropertyPicker.svelte.d.ts +5 -2
  116. package/components/propertyPicker/PropPicker.svelte +13 -15
  117. package/components/propertyPicker/PropPicker.svelte.d.ts +1 -1
  118. package/components/propertyPicker/WarningMessage.svelte +14 -41
  119. package/components/propertyPicker/WarningMessage.svelte.d.ts +11 -8
  120. package/components/propertyPicker/utils.d.ts +1 -0
  121. package/components/propertyPicker/utils.js +25 -0
  122. package/gen/core/OpenAPI.js +1 -1
  123. package/gen/index.d.ts +12 -2
  124. package/gen/index.js +1 -2
  125. package/gen/models/CompletedJob.d.ts +1 -1
  126. package/gen/models/Flow.d.ts +3 -13
  127. package/gen/models/FlowMetadata.d.ts +9 -0
  128. package/gen/models/FlowMetadata.js +4 -0
  129. package/gen/models/FlowModuleValue.d.ts +5 -22
  130. package/gen/models/FlowModuleValue.js +1 -15
  131. package/gen/models/ForloopFlow.d.ts +8 -0
  132. package/gen/models/ForloopFlow.js +4 -0
  133. package/gen/models/InputTransform.d.ts +3 -12
  134. package/gen/models/InputTransform.js +1 -8
  135. package/gen/models/JavascriptTransform.d.ts +4 -0
  136. package/gen/models/JavascriptTransform.js +4 -0
  137. package/gen/models/MainArgSignature.d.ts +1 -1
  138. package/gen/models/NewSchedule.d.ts +1 -0
  139. package/gen/models/OpenFlow.d.ts +7 -0
  140. package/gen/models/OpenFlow.js +4 -0
  141. package/gen/models/OpenFlowWPath.d.ts +4 -0
  142. package/gen/models/OpenFlowWPath.js +4 -0
  143. package/gen/models/PathFlow.d.ts +4 -0
  144. package/gen/models/PathFlow.js +4 -0
  145. package/gen/models/PathScript.d.ts +4 -0
  146. package/gen/models/PathScript.js +4 -0
  147. package/gen/models/RawScript.d.ts +12 -0
  148. package/gen/models/RawScript.js +11 -0
  149. package/gen/models/Schedule.d.ts +1 -1
  150. package/gen/models/StaticTransform.d.ts +4 -0
  151. package/gen/models/StaticTransform.js +4 -0
  152. package/gen/models/TokenResponse.d.ts +3 -3
  153. package/gen/models/Usage.d.ts +5 -0
  154. package/gen/models/Usage.js +4 -0
  155. package/gen/models/User.d.ts +2 -0
  156. package/gen/schemas/$AuditLog.d.ts +32 -0
  157. package/gen/schemas/$AuditLog.js +35 -0
  158. package/gen/schemas/$CompletedJob.d.ts +98 -0
  159. package/gen/schemas/$CompletedJob.js +103 -0
  160. package/gen/schemas/$ContextualVariable.d.ts +16 -0
  161. package/gen/schemas/$ContextualVariable.js +19 -0
  162. package/gen/schemas/$CreateResource.d.ts +22 -0
  163. package/gen/schemas/$CreateResource.js +25 -0
  164. package/gen/schemas/$CreateVariable.d.ts +26 -0
  165. package/gen/schemas/$CreateVariable.js +29 -0
  166. package/gen/schemas/$CreateWorkspace.d.ts +20 -0
  167. package/gen/schemas/$CreateWorkspace.js +23 -0
  168. package/gen/schemas/$EditResource.d.ts +13 -0
  169. package/gen/schemas/$EditResource.js +16 -0
  170. package/gen/schemas/$EditResourceType.d.ts +10 -0
  171. package/gen/schemas/$EditResourceType.js +13 -0
  172. package/gen/schemas/$EditSchedule.d.ts +20 -0
  173. package/gen/schemas/$EditSchedule.js +23 -0
  174. package/gen/schemas/$EditVariable.d.ts +16 -0
  175. package/gen/schemas/$EditVariable.js +19 -0
  176. package/gen/schemas/$EditWorkspaceUser.d.ts +7 -0
  177. package/gen/schemas/$EditWorkspaceUser.js +10 -0
  178. package/gen/schemas/$Flow.d.ts +23 -0
  179. package/gen/schemas/$Flow.js +26 -0
  180. package/gen/schemas/$FlowMetadata.d.ts +31 -0
  181. package/gen/schemas/$FlowMetadata.js +34 -0
  182. package/gen/schemas/$FlowPreview.d.ts +80 -0
  183. package/gen/schemas/$FlowPreview.js +83 -0
  184. package/gen/schemas/$GlobalUserInfo.d.ts +26 -0
  185. package/gen/schemas/$GlobalUserInfo.js +29 -0
  186. package/gen/schemas/$Group.d.ts +23 -0
  187. package/gen/schemas/$Group.js +26 -0
  188. package/gen/schemas/$Job.d.ts +17 -0
  189. package/gen/schemas/$Job.js +20 -0
  190. package/gen/schemas/$ListableVariable.d.ts +35 -0
  191. package/gen/schemas/$ListableVariable.js +38 -0
  192. package/gen/schemas/$Login.d.ts +12 -0
  193. package/gen/schemas/$Login.js +15 -0
  194. package/gen/schemas/$MainArgSignature.d.ts +50 -0
  195. package/gen/schemas/$MainArgSignature.js +53 -0
  196. package/gen/schemas/$NewSchedule.d.ts +30 -0
  197. package/gen/schemas/$NewSchedule.js +33 -0
  198. package/gen/schemas/$NewToken.d.ts +11 -0
  199. package/gen/schemas/$NewToken.js +14 -0
  200. package/gen/schemas/$NewUser.d.ts +16 -0
  201. package/gen/schemas/$NewUser.js +19 -0
  202. package/gen/schemas/$Preview.d.ts +19 -0
  203. package/gen/schemas/$Preview.js +22 -0
  204. package/gen/schemas/$QueuedJob.d.ts +139 -0
  205. package/gen/schemas/$QueuedJob.js +144 -0
  206. package/gen/schemas/$Resource.d.ts +31 -0
  207. package/gen/schemas/$Resource.js +34 -0
  208. package/gen/schemas/$ResourceType.d.ts +17 -0
  209. package/gen/schemas/$ResourceType.js +20 -0
  210. package/gen/schemas/$Schedule.d.ts +47 -0
  211. package/gen/schemas/$Schedule.js +50 -0
  212. package/gen/schemas/$Script.d.ts +77 -0
  213. package/gen/schemas/$Script.js +80 -0
  214. package/gen/schemas/$ScriptArgs.d.ts +6 -0
  215. package/gen/schemas/$ScriptArgs.js +9 -0
  216. package/gen/schemas/$SlackToken.d.ts +24 -0
  217. package/gen/schemas/$SlackToken.js +27 -0
  218. package/gen/schemas/$TokenResponse.d.ts +23 -0
  219. package/gen/schemas/$TokenResponse.js +26 -0
  220. package/gen/schemas/$TruncatedToken.d.ts +25 -0
  221. package/gen/schemas/$TruncatedToken.js +28 -0
  222. package/gen/schemas/$Usage.d.ts +13 -0
  223. package/gen/schemas/$Usage.js +16 -0
  224. package/gen/schemas/$User.d.ts +42 -0
  225. package/gen/schemas/$User.js +45 -0
  226. package/gen/schemas/$UserWorkspaceList.d.ts +28 -0
  227. package/gen/schemas/$UserWorkspaceList.js +31 -0
  228. package/gen/schemas/$WorkerPing.d.ts +31 -0
  229. package/gen/schemas/$WorkerPing.js +34 -0
  230. package/gen/schemas/$Workspace.d.ts +19 -0
  231. package/gen/schemas/$Workspace.js +22 -0
  232. package/gen/schemas/$WorkspaceInvite.d.ts +16 -0
  233. package/gen/schemas/$WorkspaceInvite.js +19 -0
  234. package/gen/services/FlowService.d.ts +30 -16
  235. package/gen/services/FlowService.js +25 -0
  236. package/gen/services/JobService.d.ts +1 -1
  237. package/gen/services/ScriptService.d.ts +13 -8
  238. package/gen/services/WorkspaceService.d.ts +1 -1
  239. package/gen/services/WorkspaceService.js +1 -1
  240. package/infer.js +8 -1
  241. package/package.json +87 -15
  242. package/script_helpers.d.ts +1 -1
  243. package/script_helpers.js +7 -6
  244. package/sql.d.ts +89 -0
  245. package/sql.js +817 -0
  246. package/stores.d.ts +1 -1
  247. package/stores.js +0 -6
  248. package/utils.d.ts +26 -6
  249. package/utils.js +94 -7
  250. package/components/RadioButtonV2.svelte +0 -38
  251. package/components/RadioButtonV2.svelte.d.ts +0 -20
@@ -16,8 +16,7 @@ let pathError = '';
16
16
  let step = 1;
17
17
  let resourceToEdit;
18
18
  let description = '';
19
- let DESCRIPTION_PLACEHOLDER = `You can use markdown to style your description.
20
- A good way to make resources user friendly is to link to a default script for your resource [example](scripts/add?template=f2d1dc8df796d9e8)`;
19
+ let DESCRIPTION_PLACEHOLDER = `You can use markdown to style your description`;
21
20
  let selectedResourceType;
22
21
  let resourceType;
23
22
  let resourceSchema;
@@ -28,8 +27,7 @@ let itemPicker;
28
27
  let variableEditor;
29
28
  let modal;
30
29
  const dispatch = createEventDispatcher();
31
- export async function initNew() {
32
- selectedResourceType = undefined;
30
+ export async function initNew(rt) {
33
31
  step = 1;
34
32
  args = {};
35
33
  path = '';
@@ -37,6 +35,7 @@ export async function initNew() {
37
35
  initialPath = '';
38
36
  resourceSchema = emptySchema();
39
37
  resourceToEdit = undefined;
38
+ selectedResourceType = rt;
40
39
  modal.openModal();
41
40
  }
42
41
  export async function initEdit(p) {
@@ -118,7 +117,7 @@ $: isValid = allTrue(inputCheck) ?? false;
118
117
  namePlaceholder="my/resource"
119
118
  kind="resource"
120
119
  >
121
- <div slot="ownerToolkit" class="text-gray-700 text-2xs">
120
+ <div slot="ownerToolkit">
122
121
  Resource permissions depend on their path. Select the group <span class="font-mono"
123
122
  >all</span
124
123
  >
@@ -136,7 +135,7 @@ $: isValid = allTrue(inputCheck) ?? false;
136
135
  minRows={3}
137
136
  />
138
137
  <div>
139
- <div class="mb-1 font-semibold text-gray-700">
138
+ <div class="mb-2 font-semibold text-gray-700">
140
139
  Resource type<Required required={true} />
141
140
  </div>
142
141
  <ResourceTypePicker
@@ -1,7 +1,7 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
2
  declare const __propDef: {
3
3
  props: {
4
- initNew?: (() => Promise<void>) | undefined;
4
+ initNew?: ((rt?: string) => Promise<void>) | undefined;
5
5
  initEdit?: ((p: string) => Promise<void>) | undefined;
6
6
  };
7
7
  events: {
@@ -16,7 +16,7 @@ export declare type ResourceEditorProps = typeof __propDef.props;
16
16
  export declare type ResourceEditorEvents = typeof __propDef.events;
17
17
  export declare type ResourceEditorSlots = typeof __propDef.slots;
18
18
  export default class ResourceEditor extends SvelteComponentTyped<ResourceEditorProps, ResourceEditorEvents, ResourceEditorSlots> {
19
- get initNew(): () => Promise<void>;
19
+ get initNew(): (rt?: string | undefined) => Promise<void>;
20
20
  get initEdit(): (p: string) => Promise<void>;
21
21
  }
22
22
  export {};
@@ -1,21 +1,44 @@
1
1
  <script>import { ResourceService } from '../gen';
2
2
  import { workspaceStore } from '../stores';
3
+ import { createEventDispatcher } from 'svelte';
4
+ import ResourceEditor from './ResourceEditor.svelte';
5
+ const dispatch = createEventDispatcher();
3
6
  let resources = [];
4
- export let value = undefined;
7
+ export let initialValue = undefined;
8
+ export let value = initialValue;
5
9
  export let resourceType = undefined;
10
+ let resourceEditor;
6
11
  async function loadResources(resourceType) {
12
+ const v = value;
7
13
  resources = await ResourceService.listResource({ workspace: $workspaceStore, resourceType });
14
+ value = v;
8
15
  }
9
16
  $: {
10
17
  if ($workspaceStore) {
11
18
  loadResources(resourceType);
12
19
  }
13
20
  }
21
+ $: dispatch('change', value);
14
22
  </script>
15
23
 
16
- <select class="mt-1" bind:value placeholder="Pick a resource {resourceType}">
24
+ <ResourceEditor bind:this={resourceEditor} on:refresh={() => loadResources(resourceType)} />
25
+ <select bind:value placeholder="Pick a resource {resourceType}">
17
26
  <option value={undefined} />
18
27
  {#each resources as r}
19
28
  <option value={r.path}>{r.path}{r.description ? ' | ' + r.description : ''}</option>
20
29
  {/each}
21
30
  </select>
31
+ <div class="flex flex-row gap-4">
32
+ <a class="text-xs hover:underline" target="_blank" href="/resources?connect_app={resourceType}"
33
+ >Connect the app {resourceType} to an account (if available)</a
34
+ >
35
+ <button
36
+ class="text-xs text-blue-500"
37
+ type="button"
38
+ on:click={() => {
39
+ resourceEditor.initNew(resourceType)
40
+ }}
41
+ >
42
+ + Create a new {resourceType} resource manually
43
+ </button>
44
+ </div>
@@ -1,10 +1,13 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
2
  declare const __propDef: {
3
3
  props: {
4
+ initialValue?: string | undefined;
4
5
  value?: string | undefined;
5
6
  resourceType?: string | undefined;
6
7
  };
7
8
  events: {
9
+ change: CustomEvent<any>;
10
+ } & {
8
11
  [evt: string]: CustomEvent<any>;
9
12
  };
10
13
  slots: {};
@@ -5,6 +5,7 @@ import IconedResourceType from './IconedResourceType.svelte';
5
5
  let resources = [];
6
6
  export let value;
7
7
  export let notPickable = false;
8
+ export let nonePickable = false;
8
9
  async function loadResources() {
9
10
  resources = await ResourceService.listResourceTypeNames({ workspace: $workspaceStore });
10
11
  }
@@ -17,9 +18,24 @@ $: {
17
18
  </script>
18
19
 
19
20
  <div class="grid sm:grid-cols-2 md:grid-cols-3 gap-x-2 gap-y-1 items-center mb-2">
21
+ {#if nonePickable}
22
+ <button
23
+ class="px-4 h-8 text-center {undefined == value
24
+ ? 'item-button-selected'
25
+ : notPickable
26
+ ? 'item-button-disabled'
27
+ : 'item-button'}"
28
+ on:click={() => {
29
+ value = undefined
30
+ dispatch('click')
31
+ }}
32
+ >
33
+ None
34
+ </button>
35
+ {/if}
20
36
  {#each resources as r}
21
37
  <button
22
- class="px-4 h-8 {r == value
38
+ class="px-4 h-8 text-center {r == value
23
39
  ? 'item-button-selected'
24
40
  : notPickable
25
41
  ? 'item-button-disabled'
@@ -35,34 +51,6 @@ $: {
35
51
  </div>
36
52
 
37
53
  <style>
38
- .item-button {
39
- padding-top: 0.25rem;
40
- padding-bottom: 0.25rem;
41
- border-width: 1px;
42
- border-radius: 0.125rem
43
- }
44
- .item-button-selected {
45
- padding-top: 0.25rem;
46
- padding-bottom: 0.25rem;
47
- border-width: 1px;
48
- --tw-border-opacity: 1;
49
- border-color: rgb(59 130 246 / var(--tw-border-opacity));
50
- --tw-bg-opacity: 1;
51
- background-color: rgb(239 246 255 / var(--tw-bg-opacity));
52
- border-radius: 0.125rem
53
- }
54
-
55
- .item-button-disabled {
56
- padding-top: 0.25rem;
57
- padding-bottom: 0.25rem;
58
- border-width: 1px;
59
- --tw-bg-opacity: 1;
60
- background-color: rgb(243 244 246 / var(--tw-bg-opacity));
61
- --tw-text-opacity: 1;
62
- color: rgb(209 213 219 / var(--tw-text-opacity));
63
- border-radius: 0.125rem
64
- }
65
-
66
54
  .selected:hover {
67
55
  border-radius: 0.375rem;
68
56
  border-width: 1px;
@@ -3,6 +3,7 @@ declare const __propDef: {
3
3
  props: {
4
4
  value: string | undefined;
5
5
  notPickable?: boolean | undefined;
6
+ nonePickable?: boolean | undefined;
6
7
  };
7
8
  events: {
8
9
  click: CustomEvent<any>;
@@ -1,11 +1,11 @@
1
1
  <script>import { page } from '$app/stores';
2
- import { getToday } from '../utils';
2
+ import { decodeState, getToday } from '../utils';
3
3
  import { slide } from 'svelte/transition';
4
4
  import { faChevronDown, faChevronUp } from '@fortawesome/free-solid-svg-icons';
5
5
  import Icon from 'svelte-awesome';
6
- import Tooltip from './Tooltip.svelte';
7
6
  import SvelteMarkdown from 'svelte-markdown';
8
7
  import SchemaForm from './SchemaForm.svelte';
8
+ import Tooltip from './Tooltip.svelte';
9
9
  export let runnable;
10
10
  export let runAction;
11
11
  export let buttonText = 'Run';
@@ -15,7 +15,7 @@ export let args = {};
15
15
  let isValid = true;
16
16
  let queryArgs = $page.url.searchParams.get('args');
17
17
  if (queryArgs) {
18
- const parsed = JSON.parse(atob(queryArgs));
18
+ const parsed = decodeState(queryArgs);
19
19
  Object.entries(parsed).forEach(([k, v]) => {
20
20
  if (v == '<function call>') {
21
21
  parsed[k] = undefined;
@@ -52,17 +52,16 @@ let scheduledForStr;
52
52
  {#if runnable?.schema}
53
53
  {#if detailed}
54
54
  <h2>
55
- Arguments<Tooltip class="px-2 mb-6"
56
- >Optioal fields, if left blank, will use the placeholder value as default.</Tooltip
57
- >
55
+ Arguments
56
+ <Tooltip>
57
+ The optional fields, if left blank, will use the placeholder value as default.
58
+ </Tooltip>
58
59
  </h2>
59
60
  {/if}
60
61
  {#if !runnable.schema.properties || Object.keys(runnable.schema.properties).length === 0}
61
- <div class="text-sm">No arguments</div>
62
+ <div class="text-sm p-4">No arguments</div>
62
63
  {:else}
63
- <div
64
- class="bg-gray-50 border border shadow-md shadow-blue-100 shadow-inner rounded border-gray-300 p-6"
65
- >
64
+ <div class="bg-gray-50 border shadow-blue-100 shadow-inner rounded border-gray-300 p-6">
66
65
  <SchemaForm schema={runnable.schema} bind:isValid bind:args />
67
66
  </div>
68
67
  {/if}
@@ -89,8 +88,10 @@ let scheduledForStr;
89
88
  class="default-button-secondary mx-2 mb-1"
90
89
  on:click={() => {
91
90
  scheduledForStr = undefined
92
- }}>clear</button
91
+ }}
93
92
  >
93
+ Clear
94
+ </button>
94
95
  </div>
95
96
  </div>
96
97
  </div>
@@ -105,10 +106,8 @@ let scheduledForStr;
105
106
  >
106
107
  {#if schedulable}
107
108
  <div>
108
- schedule to run later <Icon
109
- data={viewOptions ? faChevronUp : faChevronDown}
110
- scale={0.5}
111
- />
109
+ Schedule to run later
110
+ <Icon data={viewOptions ? faChevronUp : faChevronDown} scale={0.5} />
112
111
  </div>
113
112
  {/if}
114
113
  </button>
@@ -1,5 +1,5 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
- import type { Script, Flow } from '../gen';
2
+ import type { Flow, Script } from '../gen';
3
3
  declare const __propDef: {
4
4
  props: {
5
5
  runnable: Script | Flow | undefined;
@@ -1,8 +1,15 @@
1
- <script>import SchemaModal, { DEFAULT_PROPERTY, modalToSchema, schemaToModal } from './SchemaModal.svelte';
1
+ <script>import { emptySchema, sendUserToast } from '../utils';
2
+ import { faPen, faPlus, faTrash } from '@fortawesome/free-solid-svg-icons';
3
+ import { Button } from 'flowbite-svelte';
4
+ import { createEventDispatcher } from 'svelte';
5
+ import Icon from 'svelte-awesome';
2
6
  import Editor from './Editor.svelte';
3
- import { emptySchema, sendUserToast } from '../utils';
4
- import Tooltip from './Tooltip.svelte';
7
+ import SchemaEditorProperty from './SchemaEditorProperty.svelte';
8
+ import SchemaModal, { DEFAULT_PROPERTY, schemaToModal } from './SchemaModal.svelte';
5
9
  import TableCustom from './TableCustom.svelte';
10
+ import Toggle from './Toggle.svelte';
11
+ import Tooltip from './Tooltip.svelte';
12
+ const dispatch = createEventDispatcher();
6
13
  export let schema = emptySchema();
7
14
  let schemaModal;
8
15
  let schemaString = '';
@@ -28,6 +35,18 @@ export function getSchema() {
28
35
  throw Error(`Error: input is not a valid schema: ${err}`);
29
36
  }
30
37
  }
38
+ function modalToSchema(schema) {
39
+ return {
40
+ type: schema.selectedType,
41
+ description: schema.description,
42
+ pattern: schema.pattern,
43
+ default: schema.default,
44
+ enum: schema.enum_,
45
+ items: schema.items,
46
+ contentEncoding: schema.contentEncoding,
47
+ format: schema.format
48
+ };
49
+ }
31
50
  function handleAddOrEditArgument() {
32
51
  // If editing the arg's name, oldName containing the old argument name must be provided
33
52
  argError = '';
@@ -58,14 +77,15 @@ function handleAddOrEditArgument() {
58
77
  }
59
78
  schema = schema;
60
79
  schemaString = JSON.stringify(schema, null, '\t');
80
+ dispatch('change', schema);
61
81
  }
62
82
  function startEditArgument(argName) {
63
83
  argError = '';
64
84
  if (Object.keys(schema.properties).includes(argName)) {
65
- schemaModal.openModal();
66
85
  editing = true;
67
86
  modalProperty = schemaToModal(schema.properties[argName], argName, schema.required.includes(argName));
68
87
  oldArgName = argName;
88
+ schemaModal.openModal();
69
89
  }
70
90
  else {
71
91
  sendUserToast(`This argument does not exist and can't be edited`, true);
@@ -75,8 +95,13 @@ function handleDeleteArgument(argName) {
75
95
  try {
76
96
  if (Object.keys(schema.properties).includes(argName)) {
77
97
  delete schema.properties[argName];
98
+ const requiredIndex = schema.required.findIndex((arg) => arg === argName);
99
+ if (requiredIndex > -1) {
100
+ schema.required = schema.required.slice(requiredIndex, 1);
101
+ }
78
102
  schema = schema;
79
103
  schemaString = JSON.stringify(schema, null, '\t');
104
+ dispatch('change', schema);
80
105
  }
81
106
  else {
82
107
  throw Error('Argument not found!');
@@ -101,93 +126,84 @@ function switchTab() {
101
126
  </script>
102
127
 
103
128
  <div class="flex flex-col">
104
- <div class="w-full">
105
- <div class="flex flex-row text-base">
106
- <button
107
- class="text-xs sm:text-base py-1 px-6 block hover:text-blue-500 focus:outline-noneborder-gray-200 {viewJsonSchema
108
- ? 'text-gray-500 '
109
- : 'text-gray-700 font-semibold '}"
110
- on:click={() => (viewJsonSchema ? switchTab() : null)}
111
- >
112
- arguments
113
- </button><button
114
- class="py-1 px-6 block hover:text-blue-500 focus:outline-none border-gray-200 {viewJsonSchema
115
- ? 'text-gray-700 font-semibold '
116
- : 'text-gray-500'}"
117
- on:click={() => (viewJsonSchema ? null : switchTab())}
118
- >
119
- advanced <Tooltip
120
- >Arguments can be edited either using the wizard, or by editing their json-schema <a
121
- href="https://docs.windmill.dev/docs/reference/script_arguments_reference">docs</a
122
- ></Tooltip
123
- >
124
- </button>
125
- <button
126
- class="default-button-secondary grow"
127
- on:click={() => {
128
- modalProperty = Object.assign({}, DEFAULT_PROPERTY)
129
- schemaModal.openModal()
130
- }}>Add argument</button
131
- >
129
+ <div class="flex justify-between">
130
+ <Button
131
+ on:click={() => {
132
+ modalProperty = Object.assign({}, DEFAULT_PROPERTY)
133
+ schemaModal.openModal()
134
+ }}
135
+ class="blue-button"
136
+ >
137
+ <Icon data={faPlus} class="mr-1" />
138
+ Add argument
139
+ </Button>
140
+
141
+ <div class="flex items-center">
142
+ <Toggle
143
+ on:change={() => switchTab()}
144
+ options={{
145
+ right: 'Json Schema Editor'
146
+ }}
147
+ />
148
+ <div class="ml-2">
149
+ <Tooltip>
150
+ Arguments can be edited either using the wizard, or by editing their json-schema
151
+ <a href="https://docs.windmill.dev/docs/reference/script_arguments_reference">docs</a>
152
+ </Tooltip>
153
+ </div>
132
154
  </div>
133
155
  </div>
156
+
134
157
  <!--json schema or table view-->
135
- <div class="border-t py-1 h-full overflow-y-auto">
158
+ <div class="h-full overflow-y-auto">
136
159
  {#if !viewJsonSchema}
137
160
  <div class="h-full">
138
161
  {#if schema.properties && Object.keys(schema.properties).length > 0 && schema.required}
139
- <TableCustom class="w-full min-h-full">
140
- <tr slot="header-row" class="underline">
141
- <th>name</th>
142
- <th>type</th>
143
- <th>description</th>
144
- <th>default</th>
145
- <th>required</th>
162
+ <TableCustom>
163
+ <tr slot="header-row">
164
+ <th>Name</th>
165
+ <th>Type</th>
166
+ <th>Description</th>
167
+ <th>Default</th>
168
+ <th>Required</th>
169
+ <th />
146
170
  </tr>
147
171
  <tbody slot="body">
148
172
  {#each Object.entries(schema.properties) as [name, property] (name)}
149
173
  <tr>
150
- <td>{name}</td>
151
- <td
152
- >{#if !property.type} any {:else} {property.type} {/if}</td
153
- >
174
+ <td class="font-bold">{name}</td>
175
+ <td>
176
+ <SchemaEditorProperty {property} />
177
+ </td>
154
178
  <td>{property.description}</td>
155
179
  <td>{JSON.stringify(property.default) ?? ''}</td>
156
- <td>{schema.required.includes(name) ? 'required' : 'optional'}</td>
157
- <td class="">
158
- <button class="mr-2" on:click={() => handleDeleteArgument(name)}
159
- ><svg
160
- class="w-4 h-4"
161
- fill="none"
162
- stroke="currentColor"
163
- viewBox="0 0 24 14"
164
- xmlns="http://www.w3.org/2000/svg"
165
- >
166
- <path
167
- stroke-linecap="round"
168
- stroke-linejoin="round"
169
- stroke-width="2"
170
- d="M6 18L18 6M6 6l12 12"
171
- />
172
- </svg></button
180
+ <td>{schema.required.includes(name) ? 'Required' : 'Optional'}</td>
181
+ <td class="justify-end flex">
182
+ <Button
183
+ color="red"
184
+ outline
185
+ class="mr-2"
186
+ size="xs"
187
+ on:click={() => handleDeleteArgument(name)}
173
188
  >
174
- <button
175
- class="default-button-secondary text-xs inline-flex"
176
- on:click={() => {
177
- startEditArgument(name)
178
- }}>edit</button
179
- ></td
180
- >
189
+ <Icon data={faTrash} class="mr-2" scale={0.8} />
190
+ Delete
191
+ </Button>
192
+ <Button color="alternative" size="xs" on:click={() => startEditArgument(name)}>
193
+ <Icon data={faPen} class="mr-2" scale={0.8} />
194
+ Edit
195
+ </Button>
196
+ </td>
181
197
  </tr>
182
198
  {/each}
183
199
  </tbody>
184
200
  </TableCustom>
185
201
  {:else}
186
- <div class="text-gray-700 text-xs italic">This script has no argument</div>
202
+ <div class="text-gray-700 text-xs italic mt-2">This schema has no arguments.</div>
187
203
  {/if}
188
204
  </div>
189
205
  {:else}
190
- <div>
206
+ <div class="border rounded mt-4 p-2">
191
207
  <Editor
192
208
  on:change={() => {
193
209
  try {
@@ -197,7 +213,7 @@ function switchTab() {
197
213
  }
198
214
  }}
199
215
  bind:code={schemaString}
200
- lang={'json'}
216
+ lang="json"
201
217
  class="small-editor"
202
218
  />
203
219
  </div>
@@ -6,6 +6,8 @@ declare const __propDef: {
6
6
  getSchema?: (() => Schema) | undefined;
7
7
  };
8
8
  events: {
9
+ change: CustomEvent<any>;
10
+ } & {
9
11
  [evt: string]: CustomEvent<any>;
10
12
  };
11
13
  slots: {};
@@ -0,0 +1,11 @@
1
+ <script>import { Badge } from 'flowbite-svelte';
2
+ export let property;
3
+ </script>
4
+
5
+ <Badge color="blue">{property.type?.toUpperCase() ?? 'ANY'}</Badge>
6
+ {#if property.format}
7
+ <Badge color="green">{property.format?.toUpperCase()}</Badge>
8
+ {/if}
9
+ {#if property.contentEncoding}
10
+ <Badge color="indigo">{property.contentEncoding?.toUpperCase()}</Badge>
11
+ {/if}
@@ -0,0 +1,17 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type { SchemaProperty } from '../common';
3
+ declare const __propDef: {
4
+ props: {
5
+ property: SchemaProperty;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {};
11
+ };
12
+ export declare type SchemaEditorPropertyProps = typeof __propDef.props;
13
+ export declare type SchemaEditorPropertyEvents = typeof __propDef.events;
14
+ export declare type SchemaEditorPropertySlots = typeof __propDef.slots;
15
+ export default class SchemaEditorProperty extends SvelteComponentTyped<SchemaEditorPropertyProps, SchemaEditorPropertyEvents, SchemaEditorPropertySlots> {
16
+ }
17
+ export {};