@itwin/presentation-frontend 5.0.0-dev.10 → 5.0.0-dev.102

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 (159) hide show
  1. package/CHANGELOG.md +58 -1
  2. package/lib/cjs/package.json +1 -0
  3. package/lib/cjs/presentation-frontend/ConnectivityInformationProvider.d.ts +3 -3
  4. package/lib/cjs/presentation-frontend/ConnectivityInformationProvider.d.ts.map +1 -1
  5. package/lib/cjs/presentation-frontend/ConnectivityInformationProvider.js +11 -9
  6. package/lib/cjs/presentation-frontend/ConnectivityInformationProvider.js.map +1 -1
  7. package/lib/cjs/presentation-frontend/IModelConnectionInitialization.d.ts +13 -0
  8. package/lib/cjs/presentation-frontend/IModelConnectionInitialization.d.ts.map +1 -0
  9. package/lib/cjs/presentation-frontend/IModelConnectionInitialization.js +22 -0
  10. package/lib/cjs/presentation-frontend/IModelConnectionInitialization.js.map +1 -0
  11. package/lib/cjs/presentation-frontend/InternalSymbols.d.ts +6 -0
  12. package/lib/cjs/presentation-frontend/InternalSymbols.d.ts.map +1 -0
  13. package/lib/cjs/presentation-frontend/InternalSymbols.js +17 -0
  14. package/lib/cjs/presentation-frontend/InternalSymbols.js.map +1 -0
  15. package/lib/cjs/presentation-frontend/IpcRequestsHandler.d.ts +12 -3
  16. package/lib/cjs/presentation-frontend/IpcRequestsHandler.d.ts.map +1 -1
  17. package/lib/cjs/presentation-frontend/IpcRequestsHandler.js +7 -7
  18. package/lib/cjs/presentation-frontend/IpcRequestsHandler.js.map +1 -1
  19. package/lib/cjs/presentation-frontend/LocalizationHelper.d.ts +1 -1
  20. package/lib/cjs/presentation-frontend/LocalizationHelper.d.ts.map +1 -1
  21. package/lib/cjs/presentation-frontend/LocalizationHelper.js +7 -6
  22. package/lib/cjs/presentation-frontend/LocalizationHelper.js.map +1 -1
  23. package/lib/cjs/presentation-frontend/Presentation.d.ts +15 -14
  24. package/lib/cjs/presentation-frontend/Presentation.d.ts.map +1 -1
  25. package/lib/cjs/presentation-frontend/Presentation.js +31 -45
  26. package/lib/cjs/presentation-frontend/Presentation.js.map +1 -1
  27. package/lib/cjs/presentation-frontend/PresentationManager.d.ts +12 -23
  28. package/lib/cjs/presentation-frontend/PresentationManager.d.ts.map +1 -1
  29. package/lib/cjs/presentation-frontend/PresentationManager.js +77 -74
  30. package/lib/cjs/presentation-frontend/PresentationManager.js.map +1 -1
  31. package/lib/cjs/presentation-frontend/RulesetManager.js +2 -4
  32. package/lib/cjs/presentation-frontend/RulesetManager.js.map +1 -1
  33. package/lib/cjs/presentation-frontend/RulesetVariablesManager.d.ts +2 -4
  34. package/lib/cjs/presentation-frontend/RulesetVariablesManager.d.ts.map +1 -1
  35. package/lib/cjs/presentation-frontend/RulesetVariablesManager.js +6 -4
  36. package/lib/cjs/presentation-frontend/RulesetVariablesManager.js.map +1 -1
  37. package/lib/cjs/presentation-frontend/StreamedResponseGenerator.d.ts +1 -1
  38. package/lib/cjs/presentation-frontend/StreamedResponseGenerator.d.ts.map +1 -1
  39. package/lib/cjs/presentation-frontend/StreamedResponseGenerator.js +1 -0
  40. package/lib/cjs/presentation-frontend/StreamedResponseGenerator.js.map +1 -1
  41. package/lib/cjs/presentation-frontend/favorite-properties/FavoritePropertiesManager.d.ts +9 -19
  42. package/lib/cjs/presentation-frontend/favorite-properties/FavoritePropertiesManager.d.ts.map +1 -1
  43. package/lib/cjs/presentation-frontend/favorite-properties/FavoritePropertiesManager.js +163 -153
  44. package/lib/cjs/presentation-frontend/favorite-properties/FavoritePropertiesManager.js.map +1 -1
  45. package/lib/cjs/presentation-frontend/favorite-properties/FavoritePropertiesStorage.d.ts +4 -5
  46. package/lib/cjs/presentation-frontend/favorite-properties/FavoritePropertiesStorage.d.ts.map +1 -1
  47. package/lib/cjs/presentation-frontend/favorite-properties/FavoritePropertiesStorage.js +27 -29
  48. package/lib/cjs/presentation-frontend/favorite-properties/FavoritePropertiesStorage.js.map +1 -1
  49. package/lib/cjs/presentation-frontend/selection/HiliteSetProvider.d.ts +3 -0
  50. package/lib/cjs/presentation-frontend/selection/HiliteSetProvider.d.ts.map +1 -1
  51. package/lib/cjs/presentation-frontend/selection/HiliteSetProvider.js +8 -2
  52. package/lib/cjs/presentation-frontend/selection/HiliteSetProvider.js.map +1 -1
  53. package/lib/cjs/presentation-frontend/selection/ISelectionProvider.d.ts +2 -1
  54. package/lib/cjs/presentation-frontend/selection/ISelectionProvider.d.ts.map +1 -1
  55. package/lib/cjs/presentation-frontend/selection/ISelectionProvider.js +1 -0
  56. package/lib/cjs/presentation-frontend/selection/ISelectionProvider.js.map +1 -1
  57. package/lib/cjs/presentation-frontend/selection/SelectionChangeEvent.d.ts +5 -1
  58. package/lib/cjs/presentation-frontend/selection/SelectionChangeEvent.d.ts.map +1 -1
  59. package/lib/cjs/presentation-frontend/selection/SelectionChangeEvent.js +3 -0
  60. package/lib/cjs/presentation-frontend/selection/SelectionChangeEvent.js.map +1 -1
  61. package/lib/cjs/presentation-frontend/selection/SelectionHandler.d.ts +8 -5
  62. package/lib/cjs/presentation-frontend/selection/SelectionHandler.d.ts.map +1 -1
  63. package/lib/cjs/presentation-frontend/selection/SelectionHandler.js +35 -13
  64. package/lib/cjs/presentation-frontend/selection/SelectionHandler.js.map +1 -1
  65. package/lib/cjs/presentation-frontend/selection/SelectionHelper.d.ts +2 -0
  66. package/lib/cjs/presentation-frontend/selection/SelectionHelper.d.ts.map +1 -1
  67. package/lib/cjs/presentation-frontend/selection/SelectionHelper.js +3 -1
  68. package/lib/cjs/presentation-frontend/selection/SelectionHelper.js.map +1 -1
  69. package/lib/cjs/presentation-frontend/selection/SelectionManager.d.ts +31 -13
  70. package/lib/cjs/presentation-frontend/selection/SelectionManager.d.ts.map +1 -1
  71. package/lib/cjs/presentation-frontend/selection/SelectionManager.js +216 -116
  72. package/lib/cjs/presentation-frontend/selection/SelectionManager.js.map +1 -1
  73. package/lib/cjs/presentation-frontend/selection/SelectionScopesManager.d.ts +11 -9
  74. package/lib/cjs/presentation-frontend/selection/SelectionScopesManager.d.ts.map +1 -1
  75. package/lib/cjs/presentation-frontend/selection/SelectionScopesManager.js +6 -11
  76. package/lib/cjs/presentation-frontend/selection/SelectionScopesManager.js.map +1 -1
  77. package/lib/cjs/presentation-frontend.d.ts +15 -15
  78. package/lib/cjs/presentation-frontend.d.ts.map +1 -1
  79. package/lib/cjs/presentation-frontend.js +30 -29
  80. package/lib/cjs/presentation-frontend.js.map +1 -1
  81. package/lib/esm/presentation-frontend/ConnectivityInformationProvider.d.ts +3 -3
  82. package/lib/esm/presentation-frontend/ConnectivityInformationProvider.d.ts.map +1 -1
  83. package/lib/esm/presentation-frontend/ConnectivityInformationProvider.js +11 -9
  84. package/lib/esm/presentation-frontend/ConnectivityInformationProvider.js.map +1 -1
  85. package/lib/esm/presentation-frontend/IModelConnectionInitialization.d.ts +13 -0
  86. package/lib/esm/presentation-frontend/IModelConnectionInitialization.d.ts.map +1 -0
  87. package/lib/esm/presentation-frontend/IModelConnectionInitialization.js +17 -0
  88. package/lib/esm/presentation-frontend/IModelConnectionInitialization.js.map +1 -0
  89. package/lib/esm/presentation-frontend/InternalSymbols.d.ts +6 -0
  90. package/lib/esm/presentation-frontend/InternalSymbols.d.ts.map +1 -0
  91. package/lib/esm/presentation-frontend/InternalSymbols.js +14 -0
  92. package/lib/esm/presentation-frontend/InternalSymbols.js.map +1 -0
  93. package/lib/esm/presentation-frontend/IpcRequestsHandler.d.ts +12 -3
  94. package/lib/esm/presentation-frontend/IpcRequestsHandler.d.ts.map +1 -1
  95. package/lib/esm/presentation-frontend/IpcRequestsHandler.js +8 -8
  96. package/lib/esm/presentation-frontend/IpcRequestsHandler.js.map +1 -1
  97. package/lib/esm/presentation-frontend/LocalizationHelper.d.ts +1 -1
  98. package/lib/esm/presentation-frontend/LocalizationHelper.d.ts.map +1 -1
  99. package/lib/esm/presentation-frontend/LocalizationHelper.js +3 -2
  100. package/lib/esm/presentation-frontend/LocalizationHelper.js.map +1 -1
  101. package/lib/esm/presentation-frontend/Presentation.d.ts +15 -14
  102. package/lib/esm/presentation-frontend/Presentation.d.ts.map +1 -1
  103. package/lib/esm/presentation-frontend/Presentation.js +24 -38
  104. package/lib/esm/presentation-frontend/Presentation.js.map +1 -1
  105. package/lib/esm/presentation-frontend/PresentationManager.d.ts +12 -23
  106. package/lib/esm/presentation-frontend/PresentationManager.d.ts.map +1 -1
  107. package/lib/esm/presentation-frontend/PresentationManager.js +66 -63
  108. package/lib/esm/presentation-frontend/PresentationManager.js.map +1 -1
  109. package/lib/esm/presentation-frontend/RulesetManager.js +2 -4
  110. package/lib/esm/presentation-frontend/RulesetManager.js.map +1 -1
  111. package/lib/esm/presentation-frontend/RulesetVariablesManager.d.ts +2 -4
  112. package/lib/esm/presentation-frontend/RulesetVariablesManager.d.ts.map +1 -1
  113. package/lib/esm/presentation-frontend/RulesetVariablesManager.js +6 -4
  114. package/lib/esm/presentation-frontend/RulesetVariablesManager.js.map +1 -1
  115. package/lib/esm/presentation-frontend/StreamedResponseGenerator.d.ts +1 -1
  116. package/lib/esm/presentation-frontend/StreamedResponseGenerator.d.ts.map +1 -1
  117. package/lib/esm/presentation-frontend/StreamedResponseGenerator.js +1 -0
  118. package/lib/esm/presentation-frontend/StreamedResponseGenerator.js.map +1 -1
  119. package/lib/esm/presentation-frontend/favorite-properties/FavoritePropertiesManager.d.ts +9 -19
  120. package/lib/esm/presentation-frontend/favorite-properties/FavoritePropertiesManager.d.ts.map +1 -1
  121. package/lib/esm/presentation-frontend/favorite-properties/FavoritePropertiesManager.js +164 -154
  122. package/lib/esm/presentation-frontend/favorite-properties/FavoritePropertiesManager.js.map +1 -1
  123. package/lib/esm/presentation-frontend/favorite-properties/FavoritePropertiesStorage.d.ts +4 -5
  124. package/lib/esm/presentation-frontend/favorite-properties/FavoritePropertiesStorage.d.ts.map +1 -1
  125. package/lib/esm/presentation-frontend/favorite-properties/FavoritePropertiesStorage.js +27 -29
  126. package/lib/esm/presentation-frontend/favorite-properties/FavoritePropertiesStorage.js.map +1 -1
  127. package/lib/esm/presentation-frontend/selection/HiliteSetProvider.d.ts +3 -0
  128. package/lib/esm/presentation-frontend/selection/HiliteSetProvider.d.ts.map +1 -1
  129. package/lib/esm/presentation-frontend/selection/HiliteSetProvider.js +8 -2
  130. package/lib/esm/presentation-frontend/selection/HiliteSetProvider.js.map +1 -1
  131. package/lib/esm/presentation-frontend/selection/ISelectionProvider.d.ts +2 -1
  132. package/lib/esm/presentation-frontend/selection/ISelectionProvider.d.ts.map +1 -1
  133. package/lib/esm/presentation-frontend/selection/ISelectionProvider.js +1 -0
  134. package/lib/esm/presentation-frontend/selection/ISelectionProvider.js.map +1 -1
  135. package/lib/esm/presentation-frontend/selection/SelectionChangeEvent.d.ts +5 -1
  136. package/lib/esm/presentation-frontend/selection/SelectionChangeEvent.d.ts.map +1 -1
  137. package/lib/esm/presentation-frontend/selection/SelectionChangeEvent.js +3 -0
  138. package/lib/esm/presentation-frontend/selection/SelectionChangeEvent.js.map +1 -1
  139. package/lib/esm/presentation-frontend/selection/SelectionHandler.d.ts +8 -5
  140. package/lib/esm/presentation-frontend/selection/SelectionHandler.d.ts.map +1 -1
  141. package/lib/esm/presentation-frontend/selection/SelectionHandler.js +35 -13
  142. package/lib/esm/presentation-frontend/selection/SelectionHandler.js.map +1 -1
  143. package/lib/esm/presentation-frontend/selection/SelectionHelper.d.ts +2 -0
  144. package/lib/esm/presentation-frontend/selection/SelectionHelper.d.ts.map +1 -1
  145. package/lib/esm/presentation-frontend/selection/SelectionHelper.js +3 -1
  146. package/lib/esm/presentation-frontend/selection/SelectionHelper.js.map +1 -1
  147. package/lib/esm/presentation-frontend/selection/SelectionManager.d.ts +31 -13
  148. package/lib/esm/presentation-frontend/selection/SelectionManager.d.ts.map +1 -1
  149. package/lib/esm/presentation-frontend/selection/SelectionManager.js +202 -102
  150. package/lib/esm/presentation-frontend/selection/SelectionManager.js.map +1 -1
  151. package/lib/esm/presentation-frontend/selection/SelectionScopesManager.d.ts +11 -9
  152. package/lib/esm/presentation-frontend/selection/SelectionScopesManager.d.ts.map +1 -1
  153. package/lib/esm/presentation-frontend/selection/SelectionScopesManager.js +7 -11
  154. package/lib/esm/presentation-frontend/selection/SelectionScopesManager.js.map +1 -1
  155. package/lib/esm/presentation-frontend.d.ts +15 -15
  156. package/lib/esm/presentation-frontend.d.ts.map +1 -1
  157. package/lib/esm/presentation-frontend.js +12 -15
  158. package/lib/esm/presentation-frontend.js.map +1 -1
  159. package/package.json +42 -42
