@node-projects/web-component-designer 0.0.85 → 0.0.86
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/dist/elements/helper/TransformHelper.d.ts +1 -1
- package/dist/elements/helper/TransformHelper.js +7 -5
- package/dist/elements/item/DesignItem.js +3 -2
- package/dist/elements/services/htmlParserService/NodeHtmlParserService.js +5 -4
- package/dist/elements/services/placementService/DefaultPlacementService.js +1 -1
- package/dist/elements/widgets/designerView/IDesignerCanvas.d.ts +1 -0
- package/dist/elements/widgets/designerView/IPlacementView.d.ts +1 -0
- package/dist/elements/widgets/designerView/designerCanvas.d.ts +2 -0
- package/dist/elements/widgets/designerView/designerCanvas.js +50 -4
- package/dist/elements/widgets/designerView/extensions/ExtensionManager.js +16 -14
- package/dist/elements/widgets/designerView/extensions/InvisibleDivExtension.js +3 -2
- package/dist/elements/widgets/designerView/extensions/contextMenu/ItemsBelowContextMenu.d.ts +1 -2
- package/dist/elements/widgets/designerView/extensions/contextMenu/ItemsBelowContextMenu.js +3 -36
- package/dist/elements/widgets/treeView/treeViewExtended.js +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare function combineTransforms(element: HTMLElement, transform1: string, transform2: string): void;
|
|
1
|
+
export declare function combineTransforms(helperElement: HTMLElement, element: HTMLElement, transform1: string, transform2: string): void;
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
export function combineTransforms(element, transform1, transform2) {
|
|
1
|
+
export function combineTransforms(helperElement, element, transform1, transform2) {
|
|
2
2
|
if (transform1 == null || transform1 == '') {
|
|
3
3
|
element.style.transform = transform2;
|
|
4
4
|
return;
|
|
5
5
|
}
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
helperElement.style.transform = '';
|
|
7
|
+
helperElement.style.transform = transform1;
|
|
8
|
+
const matrix1 = new DOMMatrix(window.getComputedStyle(helperElement).transform);
|
|
9
|
+
helperElement.style.transform = '';
|
|
10
|
+
helperElement.style.transform = transform2;
|
|
11
|
+
const matrix2 = new DOMMatrix(window.getComputedStyle(helperElement).transform);
|
|
10
12
|
const result = matrix2.multiply(matrix1);
|
|
11
13
|
element.style.transform = result.toString();
|
|
12
14
|
}
|
|
@@ -188,8 +188,9 @@ export class DesignItem {
|
|
|
188
188
|
designItem.styles.set(e.name, e.value);
|
|
189
189
|
}
|
|
190
190
|
}
|
|
191
|
-
if (!designItem._lockAtDesignTime)
|
|
192
|
-
node.style.pointerEvents = 'auto';
|
|
191
|
+
if (!designItem._lockAtDesignTime) {
|
|
192
|
+
requestAnimationFrame(() => node.style.pointerEvents = 'auto');
|
|
193
|
+
}
|
|
193
194
|
else
|
|
194
195
|
node.style.pointerEvents = 'none';
|
|
195
196
|
//node.style.cursor = 'pointer';
|
|
@@ -43,7 +43,7 @@ export class NodeHtmlParserService {
|
|
|
43
43
|
let attr = item.attributes;
|
|
44
44
|
for (let a in attr) {
|
|
45
45
|
if (a !== 'style') {
|
|
46
|
-
designItem.
|
|
46
|
+
designItem.attributes.set(a, attr[a]);
|
|
47
47
|
if (a === 'node-projects-hide-at-design-time')
|
|
48
48
|
hideAtDesignTime = true;
|
|
49
49
|
else if (a === 'node-projects-hide-at-run-time')
|
|
@@ -59,11 +59,12 @@ export class NodeHtmlParserService {
|
|
|
59
59
|
let styleParser = new CssAttributeParser();
|
|
60
60
|
styleParser.parse(style);
|
|
61
61
|
for (let s of styleParser.entries) {
|
|
62
|
-
designItem.
|
|
62
|
+
designItem.styles.set(s.name, s.value);
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
|
-
if (element instanceof HTMLElement || element instanceof SVGElement)
|
|
66
|
-
element.style.pointerEvents = 'auto';
|
|
65
|
+
if (!lockAtDesignTime && (element instanceof HTMLElement || element instanceof SVGElement)) {
|
|
66
|
+
requestAnimationFrame(() => element.style.pointerEvents = 'auto');
|
|
67
|
+
}
|
|
67
68
|
designItem.hideAtDesignTime = hideAtDesignTime;
|
|
68
69
|
designItem.hideAtRunTime = hideAtRunTime;
|
|
69
70
|
designItem.lockAtDesignTime = lockAtDesignTime;
|
|
@@ -82,7 +82,7 @@ export class DefaultPlacementService {
|
|
|
82
82
|
//TODO: -> what is if a transform already exists -> backup existing style.?
|
|
83
83
|
for (const designItem of filterdItems) {
|
|
84
84
|
const newTransform = 'translate(' + track.x + 'px, ' + track.y + 'px)';
|
|
85
|
-
combineTransforms(designItem.element, designItem.styles.get('transform'), newTransform);
|
|
85
|
+
combineTransforms(placementView.transformHelperElement, designItem.element, designItem.styles.get('transform'), newTransform);
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
88
|
enterContainer(container, items) {
|
|
@@ -31,4 +31,5 @@ export interface IDesignerCanvas extends IPlacementView, IUiCommandHandler {
|
|
|
31
31
|
getNormalizedOffsetInElement(event: MouseEvent, element: Element): IPoint;
|
|
32
32
|
getElementAtPoint(point: IPoint, ignoreElementCallback?: (element: HTMLElement) => boolean): any;
|
|
33
33
|
elementFromPoint(x: number, y: number): Element;
|
|
34
|
+
getItemsBelowMouse(event: MouseEvent): Element[];
|
|
34
35
|
}
|
|
@@ -25,6 +25,7 @@ export declare class DesignerCanvas extends BaseCustomWebComponentLazyAppend imp
|
|
|
25
25
|
overlayLayer: OverlayLayerView;
|
|
26
26
|
rootDesignItem: IDesignItem;
|
|
27
27
|
eatEvents: Element;
|
|
28
|
+
transformHelperElement: HTMLDivElement;
|
|
28
29
|
private _zoomFactor;
|
|
29
30
|
private _scaleFactor;
|
|
30
31
|
private _canvasOffset;
|
|
@@ -87,4 +88,5 @@ export declare class DesignerCanvas extends BaseCustomWebComponentLazyAppend imp
|
|
|
87
88
|
private _fillCalculationrects;
|
|
88
89
|
addOverlay(element: SVGGraphicsElement, overlayLayer?: OverlayLayer): void;
|
|
89
90
|
removeOverlay(element: SVGGraphicsElement): void;
|
|
91
|
+
getItemsBelowMouse(event: MouseEvent): Element[];
|
|
90
92
|
}
|
|
@@ -34,6 +34,7 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
34
34
|
overlayLayer;
|
|
35
35
|
rootDesignItem;
|
|
36
36
|
eatEvents;
|
|
37
|
+
transformHelperElement;
|
|
37
38
|
_zoomFactor = 1; //if scale or zoom css property is used this needs to be the value
|
|
38
39
|
_scaleFactor = 1; //if scale css property is used this need to be the scale value
|
|
39
40
|
_canvasOffset = { x: 0, y: 0 };
|
|
@@ -117,6 +118,11 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
117
118
|
cursor: pointer;
|
|
118
119
|
user-select: none;
|
|
119
120
|
-webkit-user-select: none;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
#transformHelper {
|
|
124
|
+
height: 0;
|
|
125
|
+
width: 0;
|
|
120
126
|
}`;
|
|
121
127
|
static template = html `
|
|
122
128
|
<div style="display: flex;flex-direction: column;width: 100%;height: 100%;">
|
|
@@ -129,6 +135,7 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
129
135
|
</div>
|
|
130
136
|
</div>
|
|
131
137
|
</div>
|
|
138
|
+
<div id="transformHelper"></div>
|
|
132
139
|
</div>`;
|
|
133
140
|
extensionManager;
|
|
134
141
|
_pointerextensions;
|
|
@@ -138,6 +145,7 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
138
145
|
this._canvas = this._getDomElement('node-projects-designer-canvas-canvas');
|
|
139
146
|
this._canvasContainer = this._getDomElement('node-projects-designer-canvas-canvasContainer');
|
|
140
147
|
this._outercanvas2 = this._getDomElement('node-projects-designer-canvas-outercanvas2');
|
|
148
|
+
this.transformHelperElement = this._getDomElement('transformHelper');
|
|
141
149
|
this._onKeyDownBound = this.onKeyDown.bind(this);
|
|
142
150
|
this._onKeyUpBound = this.onKeyUp.bind(this);
|
|
143
151
|
this._onDblClickBound = this._onDblClick.bind(this);
|
|
@@ -480,11 +488,16 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
480
488
|
_onContextMenu(event) {
|
|
481
489
|
event.preventDefault();
|
|
482
490
|
if (!event.shiftKey) {
|
|
483
|
-
|
|
484
|
-
if (
|
|
485
|
-
this.instanceServiceContainer.selectionService.
|
|
491
|
+
let items = this.getItemsBelowMouse(event);
|
|
492
|
+
if (items.indexOf(this.instanceServiceContainer.selectionService.primarySelection.element) >= 0)
|
|
493
|
+
this.showDesignItemContextMenu(this.instanceServiceContainer.selectionService.primarySelection, event);
|
|
494
|
+
else {
|
|
495
|
+
const designItem = DesignItem.GetOrCreateDesignItem(event.target, this.serviceContainer, this.instanceServiceContainer);
|
|
496
|
+
if (!this.instanceServiceContainer.selectionService.isSelected(designItem)) {
|
|
497
|
+
this.instanceServiceContainer.selectionService.setSelectedElements([designItem]);
|
|
498
|
+
}
|
|
499
|
+
this.showDesignItemContextMenu(designItem, event);
|
|
486
500
|
}
|
|
487
|
-
this.showDesignItemContextMenu(designItem, event);
|
|
488
501
|
}
|
|
489
502
|
}
|
|
490
503
|
showDesignItemContextMenu(designItem, event) {
|
|
@@ -684,5 +697,38 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
684
697
|
removeOverlay(element) {
|
|
685
698
|
this.overlayLayer.removeOverlay(element);
|
|
686
699
|
}
|
|
700
|
+
getItemsBelowMouse(event) {
|
|
701
|
+
const lstEl = [];
|
|
702
|
+
//search for containers below mouse cursor.
|
|
703
|
+
//to do this, we need to disable pointer events for each in a loop and search wich element is there
|
|
704
|
+
let backupPEventsMap = new Map();
|
|
705
|
+
try {
|
|
706
|
+
let el = this.elementFromPoint(event.x, event.y);
|
|
707
|
+
backupPEventsMap.set(el, el.style.pointerEvents);
|
|
708
|
+
el.style.pointerEvents = 'none';
|
|
709
|
+
if (el !== this.rootDesignItem.element) {
|
|
710
|
+
el = this.elementFromPoint(event.x, event.y);
|
|
711
|
+
while (el != null) {
|
|
712
|
+
if (el === this.rootDesignItem.element)
|
|
713
|
+
break;
|
|
714
|
+
if (el !== this.overlayLayer && el.parentElement !== this.overlayLayer && el.getRootNode() === this.shadowRoot)
|
|
715
|
+
lstEl.push(el);
|
|
716
|
+
if (!backupPEventsMap.has(el))
|
|
717
|
+
backupPEventsMap.set(el, el.style.pointerEvents);
|
|
718
|
+
el.style.pointerEvents = 'none';
|
|
719
|
+
const oldEl = el;
|
|
720
|
+
el = this.elementFromPoint(event.x, event.y);
|
|
721
|
+
if (oldEl === el)
|
|
722
|
+
break;
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
finally {
|
|
727
|
+
for (let e of backupPEventsMap.entries()) {
|
|
728
|
+
e[0].style.pointerEvents = e[1];
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
return lstEl;
|
|
732
|
+
}
|
|
687
733
|
}
|
|
688
734
|
customElements.define('node-projects-designer-canvas', DesignerCanvas);
|
|
@@ -8,20 +8,22 @@ export class ExtensionManager {
|
|
|
8
8
|
designerCanvas.instanceServiceContainer.contentService.onContentChanged.on(this._contentChanged.bind(this));
|
|
9
9
|
}
|
|
10
10
|
_contentChanged(contentChanged) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
11
|
+
requestAnimationFrame(() => {
|
|
12
|
+
switch (contentChanged.changeType) {
|
|
13
|
+
case 'added':
|
|
14
|
+
this.applyExtensions(contentChanged.designItems, ExtensionType.Permanent, true);
|
|
15
|
+
break;
|
|
16
|
+
case 'moved':
|
|
17
|
+
this.refreshExtensions(contentChanged.designItems, ExtensionType.Permanent);
|
|
18
|
+
break;
|
|
19
|
+
case 'parsed':
|
|
20
|
+
this.applyExtensions(Array.from(this.designerCanvas.rootDesignItem.children()), ExtensionType.Permanent, true);
|
|
21
|
+
break;
|
|
22
|
+
case 'removed':
|
|
23
|
+
this.removeExtensions(contentChanged.designItems, ExtensionType.Permanent);
|
|
24
|
+
break;
|
|
25
|
+
}
|
|
26
|
+
});
|
|
25
27
|
}
|
|
26
28
|
_selectedElementsChanged(selectionChangedEvent) {
|
|
27
29
|
if (selectionChangedEvent.oldSelectedElements && selectionChangedEvent.oldSelectedElements.length) {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AbstractExtension } from './AbstractExtension';
|
|
2
|
+
import { OverlayLayer } from "./OverlayLayer.js";
|
|
2
3
|
export class InvisibleDivExtension extends AbstractExtension {
|
|
3
4
|
_rect;
|
|
4
5
|
constructor(extensionManager, designerCanvas, extendedItem) {
|
|
@@ -8,13 +9,13 @@ export class InvisibleDivExtension extends AbstractExtension {
|
|
|
8
9
|
this.refresh();
|
|
9
10
|
}
|
|
10
11
|
refresh() {
|
|
11
|
-
const itemRect = this.extendedItem.element
|
|
12
|
+
const itemRect = this.designerCanvas.getNormalizedElementCoordinates(this.extendedItem.element);
|
|
12
13
|
const computedStyle = getComputedStyle(this.extendedItem.element);
|
|
13
14
|
const left = Number.parseFloat(computedStyle.marginLeft.replace('px', ''));
|
|
14
15
|
const top = Number.parseFloat(computedStyle.marginTop.replace('px', ''));
|
|
15
16
|
const right = Number.parseFloat(computedStyle.marginRight.replace('px', ''));
|
|
16
17
|
const bottom = Number.parseFloat(computedStyle.marginBottom.replace('px', ''));
|
|
17
|
-
this._rect = this._drawRect(itemRect.x -
|
|
18
|
+
this._rect = this._drawRect(itemRect.x - left, itemRect.y - top, left + itemRect.width + right, top + itemRect.height + bottom, 'svg-invisible-div', this._rect, OverlayLayer.Background);
|
|
18
19
|
}
|
|
19
20
|
dispose() {
|
|
20
21
|
this._removeAllOverlays();
|
package/dist/elements/widgets/designerView/extensions/contextMenu/ItemsBelowContextMenu.d.ts
CHANGED
|
@@ -4,7 +4,6 @@ import { IDesignerCanvas } from "../../IDesignerCanvas";
|
|
|
4
4
|
import { ContextmenuInitiator, IContextMenuExtension } from "./IContextMenuExtension";
|
|
5
5
|
export declare class ItemsBelowContextMenu implements IContextMenuExtension {
|
|
6
6
|
shouldProvideContextmenu(event: MouseEvent, designerView: IDesignerCanvas, designItem: IDesignItem, initiator: ContextmenuInitiator): boolean;
|
|
7
|
-
provideContextMenuItems(event: MouseEvent,
|
|
7
|
+
provideContextMenuItems(event: MouseEvent, designerCanvas: IDesignerCanvas, designItem: IDesignItem): IContextMenuItem[];
|
|
8
8
|
private _select;
|
|
9
|
-
private _searchForItemsBelow;
|
|
10
9
|
}
|
|
@@ -3,11 +3,11 @@ export class ItemsBelowContextMenu {
|
|
|
3
3
|
shouldProvideContextmenu(event, designerView, designItem, initiator) {
|
|
4
4
|
return initiator == 'designer';
|
|
5
5
|
}
|
|
6
|
-
provideContextMenuItems(event,
|
|
7
|
-
const lstItems =
|
|
6
|
+
provideContextMenuItems(event, designerCanvas, designItem) {
|
|
7
|
+
const lstItems = designerCanvas.getItemsBelowMouse(event);
|
|
8
8
|
if (lstItems.length > 0) {
|
|
9
9
|
//TODO: create a submenu 'select items below...'
|
|
10
|
-
return [{ title: '-' }, ...lstItems.map(x => ({ title: 'select: ' + x.localName + (x.id ? ' (' + x.id + ')' : ''), action: () => this._select(
|
|
10
|
+
return [{ title: '-' }, ...lstItems.map(x => ({ title: 'select: ' + x.localName + (x.id ? ' (' + x.id + ')' : ''), action: () => this._select(designerCanvas, x) }))];
|
|
11
11
|
}
|
|
12
12
|
return [];
|
|
13
13
|
}
|
|
@@ -15,37 +15,4 @@ export class ItemsBelowContextMenu {
|
|
|
15
15
|
const item = DesignItem.GetOrCreateDesignItem(element, designerView.serviceContainer, designerView.instanceServiceContainer);
|
|
16
16
|
designerView.instanceServiceContainer.selectionService.setSelectedElements([item]);
|
|
17
17
|
}
|
|
18
|
-
_searchForItemsBelow(event, designerView) {
|
|
19
|
-
const lstEl = [];
|
|
20
|
-
//search for containers below mouse cursor.
|
|
21
|
-
//to do this, we need to disable pointer events for each in a loop and search wich element is there
|
|
22
|
-
let backupPEventsMap = new Map();
|
|
23
|
-
try {
|
|
24
|
-
let el = designerView.elementFromPoint(event.x, event.y);
|
|
25
|
-
backupPEventsMap.set(el, el.style.pointerEvents);
|
|
26
|
-
el.style.pointerEvents = 'none';
|
|
27
|
-
if (el !== designerView.rootDesignItem.element) {
|
|
28
|
-
el = designerView.elementFromPoint(event.x, event.y);
|
|
29
|
-
while (el != null) {
|
|
30
|
-
if (el === designerView.rootDesignItem.element)
|
|
31
|
-
break;
|
|
32
|
-
if (el !== designerView.overlayLayer && el.parentElement !== designerView.overlayLayer && el.getRootNode() === designerView.shadowRoot)
|
|
33
|
-
lstEl.push(el);
|
|
34
|
-
if (!backupPEventsMap.has(el))
|
|
35
|
-
backupPEventsMap.set(el, el.style.pointerEvents);
|
|
36
|
-
el.style.pointerEvents = 'none';
|
|
37
|
-
const oldEl = el;
|
|
38
|
-
el = designerView.elementFromPoint(event.x, event.y);
|
|
39
|
-
if (oldEl === el)
|
|
40
|
-
break;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
finally {
|
|
45
|
-
for (let e of backupPEventsMap.entries()) {
|
|
46
|
-
e[0].style.pointerEvents = e[1];
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
return lstEl;
|
|
50
|
-
}
|
|
51
18
|
}
|
|
@@ -366,6 +366,7 @@ export class TreeViewExtended extends BaseCustomWebComponentConstructorAppend {
|
|
|
366
366
|
//@ts-ignore
|
|
367
367
|
if (activeElements.indexOf(node.data.ref) >= 0) {
|
|
368
368
|
node.setSelected(true);
|
|
369
|
+
node.makeVisible({ scrollIntoView: true });
|
|
369
370
|
}
|
|
370
371
|
else {
|
|
371
372
|
node.setSelected(false);
|