windmill-components 1.405.0 → 1.406.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.
- package/package/assets/app.css +20 -0
- package/package/components/AppConnectLightweightResourcePicker.svelte +66 -0
- package/package/components/AppConnectLightweightResourcePicker.svelte.d.ts +21 -0
- package/package/components/ArgInput.svelte +6 -2
- package/package/components/ArgInput.svelte.d.ts +1 -0
- package/package/components/CustomPopover.svelte +1 -1
- package/package/components/DisplayResult.svelte +1 -1
- package/package/components/FlowBuilder.svelte +2 -0
- package/package/components/FlowBuilder.svelte.d.ts +1 -0
- package/package/components/FlowInputViewer.svelte +25 -0
- package/package/components/FlowInputViewer.svelte.d.ts +19 -0
- package/package/components/FlowJobResult.svelte +8 -1
- package/package/components/FlowJobResult.svelte.d.ts +1 -0
- package/package/components/FlowMetadata.svelte +2 -2
- package/package/components/FlowPreviewContent.svelte +2 -1
- package/package/components/FlowStatusViewer.svelte +3 -1
- package/package/components/FlowStatusViewer.svelte.d.ts +1 -0
- package/package/components/FlowStatusViewerInner.svelte +4 -1
- package/package/components/FlowViewer.svelte +2 -21
- package/package/components/LightweightResourcePicker.svelte +34 -30
- package/package/components/LogViewer.svelte +4 -3
- package/package/components/LogViewer.svelte.d.ts +1 -0
- package/package/components/ManualPopover.svelte +1 -1
- package/package/components/ObjectResourceInput.svelte +5 -2
- package/package/components/ObjectResourceInput.svelte.d.ts +2 -0
- package/package/components/Popover.svelte +1 -1
- package/package/components/Portal.svelte +7 -8
- package/package/components/Portal.svelte.d.ts +3 -7
- package/package/components/QueueMetricsDrawer.svelte +368 -3
- package/package/components/QueueMetricsDrawer.svelte.d.ts +2 -0
- package/package/components/ResourceEditor.svelte +4 -5
- package/package/components/ResourcePicker.svelte +14 -9
- package/package/components/ResourcePicker.svelte.d.ts +1 -0
- package/package/components/RunForm.svelte +1 -1
- package/package/components/SavedInputs.svelte +2 -2
- package/package/components/ScriptVersionHistory.svelte +54 -59
- package/package/components/TestConnection.svelte +1 -0
- package/package/components/TimeAgo.svelte +5 -6
- package/package/components/TimeAgo.svelte.d.ts +1 -1
- package/package/components/apps/components/buttons/AppButton.svelte +1 -1
- package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +1 -1
- package/package/components/apps/components/inputs/AppMultiSelect.svelte +1 -1
- package/package/components/apps/components/inputs/AppMultiSelectV2.svelte +1 -1
- package/package/components/apps/components/layout/AppDrawer.svelte +1 -1
- package/package/components/apps/components/layout/AppModal.svelte +1 -1
- package/package/components/apps/editor/AppEditor.svelte +11 -3
- package/package/components/apps/editor/GridEditor.svelte +57 -4
- package/package/components/apps/editor/GridEditor.svelte.d.ts +8 -0
- package/package/components/apps/editor/GridEditorMenu.svelte +1 -1
- package/package/components/apps/editor/SubGridEditor.svelte +82 -3
- package/package/components/apps/editor/SubGridEditor.svelte.d.ts +16 -0
- package/package/components/apps/editor/appUtils.d.ts +19 -2
- package/package/components/apps/editor/appUtils.js +103 -7
- package/package/components/apps/editor/component/Component.svelte +36 -8
- package/package/components/apps/editor/component/Component.svelte.d.ts +3 -1
- package/package/components/apps/editor/contextPanel/components/OutputHeader.svelte +1 -1
- package/package/components/apps/svelte-grid/Grid.svelte +235 -12
- package/package/components/apps/svelte-grid/Grid.svelte.d.ts +7 -7
- package/package/components/apps/svelte-grid/MoveResize.svelte +104 -11
- package/package/components/apps/svelte-grid/MoveResize.svelte.d.ts +7 -0
- package/package/components/apps/svelte-grid/utils/item.d.ts +4 -1
- package/package/components/apps/svelte-grid/utils/item.js +2 -3
- package/package/components/apps/svelte-select/lib/ConditionalPortal.svelte +1 -1
- package/package/components/apps/svelte-select/lib/ConditionalPortalGlobal.svelte +1 -1
- package/package/components/common/button/ButtonDropdown.svelte +1 -1
- package/package/components/common/drawer/ConditionalPortal.svelte +1 -1
- package/package/components/common/menu/MenuV2.svelte +1 -1
- package/package/components/common/modal/AlwaysMountedModal.svelte +1 -1
- package/package/components/common/popup/PopupV2.svelte +1 -1
- package/package/components/copilot/StepGenQuick.svelte +3 -2
- package/package/components/copilot/StepGenQuick.svelte.d.ts +1 -0
- package/package/components/custom_ui.d.ts +1 -0
- package/package/components/details/Menu.svelte +1 -1
- package/package/components/flows/CreateActionsApp.svelte +1 -1
- package/package/components/flows/FlowEditor.svelte +2 -1
- package/package/components/flows/FlowEditor.svelte.d.ts +1 -0
- package/package/components/flows/FlowHistory.svelte +10 -195
- package/package/components/flows/FlowHistory.svelte.d.ts +0 -1
- package/package/components/flows/FlowHistoryInner.svelte +200 -0
- package/package/components/flows/FlowHistoryInner.svelte.d.ts +19 -0
- package/package/components/flows/content/FlowEditorPanel.svelte +2 -1
- package/package/components/flows/content/FlowEditorPanel.svelte.d.ts +1 -0
- package/package/components/flows/content/FlowInput.svelte +66 -58
- package/package/components/flows/content/FlowInput.svelte.d.ts +1 -0
- package/package/components/flows/content/FlowModuleScript.svelte +1 -1
- package/package/components/flows/header/FlowYamlEditor.svelte +6 -2
- package/package/components/flows/map/FlowModuleSchemaMap.svelte +3 -2
- package/package/components/flows/map/InsertModuleButton.svelte +1 -1
- package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte +1 -1
- package/package/components/graph/model.d.ts +1 -0
- package/package/components/icons/WindmillIcon.svelte +119 -105
- package/package/components/icons/store.d.ts +4 -0
- package/package/components/icons/store.js +1 -0
- package/package/components/multiselect/MultiSelectWrapper.svelte +1 -1
- package/package/components/propertyPicker/ObjectViewer.svelte +1 -1
- package/package/components/runs/RunRow.svelte +3 -7
- package/package/components/schema/FlowPropertyEditor.svelte +1 -0
- package/package/components/search/GlobalSearchModal.svelte +1 -1
- package/package/script_helpers.d.ts +37 -38
- package/package/script_helpers.js +100 -38
- package/package.json +23 -1
- package/package/init_scripts/python_failure_module.d.ts +0 -2
- package/package/init_scripts/python_failure_module.js +0 -8
- package/package/init_scripts/python_init_code.d.ts +0 -2
- package/package/init_scripts/python_init_code.js +0 -40
- package/package/init_scripts/python_init_code_clear.d.ts +0 -2
- package/package/init_scripts/python_init_code_clear.js +0 -5
- package/package/init_scripts/python_init_code_trigger.d.ts +0 -2
- package/package/init_scripts/python_init_code_trigger.js +0 -14
|
@@ -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 &&
|
|
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
|
|
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}
|
|
@@ -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 -->
|
|
@@ -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
|
-
|
|
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] =
|
|
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
|
+
}
|