windmill-components 1.103.2 → 1.109.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 (164) hide show
  1. package/package/components/AppConnect.svelte +4 -1
  2. package/package/components/ArgInput.svelte +81 -68
  3. package/package/components/ArgInput.svelte.d.ts +0 -2
  4. package/package/components/Awareness.svelte +17 -0
  5. package/package/components/Awareness.svelte.d.ts +14 -0
  6. package/package/components/CliHelpBox.svelte +2 -5
  7. package/package/components/Editor.svelte +81 -30
  8. package/package/components/Editor.svelte.d.ts +4 -0
  9. package/package/components/EditorBar.svelte +127 -131
  10. package/package/components/EditorBar.svelte.d.ts +8 -0
  11. package/package/components/FlowBuilder.svelte +6 -1
  12. package/package/components/FlowStatusViewer.svelte +157 -144
  13. package/package/components/FlowStatusViewer.svelte.d.ts +1 -0
  14. package/package/components/HighlightCode.svelte +9 -2
  15. package/package/components/HighlightCode.svelte.d.ts +1 -0
  16. package/package/components/InputTransformForm.svelte +1 -1
  17. package/package/components/InputTransformSchemaForm.svelte +4 -1
  18. package/package/components/InputTransformSchemaForm.svelte.d.ts +3 -0
  19. package/package/components/ObjectTypeNarrowing.svelte +8 -2
  20. package/package/components/ResourcePicker.svelte +0 -1
  21. package/package/components/ResourceTypePicker.svelte +1 -1
  22. package/package/components/RunForm.svelte.d.ts +1 -1
  23. package/package/components/ScheduleEditor.svelte +35 -3
  24. package/package/components/SchemaEditor.svelte +7 -8
  25. package/package/components/SchemaEditor.svelte.d.ts +1 -1
  26. package/package/components/SchemaForm.svelte.d.ts +1 -1
  27. package/package/components/SchemaModal.svelte +7 -12
  28. package/package/components/SchemaModal.svelte.d.ts +2 -3
  29. package/package/components/SchemaViewer.svelte +7 -1
  30. package/package/components/SchemaViewer.svelte.d.ts +1 -1
  31. package/package/components/ScriptBuilder.svelte +95 -21
  32. package/package/components/ScriptEditor.svelte +114 -6
  33. package/package/components/ScriptEditor.svelte.d.ts +7 -1
  34. package/package/components/ScriptSchema.svelte.d.ts +1 -1
  35. package/package/components/TemplateEditor.svelte +1 -0
  36. package/package/components/Toggle.svelte +1 -1
  37. package/package/components/Urlize.svelte +19 -0
  38. package/package/components/Urlize.svelte.d.ts +16 -0
  39. package/package/components/UserSettings.svelte +57 -36
  40. package/package/components/UserSettings.svelte.d.ts +1 -0
  41. package/package/components/VariableEditor.svelte +1 -1
  42. package/package/components/apps/components/buttons/AppSchemaForm.svelte +6 -1
  43. package/package/components/apps/components/display/AppDisplayComponent.svelte +6 -1
  44. package/package/components/apps/components/display/AppDownload.svelte +33 -25
  45. package/package/components/apps/components/display/AppFlowStatusComponent.svelte +2 -2
  46. package/package/components/apps/components/display/AppLogsComponent.svelte +2 -2
  47. package/package/components/apps/components/display/AppText.svelte +9 -14
  48. package/package/components/apps/components/display/table/AppAggridTable.svelte +45 -36
  49. package/package/components/apps/components/display/table/AppTable.svelte +5 -2
  50. package/package/components/apps/components/helpers/ComponentErrorHandler.svelte +26 -0
  51. package/package/components/apps/components/helpers/ComponentErrorHandler.svelte.d.ts +18 -0
  52. package/package/components/apps/components/helpers/InputValue.svelte +15 -17
  53. package/package/components/apps/components/helpers/NonRunnableComponent.svelte +1 -1
  54. package/package/components/apps/components/helpers/eval.d.ts +1 -0
  55. package/package/components/apps/components/helpers/eval.js +3 -1
  56. package/package/components/apps/components/inputs/AppCheckbox.svelte +21 -8
  57. package/package/components/apps/components/inputs/AppDateInput.svelte +6 -1
  58. package/package/components/apps/components/inputs/AppMultiSelect.svelte +18 -7
  59. package/package/components/apps/components/inputs/AppNumberInput.svelte +6 -1
  60. package/package/components/apps/components/inputs/AppRangeInput.svelte +6 -2
  61. package/package/components/apps/components/inputs/AppSelect.svelte +11 -3
  62. package/package/components/apps/components/inputs/AppSelectStep.svelte +19 -6
  63. package/package/components/apps/components/inputs/AppSelectTab.svelte +9 -1
  64. package/package/components/apps/components/inputs/AppSliderInputs.svelte +6 -1
  65. package/package/components/apps/components/inputs/AppTextInput.svelte +6 -1
  66. package/package/components/apps/components/inputs/currency/AppCurrencyInput.svelte +6 -1
  67. package/package/components/apps/components/inputs/currency/CurrencyInput.svelte +0 -1
  68. package/package/components/apps/editor/AppEditor.svelte +4 -7
  69. package/package/components/apps/editor/AppEditor.svelte.d.ts +3 -2
  70. package/package/components/apps/editor/AppEditorHeader.svelte +38 -11
  71. package/package/components/apps/editor/AppEditorHeader.svelte.d.ts +3 -0
  72. package/package/components/apps/editor/AppPreview.svelte +9 -7
  73. package/package/components/apps/editor/AppPreview.svelte.d.ts +6 -6
  74. package/package/components/apps/editor/ConnectionInstructions.svelte +1 -0
  75. package/package/components/apps/editor/DeploymentHistory.svelte +70 -0
  76. package/package/components/apps/editor/DeploymentHistory.svelte.d.ts +18 -0
  77. package/package/components/apps/editor/RecomputeAllComponents.svelte +49 -20
  78. package/package/components/apps/editor/component/ComponentNavigation.svelte +51 -20
  79. package/package/components/apps/editor/component/ComponentNavigation.svelte.d.ts +4 -1
  80. package/package/components/apps/editor/component/components.d.ts +50 -49
  81. package/package/components/apps/editor/component/components.js +6 -0
  82. package/package/components/apps/editor/inlineScriptsPanel/EmptyInlineScript.svelte +1 -0
  83. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptsPanelList.svelte +2 -2
  84. package/package/components/apps/editor/settingsPanel/ComponentPanel.svelte +1 -4
  85. package/package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +4 -7
  86. package/package/components/apps/rx.js +6 -1
  87. package/package/components/apps/types.d.ts +1 -1
  88. package/package/components/apps/utils.js +1 -0
  89. package/package/components/common/button/ButtonDropdown.svelte +45 -19
  90. package/package/components/common/button/ButtonDropdown.svelte.d.ts +1 -0
  91. package/package/components/common/modal/Modal.svelte +13 -2
  92. package/package/components/common/modal/Modal.svelte.d.ts +1 -0
  93. package/package/components/common/table/AppRow.svelte +33 -3
  94. package/package/components/flows/content/FlowModuleCache.svelte +37 -0
  95. package/package/components/flows/content/FlowModuleCache.svelte.d.ts +17 -0
  96. package/package/components/flows/content/FlowModuleComponent.svelte +57 -54
  97. package/package/components/flows/content/FlowModuleEarlyStop.svelte +1 -1
  98. package/package/components/flows/content/FlowModuleHeader.svelte +12 -1
  99. package/package/components/flows/content/FlowModuleHeader.svelte.d.ts +1 -0
  100. package/package/components/flows/content/FlowModuleSleep.svelte +1 -1
  101. package/package/components/flows/content/FlowModuleSuspend.svelte +1 -7
  102. package/package/components/flows/content/ScriptEditorDrawer.svelte +2 -1
  103. package/package/components/flows/map/FlowModuleSchemaItem.svelte +13 -1
  104. package/package/components/flows/map/FlowModuleSchemaItem.svelte.d.ts +1 -0
  105. package/package/components/flows/map/FlowModuleSchemaMap.svelte +49 -5
  106. package/package/components/flows/map/MapItem.svelte +9 -2
  107. package/package/components/flows/map/MapItem.svelte.d.ts +1 -0
  108. package/package/components/flows/pickers/PickHubApp.svelte +2 -1
  109. package/package/components/flows/pickers/PickHubApp.svelte.d.ts +1 -0
  110. package/package/components/flows/pickers/PickHubFlow.svelte +2 -1
  111. package/package/components/flows/pickers/PickHubFlow.svelte.d.ts +1 -0
  112. package/package/components/flows/pickers/PickHubScript.svelte +2 -1
  113. package/package/components/flows/pickers/PickHubScript.svelte.d.ts +1 -0
  114. package/package/components/flows/previousResults.d.ts +2 -0
  115. package/package/components/flows/previousResults.js +46 -0
  116. package/package/components/graph/FlowGraph.svelte +1 -1
  117. package/package/components/home/ItemsList.svelte +11 -3
  118. package/package/components/home/ListFilters.svelte +39 -0
  119. package/package/components/home/ListFilters.svelte.d.ts +4 -0
  120. package/package/components/propertyPicker/ObjectViewer.svelte +77 -79
  121. package/package/components/propertyPicker/ObjectViewer.svelte.d.ts +1 -1
  122. package/package/components/propertyPicker/PropPicker.svelte +18 -0
  123. package/package/components/sidebar/MultiplayerMenu.svelte +123 -0
  124. package/package/components/sidebar/MultiplayerMenu.svelte.d.ts +16 -0
  125. package/package/components/sidebar/WorkspaceMenu.svelte +1 -1
  126. package/package/gen/core/CancelablePromise.d.ts +2 -8
  127. package/package/gen/core/CancelablePromise.js +38 -36
  128. package/package/gen/core/OpenAPI.js +1 -1
  129. package/package/gen/core/request.js +3 -2
  130. package/package/gen/models/AuditLog.d.ts +1 -1
  131. package/package/gen/models/CreateInput.d.ts +1 -1
  132. package/package/gen/models/FlowMetadata.d.ts +1 -1
  133. package/package/gen/models/FlowModule.d.ts +1 -0
  134. package/package/gen/models/Input.d.ts +1 -1
  135. package/package/gen/models/NewScript.d.ts +2 -1
  136. package/package/gen/models/NewToken.d.ts +1 -0
  137. package/package/gen/models/OpenFlow.d.ts +1 -1
  138. package/package/gen/models/Policy.d.ts +1 -1
  139. package/package/gen/models/Script.d.ts +2 -1
  140. package/package/gen/models/TruncatedToken.d.ts +1 -0
  141. package/package/gen/services/AppService.d.ts +1 -1
  142. package/package/gen/services/JobService.d.ts +64 -4
  143. package/package/gen/services/JobService.js +45 -0
  144. package/package/gen/services/ResourceService.d.ts +2 -1
  145. package/package/gen/services/ResourceService.js +4 -1
  146. package/package/gen/services/ScriptService.d.ts +0 -45
  147. package/package/gen/services/ScriptService.js +0 -52
  148. package/package/gen/services/SettingsService.d.ts +6 -0
  149. package/package/gen/services/SettingsService.js +11 -0
  150. package/package/gen/services/UserService.d.ts +14 -0
  151. package/package/gen/services/UserService.js +11 -0
  152. package/package/gen/services/VariableService.d.ts +12 -0
  153. package/package/gen/services/VariableService.js +16 -0
  154. package/package/hub.d.ts +1 -1
  155. package/package/infer.js +8 -13
  156. package/package/navigation.d.ts +1 -1
  157. package/package/navigation.js +6 -1
  158. package/package/script_helpers.d.ts +1 -1
  159. package/package/script_helpers.js +6 -1
  160. package/package/stores.d.ts +2 -0
  161. package/package/stores.js +4 -2
  162. package/package/utils.d.ts +1 -0
  163. package/package/utils.js +14 -0
  164. package/package.json +28 -19
