@node-projects/web-component-designer 0.1.12 → 0.1.13
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/CssUnitConverter.js +1 -1
- package/dist/elements/helper/ElementHelper.js +1 -1
- package/dist/elements/helper/GridHelper.js +1 -2
- package/dist/elements/helper/LayoutHelper.js +2 -2
- package/dist/elements/helper/NpmPackageLoader.js +2 -2
- package/dist/elements/helper/SwitchContainerHelper.js +2 -3
- package/dist/elements/helper/TransformHelper.d.ts +1 -1
- package/dist/elements/helper/TransformHelper.js +32 -9
- package/dist/elements/item/DesignItem.js +1 -1
- package/dist/elements/services/bindingsService/SpecialTagsBindingService.js +1 -1
- package/dist/elements/services/dragDropService/DragDropService.js +1 -1
- package/dist/elements/services/elementsService/IElementDefinition.d.ts +0 -6
- package/dist/elements/services/htmlWriterService/HtmlWriterService.js +1 -1
- package/dist/elements/services/instanceService/DefaultInstanceService.js +1 -2
- package/dist/elements/services/placementService/DefaultPlacementService.js +1 -1
- package/dist/elements/services/propertiesService/propertyEditors/special/GridAssignedRowColumnPropertyEditor.js +1 -1
- package/dist/elements/services/propertiesService/propertyEditors/special/MetricsPropertyEditor.js +1 -1
- package/dist/elements/services/propertiesService/services/AbstractPropertiesService.d.ts +4 -3
- package/dist/elements/services/propertiesService/services/AbstractPropertiesService.js +15 -10
- package/dist/elements/services/propertiesService/services/AttributesPropertiesService.js +1 -1
- package/dist/elements/services/propertiesService/services/ContentAndIdPropertiesService.js +1 -1
- package/dist/elements/services/propertiesService/services/CssCurrentPropertiesService.js +1 -1
- package/dist/elements/services/stylesheetService/AbstractStylesheetService.js +1 -1
- package/dist/elements/widgets/designerView/DomConverter.js +1 -1
- package/dist/elements/widgets/designerView/designerCanvas.js +1 -1
- package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension.js +3 -3
- package/dist/elements/widgets/designerView/extensions/ExtensionManager.js +7 -3
- package/dist/elements/widgets/designerView/extensions/pointerExtensions/AbstractDesignerPointerExtension.js +1 -4
- package/dist/elements/widgets/designerView/tools/TextTool.js +1 -1
- package/dist/elements/widgets/treeView/treeView.js +1 -1
- package/package.json +1 -1
|
@@ -23,7 +23,7 @@ export function convertCssUnitToPixel(cssValue, target, percentTarget) {
|
|
|
23
23
|
'lh': value => value * parseFloat(getComputedStyle(target).lineHeight),
|
|
24
24
|
'rlh': value => value * parseFloat(getComputedStyle(document.documentElement).lineHeight),
|
|
25
25
|
'%': value => value / 100 * (percentTarget == 'height' ? target.getBoundingClientRect().height : target.getBoundingClientRect().width),
|
|
26
|
-
/*
|
|
26
|
+
/*TODO: container units
|
|
27
27
|
//find parent with computed style where container-type is inline-size or size (regarding to query type)
|
|
28
28
|
//use this size for calculation
|
|
29
29
|
'cqw':
|
|
@@ -59,7 +59,7 @@ const windowOffsetsCacheKey = Symbol('windowOffsetsCacheKey');
|
|
|
59
59
|
export function getElementsWindowOffsetWithoutSelfAndParentTransformations(element, zoom, cache = {}) {
|
|
60
60
|
let offsetLeft = 0;
|
|
61
61
|
let offsetTop = 0;
|
|
62
|
-
let ch = cache[windowOffsetsCacheKey]
|
|
62
|
+
let ch = cache[windowOffsetsCacheKey] ??= new Map();
|
|
63
63
|
let lst = [];
|
|
64
64
|
while (element) {
|
|
65
65
|
let cachedObj = ch.get(element);
|
|
@@ -18,8 +18,7 @@ export function getElementGridInformation(element) {
|
|
|
18
18
|
return { colSpan, rowSpan };
|
|
19
19
|
}
|
|
20
20
|
export function calculateGridInformation(designItem) {
|
|
21
|
-
//
|
|
22
|
-
//same name should combine columns/rows
|
|
21
|
+
//TODO: same name should combine columns/rows
|
|
23
22
|
let itemRect = designItem.instanceServiceContainer.designerCanvas.getNormalizedElementCoordinates(designItem.element);
|
|
24
23
|
let transformedCornerPoints = getDesignerCanvasNormalizedTransformedCornerDOMPoints(designItem.element, null, designItem.instanceServiceContainer.designerCanvas);
|
|
25
24
|
const computedStyle = getComputedStyle(designItem.element);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
1
|
+
//TODO: this function should return the correct property to change a layout,
|
|
2
|
+
// for example left/right when left or right is used,
|
|
3
3
|
//maybe margin on grid? or transform??
|
|
4
4
|
export function filterChildPlaceItems(items) {
|
|
5
5
|
const filterdPlaceItems = [];
|
|
@@ -119,7 +119,7 @@ export class NpmPackageLoader {
|
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
121
|
if (serviceContainer && paletteTree) {
|
|
122
|
-
//
|
|
122
|
+
//TODO: should be retriggered by service container, or changeing list in container
|
|
123
123
|
paletteTree.loadControls(serviceContainer, serviceContainer.elementsServices);
|
|
124
124
|
}
|
|
125
125
|
/* Package Hacks */
|
|
@@ -230,7 +230,7 @@ export class NpmPackageLoader {
|
|
|
230
230
|
const map = importShim.getImportMap().imports;
|
|
231
231
|
const importMap = { imports: {}, scopes: {} };
|
|
232
232
|
if (!map.hasOwnProperty(packageJsonObj.name)) {
|
|
233
|
-
//
|
|
233
|
+
//TODO: use exports of package.json for importMap
|
|
234
234
|
if (packageJsonObj.exports) {
|
|
235
235
|
/* "exports": {
|
|
236
236
|
".": {
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
export function switchContainer(items, newContainer, resizeNewContainer = false, newContainerOffset = 0) {
|
|
2
|
-
//
|
|
3
|
-
|
|
4
|
-
//- position non absolute, or absolute from bottom or right
|
|
2
|
+
//TODO: switch to other containers like grid, flexbox, ...
|
|
3
|
+
//TODO: position non absolute, or absolute from bottom or right
|
|
5
4
|
for (let i of items) {
|
|
6
5
|
if (i == newContainer || i.element.contains(newContainer.element)) {
|
|
7
6
|
console.warn('could not move items into of itself or a child');
|
|
@@ -10,7 +10,7 @@ export declare function cssMatrixToMatrixArray(cssMatrix: string): number[];
|
|
|
10
10
|
export declare function getRotationAngleFromMatrix(matrixArray: number[], domMatrix: DOMMatrix): any;
|
|
11
11
|
export declare function addVectors(vectorA: [number, number], vectorB: [number, number]): [number, number];
|
|
12
12
|
export declare function getDesignerCanvasNormalizedTransformedOriginWithoutParentTransformation(element: HTMLElement, designerCanvas: IDesignerCanvas): DOMPoint;
|
|
13
|
-
export declare function getResultingTransformationBetweenElementAndAllAncestors(element: HTMLElement, ancestor: HTMLElement, excludeAncestor?: boolean): DOMMatrix;
|
|
13
|
+
export declare function getResultingTransformationBetweenElementAndAllAncestors(element: HTMLElement, ancestor: HTMLElement, excludeAncestor?: boolean, cache?: Record<string | symbol, any>): DOMMatrix;
|
|
14
14
|
export declare function getByParentsTransformedPointRelatedToCanvas(element: HTMLElement, point: DOMPoint, designerCanvas: IDesignerCanvas, cache?: Record<string | symbol, any>): IPoint;
|
|
15
15
|
export declare function getDesignerCanvasNormalizedTransformedPoint(element: HTMLElement, point: IPoint, designerCanvas: IDesignerCanvas): IPoint;
|
|
16
16
|
export declare function getElementSize(element: HTMLElement): {
|
|
@@ -102,19 +102,33 @@ export function addVectors(vectorA, vectorB) {
|
|
|
102
102
|
return [vectorA[0] + vectorB[0], vectorA[1] + vectorB[1]];
|
|
103
103
|
}
|
|
104
104
|
export function getDesignerCanvasNormalizedTransformedOriginWithoutParentTransformation(element, designerCanvas) {
|
|
105
|
-
const
|
|
105
|
+
const toSplit = getComputedStyle(element).transformOrigin.split(' ');
|
|
106
|
+
const tfX = parseFloat(toSplit[0]);
|
|
107
|
+
const tfY = parseFloat(toSplit[1]);
|
|
108
|
+
const top0 = new DOMPointReadOnly(-tfX, -tfY, 0, 0);
|
|
106
109
|
const p0Offsets = getElementsWindowOffsetWithoutSelfAndParentTransformations(element, designerCanvas.zoomFactor);
|
|
107
110
|
const transformOriginAbsolutRelatedToWindowWithoutAnyTransformation = new DOMPoint(p0Offsets.offsetLeft - top0.x, p0Offsets.offsetTop - top0.y);
|
|
108
111
|
const designerCanvasNormalizedTransformedOrigin = new DOMPoint(transformOriginAbsolutRelatedToWindowWithoutAnyTransformation.x - designerCanvas.containerBoundingRect.x, transformOriginAbsolutRelatedToWindowWithoutAnyTransformation.y - designerCanvas.containerBoundingRect.y);
|
|
109
112
|
return designerCanvasNormalizedTransformedOrigin;
|
|
110
113
|
}
|
|
111
|
-
|
|
112
|
-
|
|
114
|
+
const elemntMatrixCacheKey = Symbol('windowOffsetsCacheKey');
|
|
115
|
+
export function getResultingTransformationBetweenElementAndAllAncestors(element, ancestor, excludeAncestor, cache = {}) {
|
|
116
|
+
let ch = cache[elemntMatrixCacheKey] ??= new Map();
|
|
117
|
+
let lst = [];
|
|
113
118
|
let actualElement = element;
|
|
114
119
|
let actualElementMatrix;
|
|
115
120
|
let newElementMatrix;
|
|
116
121
|
let originalElementAndAllParentsMultipliedMatrix;
|
|
117
122
|
while (actualElement != ancestor) {
|
|
123
|
+
let cachedObj = ch.get(actualElement);
|
|
124
|
+
if (cachedObj) {
|
|
125
|
+
if (originalElementAndAllParentsMultipliedMatrix)
|
|
126
|
+
originalElementAndAllParentsMultipliedMatrix = cachedObj[0].multiply(originalElementAndAllParentsMultipliedMatrix);
|
|
127
|
+
else
|
|
128
|
+
originalElementAndAllParentsMultipliedMatrix = cachedObj[0];
|
|
129
|
+
lst.forEach(x => x[0] = x[0].multiply(originalElementAndAllParentsMultipliedMatrix));
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
118
132
|
const newElement = getParentElementIncludingSlots(actualElement);
|
|
119
133
|
actualElementMatrix = getElementCombinedTransform(actualElement);
|
|
120
134
|
newElementMatrix = getElementCombinedTransform(newElement);
|
|
@@ -125,6 +139,10 @@ export function getResultingTransformationBetweenElementAndAllAncestors(element,
|
|
|
125
139
|
else if (newElement != ancestor || !excludeAncestor) {
|
|
126
140
|
originalElementAndAllParentsMultipliedMatrix = originalElementAndAllParentsMultipliedMatrix.multiply(newElementMatrix);
|
|
127
141
|
}
|
|
142
|
+
lst.forEach(x => x[0] = x[0].multiply(originalElementAndAllParentsMultipliedMatrix));
|
|
143
|
+
const cacheEntry = [originalElementAndAllParentsMultipliedMatrix];
|
|
144
|
+
lst.push(cacheEntry);
|
|
145
|
+
ch.set(actualElement, cacheEntry);
|
|
128
146
|
actualElement = newElement;
|
|
129
147
|
}
|
|
130
148
|
return originalElementAndAllParentsMultipliedMatrix;
|
|
@@ -137,10 +155,14 @@ export function getByParentsTransformedPointRelatedToCanvas(element, point, desi
|
|
|
137
155
|
while (actualElement != canvas) {
|
|
138
156
|
const parentElement = getParentElementIncludingSlots(actualElement);
|
|
139
157
|
const elementWindowOffset = getElementsWindowOffsetWithoutSelfAndParentTransformations(parentElement, designerCanvas.zoomFactor, cache);
|
|
140
|
-
const
|
|
158
|
+
const toSplit = getComputedStyle(parentElement).transformOrigin.split(' ');
|
|
159
|
+
const tfX = parseFloat(toSplit[0]);
|
|
160
|
+
const tfY = parseFloat(toSplit[1]);
|
|
161
|
+
const parentElementTransformOrigin = new DOMPoint(elementWindowOffset.offsetLeft - designerCanvas.outerRect.x + tfX, elementWindowOffset.offsetTop - designerCanvas.outerRect.y + tfY);
|
|
141
162
|
if (actualElement == element) {
|
|
142
|
-
|
|
143
|
-
parentElementTransformOrigin.
|
|
163
|
+
const mtx = extractTranslationFromDOMMatrix(new DOMMatrix(element.style.transform));
|
|
164
|
+
parentElementTransformOrigin.x -= mtx.x;
|
|
165
|
+
parentElementTransformOrigin.y -= mtx.y;
|
|
144
166
|
}
|
|
145
167
|
const parentElementTransformOriginToPointVector = new DOMPointReadOnly(-parentElementTransformOrigin.x + (element == actualElement ? point.x : byParentTransformedPointRelatedToCanvas.x), -parentElementTransformOrigin.y + (element == actualElement ? point.y : byParentTransformedPointRelatedToCanvas.y));
|
|
146
168
|
parentElementTransformOriginToPointVectorTransformed = parentElementTransformOriginToPointVector.matrixTransform(new DOMMatrix(getComputedStyle(parentElement).transform));
|
|
@@ -195,8 +217,9 @@ export function getDesignerCanvasNormalizedTransformedCornerDOMPoints(element, u
|
|
|
195
217
|
x: p0OffsetsRelatedToCanvas.x + width + intUntransformedCornerPointsOffset.x,
|
|
196
218
|
y: p0OffsetsRelatedToCanvas.y + height + intUntransformedCornerPointsOffset.y
|
|
197
219
|
});
|
|
198
|
-
const
|
|
199
|
-
const
|
|
220
|
+
const toSplit = getComputedStyle(element).transformOrigin.split(' ');
|
|
221
|
+
const tfX = parseFloat(toSplit[0]);
|
|
222
|
+
const tfY = parseFloat(toSplit[1]);
|
|
200
223
|
const transformOriginWithoutTransformRelatedToCanvas = DOMPointReadOnly.fromPoint({
|
|
201
224
|
x: p0OffsetsRelatedToCanvas.x + tfX,
|
|
202
225
|
y: p0OffsetsRelatedToCanvas.y + tfY,
|
|
@@ -208,7 +231,7 @@ export function getDesignerCanvasNormalizedTransformedCornerDOMPoints(element, u
|
|
|
208
231
|
let top1 = new DOMPoint(-(transformOriginWithoutTransformRelatedToCanvas.x - elementWithoutTransformCornerDOMPoints[topright].x), -(transformOriginWithoutTransformRelatedToCanvas.y - elementWithoutTransformCornerDOMPoints[topright].y));
|
|
209
232
|
let top2 = new DOMPoint(-(transformOriginWithoutTransformRelatedToCanvas.x - elementWithoutTransformCornerDOMPoints[bottomleft].x), -(transformOriginWithoutTransformRelatedToCanvas.y - elementWithoutTransformCornerDOMPoints[bottomleft].y));
|
|
210
233
|
let top3 = new DOMPoint(-(transformOriginWithoutTransformRelatedToCanvas.x - elementWithoutTransformCornerDOMPoints[bottomright].x), -(transformOriginWithoutTransformRelatedToCanvas.y - elementWithoutTransformCornerDOMPoints[bottomright].y));
|
|
211
|
-
let originalElementAndAllParentsMultipliedMatrix = getResultingTransformationBetweenElementAndAllAncestors(element, designerCanvas.canvas, true);
|
|
234
|
+
let originalElementAndAllParentsMultipliedMatrix = getResultingTransformationBetweenElementAndAllAncestors(element, designerCanvas.canvas, true, cache);
|
|
212
235
|
let top0Transformed = top0.matrixTransform(originalElementAndAllParentsMultipliedMatrix);
|
|
213
236
|
let top1Transformed = top1.matrixTransform(originalElementAndAllParentsMultipliedMatrix);
|
|
214
237
|
let top2Transformed = top2.matrixTransform(originalElementAndAllParentsMultipliedMatrix);
|
|
@@ -465,7 +465,7 @@ export class DesignItem {
|
|
|
465
465
|
this._childArray.splice(index, 0, designItem);
|
|
466
466
|
}
|
|
467
467
|
designItem._parent = this;
|
|
468
|
-
//
|
|
468
|
+
//TODO: is this still needed???
|
|
469
469
|
if (this.instanceServiceContainer.selectionService.primarySelection == designItem) {
|
|
470
470
|
designItem.instanceServiceContainer.designerCanvas.extensionManager.applyExtension(designItem.parent, ExtensionType.PrimarySelectionContainer);
|
|
471
471
|
if (designItem.getPlacementService().isEnterableContainer(this))
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { BindingTarget } from "../../item/BindingTarget.js";
|
|
2
2
|
import { BindingMode } from "../../item/BindingMode.js";
|
|
3
|
-
/* Service wich read
|
|
3
|
+
/* Service wich read bindings from special HTML elements -> like tag-binding */
|
|
4
4
|
//TODO: refactor so we could use it
|
|
5
5
|
export class SpecialTagsBindingService {
|
|
6
6
|
static type = 'visu-tagbinding-binding';
|
|
@@ -72,7 +72,7 @@ export class DragDropService {
|
|
|
72
72
|
const containerStyle = getComputedStyle(newContainerElementDesignItem.element);
|
|
73
73
|
newContainerService = designerCanvas.serviceContainer.getLastServiceWhere('containerService', x => x.serviceForContainer(newContainerElementDesignItem, containerStyle));
|
|
74
74
|
if (newContainerService) {
|
|
75
|
-
//TODO: Maybe the check for SVG
|
|
75
|
+
//TODO: Maybe the check for SVG Element should be in "canEnterByDrop"?
|
|
76
76
|
if (newContainerService.isEnterableContainer(newContainerElementDesignItem) && !(newContainerElementDesignItem.element instanceof SVGElement)) {
|
|
77
77
|
break;
|
|
78
78
|
}
|
|
@@ -16,12 +16,6 @@ export interface IElementDefinition {
|
|
|
16
16
|
defaultWidth?: string;
|
|
17
17
|
defaultHeight?: string;
|
|
18
18
|
ghostElement?: Element;
|
|
19
|
-
/**
|
|
20
|
-
* every component normal get's the property '_inNodeProjectsDesignerView' set. if it should not be the case on this component set this to true
|
|
21
|
-
* a component could have special logic when this is true
|
|
22
|
-
* TODO: maybe remove this, if someone needs such a function, he could use it's own instance provider...
|
|
23
|
-
*/
|
|
24
|
-
doNotSetInNodeProjectsDesignerViewOnInstance?: boolean;
|
|
25
19
|
/**
|
|
26
20
|
* Name of the Tool activated when selecting the element.
|
|
27
21
|
* If none, the DrawElementTool is used
|
|
@@ -30,7 +30,7 @@ export class HtmlWriterService extends AbstractHtmlWriterService {
|
|
|
30
30
|
this.internalWrite(indentedTextWriter, d, updatePositions);
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
|
-
//
|
|
33
|
+
//TODO: special case for style/script nodes, keep whitespace
|
|
34
34
|
internalWrite(indentedTextWriter, designItem, updatePositions) {
|
|
35
35
|
let start = indentedTextWriter.position;
|
|
36
36
|
let end = indentedTextWriter.position;
|
|
@@ -46,8 +46,7 @@ export class DefaultInstanceService {
|
|
|
46
46
|
}
|
|
47
47
|
const elementString = '<' + definition.tag + attr + '></' + definition.tag + '>';
|
|
48
48
|
const element = newElementFromString(elementString);
|
|
49
|
-
|
|
50
|
-
element._inNodeProjectsDesignerView = true;
|
|
49
|
+
element._inNodeProjectsDesignerView = true;
|
|
51
50
|
if (definition.defaultWidth)
|
|
52
51
|
element.style.width = definition.defaultWidth;
|
|
53
52
|
if (definition.defaultHeight)
|
|
@@ -86,7 +86,7 @@ export class DefaultPlacementService {
|
|
|
86
86
|
startPlace(event, placementView, container, startPoint, offsetInControl, newPoint, items) {
|
|
87
87
|
}
|
|
88
88
|
place(event, placementView, container, startPoint, offsetInControl, newPoint, items) {
|
|
89
|
-
//TODO
|
|
89
|
+
//TODO: this should revert all undo actions while active
|
|
90
90
|
//maybe a undo actions returns itself or an id so it could be changed?
|
|
91
91
|
let track = this.calculateTrack(event, placementView, startPoint, offsetInControl, newPoint, items[0]);
|
|
92
92
|
if (event.shiftKey) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { BasePropertyEditor } from '../BasePropertyEditor.js';
|
|
2
2
|
import { getElementGridInformation } from '../../../../helper/GridHelper.js';
|
|
3
3
|
export class GridAssignedRowColumnPropertyEditor extends BasePropertyEditor {
|
|
4
|
-
//
|
|
4
|
+
//TODO: multiple cell selection, grid area support, span support
|
|
5
5
|
_root;
|
|
6
6
|
constructor(property) {
|
|
7
7
|
super(property);
|
package/dist/elements/services/propertiesService/propertyEditors/special/MetricsPropertyEditor.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { BasePropertyEditor } from '../BasePropertyEditor.js';
|
|
2
2
|
import { MetricsEditor } from '../../../../controls/MetricsEditor.js';
|
|
3
3
|
export class MetricsPropertyEditor extends BasePropertyEditor {
|
|
4
|
-
//
|
|
4
|
+
//TODO: metrics editor does not work at all yet
|
|
5
5
|
constructor(property) {
|
|
6
6
|
super(property);
|
|
7
7
|
const selector = new MetricsEditor();
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
1
|
import { IPropertiesService, RefreshMode } from '../IPropertiesService.js';
|
|
3
2
|
import { IProperty } from '../IProperty.js';
|
|
4
3
|
import { IDesignItem } from '../../../item/IDesignItem.js';
|
|
@@ -7,8 +6,10 @@ import { BindingTarget } from '../../../item/BindingTarget.js';
|
|
|
7
6
|
import { IBinding } from '../../../item/IBinding.js';
|
|
8
7
|
import { IPropertyGroup } from '../IPropertyGroup.js';
|
|
9
8
|
export declare abstract class AbstractPropertiesService implements IPropertiesService {
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
private static _stylesCache;
|
|
10
|
+
private _cssCacheClearTimer;
|
|
11
|
+
private static _bindingsCache;
|
|
12
|
+
private _bindingsCacheClearTimer;
|
|
12
13
|
abstract getRefreshMode(designItem: IDesignItem): RefreshMode;
|
|
13
14
|
abstract isHandledElement(designItem: IDesignItem): boolean;
|
|
14
15
|
protected _notifyChangedProperty(designItem: IDesignItem, property: IProperty, value: any): void;
|
|
@@ -4,8 +4,10 @@ import { BindingTarget } from '../../../item/BindingTarget.js';
|
|
|
4
4
|
import { PropertyType } from '../PropertyType.js';
|
|
5
5
|
import { NodeType } from '../../../item/NodeType.js';
|
|
6
6
|
export class AbstractPropertiesService {
|
|
7
|
-
_stylesCache = new Map;
|
|
8
|
-
|
|
7
|
+
static _stylesCache = new Map;
|
|
8
|
+
_cssCacheClearTimer;
|
|
9
|
+
static _bindingsCache = new Map;
|
|
10
|
+
_bindingsCacheClearTimer;
|
|
9
11
|
_notifyChangedProperty(designItem, property, value) {
|
|
10
12
|
}
|
|
11
13
|
getProperty(designItem, name) {
|
|
@@ -104,10 +106,13 @@ export class AbstractPropertiesService {
|
|
|
104
106
|
break;
|
|
105
107
|
}
|
|
106
108
|
;
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
109
|
+
let bindings = AbstractPropertiesService._bindingsCache.get(designItems[0]);
|
|
110
|
+
if (!bindings) {
|
|
111
|
+
bindings = designItems[0].serviceContainer.forSomeServicesTillResult('bindingService', (s) => s.getBindings(designItems[0]));
|
|
112
|
+
AbstractPropertiesService._bindingsCache.set(designItems[0], bindings);
|
|
113
|
+
clearTimeout(this._bindingsCacheClearTimer);
|
|
114
|
+
this._bindingsCacheClearTimer = setTimeout(() => AbstractPropertiesService._bindingsCache.clear(), 30);
|
|
115
|
+
}
|
|
111
116
|
if (property.propertyType == PropertyType.cssValue) {
|
|
112
117
|
if (bindings && bindings.find(x => x.target == BindingTarget.css && x.targetName == property.name))
|
|
113
118
|
return ValueType.bound;
|
|
@@ -117,12 +122,12 @@ export class AbstractPropertiesService {
|
|
|
117
122
|
return ValueType.bound;
|
|
118
123
|
}
|
|
119
124
|
if (!all && property.propertyType == PropertyType.cssValue) {
|
|
120
|
-
let styles =
|
|
125
|
+
let styles = AbstractPropertiesService._stylesCache.get(designItems[0]);
|
|
121
126
|
if (!styles) {
|
|
122
127
|
styles = new Set(designItems[0].getAllStyles().filter(x => x.selector != null).flatMap(x => x.declarations).map(x => x.name));
|
|
123
|
-
|
|
124
|
-
clearTimeout(this.
|
|
125
|
-
this.
|
|
128
|
+
AbstractPropertiesService._stylesCache.set(designItems[0], styles);
|
|
129
|
+
clearTimeout(this._cssCacheClearTimer);
|
|
130
|
+
this._cssCacheClearTimer = setTimeout(() => AbstractPropertiesService._stylesCache.clear(), 30);
|
|
126
131
|
}
|
|
127
132
|
let cssValue = styles.has(property.name);
|
|
128
133
|
if (cssValue)
|
|
@@ -56,7 +56,7 @@ export class AttributesPropertiesService {
|
|
|
56
56
|
all = all && has;
|
|
57
57
|
some = some || has;
|
|
58
58
|
});
|
|
59
|
-
//
|
|
59
|
+
//TODO: optimize perf, do not call bindings service for each property.
|
|
60
60
|
const bindings = designItems[0].serviceContainer.forSomeServicesTillResult('bindingService', (s) => {
|
|
61
61
|
return s.getBindings(designItems[0]);
|
|
62
62
|
});
|
|
@@ -64,7 +64,7 @@ export class ContentAndIdPropertiesService extends AbstractPropertiesService {
|
|
|
64
64
|
all = all && has;
|
|
65
65
|
some = some || has;
|
|
66
66
|
});
|
|
67
|
-
//
|
|
67
|
+
//TODO: optimize perf, do not call bindings service for each property.
|
|
68
68
|
const bindings = designItems[0].serviceContainer.forSomeServicesTillResult('bindingService', (s) => {
|
|
69
69
|
return s.getBindings(designItems[0]);
|
|
70
70
|
});
|
|
@@ -44,7 +44,7 @@ export class CssCurrentPropertiesService extends CommonPropertiesService {
|
|
|
44
44
|
// No selector means local style, styleDeclaration is null means new property
|
|
45
45
|
if (property.styleRule?.selector !== null && property.styleDeclaration) {
|
|
46
46
|
// styleDeclaration stored Propertygrid is not refreshed after entering a new value, so we need to reload
|
|
47
|
-
//
|
|
47
|
+
//TODO: we do not respect if a same style is found in a media query or another @rule, maybe we need a refresh in the stylesheet parser
|
|
48
48
|
const decls = designItems[0].instanceServiceContainer.stylesheetService?.getDeclarations(designItems[0], property.styleDeclaration.name);
|
|
49
49
|
const currentDecl = decls.find(x => x.parent.selector == property.styleDeclaration.parent.selector && x.parent.stylesheetName == property.styleDeclaration.parent.stylesheetName);
|
|
50
50
|
designItems[0].instanceServiceContainer.stylesheetService.updateDeclarationValue(currentDecl, value, false);
|
|
@@ -60,7 +60,7 @@ export class AbstractStylesheetService {
|
|
|
60
60
|
this._allStylesheets.set(s[0], s[1]);
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
|
-
//
|
|
63
|
+
//TODO: rename to externalStylesheets
|
|
64
64
|
getStylesheets() {
|
|
65
65
|
let stylesheets = [];
|
|
66
66
|
for (let item of this._stylesheets) {
|
|
@@ -35,7 +35,7 @@ export class DomConverter {
|
|
|
35
35
|
}
|
|
36
36
|
static ConvertToString(designItems, beautifyOutput, updatePositions = false) {
|
|
37
37
|
let itw = beautifyOutput !== false ? new IndentedTextWriter() : new SimpleTextWriter();
|
|
38
|
-
//
|
|
38
|
+
//TODO: check how we could support this beautify here, cause it's now a setting of the writer...
|
|
39
39
|
//let options: HtmlWriterOptions = { beautifyOutput: beautifyOutput !== false, writeDesignerProperties: true, compressCssToShorthandProperties: true, parseJsonInAttributes: true, jsonWriteMode: 'beauty' };
|
|
40
40
|
designItems[0].serviceContainer.htmlWriterService.write(itw, designItems, true, updatePositions);
|
|
41
41
|
return itw.getString();
|
|
@@ -945,7 +945,7 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
945
945
|
const normEl = this.getNormalizedElementCoordinates(element);
|
|
946
946
|
return { x: normEvt.x - normEl.x, y: normEvt.y - normEl.y };
|
|
947
947
|
}
|
|
948
|
-
//
|
|
948
|
+
//TODO: remove
|
|
949
949
|
elementFromPoint(x, y) {
|
|
950
950
|
let elements = this.shadowRoot.elementsFromPoint(x, y);
|
|
951
951
|
let element = elements[0];
|
|
@@ -23,7 +23,7 @@ export class EditTextExtension extends AbstractExtension {
|
|
|
23
23
|
this._focusBound = this._focus.bind(this);
|
|
24
24
|
}
|
|
25
25
|
extend() {
|
|
26
|
-
//
|
|
26
|
+
//TODO: -> check what to do with extensions, do not loose edit on mouse click,...
|
|
27
27
|
//maybe use a html edit framework
|
|
28
28
|
this.extendedItem.instanceServiceContainer.selectionService.clearSelectedElements();
|
|
29
29
|
//this.extensionManager.removeExtension(this.extendedItem, ExtensionType.PrimarySelection);
|
|
@@ -66,14 +66,14 @@ export class EditTextExtension extends AbstractExtension {
|
|
|
66
66
|
return p.indexOf(stylo) >= 0;
|
|
67
67
|
}
|
|
68
68
|
_contentEdited() {
|
|
69
|
-
//
|
|
69
|
+
//TODO: -> save???
|
|
70
70
|
//this.extendedItem.content = this.extendedItem.element.innerHTML;
|
|
71
71
|
//console.log(this.extendedItem.element.innerHTML)
|
|
72
72
|
}
|
|
73
73
|
_blur() {
|
|
74
74
|
if (!this._blurTimeout) {
|
|
75
75
|
this._blurTimeout = setTimeout(() => {
|
|
76
|
-
//
|
|
76
|
+
//TODO: don't remove doubleclick extension (another type could be used), remove extension itself
|
|
77
77
|
//maybe also configureable when when to remove the extension
|
|
78
78
|
this.extensionManager.removeExtension(this.extendedItem, ExtensionType.Doubleclick);
|
|
79
79
|
}, 150);
|
|
@@ -256,8 +256,10 @@ export class ExtensionManager {
|
|
|
256
256
|
e.refresh(cache, event);
|
|
257
257
|
if (timeout) {
|
|
258
258
|
const end = performance.now();
|
|
259
|
-
if (end - start > timeout)
|
|
259
|
+
if (end - start > timeout) {
|
|
260
|
+
console.warn("refreshExtensions() took too long, stopped refreshing");
|
|
260
261
|
break outer1;
|
|
262
|
+
}
|
|
261
263
|
}
|
|
262
264
|
}
|
|
263
265
|
catch (err) {
|
|
@@ -277,8 +279,10 @@ export class ExtensionManager {
|
|
|
277
279
|
e.refresh(cache, event);
|
|
278
280
|
if (timeout) {
|
|
279
281
|
const end = performance.now();
|
|
280
|
-
if (end - start > timeout)
|
|
282
|
+
if (end - start > timeout) {
|
|
283
|
+
console.warn("refreshExtensions() took too long, stopped refreshing");
|
|
281
284
|
break outer2;
|
|
285
|
+
}
|
|
282
286
|
}
|
|
283
287
|
}
|
|
284
288
|
}
|
|
@@ -314,7 +318,7 @@ export class ExtensionManager {
|
|
|
314
318
|
refreshAllAppliedExtentions() {
|
|
315
319
|
this.refreshAllExtensions([...this.designItemsWithExtentions]);
|
|
316
320
|
}
|
|
317
|
-
//
|
|
321
|
+
//TODO: does not work with permanant, when not applied... maybe we need to do in another way
|
|
318
322
|
//maybe store the "shouldAppliedExtensions??"
|
|
319
323
|
reapplyAllAppliedExtentions() {
|
|
320
324
|
this.designerCanvas.overlayLayer.startBatch();
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import { AbstractExtensionBase } from '../AbstractExtensionBase.js';
|
|
2
|
-
//
|
|
3
|
-
//move draw functions to overlay layer
|
|
4
|
-
//implement designerpointerextension
|
|
5
|
-
//create ruler
|
|
2
|
+
//TODO: move draw functions to overlay layer, implement designerpointerextension, create ruler
|
|
6
3
|
export class AbstractDesignerPointerExtension extends AbstractExtensionBase {
|
|
7
4
|
extendedItem;
|
|
8
5
|
constructor(extensionManager, designerCanvas) {
|
|
@@ -28,7 +28,7 @@ export class TextTool {
|
|
|
28
28
|
di.setStyle('left', currentPoint.x + 'px');
|
|
29
29
|
di.setStyle('top', currentPoint.y + 'px');
|
|
30
30
|
designerCanvas.instanceServiceContainer.undoService.execute(new InsertAction(designerCanvas.rootDesignItem, designerCanvas.rootDesignItem.childCount, di));
|
|
31
|
-
//
|
|
31
|
+
//TODO: Maybe we could also remove the eatEvents property
|
|
32
32
|
//TODO - don't apply doubleclick extension (maybe it is not the doubleclick one) - apply edit text extesion directly
|
|
33
33
|
//should we configure the editTextExtension anywhere??
|
|
34
34
|
this._textEditExtensions = designerCanvas.extensionManager.applyExtension(di, ExtensionType.Doubleclick, event);
|
|
@@ -10,7 +10,7 @@ export class TreeView extends BaseCustomWebComponentLazyAppend {
|
|
|
10
10
|
_contentChangedHandler;
|
|
11
11
|
_mapElementTreeitem;
|
|
12
12
|
_rootItem;
|
|
13
|
-
//TODO
|
|
13
|
+
//TODO: buton so key events can be transfered to designerCanvas (so you can move controls with keys)
|
|
14
14
|
static style = css `
|
|
15
15
|
:host {
|
|
16
16
|
--horz-margin: 20px;
|