windmill-components 1.75.0 → 1.78.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 (238) hide show
  1. package/components/ArgInput.svelte +4 -14
  2. package/components/DisplayResult.svelte +1 -1
  3. package/components/Dropdown.svelte +14 -4
  4. package/components/FlowGraphViewer.svelte +1 -1
  5. package/components/FolderUsageInfo.svelte +16 -6
  6. package/components/FolderUsageInfo.svelte.d.ts +2 -0
  7. package/components/LightweightArgInput.svelte +315 -0
  8. package/components/LightweightArgInput.svelte.d.ts +47 -0
  9. package/components/LightweightSchemaForm.svelte +31 -0
  10. package/components/LightweightSchemaForm.svelte.d.ts +18 -0
  11. package/components/ModulePreview.svelte +1 -0
  12. package/components/Multiselect.svelte.d.ts +2 -2
  13. package/components/PageHeader.svelte +1 -1
  14. package/components/Path.svelte +26 -3
  15. package/components/Range.svelte.d.ts +2 -2
  16. package/components/ScriptBuilder.svelte +122 -122
  17. package/components/SettingSection.svelte +44 -0
  18. package/components/SettingSection.svelte.d.ts +21 -0
  19. package/components/SimpleEditor.svelte +1 -1
  20. package/components/SimpleEditor.svelte.d.ts +2 -0
  21. package/components/TemplateEditor.svelte +3 -0
  22. package/components/TemplateEditor.svelte.d.ts +0 -204
  23. package/components/Tooltip.svelte +3 -1
  24. package/components/VariableEditor.svelte +2 -1
  25. package/components/WhitelistIp.svelte +1 -3
  26. package/components/apps/components/buttons/AppButton.svelte +16 -8
  27. package/components/apps/components/buttons/AppButton.svelte.d.ts +1 -2
  28. package/components/apps/components/buttons/AppForm.svelte +3 -7
  29. package/components/apps/components/buttons/AppFormButton.svelte +3 -7
  30. package/components/apps/components/display/AppBarChart.svelte +7 -3
  31. package/components/apps/components/display/AppBarChart.svelte.d.ts +0 -2
  32. package/components/apps/components/display/AppDisplayComponent.svelte +7 -3
  33. package/components/apps/components/display/AppDisplayComponent.svelte.d.ts +0 -2
  34. package/components/apps/components/display/AppHtml.svelte +7 -11
  35. package/components/apps/components/display/AppHtml.svelte.d.ts +0 -2
  36. package/components/apps/components/display/AppIcon.svelte +0 -1
  37. package/components/apps/components/display/AppIcon.svelte.d.ts +0 -2
  38. package/components/apps/components/display/AppImage.svelte +0 -1
  39. package/components/apps/components/display/AppImage.svelte.d.ts +0 -2
  40. package/components/apps/components/display/AppMap.svelte +10 -3
  41. package/components/apps/components/display/AppMap.svelte.d.ts +0 -2
  42. package/components/apps/components/display/AppPdf.svelte +8 -3
  43. package/components/apps/components/display/AppPdf.svelte.d.ts +0 -2
  44. package/components/apps/components/display/AppPieChart.svelte +7 -3
  45. package/components/apps/components/display/AppPieChart.svelte.d.ts +0 -2
  46. package/components/apps/components/display/AppScatterChart.svelte +7 -3
  47. package/components/apps/components/display/AppScatterChart.svelte.d.ts +0 -2
  48. package/components/apps/components/display/AppText.svelte +41 -17
  49. package/components/apps/components/display/AppText.svelte.d.ts +0 -2
  50. package/components/apps/components/display/AppTimeseries.svelte +7 -3
  51. package/components/apps/components/display/AppTimeseries.svelte.d.ts +0 -2
  52. package/components/apps/components/display/PlotlyHtml.svelte +9 -4
  53. package/components/apps/components/display/PlotlyHtml.svelte.d.ts +0 -2
  54. package/components/apps/components/display/VegaLiteHtml.svelte +8 -3
  55. package/components/apps/components/display/VegaLiteHtml.svelte.d.ts +0 -2
  56. package/components/apps/components/display/table/AppAggridTable.svelte +13 -5
  57. package/components/apps/components/display/table/AppAggridTable.svelte.d.ts +0 -2
  58. package/components/apps/components/display/table/AppTable.svelte +19 -13
  59. package/components/apps/components/display/table/AppTable.svelte.d.ts +0 -2
  60. package/components/apps/components/helpers/HiddenComponent.svelte +11 -2
  61. package/components/apps/components/helpers/HiddenComponent.svelte.d.ts +1 -2
  62. package/components/apps/components/helpers/InputValue.svelte +26 -43
  63. package/components/apps/components/helpers/InputValue.svelte.d.ts +4 -3
  64. package/components/apps/components/helpers/NonRunnableComponent.svelte +2 -2
  65. package/components/apps/components/helpers/RefreshButton.svelte +2 -3
  66. package/components/apps/components/helpers/ResizeWrapper.svelte +3 -4
  67. package/components/apps/components/helpers/RunnableComponent.svelte +63 -51
  68. package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +2 -1
  69. package/components/apps/components/helpers/RunnableWrapper.svelte +2 -2
  70. package/components/apps/components/helpers/RunnableWrapper.svelte.d.ts +1 -1
  71. package/components/apps/components/helpers/eval.d.ts +5 -0
  72. package/components/apps/components/helpers/eval.js +57 -0
  73. package/components/apps/components/inputs/AppCheckbox.svelte +4 -2
  74. package/components/apps/components/inputs/AppCheckbox.svelte.d.ts +0 -2
  75. package/components/apps/components/inputs/AppDateInput.svelte +4 -2
  76. package/components/apps/components/inputs/AppDateInput.svelte.d.ts +0 -2
  77. package/components/apps/components/inputs/AppFileInput.svelte +4 -2
  78. package/components/apps/components/inputs/AppFileInput.svelte.d.ts +0 -2
  79. package/components/apps/components/inputs/AppMultiSelect.svelte +4 -2
  80. package/components/apps/components/inputs/AppMultiSelect.svelte.d.ts +0 -2
  81. package/components/apps/components/inputs/AppNumberInput.svelte +4 -2
  82. package/components/apps/components/inputs/AppNumberInput.svelte.d.ts +0 -2
  83. package/components/apps/components/inputs/AppRangeInput.svelte +5 -2
  84. package/components/apps/components/inputs/AppRangeInput.svelte.d.ts +0 -2
  85. package/components/apps/components/inputs/AppSelect.svelte +4 -2
  86. package/components/apps/components/inputs/AppSelect.svelte.d.ts +0 -2
  87. package/components/apps/components/inputs/AppSliderInputs.svelte +4 -2
  88. package/components/apps/components/inputs/AppSliderInputs.svelte.d.ts +0 -2
  89. package/components/apps/components/inputs/AppTextInput.svelte +5 -3
  90. package/components/apps/components/inputs/AppTextInput.svelte.d.ts +0 -2
  91. package/components/apps/components/inputs/currency/AppCurrencyInput.svelte +5 -2
  92. package/components/apps/components/inputs/currency/AppCurrencyInput.svelte.d.ts +0 -2
  93. package/components/apps/components/layout/AppContainer.svelte +1 -7
  94. package/components/apps/components/layout/AppContainer.svelte.d.ts +0 -2
  95. package/components/apps/components/layout/AppDrawer.svelte +0 -3
  96. package/components/apps/components/layout/AppSplitpanes.svelte +1 -6
  97. package/components/apps/components/layout/AppTabs.svelte +62 -34
  98. package/components/apps/components/layout/AppTabs.svelte.d.ts +1 -2
  99. package/components/apps/editor/AppComponentInput.svelte +2 -1
  100. package/components/apps/editor/AppEditor.svelte +145 -143
  101. package/components/apps/editor/AppEditorHeader.svelte +43 -35
  102. package/components/apps/editor/AppPreview.svelte +68 -15
  103. package/components/apps/editor/ComponentHeader.svelte +3 -1
  104. package/components/apps/editor/ComponentHeader.svelte.d.ts +1 -0
  105. package/components/apps/editor/GridEditor.svelte +58 -77
  106. package/components/apps/editor/GridPanel.svelte +3 -1
  107. package/components/apps/editor/GridViewer.svelte +91 -0
  108. package/components/apps/editor/GridViewer.svelte.d.ts +32 -0
  109. package/components/apps/editor/RecomputeAllComponents.svelte +7 -1
  110. package/components/apps/editor/SettingsPanel.svelte +23 -10
  111. package/components/apps/editor/SubGridEditor.svelte +95 -68
  112. package/components/apps/editor/SubGridEditor.svelte.d.ts +3 -4
  113. package/components/apps/editor/appUtils.d.ts +13 -3
  114. package/components/apps/editor/appUtils.js +106 -37
  115. package/components/apps/editor/component/Component.svelte +6 -52
  116. package/components/apps/editor/component/ComponentNavigation.svelte +101 -51
  117. package/components/apps/editor/component/components.d.ts +3 -3
  118. package/components/apps/editor/component/components.js +59 -115
  119. package/components/apps/editor/componentsPanel/ComponentList.svelte +5 -4
  120. package/components/apps/editor/componentsPanel/componentStaticValues.d.ts +2 -1
  121. package/components/apps/editor/componentsPanel/componentStaticValues.js +1 -0
  122. package/components/apps/editor/contextPanel/ComponentOutput.svelte +67 -0
  123. package/components/apps/editor/contextPanel/ComponentOutput.svelte.d.ts +21 -0
  124. package/components/apps/editor/contextPanel/ComponentOutputViewer.svelte +15 -10
  125. package/components/apps/editor/contextPanel/ComponentOutputViewer.svelte.d.ts +0 -1
  126. package/components/apps/editor/contextPanel/ContextPanel.svelte +73 -136
  127. package/components/apps/editor/contextPanel/SubGridOutput.svelte +66 -0
  128. package/components/apps/editor/contextPanel/SubGridOutput.svelte.d.ts +19 -0
  129. package/components/apps/editor/contextPanel/components/BackgroundScriptOutput.svelte +41 -0
  130. package/components/apps/editor/contextPanel/components/BackgroundScriptOutput.svelte.d.ts +18 -0
  131. package/components/apps/editor/contextPanel/components/BackgroundScriptsOutput.svelte +9 -0
  132. package/components/apps/editor/contextPanel/components/BackgroundScriptsOutput.svelte.d.ts +16 -0
  133. package/components/apps/editor/contextPanel/components/MinMaxButton.svelte +25 -0
  134. package/components/apps/editor/contextPanel/components/MinMaxButton.svelte.d.ts +16 -0
  135. package/components/apps/editor/contextPanel/components/OutputHeader.svelte +99 -0
  136. package/components/apps/editor/contextPanel/components/OutputHeader.svelte.d.ts +24 -0
  137. package/components/apps/editor/contextPanel/components/TableActionOutput.svelte +17 -0
  138. package/components/apps/editor/contextPanel/components/TableActionOutput.svelte.d.ts +17 -0
  139. package/components/apps/editor/contextPanel/components/TableActionsOutput.svelte +13 -0
  140. package/components/apps/editor/contextPanel/components/TableActionsOutput.svelte.d.ts +17 -0
  141. package/components/apps/editor/inlineScriptsPanel/EmptyInlineScript.svelte +55 -23
  142. package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +74 -44
  143. package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte +1 -1
  144. package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanel.svelte +5 -9
  145. package/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte.d.ts +2 -2
  146. package/components/apps/editor/settingsPanel/ComponentPanel.svelte +43 -37
  147. package/components/apps/editor/settingsPanel/GridPane.svelte +1 -3
  148. package/components/apps/editor/settingsPanel/GridTab.svelte +5 -15
  149. package/components/apps/editor/settingsPanel/InputsSpecsEditor.svelte +1 -16
  150. package/components/apps/editor/settingsPanel/Recompute.svelte +1 -0
  151. package/components/apps/editor/settingsPanel/SelectedRunnable.svelte +6 -0
  152. package/components/apps/editor/settingsPanel/TableActions.svelte +4 -6
  153. package/components/apps/editor/settingsPanel/inputEditor/ConnectedInputEditor.svelte +2 -8
  154. package/components/apps/editor/settingsPanel/inputEditor/EvalInputEditor.svelte +2 -2
  155. package/components/apps/editor/settingsPanel/inputEditor/IconSelectInput.svelte +58 -46
  156. package/components/apps/editor/settingsPanel/inputEditor/JsonEditor.svelte +1 -1
  157. package/components/apps/editor/settingsPanel/inputEditor/JsonEditor.svelte.d.ts +2 -0
  158. package/components/apps/gridUtils.d.ts +1 -3
  159. package/components/apps/gridUtils.js +1 -15
  160. package/components/apps/rx.d.ts +7 -5
  161. package/components/apps/rx.js +37 -19
  162. package/components/apps/svelte-grid/Grid.svelte +167 -0
  163. package/components/apps/svelte-grid/Grid.svelte.d.ts +45 -0
  164. package/components/apps/svelte-grid/LICENSE +23 -0
  165. package/components/apps/svelte-grid/MoveResize.svelte +328 -0
  166. package/components/apps/svelte-grid/MoveResize.svelte.d.ts +46 -0
  167. package/components/apps/svelte-grid/types.d.ts +21 -0
  168. package/components/apps/svelte-grid/utils/container.d.ts +1 -0
  169. package/components/apps/svelte-grid/utils/container.js +4 -0
  170. package/components/apps/svelte-grid/utils/helper.d.ts +10 -0
  171. package/components/apps/svelte-grid/utils/helper.js +36 -0
  172. package/components/apps/svelte-grid/utils/item.d.ts +14 -0
  173. package/components/apps/svelte-grid/utils/item.js +192 -0
  174. package/components/apps/svelte-grid/utils/matrix.d.ts +6 -0
  175. package/components/apps/svelte-grid/utils/matrix.js +53 -0
  176. package/components/apps/svelte-grid/utils/other.d.ts +3 -0
  177. package/components/apps/svelte-grid/utils/other.js +30 -0
  178. package/components/apps/types.d.ts +19 -14
  179. package/components/apps/utils.d.ts +1 -1
  180. package/components/apps/utils.js +15 -9
  181. package/components/common/CloseButton.svelte +18 -0
  182. package/components/common/CloseButton.svelte.d.ts +27 -0
  183. package/components/common/badge/Badge.svelte +6 -1
  184. package/components/common/badge/Badge.svelte.d.ts +1 -0
  185. package/components/common/button/Button.svelte.d.ts +1 -1
  186. package/components/common/button/ButtonPopup.svelte.d.ts +1 -1
  187. package/components/common/drawer/DrawerContent.svelte +2 -6
  188. package/components/common/languageIcons/JavaScript.svelte +11 -0
  189. package/components/common/languageIcons/JavaScript.svelte.d.ts +25 -0
  190. package/components/common/languageIcons/LanguageIcon.svelte +3 -1
  191. package/components/common/languageIcons/LanguageIcon.svelte.d.ts +1 -1
  192. package/components/common/menu/Menu.svelte +1 -1
  193. package/components/common/menu/Menu.svelte.d.ts +1 -1
  194. package/components/common/popup/Popup.svelte +2 -1
  195. package/components/common/popup/Popup.svelte.d.ts +9 -0
  196. package/components/common/table/AppRow.svelte +1 -4
  197. package/components/common/table/FlowRow.svelte +1 -4
  198. package/components/common/table/ScriptRow.svelte +1 -4
  199. package/components/common/tabs/Tab.svelte +1 -0
  200. package/components/common/tabs/Tab.svelte.d.ts +2 -0
  201. package/components/flows/pickers/FlowScriptPicker.svelte.d.ts +1 -1
  202. package/components/graph/FlowGraph.svelte +1 -1
  203. package/components/propertyPicker/ObjectViewer.svelte +1 -1
  204. package/components/propertyPicker/PropPicker.svelte +4 -1
  205. package/components/sidebar/SidebarContent.svelte +2 -2
  206. package/consts.js +1 -1
  207. package/history.js +8 -1
  208. package/package.json +24 -28
  209. package/utils.js +0 -1
  210. package/components/apps/editor/AppComponentInputs.svelte +0 -13
  211. package/components/apps/editor/AppComponentInputs.svelte.d.ts +0 -20
  212. package/components/apps/editor/settingsPanel/MoveToOtherGrid.svelte +0 -92
  213. package/components/apps/editor/settingsPanel/MoveToOtherGrid.svelte.d.ts +0 -18
  214. package/components/graph/svelvet/d3/controllers/README.md +0 -3
  215. package/components/graph/svelvet/d3/controllers/d3Old.d.ts +0 -1
  216. package/components/graph/svelvet/d3/controllers/d3Old.js +0 -43
  217. package/components/graph/svelvet/docs/CHANGELOG.md +0 -145
  218. package/components/graph/svelvet/docs/DESIGN_PATTERNS.md +0 -44
  219. package/components/graph/svelvet/docs/DOCUMENTATION.md +0 -5
  220. package/components/graph/svelvet/docs/README.md +0 -34
  221. package/components/graph/svelvet/docs/TODO.md +0 -14
  222. package/components/graph/svelvet/docs/Tutorials.md +0 -25
  223. package/components/graph/svelvet/docs/images/css-background-after.png +0 -0
  224. package/components/graph/svelvet/docs/images/css-background-before.png +0 -0
  225. package/components/graph/svelvet/docs/images/custom-edges-after.png +0 -0
  226. package/components/graph/svelvet/docs/images/custom-edges-before.png +0 -0
  227. package/components/graph/svelvet/docs/images/custom-nodes-after.png +0 -0
  228. package/components/graph/svelvet/docs/images/custom-nodes-before.png +0 -0
  229. package/components/graph/svelvet/docs/images/custom-svelte-components-after.png +0 -0
  230. package/components/graph/svelvet/docs/images/custom-svelte-components-before.png +0 -0
  231. package/components/graph/svelvet/docs/images/html-docs-after.png +0 -0
  232. package/components/graph/svelvet/docs/images/html-docs-before.png +0 -0
  233. package/components/graph/svelvet/docs/images/minimap-after.png +0 -0
  234. package/components/graph/svelvet/docs/images/minimap-before.png +0 -0
  235. package/components/graph/svelvet/docs/images/node-classes-after.png +0 -0
  236. package/components/graph/svelvet/docs/images/node-classes-before.png +0 -0
  237. package/components/graph/svelvet/docs/images/node-create-after.png +0 -0
  238. package/components/graph/svelvet/docs/images/node-create-before.png +0 -0
