windmill-components 1.339.2 → 1.352.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 (231) hide show
  1. package/package/assets/app.css +0 -12
  2. package/package/ata/index.js +1 -0
  3. package/package/autosize.js +1 -1
  4. package/package/common.d.ts +6 -2
  5. package/package/common.js +2 -1
  6. package/package/components/AppConnectDrawer.svelte +1 -1
  7. package/package/components/AppConnectInner.svelte +9 -15
  8. package/package/components/ArgEnum.svelte +4 -1
  9. package/package/components/ArgEnum.svelte.d.ts +3 -1
  10. package/package/components/ArgInput.svelte +184 -141
  11. package/package/components/ArgInput.svelte.d.ts +7 -7
  12. package/package/components/ArrayTypeNarrowing.svelte +29 -27
  13. package/package/components/CenteredPage.svelte +2 -2
  14. package/package/components/DefaultTagsInner.svelte +1 -1
  15. package/package/components/Dev.svelte +2 -1
  16. package/package/components/DiffDrawer.svelte +1 -2
  17. package/package/components/DisplayResult.svelte +293 -233
  18. package/package/components/DurationMs.svelte +11 -3
  19. package/package/components/DurationMs.svelte.d.ts +2 -0
  20. package/package/components/EditableSchemaForm.svelte +447 -103
  21. package/package/components/EditableSchemaForm.svelte.d.ts +16 -6
  22. package/package/components/Editor.svelte +3 -1
  23. package/package/components/EditorBar.svelte +2 -2
  24. package/package/components/FlowBuilder.svelte +14 -6
  25. package/package/components/FlowGraphViewer.svelte +1 -1
  26. package/package/components/FlowGraphViewerStep.svelte +37 -9
  27. package/package/components/FlowGraphViewerStep.svelte.d.ts +2 -7
  28. package/package/components/FlowJobResult.svelte +1 -3
  29. package/package/components/FlowMetadata.svelte +1 -1
  30. package/package/components/FlowPreviewContent.svelte +5 -3
  31. package/package/components/FlowStatusViewer.svelte +4 -0
  32. package/package/components/FlowStatusViewer.svelte.d.ts +3 -0
  33. package/package/components/FlowStatusViewerInner.svelte +50 -17
  34. package/package/components/FlowStatusViewerInner.svelte.d.ts +3 -0
  35. package/package/components/FlowTimeline.svelte +13 -0
  36. package/package/components/FlowTimeline.svelte.d.ts +2 -0
  37. package/package/components/FlowViewer.svelte +0 -5
  38. package/package/components/FolderEditor.svelte +25 -0
  39. package/package/components/FolderEditor.svelte.d.ts +2 -0
  40. package/package/components/GroupEditor.svelte +36 -91
  41. package/package/components/GroupInfo.svelte +1 -1
  42. package/package/components/InputTransformForm.svelte +16 -1
  43. package/package/components/InputTransformForm.svelte.d.ts +2 -0
  44. package/package/components/InputTransformSchemaForm.svelte +6 -0
  45. package/package/components/InputTransformSchemaForm.svelte.d.ts +2 -0
  46. package/package/components/InstanceSettings.svelte +36 -3
  47. package/package/components/InstanceSettings.svelte.d.ts +2 -0
  48. package/package/components/JobStatus.svelte +2 -2
  49. package/package/components/LightweightArgInput.svelte +66 -14
  50. package/package/components/LightweightArgInput.svelte.d.ts +3 -2
  51. package/package/components/LightweightSchemaForm.svelte +24 -15
  52. package/package/components/ModulePreviewForm.svelte +1 -0
  53. package/package/components/NumberTypeNarrowing.svelte +71 -44
  54. package/package/components/ObjectResourceInput.svelte +2 -0
  55. package/package/components/ObjectResourceInput.svelte.d.ts +1 -0
  56. package/package/components/ObjectTypeNarrowing.svelte +0 -1
  57. package/package/components/ParqetCsvTableRenderer.svelte +181 -0
  58. package/package/components/ParqetCsvTableRenderer.svelte.d.ts +21 -0
  59. package/package/components/Path.svelte +2 -2
  60. package/package/components/PersistentScriptDrawer.svelte +6 -3
  61. package/package/components/Range.svelte +88 -286
  62. package/package/components/Range.svelte.d.ts +9 -23
  63. package/package/components/ResourceEditor.svelte +138 -141
  64. package/package/components/ResourceEditor.svelte.d.ts +9 -2
  65. package/package/components/ResourceEditorDrawer.svelte +45 -0
  66. package/package/components/ResourceEditorDrawer.svelte.d.ts +21 -0
  67. package/package/components/ResourcePicker.svelte +5 -2
  68. package/package/components/ResourceTypePicker.svelte +88 -36
  69. package/package/components/RunChart.svelte +55 -5
  70. package/package/components/RunChart.svelte.d.ts +1 -0
  71. package/package/components/RunForm.svelte +1 -1
  72. package/package/components/S3FilePicker.svelte +20 -8
  73. package/package/components/S3FilePicker.svelte.d.ts +2 -0
  74. package/package/components/ScheduleEditorInner.svelte +40 -37
  75. package/package/components/SchemaForm.svelte +192 -103
  76. package/package/components/SchemaForm.svelte.d.ts +16 -2
  77. package/package/components/ScriptBuilder.svelte +13 -8
  78. package/package/components/ScriptSchedules.svelte +11 -8
  79. package/package/components/ScriptSchema.svelte +3 -21
  80. package/package/components/ScriptVersionHistory.svelte +1 -1
  81. package/package/components/StringTypeNarrowing.svelte +217 -174
  82. package/package/components/StringTypeNarrowing.svelte.d.ts +5 -1
  83. package/package/components/Toggle.svelte +6 -3
  84. package/package/components/Toggle.svelte.d.ts +1 -0
  85. package/package/components/UserSettings.svelte +24 -1
  86. package/package/components/WorkspaceGroup.svelte +11 -13
  87. package/package/components/apps/components/buttons/AppButton.svelte +2 -0
  88. package/package/components/apps/components/buttons/AppButton.svelte.d.ts +1 -0
  89. package/package/components/apps/components/display/AppFlowStatusComponent.svelte +13 -70
  90. package/package/components/apps/components/display/AppFlowStatusComponent.svelte.d.ts +1 -9
  91. package/package/components/apps/components/display/AppJobIdFlowStatus.svelte +21 -8
  92. package/package/components/apps/components/display/AppJobIdFlowStatus.svelte.d.ts +1 -3
  93. package/package/components/apps/components/display/AppJobIdLogComponent.svelte +19 -7
  94. package/package/components/apps/components/display/AppJobIdLogComponent.svelte.d.ts +1 -3
  95. package/package/components/apps/components/display/AppLogsComponent.svelte +13 -70
  96. package/package/components/apps/components/display/AppLogsComponent.svelte.d.ts +1 -9
  97. package/package/components/apps/components/display/charts/AppAgCharts.svelte +25 -15
  98. package/package/components/apps/components/display/table/AppAggridTableActions.svelte +2 -0
  99. package/package/components/apps/components/display/table/SyncColumnDefs.svelte +1 -1
  100. package/package/components/apps/components/helpers/HiddenComponent.svelte +2 -1
  101. package/package/components/apps/components/helpers/RunnableComponent.svelte +18 -8
  102. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +1 -0
  103. package/package/components/apps/components/helpers/RunnableWrapper.svelte +2 -0
  104. package/package/components/apps/components/helpers/RunnableWrapper.svelte.d.ts +1 -0
  105. package/package/components/apps/components/helpers/eval.js +1 -36
  106. package/package/components/apps/components/inputs/AppFileInput.svelte +3 -1
  107. package/package/components/apps/components/inputs/AppFileInput.svelte.d.ts +1 -0
  108. package/package/components/apps/components/inputs/AppS3FileInput.svelte +3 -1
  109. package/package/components/apps/components/inputs/AppS3FileInput.svelte.d.ts +1 -0
  110. package/package/components/apps/components/layout/AppConditionalWrapper.svelte +3 -1
  111. package/package/components/apps/components/layout/AppConditionalWrapper.svelte.d.ts +1 -0
  112. package/package/components/apps/components/layout/AppStepper.svelte +5 -1
  113. package/package/components/apps/components/layout/AppStepper.svelte.d.ts +2 -0
  114. package/package/components/apps/components/layout/AppTabs.svelte +3 -1
  115. package/package/components/apps/components/layout/AppTabs.svelte.d.ts +1 -0
  116. package/package/components/apps/editor/AppEditorHeader.svelte +6 -7
  117. package/package/components/apps/editor/SettingsPanel.svelte +13 -3
  118. package/package/components/apps/editor/component/Component.svelte +8 -16
  119. package/package/components/apps/editor/component/components.d.ts +11 -2
  120. package/package/components/apps/editor/component/components.js +2 -1
  121. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte +1 -1
  122. package/package/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte +5 -34
  123. package/package/components/apps/editor/settingsPanel/ComponentPanel.svelte +3 -41
  124. package/package/components/apps/editor/settingsPanel/EventHandlerItem.svelte +33 -0
  125. package/package/components/apps/editor/settingsPanel/EventHandlerItem.svelte.d.ts +19 -0
  126. package/package/components/apps/editor/settingsPanel/EventHandlers.svelte +103 -0
  127. package/package/components/apps/editor/settingsPanel/EventHandlers.svelte.d.ts +18 -0
  128. package/package/components/apps/editor/settingsPanel/GridCondition.svelte +21 -45
  129. package/package/components/apps/editor/settingsPanel/GridTab.svelte +3 -23
  130. package/package/components/apps/editor/settingsPanel/InputsSpecsEditor.svelte +5 -1
  131. package/package/components/apps/editor/settingsPanel/SubTypeEditor.svelte +0 -2
  132. package/package/components/apps/editor/settingsPanel/SubTypeEditor.svelte.d.ts +0 -1
  133. package/package/components/apps/editor/settingsPanel/inputEditor/EvalV2InputEditor.svelte +7 -1
  134. package/package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +7 -14
  135. package/package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte.d.ts +0 -1
  136. package/package/components/common/button/ButtonDropdown.svelte +1 -0
  137. package/package/components/common/drawer/Disposable.svelte +3 -2
  138. package/package/components/common/drawer/Disposable.svelte.d.ts +1 -0
  139. package/package/components/common/drawer/Drawer.svelte +12 -2
  140. package/package/components/common/drawer/Drawer.svelte.d.ts +1 -0
  141. package/package/components/common/fileDownload/FileDownload.svelte +4 -2
  142. package/package/components/common/fileUpload/FileUpload.svelte +4 -3
  143. package/package/components/common/modal/Modal.svelte +4 -1
  144. package/package/components/common/modal/Modal.svelte.d.ts +1 -0
  145. package/package/components/common/popup/Popup.svelte +1 -1
  146. package/package/components/common/toggleButton-v2/ToggleButtonGroup.svelte +4 -1
  147. package/package/components/common/toggleButton-v2/ToggleButtonGroup.svelte.d.ts +1 -0
  148. package/package/components/common/waitTimeWarning/WaitTimeWarning.svelte +79 -0
  149. package/package/components/common/waitTimeWarning/WaitTimeWarning.svelte.d.ts +18 -0
  150. package/package/components/flows/content/FlowEditorPanel.svelte +16 -2
  151. package/package/components/flows/content/FlowInput.svelte +63 -53
  152. package/package/components/flows/content/FlowModuleComponent.svelte +26 -3
  153. package/package/components/flows/content/FlowModuleScript.svelte +40 -1
  154. package/package/components/flows/content/FlowModuleScript.svelte.d.ts +2 -0
  155. package/package/components/flows/content/FlowModuleSuspend.svelte +99 -59
  156. package/package/components/flows/content/FlowModuleWrapper.svelte +16 -1
  157. package/package/components/flows/content/FlowSchedules.svelte +11 -8
  158. package/package/components/flows/content/ScriptEditorDrawer.svelte +3 -4
  159. package/package/components/flows/flowStateUtils.js +4 -1
  160. package/package/components/flows/map/FlowModuleSchemaItem.svelte +16 -1
  161. package/package/components/flows/map/FlowModuleSchemaMap.svelte +6 -1
  162. package/package/components/flows/types.d.ts +4 -0
  163. package/package/components/flows/utils.d.ts +5 -1
  164. package/package/components/flows/utils.js +36 -0
  165. package/package/components/graph/FlowGraph.svelte +5 -2
  166. package/package/components/graph/FlowGraph.svelte.d.ts +2 -0
  167. package/package/components/graph/svelvet/container/models/index.d.ts +0 -5
  168. package/package/components/graph/svelvet/container/models/index.js +1 -1
  169. package/package/components/graph/svelvet/container/views/Svelvet.svelte +2 -5
  170. package/package/components/graph/util.d.ts +1 -37
  171. package/package/components/graph/util.js +0 -34
  172. package/package/components/instanceSettings.js +2 -1
  173. package/package/components/jobs/JobPreview.svelte +1 -1
  174. package/package/components/multiselect/MultiSelect.svelte +4 -3
  175. package/package/components/multiselect/MultiSelect.svelte.d.ts +1 -0
  176. package/package/components/multiselect/MultiSelectWrapper.svelte +89 -0
  177. package/package/components/multiselect/MultiSelectWrapper.svelte.d.ts +20 -0
  178. package/package/components/propertyPicker/ObjectViewer.svelte +6 -2
  179. package/package/components/runs/JobPreview.svelte +5 -1
  180. package/package/components/runs/RunRow.svelte +22 -3
  181. package/package/components/runs/RunRow.svelte.d.ts +2 -1
  182. package/package/components/runs/RunsTable.svelte +22 -9
  183. package/package/components/runs/RunsTable.svelte.d.ts +2 -1
  184. package/package/components/schema/AddProperty.svelte +149 -0
  185. package/package/components/schema/AddProperty.svelte.d.ts +23 -0
  186. package/package/components/schema/AddPropertyForm.svelte +33 -0
  187. package/package/components/schema/AddPropertyForm.svelte.d.ts +16 -0
  188. package/package/components/schema/EditableSchemaDrawer.svelte +198 -0
  189. package/package/components/schema/EditableSchemaDrawer.svelte.d.ts +21 -0
  190. package/package/components/schema/EditableSchemaWrapper.svelte +31 -0
  191. package/package/components/schema/EditableSchemaWrapper.svelte.d.ts +22 -0
  192. package/package/components/schema/FlowPropertyEditor.svelte +393 -0
  193. package/package/components/schema/FlowPropertyEditor.svelte.d.ts +47 -0
  194. package/package/components/schema/PropertyEditor.svelte +185 -0
  195. package/package/components/schema/PropertyEditor.svelte.d.ts +46 -0
  196. package/package/components/schema/SchemaFormDND.svelte +75 -0
  197. package/package/components/schema/SchemaFormDND.svelte.d.ts +28 -0
  198. package/package/components/table/AutoDataTable.svelte +90 -104
  199. package/package/components/table/Cell.svelte +4 -1
  200. package/package/components/table/Cell.svelte.d.ts +1 -0
  201. package/package/components/table/DownloadCsv.svelte +30 -0
  202. package/package/components/table/DownloadCsv.svelte.d.ts +17 -0
  203. package/package/components/table/tableUtils.d.ts +8 -0
  204. package/package/components/table/tableUtils.js +37 -0
  205. package/package/consts.js +3 -1
  206. package/package/deno_fetch.d.ts.txt +6 -0
  207. package/package/gen/core/OpenAPI.js +1 -1
  208. package/package/gen/schemas.gen.d.ts +76 -0
  209. package/package/gen/schemas.gen.js +76 -0
  210. package/package/gen/services.gen.d.ts +100 -5
  211. package/package/gen/services.gen.js +216 -16
  212. package/package/gen/types.gen.d.ts +378 -5
  213. package/package/inferArgSig.d.ts +10 -0
  214. package/package/inferArgSig.js +59 -2
  215. package/package/scripts.d.ts +2 -0
  216. package/package/scripts.js +6 -3
  217. package/package/utils.d.ts +4 -3
  218. package/package/utils.js +9 -4
  219. package/package/workspace_settings.d.ts +15 -0
  220. package/package/workspace_settings.js +81 -0
  221. package/package.json +16 -7
  222. package/package/components/ParqetTableRenderer.svelte +0 -117
  223. package/package/components/ParqetTableRenderer.svelte.d.ts +0 -18
  224. package/package/components/PropertyRow.svelte +0 -88
  225. package/package/components/PropertyRow.svelte.d.ts +0 -23
  226. package/package/components/SchemaEditor.svelte +0 -346
  227. package/package/components/SchemaEditor.svelte.d.ts +0 -25
  228. package/package/components/SchemaModal.svelte +0 -443
  229. package/package/components/SchemaModal.svelte.d.ts +0 -33
  230. package/package/components/apps/editor/settingsPanel/Recompute.svelte +0 -55
  231. package/package/components/apps/editor/settingsPanel/Recompute.svelte.d.ts +0 -20
