@itwin/grouping-mapping-widget 0.13.0 → 0.15.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 (199) hide show
  1. package/lib/cjs/grouping-mapping-widget.d.ts +3 -0
  2. package/lib/cjs/grouping-mapping-widget.js +7 -1
  3. package/lib/cjs/grouping-mapping-widget.js.map +1 -1
  4. package/lib/cjs/test/GroupingMappingCustomUI.test.js +2 -2
  5. package/lib/cjs/test/GroupingMappingCustomUI.test.js.map +1 -1
  6. package/lib/cjs/widget/components/CalculatedPropertyAction.js +7 -119
  7. package/lib/cjs/widget/components/CalculatedPropertyAction.js.map +1 -1
  8. package/lib/cjs/widget/components/CalculatedPropertyAction.scss +1 -12
  9. package/lib/cjs/widget/components/CalculatedPropertyActionWithVisuals.d.ts +12 -0
  10. package/lib/cjs/widget/components/CalculatedPropertyActionWithVisuals.js +152 -0
  11. package/lib/cjs/widget/components/CalculatedPropertyActionWithVisuals.js.map +1 -0
  12. package/lib/cjs/widget/components/CalculatedPropertyActionWithVisuals.scss +27 -0
  13. package/lib/cjs/widget/components/GroupAction.d.ts +1 -0
  14. package/lib/cjs/widget/components/GroupAction.js +37 -71
  15. package/lib/cjs/widget/components/GroupAction.js.map +1 -1
  16. package/lib/cjs/widget/components/GroupColorLegend.d.ts +10 -0
  17. package/lib/cjs/widget/components/GroupColorLegend.js +20 -0
  18. package/lib/cjs/widget/components/GroupColorLegend.js.map +1 -0
  19. package/lib/cjs/widget/components/GroupColorLegend.scss +9 -0
  20. package/lib/cjs/widget/components/GroupColorToggle.d.ts +9 -0
  21. package/lib/cjs/widget/components/GroupColorToggle.js +69 -0
  22. package/lib/cjs/widget/components/GroupColorToggle.js.map +1 -0
  23. package/lib/cjs/widget/components/GroupItem.d.ts +12 -0
  24. package/lib/cjs/widget/components/GroupItem.js +19 -0
  25. package/lib/cjs/widget/components/GroupItem.js.map +1 -0
  26. package/lib/cjs/widget/components/GroupMenuActions.d.ts +13 -0
  27. package/lib/cjs/widget/components/GroupMenuActions.js +68 -0
  28. package/lib/cjs/widget/components/GroupMenuActions.js.map +1 -0
  29. package/lib/cjs/widget/components/GroupMenuActions.scss +13 -0
  30. package/lib/cjs/widget/components/GroupPropertyAction.js +1 -3
  31. package/lib/cjs/widget/components/GroupPropertyAction.js.map +1 -1
  32. package/lib/cjs/widget/components/Grouping.d.ts +9 -5
  33. package/lib/cjs/widget/components/Grouping.js +14 -142
  34. package/lib/cjs/widget/components/Grouping.js.map +1 -1
  35. package/lib/cjs/widget/components/Grouping.scss +0 -16
  36. package/lib/cjs/widget/components/GroupingMapping.js +3 -5
  37. package/lib/cjs/widget/components/GroupingMapping.js.map +1 -1
  38. package/lib/cjs/widget/components/GroupingMappingContent.js +1 -1
  39. package/lib/cjs/widget/components/GroupingMappingContent.js.map +1 -1
  40. package/lib/cjs/widget/components/GroupingMappingContext.d.ts +5 -0
  41. package/lib/cjs/widget/components/GroupingMappingContext.js +6 -3
  42. package/lib/cjs/widget/components/GroupingMappingContext.js.map +1 -1
  43. package/lib/cjs/widget/components/GroupingMappingRouter.js +21 -22
  44. package/lib/cjs/widget/components/GroupingMappingRouter.js.map +1 -1
  45. package/lib/cjs/widget/components/GroupsAddButton.d.ts +3 -2
  46. package/lib/cjs/widget/components/GroupsAddButton.js +4 -3
  47. package/lib/cjs/widget/components/GroupsAddButton.js.map +1 -1
  48. package/lib/cjs/widget/components/GroupsAddButton.scss +2 -0
  49. package/lib/cjs/widget/components/GroupsShowHideButtons.d.ts +11 -0
  50. package/lib/cjs/widget/components/GroupsShowHideButtons.js +45 -0
  51. package/lib/cjs/widget/components/GroupsShowHideButtons.js.map +1 -0
  52. package/lib/cjs/widget/components/GroupsVisualization.d.ts +9 -0
  53. package/lib/cjs/widget/components/GroupsVisualization.js +133 -0
  54. package/lib/cjs/widget/components/GroupsVisualization.js.map +1 -0
  55. package/lib/cjs/widget/components/GroupsVisualization.scss +12 -0
  56. package/lib/cjs/widget/components/GroupsVisualizationActions.d.ts +10 -0
  57. package/lib/cjs/widget/components/GroupsVisualizationActions.js +27 -0
  58. package/lib/cjs/widget/components/GroupsVisualizationActions.js.map +1 -0
  59. package/lib/cjs/widget/components/GroupsVisualizationActions.scss +9 -0
  60. package/lib/cjs/widget/components/Mapping.js +1 -1
  61. package/lib/cjs/widget/components/Mapping.js.map +1 -1
  62. package/lib/cjs/widget/components/PropertyMenu.d.ts +1 -2
  63. package/lib/cjs/widget/components/PropertyMenu.js +6 -49
  64. package/lib/cjs/widget/components/PropertyMenu.js.map +1 -1
  65. package/lib/cjs/widget/components/PropertyMenu.scss +2 -17
  66. package/lib/cjs/widget/components/PropertyMenuWithVisualization.d.ts +8 -0
  67. package/lib/cjs/widget/components/PropertyMenuWithVisualization.js +45 -0
  68. package/lib/cjs/widget/components/PropertyMenuWithVisualization.js.map +1 -0
  69. package/lib/cjs/widget/components/PropertyMenuWithVisualization.scss +16 -0
  70. package/lib/cjs/widget/components/QueryBuilderCustomUI.d.ts +3 -1
  71. package/lib/cjs/widget/components/QueryBuilderCustomUI.js +2 -1
  72. package/lib/cjs/widget/components/QueryBuilderCustomUI.js.map +1 -1
  73. package/lib/cjs/widget/components/QueryBuilderStep.d.ts +2 -1
  74. package/lib/cjs/widget/components/QueryBuilderStep.js +2 -1
  75. package/lib/cjs/widget/components/QueryBuilderStep.js.map +1 -1
  76. package/lib/cjs/widget/components/SharedCalculatedPropertyForms.d.ts +16 -0
  77. package/lib/cjs/widget/components/SharedCalculatedPropertyForms.js +62 -0
  78. package/lib/cjs/widget/components/SharedCalculatedPropertyForms.js.map +1 -0
  79. package/lib/cjs/widget/components/context/GroupHilitedElementsContext.d.ts +2 -2
  80. package/lib/cjs/widget/components/context/GroupHilitedElementsContext.js +1 -1
  81. package/lib/cjs/widget/components/context/GroupHilitedElementsContext.js.map +1 -1
  82. package/lib/cjs/widget/components/context/GroupingApiConfigContext.d.ts +2 -0
  83. package/lib/cjs/widget/components/context/GroupingApiConfigContext.js +1 -0
  84. package/lib/cjs/widget/components/context/GroupingApiConfigContext.js.map +1 -1
  85. package/lib/cjs/widget/components/customUI/GroupQueryBuilderCustomUI.js +2 -2
  86. package/lib/cjs/widget/components/customUI/GroupQueryBuilderCustomUI.js.map +1 -1
  87. package/lib/cjs/widget/components/customUI/GroupingMappingCustomUI.d.ts +4 -0
  88. package/lib/cjs/widget/components/customUI/GroupingMappingCustomUI.js.map +1 -1
  89. package/lib/cjs/widget/components/customUI/ManualGroupingCustomUI.d.ts +1 -1
  90. package/lib/cjs/widget/components/customUI/ManualGroupingCustomUI.js +2 -2
  91. package/lib/cjs/widget/components/customUI/ManualGroupingCustomUI.js.map +1 -1
  92. package/lib/cjs/widget/components/customUI/ManualGroupingCustomUI.scss +0 -1
  93. package/lib/cjs/widget/components/customUI/SearchGroupingCustomUI.scss +0 -1
  94. package/lib/cjs/widget/components/groupsHelpers.d.ts +1 -1
  95. package/lib/cjs/widget/components/groupsHelpers.js +11 -14
  96. package/lib/cjs/widget/components/groupsHelpers.js.map +1 -1
  97. package/lib/cjs/widget/hooks/useVisualization.d.ts +11 -0
  98. package/lib/cjs/widget/hooks/useVisualization.js +68 -0
  99. package/lib/cjs/widget/hooks/useVisualization.js.map +1 -0
  100. package/lib/esm/grouping-mapping-widget.d.ts +3 -0
  101. package/lib/esm/grouping-mapping-widget.js +3 -0
  102. package/lib/esm/grouping-mapping-widget.js.map +1 -1
  103. package/lib/esm/test/GroupingMappingCustomUI.test.js +2 -2
  104. package/lib/esm/test/GroupingMappingCustomUI.test.js.map +1 -1
  105. package/lib/esm/widget/components/CalculatedPropertyAction.js +9 -121
  106. package/lib/esm/widget/components/CalculatedPropertyAction.js.map +1 -1
  107. package/lib/esm/widget/components/CalculatedPropertyAction.scss +1 -12
  108. package/lib/esm/widget/components/CalculatedPropertyActionWithVisuals.d.ts +12 -0
  109. package/lib/esm/widget/components/CalculatedPropertyActionWithVisuals.js +126 -0
  110. package/lib/esm/widget/components/CalculatedPropertyActionWithVisuals.js.map +1 -0
  111. package/lib/esm/widget/components/CalculatedPropertyActionWithVisuals.scss +27 -0
  112. package/lib/esm/widget/components/GroupAction.d.ts +1 -0
  113. package/lib/esm/widget/components/GroupAction.js +37 -71
  114. package/lib/esm/widget/components/GroupAction.js.map +1 -1
  115. package/lib/esm/widget/components/GroupColorLegend.d.ts +10 -0
  116. package/lib/esm/widget/components/GroupColorLegend.js +13 -0
  117. package/lib/esm/widget/components/GroupColorLegend.js.map +1 -0
  118. package/lib/esm/widget/components/GroupColorLegend.scss +9 -0
  119. package/lib/esm/widget/components/GroupColorToggle.d.ts +9 -0
  120. package/lib/esm/widget/components/GroupColorToggle.js +46 -0
  121. package/lib/esm/widget/components/GroupColorToggle.js.map +1 -0
  122. package/lib/esm/widget/components/GroupItem.d.ts +12 -0
  123. package/lib/esm/widget/components/GroupItem.js +12 -0
  124. package/lib/esm/widget/components/GroupItem.js.map +1 -0
  125. package/lib/esm/widget/components/GroupMenuActions.d.ts +13 -0
  126. package/lib/esm/widget/components/GroupMenuActions.js +45 -0
  127. package/lib/esm/widget/components/GroupMenuActions.js.map +1 -0
  128. package/lib/esm/widget/components/GroupMenuActions.scss +13 -0
  129. package/lib/esm/widget/components/GroupPropertyAction.js +1 -3
  130. package/lib/esm/widget/components/GroupPropertyAction.js.map +1 -1
  131. package/lib/esm/widget/components/Grouping.d.ts +9 -5
  132. package/lib/esm/widget/components/Grouping.js +17 -145
  133. package/lib/esm/widget/components/Grouping.js.map +1 -1
  134. package/lib/esm/widget/components/Grouping.scss +0 -16
  135. package/lib/esm/widget/components/GroupingMapping.js +3 -5
  136. package/lib/esm/widget/components/GroupingMapping.js.map +1 -1
  137. package/lib/esm/widget/components/GroupingMappingContent.js +1 -1
  138. package/lib/esm/widget/components/GroupingMappingContent.js.map +1 -1
  139. package/lib/esm/widget/components/GroupingMappingContext.d.ts +5 -0
  140. package/lib/esm/widget/components/GroupingMappingContext.js +6 -3
  141. package/lib/esm/widget/components/GroupingMappingContext.js.map +1 -1
  142. package/lib/esm/widget/components/GroupingMappingRouter.js +21 -22
  143. package/lib/esm/widget/components/GroupingMappingRouter.js.map +1 -1
  144. package/lib/esm/widget/components/GroupsAddButton.d.ts +3 -2
  145. package/lib/esm/widget/components/GroupsAddButton.js +5 -4
  146. package/lib/esm/widget/components/GroupsAddButton.js.map +1 -1
  147. package/lib/esm/widget/components/GroupsAddButton.scss +2 -0
  148. package/lib/esm/widget/components/GroupsShowHideButtons.d.ts +11 -0
  149. package/lib/esm/widget/components/GroupsShowHideButtons.js +22 -0
  150. package/lib/esm/widget/components/GroupsShowHideButtons.js.map +1 -0
  151. package/lib/esm/widget/components/GroupsVisualization.d.ts +9 -0
  152. package/lib/esm/widget/components/GroupsVisualization.js +110 -0
  153. package/lib/esm/widget/components/GroupsVisualization.js.map +1 -0
  154. package/lib/esm/widget/components/GroupsVisualization.scss +12 -0
  155. package/lib/esm/widget/components/GroupsVisualizationActions.d.ts +10 -0
  156. package/lib/esm/widget/components/GroupsVisualizationActions.js +20 -0
  157. package/lib/esm/widget/components/GroupsVisualizationActions.js.map +1 -0
  158. package/lib/esm/widget/components/GroupsVisualizationActions.scss +9 -0
  159. package/lib/esm/widget/components/Mapping.js +1 -1
  160. package/lib/esm/widget/components/Mapping.js.map +1 -1
  161. package/lib/esm/widget/components/PropertyMenu.d.ts +1 -2
  162. package/lib/esm/widget/components/PropertyMenu.js +7 -50
  163. package/lib/esm/widget/components/PropertyMenu.js.map +1 -1
  164. package/lib/esm/widget/components/PropertyMenu.scss +2 -17
  165. package/lib/esm/widget/components/PropertyMenuWithVisualization.d.ts +8 -0
  166. package/lib/esm/widget/components/PropertyMenuWithVisualization.js +22 -0
  167. package/lib/esm/widget/components/PropertyMenuWithVisualization.js.map +1 -0
  168. package/lib/esm/widget/components/PropertyMenuWithVisualization.scss +16 -0
  169. package/lib/esm/widget/components/QueryBuilderCustomUI.d.ts +3 -1
  170. package/lib/esm/widget/components/QueryBuilderCustomUI.js +2 -1
  171. package/lib/esm/widget/components/QueryBuilderCustomUI.js.map +1 -1
  172. package/lib/esm/widget/components/QueryBuilderStep.d.ts +2 -1
  173. package/lib/esm/widget/components/QueryBuilderStep.js +3 -2
  174. package/lib/esm/widget/components/QueryBuilderStep.js.map +1 -1
  175. package/lib/esm/widget/components/SharedCalculatedPropertyForms.d.ts +16 -0
  176. package/lib/esm/widget/components/SharedCalculatedPropertyForms.js +39 -0
  177. package/lib/esm/widget/components/SharedCalculatedPropertyForms.js.map +1 -0
  178. package/lib/esm/widget/components/context/GroupHilitedElementsContext.d.ts +2 -2
  179. package/lib/esm/widget/components/context/GroupHilitedElementsContext.js +1 -1
  180. package/lib/esm/widget/components/context/GroupHilitedElementsContext.js.map +1 -1
  181. package/lib/esm/widget/components/context/GroupingApiConfigContext.d.ts +2 -0
  182. package/lib/esm/widget/components/context/GroupingApiConfigContext.js +1 -0
  183. package/lib/esm/widget/components/context/GroupingApiConfigContext.js.map +1 -1
  184. package/lib/esm/widget/components/customUI/GroupQueryBuilderCustomUI.js +2 -2
  185. package/lib/esm/widget/components/customUI/GroupQueryBuilderCustomUI.js.map +1 -1
  186. package/lib/esm/widget/components/customUI/GroupingMappingCustomUI.d.ts +4 -0
  187. package/lib/esm/widget/components/customUI/GroupingMappingCustomUI.js.map +1 -1
  188. package/lib/esm/widget/components/customUI/ManualGroupingCustomUI.d.ts +1 -1
  189. package/lib/esm/widget/components/customUI/ManualGroupingCustomUI.js +2 -2
  190. package/lib/esm/widget/components/customUI/ManualGroupingCustomUI.js.map +1 -1
  191. package/lib/esm/widget/components/customUI/ManualGroupingCustomUI.scss +0 -1
  192. package/lib/esm/widget/components/customUI/SearchGroupingCustomUI.scss +0 -1
  193. package/lib/esm/widget/components/groupsHelpers.d.ts +1 -1
  194. package/lib/esm/widget/components/groupsHelpers.js +11 -14
  195. package/lib/esm/widget/components/groupsHelpers.js.map +1 -1
  196. package/lib/esm/widget/hooks/useVisualization.d.ts +11 -0
  197. package/lib/esm/widget/hooks/useVisualization.js +64 -0
  198. package/lib/esm/widget/hooks/useVisualization.js.map +1 -0
  199. package/package.json +1 -1
