@itwin/grouping-mapping-widget 0.23.1 → 0.24.0

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 (203) hide show
  1. package/lib/cjs/WidgetShell/GroupingMappingContent.js +2 -2
  2. package/lib/cjs/WidgetShell/GroupingMappingContent.js.map +1 -1
  3. package/lib/cjs/components/Constants.d.ts +3 -0
  4. package/lib/cjs/components/Constants.js +5 -2
  5. package/lib/cjs/components/Constants.js.map +1 -1
  6. package/lib/cjs/components/GroupingMappingContext.js +12 -14
  7. package/lib/cjs/components/GroupingMappingContext.js.map +1 -1
  8. package/lib/cjs/components/Groups/GroupsVisualization.js +31 -9
  9. package/lib/cjs/components/Groups/GroupsVisualization.js.map +1 -1
  10. package/lib/cjs/components/Groups/groupsHelpers.d.ts +1 -1
  11. package/lib/cjs/components/Groups/groupsHelpers.js +1 -1
  12. package/lib/cjs/components/Groups/groupsHelpers.js.map +1 -1
  13. package/lib/cjs/components/Groups/hooks/useKeySetHiliteQueries.d.ts +2 -2
  14. package/lib/cjs/components/Groups/hooks/useKeySetHiliteQueries.js.map +1 -1
  15. package/lib/cjs/components/Mappings/Extraction/ExtractionMessageModal.js +27 -18
  16. package/lib/cjs/components/Mappings/Extraction/ExtractionMessageModal.js.map +1 -1
  17. package/lib/cjs/components/Mappings/Extraction/ExtractionStates/QueuedExtractionState.d.ts +3 -0
  18. package/lib/cjs/components/Mappings/Extraction/ExtractionStates/QueuedExtractionState.js +17 -0
  19. package/lib/cjs/components/Mappings/Extraction/ExtractionStates/QueuedExtractionState.js.map +1 -0
  20. package/lib/cjs/components/Mappings/Extraction/ExtractionStates/RunningExtractionState.d.ts +3 -0
  21. package/lib/cjs/components/Mappings/Extraction/ExtractionStates/RunningExtractionState.js +16 -0
  22. package/lib/cjs/components/Mappings/Extraction/ExtractionStates/RunningExtractionState.js.map +1 -0
  23. package/lib/cjs/components/Mappings/Extraction/ExtractionStates/StartingExtractionState.d.ts +3 -0
  24. package/lib/cjs/components/Mappings/Extraction/ExtractionStates/StartingExtractionState.js +17 -0
  25. package/lib/cjs/components/Mappings/Extraction/ExtractionStates/StartingExtractionState.js.map +1 -0
  26. package/lib/cjs/components/Mappings/Extraction/ExtractionStates/TerminalExtractionState.d.ts +9 -0
  27. package/lib/cjs/components/Mappings/Extraction/ExtractionStates/TerminalExtractionState.js +21 -0
  28. package/lib/cjs/components/Mappings/Extraction/ExtractionStates/TerminalExtractionState.js.map +1 -0
  29. package/lib/cjs/components/Mappings/Extraction/ExtractionStatus.d.ts +17 -0
  30. package/lib/cjs/components/Mappings/Extraction/ExtractionStatus.js +79 -0
  31. package/lib/cjs/components/Mappings/Extraction/ExtractionStatus.js.map +1 -0
  32. package/lib/cjs/components/Mappings/Extraction/ExtractionStatus.scss +40 -0
  33. package/lib/cjs/components/Mappings/MappingListItem.d.ts +20 -0
  34. package/lib/cjs/components/Mappings/MappingListItem.js +96 -0
  35. package/lib/cjs/components/Mappings/MappingListItem.js.map +1 -0
  36. package/lib/cjs/components/Mappings/MappingListItem.scss +25 -0
  37. package/lib/cjs/components/Mappings/MappingsView.d.ts +2 -0
  38. package/lib/cjs/components/Mappings/MappingsView.js +28 -4
  39. package/lib/cjs/components/Mappings/MappingsView.js.map +1 -1
  40. package/lib/cjs/components/Mappings/hooks/useFetchExtractionStatus.d.ts +3 -1
  41. package/lib/cjs/components/Mappings/hooks/useFetchExtractionStatus.js +7 -4
  42. package/lib/cjs/components/Mappings/hooks/useFetchExtractionStatus.js.map +1 -1
  43. package/lib/cjs/components/Mappings/hooks/useFetchMappingExtractionStatus.d.ts +20 -0
  44. package/lib/cjs/components/Mappings/hooks/useFetchMappingExtractionStatus.js +55 -0
  45. package/lib/cjs/components/Mappings/hooks/useFetchMappingExtractionStatus.js.map +1 -0
  46. package/lib/cjs/components/Mappings/hooks/useMappingsOperations.d.ts +8 -0
  47. package/lib/cjs/components/Mappings/hooks/useMappingsOperations.js +29 -5
  48. package/lib/cjs/components/Mappings/hooks/useMappingsOperations.js.map +1 -1
  49. package/lib/cjs/components/Mappings/hooks/useRunExtraction.d.ts +14 -0
  50. package/lib/cjs/components/Mappings/hooks/useRunExtraction.js +42 -0
  51. package/lib/cjs/components/Mappings/hooks/useRunExtraction.js.map +1 -0
  52. package/lib/cjs/components/Properties/CalculatedProperties/CalculatedPropertyAction.js +17 -25
  53. package/lib/cjs/components/Properties/CalculatedProperties/CalculatedPropertyAction.js.map +1 -1
  54. package/lib/cjs/components/Properties/CalculatedProperties/CalculatedPropertyActionWithVisuals.js +18 -25
  55. package/lib/cjs/components/Properties/CalculatedProperties/CalculatedPropertyActionWithVisuals.js.map +1 -1
  56. package/lib/cjs/components/Properties/CalculatedProperties/CalculatedPropertyTable.js +35 -38
  57. package/lib/cjs/components/Properties/CalculatedProperties/CalculatedPropertyTable.js.map +1 -1
  58. package/lib/cjs/components/Properties/CustomCalculations/CustomCalculationAction.js +28 -59
  59. package/lib/cjs/components/Properties/CustomCalculations/CustomCalculationAction.js.map +1 -1
  60. package/lib/cjs/components/Properties/CustomCalculations/CustomCalculationTable.js +37 -40
  61. package/lib/cjs/components/Properties/CustomCalculations/CustomCalculationTable.js.map +1 -1
  62. package/lib/cjs/components/Properties/GroupColorToggle.js +30 -26
  63. package/lib/cjs/components/Properties/GroupColorToggle.js.map +1 -1
  64. package/lib/cjs/components/Properties/GroupProperties/GroupPropertyAction.js +61 -166
  65. package/lib/cjs/components/Properties/GroupProperties/GroupPropertyAction.js.map +1 -1
  66. package/lib/cjs/components/Properties/GroupProperties/GroupPropertyAction.scss +1 -46
  67. package/lib/cjs/components/Properties/GroupProperties/GroupPropertyTable.js +34 -37
  68. package/lib/cjs/components/Properties/GroupProperties/GroupPropertyTable.js.map +1 -1
  69. package/lib/cjs/components/Properties/GroupProperties/GroupPropertyUtils.js +65 -51
  70. package/lib/cjs/components/Properties/GroupProperties/GroupPropertyUtils.js.map +1 -1
  71. package/lib/cjs/components/Properties/GroupProperties/GroupsPropertiesSelectionModal.d.ts +12 -0
  72. package/lib/cjs/components/Properties/GroupProperties/GroupsPropertiesSelectionModal.js +147 -0
  73. package/lib/cjs/components/Properties/GroupProperties/GroupsPropertiesSelectionModal.js.map +1 -0
  74. package/lib/cjs/components/Properties/GroupProperties/GroupsPropertiesSelectionModal.scss +49 -0
  75. package/lib/cjs/components/Properties/PropertyMenu.js +11 -15
  76. package/lib/cjs/components/Properties/PropertyMenu.js.map +1 -1
  77. package/lib/cjs/components/Properties/PropertyTable.js +1 -1
  78. package/lib/cjs/components/Properties/PropertyTable.js.map +1 -1
  79. package/lib/cjs/components/Properties/hooks/useCalculatedPropertiesQuery.d.ts +4 -0
  80. package/lib/cjs/components/Properties/hooks/useCalculatedPropertiesQuery.js +12 -0
  81. package/lib/cjs/components/Properties/hooks/useCalculatedPropertiesQuery.js.map +1 -0
  82. package/lib/cjs/components/Properties/hooks/useCustomCalculationsQuery.d.ts +4 -0
  83. package/lib/cjs/components/Properties/hooks/useCustomCalculationsQuery.js +12 -0
  84. package/lib/cjs/components/Properties/hooks/useCustomCalculationsQuery.js.map +1 -0
  85. package/lib/cjs/components/Properties/hooks/useGroupPropertiesQuery.d.ts +4 -0
  86. package/lib/cjs/components/Properties/hooks/useGroupPropertiesQuery.js +12 -0
  87. package/lib/cjs/components/Properties/hooks/useGroupPropertiesQuery.js.map +1 -0
  88. package/lib/cjs/components/SharedComponents/DeleteModal.d.ts +1 -2
  89. package/lib/cjs/components/SharedComponents/DeleteModal.js +1 -2
  90. package/lib/cjs/components/SharedComponents/DeleteModal.js.map +1 -1
  91. package/lib/cjs/components/context/ExtractionStateJobContext.d.ts +8 -0
  92. package/lib/cjs/components/context/ExtractionStateJobContext.js +44 -0
  93. package/lib/cjs/components/context/ExtractionStateJobContext.js.map +1 -0
  94. package/lib/cjs/components/context/PropertiesGroupColorContext.d.ts +8 -0
  95. package/lib/cjs/components/context/{PropertiesContext.js → PropertiesGroupColorContext.js} +7 -10
  96. package/lib/cjs/components/context/PropertiesGroupColorContext.js.map +1 -0
  97. package/lib/esm/WidgetShell/GroupingMappingContent.js +2 -2
  98. package/lib/esm/WidgetShell/GroupingMappingContent.js.map +1 -1
  99. package/lib/esm/components/Constants.d.ts +3 -0
  100. package/lib/esm/components/Constants.js +3 -0
  101. package/lib/esm/components/Constants.js.map +1 -1
  102. package/lib/esm/components/GroupingMappingContext.js +12 -14
  103. package/lib/esm/components/GroupingMappingContext.js.map +1 -1
  104. package/lib/esm/components/Groups/GroupsVisualization.js +31 -9
  105. package/lib/esm/components/Groups/GroupsVisualization.js.map +1 -1
  106. package/lib/esm/components/Groups/groupsHelpers.d.ts +1 -1
  107. package/lib/esm/components/Groups/groupsHelpers.js +1 -1
  108. package/lib/esm/components/Groups/groupsHelpers.js.map +1 -1
  109. package/lib/esm/components/Groups/hooks/useKeySetHiliteQueries.d.ts +2 -2
  110. package/lib/esm/components/Groups/hooks/useKeySetHiliteQueries.js.map +1 -1
  111. package/lib/esm/components/Mappings/Extraction/ExtractionMessageModal.js +27 -18
  112. package/lib/esm/components/Mappings/Extraction/ExtractionMessageModal.js.map +1 -1
  113. package/lib/esm/components/Mappings/Extraction/ExtractionStates/QueuedExtractionState.d.ts +3 -0
  114. package/lib/esm/components/Mappings/Extraction/ExtractionStates/QueuedExtractionState.js +10 -0
  115. package/lib/esm/components/Mappings/Extraction/ExtractionStates/QueuedExtractionState.js.map +1 -0
  116. package/lib/esm/components/Mappings/Extraction/ExtractionStates/RunningExtractionState.d.ts +3 -0
  117. package/lib/esm/components/Mappings/Extraction/ExtractionStates/RunningExtractionState.js +9 -0
  118. package/lib/esm/components/Mappings/Extraction/ExtractionStates/RunningExtractionState.js.map +1 -0
  119. package/lib/esm/components/Mappings/Extraction/ExtractionStates/StartingExtractionState.d.ts +3 -0
  120. package/lib/esm/components/Mappings/Extraction/ExtractionStates/StartingExtractionState.js +10 -0
  121. package/lib/esm/components/Mappings/Extraction/ExtractionStates/StartingExtractionState.js.map +1 -0
  122. package/lib/esm/components/Mappings/Extraction/ExtractionStates/TerminalExtractionState.d.ts +9 -0
  123. package/lib/esm/components/Mappings/Extraction/ExtractionStates/TerminalExtractionState.js +14 -0
  124. package/lib/esm/components/Mappings/Extraction/ExtractionStates/TerminalExtractionState.js.map +1 -0
  125. package/lib/esm/components/Mappings/Extraction/ExtractionStatus.d.ts +17 -0
  126. package/lib/esm/components/Mappings/Extraction/ExtractionStatus.js +52 -0
  127. package/lib/esm/components/Mappings/Extraction/ExtractionStatus.js.map +1 -0
  128. package/lib/esm/components/Mappings/Extraction/ExtractionStatus.scss +40 -0
  129. package/lib/esm/components/Mappings/MappingListItem.d.ts +20 -0
  130. package/lib/esm/components/Mappings/MappingListItem.js +69 -0
  131. package/lib/esm/components/Mappings/MappingListItem.js.map +1 -0
  132. package/lib/esm/components/Mappings/MappingListItem.scss +25 -0
  133. package/lib/esm/components/Mappings/MappingsView.d.ts +2 -0
  134. package/lib/esm/components/Mappings/MappingsView.js +30 -6
  135. package/lib/esm/components/Mappings/MappingsView.js.map +1 -1
  136. package/lib/esm/components/Mappings/hooks/useFetchExtractionStatus.d.ts +3 -1
  137. package/lib/esm/components/Mappings/hooks/useFetchExtractionStatus.js +7 -4
  138. package/lib/esm/components/Mappings/hooks/useFetchExtractionStatus.js.map +1 -1
  139. package/lib/esm/components/Mappings/hooks/useFetchMappingExtractionStatus.d.ts +20 -0
  140. package/lib/esm/components/Mappings/hooks/useFetchMappingExtractionStatus.js +49 -0
  141. package/lib/esm/components/Mappings/hooks/useFetchMappingExtractionStatus.js.map +1 -0
  142. package/lib/esm/components/Mappings/hooks/useMappingsOperations.d.ts +8 -0
  143. package/lib/esm/components/Mappings/hooks/useMappingsOperations.js +30 -6
  144. package/lib/esm/components/Mappings/hooks/useMappingsOperations.js.map +1 -1
  145. package/lib/esm/components/Mappings/hooks/useRunExtraction.d.ts +14 -0
  146. package/lib/esm/components/Mappings/hooks/useRunExtraction.js +38 -0
  147. package/lib/esm/components/Mappings/hooks/useRunExtraction.js.map +1 -0
  148. package/lib/esm/components/Properties/CalculatedProperties/CalculatedPropertyAction.js +17 -25
  149. package/lib/esm/components/Properties/CalculatedProperties/CalculatedPropertyAction.js.map +1 -1
  150. package/lib/esm/components/Properties/CalculatedProperties/CalculatedPropertyActionWithVisuals.js +18 -25
  151. package/lib/esm/components/Properties/CalculatedProperties/CalculatedPropertyActionWithVisuals.js.map +1 -1
  152. package/lib/esm/components/Properties/CalculatedProperties/CalculatedPropertyTable.js +35 -38
  153. package/lib/esm/components/Properties/CalculatedProperties/CalculatedPropertyTable.js.map +1 -1
  154. package/lib/esm/components/Properties/CustomCalculations/CustomCalculationAction.js +29 -60
  155. package/lib/esm/components/Properties/CustomCalculations/CustomCalculationAction.js.map +1 -1
  156. package/lib/esm/components/Properties/CustomCalculations/CustomCalculationTable.js +37 -40
  157. package/lib/esm/components/Properties/CustomCalculations/CustomCalculationTable.js.map +1 -1
  158. package/lib/esm/components/Properties/GroupColorToggle.js +32 -28
  159. package/lib/esm/components/Properties/GroupColorToggle.js.map +1 -1
  160. package/lib/esm/components/Properties/GroupProperties/GroupPropertyAction.js +63 -168
  161. package/lib/esm/components/Properties/GroupProperties/GroupPropertyAction.js.map +1 -1
  162. package/lib/esm/components/Properties/GroupProperties/GroupPropertyAction.scss +1 -46
  163. package/lib/esm/components/Properties/GroupProperties/GroupPropertyTable.js +34 -37
  164. package/lib/esm/components/Properties/GroupProperties/GroupPropertyTable.js.map +1 -1
  165. package/lib/esm/components/Properties/GroupProperties/GroupPropertyUtils.js +65 -51
  166. package/lib/esm/components/Properties/GroupProperties/GroupPropertyUtils.js.map +1 -1
  167. package/lib/esm/components/Properties/GroupProperties/GroupsPropertiesSelectionModal.d.ts +12 -0
  168. package/lib/esm/components/Properties/GroupProperties/GroupsPropertiesSelectionModal.js +117 -0
  169. package/lib/esm/components/Properties/GroupProperties/GroupsPropertiesSelectionModal.js.map +1 -0
  170. package/lib/esm/components/Properties/GroupProperties/GroupsPropertiesSelectionModal.scss +49 -0
  171. package/lib/esm/components/Properties/PropertyMenu.js +12 -16
  172. package/lib/esm/components/Properties/PropertyMenu.js.map +1 -1
  173. package/lib/esm/components/Properties/PropertyTable.js +1 -1
  174. package/lib/esm/components/Properties/PropertyTable.js.map +1 -1
  175. package/lib/esm/components/Properties/hooks/useCalculatedPropertiesQuery.d.ts +4 -0
  176. package/lib/esm/components/Properties/hooks/useCalculatedPropertiesQuery.js +8 -0
  177. package/lib/esm/components/Properties/hooks/useCalculatedPropertiesQuery.js.map +1 -0
  178. package/lib/esm/components/Properties/hooks/useCustomCalculationsQuery.d.ts +4 -0
  179. package/lib/esm/components/Properties/hooks/useCustomCalculationsQuery.js +8 -0
  180. package/lib/esm/components/Properties/hooks/useCustomCalculationsQuery.js.map +1 -0
  181. package/lib/esm/components/Properties/hooks/useGroupPropertiesQuery.d.ts +4 -0
  182. package/lib/esm/components/Properties/hooks/useGroupPropertiesQuery.js +8 -0
  183. package/lib/esm/components/Properties/hooks/useGroupPropertiesQuery.js.map +1 -0
  184. package/lib/esm/components/SharedComponents/DeleteModal.d.ts +1 -2
  185. package/lib/esm/components/SharedComponents/DeleteModal.js +1 -2
  186. package/lib/esm/components/SharedComponents/DeleteModal.js.map +1 -1
  187. package/lib/esm/components/context/ExtractionStateJobContext.d.ts +8 -0
  188. package/lib/esm/components/context/ExtractionStateJobContext.js +17 -0
  189. package/lib/esm/components/context/ExtractionStateJobContext.js.map +1 -0
  190. package/lib/esm/components/context/PropertiesGroupColorContext.d.ts +8 -0
  191. package/lib/esm/components/context/{PropertiesContext.js → PropertiesGroupColorContext.js} +5 -8
  192. package/lib/esm/components/context/PropertiesGroupColorContext.js.map +1 -0
  193. package/package.json +3 -2
  194. package/lib/cjs/components/Properties/hooks/useFetchData.d.ts +0 -7
  195. package/lib/cjs/components/Properties/hooks/useFetchData.js +0 -43
  196. package/lib/cjs/components/Properties/hooks/useFetchData.js.map +0 -1
  197. package/lib/cjs/components/context/PropertiesContext.d.ts +0 -15
  198. package/lib/cjs/components/context/PropertiesContext.js.map +0 -1
  199. package/lib/esm/components/Properties/hooks/useFetchData.d.ts +0 -7
  200. package/lib/esm/components/Properties/hooks/useFetchData.js +0 -37
  201. package/lib/esm/components/Properties/hooks/useFetchData.js.map +0 -1
  202. package/lib/esm/components/context/PropertiesContext.d.ts +0 -15
  203. package/lib/esm/components/context/PropertiesContext.js.map +0 -1