@@ -2,7 +2,7 @@
2
2
  import { json } from 'svelte-highlight/languages';
3
3
  import { copyToClipboard, roughSizeOfObject } from '../utils';
4
4
  import { Button, Drawer, DrawerContent } from './common';
5
- import { ClipboardCopy, Download, Expand, PanelRightOpen, Table2, Braces, Highlighter, InfoIcon } from 'lucide-svelte';
5
+ import { ClipboardCopy, Download, Expand, PanelRightOpen, Table2, Braces, Highlighter, InfoIcon, ArrowDownFromLine } from 'lucide-svelte';
6
6
  import Portal from 'svelte-portal';
7
7
  import ObjectViewer from './propertyPicker/ObjectViewer.svelte';
8
8
  import S3FilePicker from './S3FilePicker.svelte';
@@ -11,11 +11,14 @@ import AutoDataTable from './table/AutoDataTable.svelte';
11
11
  import Markdown from 'svelte-exmarkdown';
12
12
  import Toggle from './Toggle.svelte';
13
13
  import FileDownload from './common/fileDownload/FileDownload.svelte';
14
- import ParqetTableRenderer from './ParqetTableRenderer.svelte';
14
+ import ParqetTableRenderer from './ParqetCsvTableRenderer.svelte';
15
15
  import ToggleButtonGroup from './common/toggleButton-v2/ToggleButtonGroup.svelte';
