@itwin/grouping-mapping-widget 0.22.0 → 0.23.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 (177) hide show
  1. package/lib/cjs/WidgetShell/GroupingMapping.js +5 -1
  2. package/lib/cjs/WidgetShell/GroupingMapping.js.map +1 -1
  3. package/lib/cjs/WidgetShell/GroupingMappingContent.js +5 -1
  4. package/lib/cjs/WidgetShell/GroupingMappingContent.js.map +1 -1
  5. package/lib/cjs/common/hooks/useIsMounted.d.ts +2 -0
  6. package/lib/cjs/common/hooks/useIsMounted.js +20 -0
  7. package/lib/cjs/common/hooks/useIsMounted.js.map +1 -0
  8. package/lib/cjs/common/utils.d.ts +1 -0
  9. package/lib/cjs/common/utils.js +13 -1
  10. package/lib/cjs/common/utils.js.map +1 -1
  11. package/lib/cjs/components/Constants.d.ts +4 -0
  12. package/lib/cjs/components/Constants.js +13 -0
  13. package/lib/cjs/components/Constants.js.map +1 -0
  14. package/lib/cjs/components/GroupingMappingContext.d.ts +5 -0
  15. package/lib/cjs/components/GroupingMappingContext.js +31 -19
  16. package/lib/cjs/components/GroupingMappingContext.js.map +1 -1
  17. package/lib/cjs/components/Groups/Editing/GroupAction.js +57 -57
  18. package/lib/cjs/components/Groups/Editing/GroupAction.js.map +1 -1
  19. package/lib/cjs/components/Groups/Editing/GroupDetailsActionPanel.d.ts +1 -1
  20. package/lib/cjs/components/Groups/Editing/GroupDetailsActionPanel.js.map +1 -1
  21. package/lib/cjs/components/Groups/GroupItem.js +1 -1
  22. package/lib/cjs/components/Groups/GroupItem.js.map +1 -1
  23. package/lib/cjs/components/Groups/GroupMenuActions.js +5 -1
  24. package/lib/cjs/components/Groups/GroupMenuActions.js.map +1 -1
  25. package/lib/cjs/components/Groups/Groups.d.ts +3 -2
  26. package/lib/cjs/components/Groups/Groups.js +8 -4
  27. package/lib/cjs/components/Groups/Groups.js.map +1 -1
  28. package/lib/cjs/components/Groups/GroupsShowHideButtons.d.ts +2 -2
  29. package/lib/cjs/components/Groups/GroupsShowHideButtons.js +8 -4
  30. package/lib/cjs/components/Groups/GroupsShowHideButtons.js.map +1 -1
  31. package/lib/cjs/components/Groups/GroupsView.js +1 -1
  32. package/lib/cjs/components/Groups/GroupsView.js.map +1 -1
  33. package/lib/cjs/components/Groups/GroupsVisualization.d.ts +1 -1
  34. package/lib/cjs/components/Groups/GroupsVisualization.js +103 -67
  35. package/lib/cjs/components/Groups/GroupsVisualization.js.map +1 -1
  36. package/lib/cjs/components/Groups/GroupsVisualizationActions.d.ts +6 -4
  37. package/lib/cjs/components/Groups/GroupsVisualizationActions.js +8 -6
  38. package/lib/cjs/components/Groups/GroupsVisualizationActions.js.map +1 -1
  39. package/lib/cjs/components/Groups/GroupsVisualizationActions.scss +1 -0
  40. package/lib/cjs/components/Groups/groupsHelpers.d.ts +19 -7
  41. package/lib/cjs/components/Groups/groupsHelpers.js +11 -70
  42. package/lib/cjs/components/Groups/groupsHelpers.js.map +1 -1
  43. package/lib/cjs/components/Groups/hooks/useGroupsOperations.d.ts +1 -5
  44. package/lib/cjs/components/Groups/hooks/useGroupsOperations.js +17 -31
  45. package/lib/cjs/components/Groups/hooks/useGroupsOperations.js.map +1 -1
  46. package/lib/cjs/components/Groups/hooks/useKeySetHiliteQueries.d.ts +32 -0
  47. package/lib/cjs/components/Groups/hooks/useKeySetHiliteQueries.js +31 -0
  48. package/lib/cjs/components/Groups/hooks/useKeySetHiliteQueries.js.map +1 -0
  49. package/lib/cjs/components/Groups/hooks/useVisualization.js +4 -4
  50. package/lib/cjs/components/Groups/hooks/useVisualization.js.map +1 -1
  51. package/lib/cjs/components/Mappings/Editing/MappingAction.js +5 -1
  52. package/lib/cjs/components/Mappings/Editing/MappingAction.js.map +1 -1
  53. package/lib/cjs/components/Mappings/Extraction/ExtractionLogCustomFilter.js +5 -1
  54. package/lib/cjs/components/Mappings/Extraction/ExtractionLogCustomFilter.js.map +1 -1
  55. package/lib/cjs/components/Mappings/Extraction/ExtractionMessageModal.js +5 -1
  56. package/lib/cjs/components/Mappings/Extraction/ExtractionMessageModal.js.map +1 -1
  57. package/lib/cjs/components/Mappings/Import/ConfirmMappingsImport.js +5 -1
  58. package/lib/cjs/components/Mappings/Import/ConfirmMappingsImport.js.map +1 -1
  59. package/lib/cjs/components/Mappings/Import/MappingImportWizardModal.js +5 -1
  60. package/lib/cjs/components/Mappings/Import/MappingImportWizardModal.js.map +1 -1
  61. package/lib/cjs/components/Mappings/Import/SelectIModel.js +5 -1
  62. package/lib/cjs/components/Mappings/Import/SelectIModel.js.map +1 -1
  63. package/lib/cjs/components/Mappings/Import/SelectITwin.js +5 -1
  64. package/lib/cjs/components/Mappings/Import/SelectITwin.js.map +1 -1
  65. package/lib/cjs/components/Mappings/Import/SelectMappings.js +5 -1
  66. package/lib/cjs/components/Mappings/Import/SelectMappings.js.map +1 -1
  67. package/lib/cjs/components/Mappings/MappingsView.js +5 -1
  68. package/lib/cjs/components/Mappings/MappingsView.js.map +1 -1
  69. package/lib/cjs/components/Properties/CalculatedProperties/CalculatedPropertyAction.js +5 -1
  70. package/lib/cjs/components/Properties/CalculatedProperties/CalculatedPropertyAction.js.map +1 -1
  71. package/lib/cjs/components/Properties/CalculatedProperties/CalculatedPropertyActionWithVisuals.js +16 -21
  72. package/lib/cjs/components/Properties/CalculatedProperties/CalculatedPropertyActionWithVisuals.js.map +1 -1
  73. package/lib/cjs/components/Properties/CalculatedProperties/CalculatedPropertyTable.js +5 -1
  74. package/lib/cjs/components/Properties/CalculatedProperties/CalculatedPropertyTable.js.map +1 -1
  75. package/lib/cjs/components/Properties/CalculatedProperties/SharedCalculatedPropertyForms.js +5 -1
  76. package/lib/cjs/components/Properties/CalculatedProperties/SharedCalculatedPropertyForms.js.map +1 -1
  77. package/lib/cjs/components/Properties/CustomCalculations/CustomCalculationAction.js +5 -1
  78. package/lib/cjs/components/Properties/CustomCalculations/CustomCalculationAction.js.map +1 -1
  79. package/lib/cjs/components/Properties/CustomCalculations/CustomCalculationTable.js +5 -1
  80. package/lib/cjs/components/Properties/CustomCalculations/CustomCalculationTable.js.map +1 -1
  81. package/lib/cjs/components/Properties/GroupColorToggle.js +13 -10
  82. package/lib/cjs/components/Properties/GroupColorToggle.js.map +1 -1
  83. package/lib/cjs/components/Properties/GroupProperties/GroupPropertyAction.js +7 -3
  84. package/lib/cjs/components/Properties/GroupProperties/GroupPropertyAction.js.map +1 -1
  85. package/lib/cjs/components/Properties/GroupProperties/GroupPropertyTable.js +5 -1
  86. package/lib/cjs/components/Properties/GroupProperties/GroupPropertyTable.js.map +1 -1
  87. package/lib/cjs/components/Properties/GroupProperties/SortableHorizontalTile.js +5 -1
  88. package/lib/cjs/components/Properties/GroupProperties/SortableHorizontalTile.js.map +1 -1
  89. package/lib/cjs/components/Properties/PropertyAction.js +5 -1
  90. package/lib/cjs/components/Properties/PropertyAction.js.map +1 -1
  91. package/lib/cjs/components/Properties/PropertyMenu.js +5 -1
  92. package/lib/cjs/components/Properties/PropertyMenu.js.map +1 -1
  93. package/lib/cjs/components/Properties/PropertyMenuWithVisualization.js +5 -1
  94. package/lib/cjs/components/Properties/PropertyMenuWithVisualization.js.map +1 -1
  95. package/lib/cjs/components/Properties/PropertyTable.js +5 -1
  96. package/lib/cjs/components/Properties/PropertyTable.js.map +1 -1
  97. package/lib/cjs/components/SharedComponents/ActionPanel.js +5 -1
  98. package/lib/cjs/components/SharedComponents/ActionPanel.js.map +1 -1
  99. package/lib/cjs/components/SharedComponents/DeleteModal.js +5 -1
  100. package/lib/cjs/components/SharedComponents/DeleteModal.js.map +1 -1
  101. package/lib/cjs/components/context/GroupHilitedElementsContext.d.ts +9 -16
  102. package/lib/cjs/components/context/GroupHilitedElementsContext.js +13 -10
  103. package/lib/cjs/components/context/GroupHilitedElementsContext.js.map +1 -1
  104. package/lib/cjs/components/context/GroupingApiConfigContext.js +5 -1
  105. package/lib/cjs/components/context/GroupingApiConfigContext.js.map +1 -1
  106. package/lib/cjs/components/context/PropertiesContext.js +5 -1
  107. package/lib/cjs/components/context/PropertiesContext.js.map +1 -1
  108. package/lib/cjs/components/context/PropertyGridWrapperContext.js +5 -1
  109. package/lib/cjs/components/context/PropertyGridWrapperContext.js.map +1 -1
  110. package/lib/cjs/components/customUI/GroupQueryBuilderCustomUI.js +5 -1
  111. package/lib/cjs/components/customUI/GroupQueryBuilderCustomUI.js.map +1 -1
  112. package/lib/cjs/grouping-mapping-widget.js +5 -1
  113. package/lib/cjs/grouping-mapping-widget.js.map +1 -1
  114. package/lib/cjs/test/GroupingMappingCustomUI.test.js +5 -1
  115. package/lib/cjs/test/GroupingMappingCustomUI.test.js.map +1 -1
  116. package/lib/cjs/test/MockFactory.js +5 -1
  117. package/lib/cjs/test/MockFactory.js.map +1 -1
  118. package/lib/cjs/test/PropertyFieldsHelpers.d.ts +4 -20
  119. package/lib/cjs/test/test-utils.js +13 -1
  120. package/lib/cjs/test/test-utils.js.map +1 -1
  121. package/lib/esm/common/hooks/useIsMounted.d.ts +2 -0
  122. package/lib/esm/common/hooks/useIsMounted.js +16 -0
  123. package/lib/esm/common/hooks/useIsMounted.js.map +1 -0
  124. package/lib/esm/common/utils.d.ts +1 -0
  125. package/lib/esm/common/utils.js +11 -0
  126. package/lib/esm/common/utils.js.map +1 -1
  127. package/lib/esm/components/Constants.d.ts +4 -0
  128. package/lib/esm/components/Constants.js +10 -0
  129. package/lib/esm/components/Constants.js.map +1 -0
  130. package/lib/esm/components/GroupingMappingContext.d.ts +5 -0
  131. package/lib/esm/components/GroupingMappingContext.js +27 -19
  132. package/lib/esm/components/GroupingMappingContext.js.map +1 -1
  133. package/lib/esm/components/Groups/Editing/GroupAction.js +53 -57
  134. package/lib/esm/components/Groups/Editing/GroupAction.js.map +1 -1
  135. package/lib/esm/components/Groups/Editing/GroupDetailsActionPanel.d.ts +1 -1
  136. package/lib/esm/components/Groups/Editing/GroupDetailsActionPanel.js.map +1 -1
  137. package/lib/esm/components/Groups/GroupItem.js +1 -1
  138. package/lib/esm/components/Groups/GroupItem.js.map +1 -1
  139. package/lib/esm/components/Groups/Groups.d.ts +3 -2
  140. package/lib/esm/components/Groups/Groups.js +3 -3
  141. package/lib/esm/components/Groups/Groups.js.map +1 -1
  142. package/lib/esm/components/Groups/GroupsShowHideButtons.d.ts +2 -2
  143. package/lib/esm/components/Groups/GroupsShowHideButtons.js +3 -3
  144. package/lib/esm/components/Groups/GroupsShowHideButtons.js.map +1 -1
  145. package/lib/esm/components/Groups/GroupsView.js +1 -1
  146. package/lib/esm/components/Groups/GroupsView.js.map +1 -1
  147. package/lib/esm/components/Groups/GroupsVisualization.d.ts +1 -1
  148. package/lib/esm/components/Groups/GroupsVisualization.js +100 -68
  149. package/lib/esm/components/Groups/GroupsVisualization.js.map +1 -1
  150. package/lib/esm/components/Groups/GroupsVisualizationActions.d.ts +6 -4
  151. package/lib/esm/components/Groups/GroupsVisualizationActions.js +9 -7
  152. package/lib/esm/components/Groups/GroupsVisualizationActions.js.map +1 -1
  153. package/lib/esm/components/Groups/GroupsVisualizationActions.scss +1 -0
  154. package/lib/esm/components/Groups/groupsHelpers.d.ts +19 -7
  155. package/lib/esm/components/Groups/groupsHelpers.js +10 -67
  156. package/lib/esm/components/Groups/groupsHelpers.js.map +1 -1
  157. package/lib/esm/components/Groups/hooks/useGroupsOperations.d.ts +1 -5
  158. package/lib/esm/components/Groups/hooks/useGroupsOperations.js +18 -32
  159. package/lib/esm/components/Groups/hooks/useGroupsOperations.js.map +1 -1
  160. package/lib/esm/components/Groups/hooks/useKeySetHiliteQueries.d.ts +32 -0
  161. package/lib/esm/components/Groups/hooks/useKeySetHiliteQueries.js +25 -0
  162. package/lib/esm/components/Groups/hooks/useKeySetHiliteQueries.js.map +1 -0
  163. package/lib/esm/components/Groups/hooks/useVisualization.js +4 -4
  164. package/lib/esm/components/Groups/hooks/useVisualization.js.map +1 -1
  165. package/lib/esm/components/Properties/CalculatedProperties/CalculatedPropertyActionWithVisuals.js +13 -22
  166. package/lib/esm/components/Properties/CalculatedProperties/CalculatedPropertyActionWithVisuals.js.map +1 -1
  167. package/lib/esm/components/Properties/GroupColorToggle.js +9 -10
  168. package/lib/esm/components/Properties/GroupColorToggle.js.map +1 -1
  169. package/lib/esm/components/Properties/GroupProperties/GroupPropertyAction.js +3 -3
  170. package/lib/esm/components/Properties/GroupProperties/GroupPropertyAction.js.map +1 -1
  171. package/lib/esm/components/context/GroupHilitedElementsContext.d.ts +9 -16
  172. package/lib/esm/components/context/GroupHilitedElementsContext.js +8 -9
  173. package/lib/esm/components/context/GroupHilitedElementsContext.js.map +1 -1
  174. package/lib/esm/test/PropertyFieldsHelpers.d.ts +4 -20
  175. package/lib/esm/test/test-utils.js +8 -0
  176. package/lib/esm/test/test-utils.js.map +1 -1
  177. package/package.json +27 -28
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -32,93 +36,117 @@ require("./GroupsVisualization.scss");
32
36
  const GroupingApiConfigContext_1 = require("../context/GroupingApiConfigContext");
