windmill-components 1.405.0 → 1.405.5

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 (106) hide show
  1. package/package/assets/app.css +20 -0
  2. package/package/components/AppConnectLightweightResourcePicker.svelte +66 -0
  3. package/package/components/AppConnectLightweightResourcePicker.svelte.d.ts +21 -0
  4. package/package/components/ArgInput.svelte +6 -2
  5. package/package/components/ArgInput.svelte.d.ts +1 -0
  6. package/package/components/CustomPopover.svelte +1 -1
  7. package/package/components/DisplayResult.svelte +1 -1
  8. package/package/components/FlowBuilder.svelte +2 -0
  9. package/package/components/FlowBuilder.svelte.d.ts +1 -0
  10. package/package/components/FlowInputViewer.svelte +25 -0
  11. package/package/components/FlowInputViewer.svelte.d.ts +19 -0
  12. package/package/components/FlowJobResult.svelte +8 -1
  13. package/package/components/FlowJobResult.svelte.d.ts +1 -0
  14. package/package/components/FlowMetadata.svelte +2 -2
  15. package/package/components/FlowStatusViewer.svelte +3 -1
  16. package/package/components/FlowStatusViewer.svelte.d.ts +1 -0
  17. package/package/components/FlowStatusViewerInner.svelte +4 -1
  18. package/package/components/FlowViewer.svelte +2 -21
  19. package/package/components/LightweightResourcePicker.svelte +34 -30
  20. package/package/components/LogViewer.svelte +4 -3
  21. package/package/components/LogViewer.svelte.d.ts +1 -0
  22. package/package/components/ManualPopover.svelte +1 -1
  23. package/package/components/ObjectResourceInput.svelte +5 -2
  24. package/package/components/ObjectResourceInput.svelte.d.ts +2 -0
  25. package/package/components/Popover.svelte +1 -1
  26. package/package/components/Portal.svelte +7 -8
  27. package/package/components/Portal.svelte.d.ts +3 -7
  28. package/package/components/QueueMetricsDrawer.svelte +368 -3
  29. package/package/components/QueueMetricsDrawer.svelte.d.ts +2 -0
  30. package/package/components/ResourceEditor.svelte +4 -5
  31. package/package/components/ResourcePicker.svelte +14 -9
  32. package/package/components/ResourcePicker.svelte.d.ts +1 -0
  33. package/package/components/RunForm.svelte +1 -1
  34. package/package/components/SavedInputs.svelte +2 -2
  35. package/package/components/ScriptVersionHistory.svelte +54 -59
  36. package/package/components/TestConnection.svelte +1 -0
  37. package/package/components/TimeAgo.svelte +5 -6
  38. package/package/components/TimeAgo.svelte.d.ts +1 -1
  39. package/package/components/apps/components/buttons/AppButton.svelte +1 -1
  40. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +1 -1
  41. package/package/components/apps/components/inputs/AppMultiSelect.svelte +1 -1
  42. package/package/components/apps/components/inputs/AppMultiSelectV2.svelte +1 -1
  43. package/package/components/apps/components/layout/AppDrawer.svelte +1 -1
  44. package/package/components/apps/components/layout/AppModal.svelte +1 -1
  45. package/package/components/apps/editor/AppEditor.svelte +11 -3
  46. package/package/components/apps/editor/GridEditor.svelte +57 -4
  47. package/package/components/apps/editor/GridEditor.svelte.d.ts +8 -0
  48. package/package/components/apps/editor/GridEditorMenu.svelte +1 -1
  49. package/package/components/apps/editor/SubGridEditor.svelte +82 -3
  50. package/package/components/apps/editor/SubGridEditor.svelte.d.ts +16 -0
  51. package/package/components/apps/editor/appUtils.d.ts +19 -2
  52. package/package/components/apps/editor/appUtils.js +103 -7
  53. package/package/components/apps/editor/component/Component.svelte +36 -8
  54. package/package/components/apps/editor/component/Component.svelte.d.ts +3 -1
  55. package/package/components/apps/editor/contextPanel/components/OutputHeader.svelte +1 -1
  56. package/package/components/apps/svelte-grid/Grid.svelte +235 -12
  57. package/package/components/apps/svelte-grid/Grid.svelte.d.ts +7 -7
  58. package/package/components/apps/svelte-grid/MoveResize.svelte +104 -11
  59. package/package/components/apps/svelte-grid/MoveResize.svelte.d.ts +7 -0
  60. package/package/components/apps/svelte-grid/utils/item.d.ts +4 -1
  61. package/package/components/apps/svelte-grid/utils/item.js +2 -3
  62. package/package/components/apps/svelte-select/lib/ConditionalPortal.svelte +1 -1
  63. package/package/components/apps/svelte-select/lib/ConditionalPortalGlobal.svelte +1 -1
  64. package/package/components/common/button/ButtonDropdown.svelte +1 -1
  65. package/package/components/common/drawer/ConditionalPortal.svelte +1 -1
  66. package/package/components/common/menu/MenuV2.svelte +1 -1
  67. package/package/components/common/modal/AlwaysMountedModal.svelte +1 -1
  68. package/package/components/common/popup/PopupV2.svelte +1 -1
  69. package/package/components/copilot/StepGenQuick.svelte +3 -2
  70. package/package/components/copilot/StepGenQuick.svelte.d.ts +1 -0
  71. package/package/components/details/Menu.svelte +1 -1
  72. package/package/components/flows/CreateActionsApp.svelte +1 -1
  73. package/package/components/flows/FlowEditor.svelte +2 -1
  74. package/package/components/flows/FlowEditor.svelte.d.ts +1 -0
  75. package/package/components/flows/FlowHistory.svelte +10 -195
  76. package/package/components/flows/FlowHistory.svelte.d.ts +0 -1
  77. package/package/components/flows/FlowHistoryInner.svelte +200 -0
  78. package/package/components/flows/FlowHistoryInner.svelte.d.ts +19 -0
  79. package/package/components/flows/content/FlowEditorPanel.svelte +2 -1
  80. package/package/components/flows/content/FlowEditorPanel.svelte.d.ts +1 -0
  81. package/package/components/flows/content/FlowInput.svelte +66 -58
  82. package/package/components/flows/content/FlowInput.svelte.d.ts +1 -0
  83. package/package/components/flows/content/FlowModuleScript.svelte +1 -1
  84. package/package/components/flows/map/FlowModuleSchemaMap.svelte +3 -2
  85. package/package/components/flows/map/InsertModuleButton.svelte +1 -1
  86. package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte +1 -1
  87. package/package/components/graph/model.d.ts +1 -0
  88. package/package/components/icons/WindmillIcon.svelte +119 -105
  89. package/package/components/icons/store.d.ts +4 -0
  90. package/package/components/icons/store.js +1 -0
  91. package/package/components/multiselect/MultiSelectWrapper.svelte +1 -1
  92. package/package/components/propertyPicker/ObjectViewer.svelte +1 -1
  93. package/package/components/runs/RunRow.svelte +3 -7
  94. package/package/components/schema/FlowPropertyEditor.svelte +1 -0
  95. package/package/components/search/GlobalSearchModal.svelte +1 -1
  96. package/package/script_helpers.d.ts +37 -38
  97. package/package/script_helpers.js +100 -38
  98. package/package.json +23 -1
  99. package/package/init_scripts/python_failure_module.d.ts +0 -2
  100. package/package/init_scripts/python_failure_module.js +0 -8
  101. package/package/init_scripts/python_init_code.d.ts +0 -2
  102. package/package/init_scripts/python_init_code.js +0 -40
  103. package/package/init_scripts/python_init_code_clear.d.ts +0 -2
  104. package/package/init_scripts/python_init_code_clear.js +0 -5
  105. package/package/init_scripts/python_init_code_trigger.d.ts +0 -2
  106. package/package/init_scripts/python_init_code_trigger.js +0 -14
