@node-projects/web-component-designer 0.0.86 → 0.0.87
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/helper/ElementHelper.d.ts +1 -0
- package/dist/elements/helper/ElementHelper.js +10 -0
- package/dist/elements/item/DesignItem.d.ts +2 -0
- package/dist/elements/item/DesignItem.js +7 -0
- package/dist/elements/item/IDesignItem.d.ts +1 -0
- package/dist/elements/services/DefaultServiceBootstrap.js +0 -4
- package/dist/elements/services/ServiceContainer.d.ts +1 -3
- package/dist/elements/services/ServiceContainer.js +8 -3
- package/dist/elements/services/htmlParserService/NodeHtmlParserService.js +8 -0
- package/dist/elements/services/initializationService/DefaultIntializationService.js +12 -12
- package/dist/elements/services/instanceService/PrepareElementsForDesignerService.js +23 -23
- package/dist/elements/services/undoService/UndoService.js +1 -0
- package/dist/elements/services/undoService/transactionItems/InsertAction.js +0 -3
- package/dist/elements/widgets/designerView/IDesignerCanvas.d.ts +1 -0
- package/dist/elements/widgets/designerView/designerCanvas.d.ts +1 -0
- package/dist/elements/widgets/designerView/designerCanvas.js +43 -27
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension copy.d.ts +17 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension copy.js +80 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension.js +4 -2
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider copy.d.ts +9 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider copy.js +11 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextWithStyloExtension.d.ts +20 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextWithStyloExtension.js +83 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextWithStyloExtensionProvider.d.ts +10 -0
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextWithStyloExtensionProvider.js +15 -0
- package/dist/elements/widgets/designerView/extensions/PathExtension.js +1 -5
- package/dist/elements/widgets/treeView/treeView.js +1 -0
- package/dist/elements/widgets/treeView/treeViewExtended.js +11 -7
- package/dist/index.d.ts +4 -4
- package/dist/index.js +4 -3
- package/package.json +5 -4
|
@@ -7,3 +7,4 @@ export declare enum ElementDisplayType {
|
|
|
7
7
|
export declare function isInline(element: HTMLElement): boolean;
|
|
8
8
|
export declare function getElementDisplaytype(element: HTMLElement): ElementDisplayType;
|
|
9
9
|
export declare function isEmptyTextNode(node: Node): boolean;
|
|
10
|
+
export declare function getActiveElement(): Element;
|
|
@@ -20,3 +20,13 @@ export function getElementDisplaytype(element) {
|
|
|
20
20
|
export function isEmptyTextNode(node) {
|
|
21
21
|
return node.textContent.trim() == '' && node.textContent.indexOf('\xa0' /* */) < 0;
|
|
22
22
|
}
|
|
23
|
+
export function getActiveElement() {
|
|
24
|
+
let activeElement = document.activeElement;
|
|
25
|
+
let lastActive = null;
|
|
26
|
+
while (activeElement != lastActive) {
|
|
27
|
+
lastActive = activeElement;
|
|
28
|
+
if (activeElement.shadowRoot != null && activeElement.shadowRoot.activeElement)
|
|
29
|
+
activeElement = activeElement.shadowRoot.activeElement;
|
|
30
|
+
}
|
|
31
|
+
return activeElement;
|
|
32
|
+
}
|
|
@@ -39,6 +39,8 @@ export declare class DesignItem implements IDesignItem {
|
|
|
39
39
|
get hasContent(): boolean;
|
|
40
40
|
get content(): string;
|
|
41
41
|
set content(value: string);
|
|
42
|
+
get innerHTML(): string;
|
|
43
|
+
set innerHTML(value: string);
|
|
42
44
|
private _hideAtDesignTime;
|
|
43
45
|
get hideAtDesignTime(): boolean;
|
|
44
46
|
set hideAtDesignTime(value: boolean);
|
|
@@ -114,6 +114,13 @@ export class DesignItem {
|
|
|
114
114
|
set content(value) {
|
|
115
115
|
this.node.textContent = value;
|
|
116
116
|
}
|
|
117
|
+
get innerHTML() {
|
|
118
|
+
return this.element.innerHTML;
|
|
119
|
+
}
|
|
120
|
+
set innerHTML(value) {
|
|
121
|
+
this.element.innerHTML = value;
|
|
122
|
+
this.updateChildrenFromNodesChildren();
|
|
123
|
+
}
|
|
117
124
|
_hideAtDesignTime;
|
|
118
125
|
get hideAtDesignTime() {
|
|
119
126
|
return this._hideAtDesignTime;
|
|
@@ -39,7 +39,6 @@ import { GridPlacementService } from './placementService/GridPlacementService.js
|
|
|
39
39
|
import { ElementAtPointService } from './elementAtPointService/ElementAtPointService';
|
|
40
40
|
import { FlexBoxPlacementService } from './placementService/FlexBoxPlacementService';
|
|
41
41
|
import { SnaplinesProviderService } from './placementService/SnaplinesProviderService';
|
|
42
|
-
import { PrepareElementsForDesignerService } from './instanceService/PrepareElementsForDesignerService';
|
|
43
42
|
import { DragDropService } from './dragDropService/DragDropService';
|
|
44
43
|
import { EditTextExtensionProvider } from '../widgets/designerView/extensions/EditText/EditTextExtensionProvider.js';
|
|
45
44
|
import { CopyPasteService } from './copyPasteService/CopyPasteService';
|
|
@@ -54,7 +53,6 @@ import { DrawLineTool } from '../widgets/designerView/tools/DrawLineTool.js';
|
|
|
54
53
|
import { HtmlWriterService } from './htmlWriterService/HtmlWriterService.js';
|
|
55
54
|
import { RectContextMenu } from '../widgets/designerView/extensions/contextMenu/RectContextMenu.js';
|
|
56
55
|
import { PathContextMenu } from '../widgets/designerView/extensions/contextMenu/PathContextMenu.js';
|
|
57
|
-
import { IframeExtensionProvider } from '../widgets/designerView/extensions/IframeExtensionProvider.js';
|
|
58
56
|
export function createDefaultServiceContainer() {
|
|
59
57
|
let serviceContainer = new ServiceContainer();
|
|
60
58
|
serviceContainer.register("propertyService", new PolymerPropertiesService());
|
|
@@ -71,7 +69,6 @@ export function createDefaultServiceContainer() {
|
|
|
71
69
|
serviceContainer.register("snaplinesProviderService", new SnaplinesProviderService());
|
|
72
70
|
serviceContainer.register("htmlParserService", new DefaultHtmlParserService());
|
|
73
71
|
serviceContainer.register("elementAtPointService", new ElementAtPointService());
|
|
74
|
-
serviceContainer.register("prepareElementsForDesignerService", new PrepareElementsForDesignerService());
|
|
75
72
|
serviceContainer.register("dragDropService", new DragDropService());
|
|
76
73
|
serviceContainer.register("copyPasteService", new CopyPasteService());
|
|
77
74
|
serviceContainer.register("modelCommandService", new DefaultModelCommandService());
|
|
@@ -79,7 +76,6 @@ export function createDefaultServiceContainer() {
|
|
|
79
76
|
serviceContainer.designerExtensions.set(ExtensionType.Permanent, [
|
|
80
77
|
// new ResizeExtensionProvider(false),
|
|
81
78
|
new InvisibleDivExtensionProvider(),
|
|
82
|
-
new IframeExtensionProvider(),
|
|
83
79
|
// new ElementDragTitleExtensionProvider(),
|
|
84
80
|
]);
|
|
85
81
|
serviceContainer.designerExtensions.set(ExtensionType.PrimarySelection, [
|
|
@@ -18,7 +18,6 @@ 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
21
|
import { IDragDropService } from './dragDropService/IDragDropService';
|
|
23
22
|
import { ICopyPasteService } from "./copyPasteService/ICopyPasteService.js";
|
|
24
23
|
import { IDesignerPointerExtensionProvider } from "../widgets/designerView/extensions/pointerExtensions/IDesignerPointerExtensionProvider.js";
|
|
@@ -41,7 +40,6 @@ interface ServiceNameMap {
|
|
|
41
40
|
"bindableObjectsService": IBindableObjectsService;
|
|
42
41
|
"bindableObjectDragDropService": IBindableObjectDragDropService;
|
|
43
42
|
"elementAtPointService": IElementAtPointService;
|
|
44
|
-
"prepareElementsForDesignerService": IPrepareElementsForDesignerService;
|
|
45
43
|
"dragDropService": IDragDropService;
|
|
46
44
|
"copyPasteService": ICopyPasteService;
|
|
47
45
|
"modelCommandService": IModelCommandService;
|
|
@@ -53,6 +51,7 @@ export declare class ServiceContainer extends BaseServiceContainer<ServiceNameMa
|
|
|
53
51
|
demoViewWidget: new (...args: any[]) => IDemoView & HTMLElement;
|
|
54
52
|
};
|
|
55
53
|
readonly designerExtensions: Map<(ExtensionType | string), IDesignerExtensionProvider[]>;
|
|
54
|
+
removeDesignerExtensionOfType(container: (ExtensionType | string), lambda: new (...args: any[]) => IDesignerExtensionProvider): void;
|
|
56
55
|
readonly designViewConfigButtons: IDesignViewConfigButtonsProvider[];
|
|
57
56
|
readonly designerPointerExtensions: IDesignerPointerExtensionProvider[];
|
|
58
57
|
designerContextMenuExtensions: IContextMenuExtension[];
|
|
@@ -71,7 +70,6 @@ export declare class ServiceContainer extends BaseServiceContainer<ServiceNameMa
|
|
|
71
70
|
get htmlParserService(): IHtmlParserService;
|
|
72
71
|
get intializationService(): IIntializationService;
|
|
73
72
|
get elementAtPointService(): IElementAtPointService;
|
|
74
|
-
get prepareElementsForDesignerService(): IPrepareElementsForDesignerService;
|
|
75
73
|
get dragDropService(): IDragDropService;
|
|
76
74
|
get copyPasteService(): ICopyPasteService;
|
|
77
75
|
get modelCommandService(): IModelCommandService;
|
|
@@ -8,6 +8,14 @@ export class ServiceContainer extends BaseServiceContainer {
|
|
|
8
8
|
demoViewWidget: DemoView
|
|
9
9
|
};
|
|
10
10
|
designerExtensions = new Map();
|
|
11
|
+
removeDesignerExtensionOfType(container, lambda) {
|
|
12
|
+
const extContainer = this.designerExtensions.get(container);
|
|
13
|
+
for (let i = 0; i < extContainer.length; i++) {
|
|
14
|
+
if (extContainer[i].constructor === lambda) {
|
|
15
|
+
extContainer.splice(i, 1);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
11
19
|
designViewConfigButtons = [];
|
|
12
20
|
designerPointerExtensions = [];
|
|
13
21
|
designerContextMenuExtensions;
|
|
@@ -52,9 +60,6 @@ export class ServiceContainer extends BaseServiceContainer {
|
|
|
52
60
|
get elementAtPointService() {
|
|
53
61
|
return this.getLastService('elementAtPointService');
|
|
54
62
|
}
|
|
55
|
-
get prepareElementsForDesignerService() {
|
|
56
|
-
return this.getLastService('prepareElementsForDesignerService');
|
|
57
|
-
}
|
|
58
63
|
get dragDropService() {
|
|
59
64
|
return this.getLastService('dragDropService');
|
|
60
65
|
}
|
|
@@ -27,6 +27,7 @@ export class NodeHtmlParserService {
|
|
|
27
27
|
let designItem = null;
|
|
28
28
|
if (item.nodeType == 1) {
|
|
29
29
|
let element;
|
|
30
|
+
let manualCreatedElement = false;
|
|
30
31
|
if (!namespace)
|
|
31
32
|
element = newElementFromString('<' + item.rawTagName + ' ' + item.rawAttrs + '></' + item.rawTagName + '>'); // some custom elements only parse attributes during constructor call
|
|
32
33
|
if (!element) {
|
|
@@ -34,6 +35,7 @@ export class NodeHtmlParserService {
|
|
|
34
35
|
element = document.createElementNS(namespace, item.rawTagName);
|
|
35
36
|
else
|
|
36
37
|
element = document.createElement(item.rawTagName);
|
|
38
|
+
manualCreatedElement = true;
|
|
37
39
|
}
|
|
38
40
|
designItem = new DesignItem(element, serviceContainer, instanceServiceContainer);
|
|
39
41
|
let hideAtDesignTime = false;
|
|
@@ -44,6 +46,9 @@ export class NodeHtmlParserService {
|
|
|
44
46
|
for (let a in attr) {
|
|
45
47
|
if (a !== 'style') {
|
|
46
48
|
designItem.attributes.set(a, attr[a]);
|
|
49
|
+
if (manualCreatedElement) {
|
|
50
|
+
element.setAttribute(a, attr[a]);
|
|
51
|
+
}
|
|
47
52
|
if (a === 'node-projects-hide-at-design-time')
|
|
48
53
|
hideAtDesignTime = true;
|
|
49
54
|
else if (a === 'node-projects-hide-at-run-time')
|
|
@@ -60,6 +65,9 @@ export class NodeHtmlParserService {
|
|
|
60
65
|
styleParser.parse(style);
|
|
61
66
|
for (let s of styleParser.entries) {
|
|
62
67
|
designItem.styles.set(s.name, s.value);
|
|
68
|
+
if (manualCreatedElement) {
|
|
69
|
+
element.style[s.name] = s.value;
|
|
70
|
+
}
|
|
63
71
|
}
|
|
64
72
|
}
|
|
65
73
|
if (!lockAtDesignTime && (element instanceof HTMLElement || element instanceof SVGElement)) {
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
export class DefaultIntializationService {
|
|
2
2
|
init(designItem) {
|
|
3
|
-
if (designItem.name == 'iframe') {
|
|
4
|
-
|
|
5
|
-
}
|
|
3
|
+
/*if (designItem.name == 'iframe') {
|
|
4
|
+
this.initializeIframe(<HTMLIFrameElement>designItem.element);
|
|
5
|
+
}*/
|
|
6
6
|
}
|
|
7
7
|
initializeIframe(iframe) {
|
|
8
|
-
iframe.contentDocument.body.style.pointerEvents = 'none';
|
|
9
|
-
function cloneIframeEvent(event) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
8
|
+
/*iframe.contentDocument.body.style.pointerEvents = 'none';
|
|
9
|
+
function cloneIframeEvent(event: PointerEvent) {
|
|
10
|
+
var clRect = iframe.getBoundingClientRect();
|
|
11
|
+
let data = { ...event };
|
|
12
|
+
data.clientX = event.clientX + clRect.left;
|
|
13
|
+
data.clientY = event.clientY + clRect.top;
|
|
14
|
+
var evt = new PointerEvent(event.type, data) //new CustomEvent('pointerdown', {bubbles: true, cancelable: false});
|
|
15
|
+
iframe.dispatchEvent(evt);
|
|
16
16
|
}
|
|
17
17
|
iframe.contentWindow.addEventListener('pointerdown', cloneIframeEvent);
|
|
18
18
|
iframe.contentWindow.addEventListener('pointermove', cloneIframeEvent);
|
|
19
|
-
iframe.contentWindow.addEventListener('pointerup', cloneIframeEvent)
|
|
19
|
+
iframe.contentWindow.addEventListener('pointerup', cloneIframeEvent);*/
|
|
20
20
|
}
|
|
21
21
|
;
|
|
22
22
|
}
|
|
@@ -5,28 +5,28 @@ export class PrepareElementsForDesignerService {
|
|
|
5
5
|
this._prepareElementsForDesigner(designItem.element.querySelectorAll('*'), true);
|
|
6
6
|
}
|
|
7
7
|
_prepareElementsForDesigner(elements, rootElements) {
|
|
8
|
-
for (let el of elements) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
8
|
+
/*for (let el of elements) {
|
|
9
|
+
if ((<HTMLElement>el).shadowRoot) {
|
|
10
|
+
this._prepareElementsForDesigner(((<HTMLElement>el).shadowRoot).querySelectorAll('*'), false);
|
|
11
|
+
}
|
|
12
|
+
if (el instanceof HTMLElement) {
|
|
13
|
+
el.onclick = null;
|
|
14
|
+
el.onmousedown = null;
|
|
15
|
+
el.onmouseup = null;
|
|
16
|
+
if (!rootElements)
|
|
17
|
+
el.style.pointerEvents = 'none';
|
|
18
|
+
}
|
|
19
|
+
if (el instanceof HTMLImageElement) {
|
|
20
|
+
el.draggable = false;
|
|
21
|
+
}
|
|
22
|
+
else if (el instanceof HTMLInputElement) {
|
|
23
|
+
el.onmousedown = (e) => e.preventDefault();
|
|
24
|
+
//const ip = el;
|
|
25
|
+
//el.onclick = (e) => { if (ip.type == 'checkbox') ip.checked = !ip.checked };
|
|
26
|
+
}
|
|
27
|
+
else if (el instanceof HTMLSelectElement) {
|
|
28
|
+
el.onmousedown = (e) => e.preventDefault();
|
|
29
|
+
}
|
|
30
|
+
}*/
|
|
31
31
|
}
|
|
32
32
|
}
|
|
@@ -15,9 +15,6 @@ export class InsertAction {
|
|
|
15
15
|
}
|
|
16
16
|
do() {
|
|
17
17
|
this.designItem._insertChildInternal(this.newItem, this.index);
|
|
18
|
-
const prepService = this.designItem.serviceContainer.prepareElementsForDesignerService;
|
|
19
|
-
if (prepService)
|
|
20
|
-
requestAnimationFrame(() => prepService.prepareElementsForDesigner(this.newItem));
|
|
21
18
|
this.affectedItems[0].instanceServiceContainer.contentService.onContentChanged.emit({ changeType: 'added', designItems: [this.newItem] });
|
|
22
19
|
}
|
|
23
20
|
designItem;
|
|
@@ -16,6 +16,7 @@ export interface IDesignerCanvas extends IPlacementView, IUiCommandHandler {
|
|
|
16
16
|
readonly rootDesignItem: IDesignItem;
|
|
17
17
|
readonly overlayLayer: OverlayLayerView;
|
|
18
18
|
readonly extensionManager: IExtensionManager;
|
|
19
|
+
readonly clickOverlay: HTMLDivElement;
|
|
19
20
|
readonly snapLines: Snaplines;
|
|
20
21
|
readonly shadowRoot: ShadowRoot;
|
|
21
22
|
readonly alignOnGrid: boolean;
|
|
@@ -18,6 +18,7 @@ export declare class DesignerCanvas extends BaseCustomWebComponentLazyAppend imp
|
|
|
18
18
|
instanceServiceContainer: InstanceServiceContainer;
|
|
19
19
|
containerBoundingRect: DOMRect;
|
|
20
20
|
outerRect: DOMRect;
|
|
21
|
+
clickOverlay: HTMLDivElement;
|
|
21
22
|
gridSize: number;
|
|
22
23
|
alignOnGrid: boolean;
|
|
23
24
|
alignOnSnap: boolean;
|
|
@@ -26,6 +26,7 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
26
26
|
instanceServiceContainer;
|
|
27
27
|
containerBoundingRect;
|
|
28
28
|
outerRect;
|
|
29
|
+
clickOverlay;
|
|
29
30
|
// IPlacementView
|
|
30
31
|
gridSize = 10;
|
|
31
32
|
alignOnGrid = false;
|
|
@@ -119,8 +120,15 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
119
120
|
user-select: none;
|
|
120
121
|
-webkit-user-select: none;
|
|
121
122
|
}
|
|
123
|
+
|
|
124
|
+
#node-projects-designer-canvas-clickOverlay {
|
|
125
|
+
position: absolute;
|
|
126
|
+
width: 100%;
|
|
127
|
+
height: 100%;
|
|
128
|
+
top: 0;
|
|
129
|
+
}
|
|
122
130
|
|
|
123
|
-
#transformHelper {
|
|
131
|
+
#node-projects-designer-canvas-transformHelper {
|
|
124
132
|
height: 0;
|
|
125
133
|
width: 0;
|
|
126
134
|
}`;
|
|
@@ -130,12 +138,13 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
130
138
|
<div id="node-projects-designer-canvas-outercanvas2"
|
|
131
139
|
style="width:100%;height:100%;position:relative;">
|
|
132
140
|
<div id="node-projects-designer-canvas-canvasContainer"
|
|
133
|
-
style="width: 100%;height: 100%;margin: auto;position: absolute;top: 0
|
|
134
|
-
<div id="node-projects-designer-canvas-canvas" part="canvas"
|
|
141
|
+
style="width: 100%;height: 100%;margin: auto;position: absolute;top: 0;left: 0;user-select: none;">
|
|
142
|
+
<div id="node-projects-designer-canvas-canvas" part="canvas"></div>
|
|
135
143
|
</div>
|
|
136
144
|
</div>
|
|
145
|
+
<div id="node-projects-designer-canvas-clickOverlay" tabindex="0" style="pointer-events: auto;"></div>
|
|
137
146
|
</div>
|
|
138
|
-
<div id="transformHelper"></div>
|
|
147
|
+
<div id="node-projects-designer-canvas-transformHelper"></div>
|
|
139
148
|
</div>`;
|
|
140
149
|
extensionManager;
|
|
141
150
|
_pointerextensions;
|
|
@@ -145,13 +154,14 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
145
154
|
this._canvas = this._getDomElement('node-projects-designer-canvas-canvas');
|
|
146
155
|
this._canvasContainer = this._getDomElement('node-projects-designer-canvas-canvasContainer');
|
|
147
156
|
this._outercanvas2 = this._getDomElement('node-projects-designer-canvas-outercanvas2');
|
|
148
|
-
this.
|
|
157
|
+
this.clickOverlay = this._getDomElement('node-projects-designer-canvas-clickOverlay');
|
|
158
|
+
this.transformHelperElement = this._getDomElement('node-projects-designer-canvas-transformHelper');
|
|
149
159
|
this._onKeyDownBound = this.onKeyDown.bind(this);
|
|
150
160
|
this._onKeyUpBound = this.onKeyUp.bind(this);
|
|
151
161
|
this._onDblClickBound = this._onDblClick.bind(this);
|
|
152
162
|
this._onContextMenuBound = this._onContextMenu.bind(this);
|
|
153
163
|
this._pointerEventHandlerBound = this._pointerEventHandler.bind(this);
|
|
154
|
-
this.
|
|
164
|
+
this.clickOverlay.oncontextmenu = this._onContextMenuBound;
|
|
155
165
|
}
|
|
156
166
|
get designerWidth() {
|
|
157
167
|
return this._canvasContainer.style.width;
|
|
@@ -338,22 +348,27 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
338
348
|
}
|
|
339
349
|
}
|
|
340
350
|
elementFromPoint(x, y) {
|
|
351
|
+
this.clickOverlay.style.pointerEvents = 'none';
|
|
341
352
|
//@ts-ignore
|
|
342
|
-
|
|
353
|
+
let element = this.shadowRoot.elementFromPoint(x, y);
|
|
354
|
+
if (element === this.clickOverlay)
|
|
355
|
+
element = this._canvas;
|
|
356
|
+
this.clickOverlay.style.pointerEvents = 'auto';
|
|
357
|
+
return element;
|
|
343
358
|
}
|
|
344
359
|
connectedCallback() {
|
|
345
360
|
if (!this._firstConnect) {
|
|
346
361
|
this._firstConnect = true;
|
|
347
|
-
this.
|
|
348
|
-
this.
|
|
349
|
-
this.
|
|
350
|
-
this.
|
|
351
|
-
this.
|
|
352
|
-
this.
|
|
353
|
-
this.
|
|
354
|
-
this.
|
|
355
|
-
this.
|
|
356
|
-
this.
|
|
362
|
+
this.clickOverlay.addEventListener(EventNames.PointerDown, this._pointerEventHandlerBound);
|
|
363
|
+
this.clickOverlay.addEventListener(EventNames.PointerMove, this._pointerEventHandlerBound);
|
|
364
|
+
this.clickOverlay.addEventListener(EventNames.PointerUp, this._pointerEventHandlerBound);
|
|
365
|
+
this.clickOverlay.addEventListener(EventNames.DragEnter, event => this._onDragEnter(event));
|
|
366
|
+
this.clickOverlay.addEventListener(EventNames.DragLeave, event => this._onDragLeave(event));
|
|
367
|
+
this.clickOverlay.addEventListener(EventNames.DragOver, event => this._onDragOver(event));
|
|
368
|
+
this.clickOverlay.addEventListener(EventNames.Drop, event => this._onDrop(event));
|
|
369
|
+
this.clickOverlay.addEventListener(EventNames.KeyDown, this._onKeyDownBound, true);
|
|
370
|
+
this.clickOverlay.addEventListener(EventNames.KeyUp, this._onKeyUpBound, true);
|
|
371
|
+
this.clickOverlay.addEventListener(EventNames.DblClick, this._onDblClickBound, true);
|
|
357
372
|
}
|
|
358
373
|
}
|
|
359
374
|
zoomFactorChanged() {
|
|
@@ -392,9 +407,6 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
392
407
|
intializationService.init(di);
|
|
393
408
|
}
|
|
394
409
|
this.snapLines.clearSnaplines();
|
|
395
|
-
const prepService = this.serviceContainer.prepareElementsForDesignerService;
|
|
396
|
-
if (prepService)
|
|
397
|
-
requestAnimationFrame(() => prepService.prepareElementsForDesigner(this.rootDesignItem));
|
|
398
410
|
}
|
|
399
411
|
_onDragEnter(event) {
|
|
400
412
|
this._fillCalculationrects();
|
|
@@ -517,17 +529,11 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
517
529
|
onKeyUp(event) {
|
|
518
530
|
if (event.composedPath().indexOf(this.eatEvents) >= 0)
|
|
519
531
|
return;
|
|
520
|
-
switch (event.key) {
|
|
521
|
-
case 'ArrowUp':
|
|
522
|
-
//this._resetPointerEventsForClickThrough();
|
|
523
|
-
break;
|
|
524
|
-
}
|
|
525
532
|
event.preventDefault();
|
|
526
533
|
}
|
|
527
534
|
onKeyDown(event) {
|
|
528
535
|
if (event.composedPath().indexOf(this.eatEvents) >= 0)
|
|
529
536
|
return;
|
|
530
|
-
//TODO: keyboard events maybe should also be handeled by tools
|
|
531
537
|
if ((event.ctrlKey || event.metaKey) && event.key === 'z' && !event.shiftKey)
|
|
532
538
|
this.executeCommand({ type: CommandType.undo });
|
|
533
539
|
else if ((event.ctrlKey || event.metaKey) && event.key === 'z' && event.shiftKey)
|
|
@@ -605,6 +611,7 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
605
611
|
getElementAtPoint(point, ignoreElementCallback) {
|
|
606
612
|
let backupPEventsMap = new Map();
|
|
607
613
|
let currentElement = this.elementFromPoint(point.x, point.y);
|
|
614
|
+
this.clickOverlay.style.pointerEvents = 'none';
|
|
608
615
|
let lastElement = null;
|
|
609
616
|
try {
|
|
610
617
|
while (currentElement != null) {
|
|
@@ -641,6 +648,7 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
641
648
|
for (let e of backupPEventsMap.entries()) {
|
|
642
649
|
e[0].style.pointerEvents = e[1];
|
|
643
650
|
}
|
|
651
|
+
this.clickOverlay.style.pointerEvents = 'auto';
|
|
644
652
|
}
|
|
645
653
|
return currentElement;
|
|
646
654
|
}
|
|
@@ -667,6 +675,13 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
667
675
|
if (!DesignerCanvas.hasOrIsParent(currentElement, this._canvas))
|
|
668
676
|
return;
|
|
669
677
|
}*/
|
|
678
|
+
if (currentElement instanceof SVGGraphicsElement && currentElement?.ownerSVGElement?.parentNode?.host == this.overlayLayer) {
|
|
679
|
+
this.clickOverlay.style.cursor = getComputedStyle(currentElement).cursor;
|
|
680
|
+
//@ts-ignore
|
|
681
|
+
currentElement.dispatchEvent(new event.constructor(event.type, event));
|
|
682
|
+
return;
|
|
683
|
+
}
|
|
684
|
+
this.clickOverlay.style.cursor = this._canvas.style.cursor;
|
|
670
685
|
//TODO: remove duplication when tool refactoring starts
|
|
671
686
|
//this._fillCalculationrects();
|
|
672
687
|
const currentDesignItem = DesignItem.GetOrCreateDesignItem(currentElement, this.serviceContainer, this.instanceServiceContainer);
|
|
@@ -702,12 +717,12 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
702
717
|
//search for containers below mouse cursor.
|
|
703
718
|
//to do this, we need to disable pointer events for each in a loop and search wich element is there
|
|
704
719
|
let backupPEventsMap = new Map();
|
|
720
|
+
this.clickOverlay.style.pointerEvents = 'none';
|
|
705
721
|
try {
|
|
706
722
|
let el = this.elementFromPoint(event.x, event.y);
|
|
707
723
|
backupPEventsMap.set(el, el.style.pointerEvents);
|
|
708
724
|
el.style.pointerEvents = 'none';
|
|
709
725
|
if (el !== this.rootDesignItem.element) {
|
|
710
|
-
el = this.elementFromPoint(event.x, event.y);
|
|
711
726
|
while (el != null) {
|
|
712
727
|
if (el === this.rootDesignItem.element)
|
|
713
728
|
break;
|
|
@@ -727,6 +742,7 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
727
742
|
for (let e of backupPEventsMap.entries()) {
|
|
728
743
|
e[0].style.pointerEvents = e[1];
|
|
729
744
|
}
|
|
745
|
+
this.clickOverlay.style.pointerEvents = 'auto';
|
|
730
746
|
}
|
|
731
747
|
return lstEl;
|
|
732
748
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { IDesignItem } from "../../../../item/IDesignItem";
|
|
2
|
+
import { IDesignerCanvas } from "../../IDesignerCanvas";
|
|
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: IDesignerCanvas, 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,80 @@
|
|
|
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
|
+
_contentEditedBound;
|
|
7
|
+
_blurBound;
|
|
8
|
+
static template = html `
|
|
9
|
+
<div style="height: 24px; display: flex;">
|
|
10
|
+
<button data-command="bold" style="pointer-events: all; height: 24px; width: 24px; padding: 0; font-weight: 900;">b</button>
|
|
11
|
+
<button data-command="italic" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><em>i</em></button>
|
|
12
|
+
<button data-command="underline" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><ins>u</ins></button>
|
|
13
|
+
<button data-command="strikeThrough" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><del>s</del></button>
|
|
14
|
+
</div>
|
|
15
|
+
`;
|
|
16
|
+
_blurTimeout;
|
|
17
|
+
constructor(extensionManager, designerView, extendedItem) {
|
|
18
|
+
super(extensionManager, designerView, extendedItem);
|
|
19
|
+
this._contentEditedBound = this._contentEdited.bind(this);
|
|
20
|
+
this._blurBound = this._blur.bind(this);
|
|
21
|
+
}
|
|
22
|
+
extend() {
|
|
23
|
+
//todo -> check what to do with extensions, do not loose edit on mouse click,...
|
|
24
|
+
//maybe use a html edit framework
|
|
25
|
+
this.extendedItem.instanceServiceContainer.selectionService.clearSelectedElements();
|
|
26
|
+
//this.extensionManager.removeExtension(this.extendedItem, ExtensionType.PrimarySelection);
|
|
27
|
+
//this.extensionManager.removeExtension(this.extendedItem, ExtensionType.Selection);
|
|
28
|
+
this.extendedItem.element.setAttribute('contenteditable', '');
|
|
29
|
+
this.extendedItem.element.addEventListener('input', this._contentEditedBound);
|
|
30
|
+
this.extendedItem.element.addEventListener('blur', this._blurBound);
|
|
31
|
+
this.extendedItem.element.focus();
|
|
32
|
+
this.designerCanvas.eatEvents = this.extendedItem.element;
|
|
33
|
+
let itemRect = this.extendedItem.element.getBoundingClientRect();
|
|
34
|
+
const elements = EditTextExtension.template.content.cloneNode(true);
|
|
35
|
+
elements.querySelectorAll('button').forEach(x => x.onclick = () => this._formatSelection(x.dataset['command']));
|
|
36
|
+
let foreignObject = document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject');
|
|
37
|
+
foreignObject.setAttribute('x', '' + (itemRect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor);
|
|
38
|
+
foreignObject.setAttribute('y', '' + ((itemRect.y - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor - 30));
|
|
39
|
+
foreignObject.setAttribute('width', '96');
|
|
40
|
+
foreignObject.setAttribute('height', '24');
|
|
41
|
+
foreignObject.appendChild(elements);
|
|
42
|
+
this.overlayLayerView.addOverlay(foreignObject, OverlayLayer.Foregorund);
|
|
43
|
+
this.overlays.push(foreignObject);
|
|
44
|
+
this.designerCanvas.clickOverlay.style.pointerEvents = 'none';
|
|
45
|
+
}
|
|
46
|
+
refresh() {
|
|
47
|
+
this.dispose();
|
|
48
|
+
}
|
|
49
|
+
dispose() {
|
|
50
|
+
this._removeAllOverlays();
|
|
51
|
+
this.extendedItem.element.removeAttribute('contenteditable');
|
|
52
|
+
this.extendedItem.element.removeEventListener('input', this._contentEditedBound);
|
|
53
|
+
this.extendedItem.element.removeEventListener('blur', this._blurBound);
|
|
54
|
+
this.designerCanvas.eatEvents = null;
|
|
55
|
+
this.extendedItem.updateChildrenFromNodesChildren();
|
|
56
|
+
this.designerCanvas.clickOverlay.style.pointerEvents = 'auto';
|
|
57
|
+
}
|
|
58
|
+
_contentEdited() {
|
|
59
|
+
//todo -> save???
|
|
60
|
+
//this.extendedItem.content = this.extendedItem.element.innerHTML;
|
|
61
|
+
//console.log(this.extendedItem.element.innerHTML)
|
|
62
|
+
}
|
|
63
|
+
_blur() {
|
|
64
|
+
if (!this._blurTimeout) {
|
|
65
|
+
this._blurTimeout = setTimeout(() => {
|
|
66
|
+
//todo, don't remove doubleclick extension (another type could be used), remove extension itself
|
|
67
|
+
//maybe also configureable when when to remove the extension
|
|
68
|
+
this.extensionManager.removeExtension(this.extendedItem, ExtensionType.Doubleclick);
|
|
69
|
+
}, 150);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
_formatSelection(type) {
|
|
73
|
+
if (this._blurTimeout)
|
|
74
|
+
clearTimeout(this._blurTimeout);
|
|
75
|
+
this._blurTimeout = null;
|
|
76
|
+
//const selection = <Selection>(<any>this.designerView.shadowRoot).getSelection()
|
|
77
|
+
document.execCommand(type, false, null);
|
|
78
|
+
this.extendedItem.element.focus();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -34,13 +34,14 @@ export class EditTextExtension extends AbstractExtension {
|
|
|
34
34
|
const elements = EditTextExtension.template.content.cloneNode(true);
|
|
35
35
|
elements.querySelectorAll('button').forEach(x => x.onclick = () => this._formatSelection(x.dataset['command']));
|
|
36
36
|
let foreignObject = document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject');
|
|
37
|
-
foreignObject.setAttribute('x', '' + (itemRect.x - this.designerCanvas.containerBoundingRect.x));
|
|
38
|
-
foreignObject.setAttribute('y', '' + (itemRect.y - this.designerCanvas.containerBoundingRect.y - 30));
|
|
37
|
+
foreignObject.setAttribute('x', '' + (itemRect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor);
|
|
38
|
+
foreignObject.setAttribute('y', '' + ((itemRect.y - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor - 30));
|
|
39
39
|
foreignObject.setAttribute('width', '96');
|
|
40
40
|
foreignObject.setAttribute('height', '24');
|
|
41
41
|
foreignObject.appendChild(elements);
|
|
42
42
|
this.overlayLayerView.addOverlay(foreignObject, OverlayLayer.Foregorund);
|
|
43
43
|
this.overlays.push(foreignObject);
|
|
44
|
+
this.designerCanvas.clickOverlay.style.pointerEvents = 'none';
|
|
44
45
|
}
|
|
45
46
|
refresh() {
|
|
46
47
|
this.dispose();
|
|
@@ -52,6 +53,7 @@ export class EditTextExtension extends AbstractExtension {
|
|
|
52
53
|
this.extendedItem.element.removeEventListener('blur', this._blurBound);
|
|
53
54
|
this.designerCanvas.eatEvents = null;
|
|
54
55
|
this.extendedItem.updateChildrenFromNodesChildren();
|
|
56
|
+
this.designerCanvas.clickOverlay.style.pointerEvents = 'auto';
|
|
55
57
|
}
|
|
56
58
|
_contentEdited() {
|
|
57
59
|
//todo -> save???
|
package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider copy.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { IDesignerExtensionProvider } from "../IDesignerExtensionProvider";
|
|
2
|
+
import { IDesignItem } from "../../../../item/IDesignItem";
|
|
3
|
+
import { IDesignerCanvas } from "../../IDesignerCanvas";
|
|
4
|
+
import { IDesignerExtension } from "../IDesignerExtension";
|
|
5
|
+
import { IExtensionManager } from "../IExtensionManger";
|
|
6
|
+
export declare class EditTextExtensionProvider implements IDesignerExtensionProvider {
|
|
7
|
+
shouldExtend(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): boolean;
|
|
8
|
+
getExtension(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
|
|
9
|
+
}
|
package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider copy.js
ADDED
|
@@ -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
|
+
}
|
package/dist/elements/widgets/designerView/extensions/EditText/EditTextWithStyloExtension.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { IDesignItem } from "../../../../item/IDesignItem";
|
|
2
|
+
import { IDesignerCanvas } from "../../IDesignerCanvas";
|
|
3
|
+
import { AbstractExtension } from "../AbstractExtension.js";
|
|
4
|
+
import { IExtensionManager } from "../IExtensionManger";
|
|
5
|
+
export declare class EditTextWithStyloExtension extends AbstractExtension {
|
|
6
|
+
private _contentEditedBound;
|
|
7
|
+
private _blurBound;
|
|
8
|
+
private static template;
|
|
9
|
+
private _resizeObserver;
|
|
10
|
+
private _rect1;
|
|
11
|
+
private _rect2;
|
|
12
|
+
private _rect3;
|
|
13
|
+
private _rect4;
|
|
14
|
+
constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
|
|
15
|
+
extend(): void;
|
|
16
|
+
private _drawClickOverlayRects;
|
|
17
|
+
refresh(): void;
|
|
18
|
+
dispose(): void;
|
|
19
|
+
_clickOutside(e: any): void;
|
|
20
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
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 EditTextWithStyloExtension extends AbstractExtension {
|
|
6
|
+
_contentEditedBound;
|
|
7
|
+
_blurBound;
|
|
8
|
+
static template = html `
|
|
9
|
+
<stylo-editor></stylo-editor>
|
|
10
|
+
`;
|
|
11
|
+
_resizeObserver;
|
|
12
|
+
_rect1;
|
|
13
|
+
_rect2;
|
|
14
|
+
_rect3;
|
|
15
|
+
_rect4;
|
|
16
|
+
constructor(extensionManager, designerView, extendedItem) {
|
|
17
|
+
super(extensionManager, designerView, extendedItem);
|
|
18
|
+
import('@papyrs/stylo/dist/esm/loader.js').then(d => d.defineCustomElements());
|
|
19
|
+
}
|
|
20
|
+
extend() {
|
|
21
|
+
this.extendedItem.instanceServiceContainer.selectionService.clearSelectedElements();
|
|
22
|
+
this.extendedItem.element.setAttribute('contenteditable', 'true');
|
|
23
|
+
this.extendedItem.element.addEventListener('input', this._contentEditedBound);
|
|
24
|
+
this.extendedItem.element.addEventListener('blur', this._blurBound);
|
|
25
|
+
this.extendedItem.element.focus();
|
|
26
|
+
this.designerCanvas.eatEvents = this.extendedItem.element;
|
|
27
|
+
const elements = EditTextWithStyloExtension.template.content.cloneNode(true);
|
|
28
|
+
let foreignObject = document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject');
|
|
29
|
+
foreignObject.setAttribute('x', '0');
|
|
30
|
+
foreignObject.setAttribute('y', '0');
|
|
31
|
+
foreignObject.setAttribute('width', '100%');
|
|
32
|
+
foreignObject.setAttribute('height', '100%');
|
|
33
|
+
foreignObject.appendChild(elements);
|
|
34
|
+
this.overlayLayerView.addOverlay(foreignObject, OverlayLayer.Foregorund);
|
|
35
|
+
this.overlays.push(foreignObject);
|
|
36
|
+
this._drawClickOverlayRects();
|
|
37
|
+
this._rect1.addEventListener('pointerdown', (e) => this._clickOutside(e));
|
|
38
|
+
this._rect1.addEventListener('pointerup', (e) => this._clickOutside(e));
|
|
39
|
+
this._rect2.addEventListener('pointerdown', (e) => this._clickOutside(e));
|
|
40
|
+
this._rect2.addEventListener('pointerup', (e) => this._clickOutside(e));
|
|
41
|
+
this._rect3.addEventListener('pointerdown', (e) => this._clickOutside(e));
|
|
42
|
+
this._rect3.addEventListener('pointerup', (e) => this._clickOutside(e));
|
|
43
|
+
this._rect4.addEventListener('pointerdown', (e) => this._clickOutside(e));
|
|
44
|
+
this._rect4.addEventListener('pointerup', (e) => this._clickOutside(e));
|
|
45
|
+
requestAnimationFrame(() => {
|
|
46
|
+
const stylo = foreignObject.querySelector('stylo-editor');
|
|
47
|
+
//@ts-ignore
|
|
48
|
+
stylo.containerRef = this.extendedItem.element;
|
|
49
|
+
//@ts-ignore
|
|
50
|
+
stylo.config = {
|
|
51
|
+
dontInjectHeadCss: true
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
this.designerCanvas.clickOverlay.style.pointerEvents = 'none';
|
|
55
|
+
this._resizeObserver = new ResizeObserver(() => this._drawClickOverlayRects());
|
|
56
|
+
this._resizeObserver.observe(this.extendedItem.element);
|
|
57
|
+
}
|
|
58
|
+
_drawClickOverlayRects() {
|
|
59
|
+
const normalized = this.designerCanvas.getNormalizedElementCoordinates(this.extendedItem.element);
|
|
60
|
+
this._rect1 = this._drawRect(0, 0, this.designerCanvas.containerBoundingRect.width, normalized.y, 'svg-transparent', this._rect1, OverlayLayer.Normal);
|
|
61
|
+
this._rect2 = this._drawRect(0, 0, normalized.x, this.designerCanvas.containerBoundingRect.height, 'svg-transparent', this._rect2, OverlayLayer.Normal);
|
|
62
|
+
this._rect3 = this._drawRect(normalized.x + normalized.width, 0, this.designerCanvas.containerBoundingRect.width, this.designerCanvas.containerBoundingRect.height, 'svg-transparent', this._rect3, OverlayLayer.Normal);
|
|
63
|
+
this._rect4 = this._drawRect(0, normalized.y + normalized.height, this.designerCanvas.containerBoundingRect.width, this.designerCanvas.containerBoundingRect.height, 'svg-transparent', this._rect4, OverlayLayer.Normal);
|
|
64
|
+
}
|
|
65
|
+
refresh() {
|
|
66
|
+
this.dispose();
|
|
67
|
+
}
|
|
68
|
+
dispose() {
|
|
69
|
+
this._resizeObserver.disconnect();
|
|
70
|
+
this._removeAllOverlays();
|
|
71
|
+
this.extendedItem.element.removeAttribute('contenteditable');
|
|
72
|
+
this.designerCanvas.eatEvents = null;
|
|
73
|
+
this.extendedItem.updateChildrenFromNodesChildren();
|
|
74
|
+
this.designerCanvas.clickOverlay.style.pointerEvents = 'auto';
|
|
75
|
+
}
|
|
76
|
+
_clickOutside(e) {
|
|
77
|
+
this.extendedItem.innerHTML = this.extendedItem.element.innerHTML;
|
|
78
|
+
//TODO: the extension should remove itself, not the doubleclick extensions
|
|
79
|
+
// cause the extension could be applied in another way
|
|
80
|
+
//maybe also the removal is maybe not desired (for example if it's permanet extension)
|
|
81
|
+
this.extensionManager.removeExtension(this.extendedItem, ExtensionType.Doubleclick);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { IDesignerExtensionProvider } from "../IDesignerExtensionProvider";
|
|
2
|
+
import { IDesignItem } from "../../../../item/IDesignItem";
|
|
3
|
+
import { IDesignerCanvas } from "../../IDesignerCanvas";
|
|
4
|
+
import { IDesignerExtension } from "../IDesignerExtension";
|
|
5
|
+
import { IExtensionManager } from "../IExtensionManger";
|
|
6
|
+
export declare class EditTextWithStyloExtensionProvider implements IDesignerExtensionProvider {
|
|
7
|
+
shouldExtend(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): boolean;
|
|
8
|
+
getExtension(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
|
|
9
|
+
readonly style: CSSStyleSheet;
|
|
10
|
+
}
|
package/dist/elements/widgets/designerView/extensions/EditText/EditTextWithStyloExtensionProvider.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { EditTextWithStyloExtension } from "./EditTextWithStyloExtension.js";
|
|
2
|
+
import { css } from "@node-projects/base-custom-webcomponent";
|
|
3
|
+
export class EditTextWithStyloExtensionProvider {
|
|
4
|
+
shouldExtend(extensionManager, designerView, designItem) {
|
|
5
|
+
if (designItem.name === 'button' || designItem.name === 'input')
|
|
6
|
+
return false;
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
getExtension(extensionManager, designerView, designItem) {
|
|
10
|
+
return new EditTextWithStyloExtension(extensionManager, designerView, designItem);
|
|
11
|
+
}
|
|
12
|
+
style = css `
|
|
13
|
+
.svg-transparent { stroke: none; fill: transparent; pointer-events: all; }
|
|
14
|
+
`;
|
|
15
|
+
}
|
|
@@ -4,8 +4,6 @@ import { EventNames } from "../../../../enums/EventNames";
|
|
|
4
4
|
import { createPathD } from "../../../helper/PathDataPolyfill";
|
|
5
5
|
import { ContextMenuHelper } from "../../../helper/contextMenu/ContextMenuHelper";
|
|
6
6
|
export class PathExtension extends AbstractExtension {
|
|
7
|
-
//private _itemRect: DOMRect;
|
|
8
|
-
//private _svgRect: DOMRect;
|
|
9
7
|
_lastPos;
|
|
10
8
|
_parentRect;
|
|
11
9
|
_startPos;
|
|
@@ -16,8 +14,6 @@ export class PathExtension extends AbstractExtension {
|
|
|
16
14
|
super(extensionManager, designerView, extendedItem);
|
|
17
15
|
}
|
|
18
16
|
extend() {
|
|
19
|
-
//this._itemRect = this.extendedItem.element.getBoundingClientRect();
|
|
20
|
-
//this._svgRect = (<SVGGeometryElement>this.extendedItem.element).ownerSVGElement.getBoundingClientRect();
|
|
21
17
|
this._parentRect = this.extendedItem.element.parentElement.getBoundingClientRect();
|
|
22
18
|
this._pathdata = this.extendedItem.node.getPathData({ normalize: false });
|
|
23
19
|
for (let p of this._pathdata) {
|
|
@@ -125,7 +121,7 @@ export class PathExtension extends AbstractExtension {
|
|
|
125
121
|
}
|
|
126
122
|
}
|
|
127
123
|
_drawPathCircle(x, y, p, index) {
|
|
128
|
-
let circle = this._drawCircle(this._parentRect.x - this.designerCanvas.containerBoundingRect.x + x, this._parentRect.y - this.designerCanvas.containerBoundingRect.y + y, 5, 'svg-path');
|
|
124
|
+
let circle = this._drawCircle((this._parentRect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor + x, (this._parentRect.y - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor + y, 5, 'svg-path');
|
|
129
125
|
let circlePos = { x: x, y: y };
|
|
130
126
|
const items = [];
|
|
131
127
|
const pidx = this._pathdata.indexOf(p);
|
|
@@ -109,6 +109,7 @@ export class TreeView extends BaseCustomWebComponentLazyAppend {
|
|
|
109
109
|
constructor() {
|
|
110
110
|
super();
|
|
111
111
|
this._treeDiv = document.createElement('div');
|
|
112
|
+
this._treeDiv.style.userSelect = 'none';
|
|
112
113
|
this.shadowRoot.appendChild(this._treeDiv);
|
|
113
114
|
this._treeDiv.addEventListener('click', this._clickElement.bind(this));
|
|
114
115
|
}
|
|
@@ -53,15 +53,19 @@ export class TreeViewExtended extends BaseCustomWebComponentConstructorAppend {
|
|
|
53
53
|
display: flex;
|
|
54
54
|
position: sticky;
|
|
55
55
|
right: 0;
|
|
56
|
-
padding-right:
|
|
56
|
+
padding-right: 2px;
|
|
57
57
|
align-items: center;
|
|
58
58
|
gap: 2px;
|
|
59
59
|
background: #ffffffc9;
|
|
60
|
-
width:
|
|
60
|
+
width: 42px;
|
|
61
61
|
justify-content: flex-end;
|
|
62
62
|
background: white;
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
+
.cmd > img {
|
|
66
|
+
width: 10px;
|
|
67
|
+
}
|
|
68
|
+
|
|
65
69
|
table.fancytree-ext-table tbody tr.fancytree-selected {
|
|
66
70
|
background-color: #bebebe;
|
|
67
71
|
}
|
|
@@ -168,16 +172,16 @@ export class TreeViewExtended extends BaseCustomWebComponentConstructorAppend {
|
|
|
168
172
|
node.tr.oncontextmenu = (e) => this.showDesignItemContextMenu(designItem, e);
|
|
169
173
|
let d = document.createElement("div");
|
|
170
174
|
d.className = "cmd";
|
|
171
|
-
let img = document.createElement('img');
|
|
172
|
-
this._showHideAtDesignTimeState(img, designItem);
|
|
173
|
-
img.onclick = () => this._switchHideAtDesignTimeState(img, designItem);
|
|
174
|
-
img.title = 'hide in designer';
|
|
175
|
-
d.appendChild(img);
|
|
176
175
|
let imgL = document.createElement('img');
|
|
177
176
|
this._showLockAtDesignTimeState(imgL, designItem);
|
|
178
177
|
imgL.onclick = () => this._switchLockAtDesignTimeState(imgL, designItem);
|
|
179
178
|
imgL.title = 'lock';
|
|
180
179
|
d.appendChild(imgL);
|
|
180
|
+
let img = document.createElement('img');
|
|
181
|
+
this._showHideAtDesignTimeState(img, designItem);
|
|
182
|
+
img.onclick = () => this._switchHideAtDesignTimeState(img, designItem);
|
|
183
|
+
img.title = 'hide in designer';
|
|
184
|
+
d.appendChild(img);
|
|
181
185
|
let imgH = document.createElement('img');
|
|
182
186
|
this._showHideAtRunTimeState(imgH, designItem);
|
|
183
187
|
imgH.onclick = () => this._switchHideAtRunTimeState(imgH, designItem);
|
package/dist/index.d.ts
CHANGED
|
@@ -55,8 +55,6 @@ export type { IHtmlParserService } from "./elements/services/htmlParserService/I
|
|
|
55
55
|
export type { IIntializationService } from "./elements/services/initializationService/IIntializationService.js";
|
|
56
56
|
export * from "./elements/services/instanceService/DefaultInstanceService.js";
|
|
57
57
|
export type { IInstanceService } from "./elements/services/instanceService/IInstanceService.js";
|
|
58
|
-
export * from "./elements/services/instanceService/PrepareElementsForDesignerService.js";
|
|
59
|
-
export type { IPrepareElementsForDesignerService } from "./elements/services/instanceService/IPrepareElementsForDesignerService.js";
|
|
60
58
|
export * from "./elements/services/manifestParsers/WebcomponentManifestParserService.js";
|
|
61
59
|
export type { IModelCommandService } from "./elements/services/modelCommandService/IModelCommandService.js";
|
|
62
60
|
export * from "./elements/services/modelCommandService/DefaultModelCommandService.js";
|
|
@@ -132,8 +130,6 @@ export * from "./elements/widgets/designerView/extensions/GrayOutExtension.js";
|
|
|
132
130
|
export * from "./elements/widgets/designerView/extensions/GrayOutExtensionProvider.js";
|
|
133
131
|
export * from "./elements/widgets/designerView/extensions/GridExtension.js";
|
|
134
132
|
export * from "./elements/widgets/designerView/extensions/GridExtensionProvider.js";
|
|
135
|
-
export * from "./elements/widgets/designerView/extensions/IframeExtension.js";
|
|
136
|
-
export * from "./elements/widgets/designerView/extensions/IframeExtensionProvider.js";
|
|
137
133
|
export * from "./elements/widgets/designerView/extensions/InvisibleDivExtension.js";
|
|
138
134
|
export * from "./elements/widgets/designerView/extensions/InvisibleDivExtensionProvider.js";
|
|
139
135
|
export * from "./elements/widgets/designerView/extensions/MouseOverExtension.js";
|
|
@@ -152,6 +148,10 @@ export * from "./elements/widgets/designerView/extensions/SelectionDefaultExtens
|
|
|
152
148
|
export * from "./elements/widgets/designerView/extensions/SelectionDefaultExtensionProvider.js";
|
|
153
149
|
export * from "./elements/widgets/designerView/extensions/TransformOriginExtension.js";
|
|
154
150
|
export * from "./elements/widgets/designerView/extensions/TransformOriginExtensionProvider.js";
|
|
151
|
+
export * from "./elements/widgets/designerView/extensions/EditText/EditTextExtension.js";
|
|
152
|
+
export * from "./elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider.js";
|
|
153
|
+
export * from "./elements/widgets/designerView/extensions/EditText/EditTextWithStyloExtension.js";
|
|
154
|
+
export * from "./elements/widgets/designerView/extensions/EditText/EditTextWithStyloExtensionProvider.js";
|
|
155
155
|
export type { IContextMenuExtension, ContextmenuInitiator } from "./elements/widgets/designerView/extensions/contextMenu/IContextMenuExtension.js";
|
|
156
156
|
export * from "./elements/widgets/designerView/extensions/contextMenu/CopyPasteContextMenu.js";
|
|
157
157
|
export * from "./elements/widgets/designerView/extensions/contextMenu/ItemsBelowContextMenu.js";
|
package/dist/index.js
CHANGED
|
@@ -33,7 +33,6 @@ export * from "./elements/services/htmlWriterService/LitTsElementWriterService.j
|
|
|
33
33
|
export * from "./elements/services/htmlParserService/DefaultHtmlParserService.js";
|
|
34
34
|
export * from "./elements/services/htmlParserService/NodeHtmlParserService.js";
|
|
35
35
|
export * from "./elements/services/instanceService/DefaultInstanceService.js";
|
|
36
|
-
export * from "./elements/services/instanceService/PrepareElementsForDesignerService.js";
|
|
37
36
|
export * from "./elements/services/manifestParsers/WebcomponentManifestParserService.js";
|
|
38
37
|
export * from "./elements/services/modelCommandService/DefaultModelCommandService.js";
|
|
39
38
|
export * from "./elements/services/propertiesService/DefaultEditorTypesService.js";
|
|
@@ -92,8 +91,6 @@ export * from "./elements/widgets/designerView/extensions/GrayOutExtension.js";
|
|
|
92
91
|
export * from "./elements/widgets/designerView/extensions/GrayOutExtensionProvider.js";
|
|
93
92
|
export * from "./elements/widgets/designerView/extensions/GridExtension.js";
|
|
94
93
|
export * from "./elements/widgets/designerView/extensions/GridExtensionProvider.js";
|
|
95
|
-
export * from "./elements/widgets/designerView/extensions/IframeExtension.js";
|
|
96
|
-
export * from "./elements/widgets/designerView/extensions/IframeExtensionProvider.js";
|
|
97
94
|
export * from "./elements/widgets/designerView/extensions/InvisibleDivExtension.js";
|
|
98
95
|
export * from "./elements/widgets/designerView/extensions/InvisibleDivExtensionProvider.js";
|
|
99
96
|
export * from "./elements/widgets/designerView/extensions/MouseOverExtension.js";
|
|
@@ -112,6 +109,10 @@ export * from "./elements/widgets/designerView/extensions/SelectionDefaultExtens
|
|
|
112
109
|
export * from "./elements/widgets/designerView/extensions/SelectionDefaultExtensionProvider.js";
|
|
113
110
|
export * from "./elements/widgets/designerView/extensions/TransformOriginExtension.js";
|
|
114
111
|
export * from "./elements/widgets/designerView/extensions/TransformOriginExtensionProvider.js";
|
|
112
|
+
export * from "./elements/widgets/designerView/extensions/EditText/EditTextExtension.js";
|
|
113
|
+
export * from "./elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider.js";
|
|
114
|
+
export * from "./elements/widgets/designerView/extensions/EditText/EditTextWithStyloExtension.js";
|
|
115
|
+
export * from "./elements/widgets/designerView/extensions/EditText/EditTextWithStyloExtensionProvider.js";
|
|
115
116
|
export * from "./elements/widgets/designerView/extensions/contextMenu/CopyPasteContextMenu.js";
|
|
116
117
|
export * from "./elements/widgets/designerView/extensions/contextMenu/ItemsBelowContextMenu.js";
|
|
117
118
|
export * from "./elements/widgets/designerView/extensions/contextMenu/MultipleItemsSelectedContextMenu.js";
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"description": "A UI designer for Polymer apps",
|
|
3
3
|
"name": "@node-projects/web-component-designer",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.87",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"author": "",
|
|
@@ -13,12 +13,13 @@
|
|
|
13
13
|
"prepublishOnly": "npm run build"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@node-projects/base-custom-webcomponent": "^0.5.
|
|
16
|
+
"@node-projects/base-custom-webcomponent": "^0.5.3",
|
|
17
17
|
"construct-style-sheets-polyfill": "^3.1.0"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
20
|
"@node-projects/lean-he-esm": "^3.3.0",
|
|
21
21
|
"@node-projects/node-html-parser-esm": "^2.4.1",
|
|
22
|
+
"@papyrs/stylo": "^0.0.8",
|
|
22
23
|
"@types/codemirror": "^5.60.5",
|
|
23
24
|
"@types/jquery": "^3.5.13",
|
|
24
25
|
"@types/jquery.fancytree": "0.0.7",
|
|
@@ -26,10 +27,10 @@
|
|
|
26
27
|
"codemirror": "^5.65.1",
|
|
27
28
|
"esprima-next": "^5.8.1",
|
|
28
29
|
"html2canvas": "*",
|
|
29
|
-
"jest": "^27.
|
|
30
|
+
"jest": "^27.5.1",
|
|
30
31
|
"jquery": "^3.6.0",
|
|
31
32
|
"jquery.fancytree": "^2.38.1",
|
|
32
|
-
"monaco-editor": "^0.
|
|
33
|
+
"monaco-editor": "^0.32.1",
|
|
33
34
|
"ts-jest": "^27.1.3",
|
|
34
35
|
"typescript": "^4.5.5",
|
|
35
36
|
"typescript-lit-html-plugin": "^0.9.0"
|