@itwin/presentation-frontend 3.4.0-dev.9 → 3.5.0-dev.5

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 (30) hide show
  1. package/CHANGELOG.md +23 -1
  2. package/lib/cjs/presentation-frontend/Diagnostics.d.ts +4 -2
  3. package/lib/cjs/presentation-frontend/Diagnostics.d.ts.map +1 -1
  4. package/lib/cjs/presentation-frontend/Diagnostics.js +4 -2
  5. package/lib/cjs/presentation-frontend/Diagnostics.js.map +1 -1
  6. package/lib/cjs/presentation-frontend/LocalizationHelper.d.ts +6 -10
  7. package/lib/cjs/presentation-frontend/LocalizationHelper.d.ts.map +1 -1
  8. package/lib/cjs/presentation-frontend/LocalizationHelper.js +13 -39
  9. package/lib/cjs/presentation-frontend/LocalizationHelper.js.map +1 -1
  10. package/lib/cjs/presentation-frontend/Presentation.js +2 -2
  11. package/lib/cjs/presentation-frontend/Presentation.js.map +1 -1
  12. package/lib/cjs/presentation-frontend/PresentationManager.d.ts +3 -2
  13. package/lib/cjs/presentation-frontend/PresentationManager.d.ts.map +1 -1
  14. package/lib/cjs/presentation-frontend/PresentationManager.js +9 -3
  15. package/lib/cjs/presentation-frontend/PresentationManager.js.map +1 -1
  16. package/lib/esm/presentation-frontend/Diagnostics.d.ts +4 -2
  17. package/lib/esm/presentation-frontend/Diagnostics.d.ts.map +1 -1
  18. package/lib/esm/presentation-frontend/Diagnostics.js +4 -2
  19. package/lib/esm/presentation-frontend/Diagnostics.js.map +1 -1
  20. package/lib/esm/presentation-frontend/LocalizationHelper.d.ts +6 -10
  21. package/lib/esm/presentation-frontend/LocalizationHelper.d.ts.map +1 -1
  22. package/lib/esm/presentation-frontend/LocalizationHelper.js +12 -38
  23. package/lib/esm/presentation-frontend/LocalizationHelper.js.map +1 -1
  24. package/lib/esm/presentation-frontend/Presentation.js +3 -3
  25. package/lib/esm/presentation-frontend/Presentation.js.map +1 -1
  26. package/lib/esm/presentation-frontend/PresentationManager.d.ts +3 -2
  27. package/lib/esm/presentation-frontend/PresentationManager.d.ts.map +1 -1
  28. package/lib/esm/presentation-frontend/PresentationManager.js +10 -4
  29. package/lib/esm/presentation-frontend/PresentationManager.js.map +1 -1
  30. package/package.json +15 -15
