@node-projects/web-component-designer 0.0.14 → 0.0.19

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 (61) hide show
  1. package/dist/elements/documentContainer.js +1 -0
  2. package/dist/elements/helper/XmlHelper.d.ts +2 -0
  3. package/dist/elements/helper/XmlHelper.js +16 -0
  4. package/dist/elements/item/DesignItem.d.ts +1 -0
  5. package/dist/elements/item/DesignItem.js +36 -27
  6. package/dist/elements/item/IDesignItem.d.ts +1 -0
  7. package/dist/elements/services/DefaultServiceBootstrap.js +12 -0
  8. package/dist/elements/services/ServiceContainer.d.ts +9 -0
  9. package/dist/elements/services/ServiceContainer.js +9 -0
  10. package/dist/elements/services/dragDropService/DragDropService.d.ts +6 -0
  11. package/dist/elements/services/dragDropService/DragDropService.js +28 -0
  12. package/dist/elements/services/dragDropService/IDragDropService.d.ts +5 -0
  13. package/dist/elements/{loader/ICustomElementsManifest.js → services/dragDropService/IDragDropService.js} +0 -0
  14. package/dist/elements/services/instanceService/DefaultInstanceService.js +20 -16
  15. package/dist/elements/services/instanceService/IPrepareElementsForDesignerService.d.ts +4 -0
  16. package/dist/elements/{loader/IOldCustomElementsManifest copy.js → services/instanceService/IPrepareElementsForDesignerService.js} +0 -0
  17. package/dist/elements/services/instanceService/PrepareElementsForDesignerService.d.ts +6 -0
  18. package/dist/elements/services/instanceService/PrepareElementsForDesignerService.js +23 -0
  19. package/dist/elements/services/placementService/DefaultPlacementService.js +2 -1
  20. package/dist/elements/services/placementService/ISnaplinesProviderService.d.ts +11 -0
  21. package/dist/elements/services/placementService/ISnaplinesProviderService.js +1 -0
  22. package/dist/elements/services/placementService/SnaplinesProviderService.d.ts +11 -0
  23. package/dist/elements/services/placementService/SnaplinesProviderService.js +36 -0
  24. package/dist/elements/services/propertiesService/services/AbstractBasePropertiesService.js +1 -1
  25. package/dist/elements/services/undoService/transactionItems/AttributeChangeAction.js +24 -4
  26. package/dist/elements/services/undoService/transactionItems/InsertAction.js +3 -0
  27. package/dist/elements/widgets/designerView/IDesignerView.d.ts +1 -0
  28. package/dist/elements/widgets/designerView/Snaplines.js +6 -25
  29. package/dist/elements/widgets/designerView/designerView.d.ts +4 -2
  30. package/dist/elements/widgets/designerView/designerView.js +58 -29
  31. package/dist/elements/widgets/designerView/extensions/EditText/EditTextCkEditorExtension.d.ts +14 -0
  32. package/dist/elements/widgets/designerView/extensions/EditText/EditTextCkEditorExtension.js +42 -0
  33. package/dist/elements/widgets/designerView/extensions/EditText/EditTextCkEditorExtensionProvider.d.ts +9 -0
  34. package/dist/elements/widgets/designerView/extensions/EditText/EditTextCkEditorExtensionProvider.js +9 -0
  35. package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension.d.ts +17 -0
  36. package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension.js +78 -0
  37. package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider.d.ts +9 -0
  38. package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider.js +11 -0
  39. package/dist/elements/widgets/designerView/extensions/EditText/EditTextTinyMceExtension.d.ts +27 -0
  40. package/dist/elements/widgets/designerView/extensions/EditText/EditTextTinyMceExtension.js +61 -0
  41. package/dist/elements/widgets/designerView/extensions/EditText/EditTextTinyMceExtensionProvider.d.ts +9 -0
  42. package/dist/elements/widgets/designerView/extensions/EditText/EditTextTinyMceExtensionProvider.js +9 -0
  43. package/dist/elements/widgets/designerView/extensions/ExtensionType.d.ts +5 -1
  44. package/dist/elements/widgets/designerView/extensions/ExtensionType.js +4 -0
  45. package/dist/elements/widgets/designerView/extensions/GridExtension.js +5 -4
  46. package/dist/elements/widgets/designerView/extensions/RotateExtension.js +1 -1
  47. package/dist/elements/widgets/designerView/overlayLayerView.d.ts +2 -2
  48. package/dist/elements/widgets/designerView/overlayLayerView.js +3 -2
  49. package/dist/enums/EventNames.d.ts +5 -1
  50. package/dist/enums/EventNames.js +4 -0
  51. package/dist/index.d.ts +8 -0
  52. package/dist/index.js +5 -0
  53. package/package.json +10 -10
  54. package/dist/elements/loader/CustomElementsManifestLoader.d.ts +0 -8
  55. package/dist/elements/loader/CustomElementsManifestLoader.js +0 -45
  56. package/dist/elements/loader/ICustomElementsManifest.d.ts +0 -24
  57. package/dist/elements/loader/IOldCustomElementsManifest copy.d.ts +0 -24
  58. package/dist/elements/loader/OldCustomElementsManifestLoader copy.d.ts +0 -8
  59. package/dist/elements/loader/OldCustomElementsManifestLoader copy.js +0 -45
  60. package/dist/elements/widgets/designerView/extensions/ExtensionLayer.d.ts +0 -5
  61. package/dist/elements/widgets/designerView/extensions/ExtensionLayer.js +0 -6