33
37
  const itwinui_react_1 = require("@itwin/itwinui-react");
34
38
  const itwinui_icons_react_1 = require("@itwin/itwinui-icons-react");
35
- const GroupsVisualization = ({ emphasizeElements = true, isNonEmphasizedSelectable = false, onClickGroupModify, onClickAddGroup, ...rest }) => {
39
+ const MappingClientContext_1 = require("../context/MappingClientContext");
40
+ const react_query_1 = require("@tanstack/react-query");
41
+ const useIsMounted_1 = require("../../common/hooks/useIsMounted");
42
+ const useFetchGroups_1 = require("./hooks/useFetchGroups");
43
+ const useKeySetHiliteQueries_1 = require("./hooks/useKeySetHiliteQueries");
44
+ const GroupsVisualization = ({ emphasizeElements = true, isNonEmphasizedSelectable = false, onClickGroupModify, onClickAddGroup, mapping, ...rest }) => {
36
45
  const { iModelConnection } = (0, GroupingApiConfigContext_1.useGroupingMappingApiConfig)();
37
46
  if (!iModelConnection) {
38
47
  throw new Error("This component requires an active iModelConnection.");
39
48
  }
40
- const [isLoadingQuery, setLoadingQuery] = (0, react_1.useState)(false);
41
- const [isVisualizing, setIsVisualizing] = (0, react_1.useState)(false);
42
49
  const [isAlertClosed, setIsAlertClosed] = (0, react_1.useState)(true);
43
50
  const [isAlertExpanded, setIsAlertExpanded] = (0, react_1.useState)(false);
44
- const { hilitedElementsQueryCache, groups, hiddenGroupsIds, showGroupColor, isOverlappedColored, setHiddenGroupsIds, setNumberOfVisualizedGroups, setOverlappedElementsInfo, setGroupElementsInfo, overlappedElementsInfo, overlappedElementGroupPairs, setOverlappedElementGroupPairs, } = (0, GroupHilitedElementsContext_1.useGroupHilitedElementsContext)();
45
- const getHiliteIdsFromGroupsWrapper = (0, react_1.useCallback)(async (groups) => iModelConnection
46
- ? (0, groupsHelpers_1.getHiliteIdsFromGroups)(iModelConnection, groups, hilitedElementsQueryCache)
47
- : [], [iModelConnection, hilitedElementsQueryCache]);
48
- const handleVisualizationStates = (0, react_1.useCallback)((start = true) => {
49
- setIsVisualizing(start);
50
- setLoadingQuery(start);
51
- if (!start) {
52
- setNumberOfVisualizedGroups(0);
53
- }
54
- }, [setNumberOfVisualizedGroups]);
55
- const triggerVisualization = (0, react_1.useCallback)(async () => {
56
- handleVisualizationStates(true);
57
- const groupsCopy = [...groups];
58
- await (0, groupsHelpers_1.visualizeGroupColors)(iModelConnection, groupsCopy, hiddenGroupsIds, hilitedElementsQueryCache, setNumberOfVisualizedGroups, setOverlappedElementsInfo, setGroupElementsInfo, setOverlappedElementGroupPairs, emphasizeElements);
59
- isNonEmphasizedSelectable && (0, viewerUtils_1.clearEmphasizedElements)();
60
- handleVisualizationStates(false);
61
- }, [handleVisualizationStates, groups, iModelConnection, hiddenGroupsIds, hilitedElementsQueryCache, setNumberOfVisualizedGroups, setOverlappedElementsInfo, setGroupElementsInfo, setOverlappedElementGroupPairs, emphasizeElements, isNonEmphasizedSelectable]);
51
+ const { hiddenGroupsIds, showGroupColor, setShowGroupColor, isOverlappedColored, setHiddenGroupsIds, setNumberOfVisualizedGroups, isVisualizationsEnabled, setIsVisualizationsEnabled, overlappedElementsMetadata, setOverlappedElementsMetadata, } = (0, GroupHilitedElementsContext_1.useGroupHilitedElementsContext)();
52
+ const { getAccessToken, iModelId } = (0, GroupingApiConfigContext_1.useGroupingMappingApiConfig)();
53
+ const mappingClient = (0, MappingClientContext_1.useMappingClient)();
54
+ const { data: groups, isFetched: isGroupsFetched, isFetching: isGroupsFetching } = (0, useFetchGroups_1.useFetchGroups)(iModelId, mapping.id, getAccessToken, mappingClient);
55
+ const isMounted = (0, useIsMounted_1.useIsMounted)();
56
+ const [enableGroupQueries, setEnableGroupQueries] = (0, react_1.useState)(false);
57
+ const { groupQueries } = (0, useKeySetHiliteQueries_1.useKeySetHiliteQueries)(groups ?? [], enableGroupQueries, iModelConnection);
58
+ const triggerVisualization = (0, react_1.useCallback)(async (groupsWithGroupedOverlaps) => (0, groupsHelpers_1.visualizeGroupColors)(hiddenGroupsIds, groupsWithGroupedOverlaps, setNumberOfVisualizedGroups, emphasizeElements), [emphasizeElements, hiddenGroupsIds, setNumberOfVisualizedGroups]);
59
+ const zoomToElementsMutation = (0, react_query_1.useMutation)({
60
+ mutationFn: viewerUtils_1.zoomToElements,
61
+ onSuccess: () => {
62
+ if (isMounted()) {
63
+ isNonEmphasizedSelectable && (0, viewerUtils_1.clearEmphasizedElements)();
64
+ }
65
+ },
66
+ });
67
+ const visualizationMutation = (0, react_query_1.useMutation)({
68
+ mutationFn: triggerVisualization,
69
+ onSuccess: (allIds) => {
70
+ if (isMounted()) {
71
+ zoomToElementsMutation.mutate(allIds);
72
+ }
73
+ },
74
+ });
75
+ const isGroupsQueriesReady = (0, react_1.useMemo)(() => groupQueries.every((query) => query.isFetched && query.data) && groupQueries.length > 0, [groupQueries]);
76
+ const groupQueriesProgressCount = (0, react_1.useMemo)(() => groupQueries.filter((query) => query.isFetched).length, [groupQueries]);
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]);
84
+ const getHiliteIdsFromGroupsWrapper = (0, react_1.useCallback)((groups) => hiliteIds.filter((id) => groups.some((group) => group.id === id.groupId)).flatMap((id) => id.elementIds), [hiliteIds]);
62
85
  (0, react_1.useEffect)(() => {
63
- const visualize = async () => {
64
- if (isOverlappedColored === false) {
65
- if (groups.length > 0 && showGroupColor) {
66
- await triggerVisualization();
67
- }
68
- else {
69
- (0, viewerUtils_1.clearEmphasizedOverriddenElements)();
70
- }
86
+ if (isOverlappedColored === false) {
87
+ if (hiliteIds.length > 0 && showGroupColor && !isGroupsFetching) {
88
+ const results = (0, groupsHelpers_1.generateOverlappedGroups)(hiliteIds);
89
+ const { groupsWithGroupedOverlaps, overlappedElementsInfo, numberOfElementsInGroups } = results;
90
+ setOverlappedElementsMetadata({ overlappedElementsInfo, groupElementsInfo: numberOfElementsInGroups, overlappedElementGroupPairs: groupsWithGroupedOverlaps });
91
+ visualizationMutation.mutate(results.groupsWithGroupedOverlaps);
71
92
  }
72
- };
73
- void visualize();
93
+ else {
94
+ (0, viewerUtils_1.clearEmphasizedOverriddenElements)();
95
+ }
96
+ }
74
97
  // We don't want to trigger full visualization when toggling individual groups.
75
98
  // eslint-disable-next-line react-hooks/exhaustive-deps
76
- }, [groups, showGroupColor, isOverlappedColored]);
77
- const hideAllGroups = (0, react_1.useCallback)(async () => {
78
- setLoadingQuery(true);
79
- await (0, groupsHelpers_1.hideGroups)(iModelConnection, groups, hilitedElementsQueryCache);
80
- setLoadingQuery(false);
81
- }, [groups, hilitedElementsQueryCache, iModelConnection]);
82
- const hideSingleGroupWrapper = (0, react_1.useCallback)(async (groupToHide) => {
83
- setLoadingQuery(true);
84
- await (0, groupsHelpers_1.hideGroupConsideringOverlaps)(overlappedElementGroupPairs, groupToHide.id, hiddenGroupsIds);
85
- setLoadingQuery(false);
86
- }, [overlappedElementGroupPairs, hiddenGroupsIds]);
87
- const showGroup = (0, react_1.useCallback)(async (viewGroup) => {
88
- setLoadingQuery(true);
99
+ }, [showGroupColor, isOverlappedColored, hiliteIds]);
100
+ (0, react_1.useEffect)(() => {
101
+ if (isVisualizationsEnabled) {
102
+ setEnableGroupQueries(true);
103
+ }
104
+ else {
105
+ setShowGroupColor(false);
106
+ (0, viewerUtils_1.clearHiddenElements)();
107
+ setHiddenGroupsIds(new Set());
108
+ }
109
+ }, [isVisualizationsEnabled, setHiddenGroupsIds, setIsVisualizationsEnabled, setShowGroupColor]);
110
+ const hideAllGroups = (0, react_1.useCallback)(() => {
111
+ if (!groups)
112
+ return;
113
+ (0, viewerUtils_1.hideElements)(getHiliteIdsFromGroupsWrapper(groups));
114
+ }, [getHiliteIdsFromGroupsWrapper, groups]);
115
+ const hideSingleGroupWrapper = (0, react_1.useCallback)((groupToHide) => {
116
+ (0, groupsHelpers_1.hideGroupConsideringOverlaps)(overlappedElementsMetadata.overlappedElementGroupPairs, groupToHide.id, hiddenGroupsIds);
117
+ }, [hiddenGroupsIds, overlappedElementsMetadata.overlappedElementGroupPairs]);
118
+ const showGroup = (0, react_1.useCallback)((viewGroup) => {
119
+ if (!groups)
120
+ return;
89
121
  (0, viewerUtils_1.clearHiddenElements)();
90
122
  // hide group Ids filter
91
123
  const newHiddenGroups = groups.filter((g) => hiddenGroupsIds.has(g.id) && g.id !== viewGroup.id);
92
124
  // view group Ids filter
93
125
  const viewGroups = groups.filter((g) => !hiddenGroupsIds.has(g.id) || g.id === viewGroup.id);
94
- const viewIds = await getHiliteIdsFromGroupsWrapper(viewGroups);
95
- let hiddenIds = await getHiliteIdsFromGroupsWrapper(newHiddenGroups);
126
+ const viewIds = getHiliteIdsFromGroupsWrapper(viewGroups);
127
+ let hiddenIds = getHiliteIdsFromGroupsWrapper(newHiddenGroups);
96
128
  hiddenIds = hiddenIds.filter((id) => !viewIds.includes(id));
97
129
  (0, viewerUtils_1.hideElements)(hiddenIds);
98
- setLoadingQuery(false);
99
130
  }, [groups, hiddenGroupsIds, getHiliteIdsFromGroupsWrapper]);
100
- const showAll = (0, react_1.useCallback)(async () => {
101
- setLoadingQuery(true);
131
+ const showAll = (0, react_1.useCallback)(() => {
102
132
  (0, viewerUtils_1.clearHiddenElements)();
103
133
  setHiddenGroupsIds(new Set());
104
- await getHiliteIdsFromGroupsWrapper(groups);
105
- setLoadingQuery(false);
106
- }, [getHiliteIdsFromGroupsWrapper, groups, setHiddenGroupsIds]);
107
- const hideAll = (0, react_1.useCallback)(async () => {
108
- await hideAllGroups();
134
+ }, [setHiddenGroupsIds]);
135
+ const hideAll = (0, react_1.useCallback)(() => {
136
+ if (!groups)
137
+ return;
138
+ hideAllGroups();
109
139
  setHiddenGroupsIds(new Set(groups.map((g) => g.id)));
110
- await getHiliteIdsFromGroupsWrapper(groups);
111
140
  }, [
112
141
  setHiddenGroupsIds,
113
142
  groups,
114
143
  hideAllGroups,
115
- getHiliteIdsFromGroupsWrapper,
116
144
  ]);
117
- const onModify = (0, react_1.useCallback)(async (group, type) => {
145
+ const onModify = (0, react_1.useCallback)((group, type) => {
118
146
  if (!onClickGroupModify)
119
147
  return;
120
148
  if (group.id && hiddenGroupsIds.has(group.id)) {
121
- await showGroup(group);
149
+ showGroup(group);
122
150
  setHiddenGroupsIds(new Set([...hiddenGroupsIds].filter((id) => id !== group.id)));
123
151
  }
124
152
  (0, viewerUtils_1.clearEmphasizedElements)();
@@ -130,11 +158,11 @@ const GroupsVisualization = ({ emphasizeElements = true, isNonEmphasizedSelectab
130
158
  onClickAddGroup(type);
131
159
  (0, viewerUtils_1.clearEmphasizedElements)();
132
160
  }, [onClickAddGroup]);
133
- const groupActionButtonRenderers = (0, react_1.useMemo)(() => [
134
- (props) => showGroupColor ? react_1.default.createElement(GroupColorLegend_1.GroupColorLegend, { ...props, groups: groups }) : [],
135
- (props) => (react_1.default.createElement(GroupsShowHideButtons_1.GroupsShowHideButtons, { ...props, isLoadingQuery: isLoadingQuery, showGroup: showGroup, hideGroup: hideSingleGroupWrapper })),
136
- ].flat(), [groups, hideSingleGroupWrapper, isLoadingQuery, showGroup, showGroupColor]);
137
- const overlappedAlert = (0, react_1.useMemo)(() => overlappedElementsInfo.size > 0 && isAlertClosed && showGroupColor && !isVisualizing ?
161
+ const groupActionButtonRenderers = (0, react_1.useMemo)(() => isVisualizationsEnabled ? [
162
+ (props) => showGroupColor ? react_1.default.createElement(GroupColorLegend_1.GroupColorLegend, { ...props, groups: groups ?? [] }) : [],
163
+ (props) => (react_1.default.createElement(GroupsShowHideButtons_1.GroupsShowHideButtons, { ...props, isLoadingQuery: !(isVisualizationsEnabled && isGroupsFetched && isGroupsQueriesReady), showGroup: showGroup, hideGroup: hideSingleGroupWrapper })),
164
+ ].flat() : [], [groups, hideSingleGroupWrapper, isGroupsFetched, isGroupsQueriesReady, isVisualizationsEnabled, showGroup, showGroupColor]);
165
+ const overlappedAlert = (0, react_1.useMemo)(() => overlappedElementsMetadata.overlappedElementsInfo.size > 0 && isAlertClosed && showGroupColor ?
138
166
  react_1.default.createElement(itwinui_react_1.Alert, { onClose: () => setIsAlertClosed(false), clickableText: isAlertExpanded ? "Less Details" : "More Details", clickableTextProps: { onClick: () => setIsAlertExpanded(!isAlertExpanded) } },
139
167
  "Overlapping elements are colored ",
140
168
  react_1.default.createElement(itwinui_react_1.Text, { className: "gmw-red-text" }, "red"),
@@ -144,10 +172,18 @@ const GroupsVisualization = ({ emphasizeElements = true, isNonEmphasizedSelectab
144
172
  "To get overlap info in detail, click the ",
145
173
  react_1.default.createElement(itwinui_react_1.Icon, null,
146
174
  react_1.default.createElement(itwinui_icons_react_1.SvgMore, null)),
147
- " button then \u201COverlap Info\u201D")) : undefined) : undefined, [isAlertClosed, isAlertExpanded, isVisualizing, overlappedElementsInfo.size, showGroupColor]);
175
+ " button then \u201COverlap Info\u201D")) : undefined) : undefined, [isAlertClosed, isAlertExpanded, overlappedElementsMetadata.overlappedElementsInfo.size, showGroupColor]);
176
+ const progressConfig = (0, react_1.useMemo)(() => isVisualizationsEnabled && isResolvingGroupQueries
177
+ ? {
178
+ hilitedGroupsProgress: {
179
+ currentHilitedGroups: groupQueriesProgressCount,
180
+ totalNumberOfGroups: groups?.length ?? 0,
181
+ },
182
+ }
183
+ : undefined, [groupQueriesProgressCount, groups, isResolvingGroupQueries, isVisualizationsEnabled]);
148
184
  return (react_1.default.createElement("div", { className: "gmw-groups-vis-container" },
149
- react_1.default.createElement(GroupsVisualizationActions_1.GroupVisualizationActions, { isLoadingQuery: isLoadingQuery, showAll: showAll, hideAll: hideAll }),
150
- react_1.default.createElement(Groups_1.Groups, { onClickGroupModify: onModify, onClickAddGroup: onAddGroup, actionButtonRenderers: groupActionButtonRenderers, ...rest, disableActions: isLoadingQuery, isVisualizing: isVisualizing, alert: overlappedAlert })));
185
+ react_1.default.createElement(GroupsVisualizationActions_1.GroupVisualizationActions, { disabled: !(isVisualizationsEnabled && isGroupsFetched && isGroupsQueriesReady), isVisualizationEnabled: isVisualizationsEnabled, onClickVisualizationButton: () => setIsVisualizationsEnabled((b) => !b), showAll: showAll, hideAll: hideAll }),
186
+ react_1.default.createElement(Groups_1.Groups, { onClickGroupModify: onModify, onClickAddGroup: onAddGroup, actionButtonRenderers: groupActionButtonRenderers, mapping: mapping, ...rest, progressConfig: progressConfig, alert: overlappedAlert })));
151
187
  };
152
188
  exports.GroupsVisualization = GroupsVisualization;
153
189
  //# sourceMappingURL=GroupsVisualization.js.map
@@ -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 { useGroupHilitedElementsContext } from \"../context/GroupHilitedElementsContext\";\nimport {\n getHiliteIdsFromGroups,\n hideGroupConsideringOverlaps,\n hideGroups,\n visualizeGroupColors,\n} from \"./groupsHelpers\";\nimport {\n clearEmphasizedElements,\n clearEmphasizedOverriddenElements,\n clearHiddenElements,\n hideElements,\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\";\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 ...rest\n}: GroupsVisualizationProps) => {\n const { iModelConnection } = useGroupingMappingApiConfig();\n if (!iModelConnection) {\n throw new Error(\"This component requires an active iModelConnection.\");\n }\n const [isLoadingQuery, setLoadingQuery] = useState<boolean>(false);\n const [isVisualizing, setIsVisualizing] = useState<boolean>(false);\n const [isAlertClosed, setIsAlertClosed] = useState<boolean>(true);\n const [isAlertExpanded, setIsAlertExpanded] = useState<boolean>(false);\n const {\n hilitedElementsQueryCache,\n groups,\n hiddenGroupsIds,\n showGroupColor,\n isOverlappedColored,\n setHiddenGroupsIds,\n setNumberOfVisualizedGroups,\n setOverlappedElementsInfo,\n setGroupElementsInfo,\n overlappedElementsInfo,\n overlappedElementGroupPairs,\n setOverlappedElementGroupPairs,\n } = useGroupHilitedElementsContext();\n\n const getHiliteIdsFromGroupsWrapper = useCallback(\n async (groups: Group[]): Promise<string[]> =>\n iModelConnection\n ? getHiliteIdsFromGroups(\n iModelConnection,\n groups,\n hilitedElementsQueryCache\n )\n : [],\n [iModelConnection, hilitedElementsQueryCache]\n );\n\n const handleVisualizationStates = useCallback((start: boolean = true) => {\n setIsVisualizing(start);\n setLoadingQuery(start);\n if (!start) {\n setNumberOfVisualizedGroups(0);\n }\n }, [setNumberOfVisualizedGroups]);\n\n const triggerVisualization = useCallback(async () => {\n handleVisualizationStates(true);\n const groupsCopy = [...groups];\n await visualizeGroupColors(\n iModelConnection,\n groupsCopy,\n hiddenGroupsIds,\n hilitedElementsQueryCache,\n setNumberOfVisualizedGroups,\n setOverlappedElementsInfo,\n setGroupElementsInfo,\n setOverlappedElementGroupPairs,\n emphasizeElements,\n );\n isNonEmphasizedSelectable && clearEmphasizedElements();\n handleVisualizationStates(false);\n }, [handleVisualizationStates, groups, iModelConnection, hiddenGroupsIds, hilitedElementsQueryCache, setNumberOfVisualizedGroups, setOverlappedElementsInfo, setGroupElementsInfo, setOverlappedElementGroupPairs, emphasizeElements, isNonEmphasizedSelectable]);\n\n useEffect(() => {\n const visualize = async () => {\n if (isOverlappedColored === false) {\n if (groups.length > 0 && showGroupColor) {\n await triggerVisualization();\n } else {\n clearEmphasizedOverriddenElements();\n }\n }\n };\n void visualize();\n // We don't want to trigger full visualization when toggling individual groups.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [groups, showGroupColor, isOverlappedColored]);\n\n const hideAllGroups = useCallback(\n async () => {\n setLoadingQuery(true);\n await hideGroups(iModelConnection, groups, hilitedElementsQueryCache);\n setLoadingQuery(false);\n },\n [groups, hilitedElementsQueryCache, iModelConnection]\n );\n\n const hideSingleGroupWrapper = useCallback(\n async (groupToHide: Group) => {\n setLoadingQuery(true);\n\n await hideGroupConsideringOverlaps(overlappedElementGroupPairs, groupToHide.id, hiddenGroupsIds);\n\n setLoadingQuery(false);\n },\n [overlappedElementGroupPairs, hiddenGroupsIds]\n );\n\n const showGroup = useCallback(\n async (viewGroup: Group) => {\n setLoadingQuery(true);\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 = await getHiliteIdsFromGroupsWrapper(viewGroups);\n\n let hiddenIds = await getHiliteIdsFromGroupsWrapper(newHiddenGroups);\n hiddenIds = hiddenIds.filter((id) => !viewIds.includes(id));\n hideElements(hiddenIds);\n setLoadingQuery(false);\n },\n [groups, hiddenGroupsIds, getHiliteIdsFromGroupsWrapper]\n );\n\n const showAll = useCallback(async () => {\n setLoadingQuery(true);\n\n clearHiddenElements();\n setHiddenGroupsIds(new Set());\n await getHiliteIdsFromGroupsWrapper(groups);\n\n setLoadingQuery(false);\n }, [getHiliteIdsFromGroupsWrapper, groups, setHiddenGroupsIds]);\n\n const hideAll = useCallback(async () => {\n await hideAllGroups();\n setHiddenGroupsIds(\n new Set(groups.map((g) => g.id))\n );\n await getHiliteIdsFromGroupsWrapper(groups);\n }, [\n setHiddenGroupsIds,\n groups,\n hideAllGroups,\n getHiliteIdsFromGroupsWrapper,\n ]);\n\n const onModify = useCallback(\n async (group: Group, type: string) => {\n if (!onClickGroupModify) return;\n if (group.id && hiddenGroupsIds.has(group.id)) {\n await 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(() => [\n (props: ActionButtonRendererProps) =>\n showGroupColor ? <GroupColorLegend {...props} groups={groups} /> : [],\n (props: ActionButtonRendererProps) => (\n <GroupsShowHideButtons\n {...props}\n isLoadingQuery={isLoadingQuery}\n showGroup={showGroup}\n hideGroup={hideSingleGroupWrapper}\n />\n ),\n ].flat(), [groups, hideSingleGroupWrapper, isLoadingQuery, showGroup, showGroupColor]);\n\n const overlappedAlert = useMemo(() =>\n overlappedElementsInfo.size > 0 && isAlertClosed && showGroupColor && !isVisualizing ?\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,\n [isAlertClosed, isAlertExpanded, isVisualizing, overlappedElementsInfo.size, showGroupColor]\n );\n\n return (\n <div className=\"gmw-groups-vis-container\">\n <GroupVisualizationActions\n isLoadingQuery={isLoadingQuery}\n showAll={showAll}\n hideAll={hideAll}\n />\n <Groups\n onClickGroupModify={onModify}\n onClickAddGroup={onAddGroup}\n actionButtonRenderers={groupActionButtonRenderers}\n {...rest}\n disableActions={isLoadingQuery}\n isVisualizing={isVisualizing}\n alert={overlappedAlert}\n />\n </div>\n );\n};\n"]}
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 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 if (isOverlappedColored === false) {\n if (hiliteIds.length > 0 && showGroupColor && !isGroupsFetching) {\n const results = generateOverlappedGroups(hiliteIds);\n const { groupsWithGroupedOverlaps, overlappedElementsInfo, numberOfElementsInGroups } = results;\n setOverlappedElementsMetadata({ overlappedElementsInfo, groupElementsInfo: numberOfElementsInGroups, overlappedElementGroupPairs: groupsWithGroupedOverlaps });\n visualizationMutation.mutate(results.groupsWithGroupedOverlaps);\n } else {\n clearEmphasizedOverriddenElements();\n }\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,10 +1,12 @@
1
1
  /// <reference types="react" />
2
2
  import "./GroupsVisualizationActions.scss";
3
3
  interface GroupVisualizationActionsProps {
4
- isLoadingQuery: boolean;
5
- showAll: () => Promise<void>;
6
- hideAll: () => Promise<void>;
4
+ disabled: boolean;
5
+ isVisualizationEnabled: boolean;
6
+ onClickVisualizationButton: () => void;
7
+ showAll: () => void;
8
+ hideAll: () => void;
7
9
  }
8
- export declare const GroupVisualizationActions: ({ isLoadingQuery, showAll, hideAll, }: GroupVisualizationActionsProps) => JSX.Element;
10
+ export declare const GroupVisualizationActions: ({ disabled, isVisualizationEnabled, onClickVisualizationButton, showAll, hideAll, }: GroupVisualizationActionsProps) => JSX.Element;
9
11
  export {};
10
12
  //# sourceMappingURL=GroupsVisualizationActions.d.ts.map
@@ -14,14 +14,16 @@ const ToggleGroupVisibility_1 = require("./ToggleGroupVisibility");
14
14
  const itwinui_icons_react_1 = require("@itwin/itwinui-icons-react");
15
15
  require("./GroupsVisualizationActions.scss");
16
16
  const GroupHilitedElementsContext_1 = require("../context/GroupHilitedElementsContext");
17
- const GroupVisualizationActions = ({ isLoadingQuery, showAll, hideAll, }) => {
17
+ const GroupVisualizationActions = ({ disabled, isVisualizationEnabled, onClickVisualizationButton, showAll, hideAll, }) => {
18
18
  const { showGroupColor, setShowGroupColor, } = (0, GroupHilitedElementsContext_1.useGroupHilitedElementsContext)();
19
19
  return (react_1.default.createElement(itwinui_react_1.ButtonGroup, { className: "gmw-visual-buttons" },
20
- react_1.default.createElement(ToggleGroupVisibility_1.ToggleGroupVisibility, { isLoadingQuery: isLoadingQuery, showGroupColor: showGroupColor, setShowGroupColor: setShowGroupColor }),
21
- react_1.default.createElement(itwinui_react_1.IconButton, { title: "Show All", onClick: showAll, disabled: isLoadingQuery, styleType: "borderless" },
22
- react_1.default.createElement(itwinui_icons_react_1.SvgVisibilityShow, null)),
23
- react_1.default.createElement(itwinui_react_1.IconButton, { title: "Hide All", onClick: hideAll, disabled: isLoadingQuery, styleType: "borderless" },
24
- react_1.default.createElement(itwinui_icons_react_1.SvgVisibilityHide, null))));
20
+ react_1.default.createElement(itwinui_react_1.ToggleSwitch, { label: "Visualization", labelPosition: "left", checked: isVisualizationEnabled, onChange: onClickVisualizationButton }),
21
+ react_1.default.createElement(itwinui_react_1.ButtonGroup, null,
22
+ react_1.default.createElement(ToggleGroupVisibility_1.ToggleGroupVisibility, { isLoadingQuery: disabled, showGroupColor: showGroupColor, setShowGroupColor: setShowGroupColor }),
23
+ react_1.default.createElement(itwinui_react_1.IconButton, { title: "Show All", onClick: showAll, disabled: disabled, styleType: "borderless" },
24
+ react_1.default.createElement(itwinui_icons_react_1.SvgVisibilityShow, null)),
25
+ react_1.default.createElement(itwinui_react_1.IconButton, { title: "Hide All", onClick: hideAll, disabled: disabled, styleType: "borderless" },
26
+ react_1.default.createElement(itwinui_icons_react_1.SvgVisibilityHide, null)))));
25
27
  };
