@node-projects/web-component-designer 0.0.90 → 0.0.93

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +2 -1
  2. package/dist/elements/helper/KeyNameHelper.d.ts +0 -0
  3. package/dist/elements/helper/KeyNameHelper.js +1 -0
  4. package/dist/elements/helper/TransformHelper.d.ts +3 -0
  5. package/dist/elements/helper/TransformHelper.js +7 -0
  6. package/dist/elements/helper/contextMenu/ContextMenuHelper.js +2 -4
  7. package/dist/elements/helper/contextMenu/IContextmenuItem.d.ts +1 -0
  8. package/dist/elements/services/DefaultServiceBootstrap.js +6 -0
  9. package/dist/elements/services/htmlWriterService/HtmlWriterService.js +3 -2
  10. package/dist/elements/widgets/codeView/code-view-monaco.js +3 -3
  11. package/dist/elements/widgets/designerView/IDesignerCanvas.d.ts +1 -0
  12. package/dist/elements/widgets/designerView/designerCanvas.d.ts +1 -0
  13. package/dist/elements/widgets/designerView/designerCanvas.js +10 -1
  14. package/dist/elements/widgets/designerView/designerView.d.ts +2 -0
  15. package/dist/elements/widgets/designerView/designerView.js +35 -29
  16. package/dist/elements/widgets/designerView/extensions/EditText/EditTextWithStyloExtension.js +0 -4
  17. package/dist/elements/widgets/designerView/extensions/ResizeExtension.d.ts +1 -1
  18. package/dist/elements/widgets/designerView/extensions/ResizeExtension.js +13 -10
  19. package/dist/elements/widgets/designerView/extensions/contextMenu/CopyPasteContextMenu copy.d.ts +8 -0
  20. package/dist/elements/widgets/designerView/extensions/contextMenu/CopyPasteContextMenu copy.js +15 -0
  21. package/dist/elements/widgets/designerView/extensions/contextMenu/CopyPasteContextMenu.js +4 -5
  22. package/dist/elements/widgets/designerView/extensions/contextMenu/ItemsBelowContextMenu.js +1 -1
  23. package/dist/elements/widgets/designerView/extensions/contextMenu/RectContextMenu.js +0 -1
  24. package/dist/elements/widgets/designerView/extensions/contextMenu/SeperatorContextMenu.d.ts +8 -0
  25. package/dist/elements/widgets/designerView/extensions/contextMenu/SeperatorContextMenu.js +10 -0
  26. package/dist/elements/widgets/designerView/extensions/contextMenu/ZMoveContextMenu copy.d.ts +8 -0
  27. package/dist/elements/widgets/designerView/extensions/contextMenu/ZMoveContextMenu copy.js +14 -0
  28. package/dist/elements/widgets/designerView/extensions/contextMenu/ZoomToElementContextMenu.d.ts +8 -0
  29. package/dist/elements/widgets/designerView/extensions/contextMenu/ZoomToElementContextMenu.js +27 -0
  30. package/dist/elements/widgets/designerView/tools/TextTool.d.ts +0 -1
  31. package/dist/elements/widgets/designerView/tools/TextTool.js +15 -16
  32. package/dist/elements/widgets/paletteView/paletteTreeView.js +5 -2
  33. package/dist/elements/widgets/treeView/treeView.js +1 -3
  34. package/dist/elements/widgets/treeView/treeViewExtended.d.ts +1 -0
  35. package/dist/elements/widgets/treeView/treeViewExtended.js +13 -6
  36. package/dist/index.d.ts +4 -0
  37. package/dist/index.js +4 -0
  38. package/package.json +4 -4
package/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # web-component-designer
2
2
 
3
- ## Caution - this is a preview Version, a RC is planed for January 2022
3
+ ## Caution - this is a preview Version, a RC1 is now planed for May 2022 - it's already usable but big Refactoring could still happen
4
+
4
5
 
5
6
  A HTML WebComponent for Designing Webcomponents and HTML Pages.
6
7
 
File without changes
@@ -0,0 +1 @@
1
+ "use strict";
@@ -1 +1,4 @@
1
+ import { IPoint } from "../../index.js";
1
2
  export declare function combineTransforms(helperElement: HTMLElement, element: HTMLElement, transform1: string, transform2: string): void;
3
+ export declare function getDomMatrix(element: HTMLElement): DOMMatrix;
4
+ export declare function convertCoordinates(point: IPoint, matrix: DOMMatrix): DOMPoint;
@@ -12,3 +12,10 @@ export function combineTransforms(helperElement, element, transform1, transform2
12
12
  const result = matrix2.multiply(matrix1);
13
13
  element.style.transform = result.toString();
14
14
  }
15
+ export function getDomMatrix(element) {
16
+ return new DOMMatrix(window.getComputedStyle(element).transform);
17
+ }
18
+ export function convertCoordinates(point, matrix) {
19
+ let domPoint = new DOMPoint(point.x, point.y);
20
+ return domPoint.matrixTransform(matrix.inverse());
21
+ }
@@ -103,10 +103,8 @@ export class ContextMenuHelper {
103
103
  window.removeEventListener('resize', this._closeBound);
104
104
  window.removeEventListener('mousedown', this._closeOnDownBound);
105
105
  window.removeEventListener('mouseup', this._closeOnUpBound);
106
- if (this._shadowRoot === document)
107
- document.body.removeChild(this._element);
108
- else
109
- this._shadowRoot.removeChild(this._element);
106
+ if (this._element.parentElement)
107
+ this._element.parentElement.removeChild(this._element);
110
108
  });
