@contrail/documents 1.3.11 → 1.3.12

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.
@@ -1,6 +1,6 @@
1
1
  import { ComponentDefinition } from './components/components';
2
2
  import { DocumentElement } from './types/document-element';
3
- import { PositionDefinition } from './types';
3
+ import { LineDefinition, PositionDefinition } from './types';
4
4
  export declare class DocumentElementFactory {
5
5
  static initNewElement(type: string): DocumentElement;
6
6
  static createTextElement(text: string, options?: DocumentElement): DocumentElement;
@@ -16,4 +16,14 @@ export declare class DocumentElementFactory {
16
16
  newElements: DocumentElement[];
17
17
  };
18
18
  static isMask(element: DocumentElement): boolean;
19
+ static getBoundingClientRect(documentElement: DocumentElement, startElement?: DocumentElement, endElement?: DocumentElement): {
20
+ x: any;
21
+ y: any;
22
+ width: any;
23
+ height: any;
24
+ };
25
+ private static getPosition;
26
+ private static getSize;
27
+ private static getComponentSize;
28
+ static getLineDefinition(documentElement: DocumentElement, startElement?: DocumentElement, endElement?: DocumentElement): LineDefinition;
19
29
  }
@@ -7,6 +7,7 @@ const components_1 = require("./components/components");
7
7
  const document_element_property_binding_handler_1 = require("./document-element-property-binding-handler");
8
8
  const document_table_1 = require("@contrail/document-table");
9
9
  const document_element_constants_1 = require("./document-element-constants");