26
28
  exports.GroupVisualizationActions = GroupVisualizationActions;
27
29
  //# sourceMappingURL=GroupsVisualizationActions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GroupsVisualizationActions.js","sourceRoot":"","sources":["../../../../src/components/Groups/GroupsVisualizationActions.tsx"],"names":[],"mappings":";;;;;;AAAA;;;+FAG+F;AAC/F,wDAA+D;AAC/D,kDAA0B;AAC1B,mEAAgE;AAChE,oEAAkF;AAClF,6CAA2C;AAC3C,wFAAwF;AAQjF,MAAM,yBAAyB,GAAG,CAAC,EACxC,cAAc,EACd,OAAO,EACP,OAAO,GACwB,EAAE,EAAE;IACnC,MAAM,EACJ,cAAc,EACd,iBAAiB,GAClB,GAAG,IAAA,4DAA8B,GAAE,CAAC;IAErC,OAAO,CACL,8BAAC,2BAAW,IAAC,SAAS,EAAC,oBAAoB;QACzC,8BAAC,6CAAqB,IACpB,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,cAAc,EAC9B,iBAAiB,EAAE,iBAAiB,GACpC;QACF,8BAAC,0BAAU,IACT,KAAK,EAAC,UAAU,EAChB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAC,YAAY;YAEtB,8BAAC,uCAAiB,OAAG,CACV;QACb,8BAAC,0BAAU,IACT,KAAK,EAAC,UAAU,EAChB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAC,YAAY;YAEtB,8BAAC,uCAAiB,OAAG,CACV,CACD,CACf,CAAC;AAEJ,CAAC,CAAC;AApCW,QAAA,yBAAyB,6BAoCpC","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 { ButtonGroup, IconButton } from \"@itwin/itwinui-react\";\nimport React from \"react\";\nimport { ToggleGroupVisibility } from \"./ToggleGroupVisibility\";\nimport { SvgVisibilityHide, SvgVisibilityShow } from \"@itwin/itwinui-icons-react\";\nimport \"./GroupsVisualizationActions.scss\";\nimport { useGroupHilitedElementsContext } from \"../context/GroupHilitedElementsContext\";\n\ninterface GroupVisualizationActionsProps {\n isLoadingQuery: boolean;\n showAll: () => Promise<void>;\n hideAll: () => Promise<void>;\n}\n\nexport const GroupVisualizationActions = ({\n isLoadingQuery,\n showAll,\n hideAll,\n}: GroupVisualizationActionsProps) => {\n const {\n showGroupColor,\n setShowGroupColor,\n } = useGroupHilitedElementsContext();\n\n return (\n <ButtonGroup className=\"gmw-visual-buttons\">\n <ToggleGroupVisibility\n isLoadingQuery={isLoadingQuery}\n showGroupColor={showGroupColor}\n setShowGroupColor={setShowGroupColor}\n />\n <IconButton\n title=\"Show All\"\n onClick={showAll}\n disabled={isLoadingQuery}\n styleType=\"borderless\"\n >\n <SvgVisibilityShow />\n </IconButton>\n <IconButton\n title=\"Hide All\"\n onClick={hideAll}\n disabled={isLoadingQuery}\n styleType=\"borderless\"\n >\n <SvgVisibilityHide />\n </IconButton>\n </ButtonGroup>\n );\n\n};\n\n"]}
