@itwin/grouping-mapping-widget 0.22.0 → 0.23.1

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 (179) 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 +61 -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 +112 -66
  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 +20 -7
  41. package/lib/cjs/components/Groups/groupsHelpers.js +15 -71
  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 +6 -3
  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 +57 -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 +109 -67
  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 +20 -7
  155. package/lib/esm/components/Groups/groupsHelpers.js +13 -68
  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/Mappings/Import/SelectIModel.js +1 -2
  166. package/lib/esm/components/Mappings/Import/SelectIModel.js.map +1 -1
  167. package/lib/esm/components/Properties/CalculatedProperties/CalculatedPropertyActionWithVisuals.js +13 -22
  168. package/lib/esm/components/Properties/CalculatedProperties/CalculatedPropertyActionWithVisuals.js.map +1 -1
  169. package/lib/esm/components/Properties/GroupColorToggle.js +9 -10
  170. package/lib/esm/components/Properties/GroupColorToggle.js.map +1 -1
  171. package/lib/esm/components/Properties/GroupProperties/GroupPropertyAction.js +3 -3
  172. package/lib/esm/components/Properties/GroupProperties/GroupPropertyAction.js.map +1 -1
  173. package/lib/esm/components/context/GroupHilitedElementsContext.d.ts +9 -16
  174. package/lib/esm/components/context/GroupHilitedElementsContext.js +8 -9
  175. package/lib/esm/components/context/GroupHilitedElementsContext.js.map +1 -1
  176. package/lib/esm/test/PropertyFieldsHelpers.d.ts +4 -20
  177. package/lib/esm/test/test-utils.js +8 -0
  178. package/lib/esm/test/test-utils.js.map +1 -1
  179. package/package.json +27 -28
@@ -1,7 +1,7 @@
1
1
  import React, { useCallback, useEffect, useMemo, useState } from "react";
2
2
  import { useGroupHilitedElementsContext } from "../context/GroupHilitedElementsContext";
3
- import { getHiliteIdsFromGroups, hideGroupConsideringOverlaps, hideGroups, visualizeGroupColors, } from "./groupsHelpers";
4
- import { clearEmphasizedElements, clearEmphasizedOverriddenElements, clearHiddenElements, hideElements, } from "../../common/viewerUtils";
3
+ import { generateOverlappedGroups, hideGroupConsideringOverlaps, hideGroupIds, visualizeGroupColors, } from "./groupsHelpers";
4
+ import { clearEmphasizedElements, clearEmphasizedOverriddenElements, clearHiddenElements, hideElements, zoomToElements, } from "../../common/viewerUtils";
5
5
  import { Groups } from "./Groups";
6
6
  import { GroupColorLegend } from "./GroupColorLegend";
7
7
  import { GroupVisualizationActions } from "./GroupsVisualizationActions";
@@ -10,93 +10,127 @@ import "./GroupsVisualization.scss";
10
10
  import { useGroupingMappingApiConfig } from "../context/GroupingApiConfigContext";
11
11
  import { Alert, Icon, Text } from "@itwin/itwinui-react";
12
12
  import { SvgMore } from "@itwin/itwinui-icons-react";
