@node-projects/web-component-designer 0.0.120 → 0.0.122
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/PathDataPolyfill.js +5 -28
- package/dist/elements/item/DesignItem.d.ts +1 -0
- package/dist/elements/item/DesignItem.js +4 -1
- package/dist/elements/item/IDesignItem.d.ts +1 -0
- package/dist/elements/services/DefaultServiceBootstrap.js +7 -1
- package/dist/elements/services/htmlParserService/LitElementParserService.d.ts +12 -0
- package/dist/elements/services/htmlParserService/LitElementParserService.js +106 -0
- package/dist/elements/services/htmlParserService/NodeHtmlParserService copy.d.ts +11 -0
- package/dist/elements/services/htmlParserService/NodeHtmlParserService copy.js +96 -0
- package/dist/elements/services/placementService/FlexBoxPlacementService.js +67 -9
- package/dist/elements/widgets/designerView/extensions/AbstractExtensionBase.d.ts +2 -1
- package/dist/elements/widgets/designerView/extensions/AbstractExtensionBase.js +7 -0
- package/dist/elements/widgets/designerView/extensions/PositionExtension.d.ts +0 -2
- package/dist/elements/widgets/designerView/extensions/PositionExtension.js +6 -8
- package/dist/elements/widgets/designerView/extensions/PositionExtensionProvider.js +1 -1
- package/dist/elements/widgets/designerView/extensions/ResizeExtensionProvider.js +2 -0
- package/dist/elements/widgets/designerView/extensions/svg/EllipsisExtension.d.ts +29 -0
- package/dist/elements/widgets/designerView/extensions/svg/EllipsisExtension.js +112 -0
- package/dist/elements/widgets/designerView/extensions/svg/EllipsisExtensionProvider.d.ts +9 -0
- package/dist/elements/widgets/designerView/extensions/svg/EllipsisExtensionProvider.js +12 -0
- package/dist/elements/widgets/designerView/extensions/svg/LineExtension.d.ts +20 -0
- package/dist/elements/widgets/designerView/extensions/svg/LineExtension.js +87 -0
- package/dist/elements/widgets/designerView/extensions/svg/LineExtensionProvider.d.ts +9 -0
- package/dist/elements/widgets/designerView/extensions/svg/LineExtensionProvider.js +12 -0
- package/dist/elements/widgets/designerView/extensions/svg/PathExtension.d.ts +23 -0
- package/dist/elements/widgets/designerView/extensions/svg/PathExtension.js +286 -0
- package/dist/elements/widgets/designerView/extensions/svg/PathExtensionProvider.d.ts +9 -0
- package/dist/elements/widgets/designerView/extensions/svg/PathExtensionProvider.js +12 -0
- package/dist/elements/widgets/designerView/extensions/svg/RectExtension.d.ts +34 -0
- package/dist/elements/widgets/designerView/extensions/svg/RectExtension.js +137 -0
- package/dist/elements/widgets/designerView/extensions/svg/RectExtensionProvider.d.ts +9 -0
- package/dist/elements/widgets/designerView/extensions/svg/RectExtensionProvider.js +12 -0
- package/dist/elements/widgets/designerView/overlayLayerView.d.ts +4 -1
- package/dist/elements/widgets/designerView/overlayLayerView.js +39 -0
- package/dist/elements/widgets/designerView/tools/DrawPathTool.js +11 -11
- package/dist/elements/widgets/designerView/tools/PointerTool.js +3 -0
- package/dist/elements/widgets/treeView/treeViewExtended.js +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +3 -2
- package/package.json +4 -4
|
@@ -944,34 +944,11 @@ export function moveSVGPath(path, xFactor, yFactor) {
|
|
|
944
944
|
export function createPathD(path) {
|
|
945
945
|
let pathD = "";
|
|
946
946
|
for (let p of path) {
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
pathD += p.type + p.values[0] + " " + p.values[1];
|
|
953
|
-
break;
|
|
954
|
-
case 'H':
|
|
955
|
-
break;
|
|
956
|
-
case 'V':
|
|
957
|
-
break;
|
|
958
|
-
case 'Z':
|
|
959
|
-
pathD += p.type;
|
|
960
|
-
break;
|
|
961
|
-
case 'C':
|
|
962
|
-
case 'c':
|
|
963
|
-
pathD += p.type + p.values[0] + " " + p.values[1] + " " + p.values[2] + " " + p.values[3] + " " + p.values[4] + " " + p.values[5];
|
|
964
|
-
break;
|
|
965
|
-
case 'S':
|
|
966
|
-
break;
|
|
967
|
-
case 'Q':
|
|
968
|
-
case 'q':
|
|
969
|
-
pathD += p.type + p.values[0] + " " + p.values[1] + " " + p.values[2] + " " + p.values[3];
|
|
970
|
-
break;
|
|
971
|
-
case 'T':
|
|
972
|
-
break;
|
|
973
|
-
case 'A':
|
|
974
|
-
break;
|
|
947
|
+
pathD += p.type + " ";
|
|
948
|
+
for (var i = 0; i < p.values.length; i++) {
|
|
949
|
+
if (p.values[i] != null && !isNaN(p.values[i])) {
|
|
950
|
+
pathD += p.values[i] + " ";
|
|
951
|
+
}
|
|
975
952
|
}
|
|
976
953
|
}
|
|
977
954
|
return pathD;
|
|
@@ -41,6 +41,7 @@ export declare class DesignItem implements IDesignItem {
|
|
|
41
41
|
set content(value: string);
|
|
42
42
|
get innerHTML(): string;
|
|
43
43
|
set innerHTML(value: string);
|
|
44
|
+
get isEmptyTextNode(): boolean;
|
|
44
45
|
private _hideAtDesignTime;
|
|
45
46
|
get hideAtDesignTime(): boolean;
|
|
46
47
|
set hideAtDesignTime(value: boolean);
|
|
@@ -85,7 +85,7 @@ export class DesignItem {
|
|
|
85
85
|
action = new InsertChildAction(designItem, this.parent, this.parent.indexOf(this));
|
|
86
86
|
}
|
|
87
87
|
else if (where == 'afterend') {
|
|
88
|
-
action = new InsertChildAction(designItem, this.parent, this.parent.indexOf(this));
|
|
88
|
+
action = new InsertChildAction(designItem, this.parent, this.parent.indexOf(this) + 1);
|
|
89
89
|
}
|
|
90
90
|
this.instanceServiceContainer.undoService.execute(action);
|
|
91
91
|
}
|
|
@@ -124,6 +124,9 @@ export class DesignItem {
|
|
|
124
124
|
this.element.innerHTML = value;
|
|
125
125
|
this.updateChildrenFromNodesChildren();
|
|
126
126
|
}
|
|
127
|
+
get isEmptyTextNode() {
|
|
128
|
+
return this.nodeType === NodeType.TextNode && this.content?.trim() == '';
|
|
129
|
+
}
|
|
127
130
|
_hideAtDesignTime;
|
|
128
131
|
get hideAtDesignTime() {
|
|
129
132
|
return this._hideAtDesignTime;
|
|
@@ -14,7 +14,7 @@ import { GridExtensionProvider } from '../widgets/designerView/extensions/GridEx
|
|
|
14
14
|
import { TransformOriginExtensionProvider } from '../widgets/designerView/extensions/TransformOriginExtensionProvider.js';
|
|
15
15
|
import { CanvasExtensionProvider } from '../widgets/designerView/extensions/CanvasExtensionProvider.js';
|
|
16
16
|
import { PositionExtensionProvider } from '../widgets/designerView/extensions/PositionExtensionProvider.js';
|
|
17
|
-
import { PathExtensionProvider } from '../widgets/designerView/extensions/PathExtensionProvider.js';
|
|
17
|
+
import { PathExtensionProvider } from '../widgets/designerView/extensions/svg/PathExtensionProvider.js';
|
|
18
18
|
import { MouseOverExtensionProvider } from '../widgets/designerView/extensions/MouseOverExtensionProvider.js';
|
|
19
19
|
import { NamedTools } from '../widgets/designerView/tools/NamedTools.js';
|
|
20
20
|
import { PointerTool } from '../widgets/designerView/tools/PointerTool.js';
|
|
@@ -64,6 +64,9 @@ import { DrawToolButtonProvider } from '../widgets/designerView/tools/toolBar/bu
|
|
|
64
64
|
import { TextToolButtonProvider } from '../widgets/designerView/tools/toolBar/buttons/TextToolButtonProvider.js';
|
|
65
65
|
import { SelectorToolButtonProvider } from '../widgets/designerView/tools/toolBar/buttons/SelectorToolButtonProvider.js';
|
|
66
66
|
import { GrayOutDragOverContainerExtensionProvider } from '../widgets/designerView/extensions/GrayOutDragOverContainerExtensionProvider.js';
|
|
67
|
+
import { LineExtensionProvider } from '../widgets/designerView/extensions/svg/LineExtensionProvider.js';
|
|
68
|
+
import { RectExtentionProvider } from '../widgets/designerView/extensions/svg/RectExtensionProvider.js';
|
|
69
|
+
import { EllipsisExtensionProvider } from '../widgets/designerView/extensions/svg/EllipsisExtensionProvider.js';
|
|
67
70
|
export function createDefaultServiceContainer() {
|
|
68
71
|
let serviceContainer = new ServiceContainer();
|
|
69
72
|
serviceContainer.register("propertyService", new PolymerPropertiesService());
|
|
@@ -95,7 +98,10 @@ export function createDefaultServiceContainer() {
|
|
|
95
98
|
new TransformOriginExtensionProvider(),
|
|
96
99
|
new CanvasExtensionProvider(),
|
|
97
100
|
new PositionExtensionProvider(),
|
|
101
|
+
new EllipsisExtensionProvider(),
|
|
102
|
+
new LineExtensionProvider(),
|
|
98
103
|
new PathExtensionProvider(),
|
|
104
|
+
new RectExtentionProvider(),
|
|
99
105
|
new ResizeExtensionProvider(true),
|
|
100
106
|
new RotateExtensionProvider(),
|
|
101
107
|
]);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { InstanceServiceContainer } from "../InstanceServiceContainer";
|
|
2
|
+
import { ServiceContainer } from "../ServiceContainer";
|
|
3
|
+
import { IHtmlParserService } from "./IHtmlParserService";
|
|
4
|
+
import { IDesignItem } from '../../item/IDesignItem';
|
|
5
|
+
export declare class LitElementParserService implements IHtmlParserService {
|
|
6
|
+
private _parserUrl;
|
|
7
|
+
private _esprimaUrl;
|
|
8
|
+
constructor(parserUrl?: string, esprimaUrl?: string);
|
|
9
|
+
parse(module: string, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer): Promise<IDesignItem[]>;
|
|
10
|
+
private _parseDiv;
|
|
11
|
+
_createDesignItemsRecursive(item: any, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer, namespace: string): IDesignItem;
|
|
12
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { DesignItem } from '../../item/DesignItem';
|
|
2
|
+
import { CssAttributeParser } from "../../helper/CssAttributeParser";
|
|
3
|
+
import { newElementFromString } from "../../helper/ElementHelper";
|
|
4
|
+
// Alternative Parser, cause when you use the Browser, it instanciates the CusomElements, and some Elemnts remove
|
|
5
|
+
// attributes from their DOM, so you loose Data
|
|
6
|
+
export class LitElementParserService {
|
|
7
|
+
_parserUrl;
|
|
8
|
+
_esprimaUrl;
|
|
9
|
+
constructor(parserUrl = '../../../../../node-html-parser-esm/dist/index.js', esprimaUrl = '../../../../../esprima-next/dist/esm/esprima.js') {
|
|
10
|
+
this._parserUrl = parserUrl;
|
|
11
|
+
this._esprimaUrl = esprimaUrl;
|
|
12
|
+
}
|
|
13
|
+
async parse(module, serviceContainer, instanceServiceContainer) {
|
|
14
|
+
let esprima = await import(this._esprimaUrl);
|
|
15
|
+
const parsedModule = esprima.parseModule(module);
|
|
16
|
+
const classDecl = parsedModule.body.find(x => x.type == esprima.Syntax.ClassDeclaration);
|
|
17
|
+
const renderMethod = classDecl.body.body.find(x => x.type == esprima.Syntax.MethodDefinition && x.key.name == 'render');
|
|
18
|
+
const renderMethodStatement = renderMethod.value.body.body[0];
|
|
19
|
+
const taggedTemplate = renderMethodStatement.argument;
|
|
20
|
+
const templateLiteral = taggedTemplate.quasi;
|
|
21
|
+
const html = templateLiteral.quasis.map(x => x.value.raw).join();
|
|
22
|
+
//@ts-ignore
|
|
23
|
+
let parser = await import(this._parserUrl);
|
|
24
|
+
const parsed = parser.parse(html, { comment: true });
|
|
25
|
+
let designItems = [];
|
|
26
|
+
for (let p of parsed.childNodes) {
|
|
27
|
+
let di = this._createDesignItemsRecursive(p, serviceContainer, instanceServiceContainer, null);
|
|
28
|
+
if (di != null)
|
|
29
|
+
designItems.push(di);
|
|
30
|
+
else
|
|
31
|
+
console.warn("NodeHtmlParserService - could not parse element", p);
|
|
32
|
+
}
|
|
33
|
+
return designItems;
|
|
34
|
+
}
|
|
35
|
+
_parseDiv = document.createElement("div");
|
|
36
|
+
_createDesignItemsRecursive(item, serviceContainer, instanceServiceContainer, namespace) {
|
|
37
|
+
let designItem = null;
|
|
38
|
+
if (item.nodeType == 1) {
|
|
39
|
+
let element;
|
|
40
|
+
let manualCreatedElement = false;
|
|
41
|
+
if (!namespace)
|
|
42
|
+
element = newElementFromString('<' + item.rawTagName + ' ' + item.rawAttrs + '></' + item.rawTagName + '>'); // some custom elements only parse attributes during constructor call
|
|
43
|
+
if (!element) {
|
|
44
|
+
if (namespace)
|
|
45
|
+
element = document.createElementNS(namespace, item.rawTagName);
|
|
46
|
+
else
|
|
47
|
+
element = document.createElement(item.rawTagName);
|
|
48
|
+
manualCreatedElement = true;
|
|
49
|
+
}
|
|
50
|
+
designItem = new DesignItem(element, serviceContainer, instanceServiceContainer);
|
|
51
|
+
let hideAtDesignTime = false;
|
|
52
|
+
let hideAtRunTime = false;
|
|
53
|
+
let lockAtDesignTime = false;
|
|
54
|
+
let style = '';
|
|
55
|
+
let attr = item.attributes;
|
|
56
|
+
for (let a in attr) {
|
|
57
|
+
if (a !== 'style') {
|
|
58
|
+
designItem.attributes.set(a, attr[a]);
|
|
59
|
+
if (manualCreatedElement) {
|
|
60
|
+
element.setAttribute(a, attr[a]);
|
|
61
|
+
}
|
|
62
|
+
if (a === 'node-projects-hide-at-design-time')
|
|
63
|
+
hideAtDesignTime = true;
|
|
64
|
+
else if (a === 'node-projects-hide-at-run-time')
|
|
65
|
+
hideAtRunTime = true;
|
|
66
|
+
else if (a === 'node-projects-lock-at-design-time')
|
|
67
|
+
lockAtDesignTime = true;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
style = attr[a];
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if ((element instanceof HTMLElement || element instanceof SVGElement) && style) {
|
|
74
|
+
let styleParser = new CssAttributeParser();
|
|
75
|
+
styleParser.parse(style);
|
|
76
|
+
for (let s of styleParser.entries) {
|
|
77
|
+
designItem.styles.set(s.name, s.value);
|
|
78
|
+
if (manualCreatedElement) {
|
|
79
|
+
element.style[s.name] = s.value;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (!lockAtDesignTime && (element instanceof HTMLElement || element instanceof SVGElement)) {
|
|
84
|
+
requestAnimationFrame(() => element.style.pointerEvents = 'auto');
|
|
85
|
+
}
|
|
86
|
+
designItem.hideAtDesignTime = hideAtDesignTime;
|
|
87
|
+
designItem.hideAtRunTime = hideAtRunTime;
|
|
88
|
+
designItem.lockAtDesignTime = lockAtDesignTime;
|
|
89
|
+
element.draggable = false; //even if it should be true, for better designer exp.
|
|
90
|
+
for (let c of item.childNodes) {
|
|
91
|
+
let di = this._createDesignItemsRecursive(c, serviceContainer, instanceServiceContainer, element instanceof SVGElement ? 'http://www.w3.org/2000/svg' : null);
|
|
92
|
+
designItem._insertChildInternal(di);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else if (item.nodeType == 3) {
|
|
96
|
+
this._parseDiv.innerHTML = item.rawText;
|
|
97
|
+
let element = this._parseDiv.childNodes[0];
|
|
98
|
+
designItem = new DesignItem(element, serviceContainer, instanceServiceContainer);
|
|
99
|
+
}
|
|
100
|
+
else if (item.nodeType == 8) {
|
|
101
|
+
let element = document.createComment(item.rawText);
|
|
102
|
+
designItem = new DesignItem(element, serviceContainer, instanceServiceContainer);
|
|
103
|
+
}
|
|
104
|
+
return designItem;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { InstanceServiceContainer } from "../InstanceServiceContainer";
|
|
2
|
+
import { ServiceContainer } from "../ServiceContainer";
|
|
3
|
+
import { IHtmlParserService } from "./IHtmlParserService";
|
|
4
|
+
import { IDesignItem } from '../../item/IDesignItem';
|
|
5
|
+
export declare class NodeHtmlParserService implements IHtmlParserService {
|
|
6
|
+
private _parserUrl;
|
|
7
|
+
constructor(parserUrl?: string);
|
|
8
|
+
parse(html: string, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer): Promise<IDesignItem[]>;
|
|
9
|
+
private _parseDiv;
|
|
10
|
+
_createDesignItemsRecursive(item: any, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer, namespace: string): IDesignItem;
|
|
11
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { DesignItem } from '../../item/DesignItem';
|
|
2
|
+
import { CssAttributeParser } from "../../helper/CssAttributeParser";
|
|
3
|
+
import { newElementFromString } from "../../helper/ElementHelper";
|
|
4
|
+
// Alternative Parser, cause when you use the Browser, it instanciates the CusomElements, and some Elemnts remove
|
|
5
|
+
// attributes from their DOM, so you loose Data
|
|
6
|
+
export class NodeHtmlParserService {
|
|
7
|
+
_parserUrl;
|
|
8
|
+
constructor(parserUrl = '../../../../../node-html-parser-esm/dist/index.js') {
|
|
9
|
+
this._parserUrl = parserUrl;
|
|
10
|
+
}
|
|
11
|
+
async parse(html, serviceContainer, instanceServiceContainer) {
|
|
12
|
+
//@ts-ignore
|
|
13
|
+
let parser = await import(this._parserUrl);
|
|
14
|
+
const parsed = parser.parse(html, { comment: true });
|
|
15
|
+
let designItems = [];
|
|
16
|
+
for (let p of parsed.childNodes) {
|
|
17
|
+
let di = this._createDesignItemsRecursive(p, serviceContainer, instanceServiceContainer, null);
|
|
18
|
+
if (di != null)
|
|
19
|
+
designItems.push(di);
|
|
20
|
+
else
|
|
21
|
+
console.warn("NodeHtmlParserService - could not parse element", p);
|
|
22
|
+
}
|
|
23
|
+
return designItems;
|
|
24
|
+
}
|
|
25
|
+
_parseDiv = document.createElement("div");
|
|
26
|
+
_createDesignItemsRecursive(item, serviceContainer, instanceServiceContainer, namespace) {
|
|
27
|
+
let designItem = null;
|
|
28
|
+
if (item.nodeType == 1) {
|
|
29
|
+
let element;
|
|
30
|
+
let manualCreatedElement = false;
|
|
31
|
+
if (!namespace)
|
|
32
|
+
element = newElementFromString('<' + item.rawTagName + ' ' + item.rawAttrs + '></' + item.rawTagName + '>'); // some custom elements only parse attributes during constructor call
|
|
33
|
+
if (!element) {
|
|
34
|
+
if (namespace)
|
|
35
|
+
element = document.createElementNS(namespace, item.rawTagName);
|
|
36
|
+
else
|
|
37
|
+
element = document.createElement(item.rawTagName);
|
|
38
|
+
manualCreatedElement = true;
|
|
39
|
+
}
|
|
40
|
+
designItem = new DesignItem(element, serviceContainer, instanceServiceContainer);
|
|
41
|
+
let hideAtDesignTime = false;
|
|
42
|
+
let hideAtRunTime = false;
|
|
43
|
+
let lockAtDesignTime = false;
|
|
44
|
+
let style = '';
|
|
45
|
+
let attr = item.attributes;
|
|
46
|
+
for (let a in attr) {
|
|
47
|
+
if (a !== 'style') {
|
|
48
|
+
designItem.attributes.set(a, attr[a]);
|
|
49
|
+
if (manualCreatedElement) {
|
|
50
|
+
element.setAttribute(a, attr[a]);
|
|
51
|
+
}
|
|
52
|
+
if (a === 'node-projects-hide-at-design-time')
|
|
53
|
+
hideAtDesignTime = true;
|
|
54
|
+
else if (a === 'node-projects-hide-at-run-time')
|
|
55
|
+
hideAtRunTime = true;
|
|
56
|
+
else if (a === 'node-projects-lock-at-design-time')
|
|
57
|
+
lockAtDesignTime = true;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
style = attr[a];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if ((element instanceof HTMLElement || element instanceof SVGElement) && style) {
|
|
64
|
+
let styleParser = new CssAttributeParser();
|
|
65
|
+
styleParser.parse(style);
|
|
66
|
+
for (let s of styleParser.entries) {
|
|
67
|
+
designItem.styles.set(s.name, s.value);
|
|
68
|
+
if (manualCreatedElement) {
|
|
69
|
+
element.style[s.name] = s.value;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (!lockAtDesignTime && (element instanceof HTMLElement || element instanceof SVGElement)) {
|
|
74
|
+
requestAnimationFrame(() => element.style.pointerEvents = 'auto');
|
|
75
|
+
}
|
|
76
|
+
designItem.hideAtDesignTime = hideAtDesignTime;
|
|
77
|
+
designItem.hideAtRunTime = hideAtRunTime;
|
|
78
|
+
designItem.lockAtDesignTime = lockAtDesignTime;
|
|
79
|
+
element.draggable = false; //even if it should be true, for better designer exp.
|
|
80
|
+
for (let c of item.childNodes) {
|
|
81
|
+
let di = this._createDesignItemsRecursive(c, serviceContainer, instanceServiceContainer, element instanceof SVGElement ? 'http://www.w3.org/2000/svg' : null);
|
|
82
|
+
designItem._insertChildInternal(di);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else if (item.nodeType == 3) {
|
|
86
|
+
this._parseDiv.innerHTML = item.rawText;
|
|
87
|
+
let element = this._parseDiv.childNodes[0];
|
|
88
|
+
designItem = new DesignItem(element, serviceContainer, instanceServiceContainer);
|
|
89
|
+
}
|
|
90
|
+
else if (item.nodeType == 8) {
|
|
91
|
+
let element = document.createComment(item.rawText);
|
|
92
|
+
designItem = new DesignItem(element, serviceContainer, instanceServiceContainer);
|
|
93
|
+
}
|
|
94
|
+
return designItem;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DefaultPlacementService } from './DefaultPlacementService.js';
|
|
1
2
|
export class FlexBoxPlacementService {
|
|
2
3
|
enterContainer(container, items) {
|
|
3
4
|
for (let i of items) {
|
|
@@ -9,6 +10,12 @@ export class FlexBoxPlacementService {
|
|
|
9
10
|
}
|
|
10
11
|
}
|
|
11
12
|
leaveContainer(container, items) {
|
|
13
|
+
for (let i of items) {
|
|
14
|
+
if (!i.lastContainerSize) {
|
|
15
|
+
const rect = i.element.getBoundingClientRect();
|
|
16
|
+
i.lastContainerSize = { width: rect.width, height: rect.height };
|
|
17
|
+
}
|
|
18
|
+
}
|
|
12
19
|
}
|
|
13
20
|
serviceForContainer(container, containerStyle) {
|
|
14
21
|
if (containerStyle.display == 'flex' || containerStyle.display == 'inline-flex')
|
|
@@ -28,17 +35,68 @@ export class FlexBoxPlacementService {
|
|
|
28
35
|
return container.element.getBoundingClientRect();
|
|
29
36
|
}
|
|
30
37
|
placePoint(event, placementView, container, startPoint, offsetInControl, newPoint, items) {
|
|
31
|
-
|
|
38
|
+
const defaultPlacementService = container.serviceContainer.getLastServiceWhere('containerService', x => x instanceof DefaultPlacementService);
|
|
39
|
+
return defaultPlacementService.placePoint(event, placementView, container, startPoint, offsetInControl, newPoint, items);
|
|
32
40
|
}
|
|
33
41
|
place(event, placementView, container, startPoint, offsetInControl, newPoint, items) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
+
const pos = placementView.getNormalizedEventCoordinates(event);
|
|
43
|
+
const style = getComputedStyle(container.element);
|
|
44
|
+
const childrenWithPos = Array.from(container.children()).filter(x => !x.isEmptyTextNode).map(x => [x, placementView.getNormalizedElementCoordinates(x.element)]);
|
|
45
|
+
if (style.flexDirection == 'row') {
|
|
46
|
+
childrenWithPos.sort(x => x[1].x);
|
|
47
|
+
let elBefore = null;
|
|
48
|
+
for (let c of childrenWithPos) {
|
|
49
|
+
if (c[1].x + c[1].width / 2 < pos.x) {
|
|
50
|
+
elBefore = c;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
let posBefore = childrenWithPos.indexOf(elBefore);
|
|
54
|
+
let posDrag = childrenWithPos.indexOf(childrenWithPos.find(x => x[0] == items[0]));
|
|
55
|
+
if (elBefore && elBefore[0] != items[0]) {
|
|
56
|
+
if (posBefore + 1 === posDrag)
|
|
57
|
+
return;
|
|
58
|
+
let cg = items[0].openGroup('move in flexbox');
|
|
59
|
+
items[0].remove();
|
|
60
|
+
elBefore[0].insertAdjacentElement(items[0], 'afterend');
|
|
61
|
+
cg.commit();
|
|
62
|
+
}
|
|
63
|
+
else if (elBefore == null) {
|
|
64
|
+
if (posDrag == 0)
|
|
65
|
+
return;
|
|
66
|
+
let cg = items[0].openGroup('move in flexbox');
|
|
67
|
+
items[0].remove();
|
|
68
|
+
container.insertChild(items[0], 0);
|
|
69
|
+
cg.commit();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else if (style.flexDirection == 'column') {
|
|
73
|
+
childrenWithPos.sort(x => x[1].y);
|
|
74
|
+
let elBefore = null;
|
|
75
|
+
for (let c of childrenWithPos) {
|
|
76
|
+
if (c[1].y + c[1].height / 2 < pos.y) {
|
|
77
|
+
elBefore = c;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
let posBefore = childrenWithPos.indexOf(elBefore);
|
|
81
|
+
let posDrag = childrenWithPos.indexOf(childrenWithPos.find(x => x[0] == items[0]));
|
|
82
|
+
if (elBefore && elBefore[0] != items[0]) {
|
|
83
|
+
if (posBefore + 1 === posDrag)
|
|
84
|
+
return;
|
|
85
|
+
let cg = items[0].openGroup('move in flexbox');
|
|
86
|
+
items[0].remove();
|
|
87
|
+
elBefore[0].insertAdjacentElement(items[0], 'afterend');
|
|
88
|
+
cg.commit();
|
|
89
|
+
}
|
|
90
|
+
else if (elBefore == null) {
|
|
91
|
+
if (posDrag == 0)
|
|
92
|
+
return;
|
|
93
|
+
let cg = items[0].openGroup('move in flexbox');
|
|
94
|
+
items[0].remove();
|
|
95
|
+
container.insertChild(items[0], 0);
|
|
96
|
+
cg.commit();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
placementView.extensionManager.refreshAllExtensions([container]);
|
|
42
100
|
}
|
|
43
101
|
finishPlace(event, placementView, container, startPoint, offsetInControl, newPoint, items) {
|
|
44
102
|
}
|
|
@@ -3,7 +3,7 @@ import { IExtensionManager } from "./IExtensionManger";
|
|
|
3
3
|
import { OverlayLayerView } from '../overlayLayerView';
|
|
4
4
|
import { OverlayLayer } from './OverlayLayer';
|
|
5
5
|
export declare abstract class AbstractExtensionBase {
|
|
6
|
-
protected overlays:
|
|
6
|
+
protected overlays: SVGElement[];
|
|
7
7
|
protected overlayLayerView: OverlayLayerView;
|
|
8
8
|
protected extensionManager: IExtensionManager;
|
|
9
9
|
protected designerCanvas: IDesignerCanvas;
|
|
@@ -13,4 +13,5 @@ export declare abstract class AbstractExtensionBase {
|
|
|
13
13
|
protected _drawCircle(x: number, y: number, radius: number, className?: string, circle?: SVGCircleElement, overlayLayer?: OverlayLayer): SVGCircleElement;
|
|
14
14
|
protected _drawRect(x: number, y: number, w: number, h: number, className?: string, rect?: SVGRectElement, overlayLayer?: OverlayLayer): SVGRectElement;
|
|
15
15
|
protected _drawText(text: string, x: number, y: number, className?: string, textEl?: SVGTextElement, overlayLayer?: OverlayLayer): SVGTextElement;
|
|
16
|
+
protected _drawTextWithBackground(text: string, x: number, y: number, backgroundColor: string, className?: string, existingEls?: [SVGFilterElement, SVGFEFloodElement, SVGTextElement, SVGTextElement], overlayLayer?: OverlayLayer): [SVGFilterElement, SVGFEFloodElement, SVGTextElement, SVGTextElement];
|
|
16
17
|
}
|
|
@@ -47,4 +47,11 @@ export class AbstractExtensionBase {
|
|
|
47
47
|
}
|
|
48
48
|
return newText;
|
|
49
49
|
}
|
|
50
|
+
_drawTextWithBackground(text, x, y, backgroundColor, className, existingEls, overlayLayer) {
|
|
51
|
+
const newEls = this.overlayLayerView.drawTextWithBackground(text, x, y, backgroundColor, className, existingEls, overlayLayer);
|
|
52
|
+
if (!existingEls) {
|
|
53
|
+
this.overlays.push(...newEls);
|
|
54
|
+
}
|
|
55
|
+
return newEls;
|
|
56
|
+
}
|
|
50
57
|
}
|
|
@@ -7,9 +7,7 @@ export declare class PositionExtension extends AbstractExtension {
|
|
|
7
7
|
private _line2;
|
|
8
8
|
private _line3;
|
|
9
9
|
private _line4;
|
|
10
|
-
private _rectX;
|
|
11
10
|
private _textX;
|
|
12
|
-
private _rectY;
|
|
13
11
|
private _textY;
|
|
14
12
|
constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
|
|
15
13
|
extend(): void;
|
|
@@ -4,9 +4,7 @@ export class PositionExtension extends AbstractExtension {
|
|
|
4
4
|
_line2;
|
|
5
5
|
_line3;
|
|
6
6
|
_line4;
|
|
7
|
-
_rectX;
|
|
8
7
|
_textX;
|
|
9
|
-
_rectY;
|
|
10
8
|
_textY;
|
|
11
9
|
constructor(extensionManager, designerView, extendedItem) {
|
|
12
10
|
super(extensionManager, designerView, extendedItem);
|
|
@@ -31,12 +29,12 @@ export class PositionExtension extends AbstractExtension {
|
|
|
31
29
|
this._line4.style.strokeDasharray = '' + (4 / this.designerCanvas.scaleFactor);
|
|
32
30
|
let x = Math.round(itemRect.x - itemParentRect.x);
|
|
33
31
|
let y = Math.round(itemRect.y - itemParentRect.y);
|
|
34
|
-
this.
|
|
35
|
-
this._textX =
|
|
36
|
-
this._textX.style.fontSize = '
|
|
37
|
-
this.
|
|
38
|
-
this._textY =
|
|
39
|
-
this._textY.style.fontSize = '
|
|
32
|
+
this._textX = this._drawTextWithBackground('' + x, itemParentRect.x + x / 2, itemRect.y + itemRect.height / 2, 'white', 'svg-position-text', this._textX);
|
|
33
|
+
this._textX[2].style.fontSize = (12 / this.designerCanvas.scaleFactor) + 'px';
|
|
34
|
+
this._textX[3].style.fontSize = (12 / this.designerCanvas.scaleFactor) + 'px';
|
|
35
|
+
this._textY = this._drawTextWithBackground('' + y, itemRect.x + itemRect.width / 2, itemParentRect.y + y / 2, 'white', 'svg-position-text', this._textY);
|
|
36
|
+
this._textY[2].style.fontSize = (12 / this.designerCanvas.scaleFactor) + 'px';
|
|
37
|
+
this._textY[3].style.fontSize = (12 / this.designerCanvas.scaleFactor) + 'px';
|
|
40
38
|
}
|
|
41
39
|
dispose() {
|
|
42
40
|
this._removeAllOverlays();
|
|
@@ -11,6 +11,6 @@ export class PositionExtensionProvider {
|
|
|
11
11
|
return new PositionExtension(extensionManager, designerView, designItem);
|
|
12
12
|
}
|
|
13
13
|
style = css `
|
|
14
|
-
.svg-position-text
|
|
14
|
+
.svg-position-text { text-anchor: middle; alignment-baseline: central; }
|
|
15
15
|
`;
|
|
16
16
|
}
|
|
@@ -7,6 +7,8 @@ export class ResizeExtensionProvider {
|
|
|
7
7
|
this.resizeAllSelected = resizeAllSelected;
|
|
8
8
|
}
|
|
9
9
|
shouldExtend(extensionManager, designerView, designItem) {
|
|
10
|
+
if (designItem.element instanceof SVGElement)
|
|
11
|
+
return false;
|
|
10
12
|
return designItem.nodeType == NodeType.Element;
|
|
11
13
|
}
|
|
12
14
|
getExtension(extensionManager, designerView, designItem) {
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { IDesignItem } from "../../../../item/IDesignItem";
|
|
2
|
+
import { IDesignerCanvas } from "../../IDesignerCanvas";
|
|
3
|
+
import { AbstractExtension } from "../AbstractExtension";
|
|
4
|
+
import { IExtensionManager } from "../IExtensionManger";
|
|
5
|
+
export declare class EllipsisExtension extends AbstractExtension {
|
|
6
|
+
private _parentRect;
|
|
7
|
+
private _ellipseElement;
|
|
8
|
+
private _circlePos;
|
|
9
|
+
private _startPos;
|
|
10
|
+
private _lastPos;
|
|
11
|
+
private _originalPoint;
|
|
12
|
+
private _cx;
|
|
13
|
+
private _cy;
|
|
14
|
+
private _rx;
|
|
15
|
+
private _ry;
|
|
16
|
+
private _newRx;
|
|
17
|
+
private _newRy;
|
|
18
|
+
private _circle1;
|
|
19
|
+
private _circle2;
|
|
20
|
+
private _circle3;
|
|
21
|
+
private _circle4;
|
|
22
|
+
constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
|
|
23
|
+
extend(): void;
|
|
24
|
+
pointerEvent(event: PointerEvent, circle: SVGCircleElement, e: SVGEllipseElement, index: number): void;
|
|
25
|
+
_drawPathCircle(x: number, y: number, e: SVGEllipseElement, index: number): SVGCircleElement;
|
|
26
|
+
_redrawPathCircle(x: number, y: number, oldCircle: SVGCircleElement): SVGCircleElement;
|
|
27
|
+
refresh(): void;
|
|
28
|
+
dispose(): void;
|
|
29
|
+
}
|