@@ -1,21 +1,17 @@
1
- import { Presentation } from "@itwin/presentation-frontend";
2
- import { useActiveIModelConnection } from "@itwin/appui-react";
3
1
  import { Button, toaster, } from "@itwin/itwinui-react";
4
2
  import React, { useCallback, useEffect, useMemo, useState } from "react";
5
3
  import { handleError, LoadingSpinner, } from "./utils";
6
4
  import "./GroupAction.scss";
7
5
  import useValidator from "../hooks/useValidator";
8
- import { clearEmphasizedElements, clearOverriddenElements, transparentOverriddenElements, visualizeElementsByQuery, zoomToElements, } from "./viewerUtils";
9
6
  import { useGroupingMappingApiConfig } from "./context/GroupingApiConfigContext";
10
7
  import { useMappingClient } from "./context/MappingClientContext";
11
8
  import { useGroupingMappingCustomUI } from "./context/GroupingMappingCustomUIContext";
12
9
  import { GroupingMappingCustomUIType } from "./customUI/GroupingMappingCustomUI";
13
- import { useGroupHilitedElementsContext } from "./context/GroupHilitedElementsContext";
14
- import { visualizeGroupColors } from "./groupsHelpers";
15
10
  import { QueryBuilderStep } from "./QueryBuilderStep";
16
11
  import { GroupDetailsStep } from "./GroupDetailsStep";
17
12
  import { QueryBuilderActionPanel } from "./QueryBuilderActionPanel";
18
13
  import { GroupDetailsActionPanel } from "./GroupDetailsActionPanel";
14
+ import { useVisualization } from "../hooks/useVisualization";
19
15
  const defaultDisplayStrings = {
20
16
  groupDetails: "Group Details",
21
17
  groupBy: "Group By",
@@ -27,9 +23,10 @@ var GroupActionStep;
27
23
  })(GroupActionStep || (GroupActionStep = {}));