13
- export const GroupsVisualization = ({ emphasizeElements = true, isNonEmphasizedSelectable = false, onClickGroupModify, onClickAddGroup, ...rest }) => {
13
+ import { useMappingClient } from "../context/MappingClientContext";
14
+ import { useMutation } from "@tanstack/react-query";
15
+ import { useIsMounted } from "../../common/hooks/useIsMounted";
16
+ import { useFetchGroups } from "./hooks/useFetchGroups";
17
+ import { useKeySetHiliteQueries } from "./hooks/useKeySetHiliteQueries";
18
+ export const GroupsVisualization = ({ emphasizeElements = true, isNonEmphasizedSelectable = false, onClickGroupModify, onClickAddGroup, mapping, ...rest }) => {
14
19
  const { iModelConnection } = useGroupingMappingApiConfig();
15
20
  if (!iModelConnection) {
16
21
  throw new Error("This component requires an active iModelConnection.");
17
22
  }
18
- const [isLoadingQuery, setLoadingQuery] = useState(false);
19
- const [isVisualizing, setIsVisualizing] = useState(false);
20
23
  const [isAlertClosed, setIsAlertClosed] = useState(true);
21
24
  const [isAlertExpanded, setIsAlertExpanded] = useState(false);
22
- const { hilitedElementsQueryCache, groups, hiddenGroupsIds, showGroupColor, isOverlappedColored, setHiddenGroupsIds, setNumberOfVisualizedGroups, setOverlappedElementsInfo, setGroupElementsInfo, overlappedElementsInfo, overlappedElementGroupPairs, setOverlappedElementGroupPairs, } = useGroupHilitedElementsContext();
23
- const getHiliteIdsFromGroupsWrapper = useCallback(async (groups) => iModelConnection
24
- ? getHiliteIdsFromGroups(iModelConnection, groups, hilitedElementsQueryCache)
25
- : [], [iModelConnection, hilitedElementsQueryCache]);
26
- const handleVisualizationStates = useCallback((start = true) => {
27
- setIsVisualizing(start);
28
- setLoadingQuery(start);
29
- if (!start) {
30
- setNumberOfVisualizedGroups(0);
31
- }
32
- }, [setNumberOfVisualizedGroups]);
33
- const triggerVisualization = useCallback(async () => {
34
- handleVisualizationStates(true);
35
- const groupsCopy = [...groups];
36
- await visualizeGroupColors(iModelConnection, groupsCopy, hiddenGroupsIds, hilitedElementsQueryCache, setNumberOfVisualizedGroups, setOverlappedElementsInfo, setGroupElementsInfo, setOverlappedElementGroupPairs, emphasizeElements);
37
- isNonEmphasizedSelectable && clearEmphasizedElements();
38
- handleVisualizationStates(false);
39
- }, [handleVisualizationStates, groups, iModelConnection, hiddenGroupsIds, hilitedElementsQueryCache, setNumberOfVisualizedGroups, setOverlappedElementsInfo, setGroupElementsInfo, setOverlappedElementGroupPairs, emphasizeElements, isNonEmphasizedSelectable]);
25
+ const { hiddenGroupsIds, showGroupColor, setShowGroupColor, isOverlappedColored, setHiddenGroupsIds, setNumberOfVisualizedGroups, isVisualizationsEnabled, setIsVisualizationsEnabled, overlappedElementsMetadata, setOverlappedElementsMetadata, } = useGroupHilitedElementsContext();
26
+ const { getAccessToken, iModelId } = useGroupingMappingApiConfig();
27
+ const mappingClient = useMappingClient();
28
+ const { data: groups, isFetched: isGroupsFetched, isFetching: isGroupsFetching } = useFetchGroups(iModelId, mapping.id, getAccessToken, mappingClient);
29
+ const isMounted = useIsMounted();
30
+ const [enableGroupQueries, setEnableGroupQueries] = useState(false);
31
+ const { groupQueries } = useKeySetHiliteQueries(groups ?? [], enableGroupQueries, iModelConnection);
32
+ const triggerVisualization = useCallback(async (groupsWithGroupedOverlaps) => visualizeGroupColors(hiddenGroupsIds, groupsWithGroupedOverlaps, setNumberOfVisualizedGroups, emphasizeElements), [emphasizeElements, hiddenGroupsIds, setNumberOfVisualizedGroups]);
33
+ const zoomToElementsMutation = useMutation({
34
+ mutationFn: zoomToElements,
35
+ onSuccess: () => {
36
+ if (isMounted()) {
37
+ isNonEmphasizedSelectable && clearEmphasizedElements();
38
+ }
39
+ },
40
+ });
41
+ const visualizationMutation = useMutation({
42
+ mutationFn: triggerVisualization,
43
+ onSuccess: (allIds) => {
44
+ if (isMounted()) {
45
+ zoomToElementsMutation.mutate(allIds);
46
+ }
47
+ },
48
+ });
49
+ const isGroupsQueriesReady = useMemo(() => groupQueries.every((query) => query.isFetched && query.data) && groupQueries.length > 0, [groupQueries]);
50
+ const groupQueriesProgressCount = useMemo(() => groupQueries.filter((query) => query.isFetched).length, [groupQueries]);
51
+ const isResolvingGroupQueries = useMemo(() => groupQueries.some((query) => query.isFetching), [groupQueries]);
52
+ const hiliteIds = useMemo(() => isGroupsQueriesReady
53
+ ? groupQueries.map((query) => ({
54
+ groupId: query.data.group.id,
55
+ elementIds: query.data.result.ids,
56
+ }))
57
+ : [], [groupQueries, isGroupsQueriesReady]);
58
+ const getHiliteIdsFromGroupsWrapper = useCallback((groups) => hiliteIds.filter((id) => groups.some((group) => group.id === id.groupId)).flatMap((id) => id.elementIds), [hiliteIds]);
40
59
  useEffect(() => {
41
- const visualize = async () => {
42
- if (isOverlappedColored === false) {
43
- if (groups.length > 0 && showGroupColor) {
44
- await triggerVisualization();
45
- }
46
- else {
47
- clearEmphasizedOverriddenElements();
48
- }
60
+ const processOverlappedGroups = () => {
61
+ const results = generateOverlappedGroups(hiliteIds);
62
+ const { groupsWithGroupedOverlaps, overlappedElementsInfo, numberOfElementsInGroups } = results;
63
+ setOverlappedElementsMetadata({
64
+ overlappedElementsInfo,
65
+ groupElementsInfo: numberOfElementsInGroups,
66
+ overlappedElementGroupPairs: groupsWithGroupedOverlaps,
67
+ });
68
+ if (showGroupColor) {
69
+ visualizationMutation.mutate(groupsWithGroupedOverlaps);
49
70
  }
71
+ else {
72
+ clearEmphasizedOverriddenElements();
73
+ }
74
+ clearHiddenElements();
75
+ hideGroupIds(hiddenGroupsIds, groupsWithGroupedOverlaps);
50
76
  };
51
- void visualize();
77
+ const shouldProcessOverlappedGroups = () => !isOverlappedColored && hiliteIds.length > 0 && !isGroupsFetching;
78
+ if (shouldProcessOverlappedGroups()) {
79
+ processOverlappedGroups();
80
+ }
52
81
  // We don't want to trigger full visualization when toggling individual groups.
53
82
  // eslint-disable-next-line react-hooks/exhaustive-deps
54
- }, [groups, showGroupColor, isOverlappedColored]);
55
- const hideAllGroups = useCallback(async () => {
56
- setLoadingQuery(true);
57
- await hideGroups(iModelConnection, groups, hilitedElementsQueryCache);
58
- setLoadingQuery(false);
59
- }, [groups, hilitedElementsQueryCache, iModelConnection]);
60
- const hideSingleGroupWrapper = useCallback(async (groupToHide) => {
61
- setLoadingQuery(true);
62
- await hideGroupConsideringOverlaps(overlappedElementGroupPairs, groupToHide.id, hiddenGroupsIds);
63
- setLoadingQuery(false);
64
- }, [overlappedElementGroupPairs, hiddenGroupsIds]);
65
- const showGroup = useCallback(async (viewGroup) => {
66
- setLoadingQuery(true);
83
+ }, [showGroupColor, isOverlappedColored, hiliteIds]);
84
+ useEffect(() => {
85
+ if (isVisualizationsEnabled) {
86
+ setEnableGroupQueries(true);
87
+ }
88
+ else {
89
+ setShowGroupColor(false);
90
+ clearHiddenElements();
91
+ setHiddenGroupsIds(new Set());
92
+ }
93
+ }, [isVisualizationsEnabled, setHiddenGroupsIds, setIsVisualizationsEnabled, setShowGroupColor]);
94
+ const hideAllGroups = useCallback(() => {
95
+ if (!groups)
96
+ return;
97
+ hideElements(getHiliteIdsFromGroupsWrapper(groups));
98
+ }, [getHiliteIdsFromGroupsWrapper, groups]);
99
+ const hideSingleGroupWrapper = useCallback((groupToHide) => {
100
+ hideGroupConsideringOverlaps(overlappedElementsMetadata.overlappedElementGroupPairs, groupToHide.id, hiddenGroupsIds);
101
+ }, [hiddenGroupsIds, overlappedElementsMetadata.overlappedElementGroupPairs]);
102
+ const showGroup = useCallback((viewGroup) => {
103
+ if (!groups)
104
+ return;
67
105
  clearHiddenElements();
68
106
  // hide group Ids filter
69
107
  const newHiddenGroups = groups.filter((g) => hiddenGroupsIds.has(g.id) && g.id !== viewGroup.id);
70
108
  // view group Ids filter
71
109
  const viewGroups = groups.filter((g) => !hiddenGroupsIds.has(g.id) || g.id === viewGroup.id);
72
- const viewIds = await getHiliteIdsFromGroupsWrapper(viewGroups);
73
- let hiddenIds = await getHiliteIdsFromGroupsWrapper(newHiddenGroups);
110
+ const viewIds = getHiliteIdsFromGroupsWrapper(viewGroups);
111
+ let hiddenIds = getHiliteIdsFromGroupsWrapper(newHiddenGroups);
74
112
  hiddenIds = hiddenIds.filter((id) => !viewIds.includes(id));
75
113
  hideElements(hiddenIds);
76
- setLoadingQuery(false);
77
114
  }, [groups, hiddenGroupsIds, getHiliteIdsFromGroupsWrapper]);
78
- const showAll = useCallback(async () => {
79
- setLoadingQuery(true);
115
+ const showAll = useCallback(() => {
80
116
  clearHiddenElements();
81
117
  setHiddenGroupsIds(new Set());
82
- await getHiliteIdsFromGroupsWrapper(groups);
83
- setLoadingQuery(false);
84
- }, [getHiliteIdsFromGroupsWrapper, groups, setHiddenGroupsIds]);
85
- const hideAll = useCallback(async () => {
86
- await hideAllGroups();
118
+ }, [setHiddenGroupsIds]);
119
+ const hideAll = useCallback(() => {
120
+ if (!groups)
121
+ return;
122
+ hideAllGroups();
87
123
  setHiddenGroupsIds(new Set(groups.map((g) => g.id)));
88
- await getHiliteIdsFromGroupsWrapper(groups);
89
124
  }, [
90
125
  setHiddenGroupsIds,
91
126
  groups,
92
127
  hideAllGroups,
93
- getHiliteIdsFromGroupsWrapper,
94
128
  ]);
95
- const onModify = useCallback(async (group, type) => {
129
+ const onModify = useCallback((group, type) => {
96
130
  if (!onClickGroupModify)
97
131
  return;
98
132
  if (group.id && hiddenGroupsIds.has(group.id)) {
99
- await showGroup(group);
133
+ showGroup(group);
100
134
  setHiddenGroupsIds(new Set([...hiddenGroupsIds].filter((id) => id !== group.id)));
101
135
  }
102
136
  clearEmphasizedElements();
@@ -108,11 +142,11 @@ export const GroupsVisualization = ({ emphasizeElements = true, isNonEmphasizedS
108
142
  onClickAddGroup(type);
109
143
  clearEmphasizedElements();
110
144
  }, [onClickAddGroup]);
111
- const groupActionButtonRenderers = useMemo(() => [
112
- (props) => showGroupColor ? React.createElement(GroupColorLegend, { ...props, groups: groups }) : [],
113
- (props) => (React.createElement(GroupsShowHideButtons, { ...props, isLoadingQuery: isLoadingQuery, showGroup: showGroup, hideGroup: hideSingleGroupWrapper })),
114
- ].flat(), [groups, hideSingleGroupWrapper, isLoadingQuery, showGroup, showGroupColor]);
115
- const overlappedAlert = useMemo(() => overlappedElementsInfo.size > 0 && isAlertClosed && showGroupColor && !isVisualizing ?
145
+ const groupActionButtonRenderers = useMemo(() => isVisualizationsEnabled ? [
146
+ (props) => showGroupColor ? React.createElement(GroupColorLegend, { ...props, groups: groups ?? [] }) : [],
147
+ (props) => (React.createElement(GroupsShowHideButtons, { ...props, isLoadingQuery: !(isVisualizationsEnabled && isGroupsFetched && isGroupsQueriesReady), showGroup: showGroup, hideGroup: hideSingleGroupWrapper })),
148
+ ].flat() : [], [groups, hideSingleGroupWrapper, isGroupsFetched, isGroupsQueriesReady, isVisualizationsEnabled, showGroup, showGroupColor]);
149
+ const overlappedAlert = useMemo(() => overlappedElementsMetadata.overlappedElementsInfo.size > 0 && isAlertClosed && showGroupColor ?
116
150
  React.createElement(Alert, { onClose: () => setIsAlertClosed(false), clickableText: isAlertExpanded ? "Less Details" : "More Details", clickableTextProps: { onClick: () => setIsAlertExpanded(!isAlertExpanded) } },
117
151
  "Overlapping elements are colored ",
118
152
  React.createElement(Text, { className: "gmw-red-text" }, "red"),
@@ -122,9 +156,17 @@ export const GroupsVisualization = ({ emphasizeElements = true, isNonEmphasizedS
122
156
  "To get overlap info in detail, click the ",
123
157
  React.createElement(Icon, null,
124
158
  React.createElement(SvgMore, null)),
125
- " button then \u201COverlap Info\u201D")) : undefined) : undefined, [isAlertClosed, isAlertExpanded, isVisualizing, overlappedElementsInfo.size, showGroupColor]);
159
+ " button then \u201COverlap Info\u201D")) : undefined) : undefined, [isAlertClosed, isAlertExpanded, overlappedElementsMetadata.overlappedElementsInfo.size, showGroupColor]);
160
+ const progressConfig = useMemo(() => isVisualizationsEnabled && isResolvingGroupQueries
161
+ ? {
162
+ hilitedGroupsProgress: {
163
+ currentHilitedGroups: groupQueriesProgressCount,
164
+ totalNumberOfGroups: groups?.length ?? 0,
165
+ },
166
+ }
167
+ : undefined, [groupQueriesProgressCount, groups, isResolvingGroupQueries, isVisualizationsEnabled]);
126
168
  return (React.createElement("div", { className: "gmw-groups-vis-container" },
127
- React.createElement(GroupVisualizationActions, { isLoadingQuery: isLoadingQuery, showAll: showAll, hideAll: hideAll }),
128
- React.createElement(Groups, { onClickGroupModify: onModify, onClickAddGroup: onAddGroup, actionButtonRenderers: groupActionButtonRenderers, ...rest, disableActions: isLoadingQuery, isVisualizing: isVisualizing, alert: overlappedAlert })));
169
+ React.createElement(GroupVisualizationActions, { disabled: !(isVisualizationsEnabled && isGroupsFetched && isGroupsQueriesReady), isVisualizationEnabled: isVisualizationsEnabled, onClickVisualizationButton: () => setIsVisualizationsEnabled((b) => !b), showAll: showAll, hideAll: hideAll }),
170
+ React.createElement(Groups, { onClickGroupModify: onModify, onClickAddGroup: onAddGroup, actionButtonRenderers: groupActionButtonRenderers, mapping: mapping, ...rest, progressConfig: progressConfig, alert: overlappedAlert })));
129
171
  };
130
172
  //# 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 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,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
@@ -2,19 +2,21 @@
2
2
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
- import { ButtonGroup, IconButton } from "@itwin/itwinui-react";
5
+ import { ButtonGroup, IconButton, ToggleSwitch } from "@itwin/itwinui-react";
6
6
  import React from "react";
7
7
  import { ToggleGroupVisibility } from "./ToggleGroupVisibility";
8
8
  import { SvgVisibilityHide, SvgVisibilityShow } from "@itwin/itwinui-icons-react";
9
9
  import "./GroupsVisualizationActions.scss";
10
10
  import { useGroupHilitedElementsContext } from "../context/GroupHilitedElementsContext";
11
- export const GroupVisualizationActions = ({ isLoadingQuery, showAll, hideAll, }) => {
11
+ export const GroupVisualizationActions = ({ disabled, isVisualizationEnabled, onClickVisualizationButton, showAll, hideAll, }) => {
12
12
  const { showGroupColor, setShowGroupColor, } = useGroupHilitedElementsContext();
13
13
  return (React.createElement(ButtonGroup, { className: "gmw-visual-buttons" },
14
- React.createElement(ToggleGroupVisibility, { isLoadingQuery: isLoadingQuery, showGroupColor: showGroupColor, setShowGroupColor: setShowGroupColor }),
15
- React.createElement(IconButton, { title: "Show All", onClick: showAll, disabled: isLoadingQuery, styleType: "borderless" },
16
- React.createElement(SvgVisibilityShow, null)),
17
- React.createElement(IconButton, { title: "Hide All", onClick: hideAll, disabled: isLoadingQuery, styleType: "borderless" },
18
- React.createElement(SvgVisibilityHide, null))));
14
+ React.createElement(ToggleSwitch, { label: "Visualization", labelPosition: "left", checked: isVisualizationEnabled, onChange: onClickVisualizationButton }),
15
+ React.createElement(ButtonGroup, null,
16
+ React.createElement(ToggleGroupVisibility, { isLoadingQuery: disabled, showGroupColor: showGroupColor, setShowGroupColor: setShowGroupColor }),
17
+ React.createElement(IconButton, { title: "Show All", onClick: showAll, disabled: disabled, styleType: "borderless" },
18
+ React.createElement(SvgVisibilityShow, null)),
19
+ React.createElement(IconButton, { title: "Hide All", onClick: hideAll, disabled: disabled, styleType: "borderless" },
20
+ React.createElement(SvgVisibilityHide, null)))));
19
21
  };
20
22
  //# 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,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,mCAAmC,CAAC;AAC3C,OAAO,EAAE,8BAA8B,EAAE,MAAM,wCAAwC,CAAC;AAQxF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,EACxC,cAAc,EACd,OAAO,EACP,OAAO,GACwB,EAAE,EAAE;IACnC,MAAM,EACJ,cAAc,EACd,iBAAiB,GAClB,GAAG,8BAA8B,EAAE,CAAC;IAErC,OAAO,CACL,oBAAC,WAAW,IAAC,SAAS,EAAC,oBAAoB;QACzC,oBAAC,qBAAqB,IACpB,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,cAAc,EAC9B,iBAAiB,EAAE,iBAAiB,GACpC;QACF,oBAAC,UAAU,IACT,KAAK,EAAC,UAAU,EAChB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAC,YAAY;YAEtB,oBAAC,iBAAiB,OAAG,CACV;QACb,oBAAC,UAAU,IACT,KAAK,EAAC,UAAU,EAChB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAC,YAAY;YAEtB,oBAAC,iBAAiB,OAAG,CACV,CACD,CACf,CAAC;AAEJ,CAAC,CAAC","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,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,mCAAmC,CAAC;AAC3C,OAAO,EAAE,8BAA8B,EAAE,MAAM,wCAAwC,CAAC;AAUxF,MAAM,CAAC,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,8BAA8B,EAAE,CAAC;IAErC,OAAO,CACL,oBAAC,WAAW,IAAC,SAAS,EAAC,oBAAoB;QACzC,oBAAC,YAAY,IACX,KAAK,EAAC,eAAe,EACrB,aAAa,EAAC,MAAM,EACpB,OAAO,EAAE,sBAAsB,EAC/B,QAAQ,EAAE,0BAA0B,GACpC;QACF,oBAAC,WAAW;YACV,oBAAC,qBAAqB,IACpB,cAAc,EAAE,QAAQ,EACxB,cAAc,EAAE,cAAc,EAC9B,iBAAiB,EAAE,iBAAiB,GACpC;YACF,oBAAC,UAAU,IACT,KAAK,EAAC,UAAU,EAChB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAC,YAAY;gBAEtB,oBAAC,iBAAiB,OAAG,CACV;YACb,oBAAC,UAAU,IACT,KAAK,EAAC,UAAU,EAChB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAC,YAAY;gBAEtB,oBAAC,iBAAiB,OAAG,CACV,CACD,CACD,CAChB,CAAC;AAEJ,CAAC,CAAC","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,24 @@
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 hideGroupIds: (hiddenGroupIds: Set<string>, groupsWithGroupedOverlaps: OverlappedElementGroupPairs[]) => void;
10
+ export declare const visualizeGroupColors: (hiddenGroupsIds: Set<string>, groupsWithGroupedOverlaps: OverlappedElementGroupPairs[], setNumberOfVisualizedGroups: (numberOfVisualizedGroups: number | ((numberOfVisualizedGroups: number) => number)) => void, doEmphasizeElements?: boolean) => Promise<string[]>;
11
+ export declare const getHiliteIdsAndKeysetFromGroup: (iModelConnection: IModelConnection, group: Group) => Promise<{
12
+ group: Group;
13
+ result: {
14
+ keySet: import("@itwin/presentation-common").KeySet;
15
+ ids: string[];
16
+ };
17
+ }>;
18
+ export declare const generateOverlappedGroups: (groupsElementIds: GroupsElementIds) => {
19
+ groupsWithGroupedOverlaps: OverlappedElementGroupPairs[];
20
+ overlappedElementsInfo: Map<string, OverlappedInfo[]>;
21
+ numberOfElementsInGroups: Map<string, number>;
22
+ };
23
+ export declare const hideGroupConsideringOverlaps: (overlappedElementGroupPairs: OverlappedElementGroupPairs[], groupIdToHide: string, hiddenGroupsIds: Set<string>) => void;
11
24
  //# sourceMappingURL=groupsHelpers.d.ts.map
@@ -3,9 +3,7 @@
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  import { FeatureOverrideType } from "@itwin/core-common";
6
- import { toaster } from "@itwin/itwinui-react";
7
- import { KeySet } from "@itwin/presentation-common";
8
- import { clearEmphasizedOverriddenElements, clearHiddenElements, emphasizeElements, getHiliteIds, hideElements, overrideElements, zoomToElements } from "../../common/viewerUtils";
6
+ import { clearEmphasizedOverriddenElements, clearHiddenElements, emphasizeElements, getHiliteIds, hideElements, overrideElements } from "../../common/viewerUtils";
9
7
  const GOLDEN_ANGLE_MULTIPLIER = 1.5; // Multiplier to spread colors more uniformly.
10
8
  const BASE_HUE_OFFSET = 60; // Initial hue offset to avoid certain colors e.g 0 offset would begin with red.
11
9
  const HUE_ADJUSTMENT_STEP = 15; // Step to adjust the hue to avoid the red spectrum.
@@ -22,34 +20,6 @@ export const getGroupColor = (index) => {
22
20
  }
23
21
  return generateHSL(hue);
24
22
  };
25
- export const getHiliteIdsFromGroups = async (iModelConnection, groups, hilitedElementsQueryCache) => {
26
- const distinctQueries = new Set();
27
- const promises = [];
28
- for (const group of groups) {
29
- if (!distinctQueries.has(group.query)) {
30
- distinctQueries.add(group.query);
31
- promises.push(getHiliteIdsAndKeysetFromGroup(iModelConnection, group, hilitedElementsQueryCache));
32
- }
33
- }
34
- const results = await Promise.all(promises);
35
- const allIds = results.flatMap((result) => result.ids);
36
- return allIds;
37
- };
38
- export const hideGroups = async (iModelConnection, viewGroups, hilitedElementsQueryCache) => {
39
- const distinctQueries = new Set();
40
- const promises = [];
41
- for (const viewGroup of viewGroups) {
42
- if (!distinctQueries.has(viewGroup.query)) {
43
- distinctQueries.add(viewGroup.query);
44
- promises.push(hideGroup(iModelConnection, viewGroup, hilitedElementsQueryCache));
45
- }
46
- }
47
- await Promise.all(promises);
48
- };
49
- export const hideGroup = async (iModelConnection, viewGroup, hilitedElementsQueryCache) => {
50
- const result = await getHiliteIdsAndKeysetFromGroup(iModelConnection, viewGroup, hilitedElementsQueryCache);
51
- hideElements(result.ids);
52
- };
53
23
  const processGroupVisualization = async (overlappedElementGroupPairs, hiddenGroupsIds, doEmphasizeElements, color, replace, setNumberOfVisualizedGroups) => {
54
24
  const hilitedIds = Array.from(overlappedElementGroupPairs.elementIds);
55
25
  overrideElements(hilitedIds, color, FeatureOverrideType.ColorAndAlpha, replace);
@@ -62,12 +32,13 @@ const processGroupVisualization = async (overlappedElementGroupPairs, hiddenGrou
62
32
  }
63
33
  return hilitedIds;
64
34
  };
65
- export const visualizeGroupColors = async (iModelConnection, groups, hiddenGroupsIds, hilitedElementsQueryCache, setNumberOfVisualizedGroups, setOverlappedElementsInfo, setGroupElementsInfo, setOverlappedElementGroupPairs, doEmphasizeElements = true) => {
35
+ export const hideGroupIds = (hiddenGroupIds, groupsWithGroupedOverlaps) => {
36
+ hiddenGroupIds.forEach((groupId) => {
37
+ hideGroupConsideringOverlaps(groupsWithGroupedOverlaps, groupId, hiddenGroupIds);
38
+ });
39
+ };
40
+ export const visualizeGroupColors = async (hiddenGroupsIds, groupsWithGroupedOverlaps, setNumberOfVisualizedGroups, doEmphasizeElements = true) => {
66
41
  clearEmphasizedOverriddenElements();
67
- const { groupsWithGroupedOverlaps, overlappedElementsInfo, numberOfElementsInGroups } = await generateOverlappedGroups(groups, iModelConnection, hilitedElementsQueryCache);
68
- setOverlappedElementsInfo(overlappedElementsInfo);
69
- setGroupElementsInfo(numberOfElementsInGroups);
70
- setOverlappedElementGroupPairs(groupsWithGroupedOverlaps);
71
42
  const singleGroupPromises = groupsWithGroupedOverlaps
72
43
  .filter((group) => group.groupIds.size === 1)
73
44
  .map(async (group, index) => processGroupVisualization(group, hiddenGroupsIds, doEmphasizeElements, getGroupColor(index), // color for single group
@@ -78,36 +49,14 @@ export const visualizeGroupColors = async (iModelConnection, groups, hiddenGroup
78
49
  .map(async (group) => processGroupVisualization(group, hiddenGroupsIds, doEmphasizeElements, generateHSL(0), // color for group of overlapped elements
79
50
  false, setNumberOfVisualizedGroups));
80
51
  clearHiddenElements();
81
- hiddenGroupsIds.forEach(async (groupId) => {
82
- await hideGroupConsideringOverlaps(groupsWithGroupedOverlaps, groupId, hiddenGroupsIds);
83
- });
84
52
  const allPromises = [...singleGroupPromises, ...overlappedGroupPromises];
85
53
  const allIds = (await Promise.all(allPromises)).flat();
86
- await zoomToElements(allIds);
54
+ return allIds;
87
55
  };
88
- export const getHiliteIdsAndKeysetFromGroup = async (iModelConnection, group, hilitedElementsQueryCache) => {
56
+ export const getHiliteIdsAndKeysetFromGroup = async (iModelConnection, group) => {
89
57
  const query = group.query;
90
- if (hilitedElementsQueryCache.current.has(query)) {
91
- return hilitedElementsQueryCache.current.get(query) ?? ({ keySet: new KeySet(), ids: [] });
92
- }
93
- try {
94
- const queryRowCount = await iModelConnection.queryRowCount(query);
95
- if (queryRowCount === 0) {
96
- toaster.warning(`${group.groupName}'s query is valid but produced no results.`);
97
- }
98
- const result = await getHiliteIds(query, iModelConnection);
99
- hilitedElementsQueryCache.current.set(query, result);
100
- return result;
101
- }
102
- catch {
103
- toaster.negative(`Query could not be resolved.`);
104
- return ({ keySet: new KeySet(), ids: [] });
105
- }
106
- };
107
- const getHiliteIdsForGroup = async (iModelConnection, group, hilitedElementsQueryCache) => {
108
- const result = await getHiliteIdsAndKeysetFromGroup(iModelConnection, group, hilitedElementsQueryCache);
109
- const hilitedIds = result.ids;
110
- return hilitedIds;
58
+ const result = await getHiliteIds(query, iModelConnection);
59
+ return { group, result };
111
60
  };
112
61
  const getOverlappedElementsInfo = (overlappedElements) => {
113
62
  const overlappedElementsInfo = new Map();
@@ -137,11 +86,7 @@ const mergeElementsByGroup = (elems) => {
137
86
  });
138
87
  return mergedList;
139
88
  };
140
- const generateOverlappedGroups = async (groups, iModelConnection, hilitedElementsQueryCache) => {
141
- const groupsElementIds = await Promise.all(groups.map(async (group) => ({
142
- groupId: group.id,
143
- elementIds: await getHiliteIdsForGroup(iModelConnection, group, hilitedElementsQueryCache),
144
- })));
89
+ export const generateOverlappedGroups = (groupsElementIds) => {
145
90
  const elems = new Map();
146
91
  const groupElementCount = new Map();
147
92
  // Build the elems map for associations between elements and their groups.
@@ -163,7 +108,7 @@ const generateOverlappedGroups = async (groups, iModelConnection, hilitedElement
163
108
  const overlappedGroupsInformation = Array.from(mergedList.values()).filter((value) => value.groupIds.size > 1);
164
109
  return { groupsWithGroupedOverlaps: [...allGroups, ...overlappedGroupsInformation], overlappedElementsInfo: getOverlappedElementsInfo(overlappedGroupsInformation), numberOfElementsInGroups: groupElementCount };
165
110
  };
166
- export const hideGroupConsideringOverlaps = async (overlappedElementGroupPairs, groupIdToHide, hiddenGroupsIds) => {
111
+ export const hideGroupConsideringOverlaps = (overlappedElementGroupPairs, groupIdToHide, hiddenGroupsIds) => {
167
112
  const elementsToPotentiallyHide = new Set();
168
113
  // Check each entry in overlappedElementGroupPairs
169
114
  for (const entry of overlappedElementGroupPairs) {