windmill-components 1.55.1 → 1.55.2

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 (199) hide show
  1. package/common.d.ts +1 -1
  2. package/common.js +3 -0
  3. package/components/AppConnect.svelte +2 -2
  4. package/components/ArgInput.svelte +1 -1
  5. package/components/CronInput.svelte +54 -53
  6. package/components/Dropdown.svelte +21 -9
  7. package/components/Editor.svelte +10 -10
  8. package/components/EditorBar.svelte +2 -2
  9. package/components/FlowBuilder.svelte +41 -25
  10. package/components/FlowGraphViewer.svelte +6 -2
  11. package/components/FlowMetadata.svelte +8 -3
  12. package/components/FolderEditor.svelte +299 -0
  13. package/components/FolderEditor.svelte.d.ts +16 -0
  14. package/components/FolderInfo.svelte +13 -0
  15. package/components/FolderInfo.svelte.d.ts +16 -0
  16. package/components/FolderUsageInfo.svelte +17 -0
  17. package/components/FolderUsageInfo.svelte.d.ts +16 -0
  18. package/components/GroupEditor.svelte +287 -0
  19. package/components/GroupEditor.svelte.d.ts +18 -0
  20. package/components/GroupInfo.svelte +22 -0
  21. package/components/GroupInfo.svelte.d.ts +16 -0
  22. package/components/InputTransformForm.svelte +16 -7
  23. package/components/MoveDrawer.svelte +75 -0
  24. package/components/MoveDrawer.svelte.d.ts +19 -0
  25. package/components/Path.svelte +243 -96
  26. package/components/Path.svelte.d.ts +1 -4
  27. package/components/RadioButton.svelte +2 -0
  28. package/components/RadioButton.svelte.d.ts +1 -0
  29. package/components/ResourceEditor.svelte +11 -16
  30. package/components/RunForm.svelte +20 -3
  31. package/components/RunForm.svelte.d.ts +1 -1
  32. package/components/ScheduleEditor.svelte +226 -0
  33. package/components/ScheduleEditor.svelte.d.ts +26 -0
  34. package/components/ScriptBuilder.svelte +109 -114
  35. package/components/ScriptEditor.svelte +17 -14
  36. package/components/ScriptEditor.svelte.d.ts +1 -0
  37. package/components/ScriptPicker.svelte +55 -29
  38. package/components/ScriptPicker.svelte.d.ts +1 -0
  39. package/components/ShareModal.svelte +94 -73
  40. package/components/ShareModal.svelte.d.ts +2 -4
  41. package/components/SimpleEditor.svelte +15 -10
  42. package/components/TemplateEditor.svelte +496 -0
  43. package/components/TemplateEditor.svelte.d.ts +25 -0
  44. package/components/TestJobLoader.svelte +1 -1
  45. package/components/VariableEditor.svelte +2 -1
  46. package/components/apps/CreateApp.svelte +1 -1
  47. package/components/apps/components/buttons/AppButton.svelte +3 -3
  48. package/components/apps/components/dataDisplay/AppBarChart.svelte +5 -4
  49. package/components/apps/components/dataDisplay/AppPieChart.svelte +3 -3
  50. package/components/apps/components/dateInputs/AppDateInput.svelte +34 -0
  51. package/components/apps/components/dateInputs/AppDateInput.svelte.d.ts +22 -0
  52. package/components/apps/components/form/AppForm.svelte +4 -5
  53. package/components/apps/components/form/AppForm.svelte.d.ts +0 -1
  54. package/components/apps/components/helpers/AlignWrapper.svelte +3 -4
  55. package/components/apps/components/helpers/AlignWrapper.svelte.d.ts +2 -3
  56. package/components/apps/components/helpers/InputValue.svelte +54 -5
  57. package/components/apps/components/helpers/InputValue.svelte.d.ts +1 -0
  58. package/components/apps/components/helpers/NonRunnableComponent.svelte +2 -1
  59. package/components/apps/components/helpers/RefreshButton.svelte +20 -0
  60. package/components/apps/components/helpers/RefreshButton.svelte.d.ts +16 -0
  61. package/components/apps/components/helpers/RunnableComponent.svelte +38 -42
  62. package/components/apps/components/helpers/RunnableWrapper.svelte +6 -3
  63. package/components/apps/components/numberInputs/AppNumberInput.svelte +8 -11
  64. package/components/apps/components/numberInputs/AppNumberInput.svelte.d.ts +1 -0
  65. package/components/apps/components/selectInputs/AppCheckbox.svelte +1 -1
  66. package/components/apps/components/selectInputs/AppSelect.svelte +26 -0
  67. package/components/apps/components/selectInputs/AppSelect.svelte.d.ts +22 -0
  68. package/components/apps/components/table/AppTable.svelte +159 -0
  69. package/components/apps/components/{dataDisplay → table}/AppTable.svelte.d.ts +0 -0
  70. package/components/apps/components/table/AppTableFooter.svelte +54 -0
  71. package/components/apps/components/table/AppTableFooter.svelte.d.ts +20 -0
  72. package/components/apps/components/table/tableOptions.d.ts +10 -0
  73. package/components/apps/components/table/tableOptions.js +11 -0
  74. package/components/apps/components/textInputs/AppTextInput.svelte +17 -10
  75. package/components/apps/components/textInputs/AppTextInput.svelte.d.ts +2 -0
  76. package/components/apps/editor/AppEditor.svelte +35 -20
  77. package/components/apps/editor/AppEditorHeader.svelte +15 -7
  78. package/components/apps/editor/AppPreview.svelte +5 -3
  79. package/components/apps/editor/AppPreview.svelte.d.ts +4 -1
  80. package/components/apps/editor/ComponentEditor.svelte +21 -3
  81. package/components/apps/editor/ComponentEditor.svelte.d.ts +2 -0
  82. package/components/apps/editor/ComponentHeader.svelte +21 -4
  83. package/components/apps/editor/ComponentHeader.svelte.d.ts +2 -0
  84. package/components/apps/editor/GridEditor.svelte +40 -20
  85. package/components/apps/editor/RecomputeAllComponents.svelte +5 -7
  86. package/components/apps/editor/componentsPanel/ComponentList.svelte +30 -82
  87. package/components/apps/editor/componentsPanel/data.js +78 -29
  88. package/components/apps/editor/contextPanel/ComponentOutputViewer.svelte +5 -1
  89. package/components/apps/editor/contextPanel/ContextPanel.svelte +35 -152
  90. package/components/apps/editor/contextPanel/ContextPanel.svelte.d.ts +1 -3
  91. package/components/apps/editor/inlineScriptsPanel/EmptyInlineScript.svelte +64 -0
  92. package/components/apps/editor/inlineScriptsPanel/EmptyInlineScript.svelte.d.ts +18 -0
  93. package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +95 -0
  94. package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte.d.ts +20 -0
  95. package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte +32 -0
  96. package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte.d.ts +19 -0
  97. package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorPanel.svelte +63 -0
  98. package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorPanel.svelte.d.ts +17 -0
  99. package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanel.svelte +44 -0
  100. package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanel.svelte.d.ts +14 -0
  101. package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte +126 -0
  102. package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte.d.ts +16 -0
  103. package/components/apps/editor/settingsPanel/AlignmentEditor.svelte +41 -0
  104. package/components/apps/editor/settingsPanel/AlignmentEditor.svelte.d.ts +17 -0
  105. package/components/apps/editor/settingsPanel/ComponentInputTypeEditor.svelte +44 -0
  106. package/components/apps/editor/settingsPanel/ComponentInputTypeEditor.svelte.d.ts +18 -0
  107. package/components/apps/editor/settingsPanel/ComponentPanel.svelte +48 -130
  108. package/components/apps/editor/settingsPanel/ComponentPanel.svelte.d.ts +3 -0
  109. package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte +2 -2
  110. package/components/apps/editor/settingsPanel/InputsSpecsEditor.svelte +1 -1
  111. package/components/apps/editor/settingsPanel/Recompute.svelte +2 -2
  112. package/components/apps/editor/settingsPanel/SelectedRunnable.svelte +46 -0
  113. package/components/apps/editor/settingsPanel/SelectedRunnable.svelte.d.ts +17 -0
  114. package/components/apps/editor/settingsPanel/SubTypeEditor.svelte +1 -1
  115. package/components/apps/editor/settingsPanel/common/PanelSection.svelte +1 -1
  116. package/components/apps/editor/settingsPanel/{ConnectedInputEditor.svelte → inputEditor/ConnectedInputEditor.svelte} +1 -2
  117. package/components/apps/editor/settingsPanel/{ConnectedInputEditor.svelte.d.ts → inputEditor/ConnectedInputEditor.svelte.d.ts} +1 -1
  118. package/components/apps/editor/settingsPanel/inputEditor/RunnableInputEditor.svelte +12 -0
  119. package/components/apps/editor/settingsPanel/inputEditor/RunnableInputEditor.svelte.d.ts +17 -0
  120. package/components/apps/editor/settingsPanel/{StaticInputEditor.svelte → inputEditor/StaticInputEditor.svelte} +5 -5
  121. package/components/apps/editor/settingsPanel/{StaticInputEditor.svelte.d.ts → inputEditor/StaticInputEditor.svelte.d.ts} +1 -1
  122. package/components/apps/editor/settingsPanel/mainInput/InlineScriptList.svelte +6 -3
  123. package/components/apps/editor/settingsPanel/mainInput/RunnableSelector.svelte +66 -22
  124. package/components/apps/editor/settingsPanel/mainInput/RunnableSelector.svelte.d.ts +2 -3
  125. package/components/apps/editor/settingsPanel/mainInput/WorkspaceFlowList.svelte +1 -1
  126. package/components/apps/gridUtils.d.ts +3 -1
  127. package/components/apps/gridUtils.js +16 -1
  128. package/components/apps/inputType.d.ts +10 -4
  129. package/components/apps/rx.d.ts +8 -8
  130. package/components/apps/rx.js +17 -9
  131. package/components/apps/types.d.ts +14 -2
  132. package/components/apps/utils.d.ts +4 -3
  133. package/components/apps/utils.js +37 -5
  134. package/components/common/drawer/Drawer.svelte +1 -1
  135. package/components/common/drawer/Drawer.svelte.d.ts +1 -0
  136. package/components/common/table/FlowRow.svelte +21 -7
  137. package/components/common/table/FlowRow.svelte.d.ts +2 -0
  138. package/components/common/table/ScriptRow.svelte +22 -7
  139. package/components/common/table/ScriptRow.svelte.d.ts +2 -0
  140. package/components/common/toggleButton/ToggleButton.svelte +1 -1
  141. package/components/common/toggleButton/ToggleButtonGroup.svelte +1 -1
  142. package/components/common/toggleButton/ToggleButtonGroup.svelte.d.ts +1 -0
  143. package/components/flows/content/FlowEditorPanel.svelte +10 -16
  144. package/components/flows/content/FlowInputs.svelte +18 -4
  145. package/components/flows/content/FlowInputs.svelte.d.ts +1 -0
  146. package/components/flows/content/FlowModuleComponent.svelte +1 -1
  147. package/components/flows/content/FlowModuleWrapper.svelte +26 -1
  148. package/components/flows/content/FlowSchedules.svelte +5 -0
  149. package/components/flows/content/FlowSettings.svelte +13 -23
  150. package/components/flows/content/FlowSettings.svelte.d.ts +0 -1
  151. package/components/flows/header/FlowPreviewButtons.svelte +1 -0
  152. package/components/flows/map/FlowErrorHandlerItem.svelte +1 -1
  153. package/components/flows/map/FlowModuleSchemaMap.svelte +12 -3
  154. package/components/flows/map/FlowSettingsItem.svelte +8 -15
  155. package/components/flows/map/InsertModuleButton.svelte +29 -2
  156. package/components/flows/map/InsertModuleButton.svelte.d.ts +3 -1
  157. package/components/flows/map/MapItem.svelte +2 -1
  158. package/components/flows/map/MapItem.svelte.d.ts +1 -0
  159. package/components/flows/pickers/WorkspaceScriptPicker.svelte +3 -0
  160. package/components/flows/previousResults.js +1 -1
  161. package/components/graph/FlowGraph.svelte +13 -13
  162. package/components/home/ItemsList.svelte +20 -12
  163. package/components/jobs/JobDetail.svelte +9 -3
  164. package/components/sidebar/SidebarContent.svelte +4 -3
  165. package/components/sidebar/UserMenu.svelte +1 -1
  166. package/editorUtils.d.ts +7 -1
  167. package/editorUtils.js +98 -3
  168. package/es5.d.ts.txt +4526 -0
  169. package/gen/index.d.ts +2 -0
  170. package/gen/index.js +1 -0
  171. package/gen/models/CompletedJob.d.ts +1 -0
  172. package/gen/models/EditSchedule.d.ts +0 -2
  173. package/gen/models/Folder.d.ts +5 -0
  174. package/gen/models/Folder.js +4 -0
  175. package/gen/models/QueuedJob.d.ts +1 -0
  176. package/gen/models/Script.d.ts +1 -1
  177. package/gen/models/User.d.ts +1 -0
  178. package/gen/services/FolderService.d.ts +128 -0
  179. package/gen/services/FolderService.js +151 -0
  180. package/gen/services/GranularAclService.d.ts +3 -3
  181. package/gen/services/GroupService.d.ts +5 -1
  182. package/gen/services/GroupService.js +4 -1
  183. package/gen/services/JobService.d.ts +25 -5
  184. package/gen/services/JobService.js +10 -5
  185. package/gen/services/ScriptService.d.ts +2 -1
  186. package/gen/services/UserService.d.ts +9 -0
  187. package/gen/services/UserService.js +15 -0
  188. package/package.json +33 -9
  189. package/script_helpers.d.ts +2 -2
  190. package/script_helpers.js +4 -4
  191. package/stores.d.ts +1 -0
  192. package/utils.d.ts +3 -0
  193. package/utils.js +44 -7
  194. package/components/GroupModal.svelte +0 -98
  195. package/components/GroupModal.svelte.d.ts +0 -17
  196. package/components/apps/components/dataDisplay/AppTable.svelte +0 -132
  197. package/components/apps/components/dataDisplay/app.md +0 -49
  198. package/components/apps/editor/contextPanel/InlineScriptCreationPanel.svelte +0 -29
  199. package/components/apps/editor/contextPanel/InlineScriptCreationPanel.svelte.d.ts +0 -16
