windmill-components 1.75.0 → 1.77.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 (156) hide show
  1. package/components/DisplayResult.svelte +1 -1
  2. package/components/Dropdown.svelte +14 -4
  3. package/components/FlowGraphViewer.svelte +1 -1
  4. package/components/FolderUsageInfo.svelte +16 -6
  5. package/components/FolderUsageInfo.svelte.d.ts +2 -0
  6. package/components/PageHeader.svelte +1 -1
  7. package/components/Path.svelte +22 -3
  8. package/components/ScriptBuilder.svelte +122 -122
  9. package/components/SettingSection.svelte +44 -0
  10. package/components/SettingSection.svelte.d.ts +21 -0
  11. package/components/Tooltip.svelte +3 -1
  12. package/components/WhitelistIp.svelte +1 -3
  13. package/components/apps/components/buttons/AppButton.svelte +11 -5
  14. package/components/apps/components/buttons/AppButton.svelte.d.ts +1 -0
  15. package/components/apps/components/buttons/AppForm.svelte +3 -7
  16. package/components/apps/components/buttons/AppFormButton.svelte +2 -6
  17. package/components/apps/components/display/table/AppAggridTable.svelte +4 -1
  18. package/components/apps/components/display/table/AppTable.svelte +4 -1
  19. package/components/apps/components/helpers/HiddenComponent.svelte +3 -0
  20. package/components/apps/components/helpers/HiddenComponent.svelte.d.ts +1 -0
  21. package/components/apps/components/helpers/InputValue.svelte +26 -43
  22. package/components/apps/components/helpers/InputValue.svelte.d.ts +4 -3
  23. package/components/apps/components/helpers/RefreshButton.svelte +2 -3
  24. package/components/apps/components/helpers/RunnableComponent.svelte +61 -34
  25. package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +2 -0
  26. package/components/apps/components/helpers/RunnableWrapper.svelte +2 -0
  27. package/components/apps/components/helpers/RunnableWrapper.svelte.d.ts +1 -0
  28. package/components/apps/components/helpers/eval.d.ts +5 -0
  29. package/components/apps/components/helpers/eval.js +57 -0
  30. package/components/apps/components/layout/AppContainer.svelte +1 -6
  31. package/components/apps/components/layout/AppDrawer.svelte +0 -3
  32. package/components/apps/components/layout/AppSplitpanes.svelte +1 -6
  33. package/components/apps/components/layout/AppTabs.svelte +64 -33
  34. package/components/apps/components/layout/AppTabs.svelte.d.ts +1 -0
  35. package/components/apps/editor/AppEditor.svelte +136 -131
  36. package/components/apps/editor/AppEditorHeader.svelte +43 -35
  37. package/components/apps/editor/AppPreview.svelte +3 -2
  38. package/components/apps/editor/ComponentHeader.svelte +3 -1
  39. package/components/apps/editor/ComponentHeader.svelte.d.ts +1 -0
  40. package/components/apps/editor/GridEditor.svelte +53 -51
  41. package/components/apps/editor/RecomputeAllComponents.svelte +7 -1
  42. package/components/apps/editor/SettingsPanel.svelte +23 -10
  43. package/components/apps/editor/SubGridEditor.svelte +56 -52
  44. package/components/apps/editor/SubGridEditor.svelte.d.ts +3 -4
  45. package/components/apps/editor/appUtils.d.ts +12 -3
  46. package/components/apps/editor/appUtils.js +111 -37
  47. package/components/apps/editor/component/Component.svelte +4 -9
  48. package/components/apps/editor/component/ComponentNavigation.svelte +91 -46
  49. package/components/apps/editor/component/components.d.ts +1 -1
  50. package/components/apps/editor/component/components.js +24 -43
  51. package/components/apps/editor/componentsPanel/componentStaticValues.d.ts +1 -0
  52. package/components/apps/editor/componentsPanel/componentStaticValues.js +1 -0
  53. package/components/apps/editor/contextPanel/ComponentOutput.svelte +77 -0
  54. package/components/apps/editor/contextPanel/ComponentOutput.svelte.d.ts +21 -0
  55. package/components/apps/editor/contextPanel/ComponentOutputViewer.svelte +9 -5
  56. package/components/apps/editor/contextPanel/ContextPanel.svelte +80 -136
  57. package/components/apps/editor/contextPanel/SubGridOutput.svelte +71 -0
  58. package/components/apps/editor/contextPanel/SubGridOutput.svelte.d.ts +19 -0
  59. package/components/apps/editor/contextPanel/components/BackgroundScriptOutput.svelte +38 -0
  60. package/components/apps/editor/contextPanel/components/BackgroundScriptOutput.svelte.d.ts +19 -0
  61. package/components/apps/editor/contextPanel/components/BackgroundScriptsOutput.svelte +10 -0
  62. package/components/apps/editor/contextPanel/components/BackgroundScriptsOutput.svelte.d.ts +16 -0
  63. package/components/apps/editor/contextPanel/components/MinMaxButton.svelte +25 -0
  64. package/components/apps/editor/contextPanel/components/MinMaxButton.svelte.d.ts +16 -0
  65. package/components/apps/editor/contextPanel/components/OutputHeader.svelte +78 -0
  66. package/components/apps/editor/contextPanel/components/OutputHeader.svelte.d.ts +26 -0
  67. package/components/apps/editor/contextPanel/components/TableActionOutput.svelte +19 -0
  68. package/components/apps/editor/contextPanel/components/TableActionOutput.svelte.d.ts +18 -0
  69. package/components/apps/editor/contextPanel/components/TableActionsOutput.svelte +14 -0
  70. package/components/apps/editor/contextPanel/components/TableActionsOutput.svelte.d.ts +18 -0
  71. package/components/apps/editor/inlineScriptsPanel/EmptyInlineScript.svelte +53 -21
  72. package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +69 -43
  73. package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte +1 -1
  74. package/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte.d.ts +2 -2
  75. package/components/apps/editor/settingsPanel/ComponentPanel.svelte +32 -31
  76. package/components/apps/editor/settingsPanel/GridTab.svelte +4 -12
  77. package/components/apps/editor/settingsPanel/Recompute.svelte +1 -0
  78. package/components/apps/editor/settingsPanel/SelectedRunnable.svelte +6 -0
  79. package/components/apps/editor/settingsPanel/TableActions.svelte +2 -1
  80. package/components/apps/editor/settingsPanel/inputEditor/ConnectedInputEditor.svelte +2 -8
  81. package/components/apps/editor/settingsPanel/inputEditor/EvalInputEditor.svelte +2 -2
  82. package/components/apps/editor/settingsPanel/inputEditor/IconSelectInput.svelte +58 -46
  83. package/components/apps/editor/settingsPanel/inputEditor/JsonEditor.svelte +1 -1
  84. package/components/apps/editor/settingsPanel/inputEditor/JsonEditor.svelte.d.ts +2 -0
  85. package/components/apps/rx.d.ts +6 -4
  86. package/components/apps/rx.js +34 -14
  87. package/components/apps/svelte-grid/Grid.svelte +171 -0
  88. package/components/apps/svelte-grid/Grid.svelte.d.ts +47 -0
  89. package/components/apps/svelte-grid/LICENSE +23 -0
  90. package/components/apps/svelte-grid/MoveResize.svelte +328 -0
  91. package/components/apps/svelte-grid/MoveResize.svelte.d.ts +46 -0
  92. package/components/apps/svelte-grid/types.d.ts +25 -0
  93. package/components/apps/svelte-grid/utils/container.d.ts +1 -0
  94. package/components/apps/svelte-grid/utils/container.js +4 -0
  95. package/components/apps/svelte-grid/utils/helper.d.ts +14 -0
  96. package/components/apps/svelte-grid/utils/helper.js +36 -0
  97. package/components/apps/svelte-grid/utils/item.d.ts +14 -0
  98. package/components/apps/svelte-grid/utils/item.js +192 -0
  99. package/components/apps/svelte-grid/utils/matrix.d.ts +6 -0
  100. package/components/apps/svelte-grid/utils/matrix.js +53 -0
  101. package/components/apps/svelte-grid/utils/other.d.ts +3 -0
  102. package/components/apps/svelte-grid/utils/other.js +30 -0
  103. package/components/apps/types.d.ts +10 -7
  104. package/components/apps/utils.d.ts +1 -1
  105. package/components/apps/utils.js +13 -7
  106. package/components/common/CloseButton.svelte +18 -0
  107. package/components/common/CloseButton.svelte.d.ts +27 -0
  108. package/components/common/badge/Badge.svelte +6 -1
  109. package/components/common/badge/Badge.svelte.d.ts +1 -0
  110. package/components/common/drawer/DrawerContent.svelte +2 -6
  111. package/components/common/languageIcons/JavaScript.svelte +11 -0
  112. package/components/common/languageIcons/JavaScript.svelte.d.ts +25 -0
  113. package/components/common/languageIcons/LanguageIcon.svelte +3 -1
  114. package/components/common/languageIcons/LanguageIcon.svelte.d.ts +1 -1
  115. package/components/common/menu/Menu.svelte +1 -1
  116. package/components/common/popup/Popup.svelte +2 -1
  117. package/components/common/popup/Popup.svelte.d.ts +9 -0
  118. package/components/common/table/AppRow.svelte +1 -4
  119. package/components/common/table/FlowRow.svelte +1 -4
  120. package/components/common/table/ScriptRow.svelte +1 -4
  121. package/components/common/tabs/Tab.svelte +1 -0
  122. package/components/common/tabs/Tab.svelte.d.ts +2 -0
  123. package/components/flows/pickers/FlowScriptPicker.svelte.d.ts +1 -1
  124. package/components/graph/FlowGraph.svelte +1 -1
  125. package/components/sidebar/SidebarContent.svelte +2 -2
  126. package/consts.js +1 -1
  127. package/history.js +8 -1
  128. package/package.json +21 -27
  129. package/utils.js +0 -1
  130. package/components/apps/editor/settingsPanel/MoveToOtherGrid.svelte +0 -92
  131. package/components/apps/editor/settingsPanel/MoveToOtherGrid.svelte.d.ts +0 -18
  132. package/components/graph/svelvet/d3/controllers/README.md +0 -3
  133. package/components/graph/svelvet/d3/controllers/d3Old.d.ts +0 -1
  134. package/components/graph/svelvet/d3/controllers/d3Old.js +0 -43
  135. package/components/graph/svelvet/docs/CHANGELOG.md +0 -145
  136. package/components/graph/svelvet/docs/DESIGN_PATTERNS.md +0 -44
  137. package/components/graph/svelvet/docs/DOCUMENTATION.md +0 -5
  138. package/components/graph/svelvet/docs/README.md +0 -34
  139. package/components/graph/svelvet/docs/TODO.md +0 -14
  140. package/components/graph/svelvet/docs/Tutorials.md +0 -25
  141. package/components/graph/svelvet/docs/images/css-background-after.png +0 -0
  142. package/components/graph/svelvet/docs/images/css-background-before.png +0 -0
  143. package/components/graph/svelvet/docs/images/custom-edges-after.png +0 -0
  144. package/components/graph/svelvet/docs/images/custom-edges-before.png +0 -0
  145. package/components/graph/svelvet/docs/images/custom-nodes-after.png +0 -0
  146. package/components/graph/svelvet/docs/images/custom-nodes-before.png +0 -0
  147. package/components/graph/svelvet/docs/images/custom-svelte-components-after.png +0 -0
  148. package/components/graph/svelvet/docs/images/custom-svelte-components-before.png +0 -0
  149. package/components/graph/svelvet/docs/images/html-docs-after.png +0 -0
  150. package/components/graph/svelvet/docs/images/html-docs-before.png +0 -0
  151. package/components/graph/svelvet/docs/images/minimap-after.png +0 -0
  152. package/components/graph/svelvet/docs/images/minimap-before.png +0 -0
  153. package/components/graph/svelvet/docs/images/node-classes-after.png +0 -0
  154. package/components/graph/svelvet/docs/images/node-classes-before.png +0 -0
  155. package/components/graph/svelvet/docs/images/node-create-after.png +0 -0
  156. package/components/graph/svelvet/docs/images/node-create-before.png +0 -0
