@easy-editor/plugin-dashboard 0.0.17 → 1.0.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/README.md +121 -1
- package/dist/{cjs/index.js → index.cjs} +31 -63
- package/dist/index.d.ts +21 -4
- package/dist/index.js +31 -62
- package/package.json +12 -14
- package/dist/cjs/index.js.map +0 -1
- package/dist/esm/index.js +0 -915
- package/dist/esm/index.js.map +0 -1
- package/dist/materials/group/component.d.ts +0 -5
- package/dist/materials/group/configure.d.ts +0 -3
- package/dist/materials/group/index.d.ts +0 -3
- package/dist/materials/group/meta.d.ts +0 -3
package/README.md
CHANGED
|
@@ -1,3 +1,123 @@
|
|
|
1
1
|
# @easy-editor/plugin-dashboard
|
|
2
2
|
|
|
3
|
-
Dashboard plugin for EasyEditor.
|
|
3
|
+
Dashboard plugin for EasyEditor. This plugin provides dashboard functionality for managing elements on a canvas-like editor interface, with features like:
|
|
4
|
+
|
|
5
|
+
- Element positioning and drag-and-drop
|
|
6
|
+
- Grouping and ungrouping elements
|
|
7
|
+
- Element layering (move to top, bottom, etc.)
|
|
8
|
+
- Guidelines and element alignment
|
|
9
|
+
- Visual feedback and layout management
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
|
|
13
|
+
### Positioning and Movement
|
|
14
|
+
|
|
15
|
+
The dashboard plugin handles precise positioning of elements on your canvas with:
|
|
16
|
+
|
|
17
|
+
- Drag-and-drop movement with position tracking
|
|
18
|
+
- Automatic alignment guides with element snapping
|
|
19
|
+
- Coordinate-based positioning with `x`, `y`, `width`, and `height` properties
|
|
20
|
+
|
|
21
|
+
### Element Grouping
|
|
22
|
+
|
|
23
|
+
Easily organize your design by grouping elements together:
|
|
24
|
+
|
|
25
|
+
| Action | Description |
|
|
26
|
+
|--------|-------------|
|
|
27
|
+
| Group Elements | Combine multiple elements into a single manageable group |
|
|
28
|
+
| Ungroup | Split a group back into individual elements |
|
|
29
|
+
| Nested Groups | Support for groups within groups |
|
|
30
|
+
|
|
31
|
+
### Element Layering
|
|
32
|
+
|
|
33
|
+
Control the stacking order of elements on your dashboard:
|
|
34
|
+
|
|
35
|
+
| Method | Description |
|
|
36
|
+
|--------|-------------|
|
|
37
|
+
| `levelTop()` | Move element to the front |
|
|
38
|
+
| `levelBottom()` | Send element to the back |
|
|
39
|
+
| `levelUp()` | Move element up one layer |
|
|
40
|
+
| `levelDown()` | Move element down one layer |
|
|
41
|
+
| `moveToLevel(level)` | Move element to a specific layer |
|
|
42
|
+
|
|
43
|
+
### Guide Lines
|
|
44
|
+
|
|
45
|
+
The plugin provides smart guide lines that help with precise element alignment:
|
|
46
|
+
|
|
47
|
+
- Automatic alignment to element edges and centers
|
|
48
|
+
- Configurable guide lines at specific positions
|
|
49
|
+
- Visual feedback during element movement
|
|
50
|
+
|
|
51
|
+
## Usage Example
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
import { DashboardPlugin } from '@easy-editor/plugin-dashboard';
|
|
55
|
+
|
|
56
|
+
// Define your group component metadata
|
|
57
|
+
const groupMeta = {
|
|
58
|
+
componentName: 'Group',
|
|
59
|
+
title: 'Group',
|
|
60
|
+
category: 'inner',
|
|
61
|
+
configure: {
|
|
62
|
+
advanced: {
|
|
63
|
+
view: GroupComponent
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// Initialize the plugin with required configuration
|
|
69
|
+
DashboardPlugin({
|
|
70
|
+
group: {
|
|
71
|
+
meta: groupMeta,
|
|
72
|
+
initSchema: {
|
|
73
|
+
componentName: 'Group',
|
|
74
|
+
title: 'Group',
|
|
75
|
+
isGroup: true,
|
|
76
|
+
},
|
|
77
|
+
}
|
|
78
|
+
})
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Configuration Options
|
|
82
|
+
|
|
83
|
+
The plugin accepts a configuration object with the following properties:
|
|
84
|
+
|
|
85
|
+
### Group Component
|
|
86
|
+
|
|
87
|
+
The `group` property is required and defines how groups will be handled in the dashboard:
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
{
|
|
91
|
+
group: {
|
|
92
|
+
// Component metadata for the group
|
|
93
|
+
meta: ComponentMetadata;
|
|
94
|
+
|
|
95
|
+
// Initial schema for new groups
|
|
96
|
+
initSchema: NodeSchema;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## API Extensions
|
|
102
|
+
|
|
103
|
+
The dashboard plugin extends several core interfaces with additional methods:
|
|
104
|
+
|
|
105
|
+
### Document Extensions
|
|
106
|
+
|
|
107
|
+
- `document.group(nodeIdList)` - Group multiple nodes together
|
|
108
|
+
- `document.ungroup(group)` - Ungroup a group node
|
|
109
|
+
|
|
110
|
+
### Node Extensions
|
|
111
|
+
|
|
112
|
+
- `node.isGroup` - Boolean indicating if node is a group
|
|
113
|
+
- `node.getDashboardRect()` - Get positioning rectangle
|
|
114
|
+
- `node.updateDashboardRect(rect)` - Update positioning
|
|
115
|
+
- `node.getNodesInGroup()` - Get direct child nodes in a group
|
|
116
|
+
- `node.getAllNodesInGroup()` - Get all nested nodes in a group
|
|
117
|
+
- `node.getCurrentGroup()` - Get immediate parent group
|
|
118
|
+
- `node.getTopGroup()` - Get top-most parent group
|
|
119
|
+
- `node.getAllGroups()` - Get all parent groups
|
|
120
|
+
|
|
121
|
+
### Designer Extensions
|
|
122
|
+
|
|
123
|
+
- `designer.guideline` - Access to guidelines functionality
|
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
var core = require('@easy-editor/core');
|
|
4
4
|
var mobx = require('mobx');
|
|
5
|
-
var react = require('react');
|
|
6
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
7
5
|
|
|
8
6
|
function _applyDecs2311(e, t, n, r, o, i) {
|
|
9
7
|
var a,
|
|
@@ -377,35 +375,6 @@ class GuideLine {
|
|
|
377
375
|
}
|
|
378
376
|
}
|
|
379
377
|
|
|
380
|
-
const Group = /*#__PURE__*/react.forwardRef((props, ref) => {
|
|
381
|
-
return /*#__PURE__*/jsxRuntime.jsx("div", {
|
|
382
|
-
ref: ref,
|
|
383
|
-
style: {
|
|
384
|
-
position: 'relative',
|
|
385
|
-
width: '100%',
|
|
386
|
-
height: '100%'
|
|
387
|
-
},
|
|
388
|
-
children: props?.children
|
|
389
|
-
});
|
|
390
|
-
});
|
|
391
|
-
|
|
392
|
-
const configure = {
|
|
393
|
-
props: [
|
|
394
|
-
],
|
|
395
|
-
component: {},
|
|
396
|
-
supports: {},
|
|
397
|
-
advanced: {
|
|
398
|
-
view: Group
|
|
399
|
-
}
|
|
400
|
-
};
|
|
401
|
-
|
|
402
|
-
const meta = {
|
|
403
|
-
componentName: 'Group',
|
|
404
|
-
title: '分组',
|
|
405
|
-
category: '内置',
|
|
406
|
-
configure
|
|
407
|
-
};
|
|
408
|
-
|
|
409
378
|
const updateNodeRect = (node, offset = {
|
|
410
379
|
x: 0,
|
|
411
380
|
y: 0
|
|
@@ -442,47 +411,42 @@ const updateNodeRectByDOM = (node, offset = {
|
|
|
442
411
|
domNode.style.top = `${offset.y}px`;
|
|
443
412
|
};
|
|
444
413
|
|
|
445
|
-
const defaultGroupSchema = {
|
|
446
|
-
componentName: 'Group',
|
|
447
|
-
title: '分组',
|
|
448
|
-
isGroup: true
|
|
449
|
-
};
|
|
450
414
|
const DashboardPlugin = options => {
|
|
451
415
|
const {
|
|
452
|
-
group
|
|
416
|
+
group
|
|
453
417
|
} = options || {};
|
|
454
418
|
const {
|
|
455
|
-
|
|
419
|
+
meta: groupMeta,
|
|
420
|
+
initSchema: groupInitSchema
|
|
456
421
|
} = group || {};
|
|
422
|
+
if (!groupMeta || !groupInitSchema) {
|
|
423
|
+
throw new Error('group meta and group init schema are required');
|
|
424
|
+
}
|
|
457
425
|
return {
|
|
458
426
|
name: 'DashboardPlugin',
|
|
459
427
|
deps: [],
|
|
460
428
|
init(ctx) {
|
|
461
429
|
const {
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
componentMetaManager,
|
|
465
|
-
hotkey,
|
|
466
|
-
logger
|
|
430
|
+
materials,
|
|
431
|
+
project
|
|
467
432
|
} = ctx;
|
|
468
433
|
const {
|
|
469
|
-
|
|
470
|
-
} =
|
|
471
|
-
|
|
472
|
-
e.preventDefault();
|
|
473
|
-
logger.log('ctrl+d');
|
|
474
|
-
});
|
|
475
|
-
designer.onEvent(core.DESIGNER_EVENT.INIT, designer => {
|
|
476
|
-
designer.guideline = new GuideLine(designer);
|
|
477
|
-
});
|
|
478
|
-
componentMetaManager.createComponentMeta(meta);
|
|
479
|
-
simulator.addComponent('Group', Group);
|
|
434
|
+
designer
|
|
435
|
+
} = project;
|
|
436
|
+
materials.createComponentMeta(groupMeta);
|
|
480
437
|
const startOffsetNodeData = {
|
|
481
438
|
x: 0,
|
|
482
439
|
y: 0
|
|
483
440
|
};
|
|
484
441
|
designer.dragon.onDragstart(e => {
|
|
485
442
|
if (!e.shell) return;
|
|
443
|
+
const {
|
|
444
|
+
simulator
|
|
445
|
+
} = project;
|
|
446
|
+
if (!simulator) return;
|
|
447
|
+
const {
|
|
448
|
+
viewport
|
|
449
|
+
} = simulator;
|
|
486
450
|
const {
|
|
487
451
|
dragObject
|
|
488
452
|
} = e;
|
|
@@ -613,6 +577,10 @@ const DashboardPlugin = options => {
|
|
|
613
577
|
}
|
|
614
578
|
});
|
|
615
579
|
designer.dragon.onDragend(e => {
|
|
580
|
+
const {
|
|
581
|
+
simulator
|
|
582
|
+
} = project;
|
|
583
|
+
if (!simulator) return;
|
|
616
584
|
const {
|
|
617
585
|
dragObject,
|
|
618
586
|
esc
|
|
@@ -645,15 +613,16 @@ const DashboardPlugin = options => {
|
|
|
645
613
|
extend
|
|
646
614
|
}) {
|
|
647
615
|
const {
|
|
648
|
-
Node
|
|
649
|
-
Designer
|
|
616
|
+
Node
|
|
650
617
|
} = extendClass;
|
|
651
|
-
|
|
618
|
+
let guideline = null;
|
|
652
619
|
extend('Designer', {
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
620
|
+
guideline: {
|
|
621
|
+
get() {
|
|
622
|
+
if (!guideline) {
|
|
623
|
+
guideline = new GuideLine(this);
|
|
624
|
+
}
|
|
625
|
+
return guideline;
|
|
657
626
|
}
|
|
658
627
|
}
|
|
659
628
|
});
|
|
@@ -665,7 +634,7 @@ const DashboardPlugin = options => {
|
|
|
665
634
|
if (typeof nodeIdList[0] === 'string') {
|
|
666
635
|
nodeList = nodeIdList.map(id => this.getNode(id));
|
|
667
636
|
}
|
|
668
|
-
const groupNode = this.createNode(
|
|
637
|
+
const groupNode = this.createNode(groupInitSchema);
|
|
669
638
|
let maxZIndex = Number.POSITIVE_INFINITY;
|
|
670
639
|
for (const node of nodeList) {
|
|
671
640
|
if (node.index < maxZIndex) {
|
|
@@ -914,4 +883,3 @@ const calculateDashboardRectBox = nodes => {
|
|
|
914
883
|
};
|
|
915
884
|
|
|
916
885
|
module.exports = DashboardPlugin;
|
|
917
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,27 @@
|
|
|
1
|
-
import { type NodeSchema, type PluginCreator } from '@easy-editor/core';
|
|
1
|
+
import { type ComponentMetadata, type NodeSchema, type PluginCreator } from '@easy-editor/core';
|
|
2
2
|
export * from './type';
|
|
3
3
|
interface DashboardPluginOptions {
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
/**
|
|
5
|
+
* 分组组件,用于大屏设计。允许将多个组件组合在一起,便于整体管理和移动。
|
|
6
|
+
*/
|
|
7
|
+
group: {
|
|
8
|
+
/**
|
|
9
|
+
* 分组元数据
|
|
10
|
+
*/
|
|
11
|
+
meta: ComponentMetadata;
|
|
12
|
+
/**
|
|
13
|
+
* 创建分组时的初始化 schema
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* {
|
|
17
|
+
* componentName: 'Group',
|
|
18
|
+
* title: '分组',
|
|
19
|
+
* isGroup: true,
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
initSchema: NodeSchema;
|
|
6
24
|
};
|
|
7
|
-
xxx?: string;
|
|
8
25
|
}
|
|
9
26
|
declare const DashboardPlugin: PluginCreator<DashboardPluginOptions>;
|
|
10
27
|
export default DashboardPlugin;
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { DESIGNER_EVENT, DragObjectType, getConvertedExtraKey } from '@easy-editor/core';
|
|
2
2
|
import { observable, computed, action } from 'mobx';
|
|
3
|
-
import { forwardRef } from 'react';
|
|
4
|
-
import { jsx } from 'react/jsx-runtime';
|
|
5
3
|
|
|
6
4
|
function _applyDecs2311(e, t, n, r, o, i) {
|
|
7
5
|
var a,
|
|
@@ -375,35 +373,6 @@ class GuideLine {
|
|
|
375
373
|
}
|
|
376
374
|
}
|
|
377
375
|
|
|
378
|
-
const Group = /*#__PURE__*/forwardRef((props, ref) => {
|
|
379
|
-
return /*#__PURE__*/jsx("div", {
|
|
380
|
-
ref: ref,
|
|
381
|
-
style: {
|
|
382
|
-
position: 'relative',
|
|
383
|
-
width: '100%',
|
|
384
|
-
height: '100%'
|
|
385
|
-
},
|
|
386
|
-
children: props?.children
|
|
387
|
-
});
|
|
388
|
-
});
|
|
389
|
-
|
|
390
|
-
const configure = {
|
|
391
|
-
props: [
|
|
392
|
-
],
|
|
393
|
-
component: {},
|
|
394
|
-
supports: {},
|
|
395
|
-
advanced: {
|
|
396
|
-
view: Group
|
|
397
|
-
}
|
|
398
|
-
};
|
|
399
|
-
|
|
400
|
-
const meta = {
|
|
401
|
-
componentName: 'Group',
|
|
402
|
-
title: '分组',
|
|
403
|
-
category: '内置',
|
|
404
|
-
configure
|
|
405
|
-
};
|
|
406
|
-
|
|
407
376
|
const updateNodeRect = (node, offset = {
|
|
408
377
|
x: 0,
|
|
409
378
|
y: 0
|
|
@@ -440,47 +409,42 @@ const updateNodeRectByDOM = (node, offset = {
|
|
|
440
409
|
domNode.style.top = `${offset.y}px`;
|
|
441
410
|
};
|
|
442
411
|
|
|
443
|
-
const defaultGroupSchema = {
|
|
444
|
-
componentName: 'Group',
|
|
445
|
-
title: '分组',
|
|
446
|
-
isGroup: true
|
|
447
|
-
};
|
|
448
412
|
const DashboardPlugin = options => {
|
|
449
413
|
const {
|
|
450
|
-
group
|
|
414
|
+
group
|
|
451
415
|
} = options || {};
|
|
452
416
|
const {
|
|
453
|
-
|
|
417
|
+
meta: groupMeta,
|
|
418
|
+
initSchema: groupInitSchema
|
|
454
419
|
} = group || {};
|
|
420
|
+
if (!groupMeta || !groupInitSchema) {
|
|
421
|
+
throw new Error('group meta and group init schema are required');
|
|
422
|
+
}
|
|
455
423
|
return {
|
|
456
424
|
name: 'DashboardPlugin',
|
|
457
425
|
deps: [],
|
|
458
426
|
init(ctx) {
|
|
459
427
|
const {
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
componentMetaManager,
|
|
463
|
-
hotkey,
|
|
464
|
-
logger
|
|
428
|
+
materials,
|
|
429
|
+
project
|
|
465
430
|
} = ctx;
|
|
466
431
|
const {
|
|
467
|
-
|
|
468
|
-
} =
|
|
469
|
-
|
|
470
|
-
e.preventDefault();
|
|
471
|
-
logger.log('ctrl+d');
|
|
472
|
-
});
|
|
473
|
-
designer.onEvent(DESIGNER_EVENT.INIT, designer => {
|
|
474
|
-
designer.guideline = new GuideLine(designer);
|
|
475
|
-
});
|
|
476
|
-
componentMetaManager.createComponentMeta(meta);
|
|
477
|
-
simulator.addComponent('Group', Group);
|
|
432
|
+
designer
|
|
433
|
+
} = project;
|
|
434
|
+
materials.createComponentMeta(groupMeta);
|
|
478
435
|
const startOffsetNodeData = {
|
|
479
436
|
x: 0,
|
|
480
437
|
y: 0
|
|
481
438
|
};
|
|
482
439
|
designer.dragon.onDragstart(e => {
|
|
483
440
|
if (!e.shell) return;
|
|
441
|
+
const {
|
|
442
|
+
simulator
|
|
443
|
+
} = project;
|
|
444
|
+
if (!simulator) return;
|
|
445
|
+
const {
|
|
446
|
+
viewport
|
|
447
|
+
} = simulator;
|
|
484
448
|
const {
|
|
485
449
|
dragObject
|
|
486
450
|
} = e;
|
|
@@ -611,6 +575,10 @@ const DashboardPlugin = options => {
|
|
|
611
575
|
}
|
|
612
576
|
});
|
|
613
577
|
designer.dragon.onDragend(e => {
|
|
578
|
+
const {
|
|
579
|
+
simulator
|
|
580
|
+
} = project;
|
|
581
|
+
if (!simulator) return;
|
|
614
582
|
const {
|
|
615
583
|
dragObject,
|
|
616
584
|
esc
|
|
@@ -643,15 +611,16 @@ const DashboardPlugin = options => {
|
|
|
643
611
|
extend
|
|
644
612
|
}) {
|
|
645
613
|
const {
|
|
646
|
-
Node
|
|
647
|
-
Designer
|
|
614
|
+
Node
|
|
648
615
|
} = extendClass;
|
|
649
|
-
|
|
616
|
+
let guideline = null;
|
|
650
617
|
extend('Designer', {
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
618
|
+
guideline: {
|
|
619
|
+
get() {
|
|
620
|
+
if (!guideline) {
|
|
621
|
+
guideline = new GuideLine(this);
|
|
622
|
+
}
|
|
623
|
+
return guideline;
|
|
655
624
|
}
|
|
656
625
|
}
|
|
657
626
|
});
|
|
@@ -663,7 +632,7 @@ const DashboardPlugin = options => {
|
|
|
663
632
|
if (typeof nodeIdList[0] === 'string') {
|
|
664
633
|
nodeList = nodeIdList.map(id => this.getNode(id));
|
|
665
634
|
}
|
|
666
|
-
const groupNode = this.createNode(
|
|
635
|
+
const groupNode = this.createNode(groupInitSchema);
|
|
667
636
|
let maxZIndex = Number.POSITIVE_INFINITY;
|
|
668
637
|
for (const node of nodeList) {
|
|
669
638
|
if (node.index < maxZIndex) {
|
package/package.json
CHANGED
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@easy-editor/plugin-dashboard",
|
|
3
|
-
"version": "0.0
|
|
4
|
-
"description": "Dashboard plugin for EasyEditor
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Dashboard plugin for EasyEditor",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"require": "./dist/index.cjs"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
7
15
|
"files": [
|
|
8
16
|
"dist",
|
|
9
17
|
"LICENSE",
|
|
@@ -33,9 +41,7 @@
|
|
|
33
41
|
},
|
|
34
42
|
"peerDependencies": {
|
|
35
43
|
"mobx": "^6.13.5",
|
|
36
|
-
"
|
|
37
|
-
"@types/react": "^18 || ^19",
|
|
38
|
-
"@easy-editor/core": "^0.0.16"
|
|
44
|
+
"@easy-editor/core": "^1.0.0"
|
|
39
45
|
},
|
|
40
46
|
"scripts": {
|
|
41
47
|
"dev": "deno run --watch ./src/index.ts",
|
|
@@ -48,14 +54,6 @@
|
|
|
48
54
|
"types:src": "tsc --project tsconfig.build.json",
|
|
49
55
|
"test-types": "tsc --project tsconfig.test.json"
|
|
50
56
|
},
|
|
51
|
-
"types": "dist/index.d.ts",
|
|
52
|
-
"typings": "dist/index.d.ts",
|
|
53
57
|
"module": "dist/index.js",
|
|
54
|
-
"
|
|
55
|
-
".": {
|
|
56
|
-
"import": "./dist/index.js",
|
|
57
|
-
"require": "./dist/cjs/index.js",
|
|
58
|
-
"default": "./dist/index.js"
|
|
59
|
-
}
|
|
60
|
-
}
|
|
58
|
+
"unpkg": "dist/index.js"
|
|
61
59
|
}
|
package/dist/cjs/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/designer/guideline.ts","../../src/materials/group/component.tsx","../../src/materials/group/configure.ts","../../src/materials/group/meta.ts","../../src/utils.ts","../../src/index.ts"],"sourcesContent":["import { DESIGNER_EVENT, type Designer, type Viewport } from '@easy-editor/core'\nimport { action, computed, observable } from 'mobx'\n\ntype GuideLineType = 'horizontal' | 'vertical'\n\ninterface GuideLineItem {\n id: string\n type: GuideLineType\n position: number\n}\n\ninterface AlignmentLine {\n type: GuideLineType\n position: number\n}\n\ninterface AdsorptionLine {\n /**\n * 吸附位置\n * - 0: 左 | 上\n * - 1: 中\n * - 2: 右 | 下\n */\n adsorption: number\n position: number\n}\n\nexport class GuideLine {\n /**\n * 是否启用辅助线\n */\n @observable accessor enabled = true\n\n /**\n * 自定义辅助线数组\n */\n @observable.shallow accessor guideLines: GuideLineItem[] = []\n\n @computed\n get guideLinesMap() {\n const result = Object.groupBy(this.guideLines, item => item.type)\n return {\n verticalLinesMap: new Map(result.vertical?.map(item => [item.position, item])),\n horizontalLinesMap: new Map(result.horizontal?.map(item => [item.position, item])),\n }\n }\n\n /**\n * Document Node 的辅助线信息\n */\n @observable.shallow accessor nodeLineMap = {\n verticalLinesMap: new Map<number, AlignmentLine>(),\n horizontalLinesMap: new Map<number, AlignmentLine>(),\n }\n\n /**\n * 实时显示的吸附辅助线\n */\n @observable accessor adsorptionLines = {\n verticalLines: new Set<number>(),\n horizontalLines: new Set<number>(),\n }\n\n get currentDocument() {\n return this.designer.currentDocument\n }\n\n constructor(readonly designer: Designer) {\n // 添加画布视口的辅助线\n this.designer.onEvent(DESIGNER_EVENT.VIEWPORT_MOUNT, ({ viewport }: { viewport: Viewport }) => {\n this.addGuideLine({\n id: 'viewport-vertical-left',\n type: 'vertical',\n position: 0,\n })\n this.addGuideLine({\n id: 'viewport-vertical-middle',\n type: 'vertical',\n position: viewport.width / 2,\n })\n this.addGuideLine({\n id: 'viewport-vertical-right',\n type: 'vertical',\n position: viewport.width,\n })\n this.addGuideLine({\n id: 'viewport-horizontal-top',\n type: 'horizontal',\n position: 0,\n })\n this.addGuideLine({\n id: 'viewport-horizontal-middle',\n type: 'horizontal',\n position: viewport.height / 2,\n })\n this.addGuideLine({\n id: 'viewport-horizontal-bottom',\n type: 'horizontal',\n position: viewport.height,\n })\n })\n }\n\n /**\n * 添加额外的辅助线,用于尺寸调整\n */\n @action\n addGuideLine(guideLine: GuideLineItem) {\n this.guideLines.push(guideLine)\n }\n\n /**\n * 删除辅助线\n */\n @action\n removeGuideLine(id: string) {\n const index = this.guideLines.findIndex(item => item.id === id)\n if (index !== -1) {\n this.guideLines.splice(index, 1)\n }\n }\n\n /**\n * 修改辅助线\n */\n @action\n updateGuideLine(id: string, guideLine: GuideLineItem) {\n const index = this.guideLines.findIndex(item => item.id === id)\n if (index !== -1) {\n this.guideLines[index] = guideLine\n }\n }\n\n /**\n * 计算页面组件的辅助线信息\n */\n @action\n calculateGuideLineInfo() {\n if (!this.enabled) return\n\n const verticalLinesMap = new Map<number, AlignmentLine>()\n const horizontalLinesMap = new Map<number, AlignmentLine>()\n\n // 获取画布上所有的组件,得到每个可以被参照对齐的组件的位置信息\n const nodes = [...this.currentDocument!.nodesMap.values()]\n\n // 将选中的组合和组件抛开计算之外\n const selected: string[] = []\n for (const node of this.designer.selection.getNodes()) {\n if (node.isGroup) {\n selected.push(...node.getAllNodesInGroup().map(node => node.id))\n } else {\n selected.push(node.id)\n }\n }\n\n nodes\n .filter(node => !node.hidden)\n .forEach(node => {\n if (selected.includes(node.id) || node.isRoot || node.isGroup) return\n\n const nodeRect = node.getDashboardRect()\n const verticalNodeLines = [nodeRect.left, nodeRect.left + nodeRect.width / 2, nodeRect.right]\n const horizontalNodeLines = [nodeRect.top, nodeRect.top + nodeRect.height / 2, nodeRect.bottom]\n\n for (const line of verticalNodeLines) {\n const position = Math.round(line)\n verticalLinesMap.set(position, {\n type: 'vertical',\n position,\n })\n }\n for (const line of horizontalNodeLines) {\n const position = Math.round(line)\n horizontalLinesMap.set(position, {\n type: 'horizontal',\n position,\n })\n }\n })\n\n this.nodeLineMap.verticalLinesMap = verticalLinesMap\n this.nodeLineMap.horizontalLinesMap = horizontalLinesMap\n }\n\n /**\n * 组件的吸附距离\n */\n private adsorptionSize = 10\n\n /**\n * 设置画布上要实时展示的对齐辅助线,返回要吸附的距离\n * @param rect 为拖动过程中组件的位置信息\n * @param adsorption 指定需要吸附位置\n * - 0: 左 | 上\n * - 1: 中\n * - 2: 右 | 下\n */\n @action\n getAdsorptionPosition(rect: DOMRect, adsorption?: number | Array<number>) {\n if (typeof adsorption === 'number') {\n adsorption = [adsorption]\n }\n\n this.resetAdsorptionLines()\n\n const adsorptionVerticalLines: AdsorptionLine[] = []\n const adsorptionHorizontalLines: AdsorptionLine[] = []\n const currentVerticalLine = [rect.left, rect.left + rect.width / 2, rect.right]\n const currentHorizontalLine = [rect.top, rect.top + rect.height / 2, rect.bottom]\n\n // 计算需要显示的辅助线和吸附信息\n currentVerticalLine.forEach((item, index) => {\n let minDistance = Number.POSITIVE_INFINITY\n\n this.nodeLineMap.verticalLinesMap.forEach((_, pos) => {\n const distance = Math.abs(item - pos)\n if (distance !== 0 && distance < this.adsorptionSize && distance < minDistance) {\n minDistance = pos\n }\n })\n this.guideLinesMap.verticalLinesMap.forEach((_, pos) => {\n const distance = Math.abs(item - pos)\n if (distance !== 0 && distance < this.adsorptionSize && distance < minDistance) {\n minDistance = pos\n }\n })\n\n if (\n minDistance !== Number.POSITIVE_INFINITY &&\n adsorptionVerticalLines.findIndex(item => item.position === minDistance) === -1\n ) {\n adsorptionVerticalLines.push({\n adsorption: index,\n position: minDistance,\n })\n }\n })\n currentHorizontalLine.forEach((item, index) => {\n let minDistance = -1\n\n this.nodeLineMap.horizontalLinesMap.forEach((_, pos) => {\n if (Math.abs(item - pos) < this.adsorptionSize) {\n minDistance = pos\n }\n })\n this.guideLinesMap.horizontalLinesMap.forEach((_, pos) => {\n const distance = Math.abs(item - pos)\n if (distance < this.adsorptionSize && distance < minDistance) {\n minDistance = pos\n }\n })\n\n if (minDistance !== -1 && adsorptionHorizontalLines.findIndex(item => item.position === minDistance) === -1) {\n adsorptionHorizontalLines.push({\n adsorption: index,\n position: minDistance,\n })\n }\n })\n\n const isAdsorption = adsorptionVerticalLines.length > 0 || adsorptionHorizontalLines.length > 0\n const adsorb: Record<'x' | 'y', AdsorptionLine | undefined> = { x: undefined, y: undefined }\n if (isAdsorption) {\n // 将吸附的辅助线添加到吸附辅助线集合中,用于显示到页面上\n adsorptionVerticalLines.forEach(item => this.adsorptionLines.verticalLines.add(item.position))\n adsorptionHorizontalLines.forEach(item => this.adsorptionLines.horizontalLines.add(item.position))\n\n // 如果吸附,则计算吸附的距离\n if (adsorptionVerticalLines.length > 0) {\n if (adsorption) {\n adsorb.x = adsorptionVerticalLines.find(item => adsorption.includes(item.adsorption))!\n } else {\n const adsorptionPosition = Math.min(...adsorptionVerticalLines.map(item => item.position))\n adsorb.x = adsorptionVerticalLines.find(item => item.position === adsorptionPosition)!\n }\n }\n if (adsorptionHorizontalLines.length > 0) {\n if (adsorption) {\n adsorb.y = adsorptionHorizontalLines.find(item => adsorption.includes(item.adsorption))!\n } else {\n const adsorptionPosition = Math.min(...adsorptionHorizontalLines.map(item => item.position))\n adsorb.y = adsorptionHorizontalLines.find(item => item.position === adsorptionPosition)!\n }\n }\n }\n\n return {\n isAdsorption,\n adsorb,\n }\n\n // let fillX: number | undefined\n // let fillY: number | undefined\n\n // adsorptionVerticalLine.forEach(item => {\n // if (Math.abs(item - rect.left) < this.adsorptionSize) {\n // fillX = item\n // }\n\n // if (Math.abs(item - rect.right) < this.adsorptionSize) {\n // fillX = item - rect.width\n // }\n\n // const center = rect.left + rect.width / 2\n\n // if (Math.abs(item - center) < this.adsorptionSize) {\n // fillX = item - rect.width / 2\n // }\n // })\n\n // adsorptionHorizontalLine.forEach(item => {\n // if (Math.abs(item - rect.top) < this.adsorptionSize) {\n // fillY = item\n // }\n\n // if (Math.abs(item - rect.bottom) < this.adsorptionSize) {\n // fillY = item - rect.height\n // }\n\n // const center = rect.top + rect.height / 2\n\n // if (Math.abs(item - center) < this.adsorptionSize) {\n // fillY = item - rect.height / 2\n // }\n // })\n }\n\n @action\n resetAdsorptionLines() {\n this.adsorptionLines.verticalLines.clear()\n this.adsorptionLines.horizontalLines.clear()\n }\n}\n","import { type PropsWithChildren, type Ref, forwardRef } from 'react'\n\ninterface GroupProps extends PropsWithChildren {}\n\nconst Group = forwardRef((props: GroupProps, ref: Ref<HTMLDivElement>) => {\n return (\n <div ref={ref} style={{ position: 'relative', width: '100%', height: '100%' }}>\n {props?.children}\n </div>\n )\n})\n\nexport default Group\n","import type { Configure } from '@easy-editor/core'\nimport Group from './component'\n\nconst configure: Configure = {\n props: [\n // {\n // name: 'test',\n // title: '分组',\n // type: 'group',\n // items: [],\n // },\n ],\n component: {},\n supports: {},\n advanced: {\n view: Group,\n },\n}\n\nexport default configure\n","import type { ComponentMetadata } from '@easy-editor/core'\nimport configure from './configure'\n\nconst meta: ComponentMetadata = {\n componentName: 'Group',\n title: '分组',\n category: '内置',\n configure,\n}\n\nexport default meta\n","import type { Node } from '@easy-editor/core'\n\n/**\n * 更新节点在 dashboard 中的位置\n * @param node 节点\n * @param offset 节点相对于画布的偏移量\n * @param groupOffset 节点相对于其父组节点的偏移量\n */\nexport const updateNodeRect = (node: Node, offset = { x: 0, y: 0 }) => {\n if (node.isGroup) {\n const nodeRect = node.getDashboardRect()\n const delta = {\n x: offset.x - nodeRect.x,\n y: offset.y - nodeRect.y,\n }\n\n for (const childNode of node.getAllNodesInGroup()) {\n const childRect = childNode.getDashboardRect()\n childNode.updateDashboardRect({\n x: childRect.x + delta.x,\n y: childRect.y + delta.y,\n })\n }\n } else {\n node.updateDashboardRect({\n x: offset.x,\n y: offset.y,\n })\n }\n}\n\n/**\n * 更新节点 DOM 在 dashboard 中的位置\n * @param node 节点\n * @param offset 节点相对于画布的偏移量\n * @param groupOffset 节点相对于其父组节点的偏移量\n */\nexport const updateNodeRectByDOM = (node: Node, offset = { x: 0, y: 0 }) => {\n const domNode = node.getDashboardContainer()\n if (!domNode) {\n return\n }\n\n domNode.style.left = `${offset.x}px`\n domNode.style.top = `${offset.y}px`\n}\n","import {\n DESIGNER_EVENT,\n type Designer,\n type Document,\n DragObjectType,\n type DropLocation,\n type Node,\n type NodeSchema,\n type OffsetObserver,\n type PluginCreator,\n type Simulator,\n getConvertedExtraKey,\n} from '@easy-editor/core'\nimport { GuideLine } from './designer/guideline'\nimport { GroupComponent, GroupComponentMeta } from './materials/group'\nimport { updateNodeRect, updateNodeRectByDOM } from './utils'\n\nexport * from './type'\n\ninterface DashboardPluginOptions {\n group?: {\n schema?: NodeSchema\n }\n\n // TODO: 配置分组内容(schema、meta)\n xxx?: string\n}\n\nconst defaultGroupSchema = {\n componentName: 'Group',\n title: '分组',\n isGroup: true,\n}\n\nconst DashboardPlugin: PluginCreator<DashboardPluginOptions> = options => {\n const { group = {} } = options || {}\n const { schema: groupSchema = defaultGroupSchema } = group || {}\n\n return {\n name: 'DashboardPlugin',\n deps: [],\n init(ctx) {\n const { designer, simulator, componentMetaManager, hotkey, logger } = ctx\n const { viewport } = simulator\n\n // test hotkey\n hotkey.bind('ctrl+d', e => {\n e.preventDefault()\n logger.log('ctrl+d')\n })\n\n // add guideline\n designer.onEvent(DESIGNER_EVENT.INIT, (designer: Designer) => {\n designer.guideline = new GuideLine(designer)\n })\n\n // add componentMeta\n componentMetaManager.createComponentMeta(GroupComponentMeta)\n simulator.addComponent('Group', GroupComponent)\n\n /* ---------------------------- NodeData to Node ---------------------------- */\n const startOffsetNodeData = { x: 0, y: 0 }\n\n designer.dragon.onDragstart(e => {\n if (!e.shell) return\n\n const { dragObject } = e\n const shellRect = simulator.computeComponentInstanceRect(e.shell)\n\n if (dragObject && dragObject.type === DragObjectType.NodeData) {\n startOffsetNodeData.x = (e.globalX! - shellRect?.left!) / viewport.scale\n startOffsetNodeData.y = (e.globalY! - shellRect?.top!) / viewport.scale\n }\n })\n\n designer.onEvent(DESIGNER_EVENT.INSERT_NODE_BEFORE, (e: DropLocation) => {\n const { event } = e\n const { dragObject } = event\n\n // add dashboard rect\n if (dragObject && dragObject.type === DragObjectType.NodeData) {\n const nodeData = Array.isArray(dragObject.data) ? dragObject.data : [dragObject.data]\n for (const schema of nodeData) {\n if (!schema) continue\n if (!schema.$dashboard) {\n schema.$dashboard = {}\n }\n if (!schema.$dashboard.rect) {\n schema.$dashboard.rect = {}\n }\n schema.$dashboard.rect.x = event.canvasX! - startOffsetNodeData.x\n schema.$dashboard.rect.y = event.canvasY! - startOffsetNodeData.y\n }\n }\n })\n\n /* ----------------------------------- DND ---------------------------------- */\n let startNodes: { [key: string]: DOMRect } = {}\n let startOffsetNodes: { [key: string]: { x: number; y: number } } = {}\n let lastOffsetNodes: { [key: string]: { x: number; y: number } } = {}\n\n designer.dragon.onDragstart(e => {\n const { dragObject } = e\n\n if (dragObject && dragObject.type === DragObjectType.Node) {\n // 计算辅助线位置\n designer.guideline.calculateGuideLineInfo()\n\n for (const node of dragObject.nodes!) {\n if (!node) continue\n\n // 计算鼠标偏移量\n const rect = node.getDashboardRect()\n if (rect) {\n startNodes[node.id] = rect\n startOffsetNodes[node.id] = { x: e.canvasX! - rect.x, y: e.canvasY! - rect.y }\n }\n }\n\n // 计算整个拖拽包围盒的 Rect\n const boxRect = calculateDashboardRectBox(dragObject.nodes as Node[])\n if (boxRect) {\n startNodes.box = boxRect\n startOffsetNodes.box = { x: e.canvasX! - boxRect.x, y: e.canvasY! - boxRect.y }\n }\n }\n })\n\n designer.dragon.onDrag(e => {\n const { dragObject } = e\n if (dragObject && dragObject.type === DragObjectType.Node) {\n // 根据拖拽包围盒的 Rect 计算吸附位置\n const { x: boxStartX = 0, y: boxStartY = 0, width = 0, height = 0 } = startNodes.box\n const { x: boxX = 0, y: boxY = 0 } = startOffsetNodes.box\n const { isAdsorption, adsorb } = designer.guideline.getAdsorptionPosition(\n new DOMRect(e.canvasX! - boxX, e.canvasY! - boxY, width, height),\n )\n\n // 根据辅助线位置,计算对应吸附位置\n let adsorbX = undefined\n let adsorbY = undefined\n if (isAdsorption) {\n if (adsorb.x) {\n if (adsorb.x.adsorption === 0) {\n adsorbX = adsorb.x.position\n } else if (adsorb.x.adsorption === 1) {\n adsorbX = adsorb.x.position - width / 2\n } else if (adsorb.x.adsorption === 2) {\n adsorbX = adsorb.x.position - width\n }\n }\n if (adsorb.y) {\n if (adsorb.y.adsorption === 0) {\n adsorbY = adsorb.y.position\n } else if (adsorb.y.adsorption === 1) {\n adsorbY = adsorb.y.position - height / 2\n } else if (adsorb.y.adsorption === 2) {\n adsorbY = adsorb.y.position - height\n }\n }\n }\n\n for (const node of dragObject.nodes!) {\n if (!node) continue\n\n // 更新节点位置\n const { x: nodeStartX = 0, y: nodeStartY = 0 } = startNodes[node.id]\n const { x, y } = startOffsetNodes[node.id]\n let offsetX = e.canvasX! - x\n let offsetY = e.canvasY! - y\n\n if (isAdsorption) {\n // 吸附位置 需要减去拖拽包围盒的 Rect 的偏移量 得到节点吸附位置\n offsetX = adsorbX ? adsorbX + nodeStartX - boxStartX : offsetX\n offsetY = adsorbY ? adsorbY + nodeStartY - boxStartY : offsetY\n }\n updateNodeRectByDOM(node, { x: offsetX, y: offsetY })\n lastOffsetNodes[node.id] = { x: offsetX, y: offsetY }\n }\n }\n })\n\n designer.dragon.onDragend(e => {\n const { dragObject, esc } = e\n\n if (dragObject && dragObject.type === DragObjectType.Node) {\n for (const node of dragObject.nodes!) {\n if (!node) continue\n\n if (esc) {\n // dom 的话,因为没有更新内部节点值,所以直接重新渲染就行了\n simulator.rerender()\n } else {\n const { x: lastX = 0, y: lastY = 0 } = lastOffsetNodes[node.id]\n updateNodeRect(node, { x: lastX, y: lastY })\n }\n }\n\n // 清空辅助线\n designer.guideline.resetAdsorptionLines()\n }\n\n startNodes = {}\n startOffsetNodes = {}\n lastOffsetNodes = {}\n })\n },\n extend({ extendClass, extend }) {\n const { Node, Designer } = extendClass\n\n /* -------------------------------- Designer -------------------------------- */\n const originalInit = Designer.prototype.init\n extend('Designer', {\n init: {\n value(this: Designer) {\n originalInit.call(this)\n\n this.guideline = new GuideLine(this)\n },\n },\n })\n\n /* -------------------------------- Document -------------------------------- */\n extend('Document', {\n group: {\n value(this: Document, nodeIdList: Node[] | string[]) {\n if (nodeIdList.length === 0) return\n\n let nodeList: Node[] = []\n if (typeof nodeIdList[0] === 'string') {\n nodeList = (nodeIdList as string[]).map(id => this.getNode(id)!)\n }\n\n const groupNode = this.createNode(groupSchema)\n\n // 计算所有节点的 index,确定分组的插入位置\n let maxZIndex = Number.POSITIVE_INFINITY\n for (const node of nodeList) {\n if (node.index < maxZIndex) {\n maxZIndex = node.index\n }\n if (node && !node.isRoot) {\n this.migrateNode(node, groupNode)\n }\n }\n\n this.rootNode?.insert(groupNode, maxZIndex)\n\n return groupNode\n },\n },\n ungroup: {\n value(this: Document, group: Node | string) {\n let groupNode: Node | null\n if (typeof group === 'string') {\n groupNode = this.getNode(group)\n } else {\n groupNode = group\n }\n\n if (!groupNode || !groupNode.isGroup || !groupNode.children) return\n\n const nodes = groupNode.childrenNodes\n // TODO: 这里写法很奇怪,因为children是响应式的,所以迁移之后,children也会更新\n while (nodes.length > 0) {\n if (groupNode.parent) {\n this.migrateNode(nodes[0], groupNode.parent)\n }\n }\n\n this.removeNode(groupNode)\n },\n },\n })\n\n /* ---------------------------------- Node ---------------------------------- */\n const originalInitProps = Node.prototype.initBuiltinProps\n extend('Node', {\n // Dashboard\n getDashboardContainer: {\n value(this: Node) {\n const domNodes = this.getDOMNode()\n return domNodes.length > 0 ? domNodes[0] : null\n },\n },\n getDashboardRect: {\n value(this: Node) {\n if (!this.isGroup) {\n const rect = this.getExtraPropValue('$dashboard.rect') as any\n return new DOMRect(rect.x ?? 0, rect.y ?? 0, rect.width ?? 0, rect.height ?? 0)\n }\n\n let [minX, minY, maxX, maxY] = [\n Number.POSITIVE_INFINITY,\n Number.POSITIVE_INFINITY,\n Number.NEGATIVE_INFINITY,\n Number.NEGATIVE_INFINITY,\n ]\n\n for (const child of this.childrenNodes) {\n const childRect = child.getDashboardRect()\n\n minX = Math.min(minX, childRect.x)\n minY = Math.min(minY, childRect.y)\n maxX = Math.max(maxX, childRect.x + childRect.width)\n maxY = Math.max(maxY, childRect.y + childRect.height)\n }\n\n return new DOMRect(minX, minY, maxX - minX, maxY - minY)\n },\n },\n updateDashboardRect: {\n value(this: Node, rect: Partial<DOMRect>) {\n if (this.isGroup) return\n\n if (typeof rect.x === 'number') {\n this.setExtraPropValue('$dashboard.rect.x', rect.x)\n }\n if (typeof rect.y === 'number') {\n this.setExtraPropValue('$dashboard.rect.y', rect.y)\n }\n if (typeof rect.width === 'number') {\n this.setExtraPropValue('$dashboard.rect.width', rect.width)\n }\n if (typeof rect.height === 'number') {\n this.setExtraPropValue('$dashboard.rect.height', rect.height)\n }\n },\n },\n // Group\n isGroup: {\n get(this: Node) {\n return this.getExtraPropValue('isGroup')\n },\n },\n getCurrentGroup: {\n value(this: Node) {\n let parent = this.parent\n while (parent && !parent.isGroup) {\n parent = parent.parent\n }\n return parent\n },\n },\n getTopGroup: {\n value(this: Node) {\n let parent = this.parent\n let topGroup: Node | null = null\n while (parent) {\n if (parent.isGroup) {\n topGroup = parent\n }\n parent = parent.parent\n }\n return topGroup\n },\n },\n getAllGroups: {\n value(this: Node) {\n const groups: Node[] = []\n let parent = this.parent\n while (parent) {\n if (parent.isGroup) {\n groups.push(parent)\n }\n parent = parent.parent\n }\n return groups\n },\n },\n getNodesInGroup: {\n value(this: Node) {\n if (!this.isGroup) return []\n\n const nodes: Node[] = []\n for (const node of this.childrenNodes) {\n if (!node.isGroup) {\n nodes.push(node)\n }\n }\n return nodes\n },\n },\n getAllNodesInGroup: {\n value(this: Node) {\n if (!this.isGroup) return []\n\n const nodes: Node[] = []\n for (const node of this.childrenNodes) {\n if (node.isGroup) {\n nodes.push(...node.getAllNodesInGroup())\n } else {\n nodes.push(node)\n }\n }\n return nodes\n },\n },\n initBuiltinProps: {\n value(this: Node) {\n // 实现类似 super.initBuiltinProps 的效果\n // 调用父类的 initBuiltinProps 方法\n originalInitProps.call(this)\n\n this.props.has(getConvertedExtraKey('isGroup')) || this.props.add(getConvertedExtraKey('isGroup'), false)\n },\n },\n // Level\n moveToLevel: {\n value(this: Node, level: number) {\n if (level < -1 || level >= this.parent!.childrenNodes.length) return\n if (this.index === level) return\n if (this.isRoot) return\n\n this.parent!.insert(this, level)\n },\n },\n levelTop: {\n value(this: Node) {\n this.moveToLevel(0)\n },\n },\n levelBottom: {\n value(this: Node) {\n this.moveToLevel(-1)\n },\n },\n levelUp: {\n value(this: Node) {\n this.moveToLevel(this.index - 1)\n },\n },\n levelDown: {\n value(this: Node) {\n this.moveToLevel(this.index + 1)\n },\n },\n })\n\n /* ----------------------------- OffsetObserver ----------------------------- */\n extend('OffsetObserver', {\n computeRect: {\n value(this: OffsetObserver) {\n // return this.node.getDashboardRect()\n const { node, instance } = this.nodeInstance\n const host = node.document?.simulator!\n const rect = host.computeComponentInstanceRect(instance!)\n\n const { viewport } = node.document.simulator!\n const local = viewport.toLocalPoint({ clientX: rect!.x, clientY: rect!.y })\n\n return new DOMRect(\n local.clientX,\n local.clientY,\n rect!.width / viewport.scale,\n rect!.height / viewport.scale,\n )\n },\n },\n height: {\n get(this: OffsetObserver) {\n return this.isRoot ? this.viewport.height : this._height\n },\n },\n width: {\n get(this: OffsetObserver) {\n return this.isRoot ? this.viewport.width : this._width\n },\n },\n top: {\n get(this: OffsetObserver) {\n return this.isRoot ? 0 : this._top\n },\n },\n left: {\n get(this: OffsetObserver) {\n return this.isRoot ? 0 : this._left\n },\n },\n bottom: {\n get(this: OffsetObserver) {\n return this.isRoot ? this.viewport.height : this._bottom\n },\n },\n right: {\n get(this: OffsetObserver) {\n return this.isRoot ? this.viewport.width : this._right\n },\n },\n })\n\n /* -------------------------------- Simulator ------------------------------- */\n extend('Simulator', {\n getDashboardStyle: {\n get(this: Simulator) {\n return this.get('dashboardStyle') || {}\n },\n },\n })\n /* -------------------------------- Viewport -------------------------------- */\n /**\n * 这里需要对坐标转换的偏移做额外的处理,因为在大屏的使用中,外层画布容器使用到了 translate(-50%, -50%) 进行居中定位,但是\n * 在计算坐标的时候,需要减去这个偏移量,否则会导致坐标转换不准确\n */\n // Object.defineProperties(Viewport.prototype, {\n // // 局部坐标 -> 缩放(×scale) -> 加上视口偏移(+rect.left/top) -> 减去居中偏移(-centerOffset) -> 全局坐标\n // toGlobalPoint: {\n // value(this: Viewport, point: Point) {\n // if (!this.viewportElement) {\n // return point\n // }\n\n // const rect = this.bounds\n // const centerOffsetX = rect.width * 0.5\n // const centerOffsetY = rect.height * 0.5\n\n // return {\n // clientX: point.clientX * this.scale + rect.left - centerOffsetX,\n // clientY: point.clientY * this.scale + rect.top - centerOffsetY,\n // }\n // },\n // },\n // // 全局坐标 -> 减去视口偏移(-rect.left/top) -> 加上居中偏移(+centerOffset) -> 缩放还原(/scale) -> 局部坐标\n // toLocalPoint: {\n // value(this: Viewport, point: Point): Point {\n // if (!this.viewportElement) {\n // return point\n // }\n\n // const rect = this.bounds\n // const centerOffsetX = rect.width * 0.5\n // const centerOffsetY = rect.height * 0.5\n\n // return {\n // clientX: (point.clientX - rect.left + centerOffsetX) / this.scale,\n // clientY: (point.clientY - rect.top + centerOffsetY) / this.scale,\n // }\n // },\n // },\n // })\n },\n }\n}\n\nexport default DashboardPlugin\n\n/**\n * 计算节点的外围矩形 Rect,包括分支节点、多个节点计算\n * @param nodes 分组节点\n * @returns 外围矩形 {DOMRect}\n */\nconst calculateDashboardRectBox = (nodes: Node[]) => {\n let [minX, minY, maxX, maxY] = [\n Number.POSITIVE_INFINITY,\n Number.POSITIVE_INFINITY,\n Number.NEGATIVE_INFINITY,\n Number.NEGATIVE_INFINITY,\n ]\n\n for (const node of nodes) {\n const rect = node.getDashboardRect()\n minX = Math.min(minX, rect.x)\n minY = Math.min(minY, rect.y)\n maxX = Math.max(maxX, rect.x + rect.width)\n maxY = Math.max(maxY, rect.y + rect.height)\n }\n\n return new DOMRect(minX, minY, maxX - minX, maxY - minY)\n}\n"],"names":["GuideLine","_init_enabled","_init_extra_enabled","_init_guideLines","_init_extra_guideLines","_init_nodeLineMap","_init_extra_nodeLineMap","_init_adsorptionLines","_init_extra_adsorptionLines","_initProto","_applyDecs","observable","shallow","computed","action","e","enabled","v","A","guideLines","B","guideLinesMap","result","Object","groupBy","item","type","verticalLinesMap","Map","vertical","map","position","horizontalLinesMap","horizontal","nodeLineMap","C","verticalLines","Set","horizontalLines","adsorptionLines","D","currentDocument","designer","constructor","onEvent","DESIGNER_EVENT","VIEWPORT_MOUNT","viewport","addGuideLine","id","width","height","guideLine","push","removeGuideLine","index","findIndex","splice","updateGuideLine","calculateGuideLineInfo","nodes","nodesMap","values","selected","node","selection","getNodes","isGroup","getAllNodesInGroup","filter","hidden","forEach","includes","isRoot","nodeRect","getDashboardRect","verticalNodeLines","left","right","horizontalNodeLines","top","bottom","line","Math","round","set","adsorptionSize","getAdsorptionPosition","rect","adsorption","resetAdsorptionLines","adsorptionVerticalLines","adsorptionHorizontalLines","currentVerticalLine","currentHorizontalLine","minDistance","Number","POSITIVE_INFINITY","_","pos","distance","abs","isAdsorption","length","adsorb","x","undefined","y","add","find","adsorptionPosition","min","clear","Group","forwardRef","props","ref","_jsx","style","children","configure","component","supports","advanced","view","meta","componentName","title","category","updateNodeRect","offset","delta","childNode","childRect","updateDashboardRect","updateNodeRectByDOM","domNode","getDashboardContainer","defaultGroupSchema","DashboardPlugin","options","group","schema","groupSchema","name","deps","init","ctx","simulator","componentMetaManager","hotkey","logger","bind","preventDefault","log","INIT","guideline","createComponentMeta","GroupComponentMeta","addComponent","GroupComponent","startOffsetNodeData","dragon","onDragstart","shell","dragObject","shellRect","computeComponentInstanceRect","DragObjectType","NodeData","globalX","scale","globalY","INSERT_NODE_BEFORE","event","nodeData","Array","isArray","data","$dashboard","canvasX","canvasY","startNodes","startOffsetNodes","lastOffsetNodes","Node","boxRect","calculateDashboardRectBox","box","onDrag","boxStartX","boxStartY","boxX","boxY","DOMRect","adsorbX","adsorbY","nodeStartX","nodeStartY","offsetX","offsetY","onDragend","esc","rerender","lastX","lastY","extend","extendClass","Designer","originalInit","prototype","value","call","nodeIdList","nodeList","getNode","groupNode","createNode","maxZIndex","migrateNode","rootNode","insert","ungroup","childrenNodes","parent","removeNode","originalInitProps","initBuiltinProps","domNodes","getDOMNode","getExtraPropValue","minX","minY","maxX","maxY","NEGATIVE_INFINITY","child","max","setExtraPropValue","get","getCurrentGroup","getTopGroup","topGroup","getAllGroups","groups","getNodesInGroup","has","getConvertedExtraKey","moveToLevel","level","levelTop","levelBottom","levelUp","levelDown","computeRect","instance","nodeInstance","host","document","local","toLocalPoint","clientX","clientY","_height","_width","_top","_left","_bottom","_right","getDashboardStyle"],"mappings":"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"}
|