@@ -5,8 +5,9 @@
5
5
  /** @packageDocumentation
6
6
  * @module Core
7
7
  */
8
- import { BeEvent, isIDisposable } from "@itwin/core-bentley";
8
+ import { BeEvent, isDisposable, isIDisposable } from "@itwin/core-bentley";
9
9
  import { QueryRowFormat } from "@itwin/core-common";
10
+ import { imodelInitializationHandlers } from "../IModelConnectionInitialization.js";
10
11
  /**
11
12
  * Scopes that favorite properties can be stored in.
12
13
  * @public
@@ -24,139 +25,95 @@ export var FavoritePropertiesScope;
24
25
  * @public
25
26
  */
26
27
  export class FavoritePropertiesManager {
28
+ /** Event raised after favorite properties have changed. */
29
+ onFavoritesChanged = new BeEvent();
30
+ storage;
31
+ _globalProperties;
32
+ _iTwinProperties;
33
+ _imodelProperties;
34
+ _imodelBaseClassesByClass;
35
+ _imodelInitializationPromises;
36
+ _imodelInitializationHandler;
37
+ /** Property order is saved only in iModel scope */
38
+ _propertiesOrder;
27
39
  constructor(props) {
28
- /** Event raised after favorite properties have changed. */
29
- this.onFavoritesChanged = new BeEvent();
30
- /**
31
- * Initialize favorite properties for the provided IModelConnection.
32
- * @deprecated in 4.5. Initialization is performed automatically by all async methods and only needed for deprecated [[FavoritePropertiesManager.has]] and [[FavoritePropertiesManager.sortFields]].
33
- */
34
- this.initializeConnection = async (imodel) => {
35
- const imodelId = imodel.iModelId;
36
- const iTwinId = imodel.iTwinId;
37
- if (this._globalProperties === undefined) {
38
- this._globalProperties = (await this._storage.loadProperties()) || new Set();
39
- }
40
- if (!this._iTwinProperties.has(iTwinId)) {
41
- const iTwinProperties = (await this._storage.loadProperties(iTwinId)) || new Set();
42
- this._iTwinProperties.set(iTwinId, iTwinProperties);
43
- }
44
- if (!this._imodelProperties.has(getiModelInfo(iTwinId, imodelId))) {
45
- const imodelProperties = (await this._storage.loadProperties(iTwinId, imodelId)) || new Set();
46
- this._imodelProperties.set(getiModelInfo(iTwinId, imodelId), imodelProperties);
47
- }
48
- const propertiesOrder = (await this._storage.loadPropertiesOrder(iTwinId, imodelId)) || [];
49
- this._propertiesOrder.set(getiModelInfo(iTwinId, imodelId), propertiesOrder);
50
- await this._adjustPropertyOrderInfos(iTwinId, imodelId);
51
- };
52
- /**
53
- * Function that removes order information of properties that are no longer
54
- * favorited and adds missing order information for favorited properties.
55
- */
56
- this._adjustPropertyOrderInfos = async (iTwinId, imodelId) => {
57
- const propertiesOrder = this._propertiesOrder.get(getiModelInfo(iTwinId, imodelId));
58
- const globalProperties = this._globalProperties;
59
- const iTwinProperties = this._iTwinProperties.get(iTwinId);
60
- const imodelProperties = this._imodelProperties.get(getiModelInfo(iTwinId, imodelId));
61
- // favorite property infos that need to be added to the propertiesOrder array
62
- const infosToAdd = new Set([...globalProperties, ...iTwinProperties, ...imodelProperties]);
63
- for (let i = propertiesOrder.length - 1; i >= 0; i--) {
64
- if (infosToAdd.has(propertiesOrder[i].name)) {
65
- infosToAdd.delete(propertiesOrder[i].name);
66
- }
67
- else {
68
- propertiesOrder.splice(i, 1);
69
- }
70
- }
71
- infosToAdd.forEach((info) => propertiesOrder.push({
72
- name: info,
73
- parentClassName: getPropertyClassName(info),
74
- orderedTimestamp: new Date(),
75
- priority: 0,
76
- }));
77
- let priority = propertiesOrder.length;
78
- propertiesOrder.forEach((oi) => (oi.priority = priority--));
79
- };
80
- /**
81
- * Sorts an array of fields with respect to favorite property order.
82
- * Non-favorited fields get sorted by their default priority and always have lower priority than favorited fields.
83
- * @param imodel IModelConnection.
84
- * @param fields Array of Field's that needs to be sorted.
85
- * @note `initializeConnection` must be called with the `imodel` before calling this function.
86
- * @deprecated in 4.5. Use [[FavoritePropertiesManager.sortFieldsAsync]] instead. This method is not async, therefore it requires early initialization by calling [[FavoritePropertiesManager.initializeConnection]].
87
- */
88
- this.sortFields = (imodel, fields) => {
89
- this.validateInitialization(imodel);
90
- const iTwinId = imodel.iTwinId;
91
- const imodelId = imodel.iModelId;
92
- const fieldPriority = new Map();
93
- fields.forEach((field) => fieldPriority.set(field, this.getFieldPriority(field, iTwinId, imodelId)));
94
- const sortFunction = (left, right) => {
95
- const lp = fieldPriority.get(left);
96
- const rp = fieldPriority.get(right);
97
- return lp < rp
98
- ? 1
99
- : lp > rp
100
- ? -1
101
- : left.priority < right.priority
102
- ? 1 // if favorite fields have equal priorities, sort by field priority
103
- : left.priority > right.priority
104
- ? -1
105
- : left.name.localeCompare(right.name);
106
- };
107
- return fields.sort(sortFunction);
108
- };
109
- this._getBaseClassesByClass = async (imodel, neededClasses) => {
110
- const iTwinId = imodel.iTwinId;
111
- const imodelId = imodel.iModelId;
112
- const imodelInfo = getiModelInfo(iTwinId, imodelId);
113
- let baseClasses;
114
- if (this._imodelBaseClassesByClass.has(imodelInfo)) {
115
- baseClasses = this._imodelBaseClassesByClass.get(imodelInfo);
116
- }
117
- else {
118
- this._imodelBaseClassesByClass.set(imodelInfo, (baseClasses = {}));
119
- }
120
- const missingClasses = new Set();
121
- neededClasses.forEach((className) => {
122
- if (!baseClasses.hasOwnProperty(className)) {
123
- missingClasses.add(className);
124
- }
125
- });
126
- if (missingClasses.size === 0) {
127
- return baseClasses;
128
- }
129
- const query = `
130
- SELECT (derivedSchema.Name || ':' || derivedClass.Name) AS "ClassFullName", (baseSchema.Name || ':' || baseClass.Name) AS "BaseClassFullName"
131
- FROM ECDbMeta.ClassHasAllBaseClasses baseClassRels
132
- INNER JOIN ECDbMeta.ECClassDef derivedClass ON derivedClass.ECInstanceId = baseClassRels.SourceECInstanceId
133
- INNER JOIN ECDbMeta.ECSchemaDef derivedSchema ON derivedSchema.ECInstanceId = derivedClass.Schema.Id
134
- INNER JOIN ECDbMeta.ECClassDef baseClass ON baseClass.ECInstanceId = baseClassRels.TargetECInstanceId
135
- INNER JOIN ECDbMeta.ECSchemaDef baseSchema ON baseSchema.ECInstanceId = baseClass.Schema.Id
136
- WHERE (derivedSchema.Name || ':' || derivedClass.Name) IN (${[...missingClasses].map((className) => `'${className}'`).join(",")})`;
137
- const reader = imodel.createQueryReader(query, undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames });
138
- while (await reader.step()) {
139
- const row = reader.current.toRow();
140
- if (!(row.classFullName in baseClasses)) {
141
- baseClasses[row.classFullName] = [];
142
- }
143
- baseClasses[row.classFullName].push(row.baseClassFullName);
144
- }
145
- return baseClasses;
146
- };
147
- this._storage = props.storage;
40
+ this.storage = props.storage;
148
41
  this._iTwinProperties = new Map();
149
42
  this._imodelProperties = new Map();
150
43
  this._propertiesOrder = new Map();
151
44
  this._imodelBaseClassesByClass = new Map();
152
45
  this._imodelInitializationPromises = new Map();
46
+ imodelInitializationHandlers.add((this._imodelInitializationHandler = {
47
+ startInitialization: (imodel) => this.startConnectionInitialization(imodel),
48
+ ensureInitialized: async (imodel) => this.ensureInitialized(imodel),
49
+ }));
153
50
  }
