@node-projects/web-component-designer 0.0.194 → 0.0.196

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. package/dist/elements/services/DefaultServiceBootstrap.js +8 -5
  2. package/dist/elements/widgets/designerView/designerCanvas.js +2 -4
  3. package/dist/elements/widgets/designerView/extensions/buttons/GridExtensionDesignViewConfigButtons.js +1 -1
  4. package/dist/elements/widgets/designerView/extensions/grid/DisplayGridExtension.d.ts +14 -0
  5. package/dist/elements/widgets/designerView/extensions/grid/DisplayGridExtension.js +47 -0
  6. package/dist/elements/widgets/designerView/extensions/grid/DisplayGridExtensionProvider.d.ts +11 -0
  7. package/dist/elements/widgets/designerView/extensions/grid/DisplayGridExtensionProvider.js +22 -0
  8. package/dist/elements/widgets/designerView/extensions/grid/EditGridExtension.d.ts +51 -0
  9. package/dist/elements/widgets/designerView/extensions/grid/EditGridExtension.js +346 -0
  10. package/dist/elements/widgets/designerView/extensions/grid/EditGridExtensionProvider.d.ts +10 -0
  11. package/dist/elements/widgets/designerView/extensions/grid/EditGridExtensionProvider.js +22 -0
  12. package/dist/elements/widgets/designerView/extensions/grid/GridExtension copy.d.ts +51 -0
  13. package/dist/elements/widgets/designerView/extensions/grid/GridExtension copy.js +346 -0
  14. package/dist/elements/widgets/designerView/extensions/grid/GridExtension.d.ts +51 -0
  15. package/dist/elements/widgets/designerView/extensions/grid/GridExtension.js +346 -0
  16. package/dist/elements/widgets/designerView/extensions/grid/GridExtensionProvider copy.d.ts +11 -0
  17. package/dist/elements/widgets/designerView/extensions/grid/GridExtensionProvider copy.js +22 -0
  18. package/dist/elements/widgets/designerView/extensions/grid/GridExtensionProvider.d.ts +11 -0
  19. package/dist/elements/widgets/designerView/extensions/grid/GridExtensionProvider.js +22 -0
  20. package/dist/index.d.ts +4 -2
  21. package/dist/index.js +4 -2
  22. package/package.json +1 -1
@@ -11,7 +11,6 @@ import { DefaultHtmlParserService } from './htmlParserService/DefaultHtmlParserS
11
11
  import { Lit2PropertiesService } from './propertiesService/services/Lit2PropertiesService.js';
12
12
  import { ExtensionType } from '../widgets/designerView/extensions/ExtensionType.js';
13
13
  import { ElementDragTitleExtensionProvider } from '../widgets/designerView/extensions/ElementDragTitleExtensionProvider.js';
14
- import { GridExtensionProvider } from '../widgets/designerView/extensions/GridExtensionProvider.js';
15
14
  import { TransformOriginExtensionProvider } from '../widgets/designerView/extensions/TransformOriginExtensionProvider.js';
16
15
  import { CanvasExtensionProvider } from '../widgets/designerView/extensions/CanvasExtensionProvider.js';
17
16
  import { PositionExtensionProvider } from '../widgets/designerView/extensions/PositionExtensionProvider.js';
@@ -77,6 +76,8 @@ import { SelectionService } from './selectionService/SelectionService.js';
77
76
  import { ContentService } from './contentService/ContentService.js';
78
77
  import { StylesheetServiceDesignViewConfigButtons } from '../widgets/designerView/extensions/buttons/StylesheetServiceDesignViewConfigButtons.js';
79
78
  import { JumpToElementContextMenu } from '../widgets/designerView/extensions/contextMenu/JumpToElementContextMenu.js';
79
+ import { EditGridExtensionProvider } from '../widgets/designerView/extensions/grid/EditGridExtensionProvider.js';
80
+ import { DisplayGridExtensionProvider } from '../widgets/designerView/extensions/grid/DisplayGridExtensionProvider.js';
80
81
  export function createDefaultServiceContainer() {
81
82
  let serviceContainer = new ServiceContainer();
82
83
  serviceContainer.register("propertyService", new PolymerPropertiesService());
@@ -110,7 +111,7 @@ export function createDefaultServiceContainer() {
110
111
  ]);
