@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.
- package/dist/elements/documentContainer.js +1 -0
- package/dist/elements/helper/XmlHelper.d.ts +2 -0
- package/dist/elements/helper/XmlHelper.js +16 -0
- package/dist/elements/item/DesignItem.d.ts +1 -0
- package/dist/elements/item/DesignItem.js +36 -27
- package/dist/elements/item/IDesignItem.d.ts +1 -0
- package/dist/elements/services/DefaultServiceBootstrap.js +12 -0
- package/dist/elements/services/ServiceContainer.d.ts +9 -0
- package/dist/elements/services/ServiceContainer.js +9 -0
- package/dist/elements/services/dragDropService/DragDropService.d.ts +6 -0
- package/dist/elements/services/dragDropService/DragDropService.js +28 -0
- package/dist/elements/services/dragDropService/IDragDropService.d.ts +5 -0
- package/dist/elements/{loader/ICustomElementsManifest.js → services/dragDropService/IDragDropService.js} +0 -0
- package/dist/elements/services/instanceService/DefaultInstanceService.js +20 -16
- package/dist/elements/services/instanceService/IPrepareElementsForDesignerService.d.ts +4 -0
- package/dist/elements/{loader/IOldCustomElementsManifest copy.js → services/instanceService/IPrepareElementsForDesignerService.js} +0 -0
- package/dist/elements/services/instanceService/PrepareElementsForDesignerService.d.ts +6 -0
- package/dist/elements/services/instanceService/PrepareElementsForDesignerService.js +23 -0
- package/dist/elements/services/placementService/DefaultPlacementService.js +2 -1
- package/dist/elements/services/placementService/ISnaplinesProviderService.d.ts +11 -0
- package/dist/elements/services/placementService/ISnaplinesProviderService.js +1 -0
- package/dist/elements/services/placementService/SnaplinesProviderService.d.ts +11 -0
- package/dist/elements/services/placementService/SnaplinesProviderService.js +36 -0
- package/dist/elements/services/propertiesService/services/AbstractBasePropertiesService.js +1 -1
- package/dist/elements/services/undoService/transactionItems/AttributeChangeAction.js +24 -4
- package/dist/elements/services/undoService/transactionItems/InsertAction.js +3 -0
- package/dist/elements/widgets/designerView/IDesignerView.d.ts +1 -0
- package/dist/elements/widgets/designerView/Snaplines.js +6 -25
- package/dist/elements/widgets/designerView/designerView.d.ts +4 -2
- package/dist/elements/widgets/designerView/designerView.js +58 -29
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextCkEditorExtension.d.ts +14 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextCkEditorExtension.js +42 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextCkEditorExtensionProvider.d.ts +9 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextCkEditorExtensionProvider.js +9 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension.d.ts +17 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension.js +78 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider.d.ts +9 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider.js +11 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextTinyMceExtension.d.ts +27 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextTinyMceExtension.js +61 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextTinyMceExtensionProvider.d.ts +9 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextTinyMceExtensionProvider.js +9 -0
- package/dist/elements/widgets/designerView/extensions/ExtensionType.d.ts +5 -1
- package/dist/elements/widgets/designerView/extensions/ExtensionType.js +4 -0
- package/dist/elements/widgets/designerView/extensions/GridExtension.js +5 -4
- package/dist/elements/widgets/designerView/extensions/RotateExtension.js +1 -1
- package/dist/elements/widgets/designerView/overlayLayerView.d.ts +2 -2
- package/dist/elements/widgets/designerView/overlayLayerView.js +3 -2
- package/dist/enums/EventNames.d.ts +5 -1
- package/dist/enums/EventNames.js +4 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +5 -0
- package/package.json +10 -10
- package/dist/elements/loader/CustomElementsManifestLoader.d.ts +0 -8
- package/dist/elements/loader/CustomElementsManifestLoader.js +0 -45
- package/dist/elements/loader/ICustomElementsManifest.d.ts +0 -24
- package/dist/elements/loader/IOldCustomElementsManifest copy.d.ts +0 -24
- package/dist/elements/loader/OldCustomElementsManifestLoader copy.d.ts +0 -8
- package/dist/elements/loader/OldCustomElementsManifestLoader copy.js +0 -45
- package/dist/elements/widgets/designerView/extensions/ExtensionLayer.d.ts +0 -5
- 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(
|
|
236
|
-
this._canvas.addEventListener(
|
|
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
|
-
|
|
283
|
-
|
|
284
|
-
|
|
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.
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
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
|
+
}
|
package/dist/elements/widgets/designerView/extensions/EditText/EditTextCkEditorExtensionProvider.js
ADDED
|
@@ -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
|
+
}
|
package/dist/elements/widgets/designerView/extensions/EditText/EditTextTinyMceExtensionProvider.d.ts
ADDED
|
@@ -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
|
+
}
|
package/dist/elements/widgets/designerView/extensions/EditText/EditTextTinyMceExtensionProvider.js
ADDED
|
@@ -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.
|
|
30
|
+
this.overlayLayerView.addOverlay(g);
|
|
31
31
|
this.overlays.push(g);
|
|
32
32
|
}
|
|
33
33
|
_pointerActionTypeRotate(event) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
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
|
|
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 {
|
|
1
|
+
import { css, html, BaseCustomWebComponentConstructorAppend } from '@node-projects/base-custom-webcomponent';
|
|
2
2
|
import { OverlayLayer } from './extensions/OverlayLayer.js';
|
|
3
|
-
export class OverlayLayerView extends
|
|
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
|
}
|
package/dist/enums/EventNames.js
CHANGED
|
@@ -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";
|