154
- dispose() {
155
- // istanbul ignore else
156
- if (isIDisposable(this._storage)) {
157
- this._storage.dispose();
51
+ [Symbol.dispose]() {
52
+ imodelInitializationHandlers.delete(this._imodelInitializationHandler);
53
+ if (isDisposable(this.storage)) {
54
+ this.storage[Symbol.dispose]();
55
+ /* c8 ignore next 4 */
56
+ /* eslint-disable-next-line @typescript-eslint/no-deprecated */
57
+ }
58
+ else if (isIDisposable(this.storage)) {
59
+ this.storage.dispose();
158
60
  }
159
61
  }
62
+ /** @deprecated in 5.0 Use [Symbol.dispose] instead. */
63
+ /* c8 ignore next 3 */
64
+ dispose() {
65
+ this[Symbol.dispose]();
66
+ }
67
+ /**
68
+ * Initialize favorite properties for the provided IModelConnection.
69
+ * @deprecated in 4.5. Initialization is performed automatically by all async methods and only needed for deprecated [[FavoritePropertiesManager.has]] and [[FavoritePropertiesManager.sortFields]].
70
+ */
71
+ initializeConnection = async (imodel) => {
72
+ const imodelId = imodel.iModelId;
73
+ const iTwinId = imodel.iTwinId;
74
+ if (this._globalProperties === undefined) {
75
+ this._globalProperties = (await this.storage.loadProperties()) || new Set();
76
+ }
77
+ if (!this._iTwinProperties.has(iTwinId)) {
78
+ const iTwinProperties = (await this.storage.loadProperties(iTwinId)) || new Set();
79
+ this._iTwinProperties.set(iTwinId, iTwinProperties);
80
+ }
81
+ if (!this._imodelProperties.has(getiModelInfo(iTwinId, imodelId))) {
82
+ const imodelProperties = (await this.storage.loadProperties(iTwinId, imodelId)) || new Set();
83
+ this._imodelProperties.set(getiModelInfo(iTwinId, imodelId), imodelProperties);
84
+ }
85
+ const propertiesOrder = (await this.storage.loadPropertiesOrder(iTwinId, imodelId)) || [];
86
+ this._propertiesOrder.set(getiModelInfo(iTwinId, imodelId), propertiesOrder);
87
+ await this._adjustPropertyOrderInfos(iTwinId, imodelId);
88
+ };
89
+ /**
90
+ * Function that removes order information of properties that are no longer
91
+ * favorited and adds missing order information for favorited properties.
92
+ */
93
+ _adjustPropertyOrderInfos = async (iTwinId, imodelId) => {
94
+ const propertiesOrder = this._propertiesOrder.get(getiModelInfo(iTwinId, imodelId));
95
+ const globalProperties = this._globalProperties;
96
+ const iTwinProperties = this._iTwinProperties.get(iTwinId);
97
+ const imodelProperties = this._imodelProperties.get(getiModelInfo(iTwinId, imodelId));
98
+ // favorite property infos that need to be added to the propertiesOrder array
99
+ const infosToAdd = new Set([...globalProperties, ...iTwinProperties, ...imodelProperties]);
100
+ for (let i = propertiesOrder.length - 1; i >= 0; i--) {
101
+ if (infosToAdd.has(propertiesOrder[i].name)) {
102
+ infosToAdd.delete(propertiesOrder[i].name);
103
+ }
104
+ else {
105
+ propertiesOrder.splice(i, 1);
106
+ }
107
+ }
108
+ infosToAdd.forEach((info) => propertiesOrder.push({
109
+ name: info,
110
+ parentClassName: getPropertyClassName(info),
111
+ orderedTimestamp: new Date(),
112
+ priority: 0,
113
+ }));
114
+ let priority = propertiesOrder.length;
115
+ propertiesOrder.forEach((oi) => (oi.priority = priority--));
116
+ };
160
117
  isInitialized(imodel) {
161
118
  const iTwinId = imodel.iTwinId;
162
119
  const imodelId = imodel.iModelId;
@@ -173,20 +130,12 @@ export class FavoritePropertiesManager {
173
130
  throw Error(`Favorite properties are not initialized for iModel: '${imodelId}', in iTwin: '${iTwinId}'. Call initializeConnection() with an IModelConnection to initialize.`);
174
131
  }
175
132
  }
176
- /**
177
- * Calls [[FavoritePropertiesManager.initializeConnection]] and caches the promise which should be awaited by calling [[FavoritePropertiesManager.ensureInitialized]].
178
- * @internal
179
- */
180
133
  startConnectionInitialization(imodel) {
181
134
  if (!this.isInitialized(imodel) && !this._imodelInitializationPromises.has(imodel)) {
182
135
  // eslint-disable-next-line @typescript-eslint/no-deprecated
183
136
  this._imodelInitializationPromises.set(imodel, this.initializeConnection(imodel));
184
137
  }
185
138
  }
186
- /**
187
- * Performs the initialization process or finishes the one that was started by [[FavoritePropertiesManager.startConnectionInitialization]].
188
- * @internal
189
- */
190
139
  async ensureInitialized(imodel) {
191
140
  if (this.isInitialized(imodel)) {
192
141
  return;
@@ -217,15 +166,15 @@ export class FavoritePropertiesManager {
217
166
  switch (scope) {
218
167
  case FavoritePropertiesScope.Global:
219
168
  favoriteProperties = this._globalProperties;
220
- saveProperties = async (properties) => this._storage.saveProperties(properties);
169
+ saveProperties = async (properties) => this.storage.saveProperties(properties);
221
170
  break;
222
171
  case FavoritePropertiesScope.ITwin:
223
172
  favoriteProperties = this._iTwinProperties.get(iTwinId);
224
- saveProperties = async (properties) => this._storage.saveProperties(properties, iTwinId);
173
+ saveProperties = async (properties) => this.storage.saveProperties(properties, iTwinId);
225
174
  break;
226
175
  default:
227
176
  favoriteProperties = this._imodelProperties.get(getiModelInfo(iTwinId, imodelId));
228
- saveProperties = async (properties) => this._storage.saveProperties(properties, iTwinId, imodelId);
177
+ saveProperties = async (properties) => this.storage.saveProperties(properties, iTwinId, imodelId);
229
178
  }
230
179
  const countBefore = favoriteProperties.size;
231
180
  const fieldInfos = getFieldInfos(field);
@@ -235,7 +184,7 @@ export class FavoritePropertiesManager {
235
184
  saves.push(saveProperties(favoriteProperties));
236
185
  const propertiesOrder = this._propertiesOrder.get(getiModelInfo(iTwinId, imodelId));
237
186
  addOrderInfos(propertiesOrder, createFieldOrderInfos(field));
238
- saves.push(this._storage.savePropertiesOrder(propertiesOrder, iTwinId, imodelId));
187
+ saves.push(this.storage.savePropertiesOrder(propertiesOrder, iTwinId, imodelId));
239
188
  await Promise.all(saves);
240
189
  this.onFavoritesChanged.raiseEvent();
241
190
  }
@@ -254,18 +203,18 @@ export class FavoritePropertiesManager {
254
203
  const workingScopes = [];
255
204
  workingScopes.push({
256
205
  properties: this._globalProperties,
257
- save: async (properties) => this._storage.saveProperties(properties),
206
+ save: async (properties) => this.storage.saveProperties(properties),
258
207
  });
259
208
  if (scope === FavoritePropertiesScope.ITwin || scope === FavoritePropertiesScope.IModel) {
260
209
  workingScopes.push({
261
210
  properties: this._iTwinProperties.get(iTwinId),
262
- save: async (properties) => this._storage.saveProperties(properties, iTwinId),
211
+ save: async (properties) => this.storage.saveProperties(properties, iTwinId),
263
212
  });
264
213
  }
265
214
  if (scope === FavoritePropertiesScope.IModel) {
266
215
  workingScopes.push({
267
216
  properties: this._imodelProperties.get(getiModelInfo(iTwinId, imodelId)),
268
- save: async (properties) => this._storage.saveProperties(properties, iTwinId, imodelId),
217
+ save: async (properties) => this.storage.saveProperties(properties, iTwinId, imodelId),
269
218
  });
270
219
  }
271
220
  const saves = [];
@@ -283,7 +232,7 @@ export class FavoritePropertiesManager {
283
232
  }
284
233
  const propertiesOrder = this._propertiesOrder.get(getiModelInfo(iTwinId, imodelId));
285
234
  removeOrderInfos(propertiesOrder, createFieldOrderInfos(field));
286
- saves.push(this._storage.savePropertiesOrder(propertiesOrder, iTwinId, imodelId));
235
+ saves.push(this.storage.savePropertiesOrder(propertiesOrder, iTwinId, imodelId));
287
236
  await Promise.all(saves);
288
237
  this.onFavoritesChanged.raiseEvent();
289
238
  }
@@ -301,15 +250,15 @@ export class FavoritePropertiesManager {
301
250
  switch (scope) {
302
251
  case FavoritePropertiesScope.Global:
303
252
  favoriteProperties = this._globalProperties;
304
- saveProperties = async () => this._storage.saveProperties(new Set());
253
+ saveProperties = async () => this.storage.saveProperties(new Set());
305
254
  break;
306
255
  case FavoritePropertiesScope.ITwin:
307
256
  favoriteProperties = this._iTwinProperties.get(iTwinId);
308
- saveProperties = async () => this._storage.saveProperties(new Set(), iTwinId);
257
+ saveProperties = async () => this.storage.saveProperties(new Set(), iTwinId);
309
258
  break;
310
259
  default:
311
260
  favoriteProperties = this._imodelProperties.get(getiModelInfo(iTwinId, imodelId));
312
- saveProperties = async () => this._storage.saveProperties(new Set(), iTwinId, imodelId);
261
+ saveProperties = async () => this.storage.saveProperties(new Set(), iTwinId, imodelId);
313
262
  }
314
263
  if (favoriteProperties.size === 0) {
315
264
  return;
@@ -349,6 +298,35 @@ export class FavoritePropertiesManager {
349
298
  // eslint-disable-next-line @typescript-eslint/no-deprecated
350
299
  return this.has(field, imodel, scope);
351
300
  }
301
+ /**
302
+ * Sorts an array of fields with respect to favorite property order.
303
+ * Non-favorited fields get sorted by their default priority and always have lower priority than favorited fields.
304
+ * @param imodel IModelConnection.
305
+ * @param fields Array of Field's that needs to be sorted.
306
+ * @note `initializeConnection` must be called with the `imodel` before calling this function.
307
+ * @deprecated in 4.5. Use [[FavoritePropertiesManager.sortFieldsAsync]] instead. This method is not async, therefore it requires early initialization by calling [[FavoritePropertiesManager.initializeConnection]].
308
+ */
309
+ sortFields = (imodel, fields) => {
310
+ this.validateInitialization(imodel);
311
+ const iTwinId = imodel.iTwinId;
312
+ const imodelId = imodel.iModelId;
313
+ const fieldPriority = new Map();
314
+ fields.forEach((field) => fieldPriority.set(field, this.getFieldPriority(field, iTwinId, imodelId)));
315
+ const sortFunction = (left, right) => {
316
+ const lp = fieldPriority.get(left);
317
+ const rp = fieldPriority.get(right);
318
+ return lp < rp
319
+ ? 1
320
+ : lp > rp
321
+ ? -1
322
+ : left.priority < right.priority
323
+ ? 1 // if favorite fields have equal priorities, sort by field priority
324
+ : left.priority > right.priority
325
+ ? -1
326
+ : left.name.localeCompare(right.name);
327
+ };
328
+ return fields.sort(sortFunction);
329
+ };
352
330
  /**
353
331
  * Sorts an array of fields with respect to favorite property order.
354
332
  * Non-favorited fields get sorted by their default priority and always have lower priority than favorited fields.
@@ -369,6 +347,44 @@ export class FavoritePropertiesManager {
369
347
  const mostRecent = getMostRecentOrderInfo(fieldOrderInfos);
370
348
  return mostRecent.priority;
371
349
  }
350
+ _getBaseClassesByClass = async (imodel, neededClasses) => {
351
+ const iTwinId = imodel.iTwinId;
352
+ const imodelId = imodel.iModelId;
353
+ const imodelInfo = getiModelInfo(iTwinId, imodelId);
354
+ let baseClasses;
355
+ if (this._imodelBaseClassesByClass.has(imodelInfo)) {
356
+ baseClasses = this._imodelBaseClassesByClass.get(imodelInfo);
357
+ }
358
+ else {
359
+ this._imodelBaseClassesByClass.set(imodelInfo, (baseClasses = {}));
360
+ }
361
+ const missingClasses = new Set();
362
+ neededClasses.forEach((className) => {
363
+ if (!baseClasses.hasOwnProperty(className)) {
364
+ missingClasses.add(className);
365
+ }
366
+ });
367
+ if (missingClasses.size === 0) {
368
+ return baseClasses;
369
+ }
370
+ const query = `
371
+ SELECT (derivedSchema.Name || ':' || derivedClass.Name) AS "ClassFullName", (baseSchema.Name || ':' || baseClass.Name) AS "BaseClassFullName"
372
+ FROM ECDbMeta.ClassHasAllBaseClasses baseClassRels
373
+ INNER JOIN ECDbMeta.ECClassDef derivedClass ON derivedClass.ECInstanceId = baseClassRels.SourceECInstanceId
374
+ INNER JOIN ECDbMeta.ECSchemaDef derivedSchema ON derivedSchema.ECInstanceId = derivedClass.Schema.Id
375
+ INNER JOIN ECDbMeta.ECClassDef baseClass ON baseClass.ECInstanceId = baseClassRels.TargetECInstanceId
376
+ INNER JOIN ECDbMeta.ECSchemaDef baseSchema ON baseSchema.ECInstanceId = baseClass.Schema.Id
377
+ WHERE (derivedSchema.Name || ':' || derivedClass.Name) IN (${[...missingClasses].map((className) => `'${className}'`).join(",")})`;
378
+ const reader = imodel.createQueryReader(query, undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames });
379
+ while (await reader.step()) {
380
+ const row = reader.current.toRow();
381
+ if (!(row.classFullName in baseClasses)) {
382
+ baseClasses[row.classFullName] = [];
383
+ }
384
+ baseClasses[row.classFullName].push(row.baseClassFullName);
385
+ }
386
+ return baseClasses;
387
+ };
372
388
  /** Changes field properties priorities to lower than another fields priority
373
389
  * @param imodel IModelConnection.
374
390
  * @param field Field that priority is being changed.
@@ -478,15 +494,10 @@ export class FavoritePropertiesManager {
478
494
  // reassign priority numbers
479
495
  let priority = allOrderInfos.length;
480
496
  allOrderInfos.forEach((oi) => (oi.priority = priority--));
481
- await this._storage.savePropertiesOrder(allOrderInfos, iTwinId, imodelId);
497
+ await this.storage.savePropertiesOrder(allOrderInfos, iTwinId, imodelId);
482
498
  this.onFavoritesChanged.raiseEvent();
483
499
  }
484
500
  }
485
- /**
486
- * Used in tests to avoid collisions between multiple runs using the same storage
487
- * @internal
488
- */
489
- FavoritePropertiesManager.FAVORITES_IDENTIFIER_PREFIX = "";
490
501
  var Direction;
491
502
  (function (Direction) {
492
503
  Direction[Direction["Up"] = -1] = "Up";
@@ -495,11 +506,11 @@ var Direction;
495
506
  const getiModelInfo = (iTwinId, imodelId) => `${iTwinId}/${imodelId}`;
496
507
  const getPropertiesFieldPropertyNames = (field) => {
497
508
  const nestingPrefix = getNestingPrefix(field.parent);
498
- return field.properties.map((property) => `${FavoritePropertiesManager.FAVORITES_IDENTIFIER_PREFIX}${nestingPrefix}${property.property.classInfo.name}:${property.property.name}`);
509
+ return field.properties.map((property) => `${nestingPrefix}${property.property.classInfo.name}:${property.property.name}`);
499
510
  };
500
511
  const getNestedContentFieldPropertyName = (field) => {
501
512
  const nestingPrefix = getNestingPrefix(field);
502
- return `${FavoritePropertiesManager.FAVORITES_IDENTIFIER_PREFIX}${nestingPrefix}${field.contentClassInfo.name}`;
513
+ return `${nestingPrefix}${field.contentClassInfo.name}`;
503
514
  };
504
515
  const getNestingPrefix = (field) => {
505
516
  const path = [];
@@ -542,7 +553,7 @@ export const getFieldInfos = (field) => {
542
553
  fieldInfos.add(getNestedContentFieldPropertyName(field));
543
554
  }
544
555
  else {
545
- fieldInfos.add(`${FavoritePropertiesManager.FAVORITES_IDENTIFIER_PREFIX}${field.name}`);
556
+ fieldInfos.add(field.name);
546
557
  }
547
558
  return fieldInfos;
548
559
  };
@@ -568,7 +579,6 @@ const addOrderInfos = (dest, source) => {
568
579
  const removeOrderInfos = (container, toRemove) => {
569
580
  toRemove.forEach((roi) => {
570
581
  const index = container.findIndex((oi) => oi.name === roi.name);
571
- /* istanbul ignore else */
572
582
  if (index >= 0) {
573
583
  container.splice(index, 1);
574
584
  }