111
112
  serviceContainer.designerExtensions.set(ExtensionType.PrimarySelection, [
112
113
  new ElementDragTitleExtensionProvider(),
113
- new GridExtensionProvider(),
114
+ new EditGridExtensionProvider(),
114
115
  new FlexboxExtensionProvider(),
115
116
  new TransformOriginExtensionProvider(),
116
117
  new CanvasExtensionProvider(),
@@ -126,7 +127,7 @@ export function createDefaultServiceContainer() {
126
127
  new SelectionDefaultExtensionProvider()
127
128
  ]);
128
129
  serviceContainer.designerExtensions.set(ExtensionType.PrimarySelectionContainer, [
129
- new GridExtensionProvider(),
130
+ new EditGridExtensionProvider(),
130
131
  new FlexboxExtensionProvider()
131
132
  ]);
132
133
  serviceContainer.designerExtensions.set(ExtensionType.MouseOver, [
@@ -140,10 +141,12 @@ export function createDefaultServiceContainer() {
140
141
  ]);
141
142
  serviceContainer.designerExtensions.set(ExtensionType.ContainerDragOver, [
142
143
  new GrayOutDragOverContainerExtensionProvider(),
143
- new AltToEnterContainerExtensionProvider()
144
+ new AltToEnterContainerExtensionProvider(),
145
+ new DisplayGridExtensionProvider()
144
146
  ]);
145
147
  serviceContainer.designerExtensions.set(ExtensionType.ContainerExternalDragOver, [
146
- new GrayOutDragOverContainerExtensionProvider()
148
+ new GrayOutDragOverContainerExtensionProvider(),
149
+ new DisplayGridExtensionProvider()
147
150
  ]);
148
151
  serviceContainer.designerExtensions.set(ExtensionType.Doubleclick, [
149
152
  new EditTextExtensionProvider()
@@ -677,19 +677,17 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
677
677
  let [newContainer] = this._getPossibleContainerForDrop(event);
678
678
  if (!newContainer)
679
679
  newContainer = this.rootDesignItem;
680
- let pos = this.getNormalizedElementCoordinates(newContainer.element);
681
680
  this._fillCalculationrects();
682
- const position = this.getNormalizedEventCoordinates(event);
683
681
  //TODO : we need to use container service for adding to element, so also grid and flexbox work correct
684
682
  const transferData = event.dataTransfer.getData(dragDropFormatNameElementDefinition);
685
683
  const elementDefinition = JSON.parse(transferData);
686
684
  const di = await this.serviceContainer.forSomeServicesTillResult("instanceService", (service) => service.getElement(elementDefinition, this.serviceContainer, this.instanceServiceContainer));
687
685
  const grp = di.openGroup("Insert of <" + di.name + ">");
688
686
  di.setStyle('position', 'absolute');
689
- di.setStyle('left', (position.x - pos.x) + 'px');
690
- di.setStyle('top', (position.y - pos.y) + 'px');
691
687
  const containerService = this.serviceContainer.getLastServiceWhere('containerService', x => x.serviceForContainer(newContainer, getComputedStyle(newContainer.element)));
692
688
  containerService.enterContainer(newContainer, [di]);
689
+ containerService.place(event, this, newContainer, { x: 0, y: 0 }, { x: 0, y: 0 }, this.getNormalizedEventCoordinates(event), [di]);
690
+ containerService.finishPlace(event, this, newContainer, { x: 0, y: 0 }, { x: 0, y: 0 }, this.getNormalizedEventCoordinates(event), [di]);
693
691
  this.instanceServiceContainer.undoService.execute(new InsertAction(newContainer, newContainer.childCount, di));
694
692
  requestAnimationFrame(() => {
695
693
  this.instanceServiceContainer.selectionService.setSelectedElements([di]);
@@ -1,4 +1,4 @@
1
- import { gridExtensionShowOverlayOptionName } from "../GridExtensionProvider.js";
1
+ import { gridExtensionShowOverlayOptionName } from "../grid/DisplayGridExtensionProvider.js";
2
2
  import { AbstractDesignViewConfigButton } from "./AbstractDesignViewConfigButton.js";
3
3
  export class GridExtensionDesignViewConfigButtons extends AbstractDesignViewConfigButton {
4
4
  constructor() {
@@ -0,0 +1,14 @@
1
+ import { IDesignItem } from '../../../../item/IDesignItem.js';
2
+ import { IDesignerCanvas } from '../../IDesignerCanvas.js';
3
+ import { AbstractExtension } from '../AbstractExtension.js';
4
+ import { IExtensionManager } from '../IExtensionManger.js';
5
+ export declare class DisplayGridExtension extends AbstractExtension {
6
+ private _cells;
7
+ private _gaps;
8
+ private gridInformation;
9
+ constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
10
+ extend(): void;
11
+ refresh(): void;
12
+ dispose(): void;
13
+ _initSVGArrays(): void;
14
+ }
@@ -0,0 +1,47 @@
1
+ import { CalculateGridInformation } from "../../../../helper/GridHelper.js";
2
+ import { AbstractExtension } from '../AbstractExtension.js';
3
+ import { OverlayLayer } from "../OverlayLayer.js";
4
+ export class DisplayGridExtension extends AbstractExtension {
5
+ _cells;
6
+ _gaps;
7
+ gridInformation;
8
+ constructor(extensionManager, designerView, extendedItem) {
9
+ super(extensionManager, designerView, extendedItem);
10
+ }
11
+ extend() {
12
+ this._initSVGArrays();
13
+ this.refresh();
14
+ }
15
+ refresh() {
16
+ this.gridInformation = CalculateGridInformation(this.extendedItem);
17
+ let cells = this.gridInformation.cells;
18
+ if (cells[0][0] && !isNaN(cells[0][0].height) && !isNaN(cells[0][0].width)) {
19
+ if (this.gridInformation.cells.length != this._cells.length || this.gridInformation.cells[0].length != this._cells[0].length)
20
+ this._initSVGArrays();
21
+ //draw gaps
22
+ this.gridInformation.gaps.forEach((gap, i) => {
23
+ this._gaps[i] = this._drawRect(gap.x, gap.y, gap.width, gap.height, 'svg-grid-gap', this._gaps[i], OverlayLayer.Foregorund);
24
+ });
25
+ //draw cells
26
+ cells.forEach((row, i) => {
27
+ row.forEach((cell, j) => {
28
+ this._cells[i][j] = this._drawRect(cell.x, cell.y, cell.width, cell.height, 'svg-grid', this._cells[i][j], OverlayLayer.Background);
29
+ if (cell.name) {
30
+ const text = this._drawText(cell.name, cell.x, cell.y, 'svg-grid-area', null, OverlayLayer.Background);
31
+ text.setAttribute("dominant-baseline", "hanging");
32
+ }
33
+ });
34
+ });
35
+ }
36
+ }
37
+ dispose() {
38
+ this._removeAllOverlays();
39
+ }
40
+ _initSVGArrays() {
41
+ this._removeAllOverlays();
42
+ this.gridInformation = CalculateGridInformation(this.extendedItem);
43
+ this._cells = new Array(this.gridInformation.cells.length);
44
+ this.gridInformation.cells.forEach((row, i) => this._cells[i] = new Array(row.length));
45
+ this._gaps = new Array(this.gridInformation.gaps.length);
46
+ }
47
+ }
@@ -0,0 +1,11 @@
1
+ import { IDesignerExtensionProvider } from '../IDesignerExtensionProvider.js';
2
+ import { IDesignItem } from '../../../../item/IDesignItem.js';
3
+ import { IDesignerCanvas } from '../../IDesignerCanvas.js';
4
+ import { IDesignerExtension } from '../IDesignerExtension.js';
5
+ import { IExtensionManager } from '../IExtensionManger.js';
6
+ export declare const gridExtensionShowOverlayOptionName = "gridExtensionShowOverlay";
7
+ export declare class DisplayGridExtensionProvider implements IDesignerExtensionProvider {
8
+ shouldExtend(extensionManager: IExtensionManager, designerCanvas: IDesignerCanvas, designItem: IDesignItem): boolean;
9
+ getExtension(extensionManager: IExtensionManager, designerCanvas: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
10
+ readonly style: CSSStyleSheet;
11
+ }
@@ -0,0 +1,22 @@
1
+ import { css } from "@node-projects/base-custom-webcomponent";
2
+ import { DisplayGridExtension } from './DisplayGridExtension.js';
3
+ export const gridExtensionShowOverlayOptionName = 'gridExtensionShowOverlay';
4
+ export class DisplayGridExtensionProvider {
5
+ shouldExtend(extensionManager, designerCanvas, designItem) {
6
+ const display = getComputedStyle(designItem.element).display;
7
+ if (display == 'grid' || display == 'inline-grid')
8
+ return designerCanvas.instanceServiceContainer.designContext.extensionOptions[gridExtensionShowOverlayOptionName] !== false;
9
+ return false;
10
+ }
11
+ getExtension(extensionManager, designerCanvas, designItem) {
12
+ return new DisplayGridExtension(extensionManager, designerCanvas, designItem);
13
+ }
14
+ style = css `
15
+ .svg-grid { stroke: orange; stroke-dasharray: 5; fill: #ff944722; }
16
+ .svg-grid-area { font-size: 8px; }
17
+ .svg-grid-gap { stroke: orange; stroke-dasharray: 5; fill: #0000ff22; }
18
+ .svg-grid-resizer { fill: white; stroke: #3899ec; }
19
+ .svg-grid-header { fill: #ff944722; stroke: orange; }
20
+ .svg-grid-plus-sign { stroke: black; }
21
+ `;
22
+ }
@@ -0,0 +1,51 @@
1
+ import { IDesignItem } from '../../../../item/IDesignItem.js';
2
+ import { IDesignerCanvas } from '../../IDesignerCanvas.js';
3
+ import { AbstractExtension } from '../AbstractExtension.js';
4
+ import { IExtensionManager } from '../IExtensionManger.js';
5
+ export declare class EditGridExtension extends AbstractExtension {
6
+ private _initialPoint;
7
+ private _initialSizes;
8
+ private _cells;
9
+ private _gaps;
10
+ private _headers;
11
+ private _headerTexts;
12
+ private _plusCircles;
13
+ private _resizeCircles;
14
+ private minPixelSize;
15
+ private gridInformation;
16
+ private defaultHeaderSize;
17
+ private defaultPlusSize;
18
+ private defaultDistanceToBox;
19
+ private defaultDistanceBetweenHeaders;
20
+ private defaultSizeOfNewRowOrColumn;
21
+ constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
22
+ extend(): void;
23
+ refresh(): void;
24
+ dispose(): void;
25
+ _initSVGArrays(): void;
26
+ _drawResizeCircle(gap: any, oldCircle?: SVGCircleElement): SVGCircleElement;
27
+ _drawHeader(cell: any, oldHeader: any, index: any, alignment: "vertical" | "horizontal"): SVGRectElement;
28
+ _drawHeaderText(cell: any, oldHeaderText: any, alignment: "vertical" | "horizontal"): SVGTextElement;
29
+ _drawPlusCircle(x: any, y: any, oldPlusElement: {
30
+ circle: SVGCircleElement;
31
+ verticalLine: SVGLineElement;
32
+ horizontalLine: SVGLineElement;
33
+ }, index: any, alignment: "vertical" | "horizontal", final?: boolean): {
34
+ circle: any;
35
+ verticalLine: any;
36
+ horizontalLine: any;
37
+ };
38
+ _getHeaderText(size: number, unit: string, percentTarget: "width" | "height"): string;
39
+ _getInitialSizes(): {
40
+ x: any[];
41
+ xUnit: any[];
42
+ y: any[];
43
+ yUnit: any[];
44
+ };
45
+ _pointerActionTypeResize(event: PointerEvent, circle: SVGCircleElement, gapColumn: any, gapRow: any): void;
46
+ _calculateNewSize(iSizes: number[], iUnits: string[], diff: any, gapIndex: any, percentTarget: 'width' | 'height', pointerUp?: boolean): string;
47
+ _editGrid(pos: number, alignment: "vertical" | "horizontal", task: "add" | "del"): void;
48
+ _calculateNewElementSize(elementTarget: "width" | "height"): string;
49
+ _toggleDisplayPlusCircles(index: any, alignment: "vertical" | "horizontal", double?: boolean): void;
50
+ _convertCssUnit(cssValue: string | number, target: HTMLElement, percentTarget: 'width' | 'height', unit: string): string | number;
51
+ }
@@ -0,0 +1,346 @@
1
+ import { EventNames } from "../../../../../enums/EventNames.js";
2
+ import { convertCssUnit, convertCssUnitToPixel, getCssUnit } from "../../../../helper/CssUnitConverter.js";
3
+ import { CalculateGridInformation } from "../../../../helper/GridHelper.js";
4
+ import { AbstractExtension } from '../AbstractExtension.js';
5
+ import { OverlayLayer } from "../OverlayLayer.js";
6
+ export class EditGridExtension extends AbstractExtension {
7
+ _initialPoint;
8
+ _initialSizes;
9
+ _cells;
10
+ _gaps;
11
+ _headers;
12
+ _headerTexts;
13
+ _plusCircles;
14
+ _resizeCircles;
15
+ minPixelSize = 10;
16
+ gridInformation;
17
+ defaultHeaderSize = 20;
18
+ defaultPlusSize = this.defaultHeaderSize * 2 / 3;
19
+ defaultDistanceToBox = 5;
20
+ defaultDistanceBetweenHeaders = 10;
21
+ defaultSizeOfNewRowOrColumn = "50px";
22
+ constructor(extensionManager, designerView, extendedItem) {
23
+ super(extensionManager, designerView, extendedItem);
24
+ }
25
+ extend() {
26
+ this._initSVGArrays();
27
+ this.refresh();
28
+ }
29
+ refresh() {
30
+ this.gridInformation = CalculateGridInformation(this.extendedItem);
31
+ let cells = this.gridInformation.cells;
32
+ if (cells[0][0] && !isNaN(cells[0][0].height) && !isNaN(cells[0][0].width)) {
33
+ if (this.gridInformation.cells.length != this._cells.length || this.gridInformation.cells[0].length != this._cells[0].length)
34
+ this._initSVGArrays();
35
+ //draw gaps
36
+ this.gridInformation.gaps.forEach((gap, i) => {
37
+ this._gaps[i] = this._drawRect(gap.x, gap.y, gap.width, gap.height, 'svg-grid-gap', this._gaps[i], OverlayLayer.Foregorund);
38
+ this._resizeCircles[i] = this._drawResizeCircle(gap, this._resizeCircles[i]);
39
+ });
40
+ //draw cells
41
+ cells.forEach((row, i) => {
42
+ row.forEach((cell, j) => {
43
+ this._cells[i][j] = this._drawRect(cell.x, cell.y, cell.width, cell.height, 'svg-grid', this._cells[i][j], OverlayLayer.Background);
44
+ if (cell.name) {
45
+ const text = this._drawText(cell.name, cell.x, cell.y, 'svg-grid-area', null, OverlayLayer.Background);
46
+ text.setAttribute("dominant-baseline", "hanging");
47
+ }
48
+ });
49
+ });
50
+ //draw headers
51
+ cells.forEach((row, i) => {
52
+ this._headers[0][i] = this._drawHeader(row[0], this._headers[0][i], i, "vertical");
53
+ this._headerTexts[0][i] = this._drawHeaderText(row[0], this._headerTexts[0][i], "vertical");
54
+ });
55
+ cells[0].forEach((column, i) => {
56
+ this._headers[1][i] = this._drawHeader(column, this._headers[1][i], i, "horizontal");
57
+ this._headerTexts[1][i] = this._drawHeaderText(column, this._headerTexts[1][i], "horizontal");
58
+ });
59
+ //draw circles for adding rows/columns
60
+ for (let i = 0; i < this._plusCircles[0].length; i++)
61
+ if (i < this._plusCircles[0].length - 1)
62
+ this._plusCircles[0][i] = this._drawPlusCircle(cells[i][0].x, cells[i][0].y, this._plusCircles[0][i], i, "vertical");
63
+ else
64
+ this._plusCircles[0][i] = this._drawPlusCircle(cells[i - 1][0].x, cells[i - 1][0].y + cells[i - 1][0].height, this._plusCircles[0][i], i, "vertical", true);
65
+ for (let i = 0; i < this._plusCircles[1].length; i++)
66
+ if (i < this._plusCircles[1].length - 1)
67
+ this._plusCircles[1][i] = this._drawPlusCircle(cells[0][i].x, cells[0][i].y, this._plusCircles[1][i], i, "horizontal");
68
+ else
69
+ this._plusCircles[1][i] = this._drawPlusCircle(cells[0][i - 1].x + cells[0][i - 1].width, cells[0][i - 1].y, this._plusCircles[1][i], i, "horizontal", true);
70
+ }
71
+ }
72
+ dispose() {
73
+ this._removeAllOverlays();
74
+ }
75
+ _initSVGArrays() {
76
+ this._removeAllOverlays();
77
+ this.gridInformation = CalculateGridInformation(this.extendedItem);
78
+ this._cells = new Array(this.gridInformation.cells.length);
79
+ this.gridInformation.cells.forEach((row, i) => this._cells[i] = new Array(row.length));
80
+ this._gaps = new Array(this.gridInformation.gaps.length);
81
+ this._headers = new Array(2);
82
+ this._headers[0] = new Array(this.gridInformation.cells.length + 1); //array for the headers of columns
83
+ this._headers[1] = new Array(this.gridInformation.cells[0].length + 1); //array for the headers of rows
84
+ this._headerTexts = new Array(2);
85
+ this._headerTexts[0] = new Array(this.gridInformation.cells.length + 1);
86
+ this._headerTexts[1] = new Array(this.gridInformation.cells[0].length + 1);
87
+ this._plusCircles = new Array(2);
88
+ this._plusCircles[0] = new Array(this.gridInformation.cells.length + 1);
89
+ this._plusCircles[1] = new Array(this.gridInformation.cells[0].length + 1);
90
+ this._resizeCircles = new Array(this.gridInformation.gaps.length);
91
+ }
92
+ _drawResizeCircle(gap, oldCircle) {
93
+ let resizeCircle = this._drawCircle((gap.x + (gap.width / 2)), (gap.y + (gap.height / 2)), 1.5, 'svg-grid-resizer', oldCircle, OverlayLayer.Foregorund);
94
+ resizeCircle.style.pointerEvents = "all";
95
+ resizeCircle.style.cursor = gap.width < gap.height ? "ew-resize" : "ns-resize";
96
+ if (!oldCircle) {
97
+ resizeCircle.addEventListener(EventNames.PointerDown, event => this._pointerActionTypeResize(event, resizeCircle, gap.column, gap.row));
98
+ resizeCircle.addEventListener(EventNames.PointerMove, event => this._pointerActionTypeResize(event, resizeCircle, gap.column, gap.row));
99
+ resizeCircle.addEventListener(EventNames.PointerUp, event => this._pointerActionTypeResize(event, resizeCircle, gap.column, gap.row));
100
+ }
101
+ return resizeCircle;
102
+ }
103
+ _drawHeader(cell, oldHeader, index, alignment) {
104
+ let xOffset;
105
+ let yOffset;
106
+ let width;
107
+ let height;
108
+ if (alignment == "vertical") {
109
+ xOffset = -(this.defaultHeaderSize + this.defaultDistanceToBox);
110
+ yOffset = this.defaultDistanceBetweenHeaders / 2;
111
+ width = this.defaultHeaderSize;
112
+ height = cell.height - this.defaultDistanceBetweenHeaders;
113
+ }
114
+ else {
115
+ xOffset = this.defaultDistanceBetweenHeaders / 2;
116
+ yOffset = -(this.defaultHeaderSize + this.defaultDistanceToBox);
117
+ width = cell.width - this.defaultDistanceBetweenHeaders;
118
+ height = this.defaultHeaderSize;
119
+ }
120
+ let tmpHeader = this._drawRect(cell.x + xOffset, cell.y + yOffset, width, height, "svg-grid-header", oldHeader, OverlayLayer.Foregorund);
121
+ tmpHeader.style.pointerEvents = "all";
122
+ if (!oldHeader) {
123
+ tmpHeader.addEventListener(EventNames.PointerMove, event => {
124
+ this._toggleDisplayPlusCircles(index, alignment, true);
125
+ });
126
+ }
127
+ return tmpHeader;
128
+ }
129
+ _drawHeaderText(cell, oldHeaderText, alignment) {
130
+ let text;
131
+ let xOffset;
132
+ let yOffset;
133
+ if (alignment == "vertical") {
134
+ text = this._getHeaderText(cell.height, cell.initHeightUnit, "height");
135
+ xOffset = -12.5;
136
+ yOffset = cell.height / 2;
137
+ }
138
+ else {
139
+ text = this._getHeaderText(cell.width, cell.initWidthUnit, "width");
140
+ xOffset = cell.width / 2;
141
+ yOffset = -12.5;
142
+ }
143
+ let rText = this._drawText(text, cell.x + xOffset, cell.y + yOffset, null, oldHeaderText, OverlayLayer.Background);
144
+ if (alignment == "vertical")
145
+ rText.setAttribute("transform", "rotate(-90, " + (cell.x + xOffset) + ", " + (cell.y + yOffset) + ")");
146
+ return rText;
147
+ }
148
+ _drawPlusCircle(x, y, oldPlusElement, index, alignment, final = false) {
149
+ let plusElement = { circle: null, verticalLine: null, horizontalLine: null };
150
+ let posX;
151
+ let posY;
152
+ let gapOffset = index == 0 || final ? 0 : -(convertCssUnitToPixel(this.extendedItem.getStyle(alignment == "vertical" ? "row-gap" : "column-gap"), this.extendedItem.element, alignment == "vertical" ? "height" : "width") / 2);
153
+ if (alignment == "vertical") {
154
+ posX = x - this.defaultDistanceToBox - this.defaultHeaderSize / 2;
155
+ posY = y + gapOffset;
156
+ }
157
+ else {
158
+ posX = x + gapOffset;
159
+ posY = y - this.defaultDistanceToBox - this.defaultHeaderSize / 2;
160
+ }
161
+ plusElement.circle = this._drawCircle(posX, posY, this.defaultHeaderSize / 2, 'svg-grid-resizer', oldPlusElement ? oldPlusElement.circle : null, OverlayLayer.Foregorund);
162
+ plusElement.circle.style.pointerEvents = "all";
163
+ plusElement.circle.style.cursor = "pointer";
164
+ plusElement.circle.style.display = "none";
165
+ if (!oldPlusElement) {
166
+ plusElement.circle.addEventListener(EventNames.PointerMove, event => this._toggleDisplayPlusCircles(index, alignment));
167
+ plusElement.circle.addEventListener(EventNames.PointerDown, event => {
168
+ this._editGrid(index, alignment, "add");
169
+ event.stopPropagation();
170
+ });
171
+ }
172
+ plusElement.verticalLine = this._drawLine(posX, posY - this.defaultPlusSize / 2, posX, posY + this.defaultPlusSize / 2, "svg-grid-plus-sign", oldPlusElement ? oldPlusElement.verticalLine : null, OverlayLayer.Foregorund);
173
+ plusElement.verticalLine.style.display = "none";
174
+ plusElement.horizontalLine = this._drawLine(posX - this.defaultPlusSize / 2, posY, posX + this.defaultPlusSize / 2, posY, "svg-grid-plus-sign", oldPlusElement ? oldPlusElement.horizontalLine : null, OverlayLayer.Foregorund);
175
+ plusElement.horizontalLine.style.display = "none";
176
+ return plusElement;
177
+ }
178
+ _getHeaderText(size, unit, percentTarget) {
179
+ return Math.round(parseFloat(this._convertCssUnit(size, this.extendedItem.element, percentTarget, unit)) * 10) / 10 + unit;
180
+ }
181
+ _getInitialSizes() {
182
+ let rX = []; //in pixels
183
+ let rXUnit = []; //original unit
184
+ let rY = []; //in pixels
185
+ let rYUnit = []; //original unit
186
+ this.gridInformation.cells[0].forEach(row => {
187
+ rX.push(row.width);
188
+ rXUnit.push(row.initWidthUnit);
189
+ });
190
+ this.gridInformation.cells.forEach(column => {
191
+ rY.push(column[0].height);
192
+ rYUnit.push(column[0].initHeightUnit);
193
+ });
194
+ return { x: rX, xUnit: rXUnit, y: rY, yUnit: rYUnit };
195
+ }
196
+ _pointerActionTypeResize(event, circle, gapColumn, gapRow) {
197
+ event.stopPropagation();
198
+ switch (event.type) {
199
+ case EventNames.PointerDown:
200
+ circle.setPointerCapture(event.pointerId);
201
+ this._initialPoint = { x: event.clientX, y: event.clientY };
202
+ this._initialSizes = this._getInitialSizes();
203
+ break;
204
+ case EventNames.PointerMove:
205
+ if (this._initialPoint) {
206
+ let elementStyle = this.extendedItem.element.style;
207
+ this.extendedItem.element.getBoundingClientRect;
208
+ if (circle.style.cursor == "ew-resize")
209
+ elementStyle.gridTemplateColumns = this._calculateNewSize(this._initialSizes.x, this._initialSizes.xUnit, (event.clientX - this._initialPoint.x) / this.designerCanvas.zoomFactor, gapColumn, "width");
210
+ else if (circle.style.cursor == "ns-resize")
211
+ elementStyle.gridTemplateRows = this._calculateNewSize(this._initialSizes.y, this._initialSizes.yUnit, (event.clientY - this._initialPoint.y) / this.designerCanvas.zoomFactor, gapRow, "height");
212
+ this.refresh();
213
+ }
214
+ break;
215
+ case EventNames.PointerUp:
216
+ circle.releasePointerCapture(event.pointerId);
217
+ if (circle.style.cursor == "ew-resize")
218
+ this.extendedItem.setStyle("grid-template-columns", this._calculateNewSize(this._initialSizes.x, this._initialSizes.xUnit, (event.clientX - this._initialPoint.x) / this.designerCanvas.zoomFactor, gapColumn, "width", true));
219
+ else if (circle.style.cursor == "ns-resize")
220
+ this.extendedItem.setStyle("grid-template-rows", this._calculateNewSize(this._initialSizes.y, this._initialSizes.yUnit, (event.clientY - this._initialPoint.y) / this.designerCanvas.zoomFactor, gapRow, "height", true));
221
+ this._initialPoint = null;
222
+ this._initialSizes = null;
223
+ this.refresh();
224
+ break;
225
+ }
226
+ }
227
+ _calculateNewSize(iSizes, iUnits, diff, gapIndex, percentTarget, pointerUp = false) {
228
+ let newSizes = [];
229
+ let edited = [];
230
+ for (let i = 0; i < iSizes.length; i++) {
231
+ newSizes.push(i + 1 == gapIndex ? iSizes[i] + diff : i == gapIndex ? iSizes[i] - diff : iSizes[i]);
232
+ edited.push(i + 1 == gapIndex || i == gapIndex);
233
+ }
234
+ for (let i = 0; i < newSizes.length; i++) {
235
+ let index = edited[i + 1] ? i + 1 : edited[i - 1] ? i - 1 : null;
236
+ if (newSizes[i] < 0 && pointerUp) {
237
+ if (confirm("Do you want to delete this " + (percentTarget == "width" ? "column" : "row") + "?")) {
238
+ this._editGrid(i, percentTarget == "width" ? "horizontal" : "vertical", "del");
239
+ newSizes[index] = iSizes[i] + iSizes[index];
240
+ newSizes.splice(i, 1);
241
+ break;
242
+ }
243
+ }
244
+ if (newSizes[i] < this.minPixelSize) {
245
+ newSizes[index] = newSizes[i] + newSizes[index] - this.minPixelSize;
246
+ newSizes[i] = this.minPixelSize;
247
+ break;
248
+ }
249
+ }
250
+ let retVal = "";
251
+ newSizes.forEach((newSize, i) => retVal += this._convertCssUnit(newSize + "px", this.extendedItem.element, percentTarget, iUnits[i]) + ' ');
252
+ return retVal;
253
+ }
254
+ _editGrid(pos, alignment, task) {
255
+ let cellTarget;
256
+ let elementTarget;
257
+ if (alignment == "vertical") {
258
+ cellTarget = "grid-template-rows";
259
+ elementTarget = "height";
260
+ }
261
+ else {
262
+ cellTarget = "grid-template-columns";
263
+ elementTarget = "width";
264
+ }
265
+ let sizes = this.extendedItem.getStyle(cellTarget).split(' ');
266
+ if (task == "add")
267
+ sizes.splice(pos, 0, this.defaultSizeOfNewRowOrColumn);
268
+ else
269
+ sizes.splice(pos, 1);
270
+ this.extendedItem.setStyle(cellTarget, sizes.join(' '));
271
+ if (task == "add") {
272
+ this.extendedItem.setStyle(elementTarget, convertCssUnit(this._calculateNewElementSize(elementTarget), this.designerCanvas.canvas, elementTarget, getCssUnit(this.extendedItem.getStyle(elementTarget))));
273
+ }
274
+ else {
275
+ this.extendedItem.setStyle(elementTarget, convertCssUnit(convertCssUnitToPixel(this.extendedItem.getStyle(elementTarget), this.designerCanvas.canvas, elementTarget) - convertCssUnitToPixel(this.extendedItem.getStyle(alignment == "vertical" ? "row-gap" : "column-gap"), this.extendedItem.element, elementTarget), this.designerCanvas.canvas, elementTarget, getCssUnit(this.extendedItem.getStyle(elementTarget))));
276
+ }
277
+ }
278
+ _calculateNewElementSize(elementTarget) {
279
+ let gc = CalculateGridInformation(this.extendedItem);
280
+ let tmpSize = 0;
281
+ if (elementTarget == "width") {
282
+ gc.cells[0].forEach(cell => { tmpSize += cell.width; });
283
+ tmpSize += convertCssUnitToPixel(this.extendedItem.getStyle("column-gap"), this.extendedItem.element, elementTarget) * (gc.cells[0].length - 1);
284
+ }
285
+ else {
286
+ gc.cells.forEach(row => { tmpSize += row[0].height; });
287
+ tmpSize += convertCssUnitToPixel(this.extendedItem.getStyle("row-gap"), this.extendedItem.element, elementTarget) * (gc.cells.length - 1);
288
+ }
289
+ return tmpSize + "px";
290
+ }
291
+ _toggleDisplayPlusCircles(index, alignment, double = false) {
292
+ this._plusCircles.forEach(alignment => {
293
+ alignment.forEach(element => {
294
+ element.circle.style.display = "none";
295
+ element.verticalLine.style.display = "none";
296
+ element.horizontalLine.style.display = "none";
297
+ });
298
+ });
299
+ if (index != -1) {
300
+ this._plusCircles[alignment == "vertical" ? 0 : 1][index].circle.style.display = "inline";
301
+ this._plusCircles[alignment == "vertical" ? 0 : 1][index].verticalLine.style.display = "inline";
302
+ this._plusCircles[alignment == "vertical" ? 0 : 1][index].horizontalLine.style.display = "inline";
303
+ if (double) {
304
+ this._plusCircles[alignment == "vertical" ? 0 : 1][index + 1].circle.style.display = "inline";
305
+ this._plusCircles[alignment == "vertical" ? 0 : 1][index + 1].verticalLine.style.display = "inline";
306
+ this._plusCircles[alignment == "vertical" ? 0 : 1][index + 1].horizontalLine.style.display = "inline";
307
+ }
308
+ }
309
+ }
310
+ _convertCssUnit(cssValue, target, percentTarget, unit) {
311
+ if (unit == "fr") {
312
+ let containerSize = convertCssUnitToPixel(target.style.width, target, percentTarget);
313
+ let amountGaps = percentTarget == "height" ? this.gridInformation.cells.length - 1 : this.gridInformation.cells[0].length - 1;
314
+ let gapSize = convertCssUnitToPixel(percentTarget == "width" ? target.style.columnGap : target.style.rowGap, target, percentTarget);
315
+ let containerSizeWithoutGaps = containerSize - gapSize * amountGaps;
316
+ let amountFrSizes = 0;
317
+ let leftOver = containerSizeWithoutGaps;
318
+ if (percentTarget == "width") {
319
+ this.gridInformation.cells[0].forEach((column, i) => {
320
+ if (column.initWidthUnit == "fr")
321
+ amountFrSizes++;
322
+ else
323
+ leftOver -= column.width;
324
+ });
325
+ }
326
+ else {
327
+ this.gridInformation.cells.forEach((row, i) => {
328
+ if (row[0].initHeightUnit == "fr")
329
+ amountFrSizes++;
330
+ else
331
+ leftOver -= row[0].height;
332
+ });
333
+ }
334
+ let frRatio = leftOver / amountFrSizes;
335
+ if (typeof cssValue == "number") {
336
+ //expected Value in Pixel
337
+ return (cssValue / frRatio) + "fr";
338
+ }
339
+ else {
340
+ return (convertCssUnitToPixel(cssValue, target, percentTarget) / frRatio) + "fr";
341
+ }
342
+ }
343
+ else
344
+ return convertCssUnit(cssValue, target, percentTarget, unit);
345
+ }
346
+ }
@@ -0,0 +1,10 @@
1
+ import { IDesignerExtensionProvider } from '../IDesignerExtensionProvider.js';
2
+ import { IDesignItem } from '../../../../item/IDesignItem.js';
3
+ import { IDesignerCanvas } from '../../IDesignerCanvas.js';
4
+ import { IDesignerExtension } from '../IDesignerExtension.js';
5
+ import { IExtensionManager } from '../IExtensionManger.js';
6
+ export declare class EditGridExtensionProvider implements IDesignerExtensionProvider {
7
+ shouldExtend(extensionManager: IExtensionManager, designerCanvas: IDesignerCanvas, designItem: IDesignItem): boolean;
8
+ getExtension(extensionManager: IExtensionManager, designerCanvas: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
9
+ readonly style: CSSStyleSheet;
10
+ }
@@ -0,0 +1,22 @@
1
+ import { EditGridExtension } from './EditGridExtension.js';
2
+ import { css } from "@node-projects/base-custom-webcomponent";
3
+ import { gridExtensionShowOverlayOptionName } from './DisplayGridExtensionProvider.js';
4
+ export class EditGridExtensionProvider {
5
+ shouldExtend(extensionManager, designerCanvas, designItem) {
6
+ const display = getComputedStyle(designItem.element).display;
7
+ if (display == 'grid' || display == 'inline-grid')
8
+ return designerCanvas.instanceServiceContainer.designContext.extensionOptions[gridExtensionShowOverlayOptionName] !== false;
9
+ return false;
10
+ }
11
+ getExtension(extensionManager, designerCanvas, designItem) {
12
+ return new EditGridExtension(extensionManager, designerCanvas, designItem);
13
+ }
14
+ style = css `
15
+ .svg-grid { stroke: orange; stroke-dasharray: 5; fill: #ff944722; }
16
+ .svg-grid-area { font-size: 8px; }
17
+ .svg-grid-gap { stroke: orange; stroke-dasharray: 5; fill: #0000ff22; }
18
+ .svg-grid-resizer { fill: white; stroke: #3899ec; }
19
+ .svg-grid-header { fill: #ff944722; stroke: orange; }
20
+ .svg-grid-plus-sign { stroke: black; }
21
+ `;
22
+ }