111
109
  }
112
110
  show() {
@@ -3,4 +3,5 @@ export interface IContextMenuItem {
3
3
  readonly icon?: string;
4
4
  readonly action?: (e: HTMLElement, args?: Event) => void;
5
5
  readonly children?: IContextMenuItem[];
6
+ readonly shortCut?: string;
6
7
  }
@@ -53,6 +53,8 @@ import { DrawLineTool } from '../widgets/designerView/tools/DrawLineTool.js';
53
53
  import { HtmlWriterService } from './htmlWriterService/HtmlWriterService.js';
54
54
  import { RectContextMenu } from '../widgets/designerView/extensions/contextMenu/RectContextMenu.js';
55
55
  import { PathContextMenu } from '../widgets/designerView/extensions/contextMenu/PathContextMenu.js';
56
+ import { SeperatorContextMenu } from '../widgets/designerView/extensions/contextMenu/SeperatorContextMenu.js';
57
+ import { ZoomToElementContextMenu } from '../widgets/designerView/extensions/contextMenu/ZoomToElementContextMenu.js';
56
58
  export function createDefaultServiceContainer() {
57
59
  let serviceContainer = new ServiceContainer();
58
60
  serviceContainer.register("propertyService", new PolymerPropertiesService());
@@ -124,10 +126,14 @@ export function createDefaultServiceContainer() {
124
126
  serviceContainer.designViewConfigButtons.push(new ButtonSeperatorProvider(20), new GridExtensionDesignViewConfigButtons());
125
127
  serviceContainer.designerContextMenuExtensions = [
126
128
  new CopyPasteContextMenu(),
129
+ new SeperatorContextMenu(),
130
+ new ZoomToElementContextMenu(),
131
+ new SeperatorContextMenu(),
127
132
  new ZMoveContextMenu(),
128
133
  new MultipleItemsSelectedContextMenu(),
129
134
  new PathContextMenu(),
130
135
  new RectContextMenu(),
136
+ new SeperatorContextMenu(),
131
137
  new ItemsBelowContextMenu(),
132
138
  ];
133
139
  return serviceContainer;
@@ -68,11 +68,12 @@ export class HtmlWriterService extends AbstractHtmlWriterService {
68
68
  }
69
69
  else if (designItem.hasContent) {
70
70
  indentedTextWriter.write(DomConverter.normalizeContentValue(designItem.content));
71
+ //this._conditionalyWriteNewline(indentedTextWriter, designItem);
71
72
  }
72
73
  if (!DomConverter.IsSelfClosingElement(designItem.name))
73
74
  indentedTextWriter.write('</' + designItem.name + '>');
74
- if (!contentSingleTextNode)
75
- this._conditionalyWriteNewline(indentedTextWriter, designItem);
75
+ //if (!contentSingleTextNode)
76
+ this._conditionalyWriteNewline(indentedTextWriter, designItem);
76
77
  }
77
78
  if (designItemsAssignmentList) {
78
79
  designItemsAssignmentList.set(designItem, { start: start, length: indentedTextWriter.position - start - 1 });
@@ -104,10 +104,10 @@ export class CodeViewMonaco extends BaseCustomWebComponentLazyAppend {
104
104
  }
105
105
  setSelection(position) {
106
106
  let model = this._monacoEditor.getModel();
107
- let point2 = model.getPositionAt(position.start);
108
- let point1 = model.getPositionAt(position.start + position.length);
107
+ let point1 = model.getPositionAt(position.start);
108
+ let point2 = model.getPositionAt(position.start + position.length);
109
109
  this._monacoEditor.setSelection({ startLineNumber: point1.lineNumber, startColumn: point1.column, endLineNumber: point2.lineNumber, endColumn: point2.column });
110
- this._monacoEditor.revealLineInCenter(point2.lineNumber);
110
+ setTimeout(() => this._monacoEditor.revealLine(point1.lineNumber), 20);
111
111
  }
112
112
  }
113
113
  customElements.define('node-projects-code-view-monaco', CodeViewMonaco);
@@ -39,6 +39,7 @@ export interface IDesignerCanvas extends IPlacementView, IUiCommandHandler {
39
39
  elementFromPoint(x: number, y: number): Element;
40
40
  getItemsBelowMouse(event: MouseEvent): Element[];
41
41
  zoomTowardsPoint(point: IPoint, scalechange: number): void;
42
+ zoomPoint(canvasPoint: IPoint, newZoom: number): void;
42
43
  zoomOntoRectangle(startPoint: IPoint, endPoint: IPoint): void;
43
44
  showDesignItemContextMenu(designItem: IDesignItem, event: MouseEvent): void;
44
45
  }
@@ -99,5 +99,6 @@ export declare class DesignerCanvas extends BaseCustomWebComponentLazyAppend imp
99
99
  removeOverlay(element: SVGGraphicsElement): void;
100
100
  getItemsBelowMouse(event: MouseEvent): Element[];
101
101
  zoomOntoRectangle(startPoint: IPoint, endPoint: IPoint): void;
102
+ zoomPoint(canvasPoint: IPoint, newZoom: number): void;
102
103
  zoomTowardsPoint(canvasPoint: IPoint, newZoom: number): void;
103
104
  }
@@ -394,6 +394,7 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
394
394
  this._canvasContainer.style.bottom = this._outercanvas2.offsetHeight >= this._canvasContainer.offsetHeight ? '0' : '';
395
395
  this._canvasContainer.style.right = this._outercanvas2.offsetWidth >= this._canvasContainer.offsetWidth ? '0' : '';
396
396
  this._updateTransform();
397
+ this._fillCalculationrects();
397
398
  this.onZoomFactorChanged.emit(this._zoomFactor);
398
399
  }