@@ -1,5 +1,6 @@
1
1
  <script>import { Tab, Tabs } from '../../../common';
2
2
  import { getContext, onMount } from 'svelte';
3
+ import { initOutput } from '../../editor/appUtils';
3
4
  import SubGridEditor from '../../editor/SubGridEditor.svelte';
4
5
  import { concatCustomCss } from '../../utils';
5
6
  import InputValue from '../helpers/InputValue.svelte';
@@ -9,12 +10,17 @@ export let componentContainerHeight;
9
10
  export let tabs;
10
11
  export let customCss = undefined;
11
12
  export let render;
13
+ export let initializing = configuration.tabsKind != undefined;
12
14
  export const staticOutputs = ['selectedTabIndex'];
13
- const { app, worldStore, focusedGrid, selectedComponent } = getContext('AppViewerContext');
14
- const { componentControl } = getContext('AppEditorContext');
15
+ const { app, worldStore, focusedGrid, selectedComponent, mode, componentControl } = getContext('AppViewerContext');
15
16
  let selected = tabs[0];
16
- let noPadding = undefined;
17
+ let kind = undefined;
17
18
  let tabHeight = 0;
19
+ $: outputs = $worldStore
20
+ ? initOutput($worldStore, id, {
21
+ selectedTabIndex: 0
22
+ })
23
+ : undefined;
18
24
  function handleTabSelection() {
19
25
  const selectedIndex = tabs?.indexOf(selected);
20
26
  outputs?.selectedTabIndex.set(selectedIndex, true);
@@ -54,46 +60,71 @@ $componentControl[id] = {
54
60
  return true;
55
61
  }
56
62
  return false;
63
+ },
64
+ setTab: (tab) => {
65
+ selected = tabs[tab];
57
66
  }