28
24
  export const GroupAction = (props) => {
29
25
  var _a, _b, _c, _d;
30
- const iModelConnection = useActiveIModelConnection();
31
- const { showGroupColor, groups, hiddenGroupsIds, hilitedElementsQueryCache } = useGroupHilitedElementsContext();
32
- const { getAccessToken, iModelId } = useGroupingMappingApiConfig();
26
+ const { getAccessToken, iModelId, iModelConnection } = useGroupingMappingApiConfig();
27
+ if (!iModelConnection) {
28
+ throw new Error("This component requires an active iModelConnection.");
29
+ }
33
30
  const mappingClient = useMappingClient();
34
31
  const groupUIs = useGroupingMappingCustomUI().customUIs
35
32
  .filter((p) => p.type === GroupingMappingCustomUIType.Grouping);
@@ -38,66 +35,51 @@ export const GroupAction = (props) => {
38
35
  description: (_d = (_c = props.group) === null || _c === void 0 ? void 0 : _c.description) !== null && _d !== void 0 ? _d : "",
39
36
  });
40
37
  const [query, setQuery] = useState("");
41
- const [simpleSelectionQuery, setSimpleSelectionQuery] = useState("");
38
+ const [queryRowCount, setQueryRowCount] = useState(0);
42
39
  const [validator, setShowValidationMessage] = useValidator();
43
40
  const [isLoading, setIsLoading] = useState(false);
44
- const [isRendering, setIsRendering] = useState(false);
45
41
  const [queryGenerationType, setQueryGenerationType] = useState(props.queryGenerationType);
42
+ const { isRendering, setIsRendering, simpleSelectionQuery, setSimpleSelectionQuery, clearPresentationSelection, resetView, } = useVisualization(props.shouldVisualize, iModelConnection, query, queryGenerationType);
46
43
  const isUpdating = isLoading || isRendering;
47
44
  const [currentStep, setCurrentStep] = React.useState(GroupActionStep.QueryBuilder);
48
- useEffect(() => {
49
- if (!iModelConnection) {
50
- throw new Error("This component requires an active iModelConnection.");
51
- }
52
- }, [iModelConnection]);
53
45
  const displayStrings = React.useMemo(() => ({ ...defaultDisplayStrings, ...props.displayStrings }), [props.displayStrings]);
54
46
  useEffect(() => setQueryGenerationType(props.queryGenerationType), [props.queryGenerationType]);