399
400
  _updateTransform() {
@@ -791,7 +792,15 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
791
792
  x: (rect.width / 2) + rect.x,
792
793
  y: (rect.height / 2) + rect.y
793
794
  };
794
- this.zoomTowardsPoint(rectCenter, zoomFactor);
795
+ this.zoomPoint(rectCenter, zoomFactor);
796
+ }
797
+ zoomPoint(canvasPoint, newZoom) {
798
+ this.zoomFactor = newZoom;
799
+ const newCanvasOffset = {
800
+ x: -(canvasPoint.x) + this.outerRect.width / this.zoomFactor / 2,
801
+ y: -(canvasPoint.y) + this.outerRect.height / this.zoomFactor / 2
802
+ };
803
+ this.canvasOffset = newCanvasOffset;
795
804
  }
796
805
  zoomTowardsPoint(canvasPoint, newZoom) {
797
806
  const scaleChange = newZoom / this.zoomFactor;
@@ -20,6 +20,8 @@ export declare class DesignerView extends BaseCustomWebComponentConstructorAppen
20
20
  static readonly style: CSSStyleSheet;
21
21
  static readonly template: HTMLTemplateElement;
22
22
  constructor();
23
+ zoomReset(): void;
24
+ zoomToFit(): void;
23
25
  private _onScrollbar;
24
26
  private _onWheel;
25
27
  get designerWidth(): string;
@@ -179,38 +179,11 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
179
179
  };
180
180
  let zoomReset = this._getDomElement('zoomReset');
181
181
  zoomReset.onclick = () => {
182
- this._designerCanvas.canvasOffset = { x: 0, y: 0 };
183
- this._designerCanvas.zoomFactor = 1;
184
- this._sVert.value = 0.5;
185
- this._sHor.value = 0.5;
186
- this._zoomInput.value = Math.round(this._designerCanvas.zoomFactor * 100) + '%';
182
+ this.zoomReset();
187
183
  };
188
184
  let zoomFit = this._getDomElement('zoomFit');
189
185
  zoomFit.onclick = () => {
190
- let maxX = 0, maxY = 0, minX = 0, minY = 0;
191
- this._designerCanvas.canvasOffset = { x: 0, y: 0 };
192
- this._designerCanvas.zoomFactor = 1;
193
- for (let n of DomHelper.getAllChildNodes(this.designerCanvas.rootDesignItem.element)) {
194
- if (n instanceof Element) {
195
- const rect = n.getBoundingClientRect();
196
- minX = minX < rect.x ? minX : rect.x;
197
- minY = minY < rect.y ? minY : rect.y;
198
- maxX = maxX > rect.x + rect.width + autoZomOffset ? maxX : rect.x + rect.width + autoZomOffset;
199
- maxY = maxY > rect.y + rect.height + autoZomOffset ? maxY : rect.y + rect.height + autoZomOffset;
200
- }
201
- }
202
- const cvRect = this.designerCanvas.getBoundingClientRect();
203
- maxX -= cvRect.x;
204
- maxY -= cvRect.y;
205
- let scaleX = cvRect.width / (maxX / this._designerCanvas.zoomFactor);
206
- let scaleY = cvRect.height / (maxY / this._designerCanvas.zoomFactor);
207
- const dimensions = this.designerCanvas.getDesignSurfaceDimensions();
208
- if (dimensions.width)
209
- scaleX = cvRect.width / dimensions.width;
210
- if (dimensions.height)
211
- scaleY = cvRect.height / dimensions.height;
212
- this._designerCanvas.zoomFactor = scaleX < scaleY ? scaleX : scaleY;
213
- this._zoomInput.value = Math.round(this._designerCanvas.zoomFactor * 100) + '%';
186
+ this.zoomToFit();
214
187
  };
215
188
  this.addEventListener(EventNames.Wheel, event => this._onWheel(event));
216
189
  let alignSnap = this._getDomElement('alignSnap');
@@ -225,6 +198,39 @@ export class DesignerView extends BaseCustomWebComponentConstructorAppend {
225
198
  this._sVert.addEventListener('scrollbar-input', (e) => this._onScrollbar(e));
226
199
  this._sHor.addEventListener('scrollbar-input', (e) => this._onScrollbar(e));
227
200
  }