1
+ {"version":3,"file":"GroupsVisualizationActions.js","sourceRoot":"","sources":["../../../../src/components/Groups/GroupsVisualizationActions.tsx"],"names":[],"mappings":";;;;;;AAAA;;;+FAG+F;AAC/F,wDAA6E;AAC7E,kDAA0B;AAC1B,mEAAgE;AAChE,oEAAkF;AAClF,6CAA2C;AAC3C,wFAAwF;AAUjF,MAAM,yBAAyB,GAAG,CAAC,EACxC,QAAQ,EACR,sBAAsB,EACtB,0BAA0B,EAC1B,OAAO,EACP,OAAO,GACwB,EAAE,EAAE;IACnC,MAAM,EACJ,cAAc,EACd,iBAAiB,GAClB,GAAG,IAAA,4DAA8B,GAAE,CAAC;IAErC,OAAO,CACL,8BAAC,2BAAW,IAAC,SAAS,EAAC,oBAAoB;QACzC,8BAAC,4BAAY,IACX,KAAK,EAAC,eAAe,EACrB,aAAa,EAAC,MAAM,EACpB,OAAO,EAAE,sBAAsB,EAC/B,QAAQ,EAAE,0BAA0B,GACpC;QACF,8BAAC,2BAAW;YACV,8BAAC,6CAAqB,IACpB,cAAc,EAAE,QAAQ,EACxB,cAAc,EAAE,cAAc,EAC9B,iBAAiB,EAAE,iBAAiB,GACpC;YACF,8BAAC,0BAAU,IACT,KAAK,EAAC,UAAU,EAChB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAC,YAAY;gBAEtB,8BAAC,uCAAiB,OAAG,CACV;YACb,8BAAC,0BAAU,IACT,KAAK,EAAC,UAAU,EAChB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAC,YAAY;gBAEtB,8BAAC,uCAAiB,OAAG,CACV,CACD,CACD,CAChB,CAAC;AAEJ,CAAC,CAAC;AA9CW,QAAA,yBAAyB,6BA8CpC","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 { ButtonGroup, IconButton, ToggleSwitch } from \"@itwin/itwinui-react\";\nimport React from \"react\";\nimport { ToggleGroupVisibility } from \"./ToggleGroupVisibility\";\nimport { SvgVisibilityHide, SvgVisibilityShow } from \"@itwin/itwinui-icons-react\";\nimport \"./GroupsVisualizationActions.scss\";\nimport { useGroupHilitedElementsContext } from \"../context/GroupHilitedElementsContext\";\n\ninterface GroupVisualizationActionsProps {\n disabled: boolean;\n isVisualizationEnabled: boolean;\n onClickVisualizationButton: () => void;\n showAll: () => void;\n hideAll: () => void;\n}\n\nexport const GroupVisualizationActions = ({\n disabled,\n isVisualizationEnabled,\n onClickVisualizationButton,\n showAll,\n hideAll,\n}: GroupVisualizationActionsProps) => {\n const {\n showGroupColor,\n setShowGroupColor,\n } = useGroupHilitedElementsContext();\n\n return (\n <ButtonGroup className=\"gmw-visual-buttons\">\n <ToggleSwitch\n label=\"Visualization\"\n labelPosition=\"left\"\n checked={isVisualizationEnabled}\n onChange={onClickVisualizationButton}\n />\n <ButtonGroup>\n <ToggleGroupVisibility\n isLoadingQuery={disabled}\n showGroupColor={showGroupColor}\n setShowGroupColor={setShowGroupColor}\n />\n <IconButton\n title=\"Show All\"\n onClick={showAll}\n disabled={disabled}\n styleType=\"borderless\"\n >\n <SvgVisibilityShow />\n </IconButton>\n <IconButton\n title=\"Hide All\"\n onClick={hideAll}\n disabled={disabled}\n styleType=\"borderless\"\n >\n <SvgVisibilityHide />\n </IconButton>\n </ButtonGroup>\n </ButtonGroup >\n );\n\n};\n\n"]}
@@ -4,5 +4,6 @@
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
 
