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
@@ -1,26 +1,22 @@
1
- <script>import { JobService, Job, CompletedJob, VariableService, ResourceService, ScriptService } from '../gen';
2
- import { sendUserToast, emptySchema, displayDate } from '../utils';
3
- import { fade } from 'svelte/transition';
4
- import Icon from 'svelte-awesome';
5
- import { faCheck, faChevronDown, faChevronUp, faExclamationTriangle, faMagic, faSearch, faSpinner, faTimes } from '@fortawesome/free-solid-svg-icons';
6
- import Editor from './Editor.svelte';
7
- import Tooltip from './Tooltip.svelte';
8
- import { onDestroy, onMount } from 'svelte';
1
+ <script>import { CompletedJob, Job, JobService } from '../gen';
9
2
  import { userStore, workspaceStore } from '../stores';
10
- import TableCustom from './TableCustom.svelte';
3
+ import { displayDate, emptySchema } from '../utils';
4
+ import { faCheck, faChevronDown, faChevronUp, faExclamationTriangle, faSpinner, faTimes } from '@fortawesome/free-solid-svg-icons';
5
+ import { onDestroy, onMount } from 'svelte';
6
+ import Icon from 'svelte-awesome';
11
7
  import { check } from 'svelte-awesome/icons';
8
+ import { fade } from 'svelte/transition';
9
+ import Editor from './Editor.svelte';
12
10
  import Modal from './Modal.svelte';
11
+ import TableCustom from './TableCustom.svelte';
12
+ import Tooltip from './Tooltip.svelte';
13
+ import { inferArgs } from '../infer';
13
14
  import { Highlight } from 'svelte-highlight';
14
15
  import { json, python, typescript } from 'svelte-highlight/languages';
15
- import github from 'svelte-highlight/styles/github';
16
- import ItemPicker from './ItemPicker.svelte';
17
- import VariableEditor from './VariableEditor.svelte';
18
- import ResourceEditor from './ResourceEditor.svelte';
19
- import { inferArgs } from '../infer';
20
- // @ts-ignore
21
16
  import { VSplitPane } from 'svelte-split-pane';
22
- import SchemaForm from './SchemaForm.svelte';
23
17
  import DisplayResult from './DisplayResult.svelte';
18
+ import EditorBar from './EditorBar.svelte';
19
+ import SchemaForm from './SchemaForm.svelte';
24
20
  // Exported
25
21
  export let schema = emptySchema();
26
22
  export let code;
@@ -30,6 +26,9 @@ export let lang;
30
26
  export let viewPreview = true;
31
27
  export let previewTab = 'logs';
32
28
  let websocketAlive = { pyright: false, black: false, deno: false };
29
+ let modalViewerTitle = '';
30
+ let modalViewerContent;
31
+ let modalViewerMode = 'logs';
33
32
  // Internal state
34
33
  let editor;
35
34
  // Preview args input
@@ -41,14 +40,6 @@ let previewIntervalId;
41
40
  let previewJob;
42
41
  let pastPreviews = [];
43
42
  let modalViewer;
44
- let modalViewerTitle = '';
45
- let modalViewerContent;
46
- let modalViewerMode = 'logs';
47
- let variablePicker;
48
- let resourcePicker;
49
- let scriptPicker;
50
- let variableEditor;
51
- let resourceEditor;
52
43
  let syncIteration = 0;
53
44
  let ITERATIONS_BEFORE_SLOW_REFRESH = 100;
54
45
  let lastSave;
@@ -56,6 +47,7 @@ $: lastSave = localStorage.getItem(path ?? 'last_save');
56
47
  export function getEditor() {
57
48
  return editor;
58
49
  }