@@ -1 +1 @@
1
- {"version":3,"file":"Diagnostics.d.ts","sourceRoot":"","sources":["../../../src/presentation-frontend/Diagnostics.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EACL,iBAAiB,EAAE,wBAAwB,EAC5C,MAAM,4BAA4B,CAAC;AAEpC;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,iBAAiB,QAWvE;AAED;;GAEG;AACH,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,wBAAwB,EAAE,iBAC9D,iBAAiB,UAGvC"}
1
+ {"version":3,"file":"Diagnostics.d.ts","sourceRoot":"","sources":["../../../src/presentation-frontend/Diagnostics.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EACL,iBAAiB,EAAE,wBAAwB,EAC5C,MAAM,4BAA4B,CAAC;AAEpC;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,iBAAiB,QAWvE;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,wBAAwB,EAAE,iBAC9D,iBAAiB,UAGvC"}
@@ -7,7 +7,8 @@
7
7
  */
8
8
  import { DiagnosticsLogEntry, } from "@itwin/presentation-common";
9
9
  /**
10
- * @alpha
10
+ * A function which logs messages to the console.
11
+ * @beta
11
12
  */
12
13
  export function consoleDiagnosticsHandler(diagnostics) {
13
14
  // eslint-disable-next-line no-console
@@ -22,7 +23,8 @@ export function consoleDiagnosticsHandler(diagnostics) {
22
23
  });
23
24
  }
24
25
  /**
25
- * @alpha
26
+ * A function which calls all diagnostics handlers passed to it.
27
+ * @beta
26
28
  */
27
29
  export function createCombinedDiagnosticsHandler(handlers) {
28
30
  return (diagnostics) => {
@@ -1 +1 @@
1
- {"version":3,"file":"Diagnostics.js","sourceRoot":"","sources":["../../../src/presentation-frontend/Diagnostics.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EACwC,mBAAmB,GACjE,MAAM,4BAA4B,CAAC;AAEpC;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,WAA8B;IACtE,sCAAsC;IACtC,WAAW,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC;IAC5F,WAAW,CAAC,IAAI,IAAI,oBAAoB,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,GAA0B,EAAE,KAA6B,EAAE,EAAE;QACvH,+FAA+F;QAC/F,MAAM,GAAG,GAAG,qBAAqB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9C,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM;YACrB,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG;YAClB,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gCAAgC,CAAC,QAAoC;IACnF,OAAO,CAAC,WAA8B,EAAE,EAAE;QACxC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC;AACJ,CAAC;AAID,SAAS,oBAAoB,CAAC,IAA2B,EAAE,cAA4C,EAAE,QAAgC,EAAE;IACzI,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACnB,IAAI,mBAAmB,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;YACtC,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;SAC5B;aAAM,IAAI,GAAG,CAAC,IAAI,EAAE;YACnB,oBAAoB,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;SACjE;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAAC,GAA0B,EAAE,MAA8B;IACvF,OAAO,GAAG,CAAC,OAAO,CAAC;AACrB,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAmC;IAC5D,QAAQ,QAAQ,EAAE;QAChB,KAAK,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,iCAAiC;QACrE,KAAK,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,iCAAiC;QACtE,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,OAAO;YACV,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,iCAAiC;KACxD;AACH,CAAC","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 {\r\n ClientDiagnostics, ClientDiagnosticsHandler, DiagnosticsLogEntry, DiagnosticsLoggerSeverity, DiagnosticsLogMessage, DiagnosticsScopeLogs,\r\n} from \"@itwin/presentation-common\";\r\n\r\n/**\r\n * @alpha\r\n */\r\nexport function consoleDiagnosticsHandler(diagnostics: ClientDiagnostics) {\r\n // eslint-disable-next-line no-console\r\n diagnostics.backendVersion && console.log(`Backend version: ${diagnostics.backendVersion}`);\r\n diagnostics.logs && handleDiagnosticLogs(diagnostics.logs, (msg: DiagnosticsLogMessage, stack: DiagnosticsScopeLogs[]) => {\r\n /* note: we're duplicating the message if it's logged at both editor and dev severity levels */\r\n const str = buildLogMessageString(msg, stack);\r\n if (msg.severity.editor)\r\n getConsoleLogFunc(msg.severity.editor)(str);\r\n if (msg.severity.dev)\r\n getConsoleLogFunc(msg.severity.dev)(str);\r\n });\r\n}\r\n\r\n/**\r\n * @alpha\r\n */\r\nexport function createCombinedDiagnosticsHandler(handlers: ClientDiagnosticsHandler[]) {\r\n return (diagnostics: ClientDiagnostics) => {\r\n handlers.forEach((handler) => handler(diagnostics));\r\n };\r\n}\r\n\r\ntype DiagnosticsLogMessageHandler = (msg: DiagnosticsLogMessage, stack: DiagnosticsScopeLogs[]) => void;\r\n\r\nfunction handleDiagnosticLogs(logs: DiagnosticsLogEntry[], messageHandler: DiagnosticsLogMessageHandler, stack: DiagnosticsScopeLogs[] = []) {\r\n logs.forEach((log) => {\r\n if (DiagnosticsLogEntry.isMessage(log)) {\r\n messageHandler(log, stack);\r\n } else if (log.logs) {\r\n handleDiagnosticLogs(log.logs, messageHandler, [...stack, log]);\r\n }\r\n });\r\n}\r\n\r\nfunction buildLogMessageString(msg: DiagnosticsLogMessage, _stack: DiagnosticsScopeLogs[]) {\r\n return msg.message;\r\n}\r\n\r\nfunction getConsoleLogFunc(severity: DiagnosticsLoggerSeverity) {\r\n switch (severity) {\r\n case \"error\": return console.error; // eslint-disable-line no-console\r\n case \"warning\": return console.warn; // eslint-disable-line no-console\r\n case \"info\":\r\n case \"debug\":\r\n case \"trace\":\r\n return console.log; // eslint-disable-line no-console\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"Diagnostics.js","sourceRoot":"","sources":["../../../src/presentation-frontend/Diagnostics.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EACwC,mBAAmB,GACjE,MAAM,4BAA4B,CAAC;AAEpC;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,WAA8B;IACtE,sCAAsC;IACtC,WAAW,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC;IAC5F,WAAW,CAAC,IAAI,IAAI,oBAAoB,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,GAA0B,EAAE,KAA6B,EAAE,EAAE;QACvH,+FAA+F;QAC/F,MAAM,GAAG,GAAG,qBAAqB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9C,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM;YACrB,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG;YAClB,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gCAAgC,CAAC,QAAoC;IACnF,OAAO,CAAC,WAA8B,EAAE,EAAE;QACxC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC;AACJ,CAAC;AAID,SAAS,oBAAoB,CAAC,IAA2B,EAAE,cAA4C,EAAE,QAAgC,EAAE;IACzI,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACnB,IAAI,mBAAmB,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;YACtC,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;SAC5B;aAAM,IAAI,GAAG,CAAC,IAAI,EAAE;YACnB,oBAAoB,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;SACjE;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAAC,GAA0B,EAAE,MAA8B;IACvF,OAAO,GAAG,CAAC,OAAO,CAAC;AACrB,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAmC;IAC5D,QAAQ,QAAQ,EAAE;QAChB,KAAK,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,iCAAiC;QACrE,KAAK,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,iCAAiC;QACtE,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,OAAO;YACV,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,iCAAiC;KACxD;AACH,CAAC","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 {\r\n ClientDiagnostics, ClientDiagnosticsHandler, DiagnosticsLogEntry, DiagnosticsLoggerSeverity, DiagnosticsLogMessage, DiagnosticsScopeLogs,\r\n} from \"@itwin/presentation-common\";\r\n\r\n/**\r\n * A function which logs messages to the console.\r\n * @beta\r\n */\r\nexport function consoleDiagnosticsHandler(diagnostics: ClientDiagnostics) {\r\n // eslint-disable-next-line no-console\r\n diagnostics.backendVersion && console.log(`Backend version: ${diagnostics.backendVersion}`);\r\n diagnostics.logs && handleDiagnosticLogs(diagnostics.logs, (msg: DiagnosticsLogMessage, stack: DiagnosticsScopeLogs[]) => {\r\n /* note: we're duplicating the message if it's logged at both editor and dev severity levels */\r\n const str = buildLogMessageString(msg, stack);\r\n if (msg.severity.editor)\r\n getConsoleLogFunc(msg.severity.editor)(str);\r\n if (msg.severity.dev)\r\n getConsoleLogFunc(msg.severity.dev)(str);\r\n });\r\n}\r\n\r\n/**\r\n * A function which calls all diagnostics handlers passed to it.\r\n * @beta\r\n */\r\nexport function createCombinedDiagnosticsHandler(handlers: ClientDiagnosticsHandler[]) {\r\n return (diagnostics: ClientDiagnostics) => {\r\n handlers.forEach((handler) => handler(diagnostics));\r\n };\r\n}\r\n\r\ntype DiagnosticsLogMessageHandler = (msg: DiagnosticsLogMessage, stack: DiagnosticsScopeLogs[]) => void;\r\n\r\nfunction handleDiagnosticLogs(logs: DiagnosticsLogEntry[], messageHandler: DiagnosticsLogMessageHandler, stack: DiagnosticsScopeLogs[] = []) {\r\n logs.forEach((log) => {\r\n if (DiagnosticsLogEntry.isMessage(log)) {\r\n messageHandler(log, stack);\r\n } else if (log.logs) {\r\n handleDiagnosticLogs(log.logs, messageHandler, [...stack, log]);\r\n }\r\n });\r\n}\r\n\r\nfunction buildLogMessageString(msg: DiagnosticsLogMessage, _stack: DiagnosticsScopeLogs[]) {\r\n return msg.message;\r\n}\r\n\r\nfunction getConsoleLogFunc(severity: DiagnosticsLoggerSeverity) {\r\n switch (severity) {\r\n case \"error\": return console.error; // eslint-disable-line no-console\r\n case \"warning\": return console.warn; // eslint-disable-line no-console\r\n case \"info\":\r\n case \"debug\":\r\n case \"trace\":\r\n return console.log; // eslint-disable-line no-console\r\n }\r\n}\r\n"]}
@@ -1,15 +1,11 @@
1
- import { Content, LabelDefinition, Node } from "@itwin/presentation-common";
1
+ import { LocalizationHelper } from "@itwin/presentation-common";
2
2
  /** @internal */
3
- export declare class LocalizationHelper {
3
+ export declare class FrontendLocalizationHelper extends LocalizationHelper {
4
+ private _lang;
5
+ constructor(lang?: string);
6
+ get locale(): string | undefined;
7
+ set locale(locale: string | undefined);
4
8
  static registerNamespaces(): Promise<void>;
5
9
  static unregisterNamespaces(): void;
6
- getLocalizedString(text: string): string;
7
- getLocalizedNodes(nodes: Node[]): Node[];
8
- getLocalizedLabelDefinition(labelDefinition: LabelDefinition): LabelDefinition;
9
- getLocalizedLabelDefinitions(labelDefinitions: LabelDefinition[]): LabelDefinition[];
10
- getLocalizedContent(content: Content): Content;
11
- private translateContentItem;
12
- private translateNode;
13
- private translateLabelDefinition;
14
10
  }
15
11
  //# sourceMappingURL=LocalizationHelper.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LocalizationHelper.d.ts","sourceRoot":"","sources":["../../../src/presentation-frontend/LocalizationHelper.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAA6B,eAAe,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAOvG,gBAAgB;AAChB,qBAAa,kBAAkB;WACT,kBAAkB;WAKxB,oBAAoB;IAI3B,kBAAkB,CAAC,IAAI,EAAE,MAAM;IAI/B,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE;IAMxC,2BAA2B,CAAC,eAAe,EAAE,eAAe,GAAG,eAAe;IAK9E,4BAA4B,CAAC,gBAAgB,EAAE,eAAe,EAAE;IAKhE,mBAAmB,CAAC,OAAO,EAAE,OAAO;IAK3C,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,wBAAwB;CAWjC"}
1
+ {"version":3,"file":"LocalizationHelper.d.ts","sourceRoot":"","sources":["../../../src/presentation-frontend/LocalizationHelper.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAKhE,gBAAgB;AAChB,qBAAa,0BAA2B,SAAQ,kBAAkB;IAChE,OAAO,CAAC,KAAK,CAAqB;gBACtB,IAAI,CAAC,EAAE,MAAM;IAKzB,IAAW,MAAM,IAGS,MAAM,GAAG,SAAS,CAD3C;IACD,IAAW,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAE3C;WAEmB,kBAAkB;WAKxB,oBAAoB;CAGnC"}
@@ -2,12 +2,21 @@
2
2
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
- import { LabelDefinition } from "@itwin/presentation-common";
5
+ import { LocalizationHelper } from "@itwin/presentation-common";
6
6
  import { Presentation } from "./Presentation";
7
7
  const NAMESPACES = ["BisCore", "ECPresentation", "RulesEngine"];
8
- const KEY_PATTERN = /@[\w\d\-_]+:[\w\d\-\._]+?@/g;
9
8
  /** @internal */
10
- export class LocalizationHelper {
9
+ export class FrontendLocalizationHelper extends LocalizationHelper {
10
+ constructor(lang) {
11
+ super({ getLocalizedString: (key) => Presentation.localization.getLocalizedString(key, { defaultValue: key, lng: this._lang }) });
12
+ this._lang = lang;
13
+ }
14
+ get locale() {
15
+ return this._lang;
16
+ }
17
+ set locale(locale) {
18
+ this._lang = locale;
19
+ }
11
20
  static async registerNamespaces() {
12
21
  const localizationPromises = NAMESPACES.map(async (namespace) => Presentation.localization.registerNamespace(namespace));
13
22
  await Promise.all(localizationPromises);
@@ -15,40 +24,5 @@ export class LocalizationHelper {
15
24
  static unregisterNamespaces() {
16
25
  NAMESPACES.map((namespace) => Presentation.localization.unregisterNamespace(namespace));
17
26
  }
18
- getLocalizedString(text) {
19
- return text.replace(KEY_PATTERN, (key) => Presentation.localization.getLocalizedString(key.replace(/^@|@$/g, ""), { defaultValue: key }));
20
- }
21
- getLocalizedNodes(nodes) {
22
- for (const node of nodes)
23
- this.translateNode(node);
24
- return nodes;
25
- }
26
- getLocalizedLabelDefinition(labelDefinition) {
27
- this.translateLabelDefinition(labelDefinition);
28
- return labelDefinition;
29
- }
30
- getLocalizedLabelDefinitions(labelDefinitions) {
31
- labelDefinitions.forEach((labelDefinition) => this.translateLabelDefinition(labelDefinition));
32
- return labelDefinitions;
33
- }
34
- getLocalizedContent(content) {
35
- content.contentSet.forEach((item) => this.translateContentItem(item));
36
- return content;
37
- }
38
- translateContentItem(item) {
39
- this.translateLabelDefinition(item.label);
40
- }
41
- translateNode(node) {
42
- this.translateLabelDefinition(node.label);
43
- }
44
- translateLabelDefinition(labelDefinition) {
45
- const translateComposite = (compositeValue) => {
46
- compositeValue.values.map((value) => this.translateLabelDefinition(value));
47
- };
48
- if (labelDefinition.typeName === LabelDefinition.COMPOSITE_DEFINITION_TYPENAME)
49
- translateComposite(labelDefinition.rawValue);
50
- else if (labelDefinition.typeName === "string")
51
- labelDefinition.rawValue = this.getLocalizedString(labelDefinition.rawValue);
52
- }
53
27
  }
54
28
  //# sourceMappingURL=LocalizationHelper.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LocalizationHelper.js","sourceRoot":"","sources":["../../../src/presentation-frontend/LocalizationHelper.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,EAAsC,eAAe,EAAQ,MAAM,4BAA4B,CAAC;AACvG,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,UAAU,GAAG,CAAC,SAAS,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC;AAEhE,MAAM,WAAW,GAAG,6BAA6B,CAAC;AAElD,gBAAgB;AAChB,MAAM,OAAO,kBAAkB;IACtB,MAAM,CAAC,KAAK,CAAC,kBAAkB;QACpC,MAAM,oBAAoB,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC;QACzH,MAAM,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAC1C,CAAC;IAEM,MAAM,CAAC,oBAAoB;QAChC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1F,CAAC;IAEM,kBAAkB,CAAC,IAAY;QACpC,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAC5I,CAAC;IAEM,iBAAiB,CAAC,KAAa;QACpC,KAAK,MAAM,IAAI,IAAI,KAAK;YACtB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,2BAA2B,CAAC,eAAgC;QACjE,IAAI,CAAC,wBAAwB,CAAC,eAAe,CAAC,CAAC;QAC/C,OAAO,eAAe,CAAC;IACzB,CAAC;IAEM,4BAA4B,CAAC,gBAAmC;QACrE,gBAAgB,CAAC,OAAO,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,eAAe,CAAC,CAAC,CAAC;QAC9F,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAEM,mBAAmB,CAAC,OAAgB;QACzC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;QACtE,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,oBAAoB,CAAC,IAAU;QACrC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAEO,aAAa,CAAC,IAAU;QAC9B,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAEO,wBAAwB,CAAC,eAAgC;QAC/D,MAAM,kBAAkB,GAAG,CAAC,cAAmC,EAAE,EAAE;YACjE,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7E,CAAC,CAAC;QAEF,IAAI,eAAe,CAAC,QAAQ,KAAK,eAAe,CAAC,6BAA6B;YAC5E,kBAAkB,CAAC,eAAe,CAAC,QAA+B,CAAC,CAAC;aACjE,IAAI,eAAe,CAAC,QAAQ,KAAK,QAAQ;YAC5C,eAAe,CAAC,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,QAAkB,CAAC,CAAC;IAC3F,CAAC;CAEF","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\nimport { Content, Item, LabelCompositeValue, LabelDefinition, Node } from \"@itwin/presentation-common\";\r\nimport { Presentation } from \"./Presentation\";\r\n\r\nconst NAMESPACES = [\"BisCore\", \"ECPresentation\", \"RulesEngine\"];\r\n\r\nconst KEY_PATTERN = /@[\\w\\d\\-_]+:[\\w\\d\\-\\._]+?@/g;\r\n\r\n/** @internal */\r\nexport class LocalizationHelper {\r\n public static async registerNamespaces() {\r\n const localizationPromises = NAMESPACES.map(async (namespace) => Presentation.localization.registerNamespace(namespace));\r\n await Promise.all(localizationPromises);\r\n }\r\n\r\n public static unregisterNamespaces() {\r\n NAMESPACES.map((namespace) => Presentation.localization.unregisterNamespace(namespace));\r\n }\r\n\r\n public getLocalizedString(text: string) {\r\n return text.replace(KEY_PATTERN, (key) => Presentation.localization.getLocalizedString(key.replace(/^@|@$/g, \"\"), { defaultValue: key }));\r\n }\r\n\r\n public getLocalizedNodes(nodes: Node[]): Node[] {\r\n for (const node of nodes)\r\n this.translateNode(node);\r\n return nodes;\r\n }\r\n\r\n public getLocalizedLabelDefinition(labelDefinition: LabelDefinition): LabelDefinition {\r\n this.translateLabelDefinition(labelDefinition);\r\n return labelDefinition;\r\n }\r\n\r\n public getLocalizedLabelDefinitions(labelDefinitions: LabelDefinition[]) {\r\n labelDefinitions.forEach((labelDefinition) => this.translateLabelDefinition(labelDefinition));\r\n return labelDefinitions;\r\n }\r\n\r\n public getLocalizedContent(content: Content) {\r\n content.contentSet.forEach((item) => this.translateContentItem(item));\r\n return content;\r\n }\r\n\r\n private translateContentItem(item: Item) {\r\n this.translateLabelDefinition(item.label);\r\n }\r\n\r\n private translateNode(node: Node) {\r\n this.translateLabelDefinition(node.label);\r\n }\r\n\r\n private translateLabelDefinition(labelDefinition: LabelDefinition) {\r\n const translateComposite = (compositeValue: LabelCompositeValue) => {\r\n compositeValue.values.map((value) => this.translateLabelDefinition(value));\r\n };\r\n\r\n if (labelDefinition.typeName === LabelDefinition.COMPOSITE_DEFINITION_TYPENAME)\r\n translateComposite(labelDefinition.rawValue as LabelCompositeValue);\r\n else if (labelDefinition.typeName === \"string\")\r\n labelDefinition.rawValue = this.getLocalizedString(labelDefinition.rawValue as string);\r\n }\r\n\r\n}\r\n"]}
1
+ {"version":3,"file":"LocalizationHelper.js","sourceRoot":"","sources":["../../../src/presentation-frontend/LocalizationHelper.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,UAAU,GAAG,CAAC,SAAS,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC;AAEhE,gBAAgB;AAChB,MAAM,OAAO,0BAA2B,SAAQ,kBAAkB;IAEhE,YAAY,IAAa;QACvB,KAAK,CAAC,EAAE,kBAAkB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,kBAAkB,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAClI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IACD,IAAW,MAAM,CAAC,MAA0B;QAC1C,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;IACtB,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,kBAAkB;QACpC,MAAM,oBAAoB,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC;QACzH,MAAM,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAC1C,CAAC;IAEM,MAAM,CAAC,oBAAoB;QAChC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1F,CAAC;CACF","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\nimport { LocalizationHelper } from \"@itwin/presentation-common\";\r\nimport { Presentation } from \"./Presentation\";\r\n\r\nconst NAMESPACES = [\"BisCore\", \"ECPresentation\", \"RulesEngine\"];\r\n\r\n/** @internal */\r\nexport class FrontendLocalizationHelper extends LocalizationHelper {\r\n private _lang: string | undefined;\r\n constructor(lang?: string) {\r\n super({ getLocalizedString: (key) => Presentation.localization.getLocalizedString(key, { defaultValue: key, lng: this._lang }) });\r\n this._lang = lang;\r\n }\r\n\r\n public get locale() {\r\n return this._lang;\r\n }\r\n public set locale(locale: string | undefined) {\r\n this._lang = locale;\r\n }\r\n\r\n public static async registerNamespaces() {\r\n const localizationPromises = NAMESPACES.map(async (namespace) => Presentation.localization.registerNamespace(namespace));\r\n await Promise.all(localizationPromises);\r\n }\r\n\r\n public static unregisterNamespaces() {\r\n NAMESPACES.map((namespace) => Presentation.localization.unregisterNamespace(namespace));\r\n }\r\n}\r\n"]}
@@ -9,7 +9,7 @@ import { IModelApp } from "@itwin/core-frontend";
9
9
  import { PresentationError, PresentationStatus } from "@itwin/presentation-common";
10
10
  import { FavoritePropertiesManager } from "./favorite-properties/FavoritePropertiesManager";
11
11
  import { createFavoritePropertiesStorage, DefaultFavoritePropertiesStorageTypes } from "./favorite-properties/FavoritePropertiesStorage";
12
- import { LocalizationHelper } from "./LocalizationHelper";
12
+ import { FrontendLocalizationHelper } from "./LocalizationHelper";
13
13
  import { PresentationManager } from "./PresentationManager";
14
14
  import { SelectionManager } from "./selection/SelectionManager";
15
15
  import { SelectionScopesManager } from "./selection/SelectionScopesManager";
@@ -72,7 +72,7 @@ export class Presentation {
72
72
  }
73
73
  // eslint-disable-next-line @typescript-eslint/unbound-method
74
74
  presentationManager.onNewiModelConnection = favoritePropertiesManager.initializeConnection.bind(favoritePropertiesManager);
75
- await LocalizationHelper.registerNamespaces();
75
+ await FrontendLocalizationHelper.registerNamespaces();
76
76
  for (const handler of initializationHandlers) {
77
77
  const cleanup = await handler();
78
78
  if (cleanup)
@@ -87,7 +87,7 @@ export class Presentation {
87
87
  terminationHandlers.forEach((handler) => handler());
88
88
  terminationHandlers.length = 0;
89
89
  if (localization)
90
- LocalizationHelper.unregisterNamespaces();
90
+ FrontendLocalizationHelper.unregisterNamespaces();
91
91
  if (presentationManager)
92
92
  presentationManager.dispose();
93
93
  presentationManager = undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"Presentation.js","sourceRoot":"","sources":["../../../src/presentation-frontend/Presentation.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 { IModelApp } from \"@itwin/core-frontend\";\r\nimport { Localization } from \"@itwin/core-common\";\r\nimport { PresentationError, PresentationStatus } from \"@itwin/presentation-common\";\r\nimport { FavoritePropertiesManager, FavoritePropertiesManagerProps } from \"./favorite-properties/FavoritePropertiesManager\";\r\nimport { createFavoritePropertiesStorage, DefaultFavoritePropertiesStorageTypes } from \"./favorite-properties/FavoritePropertiesStorage\";\r\nimport { LocalizationHelper } from \"./LocalizationHelper\";\r\nimport { PresentationManager, PresentationManagerProps } from \"./PresentationManager\";\r\nimport { SelectionManager, SelectionManagerProps } from \"./selection/SelectionManager\";\r\nimport { SelectionScopesManager } from \"./selection/SelectionScopesManager\";\r\n\r\nlet localization: Localization | undefined;\r\nlet presentationManager: PresentationManager | undefined;\r\nlet selectionManager: SelectionManager | undefined;\r\nlet favoritePropertiesManager: FavoritePropertiesManager | undefined;\r\nconst initializationHandlers: Array<() => Promise<(() => void) | void>> = [];\r\nconst terminationHandlers: Array<() => void> = [];\r\n\r\n/**\r\n * Props for initializing [[Presentation]].\r\n * @public\r\n */\r\nexport interface PresentationProps {\r\n /** Props for [[PresentationManager]]. */\r\n presentation?: PresentationManagerProps;\r\n\r\n /** Props for [[SelectionManager]]. */\r\n selection?: SelectionManagerProps;\r\n\r\n /** Props for [[FavoritePropertiesManager]]. */\r\n favorites?: FavoritePropertiesManagerProps;\r\n}\r\n\r\n/**\r\n * Static class used to statically set up Presentation library for the frontend.\r\n * Basically what it does is:\r\n * - Create a singleton [[PresentationManager]] instance\r\n * - Create a singleton [[SelectionManager]] instance\r\n * - Create a singleton [[FavoritePropertiesManager]]] instance\r\n *\r\n * @public\r\n */\r\nexport class Presentation {\r\n\r\n /* istanbul ignore next */\r\n private constructor() { }\r\n\r\n /**\r\n * Initializes Presentation library for the frontend.\r\n *\r\n * Example:\r\n * ``` ts\r\n * [[include:Presentation.Frontend.Initialization]]\r\n * ```\r\n *\r\n * The method should be called after a call to [IModelApp.startup]($core-frontend).\r\n */\r\n public static async initialize(props?: PresentationProps): Promise<void> {\r\n if (!IModelApp.initialized) {\r\n throw new PresentationError(PresentationStatus.NotInitialized,\r\n \"IModelApp.startup must be called before calling Presentation.initialize\");\r\n }\r\n if (!localization) {\r\n localization = IModelApp.localization;\r\n }\r\n if (!presentationManager) {\r\n const managerProps = props?.presentation ?? {};\r\n if (!managerProps.activeLocale) {\r\n const languages = Presentation.localization.getLanguageList();\r\n managerProps.activeLocale = (languages.length ? languages[0] : undefined);\r\n }\r\n presentationManager = PresentationManager.create(managerProps);\r\n }\r\n if (!selectionManager) {\r\n selectionManager = new SelectionManager(props?.selection ?? {\r\n scopes: new SelectionScopesManager({\r\n rpcRequestsHandler: presentationManager.rpcRequestsHandler,\r\n localeProvider: () => this.presentation.activeLocale,\r\n }),\r\n });\r\n }\r\n if (!favoritePropertiesManager) {\r\n favoritePropertiesManager = new FavoritePropertiesManager({\r\n storage: props?.favorites ? props.favorites.storage : createFavoritePropertiesStorage(DefaultFavoritePropertiesStorageTypes.Noop),\r\n });\r\n }\r\n // eslint-disable-next-line @typescript-eslint/unbound-method\r\n presentationManager.onNewiModelConnection = favoritePropertiesManager.initializeConnection.bind(favoritePropertiesManager);\r\n await LocalizationHelper.registerNamespaces();\r\n for (const handler of initializationHandlers) {\r\n const cleanup = await handler();\r\n if (cleanup)\r\n terminationHandlers.push(cleanup);\r\n }\r\n }\r\n\r\n /**\r\n * Terminates Presentation library frontend. This method should be called\r\n * before a call to [IModelApp.shutdown]($core-frontend)\r\n */\r\n public static terminate(): void {\r\n terminationHandlers.forEach((handler) => handler());\r\n terminationHandlers.length = 0;\r\n\r\n if (localization)\r\n LocalizationHelper.unregisterNamespaces();\r\n\r\n if (presentationManager)\r\n presentationManager.dispose();\r\n presentationManager = undefined;\r\n\r\n if (favoritePropertiesManager)\r\n favoritePropertiesManager.dispose();\r\n favoritePropertiesManager = undefined;\r\n\r\n selectionManager = undefined;\r\n localization = undefined;\r\n }\r\n\r\n /**\r\n * Registers an additional handler which will be invoked during Presentation library frontend\r\n * initialization.\r\n *\r\n * @internal\r\n */\r\n public static registerInitializationHandler(handler: () => Promise<() => void>): void {\r\n initializationHandlers.push(handler);\r\n }\r\n\r\n /** The singleton [[PresentationManager]] */\r\n public static get presentation(): PresentationManager {\r\n if (!presentationManager)\r\n throw new Error(\"Presentation must be first initialized by calling Presentation.initialize\");\r\n return presentationManager;\r\n }\r\n\r\n /** @internal */\r\n public static setPresentationManager(value: PresentationManager) {\r\n if (presentationManager)\r\n presentationManager.dispose();\r\n presentationManager = value;\r\n }\r\n\r\n /** The singleton [[SelectionManager]] */\r\n public static get selection(): SelectionManager {\r\n if (!selectionManager)\r\n throw new Error(\"Presentation must be first initialized by calling Presentation.initialize\");\r\n return selectionManager;\r\n }\r\n\r\n /** @internal */\r\n public static setSelectionManager(value: SelectionManager) {\r\n selectionManager = value;\r\n }\r\n\r\n /**\r\n * The singleton [[FavoritePropertiesManager]]\r\n * @public\r\n */\r\n public static get favoriteProperties(): FavoritePropertiesManager {\r\n if (!favoritePropertiesManager)\r\n throw new Error(\"Favorite Properties must be first initialized by calling Presentation.initialize\");\r\n return favoritePropertiesManager;\r\n }\r\n\r\n /** @internal */\r\n public static setFavoritePropertiesManager(value: FavoritePropertiesManager) {\r\n if (favoritePropertiesManager)\r\n favoritePropertiesManager.dispose();\r\n favoritePropertiesManager = value;\r\n }\r\n\r\n /**\r\n * The localization manager used by Presentation frontend. Returns the result of `IModelApp.i18n`.\r\n */\r\n public static get localization(): Localization {\r\n if (!localization)\r\n throw new Error(\"Presentation must be first initialized by calling Presentation.initialize\");\r\n return localization;\r\n }\r\n\r\n /** @internal */\r\n public static setLocalization(value: Localization) {\r\n localization = value;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"Presentation.js","sourceRoot":"","sources":["../../../src/presentation-frontend/Presentation.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 { IModelApp } from \"@itwin/core-frontend\";\r\nimport { Localization } from \"@itwin/core-common\";\r\nimport { PresentationError, PresentationStatus } from \"@itwin/presentation-common\";\r\nimport { FavoritePropertiesManager, FavoritePropertiesManagerProps } from \"./favorite-properties/FavoritePropertiesManager\";\r\nimport { createFavoritePropertiesStorage, DefaultFavoritePropertiesStorageTypes } from \"./favorite-properties/FavoritePropertiesStorage\";\r\nimport { FrontendLocalizationHelper } from \"./LocalizationHelper\";\r\nimport { PresentationManager, PresentationManagerProps } from \"./PresentationManager\";\r\nimport { SelectionManager, SelectionManagerProps } from \"./selection/SelectionManager\";\r\nimport { SelectionScopesManager } from \"./selection/SelectionScopesManager\";\r\n\r\nlet localization: Localization | undefined;\r\nlet presentationManager: PresentationManager | undefined;\r\nlet selectionManager: SelectionManager | undefined;\r\nlet favoritePropertiesManager: FavoritePropertiesManager | undefined;\r\nconst initializationHandlers: Array<() => Promise<(() => void) | void>> = [];\r\nconst terminationHandlers: Array<() => void> = [];\r\n\r\n/**\r\n * Props for initializing [[Presentation]].\r\n * @public\r\n */\r\nexport interface PresentationProps {\r\n /** Props for [[PresentationManager]]. */\r\n presentation?: PresentationManagerProps;\r\n\r\n /** Props for [[SelectionManager]]. */\r\n selection?: SelectionManagerProps;\r\n\r\n /** Props for [[FavoritePropertiesManager]]. */\r\n favorites?: FavoritePropertiesManagerProps;\r\n}\r\n\r\n/**\r\n * Static class used to statically set up Presentation library for the frontend.\r\n * Basically what it does is:\r\n * - Create a singleton [[PresentationManager]] instance\r\n * - Create a singleton [[SelectionManager]] instance\r\n * - Create a singleton [[FavoritePropertiesManager]]] instance\r\n *\r\n * @public\r\n */\r\nexport class Presentation {\r\n\r\n /* istanbul ignore next */\r\n private constructor() { }\r\n\r\n /**\r\n * Initializes Presentation library for the frontend.\r\n *\r\n * Example:\r\n * ``` ts\r\n * [[include:Presentation.Frontend.Initialization]]\r\n * ```\r\n *\r\n * The method should be called after a call to [IModelApp.startup]($core-frontend).\r\n */\r\n public static async initialize(props?: PresentationProps): Promise<void> {\r\n if (!IModelApp.initialized) {\r\n throw new PresentationError(PresentationStatus.NotInitialized,\r\n \"IModelApp.startup must be called before calling Presentation.initialize\");\r\n }\r\n if (!localization) {\r\n localization = IModelApp.localization;\r\n }\r\n if (!presentationManager) {\r\n const managerProps = props?.presentation ?? {};\r\n if (!managerProps.activeLocale) {\r\n const languages = Presentation.localization.getLanguageList();\r\n managerProps.activeLocale = (languages.length ? languages[0] : undefined);\r\n }\r\n presentationManager = PresentationManager.create(managerProps);\r\n }\r\n if (!selectionManager) {\r\n selectionManager = new SelectionManager(props?.selection ?? {\r\n scopes: new SelectionScopesManager({\r\n rpcRequestsHandler: presentationManager.rpcRequestsHandler,\r\n localeProvider: () => this.presentation.activeLocale,\r\n }),\r\n });\r\n }\r\n if (!favoritePropertiesManager) {\r\n favoritePropertiesManager = new FavoritePropertiesManager({\r\n storage: props?.favorites ? props.favorites.storage : createFavoritePropertiesStorage(DefaultFavoritePropertiesStorageTypes.Noop),\r\n });\r\n }\r\n // eslint-disable-next-line @typescript-eslint/unbound-method\r\n presentationManager.onNewiModelConnection = favoritePropertiesManager.initializeConnection.bind(favoritePropertiesManager);\r\n await FrontendLocalizationHelper.registerNamespaces();\r\n for (const handler of initializationHandlers) {\r\n const cleanup = await handler();\r\n if (cleanup)\r\n terminationHandlers.push(cleanup);\r\n }\r\n }\r\n\r\n /**\r\n * Terminates Presentation library frontend. This method should be called\r\n * before a call to [IModelApp.shutdown]($core-frontend)\r\n */\r\n public static terminate(): void {\r\n terminationHandlers.forEach((handler) => handler());\r\n terminationHandlers.length = 0;\r\n\r\n if (localization)\r\n FrontendLocalizationHelper.unregisterNamespaces();\r\n\r\n if (presentationManager)\r\n presentationManager.dispose();\r\n presentationManager = undefined;\r\n\r\n if (favoritePropertiesManager)\r\n favoritePropertiesManager.dispose();\r\n favoritePropertiesManager = undefined;\r\n\r\n selectionManager = undefined;\r\n localization = undefined;\r\n }\r\n\r\n /**\r\n * Registers an additional handler which will be invoked during Presentation library frontend\r\n * initialization.\r\n *\r\n * @internal\r\n */\r\n public static registerInitializationHandler(handler: () => Promise<() => void>): void {\r\n initializationHandlers.push(handler);\r\n }\r\n\r\n /** The singleton [[PresentationManager]] */\r\n public static get presentation(): PresentationManager {\r\n if (!presentationManager)\r\n throw new Error(\"Presentation must be first initialized by calling Presentation.initialize\");\r\n return presentationManager;\r\n }\r\n\r\n /** @internal */\r\n public static setPresentationManager(value: PresentationManager) {\r\n if (presentationManager)\r\n presentationManager.dispose();\r\n presentationManager = value;\r\n }\r\n\r\n /** The singleton [[SelectionManager]] */\r\n public static get selection(): SelectionManager {\r\n if (!selectionManager)\r\n throw new Error(\"Presentation must be first initialized by calling Presentation.initialize\");\r\n return selectionManager;\r\n }\r\n\r\n /** @internal */\r\n public static setSelectionManager(value: SelectionManager) {\r\n selectionManager = value;\r\n }\r\n\r\n /**\r\n * The singleton [[FavoritePropertiesManager]]\r\n * @public\r\n */\r\n public static get favoriteProperties(): FavoritePropertiesManager {\r\n if (!favoritePropertiesManager)\r\n throw new Error(\"Favorite Properties must be first initialized by calling Presentation.initialize\");\r\n return favoritePropertiesManager;\r\n }\r\n\r\n /** @internal */\r\n public static setFavoritePropertiesManager(value: FavoritePropertiesManager) {\r\n if (favoritePropertiesManager)\r\n favoritePropertiesManager.dispose();\r\n favoritePropertiesManager = value;\r\n }\r\n\r\n /**\r\n * The localization manager used by Presentation frontend. Returns the result of `IModelApp.i18n`.\r\n */\r\n public static get localization(): Localization {\r\n if (!localization)\r\n throw new Error(\"Presentation must be first initialized by calling Presentation.initialize\");\r\n return localization;\r\n }\r\n\r\n /** @internal */\r\n public static setLocalization(value: Localization) {\r\n localization = value;\r\n }\r\n}\r\n"]}
@@ -89,11 +89,12 @@ export declare class PresentationManager implements IDisposable {
89
89
  * @alpha
90
90
  */
91
91
  onIModelContentChanged: BeEvent<(args: IModelContentChangeEventArgs) => void>;
92
- /** Get / set active locale used for localizing presentation data */
93
- activeLocale: string | undefined;
94
92
  /** Get / set active unit system used to format property values with units */
95
93
  activeUnitSystem: UnitSystemKey | undefined;
96
94
  private constructor();
95
+ /** Get / set active locale used for localizing presentation data */
96
+ get activeLocale(): string | undefined;
97
+ set activeLocale(locale: string | undefined);
97
98
  dispose(): void;
98
99
  private onConnection;
99
100
  private initializeIModel;
@@ -1 +1 @@
1
- {"version":3,"file":"PresentationManager.d.ts","sourceRoot":"","sources":["../../../src/presentation-frontend/PresentationManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PresentationManager.d.ts","sourceRoot":"","sources":["../../../src/presentation-frontend/PresentationManager.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ import { BeEvent, CompressedId64Set, OrderedId64Iterable } from "@itwin/core-ben
9
9
  import { IpcApp } from "@itwin/core-frontend";
10
10
  import { Content, Descriptor, DisplayValueGroup, InstanceKey, Item, Key, KeySet, LabelDefinition, Node, NodeKey, NodePathElement, PresentationIpcEvents, RpcRequestsHandler, RulesetVariable, SelectClassInfo, UpdateInfo, VariableValueTypes, } from "@itwin/presentation-common";
11
11
  import { IpcRequestsHandler } from "./IpcRequestsHandler";
12
- import { LocalizationHelper } from "./LocalizationHelper";
12
+ import { FrontendLocalizationHelper } from "./LocalizationHelper";
13
13
  import { RulesetManagerImpl } from "./RulesetManager";
14
14
  import { RulesetVariablesManagerImpl } from "./RulesetVariablesManager";
15
15
  import { TRANSIENT_ELEMENT_CLASSNAME } from "./selection/SelectionManager";
@@ -39,13 +39,12 @@ export class PresentationManager {
39
39
  this.handleUpdateAsync(UpdateInfo.fromJSON(report));
40
40
  };
41
41
  if (props) {
42
- this.activeLocale = props.activeLocale;
43
42
  this.activeUnitSystem = props.activeUnitSystem;
44
43
  }
45
44
  this._requestsHandler = (_a = props === null || props === void 0 ? void 0 : props.rpcRequestsHandler) !== null && _a !== void 0 ? _a : new RpcRequestsHandler(props ? { clientId: props.clientId } : undefined);
46
45
  this._rulesetVars = new Map();
47
46
  this._rulesets = RulesetManagerImpl.create();
48
- this._localizationHelper = new LocalizationHelper();
47
+ this._localizationHelper = new FrontendLocalizationHelper(props === null || props === void 0 ? void 0 : props.activeLocale);
49
48
  this._connections = new Map();
50
49
  if (IpcApp.isValid) {
51
50
  // Ipc only works in ipc apps, so the `onUpdate` callback will only be called there.
@@ -54,6 +53,9 @@ export class PresentationManager {
54
53
  this._stateTracker = (_c = props === null || props === void 0 ? void 0 : props.stateTracker) !== null && _c !== void 0 ? _c : new StateTracker(this._ipcRequestsHandler);
55
54
  }
56
55
  }
56
+ /** Get / set active locale used for localizing presentation data */
57
+ get activeLocale() { return this._localizationHelper.locale; }
58
+ set activeLocale(locale) { this._localizationHelper.locale = locale; }
57
59
  dispose() {
58
60
  this._requestsHandler.dispose();
59
61
  if (this._clearEventListener) {
@@ -294,7 +296,11 @@ export class PresentationManager {
294
296
  */
295
297
  async getElementProperties(requestOptions) {
296
298
  await this.onConnection(requestOptions.imodel);
297
- return this._requestsHandler.getElementProperties(this.toRpcTokenOptions(requestOptions));
299
+ const results = await this._requestsHandler.getElementProperties(this.toRpcTokenOptions(requestOptions));
300
+ // istanbul ignore if
301
+ if (!results)
302
+ return undefined;
303
+ return this._localizationHelper.getLocalizedElementProperties(results);
298
304
  }
299
305
  /**
300
306
  * Retrieves content item instance keys.
@@ -1 +1 @@
1
- {"version":3,"file":"PresentationManager.js","sourceRoot":"","sources":["../../../src/presentation-frontend/PresentationManager.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 { BeEvent, CompressedId64Set, IDisposable, OrderedId64Iterable } from \"@itwin/core-bentley\";\r\nimport { IModelConnection, IpcApp } from \"@itwin/core-frontend\";\r\nimport { UnitSystemKey } from \"@itwin/core-quantity\";\r\nimport {\r\n ClientDiagnosticsAttribute, Content, ContentDescriptorRequestOptions, ContentInstanceKeysRequestOptions, ContentRequestOptions,\r\n ContentSourcesRequestOptions, ContentUpdateInfo, Descriptor, DescriptorOverrides, DisplayLabelRequestOptions, DisplayLabelsRequestOptions,\r\n DisplayValueGroup, DistinctValuesRequestOptions, ElementProperties, FilterByInstancePathsHierarchyRequestOptions,\r\n FilterByTextHierarchyRequestOptions, HierarchyRequestOptions, HierarchyUpdateInfo, InstanceKey, Item, Key, KeySet, LabelDefinition, Node, NodeKey,\r\n NodeKeyJSON, NodePathElement, Paged, PagedResponse, PageOptions, PresentationIpcEvents, RpcRequestsHandler, Ruleset, RulesetVariable,\r\n SelectClassInfo, SingleElementPropertiesRequestOptions, UpdateInfo, UpdateInfoJSON, VariableValueTypes,\r\n} from \"@itwin/presentation-common\";\r\nimport { IpcRequestsHandler } from \"./IpcRequestsHandler\";\r\nimport { LocalizationHelper } from \"./LocalizationHelper\";\r\nimport { RulesetManager, RulesetManagerImpl } from \"./RulesetManager\";\r\nimport { RulesetVariablesManager, RulesetVariablesManagerImpl } from \"./RulesetVariablesManager\";\r\nimport { TRANSIENT_ELEMENT_CLASSNAME } from \"./selection/SelectionManager\";\r\nimport { StateTracker } from \"./StateTracker\";\r\n\r\n/**\r\n * Data structure that describes IModel hierarchy change event arguments.\r\n * @alpha\r\n */\r\nexport interface IModelHierarchyChangeEventArgs {\r\n /** Id of ruleset that was used to create hierarchy. */\r\n rulesetId: string;\r\n /** Hierarchy changes info. */\r\n updateInfo: HierarchyUpdateInfo;\r\n /** Key of iModel that was used to create hierarchy. It matches [[IModelConnection.key]] property. */\r\n imodelKey: string;\r\n}\r\n\r\n/**\r\n * Data structure that describes iModel content change event arguments.\r\n * @alpha\r\n */\r\nexport interface IModelContentChangeEventArgs {\r\n /** Id of ruleset that was used to create content. */\r\n rulesetId: string;\r\n /** Content changes info. */\r\n updateInfo: ContentUpdateInfo;\r\n /** Key of iModel that was used to create content. It matches [[IModelConnection.key]] property. */\r\n imodelKey: string;\r\n}\r\n\r\n/**\r\n * Properties used to configure [[PresentationManager]]\r\n * @public\r\n */\r\nexport interface PresentationManagerProps {\r\n /**\r\n * Sets the active locale to use when localizing presentation-related\r\n * strings. It can later be changed through [[PresentationManager]].\r\n */\r\n activeLocale?: string;\r\n\r\n /**\r\n * Sets the active unit system to use for formatting property values with\r\n * units. Default presentation units are used if this is not specified. The active unit\r\n * system can later be changed through [[PresentationManager]] or overriden for each request.\r\n */\r\n activeUnitSystem?: UnitSystemKey;\r\n\r\n /**\r\n * ID used to identify client that requests data. Generally, clients should\r\n * store this ID in their local storage so the ID can be reused across\r\n * sessions - this allows reusing some caches.\r\n *\r\n * Defaults to a unique GUID as a client id.\r\n */\r\n clientId?: string;\r\n\r\n /** @internal */\r\n rpcRequestsHandler?: RpcRequestsHandler;\r\n\r\n /** @internal */\r\n ipcRequestsHandler?: IpcRequestsHandler;\r\n\r\n /** @internal */\r\n stateTracker?: StateTracker;\r\n}\r\n\r\n/**\r\n * Frontend Presentation manager which basically just forwards all calls to\r\n * the backend implementation.\r\n *\r\n * @public\r\n */\r\nexport class PresentationManager implements IDisposable {\r\n private _requestsHandler: RpcRequestsHandler;\r\n private _rulesets: RulesetManager;\r\n private _localizationHelper: LocalizationHelper;\r\n private _rulesetVars: Map<string, RulesetVariablesManager>;\r\n private _clearEventListener?: () => void;\r\n private _connections: Map<IModelConnection, Promise<void>>;\r\n private _ipcRequestsHandler?: IpcRequestsHandler;\r\n private _stateTracker?: StateTracker;\r\n\r\n /**\r\n * An event raised when hierarchies created using specific ruleset change\r\n * @alpha\r\n */\r\n public onIModelHierarchyChanged = new BeEvent<(args: IModelHierarchyChangeEventArgs) => void>();\r\n\r\n /**\r\n * An event raised when content created using specific ruleset changes\r\n * @alpha\r\n */\r\n public onIModelContentChanged = new BeEvent<(args: IModelContentChangeEventArgs) => void>();\r\n\r\n /** Get / set active locale used for localizing presentation data */\r\n public activeLocale: string | undefined;\r\n\r\n /** Get / set active unit system used to format property values with units */\r\n public activeUnitSystem: UnitSystemKey | undefined;\r\n\r\n private constructor(props?: PresentationManagerProps) {\r\n if (props) {\r\n this.activeLocale = props.activeLocale;\r\n this.activeUnitSystem = props.activeUnitSystem;\r\n }\r\n\r\n this._requestsHandler = props?.rpcRequestsHandler ?? new RpcRequestsHandler(props ? { clientId: props.clientId } : undefined);\r\n this._rulesetVars = new Map<string, RulesetVariablesManager>();\r\n this._rulesets = RulesetManagerImpl.create();\r\n this._localizationHelper = new LocalizationHelper();\r\n this._connections = new Map<IModelConnection, Promise<void>>();\r\n\r\n if (IpcApp.isValid) {\r\n // Ipc only works in ipc apps, so the `onUpdate` callback will only be called there.\r\n this._clearEventListener = IpcApp.addListener(PresentationIpcEvents.Update, this.onUpdate);\r\n this._ipcRequestsHandler = props?.ipcRequestsHandler ?? new IpcRequestsHandler(this._requestsHandler.clientId);\r\n this._stateTracker = props?.stateTracker ?? new StateTracker(this._ipcRequestsHandler);\r\n }\r\n }\r\n\r\n public dispose() {\r\n this._requestsHandler.dispose();\r\n if (this._clearEventListener) {\r\n this._clearEventListener();\r\n this._clearEventListener = undefined;\r\n }\r\n }\r\n\r\n private async onConnection(imodel: IModelConnection) {\r\n if (!this._connections.has(imodel))\r\n this._connections.set(imodel, this.initializeIModel(imodel));\r\n await this._connections.get(imodel);\r\n }\r\n\r\n private async initializeIModel(imodel: IModelConnection) {\r\n imodel.onClose.addOnce(() => {\r\n this._connections.delete(imodel);\r\n });\r\n await this.onNewiModelConnection(imodel);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private onUpdate = (_evt: Event, report: UpdateInfoJSON) => {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.handleUpdateAsync(UpdateInfo.fromJSON(report));\r\n };\r\n\r\n /** @note This is only called in native apps after changes in iModels */\r\n private async handleUpdateAsync(report: UpdateInfo) {\r\n for (const imodelKey in report) {\r\n // istanbul ignore if\r\n if (!report.hasOwnProperty(imodelKey))\r\n continue;\r\n\r\n const imodelReport = report[imodelKey];\r\n for (const rulesetId in imodelReport) {\r\n // istanbul ignore if\r\n if (!imodelReport.hasOwnProperty(rulesetId))\r\n continue;\r\n\r\n const updateInfo = imodelReport[rulesetId];\r\n if (updateInfo.content)\r\n this.onIModelContentChanged.raiseEvent({ rulesetId, updateInfo: updateInfo.content, imodelKey });\r\n if (updateInfo.hierarchy)\r\n this.onIModelHierarchyChanged.raiseEvent({ rulesetId, updateInfo: updateInfo.hierarchy, imodelKey });\r\n }\r\n }\r\n }\r\n\r\n /** Function that is called when a new IModelConnection is used to retrieve data.\r\n * @internal\r\n */\r\n public async onNewiModelConnection(_: IModelConnection) { }\r\n\r\n /**\r\n * Create a new PresentationManager instance\r\n * @param props Optional properties used to configure the manager\r\n */\r\n public static create(props?: PresentationManagerProps) {\r\n return new PresentationManager(props);\r\n }\r\n\r\n /** @internal */\r\n public get rpcRequestsHandler() { return this._requestsHandler; }\r\n\r\n /** @internal */\r\n public get ipcRequestsHandler() { return this._ipcRequestsHandler; }\r\n\r\n /** @internal */\r\n public get stateTracker() { return this._stateTracker; }\r\n\r\n /**\r\n * Get rulesets manager\r\n */\r\n public rulesets() { return this._rulesets; }\r\n\r\n /**\r\n * Get ruleset variables manager for specific ruleset\r\n * @param rulesetId Id of the ruleset to get the vars manager for\r\n */\r\n public vars(rulesetId: string) {\r\n if (!this._rulesetVars.has(rulesetId)) {\r\n const varsManager = new RulesetVariablesManagerImpl(rulesetId, this._ipcRequestsHandler);\r\n this._rulesetVars.set(rulesetId, varsManager);\r\n }\r\n return this._rulesetVars.get(rulesetId)!;\r\n }\r\n\r\n private toRpcTokenOptions<TOptions extends { imodel: IModelConnection, locale?: string, unitSystem?: UnitSystemKey, rulesetVariables?: RulesetVariable[] }>(requestOptions: TOptions) {\r\n // 1. put default `locale` and `unitSystem`\r\n // 2. put all `requestOptions` members (if `locale` or `unitSystem` are set, they'll override the defaults put at #1)\r\n // 3. put `imodel` of type `IModelRpcProps` which overwrites the `imodel` from `requestOptions` put at #2\r\n const defaultOptions: Pick<TOptions, \"locale\" | \"unitSystem\"> = {};\r\n if (this.activeLocale)\r\n defaultOptions.locale = this.activeLocale;\r\n if (this.activeUnitSystem)\r\n defaultOptions.unitSystem = this.activeUnitSystem;\r\n\r\n const { imodel, rulesetVariables, ...rpcRequestOptions } = requestOptions;\r\n return {\r\n ...defaultOptions,\r\n ...rpcRequestOptions,\r\n ...(rulesetVariables ? { rulesetVariables: rulesetVariables.map(RulesetVariable.toJSON) } : {}),\r\n imodel: imodel.getRpcProps(),\r\n };\r\n }\r\n\r\n private async addRulesetAndVariablesToOptions<TOptions extends { rulesetOrId: Ruleset | string, rulesetVariables?: RulesetVariable[] }>(options: TOptions) {\r\n const { rulesetOrId, rulesetVariables } = options;\r\n let foundRulesetOrId: Ruleset | string;\r\n if (typeof rulesetOrId === \"object\") {\r\n foundRulesetOrId = rulesetOrId;\r\n } else {\r\n const foundRuleset = await this._rulesets.get(rulesetOrId);\r\n foundRulesetOrId = foundRuleset ? foundRuleset.toJSON() : rulesetOrId;\r\n }\r\n const rulesetId = (typeof foundRulesetOrId === \"object\") ? foundRulesetOrId.id : foundRulesetOrId;\r\n\r\n // All Id64Array variable values must be sorted for serialization to JSON to work. RulesetVariablesManager\r\n // sorts them before storing, so that part is taken care of, but we need to ensure that variables coming from\r\n // request options are also sorted.\r\n const variables = (rulesetVariables ?? []).map((variable) => {\r\n if (variable.type === VariableValueTypes.Id64Array)\r\n return { ...variable, value: OrderedId64Iterable.sortArray(variable.value) };\r\n return variable;\r\n });\r\n if (!this._ipcRequestsHandler) {\r\n // only need to add variables from variables manager if there's no IPC\r\n // handler - if there is one, the variables are already known by the backend\r\n variables.push(...this.vars(rulesetId).getAllVariables());\r\n }\r\n\r\n return { ...options, rulesetOrId: foundRulesetOrId, rulesetVariables: variables };\r\n }\r\n\r\n /** Retrieves nodes */\r\n public async getNodes(requestOptions: Paged<HierarchyRequestOptions<IModelConnection, NodeKey, RulesetVariable>> & ClientDiagnosticsAttribute): Promise<Node[]> {\r\n await this.onConnection(requestOptions.imodel);\r\n const options = await this.addRulesetAndVariablesToOptions(requestOptions);\r\n const rpcOptions = this.toRpcTokenOptions({ ...options, parentKey: optionalNodeKeyToJson(options.parentKey) });\r\n const result = await buildPagedArrayResponse(options.paging, async (partialPageOptions) => this._requestsHandler.getPagedNodes({ ...rpcOptions, paging: partialPageOptions }));\r\n return this._localizationHelper.getLocalizedNodes(result.items.map(Node.fromJSON));\r\n }\r\n\r\n /** Retrieves nodes count. */\r\n public async getNodesCount(requestOptions: HierarchyRequestOptions<IModelConnection, NodeKey, RulesetVariable> & ClientDiagnosticsAttribute): Promise<number> {\r\n await this.onConnection(requestOptions.imodel);\r\n const options = await this.addRulesetAndVariablesToOptions(requestOptions);\r\n const rpcOptions = this.toRpcTokenOptions({ ...options, parentKey: optionalNodeKeyToJson(options.parentKey) });\r\n return this._requestsHandler.getNodesCount(rpcOptions);\r\n }\r\n\r\n /** Retrieves total nodes count and a single page of nodes. */\r\n public async getNodesAndCount(requestOptions: Paged<HierarchyRequestOptions<IModelConnection, NodeKey, RulesetVariable>> & ClientDiagnosticsAttribute): Promise<{ count: number, nodes: Node[] }> {\r\n await this.onConnection(requestOptions.imodel);\r\n const options = await this.addRulesetAndVariablesToOptions(requestOptions);\r\n const rpcOptions = this.toRpcTokenOptions({ ...options, parentKey: optionalNodeKeyToJson(options.parentKey) });\r\n const result = await buildPagedArrayResponse(options.paging, async (partialPageOptions) => this._requestsHandler.getPagedNodes({ ...rpcOptions, paging: partialPageOptions }));\r\n return {\r\n count: result.total,\r\n nodes: this._localizationHelper.getLocalizedNodes(result.items.map(Node.fromJSON)),\r\n };\r\n }\r\n\r\n /** Retrieves paths from root nodes to children nodes according to specified keys. Intersecting paths will be merged. */\r\n public async getNodePaths(requestOptions: FilterByInstancePathsHierarchyRequestOptions<IModelConnection, RulesetVariable> & ClientDiagnosticsAttribute): Promise<NodePathElement[]> {\r\n await this.onConnection(requestOptions.imodel);\r\n const options = await this.addRulesetAndVariablesToOptions(requestOptions);\r\n const rpcOptions = this.toRpcTokenOptions({ ...options, instancePaths: options.instancePaths.map((p) => p.map(InstanceKey.toJSON)) });\r\n const result = await this._requestsHandler.getNodePaths(rpcOptions);\r\n return result.map(NodePathElement.fromJSON);\r\n }\r\n\r\n /** Retrieves paths from root nodes to nodes containing filter text in their label. */\r\n public async getFilteredNodePaths(requestOptions: FilterByTextHierarchyRequestOptions<IModelConnection, RulesetVariable> & ClientDiagnosticsAttribute): Promise<NodePathElement[]> {\r\n await this.onConnection(requestOptions.imodel);\r\n const options = await this.addRulesetAndVariablesToOptions(requestOptions);\r\n const result = await this._requestsHandler.getFilteredNodePaths(this.toRpcTokenOptions(options));\r\n return result.map(NodePathElement.fromJSON);\r\n }\r\n\r\n /**\r\n * Get all content sources for a given list of classes.\r\n * @beta\r\n */\r\n public async getContentSources(requestOptions: ContentSourcesRequestOptions<IModelConnection> & ClientDiagnosticsAttribute): Promise<SelectClassInfo[]> {\r\n await this.onConnection(requestOptions.imodel);\r\n const rpcOptions = this.toRpcTokenOptions(requestOptions);\r\n const result = await this._requestsHandler.getContentSources(rpcOptions);\r\n return SelectClassInfo.listFromCompressedJSON(result.sources, result.classesMap);\r\n }\r\n\r\n /** Retrieves the content descriptor which describes the content and can be used to customize it. */\r\n public async getContentDescriptor(requestOptions: ContentDescriptorRequestOptions<IModelConnection, KeySet, RulesetVariable> & ClientDiagnosticsAttribute): Promise<Descriptor | undefined> {\r\n await this.onConnection(requestOptions.imodel);\r\n const options = await this.addRulesetAndVariablesToOptions(requestOptions);\r\n const rpcOptions = this.toRpcTokenOptions({\r\n ...options,\r\n keys: stripTransientElementKeys(options.keys).toJSON(),\r\n });\r\n const result = await this._requestsHandler.getContentDescriptor(rpcOptions);\r\n return Descriptor.fromJSON(result);\r\n }\r\n\r\n /** Retrieves overall content set size. */\r\n public async getContentSetSize(requestOptions: ContentRequestOptions<IModelConnection, Descriptor | DescriptorOverrides, KeySet, RulesetVariable> & ClientDiagnosticsAttribute): Promise<number> {\r\n await this.onConnection(requestOptions.imodel);\r\n const options = await this.addRulesetAndVariablesToOptions(requestOptions);\r\n const rpcOptions = this.toRpcTokenOptions({\r\n ...options,\r\n descriptor: getDescriptorOverrides(requestOptions.descriptor),\r\n keys: stripTransientElementKeys(requestOptions.keys).toJSON(),\r\n });\r\n return this._requestsHandler.getContentSetSize(rpcOptions);\r\n }\r\n\r\n /** Retrieves content which consists of a content descriptor and a page of records. */\r\n public async getContent(requestOptions: Paged<ContentRequestOptions<IModelConnection, Descriptor | DescriptorOverrides, KeySet, RulesetVariable>> & ClientDiagnosticsAttribute): Promise<Content | undefined> {\r\n return (await this.getContentAndSize(requestOptions))?.content;\r\n }\r\n\r\n /** Retrieves content set size and content which consists of a content descriptor and a page of records. */\r\n public async getContentAndSize(requestOptions: Paged<ContentRequestOptions<IModelConnection, Descriptor | DescriptorOverrides, KeySet, RulesetVariable>> & ClientDiagnosticsAttribute): Promise<{ content: Content, size: number } | undefined> {\r\n await this.onConnection(requestOptions.imodel);\r\n const options = await this.addRulesetAndVariablesToOptions(requestOptions);\r\n const rpcOptions = this.toRpcTokenOptions({\r\n ...options,\r\n descriptor: getDescriptorOverrides(requestOptions.descriptor),\r\n keys: stripTransientElementKeys(requestOptions.keys).toJSON(),\r\n });\r\n let descriptor = (requestOptions.descriptor instanceof Descriptor) ? requestOptions.descriptor : undefined;\r\n const result = await buildPagedArrayResponse(options.paging, async (partialPageOptions, requestIndex) => {\r\n if (0 === requestIndex && !descriptor) {\r\n const content = await this._requestsHandler.getPagedContent({ ...rpcOptions, paging: partialPageOptions });\r\n if (content) {\r\n descriptor = Descriptor.fromJSON(content.descriptor);\r\n return content.contentSet;\r\n }\r\n return { total: 0, items: [] };\r\n }\r\n return this._requestsHandler.getPagedContentSet({ ...rpcOptions, paging: partialPageOptions });\r\n });\r\n if (!descriptor)\r\n return undefined;\r\n const items = result.items.map((itemJson) => Item.fromJSON(itemJson)).filter<Item>((item): item is Item => (item !== undefined));\r\n return {\r\n size: result.total,\r\n content: this._localizationHelper.getLocalizedContent(new Content(descriptor, items)),\r\n };\r\n }\r\n\r\n /** Retrieves distinct values of specific field from the content. */\r\n public async getPagedDistinctValues(requestOptions: DistinctValuesRequestOptions<IModelConnection, Descriptor | DescriptorOverrides, KeySet, RulesetVariable> & ClientDiagnosticsAttribute): Promise<PagedResponse<DisplayValueGroup>> {\r\n await this.onConnection(requestOptions.imodel);\r\n const options = await this.addRulesetAndVariablesToOptions(requestOptions);\r\n const rpcOptions = {\r\n ...this.toRpcTokenOptions(options),\r\n descriptor: getDescriptorOverrides(options.descriptor),\r\n keys: stripTransientElementKeys(options.keys).toJSON(),\r\n };\r\n const result = await buildPagedArrayResponse(requestOptions.paging, async (partialPageOptions) => this._requestsHandler.getPagedDistinctValues({ ...rpcOptions, paging: partialPageOptions }));\r\n return {\r\n ...result,\r\n items: result.items.map(DisplayValueGroup.fromJSON),\r\n };\r\n }\r\n\r\n /**\r\n * Retrieves property data in a simplified format for a single element specified by ID.\r\n * @beta\r\n */\r\n public async getElementProperties(requestOptions: SingleElementPropertiesRequestOptions<IModelConnection> & ClientDiagnosticsAttribute): Promise<ElementProperties | undefined> {\r\n await this.onConnection(requestOptions.imodel);\r\n return this._requestsHandler.getElementProperties(this.toRpcTokenOptions(requestOptions));\r\n }\r\n\r\n /**\r\n * Retrieves content item instance keys.\r\n * @beta\r\n */\r\n public async getContentInstanceKeys(requestOptions: ContentInstanceKeysRequestOptions<IModelConnection, KeySet, RulesetVariable> & ClientDiagnosticsAttribute): Promise<{ total: number, items: () => AsyncGenerator<InstanceKey> }> {\r\n await this.onConnection(requestOptions.imodel);\r\n const options = await this.addRulesetAndVariablesToOptions(requestOptions);\r\n const rpcOptions = {\r\n ...this.toRpcTokenOptions(options),\r\n keys: stripTransientElementKeys(options.keys).toJSON(),\r\n };\r\n\r\n const props = {\r\n page: requestOptions.paging,\r\n get: async (page: Required<PageOptions>) => {\r\n const keys = await this._requestsHandler.getContentInstanceKeys({ ...rpcOptions, paging: page });\r\n return {\r\n total: keys.total,\r\n items: keys.items.instanceKeys.reduce((instanceKeys, entry) => {\r\n for (const id of CompressedId64Set.iterable(entry[1])) {\r\n instanceKeys.push({ className: entry[0], id });\r\n }\r\n return instanceKeys;\r\n }, new Array<InstanceKey>()),\r\n };\r\n },\r\n };\r\n return createPagedGeneratorResponse(props);\r\n }\r\n\r\n /** Retrieves display label definition of specific item. */\r\n public async getDisplayLabelDefinition(requestOptions: DisplayLabelRequestOptions<IModelConnection, InstanceKey> & ClientDiagnosticsAttribute): Promise<LabelDefinition> {\r\n await this.onConnection(requestOptions.imodel);\r\n const rpcOptions = this.toRpcTokenOptions({ ...requestOptions, key: InstanceKey.toJSON(requestOptions.key) });\r\n const result = await this._requestsHandler.getDisplayLabelDefinition(rpcOptions);\r\n return this._localizationHelper.getLocalizedLabelDefinition(LabelDefinition.fromJSON(result));\r\n }\r\n\r\n /** Retrieves display label definition of specific items. */\r\n public async getDisplayLabelDefinitions(requestOptions: DisplayLabelsRequestOptions<IModelConnection, InstanceKey> & ClientDiagnosticsAttribute): Promise<LabelDefinition[]> {\r\n await this.onConnection(requestOptions.imodel);\r\n const rpcOptions = this.toRpcTokenOptions({ ...requestOptions, keys: requestOptions.keys.map(InstanceKey.toJSON) });\r\n const result = await buildPagedArrayResponse(undefined, async (partialPageOptions) => {\r\n const partialKeys = (!partialPageOptions.start) ? rpcOptions.keys : rpcOptions.keys.slice(partialPageOptions.start);\r\n return this._requestsHandler.getPagedDisplayLabelDefinitions({ ...rpcOptions, keys: partialKeys });\r\n });\r\n return this._localizationHelper.getLocalizedLabelDefinitions(result.items.map(LabelDefinition.fromJSON));\r\n }\r\n\r\n}\r\n\r\nconst getDescriptorOverrides = (descriptorOrOverrides: Descriptor | DescriptorOverrides): DescriptorOverrides => {\r\n if (descriptorOrOverrides instanceof Descriptor)\r\n return descriptorOrOverrides.createDescriptorOverrides();\r\n return descriptorOrOverrides;\r\n};\r\n\r\nconst optionalNodeKeyToJson = (key: NodeKey | undefined): NodeKeyJSON | undefined => key ? NodeKey.toJSON(key) : undefined;\r\n\r\ninterface PagedGeneratorCreateProps<TPagedResponseItem> {\r\n page: PageOptions | undefined;\r\n get: (pageStart: Required<PageOptions>, requestIndex: number) => Promise<{ total: number, items: TPagedResponseItem[] }>;\r\n}\r\nasync function createPagedGeneratorResponse<TPagedResponseItem>(props: PagedGeneratorCreateProps<TPagedResponseItem>) {\r\n let pageStart = props.page?.start ?? 0;\r\n let pageSize = props.page?.size ?? 0;\r\n let requestIndex = 0;\r\n\r\n const firstPage = await props.get({ start: pageStart, size: pageSize }, requestIndex++);\r\n return {\r\n total: firstPage.total,\r\n async *items() {\r\n let partialResult = firstPage;\r\n while (true) {\r\n for (const item of partialResult.items) {\r\n yield item;\r\n }\r\n\r\n const receivedItemsCount = partialResult.items.length;\r\n if (partialResult.total !== 0 && receivedItemsCount === 0) {\r\n if (pageStart >= partialResult.total)\r\n throw new Error(`Requested page with start index ${pageStart} is out of bounds. Total number of items: ${partialResult.total}`);\r\n throw new Error(\"Paged request returned non zero total count but no items\");\r\n }\r\n\r\n if (pageSize !== 0 && receivedItemsCount >= pageSize || receivedItemsCount >= (partialResult.total - pageStart))\r\n break;\r\n\r\n if (pageSize !== 0)\r\n pageSize -= receivedItemsCount;\r\n pageStart += receivedItemsCount;\r\n\r\n partialResult = await props.get({ start: pageStart, size: pageSize }, requestIndex++);\r\n }\r\n },\r\n };\r\n}\r\n\r\n/** @internal */\r\nexport const buildPagedArrayResponse = async <TItem>(requestedPage: PageOptions | undefined, getter: (page: Required<PageOptions>, requestIndex: number) => Promise<PagedResponse<TItem>>): Promise<PagedResponse<TItem>> => {\r\n try {\r\n const items = new Array<TItem>();\r\n const gen = await createPagedGeneratorResponse({ page: requestedPage, get: getter });\r\n for await (const item of gen.items()) {\r\n items.push(item);\r\n }\r\n return { total: gen.total, items };\r\n } catch {\r\n return { total: 0, items: [] };\r\n }\r\n};\r\n\r\nconst stripTransientElementKeys = (keys: KeySet) => {\r\n if (!keys.some((key) => Key.isInstanceKey(key) && key.className === TRANSIENT_ELEMENT_CLASSNAME))\r\n return keys;\r\n\r\n const copy = new KeySet();\r\n copy.add(keys, (key) => {\r\n // the callback is not going to be called with EntityProps as KeySet converts them\r\n // to InstanceKeys, but we want to keep the EntityProps case for correctness\r\n // istanbul ignore next\r\n const isTransient = Key.isInstanceKey(key) && key.className === TRANSIENT_ELEMENT_CLASSNAME\r\n || Key.isEntityProps(key) && key.classFullName === TRANSIENT_ELEMENT_CLASSNAME;\r\n return !isTransient;\r\n });\r\n return copy;\r\n};\r\n"]}
1
+ {"version":3,"file":"PresentationManager.js","sourceRoot":"","sources":["../../../src/presentation-frontend/PresentationManager.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 { BeEvent, CompressedId64Set, IDisposable, OrderedId64Iterable } from \"@itwin/core-bentley\";\r\nimport { IModelConnection, IpcApp } from \"@itwin/core-frontend\";\r\nimport { UnitSystemKey } from \"@itwin/core-quantity\";\r\nimport {\r\n ClientDiagnosticsAttribute, Content, ContentDescriptorRequestOptions, ContentInstanceKeysRequestOptions, ContentRequestOptions,\r\n ContentSourcesRequestOptions, ContentUpdateInfo, Descriptor, DescriptorOverrides, DisplayLabelRequestOptions, DisplayLabelsRequestOptions,\r\n DisplayValueGroup, DistinctValuesRequestOptions, ElementProperties, FilterByInstancePathsHierarchyRequestOptions,\r\n FilterByTextHierarchyRequestOptions, HierarchyRequestOptions, HierarchyUpdateInfo, InstanceKey, Item, Key, KeySet, LabelDefinition, Node, NodeKey,\r\n NodeKeyJSON, NodePathElement, Paged, PagedResponse, PageOptions, PresentationIpcEvents, RpcRequestsHandler, Ruleset, RulesetVariable,\r\n SelectClassInfo, SingleElementPropertiesRequestOptions, UpdateInfo, UpdateInfoJSON, VariableValueTypes,\r\n} from \"@itwin/presentation-common\";\r\nimport { IpcRequestsHandler } from \"./IpcRequestsHandler\";\r\nimport { FrontendLocalizationHelper } from \"./LocalizationHelper\";\r\nimport { RulesetManager, RulesetManagerImpl } from \"./RulesetManager\";\r\nimport { RulesetVariablesManager, RulesetVariablesManagerImpl } from \"./RulesetVariablesManager\";\r\nimport { TRANSIENT_ELEMENT_CLASSNAME } from \"./selection/SelectionManager\";\r\nimport { StateTracker } from \"./StateTracker\";\r\n\r\n/**\r\n * Data structure that describes IModel hierarchy change event arguments.\r\n * @alpha\r\n */\r\nexport interface IModelHierarchyChangeEventArgs {\r\n /** Id of ruleset that was used to create hierarchy. */\r\n rulesetId: string;\r\n /** Hierarchy changes info. */\r\n updateInfo: HierarchyUpdateInfo;\r\n /** Key of iModel that was used to create hierarchy. It matches [[IModelConnection.key]] property. */\r\n imodelKey: string;\r\n}\r\n\r\n/**\r\n * Data structure that describes iModel content change event arguments.\r\n * @alpha\r\n */\r\nexport interface IModelContentChangeEventArgs {\r\n /** Id of ruleset that was used to create content. */\r\n rulesetId: string;\r\n /** Content changes info. */\r\n updateInfo: ContentUpdateInfo;\r\n /** Key of iModel that was used to create content. It matches [[IModelConnection.key]] property. */\r\n imodelKey: string;\r\n}\r\n\r\n/**\r\n * Properties used to configure [[PresentationManager]]\r\n * @public\r\n */\r\nexport interface PresentationManagerProps {\r\n /**\r\n * Sets the active locale to use when localizing presentation-related\r\n * strings. It can later be changed through [[PresentationManager]].\r\n */\r\n activeLocale?: string;\r\n\r\n /**\r\n * Sets the active unit system to use for formatting property values with\r\n * units. Default presentation units are used if this is not specified. The active unit\r\n * system can later be changed through [[PresentationManager]] or overriden for each request.\r\n */\r\n activeUnitSystem?: UnitSystemKey;\r\n\r\n /**\r\n * ID used to identify client that requests data. Generally, clients should\r\n * store this ID in their local storage so the ID can be reused across\r\n * sessions - this allows reusing some caches.\r\n *\r\n * Defaults to a unique GUID as a client id.\r\n */\r\n clientId?: string;\r\n\r\n /** @internal */\r\n rpcRequestsHandler?: RpcRequestsHandler;\r\n\r\n /** @internal */\r\n ipcRequestsHandler?: IpcRequestsHandler;\r\n\r\n /** @internal */\r\n stateTracker?: StateTracker;\r\n}\r\n\r\n/**\r\n * Frontend Presentation manager which basically just forwards all calls to\r\n * the backend implementation.\r\n *\r\n * @public\r\n */\r\nexport class PresentationManager implements IDisposable {\r\n private _requestsHandler: RpcRequestsHandler;\r\n private _rulesets: RulesetManager;\r\n private _localizationHelper: FrontendLocalizationHelper;\r\n private _rulesetVars: Map<string, RulesetVariablesManager>;\r\n private _clearEventListener?: () => void;\r\n private _connections: Map<IModelConnection, Promise<void>>;\r\n private _ipcRequestsHandler?: IpcRequestsHandler;\r\n private _stateTracker?: StateTracker;\r\n\r\n /**\r\n * An event raised when hierarchies created using specific ruleset change\r\n * @alpha\r\n */\r\n public onIModelHierarchyChanged = new BeEvent<(args: IModelHierarchyChangeEventArgs) => void>();\r\n\r\n /**\r\n * An event raised when content created using specific ruleset changes\r\n * @alpha\r\n */\r\n public onIModelContentChanged = new BeEvent<(args: IModelContentChangeEventArgs) => void>();\r\n\r\n /** Get / set active unit system used to format property values with units */\r\n public activeUnitSystem: UnitSystemKey | undefined;\r\n\r\n private constructor(props?: PresentationManagerProps) {\r\n if (props) {\r\n this.activeUnitSystem = props.activeUnitSystem;\r\n }\r\n\r\n this._requestsHandler = props?.rpcRequestsHandler ?? new RpcRequestsHandler(props ? { clientId: props.clientId } : undefined);\r\n this._rulesetVars = new Map<string, RulesetVariablesManager>();\r\n this._rulesets = RulesetManagerImpl.create();\r\n this._localizationHelper = new FrontendLocalizationHelper(props?.activeLocale);\r\n this._connections = new Map<IModelConnection, Promise<void>>();\r\n\r\n if (IpcApp.isValid) {\r\n // Ipc only works in ipc apps, so the `onUpdate` callback will only be called there.\r\n this._clearEventListener = IpcApp.addListener(PresentationIpcEvents.Update, this.onUpdate);\r\n this._ipcRequestsHandler = props?.ipcRequestsHandler ?? new IpcRequestsHandler(this._requestsHandler.clientId);\r\n this._stateTracker = props?.stateTracker ?? new StateTracker(this._ipcRequestsHandler);\r\n }\r\n }\r\n\r\n /** Get / set active locale used for localizing presentation data */\r\n public get activeLocale(): string | undefined { return this._localizationHelper.locale; }\r\n public set activeLocale(locale: string | undefined) { this._localizationHelper.locale = locale; }\r\n\r\n public dispose() {\r\n this._requestsHandler.dispose();\r\n if (this._clearEventListener) {\r\n this._clearEventListener();\r\n this._clearEventListener = undefined;\r\n }\r\n }\r\n\r\n private async onConnection(imodel: IModelConnection) {\r\n if (!this._connections.has(imodel))\r\n this._connections.set(imodel, this.initializeIModel(imodel));\r\n await this._connections.get(imodel);\r\n }\r\n\r\n private async initializeIModel(imodel: IModelConnection) {\r\n imodel.onClose.addOnce(() => {\r\n this._connections.delete(imodel);\r\n });\r\n await this.onNewiModelConnection(imodel);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private onUpdate = (_evt: Event, report: UpdateInfoJSON) => {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.handleUpdateAsync(UpdateInfo.fromJSON(report));\r\n };\r\n\r\n /** @note This is only called in native apps after changes in iModels */\r\n private async handleUpdateAsync(report: UpdateInfo) {\r\n for (const imodelKey in report) {\r\n // istanbul ignore if\r\n if (!report.hasOwnProperty(imodelKey))\r\n continue;\r\n\r\n const imodelReport = report[imodelKey];\r\n for (const rulesetId in imodelReport) {\r\n // istanbul ignore if\r\n if (!imodelReport.hasOwnProperty(rulesetId))\r\n continue;\r\n\r\n const updateInfo = imodelReport[rulesetId];\r\n if (updateInfo.content)\r\n this.onIModelContentChanged.raiseEvent({ rulesetId, updateInfo: updateInfo.content, imodelKey });\r\n if (updateInfo.hierarchy)\r\n this.onIModelHierarchyChanged.raiseEvent({ rulesetId, updateInfo: updateInfo.hierarchy, imodelKey });\r\n }\r\n }\r\n }\r\n\r\n /** Function that is called when a new IModelConnection is used to retrieve data.\r\n * @internal\r\n */\r\n public async onNewiModelConnection(_: IModelConnection) { }\r\n\r\n /**\r\n * Create a new PresentationManager instance\r\n * @param props Optional properties used to configure the manager\r\n */\r\n public static create(props?: PresentationManagerProps) {\r\n return new PresentationManager(props);\r\n }\r\n\r\n /** @internal */\r\n public get rpcRequestsHandler() { return this._requestsHandler; }\r\n\r\n /** @internal */\r\n public get ipcRequestsHandler() { return this._ipcRequestsHandler; }\r\n\r\n /** @internal */\r\n public get stateTracker() { return this._stateTracker; }\r\n\r\n /**\r\n * Get rulesets manager\r\n */\r\n public rulesets() { return this._rulesets; }\r\n\r\n /**\r\n * Get ruleset variables manager for specific ruleset\r\n * @param rulesetId Id of the ruleset to get the vars manager for\r\n */\r\n public vars(rulesetId: string) {\r\n if (!this._rulesetVars.has(rulesetId)) {\r\n const varsManager = new RulesetVariablesManagerImpl(rulesetId, this._ipcRequestsHandler);\r\n this._rulesetVars.set(rulesetId, varsManager);\r\n }\r\n return this._rulesetVars.get(rulesetId)!;\r\n }\r\n\r\n private toRpcTokenOptions<TOptions extends { imodel: IModelConnection, locale?: string, unitSystem?: UnitSystemKey, rulesetVariables?: RulesetVariable[] }>(requestOptions: TOptions) {\r\n // 1. put default `locale` and `unitSystem`\r\n // 2. put all `requestOptions` members (if `locale` or `unitSystem` are set, they'll override the defaults put at #1)\r\n // 3. put `imodel` of type `IModelRpcProps` which overwrites the `imodel` from `requestOptions` put at #2\r\n const defaultOptions: Pick<TOptions, \"locale\" | \"unitSystem\"> = {};\r\n if (this.activeLocale)\r\n defaultOptions.locale = this.activeLocale;\r\n if (this.activeUnitSystem)\r\n defaultOptions.unitSystem = this.activeUnitSystem;\r\n\r\n const { imodel, rulesetVariables, ...rpcRequestOptions } = requestOptions;\r\n return {\r\n ...defaultOptions,\r\n ...rpcRequestOptions,\r\n ...(rulesetVariables ? { rulesetVariables: rulesetVariables.map(RulesetVariable.toJSON) } : {}),\r\n imodel: imodel.getRpcProps(),\r\n };\r\n }\r\n\r\n private async addRulesetAndVariablesToOptions<TOptions extends { rulesetOrId: Ruleset | string, rulesetVariables?: RulesetVariable[] }>(options: TOptions) {\r\n const { rulesetOrId, rulesetVariables } = options;\r\n let foundRulesetOrId: Ruleset | string;\r\n if (typeof rulesetOrId === \"object\") {\r\n foundRulesetOrId = rulesetOrId;\r\n } else {\r\n const foundRuleset = await this._rulesets.get(rulesetOrId);\r\n foundRulesetOrId = foundRuleset ? foundRuleset.toJSON() : rulesetOrId;\r\n }\r\n const rulesetId = (typeof foundRulesetOrId === \"object\") ? foundRulesetOrId.id : foundRulesetOrId;\r\n\r\n // All Id64Array variable values must be sorted for serialization to JSON to work. RulesetVariablesManager\r\n // sorts them before storing, so that part is taken care of, but we need to ensure that variables coming from\r\n // request options are also sorted.\r\n const variables = (rulesetVariables ?? []).map((variable) => {\r\n if (variable.type === VariableValueTypes.Id64Array)\r\n return { ...variable, value: OrderedId64Iterable.sortArray(variable.value) };\r\n return variable;\r\n });\r\n if (!this._ipcRequestsHandler) {\r\n // only need to add variables from variables manager if there's no IPC\r\n // handler - if there is one, the variables are already known by the backend\r\n variables.push(...this.vars(rulesetId).getAllVariables());\r\n }\r\n\r\n return { ...options, rulesetOrId: foundRulesetOrId, rulesetVariables: variables };\r\n }\r\n\r\n /** Retrieves nodes */\r\n public async getNodes(requestOptions: Paged<HierarchyRequestOptions<IModelConnection, NodeKey, RulesetVariable>> & ClientDiagnosticsAttribute): Promise<Node[]> {\r\n await this.onConnection(requestOptions.imodel);\r\n const options = await this.addRulesetAndVariablesToOptions(requestOptions);\r\n const rpcOptions = this.toRpcTokenOptions({ ...options, parentKey: optionalNodeKeyToJson(options.parentKey) });\r\n const result = await buildPagedArrayResponse(options.paging, async (partialPageOptions) => this._requestsHandler.getPagedNodes({ ...rpcOptions, paging: partialPageOptions }));\r\n return this._localizationHelper.getLocalizedNodes(result.items.map(Node.fromJSON));\r\n }\r\n\r\n /** Retrieves nodes count. */\r\n public async getNodesCount(requestOptions: HierarchyRequestOptions<IModelConnection, NodeKey, RulesetVariable> & ClientDiagnosticsAttribute): Promise<number> {\r\n await this.onConnection(requestOptions.imodel);\r\n const options = await this.addRulesetAndVariablesToOptions(requestOptions);\r\n const rpcOptions = this.toRpcTokenOptions({ ...options, parentKey: optionalNodeKeyToJson(options.parentKey) });\r\n return this._requestsHandler.getNodesCount(rpcOptions);\r\n }\r\n\r\n /** Retrieves total nodes count and a single page of nodes. */\r\n public async getNodesAndCount(requestOptions: Paged<HierarchyRequestOptions<IModelConnection, NodeKey, RulesetVariable>> & ClientDiagnosticsAttribute): Promise<{ count: number, nodes: Node[] }> {\r\n await this.onConnection(requestOptions.imodel);\r\n const options = await this.addRulesetAndVariablesToOptions(requestOptions);\r\n const rpcOptions = this.toRpcTokenOptions({ ...options, parentKey: optionalNodeKeyToJson(options.parentKey) });\r\n const result = await buildPagedArrayResponse(options.paging, async (partialPageOptions) => this._requestsHandler.getPagedNodes({ ...rpcOptions, paging: partialPageOptions }));\r\n return {\r\n count: result.total,\r\n nodes: this._localizationHelper.getLocalizedNodes(result.items.map(Node.fromJSON)),\r\n };\r\n }\r\n\r\n /** Retrieves paths from root nodes to children nodes according to specified keys. Intersecting paths will be merged. */\r\n public async getNodePaths(requestOptions: FilterByInstancePathsHierarchyRequestOptions<IModelConnection, RulesetVariable> & ClientDiagnosticsAttribute): Promise<NodePathElement[]> {\r\n await this.onConnection(requestOptions.imodel);\r\n const options = await this.addRulesetAndVariablesToOptions(requestOptions);\r\n const rpcOptions = this.toRpcTokenOptions({ ...options, instancePaths: options.instancePaths.map((p) => p.map(InstanceKey.toJSON)) });\r\n const result = await this._requestsHandler.getNodePaths(rpcOptions);\r\n return result.map(NodePathElement.fromJSON);\r\n }\r\n\r\n /** Retrieves paths from root nodes to nodes containing filter text in their label. */\r\n public async getFilteredNodePaths(requestOptions: FilterByTextHierarchyRequestOptions<IModelConnection, RulesetVariable> & ClientDiagnosticsAttribute): Promise<NodePathElement[]> {\r\n await this.onConnection(requestOptions.imodel);\r\n const options = await this.addRulesetAndVariablesToOptions(requestOptions);\r\n const result = await this._requestsHandler.getFilteredNodePaths(this.toRpcTokenOptions(options));\r\n return result.map(NodePathElement.fromJSON);\r\n }\r\n\r\n /**\r\n * Get all content sources for a given list of classes.\r\n * @beta\r\n */\r\n public async getContentSources(requestOptions: ContentSourcesRequestOptions<IModelConnection> & ClientDiagnosticsAttribute): Promise<SelectClassInfo[]> {\r\n await this.onConnection(requestOptions.imodel);\r\n const rpcOptions = this.toRpcTokenOptions(requestOptions);\r\n const result = await this._requestsHandler.getContentSources(rpcOptions);\r\n return SelectClassInfo.listFromCompressedJSON(result.sources, result.classesMap);\r\n }\r\n\r\n /** Retrieves the content descriptor which describes the content and can be used to customize it. */\r\n public async getContentDescriptor(requestOptions: ContentDescriptorRequestOptions<IModelConnection, KeySet, RulesetVariable> & ClientDiagnosticsAttribute): Promise<Descriptor | undefined> {\r\n await this.onConnection(requestOptions.imodel);\r\n const options = await this.addRulesetAndVariablesToOptions(requestOptions);\r\n const rpcOptions = this.toRpcTokenOptions({\r\n ...options,\r\n keys: stripTransientElementKeys(options.keys).toJSON(),\r\n });\r\n const result = await this._requestsHandler.getContentDescriptor(rpcOptions);\r\n return Descriptor.fromJSON(result);\r\n }\r\n\r\n /** Retrieves overall content set size. */\r\n public async getContentSetSize(requestOptions: ContentRequestOptions<IModelConnection, Descriptor | DescriptorOverrides, KeySet, RulesetVariable> & ClientDiagnosticsAttribute): Promise<number> {\r\n await this.onConnection(requestOptions.imodel);\r\n const options = await this.addRulesetAndVariablesToOptions(requestOptions);\r\n const rpcOptions = this.toRpcTokenOptions({\r\n ...options,\r\n descriptor: getDescriptorOverrides(requestOptions.descriptor),\r\n keys: stripTransientElementKeys(requestOptions.keys).toJSON(),\r\n });\r\n return this._requestsHandler.getContentSetSize(rpcOptions);\r\n }\r\n\r\n /** Retrieves content which consists of a content descriptor and a page of records. */\r\n public async getContent(requestOptions: Paged<ContentRequestOptions<IModelConnection, Descriptor | DescriptorOverrides, KeySet, RulesetVariable>> & ClientDiagnosticsAttribute): Promise<Content | undefined> {\r\n return (await this.getContentAndSize(requestOptions))?.content;\r\n }\r\n\r\n /** Retrieves content set size and content which consists of a content descriptor and a page of records. */\r\n public async getContentAndSize(requestOptions: Paged<ContentRequestOptions<IModelConnection, Descriptor | DescriptorOverrides, KeySet, RulesetVariable>> & ClientDiagnosticsAttribute): Promise<{ content: Content, size: number } | undefined> {\r\n await this.onConnection(requestOptions.imodel);\r\n const options = await this.addRulesetAndVariablesToOptions(requestOptions);\r\n const rpcOptions = this.toRpcTokenOptions({\r\n ...options,\r\n descriptor: getDescriptorOverrides(requestOptions.descriptor),\r\n keys: stripTransientElementKeys(requestOptions.keys).toJSON(),\r\n });\r\n let descriptor = (requestOptions.descriptor instanceof Descriptor) ? requestOptions.descriptor : undefined;\r\n const result = await buildPagedArrayResponse(options.paging, async (partialPageOptions, requestIndex) => {\r\n if (0 === requestIndex && !descriptor) {\r\n const content = await this._requestsHandler.getPagedContent({ ...rpcOptions, paging: partialPageOptions });\r\n if (content) {\r\n descriptor = Descriptor.fromJSON(content.descriptor);\r\n return content.contentSet;\r\n }\r\n return { total: 0, items: [] };\r\n }\r\n return this._requestsHandler.getPagedContentSet({ ...rpcOptions, paging: partialPageOptions });\r\n });\r\n if (!descriptor)\r\n return undefined;\r\n const items = result.items.map((itemJson) => Item.fromJSON(itemJson)).filter<Item>((item): item is Item => (item !== undefined));\r\n return {\r\n size: result.total,\r\n content: this._localizationHelper.getLocalizedContent(new Content(descriptor, items)),\r\n };\r\n }\r\n\r\n /** Retrieves distinct values of specific field from the content. */\r\n public async getPagedDistinctValues(requestOptions: DistinctValuesRequestOptions<IModelConnection, Descriptor | DescriptorOverrides, KeySet, RulesetVariable> & ClientDiagnosticsAttribute): Promise<PagedResponse<DisplayValueGroup>> {\r\n await this.onConnection(requestOptions.imodel);\r\n const options = await this.addRulesetAndVariablesToOptions(requestOptions);\r\n const rpcOptions = {\r\n ...this.toRpcTokenOptions(options),\r\n descriptor: getDescriptorOverrides(options.descriptor),\r\n keys: stripTransientElementKeys(options.keys).toJSON(),\r\n };\r\n const result = await buildPagedArrayResponse(requestOptions.paging, async (partialPageOptions) => this._requestsHandler.getPagedDistinctValues({ ...rpcOptions, paging: partialPageOptions }));\r\n return {\r\n ...result,\r\n items: result.items.map(DisplayValueGroup.fromJSON),\r\n };\r\n }\r\n\r\n /**\r\n * Retrieves property data in a simplified format for a single element specified by ID.\r\n * @beta\r\n */\r\n public async getElementProperties(requestOptions: SingleElementPropertiesRequestOptions<IModelConnection> & ClientDiagnosticsAttribute): Promise<ElementProperties | undefined> {\r\n await this.onConnection(requestOptions.imodel);\r\n const results = await this._requestsHandler.getElementProperties(this.toRpcTokenOptions(requestOptions));\r\n // istanbul ignore if\r\n if (!results)\r\n return undefined;\r\n return this._localizationHelper.getLocalizedElementProperties(results);\r\n }\r\n\r\n /**\r\n * Retrieves content item instance keys.\r\n * @beta\r\n */\r\n public async getContentInstanceKeys(requestOptions: ContentInstanceKeysRequestOptions<IModelConnection, KeySet, RulesetVariable> & ClientDiagnosticsAttribute): Promise<{ total: number, items: () => AsyncGenerator<InstanceKey> }> {\r\n await this.onConnection(requestOptions.imodel);\r\n const options = await this.addRulesetAndVariablesToOptions(requestOptions);\r\n const rpcOptions = {\r\n ...this.toRpcTokenOptions(options),\r\n keys: stripTransientElementKeys(options.keys).toJSON(),\r\n };\r\n\r\n const props = {\r\n page: requestOptions.paging,\r\n get: async (page: Required<PageOptions>) => {\r\n const keys = await this._requestsHandler.getContentInstanceKeys({ ...rpcOptions, paging: page });\r\n return {\r\n total: keys.total,\r\n items: keys.items.instanceKeys.reduce((instanceKeys, entry) => {\r\n for (const id of CompressedId64Set.iterable(entry[1])) {\r\n instanceKeys.push({ className: entry[0], id });\r\n }\r\n return instanceKeys;\r\n }, new Array<InstanceKey>()),\r\n };\r\n },\r\n };\r\n return createPagedGeneratorResponse(props);\r\n }\r\n\r\n /** Retrieves display label definition of specific item. */\r\n public async getDisplayLabelDefinition(requestOptions: DisplayLabelRequestOptions<IModelConnection, InstanceKey> & ClientDiagnosticsAttribute): Promise<LabelDefinition> {\r\n await this.onConnection(requestOptions.imodel);\r\n const rpcOptions = this.toRpcTokenOptions({ ...requestOptions, key: InstanceKey.toJSON(requestOptions.key) });\r\n const result = await this._requestsHandler.getDisplayLabelDefinition(rpcOptions);\r\n return this._localizationHelper.getLocalizedLabelDefinition(LabelDefinition.fromJSON(result));\r\n }\r\n\r\n /** Retrieves display label definition of specific items. */\r\n public async getDisplayLabelDefinitions(requestOptions: DisplayLabelsRequestOptions<IModelConnection, InstanceKey> & ClientDiagnosticsAttribute): Promise<LabelDefinition[]> {\r\n await this.onConnection(requestOptions.imodel);\r\n const rpcOptions = this.toRpcTokenOptions({ ...requestOptions, keys: requestOptions.keys.map(InstanceKey.toJSON) });\r\n const result = await buildPagedArrayResponse(undefined, async (partialPageOptions) => {\r\n const partialKeys = (!partialPageOptions.start) ? rpcOptions.keys : rpcOptions.keys.slice(partialPageOptions.start);\r\n return this._requestsHandler.getPagedDisplayLabelDefinitions({ ...rpcOptions, keys: partialKeys });\r\n });\r\n return this._localizationHelper.getLocalizedLabelDefinitions(result.items.map(LabelDefinition.fromJSON));\r\n }\r\n\r\n}\r\n\r\nconst getDescriptorOverrides = (descriptorOrOverrides: Descriptor | DescriptorOverrides): DescriptorOverrides => {\r\n if (descriptorOrOverrides instanceof Descriptor)\r\n return descriptorOrOverrides.createDescriptorOverrides();\r\n return descriptorOrOverrides;\r\n};\r\n\r\nconst optionalNodeKeyToJson = (key: NodeKey | undefined): NodeKeyJSON | undefined => key ? NodeKey.toJSON(key) : undefined;\r\n\r\ninterface PagedGeneratorCreateProps<TPagedResponseItem> {\r\n page: PageOptions | undefined;\r\n get: (pageStart: Required<PageOptions>, requestIndex: number) => Promise<{ total: number, items: TPagedResponseItem[] }>;\r\n}\r\nasync function createPagedGeneratorResponse<TPagedResponseItem>(props: PagedGeneratorCreateProps<TPagedResponseItem>) {\r\n let pageStart = props.page?.start ?? 0;\r\n let pageSize = props.page?.size ?? 0;\r\n let requestIndex = 0;\r\n\r\n const firstPage = await props.get({ start: pageStart, size: pageSize }, requestIndex++);\r\n return {\r\n total: firstPage.total,\r\n async *items() {\r\n let partialResult = firstPage;\r\n while (true) {\r\n for (const item of partialResult.items) {\r\n yield item;\r\n }\r\n\r\n const receivedItemsCount = partialResult.items.length;\r\n if (partialResult.total !== 0 && receivedItemsCount === 0) {\r\n if (pageStart >= partialResult.total)\r\n throw new Error(`Requested page with start index ${pageStart} is out of bounds. Total number of items: ${partialResult.total}`);\r\n throw new Error(\"Paged request returned non zero total count but no items\");\r\n }\r\n\r\n if (pageSize !== 0 && receivedItemsCount >= pageSize || receivedItemsCount >= (partialResult.total - pageStart))\r\n break;\r\n\r\n if (pageSize !== 0)\r\n pageSize -= receivedItemsCount;\r\n pageStart += receivedItemsCount;\r\n\r\n partialResult = await props.get({ start: pageStart, size: pageSize }, requestIndex++);\r\n }\r\n },\r\n };\r\n}\r\n\r\n/** @internal */\r\nexport const buildPagedArrayResponse = async <TItem>(requestedPage: PageOptions | undefined, getter: (page: Required<PageOptions>, requestIndex: number) => Promise<PagedResponse<TItem>>): Promise<PagedResponse<TItem>> => {\r\n try {\r\n const items = new Array<TItem>();\r\n const gen = await createPagedGeneratorResponse({ page: requestedPage, get: getter });\r\n for await (const item of gen.items()) {\r\n items.push(item);\r\n }\r\n return { total: gen.total, items };\r\n } catch {\r\n return { total: 0, items: [] };\r\n }\r\n};\r\n\r\nconst stripTransientElementKeys = (keys: KeySet) => {\r\n if (!keys.some((key) => Key.isInstanceKey(key) && key.className === TRANSIENT_ELEMENT_CLASSNAME))\r\n return keys;\r\n\r\n const copy = new KeySet();\r\n copy.add(keys, (key) => {\r\n // the callback is not going to be called with EntityProps as KeySet converts them\r\n // to InstanceKeys, but we want to keep the EntityProps case for correctness\r\n // istanbul ignore next\r\n const isTransient = Key.isInstanceKey(key) && key.className === TRANSIENT_ELEMENT_CLASSNAME\r\n || Key.isEntityProps(key) && key.classFullName === TRANSIENT_ELEMENT_CLASSNAME;\r\n return !isTransient;\r\n });\r\n return copy;\r\n};\r\n"]}