6
6
  .gmw-visual-buttons {
7
+ justify-content: space-between;
7
8
  flex-wrap: wrap;
8
9
  }
@@ -1,11 +1,23 @@
1
1
  import type { IModelConnection } from "@itwin/core-frontend";
2
2
  import type { Group } from "@itwin/insights-client";
3
- import type { OverlappedElementGroupPairs, OverlappedInfo, QueryCacheItem } from "../context/GroupHilitedElementsContext";
3
+ import type { OverlappedElementGroupPairs, OverlappedInfo } from "../context/GroupHilitedElementsContext";
4
4
  export declare const getGroupColor: (index: number) => string;
5
- export declare const getHiliteIdsFromGroups: (iModelConnection: IModelConnection, groups: Group[], hilitedElementsQueryCache: React.MutableRefObject<Map<string, QueryCacheItem>>) => Promise<string[]>;
6
- export declare const hideGroups: (iModelConnection: IModelConnection, viewGroups: Group[], hilitedElementsQueryCache: React.MutableRefObject<Map<string, QueryCacheItem>>) => Promise<void>;
7
- export declare const hideGroup: (iModelConnection: IModelConnection, viewGroup: Group, hilitedElementsQueryCache: React.MutableRefObject<Map<string, QueryCacheItem>>) => Promise<void>;
8
- export declare const visualizeGroupColors: (iModelConnection: IModelConnection, groups: Group[], hiddenGroupsIds: Set<string>, hilitedElementsQueryCache: React.MutableRefObject<Map<string, QueryCacheItem>>, setNumberOfVisualizedGroups: (numberOfVisualizedGroups: number | ((numberOfVisualizedGroups: number) => number)) => void, setOverlappedElementsInfo: (overlappedElementsInfo: Map<string, OverlappedInfo[]> | ((overlappedElementsInfo: Map<string, OverlappedInfo[]>) => Map<string, OverlappedInfo[]>)) => void, setGroupElementsInfo: (groupElementsInfo: Map<string, number> | ((groupElementsInfo: Map<string, number>) => Map<string, number>)) => void, setOverlappedElementGroupPairs: (overlappedElementGroupPairs: OverlappedElementGroupPairs[]) => void, doEmphasizeElements?: boolean) => Promise<void>;
9
- export declare const getHiliteIdsAndKeysetFromGroup: (iModelConnection: IModelConnection, group: Group, hilitedElementsQueryCache: React.MutableRefObject<Map<string, QueryCacheItem>>) => Promise<QueryCacheItem>;
10
- export declare const hideGroupConsideringOverlaps: (overlappedElementGroupPairs: OverlappedElementGroupPairs[], groupIdToHide: string, hiddenGroupsIds: Set<string>) => Promise<void>;
5
+ export declare type GroupsElementIds = {
6
+ groupId: string;
7
+ elementIds: string[];
8
+ }[];
9
+ export declare const visualizeGroupColors: (hiddenGroupsIds: Set<string>, groupsWithGroupedOverlaps: OverlappedElementGroupPairs[], setNumberOfVisualizedGroups: (numberOfVisualizedGroups: number | ((numberOfVisualizedGroups: number) => number)) => void, doEmphasizeElements?: boolean) => Promise<string[]>;
10
+ export declare const getHiliteIdsAndKeysetFromGroup: (iModelConnection: IModelConnection, group: Group) => Promise<{
11
+ group: Group;
12
+ result: {
13
+ keySet: import("@itwin/presentation-common").KeySet;
14
+ ids: string[];
15
+ };
16
+ }>;
17
+ export declare const generateOverlappedGroups: (groupsElementIds: GroupsElementIds) => {
18
+ groupsWithGroupedOverlaps: OverlappedElementGroupPairs[];
19
+ overlappedElementsInfo: Map<string, OverlappedInfo[]>;
20
+ numberOfElementsInGroups: Map<string, number>;
21
+ };
22
+ export declare const hideGroupConsideringOverlaps: (overlappedElementGroupPairs: OverlappedElementGroupPairs[], groupIdToHide: string, hiddenGroupsIds: Set<string>) => void;
11
23
  //# sourceMappingURL=groupsHelpers.d.ts.map