@@ -0,0 +1,54 @@
1
+ <script>import Button from '../../../common/button/Button.svelte';
2
+ import { faDownload } from '@fortawesome/free-solid-svg-icons';
3
+ export let result;
4
+ export let paginationEnabled = false;
5
+ export let table;
6
+ function downloadResultAsJSON() {
7
+ const dataStr = 'data:text/json;charset=utf-8,' + encodeURIComponent(JSON.stringify(result));
8
+ const downloadAnchorNode = document.createElement('a');
9
+ downloadAnchorNode.setAttribute('href', dataStr);
10
+ downloadAnchorNode.setAttribute('download', 'data.json');
11
+ document.body.appendChild(downloadAnchorNode);
12
+ downloadAnchorNode.click();
13
+ downloadAnchorNode.remove();
14
+ }
15
+ </script>
16
+
17
+ <div class="px-4 py-2 text-xs flex flex-row gap-2 items-center justify-between">
18
+ {#if paginationEnabled}
19
+ <div class="flex items-center gap-2 flex-row">
20
+ <Button
21
+ size="xs"
22
+ variant="border"
23
+ color="light"
24
+ on:click={() => $table.previousPage()}
25
+ disabled={!$table.getCanPreviousPage()}
26
+ >
27
+ Previous
28
+ </Button>
29
+ <Button
30
+ size="xs"
31
+ variant="border"
32
+ color="light"
33
+ on:click={() => $table.nextPage()}
34
+ disabled={!$table.getCanNextPage()}
35
+ >
36
+ Next
37
+ </Button>
38
+ {$table.getState().pagination.pageIndex + 1} of {$table.getPageCount()}
39
+ </div>
40
+ {:else}
41
+ <div />
42
+ {/if}
43
+ <div class="flex items-center gap-2 flex-row">
44
+ <Button
45
+ size="xs"
46
+ variant="border"
47
+ color="light"
48
+ on:click={downloadResultAsJSON}
49
+ startIcon={{ icon: faDownload }}
50
+ >
51
+ Download
52
+ </Button>
53
+ </div>
54
+ </div>
@@ -0,0 +1,20 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import type { Table } from '@tanstack/svelte-table';
3
+ import type { Readable } from 'svelte/store';
4
+ declare const __propDef: {
5
+ props: {
6
+ result: Record<string, any>[];
7
+ paginationEnabled?: boolean | undefined;
8
+ table: Readable<Table<Record<string, any>>>;
9
+ };
10
+ events: {
11
+ [evt: string]: CustomEvent<any>;
12
+ };
13
+ slots: {};
14
+ };
15
+ export type AppTableFooterProps = typeof __propDef.props;
16
+ export type AppTableFooterEvents = typeof __propDef.events;
17
+ export type AppTableFooterSlots = typeof __propDef.slots;
18
+ export default class AppTableFooter extends SvelteComponentTyped<AppTableFooterProps, AppTableFooterEvents, AppTableFooterSlots> {
19
+ }
20
+ export {};
@@ -0,0 +1,10 @@
1
+ declare const tableOptions: {
2
+ getCoreRowModel: (table: import("@tanstack/svelte-table").Table<unknown>) => () => import("@tanstack/svelte-table").RowModel<unknown>;
3
+ getPaginationRowModel: (table: import("@tanstack/svelte-table").Table<unknown>) => () => import("@tanstack/svelte-table").RowModel<unknown>;
4
+ initialState: {
5
+ pagination: {
6
+ pageSize: number;
7
+ };
8
+ };
9
+ };
10
+ export { tableOptions };
@@ -0,0 +1,11 @@
1
+ import { getCoreRowModel, getPaginationRowModel } from '@tanstack/svelte-table';
2
+ const tableOptions = {
3
+ getCoreRowModel: getCoreRowModel(),
4
+ getPaginationRowModel: getPaginationRowModel(),
5
+ initialState: {
6
+ pagination: {
7
+ pageSize: 10
8
+ }
9
+ }
10
+ };
11
+ export { tableOptions };
@@ -1,21 +1,28 @@
1
1
  <script>import { getContext } from 'svelte';
2
+ import AlignWrapper from '../helpers/AlignWrapper.svelte';
2
3
  import InputValue from '../helpers/InputValue.svelte';
3
4
  export let id;
4
5
  export let configuration;
6
+ export let inputType = 'text';
7
+ export let verticalAlignment = undefined;
5
8
  export const staticOutputs = ['result'];
6
9
  const { worldStore } = getContext('AppEditorContext');
7
- let value;
10
+ let input;
8
11
  let labelValue = 'Title';
9
12
  $: outputs = $worldStore?.outputsById[id];
10
- $: (value || !value) && outputs?.result.set(value || '');
13
+ function handleInput() {
14
+ outputs?.result.set(input.value);
15
+ }
11
16
  </script>
12
17
 
13
- <InputValue input={configuration.label} bind:value={labelValue} />
18
+ <InputValue {id} input={configuration.label} bind:value={labelValue} />
14
19
 
15
- <!-- svelte-ignore a11y-label-has-associated-control -->
16
- <label>
17
- <div>
18
- {labelValue}
19
- </div>
20
- <input type="text" bind:value placeholder="Type..." />
21
- </label>
20
+ <AlignWrapper {verticalAlignment}>
21
+ <input
22
+ type={inputType}
23
+ bind:this={input}
24
+ on:input={handleInput}
25
+ placeholder="Type..."
26
+ class="h-full"
27
+ />
28
+ </AlignWrapper>
@@ -4,6 +4,8 @@ declare const __propDef: {
4
4
  props: {
5
5
  id: string;
6
6
  configuration: Record<string, AppInput>;
7
+ inputType?: string | undefined;
8
+ verticalAlignment?: 'top' | 'center' | 'bottom' | undefined;
7
9
  staticOutputs?: string[] | undefined;
8
10
  };
9
11
  events: {
@@ -16,6 +16,7 @@ import ContextPanel from './contextPanel/ContextPanel.svelte';
16
16
  import { classNames } from '../../../utils';
17
17
  import AppPreview from './AppPreview.svelte';
18
18
  import { userStore } from '../../../stores';
19
+ import InlineScriptsPanel from './inlineScriptsPanel/InlineScriptsPanel.svelte';
19
20
  export let app;
20
21
  export let path;
21
22
  export let initialMode = 'dnd';
@@ -38,16 +39,23 @@ setContext('AppEditorContext', {
38
39
  mode,
39
40
  connectingInput,
40
41
  breakpoint,
41
- runnableComponents
42
+ runnableComponents,
43
+ appPath: path
42
44
  });
43
45
  let mounted = false;
44
46
  onMount(() => {
45
47
  mounted = true;
46
48
  });
47
- $: mounted && ($worldStore = buildWorld($staticOutputs));
48
- $: selectedTab = $selectedComponent ? 'settings' : 'insert';
49
+ $: mounted && ($worldStore = buildWorld($staticOutputs, $worldStore));
49
50
  $: previewing = $mode === 'preview';
50
- $: width = $breakpoint === 'sm' ? 'w-[640px]' : 'w-full ';
51
+ $: width = $breakpoint === 'sm' ? 'w-[640px]' : 'min-w-[1080px] w-full';
52
+ let selectedTab = 'insert';
53
+ $: if ($selectedComponent) {
54
+ selectedTab = 'settings';
55
+ }
56
+ else {
57
+ selectedTab = 'insert';
58
+ }
51
59
  </script>
52
60
 
53
61
  {#if !$userStore?.operator}
@@ -56,27 +64,34 @@ $: width = $breakpoint === 'sm' ? 'w-[640px]' : 'w-full ';
56
64
  {/if}
57
65
 
58
66
  {#if previewing}
59
- <AppPreview app={$appStore} />
67
+ <AppPreview app={$appStore} appPath={path} {breakpoint} />
60
68
  {:else}
61
69
  <SplitPanesWrapper class="max-w-full overflow-hidden">
62
- <Pane size={20} minSize={15} maxSize={40}>
63
- <ContextPanel appPath={path} />
70
+ <Pane size={20}>
71
+ <ContextPanel />
64
72
  </Pane>
65
- <Pane size={60}>
66
- <div class="p-4 bg-gray-100 min-h-full w-full relative">
67
- {#if $appStore.grid}
68
- <div class={classNames('mx-auto h-full', width)}>
69
- <GridEditor />
73
+ <Pane size={55}>
74
+ <SplitPanesWrapper horizontal>
75
+ <Pane size={70}>
76
+ <div class={classNames('bg-gray-100 mx-auto relative min-h-full', width)}>
77
+ {#if $appStore.grid}
78
+ <div class={classNames('mx-auto p-4 w-full h-full bg-gray-100', width)}>
79
+ <GridEditor />
80
+ </div>
81
+ {/if}
82
+ {#if $connectingInput.opened}
83
+ <div
84
+ class="absolute top-0 left-0 w-full h-full bg-black border-2 bg-opacity-25 z-1 flex justify-center items-center"
85
+ />
86
+ {/if}
70
87
  </div>
71
- {/if}
72
- {#if $connectingInput.opened}
73
- <div
74
- class="absolute top-0 left-0 w-full h-full bg-black border-2 bg-opacity-25 z-1 flex justify-center items-center"
75
- />
76
- {/if}
77
- </div>
88
+ </Pane>
89
+ <Pane size={30}>
90
+ <InlineScriptsPanel />
91
+ </Pane>
92
+ </SplitPanesWrapper>
78
93
  </Pane>
79
- <Pane size={30} minSize={25} maxSize={40}>
94
+ <Pane size={25} minSize={20} maxSize={33}>
80
95
  <Tabs bind:selected={selectedTab}>
81
96
  <Tab value="insert" size="xs">
82
97
  <div class="m-1 flex flex-row gap-2">
@@ -44,7 +44,7 @@ async function save() {
44
44
 
45
45
  <div class="border-b flex flex-row justify-between py-1 px-4 items-center">
46
46
  <input class="text-sm w-64" bind:value={title} />
47
- <div class="flex gap-2">
47
+ <div class="flex gap-4 items-center">
48
48
  <div>
49
49
  <ToggleButtonGroup bind:selected={mode}>
50
50
  <ToggleButton position="left" value="dnd" startIcon={{ icon: faHand }} size="xs">
@@ -57,12 +57,20 @@ async function save() {
57
57
  </div>
58
58
  <div>
59
59
  <ToggleButtonGroup bind:selected={breakpoint}>
60
- <ToggleButton position="left" value="sm" startIcon={{ icon: faMobileAlt }} size="xs">
61
- Mobile
62
- </ToggleButton>
63
- <ToggleButton position="right" value="lg" startIcon={{ icon: faDesktopAlt }} size="xs">
64
- Desktop
65
- </ToggleButton>
60
+ <ToggleButton
61
+ position="left"
62
+ value="sm"
63
+ startIcon={{ icon: faMobileAlt }}
64
+ size="xs"
65
+ iconOnly
66
+ />
67
+ <ToggleButton
68
+ position="right"
69
+ value="lg"
70
+ startIcon={{ icon: faDesktopAlt }}
71
+ size="xs"
72
+ iconOnly
73
+ />
66
74
  </ToggleButtonGroup>
67
75
  </div>
68
76
  </div>
@@ -4,12 +4,13 @@ import { buildWorld } from '../rx';
4
4
  import GridEditor from './GridEditor.svelte';
5
5
  import { classNames } from '../../../utils';
6
6
  export let app;
7
+ export let appPath;
8
+ export let breakpoint;
7
9
  const appStore = writable(app);
8
10
  const worldStore = writable(undefined);
9
11
  const staticOutputs = writable({});
10
12
  const selectedComponent = writable(undefined);
11
13
  const mode = writable('preview');
12
- const breakpoint = writable('lg');
13
14
  const connectingInput = writable({
14
15
  opened: false,
15
16
  input: undefined
@@ -23,13 +24,14 @@ setContext('AppEditorContext', {
23
24
  mode,
24
25
  connectingInput,
25
26
  breakpoint,
26
- runnableComponents
27
+ runnableComponents,
28
+ appPath
27
29
  });
28
30
  let mounted = false;
29
31
  onMount(() => {
30
32
  mounted = true;
31
33
  });
32
- $: mounted && ($worldStore = buildWorld($staticOutputs));
34
+ $: mounted && ($worldStore = buildWorld($staticOutputs, undefined));
33
35
  $: width = $breakpoint === 'sm' ? 'w-[640px]' : 'w-full ';
34
36
  </script>
35
37
 
@@ -1,8 +1,11 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
- import type { App } from '../types';
2
+ import { type Writable } from 'svelte/store';
3
+ import type { App, EditorBreakpoint } from '../types';
3
4
  declare const __propDef: {
4
5
  props: {
5
6
  app: App;
7
+ appPath: string;
8
+ breakpoint: Writable<EditorBreakpoint>;
6
9
  };
7
10
  events: {
8
11
  [evt: string]: CustomEvent<any>;
@@ -2,33 +2,37 @@
2
2
  import { getContext } from 'svelte';
3
3
  import BarChartComponent from '../components/dataDisplay/AppBarChart.svelte';
4
4
  import DisplayComponent from '../components/DisplayComponent.svelte';
5
- import TableComponent from '../components/dataDisplay/AppTable.svelte';
5
+ import TableComponent from '../components/table/AppTable.svelte';
6
6
  import TextComponent from '../components/dataDisplay/AppText.svelte';
7
7
  import ButtonComponent from '../components/buttons/AppButton.svelte';
8
8
  import PieChartComponent from '../components/dataDisplay/AppPieChart.svelte';
9
+ import SelectComponent from '../components/selectInputs/AppSelect.svelte';
9
10
  import CheckboxComponent from '../components/selectInputs/AppCheckbox.svelte';
10
11
  import TextInputComponent from '../components/textInputs/AppTextInput.svelte';
11
12
  import NumberInputComponent from '../components/numberInputs/AppNumberInput.svelte';
13
+ import DateInputComponent from '../components/dateInputs/AppDateInput.svelte';
12
14
  import ComponentHeader from './ComponentHeader.svelte';
13
15
  import AppForm from '../components/form/AppForm.svelte';
14
16
  export let component;
15
17
  export let selected;
18
+ export let locked = false;
16
19
  $: shouldDisplayOverlay = selected && $mode !== 'preview';
17
20
  const { staticOutputs, mode, connectingInput } = getContext('AppEditorContext');
18
21
  </script>
19
22
 
20
23
  <div class="h-full flex flex-col w-full">
21
24
  {#if shouldDisplayOverlay}
22
- <ComponentHeader {component} {selected} on:delete />
25
+ <ComponentHeader {component} {selected} on:delete on:lock {locked} />
23
26
  {/if}
24
27
 
25
28
  <div
26
29
  class={classNames(
27
- ' border overflow-auto cursor-pointer h-full bg-white',
30
+ 'border cursor-pointer h-full bg-white',
28
31
  shouldDisplayOverlay ? 'border-blue-500' : 'border-white',
29
32
  !selected && $mode !== 'preview' && !component.card ? 'border-gray-100' : '',
30
33
  $mode !== 'preview' && !$connectingInput.opened ? 'hover:border-blue-500' : '',
31
34
  component.card ? 'p-2' : '',
35
+ component.softWrap ? '' : 'overflow-auto',
32
36
  'relative'
33
37
  )}
34
38
  >
@@ -68,6 +72,8 @@ const { staticOutputs, mode, connectingInput } = getContext('AppEditorContext');
68
72
  bind:componentInput={component.componentInput}
69
73
  bind:staticOutputs={$staticOutputs[component.id]}
70
74
  />
75
+ {:else if component.type === 'selectcomponent'}
76
+ <SelectComponent {...component} bind:staticOutputs={$staticOutputs[component.id]} />
71
77
  {:else if component.type === 'formcomponent'}
72
78
  <AppForm
73
79
  {...component}
@@ -78,6 +84,18 @@ const { staticOutputs, mode, connectingInput } = getContext('AppEditorContext');
78
84
  <CheckboxComponent {...component} bind:staticOutputs={$staticOutputs[component.id]} />
79
85
  {:else if component.type === 'textinputcomponent'}
80
86
  <TextInputComponent {...component} bind:staticOutputs={$staticOutputs[component.id]} />
87
+ {:else if component.type === 'passwordinputcomponent'}
88
+ <TextInputComponent
89
+ inputType="password"
90
+ {...component}
91
+ bind:staticOutputs={$staticOutputs[component.id]}
92
+ />
93
+ {:else if component.type === 'dateinputcomponent'}
94
+ <DateInputComponent
95
+ inputType="date"
96
+ {...component}
97
+ bind:staticOutputs={$staticOutputs[component.id]}
98
+ />
81
99
  {:else if component.type === 'numberinputcomponent'}
82
100
  <NumberInputComponent {...component} bind:staticOutputs={$staticOutputs[component.id]} />
83
101
  {/if}
@@ -4,9 +4,11 @@ declare const __propDef: {
4
4
  props: {
5
5
  component: AppComponent;
6
6
  selected: boolean;
7
+ locked?: boolean | undefined;
7
8
  };
8
9
  events: {
9
10
  delete: CustomEvent<any>;
11
+ lock: CustomEvent<any>;
10
12
  } & {
11
13
  [evt: string]: CustomEvent<any>;
12
14
  };
@@ -1,20 +1,37 @@
1
1
  <script>import { classNames } from '../../../utils';
2
- import { displayData } from '../utils';
3
- import { X } from 'lucide-svelte';
2
+ import { Anchor, Lock, X } from 'lucide-svelte';
4
3
  import { createEventDispatcher } from 'svelte';
5
4
  export let component;
6
5
  export let selected;
6
+ export let locked = false;
7
7
  const dispatch = createEventDispatcher();
8
8
  </script>
9
9
 
10
10
  <span
11
11
  class={classNames(
12
- 'text-white px-1 text-2xs py-0.5 font-bold rounded-t-sm w-fit absolute -top-5',
12
+ 'text-white px-2 text-2xs py-0.5 font-bold rounded-t-sm w-fit absolute -top-5',
13
13
  selected ? 'bg-indigo-500' : 'bg-gray-500'
14
14
  )}
15
15
  >
16
- {displayData[component.type].name} - {component.id}
16
+ {component.id}
17
17
  </span>
18
+
19
+ <button
20
+ class={classNames(
21
+ 'text-white px-1 text-2xs py-0.5 font-bold rounded-t-sm w-fit absolute -top-5 right-8 cursor-pointer',
22
+ 'bg-gray-600 hover:bg-gray-800'
23
+ )}
24
+ on:click={() => {
25
+ dispatch('lock')
26
+ }}
27
+ >
28
+ {#if locked}
29
+ <Anchor size={16} class="text-orange-500" />
30
+ {:else}
31
+ <Anchor size={16} />
32
+ {/if}
33
+ </button>
34
+
18
35
  <button
19
36
  class={classNames(
20
37
  'text-white px-1 text-2xs py-0.5 font-bold rounded-t-sm w-fit absolute -top-5 right-0 cursor-pointer',
@@ -4,8 +4,10 @@ declare const __propDef: {
4
4
  props: {
5
5
  component: AppComponent;
6
6
  selected: boolean;
7
+ locked?: boolean | undefined;
7
8
  };
8
9
  events: {
10
+ lock: CustomEvent<any>;
9
11
  delete: CustomEvent<any>;
10
12
  } & {
11
13
  [evt: string]: CustomEvent<any>;
@@ -2,10 +2,9 @@
2
2
  import Grid from 'svelte-grid';
3
3
  import ComponentEditor from './ComponentEditor.svelte';
4
4
  import { classNames } from '../../../utils';
5
- import { columnConfiguration, disableDrag, enableDrag, gridColumns } from '../gridUtils';
5
+ import { columnConfiguration, disableDrag, enableDrag, isFixed, toggleFixed } from '../gridUtils';
6
6
  import { Alert } from '../../common';
7
7
  import { fly } from 'svelte/transition';
8
- import gridHelp from 'svelte-grid/build/helper/index.mjs';
9
8
  import Button from '../../common/button/Button.svelte';
10
9
  import RecomputeAllComponents from './RecomputeAllComponents.svelte';
11
10
  const { selectedComponent, app, mode, connectingInput, staticOutputs, runnableComponents } = getContext('AppEditorContext');
@@ -16,53 +15,74 @@ $: if ($mode === 'preview' || $connectingInput.opened) {
16
15
  else {
17
16
  $app.grid.map((gridItem) => enableDrag(gridItem));
18
17
  }
19
- function deleteComponent(component) {
18
+ function removeGridElement(component) {
20
19
  if (component) {
21
- $app.grid = $app.grid.filter((gridComponent) => gridComponent.data.id !== component?.id);
20
+ $app.grid = $app.grid.filter((gridComponent) => {
21
+ if (gridComponent.data.id === component.id) {
22
+ if (gridComponent.data.componentInput?.runnable?.type === 'runnableByName' &&
23
+ gridComponent.data.componentInput?.runnable.inlineScript) {
24
+ const { name, inlineScript } = gridComponent.data.componentInput?.runnable;
25
+ if (!$app.unusedInlineScripts) {
26
+ $app.unusedInlineScripts = [];
27
+ }
28
+ $app.unusedInlineScripts.push({
29
+ name,
30
+ inlineScript
31
+ });
32
+ $app = $app;
33
+ }
34
+ }
35
+ return gridComponent.data.id !== component?.id;
36
+ });
22
37
  // Delete static inputs
23
38
  delete $staticOutputs[component.id];
24
39
  $staticOutputs = $staticOutputs;
25
40
  delete $runnableComponents[component.id];
26
41
  $runnableComponents = $runnableComponents;
42
+ $selectedComponent = undefined;
27
43
  }
28
44
  }
29
45
  </script>
30
46
 
31
- <!-- svelte-ignore a11y-click-events-have-key-events -->
32
- <div
33
- class="bg-white h-full relative"
34
- on:click|preventDefault={() => ($selectedComponent = undefined)}
35
- >
47
+ <div class="bg-white h-full relative">
36
48
  <RecomputeAllComponents />
37
-
38
- <Grid bind:items={$app.grid} rowHeight={64} let:dataItem cols={columnConfiguration}>
49
+ <Grid
50
+ bind:items={$app.grid}
51
+ let:dataItem
52
+ rowHeight={64}
53
+ cols={columnConfiguration}
54
+ fastStart={true}
55
+ on:pointerup={({ detail }) => {
56
+ if (!$connectingInput.opened) {
57
+ $selectedComponent = detail.id
58
+ }
59
+ }}
60
+ >
39
61
  {#each $app.grid as gridComponent (gridComponent.id)}
40
62
  {#if gridComponent.data.id === dataItem.data.id}
41
- <!-- svelte-ignore a11y-click-events-have-key-events -->
42
-
43
63
  <div
44
64
  class={classNames(
45
65
  'h-full w-full flex justify-center align-center',
46
66
  gridComponent.data.card ? 'border border-gray-100' : ''
47
67
  )}
48
- on:click|preventDefault|stopPropagation={() => {
49
- if (!$connectingInput.opened) {
50
- $selectedComponent = dataItem.data.id
51
- }
52
- }}
53
68
  >
54
69
  <ComponentEditor
55
70
  bind:component={gridComponent.data}
56
71
  selected={$selectedComponent === dataItem.data.id}
57
- on:delete={() => deleteComponent(gridComponent.data)}
72
+ locked={isFixed(gridComponent)}
73
+ on:delete={() => removeGridElement(gridComponent.data)}
74
+ on:lock={() => {
75
+ gridComponent = toggleFixed(gridComponent)
76
+ }}
58
77
  />
59
78
  </div>
60
79
  {/if}
61
80
  {/each}
62
81
  </Grid>
82
+
63
83
  {#if $connectingInput.opened}
64
84
  <div
65
- class="fixed top-32 left-0 w-full z-10 flex justify-center items-center"
85
+ class="fixed top-32 z-10 flex justify-center items-center"
66
86
  transition:fly={{ duration: 100, y: -100 }}
67
87
  >
68
88
  <Alert title="Connecting" type="info">
@@ -5,24 +5,22 @@ import { getContext } from 'svelte';
5
5
  const { runnableComponents } = getContext('AppEditorContext');
6
6
  let loading = false;
7
7
  async function onRefresh() {
8
+ loading = true;
8
9
  await Promise.all(Object.keys($runnableComponents).map((id) => {
9
10
  return $runnableComponents?.[id]?.();
10
11
  }));
11
12
  loading = false;
12
13
  }
14
+ $: disabled = Object.keys($runnableComponents).length === 0;
13
15
  </script>
14
16
 
15
17
  <Button
16
18
  size="xs"
17
19
  btnClasses="m-2 mb-4"
18
20
  startIcon={{ icon: faRefresh, classes: classNames(loading ? 'animate-spin' : '', 'mr-2') }}
19
- color="light"
20
- variant="border"
21
- disabled={Object.keys($runnableComponents).length === 0}
22
- on:click={() => {
23
- loading = true
24
- onRefresh()
25
- }}
21
+ color="dark"
22
+ {disabled}
23
+ on:click={onRefresh}
26
24
  >
27
25
  Recompute all ({Object.keys($runnableComponents).length})
28
26
  </Button>