@node-projects/web-component-designer 0.0.17 → 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 (56) hide show
  1. package/dist/elements/documentContainer.js +1 -0
  2. package/dist/elements/item/DesignItem.d.ts +1 -0
  3. package/dist/elements/item/DesignItem.js +36 -27
  4. package/dist/elements/item/IDesignItem.d.ts +1 -0
  5. package/dist/elements/services/DefaultServiceBootstrap.js +8 -0
  6. package/dist/elements/services/ServiceContainer.d.ts +6 -0
  7. package/dist/elements/services/ServiceContainer.js +6 -0
  8. package/dist/elements/services/dragDropService/DragDropService.d.ts +6 -0
  9. package/dist/elements/services/dragDropService/DragDropService.js +28 -0
  10. package/dist/elements/services/dragDropService/IDragDropService.d.ts +5 -0
  11. package/dist/elements/{loader/ICustomElementsManifest.js → services/dragDropService/IDragDropService.js} +0 -0
  12. package/dist/elements/services/instanceService/IPrepareElementsForDesignerService.d.ts +4 -0
  13. package/dist/elements/{loader/IOldCustomElementsManifest copy.js → services/instanceService/IPrepareElementsForDesignerService.js} +0 -0
  14. package/dist/elements/services/instanceService/PrepareElementsForDesignerService.d.ts +6 -0
  15. package/dist/elements/services/instanceService/PrepareElementsForDesignerService.js +23 -0
  16. package/dist/elements/services/placementService/GridPlacementService.js +2 -2
  17. package/dist/elements/services/undoService/transactionItems/InsertAction.js +3 -0
  18. package/dist/elements/widgets/designerView/IDesignerView.d.ts +1 -0
  19. package/dist/elements/widgets/designerView/designerView.d.ts +4 -2
  20. package/dist/elements/widgets/designerView/designerView.js +58 -29
  21. package/dist/elements/widgets/designerView/extensions/EditText/EditTextCkEditorExtension.d.ts +14 -0
  22. package/dist/elements/widgets/designerView/extensions/EditText/EditTextCkEditorExtension.js +42 -0
  23. package/dist/elements/widgets/designerView/extensions/EditText/EditTextCkEditorExtensionProvider.d.ts +9 -0
  24. package/dist/elements/widgets/designerView/extensions/EditText/EditTextCkEditorExtensionProvider.js +9 -0
  25. package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension.d.ts +17 -0
  26. package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension.js +78 -0
  27. package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider.d.ts +9 -0
  28. package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider.js +11 -0
  29. package/dist/elements/widgets/designerView/extensions/EditText/EditTextTinyMceExtension.d.ts +27 -0
  30. package/dist/elements/widgets/designerView/extensions/EditText/EditTextTinyMceExtension.js +61 -0
  31. package/dist/elements/widgets/designerView/extensions/EditText/EditTextTinyMceExtensionProvider.d.ts +9 -0
  32. package/dist/elements/widgets/designerView/extensions/EditText/EditTextTinyMceExtensionProvider.js +9 -0
  33. package/dist/elements/widgets/designerView/extensions/ExtensionType.d.ts +5 -1
  34. package/dist/elements/widgets/designerView/extensions/ExtensionType.js +4 -0
  35. package/dist/elements/widgets/designerView/extensions/RotateExtension.js +1 -1
  36. package/dist/elements/widgets/designerView/overlayLayerView.d.ts +2 -2
  37. package/dist/elements/widgets/designerView/overlayLayerView.js +3 -2
  38. package/dist/enums/EventNames.d.ts +5 -1
  39. package/dist/enums/EventNames.js +4 -0
  40. package/dist/index.d.ts +4 -0
  41. package/dist/index.js +2 -0
  42. package/package.json +1 -1
  43. package/dist/elements/loader/CustomElementsManifestLoader.d.ts +0 -8
  44. package/dist/elements/loader/CustomElementsManifestLoader.js +0 -45
  45. package/dist/elements/loader/ICustomElementsManifest.d.ts +0 -24
  46. package/dist/elements/loader/IOldCustomElementsManifest copy.d.ts +0 -24
  47. package/dist/elements/loader/OldCustomElementsManifestLoader copy.d.ts +0 -8
  48. package/dist/elements/loader/OldCustomElementsManifestLoader copy.js +0 -45
  49. package/dist/elements/services/placementService/DefaultPlacementService copy.d.ts +0 -17
  50. package/dist/elements/services/placementService/DefaultPlacementService copy.js +0 -103
  51. package/dist/elements/services/placementService/IPlacementService copy.d.ts +0 -16
  52. package/dist/elements/services/placementService/IPlacementService copy.js +0 -1
  53. package/dist/elements/services/placementService/ISnaplinesService.d.ts +0 -16
  54. package/dist/elements/services/placementService/ISnaplinesService.js +0 -1
  55. package/dist/elements/widgets/designerView/extensions/ExtensionLayer.d.ts +0 -5
  56. package/dist/elements/widgets/designerView/extensions/ExtensionLayer.js +0 -6