@@ -1,13 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.hideGroupConsideringOverlaps = exports.getHiliteIdsAndKeysetFromGroup = exports.visualizeGroupColors = exports.hideGroup = exports.hideGroups = exports.getHiliteIdsFromGroups = exports.getGroupColor = void 0;
3
+ exports.hideGroupConsideringOverlaps = exports.generateOverlappedGroups = exports.getHiliteIdsAndKeysetFromGroup = exports.visualizeGroupColors = exports.getGroupColor = void 0;
4
4
  /*---------------------------------------------------------------------------------------------
5
5
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
6
6
  * See LICENSE.md in the project root for license terms and full copyright notice.
7
7
  *--------------------------------------------------------------------------------------------*/
8
8
  const core_common_1 = require("@itwin/core-common");
9
- const itwinui_react_1 = require("@itwin/itwinui-react");
10
- const presentation_common_1 = require("@itwin/presentation-common");
11
9
  const viewerUtils_1 = require("../../common/viewerUtils");
12
10
  const GOLDEN_ANGLE_MULTIPLIER = 1.5; // Multiplier to spread colors more uniformly.
13
11
  const BASE_HUE_OFFSET = 60; // Initial hue offset to avoid certain colors e.g 0 offset would begin with red.
@@ -26,37 +24,6 @@ const getGroupColor = (index) => {
26
24
  return generateHSL(hue);
27
25
  };
