@contrail/documents 2.1.0-alpha.a738b01 → 2.1.0-alpha.ab97680

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/CHANGELOG.md CHANGED
@@ -20,6 +20,16 @@ Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
20
20
  - `SECTION_ELEMENT_TYPE`, `FRAME_ELEMENT_TYPE` and `SHAPE_ELEMENT_TYPES` in
21
21
  `document-element-constants`, so the rule above has one definition rather than one per app.
22
22
 
23
+ ### Changed (breaking)
24
+
25
+ - `isContainerBinding()` becomes `DynamicTextUtil.takesValueFromContainer()`. Same rule, named for
26
+ what it decides: whether the binding's value comes from the container rather than a type property.
27
+
28
+ ### Fixed
29
+
30
+ - `DynamicTextUtil.calculateSize` threw on an element that reached it without a `size`, which on
31
+ the server failed the read for the whole document. It now measures from a zero size instead.
32
+
23
33
  ### Changed
24
34
 
25
35
  - `DocumentElementFactory.getBoundingClientRect` multiplies the measured size by the element's
@@ -1,9 +1,10 @@
1
- import { PositionDefinition } from '../types';
1
+ import { DocumentElement, PositionDefinition } from '../types';
2
2
  import { ContainerElementType } from './container-kind';
3
3
  import { DocumentContainer } from './document-container';