10
+ const callout_1 = require("./util/callout/callout");
10
11
  class DocumentElementFactory {
11
12
  static initNewElement(type) {
12
13
  const element = {
@@ -203,5 +204,120 @@ class DocumentElementFactory {
203
204
  var _a;
204
205
  return ['rectangle', 'circle'].indexOf(element === null || element === void 0 ? void 0 : element.type) !== -1 && ((_a = element === null || element === void 0 ? void 0 : element.elementIds) === null || _a === void 0 ? void 0 : _a.length) > 0;
205
206
  }
207
+ static getBoundingClientRect(documentElement, startElement, endElement) {
208
+ const { x, y } = this.getPosition(documentElement, startElement, endElement);
209
+ const { width, height } = this.getSize(documentElement, startElement, endElement);
210
+ return {
211
+ x,
212
+ y,
213
+ width,
214
+ height,
215
+ };
216
+ }
217
+ static getPosition(documentElement, startElement, endElement) {
218
+ var _a, _b;
219
+ if (documentElement.type === 'line' || documentElement.type === 'callout') {
220
+ const lineDefinition = this.getLineDefinition(documentElement, startElement, endElement);
221
+ if (!lineDefinition) {
222
+ return { x: 0, y: 0 };
223
+ }
224
+ return {
225
+ x: Math.min(lineDefinition.x1, lineDefinition.x2),
226
+ y: Math.min(lineDefinition.y1, lineDefinition.y2),
227
+ };
228
+ }
229
+ return {
230
+ x: documentElement.position.x -
231
+ (documentElement.type === 'component' && ((_a = documentElement === null || documentElement === void 0 ? void 0 : documentElement.modelBindings) === null || _a === void 0 ? void 0 : _a.item) ? 8 : 0),
232
+ y: documentElement.position.y -
233
+ (documentElement.type === 'component' && ((_b = documentElement === null || documentElement === void 0 ? void 0 : documentElement.modelBindings) === null || _b === void 0 ? void 0 : _b.item) ? 18 : 0),
234
+ };
235
+ }
236
+ static getSize(documentElement, startElement, endElement) {
237
+ if (documentElement.type === 'line' || documentElement.type === 'callout') {
238
+ const lineDefinition = this.getLineDefinition(documentElement, startElement, endElement);
239
+ if (!lineDefinition) {
240
+ return { width: 0, height: 0 };
241
+ }
242
+ return {
243
+ width: Math.abs(lineDefinition.x1 - lineDefinition.x2),
244
+ height: Math.abs(lineDefinition.y1 - lineDefinition.y2),
245
+ };
246
+ }
247
+ return documentElement.type === 'component' ? this.getComponentSize(documentElement) : documentElement.size;
248
+ }
249
+ static getComponentSize(documentElement) {
250
+ var _a, _b, _c, _d, _e, _f;
251
+ let width = 0, height = 0, lastY = null;
252
+ for (let i = 0; i < ((_a = documentElement === null || documentElement === void 0 ? void 0 : documentElement.elements) === null || _a === void 0 ? void 0 : _a.length); i++) {
253
+ const element = documentElement.elements[i];
254
+ if (element.type !== 'text') {
255
+ width = Math.max(width, (((_b = element === null || element === void 0 ? void 0 : element.position) === null || _b === void 0 ? void 0 : _b.x) || 0) + element.size.width);
256
+ }
257
+ const renderedHeight = (_c = element.size) === null || _c === void 0 ? void 0 : _c.height;
258
+ const y = lastY === null ? ((_d = element === null || element === void 0 ? void 0 : element.position) === null || _d === void 0 ? void 0 : _d.y) || 0 : lastY;
259
+ height = Math.max(height, y + renderedHeight);
260
+ if (element.type === 'text' || lastY != null) {
261
+ lastY = y + renderedHeight;
262
+ }
263
+ }
264
+ return {
265
+ width: width + (((_e = documentElement === null || documentElement === void 0 ? void 0 : documentElement.modelBindings) === null || _e === void 0 ? void 0 : _e.item) ? 8 + 8 : 0),
266
+ height: height + (((_f = documentElement === null || documentElement === void 0 ? void 0 : documentElement.modelBindings) === null || _f === void 0 ? void 0 : _f.item) ? 18 + 8 : 0),
267
+ };
268
+ }
269
+ static getLineDefinition(documentElement, startElement, endElement) {
270
+ var _a, _b;
271
+ if (documentElement.type === 'line')
272
+ return documentElement.lineDefinition;
273
+ if (!documentElement.start || !documentElement.end)
274
+ return null;
275
+ if (!((_a = documentElement === null || documentElement === void 0 ? void 0 : documentElement.start) === null || _a === void 0 ? void 0 : _a.position))
276
+ return null;
277
+ let x1, y1, x2, y2;
278
+ if (documentElement.start.id) {
279
+ const start = startElement;
280
+ if (!start || !start.size || !start.position)
281
+ return null;
282
+ const { width, height } = start.size;
283
+ const { x, y } = start.position;
284
+ x1 = x + (documentElement.start.position.x * width) / 100;
285
+ y1 = y + (documentElement.start.position.y * height) / 100;
286
+ }
287
+ else {
288
+ x1 = documentElement.start.position.x;
289
+ y1 = documentElement.start.position.y;
290
+ }
291
+ if (documentElement.end.id) {
292
+ const end = endElement;
293
+ if (!end)
294
+ return null;
295
+ const { width, height } = end.size;
296
+ const { x, y } = end.position;
297
+ let location = (_b = documentElement.end.location) !== null && _b !== void 0 ? _b : 'auto';
298
+ if (location === 'auto') {
299
+ location = callout_1.Callout.getCalloutLocation({
300
+ x1,
301
+ y1,
302
+ x2: x + width * 0.5,
303
+ y2: y + height * 0.5,
304
+ });
305
+ }
306
+ const lineEnd = callout_1.Callout.getCalloutLineEndPosition(location, { x, y }, { width, height });
307
+ x2 = lineEnd.x;
308
+ y2 = lineEnd.y;
309
+ }
310
+ else {
311
+ x2 = documentElement.end.position.x;
312
+ y2 = documentElement.end.position.y;
313
+ }
314
+ const line = {
315
+ x1,
316
+ y1,
317
+ x2,
318
+ y2,
319
+ };
320
+ return line;
321
+ }
206
322
  }
207
323
  exports.DocumentElementFactory = DocumentElementFactory;
@@ -0,0 +1,20 @@
1
+ import { DocumentElement, Document, CoordinateBox } from './types';
2
+ export interface DocumentFrame {
3
+ id: string;
4
+ box: CoordinateBox;
5
+ index: number;
6
+ element: DocumentElement;
7
+ elements: Array<{
8
+ element: DocumentElement;
9
+ index: number;
10
+ }>;
11
+ }
12
+ export interface DocumentFrameGenerateOptions {
13
+ includeHidden?: boolean;
14
+ selectedIds?: string[];
15
+ relativePosition?: boolean;
16
+ }
17
+ export declare class DocumentFrameService {
18
+ static generateFrames(document: Document, documentFrameGenerationOptions?: DocumentFrameGenerateOptions): Array<Document>;
19
+ private static isInBox;
20
+ }
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DocumentFrameService = void 0;
4
+ const document_table_1 = require("@contrail/document-table");
5
+ const document_element_factory_1 = require("./document-element-factory");
6
+ class DocumentFrameService {
7
+ static generateFrames(document, documentFrameGenerationOptions = {}) {
8
+ var _a, _b, _c, _d, _e, _f;
9
+ const options = Object.assign(documentFrameGenerationOptions, {
10
+ includeHidden: true,
11
+ selectedIds: [],
12
+ relativePosition: false,
13
+ });
14
+ const includeSelected = ((_a = options.selectedIds) === null || _a === void 0 ? void 0 : _a.length) > 0;
15
+ const frames = new Map();
16
+ const elementsMap = new Map((_b = document === null || document === void 0 ? void 0 : document.elements) === null || _b === void 0 ? void 0 : _b.map((element) => [element.id, element]));
17
+ for (let i = 0; i < ((_c = document === null || document === void 0 ? void 0 : document.elements) === null || _c === void 0 ? void 0 : _c.length); i++) {
18
+ const documentElement = document.elements[i];
19
+ if (['row', 'column', 'cell'].indexOf(documentElement.type) !== -1)
20
+ continue;
21
+ if (documentElement.type === 'frame') {
22
+ if (!options.includeHidden && (documentElement === null || documentElement === void 0 ? void 0 : documentElement.isHidden))
23
+ continue;
24
+ if (!includeSelected || ((_d = options.selectedIds) === null || _d === void 0 ? void 0 : _d.includes(documentElement.id))) {
25
+ frames.set(documentElement.id, {
26
+ id: documentElement.id,
27
+ index: i,
28
+ box: {
29
+ x: documentElement.position.x,
30
+ y: documentElement.position.y,
31
+ width: documentElement.size.width,
32
+ height: documentElement.size.height,
33
+ left: documentElement.position.x,
34
+ right: documentElement.position.x + documentElement.size.width,
35
+ top: documentElement.position.y,
36
+ bottom: documentElement.position.y + documentElement.size.height,
37
+ },
38
+ element: documentElement,
39
+ elements: [],
40
+ });
41
+ }
42
+ }
43
+ else {
44
+ if ((frames === null || frames === void 0 ? void 0 : frames.size) !== 0) {
45
+ const startElement = documentElement.type === 'callout' &&
46
+ ((_e = documentElement === null || documentElement === void 0 ? void 0 : documentElement.start) === null || _e === void 0 ? void 0 : _e.id) &&
47
+ elementsMap.get(documentElement.start.id);
48
+ const endElement = documentElement.type === 'callout' && ((_f = documentElement === null || documentElement === void 0 ? void 0 : documentElement.end) === null || _f === void 0 ? void 0 : _f.id) && elementsMap.get(documentElement.end.id);
49
+ const { x, y, width, height } = document_element_factory_1.DocumentElementFactory.getBoundingClientRect(documentElement, startElement, endElement);
50
+ const elementBox = {
51
+ x,
52
+ y,
53
+ width,
54
+ height,
55
+ left: x + width / 2,
56
+ right: x + width / 2,
57
+ top: y + height / 2,
58
+ bottom: y + height / 2,
59
+ };
60
+ const overlappedFrame = ([...frames.values()].filter((frame) => {
61
+ return i > frame.index && this.isInBox(frame.box, elementBox);
62
+ }) || []).pop();
63
+ if (overlappedFrame) {
64
+ const frame = frames.get(overlappedFrame.id);
65
+ frames.set(overlappedFrame.id, Object.assign(Object.assign({}, frame), { elements: [
66
+ ...frame.elements,
67
+ {
68
+ element: documentElement,
69
+ index: i,
70
+ },
71
+ ] }));
72
+ if (documentElement.type === 'table') {
73
+ const childElements = document_table_1.TableService.getTableChildElements(documentElement.id, document.elements);
74
+ const frame = frames.get(overlappedFrame.id);
75
+ frames.set(overlappedFrame.id, Object.assign(Object.assign({}, frame), { elements: [
76
+ ...frame.elements,
77
+ ...childElements.map((e) => ({
78
+ element: e,
79
+ index: i,
80
+ })),
81
+ ] }));
82
+ }
83
+ }
84
+ }
85
+ }
86
+ }
87
+ if ((frames === null || frames === void 0 ? void 0 : frames.size) === 0) {
88
+ return [];
89
+ }
90
+ const documentFrames = [];
91
+ frames.forEach((frame) => {
92
+ var _a, _b, _c;
93
+ const framePosition = frame.element.position;
94
+ const position = (options === null || options === void 0 ? void 0 : options.relativePosition) ? { x: 0, y: 0 } : framePosition;
95
+ if (options.relativePosition) {
96
+ for (let i = 0; i < ((_a = frame === null || frame === void 0 ? void 0 : frame.elements) === null || _a === void 0 ? void 0 : _a.length); i++) {
97
+ const element = frame.elements[i].element;
98
+ if (element.type === 'line') {
99
+ element.lineDefinition.x1 = element.lineDefinition.x1 - framePosition.x;
100
+ element.lineDefinition.y1 = element.lineDefinition.y1 - framePosition.y;
101
+ element.lineDefinition.x2 = element.lineDefinition.x2 - framePosition.x;
102
+ element.lineDefinition.y2 = element.lineDefinition.y2 - framePosition.y;
103
+ }
104
+ else {
105
+ element.position = {
106
+ x: element.position.x - framePosition.x,
107
+ y: element.position.y - framePosition.y,
108
+ };
109
+ }
110
+ if (element.type === 'callout' || element.type === 'line') {
111
+ if (((_b = element.points) === null || _b === void 0 ? void 0 : _b.length) > 0) {
112
+ element.points = element.points.map(([x, y]) => [x - framePosition.x, y - framePosition.y]);
113
+ }
114
+ }
115
+ }
116
+ }
117
+ documentFrames.push({
118
+ name: frame.element.name,
119
+ background: [frame.element],
120
+ elements: (_c = frame.elements) === null || _c === void 0 ? void 0 : _c.map((frameElement) => frameElement.element),
121
+ size: frame.element.size,
122
+ position,
123
+ });
124
+ });
125
+ return documentFrames;
126
+ }
127
+ static isInBox(box, elementBox) {
128
+ return !(box.bottom < elementBox.bottom ||
129
+ box.top > elementBox.top ||
130
+ box.right < elementBox.right ||
131
+ box.left > elementBox.left);
132
+ }
133
+ }
134
+ exports.DocumentFrameService = DocumentFrameService;
@@ -88,3 +88,13 @@ export interface CropDefinition {
88
88
  widthPercent?: number;
89
89
  heightPercent?: number;
90
90
  }
91
+ export interface CoordinateBox {
92
+ x: number;
93
+ y: number;
94
+ top: number;
95
+ bottom: number;
96
+ right: number;
97
+ left: number;
98
+ width: number;
99
+ height: number;
100
+ }
@@ -18,7 +18,6 @@ export interface DocumentElement extends Document {
18
18
  specifiedId?: string;
19
19
  documentId?: string;
20
20
  type?: string;
21
- position?: PositionDefinition;
22
21
  rotate?: RotationDefinition;
23
22
  scale?: ScaleTransformation;
24
23
  text?: string;
@@ -9,6 +9,7 @@ export interface Document {
9
9
  name?: string;
10
10
  elements?: Array<DocumentElement>;
11
11
  size?: SizeDefinition;
12
+ position?: PositionDefinition;
12
13
  style?: StyleDefinition;
13
14
  model?: any;
14
15
  modelBindings?: any;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contrail/documents",
3
- "version": "1.3.11",
3
+ "version": "1.3.12",
4
4
  "description": "Documents library for contrail platform",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",