@@ -56,6 +56,7 @@ export class DesignerView extends BaseCustomWebComponentLazyAppend {
56
56
  this.extensionManager = new ExtensionManager(this);
57
57
  this._onKeyDownBound = this.onKeyDown.bind(this);
58
58
  this._onKeyUpBound = this.onKeyUp.bind(this);
59
+ this._onDblClickBound = this._onDblClick.bind(this);
59
60
  this._onContextMenuBound = this._onContextMenu.bind(this);
60
61
  this._pointerEventHandlerBound = this._pointerEventHandler.bind(this);
61
62
  this._canvas.oncontextmenu = this._onContextMenuBound;
@@ -230,10 +231,12 @@ export class DesignerView extends BaseCustomWebComponentLazyAppend {
230
231
  this._outercanvas2.addEventListener(EventNames.PointerMove, this._pointerEventHandlerBound);
231
232
  this._outercanvas2.addEventListener(EventNames.PointerUp, this._pointerEventHandlerBound);
232
233
  this._canvas.addEventListener(EventNames.DragEnter, event => this._onDragEnter(event));
234
+ this._canvas.addEventListener(EventNames.DragLeave, event => this._onDragLeave(event));
233
235
  this._canvas.addEventListener(EventNames.DragOver, event => this._onDragOver(event));
234
236
  this._canvas.addEventListener(EventNames.Drop, event => this._onDrop(event));
235
- this._canvas.addEventListener('keydown', this._onKeyDownBound, true);
236
- this._canvas.addEventListener('keyup', this._onKeyUpBound, true);
237
+ this._canvas.addEventListener(EventNames.KeyDown, this._onKeyDownBound, true);
238
+ this._canvas.addEventListener(EventNames.KeyUp, this._onKeyUpBound, true);
239
+ this._canvas.addEventListener(EventNames.DblClick, this._onDblClickBound, true);
237
240
  this.addEventListener(EventNames.Wheel, event => this._onWheel(event));
238
241
  }
239
242
  }
@@ -279,24 +282,17 @@ export class DesignerView extends BaseCustomWebComponentLazyAppend {
279
282
  intializationService.init(di);
280
283
  }
281
284
  this.snapLines.clearSnaplines();
282
- requestAnimationFrame(() => this._removeDraggableOnImages());
283
- }
284
- _removeDraggableOnImages() {
285
- this._removeDraggableOnImagesInner(this.rootDesignItem.element.querySelectorAll('*'));
286
- }
287
- _removeDraggableOnImagesInner(elements) {
288
- for (let e of elements) {
289
- if (e.shadowRoot) {
290
- this._removeDraggableOnImagesInner((e.shadowRoot).querySelectorAll('*'));
291
- }
292
- if (e.localName == 'img') {
293
- e.draggable = false;
294
- }
295
- }
285
+ const prepService = this.serviceContainer.prepareElementsForDesignerService;
286
+ if (prepService)
287
+ requestAnimationFrame(() => prepService.prepareElementsForDesigner(this.rootDesignItem));
296
288
  }
297
289
  _onDragEnter(event) {
298
290
  event.preventDefault();
299
291
  }
292
+ _onDragLeave(event) {
293
+ event.preventDefault();
294
+ this._canvas.classList.remove('dragFileActive');
295
+ }
300
296
  _onDragOver(event) {
301
297
  event.preventDefault();
302
298
  /*if (this.alignOnSnap) {
@@ -306,21 +302,39 @@ export class DesignerView extends BaseCustomWebComponentLazyAppend {
306
302
  let containerService = this.serviceContainer.getLastServiceWhere('containerService', x => x.serviceForContainer(this.rootDesignItem))
307
303
  containerService.finishPlace(this, this.rootDesignItem, this._initialPoint, currentPoint, this.instanceServiceContainer.selectionService.selectedElements);
308
304
  }*/
305
+ if (event.dataTransfer.types.length > 0 && event.dataTransfer.types[0] == 'Files') {
306
+ const ddService = this.serviceContainer.dragDropService;
307
+ if (ddService) {
308
+ const effect = ddService.dragOver(event);
309
+ event.dataTransfer.dropEffect = effect;
310
+ if (effect !== 'none')
311
+ this._canvas.classList.add('dragFileActive');
312
+ }
313
+ }
309
314
  }