4
4
  export declare class DocumentContainerIndex {
5
5
  private readonly data;
6
6
  constructor(data: {
7
+ documentElementsById: Map<string, DocumentElement>;
7
8
  containersById: Map<string, DocumentContainer>;
8
9
  containerPathsByDocumentElementId: Map<string, Map<string, string[]>>;
9
10
  memberIdsByContainerId: Map<string, string[]>;
@@ -11,11 +12,13 @@ export declare class DocumentContainerIndex {
11
12
  });
12
13
  getContainer(containerId: string): DocumentContainer | null;
13
14
  containersOf(documentElementId: string, elementType: ContainerElementType): DocumentContainer[];
14
- containerIdsOf(documentElementId: string, elementType: ContainerElementType): string[];
15
+ containerIdsOf(documentElementId: string, elementType: ContainerElementType): readonly string[];
15
16
  innermostContainerIdOf(documentElementId: string, elementType: ContainerElementType): string | null;
16
- memberIdsOf(containerId: string): string[];
17
- containerPathAtPoint(point: PositionDefinition, elementType: ContainerElementType): string[];
17
+ memberIdsOf(containerId: string): readonly string[];
18
+ memberDocumentElementsOf(containerId: string): DocumentElement[];
19
+ containerPathAtPoint(point: PositionDefinition, elementType: ContainerElementType): readonly string[];
18
20
  maxDepth(elementType: ContainerElementType): number;
19
21
  private containersOfType;
22
+ private resolveAll;
20
23
  private containerPath;
21
24
  }
@@ -11,9 +11,7 @@ class DocumentContainerIndex {
11
11
  return (_a = this.data.containersById.get(containerId)) !== null && _a !== void 0 ? _a : null;
12
12
  }
13
13
  containersOf(documentElementId, elementType) {
14
- return this.containerIdsOf(documentElementId, elementType)
15
- .map((containerId) => this.data.containersById.get(containerId))
16
- .filter(Boolean);
14
+ return this.resolveAll(this.containerIdsOf(documentElementId, elementType));
17
15
  }
18
16
  containerIdsOf(documentElementId, elementType) {
19
17
  return this.containerPath(documentElementId, elementType);
@@ -26,6 +24,16 @@ class DocumentContainerIndex {
26
24
  var _a;
27
25
  return (_a = this.data.memberIdsByContainerId.get(containerId)) !== null && _a !== void 0 ? _a : [];
28
26
  }
27
+ memberDocumentElementsOf(containerId) {
28
+ const members = [];
29
+ for (const memberId of this.memberIdsOf(containerId)) {
30
+ const member = this.data.documentElementsById.get(memberId);
31
+ if (member) {
32
+ members.push(member);
33
+ }
34
+ }
35
+ return members;
36
+ }
29
37
  containerPathAtPoint(point, elementType) {
30
38
  const covering = this.containersOfType(elementType).filter((container) => (0, document_container_1.containsPoint)(container.box, point));
31
39
  return (0, document_container_1.topmostPerDepth)(covering).map((container) => container.id);
@@ -35,9 +43,17 @@ class DocumentContainerIndex {
35
43
  }
36
44
  containersOfType(elementType) {
37
45
  var _a;
38
- return ((_a = this.data.containerIdsByElementType.get(elementType)) !== null && _a !== void 0 ? _a : [])
39
- .map((containerId) => this.data.containersById.get(containerId))
40
- .filter(Boolean);
46
+ return this.resolveAll((_a = this.data.containerIdsByElementType.get(elementType)) !== null && _a !== void 0 ? _a : []);
47
+ }
48
+ resolveAll(containerIds) {
49
+ const containers = [];
50
+ for (const containerId of containerIds) {
51
+ const container = this.data.containersById.get(containerId);
52
+ if (container) {
53
+ containers.push(container);
54
+ }
55
+ }
56
+ return containers;
41
57
  }
42
58
  containerPath(documentElementId, elementType) {
43
59
  var _a, _b;
@@ -1,14 +1,8 @@
1
1
  import { DocumentElement } from '../types';
2
2
  import { ContainerKind } from './container-kind';
3
3
  import { DocumentContainerIndex } from './document-container-index';
4
- export type MeasureDocumentElement = (documentElement: DocumentElement, startElement?: DocumentElement, endElement?: DocumentElement) => {
5
- x: number;
6
- y: number;
7
- width: number;
8
- height: number;
9
- } | null;
10
4
  export declare class DocumentContainerService {
11
- static buildIndex(documentElements: readonly DocumentElement[], kinds?: ContainerKind[], measure?: MeasureDocumentElement): DocumentContainerIndex;
5
+ static buildIndex(documentElements: readonly DocumentElement[], kinds?: ContainerKind[]): DocumentContainerIndex;
12
6
  static isContainer(documentElement: DocumentElement, kinds?: ContainerKind[]): boolean;
13
7
  private static measureDocumentElements;
14
8
  private static measure;
@@ -7,8 +7,8 @@ const container_kind_1 = require("./container-kind");
7
7
  const document_container_index_1 = require("./document-container-index");
8
8
  const document_container_1 = require("./document-container");
9
9
  class DocumentContainerService {
10
- static buildIndex(documentElements, kinds = container_kind_1.CONTAINER_KINDS, measure) {
11
- const measuredDocumentElements = this.measureDocumentElements(documentElements !== null && documentElements !== void 0 ? documentElements : [], measure);
10
+ static buildIndex(documentElements, kinds = container_kind_1.CONTAINER_KINDS) {
11
+ const measuredDocumentElements = this.measureDocumentElements(documentElements !== null && documentElements !== void 0 ? documentElements : []);
12
12
  const nestingByElementType = new Map(kinds.map((kind) => [kind.elementType, this.buildNesting(measuredDocumentElements, kind)]));
13
13
  const containersById = new Map();
14
14
  const containerIdsByElementType = new Map();
@@ -37,6 +37,7 @@ class DocumentContainerService {
37
37
  containerPathsByDocumentElementId.set(documentElementId, pathsByElementType);
38
38
  }
39
39
  return new document_container_index_1.DocumentContainerIndex({
40
+ documentElementsById: new Map(measuredDocumentElements.map((measured) => [measured.documentElement.id, measured.documentElement])),
40
41
  containersById,
41
42
  containerPathsByDocumentElementId,
42
43
  memberIdsByContainerId,
@@ -46,15 +47,15 @@ class DocumentContainerService {
46
47
  static isContainer(documentElement, kinds = container_kind_1.CONTAINER_KINDS) {
47
48
  return kinds.some((kind) => kind.elementType === (documentElement === null || documentElement === void 0 ? void 0 : documentElement.type));
48
49
  }
49
- static measureDocumentElements(documentElements, measure) {
50
+ static measureDocumentElements(documentElements) {
50
51
  const documentElementsById = new Map(documentElements.map((documentElement) => [documentElement.id, documentElement]));
51
52
  return documentElements.map((documentElement, drawOrder) => ({
52
53
  documentElement,
53
54
  drawOrder,
54
- box: this.measure(documentElement, documentElementsById, measure),
55
+ box: this.measure(documentElement, documentElementsById),
55
56
  }));
56
57
  }
57
- static measure(documentElement, documentElementsById, measure) {
58
+ static measure(documentElement, documentElementsById) {
58
59
  var _a, _b;
59
60
  if (!(documentElement === null || documentElement === void 0 ? void 0 : documentElement.position)) {
60
61
  return null;
@@ -62,10 +63,8 @@ class DocumentContainerService {
62
63
  try {
63
64
  const start = ((_a = documentElement.start) === null || _a === void 0 ? void 0 : _a.id) ? documentElementsById.get(documentElement.start.id) : undefined;
64
65
  const end = ((_b = documentElement.end) === null || _b === void 0 ? void 0 : _b.id) ? documentElementsById.get(documentElement.end.id) : undefined;
65
- const rect = measure
66
- ? measure(documentElement, start, end)
67
- : document_element_factory_1.DocumentElementFactory.getBoundingClientRect(documentElement, start, end);
68
- return rect ? (0, document_container_1.toCoordinateBox)(rect.x, rect.y, rect.width, rect.height) : null;
66
+ const { x, y, width, height } = document_element_factory_1.DocumentElementFactory.getBoundingClientRect(documentElement, start, end);
67
+ return (0, document_container_1.toCoordinateBox)(x, y, width, height);
69
68
  }
70
69
  catch (_c) {
71
70
  return null;
@@ -48,8 +48,8 @@ export declare const HARD_CODED_TEXT: {
48
48
  'section.itemOptionCount': string;
49
49
  'section.colorCount': string;
50
50
  };
51
- export declare function isContainerBinding(bindingProperty: string | null | undefined): boolean;
52
51
  export declare class DynamicTextUtil {
52
+ static takesValueFromContainer(bindingProperty: string | null | undefined): boolean;
53
53
  static getDynamicTextValue(dynamicTextElement: DocumentElement, property: TypeProperty, propertyLevel: PropertyLevel, container: DynamicTextContainer | null, componentModels: any[], ownerReferenceModel?: any): string;
54
54
  static calculateSize(dynamicTextElement: DocumentElement, entityType: any, text: string): import("../..").SizeDefinition;
55
55
  static getTextFromFrameMemberValues(displayFunction: string, property: any, memberValues: any[]): string;
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DynamicTextUtil = exports.HARD_CODED_TEXT = exports.CLICK_TO_CONFIGURE = exports.MOVE_TO_SECTION_TEXT = exports.MOVE_TO_FRAME_TEXT = exports.DynamicTextDisplayFunction = exports.DYNAMIC_TEXT_DATA_SOURCE = void 0;
4
- exports.isContainerBinding = isContainerBinding;
5
4
  const types_1 = require("@contrail/types");
6
5
  const util_1 = require("@contrail/util");
7
6
  const document_util_1 = require("@contrail/document-util");
@@ -51,14 +50,14 @@ exports.HARD_CODED_TEXT = {
51
50
  };
52
51
  const CONTAINER_PROPERTY_SLUGS = ['name', 'count', 'itemFamilyCount', 'itemOptionCount', 'colorCount'];
53
52
  const CONTAINER_SOURCES = [DYNAMIC_TEXT_DATA_SOURCE.FRAME, DYNAMIC_TEXT_DATA_SOURCE.SECTION];
54
- function isContainerBinding(bindingProperty) {
55
- if (!bindingProperty) {
56
- return false;
57
- }
58
- const [entityType, propertySlug] = bindingProperty.split('.');
59
- return CONTAINER_SOURCES.includes(entityType) && CONTAINER_PROPERTY_SLUGS.includes(propertySlug);
60
- }
61
53
  class DynamicTextUtil {
54
+ static takesValueFromContainer(bindingProperty) {
55
+ if (!bindingProperty) {
56
+ return false;
57
+ }
58
+ const [entityType, propertySlug] = bindingProperty.split('.');
59
+ return CONTAINER_SOURCES.includes(entityType) && CONTAINER_PROPERTY_SLUGS.includes(propertySlug);
60
+ }
62
61
  static getDynamicTextValue(dynamicTextElement, property, propertyLevel, container, componentModels, ownerReferenceModel = null) {
63
62
  var _a, _b, _c, _d;
64
63
  if (!dynamicTextElement.propertyBindings || !dynamicTextElement.propertyBindings.text) {
@@ -150,12 +149,12 @@ class DynamicTextUtil {
150
149
  return text;
151
150
  }
152
151
  static calculateSize(dynamicTextElement, entityType, text) {
153
- var _a, _b, _c, _d;
154
- let size = dynamicTextElement.size;
155
- const fontFamily = (_a = document_util_1.DocumentStyleUtil.getFirstFontFamily(dynamicTextElement === null || dynamicTextElement === void 0 ? void 0 : dynamicTextElement.text)) !== null && _a !== void 0 ? _a : document_util_1.DEFAULT_TEXT_FONT_FAMILY;
156
- const fontSize = (_d = (dynamicTextElement.isTextTool
157
- ? (_c = (_b = dynamicTextElement.style) === null || _b === void 0 ? void 0 : _b.font) === null || _c === void 0 ? void 0 : _c.size
158
- : document_util_1.DocumentStyleUtil.getFirstFontSize(dynamicTextElement === null || dynamicTextElement === void 0 ? void 0 : dynamicTextElement.text, true))) !== null && _d !== void 0 ? _d : document_util_1.DEFAULT_TEXT_FONT_SIZE;
152
+ var _a, _b, _c, _d, _e;
153
+ let size = (_a = dynamicTextElement.size) !== null && _a !== void 0 ? _a : { width: 0, height: 0 };
154
+ const fontFamily = (_b = document_util_1.DocumentStyleUtil.getFirstFontFamily(dynamicTextElement === null || dynamicTextElement === void 0 ? void 0 : dynamicTextElement.text)) !== null && _b !== void 0 ? _b : document_util_1.DEFAULT_TEXT_FONT_FAMILY;
155
+ const fontSize = (_e = (dynamicTextElement.isTextTool
156
+ ? (_d = (_c = dynamicTextElement.style) === null || _c === void 0 ? void 0 : _c.font) === null || _d === void 0 ? void 0 : _d.size
157
+ : document_util_1.DocumentStyleUtil.getFirstFontSize(dynamicTextElement === null || dynamicTextElement === void 0 ? void 0 : dynamicTextElement.text, true))) !== null && _e !== void 0 ? _e : document_util_1.DEFAULT_TEXT_FONT_SIZE;
159
158
  const fontSizePx = document_util_1.DocumentStyleUtil.toPx(fontSize, 4);
160
159
  const padding = dynamicTextElement.isTextTool ? document_util_1.TEXT_TOOL_PADDING : document_util_1.TEXT_BOX_PADDING;
161
160
  const bold = document_util_1.DocumentStyleUtil.isBold(dynamicTextElement === null || dynamicTextElement === void 0 ? void 0 : dynamicTextElement.text, fontFamily);
@@ -169,7 +168,7 @@ class DynamicTextUtil {
169
168
  italic,
170
169
  };
171
170
  if (!dynamicTextElement.isTextTool) {
172
- measureTextSettings.width = dynamicTextElement.size.width - padding * 2;
171
+ measureTextSettings.width = size.width - padding * 2;
173
172
  }
174
173
  try {
175
174
  const dimensions = document_util_1.DocumentTextUtil.measureText(text, measureTextSettings);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contrail/documents",
3
- "version": "2.1.0-alpha.a738b01",
3
+ "version": "2.1.0-alpha.ab97680",
4
4
  "description": "Documents library for contrail platform",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",