@@ -12,6 +12,7 @@ export class DocumentContainer extends BaseCustomWebComponentLazyAppend {
12
12
  this._tabControl = new DesignerTabControl();
13
13
  div.appendChild(this._tabControl);
14
14
  this.designerView = new DesignerView();
15
+ this.designerView.setAttribute('exportparts', 'canvas');
15
16
  this.designerView.title = 'Designer';
16
17
  this._tabControl.appendChild(this.designerView);
17
18
  this.designerView.initialize(this._serviceContainer);
@@ -44,6 +44,7 @@ export declare class DesignItem implements IDesignItem {
44
44
  get lockAtDesignTime(): boolean;
45
45
  set lockAtDesignTime(value: boolean);
46
46
  static createDesignItemFromInstance(node: Node, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer): DesignItem;
47
+ updateChildrenFromNodesChildren(): void;
47
48
  constructor(node: Node, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer);
48
49
  openGroup(title: string, affectedItems?: IDesignItem[]): ChangeGroup;
49
50
  getOrCreateDesignItem(node: Node): IDesignItem;
@@ -93,6 +93,7 @@ export class DesignItem {
93
93
  this._childArray = [];
94
94
  DomHelper.removeAllChildnodes(this.element);
95
95
  }
96
+ //abstract text content to own property. so only chnage via designer api will use it.
96
97
  get hasContent() {
97
98
  return this.nodeType == NodeType.TextNode || (this._childArray.length === 0 && this.content !== null);
98
99
  }
@@ -154,37 +155,45 @@ export class DesignItem {
154
155
  }
155
156
  static createDesignItemFromInstance(node, serviceContainer, instanceServiceContainer) {
156
157
  let designItem = new DesignItem(node, serviceContainer, instanceServiceContainer);
157
- for (let a of designItem.element.attributes) {
158
- if (a.name !== 'style') {
159
- designItem.attributes.set(a.name, a.value);
160
- if (a.name === hideAtDesignTimeAttributeName)
161
- designItem._hideAtDesignTime = true;
162
- if (a.name === hideAtRunTimeAttributeName)
163
- designItem._hideAtRunTime = true;
164
- if (a.name === lockAtDesignTimeAttributeName)
165
- designItem._lockAtDesignTime = true;
158
+ if (designItem.nodeType == NodeType.Element) {
159
+ for (let a of designItem.element.attributes) {
160
+ if (a.name !== 'style') {
161
+ designItem.attributes.set(a.name, a.value);
162
+ if (a.name === hideAtDesignTimeAttributeName)
163
+ designItem._hideAtDesignTime = true;
164
+ if (a.name === hideAtRunTimeAttributeName)
165
+ designItem._hideAtRunTime = true;
166
+ if (a.name === lockAtDesignTimeAttributeName)
167
+ designItem._lockAtDesignTime = true;
168
+ }
169
+ if (node instanceof HTMLElement || node instanceof SVGElement) {
170
+ for (let s of node.style) {
171
+ let val = node.style[s];
172
+ if (val && typeof val === 'string')
173
+ designItem.styles.set(s, node.style[s]);
174
+ }
175
+ if (!designItem._lockAtDesignTime)
176
+ node.style.pointerEvents = 'auto';
177
+ else
178
+ node.style.pointerEvents = 'none';
179
+ //node.style.cursor = 'pointer';
180
+ }
181
+ node.draggable = false; //even if it should be true, for better designer exp.
166
182
  }
167
183
  }
168
- if (node instanceof HTMLElement || node instanceof SVGElement) {
169
- for (let s of node.style) {
170
- let val = node.style[s];
171
- if (val && typeof val === 'string')
172
- designItem.styles.set(s, node.style[s]);
184
+ designItem.updateChildrenFromNodesChildren();
185
+ return designItem;
186
+ }
187
+ updateChildrenFromNodesChildren() {
188
+ this._childArray = [];
189
+ if (this.nodeType == NodeType.Element) {
190
+ if (this.element.children && this.element.children.length === 0 && this.element.childNodes.length <= 1)
191
+ this.content = this.element.textContent; //was soll das bringen???
192
+ else {
193
+ for (const c of this.element.childNodes)
194
+ this._childArray.push(DesignItem.createDesignItemFromInstance(c, this.serviceContainer, this.instanceServiceContainer));
173
195
  }
174
- if (!designItem._lockAtDesignTime)
175
- node.style.pointerEvents = 'auto';
176
- else
177
- node.style.pointerEvents = 'none';
178
- //node.style.cursor = 'pointer';
179
196
  }
180
- node.draggable = false; //even if it should be true, for better designer exp.
181
- if (designItem.element.children.length === 0)
182
- designItem.content = designItem.element.textContent;
183
- else {
184
- for (const c of designItem.element.children)
185
- designItem._childArray.push(DesignItem.createDesignItemFromInstance(c, serviceContainer, instanceServiceContainer));
186
- }
187
- return designItem;
188
197
  }
189
198
  openGroup(title, affectedItems) {
190
199
  return this.instanceServiceContainer.undoService.openGroup(title, affectedItems);
@@ -23,6 +23,7 @@ export interface IDesignItem {
23
23
  removeChild(designItem: IDesignItem): any;
24
24
  remove(): any;
25
25
  clearChildren(): any;
26
+ updateChildrenFromNodesChildren(): any;
26
27
  readonly hasContent: boolean;
27
28
  content: string;
28
29
  readonly node: Node;
@@ -41,6 +41,9 @@ import { GridPlacementService } from './placementService/GridPlacementService.js
41
41
  import { ElementAtPointService } from './elementAtPointService/ElementAtPointService';
42
42
  import { FlexBoxPlacementService } from './placementService/FlexBoxPlacementService';
43
43
  import { SnaplinesProviderService } from './placementService/SnaplinesProviderService';
44
+ import { PrepareElementsForDesignerService } from './instanceService/PrepareElementsForDesignerService';
45
+ import { DragDropService } from './dragDropService/DragDropService';
46
+ import { EditTextExtensionProvider } from '../widgets/designerView/extensions/EditText/EditTextExtensionProvider.js';
44
47
  export function createDefaultServiceContainer() {
45
48
  let serviceContainer = new ServiceContainer();
46
49
  serviceContainer.register("propertyService", new PolymerPropertiesService());
@@ -58,6 +61,8 @@ export function createDefaultServiceContainer() {
58
61
  serviceContainer.register("htmlParserService", new DefaultHtmlParserService());
59
62
  serviceContainer.register("bindingService", new PolymerBindingsService());
60
63
  serviceContainer.register("elementAtPointService", new ElementAtPointService());
64
+ serviceContainer.register("prepareElementsForDesignerService", new PrepareElementsForDesignerService());
65
+ serviceContainer.register("dragDropService", new DragDropService());
61
66
  serviceContainer.designerExtensions.set(ExtensionType.Permanent, [
62
67
  new ResizeExtensionProvider(false),
63
68
  new InvisibleDivExtensionProvider()
@@ -87,6 +92,9 @@ export function createDefaultServiceContainer() {
87
92
  serviceContainer.designerExtensions.set(ExtensionType.ContainerDragOver, [
88
93
  new AltToEnterContainerExtensionProvider()
89
94
  ]);
95
+ serviceContainer.designerExtensions.set(ExtensionType.Doubleclick, [
96
+ new EditTextExtensionProvider()
97
+ ]);
90
98
  serviceContainer.designerTools.set(NamedTools.Pointer, new PointerTool());
91
99
  serviceContainer.designerTools.set(NamedTools.DrawSelection, new RectangleSelectorTool());
92
100
  serviceContainer.designerTools.set(NamedTools.DrawPath, new DrawPathTool());
@@ -18,6 +18,8 @@ import { GlobalContext } from './GlobalContext';
18
18
  import { IBindingService } from "./bindingsService/IBindingService";
19
19
  import { IElementAtPointService } from './elementAtPointService/IElementAtPointService';
20
20
  import { ISnaplinesProviderService } from "./placementService/ISnaplinesProviderService.js";
21
+ import { IPrepareElementsForDesignerService } from './instanceService/IPrepareElementsForDesignerService';
22
+ import { IDragDropService } from './dragDropService/IDragDropService';
21
23
  interface ServiceNameMap {
22
24
  "propertyService": IPropertiesService;
23
25
  "containerService": IPlacementService;
@@ -30,6 +32,8 @@ interface ServiceNameMap {
30
32
  "intializationService": IIntializationService;
31
33
  "bindingService": IBindingService;
32
34
  "elementAtPointService": IElementAtPointService;
35
+ "prepareElementsForDesignerService": IPrepareElementsForDesignerService;
36
+ "dragDropService": IDragDropService;
33
37
  }
34
38
  export declare class ServiceContainer extends BaseServiceContainer<ServiceNameMap> {
35
39
  readonly config: {
@@ -51,5 +55,7 @@ export declare class ServiceContainer extends BaseServiceContainer<ServiceNameMa
51
55
  get htmlParserService(): IHtmlParserService;
52
56
  get intializationService(): IIntializationService;
53
57
  get elementAtPointService(): IElementAtPointService;
58
+ get prepareElementsForDesignerService(): IPrepareElementsForDesignerService;
59
+ get dragDropService(): IDragDropService;
54
60
  }
55
61
  export {};
@@ -46,4 +46,10 @@ export class ServiceContainer extends BaseServiceContainer {
46
46
  get elementAtPointService() {
47
47
  return this.getLastService('elementAtPointService');
48
48
  }
49
+ get prepareElementsForDesignerService() {
50
+ return this.getLastService('prepareElementsForDesignerService');
51
+ }
52
+ get dragDropService() {
53
+ return this.getLastService('dragDropService');
54
+ }
49
55
  }
@@ -0,0 +1,6 @@
1
+ import { IDesignerView } from "../../widgets/designerView/IDesignerView.js";
2
+ import { IDragDropService } from "./IDragDropService.js";
3
+ export declare class DragDropService implements IDragDropService {
4
+ dragOver(event: DragEvent): 'none' | 'copy' | 'link' | 'move';
5
+ drop(designerView: IDesignerView, event: DragEvent): void;
6
+ }
@@ -0,0 +1,28 @@
1
+ import { DesignItem } from '../../item/DesignItem';
2
+ import { InsertAction } from "../undoService/transactionItems/InsertAction.js";
3
+ export class DragDropService {
4
+ dragOver(event) {
5
+ if (event.dataTransfer.items[0].type.startsWith('image/'))
6
+ return 'copy';
7
+ return 'none';
8
+ }
9
+ drop(designerView, event) {
10
+ if (event.dataTransfer.files[0].type.startsWith('image/')) {
11
+ let reader = new FileReader();
12
+ reader.onloadend = () => {
13
+ const img = document.createElement('img');
14
+ img.src = reader.result;
15
+ const di = DesignItem.createDesignItemFromInstance(img, designerView.serviceContainer, designerView.instanceServiceContainer);
16
+ let grp = di.openGroup("Insert");
17
+ di.setStyle('position', 'absolute');
18
+ const targetRect = event.target.getBoundingClientRect();
19
+ di.setStyle('top', event.offsetY + targetRect.top - designerView.containerBoundingRect.y + 'px');
20
+ di.setStyle('left', event.offsetX + targetRect.left - designerView.containerBoundingRect.x + 'px');
21
+ designerView.instanceServiceContainer.undoService.execute(new InsertAction(designerView.rootDesignItem, designerView.rootDesignItem.childCount, di));
22
+ grp.commit();
23
+ requestAnimationFrame(() => designerView.instanceServiceContainer.selectionService.setSelectedElements([di]));
24
+ };
25
+ reader.readAsDataURL(event.dataTransfer.files[0]);
26
+ }
27
+ }
28
+ }
@@ -0,0 +1,5 @@
1
+ import { IDesignerView } from "../../widgets/designerView/IDesignerView.js";
2
+ export interface IDragDropService {
3
+ dragOver(event: DragEvent): 'none' | 'copy' | 'link' | 'move';
4
+ drop(designerView: IDesignerView, event: DragEvent): any;
5
+ }
@@ -0,0 +1,4 @@
1
+ import { IDesignItem } from "../../item/IDesignItem.js";
2
+ export interface IPrepareElementsForDesignerService {
3
+ prepareElementsForDesigner(designItem: IDesignItem): any;
4
+ }
@@ -0,0 +1,6 @@
1
+ import { IDesignItem } from "../../item/IDesignItem.js";
2
+ import { IPrepareElementsForDesignerService } from "./IPrepareElementsForDesignerService.js";
3
+ export declare class PrepareElementsForDesignerService implements IPrepareElementsForDesignerService {
4
+ prepareElementsForDesigner(designItem: IDesignItem): void;
5
+ private _prepareElementsForDesigner;
6
+ }
@@ -0,0 +1,23 @@
1
+ export class PrepareElementsForDesignerService {
2
+ prepareElementsForDesigner(designItem) {
3
+ this._prepareElementsForDesigner([designItem.element]);
4
+ }
5
+ _prepareElementsForDesigner(elements) {
6
+ for (let el of elements) {
7
+ if (el.shadowRoot) {
8
+ this._prepareElementsForDesigner((el.shadowRoot).querySelectorAll('*'));
9
+ }
10
+ if (el instanceof HTMLImageElement) {
11
+ el.draggable = false;
12
+ }
13
+ else if (el instanceof HTMLInputElement) {
14
+ el.onmousedown = (e) => e.preventDefault();
15
+ //const ip = el;
16
+ //el.onclick = (e) => { if (ip.type == 'checkbox') ip.checked = !ip.checked };
17
+ }
18
+ else if (el instanceof HTMLSelectElement) {
19
+ el.onmousedown = (e) => e.preventDefault();
20
+ }
21
+ }
22
+ }
23
+ }
@@ -4,8 +4,8 @@ export class GridPlacementService {
4
4
  leaveContainer(container, items) {
5
5
  }
6
6
  serviceForContainer(container) {
7
- /*if ((<HTMLElement>container.element).style.display == 'grid' || (<HTMLElement>container.element).style.display == 'inline-grid')
8
- return true;*/
7
+ if (container.element.style.display == 'grid' || container.element.style.display == 'inline-grid')
8
+ return true;
9
9
  return false;
10
10
  }
11
11
  canEnter(container, items) {
@@ -13,6 +13,9 @@ export class InsertAction {
13
13
  }
14
14
  do() {
15
15
  this.designItem.insertChild(this.newItem, this.index);
16
+ const prepService = this.designItem.serviceContainer.prepareElementsForDesignerService;
17
+ if (prepService)
18
+ requestAnimationFrame(() => prepService.prepareElementsForDesigner(this.newItem));
16
19
  }
17
20
  mergeWith(other) {
18
21
  return false;
@@ -20,6 +20,7 @@ export interface IDesignerView extends IPlacementView, IUiCommandHandler {
20
20
  readonly shadowRoot: ShadowRoot;
21
21
  readonly alignOnGrid: boolean;
22
22
  readonly alignOnSnap: boolean;
23
+ eatEvents: Element;
23
24
  initialize(serviceContainer: ServiceContainer): any;
24
25
  getDesignerMousepoint(event: MouseEvent, target: Element, startPoint?: IDesignerMousePoint): IDesignerMousePoint;
25
26
  getElementAtPoint(point: IPoint, ignoreElementCallback?: (element: HTMLElement) => boolean): any;
@@ -25,6 +25,7 @@ export declare class DesignerView extends BaseCustomWebComponentLazyAppend imple
25
25
  snapLines: Snaplines;
26
26
  overlayLayer: OverlayLayerView;
27
27
  rootDesignItem: IDesignItem;
28
+ eatEvents: Element;
28
29
  private _zoomFactor;
29
30
  private _canvas;
30
31
  private _canvasContainer;
@@ -39,6 +40,7 @@ export declare class DesignerView extends BaseCustomWebComponentLazyAppend imple
39
40
  static readonly style: CSSStyleSheet;
40
41
  static readonly template: HTMLTemplateElement;
41
42
  extensionManager: IExtensionManager;
43
+ private _onDblClickBound;
42
44
  constructor();
43
45
  get designerWidth(): string;
44
46
  set designerWidth(value: string);
@@ -60,14 +62,14 @@ export declare class DesignerView extends BaseCustomWebComponentLazyAppend imple
60
62
  parseHTML(html: string): Promise<void>;
61
63
  setDesignItems(designItems: IDesignItem[]): void;
62
64
  private _addDesignItems;
63
- private _removeDraggableOnImages;
64
- private _removeDraggableOnImagesInner;
65
65
  private _onDragEnter;
66
+ private _onDragLeave;
66
67
  private _onDragOver;
67
68
  private _onDrop;
68
69
  private _onWheel;
69
70
  private _onContextMenu;
70
71
  showDesignItemContextMenu(designItem: IDesignItem, event: MouseEvent): ContextMenuHelper;
72
+ private _onDblClick;
71
73
  private onKeyUp;
72
74
  private onKeyDown;
73
75
  getDesignerMousepoint(event: MouseEvent, target: Element, startPoint?: IDesignerMousePoint): IDesignerMousePoint;
@@ -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
+ }