28
26
  exports.getGroupColor = getGroupColor;
29
- const getHiliteIdsFromGroups = async (iModelConnection, groups, hilitedElementsQueryCache) => {
30
- const distinctQueries = new Set();
31
- const promises = [];
32
- for (const group of groups) {
33
- if (!distinctQueries.has(group.query)) {
34
- distinctQueries.add(group.query);
35
- promises.push((0, exports.getHiliteIdsAndKeysetFromGroup)(iModelConnection, group, hilitedElementsQueryCache));
36
- }
37
- }
38
- const results = await Promise.all(promises);
39
- const allIds = results.flatMap((result) => result.ids);
40
- return allIds;
41
- };
42
- exports.getHiliteIdsFromGroups = getHiliteIdsFromGroups;
43
- const hideGroups = async (iModelConnection, viewGroups, hilitedElementsQueryCache) => {
44
- const distinctQueries = new Set();
45
- const promises = [];
46
- for (const viewGroup of viewGroups) {
47
- if (!distinctQueries.has(viewGroup.query)) {
48
- distinctQueries.add(viewGroup.query);
49
- promises.push((0, exports.hideGroup)(iModelConnection, viewGroup, hilitedElementsQueryCache));
50
- }
51
- }
52
- await Promise.all(promises);
53
- };
54
- exports.hideGroups = hideGroups;
55
- const hideGroup = async (iModelConnection, viewGroup, hilitedElementsQueryCache) => {
56
- const result = await (0, exports.getHiliteIdsAndKeysetFromGroup)(iModelConnection, viewGroup, hilitedElementsQueryCache);
57
- (0, viewerUtils_1.hideElements)(result.ids);
58
- };
59
- exports.hideGroup = hideGroup;
60
27
  const processGroupVisualization = async (overlappedElementGroupPairs, hiddenGroupsIds, doEmphasizeElements, color, replace, setNumberOfVisualizedGroups) => {
61
28
  const hilitedIds = Array.from(overlappedElementGroupPairs.elementIds);
62
29
  (0, viewerUtils_1.overrideElements)(hilitedIds, color, core_common_1.FeatureOverrideType.ColorAndAlpha, replace);
@@ -69,12 +36,8 @@ const processGroupVisualization = async (overlappedElementGroupPairs, hiddenGrou
69
36
  }
70
37
  return hilitedIds;
71
38
  };