50
+ let div = null;
59
51
  export async function runPreview() {
60
52
  try {
61
53
  if (previewIntervalId) {
@@ -124,6 +116,7 @@ async function loadPreviewJob(id) {
124
116
  previewIsLoading = false;
125
117
  loadPastPreviews();
126
118
  }
119
+ div?.scroll({ top: div?.scrollHeight, behavior: 'smooth' });
127
120
  }
128
121
  catch (err) {
129
122
  console.error(err);
@@ -158,20 +151,6 @@ function syncer(id) {
158
151
  loadPreviewJob(id);
159
152
  }
160
153
  }
161
- async function loadVariables() {
162
- let r = [];
163
- const variables = (await VariableService.listVariable({ workspace: $workspaceStore ?? 'NO_W' })).map((x) => {
164
- return { name: x.path, ...x };
165
- });
166
- const rvariables = await VariableService.listContextualVariables({
167
- workspace: $workspaceStore ?? 'NO_W'
168
- });
169
- r = r.concat(variables).concat(rvariables);
170
- return r;
171
- }
172
- async function loadScripts() {
173
- return await ScriptService.listScripts({ workspace: $workspaceStore ?? 'NO_W' });
174
- }
175
154
  let syncCode;
176
155
  onMount(() => {
177
156
  syncCode = setInterval(() => {
@@ -194,29 +173,6 @@ onDestroy(() => {
194
173
  });
195
174
  </script>
196
175
 
197
- <svelte:head>
198
- {@html github}
199
- </svelte:head>
200
-
201
- <ItemPicker
202
- bind:this={scriptPicker}
203
- pickCallback={async (path, _) => {
204
- modalViewerMode = 'code'
205
- modalViewerTitle = 'Script ' + path
206
- modalViewerContent = (
207
- await ScriptService.getScriptByPath({
208
- workspace: $workspaceStore ?? '',
209
- path
210
- })
211
- ).content
212
- modalViewer.openModal()
213
- }}
214
- closeOnClick={false}
215
- itemName="script"
216
- extraField="summary"
217
- loadItems={loadScripts}
218
- />
219
-
220
176
  <Modal bind:this={modalViewer}>
221
177
  <div slot="title">{modalViewerTitle}</div>
222
178
  <div slot="content">
@@ -236,101 +192,7 @@ onDestroy(() => {
236
192
  </div></Modal
237
193
  >
238
194
 
239
- <ItemPicker
240
- bind:this={variablePicker}
241
- pickCallback={(path, name) => {
242
- if (!path) {
243
- if (lang == 'deno') {
244
- getEditor().insertAtCursor(`Deno.env.get('${name}')`)
245
- } else {
246
- if (!getEditor().getCode().includes('import os')) {
247
- getEditor().insertAtBeginning('import os\n')
248
- }
249
- getEditor().insertAtCursor(`os.environ.get("${name}")`)
250
- }
251
- sendUserToast(`${name} inserted at cursor`)
252
- } else {
253
- if (lang == 'deno') {
254
- if (!getEditor().getCode().includes('import * as wmill from')) {
255
- getEditor().insertAtBeginning(
256
- `import * as wmill from 'https://deno.land/x/windmill@v${__pkg__.version}/index.ts'\n`
257
- )
258
- }
259
- getEditor().insertAtCursor(`(await wmill.getVariable('${path}'))`)
260
- } else {
261
- if (!getEditor().getCode().includes('import wmill')) {
262
- getEditor().insertAtBeginning('import wmill\n')
263
- }
264
- getEditor().insertAtCursor(`wmill.get_variable("${path}")`)
265
- }
266
- sendUserToast(`${name} inserted at cursor`)
267
- }
268
- }}
269
- itemName="Variable"
270
- extraField="name"
271
- loadItems={loadVariables}
272
- >
273
- <div slot="submission" class="flex flex-row">
274
- <div class="text-xs mr-2 align-middle">
275
- The variable you were looking for does not exist yet?
276
- </div>
277
- <button
278
- class="default-button-secondary"
279
- type="button"
280
- on:click={() => {
281
- variableEditor.initNew()
282
- }}
283
- >
284
- Create a new variable
285
- </button>
286
- </div>
287
- </ItemPicker>
288
-
289
- <ItemPicker
290
- bind:this={resourcePicker}
291
- pickCallback={(path, _) => {
292
- if (lang == 'deno') {
293
- if (!getEditor().getCode().includes('import * as wmill from')) {
294
- getEditor().insertAtBeginning(
295
- `import * as wmill from 'https://deno.land/x/windmill@v${__pkg__.version}/index.ts'\n`
296
- )
297
- }
298
- getEditor().insertAtCursor(`(await wmill.getResource('${path}'))`)
299
- } else {
300
- if (!getEditor().getCode().includes('import wmill')) {
301
- getEditor().insertAtBeginning('import wmill\n')
302
- }
303
- getEditor().insertAtCursor(`wmill.get_resource("${path}")`)
304
- }
305
- sendUserToast(`${path} inserted at cursor`)
306
- }}
307
- itemName="Resource"
308
- extraField="resource_type"
309
- loadItems={async () =>
310
- await ResourceService.listResource({ workspace: $workspaceStore ?? 'NO_W' })}
311
- >
312
- <div slot="submission" class="flex flex-row">
313
- <div class="text-xs mr-2 align-middle">
314
- The resource you were looking for does not exist yet?
315
- </div>
316
- <button
317
- class="default-button-secondary"
318
- type="button"
319
- on:click={() => {
320
- resourceEditor.initNew()
321
- }}
322
- >
323
- Create a new resource
324
- </button>
325
- </div>
326
- </ItemPicker>
327
-
328
- <ResourceEditor bind:this={resourceEditor} on:refresh={resourcePicker.openModal} />
329
-
330
- <VariableEditor bind:this={variableEditor} on:create={variablePicker.openModal} />
331
-
332
195
  <VSplitPane
333
- class="h-full"
334
196
  topPanelSize={viewPreview ? '75%' : '90%'}
335
197
  downPanelSize={viewPreview ? '25%' : '10%'}
336
198
  updateCallback={() => {
@@ -342,48 +204,9 @@ onDestroy(() => {
342
204
  <top slot="top">
343
205
  <div class="flex flex-col h-full">
344
206
  <div class="header">
345
- <div class="flex flex-row justify-around w-full">
346
- <button
347
- class="default-button-secondary font-semibold py-px mr-2 text-xs align-middle max-h-8"
348
- on:click|stopPropagation={() => {
349
- variablePicker.openModal()
350
- }}
351
- >Variable picker <Icon data={faSearch} scale={0.7} />
352
- </button>
353
-
354
- <button
355
- class="default-button-secondary font-semibold py-px text-xs mr-2 align-middle max-h-8"
356
- on:click|stopPropagation={() => {
357
- resourcePicker.openModal()
358
- }}
359
- >Resource picker <Icon data={faSearch} scale={0.7} />
360
- </button>
361
- <button
362
- class="default-button-secondary font-semibold py-px text-xs mr-2 align-middle max-h-8"
363
- on:click|stopPropagation={() => {
364
- scriptPicker.openModal()
365
- }}
366
- >Script explorer <Icon data={faSearch} scale={0.7} />
367
- </button>
368
-
369
- <button
370
- class="default-button-secondary py-px max-h-8 text-xs"
371
- on:click|stopPropagation={() => {
372
- editor.reloadWebsocket()
373
- }}
374
- >
375
- Reload assistants (status: {#if lang == 'deno'}<span
376
- class={websocketAlive.deno ? 'text-green-600' : 'text-red-600'}>deno</span
377
- >{:else if lang == 'python3'}<span
378
- class={websocketAlive.pyright ? 'text-green-600' : 'text-red-600'}>pyright</span
379
- >
380
- <span class={websocketAlive.black ? 'text-green-600' : 'text-red-600'}>
381
- black</span
382
- >{/if})
383
- </button>
384
- </div>
207
+ <EditorBar {editor} {lang} {websocketAlive} />
385
208
  </div>
386
- <div class="flex-1 overflow-hidden">
209
+ <div class="flex-1 overflow-hidden border p-2 rounded">
387
210
  <Editor
388
211
  {code}
389
212
  bind:websocketAlive
@@ -392,9 +215,15 @@ onDestroy(() => {
392
215
  runPreview()
393
216
  viewPreview = true
394
217
  }}
395
- formatAction={() => {
218
+ formatAction={async () => {
396
219
  code = getEditor().getCode()
220
+ await inferSchema()
397
221
  localStorage.setItem(path ?? 'last_save', code)
222
+ lastSave = code
223
+ }}
224
+ on:blur={() => {
225
+ code = getEditor().getCode()
226
+ inferSchema()
398
227
  }}
399
228
  class="h-full"
400
229
  deno={lang == 'deno'}
@@ -411,8 +240,8 @@ onDestroy(() => {
411
240
  viewPreview = !viewPreview
412
241
  }}
413
242
  >
414
- <div class="flex flex-row items-baseline">
415
- <div class="font-base py-0 mr-6">
243
+ <div class="flex flex-row flex-wrap items-baseline">
244
+ <div class="font-base py-0 mr-6 hidden md:block">
416
245
  Preview <Tooltip
417
246
  ><span class="font-normal"
418
247
  >Test your script by running a preview, passing inputs as if you were a user</span
@@ -499,7 +328,7 @@ onDestroy(() => {
499
328
  }}
500
329
  >Run preview
501
330
  </button>
502
- <div class="text-xs text-gray-700 min-w-max mx-2">
331
+ <div class="text-xs text-gray-700 min-w-max hidden md:block mx-2">
503
332
  Shortcuts: <Tooltip>
504
333
  Cmd/Ctrl+S: autoformat code and overwrite local save <br />
505
334
  Cmd/Ctrl+Enter: run preview</Tooltip
@@ -508,7 +337,7 @@ onDestroy(() => {
508
337
  </div>
509
338
  </div>
510
339
  </div>
511
- <div class="preview flex-1 overflow-hidden p-3">
340
+ <div bind:this={div} class="preview flex-1 p-3">
512
341
  {#if previewTab === 'logs'}
513
342
  <pre
514
343
  class="break-all relative h-full mx-2">{#if previewJob && previewJob.logs}{previewJob.logs}
@@ -516,21 +345,20 @@ onDestroy(() => {
516
345
  {:else}No preview is available yet{/if}
517
346
  </pre>
518
347
  {:else if previewTab === 'input'}
519
- <div class="break-all relative h-full font-sans">
520
- <div class="p-2 w-full">
521
- <button class="default-button w-full mb-4" on:click|stopPropagation={inferSchema}
522
- ><Icon data={faMagic} scale={0.7} /><span class="pl-1"
523
- >Infer schema from main parameters</span
524
- >
525
- </button>
526
- </div>
527
- <div class="flex flex-row items-baseline text-2xs text-gray-700 p-2 ml-8 italic">
528
- {#if isValid}
529
- <Icon data={faCheck} class="text-green-600 mr-1" scale={0.6} /> The current preview input
530
- matches requirements defined in arguments
531
- {:else}
532
- <Icon data={faExclamationTriangle} class="text-yellow-500 mr-1" scale={0.6} />The
533
- current preview input doesn't match requirements defined in arguments. Are you sure?{/if}
348
+ <div class="break-all relative h-full font-sans -mt-2">
349
+ <div class="items-baseline text-xs text-gray-700 px-2 ml-8 italic hidden md:block">
350
+ <p>
351
+ Move the focus outside of the text editor to recompute the input schema from main
352
+ signature or press Ctrl/Cmd+S
353
+ </p>
354
+ <p class="">
355
+ {#if isValid}
356
+ <Icon data={faCheck} class="text-green-600 mr-1" scale={0.6} /> The current preview input
357
+ matches requirements defined in arguments
358
+ {:else}
359
+ <Icon data={faExclamationTriangle} class="text-yellow-500 mr-1" scale={0.6} />The
360
+ current preview input doesn't match requirements defined in arguments{/if}
361
+ </p>
534
362
  </div>
535
363
  <div class="sm:px-8">
536
364
  <SchemaForm {schema} bind:args bind:isValid />
@@ -561,7 +389,7 @@ onDestroy(() => {
561
389
  {:else}No local save{/if}
562
390
  </div>
563
391
  {:else if previewTab === 'history'}
564
- <TableCustom paginated={false}>
392
+ <TableCustom>
565
393
  <tr slot="header-row">
566
394
  <th class="text-xs">id</th>
567
395
  <th class="text-xs">created at</th>
@@ -571,11 +399,11 @@ onDestroy(() => {
571
399
  <th class="text-xs">logs</th>
572
400
  </tr>
573
401
  <tbody slot="body">
574
- {#each pastPreviews as { id, created_at, success, result, logs }}
402
+ {#each pastPreviews as { id, created_at, success, result }}
575
403
  <tr class="">
576
- <td class="text-xs"
577
- ><a class="pr-3" href="/run/{id}" target="_blank">{id.substring(30)}</a></td
578
- >
404
+ <td class="text-xs">
405
+ <a class="pr-3" href="/run/{id}" target="_blank">{id.substring(30)}</a>
406
+ </td>
579
407
  <td class="text-xs">{displayDate(created_at)}</td>
580
408
  <td class="text-xs">
581
409
  {#if success}
@@ -592,9 +420,10 @@ onDestroy(() => {
592
420
  modalViewerContent = result
593
421
  modalViewerMode = 'result'
594
422
  modalViewer.openModal()
595
- }}>{JSON.stringify(result).substring(0, 30)}...</a
596
- ></td
597
- >
423
+ }}
424
+ >{JSON.stringify(result).substring(0, 30)}...
425
+ </a>
426
+ </td>
598
427
  <td class="text-xs"
599
428
  ><a
600
429
  href="#code"
@@ -640,30 +469,29 @@ onDestroy(() => {
640
469
 
641
470
  <style>
642
471
  .header {
643
- max-height: 28px;
644
- border-width: 1px;
645
- padding-left: 0.5rem;
646
- padding-right: 0.5rem;
647
- padding-top: 0.25rem;
648
- padding-bottom: 0.25rem;
649
- border-left-width: 1px;
650
- border-right-width: 1px;
651
- --tw-bg-opacity: 1;
652
- background-color: rgb(243 244 246 / var(--tw-bg-opacity));
653
- font-size: 0.75rem;
654
- line-height: 1rem;
655
- --tw-text-opacity: 1;
656
- color: rgb(55 65 81 / var(--tw-text-opacity));
657
- }
472
+
473
+ padding-top: 0.5rem;
474
+
475
+ padding-bottom: 0.5rem
476
+ }
658
477
 
659
478
  .preview {
660
- border-width: 1px;
661
- overflow: auto;
662
- border-left-width: 1px;
663
- border-right-width: 1px;
664
- --tw-bg-opacity: 1;
665
- background-color: rgb(255 255 255 / var(--tw-bg-opacity));
666
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
667
- font-size: 0.75rem;
668
- line-height: 1rem;
479
+
480
+ border-width: 1px;
481
+
482
+ overflow: auto;
483
+
484
+ border-left-width: 1px;
485
+
486
+ border-right-width: 1px;
487
+
488
+ --tw-bg-opacity: 1;
489
+
490
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity));
491
+
492
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
493
+
494
+ font-size: 0.75rem;
495
+
496
+ line-height: 1rem
669
497
  }</style>
@@ -1,14 +1,15 @@
1
- <script>import { ScriptService, FlowService, Script } from '../gen';
1
+ <script>import { ScriptService, FlowService } from '../gen';
2
2
  import Icon from 'svelte-awesome';
3
3
  import { faSearch } from '@fortawesome/free-solid-svg-icons';
4
4
  import { hubScripts, workspaceStore } from '../stores';
5
5
  import { createEventDispatcher } from 'svelte';
6
6
  import ItemPicker from './ItemPicker.svelte';
7
- import RadioButton from './RadioButton.svelte';
8
7
  import Modal from './Modal.svelte';
9
8
  import { Highlight } from 'svelte-highlight';
10
- import { python, typescript } from 'svelte-highlight/languages';
11
- import github from 'svelte-highlight/styles/github';
9
+ import typescript from 'svelte-highlight/languages/typescript';
10
+ import python from 'svelte-highlight/languages/python';
11
+ import { getScriptByPath } from '../utils';
12
+ import RadioButton from './RadioButton.svelte';
12
13
  export let scriptPath = undefined;
13
14
  export let allowFlow = false;
14
15
  export let allowHub = false;
@@ -23,20 +24,6 @@ let options = [['Script', 'script']];
23
24
  allowHub && options.unshift(['Hub', 'hub']);
24
25
  allowFlow && options.push(['Flow', 'flow']);
25
26
  const dispatch = createEventDispatcher();
26
- async function getScript() {
27
- if (itemKind == 'hub') {
28
- code = await ScriptService.getHubScriptContentByPath({ path: scriptPath });
29
- lang = Script.language.DENO;
30
- }
31
- else {
32
- const script = await ScriptService.getScriptByPath({
33
- workspace: $workspaceStore,
34
- path: scriptPath
35
- });
36
- code = script.content;
37
- lang = script.language;
38
- }
39
- }
40
27
  async function loadItems() {
41
28
  if (itemKind == 'flow') {
42
29
  items = await FlowService.listFlows({ workspace: $workspaceStore });
@@ -55,10 +42,6 @@ $: {
55
42
  }
56
43
  </script>
57
44
 
58
- <svelte:head>
59
- {@html github}
60
- </svelte:head>
61
-
62
45
  <ItemPicker
63
46
  bind:this={itemPicker}
64
47
  pickCallback={(path, _) => {
@@ -74,9 +57,11 @@ $: {
74
57
  />
75
58
 
76
59
  <div class="flex flex-row items-center space-x-5">
77
- {#if options.length > 1}
78
- <RadioButton bind:value={itemKind} {options} />
79
- {/if}
60
+ <div class="w-80">
61
+ {#if options.length > 1}
62
+ <RadioButton bind:value={itemKind} {options} />
63
+ {/if}
64
+ </div>
80
65
 
81
66
  <input type="text" value={scriptPath ?? 'No path chosen yet'} disabled />
82
67
  <button class="default-button text-gray-100" on:click={() => itemPicker.openModal()}
@@ -86,7 +71,9 @@ $: {
86
71
  <button
87
72
  class="text-xs text-blue-500"
88
73
  on:click={async () => {
89
- await getScript()
74
+ const { language, content } = await getScriptByPath(scriptPath ?? '')
75
+ code = content
76
+ lang = language
90
77
  modalViewer.openModal()
91
78
  }}>show code</button
92
79
  >
@@ -4,7 +4,7 @@ declare const __propDef: {
4
4
  scriptPath?: string | undefined;
5
5
  allowFlow?: boolean | undefined;
6
6
  allowHub?: boolean | undefined;
7
- itemKind?: "script" | "flow" | "hub" | undefined;
7
+ itemKind?: "flow" | "script" | "hub" | undefined;
8
8
  isTrigger?: boolean | undefined;
9
9
  };
10
10
  events: {
@@ -3,7 +3,6 @@ import SchemaForm from './SchemaForm.svelte';
3
3
  import Tabs from './Tabs.svelte';
4
4
  import Highlight from 'svelte-highlight';
5
5
  import json from 'svelte-highlight/languages/json';
6
- import github from 'svelte-highlight/styles/github';
7
6
  import SvelteMarkdown from 'svelte-markdown';
8
7
  export let schema;
9
8
  export let summary;
@@ -15,10 +14,6 @@ export function setSchema(newSchema) {
15
14
  }
16
15
  </script>
17
16
 
18
- <svelte:head>
19
- {@html github}
20
- </svelte:head>
21
-
22
17
  <div class="w-full">
23
18
  <PageHeader title="UI customisation" />
24
19
  <Tabs
@@ -86,7 +86,7 @@ async function addAcl(owner, write) {
86
86
  <option>group</option>
87
87
  </select>
88
88
  </label>
89
- <label class="block grow mx-2">
89
+ <label class="block grow mx-2" for="inp">
90
90
  <span class="text-sm text-gray-700">Owner</span>
91
91
  <div class="block mt-1">
92
92
  <div class="static z-50">
@@ -20,13 +20,13 @@ $: {
20
20
  }
21
21
  else {
22
22
  let writeGroup = pgroups.find((x) => extraPermsKeys.includes(x) && extraPerms[x]);
23
- if (pgroups.find((x) => x in extraPermsKeys && extraPerms[x])) {
23
+ if (writeGroup) {
24
24
  kind = 'write';
25
25
  reason = `This item was write shared to the group ${writeGroup} which you are a member of`;
26
26
  }
27
27
  else {
28
- let readGroup = pgroups.find((x) => extraPermsKeys.includes(x) && extraPerms[x]);
29
- if (pgroups.find((x) => extraPermsKeys.includes(x))) {
28
+ let readGroup = pgroups.find((x) => extraPermsKeys.includes(x));
29
+ if (readGroup) {
30
30
  kind = 'read';
31
31
  reason = `This item was read-only shared to the group ${readGroup} which you are a member of`;
32
32
  }
@@ -45,10 +45,12 @@ $: {
45
45
  }
46
46
  </script>
47
47
 
48
- <span>
49
- {#if kind == 'read'}
50
- <Badge tooltip={reason}>shared to you (read-only)</Badge>
51
- {:else if kind == 'write'}
52
- <Badge tooltip={reason}>shared to you</Badge>
53
- {/if}
54
- </span>
48
+ {#if kind == 'read' || kind == 'write'}
49
+ <span class="mr-1">
50
+ {#if kind == 'read'}
51
+ <Badge tooltip={reason}>shared to you (read-only)</Badge>
52
+ {:else if kind == 'write'}
53
+ <Badge tooltip={reason}>shared to you</Badge>
54
+ {/if}
55
+ </span>
56
+ {/if}
@@ -3,6 +3,7 @@ import ResourceTypePicker from './ResourceTypePicker.svelte';
3
3
  export let pattern;
4
4
  export let enum_;
5
5
  export let format;
6
+ export let contentEncoding;
6
7
  let kind = 'none';
7
8
  let patternStr = pattern ?? '';
8
9
  let resource;
@@ -21,13 +22,14 @@ const FORMATS = [
21
22
  $: format =
22
23
  kind == 'resource' ? (resource != undefined ? `resource-${resource}` : 'resource') : undefined;
23
24
  $: pattern = patternStr == '' ? undefined : patternStr;
25
+ $: contentEncoding = kind == 'base64' ? 'base64' : undefined;
24
26
  </script>
25
27
 
26
28
  <RadioButton
27
29
  label="Kind"
28
- small={true}
29
30
  options={[
30
31
  ['None', 'none'],
32
+ ['File (base64)', 'base64'],
31
33
  ['Enum', 'enum'],
32
34
  ['Resource Path', 'resource'],
33
35
  ['Format', 'format'],
@@ -35,12 +37,14 @@ $: pattern = patternStr == '' ? undefined : patternStr;
35
37
  ]}
36
38
  bind:value={kind}
37
39
  />
40
+ <div class="my-2" />
38
41
 
39
42
  {#if kind == 'pattern'}
40
- <label class="mb-2 text-gray-700 text-xs"
43
+ <label for="input" class="mb-2 text-gray-700 text-xs"
41
44
  >Pattern (Regex)
42
45
  <div class="flex flex-row">
43
46
  <input
47
+ id="input"
44
48
  type="text"
45
49
  placeholder="^(\\([0-9]{3}\\))?[0-9]{3}-[0-9]{4}$"
46
50
  bind:value={patternStr}
@@ -54,11 +58,11 @@ $: pattern = patternStr == '' ? undefined : patternStr;
54
58
  </div>
55
59
  </label>
56
60
  {:else if kind == 'enum'}
57
- <label class="mb-2 text-gray-700 text-xs"
61
+ <label for="input" class="mb-2 text-gray-700 text-xs"
58
62
  >Enums
59
63
  {#each enum_ ?? [] as e}
60
64
  <div class="flex flex-row max-w-md">
61
- <input type="text" bind:value={e} />
65
+ <input id="input" type="text" bind:value={e} />
62
66
  <button
63
67
  class="default-button mx-6"
64
68
  on:click={() => {
@@ -4,6 +4,7 @@ declare const __propDef: {
4
4
  pattern: string | undefined;
5
5
  enum_: string[] | undefined;
6
6
  format: string | undefined;
7
+ contentEncoding: 'base64' | 'binary' | undefined;
7
8
  };
8
9
  events: {
9
10
  [evt: string]: CustomEvent<any>;