58
67
  };
59
68
  $: selected && handleTabSelection();
60
- $: outputs = $worldStore?.outputsById[id];
61
69
  $: selectedIndex = tabs?.indexOf(selected) ?? -1;
62
70
  $: css = concatCustomCss($app.css?.tabscomponent, customCss);
71
+ let subgridWidth = undefined;
63
72
  </script>
64
73
 
65
- <InputValue {id} input={configuration.noPadding} bind:value={noPadding} />
74
+ <InputValue
75
+ on:done={() => initializing && (initializing = false)}
76
+ {id}
77
+ input={configuration.tabsKind}
78
+ bind:value={kind}
79
+ />
66
80
 
67
- <div>
68
- <div bind:clientHeight={tabHeight} on:pointerdown|stopPropagation>
69
- <Tabs bind:selected class={css?.tabRow?.class} style={css?.tabRow?.style}>
81
+ <div class={kind == 'sidebar' ? 'flex gap-4 w-full' : 'w-full'}>
82
+ {#if !kind || kind == 'tabs' || (kind == 'invisibleOnView' && $mode == 'dnd')}
83
+ <div bind:clientHeight={tabHeight}>
84
+ <Tabs bind:selected class={css?.tabRow?.class} style={css?.tabRow?.style}>
85
+ {#each tabs ?? [] as res}
86
+ <Tab
87
+ value={res}
88
+ class={css?.tabs?.class}
89
+ style={css?.tabs?.style}
90
+ selectedClass={css?.selectedTab?.class}
91
+ selectedStyle={css?.selectedTab?.style}
92
+ >
93
+ <span class="font-semibold">{res}</span>
94
+ </Tab>
95
+ {/each}
96
+ </Tabs>
97
+ </div>
98
+ {:else if kind == 'sidebar'}
99
+ <div
100
+ class="flex gap-y-2 flex-col w-1/6 max-w-[160px] bg-white text-[#2e3440] opacity-80 px-4 pt-4 border-r border-gray-400"
101
+ >
70
102
  {#each tabs ?? [] as res}
71
- <Tab
72
- value={res}
73
- class={css?.tabs?.class}
74
- style={css?.tabs?.style}
75
- selectedClass={css?.selectedTab?.class}
76
- selectedStyle={css?.selectedTab?.style}
103
+ <button
104
+ class="rounded-sm !truncate text-sm hover:bg-gray-100 hover:border hover:text-black px-1 py-2 {selected ==
105
+ res
106
+ ? 'outline outline-gray-500 outline-1 bg-white text-black'
107
+ : ''}"
108
+ on:pointerdown|stopPropagation
109
+ on:click={() => (selected = res)}>{res}</button
77
110
  >
78
- <span class="font-semibold">{res}</span>
79
- </Tab>
80
111
  {/each}
81
- </Tabs>
82
- </div>
83
- {#if $app.subgrids}
84
- {#each tabs ?? [] as res, i}
85
- <SubGridEditor
86
- {id}
87
- visible={render && i === selectedIndex}
88
- bind:subGrid={$app.subgrids[`${id}-${i}`]}
89
- {noPadding}
90
- class={css?.container?.class}
91
- style={css?.container?.style}
92
- containerHeight={componentContainerHeight - tabHeight}
93
- on:focus={() => {
94
- $selectedComponent = id
95
- }}
96
- />
97
- {/each}
112
+ </div>
98
113
  {/if}
114
+
115
+ <div bind:clientWidth={subgridWidth} class="w-full">
116
+ {#if $app.subgrids}
117
+ {#each tabs ?? [] as res, i}<SubGridEditor
118
+ {id}
119
+ visible={render && i === selectedIndex}
120
+ bind:subGrid={$app.subgrids[`${id}-${i}`]}
121
+ class={css?.container?.class}
122
+ style={css?.container?.style}
123
+ containerHeight={componentContainerHeight - tabHeight}
124
+ on:focus={() => {
125
+ $selectedComponent = id
126
+ }}
127
+ />{/each}
128
+ {/if}
129
+ </div>
99
130
  </div>
@@ -9,6 +9,7 @@ declare const __propDef: {
9
9
  tabs: string[];
10
10
  customCss?: ComponentCustomCSS<'tabRow' | 'tabs' | 'selectedTab' | 'container'> | undefined;
11
11
  render: boolean;
12
+ initializing?: boolean | undefined;
12
13
  staticOutputs?: string[] | undefined;
13
14
  };
14
15
  events: {
@@ -70,11 +70,12 @@ setContext('AppViewerContext', {
70
70
  openDebugRun: writable(undefined),
71
71
  focusedGrid,
72
72
  stateId: writable(0),
73
- parentWidth: writable(0)
73
+ parentWidth: writable(0),
74
+ state: writable({}),
75
+ componentControl: writable({})
74
76
  });
75
77
  setContext('AppEditorContext', {
76
78
  history,
77
- componentControl: writable({}),
78
79
  pickVariableCallback
79
80
  });
80
81
  let timeout = undefined;
@@ -129,144 +130,148 @@ let variableEditor = undefined;
129
130
  />
130
131
  {/if}
131
132
  {#if !$userStore?.operator}
132
- {#if initialMode !== 'preview'}
133
- <AppEditorHeader {policy} {fromHub} />
134
- {/if}
133
+ {#if $appStore}
134
+ {#if initialMode !== 'preview'}
135
+ <AppEditorHeader {policy} {fromHub} />
136
+ {/if}
135
137
 
136
- {#if previewing}
137
- <SplitPanesWrapper>
138
- <div
139
- class={twMerge('h-full w-full', $appStore.css?.['app']?.['viewer']?.class)}
140
- style={$appStore.css?.['app']?.['viewer']?.style}
141
- >
142
- <AppPreview
143
- workspace={$workspaceStore ?? ''}
144
- summary={$summaryStore}
145
- app={$appStore}
146
- appPath={path}
147
- {breakpoint}
148
- {policy}
149
- isEditor
150
- {context}
151
- noBackend={false}
152
- />
153
- </div>
154
- </SplitPanesWrapper>
155
- {:else}
156
- <SplitPanesWrapper>
157
- <Splitpanes class="max-w-full overflow-hidden">
158
- <Pane size={$connectingInput?.opened ? 40 : 15} minSize={5} maxSize={33}>
159
- <ContextPanel />
160
- </Pane>
161
- <Pane size={64}>
162
- <SplitPanesWrapper>
163
- <Splitpanes horizontal>
164
- <Pane size={$connectingInput?.opened ? 100 : 70}>
165
- <div
166
- on:pointerdown={(e) => {
167
- $selectedComponent = undefined
168
- $focusedGrid = undefined
169
- }}
170
- class={twMerge(
171
- 'bg-gray-100 h-full w-full',
172
- $appStore.css?.['app']?.['viewer']?.class
173
- )}
174
- style={$appStore.css?.['app']?.['viewer']?.style}
175
- >
138
+ {#if previewing}
139
+ <SplitPanesWrapper>
140
+ <div
141
+ class={twMerge('h-full w-full', $appStore.css?.['app']?.['viewer']?.class)}
142
+ style={$appStore.css?.['app']?.['viewer']?.style}
143
+ >
144
+ <AppPreview
145
+ workspace={$workspaceStore ?? ''}
146
+ summary={$summaryStore}
147
+ app={$appStore}
148
+ appPath={path}
149
+ {breakpoint}
150
+ {policy}
151
+ isEditor
152
+ {context}
153
+ noBackend={false}
154
+ />
155
+ </div>
156
+ </SplitPanesWrapper>
157
+ {:else}
158
+ <SplitPanesWrapper>
159
+ <Splitpanes class="max-w-full overflow-hidden">
160
+ <Pane size={15} minSize={5} maxSize={33}>
161
+ <ContextPanel />
162
+ </Pane>
163
+ <Pane size={64}>
164
+ <SplitPanesWrapper>
165
+ <Splitpanes horizontal>
166
+ <Pane size={70}>
176
167
  <div
177
- class={classNames(
178
- 'relative mx-auto w-full h-full overflow-auto',
179
- app.fullscreen ? '' : 'max-w-6xl'
168
+ on:pointerdown={(e) => {
169
+ $selectedComponent = undefined
170
+ $focusedGrid = undefined
171
+ }}
172
+ class={twMerge(
173
+ 'bg-gray-100 h-full w-full',
174
+ $appStore.css?.['app']?.['viewer']?.class
180
175
  )}
176
+ style={$appStore.css?.['app']?.['viewer']?.style}
181
177
  >
182
- {#if $appStore.grid}
183
- <ComponentNavigation />
178
+ <div
179
+ class={classNames(
180
+ 'relative mx-auto w-full h-full overflow-auto',
181
+ app.fullscreen ? '' : 'max-w-6xl'
182
+ )}
183
+ >
184
+ {#if $appStore.grid}
185
+ <ComponentNavigation />
184
186
 
185
- <div on:pointerdown|stopPropagation class={width}>
186
- <GridEditor {policy} />
187
- </div>
187
+ <div on:pointerdown|stopPropagation class={width}>
188
+ <GridEditor {policy} />
189
+ </div>
188
190
 
189
- <div id="app-editor-top-level-drawer" />
190
- {/if}
191
+ <div id="app-editor-top-level-drawer" />
192
+ {/if}
193
+ </div>
191
194
  </div>
195
+ </Pane>
196
+ <Pane size={$connectingInput?.opened ? 0 : 30}>
197
+ <div class="relative h-full w-full">
198
+ <InlineScriptsPanel />
199
+ </div>
200
+ </Pane>
201
+ </Splitpanes>
202
+ </SplitPanesWrapper>
203
+ </Pane>
204
+ <Pane size={21} minSize={5} maxSize={33}>
205
+ <div class="relative flex flex-col h-full">
206
+ <Tabs bind:selected={selectedTab} wrapperClass="!h-[40px]" class="!h-full">
207
+ <Tab value="insert" size="xs">
208
+ <div class="m-1 center-center gap-2">
209
+ <Icon data={faPlus} />
210
+ <span>Insert</span>
211
+ </div>
212
+ </Tab>
213
+ <Tab value="settings" size="xs">
214
+ <div class="m-1 center-center gap-2">
215
+ <Icon data={faSliders} />
216
+ <span>Settings</span>
217
+ </div>
218
+ </Tab>
219
+ <Tab value="css" size="xs">
220
+ <div class="m-1 center-center gap-2">
221
+ <Icon data={faCode} />
222
+ <span>CSS</span>
223
+ </div>
224
+ </Tab>
225
+ <div slot="content" class="h-full overflow-y-auto pb-4">
226
+ <TabContent class="overflow-auto h-full" value="settings">
227
+ {#if $selectedComponent !== undefined}
228
+ <SettingsPanel />
229
+ {:else}
230
+ <div class="min-w-[150px] text-sm text-gray-500 text-center py-8 px-2">
231
+ Select a component to see the settings&nbsp;for&nbsp;it
232
+ </div>
233
+ {/if}
234
+ </TabContent>
235
+ <TabContent value="insert">
236
+ <ComponentList />
237
+ </TabContent>
238
+ <TabContent value="css">
239
+ <CssSettings />
240
+ </TabContent>
192
241
  </div>
193
- </Pane>
194
- <Pane size={$connectingInput?.opened ? 0 : 30}>
195
- <div class="relative h-full w-full">
196
- <InlineScriptsPanel />
197
- </div>
198
- </Pane>
199
- </Splitpanes>
200
- </SplitPanesWrapper>
201
- </Pane>
202
- <Pane size={21} minSize={5} maxSize={33}>
203
- <div class="relative flex flex-col h-full">
204
- <Tabs bind:selected={selectedTab} wrapperClass="!h-[40px]" class="!h-full">
205
- <Tab value="insert" size="xs">
206
- <div class="m-1 center-center gap-2">
207
- <Icon data={faPlus} />
208
- <span>Insert</span>
209
- </div>
210
- </Tab>
211
- <Tab value="settings" size="xs">
212
- <div class="m-1 center-center gap-2">
213
- <Icon data={faSliders} />
214
- <span>Settings</span>
215
- </div>
216
- </Tab>
217
- <Tab value="css" size="xs">
218
- <div class="m-1 center-center gap-2">
219
- <Icon data={faCode} />
220
- <span>CSS</span>
221
- </div>
222
- </Tab>
223
- <div slot="content" class="h-full overflow-y-auto pb-4">
224
- <TabContent class="overflow-auto" value="settings">
225
- {#if $selectedComponent !== undefined}
226
- <SettingsPanel />
227
- {:else}
228
- <div class="min-w-[150px] text-sm text-gray-500 text-center py-8 px-2">
229
- Select a component to see the settings&nbsp;for&nbsp;it
230
- </div>
231
- {/if}
232
- </TabContent>
233
- <TabContent value="insert">
234
- <ComponentList />
235
- </TabContent>
236
- <TabContent value="css">
237
- <CssSettings />
238
- </TabContent>
239
- </div>
240
- </Tabs>
241
- {#if $connectingInput.opened}
242
- <div
243
- class="fixed top-32 p-2 z-50 flex justify-center items-center"
244
- transition:fly|local={{ duration: 100, y: -100 }}
245
- >
246
- <Alert title="Connecting" type="info">
247
- <div class="flex gap-2 flex-col">
248
- Click on the output of the component you want to connect to on the left panel.
249
- <div>
250
- <Button
251
- color="blue"
252
- variant="border"
253
- size="xs"
254
- on:click={() => {
255
- $connectingInput.opened = false
256
- $connectingInput.input = undefined
257
- }}
258
- >
259
- Stop connecting
260
- </Button>
242
+ </Tabs>
243
+ {#if $connectingInput.opened}
244
+ <div
245
+ class="fixed top-32 p-2 z-50 flex justify-center items-center"
246
+ transition:fly|local={{ duration: 100, y: -100 }}
247
+ >
248
+ <Alert title="Connecting" type="info">
249
+ <div class="flex gap-2 flex-col">
250
+ Click on the output of the component you want to connect to on the left panel.
251
+ <div>
252
+ <Button
253
+ color="blue"
254
+ variant="border"
255
+ size="xs"
256
+ on:click={() => {
257
+ $connectingInput.opened = false
258
+ $connectingInput.input = undefined
259
+ }}
260
+ >
261
+ Stop connecting
262
+ </Button>
263
+ </div>
261
264
  </div>
262
- </div>
263
- </Alert>
264
- </div>
265
- {/if}
266
- </div>
267
- </Pane>
268
- </Splitpanes>
269
- </SplitPanesWrapper>
265
+ </Alert>
266
+ </div>
267
+ {/if}
268
+ </div>
269
+ </Pane>
270
+ </Splitpanes>
271
+ </SplitPanesWrapper>
272
+ {/if}
273
+ {:else}
274
+ App is null
270
275
  {/if}
271
276
  {:else}
272
277
  App editor not available to operators
@@ -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
@@ -47,11 +47,12 @@ setContext('AppViewerContext', {
47
47
  openDebugRun: writable(undefined),
48
48
  focusedGrid: writable(undefined),
49
49
  stateId: writable(0),
50
- parentWidth: writable(0)
50
+ parentWidth: writable(0),
51
+ state: writable({}),
52
+ componentControl: writable({})
51
53
  });
52
54
  setContext('AppEditorContext', {
53
55
  history: undefined,
54
- componentControl: writable({}),
55
56
  pickVariableCallback: writable(undefined)
56
57
  });
57
58
  let mounted = false;
@@ -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>;