310
315
  async _onDrop(event) {
311
316
  event.preventDefault();
312
- this._fillCalculationrects();
313
- let transferData = event.dataTransfer.getData(dragDropFormatName);
314
- let elementDefinition = JSON.parse(transferData);
315
- let di = await this.serviceContainer.forSomeServicesTillResult("instanceService", (service) => service.getElement(elementDefinition, this.serviceContainer, this.instanceServiceContainer));
316
- let grp = di.openGroup("Insert");
317
- di.setStyle('position', 'absolute');
318
- const targetRect = event.target.getBoundingClientRect();
319
- di.setStyle('top', event.offsetY + targetRect.top - this.containerBoundingRect.y + 'px');
320
- di.setStyle('left', event.offsetX + targetRect.left - this.containerBoundingRect.x + 'px');
321
- this.instanceServiceContainer.undoService.execute(new InsertAction(this.rootDesignItem, this.rootDesignItem.childCount, di));
322
- grp.commit();
323
- requestAnimationFrame(() => this.instanceServiceContainer.selectionService.setSelectedElements([di]));
317
+ this._canvas.classList.remove('dragFileActive');
318
+ if (event.dataTransfer.files.length > 0) {
319
+ const ddService = this.serviceContainer.dragDropService;
320
+ if (ddService) {
321
+ ddService.drop(this, event);
322
+ }
323
+ }
324
+ else {
325
+ this._fillCalculationrects();
326
+ let transferData = event.dataTransfer.getData(dragDropFormatName);
327
+ let elementDefinition = JSON.parse(transferData);
328
+ let di = await this.serviceContainer.forSomeServicesTillResult("instanceService", (service) => service.getElement(elementDefinition, this.serviceContainer, this.instanceServiceContainer));
329
+ let grp = di.openGroup("Insert");
330
+ di.setStyle('position', 'absolute');
331
+ const targetRect = event.target.getBoundingClientRect();
332
+ di.setStyle('top', event.offsetY + targetRect.top - this.containerBoundingRect.y + 'px');
333
+ di.setStyle('left', event.offsetX + targetRect.left - this.containerBoundingRect.x + 'px');
334
+ this.instanceServiceContainer.undoService.execute(new InsertAction(this.rootDesignItem, this.rootDesignItem.childCount, di));
335
+ grp.commit();
336
+ requestAnimationFrame(() => this.instanceServiceContainer.selectionService.setSelectedElements([di]));
337
+ }
324
338
  }