55
- const resetView = useCallback(async () => {
56
- if (showGroupColor) {
57
- await visualizeGroupColors(iModelConnection, groups, groups, hiddenGroupsIds, hilitedElementsQueryCache);
58
- }
59
- else {
60
- clearOverriddenElements();
61
- }
62
- clearEmphasizedElements();
63
- }, [groups, hiddenGroupsIds, hilitedElementsQueryCache, iModelConnection, showGroupColor]);
64
47
  useEffect(() => {
65
- const removeListener = Presentation.selection.selectionChange.addListener(async (evt, selectionProvider) => {
66
- if (queryGenerationType === "Selection") {
67
- const selection = selectionProvider.getSelection(evt.imodel, evt.level);
68
- const query = selection.instanceKeys.size > 0
69
- ? `SELECT ECInstanceId FROM ${selection.instanceKeys.keys().next().value}`
70
- : "";
71
- setSimpleSelectionQuery(query);
72
- }
73
- });
74
- return () => {
75
- removeListener();
76
- };
77
- }, [iModelConnection, queryGenerationType]);
78
- useEffect(() => {
79
- const reemphasize = async () => {
48
+ const fetchQueryRowCount = async () => {
80
49
  try {
81
50
  if (!query || query === "") {
51
+ setQueryRowCount(0);
82
52
  return;
83
53
  }
84
- setIsRendering(true);
85
- transparentOverriddenElements();
86
- const resolvedHiliteIds = await visualizeElementsByQuery(query, "red", iModelConnection);
87
- await zoomToElements(resolvedHiliteIds);
54
+ setIsLoading(true);
55
+ const result = await iModelConnection.queryRowCount(query);
56
+ setQueryRowCount(result);
88
57
  }
89
58
  catch {
90
- toaster.negative("Sorry, we have failed to generate a valid query. 😔");
59
+ toaster.negative("Query failed to resolve.");
91
60
  }
92
61
  finally {
93
- setIsRendering(false);
62
+ setIsLoading(false);
94
63
  }
95
64
  };
96
- void reemphasize();
97
- }, [iModelConnection, query]);
98
- useEffect(() => {
99
- Presentation.selection.clearSelection("GroupingMappingWidget", iModelConnection);
100
- }, [iModelConnection]);
65
+ void fetchQueryRowCount();
66
+ }, [iModelConnection, query, setIsRendering]);
67
+ const isBlockingActions = !(details.groupName &&
68
+ (query || simpleSelectionQuery) &&
69
+ !isRendering &&
70
+ !isLoading);
71
+ const getOptions = useMemo(() => groupUIs.map((ui) => ({
72
+ label: ui.displayLabel,
73
+ value: ui.name,
74
+ icon: ui.icon,
75
+ })), [groupUIs]);
76
+ const onChange = useCallback(async (value) => {
77
+ setQueryGenerationType(value);
78
+ clearPresentationSelection();
79
+ setQuery("");
80
+ setSimpleSelectionQuery("");
81
+ await resetView();
82
+ }, [clearPresentationSelection, resetView, setSimpleSelectionQuery]);
101
83
  const save = useCallback(async () => {
102
84
  var _a, _b, _c, _d, _e;
103
85
  if (!validator.allValid()) {
@@ -114,7 +96,7 @@ export const GroupAction = (props) => {
114
96
  ...details,
115
97
  query: currentQuery,
116
98
  });
117
- Presentation.selection.clearSelection("GroupingMappingWidget", iModelConnection);
99
+ clearPresentationSelection();
118
100
  setDetails({
119
101
  groupName: (_c = (_b = props.group) === null || _b === void 0 ? void 0 : _b.groupName) !== null && _c !== void 0 ? _c : "",
120
102
  description: (_e = (_d = props.group) === null || _d === void 0 ? void 0 : _d.description) !== null && _e !== void 0 ? _e : "",
@@ -129,36 +111,20 @@ export const GroupAction = (props) => {
129
111
  finally {
130
112
  setIsLoading(false);
131
113
  }
132
- }, [validator, setShowValidationMessage, query, simpleSelectionQuery, getAccessToken, props, mappingClient, iModelId, details, iModelConnection]);
133
- const isBlockingActions = !(details.groupName &&
134
- (query || simpleSelectionQuery) &&
135
- !isRendering &&
136
- !isLoading);
137
- const getOptions = useMemo(() => groupUIs.map((ui) => ({
138
- label: ui.displayLabel,
139
- value: ui.name,
140
- icon: ui.icon,
141
- })), [groupUIs]);
142
- const onChange = useCallback(async (value) => {
143
- setQueryGenerationType(value);
144
- Presentation.selection.clearSelection("GroupingMappingWidget", iModelConnection);
145
- setQuery("");
146
- setSimpleSelectionQuery("");
147
- await resetView();
148
- }, [iModelConnection, resetView]);
114
+ }, [validator, setShowValidationMessage, query, simpleSelectionQuery, getAccessToken, props, mappingClient, iModelId, details, clearPresentationSelection]);
149
115
  const isQueryBuilderStep = currentStep === GroupActionStep.QueryBuilder;
150
116
  const isGroupDetailsStep = currentStep === GroupActionStep.GroupDetails;
151
117
  return (React.createElement(React.Fragment, null,
152
118
  React.createElement("div", { className: "gmw-group-add-modify-container" },
153
- React.createElement(QueryBuilderStep, { isHidden: !isQueryBuilderStep, queryGenerationType: queryGenerationType, groupUIs: groupUIs, isUpdating: isUpdating, resetView: resetView, setQuery: setQuery, onChange: onChange, getOptions: getOptions, displayStrings: { ...displayStrings } }),
119
+ React.createElement(QueryBuilderStep, { queryRowCount: queryRowCount, isHidden: !isQueryBuilderStep, queryGenerationType: queryGenerationType, groupUIs: groupUIs, isUpdating: isUpdating, resetView: resetView, setQuery: setQuery, onChange: onChange, getOptions: getOptions, displayStrings: { ...displayStrings }, group: props.group }),
154
120
  isGroupDetailsStep && React.createElement(GroupDetailsStep, { details: details, setDetails: setDetails, validator: validator, displayStrings: { ...displayStrings } })),
155
121
  React.createElement("div", { className: 'gmw-action-panel' },
156
122
  isLoading &&
157
123
  React.createElement(LoadingSpinner, null),
158
124
  isQueryBuilderStep && (React.createElement(QueryBuilderActionPanel, { onClickNext: () => setCurrentStep(GroupActionStep.GroupDetails) })),
159
125
  isGroupDetailsStep && (React.createElement(GroupDetailsActionPanel, { isSaveDisabled: isBlockingActions, onClickSave: save, onClickBack: () => setCurrentStep(GroupActionStep.QueryBuilder) })),
160
- props.onClickCancel && React.createElement(Button, { type: 'button', id: 'cancel', onClick: async () => {
161
- Presentation.selection.clearSelection("GroupingMappingWidget", iModelConnection);
126
+ props.onClickCancel && React.createElement(Button, { type: 'button', id: 'cancel', onClick: () => {
127
+ clearPresentationSelection();
162
128
  props.onClickCancel && props.onClickCancel();
163
129
  } }, "Cancel"))));
164
130
  };
@@ -1 +1 @@
1
- {"version":3,"file":"GroupAction.js","sourceRoot":"","sources":["../../../../src/widget/components/GroupAction.tsx"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAI/D,OAAO,EACL,MAAM,EACN,OAAO,GACR,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACzE,OAAO,EACL,WAAW,EACX,cAAc,GACf,MAAM,SAAS,CAAC;AACjB,OAAO,oBAAoB,CAAC;AAC5B,OAAO,YAAY,MAAM,uBAAuB,CAAC;AACjD,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,6BAA6B,EAC7B,wBAAwB,EACxB,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,MAAM,0CAA0C,CAAC;AAEtF,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AAEjF,OAAO,EAAE,8BAA8B,EAAE,MAAM,uCAAuC,CAAC;AACvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,qBAAqB,GAAG;IAC5B,YAAY,EAAE,eAAe;IAC7B,OAAO,EAAE,UAAU;CACpB,CAAC;AAEF,IAAK,eAGJ;AAHD,WAAK,eAAe;IAClB,qEAAY,CAAA;IACZ,qEAAY,CAAA;AACd,CAAC,EAHI,eAAe,KAAf,eAAe,QAGnB;AAWD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAuB,EAAE,EAAE;;IACrD,MAAM,gBAAgB,GAAG,yBAAyB,EAAsB,CAAC;IACzE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,yBAAyB,EAAE,GAAG,8BAA8B,EAAE,CAAC;IAChH,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,2BAA2B,EAAE,CAAC;IACnE,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAuB,0BAA0B,EAAE,CAAC,SAAS;SACxE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,2BAA2B,CAAC,QAAQ,CAAuB,CAAC;IACxF,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC;QACrC,SAAS,EAAE,MAAA,MAAA,KAAK,CAAC,KAAK,0CAAE,SAAS,mCAAI,EAAE;QACvC,WAAW,EAAE,MAAA,MAAA,KAAK,CAAC,KAAK,0CAAE,WAAW,mCAAI,EAAE;KAC5C,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,GAAG,QAAQ,CAAS,EAAE,CAAC,CAAC;IAC7E,MAAM,CAAC,SAAS,EAAE,wBAAwB,CAAC,GAAG,YAAY,EAAE,CAAC;IAC7D,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAC;IAC3D,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAC;IAC/D,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,CAC5D,KAAK,CAAC,mBAAmB,CAC1B,CAAC;IACF,MAAM,UAAU,GAAG,SAAS,IAAI,WAAW,CAAC;IAC5C,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;IAEnF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,gBAAgB,EAAE;YACrB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;SACxE;IACH,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEvB,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAClC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,qBAAqB,EAAE,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC,EAC7D,CAAC,KAAK,CAAC,cAAc,CAAC,CACvB,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE,CAAC,sBAAsB,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAEhG,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACvC,IAAI,cAAc,EAAE;YAClB,MAAM,oBAAoB,CAAC,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,yBAAyB,CAAC,CAAC;SAC1G;aAAM;YACL,uBAAuB,EAAE,CAAC;SAC3B;QACD,uBAAuB,EAAE,CAAC;IAC5B,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC,CAAC;IAE3F,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,cAAc,GAAG,YAAY,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,CACvE,KAAK,EACH,GAA6B,EAC7B,iBAAqC,EACrC,EAAE;YACF,IAAI,mBAAmB,KAAK,WAAW,EAAE;gBACvC,MAAM,SAAS,GAAG,iBAAiB,CAAC,YAAY,CAC9C,GAAG,CAAC,MAAM,EACV,GAAG,CAAC,KAAK,CACV,CAAC;gBACF,MAAM,KAAK,GAAG,SAAS,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC;oBAC3C,CAAC,CAAC,4BAA4B,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE;oBAC1E,CAAC,CAAC,EAAE,CAAC;gBACP,uBAAuB,CAAC,KAAK,CAAC,CAAC;aAChC;QACH,CAAC,CACF,CAAC;QACF,OAAO,GAAG,EAAE;YACV,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAE5C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE;YAC7B,IAAI;gBACF,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,EAAE,EAAE;oBAC1B,OAAO;iBACR;gBACD,cAAc,CAAC,IAAI,CAAC,CAAC;gBACrB,6BAA6B,EAAE,CAAC;gBAChC,MAAM,iBAAiB,GAAG,MAAM,wBAAwB,CACtD,KAAK,EACL,KAAK,EACL,gBAAgB,CACjB,CAAC;gBACF,MAAM,cAAc,CAAC,iBAAiB,CAAC,CAAC;aACzC;YAAC,MAAM;gBACN,OAAO,CAAC,QAAQ,CAAC,qDAAqD,CAAC,CAAC;aACzE;oBAAS;gBACR,cAAc,CAAC,KAAK,CAAC,CAAC;aACvB;QACH,CAAC,CAAC;QAEF,KAAK,WAAW,EAAE,CAAC;IACrB,CAAC,EAAE,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC;IAE9B,SAAS,CAAC,GAAG,EAAE;QACb,YAAY,CAAC,SAAS,CAAC,cAAc,CACnC,uBAAuB,EACvB,gBAAgB,CACjB,CAAC;IACJ,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEvB,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;;QAClC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE;YACzB,wBAAwB,CAAC,IAAI,CAAC,CAAC;YAC/B,OAAO;SACR;QACD,IAAI;YACF,YAAY,CAAC,IAAI,CAAC,CAAC;YACnB,MAAM,YAAY,GAAG,KAAK,IAAI,oBAAoB,CAAC;YAEnD,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;YAE3C,KAAK,CAAC,KAAK;gBACT,CAAC,CAAC,MAAM,aAAa,CAAC,WAAW,CAC/B,WAAW,EACX,QAAQ,EACR,KAAK,CAAC,SAAS,EACf,MAAA,KAAK,CAAC,KAAK,CAAC,EAAE,mCAAI,EAAE,EACpB,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,CACpC;gBACD,CAAC,CAAC,MAAM,aAAa,CAAC,WAAW,CAC/B,WAAW,EACX,QAAQ,EACR,KAAK,CAAC,SAAS,EACf;oBACE,GAAG,OAAO;oBACV,KAAK,EAAE,YAAY;iBACpB,CACF,CAAC;YACJ,YAAY,CAAC,SAAS,CAAC,cAAc,CACnC,uBAAuB,EACvB,gBAAgB,CACjB,CAAC;YACF,UAAU,CAAC;gBACT,SAAS,EAAE,MAAA,MAAA,KAAK,CAAC,KAAK,0CAAE,SAAS,mCAAI,EAAE;gBACvC,WAAW,EAAE,MAAA,MAAA,KAAK,CAAC,KAAK,0CAAE,WAAW,mCAAI,EAAE;aAC5C,CAAC,CAAC;YACH,cAAc,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;YAC7C,wBAAwB,CAAC,KAAK,CAAC,CAAC;YAChC,KAAK,CAAC,aAAa,EAAE,CAAC;SACvB;QAAC,OAAO,KAAU,EAAE;YACnB,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;SAC3B;gBAAS;YACR,YAAY,CAAC,KAAK,CAAC,CAAC;SACrB;IACH,CAAC,EAAE,CAAC,SAAS,EAAE,wBAAwB,EAAE,KAAK,EAAE,oBAAoB,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAElJ,MAAM,iBAAiB,GAAG,CAAC,CACzB,OAAO,CAAC,SAAS;QACjB,CAAC,KAAK,IAAI,oBAAoB,CAAC;QAC/B,CAAC,WAAW;QACZ,CAAC,SAAS,CACX,CAAC;IAEF,MAAM,UAAU,GAAG,OAAO,CACxB,GAA2B,EAAE,CAC3B,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACpB,KAAK,EAAE,EAAE,CAAC,YAAY;QACtB,KAAK,EAAE,EAAE,CAAC,IAAI;QACd,IAAI,EAAE,EAAE,CAAC,IAAI;KACd,CAAC,CAAC,EACL,CAAC,QAAQ,CAAC,CACX,CAAC;IAEF,MAAM,QAAQ,GAAG,WAAW,CAC1B,KAAK,EAAE,KAAa,EAAE,EAAE;QACtB,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAC9B,YAAY,CAAC,SAAS,CAAC,cAAc,CACnC,uBAAuB,EACvB,gBAAgB,CACjB,CAAC;QACF,QAAQ,CAAC,EAAE,CAAC,CAAC;QACb,uBAAuB,CAAC,EAAE,CAAC,CAAC;QAC5B,MAAM,SAAS,EAAE,CAAC;IACpB,CAAC,EACD,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAC9B,CAAC;IAEF,MAAM,kBAAkB,GAAG,WAAW,KAAK,eAAe,CAAC,YAAY,CAAC;IACxE,MAAM,kBAAkB,GAAG,WAAW,KAAK,eAAe,CAAC,YAAY,CAAC;IACxE,OAAO,CACL;QACE,6BAAK,SAAS,EAAC,gCAAgC;YAC7C,oBAAC,gBAAgB,IACf,QAAQ,EAAE,CAAC,kBAAkB,EAC7B,mBAAmB,EAAE,mBAAmB,EACxC,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,EAAE,GAAG,cAAc,EAAE,GACrC;YACD,kBAAkB,IAAI,oBAAC,gBAAgB,IACtC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,EAAE,GAAG,cAAc,EAAE,GACrC,CACE;QACN,6BAAK,SAAS,EAAC,kBAAkB;YAC9B,SAAS;gBACR,oBAAC,cAAc,OAAG;YAEnB,kBAAkB,IAAI,CACrB,oBAAC,uBAAuB,IAAC,WAAW,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,eAAe,CAAC,YAAY,CAAC,GAAI,CAC7F;YACA,kBAAkB,IAAI,CACrB,oBAAC,uBAAuB,IACtB,cAAc,EAAE,iBAAiB,EACjC,WAAW,EAAE,IAAI,EACjB,WAAW,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,eAAe,CAAC,YAAY,CAAC,GAC/D,CACH;YACA,KAAK,CAAC,aAAa,IAAI,oBAAC,MAAM,IAC7B,IAAI,EAAC,QAAQ,EACb,EAAE,EAAC,QAAQ,EACX,OAAO,EAAE,KAAK,IAAI,EAAE;oBAClB,YAAY,CAAC,SAAS,CAAC,cAAc,CACnC,uBAAuB,EACvB,gBAAgB,CACjB,CAAC;oBACF,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;gBAC/C,CAAC,aAGM,CACL,CACL,CACJ,CAAC;AACJ,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 type { IModelConnection } from \"@itwin/core-frontend\";\nimport type {\n ISelectionProvider,\n SelectionChangeEventArgs,\n} from \"@itwin/presentation-frontend\";\nimport { Presentation } from \"@itwin/presentation-frontend\";\nimport { useActiveIModelConnection } from \"@itwin/appui-react\";\nimport type {\n SelectOption,\n} from \"@itwin/itwinui-react\";\nimport {\n Button,\n toaster,\n} from \"@itwin/itwinui-react\";\nimport React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport {\n handleError,\n LoadingSpinner,\n} from \"./utils\";\nimport \"./GroupAction.scss\";\nimport useValidator from \"../hooks/useValidator\";\nimport {\n clearEmphasizedElements,\n clearOverriddenElements,\n transparentOverriddenElements,\n visualizeElementsByQuery,\n zoomToElements,\n} from \"./viewerUtils\";\nimport { useGroupingMappingApiConfig } from \"./context/GroupingApiConfigContext\";\nimport { useMappingClient } from \"./context/MappingClientContext\";\nimport { useGroupingMappingCustomUI } from \"./context/GroupingMappingCustomUIContext\";\nimport type { GroupingCustomUI } from \"./customUI/GroupingMappingCustomUI\";\nimport { GroupingMappingCustomUIType } from \"./customUI/GroupingMappingCustomUI\";\nimport type { Group } from \"@itwin/insights-client\";\nimport { useGroupHilitedElementsContext } from \"./context/GroupHilitedElementsContext\";\nimport { visualizeGroupColors } from \"./groupsHelpers\";\nimport { QueryBuilderStep } from \"./QueryBuilderStep\";\nimport { GroupDetailsStep } from \"./GroupDetailsStep\";\nimport { QueryBuilderActionPanel } from \"./QueryBuilderActionPanel\";\nimport { GroupDetailsActionPanel } from \"./GroupDetailsActionPanel\";\n\nconst defaultDisplayStrings = {\n groupDetails: \"Group Details\",\n groupBy: \"Group By\",\n};\n\nenum GroupActionStep {\n QueryBuilder,\n GroupDetails,\n}\n\nexport interface GroupActionProps {\n mappingId: string;\n group?: Group;\n queryGenerationType: string;\n onSaveSuccess: () => void;\n onClickCancel?: () => void;\n displayStrings?: Partial<typeof defaultDisplayStrings>;\n}\n\nexport const GroupAction = (props: GroupActionProps) => {\n const iModelConnection = useActiveIModelConnection() as IModelConnection;\n const { showGroupColor, groups, hiddenGroupsIds, hilitedElementsQueryCache } = useGroupHilitedElementsContext();\n const { getAccessToken, iModelId } = useGroupingMappingApiConfig();\n const mappingClient = useMappingClient();\n const groupUIs: GroupingCustomUI[] = useGroupingMappingCustomUI().customUIs\n .filter((p) => p.type === GroupingMappingCustomUIType.Grouping) as GroupingCustomUI[];\n const [details, setDetails] = useState({\n groupName: props.group?.groupName ?? \"\",\n description: props.group?.description ?? \"\",\n });\n const [query, setQuery] = useState<string>(\"\");\n const [simpleSelectionQuery, setSimpleSelectionQuery] = useState<string>(\"\");\n const [validator, setShowValidationMessage] = useValidator();\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [isRendering, setIsRendering] = useState<boolean>(false);\n const [queryGenerationType, setQueryGenerationType] = useState(\n props.queryGenerationType,\n );\n const isUpdating = isLoading || isRendering;\n const [currentStep, setCurrentStep] = React.useState(GroupActionStep.QueryBuilder);\n\n useEffect(() => {\n if (!iModelConnection) {\n throw new Error(\"This component requires an active iModelConnection.\");\n }\n }, [iModelConnection]);\n\n const displayStrings = React.useMemo(\n () => ({ ...defaultDisplayStrings, ...props.displayStrings }),\n [props.displayStrings]\n );\n\n useEffect(() => setQueryGenerationType(props.queryGenerationType), [props.queryGenerationType]);\n\n const resetView = useCallback(async () => {\n if (showGroupColor) {\n await visualizeGroupColors(iModelConnection, groups, groups, hiddenGroupsIds, hilitedElementsQueryCache);\n } else {\n clearOverriddenElements();\n }\n clearEmphasizedElements();\n }, [groups, hiddenGroupsIds, hilitedElementsQueryCache, iModelConnection, showGroupColor]);\n\n useEffect(() => {\n const removeListener = Presentation.selection.selectionChange.addListener(\n async (\n evt: SelectionChangeEventArgs,\n selectionProvider: ISelectionProvider,\n ) => {\n if (queryGenerationType === \"Selection\") {\n const selection = selectionProvider.getSelection(\n evt.imodel,\n evt.level,\n );\n const query = selection.instanceKeys.size > 0\n ? `SELECT ECInstanceId FROM ${selection.instanceKeys.keys().next().value}`\n : \"\";\n setSimpleSelectionQuery(query);\n }\n },\n );\n return () => {\n removeListener();\n };\n }, [iModelConnection, queryGenerationType]);\n\n useEffect(() => {\n const reemphasize = async () => {\n try {\n if (!query || query === \"\") {\n return;\n }\n setIsRendering(true);\n transparentOverriddenElements();\n const resolvedHiliteIds = await visualizeElementsByQuery(\n query,\n \"red\",\n iModelConnection,\n );\n await zoomToElements(resolvedHiliteIds);\n } catch {\n toaster.negative(\"Sorry, we have failed to generate a valid query. 😔\");\n } finally {\n setIsRendering(false);\n }\n };\n\n void reemphasize();\n }, [iModelConnection, query]);\n\n useEffect(() => {\n Presentation.selection.clearSelection(\n \"GroupingMappingWidget\",\n iModelConnection,\n );\n }, [iModelConnection]);\n\n const save = useCallback(async () => {\n if (!validator.allValid()) {\n setShowValidationMessage(true);\n return;\n }\n try {\n setIsLoading(true);\n const currentQuery = query || simpleSelectionQuery;\n\n const accessToken = await getAccessToken();\n\n props.group\n ? await mappingClient.updateGroup(\n accessToken,\n iModelId,\n props.mappingId,\n props.group.id ?? \"\",\n { ...details, query: currentQuery },\n )\n : await mappingClient.createGroup(\n accessToken,\n iModelId,\n props.mappingId,\n {\n ...details,\n query: currentQuery,\n },\n );\n Presentation.selection.clearSelection(\n \"GroupingMappingWidget\",\n iModelConnection,\n );\n setDetails({\n groupName: props.group?.groupName ?? \"\",\n description: props.group?.description ?? \"\",\n });\n setCurrentStep(GroupActionStep.QueryBuilder);\n setShowValidationMessage(false);\n props.onSaveSuccess();\n } catch (error: any) {\n handleError(error.status);\n } finally {\n setIsLoading(false);\n }\n }, [validator, setShowValidationMessage, query, simpleSelectionQuery, getAccessToken, props, mappingClient, iModelId, details, iModelConnection]);\n\n const isBlockingActions = !(\n details.groupName &&\n (query || simpleSelectionQuery) &&\n !isRendering &&\n !isLoading\n );\n\n const getOptions = useMemo(\n (): SelectOption<string>[] =>\n groupUIs.map((ui) => ({\n label: ui.displayLabel,\n value: ui.name,\n icon: ui.icon,\n })),\n [groupUIs]\n );\n\n const onChange = useCallback(\n async (value: string) => {\n setQueryGenerationType(value);\n Presentation.selection.clearSelection(\n \"GroupingMappingWidget\",\n iModelConnection,\n );\n setQuery(\"\");\n setSimpleSelectionQuery(\"\");\n await resetView();\n },\n [iModelConnection, resetView]\n );\n\n const isQueryBuilderStep = currentStep === GroupActionStep.QueryBuilder;\n const isGroupDetailsStep = currentStep === GroupActionStep.GroupDetails;\n return (\n <>\n <div className=\"gmw-group-add-modify-container\">\n <QueryBuilderStep\n isHidden={!isQueryBuilderStep}\n queryGenerationType={queryGenerationType}\n groupUIs={groupUIs}\n isUpdating={isUpdating}\n resetView={resetView}\n setQuery={setQuery}\n onChange={onChange}\n getOptions={getOptions}\n displayStrings={{ ...displayStrings }}\n />\n {isGroupDetailsStep && <GroupDetailsStep\n details={details}\n setDetails={setDetails}\n validator={validator}\n displayStrings={{ ...displayStrings }}\n />}\n </div>\n <div className='gmw-action-panel'>\n {isLoading &&\n <LoadingSpinner />\n }\n {isQueryBuilderStep && (\n <QueryBuilderActionPanel onClickNext={() => setCurrentStep(GroupActionStep.GroupDetails)} />\n )}\n {isGroupDetailsStep && (\n <GroupDetailsActionPanel\n isSaveDisabled={isBlockingActions}\n onClickSave={save}\n onClickBack={() => setCurrentStep(GroupActionStep.QueryBuilder)}\n />\n )}\n {props.onClickCancel && <Button\n type='button'\n id='cancel'\n onClick={async () => {\n Presentation.selection.clearSelection(\n \"GroupingMappingWidget\",\n iModelConnection,\n );\n props.onClickCancel && props.onClickCancel();\n }}\n >\n Cancel\n </Button>}\n </div>\n </>\n );\n};\n"]}
1
+ {"version":3,"file":"GroupAction.js","sourceRoot":"","sources":["../../../../src/widget/components/GroupAction.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 {\n SelectOption,\n} from \"@itwin/itwinui-react\";\nimport {\n Button,\n toaster,\n} from \"@itwin/itwinui-react\";\nimport React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport {\n handleError,\n LoadingSpinner,\n} from \"./utils\";\nimport \"./GroupAction.scss\";\nimport useValidator from \"../hooks/useValidator\";\nimport { useGroupingMappingApiConfig } from \"./context/GroupingApiConfigContext\";\nimport { useMappingClient } from \"./context/MappingClientContext\";\nimport { useGroupingMappingCustomUI } from \"./context/GroupingMappingCustomUIContext\";\nimport type { GroupingCustomUI } from \"./customUI/GroupingMappingCustomUI\";\nimport { GroupingMappingCustomUIType } from \"./customUI/GroupingMappingCustomUI\";\nimport type { Group } from \"@itwin/insights-client\";\nimport { QueryBuilderStep } from \"./QueryBuilderStep\";\nimport { GroupDetailsStep } from \"./GroupDetailsStep\";\nimport { QueryBuilderActionPanel } from \"./QueryBuilderActionPanel\";\nimport { GroupDetailsActionPanel } from \"./GroupDetailsActionPanel\";\nimport { useVisualization } from \"../hooks/useVisualization\";\n\nconst defaultDisplayStrings = {\n groupDetails: \"Group Details\",\n groupBy: \"Group By\",\n};\n\nenum GroupActionStep {\n QueryBuilder,\n GroupDetails,\n}\n\nexport interface GroupActionProps {\n mappingId: string;\n shouldVisualize: boolean;\n group?: Group;\n queryGenerationType: string;\n onSaveSuccess: () => void;\n onClickCancel?: () => void;\n displayStrings?: Partial<typeof defaultDisplayStrings>;\n}\n\nexport const GroupAction = (props: GroupActionProps) => {\n const { getAccessToken, iModelId, iModelConnection } = useGroupingMappingApiConfig();\n if (!iModelConnection) {\n throw new Error(\"This component requires an active iModelConnection.\");\n }\n const mappingClient = useMappingClient();\n const groupUIs: GroupingCustomUI[] = useGroupingMappingCustomUI().customUIs\n .filter((p) => p.type === GroupingMappingCustomUIType.Grouping) as GroupingCustomUI[];\n const [details, setDetails] = useState({\n groupName: props.group?.groupName ?? \"\",\n description: props.group?.description ?? \"\",\n });\n const [query, setQuery] = useState<string>(\"\");\n const [queryRowCount, setQueryRowCount] = useState<number>(0);\n\n const [validator, setShowValidationMessage] = useValidator();\n const [isLoading, setIsLoading] = useState<boolean>(false);\n\n const [queryGenerationType, setQueryGenerationType] = useState(\n props.queryGenerationType,\n );\n const {\n isRendering,\n setIsRendering,\n simpleSelectionQuery,\n setSimpleSelectionQuery,\n clearPresentationSelection,\n resetView,\n } = useVisualization(\n props.shouldVisualize,\n iModelConnection,\n query,\n queryGenerationType\n );\n const isUpdating = isLoading || isRendering;\n const [currentStep, setCurrentStep] = React.useState(GroupActionStep.QueryBuilder);\n\n const displayStrings = React.useMemo(\n () => ({ ...defaultDisplayStrings, ...props.displayStrings }),\n [props.displayStrings]\n );\n\n useEffect(() => setQueryGenerationType(props.queryGenerationType), [props.queryGenerationType]);\n\n useEffect(() => {\n const fetchQueryRowCount = async () => {\n try {\n if (!query || query === \"\") {\n setQueryRowCount(0);\n return;\n }\n setIsLoading(true);\n const result = await iModelConnection.queryRowCount(query);\n setQueryRowCount(result);\n } catch {\n toaster.negative(\"Query failed to resolve.\");\n } finally {\n setIsLoading(false);\n }\n };\n\n void fetchQueryRowCount();\n }, [iModelConnection, query, setIsRendering]);\n\n const isBlockingActions = !(\n details.groupName &&\n (query || simpleSelectionQuery) &&\n !isRendering &&\n !isLoading\n );\n\n const getOptions = useMemo(\n (): SelectOption<string>[] =>\n groupUIs.map((ui) => ({\n label: ui.displayLabel,\n value: ui.name,\n icon: ui.icon,\n })),\n [groupUIs]\n );\n\n const onChange = useCallback(\n async (value: string) => {\n setQueryGenerationType(value);\n clearPresentationSelection();\n setQuery(\"\");\n setSimpleSelectionQuery(\"\");\n await resetView();\n },\n [clearPresentationSelection, resetView, setSimpleSelectionQuery]\n );\n\n const save = useCallback(async () => {\n if (!validator.allValid()) {\n setShowValidationMessage(true);\n return;\n }\n try {\n setIsLoading(true);\n const currentQuery = query || simpleSelectionQuery;\n\n const accessToken = await getAccessToken();\n\n props.group\n ? await mappingClient.updateGroup(\n accessToken,\n iModelId,\n props.mappingId,\n props.group.id ?? \"\",\n { ...details, query: currentQuery },\n )\n : await mappingClient.createGroup(\n accessToken,\n iModelId,\n props.mappingId,\n {\n ...details,\n query: currentQuery,\n },\n );\n clearPresentationSelection();\n setDetails({\n groupName: props.group?.groupName ?? \"\",\n description: props.group?.description ?? \"\",\n });\n setCurrentStep(GroupActionStep.QueryBuilder);\n setShowValidationMessage(false);\n props.onSaveSuccess();\n } catch (error: any) {\n handleError(error.status);\n } finally {\n setIsLoading(false);\n }\n }, [validator, setShowValidationMessage, query, simpleSelectionQuery, getAccessToken, props, mappingClient, iModelId, details, clearPresentationSelection]);\n\n const isQueryBuilderStep = currentStep === GroupActionStep.QueryBuilder;\n const isGroupDetailsStep = currentStep === GroupActionStep.GroupDetails;\n return (\n <>\n <div className=\"gmw-group-add-modify-container\">\n <QueryBuilderStep\n queryRowCount={queryRowCount}\n isHidden={!isQueryBuilderStep}\n queryGenerationType={queryGenerationType}\n groupUIs={groupUIs}\n isUpdating={isUpdating}\n resetView={resetView}\n setQuery={setQuery}\n onChange={onChange}\n getOptions={getOptions}\n displayStrings={{ ...displayStrings }}\n group={props.group}\n />\n {isGroupDetailsStep && <GroupDetailsStep\n details={details}\n setDetails={setDetails}\n validator={validator}\n displayStrings={{ ...displayStrings }}\n />}\n </div>\n <div className='gmw-action-panel'>\n {isLoading &&\n <LoadingSpinner />\n }\n {isQueryBuilderStep && (\n <QueryBuilderActionPanel onClickNext={() => setCurrentStep(GroupActionStep.GroupDetails)} />\n )}\n {isGroupDetailsStep && (\n <GroupDetailsActionPanel\n isSaveDisabled={isBlockingActions}\n onClickSave={save}\n onClickBack={() => setCurrentStep(GroupActionStep.QueryBuilder)}\n />\n )}\n {props.onClickCancel && <Button\n type='button'\n id='cancel'\n onClick={() => {\n clearPresentationSelection();\n props.onClickCancel && props.onClickCancel();\n }}\n >\n Cancel\n </Button>}\n </div>\n </>\n );\n};\n"]}
@@ -0,0 +1,10 @@
1
+ /// <reference types="react" />
2
+ import type { Group } from "@itwin/insights-client";
3
+ import "./GroupColorLegend.scss";
4
+ interface GroupColorLegendProps {
5
+ group: Group;
6
+ groups: Group[];
7
+ }
8
+ export declare const GroupColorLegend: ({ group, groups }: GroupColorLegendProps) => JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=GroupColorLegend.d.ts.map
@@ -0,0 +1,13 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import React from "react";
6
+ import { IconButton } from "@itwin/itwinui-react";
7
+ import { getGroupColor } from "./groupsHelpers";
8
+ import "./GroupColorLegend.scss";
9
+ export const GroupColorLegend = ({ group, groups }) => (React.createElement(IconButton, { styleType: "borderless" },
10
+ React.createElement("div", { className: "gmw-color-legend", style: {
11
+ backgroundColor: getGroupColor(groups.findIndex((g) => g.id === group.id)),
12
+ } })));
13
+ //# sourceMappingURL=GroupColorLegend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupColorLegend.js","sourceRoot":"","sources":["../../../../src/widget/components/GroupColorLegend.tsx"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,yBAAyB,CAAC;AAOjC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAyB,EAAE,EAAE,CAAC,CAC5E,oBAAC,UAAU,IAAC,SAAS,EAAC,YAAY;IAChC,6BACE,SAAS,EAAC,kBAAkB,EAC5B,KAAK,EAAE;YACL,eAAe,EAAE,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;SAC3E,GACD,CACS,CACd,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 React from \"react\";\nimport { IconButton } from \"@itwin/itwinui-react\";\nimport type { Group } from \"@itwin/insights-client\";\nimport { getGroupColor } from \"./groupsHelpers\";\nimport \"./GroupColorLegend.scss\";\n\ninterface GroupColorLegendProps {\n group: Group;\n groups: Group[];\n}\n\nexport const GroupColorLegend = ({ group, groups }: GroupColorLegendProps) => (\n <IconButton styleType=\"borderless\">\n <div\n className=\"gmw-color-legend\"\n style={{\n backgroundColor: getGroupColor(groups.findIndex((g) => g.id === group.id)),\n }}\n />\n </IconButton>\n);\n"]}
@@ -0,0 +1,9 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ @import "~@itwin/itwinui-css/scss/variables";
6
+
7
+ .gmw-color-legend {
8
+ border: 1px solid black;
9
+ }
@@ -0,0 +1,9 @@
1
+ /// <reference types="react" />
2
+ import type { ToggleSwitchProps } from "@itwin/itwinui-react";
3
+ import type { Group } from "@itwin/insights-client";
4
+ export interface GroupColorToggleProps extends Partial<ToggleSwitchProps> {
5
+ color: string;
6
+ group: Group;
7
+ }
8
+ export declare const GroupColorToggle: ({ color, group, ...rest }: GroupColorToggleProps) => JSX.Element;
9
+ //# sourceMappingURL=GroupColorToggle.d.ts.map
@@ -0,0 +1,46 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import React, { useEffect, useState } from "react";
6
+ import { toaster, ToggleSwitch } from "@itwin/itwinui-react";
7
+ import { clearEmphasizedOverriddenElements, visualizeElements, zoomToElements } from "./viewerUtils";
8
+ import { getHiliteIdsAndKeysetFromGroup } from "./groupsHelpers";
9
+ import { Presentation } from "@itwin/presentation-frontend";
10
+ import { useGroupHilitedElementsContext } from "./context/GroupHilitedElementsContext";
11
+ import { usePropertiesContext } from "./context/PropertiesContext";
12
+ import { useGroupingMappingApiConfig } from "./context/GroupingApiConfigContext";
13
+ export const GroupColorToggle = ({ color, group, ...rest }) => {
14
+ const [isLoading, setIsLoading] = useState(false);
15
+ const { iModelConnection } = useGroupingMappingApiConfig();
16
+ if (!iModelConnection) {
17
+ throw new Error("This component requires an active iModelConnection.");
18
+ }
19
+ const { hilitedElementsQueryCache } = useGroupHilitedElementsContext();
20
+ const { showGroupColor, setShowGroupColor } = usePropertiesContext();
21
+ useEffect(() => {
22
+ const visualize = async () => {
23
+ try {
24
+ setIsLoading(true);
25
+ clearEmphasizedOverriddenElements();
26
+ if (showGroupColor) {
27
+ const result = await getHiliteIdsAndKeysetFromGroup(iModelConnection, group, hilitedElementsQueryCache);
28
+ Presentation.selection.clearSelection("GroupingMappingWidget", iModelConnection);
29
+ visualizeElements(result.ids, color);
30
+ await zoomToElements(result.ids);
31
+ }
32
+ }
33
+ catch (error) {
34
+ toaster.negative("There was an error visualizing group.");
35
+ /* eslint-disable no-console */
36
+ console.error(error);
37
+ }
38
+ finally {
39
+ setIsLoading(false);
40
+ }
41
+ };
42
+ void visualize();
43
+ }, [iModelConnection, group.query, group.groupName, group, hilitedElementsQueryCache, showGroupColor, color]);
44
+ return (React.createElement(ToggleSwitch, { label: "Color Group", disabled: isLoading, checked: showGroupColor, onChange: () => setShowGroupColor((b) => !b), ...rest }));
45
+ };
46
+ //# sourceMappingURL=GroupColorToggle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupColorToggle.js","sourceRoot":"","sources":["../../../../src/widget/components/GroupColorToggle.tsx"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEnD,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,EAAE,iCAAiC,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACrG,OAAO,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,8BAA8B,EAAE,MAAM,uCAAuC,CAAC;AACvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AAOjF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAC/B,KAAK,EACL,KAAK,EACL,GAAG,IAAI,EACe,EAAE,EAAE;IAC1B,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAC;IAC3D,MAAM,EAAE,gBAAgB,EAAE,GAAG,2BAA2B,EAAE,CAAC;IAC3D,IAAI,CAAC,gBAAgB,EAAE;QACrB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;KACxE;IACD,MAAM,EAAE,yBAAyB,EAAE,GAAG,8BAA8B,EAAE,CAAC;IACvE,MAAM,EAAE,cAAc,EAAE,iBAAiB,EAAE,GAAG,oBAAoB,EAAE,CAAC;IAErE,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;YAC3B,IAAI;gBACF,YAAY,CAAC,IAAI,CAAC,CAAC;gBACnB,iCAAiC,EAAE,CAAC;gBACpC,IAAI,cAAc,EAAE;oBAClB,MAAM,MAAM,GAAG,MAAM,8BAA8B,CAAC,gBAAgB,EAAE,KAAK,EAAE,yBAAyB,CAAC,CAAC;oBACxG,YAAY,CAAC,SAAS,CAAC,cAAc,CACnC,uBAAuB,EACvB,gBAAgB,CACjB,CAAC;oBACF,iBAAiB,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;oBACrC,MAAM,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;iBAClC;aACF;YAAC,OAAO,KAAK,EAAE;gBACd,OAAO,CAAC,QAAQ,CAAC,uCAAuC,CAAC,CAAC;gBAC1D,+BAA+B;gBAC/B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;aACtB;oBAAS;gBACR,YAAY,CAAC,KAAK,CAAC,CAAC;aACrB;QACH,CAAC,CAAC;QACF,KAAK,SAAS,EAAE,CAAC;IACnB,CAAC,EAAE,CAAC,gBAAgB,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,yBAAyB,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC;IAE9G,OAAO,CACL,oBAAC,YAAY,IACX,KAAK,EAAC,aAAa,EACnB,QAAQ,EAAE,SAAS,EACnB,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KACxC,IAAI,GACM,CACjB,CAAC;AACJ,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 React, { useEffect, useState } from \"react\";\nimport type { ToggleSwitchProps } from \"@itwin/itwinui-react\";\nimport { toaster, ToggleSwitch } from \"@itwin/itwinui-react\";\nimport type { Group } from \"@itwin/insights-client\";\nimport { clearEmphasizedOverriddenElements, visualizeElements, zoomToElements } from \"./viewerUtils\";\nimport { getHiliteIdsAndKeysetFromGroup } from \"./groupsHelpers\";\nimport { Presentation } from \"@itwin/presentation-frontend\";\nimport { useGroupHilitedElementsContext } from \"./context/GroupHilitedElementsContext\";\nimport { usePropertiesContext } from \"./context/PropertiesContext\";\nimport { useGroupingMappingApiConfig } from \"./context/GroupingApiConfigContext\";\n\nexport interface GroupColorToggleProps extends Partial<ToggleSwitchProps> {\n color: string;\n group: Group;\n}\n\nexport const GroupColorToggle = ({\n color,\n group,\n ...rest\n}: GroupColorToggleProps) => {\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const { iModelConnection } = useGroupingMappingApiConfig();\n if (!iModelConnection) {\n throw new Error(\"This component requires an active iModelConnection.\");\n }\n const { hilitedElementsQueryCache } = useGroupHilitedElementsContext();\n const { showGroupColor, setShowGroupColor } = usePropertiesContext();\n\n useEffect(() => {\n const visualize = async () => {\n try {\n setIsLoading(true);\n clearEmphasizedOverriddenElements();\n if (showGroupColor) {\n const result = await getHiliteIdsAndKeysetFromGroup(iModelConnection, group, hilitedElementsQueryCache);\n Presentation.selection.clearSelection(\n \"GroupingMappingWidget\",\n iModelConnection,\n );\n visualizeElements(result.ids, color);\n await zoomToElements(result.ids);\n }\n } catch (error) {\n toaster.negative(\"There was an error visualizing group.\");\n /* eslint-disable no-console */\n console.error(error);\n } finally {\n setIsLoading(false);\n }\n };\n void visualize();\n }, [iModelConnection, group.query, group.groupName, group, hilitedElementsQueryCache, showGroupColor, color]);\n\n return (\n <ToggleSwitch\n label=\"Color Group\"\n disabled={isLoading}\n checked={showGroupColor}\n onChange={() => setShowGroupColor((b) => !b)}\n {...rest}\n ></ToggleSwitch>\n );\n};\n"]}
@@ -0,0 +1,12 @@
1
+ /// <reference types="react" />
2
+ import type { Group } from "@itwin/insights-client";
3
+ import type { ContextCustomUI, GroupingCustomUI } from "./customUI/GroupingMappingCustomUI";
4
+ import type { GroupingProps } from "./Grouping";
5
+ export interface GroupItemProps extends Omit<GroupingProps, "onClickAddGroup"> {
6
+ group: Group;
7
+ groupUIs: GroupingCustomUI[];
8
+ contextUIs: ContextCustomUI[];
9
+ setShowDeleteModal: (showDeleteModal: Group) => void;
10
+ }
11
+ export declare const GroupItem: ({ onClickGroupTitle, disableActions, group, ...rest }: GroupItemProps) => JSX.Element;
12
+ //# sourceMappingURL=GroupItem.d.ts.map
@@ -0,0 +1,12 @@
1
+ import React from "react";
2
+ import { HorizontalTile } from "./HorizontalTile";
3
+ import { GroupMenuActions } from "./GroupMenuActions";
4
+ export const GroupItem = ({ onClickGroupTitle, disableActions, group, ...rest }) => {
5
+ const onTitleClick = () => {
6
+ if (onClickGroupTitle) {
7
+ onClickGroupTitle(group);
8
+ }
9
+ };
10
+ return (React.createElement(HorizontalTile, { title: group.groupName, subText: group.description, actionGroup: React.createElement(GroupMenuActions, { group: group, disableActions: disableActions, ...rest }), onClickTitle: onClickGroupTitle && !disableActions ? onTitleClick : undefined }));
11
+ };
12
+ //# sourceMappingURL=GroupItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupItem.js","sourceRoot":"","sources":["../../../../src/widget/components/GroupItem.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAStD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EACxB,iBAAiB,EACjB,cAAc,EACd,KAAK,EACL,GAAG,IAAI,EACQ,EAAE,EAAE;IAEnB,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,IAAI,iBAAiB,EAAE;YACrB,iBAAiB,CAAC,KAAK,CAAC,CAAC;SAC1B;IACH,CAAC,CAAC;IAEF,OAAO,CACL,oBAAC,cAAc,IACb,KAAK,EAAE,KAAK,CAAC,SAAS,EACtB,OAAO,EAAE,KAAK,CAAC,WAAW,EAC1B,WAAW,EACT,oBAAC,gBAAgB,IACf,KAAK,EAAE,KAAK,EACZ,cAAc,EAAE,cAAc,KAC1B,IAAI,GACR,EAEJ,YAAY,EAAE,iBAAiB,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,GAC7E,CACH,CAAC;AACJ,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 type { Group } from \"@itwin/insights-client\";\nimport React from \"react\";\nimport { HorizontalTile } from \"./HorizontalTile\";\nimport type { ContextCustomUI, GroupingCustomUI } from \"./customUI/GroupingMappingCustomUI\";\nimport type { GroupingProps } from \"./Grouping\";\nimport { GroupMenuActions } from \"./GroupMenuActions\";\n\nexport interface GroupItemProps extends Omit<GroupingProps, \"onClickAddGroup\"> {\n group: Group;\n groupUIs: GroupingCustomUI[];\n contextUIs: ContextCustomUI[];\n setShowDeleteModal: (showDeleteModal: Group) => void;\n}\n\nexport const GroupItem = ({\n onClickGroupTitle,\n disableActions,\n group,\n ...rest\n}: GroupItemProps) => {\n\n const onTitleClick = () => {\n if (onClickGroupTitle) {\n onClickGroupTitle(group);\n }\n };\n\n return (\n <HorizontalTile\n title={group.groupName}\n subText={group.description}\n actionGroup={\n <GroupMenuActions\n group={group}\n disableActions={disableActions}\n {...rest}\n />\n }\n onClickTitle={onClickGroupTitle && !disableActions ? onTitleClick : undefined}\n />\n );\n};\n"]}
@@ -0,0 +1,13 @@
1
+ /// <reference types="react" />
2
+ import type { Group } from "@itwin/insights-client";
3
+ import type { ContextCustomUI, GroupingCustomUI } from "./customUI/GroupingMappingCustomUI";
4
+ import type { GroupingProps } from "./Grouping";
5
+ import "./GroupMenuActions.scss";
6
+ export interface GroupMenuActionsProps extends Omit<GroupingProps, "onClickAddGroup" | "onClickGroupTitle"> {
7
+ group: Group;
8
+ groupUIs: GroupingCustomUI[];
9
+ contextUIs: ContextCustomUI[];
10
+ setShowDeleteModal: (showDeleteModal: Group) => void;
11
+ }
12
+ export declare const GroupMenuActions: ({ mapping, group, actionButtonRenderers, onClickGroupModify, onClickRenderContextCustomUI, groupUIs, contextUIs, disableActions, setShowDeleteModal, }: GroupMenuActionsProps) => JSX.Element;
13
+ //# sourceMappingURL=GroupMenuActions.d.ts.map
@@ -0,0 +1,45 @@
1
+ import { SvgDelete, SvgEdit, SvgMore } from "@itwin/itwinui-icons-react";
2
+ import { DropdownMenu, IconButton, MenuItem } from "@itwin/itwinui-react";
3
+ import React, { useCallback } from "react";
4
+ import { useGroupingMappingApiConfig } from "./context/GroupingApiConfigContext";
5
+ import "./GroupMenuActions.scss";
6
+ export const GroupMenuActions = ({ mapping, group, actionButtonRenderers, onClickGroupModify, onClickRenderContextCustomUI, groupUIs, contextUIs, disableActions, setShowDeleteModal, }) => {
7
+ const { iModelId } = useGroupingMappingApiConfig();
8
+ const onModify = useCallback(async (group, type) => {
9
+ if (!onClickGroupModify)
10
+ return;
11
+ onClickGroupModify(group, type);
12
+ }, [onClickGroupModify]);
13
+ return (React.createElement("div", { className: "gmw-actions" },
14
+ actionButtonRenderers &&
15
+ actionButtonRenderers.map((actionButton, index) => React.createElement(React.Fragment, { key: index }, actionButton({ group }))),
16
+ React.createElement(DropdownMenu, { className: "gmw-action-dropdown", disabled: disableActions, menuItems: (close) => [
17
+ ...(groupUIs.length > 0 && onClickGroupModify
18
+ ? [
19
+ React.createElement(MenuItem, { key: 0, icon: React.createElement(SvgEdit, null), disabled: disableActions, "data-testid": "gmw-context-menu-item", subMenuItems: groupUIs.map((p, index) => (React.createElement(MenuItem, { key: p.name, className: "gmw-menu-item", "data-testid": `gmw-edit-${index}`, onClick: async () => {
20
+ await onModify(group, p.name);
21
+ close();
22
+ }, icon: p.icon }, p.displayLabel))) }, "Edit"),
23
+ ]
24
+ : []),
25
+ ...contextUIs.map((p) => {
26
+ return (React.createElement(MenuItem, { key: p.name, onClick: async () => {
27
+ if (p.uiComponent &&
28
+ onClickRenderContextCustomUI) {
29
+ onClickRenderContextCustomUI(p.uiComponent, group, p.displayLabel);
30
+ }
31
+ if (p.onClick) {
32
+ p.onClick(group, mapping, iModelId);
33
+ }
34
+ close();
35
+ }, icon: p.icon, "data-testid": "gmw-context-menu-item" }, p.displayLabel));
36
+ }),
37
+ React.createElement(MenuItem, { key: 2, onClick: () => {
38
+ setShowDeleteModal(group);
39
+ close();
40
+ }, icon: React.createElement(SvgDelete, null), "data-testid": "gmw-context-menu-item" }, "Remove"),
41
+ ] },
42
+ React.createElement(IconButton, { disabled: disableActions, styleType: "borderless", "data-testid": "gmw-more-button" },
43
+ React.createElement(SvgMore, null)))));
44
+ };
45
+ //# sourceMappingURL=GroupMenuActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupMenuActions.js","sourceRoot":"","sources":["../../../../src/widget/components/GroupMenuActions.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 { SvgDelete, SvgEdit, SvgMore } from \"@itwin/itwinui-icons-react\";\nimport { DropdownMenu, IconButton, MenuItem } from \"@itwin/itwinui-react\";\nimport React, { useCallback } from \"react\";\nimport type { ContextCustomUI, GroupingCustomUI } from \"./customUI/GroupingMappingCustomUI\";\nimport type { GroupingProps } from \"./Grouping\";\nimport { useGroupingMappingApiConfig } from \"./context/GroupingApiConfigContext\";\nimport \"./GroupMenuActions.scss\";\n\nexport interface GroupMenuActionsProps extends Omit<GroupingProps, \"onClickAddGroup\" | \"onClickGroupTitle\"> {\n group: Group;\n groupUIs: GroupingCustomUI[];\n contextUIs: ContextCustomUI[];\n setShowDeleteModal: (showDeleteModal: Group) => void;\n}\n\nexport const GroupMenuActions = ({\n mapping,\n group,\n actionButtonRenderers,\n onClickGroupModify,\n onClickRenderContextCustomUI,\n groupUIs,\n contextUIs,\n disableActions,\n setShowDeleteModal,\n}: GroupMenuActionsProps) => {\n const { iModelId } = useGroupingMappingApiConfig();\n\n const onModify = useCallback(async (group: Group, type: string) => {\n if (!onClickGroupModify) return;\n onClickGroupModify(group, type);\n }, [onClickGroupModify]);\n\n return (\n <div className=\"gmw-actions\">\n {actionButtonRenderers &&\n actionButtonRenderers.map((actionButton, index) =>\n <React.Fragment key={index}>{actionButton({ group })}</React.Fragment>\n )}\n <DropdownMenu\n className=\"gmw-action-dropdown\"\n disabled={disableActions}\n menuItems={(close: () => void) => [\n ...(groupUIs.length > 0 && onClickGroupModify\n ? [\n <MenuItem\n key={0}\n icon={<SvgEdit />}\n disabled={disableActions}\n data-testid=\"gmw-context-menu-item\"\n subMenuItems={groupUIs.map((p, index) => (\n <MenuItem\n key={p.name}\n className=\"gmw-menu-item\"\n data-testid={`gmw-edit-${index}`}\n onClick={async () => {\n await onModify(group, p.name);\n close();\n }}\n icon={p.icon}\n >\n {p.displayLabel}\n </MenuItem>\n ))}\n >\n Edit\n </MenuItem>,\n ]\n : []),\n ...contextUIs.map((p) => {\n return (\n <MenuItem\n key={p.name}\n onClick={async () => {\n if (\n p.uiComponent &&\n onClickRenderContextCustomUI\n ) {\n onClickRenderContextCustomUI(\n p.uiComponent,\n group,\n p.displayLabel\n );\n }\n if (p.onClick) {\n p.onClick(group, mapping, iModelId);\n }\n close();\n }}\n icon={p.icon}\n data-testid=\"gmw-context-menu-item\"\n >\n {p.displayLabel}\n </MenuItem>\n );\n }),\n <MenuItem\n key={2}\n onClick={() => {\n setShowDeleteModal(group);\n close();\n }}\n icon={<SvgDelete />}\n data-testid=\"gmw-context-menu-item\"\n >\n Remove\n </MenuItem>,\n ]}\n >\n <IconButton\n disabled={disableActions}\n styleType=\"borderless\"\n data-testid=\"gmw-more-button\"\n >\n <SvgMore />\n </IconButton>\n </DropdownMenu>\n </div>\n );\n};\n"]}
@@ -0,0 +1,13 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ @import "~@itwin/itwinui-css/scss/variables";
6
+
7
+ .gmw-actions {
8
+ display: flex;
9
+ flex-direction: row;
10
+ .gmw-action-dropdown {
11
+ width: $iui-3xl + $iui-xl;
12
+ }
13
+ }
@@ -4,7 +4,6 @@
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  import { renderToStaticMarkup } from "react-dom/server";
6
6
  import { PropertyValueFormat } from "@itwin/presentation-common";
7
- import { useActiveIModelConnection } from "@itwin/appui-react";
8
7
  import { Alert, Button, Fieldset, IconButton, Label, LabeledInput, LabeledSelect, Modal, ModalButtonBar, Small, Surface, Text, } from "@itwin/itwinui-react";
9
8
  import React, { useCallback, useEffect, useMemo, useState } from "react";
10
9
  import ActionPanel from "./ActionPanel";
@@ -34,8 +33,7 @@ export const quantityTypesSelectionOptions = [
34
33
  { value: QuantityType.Undefined, label: "No Quantity Type" },
35
34
  ];
36
35
  export const GroupPropertyAction = ({ mappingId, group, groupProperty, onSaveSuccess, onClickCancel, }) => {
37
- const iModelConnection = useActiveIModelConnection();
38
- const { getAccessToken, iModelId } = useGroupingMappingApiConfig();
36
+ const { getAccessToken, iModelId, iModelConnection } = useGroupingMappingApiConfig();
39
37
  const mappingClient = useMappingClient();
40
38
  const { hilitedElementsQueryCache } = useGroupHilitedElementsContext();
41
39
  const [propertyName, setPropertyName] = useState("");