@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.
@@ -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
- element.style.transform = transform1;
7
- const matrix1 = new DOMMatrix(window.getComputedStyle(element).transform);
8
- element.style.transform = transform2;
9
- const matrix2 = new DOMMatrix(window.getComputedStyle(element).transform);
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.setAttribute(a, attr[a]);
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.setStyle(s.name, s.value);
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
  }
@@ -10,4 +10,5 @@ export interface IPlacementView {
10
10
  snapLines: Snaplines;
11
11
  readonly zoomFactor: number;
12
12
  readonly scaleFactor: number;
13
+ readonly transformHelperElement: HTMLDivElement;
13
14
  }
@@ -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
- const designItem = DesignItem.GetOrCreateDesignItem(event.target, this.serviceContainer, this.instanceServiceContainer);
484
- if (!this.instanceServiceContainer.selectionService.isSelected(designItem)) {
485
- this.instanceServiceContainer.selectionService.setSelectedElements([designItem]);
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
- switch (contentChanged.changeType) {
12
- case 'added':
13
- this.applyExtensions(contentChanged.designItems, ExtensionType.Permanent, true);
14
- break;
15
- case 'moved':
16
- this.refreshExtensions(contentChanged.designItems, ExtensionType.Permanent);
17
- break;
18
- case 'parsed':
19
- this.applyExtensions(Array.from(this.designerCanvas.rootDesignItem.children()), ExtensionType.Permanent, true);
20
- break;
21
- case 'removed':
22
- this.removeExtensions(contentChanged.designItems, ExtensionType.Permanent);
23
- break;
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.getBoundingClientRect();
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 - this.designerCanvas.containerBoundingRect.x - left, itemRect.y - this.designerCanvas.containerBoundingRect.y - top, left + itemRect.width + right, top + itemRect.height + bottom, 'svg-invisible-div', this._rect);
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();
@@ -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, designerView: IDesignerCanvas, designItem: IDesignItem): IContextMenuItem[];
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, designerView, designItem) {
7
- const lstItems = this._searchForItemsBelow(event, designerView);
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(designerView, x) }))];
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);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "description": "A UI designer for Polymer apps",
3
3
  "name": "@node-projects/web-component-designer",
4
- "version": "0.0.85",
4
+ "version": "0.0.86",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "author": "",