325
339
  _onWheel(event) {
326
340
  if (event.ctrlKey) {
@@ -350,7 +364,13 @@ export class DesignerView extends BaseCustomWebComponentLazyAppend {
350
364
  let ctxMnu = ContextMenuHelper.showContextMenu(null, event, null, mnuItems);
351
365
  return ctxMnu;
352
366
  }
367
+ _onDblClick(event) {
368
+ event.preventDefault();
369
+ this.extensionManager.applyExtension(this.instanceServiceContainer.selectionService.primarySelection, ExtensionType.Doubleclick);
370
+ }
353
371
  onKeyUp(event) {
372
+ if (event.composedPath().indexOf(this.eatEvents) >= 0)
373
+ return;
354
374
  switch (event.key) {
355
375
  case 'ArrowUp':
356
376
  //this._resetPointerEventsForClickThrough();
@@ -359,6 +379,8 @@ export class DesignerView extends BaseCustomWebComponentLazyAppend {
359
379
  event.preventDefault();
360
380
  }
361
381
  onKeyDown(event) {
382
+ if (event.composedPath().indexOf(this.eatEvents) >= 0)
383
+ return;
362
384
  //TODO: keyboard events maybe should also be handeled by tools
363
385
  if ((event.ctrlKey || event.metaKey) && event.key === 'z' && !event.shiftKey)
364
386
  this.executeCommand({ type: CommandType.undo });
@@ -473,6 +495,8 @@ export class DesignerView extends BaseCustomWebComponentLazyAppend {
473
495
  }
474
496
  _pointerEventHandler(event) {
475
497
  var _a, _b;
498
+ if (event.composedPath().indexOf(this.eatEvents) >= 0)
499
+ return;
476
500
  if (event.button == 2)
477
501
  return;
478
502
  let currentElement = this.serviceContainer.elementAtPointService.getElementAtPoint(this, { x: event.x, y: event.y });
@@ -540,6 +564,11 @@ DesignerView.style = css `
540
564
  transform-origin: 0 0;
541
565
  }
542
566
 
567
+ #canvas.dragFileActive {
568
+ outline: blue 4px solid;
569
+ outline-offset: -4px;
570
+ }
571
+
543
572
  node-projects-overlay-layer-view {
544
573
  box-sizing: border-box;
545
574
  width: 100%;
@@ -618,7 +647,7 @@ DesignerView.template = html `
618
647
  <div id="outercanvas2">
619
648
  <div id="canvasContainer">
620
649
  <!-- <div id="zoomHelper" style="width: 10px; height: 10px; position: absolute; top: 0; left: 0; pointer-events: none;"></div> -->
621
- <div id="canvas" tabindex="0"></div>
650
+ <div id="canvas" part="canvas" tabindex="0"></div>
622
651
  </div>
623
652
  </div>
624
653
  </div>
@@ -0,0 +1,14 @@
1
+ import { IDesignItem } from "../../../../item/IDesignItem.js";
2
+ import { IDesignerView } from "../../IDesignerView.js";
3
+ import { AbstractExtension } from "../AbstractExtension.js";
4
+ import { IExtensionManager } from "../IExtensionManger.js";
5
+ export declare class EditTextCkEditorExtension extends AbstractExtension {
6
+ private _contentEditedBound;
7
+ private _blurBound;
8
+ constructor(extensionManager: IExtensionManager, designerView: IDesignerView, extendedItem: IDesignItem);
9
+ extend(): void;
10
+ refresh(): void;
11
+ dispose(): void;
12
+ _contentEdited(): void;
13
+ _blur(): void;
14
+ }
@@ -0,0 +1,42 @@
1
+ import { AbstractExtension } from "../AbstractExtension.js";
2
+ import { ExtensionType } from "../ExtensionType.js";
3
+ export class EditTextCkEditorExtension extends AbstractExtension {
4
+ constructor(extensionManager, designerView, extendedItem) {
5
+ super(extensionManager, designerView, extendedItem);
6
+ this._contentEditedBound = this._contentEdited.bind(this);
7
+ this._blurBound = this._blur.bind(this);
8
+ }
9
+ extend() {
10
+ //todo -> check what to do with extensions, do not loose edit on mouse click,...
11
+ //maybe use a html edit framework
12
+ this.extendedItem.instanceServiceContainer.selectionService.clearSelectedElements();
13
+ //this.extensionManager.removeExtension(this.extendedItem, ExtensionType.PrimarySelection);
14
+ //this.extensionManager.removeExtension(this.extendedItem, ExtensionType.Selection);
15
+ this.extendedItem.element.addEventListener('input', this._contentEditedBound);
16
+ this.extendedItem.element.addEventListener('blur', this._blurBound);
17
+ this.extendedItem.element.focus();
18
+ this.designerView.eatEvents = this.extendedItem.element;
19
+ //@ts-ignore
20
+ BalloonEditor
21
+ .create(this.extendedItem.element)
22
+ .catch(error => {
23
+ console.error(error);
24
+ });
25
+ }
26
+ refresh() {
27
+ this.dispose();
28
+ }
29
+ dispose() {
30
+ this.extendedItem.element.removeEventListener('input', this._contentEditedBound);
31
+ this.extendedItem.element.removeEventListener('blur', this._blurBound);
32
+ //this.designerView.disableKeyboardEvents = false;
33
+ }
34
+ _contentEdited() {
35
+ //todo -> save???
36
+ //this.extendedItem.content = this.extendedItem.element.innerHTML;
37
+ //console.log(this.extendedItem.element.innerHTML)
38
+ }
39
+ _blur() {
40
+ this.extensionManager.removeExtension(this.extendedItem, ExtensionType.Doubleclick);
41
+ }
42
+ }
@@ -0,0 +1,9 @@
1
+ import { IDesignerExtensionProvider } from "../IDesignerExtensionProvider";
2
+ import { IDesignItem } from "../../../../item/IDesignItem";
3
+ import { IDesignerView } from "../../IDesignerView";
4
+ import { IDesignerExtension } from "../IDesignerExtension";
5
+ import { IExtensionManager } from "../IExtensionManger";
6
+ export declare class EditTextCkEditorExtensionProvider implements IDesignerExtensionProvider {
7
+ shouldExtend(extensionManager: IExtensionManager, designerView: IDesignerView, designItem: IDesignItem): boolean;
8
+ getExtension(extensionManager: IExtensionManager, designerView: IDesignerView, designItem: IDesignItem): IDesignerExtension;
9
+ }
@@ -0,0 +1,9 @@
1
+ import { EditTextCkEditorExtension } from "./EditTextCkEditorExtension.js";
2
+ export class EditTextCkEditorExtensionProvider {
3
+ shouldExtend(extensionManager, designerView, designItem) {
4
+ return true;
5
+ }
6
+ getExtension(extensionManager, designerView, designItem) {
7
+ return new EditTextCkEditorExtension(extensionManager, designerView, designItem);
8
+ }
9
+ }
@@ -0,0 +1,17 @@
1
+ import { IDesignItem } from "../../../../item/IDesignItem";
2
+ import { IDesignerView } from "../../IDesignerView";
3
+ import { AbstractExtension } from "../AbstractExtension.js";
4
+ import { IExtensionManager } from "../IExtensionManger";
5
+ export declare class EditTextExtension extends AbstractExtension {
6
+ private _contentEditedBound;
7
+ private _blurBound;
8
+ private static template;
9
+ private _blurTimeout;
10
+ constructor(extensionManager: IExtensionManager, designerView: IDesignerView, extendedItem: IDesignItem);
11
+ extend(): void;
12
+ refresh(): void;
13
+ dispose(): void;
14
+ _contentEdited(): void;
15
+ _blur(): void;
16
+ _formatSelection(type: string): void;
17
+ }
@@ -0,0 +1,78 @@
1
+ import { html } from "@node-projects/base-custom-webcomponent";
2
+ import { AbstractExtension } from "../AbstractExtension.js";
3
+ import { ExtensionType } from "../ExtensionType.js";
4
+ import { OverlayLayer } from "../OverlayLayer.js";
5
+ export class EditTextExtension extends AbstractExtension {
6
+ constructor(extensionManager, designerView, extendedItem) {
7
+ super(extensionManager, designerView, extendedItem);
8
+ this._contentEditedBound = this._contentEdited.bind(this);
9
+ this._blurBound = this._blur.bind(this);
10
+ }
11
+ extend() {
12
+ //todo -> check what to do with extensions, do not loose edit on mouse click,...
13
+ //maybe use a html edit framework
14
+ this.extendedItem.instanceServiceContainer.selectionService.clearSelectedElements();
15
+ //this.extensionManager.removeExtension(this.extendedItem, ExtensionType.PrimarySelection);
16
+ //this.extensionManager.removeExtension(this.extendedItem, ExtensionType.Selection);
17
+ this.extendedItem.element.setAttribute('contenteditable', '');
18
+ this.extendedItem.element.addEventListener('input', this._contentEditedBound);
19
+ this.extendedItem.element.addEventListener('blur', this._blurBound);
20
+ this.extendedItem.element.focus();
21
+ this.designerView.eatEvents = this.extendedItem.element;
22
+ let itemRect = this.extendedItem.element.getBoundingClientRect();
23
+ const elements = EditTextExtension.template.content.cloneNode(true);
24
+ elements.querySelectorAll('button').forEach(x => x.onclick = () => this._formatSelection(x.dataset['command']));
25
+ let foreignObject = document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject');
26
+ foreignObject.setAttribute('x', '' + (itemRect.x - this.designerView.containerBoundingRect.x));
27
+ foreignObject.setAttribute('y', '' + (itemRect.y - this.designerView.containerBoundingRect.y - 32));
28
+ foreignObject.setAttribute('width', '50');
29
+ foreignObject.setAttribute('height', '32');
30
+ foreignObject.appendChild(elements);
31
+ this.overlayLayerView.addOverlay(foreignObject, OverlayLayer.Foregorund);
32
+ this.overlays.push(foreignObject);
33
+ }
34
+ refresh() {
35
+ this.dispose();
36
+ }
37
+ dispose() {
38
+ this._removeAllOverlays();
39
+ this.extendedItem.element.removeAttribute('contenteditable');
40
+ this.extendedItem.element.removeEventListener('input', this._contentEditedBound);
41
+ this.extendedItem.element.removeEventListener('blur', this._blurBound);
42
+ this.designerView.eatEvents = null;
43
+ this.extendedItem.updateChildrenFromNodesChildren();
44
+ }
45
+ _contentEdited() {
46
+ //todo -> save???
47
+ //this.extendedItem.content = this.extendedItem.element.innerHTML;
48
+ //console.log(this.extendedItem.element.innerHTML)
49
+ }
50
+ _blur() {
51
+ if (!this._blurTimeout) {
52
+ this._blurTimeout = setTimeout(() => {
53
+ this.extensionManager.removeExtension(this.extendedItem, ExtensionType.Doubleclick);
54
+ }, 150);
55
+ }
56
+ }
57
+ _formatSelection(type) {
58
+ if (this._blurTimeout)
59
+ clearTimeout(this._blurTimeout);
60
+ this._blurTimeout = null;
61
+ const selection = this.designerView.shadowRoot.getSelection();
62
+ console.log(selection);
63
+ switch (type) {
64
+ case 'bold':
65
+ document.execCommand('bold', false, null);
66
+ break;
67
+ }
68
+ this.extendedItem.element.focus();
69
+ }
70
+ }
71
+ EditTextExtension.template = html `
72
+ <div style="height: 24px;">
73
+ <button data-command="bold" style="pointer-events: all; height: 24px; width: 24px; padding: 0; font-weight: 900;">b</button>
74
+ <button data-command="italic" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><em>i</em></button>
75
+ <button data-command="italic" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><ins>u</ins></button>
76
+ <button data-command="italic" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><del>s</del></button>
77
+ </div>
78
+ `;
@@ -0,0 +1,9 @@
1
+ import { IDesignerExtensionProvider } from "../IDesignerExtensionProvider";
2
+ import { IDesignItem } from "../../../../item/IDesignItem";
3
+ import { IDesignerView } from "../../IDesignerView";
4
+ import { IDesignerExtension } from "../IDesignerExtension";
5
+ import { IExtensionManager } from "../IExtensionManger";
6
+ export declare class EditTextExtensionProvider implements IDesignerExtensionProvider {
7
+ shouldExtend(extensionManager: IExtensionManager, designerView: IDesignerView, designItem: IDesignItem): boolean;
8
+ getExtension(extensionManager: IExtensionManager, designerView: IDesignerView, designItem: IDesignItem): IDesignerExtension;
9
+ }
@@ -0,0 +1,11 @@
1
+ import { EditTextExtension } from "./EditTextExtension.js";
2
+ export class EditTextExtensionProvider {
3
+ shouldExtend(extensionManager, designerView, designItem) {
4
+ if (designItem.name === 'button' || designItem.name === 'input')
5
+ return false;
6
+ return true;
7
+ }
8
+ getExtension(extensionManager, designerView, designItem) {
9
+ return new EditTextExtension(extensionManager, designerView, designItem);
10
+ }
11
+ }
@@ -0,0 +1,27 @@
1
+ import { IDesignItem } from "../../../../item/IDesignItem";
2
+ import { IDesignerView } from "../../IDesignerView";
3
+ import { AbstractExtension } from '../AbstractExtension';
4
+ import { IExtensionManager } from "../IExtensionManger";
5
+ export declare class EditTextTinyMceExtension extends AbstractExtension {
6
+ private _contentEditedBound;
7
+ private _blurBound;
8
+ constructor(extensionManager: IExtensionManager, designerView: IDesignerView, extendedItem: IDesignItem);
9
+ tinyMceConfig: {
10
+ target: any;
11
+ menubar: boolean;
12
+ inline: boolean;
13
+ plugins: string[];
14
+ toolbar: string[];
15
+ valid_elements: string;
16
+ valid_styles: {
17
+ '*': string;
18
+ };
19
+ powerpaste_word_import: string;
20
+ powerpaste_html_import: string;
21
+ };
22
+ extend(): void;
23
+ refresh(): void;
24
+ dispose(): void;
25
+ _contentEdited(): void;
26
+ _blur(): void;
27
+ }
@@ -0,0 +1,61 @@
1
+ import { AbstractExtension } from '../AbstractExtension';
2
+ import { ExtensionType } from "../ExtensionType.js";
3
+ export class EditTextTinyMceExtension extends AbstractExtension {
4
+ constructor(extensionManager, designerView, extendedItem) {
5
+ super(extensionManager, designerView, extendedItem);
6
+ this.tinyMceConfig = {
7
+ target: null,
8
+ menubar: false,
9
+ inline: true,
10
+ plugins: [
11
+ 'link',
12
+ 'lists',
13
+ 'powerpaste',
14
+ 'autolink',
15
+ 'tinymcespellchecker'
16
+ ],
17
+ toolbar: [
18
+ 'undo redo | bold italic underline | fontselect fontsizeselect',
19
+ 'forecolor backcolor | alignleft aligncenter alignright alignfull | numlist bullist outdent indent'
20
+ ],
21
+ valid_elements: 'p[style],strong,em,span[style],a[href],ul,ol,li',
22
+ valid_styles: {
23
+ '*': 'font-size,font-family,color,text-decoration,text-align'
24
+ },
25
+ powerpaste_word_import: 'clean',
26
+ powerpaste_html_import: 'clean',
27
+ };
28
+ this._contentEditedBound = this._contentEdited.bind(this);
29
+ this._blurBound = this._blur.bind(this);
30
+ }
31
+ extend() {
32
+ //todo -> check what to do with extensions, do not loose edit on mouse click,...
33
+ //maybe use a html edit framework
34
+ this.extendedItem.instanceServiceContainer.selectionService.clearSelectedElements();
35
+ //this.extensionManager.removeExtension(this.extendedItem, ExtensionType.PrimarySelection);
36
+ //this.extensionManager.removeExtension(this.extendedItem, ExtensionType.Selection);
37
+ this.extendedItem.element.addEventListener('input', this._contentEditedBound);
38
+ this.extendedItem.element.addEventListener('blur', this._blurBound);
39
+ this.extendedItem.element.focus();
40
+ this.designerView.eatEvents = this.extendedItem.element;
41
+ this.tinyMceConfig.target = this.extendedItem.element;
42
+ //@ts-ignore
43
+ tinymce.init(this.tinyMceConfig);
44
+ }
45
+ refresh() {
46
+ this.dispose();
47
+ }
48
+ dispose() {
49
+ this.extendedItem.element.removeEventListener('input', this._contentEditedBound);
50
+ this.extendedItem.element.removeEventListener('blur', this._blurBound);
51
+ //this.designerView.disableKeyboardEvents = false;
52
+ }
53
+ _contentEdited() {
54
+ //todo -> save???
55
+ //this.extendedItem.content = this.extendedItem.element.innerHTML;
56
+ //console.log(this.extendedItem.element.innerHTML)
57
+ }
58
+ _blur() {
59
+ this.extensionManager.removeExtension(this.extendedItem, ExtensionType.Doubleclick);
60
+ }
61
+ }
@@ -0,0 +1,9 @@
1
+ import { IDesignerExtensionProvider } from "../IDesignerExtensionProvider";
2
+ import { IDesignItem } from "../../../../item/IDesignItem";
3
+ import { IDesignerView } from "../../IDesignerView";
4
+ import { IDesignerExtension } from "../IDesignerExtension";
5
+ import { IExtensionManager } from "../IExtensionManger";
6
+ export declare class EditTextTinyMceExtensionProvider implements IDesignerExtensionProvider {
7
+ shouldExtend(extensionManager: IExtensionManager, designerView: IDesignerView, designItem: IDesignItem): boolean;
8
+ getExtension(extensionManager: IExtensionManager, designerView: IDesignerView, designItem: IDesignItem): IDesignerExtension;
9
+ }
@@ -0,0 +1,9 @@
1
+ import { EditTextTinyMceExtension } from "./EditTextTinyMceExtension.js";
2
+ export class EditTextTinyMceExtensionProvider {
3
+ shouldExtend(extensionManager, designerView, designItem) {
4
+ return true;
5
+ }
6
+ getExtension(extensionManager, designerView, designItem) {
7
+ return new EditTextTinyMceExtension(extensionManager, designerView, designItem);
8
+ }
9
+ }
@@ -13,5 +13,9 @@ export declare enum ExtensionType {
13
13
  /**
14
14
  * Extension for the Current Container wich the dragged element is contained.
15
15
  */
16
- ContainerDrag = 256
16
+ ContainerDrag = 256,
17
+ /**
18
+ * Extension for the Current Container wich the dragged element is contained.
19
+ */
20
+ Doubleclick = 512
17
21
  }
@@ -15,4 +15,8 @@ export var ExtensionType;
15
15
  * Extension for the Current Container wich the dragged element is contained.
16
16
  */
17
17
  ExtensionType[ExtensionType["ContainerDrag"] = 256] = "ContainerDrag";
18
+ /**
19
+ * Extension for the Current Container wich the dragged element is contained.
20
+ */
21
+ ExtensionType[ExtensionType["Doubleclick"] = 512] = "Doubleclick";
18
22
  })(ExtensionType || (ExtensionType = {}));
@@ -1,4 +1,5 @@
1
1
  import { AbstractExtension } from "./AbstractExtension";
2
+ import { OverlayLayer } from "./OverlayLayer.js";
2
3
  export class GridExtension extends AbstractExtension {
3
4
  constructor(extensionManager, designerView, extendedItem) {
4
5
  super(extensionManager, designerView, extendedItem);
@@ -83,21 +84,21 @@ export class GridExtension extends AbstractExtension {
83
84
  for (let yIdx = 0; yIdx < columns.length; yIdx++) {
84
85
  const c = columns[yIdx];
85
86
  if (x > 0 && xGap) {
86
- this._drawRect(x + xOffset, y + yOffset, xGap, currY, 'svg-grid-gap');
87
+ this._drawRect(x + xOffset, y + yOffset, xGap, currY, 'svg-grid-gap', null, OverlayLayer.Background);
87
88
  x += xGap;
88
89
  }
89
90
  const currX = Number.parseFloat(c.replace('px', ''));
90
91
  if (y > 0 && yGap) {
91
- this._drawRect(x + xOffset, y + yOffset - yGap, currX, yGap, 'svg-grid-gap');
92
+ this._drawRect(x + xOffset, y + yOffset - yGap, currX, yGap, 'svg-grid-gap', null, OverlayLayer.Background);
92
93
  }
93
94
  if (areas) {
94
95
  const nm = areas[cl].trim();
95
96
  if (nm != '.') {
96
- const text = this._drawText(nm, x + xOffset, y + yOffset, 'svg-grid-area');
97
+ const text = this._drawText(nm, x + xOffset, y + yOffset, 'svg-grid-area', null, OverlayLayer.Background);
97
98
  text.setAttribute("dominant-baseline", "hanging");
98
99
  }
99
100
  }
100
- this._drawRect(x + xOffset, y + yOffset, currX, currY, 'svg-grid');
101
+ this._drawRect(x + xOffset, y + yOffset, currX, currY, 'svg-grid', null, OverlayLayer.Background);
101
102
  x += currX;
102
103
  cl++;
103
104
  }
@@ -27,7 +27,7 @@ export class RotateExtension extends AbstractExtension {
27
27
  g.addEventListener(EventNames.PointerUp, event => this._pointerActionTypeRotate(event));
28
28
  g.setAttribute('class', 'svg-selection svg-primary-rotate');
29
29
  g.setAttribute('transform', 'translate(' + (itemRect.x - this.designerView.containerBoundingRect.x - 13) + ',' + (itemRect.y - this.designerView.containerBoundingRect.y - 8.5) + ')');
30
- this.overlayLayerView.appendChild(g);
30
+ this.overlayLayerView.addOverlay(g);
31
31
  this.overlays.push(g);
32
32
  }
33
33
  _pointerActionTypeRotate(event) {
@@ -1,7 +1,7 @@
1
- import { BaseCustomWebComponentLazyAppend } from '@node-projects/base-custom-webcomponent';
1
+ import { BaseCustomWebComponentConstructorAppend } from '@node-projects/base-custom-webcomponent';
2
2
  import { OverlayLayer } from './extensions/OverlayLayer.js';
3
3
  import { ServiceContainer } from '../../services/ServiceContainer';
4
- export declare class OverlayLayerView extends BaseCustomWebComponentLazyAppend {
4
+ export declare class OverlayLayerView extends BaseCustomWebComponentConstructorAppend {
5
5
  static readonly template: HTMLTemplateElement;
6
6
  static readonly style: CSSStyleSheet;
7
7
  static readonly is = "node-projects-overlay-layer-view";
@@ -1,6 +1,6 @@
1
- import { BaseCustomWebComponentLazyAppend, css, html } from '@node-projects/base-custom-webcomponent';
1
+ import { css, html, BaseCustomWebComponentConstructorAppend } from '@node-projects/base-custom-webcomponent';
2
2
  import { OverlayLayer } from './extensions/OverlayLayer.js';
3
- export class OverlayLayerView extends BaseCustomWebComponentLazyAppend {
3
+ export class OverlayLayerView extends BaseCustomWebComponentConstructorAppend {
4
4
  constructor(serviceContainer) {
5
5
  super();
6
6
  this._serviceContainer = serviceContainer;
@@ -62,6 +62,7 @@ OverlayLayerView.style = css `
62
62
  svg {
63
63
  width: 100%;
64
64
  height: 100%;
65
+ overflow: visible;
65
66
  }
66
67
 
67
68
  .svg-snapline { stroke: purple; stroke-dasharray: 4; fill: transparent; }
@@ -3,9 +3,13 @@ export declare enum EventNames {
3
3
  PointerMove = "pointermove",
4
4
  PointerUp = "pointerup",
5
5
  DragEnter = "dragenter",
6
+ DragLeave = "dragleave",
6
7
  DragOver = "dragover",
7
8
  Drop = "drop",
8
9
  Scroll = "scroll",
9
10
  Wheel = "wheel",
10
- ContextMenu = "contextmenu"
11
+ ContextMenu = "contextmenu",
12
+ KeyDown = "keydown",
13
+ KeyUp = "keyup",
14
+ DblClick = "dblclick"
11
15
  }
@@ -4,9 +4,13 @@ export var EventNames;
4
4
  EventNames["PointerMove"] = "pointermove";
5
5
  EventNames["PointerUp"] = "pointerup";
6
6
  EventNames["DragEnter"] = "dragenter";
7
+ EventNames["DragLeave"] = "dragleave";
7
8
  EventNames["DragOver"] = "dragover";
8
9
  EventNames["Drop"] = "drop";
9
10
  EventNames["Scroll"] = "scroll";
10
11
  EventNames["Wheel"] = "wheel";
11
12
  EventNames["ContextMenu"] = "contextmenu";
13
+ EventNames["KeyDown"] = "keydown";
14
+ EventNames["KeyUp"] = "keyup";
15
+ EventNames["DblClick"] = "dblclick";
12
16
  })(EventNames || (EventNames = {}));
package/dist/index.d.ts CHANGED
@@ -17,12 +17,18 @@ export * from "./elements/services/bindableObjectsService/BindableObjectType.js"
17
17
  export type { IBindableObject } from "./elements/services/bindableObjectsService/IBindableObject.js";
18
18
  export type { IBindableObjectsService } from "./elements/services/bindableObjectsService/IBindableObjectsService.js";
19
19
  export * from "./elements/services/placementService/DefaultPlacementService.js";
20
+ export * from "./elements/services/placementService/FlexBoxPlacementService.js";
21
+ export * from "./elements/services/placementService/GridPlacementService.js";
20
22
  export type { IPlacementService } from "./elements/services/placementService/IPlacementService.js";
23
+ export * from "./elements/services/placementService/SnaplinesProviderService.js";
24
+ export type { ISnaplinesProviderService } from "./elements/services/placementService/ISnaplinesProviderService.js";
21
25
  export * from "./elements/services/elementAtPointService/ElementAtPointService.js";
22
26
  export type { IElementAtPointService } from "./elements/services/elementAtPointService/IElementAtPointService.js";
23
27
  export * from "./elements/services/contentService/ContentService.js";
24
28
  export type { IContentChanged } from "./elements/services/contentService/IContentChanged.js";
25
29
  export type { IContentService } from "./elements/services/contentService/IContentService.js";
30
+ export * from "./elements/services/dragDropService/DragDropService.js";
31
+ export type { IDragDropService } from "./elements/services/dragDropService/IDragDropService.js";
26
32
  export type { IElementDefinition } from "./elements/services/elementsService/IElementDefinition.js";
27
33
  export type { IElementsJson } from "./elements/services/elementsService/IElementsJson.js";
28
34
  export type { IElementsService } from "./elements/services/elementsService/IElementsService.js";
@@ -36,6 +42,8 @@ export type { IHtmlParserService } from "./elements/services/htmlParserService/I
36
42
  export type { IIntializationService } from "./elements/services/initializationService/IIntializationService.js";
37
43
  export * from "./elements/services/instanceService/DefaultInstanceService.js";
38
44
  export type { IInstanceService } from "./elements/services/instanceService/IInstanceService.js";
45
+ export * from "./elements/services/instanceService/PrepareElementsForDesignerService.js";
46
+ export type { IPrepareElementsForDesignerService } from "./elements/services/instanceService/IPrepareElementsForDesignerService.js";
39
47
  export * from "./elements/services/propertiesService/DefaultEditorTypesService.js";
40
48
  export type { IEditorTypesService } from "./elements/services/propertiesService/IEditorTypesService.js";
41
49
  export type { IPropertiesService } from "./elements/services/propertiesService/IPropertiesService.js";