@@ -30,12 +30,12 @@ exports.GroupingMappingContent = void 0;
30
30
  *--------------------------------------------------------------------------------------------*/
31
31
  const react_1 = __importStar(require("react"));
32
32
  const GroupHilitedElementsContext_1 = require("../components/context/GroupHilitedElementsContext");
33
- const PropertiesContext_1 = require("../components/context/PropertiesContext");
33
+ const PropertiesGroupColorContext_1 = require("../components/context/PropertiesGroupColorContext");
34
34
  const GroupingMappingRouter_1 = require("./Router/GroupingMappingRouter");
35
35
  const viewerUtils_1 = require("../common/viewerUtils");
36
36
  const GroupingMappingContent = ({ routingHistory, navigateTo, goBack, }) => {
37
37
  const { setShowGroupColor, setHiddenGroupsIds } = (0, GroupHilitedElementsContext_1.useGroupHilitedElementsContext)();
38
- const { setShowGroupColor: setPropertiesShowGroup } = (0, PropertiesContext_1.usePropertiesContext)();
38
+ const { setShowGroupColor: setPropertiesShowGroup } = (0, PropertiesGroupColorContext_1.usePropertiesGroupColorContext)();
39
39
  const currentRoute = routingHistory[routingHistory.length - 1];
40
40
  // Clean up group visualization when in mappings
41
41
  (0, react_1.useEffect)(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"GroupingMappingContent.js","sourceRoot":"","sources":["../../../src/WidgetShell/GroupingMappingContent.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;+FAG+F;AAC/F,+CAAyC;AACzC,mGAAmG;AACnG,+EAA+E;AAE/E,0EAAuE;AACvE,uDAAiD;AAE1C,MAAM,sBAAsB,GAAG,CAAC,EACrC,cAAc,EACd,UAAU,EACV,MAAM,GAKP,EAAE,EAAE;IACH,MAAM,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,GAAG,IAAA,4DAA8B,GAAE,CAAC;IACnF,MAAM,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,GAAG,IAAA,wCAAoB,GAAE,CAAC;IAC7E,MAAM,YAAY,GAAG,cAAc,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE/D,gDAAgD;IAChD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE;YAC/B,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACzB,kBAAkB,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;YAC9B,IAAA,sBAAQ,GAAE,CAAC;YACX,2CAA2C;SAC5C;aAAM,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE;YACtC,sBAAsB,CAAC,KAAK,CAAC,CAAC;SAC/B;IACH,CAAC,EAAE,CAAC,cAAc,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAEpF,OAAO,CACL,8BAAC,6CAAqB,IACpB,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,GACd,CACH,CAAC;AACJ,CAAC,CAAC;AAhCW,QAAA,sBAAsB,0BAgCjC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport React, { useEffect } from \"react\";\nimport { useGroupHilitedElementsContext } from \"../components/context/GroupHilitedElementsContext\";\nimport { usePropertiesContext } from \"../components/context/PropertiesContext\";\nimport type { Route } from \"./GroupingMapping\";\nimport { GroupingMappingRouter } from \"./Router/GroupingMappingRouter\";\nimport { clearAll } from \"../common/viewerUtils\";\n\nexport const GroupingMappingContent = ({\n routingHistory,\n navigateTo,\n goBack,\n}: {\n routingHistory: Route[];\n navigateTo: (toRoute: (prev: Route | undefined) => Route) => void;\n goBack: () => void;\n}) => {\n const { setShowGroupColor, setHiddenGroupsIds } = useGroupHilitedElementsContext();\n const { setShowGroupColor: setPropertiesShowGroup } = usePropertiesContext();\n const currentRoute = routingHistory[routingHistory.length - 1];\n\n // Clean up group visualization when in mappings\n useEffect(() => {\n if (routingHistory.length === 1) {\n setShowGroupColor(false);\n setHiddenGroupsIds(new Set());\n clearAll();\n // Turn off visualiztion in properties menu\n } else if (routingHistory.length === 2) {\n setPropertiesShowGroup(false);\n }\n }, [routingHistory, setHiddenGroupsIds, setPropertiesShowGroup, setShowGroupColor]);\n\n return (\n <GroupingMappingRouter\n currentRoute={currentRoute}\n navigateTo={navigateTo}\n goBack={goBack}\n />\n );\n};\n"]}
1
+ {"version":3,"file":"GroupingMappingContent.js","sourceRoot":"","sources":["../../../src/WidgetShell/GroupingMappingContent.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;+FAG+F;AAC/F,+CAAyC;AACzC,mGAAmG;AACnG,mGAAmG;AAEnG,0EAAuE;AACvE,uDAAiD;AAE1C,MAAM,sBAAsB,GAAG,CAAC,EACrC,cAAc,EACd,UAAU,EACV,MAAM,GAKP,EAAE,EAAE;IACH,MAAM,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,GAAG,IAAA,4DAA8B,GAAE,CAAC;IACnF,MAAM,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,GAAG,IAAA,4DAA8B,GAAE,CAAC;IACvF,MAAM,YAAY,GAAG,cAAc,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE/D,gDAAgD;IAChD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE;YAC/B,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACzB,kBAAkB,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;YAC9B,IAAA,sBAAQ,GAAE,CAAC;YACX,2CAA2C;SAC5C;aAAM,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE;YACtC,sBAAsB,CAAC,KAAK,CAAC,CAAC;SAC/B;IACH,CAAC,EAAE,CAAC,cAAc,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAEpF,OAAO,CACL,8BAAC,6CAAqB,IACpB,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,GACd,CACH,CAAC;AACJ,CAAC,CAAC;AAhCW,QAAA,sBAAsB,0BAgCjC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport React, { useEffect } from \"react\";\nimport { useGroupHilitedElementsContext } from \"../components/context/GroupHilitedElementsContext\";\nimport { usePropertiesGroupColorContext } from \"../components/context/PropertiesGroupColorContext\";\nimport type { Route } from \"./GroupingMapping\";\nimport { GroupingMappingRouter } from \"./Router/GroupingMappingRouter\";\nimport { clearAll } from \"../common/viewerUtils\";\n\nexport const GroupingMappingContent = ({\n routingHistory,\n navigateTo,\n goBack,\n}: {\n routingHistory: Route[];\n navigateTo: (toRoute: (prev: Route | undefined) => Route) => void;\n goBack: () => void;\n}) => {\n const { setShowGroupColor, setHiddenGroupsIds } = useGroupHilitedElementsContext();\n const { setShowGroupColor: setPropertiesShowGroup } = usePropertiesGroupColorContext();\n const currentRoute = routingHistory[routingHistory.length - 1];\n\n // Clean up group visualization when in mappings\n useEffect(() => {\n if (routingHistory.length === 1) {\n setShowGroupColor(false);\n setHiddenGroupsIds(new Set());\n clearAll();\n // Turn off visualiztion in properties menu\n } else if (routingHistory.length === 2) {\n setPropertiesShowGroup(false);\n }\n }, [routingHistory, setHiddenGroupsIds, setPropertiesShowGroup, setShowGroupColor]);\n\n return (\n <GroupingMappingRouter\n currentRoute={currentRoute}\n navigateTo={navigateTo}\n goBack={goBack}\n />\n );\n};\n"]}
@@ -1,3 +1,6 @@
1
+ export declare const STATUS_CHECK_INTERVAL = 5000;
2
+ export declare const ANIMATION_DELAY = "3s";
3
+ export declare const ANIMATION_DURATION = "1s";
1
4
  export declare enum TErrCodes {
2
5
  QUERY_HILITE_FETCH_FAILED = 0
3
6
  }
@@ -1,10 +1,13 @@
1
1
  "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TErrCodes = exports.ANIMATION_DURATION = exports.ANIMATION_DELAY = exports.STATUS_CHECK_INTERVAL = void 0;
2
4
  /*---------------------------------------------------------------------------------------------
3
5
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
6
  * See LICENSE.md in the project root for license terms and full copyright notice.
5
7
  *--------------------------------------------------------------------------------------------*/
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.TErrCodes = void 0;
8
+ exports.STATUS_CHECK_INTERVAL = 5000;
9
+ exports.ANIMATION_DELAY = "3s";
10
+ exports.ANIMATION_DURATION = "1s";
8
11
  // Types of error codes that get handled by query cache error handler.
9
12
  var TErrCodes;
10
13
  (function (TErrCodes) {
@@ -1 +1 @@
1
- {"version":3,"file":"Constants.js","sourceRoot":"","sources":["../../../src/components/Constants.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F,sEAAsE;AACtE,IAAY,SAEX;AAFD,WAAY,SAAS;IACnB,mFAAyB,CAAA,CAAC,2DAA2D;AACvF,CAAC,EAFW,SAAS,GAAT,iBAAS,KAAT,iBAAS,QAEpB","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n// Types of error codes that get handled by query cache error handler.\nexport enum TErrCodes {\n QUERY_HILITE_FETCH_FAILED // Error code when failing to fetch hilite ids for a group.\n}\n"]}
1
+ {"version":3,"file":"Constants.js","sourceRoot":"","sources":["../../../src/components/Constants.ts"],"names":[],"mappings":";;;AAAA;;;+FAG+F;AAClF,QAAA,qBAAqB,GAAG,IAAI,CAAC;AAC7B,QAAA,eAAe,GAAG,IAAI,CAAC;AACvB,QAAA,kBAAkB,GAAG,IAAI,CAAC;AAEvC,sEAAsE;AACtE,IAAY,SAEX;AAFD,WAAY,SAAS;IACnB,mFAAyB,CAAA,CAAC,2DAA2D;AACvF,CAAC,EAFW,SAAS,GAAT,iBAAS,KAAT,iBAAS,QAEpB","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nexport const STATUS_CHECK_INTERVAL = 5000;\nexport const ANIMATION_DELAY = \"3s\";\nexport const ANIMATION_DURATION = \"1s\";\n\n// Types of error codes that get handled by query cache error handler.\nexport enum TErrCodes {\n QUERY_HILITE_FETCH_FAILED // Error code when failing to fetch hilite ids for a group.\n}\n"]}
@@ -34,13 +34,14 @@ const GroupingApiConfigContext_1 = require("./context/GroupingApiConfigContext")
34
34
  const MappingClientContext_1 = require("./context/MappingClientContext");
35
35
  const GroupingMappingCustomUIContext_1 = require("./context/GroupingMappingCustomUIContext");
36
36
  const GroupHilitedElementsContext_1 = require("./context/GroupHilitedElementsContext");
37
- const PropertiesContext_1 = require("./context/PropertiesContext");
37
+ const PropertiesGroupColorContext_1 = require("./context/PropertiesGroupColorContext");
38
38
  const appui_react_1 = require("@itwin/appui-react");
39
39
  const ExtractionClientContext_1 = require("./context/ExtractionClientContext");
40
40
  const react_query_1 = require("@tanstack/react-query");
41
41
  const itwinui_react_1 = require("@itwin/itwinui-react");
42
42
  const utils_1 = require("../common/utils");
43
43
  const Constants_1 = require("./Constants");
44
+ const ExtractionStateJobContext_1 = require("./context/ExtractionStateJobContext");
44
45
  const authorizationClientGetAccessToken = async () => (await core_frontend_1.IModelApp.authorizationClient?.getAccessToken()) ?? "";
45
46
  const defaultQueryClient = new react_query_1.QueryClient({
46
47
  defaultOptions: {
@@ -89,9 +90,6 @@ const GroupingMappingContext = (props) => {
89
90
  const [showGroupColor, setShowGroupColor] = (0, react_1.useState)(false);
90
91
  const [propertiesShowGroup, setPropertiesShowGroup] = (0, react_1.useState)(false);
91
92
  const [groups, setGroups] = (0, react_1.useState)([]);
92
- const [groupProperties, setGroupProperties] = (0, react_1.useState)([]);
93
- const [calculatedProperties, setCalculatedProperties] = (0, react_1.useState)([]);
94
- const [customCalculationProperties, setCustomCalculationProperties] = (0, react_1.useState)([]);
95
93
  const [numberOfVisualizedGroups, setNumberOfVisualizedGroups] = (0, react_1.useState)(0);
96
94
  const [isOverlappedColored, setIsOverlappedColored] = (0, react_1.useState)(false);
97
95
  const [currentHilitedGroups, setCurrentHilitedGroups] = (0, react_1.useState)(1);
@@ -102,6 +100,7 @@ const GroupingMappingContext = (props) => {
102
100
  overlappedElementGroupPairs: [],
103
101
  });
104
102
  const queryClient = props.queryClient ?? defaultQueryClient;
103
+ const [mappingIdJobInfo, setMappingIdJobInfo] = (0, react_1.useState)(new Map());
105
104
  (0, react_1.useEffect)(() => {
106
105
  setApiConfig(() => ({
107
106
  prefix: props.prefix,
@@ -140,24 +139,23 @@ const GroupingMappingContext = (props) => {
140
139
  const propertiesContextValue = (0, react_1.useMemo)(() => ({
141
140
  showGroupColor: propertiesShowGroup,
142
141
  setShowGroupColor: setPropertiesShowGroup,
143
- groupProperties,
144
- setGroupProperties,
145
- calculatedProperties,
146
- setCalculatedProperties,
147
- customCalculationProperties,
148
- setCustomCalculationProperties,
149
- }), [calculatedProperties, customCalculationProperties, groupProperties, propertiesShowGroup]);
142
+ }), [propertiesShowGroup]);
150
143
  const customUIContextValue = (0, react_1.useMemo)(() => ({
151
144
  customUIs,
152
145
  setCustomUIs,
153
146
  }), [customUIs]);
147
+ const extractionStateJobContextValue = (0, react_1.useMemo)(() => ({
148
+ mappingIdJobInfo,
149
+ setMappingIdJobInfo,
150
+ }), [mappingIdJobInfo]);
154
151
  return (react_1.default.createElement(react_query_1.QueryClientProvider, { client: queryClient },
155
152
  react_1.default.createElement(GroupingApiConfigContext_1.GroupingMappingApiConfigContext.Provider, { value: apiConfig },
156
153
  react_1.default.createElement(MappingClientContext_1.MappingClientContext.Provider, { value: mappingClient },
157
154
  react_1.default.createElement(ExtractionClientContext_1.ExtractionClientContext.Provider, { value: extractionClient },
158
- react_1.default.createElement(GroupingMappingCustomUIContext_1.GroupingMappingCustomUIContext.Provider, { value: customUIContextValue },
159
- react_1.default.createElement(GroupHilitedElementsContext_1.GroupHilitedElementsContext.Provider, { value: hilitedElementsContextValue },
160
- react_1.default.createElement(PropertiesContext_1.PropertiesContext.Provider, { value: propertiesContextValue }, props.children))))))));
155
+ react_1.default.createElement(ExtractionStateJobContext_1.ExtractionStatusJobContext.Provider, { value: extractionStateJobContextValue },
156
+ react_1.default.createElement(GroupingMappingCustomUIContext_1.GroupingMappingCustomUIContext.Provider, { value: customUIContextValue },
157
+ react_1.default.createElement(GroupHilitedElementsContext_1.GroupHilitedElementsContext.Provider, { value: hilitedElementsContextValue },
158
+ react_1.default.createElement(PropertiesGroupColorContext_1.PropertiesGroupColorContext.Provider, { value: propertiesContextValue }, props.children)))))))));
161
159
  };
162
160
  exports.GroupingMappingContext = GroupingMappingContext;
163
161
  //# sourceMappingURL=GroupingMappingContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GroupingMappingContext.js","sourceRoot":"","sources":["../../../src/components/GroupingMappingContext.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport type { IModelConnection } from \"@itwin/core-frontend\";\nimport { IModelApp } from \"@itwin/core-frontend\";\nimport type {\n ClientPrefix,\n GetAccessTokenFn,\n GroupingMappingApiConfig,\n} from \"./context/GroupingApiConfigContext\";\nimport { GroupingMappingApiConfigContext } from \"./context/GroupingApiConfigContext\";\nimport {\n createMappingClient,\n MappingClientContext,\n} from \"./context/MappingClientContext\";\nimport type { CalculatedProperty, CustomCalculation, Group, GroupProperty, IExtractionClient, IMappingsClient } from \"@itwin/insights-client\";\nimport { createGroupingMappingCustomUI, GroupingMappingCustomUIContext } from \"./context/GroupingMappingCustomUIContext\";\nimport type { GroupingMappingCustomUI } from \"./customUI/GroupingMappingCustomUI\";\nimport type { OverlappedElementsMetadata } from \"./context/GroupHilitedElementsContext\";\nimport { GroupHilitedElementsContext } from \"./context/GroupHilitedElementsContext\";\nimport { PropertiesContext } from \"./context/PropertiesContext\";\nimport { useActiveIModelConnection } from \"@itwin/appui-react\";\nimport { createExtractionClient, ExtractionClientContext } from \"./context/ExtractionClientContext\";\nimport type { Query } from \"@tanstack/react-query\";\nimport { MutationCache, QueryCache, QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { toaster } from \"@itwin/itwinui-react\";\nimport { getErrorMessage } from \"../common/utils\";\nimport { TErrCodes } from \"./Constants\";\n\nexport interface GroupingMappingContextProps {\n /**\n * Custom callback to retrieve access token.\n */\n getAccessToken?: GetAccessTokenFn;\n /**\n * The iTwin iModel Id.\n */\n iModelId: string;\n /**\n * Used for iTwin and iModel APIs.\n * Also used for Mapping API if a custom {@link client} is not provided.\n */\n prefix?: ClientPrefix;\n /**\n * A custom implementation of MappingClient.\n */\n client?: IMappingsClient;\n /**\n * A custom implementation of ExtractionClient.\n */\n extractionClient?: IExtractionClient;\n /**\n * Custom UI to add and update groups or provide additional group context capabilities.\n */\n customUIs?: GroupingMappingCustomUI[];\n /**\n * A custom iModelConnection to use instead of the active iModelConnection from UiFramework.\n */\n iModelConnection?: IModelConnection;\n /**\n * A custom QueryClient. If not provided, a default QueryClient will be used.\n */\n queryClient?: QueryClient;\n children?: React.ReactNode;\n}\n\nconst authorizationClientGetAccessToken = async () =>\n (await IModelApp.authorizationClient?.getAccessToken()) ?? \"\";\n\nconst defaultQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n refetchOnWindowFocus: false,\n staleTime: 20 * 60 * 1000, // 20 minutes\n },\n },\n queryCache: new QueryCache({\n onError: (error: any, query: Query) => {\n switch (query.meta?.errorCode) {\n case TErrCodes.QUERY_HILITE_FETCH_FAILED:\n toaster.negative(query.meta?.message as string);\n break;\n default: {\n if (error.status)\n toaster.negative(getErrorMessage(error.status));\n else\n toaster.negative(\"An error occurred while fetching data.\");\n }\n }\n },\n }),\n mutationCache: new MutationCache({\n onError: (error: any) => {\n if (error.status)\n toaster.negative(getErrorMessage(error.status));\n else\n toaster.negative(\"A network error occured while processing this action.\");\n },\n }),\n});\n\nexport const GroupingMappingContext = (props: GroupingMappingContextProps) => {\n const activeIModelConntextion = useActiveIModelConnection();\n const clientProp: IMappingsClient | ClientPrefix = props.client ?? props.prefix;\n const extractionClientProp: IExtractionClient | ClientPrefix = props.extractionClient ?? props.prefix;\n const [mappingClient, setMappingClient] = useState<IMappingsClient>(createMappingClient(clientProp));\n const [extractionClient, setExtractionClient] = useState<IExtractionClient>(createExtractionClient(extractionClientProp));\n const [customUIs, setCustomUIs] = useState<GroupingMappingCustomUI[]>(\n createGroupingMappingCustomUI(props.customUIs),\n );\n const [apiConfig, setApiConfig] = useState<GroupingMappingApiConfig>({\n getAccessToken: props.getAccessToken ?? authorizationClientGetAccessToken,\n iModelId: props.iModelId,\n prefix: props.prefix,\n });\n const [hiddenGroupsIds, setHiddenGroupsIds] = useState<Set<string>>(new Set());\n const [showGroupColor, setShowGroupColor] = useState<boolean>(false);\n const [propertiesShowGroup, setPropertiesShowGroup] = useState<boolean>(false);\n const [groups, setGroups] = useState<Group[]>([]);\n const [groupProperties, setGroupProperties] = useState<GroupProperty[]>([]);\n const [calculatedProperties, setCalculatedProperties] = useState<CalculatedProperty[]>([]);\n const [customCalculationProperties, setCustomCalculationProperties] = useState<CustomCalculation[]>([]);\n const [numberOfVisualizedGroups, setNumberOfVisualizedGroups] = useState(0);\n const [isOverlappedColored, setIsOverlappedColored] = useState<boolean>(false);\n const [currentHilitedGroups, setCurrentHilitedGroups] = useState<number>(1);\n const [isVisualizationsEnabled, setIsVisualizationsEnabled] = useState<boolean>(false);\n const [overlappedElementsMetadata, setOverlappedElementsMetadata] = useState<OverlappedElementsMetadata>({\n overlappedElementsInfo: new Map(),\n groupElementsInfo: new Map(),\n overlappedElementGroupPairs: [],\n });\n const queryClient = props.queryClient ?? defaultQueryClient;\n\n useEffect(() => {\n setApiConfig(() => ({\n prefix: props.prefix,\n iModelId: props.iModelId,\n getAccessToken: props.getAccessToken ?? authorizationClientGetAccessToken,\n iModelConnection: props.iModelConnection ?? activeIModelConntextion,\n }));\n }, [activeIModelConntextion, props.getAccessToken, props.iModelConnection, props.iModelId, props.prefix]);\n\n useEffect(() => {\n setMappingClient(createMappingClient(clientProp));\n }, [clientProp]);\n\n useEffect(() => {\n setExtractionClient(createExtractionClient(extractionClientProp));\n }, [extractionClientProp]);\n\n useEffect(() => {\n setCustomUIs(createGroupingMappingCustomUI(props.customUIs));\n }, [props.customUIs]);\n\n const hilitedElementsContextValue = useMemo(\n () => ({\n showGroupColor,\n setShowGroupColor,\n hiddenGroupsIds,\n setHiddenGroupsIds,\n groups,\n setGroups,\n numberOfVisualizedGroups,\n setNumberOfVisualizedGroups,\n isOverlappedColored,\n setIsOverlappedColored,\n currentHilitedGroups,\n setCurrentHilitedGroups,\n isVisualizationsEnabled,\n setIsVisualizationsEnabled,\n overlappedElementsMetadata,\n setOverlappedElementsMetadata,\n }),\n [showGroupColor, hiddenGroupsIds, groups, numberOfVisualizedGroups, isOverlappedColored, currentHilitedGroups, isVisualizationsEnabled, overlappedElementsMetadata]\n );\n\n const propertiesContextValue = useMemo(\n () => ({\n showGroupColor: propertiesShowGroup,\n setShowGroupColor: setPropertiesShowGroup,\n groupProperties,\n setGroupProperties,\n calculatedProperties,\n setCalculatedProperties,\n customCalculationProperties,\n setCustomCalculationProperties,\n }),\n [calculatedProperties, customCalculationProperties, groupProperties, propertiesShowGroup]\n );\n\n const customUIContextValue = useMemo(() => ({\n customUIs,\n setCustomUIs,\n }), [customUIs]);\n\n return (\n <QueryClientProvider client={queryClient}>\n <GroupingMappingApiConfigContext.Provider value={apiConfig}>\n <MappingClientContext.Provider value={mappingClient}>\n <ExtractionClientContext.Provider value={extractionClient}>\n <GroupingMappingCustomUIContext.Provider value={customUIContextValue}>\n <GroupHilitedElementsContext.Provider value={hilitedElementsContextValue}>\n <PropertiesContext.Provider value={propertiesContextValue}>\n {props.children}\n </PropertiesContext.Provider>\n </GroupHilitedElementsContext.Provider>\n </GroupingMappingCustomUIContext.Provider>\n </ExtractionClientContext.Provider>\n </MappingClientContext.Provider>\n </GroupingMappingApiConfigContext.Provider>\n </QueryClientProvider>\n );\n};\n"]}
1
+ {"version":3,"file":"GroupingMappingContext.js","sourceRoot":"","sources":["../../../src/components/GroupingMappingContext.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport type { IModelConnection } from \"@itwin/core-frontend\";\nimport { IModelApp } from \"@itwin/core-frontend\";\nimport type {\n ClientPrefix,\n GetAccessTokenFn,\n GroupingMappingApiConfig,\n} from \"./context/GroupingApiConfigContext\";\nimport { GroupingMappingApiConfigContext } from \"./context/GroupingApiConfigContext\";\nimport {\n createMappingClient,\n MappingClientContext,\n} from \"./context/MappingClientContext\";\nimport type { Group, IExtractionClient, IMappingsClient } from \"@itwin/insights-client\";\nimport { createGroupingMappingCustomUI, GroupingMappingCustomUIContext } from \"./context/GroupingMappingCustomUIContext\";\nimport type { GroupingMappingCustomUI } from \"./customUI/GroupingMappingCustomUI\";\nimport type { OverlappedElementsMetadata } from \"./context/GroupHilitedElementsContext\";\nimport { GroupHilitedElementsContext } from \"./context/GroupHilitedElementsContext\";\nimport { PropertiesGroupColorContext } from \"./context/PropertiesGroupColorContext\";\nimport { useActiveIModelConnection } from \"@itwin/appui-react\";\nimport { createExtractionClient, ExtractionClientContext } from \"./context/ExtractionClientContext\";\nimport type { Query } from \"@tanstack/react-query\";\nimport { MutationCache, QueryCache, QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { toaster } from \"@itwin/itwinui-react\";\nimport { getErrorMessage } from \"../common/utils\";\nimport { TErrCodes } from \"./Constants\";\nimport { ExtractionStatusJobContext } from \"./context/ExtractionStateJobContext\";\n\nexport interface GroupingMappingContextProps {\n /**\n * Custom callback to retrieve access token.\n */\n getAccessToken?: GetAccessTokenFn;\n /**\n * The iTwin iModel Id.\n */\n iModelId: string;\n /**\n * Used for iTwin and iModel APIs.\n * Also used for Mapping API if a custom {@link client} is not provided.\n */\n prefix?: ClientPrefix;\n /**\n * A custom implementation of MappingClient.\n */\n client?: IMappingsClient;\n /**\n * A custom implementation of ExtractionClient.\n */\n extractionClient?: IExtractionClient;\n /**\n * Custom UI to add and update groups or provide additional group context capabilities.\n */\n customUIs?: GroupingMappingCustomUI[];\n /**\n * A custom iModelConnection to use instead of the active iModelConnection from UiFramework.\n */\n iModelConnection?: IModelConnection;\n /**\n * A custom QueryClient. If not provided, a default QueryClient will be used.\n */\n queryClient?: QueryClient;\n children?: React.ReactNode;\n}\n\nconst authorizationClientGetAccessToken = async () =>\n (await IModelApp.authorizationClient?.getAccessToken()) ?? \"\";\n\nconst defaultQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n refetchOnWindowFocus: false,\n staleTime: 20 * 60 * 1000, // 20 minutes\n },\n },\n queryCache: new QueryCache({\n onError: (error: any, query: Query) => {\n switch (query.meta?.errorCode) {\n case TErrCodes.QUERY_HILITE_FETCH_FAILED:\n toaster.negative(query.meta?.message as string);\n break;\n default: {\n if (error.status)\n toaster.negative(getErrorMessage(error.status));\n else\n toaster.negative(\"An error occurred while fetching data.\");\n }\n }\n },\n }),\n mutationCache: new MutationCache({\n onError: (error: any) => {\n if (error.status)\n toaster.negative(getErrorMessage(error.status));\n else\n toaster.negative(\"A network error occured while processing this action.\");\n },\n }),\n});\n\nexport const GroupingMappingContext = (props: GroupingMappingContextProps) => {\n const activeIModelConntextion = useActiveIModelConnection();\n const clientProp: IMappingsClient | ClientPrefix = props.client ?? props.prefix;\n const extractionClientProp: IExtractionClient | ClientPrefix = props.extractionClient ?? props.prefix;\n const [mappingClient, setMappingClient] = useState<IMappingsClient>(createMappingClient(clientProp));\n const [extractionClient, setExtractionClient] = useState<IExtractionClient>(createExtractionClient(extractionClientProp));\n const [customUIs, setCustomUIs] = useState<GroupingMappingCustomUI[]>(\n createGroupingMappingCustomUI(props.customUIs),\n );\n const [apiConfig, setApiConfig] = useState<GroupingMappingApiConfig>({\n getAccessToken: props.getAccessToken ?? authorizationClientGetAccessToken,\n iModelId: props.iModelId,\n prefix: props.prefix,\n });\n const [hiddenGroupsIds, setHiddenGroupsIds] = useState<Set<string>>(new Set());\n const [showGroupColor, setShowGroupColor] = useState<boolean>(false);\n const [propertiesShowGroup, setPropertiesShowGroup] = useState<boolean>(false);\n const [groups, setGroups] = useState<Group[]>([]);\n const [numberOfVisualizedGroups, setNumberOfVisualizedGroups] = useState(0);\n const [isOverlappedColored, setIsOverlappedColored] = useState<boolean>(false);\n const [currentHilitedGroups, setCurrentHilitedGroups] = useState<number>(1);\n const [isVisualizationsEnabled, setIsVisualizationsEnabled] = useState<boolean>(false);\n const [overlappedElementsMetadata, setOverlappedElementsMetadata] = useState<OverlappedElementsMetadata>({\n overlappedElementsInfo: new Map(),\n groupElementsInfo: new Map(),\n overlappedElementGroupPairs: [],\n });\n const queryClient = props.queryClient ?? defaultQueryClient;\n const [mappingIdJobInfo, setMappingIdJobInfo] = useState<Map<string, string>>(new Map());\n\n useEffect(() => {\n setApiConfig(() => ({\n prefix: props.prefix,\n iModelId: props.iModelId,\n getAccessToken: props.getAccessToken ?? authorizationClientGetAccessToken,\n iModelConnection: props.iModelConnection ?? activeIModelConntextion,\n }));\n }, [activeIModelConntextion, props.getAccessToken, props.iModelConnection, props.iModelId, props.prefix]);\n\n useEffect(() => {\n setMappingClient(createMappingClient(clientProp));\n }, [clientProp]);\n\n useEffect(() => {\n setExtractionClient(createExtractionClient(extractionClientProp));\n }, [extractionClientProp]);\n\n useEffect(() => {\n setCustomUIs(createGroupingMappingCustomUI(props.customUIs));\n }, [props.customUIs]);\n\n const hilitedElementsContextValue = useMemo(\n () => ({\n showGroupColor,\n setShowGroupColor,\n hiddenGroupsIds,\n setHiddenGroupsIds,\n groups,\n setGroups,\n numberOfVisualizedGroups,\n setNumberOfVisualizedGroups,\n isOverlappedColored,\n setIsOverlappedColored,\n currentHilitedGroups,\n setCurrentHilitedGroups,\n isVisualizationsEnabled,\n setIsVisualizationsEnabled,\n overlappedElementsMetadata,\n setOverlappedElementsMetadata,\n }),\n [showGroupColor, hiddenGroupsIds, groups, numberOfVisualizedGroups, isOverlappedColored, currentHilitedGroups, isVisualizationsEnabled, overlappedElementsMetadata]\n );\n\n const propertiesContextValue = useMemo(\n () => ({\n showGroupColor: propertiesShowGroup,\n setShowGroupColor: setPropertiesShowGroup,\n }),\n [propertiesShowGroup]\n );\n\n const customUIContextValue = useMemo(() => ({\n customUIs,\n setCustomUIs,\n }), [customUIs]);\n\n const extractionStateJobContextValue = useMemo(() => ({\n mappingIdJobInfo,\n setMappingIdJobInfo,\n }), [mappingIdJobInfo]);\n\n return (\n <QueryClientProvider client={queryClient}>\n <GroupingMappingApiConfigContext.Provider value={apiConfig}>\n <MappingClientContext.Provider value={mappingClient}>\n <ExtractionClientContext.Provider value={extractionClient}>\n <ExtractionStatusJobContext.Provider value={extractionStateJobContextValue}>\n <GroupingMappingCustomUIContext.Provider value={customUIContextValue}>\n <GroupHilitedElementsContext.Provider value={hilitedElementsContextValue}>\n <PropertiesGroupColorContext.Provider value={propertiesContextValue}>\n {props.children}\n </PropertiesGroupColorContext.Provider>\n </GroupHilitedElementsContext.Provider>\n </GroupingMappingCustomUIContext.Provider>\n </ExtractionStatusJobContext.Provider>\n </ExtractionClientContext.Provider>\n </MappingClientContext.Provider>\n </GroupingMappingApiConfigContext.Provider>\n </QueryClientProvider>\n );\n};\n"]}
@@ -75,15 +75,37 @@ const GroupsVisualization = ({ emphasizeElements = true, isNonEmphasizedSelectab
75
75
  const isGroupsQueriesReady = (0, react_1.useMemo)(() => groupQueries.every((query) => query.isFetched && query.data) && groupQueries.length > 0, [groupQueries]);
76
76
  const groupQueriesProgressCount = (0, react_1.useMemo)(() => groupQueries.filter((query) => query.isFetched).length, [groupQueries]);
77
77
  const isResolvingGroupQueries = (0, react_1.useMemo)(() => groupQueries.some((query) => query.isFetching), [groupQueries]);
78
- const hiliteIds = (0, react_1.useMemo)(() => isGroupsQueriesReady
79
- ? groupQueries.map((query) => ({
80
- groupId: query.data.group.id,
81
- elementIds: query.data.result.ids,
82
- }))
83
- : [], [groupQueries, isGroupsQueriesReady]);
78
+ const hiliteIds = (0, react_1.useMemo)(() => {
79
+ if (!isGroupsQueriesReady || !groups)
80
+ return [];
81
+ // Map to track which groups have been processed for each query to ensure unique associations between groups and queries
82
+ const processedGroupIds = new Map();
83
+ return groupQueries.flatMap((query) => {
84
+ // Find all groups that match the current query and haven't been processed yet for this query
85
+ const matchingGroups = groups.filter((group) => {
86
+ const isMatch = group.query === query.data.query;
87
+ const isProcessed = processedGroupIds.get(query.data.query)?.includes(group.id);
88
+ return isMatch && !isProcessed;
89
+ });
90
+ matchingGroups.forEach((group) => {
91
+ const existingGroupIds = processedGroupIds.get(query.data.query);
92
+ if (existingGroupIds) {
93
+ existingGroupIds.push(group.id);
94
+ }
95
+ else {
96
+ processedGroupIds.set(query.data.query, [group.id]);
97
+ }
98
+ });
99
+ // Map each matching group to an object with groupId and elementIds
100
+ return matchingGroups.map((group) => ({
101
+ groupId: group.id,
102
+ elementIds: query.data.result.ids,
103
+ }));
104
+ });
105
+ }, [groupQueries, isGroupsQueriesReady, groups]);
84
106
  const getHiliteIdsFromGroupsWrapper = (0, react_1.useCallback)((groups) => hiliteIds.filter((id) => groups.some((group) => group.id === id.groupId)).flatMap((id) => id.elementIds), [hiliteIds]);
85
107
  (0, react_1.useEffect)(() => {
86
- const processOverlappedGroups = () => {
108
+ const processOverlappedGroups = async () => {
87
109
  const results = (0, groupsHelpers_1.generateOverlappedGroups)(hiliteIds);
88
110
  const { groupsWithGroupedOverlaps, overlappedElementsInfo, numberOfElementsInGroups } = results;
89
111
  setOverlappedElementsMetadata({
@@ -92,7 +114,7 @@ const GroupsVisualization = ({ emphasizeElements = true, isNonEmphasizedSelectab
92
114
  overlappedElementGroupPairs: groupsWithGroupedOverlaps,
93
115
  });
94
116
  if (showGroupColor) {
95
- visualizationMutation.mutate(groupsWithGroupedOverlaps);
117
+ await visualizationMutation.mutateAsync(groupsWithGroupedOverlaps);
96
118
  }
97
119
  else {
98
120
  (0, viewerUtils_1.clearEmphasizedOverriddenElements)();
@@ -102,7 +124,7 @@ const GroupsVisualization = ({ emphasizeElements = true, isNonEmphasizedSelectab
102
124
  };
103
125
  const shouldProcessOverlappedGroups = () => !isOverlappedColored && hiliteIds.length > 0 && !isGroupsFetching;
104
126
  if (shouldProcessOverlappedGroups()) {
105
- processOverlappedGroups();
127
+ void processOverlappedGroups();
106
128
  }
107
129
  // We don't want to trigger full visualization when toggling individual groups.
108
130
  // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -1 +1 @@
1
- {"version":3,"file":"GroupsVisualization.js","sourceRoot":"","sources":["../../../../src/components/Groups/GroupsVisualization.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport type { Group } from \"@itwin/insights-client\";\nimport React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { OverlappedElementGroupPairs } from \"../context/GroupHilitedElementsContext\";\nimport { useGroupHilitedElementsContext } from \"../context/GroupHilitedElementsContext\";\nimport {\n generateOverlappedGroups,\n hideGroupConsideringOverlaps,\n hideGroupIds,\n visualizeGroupColors,\n} from \"./groupsHelpers\";\nimport {\n clearEmphasizedElements,\n clearEmphasizedOverriddenElements,\n clearHiddenElements,\n hideElements,\n zoomToElements,\n} from \"../../common/viewerUtils\";\nimport type { GroupsProps } from \"./Groups\";\nimport { Groups } from \"./Groups\";\nimport { GroupColorLegend } from \"./GroupColorLegend\";\nimport { GroupVisualizationActions } from \"./GroupsVisualizationActions\";\nimport { GroupsShowHideButtons } from \"./GroupsShowHideButtons\";\nimport \"./GroupsVisualization.scss\";\nimport { useGroupingMappingApiConfig } from \"../context/GroupingApiConfigContext\";\nimport type { ActionButtonRenderer, ActionButtonRendererProps } from \"./GroupsView\";\nimport { Alert, Icon, Text } from \"@itwin/itwinui-react\";\nimport { SvgMore } from \"@itwin/itwinui-icons-react\";\nimport { useMappingClient } from \"../context/MappingClientContext\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { useIsMounted } from \"../../common/hooks/useIsMounted\";\nimport { useFetchGroups } from \"./hooks/useFetchGroups\";\nimport { useKeySetHiliteQueries } from \"./hooks/useKeySetHiliteQueries\";\n\nexport interface GroupsVisualizationProps extends GroupsProps {\n isNonEmphasizedSelectable?: boolean;\n emphasizeElements?: boolean;\n}\n\nexport const GroupsVisualization = ({\n emphasizeElements = true,\n isNonEmphasizedSelectable = false,\n onClickGroupModify,\n onClickAddGroup,\n mapping,\n ...rest\n}: GroupsVisualizationProps) => {\n const { iModelConnection } = useGroupingMappingApiConfig();\n if (!iModelConnection) {\n throw new Error(\"This component requires an active iModelConnection.\");\n }\n const [isAlertClosed, setIsAlertClosed] = useState<boolean>(true);\n const [isAlertExpanded, setIsAlertExpanded] = useState<boolean>(false);\n const {\n hiddenGroupsIds,\n showGroupColor,\n setShowGroupColor,\n isOverlappedColored,\n setHiddenGroupsIds,\n setNumberOfVisualizedGroups,\n isVisualizationsEnabled,\n setIsVisualizationsEnabled,\n overlappedElementsMetadata,\n setOverlappedElementsMetadata,\n } = useGroupHilitedElementsContext();\n const { getAccessToken, iModelId } = useGroupingMappingApiConfig();\n const mappingClient = useMappingClient();\n const { data: groups, isFetched: isGroupsFetched, isFetching: isGroupsFetching } = useFetchGroups(iModelId, mapping.id, getAccessToken, mappingClient);\n const isMounted = useIsMounted();\n const [enableGroupQueries, setEnableGroupQueries] = useState<boolean>(false);\n const { groupQueries } = useKeySetHiliteQueries(groups ?? [], enableGroupQueries, iModelConnection);\n\n const triggerVisualization = useCallback(async (groupsWithGroupedOverlaps: OverlappedElementGroupPairs[]) =>\n visualizeGroupColors(\n hiddenGroupsIds,\n groupsWithGroupedOverlaps,\n setNumberOfVisualizedGroups,\n emphasizeElements,\n ), [emphasizeElements, hiddenGroupsIds, setNumberOfVisualizedGroups]);\n\n const zoomToElementsMutation = useMutation({\n mutationFn: zoomToElements,\n onSuccess: () => {\n if (isMounted()) {\n isNonEmphasizedSelectable && clearEmphasizedElements();\n }\n },\n });\n\n const visualizationMutation = useMutation({\n mutationFn: triggerVisualization,\n onSuccess: (allIds) => {\n if (isMounted()) {\n zoomToElementsMutation.mutate(allIds);\n }\n },\n });\n\n const isGroupsQueriesReady = useMemo(() =>\n groupQueries.every((query) => query.isFetched && query.data) && groupQueries.length > 0, [groupQueries]\n );\n const groupQueriesProgressCount = useMemo(() => groupQueries.filter((query) => query.isFetched).length, [groupQueries]);\n const isResolvingGroupQueries = useMemo(() => groupQueries.some((query) => query.isFetching), [groupQueries]);\n\n const hiliteIds = useMemo(\n () =>\n isGroupsQueriesReady\n ? groupQueries.map((query) => ({\n groupId: query.data!.group.id,\n elementIds: query.data!.result.ids,\n }))\n : [],\n [groupQueries, isGroupsQueriesReady]\n );\n const getHiliteIdsFromGroupsWrapper = useCallback(\n (groups: Group[]) =>\n hiliteIds.filter((id) => groups.some((group) => group.id === id.groupId)).flatMap((id) => id.elementIds),\n [hiliteIds]\n );\n\n useEffect(() => {\n const processOverlappedGroups = () => {\n const results = generateOverlappedGroups(hiliteIds);\n const { groupsWithGroupedOverlaps, overlappedElementsInfo, numberOfElementsInGroups } = results;\n\n setOverlappedElementsMetadata({\n overlappedElementsInfo,\n groupElementsInfo: numberOfElementsInGroups,\n overlappedElementGroupPairs: groupsWithGroupedOverlaps,\n });\n\n if (showGroupColor) {\n visualizationMutation.mutate(groupsWithGroupedOverlaps);\n } else {\n clearEmphasizedOverriddenElements();\n }\n\n clearHiddenElements();\n hideGroupIds(hiddenGroupsIds, groupsWithGroupedOverlaps);\n };\n\n const shouldProcessOverlappedGroups = () => !isOverlappedColored && hiliteIds.length > 0 && !isGroupsFetching;\n\n if (shouldProcessOverlappedGroups()) {\n processOverlappedGroups();\n }\n // We don't want to trigger full visualization when toggling individual groups.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [showGroupColor, isOverlappedColored, hiliteIds]);\n\n useEffect(() => {\n if (isVisualizationsEnabled) {\n setEnableGroupQueries(true);\n } else {\n setShowGroupColor(false);\n clearHiddenElements();\n setHiddenGroupsIds(new Set());\n }\n }, [isVisualizationsEnabled, setHiddenGroupsIds, setIsVisualizationsEnabled, setShowGroupColor]);\n\n const hideAllGroups = useCallback(\n () => {\n if (!groups) return;\n hideElements(getHiliteIdsFromGroupsWrapper(groups));\n },\n [getHiliteIdsFromGroupsWrapper, groups]\n );\n\n const hideSingleGroupWrapper = useCallback(\n (groupToHide: Group) => {\n hideGroupConsideringOverlaps(overlappedElementsMetadata.overlappedElementGroupPairs, groupToHide.id, hiddenGroupsIds);\n },\n [hiddenGroupsIds, overlappedElementsMetadata.overlappedElementGroupPairs]\n );\n\n const showGroup = useCallback(\n (viewGroup: Group) => {\n if (!groups) return;\n clearHiddenElements();\n\n // hide group Ids filter\n const newHiddenGroups: Group[] = groups.filter((g) => hiddenGroupsIds.has(g.id) && g.id !== viewGroup.id);\n\n // view group Ids filter\n const viewGroups = groups.filter((g) => !hiddenGroupsIds.has(g.id) || g.id === viewGroup.id);\n const viewIds = getHiliteIdsFromGroupsWrapper(viewGroups);\n\n let hiddenIds = getHiliteIdsFromGroupsWrapper(newHiddenGroups);\n hiddenIds = hiddenIds.filter((id) => !viewIds.includes(id));\n hideElements(hiddenIds);\n },\n [groups, hiddenGroupsIds, getHiliteIdsFromGroupsWrapper]\n );\n\n const showAll = useCallback(() => {\n clearHiddenElements();\n setHiddenGroupsIds(new Set());\n }, [setHiddenGroupsIds]);\n\n const hideAll = useCallback(() => {\n if (!groups) return;\n hideAllGroups();\n setHiddenGroupsIds(\n new Set(groups.map((g) => g.id))\n );\n\n }, [\n setHiddenGroupsIds,\n groups,\n hideAllGroups,\n ]);\n\n const onModify = useCallback(\n (group: Group, type: string) => {\n if (!onClickGroupModify) return;\n if (group.id && hiddenGroupsIds.has(group.id)) {\n showGroup(group);\n setHiddenGroupsIds(new Set([...hiddenGroupsIds].filter((id) => id !== group.id)));\n }\n clearEmphasizedElements();\n onClickGroupModify(group, type);\n },\n [hiddenGroupsIds, onClickGroupModify, setHiddenGroupsIds, showGroup]\n );\n\n const onAddGroup = useCallback(\n (type: string) => {\n if (!onClickAddGroup) return;\n onClickAddGroup(type);\n clearEmphasizedElements();\n },\n [onClickAddGroup]\n );\n\n const groupActionButtonRenderers: ActionButtonRenderer[] = useMemo(() => isVisualizationsEnabled ? [\n (props: ActionButtonRendererProps) =>\n showGroupColor ? <GroupColorLegend {...props} groups={groups ?? []} /> : [],\n (props: ActionButtonRendererProps) => (\n <GroupsShowHideButtons\n {...props}\n isLoadingQuery={!(isVisualizationsEnabled && isGroupsFetched && isGroupsQueriesReady)}\n showGroup={showGroup}\n hideGroup={hideSingleGroupWrapper}\n />\n ),\n ].flat() : [], [groups, hideSingleGroupWrapper, isGroupsFetched, isGroupsQueriesReady, isVisualizationsEnabled, showGroup, showGroupColor]);\n\n const overlappedAlert = useMemo(() =>\n overlappedElementsMetadata.overlappedElementsInfo.size > 0 && isAlertClosed && showGroupColor ?\n <Alert\n onClose={() => setIsAlertClosed(false)}\n clickableText={isAlertExpanded ? \"Less Details\" : \"More Details\"}\n clickableTextProps={{ onClick: () => setIsAlertExpanded(!isAlertExpanded) }}\n >\n Overlapping elements are colored <Text className=\"gmw-red-text\">red</Text> in the viewer.\n {isAlertExpanded ? (\n <>\n <br />\n To get overlap info in detail, click the <Icon><SvgMore /></Icon> button then &ldquo;Overlap Info&rdquo;\n </>\n ) : undefined}\n </Alert> : undefined, [isAlertClosed, isAlertExpanded, overlappedElementsMetadata.overlappedElementsInfo.size, showGroupColor]\n );\n\n const progressConfig = useMemo(\n () =>\n isVisualizationsEnabled && isResolvingGroupQueries\n ? {\n hilitedGroupsProgress: {\n currentHilitedGroups: groupQueriesProgressCount,\n totalNumberOfGroups: groups?.length ?? 0,\n },\n }\n : undefined,\n [groupQueriesProgressCount, groups, isResolvingGroupQueries, isVisualizationsEnabled],\n );\n\n return (\n <div className=\"gmw-groups-vis-container\">\n <GroupVisualizationActions\n disabled={!(isVisualizationsEnabled && isGroupsFetched && isGroupsQueriesReady)}\n isVisualizationEnabled={isVisualizationsEnabled}\n onClickVisualizationButton={() => setIsVisualizationsEnabled((b) => !b)}\n showAll={showAll}\n hideAll={hideAll}\n />\n <Groups\n onClickGroupModify={onModify}\n onClickAddGroup={onAddGroup}\n actionButtonRenderers={groupActionButtonRenderers}\n mapping={mapping}\n {...rest}\n progressConfig={progressConfig}\n alert={overlappedAlert}\n />\n </div>\n );\n};\n"]}
1
+ {"version":3,"file":"GroupsVisualization.js","sourceRoot":"","sources":["../../../../src/components/Groups/GroupsVisualization.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,+CAAyE;AAEzE,wFAAwF;AACxF,mDAKyB;AACzB,0DAMkC;AAElC,qCAAkC;AAClC,yDAAsD;AACtD,6EAAyE;AACzE,mEAAgE;AAChE,sCAAoC;AACpC,kFAAkF;AAElF,wDAAyD;AACzD,oEAAqD;AACrD,0EAAmE;AACnE,uDAAoD;AACpD,kEAA+D;AAC/D,2DAAwD;AACxD,2EAAwE;AAOjE,MAAM,mBAAmB,GAAG,CAAC,EAClC,iBAAiB,GAAG,IAAI,EACxB,yBAAyB,GAAG,KAAK,EACjC,kBAAkB,EAClB,eAAe,EACf,OAAO,EACP,GAAG,IAAI,EACkB,EAAE,EAAE;IAC7B,MAAM,EAAE,gBAAgB,EAAE,GAAG,IAAA,sDAA2B,GAAE,CAAC;IAC3D,IAAI,CAAC,gBAAgB,EAAE;QACrB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;KACxE;IACD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,IAAA,gBAAQ,EAAU,IAAI,CAAC,CAAC;IAClE,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,IAAA,gBAAQ,EAAU,KAAK,CAAC,CAAC;IACvE,MAAM,EACJ,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,2BAA2B,EAC3B,uBAAuB,EACvB,0BAA0B,EAC1B,0BAA0B,EAC1B,6BAA6B,GAC9B,GAAG,IAAA,4DAA8B,GAAE,CAAC;IACrC,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,IAAA,sDAA2B,GAAE,CAAC;IACnE,MAAM,aAAa,GAAG,IAAA,uCAAgB,GAAE,CAAC;IACzC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,IAAA,+BAAc,EAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;IACvJ,MAAM,SAAS,GAAG,IAAA,2BAAY,GAAE,CAAC;IACjC,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,IAAA,gBAAQ,EAAU,KAAK,CAAC,CAAC;IAC7E,MAAM,EAAE,YAAY,EAAE,GAAG,IAAA,+CAAsB,EAAC,MAAM,IAAI,EAAE,EAAE,kBAAkB,EAAE,gBAAgB,CAAC,CAAC;IAEpG,MAAM,oBAAoB,GAAG,IAAA,mBAAW,EAAC,KAAK,EAAE,yBAAwD,EAAE,EAAE,CAC1G,IAAA,oCAAoB,EAClB,eAAe,EACf,yBAAyB,EACzB,2BAA2B,EAC3B,iBAAiB,CAClB,EAAE,CAAC,iBAAiB,EAAE,eAAe,EAAE,2BAA2B,CAAC,CAAC,CAAC;IAExE,MAAM,sBAAsB,GAAG,IAAA,yBAAW,EAAC;QACzC,UAAU,EAAE,4BAAc;QAC1B,SAAS,EAAE,GAAG,EAAE;YACd,IAAI,SAAS,EAAE,EAAE;gBACf,yBAAyB,IAAI,IAAA,qCAAuB,GAAE,CAAC;aACxD;QACH,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,qBAAqB,GAAG,IAAA,yBAAW,EAAC;QACxC,UAAU,EAAE,oBAAoB;QAChC,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;YACpB,IAAI,SAAS,EAAE,EAAE;gBACf,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;aACvC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,oBAAoB,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,CACxC,YAAY,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,CACxG,CAAC;IACF,MAAM,yBAAyB,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IACxH,MAAM,uBAAuB,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAE9G,MAAM,SAAS,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE;QAC7B,IAAI,CAAC,oBAAoB,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QAEhD,wHAAwH;QACxH,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAoB,CAAC;QAEtD,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACpC,6FAA6F;YAC7F,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,IAAK,CAAC,KAAK,CAAC;gBAClD,MAAM,WAAW,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAK,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACjF,OAAO,OAAO,IAAI,CAAC,WAAW,CAAC;YACjC,CAAC,CAAC,CAAC;YAEH,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC/B,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAK,CAAC,KAAK,CAAC,CAAC;gBAClE,IAAI,gBAAgB,EAAE;oBACpB,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;iBACjC;qBAAM;oBACL,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAK,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;iBACtD;YACH,CAAC,CAAC,CAAC;YAEH,mEAAmE;YACnE,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACpC,OAAO,EAAE,KAAK,CAAC,EAAE;gBACjB,UAAU,EAAE,KAAK,CAAC,IAAK,CAAC,MAAM,CAAC,GAAG;aACnC,CAAC,CAAC,CAAC;QACN,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,YAAY,EAAE,oBAAoB,EAAE,MAAM,CAAC,CAAC,CAAC;IAEjD,MAAM,6BAA6B,GAAG,IAAA,mBAAW,EAC/C,CAAC,MAAe,EAAE,EAAE,CAClB,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAC1G,CAAC,SAAS,CAAC,CACZ,CAAC;IAEF,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,uBAAuB,GAAG,KAAK,IAAI,EAAE;YACzC,MAAM,OAAO,GAAG,IAAA,wCAAwB,EAAC,SAAS,CAAC,CAAC;YACpD,MAAM,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,GAAG,OAAO,CAAC;YAEhG,6BAA6B,CAAC;gBAC5B,sBAAsB;gBACtB,iBAAiB,EAAE,wBAAwB;gBAC3C,2BAA2B,EAAE,yBAAyB;aACvD,CAAC,CAAC;YAEH,IAAI,cAAc,EAAE;gBAClB,MAAM,qBAAqB,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC;aACpE;iBAAM;gBACL,IAAA,+CAAiC,GAAE,CAAC;aACrC;YAED,IAAA,iCAAmB,GAAE,CAAC;YACtB,IAAA,4BAAY,EAAC,eAAe,EAAE,yBAAyB,CAAC,CAAC;QAC3D,CAAC,CAAC;QAEF,MAAM,6BAA6B,GAAG,GAAG,EAAE,CAAC,CAAC,mBAAmB,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC;QAE9G,IAAI,6BAA6B,EAAE,EAAE;YACnC,KAAK,uBAAuB,EAAE,CAAC;SAChC;QACD,+EAA+E;QAC/E,uDAAuD;IACzD,CAAC,EAAE,CAAC,cAAc,EAAE,mBAAmB,EAAE,SAAS,CAAC,CAAC,CAAC;IAErD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,uBAAuB,EAAE;YAC3B,qBAAqB,CAAC,IAAI,CAAC,CAAC;SAC7B;aAAM;YACL,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACzB,IAAA,iCAAmB,GAAE,CAAC;YACtB,kBAAkB,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;SAC/B;IACH,CAAC,EAAE,CAAC,uBAAuB,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAEjG,MAAM,aAAa,GAAG,IAAA,mBAAW,EAC/B,GAAG,EAAE;QACH,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,IAAA,0BAAY,EAAC,6BAA6B,CAAC,MAAM,CAAC,CAAC,CAAC;IACtD,CAAC,EACD,CAAC,6BAA6B,EAAE,MAAM,CAAC,CACxC,CAAC;IAEF,MAAM,sBAAsB,GAAG,IAAA,mBAAW,EACxC,CAAC,WAAkB,EAAE,EAAE;QACrB,IAAA,4CAA4B,EAAC,0BAA0B,CAAC,2BAA2B,EAAE,WAAW,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;IACxH,CAAC,EACD,CAAC,eAAe,EAAE,0BAA0B,CAAC,2BAA2B,CAAC,CAC1E,CAAC;IAEF,MAAM,SAAS,GAAG,IAAA,mBAAW,EAC3B,CAAC,SAAgB,EAAE,EAAE;QACnB,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,IAAA,iCAAmB,GAAE,CAAC;QAEtB,wBAAwB;QACxB,MAAM,eAAe,GAAY,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,CAAC,CAAC;QAE1G,wBAAwB;QACxB,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,CAAC,CAAC;QAC7F,MAAM,OAAO,GAAG,6BAA6B,CAAC,UAAU,CAAC,CAAC;QAE1D,IAAI,SAAS,GAAG,6BAA6B,CAAC,eAAe,CAAC,CAAC;QAC/D,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5D,IAAA,0BAAY,EAAC,SAAS,CAAC,CAAC;IAC1B,CAAC,EACD,CAAC,MAAM,EAAE,eAAe,EAAE,6BAA6B,CAAC,CACzD,CAAC;IAEF,MAAM,OAAO,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE;QAC/B,IAAA,iCAAmB,GAAE,CAAC;QACtB,kBAAkB,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAChC,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAEzB,MAAM,OAAO,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE;QAC/B,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,aAAa,EAAE,CAAC;QAChB,kBAAkB,CAChB,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CACjC,CAAC;IAEJ,CAAC,EAAE;QACD,kBAAkB;QAClB,MAAM;QACN,aAAa;KACd,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,IAAA,mBAAW,EAC1B,CAAC,KAAY,EAAE,IAAY,EAAE,EAAE;QAC7B,IAAI,CAAC,kBAAkB;YAAE,OAAO;QAChC,IAAI,KAAK,CAAC,EAAE,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;YAC7C,SAAS,CAAC,KAAK,CAAC,CAAC;YACjB,kBAAkB,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SACnF;QACD,IAAA,qCAAuB,GAAE,CAAC;QAC1B,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC,EACD,CAAC,eAAe,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,SAAS,CAAC,CACrE,CAAC;IAEF,MAAM,UAAU,GAAG,IAAA,mBAAW,EAC5B,CAAC,IAAY,EAAE,EAAE;QACf,IAAI,CAAC,eAAe;YAAE,OAAO;QAC7B,eAAe,CAAC,IAAI,CAAC,CAAC;QACtB,IAAA,qCAAuB,GAAE,CAAC;IAC5B,CAAC,EACD,CAAC,eAAe,CAAC,CAClB,CAAC;IAEF,MAAM,0BAA0B,GAA2B,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACjG,CAAC,KAAgC,EAAE,EAAE,CACnC,cAAc,CAAC,CAAC,CAAC,8BAAC,mCAAgB,OAAK,KAAK,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,GAAI,CAAC,CAAC,CAAC,EAAE;QAC7E,CAAC,KAAgC,EAAE,EAAE,CAAC,CACpC,8BAAC,6CAAqB,OAChB,KAAK,EACT,cAAc,EAAE,CAAC,CAAC,uBAAuB,IAAI,eAAe,IAAI,oBAAoB,CAAC,EACrF,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,sBAAsB,GACjC,CACH;KACF,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,sBAAsB,EAAE,eAAe,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;IAE5I,MAAM,eAAe,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,CACnC,0BAA0B,CAAC,sBAAsB,CAAC,IAAI,GAAG,CAAC,IAAI,aAAa,IAAI,cAAc,CAAC,CAAC;QAC7F,8BAAC,qBAAK,IACJ,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,EACtC,aAAa,EAAE,eAAe,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,EAChE,kBAAkB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC,eAAe,CAAC,EAAE;;YAE1C,8BAAC,oBAAI,IAAC,SAAS,EAAC,cAAc,UAAW;;YACzE,eAAe,CAAC,CAAC,CAAC,CACjB;gBACE,yCAAM;;gBACmC,8BAAC,oBAAI;oBAAC,8BAAC,6BAAO,OAAG,CAAO;wDAChE,CACJ,CAAC,CAAC,CAAC,SAAS,CACP,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,aAAa,EAAE,eAAe,EAAE,0BAA0B,CAAC,sBAAsB,CAAC,IAAI,EAAE,cAAc,CAAC,CACjI,CAAC;IAEF,MAAM,cAAc,GAAG,IAAA,eAAO,EAC5B,GAAG,EAAE,CACH,uBAAuB,IAAI,uBAAuB;QAChD,CAAC,CAAC;YACA,qBAAqB,EAAE;gBACrB,oBAAoB,EAAE,yBAAyB;gBAC/C,mBAAmB,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;aACzC;SACF;QACD,CAAC,CAAC,SAAS,EACf,CAAC,yBAAyB,EAAE,MAAM,EAAE,uBAAuB,EAAE,uBAAuB,CAAC,CACtF,CAAC;IAEF,OAAO,CACL,uCAAK,SAAS,EAAC,0BAA0B;QACvC,8BAAC,sDAAyB,IACxB,QAAQ,EAAE,CAAC,CAAC,uBAAuB,IAAI,eAAe,IAAI,oBAAoB,CAAC,EAC/E,sBAAsB,EAAE,uBAAuB,EAC/C,0BAA0B,EAAE,GAAG,EAAE,CAAC,0BAA0B,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EACvE,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GAChB;QACF,8BAAC,eAAM,IACL,kBAAkB,EAAE,QAAQ,EAC5B,eAAe,EAAE,UAAU,EAC3B,qBAAqB,EAAE,0BAA0B,EACjD,OAAO,EAAE,OAAO,KACZ,IAAI,EACR,cAAc,EAAE,cAAc,EAC9B,KAAK,EAAE,eAAe,GACtB,CACE,CACP,CAAC;AACJ,CAAC,CAAC;AAvRW,QAAA,mBAAmB,uBAuR9B","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport type { Group } from \"@itwin/insights-client\";\nimport React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { OverlappedElementGroupPairs } from \"../context/GroupHilitedElementsContext\";\nimport { useGroupHilitedElementsContext } from \"../context/GroupHilitedElementsContext\";\nimport {\n generateOverlappedGroups,\n hideGroupConsideringOverlaps,\n hideGroupIds,\n visualizeGroupColors,\n} from \"./groupsHelpers\";\nimport {\n clearEmphasizedElements,\n clearEmphasizedOverriddenElements,\n clearHiddenElements,\n hideElements,\n zoomToElements,\n} from \"../../common/viewerUtils\";\nimport type { GroupsProps } from \"./Groups\";\nimport { Groups } from \"./Groups\";\nimport { GroupColorLegend } from \"./GroupColorLegend\";\nimport { GroupVisualizationActions } from \"./GroupsVisualizationActions\";\nimport { GroupsShowHideButtons } from \"./GroupsShowHideButtons\";\nimport \"./GroupsVisualization.scss\";\nimport { useGroupingMappingApiConfig } from \"../context/GroupingApiConfigContext\";\nimport type { ActionButtonRenderer, ActionButtonRendererProps } from \"./GroupsView\";\nimport { Alert, Icon, Text } from \"@itwin/itwinui-react\";\nimport { SvgMore } from \"@itwin/itwinui-icons-react\";\nimport { useMappingClient } from \"../context/MappingClientContext\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { useIsMounted } from \"../../common/hooks/useIsMounted\";\nimport { useFetchGroups } from \"./hooks/useFetchGroups\";\nimport { useKeySetHiliteQueries } from \"./hooks/useKeySetHiliteQueries\";\n\nexport interface GroupsVisualizationProps extends GroupsProps {\n isNonEmphasizedSelectable?: boolean;\n emphasizeElements?: boolean;\n}\n\nexport const GroupsVisualization = ({\n emphasizeElements = true,\n isNonEmphasizedSelectable = false,\n onClickGroupModify,\n onClickAddGroup,\n mapping,\n ...rest\n}: GroupsVisualizationProps) => {\n const { iModelConnection } = useGroupingMappingApiConfig();\n if (!iModelConnection) {\n throw new Error(\"This component requires an active iModelConnection.\");\n }\n const [isAlertClosed, setIsAlertClosed] = useState<boolean>(true);\n const [isAlertExpanded, setIsAlertExpanded] = useState<boolean>(false);\n const {\n hiddenGroupsIds,\n showGroupColor,\n setShowGroupColor,\n isOverlappedColored,\n setHiddenGroupsIds,\n setNumberOfVisualizedGroups,\n isVisualizationsEnabled,\n setIsVisualizationsEnabled,\n overlappedElementsMetadata,\n setOverlappedElementsMetadata,\n } = useGroupHilitedElementsContext();\n const { getAccessToken, iModelId } = useGroupingMappingApiConfig();\n const mappingClient = useMappingClient();\n const { data: groups, isFetched: isGroupsFetched, isFetching: isGroupsFetching } = useFetchGroups(iModelId, mapping.id, getAccessToken, mappingClient);\n const isMounted = useIsMounted();\n const [enableGroupQueries, setEnableGroupQueries] = useState<boolean>(false);\n const { groupQueries } = useKeySetHiliteQueries(groups ?? [], enableGroupQueries, iModelConnection);\n\n const triggerVisualization = useCallback(async (groupsWithGroupedOverlaps: OverlappedElementGroupPairs[]) =>\n visualizeGroupColors(\n hiddenGroupsIds,\n groupsWithGroupedOverlaps,\n setNumberOfVisualizedGroups,\n emphasizeElements,\n ), [emphasizeElements, hiddenGroupsIds, setNumberOfVisualizedGroups]);\n\n const zoomToElementsMutation = useMutation({\n mutationFn: zoomToElements,\n onSuccess: () => {\n if (isMounted()) {\n isNonEmphasizedSelectable && clearEmphasizedElements();\n }\n },\n });\n\n const visualizationMutation = useMutation({\n mutationFn: triggerVisualization,\n onSuccess: (allIds) => {\n if (isMounted()) {\n zoomToElementsMutation.mutate(allIds);\n }\n },\n });\n\n const isGroupsQueriesReady = useMemo(() =>\n groupQueries.every((query) => query.isFetched && query.data) && groupQueries.length > 0, [groupQueries]\n );\n const groupQueriesProgressCount = useMemo(() => groupQueries.filter((query) => query.isFetched).length, [groupQueries]);\n const isResolvingGroupQueries = useMemo(() => groupQueries.some((query) => query.isFetching), [groupQueries]);\n\n const hiliteIds = useMemo(() => {\n if (!isGroupsQueriesReady || !groups) return [];\n\n // Map to track which groups have been processed for each query to ensure unique associations between groups and queries\n const processedGroupIds = new Map<string, string[]>();\n\n return groupQueries.flatMap((query) => {\n // Find all groups that match the current query and haven't been processed yet for this query\n const matchingGroups = groups.filter((group) => {\n const isMatch = group.query === query.data!.query;\n const isProcessed = processedGroupIds.get(query.data!.query)?.includes(group.id);\n return isMatch && !isProcessed;\n });\n\n matchingGroups.forEach((group) => {\n const existingGroupIds = processedGroupIds.get(query.data!.query);\n if (existingGroupIds) {\n existingGroupIds.push(group.id);\n } else {\n processedGroupIds.set(query.data!.query, [group.id]);\n }\n });\n\n // Map each matching group to an object with groupId and elementIds\n return matchingGroups.map((group) => ({\n groupId: group.id,\n elementIds: query.data!.result.ids,\n }));\n });\n }, [groupQueries, isGroupsQueriesReady, groups]);\n\n const getHiliteIdsFromGroupsWrapper = useCallback(\n (groups: Group[]) =>\n hiliteIds.filter((id) => groups.some((group) => group.id === id.groupId)).flatMap((id) => id.elementIds),\n [hiliteIds]\n );\n\n useEffect(() => {\n const processOverlappedGroups = async () => {\n const results = generateOverlappedGroups(hiliteIds);\n const { groupsWithGroupedOverlaps, overlappedElementsInfo, numberOfElementsInGroups } = results;\n\n setOverlappedElementsMetadata({\n overlappedElementsInfo,\n groupElementsInfo: numberOfElementsInGroups,\n overlappedElementGroupPairs: groupsWithGroupedOverlaps,\n });\n\n if (showGroupColor) {\n await visualizationMutation.mutateAsync(groupsWithGroupedOverlaps);\n } else {\n clearEmphasizedOverriddenElements();\n }\n\n clearHiddenElements();\n hideGroupIds(hiddenGroupsIds, groupsWithGroupedOverlaps);\n };\n\n const shouldProcessOverlappedGroups = () => !isOverlappedColored && hiliteIds.length > 0 && !isGroupsFetching;\n\n if (shouldProcessOverlappedGroups()) {\n void processOverlappedGroups();\n }\n // We don't want to trigger full visualization when toggling individual groups.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [showGroupColor, isOverlappedColored, hiliteIds]);\n\n useEffect(() => {\n if (isVisualizationsEnabled) {\n setEnableGroupQueries(true);\n } else {\n setShowGroupColor(false);\n clearHiddenElements();\n setHiddenGroupsIds(new Set());\n }\n }, [isVisualizationsEnabled, setHiddenGroupsIds, setIsVisualizationsEnabled, setShowGroupColor]);\n\n const hideAllGroups = useCallback(\n () => {\n if (!groups) return;\n hideElements(getHiliteIdsFromGroupsWrapper(groups));\n },\n [getHiliteIdsFromGroupsWrapper, groups]\n );\n\n const hideSingleGroupWrapper = useCallback(\n (groupToHide: Group) => {\n hideGroupConsideringOverlaps(overlappedElementsMetadata.overlappedElementGroupPairs, groupToHide.id, hiddenGroupsIds);\n },\n [hiddenGroupsIds, overlappedElementsMetadata.overlappedElementGroupPairs]\n );\n\n const showGroup = useCallback(\n (viewGroup: Group) => {\n if (!groups) return;\n clearHiddenElements();\n\n // hide group Ids filter\n const newHiddenGroups: Group[] = groups.filter((g) => hiddenGroupsIds.has(g.id) && g.id !== viewGroup.id);\n\n // view group Ids filter\n const viewGroups = groups.filter((g) => !hiddenGroupsIds.has(g.id) || g.id === viewGroup.id);\n const viewIds = getHiliteIdsFromGroupsWrapper(viewGroups);\n\n let hiddenIds = getHiliteIdsFromGroupsWrapper(newHiddenGroups);\n hiddenIds = hiddenIds.filter((id) => !viewIds.includes(id));\n hideElements(hiddenIds);\n },\n [groups, hiddenGroupsIds, getHiliteIdsFromGroupsWrapper]\n );\n\n const showAll = useCallback(() => {\n clearHiddenElements();\n setHiddenGroupsIds(new Set());\n }, [setHiddenGroupsIds]);\n\n const hideAll = useCallback(() => {\n if (!groups) return;\n hideAllGroups();\n setHiddenGroupsIds(\n new Set(groups.map((g) => g.id))\n );\n\n }, [\n setHiddenGroupsIds,\n groups,\n hideAllGroups,\n ]);\n\n const onModify = useCallback(\n (group: Group, type: string) => {\n if (!onClickGroupModify) return;\n if (group.id && hiddenGroupsIds.has(group.id)) {\n showGroup(group);\n setHiddenGroupsIds(new Set([...hiddenGroupsIds].filter((id) => id !== group.id)));\n }\n clearEmphasizedElements();\n onClickGroupModify(group, type);\n },\n [hiddenGroupsIds, onClickGroupModify, setHiddenGroupsIds, showGroup]\n );\n\n const onAddGroup = useCallback(\n (type: string) => {\n if (!onClickAddGroup) return;\n onClickAddGroup(type);\n clearEmphasizedElements();\n },\n [onClickAddGroup]\n );\n\n const groupActionButtonRenderers: ActionButtonRenderer[] = useMemo(() => isVisualizationsEnabled ? [\n (props: ActionButtonRendererProps) =>\n showGroupColor ? <GroupColorLegend {...props} groups={groups ?? []} /> : [],\n (props: ActionButtonRendererProps) => (\n <GroupsShowHideButtons\n {...props}\n isLoadingQuery={!(isVisualizationsEnabled && isGroupsFetched && isGroupsQueriesReady)}\n showGroup={showGroup}\n hideGroup={hideSingleGroupWrapper}\n />\n ),\n ].flat() : [], [groups, hideSingleGroupWrapper, isGroupsFetched, isGroupsQueriesReady, isVisualizationsEnabled, showGroup, showGroupColor]);\n\n const overlappedAlert = useMemo(() =>\n overlappedElementsMetadata.overlappedElementsInfo.size > 0 && isAlertClosed && showGroupColor ?\n <Alert\n onClose={() => setIsAlertClosed(false)}\n clickableText={isAlertExpanded ? \"Less Details\" : \"More Details\"}\n clickableTextProps={{ onClick: () => setIsAlertExpanded(!isAlertExpanded) }}\n >\n Overlapping elements are colored <Text className=\"gmw-red-text\">red</Text> in the viewer.\n {isAlertExpanded ? (\n <>\n <br />\n To get overlap info in detail, click the <Icon><SvgMore /></Icon> button then &ldquo;Overlap Info&rdquo;\n </>\n ) : undefined}\n </Alert> : undefined, [isAlertClosed, isAlertExpanded, overlappedElementsMetadata.overlappedElementsInfo.size, showGroupColor]\n );\n\n const progressConfig = useMemo(\n () =>\n isVisualizationsEnabled && isResolvingGroupQueries\n ? {\n hilitedGroupsProgress: {\n currentHilitedGroups: groupQueriesProgressCount,\n totalNumberOfGroups: groups?.length ?? 0,\n },\n }\n : undefined,\n [groupQueriesProgressCount, groups, isResolvingGroupQueries, isVisualizationsEnabled],\n );\n\n return (\n <div className=\"gmw-groups-vis-container\">\n <GroupVisualizationActions\n disabled={!(isVisualizationsEnabled && isGroupsFetched && isGroupsQueriesReady)}\n isVisualizationEnabled={isVisualizationsEnabled}\n onClickVisualizationButton={() => setIsVisualizationsEnabled((b) => !b)}\n showAll={showAll}\n hideAll={hideAll}\n />\n <Groups\n onClickGroupModify={onModify}\n onClickAddGroup={onAddGroup}\n actionButtonRenderers={groupActionButtonRenderers}\n mapping={mapping}\n {...rest}\n progressConfig={progressConfig}\n alert={overlappedAlert}\n />\n </div>\n );\n};\n"]}
@@ -9,7 +9,7 @@ export declare type GroupsElementIds = {
9
9
  export declare const hideGroupIds: (hiddenGroupIds: Set<string>, groupsWithGroupedOverlaps: OverlappedElementGroupPairs[]) => void;
10
10
  export declare const visualizeGroupColors: (hiddenGroupsIds: Set<string>, groupsWithGroupedOverlaps: OverlappedElementGroupPairs[], setNumberOfVisualizedGroups: (numberOfVisualizedGroups: number | ((numberOfVisualizedGroups: number) => number)) => void, doEmphasizeElements?: boolean) => Promise<string[]>;
11
11
  export declare const getHiliteIdsAndKeysetFromGroup: (iModelConnection: IModelConnection, group: Group) => Promise<{
12
- group: Group;
12
+ query: string;
13
13
  result: {
14
14
  keySet: import("@itwin/presentation-common").KeySet;
15
15
  ids: string[];
@@ -62,7 +62,7 @@ exports.visualizeGroupColors = visualizeGroupColors;
62
62
  const getHiliteIdsAndKeysetFromGroup = async (iModelConnection, group) => {
63
63
  const query = group.query;
64
64
  const result = await (0, viewerUtils_1.getHiliteIds)(query, iModelConnection);
65
- return { group, result };
65
+ return { query, result };
66
66
  };
67
67
  exports.getHiliteIdsAndKeysetFromGroup = getHiliteIdsAndKeysetFromGroup;
68
68
  const getOverlappedElementsInfo = (overlappedElements) => {
@@ -1 +1 @@
1
- {"version":3,"file":"groupsHelpers.js","sourceRoot":"","sources":["../../../../src/components/Groups/groupsHelpers.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { FeatureOverrideType } from \"@itwin/core-common\";\nimport type { IModelConnection } from \"@itwin/core-frontend\";\nimport type { Group } from \"@itwin/insights-client\";\nimport type { OverlappedElementGroupPairs, OverlappedInfo } from \"../context/GroupHilitedElementsContext\";\nimport { clearEmphasizedOverriddenElements, clearHiddenElements, emphasizeElements, getHiliteIds, hideElements, overrideElements } from \"../../common/viewerUtils\";\n\nconst GOLDEN_ANGLE_MULTIPLIER = 1.5; // Multiplier to spread colors more uniformly.\nconst BASE_HUE_OFFSET = 60; // Initial hue offset to avoid certain colors e.g 0 offset would begin with red.\nconst HUE_ADJUSTMENT_STEP = 15; // Step to adjust the hue to avoid the red spectrum.\nconst RED_HUE_LOWER_BOUND = 330; // Lower bound of the red hue spectrum to avoid.\nconst RED_HUE_UPPER_BOUND = 30; // Upper bound of the red hue spectrum to avoid.\nconst GOLDENANGLE = 180 * (3 - Math.sqrt(5));\n\nconst generateHSL = (hue: number, saturation: number = 100, lightness: number = 50) => {\n return `hsl(${hue}, ${saturation}%, ${lightness}%)`;\n};\n\nexport const getGroupColor = (index: number) => {\n let hue = (index * GOLDENANGLE * GOLDEN_ANGLE_MULTIPLIER + BASE_HUE_OFFSET) % 360;\n\n while (hue >= RED_HUE_LOWER_BOUND || hue <= RED_HUE_UPPER_BOUND) {\n hue = (hue + HUE_ADJUSTMENT_STEP) % 360;\n }\n\n return generateHSL(hue);\n};\n\nconst processGroupVisualization = async (\n overlappedElementGroupPairs: OverlappedElementGroupPairs,\n hiddenGroupsIds: Set<string>,\n doEmphasizeElements: boolean,\n color: string,\n replace: boolean,\n setNumberOfVisualizedGroups: (numberOfVisualizedGroups: number | ((numberOfVisualizedGroups: number) => number)) => void,\n) => {\n const hilitedIds = Array.from(overlappedElementGroupPairs.elementIds);\n\n overrideElements(hilitedIds, color, FeatureOverrideType.ColorAndAlpha, replace);\n setNumberOfVisualizedGroups((numberOfVisualizedGroups) => numberOfVisualizedGroups + 1);\n\n doEmphasizeElements && emphasizeElements(hilitedIds, undefined);\n\n for (const id of overlappedElementGroupPairs.groupIds) {\n if (hiddenGroupsIds.has(id)) {\n return [];\n }\n }\n return hilitedIds;\n};\n\nexport type GroupsElementIds = {\n groupId: string;\n elementIds: string[];\n}[];\n\nexport const hideGroupIds = (hiddenGroupIds: Set<string>, groupsWithGroupedOverlaps: OverlappedElementGroupPairs[] ) => {\n hiddenGroupIds.forEach((groupId) => {\n hideGroupConsideringOverlaps(groupsWithGroupedOverlaps, groupId, hiddenGroupIds);\n });\n};\n\nexport const visualizeGroupColors = async (\n hiddenGroupsIds: Set<string>,\n groupsWithGroupedOverlaps: OverlappedElementGroupPairs[],\n setNumberOfVisualizedGroups: (numberOfVisualizedGroups: number | ((numberOfVisualizedGroups: number) => number)) => void,\n doEmphasizeElements: boolean = true,\n) => {\n clearEmphasizedOverriddenElements();\n\n const singleGroupPromises = groupsWithGroupedOverlaps\n .filter((group) => group.groupIds.size === 1)\n .map(async (group, index) =>\n processGroupVisualization(\n group,\n hiddenGroupsIds,\n doEmphasizeElements,\n getGroupColor(index), // color for single group\n false, // Shouldn't matter as replacement only accounts for same colored overrides.\n setNumberOfVisualizedGroups,\n )\n );\n\n const overlappedGroupPromises = groupsWithGroupedOverlaps\n .filter((group) => group.groupIds.size !== 1)\n .map(async (group) =>\n processGroupVisualization(\n group,\n hiddenGroupsIds,\n doEmphasizeElements,\n generateHSL(0), // color for group of overlapped elements\n false,\n setNumberOfVisualizedGroups,\n )\n );\n\n clearHiddenElements();\n\n const allPromises = [...singleGroupPromises, ...overlappedGroupPromises];\n\n const allIds = (await Promise.all(allPromises)).flat();\n return allIds;\n};\n\nexport const getHiliteIdsAndKeysetFromGroup = async (\n iModelConnection: IModelConnection,\n group: Group,\n) => {\n const query = group.query;\n const result = await getHiliteIds(query, iModelConnection);\n return {group, result};\n\n};\n\nconst getOverlappedElementsInfo = (overlappedElements: OverlappedElementGroupPairs[]) => {\n const overlappedElementsInfo: Map<string, OverlappedInfo[]> = new Map();\n\n overlappedElements.forEach((elementGroup) => {\n const { elementIds, groupIds } = elementGroup;\n\n groupIds.forEach((group) => {\n const otherGroups = Array.from(groupIds).filter((grp) => grp !== group);\n const overlappedInfoArray = overlappedElementsInfo.get(group) ?? [];\n overlappedInfoArray.push({ groupIds: otherGroups, elements: Array.from(elementIds) });\n overlappedElementsInfo.set(group, overlappedInfoArray);\n });\n });\n return overlappedElementsInfo;\n};\n\nconst mergeElementsByGroup = (elems: Map<string, Set<string>>) => {\n const mergedList: Map<string, OverlappedElementGroupPairs> = new Map();\n elems.forEach((groupIds, elementId) => {\n const sortedGroups = Array.from(groupIds).sort();\n const key = sortedGroups.join(\"-\");\n const overlap = mergedList.get(key);\n if (overlap) {\n overlap.elementIds.add(elementId);\n } else {\n mergedList.set(key, { elementIds: new Set([elementId]), groupIds });\n }\n });\n return mergedList;\n};\n\nexport const generateOverlappedGroups = (\n groupsElementIds: GroupsElementIds,\n) => {\n const elems: Map<string, Set<string>> = new Map();\n const groupElementCount: Map<string, number> = new Map();\n\n // Build the elems map for associations between elements and their groups.\n for (const groupInfo of groupsElementIds) {\n for (const elem of groupInfo.elementIds) {\n const elemGroups = elems.get(elem) || new Set<string>();\n elemGroups.add(groupInfo.groupId);\n elems.set(elem, elemGroups);\n }\n groupElementCount.set(groupInfo.groupId, groupInfo.elementIds.length);\n }\n\n // Construct the unique list of all groups and their overlapped groups combinations\n const allGroups: OverlappedElementGroupPairs[] = groupsElementIds.map((groupInfo) => {\n const nonOverlappingElements = Array.from(new Set(groupInfo.elementIds)).filter((elem) => elems.get(elem)!.size === 1);\n groupElementCount.set(groupInfo.groupId, groupInfo.elementIds.length);\n return { elementIds: new Set(nonOverlappingElements), groupIds: new Set([groupInfo.groupId]) };\n });\n\n const mergedList = mergeElementsByGroup(elems);\n const overlappedGroupsInformation: OverlappedElementGroupPairs[] = Array.from(mergedList.values()).filter((value) => value.groupIds.size > 1);\n\n return { groupsWithGroupedOverlaps: [...allGroups, ...overlappedGroupsInformation], overlappedElementsInfo: getOverlappedElementsInfo(overlappedGroupsInformation), numberOfElementsInGroups: groupElementCount };\n};\n\nexport const hideGroupConsideringOverlaps = (\n overlappedElementGroupPairs: OverlappedElementGroupPairs[],\n groupIdToHide: string,\n hiddenGroupsIds: Set<string>\n) => {\n const elementsToPotentiallyHide = new Set<string>();\n\n // Check each entry in overlappedElementGroupPairs\n for (const entry of overlappedElementGroupPairs) {\n // If the groupToHide is part of this entry\n if (entry.groupIds.has(groupIdToHide)) {\n // If this is a unique entry (no overlaps for this group), add all its elements to hide list\n if (entry.groupIds.size === 1) {\n for (const elem of entry.elementIds) {\n elementsToPotentiallyHide.add(elem);\n }\n } else {\n // If there are overlaps, only hide if all overlapping groups are hidden\n const allOtherGroupsHidden = Array.from(entry.groupIds).every(\n (groupId) =>\n groupId === groupIdToHide || hiddenGroupsIds.has(groupId)\n );\n if (allOtherGroupsHidden) {\n for (const elem of entry.elementIds) {\n elementsToPotentiallyHide.add(elem);\n }\n }\n }\n }\n }\n\n // Now hide all elements in elementsToPotentiallyHide\n hideElements(Array.from(elementsToPotentiallyHide));\n};\n"]}
1
+ {"version":3,"file":"groupsHelpers.js","sourceRoot":"","sources":["../../../../src/components/Groups/groupsHelpers.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { FeatureOverrideType } from \"@itwin/core-common\";\nimport type { IModelConnection } from \"@itwin/core-frontend\";\nimport type { Group } from \"@itwin/insights-client\";\nimport type { OverlappedElementGroupPairs, OverlappedInfo } from \"../context/GroupHilitedElementsContext\";\nimport { clearEmphasizedOverriddenElements, clearHiddenElements, emphasizeElements, getHiliteIds, hideElements, overrideElements } from \"../../common/viewerUtils\";\n\nconst GOLDEN_ANGLE_MULTIPLIER = 1.5; // Multiplier to spread colors more uniformly.\nconst BASE_HUE_OFFSET = 60; // Initial hue offset to avoid certain colors e.g 0 offset would begin with red.\nconst HUE_ADJUSTMENT_STEP = 15; // Step to adjust the hue to avoid the red spectrum.\nconst RED_HUE_LOWER_BOUND = 330; // Lower bound of the red hue spectrum to avoid.\nconst RED_HUE_UPPER_BOUND = 30; // Upper bound of the red hue spectrum to avoid.\nconst GOLDENANGLE = 180 * (3 - Math.sqrt(5));\n\nconst generateHSL = (hue: number, saturation: number = 100, lightness: number = 50) => {\n return `hsl(${hue}, ${saturation}%, ${lightness}%)`;\n};\n\nexport const getGroupColor = (index: number) => {\n let hue = (index * GOLDENANGLE * GOLDEN_ANGLE_MULTIPLIER + BASE_HUE_OFFSET) % 360;\n\n while (hue >= RED_HUE_LOWER_BOUND || hue <= RED_HUE_UPPER_BOUND) {\n hue = (hue + HUE_ADJUSTMENT_STEP) % 360;\n }\n\n return generateHSL(hue);\n};\n\nconst processGroupVisualization = async (\n overlappedElementGroupPairs: OverlappedElementGroupPairs,\n hiddenGroupsIds: Set<string>,\n doEmphasizeElements: boolean,\n color: string,\n replace: boolean,\n setNumberOfVisualizedGroups: (numberOfVisualizedGroups: number | ((numberOfVisualizedGroups: number) => number)) => void,\n) => {\n const hilitedIds = Array.from(overlappedElementGroupPairs.elementIds);\n\n overrideElements(hilitedIds, color, FeatureOverrideType.ColorAndAlpha, replace);\n setNumberOfVisualizedGroups((numberOfVisualizedGroups) => numberOfVisualizedGroups + 1);\n\n doEmphasizeElements && emphasizeElements(hilitedIds, undefined);\n\n for (const id of overlappedElementGroupPairs.groupIds) {\n if (hiddenGroupsIds.has(id)) {\n return [];\n }\n }\n return hilitedIds;\n};\n\nexport type GroupsElementIds = {\n groupId: string;\n elementIds: string[];\n}[];\n\nexport const hideGroupIds = (hiddenGroupIds: Set<string>, groupsWithGroupedOverlaps: OverlappedElementGroupPairs[] ) => {\n hiddenGroupIds.forEach((groupId) => {\n hideGroupConsideringOverlaps(groupsWithGroupedOverlaps, groupId, hiddenGroupIds);\n });\n};\n\nexport const visualizeGroupColors = async (\n hiddenGroupsIds: Set<string>,\n groupsWithGroupedOverlaps: OverlappedElementGroupPairs[],\n setNumberOfVisualizedGroups: (numberOfVisualizedGroups: number | ((numberOfVisualizedGroups: number) => number)) => void,\n doEmphasizeElements: boolean = true,\n) => {\n clearEmphasizedOverriddenElements();\n\n const singleGroupPromises = groupsWithGroupedOverlaps\n .filter((group) => group.groupIds.size === 1)\n .map(async (group, index) =>\n processGroupVisualization(\n group,\n hiddenGroupsIds,\n doEmphasizeElements,\n getGroupColor(index), // color for single group\n false, // Shouldn't matter as replacement only accounts for same colored overrides.\n setNumberOfVisualizedGroups,\n )\n );\n\n const overlappedGroupPromises = groupsWithGroupedOverlaps\n .filter((group) => group.groupIds.size !== 1)\n .map(async (group) =>\n processGroupVisualization(\n group,\n hiddenGroupsIds,\n doEmphasizeElements,\n generateHSL(0), // color for group of overlapped elements\n false,\n setNumberOfVisualizedGroups,\n )\n );\n\n clearHiddenElements();\n\n const allPromises = [...singleGroupPromises, ...overlappedGroupPromises];\n\n const allIds = (await Promise.all(allPromises)).flat();\n return allIds;\n};\n\nexport const getHiliteIdsAndKeysetFromGroup = async (\n iModelConnection: IModelConnection,\n group: Group,\n) => {\n const query = group.query;\n const result = await getHiliteIds(query, iModelConnection);\n return {query, result};\n\n};\n\nconst getOverlappedElementsInfo = (overlappedElements: OverlappedElementGroupPairs[]) => {\n const overlappedElementsInfo: Map<string, OverlappedInfo[]> = new Map();\n\n overlappedElements.forEach((elementGroup) => {\n const { elementIds, groupIds } = elementGroup;\n\n groupIds.forEach((group) => {\n const otherGroups = Array.from(groupIds).filter((grp) => grp !== group);\n const overlappedInfoArray = overlappedElementsInfo.get(group) ?? [];\n overlappedInfoArray.push({ groupIds: otherGroups, elements: Array.from(elementIds) });\n overlappedElementsInfo.set(group, overlappedInfoArray);\n });\n });\n return overlappedElementsInfo;\n};\n\nconst mergeElementsByGroup = (elems: Map<string, Set<string>>) => {\n const mergedList: Map<string, OverlappedElementGroupPairs> = new Map();\n elems.forEach((groupIds, elementId) => {\n const sortedGroups = Array.from(groupIds).sort();\n const key = sortedGroups.join(\"-\");\n const overlap = mergedList.get(key);\n if (overlap) {\n overlap.elementIds.add(elementId);\n } else {\n mergedList.set(key, { elementIds: new Set([elementId]), groupIds });\n }\n });\n return mergedList;\n};\n\nexport const generateOverlappedGroups = (\n groupsElementIds: GroupsElementIds,\n) => {\n const elems: Map<string, Set<string>> = new Map();\n const groupElementCount: Map<string, number> = new Map();\n\n // Build the elems map for associations between elements and their groups.\n for (const groupInfo of groupsElementIds) {\n for (const elem of groupInfo.elementIds) {\n const elemGroups = elems.get(elem) || new Set<string>();\n elemGroups.add(groupInfo.groupId);\n elems.set(elem, elemGroups);\n }\n groupElementCount.set(groupInfo.groupId, groupInfo.elementIds.length);\n }\n\n // Construct the unique list of all groups and their overlapped groups combinations\n const allGroups: OverlappedElementGroupPairs[] = groupsElementIds.map((groupInfo) => {\n const nonOverlappingElements = Array.from(new Set(groupInfo.elementIds)).filter((elem) => elems.get(elem)!.size === 1);\n groupElementCount.set(groupInfo.groupId, groupInfo.elementIds.length);\n return { elementIds: new Set(nonOverlappingElements), groupIds: new Set([groupInfo.groupId]) };\n });\n\n const mergedList = mergeElementsByGroup(elems);\n const overlappedGroupsInformation: OverlappedElementGroupPairs[] = Array.from(mergedList.values()).filter((value) => value.groupIds.size > 1);\n\n return { groupsWithGroupedOverlaps: [...allGroups, ...overlappedGroupsInformation], overlappedElementsInfo: getOverlappedElementsInfo(overlappedGroupsInformation), numberOfElementsInGroups: groupElementCount };\n};\n\nexport const hideGroupConsideringOverlaps = (\n overlappedElementGroupPairs: OverlappedElementGroupPairs[],\n groupIdToHide: string,\n hiddenGroupsIds: Set<string>\n) => {\n const elementsToPotentiallyHide = new Set<string>();\n\n // Check each entry in overlappedElementGroupPairs\n for (const entry of overlappedElementGroupPairs) {\n // If the groupToHide is part of this entry\n if (entry.groupIds.has(groupIdToHide)) {\n // If this is a unique entry (no overlaps for this group), add all its elements to hide list\n if (entry.groupIds.size === 1) {\n for (const elem of entry.elementIds) {\n elementsToPotentiallyHide.add(elem);\n }\n } else {\n // If there are overlaps, only hide if all overlapping groups are hidden\n const allOtherGroupsHidden = Array.from(entry.groupIds).every(\n (groupId) =>\n groupId === groupIdToHide || hiddenGroupsIds.has(groupId)\n );\n if (allOtherGroupsHidden) {\n for (const elem of entry.elementIds) {\n elementsToPotentiallyHide.add(elem);\n }\n }\n }\n }\n }\n\n // Now hide all elements in elementsToPotentiallyHide\n hideElements(Array.from(elementsToPotentiallyHide));\n};\n"]}
@@ -3,7 +3,7 @@ import type { Group } from "@itwin/insights-client";
3
3
  import type { KeySet } from "@itwin/presentation-common";
4
4
  import { TErrCodes } from "../../Constants";
5
5
  export interface QueryResults {
6
- group: Group;
6
+ query: string;
7
7
  result: {
8
8
  keySet: KeySet;
9
9
  ids: string[];
@@ -12,7 +12,7 @@ export interface QueryResults {
12
12
  export declare const createQueryForHiliteIdsAndKeyset: (group: Group, iModelConnection: IModelConnection, enabled: boolean) => {
13
13
  queryKey: string[];
14
14
  queryFn: () => Promise<{
15
- group: Group;
15
+ query: string;
16
16
  result: {
17
17
  keySet: KeySet;
18
18
  ids: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"useKeySetHiliteQueries.js","sourceRoot":"","sources":["../../../../../src/components/Groups/hooks/useKeySetHiliteQueries.ts"],"names":[],"mappings":";;;AAQA,uDAAiD;AACjD,uDAAmD;AACnD,iCAAgC;AAChC,+FAA4F;AAC5F,+CAA4C;AAC5C,oDAAkE;AAQjE,EAAE,CAAC;AAIG,MAAM,gCAAgC,GAAG,CAAC,KAAY,EAAE,gBAAkC,EAAE,OAAgB,EAAE,EAAE,CAAC,CAAC;IACvH,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC;IAC7C,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,IAAA,8CAA8B,EAAC,gBAAgB,EAAE,KAAK,CAAC;IAC5E,OAAO;IACP,SAAS,EAAE,QAAQ;IACnB,IAAI,EAAE,EAAE,SAAS,EAAC,qBAAS,CAAC,yBAAyB,EAAE,OAAO,EAAE,qBAAqB,KAAK,CAAC,SAAS,GAAG,EAAE;CAC1G,CAAC,CAAC;AANU,QAAA,gCAAgC,oCAM1C;AAEI,MAAM,mBAAmB,GAAG,CAAC,KAAY,EAAE,gBAAkC,EAAE,OAAgB,EAAE,EAAE;IACxG,MAAM,KAAK,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,IAAA,wCAAgC,EAAC,KAAK,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAEpI,OAAO,IAAA,sBAAQ,EAAe,KAAK,CAAC,CAAC;AACvC,CAAC,CAAC;AAJW,QAAA,mBAAmB,uBAI9B;AAEK,MAAM,sBAAsB,GAAG,CAAC,MAAe,EAAE,OAAgB,EAAE,gBAAkC,EAAE,EAAE;IAC9G,MAAM,OAAO,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,wCAAgC,EAAC,KAAK,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC,EACrH,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC;IAEvC,MAAM,cAAc,GAAG,IAAA,wBAAU,EAAW,EAAE,OAAO,EAAE,CAAC,CAAC;IAEzD,MAAM,YAAY,GAAG,IAAA,qDAAyB,EAAC,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IAE/G,OAAO,EAAE,YAAY,EAAE,CAAC;AAC1B,CAAC,CAAC;AATW,QAAA,sBAAsB,0BASjC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport type { IModelConnection } from \"@itwin/core-frontend\";\nimport type { Group } from \"@itwin/insights-client\";\nimport type { KeySet } from \"@itwin/presentation-common\";\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport { useMemo } from \"react\";\nimport { useMemoizedCollectionPick } from \"../../../common/hooks/useMemoizedCollectionPick\";\nimport { TErrCodes } from \"../../Constants\";\nimport { getHiliteIdsAndKeysetFromGroup } from \"../groupsHelpers\";\n\nexport interface QueryResults {\n group: Group;\n result: {\n keySet: KeySet;\n ids: string[];\n };\n}[];\n\ntype TQueries = UseQueryOptions<QueryResults>[];\n\nexport const createQueryForHiliteIdsAndKeyset = (group: Group, iModelConnection: IModelConnection, enabled: boolean) => ({\n queryKey: [\"group\", \"hiliteids\", group.query],\n queryFn: async () => getHiliteIdsAndKeysetFromGroup(iModelConnection, group),\n enabled,\n staleTime: Infinity,\n meta: { errorCode:TErrCodes.QUERY_HILITE_FETCH_FAILED, message: `Failed to resolve ${group.groupName}.` },\n});\n\nexport const useGroupKeySetQuery = (group: Group, iModelConnection: IModelConnection, enabled: boolean) => {\n const query = useMemo(() => createQueryForHiliteIdsAndKeyset(group, iModelConnection, enabled), [enabled, group, iModelConnection]);\n\n return useQuery<QueryResults>(query);\n};\n\nexport const useKeySetHiliteQueries = (groups: Group[], enabled: boolean, iModelConnection: IModelConnection) => {\n const queries = useMemo(() => groups.map((group) => createQueryForHiliteIdsAndKeyset(group, iModelConnection, enabled)),\n [groups, iModelConnection, enabled]);\n\n const useQueriesHook = useQueries<TQueries>({ queries });\n\n const groupQueries = useMemoizedCollectionPick(useQueriesHook, [\"data\", \"isFetching\", \"isFetched\", \"refetch\"]);\n\n return { groupQueries };\n};\n"]}
1
+ {"version":3,"file":"useKeySetHiliteQueries.js","sourceRoot":"","sources":["../../../../../src/components/Groups/hooks/useKeySetHiliteQueries.ts"],"names":[],"mappings":";;;AAQA,uDAAiD;AACjD,uDAAmD;AACnD,iCAAgC;AAChC,+FAA4F;AAC5F,+CAA4C;AAC5C,oDAAkE;AAQjE,EAAE,CAAC;AAIG,MAAM,gCAAgC,GAAG,CAAC,KAAY,EAAE,gBAAkC,EAAE,OAAgB,EAAE,EAAE,CAAC,CAAC;IACvH,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC;IAC7C,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,IAAA,8CAA8B,EAAC,gBAAgB,EAAE,KAAK,CAAC;IAC5E,OAAO;IACP,SAAS,EAAE,QAAQ;IACnB,IAAI,EAAE,EAAE,SAAS,EAAC,qBAAS,CAAC,yBAAyB,EAAE,OAAO,EAAE,qBAAqB,KAAK,CAAC,SAAS,GAAG,EAAE;CAC1G,CAAC,CAAC;AANU,QAAA,gCAAgC,oCAM1C;AAEI,MAAM,mBAAmB,GAAG,CAAC,KAAY,EAAE,gBAAkC,EAAE,OAAgB,EAAE,EAAE;IACxG,MAAM,KAAK,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,IAAA,wCAAgC,EAAC,KAAK,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAEpI,OAAO,IAAA,sBAAQ,EAAe,KAAK,CAAC,CAAC;AACvC,CAAC,CAAC;AAJW,QAAA,mBAAmB,uBAI9B;AAEK,MAAM,sBAAsB,GAAG,CAAC,MAAe,EAAE,OAAgB,EAAE,gBAAkC,EAAE,EAAE;IAC9G,MAAM,OAAO,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,wCAAgC,EAAC,KAAK,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC,EACrH,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC;IAEvC,MAAM,cAAc,GAAG,IAAA,wBAAU,EAAW,EAAE,OAAO,EAAE,CAAC,CAAC;IAEzD,MAAM,YAAY,GAAG,IAAA,qDAAyB,EAAC,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IAE/G,OAAO,EAAE,YAAY,EAAE,CAAC;AAC1B,CAAC,CAAC;AATW,QAAA,sBAAsB,0BASjC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport type { IModelConnection } from \"@itwin/core-frontend\";\nimport type { Group } from \"@itwin/insights-client\";\nimport type { KeySet } from \"@itwin/presentation-common\";\nimport type { UseQueryOptions } from \"@tanstack/react-query\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport { useMemo } from \"react\";\nimport { useMemoizedCollectionPick } from \"../../../common/hooks/useMemoizedCollectionPick\";\nimport { TErrCodes } from \"../../Constants\";\nimport { getHiliteIdsAndKeysetFromGroup } from \"../groupsHelpers\";\n\nexport interface QueryResults {\n query: string;\n result: {\n keySet: KeySet;\n ids: string[];\n };\n}[];\n\ntype TQueries = UseQueryOptions<QueryResults>[];\n\nexport const createQueryForHiliteIdsAndKeyset = (group: Group, iModelConnection: IModelConnection, enabled: boolean) => ({\n queryKey: [\"group\", \"hiliteids\", group.query],\n queryFn: async () => getHiliteIdsAndKeysetFromGroup(iModelConnection, group),\n enabled,\n staleTime: Infinity,\n meta: { errorCode:TErrCodes.QUERY_HILITE_FETCH_FAILED, message: `Failed to resolve ${group.groupName}.` },\n});\n\nexport const useGroupKeySetQuery = (group: Group, iModelConnection: IModelConnection, enabled: boolean) => {\n const query = useMemo(() => createQueryForHiliteIdsAndKeyset(group, iModelConnection, enabled), [enabled, group, iModelConnection]);\n\n return useQuery<QueryResults>(query);\n};\n\nexport const useKeySetHiliteQueries = (groups: Group[], enabled: boolean, iModelConnection: IModelConnection) => {\n const queries = useMemo(() => groups.map((group) => createQueryForHiliteIdsAndKeyset(group, iModelConnection, enabled)),\n [groups, iModelConnection, enabled]);\n\n const useQueriesHook = useQueries<TQueries>({ queries });\n\n const groupQueries = useMemoizedCollectionPick(useQueriesHook, [\"data\", \"isFetching\", \"isFetched\", \"refetch\"]);\n\n return { groupQueries };\n};\n"]}
@@ -36,52 +36,61 @@ const StatusIcon_1 = require("../../SharedComponents/StatusIcon");
36
36
  const ExtractionLogCustomFilter_1 = require("./ExtractionLogCustomFilter");
37
37
  const GroupingApiConfigContext_1 = require("../../context/GroupingApiConfigContext");
38
38
  const MappingClientContext_1 = require("../../context/MappingClientContext");
39
- const useMappingsOperations_1 = require("../hooks/useMappingsOperations");
40
39
  const react_query_1 = require("@tanstack/react-query");
41
40
  const useMemoizedCollectionPick_1 = require("../../../common/hooks/useMemoizedCollectionPick");
42
41
  const useFetchGroups_1 = require("../../Groups/hooks/useFetchGroups");
42
+ const useFetchMappings_1 = require("../hooks/useFetchMappings");
43
43
  const ExtractionMessageModal = ({ isOpen, onClose, extractionMessageData, timestamp }) => {
44
44
  const [formattedExtractionMessage, setFormattedExtractionMessage] = (0, react_1.useState)(undefined);
45
45
  const groupingMappingApiConfig = (0, GroupingApiConfigContext_1.useGroupingMappingApiConfig)();
46
+ const { iModelId, getAccessToken } = groupingMappingApiConfig;
46
47
  const mappingClient = (0, MappingClientContext_1.useMappingClient)();
47
- const { mappings, isLoading: isMappingsLoading } = (0, useMappingsOperations_1.useMappingsOperations)({ ...groupingMappingApiConfig, mappingClient });
48
+ const { data: mappings, isLoading: isMappingsLoading } = (0, useFetchMappings_1.useFetchMappings)(iModelId, getAccessToken, mappingClient);
48
49
  const [formattedTimestamp, setFormattedTimestamp] = (0, react_1.useState)("");
49
50
  const getMappingName = (0, react_1.useCallback)((mappingId, mappings) => {
50
51
  return mappings.find((mapping) => mapping.id === mappingId)?.mappingName ?? "";
51
52
  }, []);
52
- // Extract groupIds and mappingIds from messages
53
53
  const extractionInfo = (0, react_1.useMemo)(() => {
54
- return extractionMessageData.reduce((acc, message) => {
54
+ const infoMap = new Map();
55
+ extractionMessageData.forEach((message) => {
55
56
  const splittedMessage = message.message.split(" ");
56
57
  const mappingId = splittedMessage[splittedMessage.indexOf("MappingId:") + 1]?.match(/^([^,]+),$/)?.[1];
57
58
  const groupId = splittedMessage[splittedMessage.indexOf("GroupId:") + 1]?.match(/^([^,]+).$/)?.[1];
58
59
  if (mappingId && groupId) {
59
- acc.push({ mappingId, groupId });
60
+ infoMap.set(message.message, { mappingId, groupId });
60
61
  }
61
- return acc;
62
- }, []);
62
+ });
63
+ return infoMap;
63
64
  }, [extractionMessageData]);
64
65
  // useQueries to fetch all group names
65
66
  const groupQueriesResults = (0, react_query_1.useQueries)({
66
- queries: extractionInfo.map(({ mappingId }) => ({
67
+ queries: Array.from(extractionInfo.values()).map(({ mappingId }) => ({
67
68
  queryKey: ["groups", mappingId],
68
- queryFn: async () => (0, useFetchGroups_1.fetchGroups)(groupingMappingApiConfig.iModelId, mappingId, groupingMappingApiConfig.getAccessToken, mappingClient),
69
+ queryFn: async () => {
70
+ const groups = await (0, useFetchGroups_1.fetchGroups)(groupingMappingApiConfig.iModelId, mappingId, groupingMappingApiConfig.getAccessToken, mappingClient);
71
+ // Return both mappingId and groups in the result
72
+ return { mappingId, groups };
73
+ },
69
74
  })),
70
75
  });
71
76
  // Workaround to get data from useQueries with more stability
72
77
  const pickedResult = (0, useMemoizedCollectionPick_1.useMemoizedCollectionPick)(groupQueriesResults, ["data", "error", "isLoading", "isSuccess"]);
73
78
  (0, react_1.useEffect)(() => {
74
79
  if (pickedResult.every((query) => query.isSuccess) && mappings) {
75
- const formattedMessages = extractionMessageData.map((extractionMessage, index) => {
80
+ const formattedMessages = extractionMessageData.map((extractionMessage) => {
76
81
  let replacedMessage = extractionMessage.message;
77
- const { mappingId, groupId } = extractionInfo[index];
78
- const groupName = pickedResult[index].data.find((group) => group.id === groupId)?.groupName;
79
- if (replacedMessage.includes("MappingId:")) {
80
- const mappingName = getMappingName(mappingId, mappings);
81
- replacedMessage = replacedMessage.replace(/MappingId: [\w-]+/, `Mapping: ${mappingName}`);
82
- }
83
- if (replacedMessage.includes("GroupId:")) {
84
- replacedMessage = replacedMessage.replace(/GroupId: [\w-]+/, `Group: ${groupName ? groupName : "<Not Found>"}`);
82
+ const info = extractionInfo.get(extractionMessage.message);
83
+ if (info) {
84
+ const { mappingId, groupId } = info;
85
+ const queryResult = pickedResult.find((result) => result.data?.mappingId === mappingId);
86
+ const groupName = queryResult?.data?.groups?.find((group) => group.id === groupId)?.groupName;
87
+ if (replacedMessage.includes("MappingId:")) {
88
+ const mappingName = getMappingName(mappingId, mappings);
89
+ replacedMessage = replacedMessage.replace(/MappingId: [\w-]+/, `Mapping: ${mappingName}`);
90
+ }
91
+ if (replacedMessage.includes("GroupId:")) {
92
+ replacedMessage = replacedMessage.replace(/GroupId: [\w-]+/, `Group: ${groupName ? groupName : "<Not Found>"}`);
93
+ }
85
94
  }
86
95
  return { ...extractionMessage, message: replacedMessage };
87
96
  });