72
- const visualizeGroupColors = async (iModelConnection, groups, hiddenGroupsIds, hilitedElementsQueryCache, setNumberOfVisualizedGroups, setOverlappedElementsInfo, setGroupElementsInfo, setOverlappedElementGroupPairs, doEmphasizeElements = true) => {
39
+ const visualizeGroupColors = async (hiddenGroupsIds, groupsWithGroupedOverlaps, setNumberOfVisualizedGroups, doEmphasizeElements = true) => {
73
40
  (0, viewerUtils_1.clearEmphasizedOverriddenElements)();
74
- const { groupsWithGroupedOverlaps, overlappedElementsInfo, numberOfElementsInGroups } = await generateOverlappedGroups(groups, iModelConnection, hilitedElementsQueryCache);
75
- setOverlappedElementsInfo(overlappedElementsInfo);
76
- setGroupElementsInfo(numberOfElementsInGroups);
77
- setOverlappedElementGroupPairs(groupsWithGroupedOverlaps);
78
41
  const singleGroupPromises = groupsWithGroupedOverlaps
79
42
  .filter((group) => group.groupIds.size === 1)
80
43
  .map(async (group, index) => processGroupVisualization(group, hiddenGroupsIds, doEmphasizeElements, (0, exports.getGroupColor)(index), // color for single group
@@ -85,39 +48,20 @@ const visualizeGroupColors = async (iModelConnection, groups, hiddenGroupsIds, h
85
48
  .map(async (group) => processGroupVisualization(group, hiddenGroupsIds, doEmphasizeElements, generateHSL(0), // color for group of overlapped elements
86
49
  false, setNumberOfVisualizedGroups));
87
50
  (0, viewerUtils_1.clearHiddenElements)();
88
- hiddenGroupsIds.forEach(async (groupId) => {
89
- await (0, exports.hideGroupConsideringOverlaps)(groupsWithGroupedOverlaps, groupId, hiddenGroupsIds);
51
+ hiddenGroupsIds.forEach((groupId) => {
52
+ (0, exports.hideGroupConsideringOverlaps)(groupsWithGroupedOverlaps, groupId, hiddenGroupsIds);
90
53
  });
91
54
  const allPromises = [...singleGroupPromises, ...overlappedGroupPromises];
92
55
  const allIds = (await Promise.all(allPromises)).flat();
93
- await (0, viewerUtils_1.zoomToElements)(allIds);
56
+ return allIds;
94
57
  };
95
58
  exports.visualizeGroupColors = visualizeGroupColors;
96
- const getHiliteIdsAndKeysetFromGroup = async (iModelConnection, group, hilitedElementsQueryCache) => {
59
+ const getHiliteIdsAndKeysetFromGroup = async (iModelConnection, group) => {
97
60
  const query = group.query;
98
- if (hilitedElementsQueryCache.current.has(query)) {
99
- return hilitedElementsQueryCache.current.get(query) ?? ({ keySet: new presentation_common_1.KeySet(), ids: [] });
100
- }
101
- try {
102
- const queryRowCount = await iModelConnection.queryRowCount(query);
103
- if (queryRowCount === 0) {
104
- itwinui_react_1.toaster.warning(`${group.groupName}'s query is valid but produced no results.`);
105
- }
106
- const result = await (0, viewerUtils_1.getHiliteIds)(query, iModelConnection);
107
- hilitedElementsQueryCache.current.set(query, result);
108
- return result;
109
- }
110
- catch {
111
- itwinui_react_1.toaster.negative(`Query could not be resolved.`);
112
- return ({ keySet: new presentation_common_1.KeySet(), ids: [] });
113
- }
61
+ const result = await (0, viewerUtils_1.getHiliteIds)(query, iModelConnection);
62
+ return { group, result };
114
63
  };
115
64
  exports.getHiliteIdsAndKeysetFromGroup = getHiliteIdsAndKeysetFromGroup;
116
- const getHiliteIdsForGroup = async (iModelConnection, group, hilitedElementsQueryCache) => {
117
- const result = await (0, exports.getHiliteIdsAndKeysetFromGroup)(iModelConnection, group, hilitedElementsQueryCache);
118
- const hilitedIds = result.ids;
119
- return hilitedIds;
120
- };
121
65
  const getOverlappedElementsInfo = (overlappedElements) => {
122
66
  const overlappedElementsInfo = new Map();
123
67
  overlappedElements.forEach((elementGroup) => {
@@ -146,11 +90,7 @@ const mergeElementsByGroup = (elems) => {
146
90
  });
147
91
  return mergedList;
148
92
  };
149
- const generateOverlappedGroups = async (groups, iModelConnection, hilitedElementsQueryCache) => {
150
- const groupsElementIds = await Promise.all(groups.map(async (group) => ({
151
- groupId: group.id,
152
- elementIds: await getHiliteIdsForGroup(iModelConnection, group, hilitedElementsQueryCache),
153
- })));
93
+ const generateOverlappedGroups = (groupsElementIds) => {
154
94
  const elems = new Map();
155
95
  const groupElementCount = new Map();
156
96
  // Build the elems map for associations between elements and their groups.
@@ -172,7 +112,8 @@ const generateOverlappedGroups = async (groups, iModelConnection, hilitedElement
172
112
  const overlappedGroupsInformation = Array.from(mergedList.values()).filter((value) => value.groupIds.size > 1);
173
113
  return { groupsWithGroupedOverlaps: [...allGroups, ...overlappedGroupsInformation], overlappedElementsInfo: getOverlappedElementsInfo(overlappedGroupsInformation), numberOfElementsInGroups: groupElementCount };
174
114
  };
175
- const hideGroupConsideringOverlaps = async (overlappedElementGroupPairs, groupIdToHide, hiddenGroupsIds) => {
115
+ exports.generateOverlappedGroups = generateOverlappedGroups;
116
+ const hideGroupConsideringOverlaps = (overlappedElementGroupPairs, groupIdToHide, hiddenGroupsIds) => {
176
117
  const elementsToPotentiallyHide = new Set();
177
118
  // Check each entry in overlappedElementGroupPairs
178
119
  for (const entry of overlappedElementGroupPairs) {