@@ -49,6 +49,7 @@ export async function main(s3: S3) {
49
49
  },
50
50
  body: JSON.stringify({
51
51
  type: "S3",
52
+ region: s3.region,
52
53
  bucket: s3.bucket,
53
54
  endpoint: s3.endPoint,
54
55
  port: s3.port,
@@ -2,8 +2,8 @@
2
2
  import { displayDate } from '../utils';
3
3
  import { onDestroy, onMount } from 'svelte';
4
4
  export let date;
5
- export let withDate = false;
6
5
  export let agoOnlyIfRecent = false;
6
+ export let noDate = false;
7
7
  let computedTimeAgo = undefined;
8
8
  let isRecent = true;
9
9
  let interval;
@@ -52,22 +52,21 @@ async function displayDaysAgo(dateString) {
52
52
  if (dAgo == 0) {
53
53
  return `yesterday at ${date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`;
54
54
  }
55
- else if (dAgo > 7 && withDate) {
55
+ else if (dAgo > 7 && !noDate) {
56
56
  return `${dAgo + 1} days ago at ${date.toLocaleTimeString([], {
57
57
  hour: '2-digit',
58
58
  minute: '2-digit'
59
59
  })}`;
60
60
  }
61
61
  else {
62
- return !withDate ? displayDate(dateString, false, withDate) : '';
62
+ return displayDate(dateString, false, !noDate);
63
63
  }
64
64
  }
65
65
  }
66
66
  </script>
67
67
 
68
- {#if withDate}
69
- {displayDate(date)}
70
- {/if}
71
68
  {#if computedTimeAgo && (!agoOnlyIfRecent || isRecent)}
72
69
  {computedTimeAgo}
70
+ {:else}
71
+ {displayDate(date)}
73
72
  {/if}
@@ -2,8 +2,8 @@ import { SvelteComponent } from "svelte";
2
2
  declare const __propDef: {
3
3
  props: {
4
4
  date: string;
5
- withDate?: boolean | undefined;
6
5
  agoOnlyIfRecent?: boolean | undefined;
6
+ noDate?: boolean | undefined;
7
7
  };
8
8
  events: {
9
9
  [evt: string]: CustomEvent<any>;
@@ -199,7 +199,7 @@ let css = initCss($app.css?.buttoncomponent, customCss);
199
199
  </RunnableWrapper>
200
200
 
201
201
  {#if resolvedConfig?.confirmationModal?.selected === 'confirmationModal'}
202
- <Portal target="#app-editor-top-level-drawer">
202
+ <Portal name="app-button" target="#app-editor-top-level-drawer">
203
203
  <ConfirmationModal
204
204
  open={Boolean(confirmedCallback)}
205
205
  title={resolvedConfig?.confirmationModal?.configuration?.confirmationModal?.title ?? ''}
@@ -511,7 +511,7 @@ let loading = false;
511
511
  {/if}
512
512
  </div>
513
513
  </RunnableWrapper>
514
- <Portal>
514
+ <Portal name="db-explorer">
515
515
  <Drawer bind:this={insertDrawer} size="800px">
516
516
  <DrawerContent title="Insert row" on:close={insertDrawer.closeDrawer}>
517
517
  <svelte:fragment slot="actions">
@@ -160,7 +160,7 @@ let open = false;
160
160
  {option}
161
161
  </div>
162
162
  </MultiSelect>
163
- <Portal>
163
+ <Portal name="app-multiselect">
164
164
  <div use:floatingContent class="z5000" hidden={!open}>
165
165
  <!-- svelte-ignore a11y-no-static-element-interactions -->
166
166
  <!-- svelte-ignore a11y-click-events-have-key-events -->
@@ -159,7 +159,7 @@ let open = false;
159
159
  {option}
160
160
  </div>
161
161
  </MultiSelect>
162
- <Portal>
162
+ <Portal name="app-multiselect-v2">
163
163
  <div use:floatingContent class="z5000" hidden={!open}>
164
164
  <!-- svelte-ignore a11y-click-events-have-key-events -->
165
165
  <!-- svelte-ignore a11y-no-static-element-interactions -->
@@ -92,7 +92,7 @@ let css = initCss($app.css?.drawercomponent, customCss);
92
92
  </AlignWrapper>
93
93
  </div>
94
94
 
95
- <Portal target="#app-editor-top-level-drawer">
95
+ <Portal target="#app-editor-top-level-drawer" name="app-drawer">
96
96
  <Drawer
97
97
  let:open
98
98
  bind:this={appDrawer}
@@ -118,7 +118,7 @@ wrapperHeight - headerHeight - 64);
118
118
  </AlignWrapper>
119
119
  </div>
120
120
  {/if}
121
- <Portal target="#app-editor-top-level-drawer">
121
+ <Portal target="#app-editor-top-level-drawer" name="app-modal">
122
122
  <Disposable
123
123
  {id}
124
124
  let:handleClickAway
@@ -6,11 +6,11 @@ import { writable } from 'svelte/store';
6
6
  import { buildWorld } from '../rx';
7
7
  import AppEditorHeader from './AppEditorHeader.svelte';
8
8
  import GridEditor from './GridEditor.svelte';
9
- import { Button, Tab } from '../../common';
9
+ import { Alert, Button, Tab } from '../../common';
10
10
  import TabContent from '../../common/tabs/TabContent.svelte';
11
11
  import Tabs from '../../common/tabs/Tabs.svelte';
12
12
  import { userStore, workspaceStore } from '../../../stores';
13
- import { classNames, encodeState, sendUserToast } from '../../../utils';
13
+ import { classNames, encodeState, getModifierKey, sendUserToast } from '../../../utils';
14
14
  import AppPreview from './AppPreview.svelte';
15
15
  import ComponentList from './componentsPanel/ComponentList.svelte';
16
16
  import ContextPanel from './contextPanel/ContextPanel.svelte';
@@ -548,7 +548,15 @@ let jobToWatch = undefined;
548
548
  {#if $componentActive}
549
549
  <div
550
550
  class="absolute z-50 inset-0 h-full w-full bg-surface-secondary [background-size:16px_16px]"
551
- />
551
+ >
552
+ <div class="w-min whitespace-nowrap mx-auto pt-0.5 z-50">
553
+ <Alert
554
+ title={`Press ${getModifierKey()} to drop component inside a container.`}
555
+ size="xs"
556
+ class="h-10 py-1"
557
+ />
558
+ </div>
559
+ </div>
552
560
  {/if}
553
561
 
554
562
  <SplitPanesWrapper>
@@ -1,10 +1,10 @@
1
1
  <script>import { getContext } from 'svelte';
2
- import { columnConfiguration, isFixed, toggleFixed } from '../gridUtils';
2
+ import { columnConfiguration, gridColumns, isFixed, toggleFixed } from '../gridUtils';
3
3
  import { twMerge } from 'tailwind-merge';
4
4
  import HiddenComponent from '../components/helpers/HiddenComponent.svelte';
5
5
  import Component from './component/Component.svelte';
6
6
  import { push } from '../../../history';
7
- import { dfs, expandGriditem, findGridItem } from './appUtils';
7
+ import { dfs, expandGriditem, findGridItem, findGridItemParentGrid, insertNewGridItem, isContainer, subGridIndexKey } from './appUtils';
8
8
  import Grid from '../svelte-grid/Grid.svelte';
9
9
  import { deepEqual } from 'fast-equals';
10
10
  import ComponentWrapper from './component/ComponentWrapper.svelte';
@@ -17,7 +17,7 @@ import Tooltip from '../../Tooltip.svelte';
17
17
  import { Loader2 } from 'lucide-svelte';
18
18
  import Popover from '../../Popover.svelte';
19
19
  export let policy;
20
- const { selectedComponent, app, connectingInput, summary, focusedGrid, parentWidth, breakpoint, allIdsInPath, bgRuns } = getContext('AppViewerContext');
20
+ const { selectedComponent, app, connectingInput, summary, focusedGrid, parentWidth, breakpoint, allIdsInPath, bgRuns, worldStore } = getContext('AppViewerContext');
21
21
  const { history, scale, componentActive } = getContext('AppEditorContext');
22
22
  let previousSelectedIds = undefined;
23
23
  $: if (!deepEqual(previousSelectedIds, $selectedComponent)) {
@@ -41,6 +41,30 @@ function handleFillHeight(id) {
41
41
  }
42
42
  $app = $app;
43
43
  }
44
+ export function moveComponentBetweenSubgrids(componentId, parentComponentId, subGridIndex, position) {
45
+ // Find the component in the source subgrid
46
+ const component = findGridItem($app, componentId);
47
+ if (!component) {
48
+ return;
49
+ }
50
+ let parentGrid = findGridItemParentGrid($app, component.id);
51
+ if (parentGrid) {
52
+ $app.subgrids &&
53
+ ($app.subgrids[parentGrid] = $app.subgrids[parentGrid].filter((item) => item.id !== component?.id));
54
+ }
55
+ else {
56
+ $app.grid = $app.grid.filter((item) => item.id !== component?.id);
57
+ }
58
+ const gridItem = component;
59
+ insertNewGridItem($app, (id) => ({ ...gridItem.data, id }), { parentComponentId: parentComponentId, subGridIndex: subGridIndex }, Object.fromEntries(gridColumns.map((column) => [column, gridItem[column]])), component.id, position, undefined, undefined, undefined, true);
60
+ // Update the app state
61
+ $app = { ...$app };
62
+ $selectedComponent = [parentComponentId];
63
+ $focusedGrid = {
64
+ parentComponentId,
65
+ subGridIndex
66
+ };
67
+ }
44
68
  </script>
45
69
 
46
70
  <div class="w-full z-[1000] overflow-visible h-full">
@@ -114,10 +138,37 @@ function handleFillHeight(id) {
114
138
  push(history, $app)
115
139
  $app.grid = e.detail
116
140
  }}
141
+ root
117
142
  let:dataItem
118
143
  let:hidden
119
144
  let:overlapped
145
+ let:moveMode
146
+ let:componentDraggedId
120
147
  cols={columnConfiguration}
148
+ on:dropped={(e) => {
149
+ const { id, overlapped, x, y } = e.detail
150
+
151
+ const overlappedComponent = findGridItem($app, overlapped)
152
+
153
+ if (overlappedComponent && !isContainer(overlappedComponent.data.type)) {
154
+ return
155
+ }
156
+
157
+ if (!overlapped) {
158
+ return
159
+ }
160
+
161
+ if (id === overlapped) {
162
+ return
163
+ }
164
+
165
+ moveComponentBetweenSubgrids(
166
+ id,
167
+ overlapped,
168
+ subGridIndexKey(overlappedComponent?.data?.type, overlapped, $worldStore),
169
+ { x, y }
170
+ )
171
+ }}
121
172
  >
122
173
  <ComponentWrapper
123
174
  id={dataItem.id}
@@ -157,7 +208,9 @@ function handleFillHeight(id) {
157
208
  on:fillHeight={() => {
158
209
  handleFillHeight(dataItem.id)
159
210
  }}
160
- overlapped={overlapped !== undefined}
211
+ {overlapped}
212
+ {moveMode}
213
+ {componentDraggedId}
161
214
  />
162
215
  </GridEditorMenu>
163
216
  </ComponentWrapper>
@@ -3,6 +3,10 @@ import type { Policy } from '../../../gen';
3
3
  declare const __propDef: {
4
4
  props: {
5
5
  policy: Policy;
6
+ moveComponentBetweenSubgrids?: ((componentId: string, parentComponentId: string, subGridIndex: number, position?: {
7
+ x: number;
8
+ y: number;
9
+ }) => void) | undefined;
6
10
  };
7
11
  events: {
8
12
  [evt: string]: CustomEvent<any>;
@@ -13,5 +17,9 @@ export type GridEditorProps = typeof __propDef.props;
13
17
  export type GridEditorEvents = typeof __propDef.events;
14
18
  export type GridEditorSlots = typeof __propDef.slots;
15
19
  export default class GridEditor extends SvelteComponent<GridEditorProps, GridEditorEvents, GridEditorSlots> {
20
+ get moveComponentBetweenSubgrids(): (componentId: string, parentComponentId: string, subGridIndex: number, position?: {
21
+ x: number;
22
+ y: number;
23
+ } | undefined) => void;
16
24
  }
17
25
  export {};
@@ -135,7 +135,7 @@ const menuItems = [
135
135
  <slot />
136
136
 
137
137
  {#if contextMenuVisible}
138
- <Portal>
138
+ <Portal name="grid-editor">
139
139
  <div style="position: fixed; top: {menuY}px; left: {menuX}px; z-index:6000;">
140
140
  <div class="rounded-md bg-surface border shadow-md divide-y w-64">
141
141
  <div class="p-1" use:clickOutside={false}>
@@ -2,9 +2,9 @@
2
2
  import { classNames } from '../../../utils';
3
3
  import { createEventDispatcher, getContext, onDestroy } from 'svelte';
4
4
  import { twMerge } from 'tailwind-merge';
5
- import { columnConfiguration, isFixed, toggleFixed } from '../gridUtils';
5
+ import { columnConfiguration, gridColumns, isFixed, toggleFixed } from '../gridUtils';
6
6
  import Grid from '../svelte-grid/Grid.svelte';
7
- import { expandGriditem, findGridItem, maxHeight, selectId } from './appUtils';
7
+ import { expandGriditem, findGridItem, findGridItemParentGrid, insertNewGridItem, isContainer, maxHeight, selectId, subGridIndexKey } from './appUtils';
8
8
  import Component from './component/Component.svelte';
9
9
  import ComponentWrapper from './component/ComponentWrapper.svelte';
10
10
  import GridViewer from './GridViewer.svelte';
@@ -21,7 +21,7 @@ export let visible = true;
21
21
  export let id;
22
22
  export let shouldHighlight = true;
23
23
  const dispatch = createEventDispatcher();
24
- const { app, connectingInput, selectedComponent, focusedGrid, mode, parentWidth, breakpoint, allIdsInPath } = getContext('AppViewerContext');
24
+ const { app, connectingInput, selectedComponent, focusedGrid, mode, parentWidth, breakpoint, allIdsInPath, worldStore } = getContext('AppViewerContext');
25
25
  const editorContext = getContext('AppEditorContext');
26
26
  let isActive = false;
27
27
  let sber = editorContext?.componentActive?.subscribe((x) => (isActive = x));
@@ -46,6 +46,54 @@ function lock(dataItem) {
46
46
  }
47
47
  let container = undefined;
48
48
  $: maxRow = maxHeight($app.subgrids?.[subGridId] ?? [], containerHeight ?? 0, $breakpoint);
49
+ export function moveComponentBetweenSubgrids(componentId, parentComponentId, subGridIndex, position) {
50
+ // Find the component in the source subgrid
51
+ const component = findGridItem($app, componentId);
52
+ if (!component) {
53
+ return;
54
+ }
55
+ let parentGrid = findGridItemParentGrid($app, component.id);
56
+ if (parentGrid) {
57
+ $app.subgrids &&
58
+ ($app.subgrids[parentGrid] = $app.subgrids[parentGrid].filter((item) => item.id !== component?.id));
59
+ }
60
+ else {
61
+ $app.grid = $app.grid.filter((item) => item.id !== component?.id);
62
+ }
63
+ const gridItem = component;
64
+ insertNewGridItem($app, (id) => ({ ...gridItem.data, id }), { parentComponentId: parentComponentId, subGridIndex: subGridIndex }, Object.fromEntries(gridColumns.map((column) => [column, gridItem[column]])), component.id, position, undefined, undefined, undefined, true);
65
+ // Update the app state
66
+ $app = { ...$app };
67
+ if (parentGrid) {
68
+ $focusedGrid = {
69
+ parentComponentId,
70
+ subGridIndex
71
+ };
72
+ $selectedComponent = [parentComponentId];
73
+ }
74
+ else {
75
+ $focusedGrid = undefined;
76
+ }
77
+ }
78
+ export function moveToRoot(componentId, position) {
79
+ // Find the component in the source subgrid
80
+ const component = findGridItem($app, componentId);
81
+ if (!component) {
82
+ return;
83
+ }
84
+ let parentGrid = findGridItemParentGrid($app, component.id);
85
+ if (parentGrid) {
86
+ $app.subgrids &&
87
+ ($app.subgrids[parentGrid] = $app.subgrids[parentGrid].filter((item) => item.id !== component?.id));
88
+ }
89
+ else {
90
+ $app.grid = $app.grid.filter((item) => item.id !== component?.id);
91
+ }
92
+ const gridItem = component;
93
+ insertNewGridItem($app, (id) => ({ ...gridItem.data, id }), undefined, Object.fromEntries(gridColumns.map((column) => [column, gridItem[column]])), component.id, position, undefined, undefined, undefined, true);
94
+ // Update the app state
95
+ $app = { ...$app };
96
+ }
49
97
  </script>
50
98
 
51
99
  <div
@@ -87,10 +135,39 @@ $: maxRow = maxHeight($app.subgrids?.[subGridId] ?? [], containerHeight ?? 0, $b
87
135
  let:dataItem
88
136
  let:hidden
89
137
  let:overlapped
138
+ let:moveMode
139
+ let:componentDraggedId
90
140
  cols={columnConfiguration}
91
141
  scroller={container}
92
142
  parentWidth={$parentWidth - 17}
93
143
  {containerWidth}
144
+ on:dropped={(e) => {
145
+ const { id, overlapped, x, y } = e.detail
146
+
147
+ if (!overlapped) {
148
+ moveToRoot(id, { x, y })
149
+ } else {
150
+ const overlappedComponent = findGridItem($app, overlapped)
151
+
152
+ if (overlappedComponent && !isContainer(overlappedComponent.data.type)) {
153
+ return
154
+ }
155
+ if (!overlapped) {
156
+ return
157
+ }
158
+
159
+ if (id === overlapped) {
160
+ return
161
+ }
162
+
163
+ moveComponentBetweenSubgrids(
164
+ id,
165
+ overlapped,
166
+ subGridIndexKey(overlappedComponent?.data?.type, overlapped, $worldStore),
167
+ { x, y }
168
+ )
169
+ }
170
+ }}
94
171
  >
95
172
  <ComponentWrapper
96
173
  id={dataItem.id}
@@ -138,6 +215,8 @@ $: maxRow = maxHeight($app.subgrids?.[subGridId] ?? [], containerHeight ?? 0, $b
138
215
  }
139
216
  $app = $app
140
217
  }}
218
+ {moveMode}
219
+ {componentDraggedId}
141
220
  />
142
221
  </GridEditorMenu>
143
222
  </ComponentWrapper>
@@ -11,6 +11,14 @@ declare const __propDef: {
11
11
  visible?: boolean | undefined;
12
12
  id: string;
13
13
  shouldHighlight?: boolean | undefined;
14
+ moveComponentBetweenSubgrids?: ((componentId: string, parentComponentId: string, subGridIndex: number, position?: {
15
+ x: number;
16
+ y: number;
17
+ }) => void) | undefined;
18
+ moveToRoot?: ((componentId: string, position?: {
19
+ x: number;
20
+ y: number;
21
+ }) => void) | undefined;
14
22
  };
15
23
  events: {
16
24
  focus: CustomEvent<any>;
@@ -23,5 +31,13 @@ export type SubGridEditorProps = typeof __propDef.props;
23
31
  export type SubGridEditorEvents = typeof __propDef.events;
24
32
  export type SubGridEditorSlots = typeof __propDef.slots;
25
33
  export default class SubGridEditor extends SvelteComponent<SubGridEditorProps, SubGridEditorEvents, SubGridEditorSlots> {
34
+ get moveComponentBetweenSubgrids(): (componentId: string, parentComponentId: string, subGridIndex: number, position?: {
35
+ x: number;
36
+ y: number;
37
+ } | undefined) => void;
38
+ get moveToRoot(): (componentId: string, position?: {
39
+ x: number;
40
+ y: number;
41
+ } | undefined) => void;
26
42
  }
27
43
  export {};
@@ -23,7 +23,7 @@ export declare function getAllRecomputeIdsForComponent(app: App, id: string | un
23
23
  export declare function createNewGridItem(grid: GridItem[], id: string, data: AppComponent, columns?: Record<number, any>, initialPosition?: {
24
24
  x: number;
25
25
  y: number;
26
- }, recOverride?: Record<number, Size>, fixed?: boolean): GridItem;
26
+ }, recOverride?: Record<number, Size>, fixed?: boolean, shouldNotFindSpace?: boolean): GridItem;
27
27
  export declare function getGridItems(app: App, focusedGrid: FocusedGrid | undefined): GridItem[];
28
28
  export declare function cleanseOneOfConfiguration(configuration: Record<string, Record<string, GeneralAppInput & (StaticAppInput | EvalAppInput | EvalV2AppInput)>>): {
29
29
  [k: string]: any;
@@ -37,7 +37,7 @@ export declare function appComponentFromType<T extends keyof typeof components>(
37
37
  export declare function insertNewGridItem(app: App, builddata: (id: string) => AppComponent, focusedGrid: FocusedGrid | undefined, columns?: Record<string, any>, keepId?: string, initialPosition?: {
38
38
  x: number;
39
39
  y: number;
40
- }, recOverride?: Record<number, Size>, keepSubgrids?: boolean, fixed?: boolean): string;
40
+ }, recOverride?: Record<number, Size>, keepSubgrids?: boolean, fixed?: boolean, shouldNotFindSpace?: boolean): string;
41
41
  export declare function copyComponent(app: App, item: GridItem, parentGrid: FocusedGrid | undefined, subgrids: Record<string, GridItem[]>, alreadyVisited: string[]): string | undefined;
42
42
  export declare function getAllSubgridsAndComponentIds(app: App, component: AppComponent): [string[], string[]];
43
43
  export declare function getAllGridItems(app: App): GridItem[];
@@ -90,4 +90,21 @@ export declare const ROW_GAP_X = 4;
90
90
  export declare function maxHeight(grid: GridItem[], windowHeight: number, breakpoint?: EditorBreakpoint): number;
91
91
  export declare function isTableAction(id: string, app: App): boolean;
92
92
  export declare function setUpTopBarComponentContent(id: string, app: App): void;
93
+ export declare function isContainer(type: string): boolean;
94
+ export declare function subGridIndexKey(type: string | undefined, id: string, world: World): number;
95
+ export declare function computePosition(clientX: number, clientY: number, xPerPx: number, yPerPx: number, overlapped?: string, element?: HTMLElement): {
96
+ x: number;
97
+ y: number;
98
+ };
99
+ export declare function getDeltaYByComponent(type: string): "0px" | "36px + 0.5rem" | "32px";
100
+ export declare function getDeltaXByComponent(type: string): "0px" | "0.5rem";
101
+ export type GridShadow = {
102
+ x: number;
103
+ y: number;
104
+ xPerPx: number;
105
+ yPerPx: number;
106
+ w: number;
107
+ h: number;
108
+ };
109
+ export declare function areShadowsTheSame(shadow1: GridShadow | undefined, shadow2: GridShadow | undefined): boolean;
93
110
  export {};
@@ -1,12 +1,12 @@
1
1
  import { ccomponents, components, getRecommendedDimensionsByComponent } from './component';
2
2
  import { gridColumns } from '../gridUtils';
3
3
  import { allItems } from '../utils';
4
- import gridHelp from '../svelte-grid/utils/helper';
5
4
  import { get } from 'svelte/store';
6
5
  import { deepMergeWithPriority } from '../../../utils';
7
6
  import { sendUserToast } from '../../../toast';
8
7
  import { getNextId } from '../../flows/idUtils';
9
8
  import { enterpriseLicense } from '../../../stores';
9
+ import gridHelp from '../svelte-grid/utils/helper';
10
10
  export function findComponentSettings(app, id) {
11
11
  if (!id)
12
12
  return undefined;
@@ -183,7 +183,7 @@ export function getAllRecomputeIdsForComponent(app, id) {
183
183
  });
184
184
  return recomputedBy;
185
185
  }
186
- export function createNewGridItem(grid, id, data, columns, initialPosition = { x: 0, y: 0 }, recOverride, fixed) {
186
+ export function createNewGridItem(grid, id, data, columns, initialPosition = { x: 0, y: 0 }, recOverride, fixed, shouldNotFindSpace) {
187
187
  const newComponent = {
188
188
  fixed: fixed ?? false,
189
189
  x: initialPosition.x,
@@ -206,10 +206,24 @@ export function createNewGridItem(grid, id, data, columns, initialPosition = { x
206
206
  };
207
207
  }
208
208
  else {
209
- newItem[column] = columns[column];
209
+ newItem[column] = {
210
+ ...columns[column],
211
+ x: initialPosition.x,
212
+ y: initialPosition.y
213
+ };
214
+ }
215
+ let shouldComputePosition = false;
216
+ // Fallback to avoid component disapearing
217
+ if (initialPosition.x === undefined || initialPosition.y === undefined) {
218
+ newItem[column].x = 0;
219
+ newItem[column].y = 0;
220
+ shouldComputePosition = true;
221
+ }
222
+ // Either the final position is controlled using initialPosition or the position is computed because the component positions are wrong
223
+ if (!shouldNotFindSpace || shouldComputePosition) {
224
+ const position = gridHelp.findSpace(newItem, grid, column);
225
+ newItem[column] = { ...newItem[column], ...position };
210
226
  }
211
- const position = gridHelp.findSpace(newItem, grid, column);
212
- newItem[column] = { ...newItem[column], ...position };
213
227
  });
214
228
  return newItem;
215
229
  }
@@ -283,7 +297,7 @@ export function appComponentFromType(type, overrideConfiguration, extra, overrid
283
297
  };
284
298
  };
285
299
  }
286
- export function insertNewGridItem(app, builddata, focusedGrid, columns, keepId, initialPosition = { x: 0, y: 0 }, recOverride, keepSubgrids, fixed) {
300
+ export function insertNewGridItem(app, builddata, focusedGrid, columns, keepId, initialPosition = { x: 0, y: 0 }, recOverride, keepSubgrids, fixed, shouldNotFindSpace) {
287
301
  const id = keepId ?? getNextGridItemId(app);
288
302
  const data = builddata(id);
289
303
  if (data.type == 'aggridcomponentee' && !get(enterpriseLicense)) {
@@ -316,7 +330,7 @@ export function insertNewGridItem(app, builddata, focusedGrid, columns, keepId,
316
330
  app.subgrids[key] = [];
317
331
  }
318
332
  let grid = focusedGrid ? app.subgrids[key] : app.grid;
319
- const newItem = createNewGridItem(grid, id, data, columns, initialPosition, recOverride, fixed);
333
+ const newItem = createNewGridItem(grid, id, data, columns, initialPosition, recOverride, fixed, shouldNotFindSpace);
320
334
  grid.push(newItem);
321
335
  return id;
322
336
  }
@@ -790,3 +804,85 @@ export function setUpTopBarComponentContent(id, app) {
790
804
  }
791
805
  });
792
806
  }
807
+ export function isContainer(type) {
808
+ return (type === 'containercomponent' ||
809
+ type === 'tabscomponent' ||
810
+ type === 'verticalsplitpanescomponent' ||
811
+ type === 'horizontalsplitpanescomponent' ||
812
+ type === 'steppercomponent' ||
813
+ type === 'listcomponent' ||
814
+ type === 'decisiontreecomponent');
815
+ }
816
+ export function subGridIndexKey(type, id, world) {
817
+ switch (type) {
818
+ case 'containercomponent':
819
+ case 'verticalsplitpanescomponent':
820
+ case 'horizontalsplitpanescomponent':
821
+ case 'listcomponent':
822
+ return 0;
823
+ case 'tabscomponent': {
824
+ return world?.outputsById?.[id]?.selectedTabIndex?.peak() ?? 0;
825
+ }
826
+ case 'steppercomponent': {
827
+ return world?.outputsById?.[id]?.currentStepIndex?.peak() ?? 0;
828
+ }
829
+ case 'decisiontreecomponent': {
830
+ return world?.outputsById?.[id]?.currentNodeIndex?.peak() ?? 0;
831
+ }
832
+ }
833
+ return 0;
834
+ }
835
+ export function computePosition(clientX, clientY, xPerPx, yPerPx, overlapped, element) {
836
+ const overlappedElement = overlapped
837
+ ? document.getElementById(`component-${overlapped}`)
838
+ : document.getElementById('root-grid');
839
+ const xRelativeToElement = element ? clientX - element.getBoundingClientRect().left : 0;
840
+ const yRelativeToElement = element ? clientY - element.getBoundingClientRect().top : 0;
841
+ const xRelativeToOverlappedElement = overlappedElement
842
+ ? clientX - overlappedElement.getBoundingClientRect().left - xRelativeToElement
843
+ : 0;
844
+ const yRelativeToOverlappedElement = overlappedElement
845
+ ? clientY - overlappedElement.getBoundingClientRect().top - yRelativeToElement
846
+ : 0;
847
+ const gridX = Math.max(Math.round(xRelativeToOverlappedElement / xPerPx) ?? 0, 0);
848
+ const gridY = Math.max(Math.round(yRelativeToOverlappedElement / yPerPx) ?? 0, 0);
849
+ return {
850
+ x: gridX,
851
+ y: gridY
852
+ };
853
+ }
854
+ export function getDeltaYByComponent(type) {
855
+ switch (type) {
856
+ case 'steppercomponent': {
857
+ return '36px + 0.5rem';
858
+ }
859
+ case 'tabscomponent': {
860
+ return '32px';
861
+ }
862
+ default:
863
+ return '0px';
864
+ }
865
+ }
866
+ export function getDeltaXByComponent(type) {
867
+ switch (type) {
868
+ case 'steppercomponent': {
869
+ return '0.5rem';
870
+ }
871
+ case 'tabscomponent': {
872
+ return '0px';
873
+ }
874
+ default:
875
+ return '0px';
876
+ }
877
+ }
878
+ export function areShadowsTheSame(shadow1, shadow2) {
879
+ if (!shadow1 || !shadow2) {
880
+ return false;
881
+ }
882
+ return (shadow1.x === shadow2.x &&
883
+ shadow1.y === shadow2.y &&
884
+ shadow1.xPerPx === shadow2.xPerPx &&
885
+ shadow1.yPerPx === shadow2.yPerPx &&
886
+ shadow1.w === shadow2.w &&
887
+ shadow1.h === shadow2.h);
888
+ }