16
16
  import ToggleButton from './common/toggleButton-v2/ToggleButton.svelte';
17
17
  import MapResult from './MapResult.svelte';
18
18
  import Popover from './Popover.svelte';
19
+ import DownloadCsv from './table/DownloadCsv.svelte';
20
+ import { convertJsonToCsv } from './table/tableUtils';
21
+ import Tooltip from './Tooltip.svelte';
19
22
  export let result;
20
23
  export let requireHtmlApproval = false;
21
24
  export let filename = undefined;
@@ -56,15 +59,17 @@ function isTableRowObject(json) {
56
59
  }
57
60
  let largeObject = undefined;
58
61
  function checkIfS3(result, keys) {
59
- return keys.length === 1 && keys.includes('s3') && typeof result.s3 === 'string';
62
+ return keys.includes('s3') && typeof result.s3 === 'string';
60
63
  }
61
64
  let is_render_all = false;
65
+ let download_as_csv = false;
62
66
  function inferResultKind(result) {
63
67
  if (result == 'WINDMILL_TOO_BIG') {
64
68
  largeObject = true;
65
69
  return 'json';
66
70
  }
67
71
  if (result !== undefined) {
72
+ download_as_csv = false;
68
73
  if (typeof result === 'string') {
69
74
  length = 0;
70
75
  largeObject = false;
@@ -81,12 +86,18 @@ function inferResultKind(result) {
81
86
  largeObject = roughSizeOfObject(result) > IMG_MAX_SIZE;
82
87
  return keys[0];
83
88
  }
84
- const tableLargeObject = roughSizeOfObject(result) > TABLE_MAX_SIZE;
89
+ let size = roughSizeOfObject(result);
85
90
  // Otherwise, check if the result is too large (10kb) for json
86
- largeObject = tableLargeObject || roughSizeOfObject(result) > DISPLAY_MAX_SIZE;
87
- if (tableLargeObject) {
91
+ if (size > TABLE_MAX_SIZE) {
92
+ largeObject = true;
93
+ if (Array.isArray(result) && isTableRowObject(result)) {
94
+ download_as_csv = true;
95
+ }
88
96
  return 'json';
89
97
  }
98
+ else {
99
+ largeObject = size > DISPLAY_MAX_SIZE;
100
+ }
90
101
  if (Array.isArray(result)) {
91
102
  if (result.length === 0) {
92
103
  return 'json';
@@ -246,6 +257,7 @@ function arrayOfRowsToObjects(input) {
246
257
  return [];
247
258
  }
248
259
  let globalForceJson = false;
260
+ let seeS3PreviewFileFromList = '';
249
261
  </script>
250
262
 
251
263
  {#if is_render_all}
@@ -327,257 +339,305 @@ let globalForceJson = false;
327
339
  </button>
328
340
  {/if}
329
341
  </div>
330
- </div>{#if !forceJson && resultKind == 'table-col'}
331
- {@const data = 'table-col' in result ? result['table-col'] : result}
332
- <AutoDataTable objects={objectOfArraysToObjects(data)} />
333
- {:else if !forceJson && resultKind == 'table-row'}
334
- {@const data = 'table-row' in result ? result['table-row'] : result}
335
- <AutoDataTable objects={arrayOfRowsToObjects(data)} />
336
- {:else if !forceJson && resultKind == 'table-row-object'}
337
- {@const data = 'table-row-object' in result ? result['table-row-object'] : result}
338
- <AutoDataTable objects={handleArrayOfObjectsHeaders(data)} />
339
- {:else if !forceJson && resultKind == 'html'}
340
- <div class="h-full">
341
- {#if !requireHtmlApproval || enableHtml}
342
- {@html result.html}
343
- {:else}
344
- <div class="font-main text-sm">
345
- <div class="flex flex-col">
346
- <div class="bg-red-400 py-1 rounded-t text-white font-bold text-center">
347
- Warning
342
+ </div><div class="grow"
343
+ >{#if !forceJson && resultKind == 'table-col'}
344
+ {@const data = 'table-col' in result ? result['table-col'] : result}
345
+ <AutoDataTable objects={objectOfArraysToObjects(data)} />
346
+ {:else if !forceJson && resultKind == 'table-row'}
347
+ {@const data = 'table-row' in result ? result['table-row'] : result}
348
+ <AutoDataTable objects={arrayOfRowsToObjects(data)} />
349
+ {:else if !forceJson && resultKind == 'table-row-object'}
350
+ {@const data = 'table-row-object' in result ? result['table-row-object'] : result}
351
+ <AutoDataTable objects={handleArrayOfObjectsHeaders(data)} />
352
+ {:else if !forceJson && resultKind == 'html'}
353
+ <div class="h-full">
354
+ {#if !requireHtmlApproval || enableHtml}
355
+ {@html result.html}
356
+ {:else}
357
+ <div class="font-main text-sm">
358
+ <div class="flex flex-col">
359
+ <div class="bg-red-400 py-1 rounded-t text-white font-bold text-center">
360
+ Warning
361
+ </div>
362
+ <p
363
+ class="text-tertiary mb-2 text-left border-2 !border-t-0 rounded-b border-red-400 overflow-auto p-1"
364
+ >Rendering HTML can expose you to <a
365
+ href="https://owasp.org/www-community/attacks/xss/"
366
+ target="_blank"
367
+ rel="noreferrer"
368
+ class="hover:underline">XSS attacks</a
369
+ >. Only enable it if you trust the author of the script.
370
+ </p>
371
+ </div>
372
+ <div class="center-center">
373
+ <Button size="sm" color="dark" on:click={() => (enableHtml = true)}>
374
+ Enable HTML rendering
375
+ </Button>
348
376
  </div>
349
- <p
350
- class="text-tertiary mb-2 text-left border-2 !border-t-0 rounded-b border-red-400 overflow-auto p-1"
351
- >Rendering HTML can expose you to <a
352
- href="https://owasp.org/www-community/attacks/xss/"
353
- target="_blank"
354
- rel="noreferrer"
355
- class="hover:underline">XSS attacks</a
356
- >. Only enable it if you trust the author of the script.
357
- </p>
358
- </div>
359
- <div class="center-center">
360
- <Button size="sm" color="dark" on:click={() => (enableHtml = true)}>
361
- Enable HTML rendering
362
- </Button>
363
377
  </div>
364
- </div>
365
- {/if}
366
- </div>
367
- {:else if !forceJson && resultKind == 'map'}
368
- <div class="h-full">
369
- <MapResult
370
- lat={result.map.lat}
371
- lon={result.map.lon}
372
- zoom={result.map.zoom}
373
- markers={result.map.markers}
374
- />
375
- </div>
376
- {:else if !forceJson && resultKind == 'png'}
377
- <div class="h-full">
378
- <img
379
- alt="png rendered"
380
- class="w-auto h-full"
381
- src="data:image/png;base64,{contentOrRootString(result.png)}"
382
- />
383
- </div>
384
- {:else if !forceJson && resultKind == 'jpeg'}
385
- <div class="h-full">
386
- <img
387
- alt="jpeg rendered"
388
- class="w-auto h-full"
389
- src="data:image/jpeg;base64,{contentOrRootString(result.jpeg)}"
390
- />
391
- </div>
392
- {:else if !forceJson && resultKind == 'svg'}
393
- <div
394
- ><a download="windmill.svg" href="data:text/plain;base64,{btoa(result.svg)}">Download</a>
395
- </div>
396
- <div class="h-full overflow-auto">{@html result.svg} </div>
397
- {:else if !forceJson && resultKind == 'gif'}
398
- <div class="h-full">
399
- <img
400
- alt="gif rendered"
401
- class="w-auto h-full"
402
- src="data:image/gif;base64,{contentOrRootString(result.gif)}"
403
- />
404
- </div>
405
- {:else if !forceJson && resultKind == 'plain'}<div class="h-full text-2xs"
406
- ><pre>{typeof result == 'string' ? result : result?.['result']}</pre>{#if !noControls}
407
- <div class="flex">
408
- <Button
409
- on:click={() =>
410
- copyToClipboard(typeof result == 'string' ? result : result?.['result'])}
411
- color="light"
412
- size="xs"
413
- >
414
- <div class="flex gap-2 items-center">Copy <ClipboardCopy size={12} /> </div>
415
- </Button>
416
- </div>
417
- {/if}
418
- </div>
419
- {:else if !forceJson && resultKind == 'file'}
420
- <div>
421
- <a
422
- download={result.filename ?? result.file?.filename ?? 'windmill.file'}
423
- href="data:application/octet-stream;base64,{contentOrRootString(result.file)}"
424
- >Download</a
425
- >
426
- </div>
427
- {:else if !forceJson && resultKind == 'error' && result?.error}
428
- <div class="flex flex-col items-start">
429
- <span class="text-red-500 font-semibold text-sm whitespace-pre-wrap"
430
- >{#if result.error.name || result.error.message}{result.error.name}: {result.error
431
- .message}{:else}{JSON.stringify(result.error, null, 4)}{/if}</span
432
- >
433
- <pre class="text-sm whitespace-pre-wrap text-primary">{result.error.stack ?? ''}</pre>
434
- <slot />
435
- </div>
436
- {:else if !forceJson && resultKind == 'approval'}<div class="flex flex-col gap-3 mt-2 mx-4">
437
- <Button
438
- color="green"
439
- variant="border"
440
- on:click={() =>
441
- fetch(result['resume'], {
442
- method: 'POST',
443
- body: JSON.stringify({}),
444
- headers: { 'Content-Type': 'application/json' }
445
- })}
446
- >
447
- Resume</Button
448
- >
449
- <Button color="red" variant="border" on:click={() => fetch(result['cancel'])}
450
- >Cancel</Button
451
- >
452
- <div class="center-center"
453
- ><a rel="noreferrer" target="_blank" href={result['approvalPage']}>Approval Page</a
454
- ></div
455
- >
456
- </div>
457
- {:else if !forceJson && resultKind == 's3object'}
458
- <div
459
- class="h-full w-full {typeof result?.s3 == 'string' && result?.s3?.endsWith('.parquet')
460
- ? 'h-min-[600px]'
461
- : ''}"
462
- >
463
- <div class="flex flex-col gap-2">
464
- <Toggle
465
- class="flex"
466
- bind:checked={s3FileDisplayRawMode}
467
- size="xs"
468
- options={{ right: 'Raw S3 object input' }}
378
+ {/if}
379
+ </div>
380
+ {:else if !forceJson && resultKind == 'map'}
381
+ <div class="h-full">
382
+ <MapResult
383
+ lat={result.map.lat}
384
+ lon={result.map.lon}
385
+ zoom={result.map.zoom}
386
+ markers={result.map.markers}
469
387
  />
470
- {#if s3FileDisplayRawMode}
471
- <Highlight class="" language={json} code={toJsonStr(result).replace(/\\n/g, '\n')} />
472
- <button
473
- class="text-secondary underline text-2xs whitespace-nowrap"
474
- on:click={() => {
475
- s3FileViewer?.open?.(result)
476
- }}
477
- ><span class="flex items-center gap-1"
478
- ><PanelRightOpen size={12} />open preview</span
479
- >
480
- </button>
481
- {:else}
482
- <FileDownload s3object={result} />
483
- <button
484
- class="text-secondary underline text-2xs whitespace-nowrap"
485
- on:click={() => {
486
- s3FileViewer?.open?.(result)
487
- }}
488
- ><span class="flex items-center gap-1"
489
- ><PanelRightOpen size={12} />open preview</span
388
+ </div>
389
+ {:else if !forceJson && resultKind == 'png'}
390
+ <div class="h-full">
391
+ <img
392
+ alt="png rendered"
393
+ class="w-auto h-full"
394
+ src="data:image/png;base64,{contentOrRootString(result.png)}"
395
+ />
396
+ </div>
397
+ {:else if !forceJson && resultKind == 'jpeg'}
398
+ <div class="h-full">
399
+ <img
400
+ alt="jpeg rendered"
401
+ class="w-auto h-full"
402
+ src="data:image/jpeg;base64,{contentOrRootString(result.jpeg)}"
403
+ />
404
+ </div>
405
+ {:else if !forceJson && resultKind == 'svg'}
406
+ <div
407
+ ><a download="windmill.svg" href="data:text/plain;base64,{btoa(result.svg)}">Download</a
408
+ >
409
+ </div>
410
+ <div class="h-full overflow-auto">{@html result.svg} </div>
411
+ {:else if !forceJson && resultKind == 'gif'}
412
+ <div class="h-full">
413
+ <img
414
+ alt="gif rendered"
415
+ class="w-auto h-full"
416
+ src="data:image/gif;base64,{contentOrRootString(result.gif)}"
417
+ />
418
+ </div>
419
+ {:else if !forceJson && resultKind == 'plain'}<div class="h-full text-2xs"
420
+ ><pre>{typeof result == 'string' ? result : result?.['result']}</pre>{#if !noControls}
421
+ <div class="flex">
422
+ <Button
423
+ on:click={() =>
424
+ copyToClipboard(typeof result == 'string' ? result : result?.['result'])}
425
+ color="light"
426
+ size="xs"
490
427
  >
491
- </button>
428
+ <div class="flex gap-2 items-center">Copy <ClipboardCopy size={12} /> </div>
429
+ </Button>
430
+ </div>
492
431
  {/if}
493
432
  </div>
494
- {#if typeof result?.s3 == 'string' && result?.s3?.endsWith('.parquet')}
495
- <ParqetTableRenderer s3resource={result?.s3} />
496
- {/if}
497
- </div>
498
- {:else if !forceJson && resultKind == 's3object-list'}
499
- <div class="h-full w-full">
500
- <div class="flex flex-col gap-2">
501
- <Toggle
502
- class="flex"
503
- bind:checked={s3FileDisplayRawMode}
504
- size="xs"
505
- options={{ right: 'Raw S3 object input' }}
506
- />
507
- {#each result as s3object}
433
+ {:else if !forceJson && resultKind == 'file'}
434
+ <div>
435
+ <a
436
+ download={result.filename ?? result.file?.filename ?? 'windmill.file'}
437
+ href="data:application/octet-stream;base64,{contentOrRootString(result.file)}"
438
+ >Download</a
439
+ >
440
+ </div>
441
+ {:else if !forceJson && resultKind == 'error' && result?.error}
442
+ <div class="flex flex-col items-start">
443
+ <span class="text-red-500 font-semibold text-sm whitespace-pre-wrap"
444
+ >{#if result.error.name || result.error.message}{result.error.name}: {result.error
445
+ .message}{:else}{JSON.stringify(result.error, null, 4)}{/if}</span
446
+ >
447
+ <pre class="text-sm whitespace-pre-wrap text-primary">{result.error.stack ?? ''}</pre>
448
+ <slot />
449
+ </div>
450
+ {:else if !forceJson && resultKind == 'approval'}<div class="flex flex-col gap-3 mt-2 mx-4">
451
+ <Button
452
+ color="green"
453
+ variant="border"
454
+ on:click={() =>
455
+ fetch(result['resume'], {
456
+ method: 'POST',
457
+ body: JSON.stringify({}),
458
+ headers: { 'Content-Type': 'application/json' }
459
+ })}
460
+ >
461
+ Resume</Button
462
+ >
463
+ <Button color="red" variant="border" on:click={() => fetch(result['cancel'])}
464
+ >Cancel</Button
465
+ >
466
+ <div class="center-center"
467
+ ><a rel="noreferrer" target="_blank" href={result['approvalPage']}>Approval Page</a
468
+ ></div
469
+ >
470
+ </div>
471
+ {:else if !forceJson && resultKind == 's3object'}
472
+ <div
473
+ class="h-full w-full {typeof result?.s3 == 'string' && result?.s3?.endsWith('.parquet')
474
+ ? 'h-min-[600px]'
475
+ : ''}"
476
+ >
477
+ <div class="flex flex-col gap-2">
478
+ <Toggle
479
+ class="flex"
480
+ bind:checked={s3FileDisplayRawMode}
481
+ size="xs"
482
+ options={{ right: 'Raw S3 object' }}
483
+ />
484
+
508
485
  {#if s3FileDisplayRawMode}
509
486
  <Highlight
510
487
  class=""
511
488
  language={json}
512
- code={toJsonStr(s3object).replace(/\\n/g, '\n')}
489
+ code={toJsonStr(result).replace(/\\n/g, '\n')}
513
490
  />
514
491
  <button
515
- class="text-secondary text-2xs whitespace-nowrap"
492
+ class="text-secondary underline text-2xs whitespace-nowrap"
516
493
  on:click={() => {
517
- s3FileViewer?.open?.(s3object)
494
+ s3FileViewer?.open?.(result)
518
495
  }}
519
496
  ><span class="flex items-center gap-1"
520
- ><PanelRightOpen size={12} />open preview</span
497
+ ><PanelRightOpen size={12} />object store explorer<Tooltip
498
+ >Require admin privilege or "S3 resource details and content can be accessed
499
+ by all users of this workspace" of S3 Storage to be set in the workspace
500
+ settings</Tooltip
501
+ ></span
502
+ >
503
+ </button>
504
+ {:else if !result?.disable_download}
505
+ <FileDownload s3object={result} />
506
+ <button
507
+ class="text-secondary underline text-2xs whitespace-nowrap"
508
+ on:click={() => {
509
+ s3FileViewer?.open?.(result)
510
+ }}
511
+ ><span class="flex items-center gap-1"
512
+ ><PanelRightOpen size={12} />object store explorer<Tooltip
513
+ >Require admin privilege or "S3 resource details and content can be accessed
514
+ by all users of this workspace" of S3 Storage to be set in the workspace
515
+ settings</Tooltip
516
+ ></span
521
517
  >
522
518
  </button>
523
- {:else}
524
- <FileDownload {s3object} />
525
519
  {/if}
526
- {/each}
520
+ </div>
521
+ {#if typeof result?.s3 == 'string' && (result?.s3?.endsWith('.parquet') || result?.s3?.endsWith('.csv'))}
522
+ {#key result.s3}
523
+ <ParqetTableRenderer
524
+ disable_download={result?.disable_download}
525
+ {workspaceId}
526
+ s3resource={result?.s3}
527
+ storage={result?.storage}
528
+ />
529
+ {/key}
530
+ {/if}
527
531
  </div>
528
- </div>
529
- {:else if !forceJson && resultKind == 'markdown'}
530
- <div class="prose-xs dark:prose-invert !list-disc !list-outside">
531
- <Markdown md={result?.md ?? result?.markdown} />
532
- </div>
533
- {:else if largeObject}
534
- {#if result && typeof result == 'object' && 'file' in result}
535
- <div
536
- ><a
537
- download={result.filename ?? result.file?.filename ?? 'windmill.file'}
538
- href="data:application/octet-stream;base64,{contentOrRootString(result.file)}"
539
- >Download</a
540
- >
532
+ {:else if !forceJson && resultKind == 's3object-list'}
533
+ <div class="h-full w-full">
534
+ <div class="flex flex-col gap-2">
535
+ <Toggle
536
+ class="flex mt-1"
537
+ bind:checked={s3FileDisplayRawMode}
538
+ size="xs"
539
+ options={{ right: 'Raw S3 object' }}
540
+ />
541
+ {#each result as s3object}
542
+ {#if s3FileDisplayRawMode}
543
+ <Highlight
544
+ class=""
545
+ language={json}
546
+ code={toJsonStr(s3object).replace(/\\n/g, '\n')}
547
+ />
548
+ <button
549
+ class="text-secondary text-2xs whitespace-nowrap"
550
+ on:click={() => {
551
+ s3FileViewer?.open?.(s3object)
552
+ }}
553
+ ><span class="flex items-center gap-1"
554
+ ><PanelRightOpen size={12} />open preview</span
555
+ >
556
+ </button>
557
+ {:else if !s3object?.disable_download}
558
+ <FileDownload {s3object} />
559
+ {:else}
560
+ <div class="flex text-secondary pt-2">{s3object?.s3} (download disabled)</div>
561
+ {/if}
562
+ {#if s3object?.s3?.endsWith('.parquet') || s3object?.s3?.endsWith('.csv')}
563
+ {#if seeS3PreviewFileFromList == s3object?.s3}
564
+ <ParqetTableRenderer
565
+ disable_download={s3object?.disable_download}
566
+ {workspaceId}
567
+ s3resource={s3object?.s3}
568
+ storage={s3object?.storage}
569
+ />{:else}
570
+ <button
571
+ class="text-secondary whitespace-nowrap flex gap-2 items-center"
572
+ on:click={() => {
573
+ seeS3PreviewFileFromList = s3object?.s3
574
+ }}
575
+ >open table preview <ArrowDownFromLine />
576
+ </button>
577
+ {/if}
578
+ {/if}
579
+ {/each}
580
+ </div>
541
581
  </div>
542
- {:else}
543
- <div class="text-sm text-tertiary"
544
- ><a
545
- download="{filename ?? 'result'}.json"
546
- href={workspaceId && jobId
547
- ? `/api/w/${workspaceId}/jobs_u/completed/get_result/${jobId}`
548
- : `data:text/json;charset=utf-8,${encodeURIComponent(toJsonStr(result))}`}
549
- >
550
- Download {filename ? '' : 'as JSON'}
551
- </a>
582
+ {:else if !forceJson && resultKind == 'markdown'}
583
+ <div class="prose-xs dark:prose-invert !list-disc !list-outside">
584
+ <Markdown md={result?.md ?? result?.markdown} />
552
585
  </div>
586
+ {:else if largeObject}
587
+ {#if result && typeof result == 'object' && 'file' in result}
588
+ <div
589
+ ><a
590
+ download={result.filename ?? result.file?.filename ?? 'windmill.file'}
591
+ href="data:application/octet-stream;base64,{contentOrRootString(result.file)}"
592
+ >Download</a
593
+ >
594
+ </div>
595
+ {:else}
596
+ <div class="text-sm text-tertiary"
597
+ ><a
598
+ download="{filename ?? 'result'}.json"
599
+ href={workspaceId && jobId
600
+ ? `/api/w/${workspaceId}/jobs_u/completed/get_result/${jobId}`
601
+ : `data:text/json;charset=utf-8,${encodeURIComponent(toJsonStr(result))}`}
602
+ >
603
+ Download {filename ? '' : 'as JSON'}
604
+ </a>
605
+ {#if download_as_csv}
606
+ <DownloadCsv
607
+ getContent={() => convertJsonToCsv(result)}
608
+ customText="Download as CSV"
609
+ />
610
+ {/if}
611
+ </div>
553
612
 
554
- <div class="mt-1 mb-2">
555
- <Alert
556
- size="xs"
557
- title="Large result detected"
558
- type="warning"
559
- tooltip="We recommend using persistent object storage for large result. See docs for setting up an object storage service integration using s3 or any other s3 compatible services."
560
- documentationLink="https://www.windmill.dev/docs/core_concepts/persistent_storage#object-storage-for-large-data-s3-r2-minio-azure-blob"
561
- />
562
- </div>
563
- {#if result && result != 'WINDMILL_TOO_BIG'}
564
- <ObjectViewer json={result} />
613
+ <div class="mt-1 mb-2">
614
+ <Alert
615
+ size="xs"
616
+ title="Large result detected"
617
+ type="warning"
618
+ tooltip="We recommend using persistent object storage for large result. See docs for setting up an object storage service integration using s3 or any other s3 compatible services."
619
+ documentationLink="https://www.windmill.dev/docs/core_concepts/persistent_storage#object-storage-for-large-data-s3-r2-minio-azure-blob"
620
+ />
621
+ </div>
622
+ {#if result && result != 'WINDMILL_TOO_BIG'}
623
+ <ObjectViewer json={result} />
624
+ {/if}
565
625
  {/if}
626
+ {:else if typeof result == 'string' && result.length > 0}
627
+ <pre class="text-sm">{result}</pre>{#if !noControls}<div class="flex">
628
+ <Button on:click={() => copyToClipboard(result)} color="light" size="xs">
629
+ <div class="flex gap-2 items-center">Copy <ClipboardCopy size={12} /> </div>
630
+ </Button>
631
+ </div>
632
+ {/if}
633
+ {:else}
634
+ <Highlight
635
+ class={forceJson ? '' : 'h-full w-full'}
636
+ language={json}
637
+ code={toJsonStr(result).replace(/\\n/g, '\n')}
638
+ />
566
639
  {/if}
567
- {:else if typeof result == 'string' && result.length > 0}
568
- <pre class="text-sm">{result}</pre>{#if !noControls}<div class="flex">
569
- <Button on:click={() => copyToClipboard(result)} color="light" size="xs">
570
- <div class="flex gap-2 items-center">Copy <ClipboardCopy size={12} /> </div>
571
- </Button>
572
- </div>
573
- {/if}
574
- {:else}
575
- <Highlight
576
- class={forceJson ? '' : 'h-full w-full'}
577
- language={json}
578
- code={toJsonStr(result).replace(/\\n/g, '\n')}
579
- />
580
- {/if}
640
+ </div>
581
641
  {:else if typeof result == 'string' && resultKind == 'plain'}
582
642
  <div class="h-full text-xs">
583
643
  <pre>{result}</pre>
@@ -1,9 +1,17 @@
1
1
  <script>import { msToSec } from '../utils';
2
2
  import { Badge } from './common';
3
3
  import { Hourglass } from 'lucide-svelte';
4
+ import WaitTimeWarning from './common/waitTimeWarning/WaitTimeWarning.svelte';
4
5
  export let duration_ms;
6
+ export let self_wait_time_ms = undefined;
7
+ export let aggregate_wait_time_ms = undefined;
5
8
  </script>
6
9
 
7
- <Badge large icon={{ icon: Hourglass, position: 'left' }}>
8
- Ran in {msToSec(duration_ms)}s
9
- </Badge>
10
+ <div>
11
+ <Badge large icon={{ icon: Hourglass, position: 'left' }}>
12
+ Ran in {msToSec(duration_ms)}s
13
+ {#if self_wait_time_ms || aggregate_wait_time_ms}
14
+ <WaitTimeWarning {self_wait_time_ms} {aggregate_wait_time_ms} variant="alert" />
15
+ {/if}
16
+ </Badge>
17
+ </div>
@@ -2,6 +2,8 @@ import { SvelteComponent } from "svelte";
2
2
  declare const __propDef: {
3
3
  props: {
4
4
  duration_ms: number;
5
+ self_wait_time_ms?: number | undefined;
6
+ aggregate_wait_time_ms?: number | undefined;
5
7
  };
6
8
  events: {
7
9
  [evt: string]: CustomEvent<any>;