@itwin/presentation-common 4.0.0-dev.4 → 4.0.0-dev.41
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 +20 -2
- package/lib/cjs/presentation-common/LabelDefinition.d.ts +8 -2
- package/lib/cjs/presentation-common/LabelDefinition.d.ts.map +1 -1
- package/lib/cjs/presentation-common/LabelDefinition.js +8 -3
- package/lib/cjs/presentation-common/LabelDefinition.js.map +1 -1
- package/lib/cjs/presentation-common/PropertyFormatter.d.ts +31 -0
- package/lib/cjs/presentation-common/PropertyFormatter.d.ts.map +1 -0
- package/lib/cjs/presentation-common/PropertyFormatter.js +199 -0
- package/lib/cjs/presentation-common/PropertyFormatter.js.map +1 -0
- package/lib/cjs/presentation-common/RpcRequestsHandler.d.ts +9 -10
- package/lib/cjs/presentation-common/RpcRequestsHandler.d.ts.map +1 -1
- package/lib/cjs/presentation-common/RpcRequestsHandler.js +33 -38
- package/lib/cjs/presentation-common/RpcRequestsHandler.js.map +1 -1
- package/lib/cjs/presentation-common/RulesetsFactory.js +3 -3
- package/lib/cjs/presentation-common/RulesetsFactory.js.map +1 -1
- package/lib/cjs/presentation-common/content/ContentTraverser.js +3 -5
- package/lib/cjs/presentation-common/content/ContentTraverser.js.map +1 -1
- package/lib/cjs/presentation-common/content/Descriptor.d.ts +1 -1
- package/lib/cjs/presentation-common/content/Descriptor.js +4 -6
- package/lib/cjs/presentation-common/content/Descriptor.js.map +1 -1
- package/lib/cjs/presentation-common/content/Fields.d.ts +9 -12
- package/lib/cjs/presentation-common/content/Fields.d.ts.map +1 -1
- package/lib/cjs/presentation-common/content/Fields.js +11 -15
- package/lib/cjs/presentation-common/content/Fields.js.map +1 -1
- package/lib/cjs/presentation-common/content/Item.d.ts +1 -1
- package/lib/cjs/presentation-common/content/Item.d.ts.map +1 -1
- package/lib/cjs/presentation-common/content/Item.js.map +1 -1
- package/lib/cjs/presentation-common/hierarchy/Key.d.ts +5 -5
- package/lib/cjs/presentation-common/hierarchy/Key.d.ts.map +1 -1
- package/lib/cjs/presentation-common/hierarchy/Key.js.map +1 -1
- package/lib/cjs/presentation-common/hierarchy/Node.d.ts +7 -7
- package/lib/cjs/presentation-common/hierarchy/Node.d.ts.map +1 -1
- package/lib/cjs/presentation-common/hierarchy/Node.js.map +1 -1
- package/lib/cjs/presentation-common.d.ts +1 -0
- package/lib/cjs/presentation-common.d.ts.map +1 -1
- package/lib/cjs/presentation-common.js +1 -0
- package/lib/cjs/presentation-common.js.map +1 -1
- package/lib/esm/presentation-common/LabelDefinition.d.ts +8 -2
- package/lib/esm/presentation-common/LabelDefinition.d.ts.map +1 -1
- package/lib/esm/presentation-common/LabelDefinition.js +8 -3
- package/lib/esm/presentation-common/LabelDefinition.js.map +1 -1
- package/lib/esm/presentation-common/PropertyFormatter.d.ts +31 -0
- package/lib/esm/presentation-common/PropertyFormatter.d.ts.map +1 -0
- package/lib/esm/presentation-common/PropertyFormatter.js +194 -0
- package/lib/esm/presentation-common/PropertyFormatter.js.map +1 -0
- package/lib/esm/presentation-common/RpcRequestsHandler.d.ts +9 -10
- package/lib/esm/presentation-common/RpcRequestsHandler.d.ts.map +1 -1
- package/lib/esm/presentation-common/RpcRequestsHandler.js +34 -39
- package/lib/esm/presentation-common/RpcRequestsHandler.js.map +1 -1
- package/lib/esm/presentation-common/RulesetsFactory.js +3 -3
- package/lib/esm/presentation-common/RulesetsFactory.js.map +1 -1
- package/lib/esm/presentation-common/content/ContentTraverser.js +3 -5
- package/lib/esm/presentation-common/content/ContentTraverser.js.map +1 -1
- package/lib/esm/presentation-common/content/Descriptor.d.ts +1 -1
- package/lib/esm/presentation-common/content/Descriptor.js +4 -6
- package/lib/esm/presentation-common/content/Descriptor.js.map +1 -1
- package/lib/esm/presentation-common/content/Fields.d.ts +9 -12
- package/lib/esm/presentation-common/content/Fields.d.ts.map +1 -1
- package/lib/esm/presentation-common/content/Fields.js +11 -15
- package/lib/esm/presentation-common/content/Fields.js.map +1 -1
- package/lib/esm/presentation-common/content/Item.d.ts +1 -1
- package/lib/esm/presentation-common/content/Item.d.ts.map +1 -1
- package/lib/esm/presentation-common/content/Item.js.map +1 -1
- package/lib/esm/presentation-common/hierarchy/Key.d.ts +5 -5
- package/lib/esm/presentation-common/hierarchy/Key.d.ts.map +1 -1
- package/lib/esm/presentation-common/hierarchy/Key.js.map +1 -1
- package/lib/esm/presentation-common/hierarchy/Node.d.ts +7 -7
- package/lib/esm/presentation-common/hierarchy/Node.d.ts.map +1 -1
- package/lib/esm/presentation-common/hierarchy/Node.js.map +1 -1
- package/lib/esm/presentation-common.d.ts +1 -0
- package/lib/esm/presentation-common.d.ts.map +1 -1
- package/lib/esm/presentation-common.js +1 -0
- package/lib/esm/presentation-common.js.map +1 -1
- package/package.json +11 -9
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,24 @@
|
|
|
1
1
|
# Change Log - @itwin/presentation-common
|
|
2
2
|
|
|
3
|
-
This log was last generated on
|
|
3
|
+
This log was last generated on Wed, 08 Feb 2023 14:58:40 GMT and should not be manually modified.
|
|
4
|
+
|
|
5
|
+
## 3.6.0
|
|
6
|
+
Wed, 08 Feb 2023 14:58:40 GMT
|
|
7
|
+
|
|
8
|
+
### Updates
|
|
9
|
+
|
|
10
|
+
- API promotions
|
|
11
|
+
- Deprecate a number of `{api_name}JSON` interfaces in favor of sibling `{api_name}` interface
|
|
12
|
+
- Take `InstanceFilterDefinition` instead of pure string ECExpression for hierarchy level filter
|
|
13
|
+
- Allow specifying enum values in presentation rules as strings
|
|
14
|
+
- Add APIs to get hierarchy level descriptor
|
|
15
|
+
- Introduce unfilterable nodes and hierarchy levels
|
|
16
|
+
- React to RPC deprecations.
|
|
17
|
+
|
|
18
|
+
## 3.5.6
|
|
19
|
+
Fri, 24 Feb 2023 16:02:47 GMT
|
|
20
|
+
|
|
21
|
+
_Version update only_
|
|
4
22
|
|
|
5
23
|
## 3.5.5
|
|
6
24
|
Thu, 26 Jan 2023 22:53:28 GMT
|
|
@@ -226,7 +244,7 @@ Mon, 24 Jan 2022 14:00:52 GMT
|
|
|
226
244
|
- Optimize `KeySetJSON` size by compressing instance IDs.
|
|
227
245
|
- Remove `PresentationRpcInterface.loadHierarchy`.
|
|
228
246
|
- The `condition` attribute should be defined on both `ChildNodeRule` and `RootNodeRule`.
|
|
229
|
-
- Added `ignoreCategories` parameter in `createFieldHierarchies` function for adding all of the nested properties to parent field's child fields without considering categories.
|
|
247
|
+
- Added `ignoreCategories` parameter in `createFieldHierarchies` function for adding all of the nested properties to parent field's child fields without considering categories.
|
|
230
248
|
- Removed `PresentationUnitSystem` in favor of `UnitSystemKey` from `@itwin/core-quantity`.
|
|
231
249
|
- remove ClientRequestContext.current
|
|
232
250
|
|
|
@@ -78,11 +78,17 @@ export declare namespace LabelDefinition {
|
|
|
78
78
|
function fromJSON(json: LabelDefinitionJSON | string): LabelDefinition;
|
|
79
79
|
/** @internal */
|
|
80
80
|
const COMPOSITE_DEFINITION_TYPENAME = "composite";
|
|
81
|
-
/**
|
|
81
|
+
/**
|
|
82
|
+
* Checks if provided [[LabelDefinition]] has raw value of type [[LabelCompositeValue]].
|
|
83
|
+
* @public
|
|
84
|
+
*/
|
|
82
85
|
function isCompositeDefinition(def: LabelDefinition): def is LabelDefinition & {
|
|
83
86
|
rawValue: LabelCompositeValue;
|
|
84
87
|
};
|
|
85
|
-
/**
|
|
88
|
+
/**
|
|
89
|
+
* Creates [[LabelDefinition]] from string value.
|
|
90
|
+
* @public
|
|
91
|
+
*/
|
|
86
92
|
function fromLabelString(label: string): LabelDefinition;
|
|
87
93
|
}
|
|
88
94
|
//# sourceMappingURL=LabelDefinition.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LabelDefinition.d.ts","sourceRoot":"","sources":["../../../src/presentation-common/LabelDefinition.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,cAAc;AACd,yBAAiB,mBAAmB,CAAC;IACnC;;;OAGG;IAEH,SAAgB,MAAM,CAAC,cAAc,EAAE,mBAAmB,GAAG,uBAAuB,CAEnF;IAED;;;OAGG;IAEH,SAAgB,QAAQ,CAAC,IAAI,EAAE,uBAAuB,GAAG,mBAAmB,CAE3E;CACF;AAED;;;GAGG;AACH,oBAAY,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,mBAAmB,CAAC;AAE5E;;;;GAIG;AACH,oBAAY,iBAAiB,GAAG,aAAa,CAAC;AAE9C;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,6BAA6B;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,QAAQ,EAAE,aAAa,CAAC;IACxB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,cAAc;AACd,yBAAiB,eAAe,CAAC;IAC/B;;;OAGG;IAEH,SAAgB,MAAM,CAAC,eAAe,EAAE,eAAe,GAAG,mBAAmB,CAE5E;IAED;;;OAGG;IAEH,SAAgB,QAAQ,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,GAAG,eAAe,CAI5E;IAED,gBAAgB;IACT,MAAM,6BAA6B,cAAc,CAAC;IAEzD
|
|
1
|
+
{"version":3,"file":"LabelDefinition.d.ts","sourceRoot":"","sources":["../../../src/presentation-common/LabelDefinition.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,cAAc;AACd,yBAAiB,mBAAmB,CAAC;IACnC;;;OAGG;IAEH,SAAgB,MAAM,CAAC,cAAc,EAAE,mBAAmB,GAAG,uBAAuB,CAEnF;IAED;;;OAGG;IAEH,SAAgB,QAAQ,CAAC,IAAI,EAAE,uBAAuB,GAAG,mBAAmB,CAE3E;CACF;AAED;;;GAGG;AACH,oBAAY,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,mBAAmB,CAAC;AAE5E;;;;GAIG;AACH,oBAAY,iBAAiB,GAAG,aAAa,CAAC;AAE9C;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,6BAA6B;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,QAAQ,EAAE,aAAa,CAAC;IACxB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,cAAc;AACd,yBAAiB,eAAe,CAAC;IAC/B;;;OAGG;IAEH,SAAgB,MAAM,CAAC,eAAe,EAAE,eAAe,GAAG,mBAAmB,CAE5E;IAED;;;OAGG;IAEH,SAAgB,QAAQ,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,GAAG,eAAe,CAI5E;IAED,gBAAgB;IACT,MAAM,6BAA6B,cAAc,CAAC;IAEzD;;;OAGG;IACH,SAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,GAAG,GAAG,IAAI,eAAe,GAAG;QAAE,QAAQ,EAAE,mBAAmB,CAAA;KAAE,CAEtH;IAED;;;OAGG;IACH,SAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAM9D;CACF"}
|
|
@@ -55,13 +55,18 @@ var LabelDefinition;
|
|
|
55
55
|
LabelDefinition.fromJSON = fromJSON;
|
|
56
56
|
/** @internal */
|
|
57
57
|
LabelDefinition.COMPOSITE_DEFINITION_TYPENAME = "composite";
|
|
58
|
-
/**
|
|
59
|
-
|
|
58
|
+
/**
|
|
59
|
+
* Checks if provided [[LabelDefinition]] has raw value of type [[LabelCompositeValue]].
|
|
60
|
+
* @public
|
|
61
|
+
*/
|
|
60
62
|
function isCompositeDefinition(def) {
|
|
61
63
|
return def.typeName === LabelDefinition.COMPOSITE_DEFINITION_TYPENAME;
|
|
62
64
|
}
|
|
63
65
|
LabelDefinition.isCompositeDefinition = isCompositeDefinition;
|
|
64
|
-
/**
|
|
66
|
+
/**
|
|
67
|
+
* Creates [[LabelDefinition]] from string value.
|
|
68
|
+
* @public
|
|
69
|
+
*/
|
|
65
70
|
function fromLabelString(label) {
|
|
66
71
|
return {
|
|
67
72
|
displayValue: label,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LabelDefinition.js","sourceRoot":"","sources":["../../../src/presentation-common/LabelDefinition.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAqBH,cAAc;AACd,IAAiB,mBAAmB,CAkBnC;AAlBD,WAAiB,mBAAmB;IAClC;;;OAGG;IACH,mDAAmD;IACnD,SAAgB,MAAM,CAAC,cAAmC;QACxD,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;IAFe,0BAAM,SAErB,CAAA;IAED;;;OAGG;IACH,mDAAmD;IACnD,SAAgB,QAAQ,CAAC,IAA6B;QACpD,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;IACrB,CAAC;IAFe,4BAAQ,WAEvB,CAAA;AACH,CAAC,EAlBgB,mBAAmB,GAAnB,2BAAmB,KAAnB,2BAAmB,QAkBnC;AAuCD,cAAc;AACd,IAAiB,eAAe,
|
|
1
|
+
{"version":3,"file":"LabelDefinition.js","sourceRoot":"","sources":["../../../src/presentation-common/LabelDefinition.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAqBH,cAAc;AACd,IAAiB,mBAAmB,CAkBnC;AAlBD,WAAiB,mBAAmB;IAClC;;;OAGG;IACH,mDAAmD;IACnD,SAAgB,MAAM,CAAC,cAAmC;QACxD,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;IAFe,0BAAM,SAErB,CAAA;IAED;;;OAGG;IACH,mDAAmD;IACnD,SAAgB,QAAQ,CAAC,IAA6B;QACpD,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;IACrB,CAAC;IAFe,4BAAQ,WAEvB,CAAA;AACH,CAAC,EAlBgB,mBAAmB,GAAnB,2BAAmB,KAAnB,2BAAmB,QAkBnC;AAuCD,cAAc;AACd,IAAiB,eAAe,CA2C/B;AA3CD,WAAiB,eAAe;IAC9B;;;OAGG;IACH,mDAAmD;IACnD,SAAgB,MAAM,CAAC,eAAgC;QACrD,OAAO,EAAE,GAAG,eAAe,EAAE,CAAC;IAChC,CAAC;IAFe,sBAAM,SAErB,CAAA;IAED;;;OAGG;IACH,mDAAmD;IACnD,SAAgB,QAAQ,CAAC,IAAkC;QACzD,IAAI,OAAO,IAAI,KAAK,QAAQ;YAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;IACrB,CAAC;IAJe,wBAAQ,WAIvB,CAAA;IAED,gBAAgB;IACH,6CAA6B,GAAG,WAAW,CAAC;IAEzD;;;OAGG;IACH,SAAgB,qBAAqB,CAAC,GAAoB;QACxD,OAAO,GAAG,CAAC,QAAQ,KAAK,gBAAA,6BAA6B,CAAC;IACxD,CAAC;IAFe,qCAAqB,wBAEpC,CAAA;IAED;;;OAGG;IACH,SAAgB,eAAe,CAAC,KAAa;QAC3C,OAAO;YACL,YAAY,EAAE,KAAK;YACnB,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,QAAQ;SACnB,CAAC;IACJ,CAAC;IANe,+BAAe,kBAM9B,CAAA;AACH,CAAC,EA3CgB,eAAe,GAAf,uBAAe,KAAf,uBAAe,QA2C/B","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Hierarchies\r\n */\r\n\r\n/**\r\n * Data structure that describes raw composite label value.\r\n * @public\r\n */\r\nexport interface LabelCompositeValue {\r\n separator: string;\r\n values: LabelDefinition[];\r\n}\r\n\r\n/**\r\n * JSON representation of [[LabelCompositeValue]]\r\n * @public\r\n * @deprecated in 3.x. Use [[LabelCompositeValue]].\r\n */\r\nexport interface LabelCompositeValueJSON {\r\n separator: string;\r\n values: LabelDefinition[];\r\n}\r\n\r\n/** @public */\r\nexport namespace LabelCompositeValue {\r\n /**\r\n * Serialize given [[LabelCompositeValue]] to JSON\r\n * @deprecated in 3.x. Use [[LabelCompositeValue]].\r\n */\r\n // eslint-disable-next-line deprecation/deprecation\r\n export function toJSON(compositeValue: LabelCompositeValue): LabelCompositeValueJSON {\r\n return { ...compositeValue };\r\n }\r\n\r\n /**\r\n * Deserialize [[LabelCompositeValue]] from JSON\r\n * @deprecated in 3.x. Use [[LabelCompositeValue]].\r\n */\r\n // eslint-disable-next-line deprecation/deprecation\r\n export function fromJSON(json: LabelCompositeValueJSON): LabelCompositeValue {\r\n return { ...json };\r\n }\r\n}\r\n\r\n/**\r\n * Type definition of label raw value.\r\n * @public\r\n */\r\nexport type LabelRawValue = string | number | boolean | LabelCompositeValue;\r\n\r\n/**\r\n * JSON representation of [[LabelRawValue]]\r\n * @public\r\n * @deprecated in 3.x. Use [[LabelRawValue]].\r\n */\r\nexport type LabelRawValueJSON = LabelRawValue;\r\n\r\n/**\r\n * Data structure that describes label definition.\r\n * @public\r\n */\r\nexport interface LabelDefinition {\r\n /** Display value of label */\r\n displayValue: string;\r\n /** Raw value of label */\r\n rawValue: LabelRawValue;\r\n /** Type name of raw value */\r\n typeName: string;\r\n}\r\n\r\n/**\r\n * JSON representation of [[LabelDefinition]]\r\n * @public\r\n * @deprecated in 3.x. Use [[LabelDefinition]].\r\n */\r\nexport interface LabelDefinitionJSON {\r\n displayValue: string;\r\n rawValue: LabelRawValue;\r\n typeName: string;\r\n}\r\n\r\n/** @public */\r\nexport namespace LabelDefinition {\r\n /**\r\n * Serialize given [[LabelDefinition]] to JSON\r\n * @deprecated in 3.x. Use [[LabelDefinition]].\r\n */\r\n // eslint-disable-next-line deprecation/deprecation\r\n export function toJSON(labelDefinition: LabelDefinition): LabelDefinitionJSON {\r\n return { ...labelDefinition };\r\n }\r\n\r\n /**\r\n * Deserialize [[LabelDefinition]] from JSON\r\n * @deprecated in 3.x. Use [[LabelDefinition]].\r\n */\r\n // eslint-disable-next-line deprecation/deprecation\r\n export function fromJSON(json: LabelDefinitionJSON | string): LabelDefinition {\r\n if (typeof json === \"string\")\r\n return JSON.parse(json);\r\n return { ...json };\r\n }\r\n\r\n /** @internal */\r\n export const COMPOSITE_DEFINITION_TYPENAME = \"composite\";\r\n\r\n /**\r\n * Checks if provided [[LabelDefinition]] has raw value of type [[LabelCompositeValue]].\r\n * @public\r\n */\r\n export function isCompositeDefinition(def: LabelDefinition): def is LabelDefinition & { rawValue: LabelCompositeValue } {\r\n return def.typeName === COMPOSITE_DEFINITION_TYPENAME;\r\n }\r\n\r\n /**\r\n * Creates [[LabelDefinition]] from string value.\r\n * @public\r\n */\r\n export function fromLabelString(label: string): LabelDefinition {\r\n return {\r\n displayValue: label,\r\n rawValue: label,\r\n typeName: \"string\",\r\n };\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** @packageDocumentation
|
|
2
|
+
* @module Core
|
|
3
|
+
*/
|
|
4
|
+
import { FormatterSpec, ParserSpec, UnitSystemKey } from "@itwin/core-quantity";
|
|
5
|
+
import { SchemaContext } from "@itwin/ecschema-metadata";
|
|
6
|
+
import { Content } from "./content/Content";
|
|
7
|
+
/** @alpha */
|
|
8
|
+
export interface FormatOptions {
|
|
9
|
+
koqName: string;
|
|
10
|
+
unitSystem: UnitSystemKey;
|
|
11
|
+
}
|
|
12
|
+
/** @alpha */
|
|
13
|
+
export declare class PropertyValueFormatter {
|
|
14
|
+
private _schemaContext;
|
|
15
|
+
private _unitsProvider;
|
|
16
|
+
constructor(_schemaContext: SchemaContext);
|
|
17
|
+
format(value: number, options: FormatOptions): Promise<string | undefined>;
|
|
18
|
+
getFormatterSpec(options: FormatOptions): Promise<FormatterSpec | undefined>;
|
|
19
|
+
getParserSpec(options: FormatOptions): Promise<ParserSpec | undefined>;
|
|
20
|
+
}
|
|
21
|
+
/** @alpha */
|
|
22
|
+
export declare class ContentPropertyValueFormatter {
|
|
23
|
+
private _propertyValueFormatter;
|
|
24
|
+
private _unitSystem;
|
|
25
|
+
constructor(_propertyValueFormatter: PropertyValueFormatter, _unitSystem: UnitSystemKey);
|
|
26
|
+
formatContent(content: Content): Promise<Content>;
|
|
27
|
+
private formatValues;
|
|
28
|
+
private formatNestedContentDisplayValues;
|
|
29
|
+
private isFormattable;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=PropertyFormatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PropertyFormatter.d.ts","sourceRoot":"","sources":["../../../src/presentation-common/PropertyFormatter.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAAuB,aAAa,EAAE,UAAU,EAAiB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACpH,OAAO,EAC6E,aAAa,EAEhG,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAM5C,aAAa;AACb,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,aAAa,CAAC;CAC3B;AAED,aAAa;AACb,qBAAa,sBAAsB;IAGrB,OAAO,CAAC,cAAc;IAFlC,OAAO,CAAC,cAAc,CAAgB;gBAElB,cAAc,EAAE,aAAa;IAIpC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa;IAO5C,gBAAgB,CAAC,OAAO,EAAE,aAAa;IAUvC,aAAa,CAAC,OAAO,EAAE,aAAa;CASlD;AAED,aAAa;AACb,qBAAa,6BAA6B;IAC5B,OAAO,CAAC,uBAAuB;IAA0B,OAAO,CAAC,WAAW;gBAApE,uBAAuB,EAAE,sBAAsB,EAAU,WAAW,EAAE,aAAa;IAE1F,aAAa,CAAC,OAAO,EAAE,OAAO;YAQ7B,YAAY;YAqBZ,gCAAgC;IAM9C,OAAO,CAAC,aAAa;CAKtB"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*---------------------------------------------------------------------------------------------
|
|
3
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
4
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
5
|
+
*--------------------------------------------------------------------------------------------*/
|
|
6
|
+
/** @packageDocumentation
|
|
7
|
+
* @module Core
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.ContentPropertyValueFormatter = exports.PropertyValueFormatter = void 0;
|
|
11
|
+
const core_bentley_1 = require("@itwin/core-bentley");
|
|
12
|
+
const core_quantity_1 = require("@itwin/core-quantity");
|
|
13
|
+
const ecschema_metadata_1 = require("@itwin/ecschema-metadata");
|
|
14
|
+
const Value_1 = require("./content/Value");
|
|
15
|
+
/** @alpha */
|
|
16
|
+
class PropertyValueFormatter {
|
|
17
|
+
constructor(_schemaContext) {
|
|
18
|
+
this._schemaContext = _schemaContext;
|
|
19
|
+
this._unitsProvider = new ecschema_metadata_1.SchemaUnitProvider(_schemaContext);
|
|
20
|
+
}
|
|
21
|
+
async format(value, options) {
|
|
22
|
+
const formatterSpec = await this.getFormatterSpec(options);
|
|
23
|
+
if (!formatterSpec)
|
|
24
|
+
return undefined;
|
|
25
|
+
return formatterSpec.applyFormatting(value);
|
|
26
|
+
}
|
|
27
|
+
async getFormatterSpec(options) {
|
|
28
|
+
const formattingProps = await getFormattingProps(this._schemaContext, options);
|
|
29
|
+
if (!formattingProps)
|
|
30
|
+
return undefined;
|
|
31
|
+
const { formatProps, persistenceUnitName } = formattingProps;
|
|
32
|
+
const persistenceUnit = await this._unitsProvider.findUnitByName(persistenceUnitName);
|
|
33
|
+
const format = await core_quantity_1.Format.createFromJSON("", this._unitsProvider, formatProps);
|
|
34
|
+
return core_quantity_1.FormatterSpec.create("", format, this._unitsProvider, persistenceUnit);
|
|
35
|
+
}
|
|
36
|
+
async getParserSpec(options) {
|
|
37
|
+
const formattingProps = await getFormattingProps(this._schemaContext, options);
|
|
38
|
+
if (!formattingProps)
|
|
39
|
+
return undefined;
|
|
40
|
+
const { formatProps, persistenceUnitName } = formattingProps;
|
|
41
|
+
const persistenceUnit = await this._unitsProvider.findUnitByName(persistenceUnitName);
|
|
42
|
+
const format = await core_quantity_1.Format.createFromJSON("", this._unitsProvider, formatProps);
|
|
43
|
+
return core_quantity_1.ParserSpec.create(format, this._unitsProvider, persistenceUnit);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.PropertyValueFormatter = PropertyValueFormatter;
|
|
47
|
+
/** @alpha */
|
|
48
|
+
class ContentPropertyValueFormatter {
|
|
49
|
+
constructor(_propertyValueFormatter, _unitSystem) {
|
|
50
|
+
this._propertyValueFormatter = _propertyValueFormatter;
|
|
51
|
+
this._unitSystem = _unitSystem;
|
|
52
|
+
}
|
|
53
|
+
async formatContent(content) {
|
|
54
|
+
const descriptor = content.descriptor;
|
|
55
|
+
for (const item of content.contentSet) {
|
|
56
|
+
await this.formatValues(item.values, item.displayValues, descriptor.fields, item.mergedFieldNames);
|
|
57
|
+
}
|
|
58
|
+
return content;
|
|
59
|
+
}
|
|
60
|
+
async formatValues(values, displayValues, fields, mergedFields) {
|
|
61
|
+
for (const field of fields) {
|
|
62
|
+
const value = values[field.name];
|
|
63
|
+
if (field.isNestedContentField() && !mergedFields.includes(field.name)) {
|
|
64
|
+
(0, core_bentley_1.assert)(Value_1.Value.isNestedContent(value));
|
|
65
|
+
await this.formatNestedContentDisplayValues(value, field.nestedFields);
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (!this.isFormattable(field) || typeof value !== "number")
|
|
69
|
+
continue;
|
|
70
|
+
const koq = field.properties[0].property.kindOfQuantity;
|
|
71
|
+
const formattedValue = await this._propertyValueFormatter.format(value, { koqName: koq.name, unitSystem: this._unitSystem });
|
|
72
|
+
if (!formattedValue)
|
|
73
|
+
continue;
|
|
74
|
+
displayValues[field.name] = formattedValue;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async formatNestedContentDisplayValues(nestedValues, fields) {
|
|
78
|
+
for (const nestedValue of nestedValues) {
|
|
79
|
+
await this.formatValues(nestedValue.values, nestedValue.displayValues, fields, nestedValue.mergedFieldNames);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
isFormattable(field) {
|
|
83
|
+
return field.isPropertiesField()
|
|
84
|
+
&& field.properties.length > 0
|
|
85
|
+
&& field.properties[0].property.kindOfQuantity !== undefined;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
exports.ContentPropertyValueFormatter = ContentPropertyValueFormatter;
|
|
89
|
+
async function getFormattingProps(schemaLocater, options) {
|
|
90
|
+
const { koqName, unitSystem } = options;
|
|
91
|
+
const koq = await getKoq(schemaLocater, koqName);
|
|
92
|
+
if (!koq)
|
|
93
|
+
return undefined;
|
|
94
|
+
const persistenceUnit = await koq.persistenceUnit;
|
|
95
|
+
// istanbul ignore if
|
|
96
|
+
if (!persistenceUnit)
|
|
97
|
+
return undefined;
|
|
98
|
+
const formatProps = await getKoqFormatProps(koq, persistenceUnit, unitSystem);
|
|
99
|
+
if (!formatProps)
|
|
100
|
+
return undefined;
|
|
101
|
+
return { formatProps, persistenceUnitName: persistenceUnit.fullName };
|
|
102
|
+
}
|
|
103
|
+
async function getKoq(schemaLocater, fullName) {
|
|
104
|
+
const [schemaName, propKoqName] = fullName.split(":");
|
|
105
|
+
const schema = await schemaLocater.getSchema(new ecschema_metadata_1.SchemaKey(schemaName), ecschema_metadata_1.SchemaMatchType.Latest);
|
|
106
|
+
if (!schema)
|
|
107
|
+
return undefined;
|
|
108
|
+
return schema.getItem(propKoqName);
|
|
109
|
+
}
|
|
110
|
+
async function getKoqFormatProps(koq, persistenceUnit, unitSystem) {
|
|
111
|
+
const unitSystems = getUnitSystemGroupNames(unitSystem);
|
|
112
|
+
// use one of KOQ presentation format that matches requested unit system
|
|
113
|
+
const presentationFormat = await getKoqPresentationFormat(koq, unitSystems);
|
|
114
|
+
if (presentationFormat)
|
|
115
|
+
return formatToFormatProps(presentationFormat);
|
|
116
|
+
// use persistence unit format if it matches requested unit system and matching presentation format was not found
|
|
117
|
+
const persistenceUnitSystem = await persistenceUnit.unitSystem;
|
|
118
|
+
if (persistenceUnitSystem && unitSystems.includes(persistenceUnitSystem.name.toUpperCase()))
|
|
119
|
+
return getPersistenceUnitFormatProps(persistenceUnit);
|
|
120
|
+
// use default presentation format if persistence unit does not match requested unit system
|
|
121
|
+
if (koq.defaultPresentationFormat)
|
|
122
|
+
return formatToFormatProps(koq.defaultPresentationFormat);
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
125
|
+
async function getKoqPresentationFormat(koq, unitSystems) {
|
|
126
|
+
const presentationFormats = koq.presentationFormats;
|
|
127
|
+
for (const system of unitSystems) {
|
|
128
|
+
for (const format of presentationFormats) {
|
|
129
|
+
const unit = format.units && format.units[0][0];
|
|
130
|
+
// istanbul ignore if
|
|
131
|
+
if (!unit)
|
|
132
|
+
continue;
|
|
133
|
+
const currentUnitSystem = await unit.unitSystem;
|
|
134
|
+
if (currentUnitSystem && currentUnitSystem.name.toUpperCase() === system)
|
|
135
|
+
return format;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
function formatToFormatProps(format) {
|
|
141
|
+
// istanbul ignore if
|
|
142
|
+
if (ecschema_metadata_1.OverrideFormat.isOverrideFormat(format)) {
|
|
143
|
+
const baseFormat = baseFormatToFormatProps(format.parent);
|
|
144
|
+
return {
|
|
145
|
+
...baseFormat,
|
|
146
|
+
composite: format.units
|
|
147
|
+
? {
|
|
148
|
+
...baseFormat.composite,
|
|
149
|
+
units: format.units.map(([unit, _]) => ({ name: unit.fullName, label: unit.label })),
|
|
150
|
+
spacer: format.spacer,
|
|
151
|
+
includeZero: format.includeZero,
|
|
152
|
+
}
|
|
153
|
+
: baseFormat.composite,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
return baseFormatToFormatProps(format);
|
|
157
|
+
}
|
|
158
|
+
function baseFormatToFormatProps(format) {
|
|
159
|
+
const json = format.toJSON();
|
|
160
|
+
return {
|
|
161
|
+
...json,
|
|
162
|
+
composite: json.composite
|
|
163
|
+
? {
|
|
164
|
+
...json.composite,
|
|
165
|
+
spacer: format.spacer,
|
|
166
|
+
includeZero: format.includeZero,
|
|
167
|
+
}
|
|
168
|
+
: /* istanbul ignore next */ undefined,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
function getPersistenceUnitFormatProps(persistenceUnit) {
|
|
172
|
+
// Same as Format "DefaultRealU" in Formats ecschema
|
|
173
|
+
return {
|
|
174
|
+
formatTraits: ["keepSingleZero", "keepDecimalPoint", "showUnitLabel"],
|
|
175
|
+
precision: 6,
|
|
176
|
+
type: "Decimal",
|
|
177
|
+
uomSeparator: " ",
|
|
178
|
+
decimalSeparator: ".",
|
|
179
|
+
composite: {
|
|
180
|
+
units: [{
|
|
181
|
+
name: persistenceUnit.fullName,
|
|
182
|
+
label: persistenceUnit.label,
|
|
183
|
+
}],
|
|
184
|
+
},
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
function getUnitSystemGroupNames(unitSystem) {
|
|
188
|
+
switch (unitSystem) {
|
|
189
|
+
case "imperial":
|
|
190
|
+
return ["IMPERIAL", "USCUSTOM", "INTERNATIONAL", "FINANCE"];
|
|
191
|
+
case "metric":
|
|
192
|
+
return ["SI", "METRIC", "INTERNATIONAL", "FINANCE"];
|
|
193
|
+
case "usCustomary":
|
|
194
|
+
return ["USCUSTOM", "INTERNATIONAL", "FINANCE"];
|
|
195
|
+
case "usSurvey":
|
|
196
|
+
return ["USSURVEY", "USCUSTOM", "INTERNATIONAL", "FINANCE"];
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=PropertyFormatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PropertyFormatter.js","sourceRoot":"","sources":["../../../src/presentation-common/PropertyFormatter.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Core\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { Format, FormatProps, FormatterSpec, ParserSpec, UnitsProvider, UnitSystemKey } from \"@itwin/core-quantity\";\r\nimport {\r\n Format as ECFormat, InvertedUnit, ISchemaLocater, KindOfQuantity, OverrideFormat, SchemaContext, SchemaKey, SchemaMatchType, SchemaUnitProvider,\r\n Unit,\r\n} from \"@itwin/ecschema-metadata\";\r\nimport { Content } from \"./content/Content\";\r\nimport { Field, PropertiesField } from \"./content/Fields\";\r\nimport { DisplayValue, NestedContentValue, Value } from \"./content/Value\";\r\nimport { KindOfQuantityInfo, PropertyInfo } from \"./EC\";\r\nimport { ValuesDictionary } from \"./Utils\";\r\n\r\n/** @alpha */\r\nexport interface FormatOptions {\r\n koqName: string;\r\n unitSystem: UnitSystemKey;\r\n}\r\n\r\n/** @alpha */\r\nexport class PropertyValueFormatter {\r\n private _unitsProvider: UnitsProvider;\r\n\r\n constructor(private _schemaContext: SchemaContext) {\r\n this._unitsProvider = new SchemaUnitProvider(_schemaContext);\r\n }\r\n\r\n public async format(value: number, options: FormatOptions) {\r\n const formatterSpec = await this.getFormatterSpec(options);\r\n if (!formatterSpec)\r\n return undefined;\r\n return formatterSpec.applyFormatting(value);\r\n }\r\n\r\n public async getFormatterSpec(options: FormatOptions) {\r\n const formattingProps = await getFormattingProps(this._schemaContext, options);\r\n if (!formattingProps)\r\n return undefined;\r\n const { formatProps, persistenceUnitName } = formattingProps;\r\n const persistenceUnit = await this._unitsProvider.findUnitByName(persistenceUnitName);\r\n const format = await Format.createFromJSON(\"\", this._unitsProvider, formatProps);\r\n return FormatterSpec.create(\"\", format, this._unitsProvider, persistenceUnit);\r\n }\r\n\r\n public async getParserSpec(options: FormatOptions) {\r\n const formattingProps = await getFormattingProps(this._schemaContext, options);\r\n if (!formattingProps)\r\n return undefined;\r\n const { formatProps, persistenceUnitName } = formattingProps;\r\n const persistenceUnit = await this._unitsProvider.findUnitByName(persistenceUnitName);\r\n const format = await Format.createFromJSON(\"\", this._unitsProvider, formatProps);\r\n return ParserSpec.create(format, this._unitsProvider, persistenceUnit);\r\n }\r\n}\r\n\r\n/** @alpha */\r\nexport class ContentPropertyValueFormatter {\r\n constructor(private _propertyValueFormatter: PropertyValueFormatter, private _unitSystem: UnitSystemKey) { }\r\n\r\n public async formatContent(content: Content) {\r\n const descriptor = content.descriptor;\r\n for (const item of content.contentSet) {\r\n await this.formatValues(item.values, item.displayValues, descriptor.fields, item.mergedFieldNames);\r\n }\r\n return content;\r\n }\r\n\r\n private async formatValues(values: ValuesDictionary<Value>, displayValues: ValuesDictionary<DisplayValue>, fields: Field[], mergedFields: string[]) {\r\n for (const field of fields) {\r\n const value = values[field.name];\r\n if (field.isNestedContentField() && !mergedFields.includes(field.name)) {\r\n assert(Value.isNestedContent(value));\r\n await this.formatNestedContentDisplayValues(value, field.nestedFields);\r\n continue;\r\n }\r\n\r\n if (!this.isFormattable(field) || typeof value !== \"number\")\r\n continue;\r\n\r\n const koq = field.properties[0].property.kindOfQuantity;\r\n const formattedValue = await this._propertyValueFormatter.format(value, { koqName: koq.name, unitSystem: this._unitSystem });\r\n if (!formattedValue)\r\n continue;\r\n\r\n displayValues[field.name] = formattedValue;\r\n }\r\n }\r\n\r\n private async formatNestedContentDisplayValues(nestedValues: NestedContentValue[], fields: Field[]) {\r\n for (const nestedValue of nestedValues) {\r\n await this.formatValues(nestedValue.values, nestedValue.displayValues, fields, nestedValue.mergedFieldNames);\r\n }\r\n }\r\n\r\n private isFormattable(field: Field): field is FormattableField {\r\n return field.isPropertiesField()\r\n && field.properties.length > 0\r\n && field.properties[0].property.kindOfQuantity !== undefined;\r\n }\r\n}\r\n\r\ntype FormattableField = PropertiesField & {\r\n properties: [{\r\n property: PropertyInfo & {\r\n kindOfQuantity: KindOfQuantityInfo;\r\n };\r\n }];\r\n};\r\n\r\ninterface FormattingProps {\r\n formatProps: FormatProps;\r\n persistenceUnitName: string;\r\n}\r\n\r\nasync function getFormattingProps(schemaLocater: ISchemaLocater, options: FormatOptions): Promise<FormattingProps | undefined> {\r\n const { koqName, unitSystem } = options;\r\n\r\n const koq = await getKoq(schemaLocater, koqName);\r\n if (!koq)\r\n return undefined;\r\n\r\n const persistenceUnit = await koq.persistenceUnit;\r\n // istanbul ignore if\r\n if (!persistenceUnit)\r\n return undefined;\r\n\r\n const formatProps = await getKoqFormatProps(koq, persistenceUnit, unitSystem);\r\n if (!formatProps)\r\n return undefined;\r\n\r\n return { formatProps, persistenceUnitName: persistenceUnit.fullName };\r\n}\r\n\r\nasync function getKoq(schemaLocater: ISchemaLocater, fullName: string) {\r\n const [schemaName, propKoqName] = fullName.split(\":\");\r\n const schema = await schemaLocater.getSchema(new SchemaKey(schemaName), SchemaMatchType.Latest);\r\n if (!schema)\r\n return undefined;\r\n\r\n return schema.getItem<KindOfQuantity>(propKoqName);\r\n}\r\n\r\nasync function getKoqFormatProps(koq: KindOfQuantity, persistenceUnit: Unit | InvertedUnit, unitSystem: UnitSystemKey) {\r\n const unitSystems = getUnitSystemGroupNames(unitSystem);\r\n // use one of KOQ presentation format that matches requested unit system\r\n const presentationFormat = await getKoqPresentationFormat(koq, unitSystems);\r\n if (presentationFormat)\r\n return formatToFormatProps(presentationFormat);\r\n\r\n // use persistence unit format if it matches requested unit system and matching presentation format was not found\r\n const persistenceUnitSystem = await persistenceUnit.unitSystem;\r\n if (persistenceUnitSystem && unitSystems.includes(persistenceUnitSystem.name.toUpperCase()))\r\n return getPersistenceUnitFormatProps(persistenceUnit);\r\n\r\n // use default presentation format if persistence unit does not match requested unit system\r\n if (koq.defaultPresentationFormat)\r\n return formatToFormatProps(koq.defaultPresentationFormat);\r\n\r\n return undefined;\r\n}\r\n\r\nasync function getKoqPresentationFormat(koq: KindOfQuantity, unitSystems: string[]) {\r\n const presentationFormats = koq.presentationFormats;\r\n for (const system of unitSystems) {\r\n for (const format of presentationFormats) {\r\n const unit = format.units && format.units[0][0];\r\n // istanbul ignore if\r\n if (!unit)\r\n continue;\r\n\r\n const currentUnitSystem = await unit.unitSystem;\r\n if (currentUnitSystem && currentUnitSystem.name.toUpperCase() === system)\r\n return format;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction formatToFormatProps(format: ECFormat | OverrideFormat): FormatProps {\r\n // istanbul ignore if\r\n if (OverrideFormat.isOverrideFormat(format)) {\r\n const baseFormat = baseFormatToFormatProps(format.parent);\r\n return {\r\n ...baseFormat,\r\n composite: format.units\r\n ? {\r\n ...baseFormat.composite,\r\n units: format.units.map(([unit, _]) => ({ name: unit.fullName, label: unit.label })),\r\n spacer: format.spacer,\r\n includeZero: format.includeZero,\r\n }\r\n : baseFormat.composite,\r\n };\r\n }\r\n return baseFormatToFormatProps(format);\r\n}\r\n\r\nfunction baseFormatToFormatProps(format: ECFormat): FormatProps {\r\n const json = format.toJSON();\r\n return {\r\n ...json,\r\n composite: json.composite\r\n ? {\r\n ...json.composite,\r\n spacer: format.spacer,\r\n includeZero: format.includeZero,\r\n }\r\n : /* istanbul ignore next */ undefined,\r\n };\r\n}\r\n\r\nfunction getPersistenceUnitFormatProps(persistenceUnit: Unit | InvertedUnit): FormatProps {\r\n // Same as Format \"DefaultRealU\" in Formats ecschema\r\n return {\r\n formatTraits: [\"keepSingleZero\", \"keepDecimalPoint\", \"showUnitLabel\"],\r\n precision: 6,\r\n type: \"Decimal\",\r\n uomSeparator: \" \",\r\n decimalSeparator: \".\",\r\n composite: {\r\n units: [{\r\n name: persistenceUnit.fullName,\r\n label: persistenceUnit.label,\r\n }],\r\n },\r\n };\r\n}\r\n\r\nfunction getUnitSystemGroupNames(unitSystem: UnitSystemKey) {\r\n switch (unitSystem) {\r\n case \"imperial\":\r\n return [\"IMPERIAL\", \"USCUSTOM\", \"INTERNATIONAL\", \"FINANCE\"];\r\n case \"metric\":\r\n return [\"SI\", \"METRIC\", \"INTERNATIONAL\", \"FINANCE\"];\r\n case \"usCustomary\":\r\n return [\"USCUSTOM\", \"INTERNATIONAL\", \"FINANCE\"];\r\n case \"usSurvey\":\r\n return [\"USSURVEY\", \"USCUSTOM\", \"INTERNATIONAL\", \"FINANCE\"];\r\n }\r\n}\r\n"]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/** @packageDocumentation
|
|
2
2
|
* @module RPC
|
|
3
3
|
*/
|
|
4
|
-
import { IDisposable } from "@itwin/core-bentley";
|
|
5
4
|
import { IModelRpcProps } from "@itwin/core-common";
|
|
6
5
|
import { DescriptorJSON, DescriptorOverrides } from "./content/Descriptor";
|
|
7
6
|
import { ItemJSON } from "./content/Item";
|
|
@@ -31,6 +30,8 @@ export interface RpcRequestsHandlerProps {
|
|
|
31
30
|
* @internal
|
|
32
31
|
*/
|
|
33
32
|
clientId?: string;
|
|
33
|
+
/** @internal */
|
|
34
|
+
timeout?: number;
|
|
34
35
|
}
|
|
35
36
|
/**
|
|
36
37
|
* RPC requests handler that wraps [[PresentationRpcInterface]] and
|
|
@@ -39,22 +40,20 @@ export interface RpcRequestsHandlerProps {
|
|
|
39
40
|
*
|
|
40
41
|
* @internal
|
|
41
42
|
*/
|
|
42
|
-
export declare class RpcRequestsHandler
|
|
43
|
-
|
|
43
|
+
export declare class RpcRequestsHandler {
|
|
44
|
+
/** Timeout for how long the handler going to wait for RPC request to be fulfilled before throwing a timeout error. */
|
|
45
|
+
readonly timeout: number;
|
|
44
46
|
/** ID that identifies this handler as a client */
|
|
45
47
|
readonly clientId: string;
|
|
46
48
|
constructor(props?: RpcRequestsHandlerProps);
|
|
47
|
-
dispose(): void;
|
|
48
49
|
private get rpcClient();
|
|
49
|
-
private
|
|
50
|
+
private requestWithTimeout;
|
|
50
51
|
/**
|
|
51
52
|
* Send the request to backend.
|
|
52
53
|
*
|
|
53
|
-
* If the backend responds with [[PresentationStatus.BackendTimeout]]
|
|
54
|
-
* the
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
* @internal
|
|
54
|
+
* If the backend responds with [[PresentationStatus.BackendTimeout]], the request is repeated until we hit `timeout` or get
|
|
55
|
+
* a response. If the response is other than [[PresentationStatus.BackendTimeout]] or [[PresentationStatus.Success]], a [[PresentationError]]
|
|
56
|
+
* is thrown with the details from the response.
|
|
58
57
|
*/
|
|
59
58
|
request<TResult, TOptions extends (RequestOptions<IModelRpcProps> & ClientDiagnosticsAttribute), TArg = any>(func: (token: IModelRpcProps, options: PresentationRpcRequestOptions<TOptions>, ...args: TArg[]) => PresentationRpcResponse<TResult>, options: TOptions, ...additionalOptions: TArg[]): Promise<TResult>;
|
|
60
59
|
getNodesCount(options: HierarchyRequestOptions<IModelRpcProps, NodeKey, RulesetVariableJSON> & ClientDiagnosticsAttribute): Promise<number>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RpcRequestsHandler.d.ts","sourceRoot":"","sources":["../../../src/presentation-common/RpcRequestsHandler.ts"],"names":[],"mappings":"AAIA;;GAEG;
|
|
1
|
+
{"version":3,"file":"RpcRequestsHandler.d.ts","sourceRoot":"","sources":["../../../src/presentation-common/RpcRequestsHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,11 @@ const core_common_1 = require("@itwin/core-common");
|
|
|
13
13
|
const CommonLoggerCategory_1 = require("./CommonLoggerCategory");
|
|
14
14
|
const Error_1 = require("./Error");
|
|
15
15
|
const PresentationRpcInterface_1 = require("./PresentationRpcInterface");
|
|
16
|
+
/**
|
|
17
|
+
* Default timeout for how long we're going to wait for RPC request to be fulfilled before throwing
|
|
18
|
+
* a timeout error.
|
|
19
|
+
*/
|
|
20
|
+
const DEFAULT_REQUEST_TIMEOUT = 10 * 60 * 1000; // 10 minutes
|
|
16
21
|
/**
|
|
17
22
|
* RPC requests handler that wraps [[PresentationRpcInterface]] and
|
|
18
23
|
* adds handling for cases when backend needs to be synced with client
|
|
@@ -22,63 +27,53 @@ const PresentationRpcInterface_1 = require("./PresentationRpcInterface");
|
|
|
22
27
|
*/
|
|
23
28
|
class RpcRequestsHandler {
|
|
24
29
|
constructor(props) {
|
|
25
|
-
this.
|
|
26
|
-
this.
|
|
27
|
-
}
|
|
28
|
-
dispose() {
|
|
30
|
+
this.clientId = props?.clientId ?? core_bentley_1.Guid.createValue();
|
|
31
|
+
this.timeout = props?.timeout ?? DEFAULT_REQUEST_TIMEOUT;
|
|
29
32
|
}
|
|
30
33
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
31
34
|
get rpcClient() { return core_common_1.RpcManager.getClientForInterface(PresentationRpcInterface_1.PresentationRpcInterface); }
|
|
32
|
-
async
|
|
35
|
+
async requestWithTimeout(func, diagnosticsHandler) {
|
|
36
|
+
const start = core_bentley_1.BeTimePoint.now();
|
|
37
|
+
const timeout = core_bentley_1.BeDuration.fromMilliseconds(this.timeout);
|
|
33
38
|
let diagnostics;
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
error = e;
|
|
48
|
-
if (repeatCount < this.maxRequestRepeatCount)
|
|
49
|
-
shouldRepeat = true;
|
|
39
|
+
while (start.plus(timeout).isInFuture) {
|
|
40
|
+
try {
|
|
41
|
+
const response = await func();
|
|
42
|
+
diagnostics = response.diagnostics;
|
|
43
|
+
switch (response.statusCode) {
|
|
44
|
+
case Error_1.PresentationStatus.Success: return response.result;
|
|
45
|
+
case Error_1.PresentationStatus.BackendTimeout: break;
|
|
46
|
+
default: throw new Error_1.PresentationError(response.statusCode, response.errorMessage);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
diagnosticsHandler && diagnostics && diagnosticsHandler(diagnostics);
|
|
51
|
+
}
|
|
50
52
|
}
|
|
51
|
-
|
|
52
|
-
diagnosticsHandler && diagnostics && diagnosticsHandler(diagnostics);
|
|
53
|
-
}
|
|
54
|
-
if (shouldRepeat) {
|
|
55
|
-
++repeatCount;
|
|
56
|
-
return this.requestRepeatedly(func, diagnosticsHandler, repeatCount);
|
|
57
|
-
}
|
|
58
|
-
throw error;
|
|
53
|
+
throw new Error_1.PresentationError(Error_1.PresentationStatus.BackendTimeout);
|
|
59
54
|
}
|
|
60
55
|
/**
|
|
61
56
|
* Send the request to backend.
|
|
62
57
|
*
|
|
63
|
-
* If the backend responds with [[PresentationStatus.BackendTimeout]]
|
|
64
|
-
* the
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
* @internal
|
|
58
|
+
* If the backend responds with [[PresentationStatus.BackendTimeout]], the request is repeated until we hit `timeout` or get
|
|
59
|
+
* a response. If the response is other than [[PresentationStatus.BackendTimeout]] or [[PresentationStatus.Success]], a [[PresentationError]]
|
|
60
|
+
* is thrown with the details from the response.
|
|
68
61
|
*/
|
|
69
62
|
async request(func, options, ...additionalOptions) {
|
|
70
63
|
const { imodel, diagnostics, ...optionsNoIModel } = options;
|
|
71
|
-
const { handler: diagnosticsHandler, ...diagnosticsOptions } = diagnostics
|
|
72
|
-
if (isOptionsWithRuleset(optionsNoIModel))
|
|
64
|
+
const { handler: diagnosticsHandler, ...diagnosticsOptions } = diagnostics ?? {};
|
|
65
|
+
if (isOptionsWithRuleset(optionsNoIModel)) {
|
|
73
66
|
optionsNoIModel.rulesetOrId = cleanupRuleset(optionsNoIModel.rulesetOrId);
|
|
67
|
+
}
|
|
74
68
|
const rpcOptions = {
|
|
75
69
|
...optionsNoIModel,
|
|
76
70
|
clientId: this.clientId,
|
|
77
71
|
};
|
|
78
|
-
if (diagnostics)
|
|
72
|
+
if (diagnostics) {
|
|
79
73
|
rpcOptions.diagnostics = diagnosticsOptions;
|
|
74
|
+
}
|
|
80
75
|
const doRequest = async () => func(imodel, rpcOptions, ...additionalOptions);
|
|
81
|
-
return this.
|
|
76
|
+
return this.requestWithTimeout(doRequest, diagnosticsHandler);
|
|
82
77
|
}
|
|
83
78
|
async getNodesCount(options) {
|
|
84
79
|
return this.request(this.rpcClient.getNodesCount.bind(this.rpcClient), options);
|