@node-projects/web-component-designer 0.0.193 → 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 (24) hide show
  1. package/README.md +1 -2
  2. package/dist/elements/helper/CssUnitConverter.js +1 -1
  3. package/dist/elements/services/DefaultServiceBootstrap.js +8 -5
  4. package/dist/elements/widgets/designerView/designerCanvas.js +8 -8
  5. package/dist/elements/widgets/designerView/extensions/buttons/GridExtensionDesignViewConfigButtons.js +1 -1
  6. package/dist/elements/widgets/designerView/extensions/grid/DisplayGridExtension.d.ts +14 -0
  7. package/dist/elements/widgets/designerView/extensions/grid/DisplayGridExtension.js +47 -0
  8. package/dist/elements/widgets/designerView/extensions/grid/DisplayGridExtensionProvider.d.ts +11 -0
  9. package/dist/elements/widgets/designerView/extensions/grid/DisplayGridExtensionProvider.js +22 -0
  10. package/dist/elements/widgets/designerView/extensions/grid/EditGridExtension.d.ts +51 -0
  11. package/dist/elements/widgets/designerView/extensions/grid/EditGridExtension.js +346 -0
  12. package/dist/elements/widgets/designerView/extensions/grid/EditGridExtensionProvider.d.ts +10 -0
  13. package/dist/elements/widgets/designerView/extensions/grid/EditGridExtensionProvider.js +22 -0
  14. package/dist/elements/widgets/designerView/extensions/grid/GridExtension copy.d.ts +51 -0
  15. package/dist/elements/widgets/designerView/extensions/grid/GridExtension copy.js +346 -0
  16. package/dist/elements/widgets/designerView/extensions/grid/GridExtension.d.ts +51 -0
  17. package/dist/elements/widgets/designerView/extensions/grid/GridExtension.js +346 -0
  18. package/dist/elements/widgets/designerView/extensions/grid/GridExtensionProvider copy.d.ts +11 -0
  19. package/dist/elements/widgets/designerView/extensions/grid/GridExtensionProvider copy.js +22 -0
  20. package/dist/elements/widgets/designerView/extensions/grid/GridExtensionProvider.d.ts +11 -0
  21. package/dist/elements/widgets/designerView/extensions/grid/GridExtensionProvider.js +22 -0
  22. package/dist/index.d.ts +4 -2
  23. package/dist/index.js +4 -2
  24. package/package.json +1 -1
package/README.md CHANGED
@@ -72,12 +72,11 @@ We have 2 tree components. One independent and one feature rich which uses Fancy
72
72
 
73
73
  ## DragDrop
74
74
 
75
- If you'd like to use the designer on mobile, you need the mobile-drag-drop npm library and include our polyfill.
75
+ If you'd like to use the designer on mobile, you need the mobile-drag-drop npm library.
76
76
  Your index.html should be extended as follows:
77
77
 
78
78
  <link rel="stylesheet" href="/node_modules/mobile-drag-drop/default.css">
79
79
  <script src="/node_modules/mobile-drag-drop/index.js"></script>
80
- <script src="/node_modules/@node-projects/web-component-designer/dist/polyfill/mobileDragDrop.js"></script>
81
80
 
82
81
  ## Copyright notice
83
82
 
@@ -24,7 +24,7 @@ export function convertCssUnitToPixel(cssValue, target, percentTarget) {
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
27
- //find parent with computed style where contaner-type is inline-size or size (regarding to query type)
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':
30
30
  'cqh':
@@ -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 &lt;" + di.name + "&gt;");
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]);
@@ -1017,15 +1015,17 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
1017
1015
  }
1018
1016
  if (rule instanceof CSSStyleRule) {
1019
1017
  let parts = rule.selectorText.split(',');
1018
+ let sel = "";
1020
1019
  for (let p of parts) {
1021
1020
  if (p.includes(this.cssprefixConstant)) {
1022
- t += p;
1021
+ sel += p;
1023
1022
  continue;
1024
1023
  }
1025
- if (t)
1026
- t += ',';
1027
- t += this.cssprefixConstant + p;
1024
+ if (sel)
1025
+ sel += ',';
1026
+ sel += this.cssprefixConstant + p.trimStart();
1028
1027
  }
1028
+ t += sel;
1029
1029
  let cssText = rule.style.cssText;
1030
1030
  //bugfix for chrome issue: https://bugs.chromium.org/p/chromium/issues/detail?id=1394353
1031
1031
  if (rule.styleMap && rule.styleMap.get('grid-template') && rule.styleMap.get('grid-template').toString().includes('repeat(')) {
@@ -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
+ }