@@ -9,6 +9,7 @@ import ToggleButtonGroup from '../../common/toggleButton/ToggleButtonGroup.svelt
9
9
  import DisplayResult from '../../DisplayResult.svelte';
10
10
  import Dropdown from '../../Dropdown.svelte';
11
11
  import FlowProgressBar from '../../flows/FlowProgressBar.svelte';
12
+ import { idMutex } from '../../flows/flowStateUtils';
12
13
  import FlowStatusViewer from '../../FlowStatusViewer.svelte';
13
14
  import JobArgs from '../../JobArgs.svelte';
14
15
  import LogViewer from '../../LogViewer.svelte';
@@ -173,7 +174,11 @@ let job = undefined;
173
174
  let testIsLoading = false;
174
175
  $: selectedJobId && testJobLoader?.watchJob(selectedJobId);
175
176
  $: hasErrors = Object.keys($errorByComponent).length > 0;
177
+ let lock = false;
176
178
  function onKeyDown(event) {
179
+ if (lock)
180
+ return;
181
+ lock = true;
177
182
  switch (event.key) {
178
183
  case 'Z':
179
184
  if (event.ctrlKey) {
@@ -212,6 +217,7 @@ function onKeyDown(event) {
212
217
  // break
213
218
  // }
214
219
  }
220
+ lock = false;
215
221
  }
216
222
  </script>
217
223
 
@@ -417,12 +423,12 @@ function onKeyDown(event) {
417
423
  <ToggleButton position="left" value="dnd" size="xs">
418
424
  <div class="inline-flex gap-1 items-center">
419
425
  <Pencil size={14} />
420
- <span class="hidden md:inline">Editor</span>
426
+ <span class="hidden lg:inline">Editor</span>
421
427
  </div>
422
428
  </ToggleButton>
423
429
  <ToggleButton position="right" value="preview" size="xs">
424
430
  <div class="inline-flex gap-1 items-center">
425
- <Eye size={14} /> <span class="hidden md:inline">Preview</span>
431
+ <Eye size={14} /> <span class="hidden lg:inline">Preview</span>
426
432
  </div>
427
433
  </ToggleButton>
428
434
  </ToggleButtonGroup>
@@ -439,42 +445,46 @@ function onKeyDown(event) {
439
445
  </div>
440
446
 
441
447
  <div class="hidden lg:block">
442
- <ToggleButtonGroup bind:selected={$app.fullscreen}>
443
- <ToggleButton position="left" value={false} size="xs">
444
- <div class="flex gap-1 justify-start items-center">
445
- <AlignHorizontalSpaceAround size={14} />
446
- <Tooltip light class="mb-0.5">
447
- The max width is 1168px and the content stay centered instead of taking the full page
448
- width
449
- </Tooltip>
450
- </div>
451
- </ToggleButton>
452
- <ToggleButton position="right" value={true} size="xs">
453
- <Expand size={14} />
454
- </ToggleButton>
455
- </ToggleButtonGroup>
448
+ {#if $app}
449
+ <ToggleButtonGroup bind:selected={$app.fullscreen}>
450
+ <ToggleButton position="left" value={false} size="xs">
451
+ <div class="flex gap-1 justify-start items-center">
452
+ <AlignHorizontalSpaceAround size={14} />
453
+ <Tooltip light class="mb-0.5">
454
+ The max width is 1168px and the content stay centered instead of taking the full
455
+ page width
456
+ </Tooltip>
457
+ </div>
458
+ </ToggleButton>
459
+ <ToggleButton position="right" value={true} size="xs">
460
+ <Expand size={14} />
461
+ </ToggleButton>
462
+ </ToggleButtonGroup>
463
+ {/if}
456
464
  </div>
457
465
  </div>
458
466
  {#if $focusedGrid !== undefined}
459
- <Badge color="indigo">
460
- <div class="flex flex-row gap-2 justify-center items-center">
461
- <div>{`Sub grid: ${$focusedGrid.parentComponentId} (${$focusedGrid.subGridIndex})`}</div>
462
- <button
463
- on:click={() => {
464
- $selectedComponent = undefined
465
- $focusedGrid = undefined
466
- }}
467
- >
468
- <X size={14} />
469
- </button>
470
- </div>
471
- </Badge>
467
+ <div class="hidden lg:block">
468
+ <Badge color="indigo">
469
+ <div class="flex flex-row gap-2 justify-center items-center">
470
+ <div>{`Sub grid: ${$focusedGrid.parentComponentId} (${$focusedGrid.subGridIndex})`}</div>
471
+ <button
472
+ on:click={() => {
473
+ $selectedComponent = undefined
474
+ $focusedGrid = undefined
475
+ }}
476
+ >
477
+ <X size={14} />
478
+ </button>
479
+ </div>
480
+ </Badge>
481
+ </div>
472
482
  {/if}
473
483
 
474
484
  <div class="flex flex-row gap-2 justify-end items-center overflow-visible">
475
485
  <Dropdown
476
486
  placement="bottom-end"
477
- btnClasses="!text-gray-700 !bg-transparent hover:!bg-gray-400/20 !p-[6px] hidden lg:block"
487
+ btnClasses="hidden lg:block"
478
488
  dropdownItems={[
479
489
  {
480
490
  displayName: 'JSON',
@@ -499,9 +509,7 @@ function onKeyDown(event) {
499
509
  }
500
510
  }
501
511
  ]}
502
- >
503
- <MoreVertical size={20} />
504
- </Dropdown>
512
+ />
505
513
  <span class="hidden md:inline">
506
514
  <Button on:click={() => (inputsDrawerOpen = true)} color="light" size="xs" variant="border">
507
515
  <span class="flex gap-2">
@@ -518,7 +526,7 @@ function onKeyDown(event) {
518
526
  variant="border"
519
527
  startIcon={{ icon: faBug }}
520
528
  >
521
- <span class="hidden md:inline">Debug Runs</span>
529
+ <span class="hidden xl:inline">Debug Runs</span>
522
530
  </Button>
523
531
  </span>
524
532
  <AppExportButton bind:this={appExport} />
@@ -529,7 +537,7 @@ function onKeyDown(event) {
529
537
  variant="border"
530
538
  startIcon={{ icon: faExternalLink }}
531
539
  >
532
- <span class="hidden md:inline">Publish</span>
540
+ <span class="hidden xl:inline">Publish</span>
533
541
  </Button>
534
542
  {#if appPath == ''}
535
543
  <Button
@@ -1,10 +1,15 @@
1
- <script>import { onMount, setContext } from 'svelte';
1
+ <script>import { setContext } from 'svelte';
2
2
  import { writable } from 'svelte/store';
3
3
  import { buildWorld } from '../rx';
4
- import GridEditor from './GridEditor.svelte';
5
4
  import { classNames } from '../../../utils';
6
5
  import Button from '../../common/button/Button.svelte';
7
6
  import { Unlock } from 'lucide-svelte';
7
+ import RecomputeAllComponents from './RecomputeAllComponents.svelte';
8
+ import GridViewer from './GridViewer.svelte';
9
+ import { Component } from './component';
10
+ import { twMerge } from 'tailwind-merge';
11
+ import { columnConfiguration } from '../gridUtils';
12
+ import { HiddenComponent } from '../components';
8
13
  export let app;
9
14
  export let appPath;
10
15
  export let breakpoint;
@@ -16,8 +21,6 @@ export let context;
16
21
  export let noBackend = false;
17
22
  export let isLocked = false;
18
23
  const appStore = writable(app);
19
- const worldStore = writable(undefined);
20
- const staticOutputs = writable({});
21
24
  const selectedComponent = writable(undefined);
22
25
  const mode = writable('preview');
23
26
  const connectingInput = writable({
@@ -26,9 +29,9 @@ const connectingInput = writable({
26
29
  hoveredComponent: undefined
27
30
  });
28
31
  const runnableComponents = writable({});
32
+ const parentWidth = writable(0);
29
33
  setContext('AppViewerContext', {
30
- worldStore,
31
- staticOutputs,
34
+ worldStore: buildWorld(context),
32
35
  app: appStore,
33
36
  summary: writable(summary),
34
37
  selectedComponent,
@@ -47,23 +50,20 @@ setContext('AppViewerContext', {
47
50
  openDebugRun: writable(undefined),
48
51
  focusedGrid: writable(undefined),
49
52
  stateId: writable(0),
50
- parentWidth: writable(0)
53
+ parentWidth,
54
+ state: writable({}),
55
+ componentControl: writable({})
51
56
  });
52
57
  setContext('AppEditorContext', {
53
58
  history: undefined,
54
- componentControl: writable({}),
55
- pickVariableCallback: writable(undefined)
56
- });
57
- let mounted = false;
58
- onMount(() => {
59
- mounted = true;
59
+ pickVariableCallback: writable(undefined),
60
+ ontextfocus: writable(undefined)
60
61
  });
61
62
  let ncontext = context;
62
63
  function hashchange(e) {
63
64
  ncontext.hash = e.newURL.split('#')[1];
64
65
  ncontext = ncontext;
65
66
  }
66
- $: mounted && ($worldStore = buildWorld($staticOutputs, $worldStore, ncontext));
67
67
  $: width = $breakpoint === 'sm' ? 'max-w-[640px]' : 'w-full ';
68
68
  $: lockedClasses = isLocked ? '!max-h-[400px] overflow-hidden pointer-events-none' : '';
69
69
  </script>
@@ -79,9 +79,48 @@ $: lockedClasses = isLocked ? '!max-h-[400px] overflow-hidden pointer-events-non
79
79
  >
80
80
  {#if $appStore.grid}
81
81
  <div class={classNames('mx-auto', width)}>
82
- <GridEditor {policy} />
82
+ <div
83
+ class="w-full sticky top-0 flex justify-between border-b bg-gray-50 px-4 py-1 items-center gap-4"
84
+ style="z-index: 1000;"
85
+ >
86
+ <h2 class="truncate">{summary}</h2>
87
+ <RecomputeAllComponents />
88
+ <div class="text-2xs text-gray-600">
89
+ {policy.on_behalf_of ? `on behalf of ${policy.on_behalf_of_email}` : ''}
90
+ </div>
91
+ </div>
83
92
  </div>
84
93
  {/if}
94
+ <div
95
+ style={app.css?.['app']?.['grid']?.style}
96
+ class={twMerge('px-4 pt-4 pb-2 overflow-visible', app.css?.['app']?.['grid']?.class ?? '')}
97
+ bind:clientWidth={$parentWidth}
98
+ >
99
+ <div>
100
+ <GridViewer
101
+ onTopId={$selectedComponent}
102
+ items={app.grid}
103
+ let:dataItem
104
+ rowHeight={36}
105
+ cols={columnConfiguration}
106
+ gap={[4, 2]}
107
+ >
108
+ <!-- svelte-ignore a11y-click-events-have-key-events -->
109
+ <div
110
+ class={'h-full w-full center-center'}
111
+ on:pointerdown={() => ($selectedComponent = dataItem.data.id)}
112
+ >
113
+ <Component
114
+ render={true}
115
+ pointerdown={false}
116
+ component={dataItem.data}
117
+ selected={false}
118
+ locked={true}
119
+ />
120
+ </div>
121
+ </GridViewer>
122
+ </div>
123
+ </div>
85
124
  </div>
86
125
 
87
126
  {#if isLocked}
@@ -97,3 +136,17 @@ $: lockedClasses = isLocked ? '!max-h-[400px] overflow-hidden pointer-events-non
97
136
  </div>
98
137
  {/if}
99
138
  </div>
139
+
140
+ {#if app.hiddenInlineScripts}
141
+ {#each app.hiddenInlineScripts as script, index}
142
+ {#if script}
143
+ <HiddenComponent
144
+ id={`bg_${index}`}
145
+ inlineScript={script.inlineScript}
146
+ name={script.name}
147
+ fields={script.fields}
148
+ autoRefresh={script.autoRefresh ?? false}
149
+ />
150
+ {/if}
151
+ {/each}
152
+ {/if}
@@ -33,13 +33,14 @@ function openDebugRuns() {
33
33
 
34
34
  {#if pointerdown || selected || hover}
35
35
  <button
36
- title="Position locking"
36
+ title="Lock Position"
37
37
  class={classNames(
38
38
  'text-gray-800 px-1 text-2xs py-0.5 font-bold w-fit shadow border border-gray-300 absolute -top-1 right-[2.5rem] z-50 cursor-pointer',
39
39
  ' hover:bg-gray-300',
40
40
  selected ? 'bg-gray-200/80' : 'bg-gray-200/80'
41
41
  )}
42
42
  on:click={() => dispatch('lock')}
43
+ on:pointerdown|stopPropagation
43
44
  >
44
45
  {#if locked}
45
46
  <Anchor aria-label="Unlock position" size={14} class="text-orange-500" />
@@ -55,6 +56,7 @@ function openDebugRuns() {
55
56
  selected ? 'bg-gray-200/80' : 'bg-gray-200/80'
56
57
  )}
57
58
  on:click={() => dispatch('expand')}
59
+ on:pointerdown|stopPropagation
58
60
  >
59
61
  <Expand aria-label="Expand position" size={14} />
60
62
  </button>
@@ -9,6 +9,7 @@ declare const __propDef: {
9
9
  hover?: boolean | undefined;
10
10
  };
11
11
  events: {
12
+ pointerdown: PointerEvent;
12
13
  mousedown: MouseEvent;
13
14
  lock: CustomEvent<any>;
14
15
  expand: CustomEvent<any>;
@@ -1,7 +1,6 @@
1
- <script>import { getContext, afterUpdate, setContext } from 'svelte';
2
- import Grid from '@windmill-labs/svelte-grid';
1
+ <script>import { getContext, afterUpdate } from 'svelte';
3
2
  import { classNames } from '../../../utils';
4
- import { columnConfiguration, disableDrag, enableDrag, isFixed, toggleFixed } from '../gridUtils';
3
+ import { columnConfiguration, isFixed, toggleFixed } from '../gridUtils';
5
4
  import { twMerge } from 'tailwind-merge';
6
5
  import RecomputeAllComponents from './RecomputeAllComponents.svelte';
7
6
  import HiddenComponent from '../components/helpers/HiddenComponent.svelte';
@@ -9,24 +8,10 @@ import Component from './component/Component.svelte';
9
8
  import { deepEqual } from 'fast-equals';
10
9
  import { push } from '../../../history';
11
10
  import { expandGriditem, findGridItem } from './appUtils';
11
+ import Grid from '../svelte-grid/Grid.svelte';
12
12
  export let policy;
13
- const { selectedComponent, app, mode, connectingInput, staticOutputs, runnableComponents, summary, focusedGrid, parentWidth, breakpoint } = getContext('AppViewerContext');
13
+ const { selectedComponent, app, mode, connectingInput, runnableComponents, summary, focusedGrid, parentWidth, breakpoint } = getContext('AppViewerContext');
14
14
  const { history } = getContext('AppEditorContext');
15
- // The drag is disabled when the user is connecting an input
16
- // or when the user is previewing the app
17
- // or when the focused grid is a subgrid
18
- $: setAllDrags($mode === 'preview' || $connectingInput.opened);
19
- function setAllDrags(enable) {
20
- const fct = enable ? disableDrag : enableDrag;
21
- $app.grid.map((gridItem) => {
22
- const disabledGridItem = fct(gridItem);
23
- if (disabledGridItem?.data?.subGrids) {
24
- disabledGridItem.data.subGrids = disabledGridItem.data.subGrids.map((subgrid) => subgrid?.map((subgridItem) => fct(subgridItem)) ?? []);
25
- }
26
- return disabledGridItem;
27
- });
28
- Object.values($app.subgrids ?? {}).map((subgrid) => subgrid?.map((subgridItem) => fct(subgridItem)) ?? []);
29
- }
30
15
  function removeGridElement(component) {
31
16
  if (component) {
32
17
  $app.grid = $app.grid.filter((gridComponent) => {
@@ -47,20 +32,16 @@ function removeGridElement(component) {
47
32
  }
48
33
  return gridComponent.data.id !== component?.id;
49
34
  });
50
- // Delete static inputs
51
- delete $staticOutputs[component.id];
52
- $staticOutputs = $staticOutputs;
53
35
  delete $runnableComponents[component.id];
54
36
  $runnableComponents = $runnableComponents;
55
37
  $selectedComponent = undefined;
56
38
  }
57
39
  }
58
40
  function selectComponent(id) {
59
- // Component selection is handled manually in the Map component (pointerdown
60
- // event propagation is stopped to enable paning).
61
- // Update the 'selectComponent()' function as well when this is updated.
62
41
  if (!$connectingInput.opened) {
63
- $selectedComponent = id;
42
+ if ($selectedComponent !== id) {
43
+ $selectedComponent = id;
44
+ }
64
45
  $focusedGrid = undefined;
65
46
  }
66
47
  }
@@ -128,62 +109,62 @@ afterUpdate(() => {
128
109
  <div class={!$focusedGrid && $mode !== 'preview' ? 'border-gray-400 border border-dashed' : ''}>
129
110
  <Grid
130
111
  onTopId={$selectedComponent}
131
- fillSpace={false}
132
- bind:items={$app.grid}
112
+ items={$app.grid}
113
+ on:redraw={(e) => {
114
+ push(history, $app)
115
+ $app.grid = e.detail
116
+ }}
133
117
  let:dataItem
134
118
  rowHeight={36}
135
119
  cols={columnConfiguration}
136
120
  fastStart={true}
137
121
  gap={[4, 2]}
138
122
  >
139
- {#each $app.grid as gridComponent (gridComponent.id)}
140
- {#if gridComponent?.data?.id && gridComponent?.data?.id === dataItem?.data?.id}
141
- <!-- svelte-ignore a11y-click-events-have-key-events -->
142
- {#if $connectingInput.opened}
143
- <div
144
- on:pointerenter={() => ($connectingInput.hoveredComponent = gridComponent.data.id)}
145
- on:pointerleave={() => ($connectingInput.hoveredComponent = undefined)}
146
- class="absolute w-full h-full bg-black border-2 bg-opacity-25 z-20 flex justify-center items-center"
147
- />
148
- <div
149
- style="transform: translate(-50%, -50%);"
150
- class="absolute w-fit justify-center bg-indigo-500/90 left-[50%] top-[50%] z-50 px-6 rounded border text-white py-2 text-5xl center-center"
151
- >
152
- {dataItem.data.id}
153
- </div>
154
- {/if}
155
- <!-- svelte-ignore a11y-click-events-have-key-events -->
156
- <div
157
- on:click|stopPropagation
158
- on:pointerdown={() => selectComponent(dataItem.data.id)}
159
- class={classNames(
160
- 'h-full w-full center-center',
161
- $selectedComponent === dataItem.data.id ? 'active-grid-item' : '',
162
- gridComponent.data.card ? 'border border-gray-100' : ''
163
- )}
164
- >
165
- <Component
166
- render={true}
167
- {pointerdown}
168
- component={gridComponent.data}
169
- selected={$selectedComponent === dataItem.data.id}
170
- locked={isFixed(gridComponent)}
171
- on:delete={() => removeGridElement(gridComponent.data)}
172
- on:lock={() => {
173
- const gridItem = findGridItem($app, gridComponent.data.id)
174
- if (gridItem) {
175
- toggleFixed(gridItem)
176
- }
177
- }}
178
- on:expand={() => {
179
- push(history, $app)
180
- expandGriditem($app.grid, gridComponent, $breakpoint)
181
- $app = { ...$app }
182
- }}
183
- />
184
- </div>
185
- {/if}
186
- {/each}
123
+ <!-- svelte-ignore a11y-click-events-have-key-events -->
124
+ {#if $connectingInput.opened}
125
+ <div
126
+ on:pointerenter={() => ($connectingInput.hoveredComponent = dataItem.id)}
127
+ on:pointerleave={() => ($connectingInput.hoveredComponent = undefined)}
128
+ class="absolute w-full h-full bg-black border-2 bg-opacity-25 z-20 flex justify-center items-center"
129
+ />
130
+ <div
131
+ style="transform: translate(-50%, -50%);"
132
+ class="absolute w-fit justify-center bg-indigo-500/90 left-[50%] top-[50%] z-50 px-6 rounded border text-white py-2 text-5xl center-center"
133
+ >
134
+ {dataItem.data.id}
135
+ </div>
136
+ {/if}
137
+ <!-- svelte-ignore a11y-click-events-have-key-events -->
138
+ <div
139
+ on:click|stopPropagation
140
+ on:pointerdown={() => selectComponent(dataItem.data.id)}
141
+ class={classNames(
142
+ 'h-full w-full center-center',
143
+ $selectedComponent === dataItem.data.id ? 'active-grid-item' : ''
144
+ )}
145
+ >
146
+ <Component
147
+ render={true}
148
+ {pointerdown}
149
+ component={dataItem.data}
150
+ selected={$selectedComponent === dataItem.data.id}
151
+ locked={isFixed(dataItem)}
152
+ on:delete={() => removeGridElement(dataItem.data)}
153
+ on:lock={() => {
154
+ const gridItem = findGridItem($app, dataItem.data.id)
155
+ if (gridItem) {
156
+ toggleFixed(gridItem)
157
+ }
158
+ $app = $app
159
+ }}
160
+ on:expand={() => {
161
+ push(history, $app)
162
+ $selectedComponent = dataItem.data.id
163
+ expandGriditem($app.grid, dataItem, $breakpoint)
164
+ $app = $app
165
+ }}
166
+ />
167
+ </div>
187
168
  </Grid>
188
169
  </div>
189
170
  </div>
@@ -197,7 +178,7 @@ afterUpdate(() => {
197
178
  inlineScript={script.inlineScript}
198
179
  name={script.name}
199
180
  fields={script.fields}
200
- bind:staticOutputs={$staticOutputs[`bg_${index}`]}
181
+ autoRefresh={script.autoRefresh ?? false}
201
182
  />
202
183
  {/if}
203
184
  {/each}
@@ -3,9 +3,10 @@ import ComponentPanel from './settingsPanel/ComponentPanel.svelte';
3
3
  const { selectedComponent } = getContext('AppViewerContext');
4
4
  export let gridItems;
5
5
  export let parent;
6
+ //$: sortedItems = gridItems.sort((a, b) => a.id.localeCompare - b.id)
6
7
  </script>
7
8
 
8
- {#each gridItems as gridItem, i (gridItem?.data?.id ?? i)}
9
+ {#each gridItems as gridItem (gridItem.id)}
9
10
  {#if gridItem?.data?.id === $selectedComponent}
10
11
  <ComponentPanel {parent} bind:component={gridItem.data} />
11
12
  {:else if gridItem?.data?.type === 'tablecomponent'}
@@ -18,6 +19,7 @@ export let parent;
18
19
  bind:component={actionButton}
19
20
  duplicateMoveAllowed={false}
20
21
  onDelete={() => {
22
+ //@ts-ignore
21
23
  gridItem.data.actionButtons = gridItem.data.actionButtons.filter(
22
24
  (c) => c.id !== actionButton.id
23
25
  )
@@ -0,0 +1,91 @@
1
+ <script>import { onMount, createEventDispatcher } from 'svelte';
2
+ import { getColumn, throttle } from '../svelte-grid/utils/other';
3
+ import { getContainerHeight } from '../svelte-grid/utils/container';
4
+ import { specifyUndefinedColumns } from '../svelte-grid/utils/item';
5
+ const dispatch = createEventDispatcher();
6
+ export let items;
7
+ export let rowHeight;
8
+ export let cols;
9
+ export let gap = [10, 10];
10
+ export let throttleUpdate = 100;
11
+ export let onTopId = undefined;
12
+ export let containerWidth = undefined;
13
+ export let parentWidth = undefined;
14
+ let getComputedCols;
15
+ let container;
16
+ $: [gapX, gapY] = gap;
17
+ let xPerPx = 0;
18
+ let yPerPx = rowHeight;
19
+ $: containerHeight = getContainerHeight(items, yPerPx, getComputedCols);
20
+ const onResize = throttle(() => {
21
+ items = specifyUndefinedColumns(items, getComputedCols, cols);
22
+ dispatch('resize', {
23
+ cols: getComputedCols,
24
+ xPerPx,
25
+ yPerPx,
26
+ width: containerWidth
27
+ });
28
+ }, throttleUpdate);
29
+ onMount(() => {
30
+ const sizeObserver = new ResizeObserver((entries) => {
31
+ requestAnimationFrame(() => {
32
+ let width = entries[0].contentRect.width;
33
+ if (width === containerWidth)
34
+ return;
35
+ getComputedCols = getColumn(parentWidth ?? width, cols);
36
+ xPerPx = width / getComputedCols;
37
+ if (!containerWidth) {
38
+ items = specifyUndefinedColumns(items, getComputedCols, cols);
39
+ dispatch('mount', {
40
+ cols: getComputedCols,
41
+ xPerPx,
42
+ yPerPx // same as rowHeight
43
+ });
44
+ }
45
+ else {
46
+ onResize();
47
+ }
48
+ containerWidth = width;
49
+ });
50
+ });
51
+ sizeObserver.observe(container);
52
+ return () => sizeObserver.disconnect();
53
+ });
54
+ </script>
55
+
56
+ <div class="svlt-grid-container" style="height: {containerHeight}px" bind:this={container}>
57
+ {#if xPerPx}
58
+ {#each items as item (item.id)}
59
+ {@const onTop = item.id == onTopId}
60
+ {@const width =
61
+ Math.min(getComputedCols, item[getComputedCols] && item[getComputedCols].w) * xPerPx -
62
+ gapX * 2}
63
+ {@const height = (item[getComputedCols] && item[getComputedCols].h) * yPerPx - gapY * 2}
64
+ {@const top = (item[getComputedCols] && item[getComputedCols].y) * yPerPx + gapY}
65
+ {@const left = (item[getComputedCols] && item[getComputedCols].x) * xPerPx + gapX}
66
+ <div
67
+ class="svlt-grid-item"
68
+ style="width: {width}px; height:{height}px; {onTop
69
+ ? 'z-index: 1000;'
70
+ : ''} top: {top}px; left: {left}px;"
71
+ >
72
+ {#if item[getComputedCols]}
73
+ <slot dataItem={item} item={item[getComputedCols]} />
74
+ {/if}
75
+ </div>
76
+ {/each}
77
+ {/if}
78
+ </div>
79
+
80
+ <style>
81
+ .svlt-grid-container {
82
+ position: relative;
83
+ width: 100%;
84
+ }
85
+ .svlt-grid-item {
86
+ touch-action: none;
87
+ position: absolute;
88
+ will-change: auto;
89
+ backface-visibility: hidden;
90
+ -webkit-backface-visibility: hidden;
91
+ }</style>
@@ -0,0 +1,32 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type { FilledItem } from '../svelte-grid/types';
3
+ declare class __sveltets_Render<T> {
4
+ props(): {
5
+ items: FilledItem<T>[];
6
+ rowHeight: number;
7
+ cols: [number, number][];
8
+ gap?: number[] | undefined;
9
+ throttleUpdate?: number | undefined;
10
+ onTopId?: string | undefined;
11
+ containerWidth?: number | undefined;
12
+ parentWidth?: number | undefined;
13
+ };
14
+ events(): {
15
+ resize: CustomEvent<any>;
16
+ mount: CustomEvent<any>;
17
+ } & {
18
+ [evt: string]: CustomEvent<any>;
19
+ };
20
+ slots(): {
21
+ default: {
22
+ dataItem: FilledItem<T>;
23
+ item: Required<import("../svelte-grid/types").ItemLayout>;
24
+ };
25
+ };
26
+ }
27
+ export type GridViewerProps<T> = ReturnType<__sveltets_Render<T>['props']>;
28
+ export type GridViewerEvents<T> = ReturnType<__sveltets_Render<T>['events']>;
29
+ export type GridViewerSlots<T> = ReturnType<__sveltets_Render<T>['slots']>;
30
+ export default class GridViewer<T> extends SvelteComponentTyped<GridViewerProps<T>, GridViewerEvents<T>, GridViewerSlots<T>> {
31
+ }
32
+ export {};
@@ -2,7 +2,7 @@
2
2
  import { ChevronDown, RefreshCw } from 'lucide-svelte';
3
3
  import { getContext, onMount } from 'svelte';
4
4
  import Button from '../../common/button/Button.svelte';
5
- const { runnableComponents } = getContext('AppViewerContext');
5
+ const { runnableComponents, app } = getContext('AppViewerContext');
6
6
  let loading = false;
7
7
  let timeout = undefined;
8
8
  let interval = undefined;
@@ -29,6 +29,12 @@ function setInter(inter) {
29
29
  function refresh() {
30
30
  loading = true;
31
31
  Promise.all(Object.keys($runnableComponents).map((id) => {
32
+ if (id.startsWith('bg_')) {
33
+ let index = parseInt(id.split('_')[1]);
34
+ if (!$app.hiddenInlineScripts[index]?.autoRefresh) {
35
+ return;
36
+ }
37
+ }
32
38
  return $runnableComponents?.[id]?.();
33
39
  })).finally(() => {
34
40
  loading = false;