@@ -0,0 +1,70 @@
1
+ <script>import { Pane, Splitpanes } from 'svelte-splitpanes';
2
+ import PanelSection from './settingsPanel/common/PanelSection.svelte';
3
+ import { classNames, displayDate } from '../../../utils';
4
+ import { AppService, AppWithLastVersion } from '../../../gen';
5
+ import { workspaceStore } from '../../../stores';
6
+ import AppPreview from './AppPreview.svelte';
7
+ import { Skeleton } from '../../common';
8
+ import Button from '../../common/button/Button.svelte';
9
+ import { createEventDispatcher } from 'svelte';
10
+ export let versions;
11
+ let selectedVersion = undefined;
12
+ let selected = undefined;
13
+ $: selectedVersion !== undefined && loadValue(selectedVersion);
14
+ async function loadValue(version) {
15
+ let app = await AppService.getAppByVersion({ workspace: $workspaceStore, id: version });
16
+ selected = app;
17
+ }
18
+ $: reversedVersions = versions.slice().reverse();
19
+ const dispatch = createEventDispatcher();
20
+ </script>
21
+
22
+ <Splitpanes class="!overflow-visible">
23
+ <Pane size={20}>
24
+ <PanelSection title="Past Deployments">
25
+ <div class="flex flex-col gap-2 w-full">
26
+ {#if versions.length > 0}
27
+ <div class="flex gap-2 flex-col">
28
+ {#each reversedVersions ?? [] as version}
29
+ <!-- svelte-ignore a11y-click-events-have-key-events -->
30
+ <div
31
+ class={classNames(
32
+ 'border flex gap-1 truncate justify-between flex-row w-full items-center p-2 rounded-md cursor-pointer hover:bg-blue-50 hover:text-blue-400',
33
+ selectedVersion == version ? 'bg-blue-100 text-blue-600' : ''
34
+ )}
35
+ on:click={() => (selectedVersion = version)}
36
+ >
37
+ <span class="text-xs truncate">{version}</span>
38
+ </div>
39
+ {/each}
40
+ </div>
41
+ {:else}
42
+ <div class="text-sm text-gray-500">No items</div>
43
+ {/if}
44
+ </div>
45
+ </PanelSection>
46
+ </Pane>
47
+ <Pane size={80}>
48
+ <div class="h-full w-full overflow-auto">
49
+ {#if selectedVersion}
50
+ {#if selected}
51
+ <div class="flex justify-between">
52
+ <h3 class="p-1">Deployed {displayDate(selected.created_at)} by {selected.created_by}</h3
53
+ >
54
+ <div class="flex gap-2">
55
+ <Button on:click={() => window.open(`/apps/add?template_id=${selectedVersion}`)}
56
+ >Restore as fork</Button
57
+ >
58
+ <Button on:click={() => dispatch('restore', selected)}>Restore here</Button>
59
+ </div>
60
+ </div>
61
+ <AppPreview noBackend app={selected.value} context={{}} />
62
+ {:else}
63
+ <Skeleton layout={[[40]]} />
64
+ {/if}
65
+ {:else}
66
+ <div class="text-sm p-2 text-gray-500">Select a deployment version to see its details</div>
67
+ {/if}
68
+ </div>
69
+ </Pane>
70
+ </Splitpanes>
@@ -0,0 +1,18 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ versions: number[];
5
+ };
6
+ events: {
7
+ restore: CustomEvent<any>;
8
+ } & {
9
+ [evt: string]: CustomEvent<any>;
10
+ };
11
+ slots: {};
12
+ };
13
+ export type DeploymentHistoryProps = typeof __propDef.props;
14
+ export type DeploymentHistoryEvents = typeof __propDef.events;
15
+ export type DeploymentHistorySlots = typeof __propDef.slots;
16
+ export default class DeploymentHistory extends SvelteComponentTyped<DeploymentHistoryProps, DeploymentHistoryEvents, DeploymentHistorySlots> {
17
+ }
18
+ export {};
@@ -1,8 +1,10 @@
1
- <script>import Dropdown from '../../Dropdown.svelte';
2
- import { ChevronDown, RefreshCw } from 'lucide-svelte';
1
+ <script>import { RefreshCw } from 'lucide-svelte';
3
2
  import { getContext, onMount } from 'svelte';
4
3
  import Button from '../../common/button/Button.svelte';
5
4
  import { allItems } from '../utils';
5
+ import ButtonDropdown from '../../common/button/ButtonDropdown.svelte';
6
+ import { MenuItem } from '@rgossiaux/svelte-headlessui';
7
+ import { classNames } from '../../../utils';
6
8
  const { runnableComponents, app, initialized } = getContext('AppViewerContext');
7
9
  let loading = false;
8
10
  let timeout = undefined;
@@ -73,6 +75,16 @@ onMount(() => {
73
75
  clearInterval(timeout);
74
76
  };
75
77
  });
78
+ let items = [
79
+ {
80
+ displayName: 'Once',
81
+ action: () => setInter(undefined)
82
+ },
83
+ ...[1, 2, 3, 4, 5, 6].map((i) => ({
84
+ displayName: `Every ${i * 5} seconds`,
85
+ action: () => setInter(i * 5000)
86
+ }))
87
+ ];
76
88
  </script>
77
89
 
78
90
  <div class="flex items-center">
@@ -89,22 +101,39 @@ onMount(() => {
89
101
  >
90
102
  <RefreshCw class={loading ? 'animate-spin' : ''} size={16} /> &nbsp;({componentNumber})
91
103
  </Button>
92
- <Dropdown
93
- btnClasses="!rounded-l-none !border-l-0 min-w-[4rem] !px-2"
94
- color={timeout ? 'blue' : 'light'}
95
- variant="border"
96
- dropdownItems={[
97
- {
98
- displayName: 'Once',
99
- action: () => setInter(undefined)
100
- },
101
- ...[1, 2, 3, 4, 5, 6].map((i) => ({
102
- displayName: `Every ${i * 5} seconds`,
103
- action: () => setInter(i * 5000)
104
- }))
105
- ]}
106
- >
107
- <span class="grow text center">{interval ? `${interval / 1000}s` : 'once'}</span>
108
- <ChevronDown class="ml-0.5" size={14} />
109
- </Dropdown>
104
+
105
+ <ButtonDropdown hasPadding={true}>
106
+ <svelte:fragment slot="label">
107
+ <span
108
+ class={classNames('text-xs min-w-[2rem]', interval ? 'text-blue-500' : 'text-gray-600')}
109
+ >
110
+ {interval ? `${interval / 1000}s` : 'once'}
111
+ </span>
112
+ </svelte:fragment>
113
+ <svelte:fragment slot="items">
114
+ {#each items ?? [] as { }, index}
115
+ <MenuItem
116
+ on:click={() => {
117
+ if (index === 0) {
118
+ setInter(undefined)
119
+ } else {
120
+ setInter(index * 5000)
121
+ }
122
+ }}
123
+ >
124
+ <div
125
+ class={classNames(
126
+ '!text-gray-600 text-left px-4 py-2 gap-2 cursor-pointer hover:bg-gray-100 !text-xs font-semibold'
127
+ )}
128
+ >
129
+ {#if index === 0}
130
+ Once
131
+ {:else}
132
+ {`Every ${index * 5} seconds`}
133
+ {/if}
134
+ </div>
135
+ </MenuItem>
136
+ {/each}
137
+ </svelte:fragment>
138
+ </ButtonDropdown>
110
139
  </div>
@@ -3,10 +3,11 @@ import { findGridItem, findGridItemParentGrid, getAllSubgridsAndComponentIds, in
3
3
  import { push } from '../../../../history';
4
4
  import { sendUserToast } from '../../../../toast';
5
5
  import { gridColumns } from '../../gridUtils';
6
+ import { copyToClipboard } from '../../../../utils';
6
7
  const { app, selectedComponent, focusedGrid, componentControl } = getContext('AppViewerContext');
7
8
  const { history, movingcomponents } = getContext('AppEditorContext');
8
9
  let tempGridItems = undefined;
9
- let copiedGridItems = undefined;
10
+ const ITEM_TYPE = 'wm-grid-items';
10
11
  function getSortedGridItemsOfChildren() {
11
12
  if (!$focusedGrid) {
12
13
  return $app.grid;
@@ -90,14 +91,28 @@ function handleArrowUp(event) {
90
91
  $focusedGrid = undefined;
91
92
  }
92
93
  }
93
- function handleCopy(event) {
94
+ async function handleCopy(event) {
94
95
  if (!$selectedComponent) {
95
96
  return;
96
97
  }
97
98
  tempGridItems = undefined;
98
- copiedGridItems = $selectedComponent
99
+ const copiedGridItems = $selectedComponent
99
100
  .map((x) => findGridItem($app, x))
100
101
  .filter((x) => x != undefined);
102
+ copyGridItemsToClipboard(copiedGridItems);
103
+ }
104
+ function copyGridItemsToClipboard(items) {
105
+ let allSubgrids = {};
106
+ for (let item of items) {
107
+ let subgrids = getAllSubgridsAndComponentIds($app, item.data)[0];
108
+ for (let key of subgrids) {
109
+ allSubgrids[key] = $app.subgrids?.[key];
110
+ }
111
+ }
112
+ let success = copyToClipboard(JSON.stringify({ type: ITEM_TYPE, items, subgrids: allSubgrids }), false);
113
+ if (!success) {
114
+ sendUserToast('Could not copy to clipboard. Are you in an unsecure context?', true);
115
+ }
101
116
  }
102
117
  function handleCut(event) {
103
118
  if (!$selectedComponent) {
@@ -108,16 +123,39 @@ function handleCut(event) {
108
123
  let gridItems = $selectedComponent
109
124
  .map((x) => findGridItem($app, x))
110
125
  .filter((x) => x != undefined);
111
- copiedGridItems = gridItems;
126
+ copyGridItemsToClipboard(gridItems);
112
127
  if (!gridItems) {
113
128
  return;
114
129
  }
115
130
  // Store the grid item in a temp variable so we can paste it later
116
131
  tempGridItems = gridItems;
117
132
  }
118
- function handlePaste(event) {
133
+ export async function handlePaste(event) {
134
+ let classes = event.target?.['className'];
135
+ if ((typeof classes === 'string' && classes.includes('inputarea')) ||
136
+ ['INPUT', 'TEXTAREA'].includes(document.activeElement?.tagName)) {
137
+ return;
138
+ }
139
+ event.preventDefault();
119
140
  push(history, $app);
120
141
  $movingcomponents = undefined;
142
+ let copiedGridItems = undefined;
143
+ let subgrids = $app.subgrids ?? {};
144
+ const txt = event?.clipboardData?.getData('text');
145
+ if (txt) {
146
+ try {
147
+ const parsed = JSON.parse(txt);
148
+ if (parsed.type == ITEM_TYPE) {
149
+ copiedGridItems = parsed.items;
150
+ subgrids = parsed.subgrids ?? subgrids;
151
+ console.log('subgrids', subgrids);
152
+ }
153
+ else {
154
+ copiedGridItems = undefined;
155
+ }
156
+ }
157
+ catch { }
158
+ }
121
159
  if (tempGridItems != undefined) {
122
160
  for (let tempGridItem of tempGridItems) {
123
161
  if ($focusedGrid &&
@@ -136,31 +174,29 @@ function handlePaste(event) {
136
174
  const gridItem = tempGridItem;
137
175
  insertNewGridItem($app, (id) => ({ ...gridItem.data, id }), $focusedGrid, Object.fromEntries(gridColumns.map((column) => [column, gridItem[column]])), tempGridItem.id);
138
176
  }
139
- copiedGridItems = tempGridItems;
177
+ copyGridItemsToClipboard(tempGridItems);
140
178
  $selectedComponent = tempGridItems.map((x) => x.id);
141
179
  tempGridItems = undefined;
142
180
  }
143
181
  else if (copiedGridItems) {
144
182
  let nitems = [];
145
183
  for (let copiedGridItem of copiedGridItems) {
146
- let newItem = copyComponent(copiedGridItem, $focusedGrid);
184
+ let newItem = copyComponent(copiedGridItem, $focusedGrid, subgrids);
147
185
  newItem && nitems.push(newItem);
148
186
  }
149
187
  $selectedComponent = nitems.map((x) => x);
150
188
  }
151
189
  $app = $app;
152
190
  }
153
- function copyComponent(item, parentGrid, doNotVisit) {
191
+ function copyComponent(item, parentGrid, subgrids, doNotVisit) {
154
192
  if (item.id === doNotVisit) {
155
193
  return;
156
194
  }
157
195
  const newItem = insertNewGridItem($app, (id) => ({ ...item.data, id }), parentGrid, Object.fromEntries(gridColumns.map((column) => [column, item[column]])));
158
- if ($app.subgrids && item.data.numberOfSubgrids) {
159
- for (let i = 0; i < item.data.numberOfSubgrids; i++) {
160
- $app.subgrids[`${item.id}-${i}`].forEach((subgridItem) => {
161
- copyComponent(subgridItem, { parentComponentId: newItem, subGridIndex: i }, doNotVisit ?? newItem);
162
- });
163
- }
196
+ for (let i = 0; i < (item?.data?.numberOfSubgrids ?? 0); i++) {
197
+ subgrids[`${item.id}-${i}`].forEach((subgridItem) => {
198
+ copyComponent(subgridItem, { parentComponentId: newItem, subGridIndex: i }, subgrids, doNotVisit ?? newItem);
199
+ });
164
200
  }
165
201
  return newItem;
166
202
  }
@@ -196,11 +232,6 @@ function keydown(event) {
196
232
  handleCopy(event);
197
233
  }
198
234
  break;
199
- case 'v':
200
- if (event.ctrlKey || event.metaKey) {
201
- handlePaste(event);
202
- }
203
- break;
204
235
  case 'x':
205
236
  if (event.ctrlKey || event.metaKey) {
206
237
  handleCut(event);
@@ -212,4 +243,4 @@ function keydown(event) {
212
243
  }
213
244
  </script>
214
245
 
215
- <svelte:window on:keydown={keydown} />
246
+ <svelte:window on:keydown={keydown} on:paste={handlePaste} />
@@ -1,6 +1,8 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
2
  declare const __propDef: {
3
- props: Record<string, never>;
3
+ props: {
4
+ handlePaste?: ((event: ClipboardEvent) => Promise<void>) | undefined;
5
+ };
4
6
  events: {
5
7
  [evt: string]: CustomEvent<any>;
6
8
  };
@@ -10,5 +12,6 @@ export type ComponentNavigationProps = typeof __propDef.props;
10
12
  export type ComponentNavigationEvents = typeof __propDef.events;
11
13
  export type ComponentNavigationSlots = typeof __propDef.slots;
12
14
  export default class ComponentNavigation extends SvelteComponentTyped<ComponentNavigationProps, ComponentNavigationEvents, ComponentNavigationSlots> {
15
+ get handlePaste(): (event: ClipboardEvent) => Promise<void>;
13
16
  }
14
17
  export {};