201
+ zoomReset() {
202
+ this._designerCanvas.canvasOffset = { x: 0, y: 0 };
203
+ this._designerCanvas.zoomFactor = 1;
204
+ this._sVert.value = 0.5;
205
+ this._sHor.value = 0.5;
206
+ this._zoomInput.value = Math.round(this._designerCanvas.zoomFactor * 100) + '%';
207
+ }
208
+ zoomToFit() {
209
+ let maxX = 0, maxY = 0, minX = 0, minY = 0;
210
+ this._designerCanvas.canvasOffset = { x: 0, y: 0 };
211
+ this._designerCanvas.zoomFactor = 1;
212
+ for (let n of DomHelper.getAllChildNodes(this.designerCanvas.rootDesignItem.element)) {
213
+ if (n instanceof Element) {
214
+ const rect = n.getBoundingClientRect();
215
+ minX = minX < rect.x ? minX : rect.x;
216
+ minY = minY < rect.y ? minY : rect.y;
217
+ maxX = maxX > rect.x + rect.width + autoZomOffset ? maxX : rect.x + rect.width + autoZomOffset;
218
+ maxY = maxY > rect.y + rect.height + autoZomOffset ? maxY : rect.y + rect.height + autoZomOffset;
219
+ }
220
+ }
221
+ const cvRect = this.designerCanvas.getBoundingClientRect();
222
+ maxX -= cvRect.x;
223
+ maxY -= cvRect.y;
224
+ let scaleX = cvRect.width / (maxX / this._designerCanvas.zoomFactor);
225
+ let scaleY = cvRect.height / (maxY / this._designerCanvas.zoomFactor);
226
+ const dimensions = this.designerCanvas.getDesignSurfaceDimensions();
227
+ if (dimensions.width)
228
+ scaleX = cvRect.width / dimensions.width;
229
+ if (dimensions.height)
230
+ scaleY = cvRect.height / dimensions.height;
231
+ this._designerCanvas.zoomFactor = scaleX < scaleY ? scaleX : scaleY;
232
+ this._zoomInput.value = Math.round(this._designerCanvas.zoomFactor * 100) + '%';
233
+ }
228
234
  _onScrollbar(e) {
229
235
  if (e?.detail == 'incrementLarge')
230
236
  e.target.value += 0.25;
@@ -35,13 +35,9 @@ export class EditTextWithStyloExtension extends AbstractExtension {
35
35
  this.overlays.push(foreignObject);
36
36
  this._drawClickOverlayRects();
37
37
  this._rect1.addEventListener('pointerdown', (e) => this._clickOutside(e));
38
- this._rect1.addEventListener('pointerup', (e) => this._clickOutside(e));
39
38
  this._rect2.addEventListener('pointerdown', (e) => this._clickOutside(e));
40
- this._rect2.addEventListener('pointerup', (e) => this._clickOutside(e));
41
39
  this._rect3.addEventListener('pointerdown', (e) => this._clickOutside(e));
42
- this._rect3.addEventListener('pointerup', (e) => this._clickOutside(e));
43
40
  this._rect4.addEventListener('pointerdown', (e) => this._clickOutside(e));
44
- this._rect4.addEventListener('pointerup', (e) => this._clickOutside(e));
45
41
  requestAnimationFrame(() => {
46
42
  const stylo = foreignObject.querySelector('stylo-editor');
47
43
  //@ts-ignore
@@ -16,7 +16,7 @@ export declare class ResizeExtension extends AbstractExtension {
16
16
  private _circle6;
17
17
  private _circle7;
18
18
  private _circle8;
19
- constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem, resizeAllSelected: boolean);
19
+ constructor(extensionManager: IExtensionManager, designerCanvas: IDesignerCanvas, extendedItem: IDesignItem, resizeAllSelected: boolean);
20
20
  extend(): void;
21
21
  refresh(): void;
22
22
  _drawResizerOverlay(x: number, y: number, cursor: string, oldCircle?: SVGCircleElement): SVGCircleElement;
@@ -1,4 +1,5 @@
1
1
  import { EventNames } from "../../../../enums/EventNames";
2
+ import { convertCoordinates, getDomMatrix } from "../../../helper/TransformHelper.js";
2
3
  import { AbstractExtension } from './AbstractExtension';
3
4
  export class ResizeExtension extends AbstractExtension {
4
5
  resizeAllSelected;
@@ -14,8 +15,8 @@ export class ResizeExtension extends AbstractExtension {
14
15
  _circle6;
15
16
  _circle7;
16
17
  _circle8;
17
- constructor(extensionManager, designerView, extendedItem, resizeAllSelected) {
18
- super(extensionManager, designerView, extendedItem);
18
+ constructor(extensionManager, designerCanvas, extendedItem, resizeAllSelected) {
19
+ super(extensionManager, designerCanvas, extendedItem);
19
20
  this.resizeAllSelected = resizeAllSelected;
20
21
  }
21
22
  extend() {
@@ -88,39 +89,41 @@ export class ResizeExtension extends AbstractExtension {
88
89
  const diff = containerService.placePoint(event, this.designerCanvas, this.extendedItem.parent, this._initialPoint, { x: 0, y: 0 }, currentPoint, this.designerCanvas.instanceServiceContainer.selectionService.selectedElements);
89
90
  let trackX = diff.x - this._initialPoint.x - this._offsetPoint.x;
90
91
  let trackY = diff.y - this._initialPoint.y - this._offsetPoint.y;
92
+ let matrix = getDomMatrix(this.extendedItem.element);
93
+ let transformedTrack = convertCoordinates({ x: trackX, y: trackY }, matrix);
91
94
  let i = 0;
92
95
  switch (this._actionModeStarted) {
93
96
  case 'se-resize':
94
- this.extendedItem.element.style.width = this._initialSizes[i].width + trackX + 'px';
95
- this.extendedItem.element.style.height = this._initialSizes[i].height + trackY + 'px';
97
+ this.extendedItem.element.style.width = this._initialSizes[i].width + transformedTrack.x + 'px';
98
+ this.extendedItem.element.style.height = this._initialSizes[i].height + transformedTrack.y + 'px';
96
99
  if (this.resizeAllSelected) {
97
100
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
98
101
  i++;
99
102
  if (designItem !== this.extendedItem) {
100
- designItem.element.style.width = this._initialSizes[i].width + trackX + 'px';
101
- designItem.element.style.height = this._initialSizes[i].height + trackY + 'px';
103
+ designItem.element.style.width = this._initialSizes[i].width + transformedTrack.x + 'px';
104
+ designItem.element.style.height = this._initialSizes[i].height + transformedTrack.y + 'px';
102
105
  }
103
106
  }
104
107
  }
105
108
  break;
106
109
  case 's-resize':
107
- this.extendedItem.element.style.height = this._initialSizes[i].height + trackY + 'px';
110
+ this.extendedItem.element.style.height = this._initialSizes[i].height + transformedTrack.y + 'px';
108
111
  if (this.resizeAllSelected) {
109
112
  i++;
110
113
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
111
114
  if (designItem !== this.extendedItem) {
112
- designItem.element.style.height = this._initialSizes[i].height + trackY + 'px';
115
+ designItem.element.style.height = this._initialSizes[i].height + transformedTrack.y + 'px';
113
116
  }
114
117
  }
115
118
  }
116
119
  break;
117
120
  case 'e-resize':
118
- this.extendedItem.element.style.width = this._initialSizes[i].width + trackX + 'px';
121
+ this.extendedItem.element.style.width = this._initialSizes[i].width + transformedTrack.x + 'px';
119
122
  if (this.resizeAllSelected) {
120
123
  i++;
121
124
  for (const designItem of this.designerCanvas.instanceServiceContainer.selectionService.selectedElements) {
122
125
  if (designItem !== this.extendedItem) {
123
- designItem.element.style.width = this._initialSizes[i].width + trackX + 'px';
126
+ designItem.element.style.width = this._initialSizes[i].width + transformedTrack.x + 'px';
124
127
  }
125
128
  }
126
129
  }
@@ -0,0 +1,8 @@
1
+ import { IContextMenuItem } from "../../../../helper/contextMenu/IContextmenuItem";
2
+ import { IDesignItem } from "../../../../item/IDesignItem";
3
+ import { IDesignerCanvas } from "../../IDesignerCanvas";
4
+ import { ContextmenuInitiator, IContextMenuExtension } from "./IContextMenuExtension";
5
+ export declare class CopyPasteContextMenu implements IContextMenuExtension {
6
+ shouldProvideContextmenu(event: MouseEvent, designerView: IDesignerCanvas, designItem: IDesignItem, initiator: ContextmenuInitiator): boolean;
7
+ provideContextMenuItems(event: MouseEvent, designerView: IDesignerCanvas, designItem: IDesignItem): IContextMenuItem[];
8
+ }
@@ -0,0 +1,15 @@
1
+ import { CommandType } from "../../../../../commandHandling/CommandType";
2
+ export class CopyPasteContextMenu {
3
+ shouldProvideContextmenu(event, designerView, designItem, initiator) {
4
+ return true;
5
+ }
6
+ provideContextMenuItems(event, designerView, designItem) {
7
+ return [
8
+ { title: 'copy', action: () => { designerView.executeCommand({ type: CommandType.copy }); }, shortCut: 'Ctrl + C' },
9
+ { title: 'cut', action: () => { designerView.executeCommand({ type: CommandType.cut }); }, shortCut: 'Ctrl + X' },
10
+ { title: 'paste', action: () => { designerView.executeCommand({ type: CommandType.paste }); }, shortCut: 'Ctrl + V' },
11
+ { title: 'delete', action: () => { designerView.executeCommand({ type: CommandType.delete }); }, shortCut: 'Del' },
12
+ { title: '-' }
13
+ ];
14
+ }
15
+ }
@@ -5,11 +5,10 @@ export class CopyPasteContextMenu {
5
5
  }
6
6
  provideContextMenuItems(event, designerView, designItem) {
7
7
  return [
8
- { title: 'copy', action: () => { designerView.executeCommand({ type: CommandType.copy }); } },
9
- { title: 'cut', action: () => { designerView.executeCommand({ type: CommandType.cut }); } },
10
- { title: 'paste', action: () => { designerView.executeCommand({ type: CommandType.paste }); } },
11
- { title: 'delete', action: () => { designerView.executeCommand({ type: CommandType.delete }); } },
12
- { title: '-' }
8
+ { title: 'copy', action: () => { designerView.executeCommand({ type: CommandType.copy }); }, shortCut: 'Ctrl + C' },
9
+ { title: 'cut', action: () => { designerView.executeCommand({ type: CommandType.cut }); }, shortCut: 'Ctrl + X' },
10
+ { title: 'paste', action: () => { designerView.executeCommand({ type: CommandType.paste }); }, shortCut: 'Ctrl + V' },
11
+ { title: 'delete', action: () => { designerView.executeCommand({ type: CommandType.delete }); }, shortCut: 'Del' },
13
12
  ];
14
13
  }
15
14
  }
@@ -7,7 +7,7 @@ export class ItemsBelowContextMenu {
7
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(designerCanvas, x) }))];
10
+ return [...lstItems.map(x => ({ title: 'select: ' + x.localName + (x.id ? ' (' + x.id + ')' : ''), action: () => this._select(designerCanvas, x) }))];
11
11
  }
12
12
  return [];
13
13
  }
@@ -9,7 +9,6 @@ export class RectContextMenu {
9
9
  }
10
10
  provideContextMenuItems(event, designerCanvas, designItem) {
11
11
  return [
12
- { title: '-' },
13
12
  {
14
13
  title: 'convert to path', action: () => {
15
14
  let rect = designItem.element;
@@ -0,0 +1,8 @@
1
+ import { IContextMenuItem } from "../../../../helper/contextMenu/IContextmenuItem";
2
+ import { IDesignItem } from "../../../../item/IDesignItem";
3
+ import { IDesignerCanvas } from "../../IDesignerCanvas";
4
+ import { ContextmenuInitiator, IContextMenuExtension } from "./IContextMenuExtension";
5
+ export declare class SeperatorContextMenu implements IContextMenuExtension {
6
+ shouldProvideContextmenu(event: MouseEvent, designerView: IDesignerCanvas, designItem: IDesignItem, initiator: ContextmenuInitiator): boolean;
7
+ provideContextMenuItems(event: MouseEvent, designerView: IDesignerCanvas, designItem: IDesignItem): IContextMenuItem[];
8
+ }
@@ -0,0 +1,10 @@
1
+ export class SeperatorContextMenu {
2
+ shouldProvideContextmenu(event, designerView, designItem, initiator) {
3
+ return true;
4
+ }
5
+ provideContextMenuItems(event, designerView, designItem) {
6
+ return [
7
+ { title: '-' }
8
+ ];
9
+ }
10
+ }
@@ -0,0 +1,8 @@
1
+ import { IContextMenuItem } from "../../../../helper/contextMenu/IContextmenuItem";
2
+ import { IDesignItem } from "../../../../item/IDesignItem";
3
+ import { IDesignerCanvas } from "../../IDesignerCanvas";
4
+ import { ContextmenuInitiator, IContextMenuExtension } from "./IContextMenuExtension";
5
+ export declare class ZMoveContextMenu implements IContextMenuExtension {
6
+ shouldProvideContextmenu(event: MouseEvent, designerView: IDesignerCanvas, designItem: IDesignItem, initiator: ContextmenuInitiator): boolean;
7
+ provideContextMenuItems(event: MouseEvent, designerView: IDesignerCanvas, designItem: IDesignItem): IContextMenuItem[];
8
+ }
@@ -0,0 +1,14 @@
1
+ import { CommandType } from "../../../../../commandHandling/CommandType";
2
+ export class ZMoveContextMenu {
3
+ shouldProvideContextmenu(event, designerView, designItem, initiator) {
4
+ return true;
5
+ }
6
+ provideContextMenuItems(event, designerView, designItem) {
7
+ return [
8
+ { title: 'to front', action: () => { designerView.executeCommand({ type: CommandType.moveToFront }); } },
9
+ { title: 'move forward', action: () => { designerView.executeCommand({ type: CommandType.moveForward }); } },
10
+ { title: 'move backward', action: () => { designerView.executeCommand({ type: CommandType.moveBackward }); } },
11
+ { title: 'to back', action: () => { designerView.executeCommand({ type: CommandType.moveToBack }); } },
12
+ ];
13
+ }
14
+ }
@@ -0,0 +1,8 @@
1
+ import { IContextMenuItem } from "../../../../helper/contextMenu/IContextmenuItem";
2
+ import { IDesignItem } from "../../../../item/IDesignItem";
3
+ import { IDesignerCanvas } from "../../IDesignerCanvas";
4
+ import { ContextmenuInitiator, IContextMenuExtension } from "./IContextMenuExtension";
5
+ export declare class ZoomToElementContextMenu implements IContextMenuExtension {
6
+ shouldProvideContextmenu(event: MouseEvent, designerCanvas: IDesignerCanvas, designItem: IDesignItem, initiator: ContextmenuInitiator): boolean;
7
+ provideContextMenuItems(event: MouseEvent, designerCanvas: IDesignerCanvas, designItem: IDesignItem): IContextMenuItem[];
8
+ }
@@ -0,0 +1,27 @@
1
+ const offset = 10;
2
+ export class ZoomToElementContextMenu {
3
+ shouldProvideContextmenu(event, designerCanvas, designItem, initiator) {
4
+ return true;
5
+ }
6
+ provideContextMenuItems(event, designerCanvas, designItem) {
7
+ return [
8
+ {
9
+ title: 'zoom to', action: () => {
10
+ const coord = designerCanvas.getNormalizedElementCoordinates(designItem.element);
11
+ const startPoint = { x: coord.x - offset, y: coord.y - offset };
12
+ const endPoint = { x: coord.x + coord.width + offset, y: coord.y + coord.height + offset };
13
+ let rect = {
14
+ x: startPoint.x < endPoint.x ? startPoint.x : endPoint.x,
15
+ y: startPoint.y < endPoint.y ? startPoint.y : endPoint.y,
16
+ width: Math.abs(startPoint.x - endPoint.x),
17
+ height: Math.abs(startPoint.y - endPoint.y),
18
+ };
19
+ let zFactorWidth = designerCanvas.outerRect.width / rect.width;
20
+ let zFactorHeight = designerCanvas.outerRect.height / rect.height;
21
+ let zoomFactor = zFactorWidth >= zFactorHeight ? zFactorHeight : zFactorWidth;
22
+ designerCanvas.zoomPoint({ x: coord.x + coord.width / 2, y: coord.y + coord.height / 2 }, zoomFactor);
23
+ }
24
+ },
25
+ ];
26
+ }
27
+ }
@@ -6,7 +6,6 @@ export declare class TextTool implements ITool {
6
6
  activated(serviceContainer: ServiceContainer): void;
7
7
  dispose(): void;
8
8
  readonly cursor = "text";
9
- private _text;
10
9
  pointerEventHandler(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): void;
11
10
  keyboardEventHandler(designerCanvas: IDesignerCanvas, event: KeyboardEvent, currentElement: Element): void;
12
11
  }
@@ -1,4 +1,7 @@
1
1
  import { EventNames } from '../../../../enums/EventNames.js';
2
+ import { DesignItem } from '../../../item/DesignItem.js';
3
+ import { InsertAction } from '../../../services/undoService/transactionItems/InsertAction.js';
4
+ import { ExtensionType } from '../extensions/ExtensionType.js';
2
5
  export class TextTool {
3
6
  constructor() {
4
7
  }
@@ -7,26 +10,22 @@ export class TextTool {
7
10
  dispose() {
8
11
  }
9
12
  cursor = 'text';
10
- _text;
11
13
  pointerEventHandler(designerCanvas, event, currentElement) {
12
14
  const currentPoint = designerCanvas.getNormalizedEventCoordinates(event);
13
- //const offset = 50;
14
- addEventListener("keyup", function (event) {
15
- if (event.key === 'Enter') {
16
- console.log("Enter Pressed");
17
- event.preventDefault();
18
- }
19
- });
20
15
  switch (event.type) {
21
16
  case EventNames.PointerDown:
22
- event.target.setPointerCapture(event.pointerId);
23
- this._text = document.createElementNS("http://www.w3.org/2000/svg", "text");
24
- this._text.setAttribute("x", currentPoint.x.toString());
25
- this._text.setAttribute("y", currentPoint.y.toString());
26
- break;
27
- case EventNames.KeyUp:
28
- //if(event.key === 'Enter'){
29
- //}
17
+ const span = document.createElement('span');
18
+ const di = DesignItem.createDesignItemFromInstance(span, designerCanvas.serviceContainer, designerCanvas.instanceServiceContainer);
19
+ di.setStyle('position', 'absolute');
20
+ di.setStyle('left', currentPoint.x + 'px');
21
+ di.setStyle('top', currentPoint.y + 'px');
22
+ designerCanvas.instanceServiceContainer.undoService.execute(new InsertAction(designerCanvas.rootDesignItem, designerCanvas.rootDesignItem.childCount, di));
23
+ designerCanvas.serviceContainer.globalContext.finishedWithTool(this);
24
+ //TODO - don't apply doubleclick extension (maybe it is not the doubleclick one) - apply edit text extesion directly
25
+ designerCanvas.extensionManager.applyExtension(di, ExtensionType.Doubleclick);
26
+ setTimeout(() => {
27
+ span.focus();
28
+ }, 50);
30
29
  break;
31
30
  }
32
31
  }
@@ -120,8 +120,11 @@ export class PaletteTreeView extends BaseCustomWebComponentConstructorAppend {
120
120
  catch (err) {
121
121
  console.warn('Error loading elements', err);
122
122
  }
123
- //@ts-ignore
124
- newNode.updateCounters();
123
+ try {
124
+ //@ts-ignore
125
+ newNode.updateCounters();
126
+ }
127
+ catch { }
125
128
  }
126
129
  }
127
130
  }
@@ -132,9 +132,7 @@ export class TreeView extends BaseCustomWebComponentLazyAppend {
132
132
  this.createTree(value.contentService.rootDesignItem);
133
133
  }
134
134
  selectionChanged(event) {
135
- if (event.selectedElements.length > 0) {
136
- this._selectTreeElements(event.selectedElements.map(x => this._mapElementTreeitem.get(x.element)));
137
- }
135
+ this._selectTreeElements(event.selectedElements.map(x => this._mapElementTreeitem.get(x.element)));
138
136
  }
139
137
  _recomputeTree(parent, activeElement) {
140
138
  this._mapElementTreeitem = new Map();
@@ -14,6 +14,7 @@ export declare class TreeViewExtended extends BaseCustomWebComponentConstructorA
14
14
  static readonly style: CSSStyleSheet;
15
15
  static readonly template: HTMLTemplateElement;
16
16
  constructor();
17
+ _filterNodes(): void;
17
18
  _showHideAtDesignTimeState(img: HTMLImageElement, designItem: IDesignItem): void;
18
19
  _switchHideAtDesignTimeState(img: HTMLImageElement, designItem: IDesignItem): void;
19
20
  _showLockAtDesignTimeState(img: HTMLImageElement, designItem: IDesignItem): void;
@@ -98,12 +98,20 @@ export class TreeViewExtended extends BaseCustomWebComponentConstructorAppend {
98
98
  import("jquery.fancytree/dist/skin-win8/ui.fancytree.css", { assert: { type: 'css' } }).then(x => this.shadowRoot.adoptedStyleSheets = [x.default, this.constructor.style]);
99
99
  this._filter = this._getDomElement('input');
100
100
  this._filter.onkeyup = () => {
101
- let match = this._filter.value;
101
+ this._filterNodes();
102
+ };
103
+ this._treeDiv = this._getDomElement('treetable');
104
+ }
105
+ _filterNodes() {
106
+ let match = this._filter.value;
107
+ if (match) {
102
108
  this._tree.filterNodes((node) => {
103
109
  return new RegExp(match, "i").test(node.title);
104
110
  });
105
- };
106
- this._treeDiv = this._getDomElement('treetable');
111
+ }
112
+ else {
113
+ this._tree.clearFilter();
114
+ }
107
115
  }
108
116
  _showHideAtDesignTimeState(img, designItem) {
109
117
  if (designItem.hideAtDesignTime)
@@ -337,9 +345,7 @@ export class TreeViewExtended extends BaseCustomWebComponentConstructorAppend {
337
345
  this.createTree(value.contentService.rootDesignItem);
338
346
  }
339
347
  selectionChanged(event) {
340
- if (event.selectedElements.length > 0) {
341
- this._highlight(event.selectedElements);
342
- }
348
+ this._highlight(event.selectedElements);
343
349
  }
344
350
  _recomputeTree(rootItem) {
345
351
  this._tree.getRootNode().removeChildren();
@@ -347,6 +353,7 @@ export class TreeViewExtended extends BaseCustomWebComponentConstructorAppend {
347
353
  this._tree.expandAll();
348
354
  //@ts-ignore
349
355
  this._tree.getRootNode().updateCounters();
356
+ this._filterNodes();
350
357
  }
351
358
  _getChildren(item, currentNode) {
352
359
  if (currentNode == null) {
package/dist/index.d.ts CHANGED
@@ -156,7 +156,11 @@ export type { IContextMenuExtension, ContextmenuInitiator } from "./elements/wid
156
156
  export * from "./elements/widgets/designerView/extensions/contextMenu/CopyPasteContextMenu.js";
157
157
  export * from "./elements/widgets/designerView/extensions/contextMenu/ItemsBelowContextMenu.js";
158
158
  export * from "./elements/widgets/designerView/extensions/contextMenu/MultipleItemsSelectedContextMenu.js";
159
+ export * from "./elements/widgets/designerView/extensions/contextMenu/PathContextMenu.js";
160
+ export * from "./elements/widgets/designerView/extensions/contextMenu/RectContextMenu.js";
161
+ export * from "./elements/widgets/designerView/extensions/contextMenu/SeperatorContextMenu.js";
159
162
  export * from "./elements/widgets/designerView/extensions/contextMenu/ZMoveContextMenu.js";
163
+ export * from "./elements/widgets/designerView/extensions/contextMenu/ZoomToElementContextMenu.js";
160
164
  export type { IDesignerPointerExtension } from "./elements/widgets/designerView/extensions/pointerExtensions/IDesignerPointerExtension.js";
161
165
  export type { IDesignerPointerExtensionProvider } from "./elements/widgets/designerView/extensions/pointerExtensions/IDesignerPointerExtensionProvider.js";
162
166
  export * from "./elements/widgets/designerView/extensions/pointerExtensions/AbstractDesignerPointerExtension.js";
package/dist/index.js CHANGED
@@ -116,7 +116,11 @@ export * from "./elements/widgets/designerView/extensions/EditText/EditTextWithS
116
116
  export * from "./elements/widgets/designerView/extensions/contextMenu/CopyPasteContextMenu.js";
117
117
  export * from "./elements/widgets/designerView/extensions/contextMenu/ItemsBelowContextMenu.js";
118
118
  export * from "./elements/widgets/designerView/extensions/contextMenu/MultipleItemsSelectedContextMenu.js";
119
+ export * from "./elements/widgets/designerView/extensions/contextMenu/PathContextMenu.js";
120
+ export * from "./elements/widgets/designerView/extensions/contextMenu/RectContextMenu.js";
121
+ export * from "./elements/widgets/designerView/extensions/contextMenu/SeperatorContextMenu.js";
119
122
  export * from "./elements/widgets/designerView/extensions/contextMenu/ZMoveContextMenu.js";
123
+ export * from "./elements/widgets/designerView/extensions/contextMenu/ZoomToElementContextMenu.js";
120
124
  export * from "./elements/widgets/designerView/extensions/pointerExtensions/AbstractDesignerPointerExtension.js";
121
125
  export * from "./elements/widgets/designerView/extensions/pointerExtensions/CursorLinePointerExtension.js";
122
126
  export * from "./elements/widgets/designerView/extensions/pointerExtensions/CursorLinePointerExtensionProvider.js";
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.90",
4
+ "version": "0.0.93",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "author": "",
@@ -13,7 +13,7 @@
13
13
  "prepublishOnly": "npm run build"
14
14
  },
15
15
  "dependencies": {
16
- "@node-projects/base-custom-webcomponent": "^0.5.3",
16
+ "@node-projects/base-custom-webcomponent": "^0.6.0",
17
17
  "construct-style-sheets-polyfill": "^3.1.0"
18
18
  },
19
19
  "devDependencies": {
@@ -21,10 +21,10 @@
21
21
  "@node-projects/node-html-parser-esm": "^2.4.1",
22
22
  "@papyrs/stylo": "^0.0.8",
23
23
  "@types/codemirror": "^5.60.5",
24
- "@types/jquery": "^3.5.13",
24
+ "@types/jquery": "^3.5.14",
25
25
  "@types/jquery.fancytree": "0.0.7",
26
26
  "ace-builds": "^1.4.14",
27
- "codemirror": "^5.65.1",
27
+ "codemirror": "^5.65.2",
28
28
  "esprima-next": "^5.8.1",
29
29
  "html2canvas": "*",
30
30
  "jest": "^27.5.1",