@itwin/grouping-mapping-widget 0.6.0 → 0.8.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 (110) hide show
  1. package/README.md +84 -0
  2. package/lib/cjs/grouping-mapping-widget.d.ts +1 -0
  3. package/lib/cjs/grouping-mapping-widget.js +3 -1
  4. package/lib/cjs/grouping-mapping-widget.js.map +1 -1
  5. package/lib/cjs/test/GroupingMappingCustomUI.test.d.ts +2 -0
  6. package/lib/cjs/test/GroupingMappingCustomUI.test.js +162 -0
  7. package/lib/cjs/test/GroupingMappingCustomUI.test.js.map +1 -0
  8. package/lib/cjs/test/WidgetHeader.test.d.ts +2 -0
  9. package/lib/cjs/test/WidgetHeader.test.js +36 -0
  10. package/lib/cjs/test/WidgetHeader.test.js.map +1 -0
  11. package/lib/cjs/test/test-utils.d.ts +72 -0
  12. package/lib/cjs/test/test-utils.js +71 -0
  13. package/lib/cjs/test/test-utils.js.map +1 -0
  14. package/lib/cjs/widget/components/GroupAction.d.ts +2 -1
  15. package/lib/cjs/widget/components/GroupAction.js +82 -75
  16. package/lib/cjs/widget/components/GroupAction.js.map +1 -1
  17. package/lib/cjs/widget/components/GroupAction.scss +1 -13
  18. package/lib/cjs/widget/components/GroupPropertyAction.d.ts +1 -1
  19. package/lib/cjs/widget/components/GroupPropertyAction.js +149 -302
  20. package/lib/cjs/widget/components/GroupPropertyAction.js.map +1 -1
  21. package/lib/cjs/widget/components/GroupPropertyAction.scss +82 -8
  22. package/lib/cjs/widget/components/GroupPropertyUtils.d.ts +21 -0
  23. package/lib/cjs/widget/components/GroupPropertyUtils.js +287 -0
  24. package/lib/cjs/widget/components/GroupPropertyUtils.js.map +1 -0
  25. package/lib/cjs/widget/components/Grouping.d.ts +5 -0
  26. package/lib/cjs/widget/components/Grouping.js +107 -44
  27. package/lib/cjs/widget/components/Grouping.js.map +1 -1
  28. package/lib/cjs/widget/components/Grouping.scss +18 -3
  29. package/lib/cjs/widget/components/GroupingMapping.d.ts +6 -1
  30. package/lib/cjs/widget/components/GroupingMapping.js +22 -9
  31. package/lib/cjs/widget/components/GroupingMapping.js.map +1 -1
  32. package/lib/cjs/widget/components/HorizontalTile.d.ts +5 -3
  33. package/lib/cjs/widget/components/HorizontalTile.js +9 -6
  34. package/lib/cjs/widget/components/HorizontalTile.js.map +1 -1
  35. package/lib/cjs/widget/components/HorizontalTile.scss +46 -22
  36. package/lib/cjs/widget/components/Mapping.scss +4 -5
  37. package/lib/cjs/widget/components/SelectProject.js +2 -0
  38. package/lib/cjs/widget/components/SelectProject.js.map +1 -1
  39. package/lib/cjs/widget/components/SortableHorizontalTile.d.ts +8 -0
  40. package/lib/cjs/widget/components/SortableHorizontalTile.js +51 -0
  41. package/lib/cjs/widget/components/SortableHorizontalTile.js.map +1 -0
  42. package/lib/cjs/widget/components/context/GroupingMappingCustomUIContext.d.ts +6 -0
  43. package/lib/cjs/widget/components/context/GroupingMappingCustomUIContext.js +25 -0
  44. package/lib/cjs/widget/components/context/GroupingMappingCustomUIContext.js.map +1 -0
  45. package/lib/cjs/widget/components/customUI/GroupingMappingCustomUI.d.ts +91 -0
  46. package/lib/cjs/widget/components/customUI/GroupingMappingCustomUI.js +9 -0
  47. package/lib/cjs/widget/components/customUI/GroupingMappingCustomUI.js.map +1 -0
  48. package/lib/cjs/widget/components/customUI/ManualGroupingCustomUI.d.ts +6 -0
  49. package/lib/cjs/widget/components/customUI/ManualGroupingCustomUI.js +31 -0
  50. package/lib/cjs/widget/components/customUI/ManualGroupingCustomUI.js.map +1 -0
  51. package/lib/cjs/widget/components/customUI/ManualGroupingCustomUI.scss +17 -0
  52. package/lib/cjs/widget/components/customUI/SearchGroupingCustomUI.d.ts +6 -0
  53. package/lib/cjs/widget/components/customUI/SearchGroupingCustomUI.js +97 -0
  54. package/lib/cjs/widget/components/customUI/SearchGroupingCustomUI.js.map +1 -0
  55. package/lib/cjs/widget/components/customUI/SearchGroupingCustomUI.scss +17 -0
  56. package/lib/esm/grouping-mapping-widget.d.ts +1 -0
  57. package/lib/esm/grouping-mapping-widget.js +1 -0
  58. package/lib/esm/grouping-mapping-widget.js.map +1 -1
  59. package/lib/esm/test/GroupingMappingCustomUI.test.d.ts +2 -0
  60. package/lib/esm/test/GroupingMappingCustomUI.test.js +138 -0
  61. package/lib/esm/test/GroupingMappingCustomUI.test.js.map +1 -0
  62. package/lib/esm/test/WidgetHeader.test.d.ts +2 -0
  63. package/lib/esm/test/WidgetHeader.test.js +31 -0
  64. package/lib/esm/test/WidgetHeader.test.js.map +1 -0
  65. package/lib/esm/test/test-utils.d.ts +72 -0
  66. package/lib/esm/test/test-utils.js +42 -0
  67. package/lib/esm/test/test-utils.js.map +1 -0
  68. package/lib/esm/widget/components/GroupAction.d.ts +2 -1
  69. package/lib/esm/widget/components/GroupAction.js +85 -78
  70. package/lib/esm/widget/components/GroupAction.js.map +1 -1
  71. package/lib/esm/widget/components/GroupAction.scss +1 -13
  72. package/lib/esm/widget/components/GroupPropertyAction.d.ts +1 -1
  73. package/lib/esm/widget/components/GroupPropertyAction.js +151 -304
  74. package/lib/esm/widget/components/GroupPropertyAction.js.map +1 -1
  75. package/lib/esm/widget/components/GroupPropertyAction.scss +82 -8
  76. package/lib/esm/widget/components/GroupPropertyUtils.d.ts +21 -0
  77. package/lib/esm/widget/components/GroupPropertyUtils.js +280 -0
  78. package/lib/esm/widget/components/GroupPropertyUtils.js.map +1 -0
  79. package/lib/esm/widget/components/Grouping.d.ts +5 -0
  80. package/lib/esm/widget/components/Grouping.js +107 -44
  81. package/lib/esm/widget/components/Grouping.js.map +1 -1
  82. package/lib/esm/widget/components/Grouping.scss +18 -3
  83. package/lib/esm/widget/components/GroupingMapping.d.ts +6 -1
  84. package/lib/esm/widget/components/GroupingMapping.js +23 -10
  85. package/lib/esm/widget/components/GroupingMapping.js.map +1 -1
  86. package/lib/esm/widget/components/HorizontalTile.d.ts +5 -3
  87. package/lib/esm/widget/components/HorizontalTile.js +9 -6
  88. package/lib/esm/widget/components/HorizontalTile.js.map +1 -1
  89. package/lib/esm/widget/components/HorizontalTile.scss +46 -22
  90. package/lib/esm/widget/components/Mapping.scss +4 -5
  91. package/lib/esm/widget/components/SelectProject.js +2 -0
  92. package/lib/esm/widget/components/SelectProject.js.map +1 -1
  93. package/lib/esm/widget/components/SortableHorizontalTile.d.ts +8 -0
  94. package/lib/esm/widget/components/SortableHorizontalTile.js +30 -0
  95. package/lib/esm/widget/components/SortableHorizontalTile.js.map +1 -0
  96. package/lib/esm/widget/components/context/GroupingMappingCustomUIContext.d.ts +6 -0
  97. package/lib/esm/widget/components/context/GroupingMappingCustomUIContext.js +20 -0
  98. package/lib/esm/widget/components/context/GroupingMappingCustomUIContext.js.map +1 -0
  99. package/lib/esm/widget/components/customUI/GroupingMappingCustomUI.d.ts +91 -0
  100. package/lib/esm/widget/components/customUI/GroupingMappingCustomUI.js +6 -0
  101. package/lib/esm/widget/components/customUI/GroupingMappingCustomUI.js.map +1 -0
  102. package/lib/esm/widget/components/customUI/ManualGroupingCustomUI.d.ts +6 -0
  103. package/lib/esm/widget/components/customUI/ManualGroupingCustomUI.js +26 -0
  104. package/lib/esm/widget/components/customUI/ManualGroupingCustomUI.js.map +1 -0
  105. package/lib/esm/widget/components/customUI/ManualGroupingCustomUI.scss +17 -0
  106. package/lib/esm/widget/components/customUI/SearchGroupingCustomUI.d.ts +6 -0
  107. package/lib/esm/widget/components/customUI/SearchGroupingCustomUI.js +92 -0
  108. package/lib/esm/widget/components/customUI/SearchGroupingCustomUI.js.map +1 -0
  109. package/lib/esm/widget/components/customUI/SearchGroupingCustomUI.scss +17 -0
  110. package/package.json +24 -5
@@ -3,6 +3,11 @@ import type { CreateTypeFromInterface } from "../utils";
3
3
  import "./Grouping.scss";
4
4
  import type { Group, Mapping } from "@itwin/insights-client";
5
5
  export declare type IGroupTyped = CreateTypeFromInterface<Group>;
6
+ export declare const defaultUIMetadata: {
7
+ name: string;
8
+ displayLabel: string;
9
+ icon: JSX.Element;
10
+ }[];
6
11
  interface GroupsTreeProps {
7
12
  mapping: Mapping;
8
13
  goBack: () => Promise<void>;
@@ -22,7 +22,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
22
22
  return (mod && mod.__esModule) ? mod : { "default": mod };
23
23
  };
24
24
  Object.defineProperty(exports, "__esModule", { value: true });
25
- exports.Groupings = void 0;
25
+ exports.Groupings = exports.defaultUIMetadata = void 0;
26
26
  /*---------------------------------------------------------------------------------------------
27
27
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
28
28
  * See LICENSE.md in the project root for license terms and full copyright notice.
@@ -41,12 +41,33 @@ const MappingClientContext_1 = require("./context/MappingClientContext");
41
41
  const core_common_1 = require("@itwin/core-common");
42
42
  const HorizontalTile_1 = require("./HorizontalTile");
43
43
  const GroupingApiConfigContext_1 = require("./context/GroupingApiConfigContext");
44
+ const GroupingMappingCustomUIContext_1 = require("./context/GroupingMappingCustomUIContext");
45
+ const GroupingMappingCustomUI_1 = require("./customUI/GroupingMappingCustomUI");
46
+ const presentation_frontend_1 = require("@itwin/presentation-frontend");
47
+ exports.defaultUIMetadata = [
48
+ {
49
+ name: "Selection",
50
+ displayLabel: "Selection",
51
+ icon: react_1.default.createElement(itwinui_icons_react_1.SvgCursor, null),
52
+ },
53
+ {
54
+ name: "Search",
55
+ displayLabel: "Query Keywords",
56
+ icon: react_1.default.createElement(itwinui_icons_react_1.SvgSearch, null),
57
+ },
58
+ {
59
+ name: "Manual",
60
+ displayLabel: "Manual Query",
61
+ icon: react_1.default.createElement(itwinui_icons_react_1.SvgDraw, null),
62
+ },
63
+ ];
44
64
  var GroupsView;
45
65
  (function (GroupsView) {
46
- GroupsView["GROUPS"] = "groups";
47
- GroupsView["MODIFYING"] = "modifying";
48
- GroupsView["ADD"] = "ADD";
49
- GroupsView["PROPERTIES"] = "properties";
66
+ GroupsView[GroupsView["Add"] = 0] = "Add";
67
+ GroupsView[GroupsView["Groups"] = 1] = "Groups";
68
+ GroupsView[GroupsView["CustomUI"] = 2] = "CustomUI";
69
+ GroupsView[GroupsView["Modifying"] = 3] = "Modifying";
70
+ GroupsView[GroupsView["Properties"] = 4] = "Properties";
50
71
  })(GroupsView || (GroupsView = {}));
51
72
  const goldenAngle = 180 * (3 - Math.sqrt(5));
52
73
  const fetchGroups = async (setGroups, iModelId, mappingId, setIsLoading, getAccessToken, mappingsClient) => {
@@ -71,15 +92,21 @@ const Groupings = ({ mapping, goBack }) => {
71
92
  const { getAccessToken } = GroupingApiConfigContext_1.useGroupingMappingApiConfig();
72
93
  const mappingClient = MappingClientContext_1.useMappingClient();
73
94
  const iModelId = (_a = appui_react_1.useActiveIModelConnection()) === null || _a === void 0 ? void 0 : _a.iModelId;
95
+ const groupUIs = GroupingMappingCustomUIContext_1.useGroupingMappingCustomUI()
96
+ .filter((p) => p.type === GroupingMappingCustomUI_1.GroupingMappingCustomUIType.Grouping);
97
+ const contextUIs = GroupingMappingCustomUIContext_1.useGroupingMappingCustomUI()
98
+ .filter((p) => p.type === GroupingMappingCustomUI_1.GroupingMappingCustomUIType.Context);
74
99
  const [showDeleteModal, setShowDeleteModal] = react_1.useState(false);
75
100
  const [isLoading, setIsLoading] = react_1.useState(true);
76
- const [groupsView, setGroupsView] = react_1.useState(GroupsView.GROUPS);
101
+ const [groupsView, setGroupsView] = react_1.useState(GroupsView.Groups);
77
102
  const [selectedGroup, setSelectedGroup] = react_1.useState(undefined);
78
103
  const hilitedElements = react_1.useRef(new Map());
79
104
  const [isLoadingQuery, setLoadingQuery] = react_1.useState(false);
80
105
  const [groups, setGroups] = react_1.useState([]);
81
106
  const [hiddenGroupsIds, setHiddenGroupsIds] = react_1.useState([]);
82
107
  const [showGroupColor, setShowGroupColor] = react_1.useState(false);
108
+ const [queryGenerationType, setQueryGenerationType] = react_1.useState("Selection");
109
+ const [selectedContextCustomUI, setSelectedContextCustomUI] = react_1.useState(undefined);
83
110
  react_1.useEffect(() => {
84
111
  void fetchGroups(setGroups, iModelId, mapping.id, setIsLoading, getAccessToken, mappingClient);
85
112
  }, [getAccessToken, mappingClient, iModelId, mapping.id, setIsLoading]);
@@ -167,13 +194,15 @@ const Groupings = ({ mapping, goBack }) => {
167
194
  hiddenIds = hiddenIds.filter((id) => !viewIds.includes(id));
168
195
  viewerUtils_1.hideElements(hiddenIds);
169
196
  }, [groups, hiddenGroupsIds, getHiliteIdsFromGroups]);
170
- const addGroup = () => {
197
+ const addGroup = (type) => {
198
+ setQueryGenerationType(type);
171
199
  viewerUtils_1.clearEmphasizedElements();
172
- setGroupsView(GroupsView.ADD);
200
+ setGroupsView(GroupsView.Add);
173
201
  };
174
- const onModify = async (group) => {
202
+ const onModify = async (group, type) => {
203
+ setQueryGenerationType(type);
175
204
  setSelectedGroup(group);
176
- setGroupsView(GroupsView.MODIFYING);
205
+ setGroupsView(GroupsView.Modifying);
177
206
  if (group.id && hiddenGroupsIds.includes(group.id)) {
178
207
  await showGroup(group);
179
208
  setHiddenGroupsIds(hiddenGroupsIds.filter((id) => id !== group.id));
@@ -182,15 +211,16 @@ const Groupings = ({ mapping, goBack }) => {
182
211
  };
183
212
  const openProperties = async (group) => {
184
213
  setSelectedGroup(group);
185
- setGroupsView(GroupsView.PROPERTIES);
214
+ setGroupsView(GroupsView.Properties);
186
215
  if (group.id && hiddenGroupsIds.includes(group.id)) {
187
216
  await showGroup(group);
188
217
  setHiddenGroupsIds(hiddenGroupsIds.filter((id) => id !== group.id));
189
218
  }
190
219
  };
191
220
  const refresh = react_1.useCallback(async () => {
192
- setGroupsView(GroupsView.GROUPS);
221
+ setGroupsView(GroupsView.Groups);
193
222
  setSelectedGroup(undefined);
223
+ setSelectedContextCustomUI(undefined);
194
224
  setGroups([]);
195
225
  const groups = await fetchGroups(setGroups, iModelId, mapping.id, setIsLoading, getAccessToken, mappingClient);
196
226
  if (groups) {
@@ -246,72 +276,105 @@ const Groupings = ({ mapping, goBack }) => {
246
276
  }
247
277
  }, [groups, visualizeGroupColors, setShowGroupColor]);
248
278
  const propertyMenuGoBack = react_1.useCallback(async () => {
249
- setGroupsView(GroupsView.GROUPS);
279
+ setGroupsView(GroupsView.Groups);
250
280
  await refresh();
251
281
  }, [refresh]);
252
282
  switch (groupsView) {
253
- case GroupsView.ADD:
254
- return (react_1.default.createElement(GroupAction_1.default, { iModelId: iModelId, mappingId: mapping.id, goBack: async () => {
255
- setGroupsView(GroupsView.GROUPS);
283
+ case GroupsView.Add:
284
+ return (react_1.default.createElement(GroupAction_1.default, { iModelId: iModelId, mappingId: mapping.id, queryGenerationType: queryGenerationType, goBack: async () => {
285
+ setGroupsView(GroupsView.Groups);
256
286
  await refresh();
257
287
  }, resetView: resetView }));
258
- case GroupsView.MODIFYING:
259
- return selectedGroup ? (react_1.default.createElement(GroupAction_1.default, { iModelId: iModelId, mappingId: mapping.id, group: selectedGroup, goBack: async () => {
260
- setGroupsView(GroupsView.GROUPS);
288
+ case GroupsView.Modifying:
289
+ return selectedGroup ? (react_1.default.createElement(GroupAction_1.default, { iModelId: iModelId, mappingId: mapping.id, group: selectedGroup, queryGenerationType: queryGenerationType, goBack: async () => {
290
+ setGroupsView(GroupsView.Groups);
261
291
  await refresh();
262
292
  }, resetView: resetView })) : null;
263
- case GroupsView.PROPERTIES:
293
+ case GroupsView.Properties:
264
294
  return selectedGroup ? (react_1.default.createElement(PropertyMenu_1.PropertyMenu, { iModelId: iModelId, mappingId: mapping.id, group: selectedGroup, goBack: propertyMenuGoBack })) : null;
265
- default:
295
+ case GroupsView.Groups:
266
296
  return (react_1.default.createElement(react_1.default.Fragment, null,
267
297
  react_1.default.createElement(utils_1.WidgetHeader, { title: mapping.mappingName, disabled: isLoading || isLoadingQuery, returnFn: async () => {
268
298
  viewerUtils_1.clearEmphasizedOverriddenElements();
269
299
  await goBack();
270
300
  } }),
271
- react_1.default.createElement(itwinui_react_1.Surface, { className: "gmw-groups-container" },
272
- react_1.default.createElement("div", { className: "gmw-toolbar" },
273
- react_1.default.createElement(itwinui_react_1.Button, { className: "add-load-button", startIcon: isLoadingQuery ? (react_1.default.createElement(itwinui_react_1.ProgressRadial, { size: "small", indeterminate: true })) : (react_1.default.createElement(itwinui_icons_react_1.SvgAdd, null)), styleType: "high-visibility", disabled: isLoadingQuery, onClick: addGroup }, isLoadingQuery ? "Loading" : "Add Group"),
274
- react_1.default.createElement(itwinui_react_1.ButtonGroup, { className: "gmw-toolbar-buttons" },
275
- react_1.default.createElement(itwinui_react_1.ToggleSwitch, { label: "Color by Group", labelPosition: "left", className: "gmw-toggle", disabled: isLoadingQuery, checked: showGroupColor, onChange: toggleGroupColor }),
276
- react_1.default.createElement(itwinui_react_1.IconButton, { title: "Show All", onClick: showAll, disabled: isLoadingQuery, styleType: "borderless", className: "gmw-group-view-icon" },
301
+ react_1.default.createElement(itwinui_react_1.Surface, { className: 'gmw-groups-container' },
302
+ react_1.default.createElement("div", { className: 'gmw-toolbar' },
303
+ react_1.default.createElement(itwinui_react_1.DropdownMenu, { className: 'gmw-custom-ui-dropdown', disabled: isLoadingQuery, menuItems: () => (groupUIs.length > 0
304
+ ? groupUIs
305
+ : exports.defaultUIMetadata)
306
+ .map((p, index) => (react_1.default.createElement(itwinui_react_1.MenuItem, { key: index, onClick: () => addGroup(p.name), icon: p.icon, className: 'gmw-menu-item', "data-testid": `gmw-add-${index}` }, p.displayLabel))) },
307
+ react_1.default.createElement(itwinui_react_1.Button, { "data-testid": "gmw-add-group-button", className: 'add-load-button', startIcon: isLoadingQuery ? (react_1.default.createElement(itwinui_react_1.ProgressRadial, { size: 'small', indeterminate: true })) : (react_1.default.createElement(itwinui_icons_react_1.SvgAdd, null)), styleType: 'high-visibility', disabled: isLoadingQuery }, isLoadingQuery ? "Loading" : "Add Group")),
308
+ react_1.default.createElement(itwinui_react_1.ButtonGroup, { className: 'gmw-toolbar-buttons' },
309
+ react_1.default.createElement(itwinui_react_1.ToggleSwitch, { label: 'Color by Group', labelPosition: 'left', className: 'gmw-toggle', disabled: isLoadingQuery, checked: showGroupColor, onChange: toggleGroupColor }),
310
+ react_1.default.createElement(itwinui_react_1.IconButton, { title: 'Show All', onClick: showAll, disabled: isLoadingQuery, styleType: 'borderless', className: 'gmw-group-view-icon' },
277
311
  react_1.default.createElement(itwinui_icons_react_1.SvgVisibilityShow, null)),
278
- react_1.default.createElement(itwinui_react_1.IconButton, { title: "Hide All", onClick: hideAll, disabled: isLoadingQuery, styleType: "borderless", className: "gmw-group-view-icon" },
312
+ react_1.default.createElement(itwinui_react_1.IconButton, { title: 'Hide All', onClick: hideAll, disabled: isLoadingQuery, styleType: 'borderless', className: 'gmw-group-view-icon' },
279
313
  react_1.default.createElement(itwinui_icons_react_1.SvgVisibilityHide, null)))),
280
- isLoading ? (react_1.default.createElement(utils_1.LoadingOverlay, null)) : groups.length === 0 ? (react_1.default.createElement(utils_1.EmptyMessage, { message: "No Groups available." })) : (react_1.default.createElement("div", { className: "gmw-group-list" }, groups
281
- .sort((a, b) => { var _a; return (_a = a.groupName.localeCompare(b.groupName)) !== null && _a !== void 0 ? _a : 1; })
282
- .map((g) => (react_1.default.createElement(HorizontalTile_1.HorizontalTile, { key: g.id, title: g.groupName ? g.groupName : "Untitled", subText: g.description, actionGroup: react_1.default.createElement("div", { className: "gmw-actions" },
283
- showGroupColor && (react_1.default.createElement(itwinui_react_1.IconButton, { styleType: "borderless", className: "gmw-group-view-icon" },
314
+ isLoading ? (react_1.default.createElement(utils_1.LoadingOverlay, null)) : groups.length === 0 ? (react_1.default.createElement(utils_1.EmptyMessage, { message: 'No Groups available.' })) : (react_1.default.createElement("div", { className: 'gmw-group-list' }, groups
315
+ .sort((a, b) => { var _a, _b, _c; return (_c = (_a = a.groupName) === null || _a === void 0 ? void 0 : _a.localeCompare((_b = b.groupName) !== null && _b !== void 0 ? _b : "")) !== null && _c !== void 0 ? _c : 1; })
316
+ .map((g) => (react_1.default.createElement(HorizontalTile_1.HorizontalTile, { key: g.id, title: g.groupName ? g.groupName : "Untitled", subText: g.description, actionGroup: react_1.default.createElement("div", { className: 'gmw-actions' },
317
+ showGroupColor && (react_1.default.createElement(itwinui_react_1.IconButton, { styleType: 'borderless', className: 'gmw-group-view-icon' },
284
318
  react_1.default.createElement("div", { className: "gmw-color-legend", style: {
285
319
  backgroundColor: getGroupColor(groups.findIndex((group) => g.id === group.id)),
286
320
  } }))),
287
- g.id && hiddenGroupsIds.includes(g.id) ? (react_1.default.createElement(itwinui_react_1.IconButton, { disabled: isLoadingQuery, styleType: "borderless", className: "gmw-group-view-icon", onClick: async () => {
321
+ g.id && hiddenGroupsIds.includes(g.id) ? (react_1.default.createElement(itwinui_react_1.IconButton, { disabled: isLoadingQuery, styleType: 'borderless', className: 'gmw-group-view-icon', onClick: async () => {
288
322
  await showGroup(g);
289
323
  setHiddenGroupsIds(hiddenGroupsIds.filter((id) => g.id !== id));
290
324
  } },
291
- react_1.default.createElement(itwinui_icons_react_1.SvgVisibilityHide, null))) : (react_1.default.createElement(itwinui_react_1.IconButton, { disabled: isLoadingQuery, styleType: "borderless", className: "gmw-group-view-icon", onClick: async () => {
325
+ react_1.default.createElement(itwinui_icons_react_1.SvgVisibilityHide, null))) : (react_1.default.createElement(itwinui_react_1.IconButton, { disabled: isLoadingQuery, styleType: 'borderless', className: 'gmw-group-view-icon', onClick: async () => {
292
326
  await hideGroups([g]);
293
327
  setHiddenGroupsIds(hiddenGroupsIds.concat(g.id ? [g.id] : []));
294
328
  } },
295
329
  react_1.default.createElement(itwinui_icons_react_1.SvgVisibilityShow, null))),
296
- react_1.default.createElement(itwinui_react_1.DropdownMenu, { disabled: isLoadingQuery, menuItems: (close) => [
297
- react_1.default.createElement(itwinui_react_1.MenuItem, { key: 0, onClick: async () => onModify(g), icon: react_1.default.createElement(itwinui_icons_react_1.SvgEdit, null) }, "Modify"),
298
- react_1.default.createElement(itwinui_react_1.MenuItem, { key: 1, onClick: async () => openProperties(g), icon: react_1.default.createElement(itwinui_icons_react_1.SvgList, null) }, "Properties"),
330
+ react_1.default.createElement(itwinui_react_1.DropdownMenu, { className: 'gmw-custom-ui-dropdown', disabled: isLoadingQuery, menuItems: (close) => [
331
+ react_1.default.createElement(itwinui_react_1.MenuItem, { key: 0, icon: react_1.default.createElement(itwinui_icons_react_1.SvgEdit, null), disabled: isLoadingQuery, "data-testid": "gmw-context-menu-item", subMenuItems: (groupUIs.length > 0
332
+ ? groupUIs
333
+ : exports.defaultUIMetadata)
334
+ .map((p, index) => (react_1.default.createElement(itwinui_react_1.MenuItem, { key: index, className: 'gmw-menu-item', "data-testid": `gmw-edit-${index}`, onClick: async () => onModify(g, p.name), icon: p.icon }, p.displayLabel))) }, "Edit"),
335
+ react_1.default.createElement(itwinui_react_1.MenuItem, { key: 1, onClick: async () => openProperties(g), icon: react_1.default.createElement(itwinui_icons_react_1.SvgList, null), "data-testid": "gmw-context-menu-item" }, "Properties"),
299
336
  react_1.default.createElement(itwinui_react_1.MenuItem, { key: 2, onClick: () => {
300
337
  setSelectedGroup(g);
301
338
  setShowDeleteModal(true);
302
339
  close();
303
- }, icon: react_1.default.createElement(itwinui_icons_react_1.SvgDelete, null) }, "Remove"),
304
- ] },
305
- react_1.default.createElement(itwinui_react_1.IconButton, { disabled: isLoadingQuery, styleType: "borderless" },
306
- react_1.default.createElement(itwinui_icons_react_1.SvgMore, { style: {
307
- width: "16px",
308
- height: "16px",
309
- } })))), onClickTitle: isLoadingQuery ? undefined : async () => openProperties(g) })))))),
340
+ }, icon: react_1.default.createElement(itwinui_icons_react_1.SvgDelete, null), "data-testid": "gmw-context-menu-item" }, "Remove"),
341
+ ].concat(contextUIs.map((p) => {
342
+ return react_1.default.createElement(itwinui_react_1.MenuItem, { key: p.name, onClick: () => {
343
+ if (p.uiComponent) {
344
+ setSelectedGroup(g);
345
+ setSelectedContextCustomUI(p);
346
+ setGroupsView(GroupsView.CustomUI);
347
+ }
348
+ if (p.onClick) {
349
+ p.onClick(g.id, mapping.id, iModelId);
350
+ }
351
+ close();
352
+ }, icon: p.icon, "data-testid": "gmw-context-menu-item" }, p.displayLabel);
353
+ })) },
354
+ react_1.default.createElement(itwinui_react_1.IconButton, { disabled: isLoadingQuery, styleType: 'borderless', "data-testid": "gmw-more-button" },
355
+ react_1.default.createElement(itwinui_icons_react_1.SvgMore, null)))), onClickTitle: isLoadingQuery
356
+ ? undefined
357
+ : async () => openProperties(g) })))))),
310
358
  react_1.default.createElement(DeleteModal_1.default, { entityName: (_b = selectedGroup === null || selectedGroup === void 0 ? void 0 : selectedGroup.groupName) !== null && _b !== void 0 ? _b : "", show: showDeleteModal, setShow: setShowDeleteModal, onDelete: async () => {
311
359
  var _a;
312
360
  const accessToken = await getAccessToken();
313
361
  await mappingClient.deleteGroup(accessToken, iModelId, mapping.id, (_a = selectedGroup === null || selectedGroup === void 0 ? void 0 : selectedGroup.id) !== null && _a !== void 0 ? _a : "");
314
362
  }, refresh: refresh })));
363
+ case GroupsView.CustomUI:
364
+ return selectedContextCustomUI && selectedContextCustomUI.uiComponent && selectedGroup
365
+ ? (react_1.default.createElement(react_1.default.Fragment, null,
366
+ react_1.default.createElement(utils_1.WidgetHeader, { title: selectedContextCustomUI.displayLabel, returnFn: async () => {
367
+ presentation_frontend_1.Presentation.selection.clearSelection("GroupingMappingWidget", iModelConnection);
368
+ await refresh();
369
+ } }),
370
+ react_1.default.createElement(selectedContextCustomUI.uiComponent, {
371
+ iModelId,
372
+ mappingId: mapping.id,
373
+ groupId: selectedGroup.id,
374
+ })))
375
+ : null;
376
+ default:
377
+ return (react_1.default.createElement(utils_1.EmptyMessage, { message: "No given group view" }));
315
378
  }
316
379
  };
317
380
  exports.Groupings = Groupings;
@@ -1 +1 @@
1
- {"version":3,"file":"Grouping.js","sourceRoot":"","sources":["../../../../src/widget/components/Grouping.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 { useActiveIModelConnection } from \"@itwin/appui-react\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { CreateTypeFromInterface } from \"../utils\";\nimport {\n Button,\n ButtonGroup,\n DropdownMenu,\n IconButton,\n MenuItem,\n ProgressRadial,\n Surface,\n toaster,\n ToggleSwitch,\n} from \"@itwin/itwinui-react\";\nimport {\n SvgAdd,\n SvgDelete,\n SvgEdit,\n SvgList,\n SvgMore,\n SvgVisibilityHide,\n SvgVisibilityShow,\n} from \"@itwin/itwinui-icons-react\";\nimport DeleteModal from \"./DeleteModal\";\nimport \"./Grouping.scss\";\nimport type { IModelConnection } from \"@itwin/core-frontend\";\nimport { PropertyMenu } from \"./PropertyMenu\";\nimport {\n clearEmphasizedElements,\n clearEmphasizedOverriddenElements,\n clearHiddenElements,\n clearOverriddenElements,\n emphasizeElements,\n getHiliteIds,\n hideElements,\n hideElementsByQuery,\n overrideElements,\n zoomToElements,\n} from \"./viewerUtils\";\nimport {\n EmptyMessage,\n handleError,\n LoadingOverlay,\n WidgetHeader,\n} from \"./utils\";\nimport GroupAction from \"./GroupAction\";\nimport type { Group, IMappingsClient, Mapping } from \"@itwin/insights-client\";\nimport { useMappingClient } from \"./context/MappingClientContext\";\nimport { FeatureOverrideType } from \"@itwin/core-common\";\nimport { HorizontalTile } from \"./HorizontalTile\";\nimport type { GetAccessTokenFn } from \"./context/GroupingApiConfigContext\";\nimport { useGroupingMappingApiConfig } from \"./context/GroupingApiConfigContext\";\n\nexport type IGroupTyped = CreateTypeFromInterface<Group>;\n\nenum GroupsView {\n GROUPS = \"groups\",\n MODIFYING = \"modifying\",\n ADD = \"ADD\",\n PROPERTIES = \"properties\",\n}\n\ninterface GroupsTreeProps {\n mapping: Mapping;\n goBack: () => Promise<void>;\n}\n\nconst goldenAngle = 180 * (3 - Math.sqrt(5));\n\nconst fetchGroups = async (\n setGroups: React.Dispatch<React.SetStateAction<IGroupTyped[]>>,\n iModelId: string,\n mappingId: string,\n setIsLoading: React.Dispatch<React.SetStateAction<boolean>>,\n getAccessToken: GetAccessTokenFn,\n mappingsClient: IMappingsClient,\n): Promise<Group[] | undefined> => {\n try {\n setIsLoading(true);\n const accessToken = await getAccessToken();\n const groups = await mappingsClient.getGroups(\n accessToken,\n iModelId,\n mappingId,\n );\n setGroups(groups);\n return groups;\n } catch (error: any) {\n handleError(error.status);\n } finally {\n setIsLoading(false);\n }\n return undefined;\n};\n\nexport const Groupings = ({ mapping, goBack }: GroupsTreeProps) => {\n const iModelConnection = useActiveIModelConnection() as IModelConnection;\n const { getAccessToken } = useGroupingMappingApiConfig();\n const mappingClient = useMappingClient();\n const iModelId = useActiveIModelConnection()?.iModelId as string;\n const [showDeleteModal, setShowDeleteModal] = useState<boolean>(false);\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [groupsView, setGroupsView] = useState<GroupsView>(GroupsView.GROUPS);\n const [selectedGroup, setSelectedGroup] = useState<IGroupTyped | undefined>(\n undefined,\n );\n const hilitedElements = useRef<Map<string, string[]>>(new Map());\n const [isLoadingQuery, setLoadingQuery] = useState<boolean>(false);\n const [groups, setGroups] = useState<Group[]>([]);\n const [hiddenGroupsIds, setHiddenGroupsIds] = useState<string[]>([]);\n const [showGroupColor, setShowGroupColor] = useState<boolean>(false);\n\n useEffect(() => {\n void fetchGroups(\n setGroups,\n iModelId,\n mapping.id,\n setIsLoading,\n getAccessToken,\n mappingClient,\n );\n }, [getAccessToken, mappingClient, iModelId, mapping.id, setIsLoading]);\n\n const getGroupColor = function (index: number) {\n return `hsl(${index * goldenAngle + 60}, 100%, 50%)`;\n };\n\n const getHiliteIdsFromGroups = useCallback(\n async (groups: Group[]) => {\n let allIds: string[] = [];\n for (const group of groups) {\n const query = group.query;\n let currentIds: string[] = [];\n if (hilitedElements.current.has(query)) {\n currentIds = hilitedElements.current.get(query) ?? [];\n } else {\n try {\n const queryRowCount = await iModelConnection.queryRowCount(query);\n if (queryRowCount === 0) {\n toaster.warning(\n `${group.groupName}'s query is valid but produced no results.`,\n );\n }\n currentIds = await getHiliteIds(query, iModelConnection);\n hilitedElements.current.set(query, currentIds);\n } catch {\n toaster.negative(\n `Could not hide/show ${group.groupName}. Query could not be resolved.`,\n );\n }\n }\n allIds = allIds.concat(currentIds);\n }\n return allIds;\n },\n [iModelConnection, hilitedElements],\n );\n\n const visualizeGroupColors = useCallback(\n async (viewGroups: Group[]) => {\n setLoadingQuery(true);\n clearEmphasizedOverriddenElements();\n let allIds: string[] = [];\n for (const group of viewGroups) {\n const index =\n viewGroups.length > groups.length\n ? viewGroups.findIndex((g) => g.id === group.id)\n : groups.findIndex((g) => g.id === group.id);\n const hilitedIds = await getHiliteIdsFromGroups([group]);\n overrideElements(\n hilitedIds,\n getGroupColor(index),\n FeatureOverrideType.ColorAndAlpha,\n );\n emphasizeElements(hilitedIds, undefined);\n if (!hiddenGroupsIds.includes(group.id)) {\n allIds = allIds.concat(hilitedIds);\n }\n }\n\n await zoomToElements(allIds);\n setLoadingQuery(false);\n },\n [groups, hiddenGroupsIds, getHiliteIdsFromGroups],\n );\n\n const hideGroups = useCallback(\n async (viewGroups: Group[]) => {\n setLoadingQuery(true);\n for (const viewGroup of viewGroups) {\n const query = viewGroup.query;\n if (hilitedElements.current.has(query)) {\n const hilitedIds = hilitedElements.current.get(query) ?? [];\n hideElements(hilitedIds);\n } else {\n try {\n const queryRowCount = await iModelConnection.queryRowCount(query);\n if (queryRowCount === 0) {\n toaster.warning(\n `${viewGroup.groupName}'s query is valid but produced no results.`,\n );\n }\n const hiliteIds = await hideElementsByQuery(\n query,\n iModelConnection,\n false,\n );\n hilitedElements.current.set(query, hiliteIds);\n } catch {\n toaster.negative(\n `Could not hide/show ${viewGroup.groupName}. Query could not be resolved.`,\n );\n }\n }\n }\n setLoadingQuery(false);\n },\n [iModelConnection],\n );\n\n const showGroup = useCallback(\n async (viewGroup: Group) => {\n clearHiddenElements();\n\n // hide group Ids filter\n const newHiddenGroups: Group[] = hiddenGroupsIds\n .map((id) => groups.find((g) => g.id === id))\n .filter((g): g is Group => !!g && g.id !== viewGroup.id);\n\n // view group Ids filter\n const viewIds = await getHiliteIdsFromGroups(\n groups.filter((g) => !newHiddenGroups.find((hg) => hg.id === g.id)),\n );\n let hiddenIds = await getHiliteIdsFromGroups(newHiddenGroups);\n hiddenIds = hiddenIds.filter((id) => !viewIds.includes(id));\n hideElements(hiddenIds);\n },\n [groups, hiddenGroupsIds, getHiliteIdsFromGroups],\n );\n\n const addGroup = () => {\n clearEmphasizedElements();\n setGroupsView(GroupsView.ADD);\n };\n\n const onModify = async (group: Group) => {\n setSelectedGroup(group);\n setGroupsView(GroupsView.MODIFYING);\n if (group.id && hiddenGroupsIds.includes(group.id)) {\n await showGroup(group);\n setHiddenGroupsIds(hiddenGroupsIds.filter((id) => id !== group.id));\n }\n clearEmphasizedElements();\n };\n\n const openProperties = async (group: Group) => {\n setSelectedGroup(group);\n setGroupsView(GroupsView.PROPERTIES);\n if (group.id && hiddenGroupsIds.includes(group.id)) {\n await showGroup(group);\n setHiddenGroupsIds(hiddenGroupsIds.filter((id) => id !== group.id));\n }\n };\n\n const refresh = useCallback(async () => {\n setGroupsView(GroupsView.GROUPS);\n setSelectedGroup(undefined);\n setGroups([]);\n const groups = await fetchGroups(\n setGroups,\n iModelId,\n mapping.id,\n setIsLoading,\n getAccessToken,\n mappingClient,\n );\n if (groups) {\n if (showGroupColor) {\n await visualizeGroupColors(groups);\n } else {\n clearEmphasizedOverriddenElements();\n }\n }\n }, [\n getAccessToken,\n mappingClient,\n iModelId,\n mapping.id,\n setGroups,\n showGroupColor,\n visualizeGroupColors,\n ]);\n\n const resetView = async () => {\n if (groups) {\n if (showGroupColor) {\n await visualizeGroupColors(groups);\n } else {\n clearOverriddenElements();\n }\n clearEmphasizedElements();\n }\n };\n\n const showAll = async () => {\n setLoadingQuery(true);\n\n clearHiddenElements();\n setHiddenGroupsIds([]);\n const allIds = await getHiliteIdsFromGroups(groups);\n await zoomToElements(allIds);\n\n setLoadingQuery(false);\n };\n\n const hideAll = useCallback(async () => {\n await hideGroups(groups);\n setHiddenGroupsIds(\n groups.map((g) => g.id).filter((id): id is string => !!id),\n );\n const allIds = await getHiliteIdsFromGroups(groups);\n await zoomToElements(allIds);\n }, [setHiddenGroupsIds, groups, hideGroups, getHiliteIdsFromGroups]);\n\n const toggleGroupColor = useCallback(\n async (e: any) => {\n if (e.target.checked) {\n await visualizeGroupColors(groups);\n setShowGroupColor(true);\n } else {\n clearEmphasizedOverriddenElements();\n setShowGroupColor(false);\n }\n },\n [groups, visualizeGroupColors, setShowGroupColor],\n );\n\n const propertyMenuGoBack = useCallback(async () => {\n setGroupsView(GroupsView.GROUPS);\n await refresh();\n }, [refresh]);\n\n switch (groupsView) {\n case GroupsView.ADD:\n return (\n <GroupAction\n iModelId={iModelId}\n mappingId={mapping.id}\n goBack={async () => {\n setGroupsView(GroupsView.GROUPS);\n await refresh();\n }}\n resetView={resetView}\n />\n );\n case GroupsView.MODIFYING:\n return selectedGroup ? (\n <GroupAction\n iModelId={iModelId}\n mappingId={mapping.id}\n group={selectedGroup}\n goBack={async () => {\n setGroupsView(GroupsView.GROUPS);\n await refresh();\n }}\n resetView={resetView}\n />\n ) : null;\n case GroupsView.PROPERTIES:\n return selectedGroup ? (\n <PropertyMenu\n iModelId={iModelId}\n mappingId={mapping.id}\n group={selectedGroup}\n goBack={propertyMenuGoBack}\n />\n ) : null;\n default:\n return (\n <>\n <WidgetHeader\n title={mapping.mappingName}\n disabled={isLoading || isLoadingQuery}\n returnFn={async () => {\n clearEmphasizedOverriddenElements();\n await goBack();\n }}\n />\n <Surface className=\"gmw-groups-container\">\n <div className=\"gmw-toolbar\">\n <Button\n className=\"add-load-button\"\n startIcon={\n isLoadingQuery ? (\n <ProgressRadial size=\"small\" indeterminate />\n ) : (\n <SvgAdd />\n )\n }\n styleType=\"high-visibility\"\n disabled={isLoadingQuery}\n onClick={addGroup}\n >\n {isLoadingQuery ? \"Loading\" : \"Add Group\"}\n </Button>\n <ButtonGroup className=\"gmw-toolbar-buttons\">\n <ToggleSwitch\n label=\"Color by Group\"\n labelPosition=\"left\"\n className=\"gmw-toggle\"\n disabled={isLoadingQuery}\n checked={showGroupColor}\n onChange={toggleGroupColor}\n ></ToggleSwitch>\n <IconButton\n title=\"Show All\"\n onClick={showAll}\n disabled={isLoadingQuery}\n styleType=\"borderless\"\n className=\"gmw-group-view-icon\"\n >\n <SvgVisibilityShow />\n </IconButton>\n <IconButton\n title=\"Hide All\"\n onClick={hideAll}\n disabled={isLoadingQuery}\n styleType=\"borderless\"\n className=\"gmw-group-view-icon\"\n >\n <SvgVisibilityHide />\n </IconButton>\n </ButtonGroup>\n </div>\n {isLoading ? (\n <LoadingOverlay />\n ) : groups.length === 0 ? (\n <EmptyMessage message=\"No Groups available.\" />\n ) : (\n <div className=\"gmw-group-list\">\n {\n groups\n .sort((a, b) => a.groupName.localeCompare(b.groupName) ?? 1)\n .map((g) => (\n <HorizontalTile\n key={g.id}\n title={g.groupName ? g.groupName : \"Untitled\"}\n subText={g.description}\n actionGroup={\n <div className=\"gmw-actions\">\n {showGroupColor && (\n <IconButton\n styleType=\"borderless\"\n className=\"gmw-group-view-icon\"\n >\n <div\n className=\"gmw-color-legend\"\n style={{\n backgroundColor: getGroupColor(groups.findIndex((group) => g.id === group.id)),\n }}\n />\n </IconButton>\n )}\n {g.id && hiddenGroupsIds.includes(g.id) ? (\n <IconButton\n disabled={isLoadingQuery}\n styleType=\"borderless\"\n className=\"gmw-group-view-icon\"\n onClick={async () => {\n await showGroup(g);\n setHiddenGroupsIds(\n hiddenGroupsIds.filter((id) => g.id !== id),\n );\n }}\n >\n <SvgVisibilityHide />\n </IconButton>\n ) : (\n <IconButton\n disabled={isLoadingQuery}\n styleType=\"borderless\"\n className=\"gmw-group-view-icon\"\n onClick={async () => {\n await hideGroups([g]);\n setHiddenGroupsIds(\n hiddenGroupsIds.concat(g.id ? [g.id] : []),\n );\n }}\n >\n <SvgVisibilityShow />\n </IconButton>\n )}\n <DropdownMenu\n disabled={isLoadingQuery}\n menuItems={(close: () => void) => [\n <MenuItem\n key={0}\n onClick={async () => onModify(g)}\n icon={<SvgEdit />}\n >\n Modify\n </MenuItem>,\n <MenuItem\n key={1}\n onClick={async () => openProperties(g)}\n icon={<SvgList />}\n >\n Properties\n </MenuItem>,\n <MenuItem\n key={2}\n onClick={() => {\n setSelectedGroup(g);\n setShowDeleteModal(true);\n close();\n }}\n icon={<SvgDelete />}\n >\n Remove\n </MenuItem>,\n ]}\n >\n <IconButton\n disabled={isLoadingQuery}\n styleType=\"borderless\"\n >\n <SvgMore\n style={{\n width: \"16px\",\n height: \"16px\",\n }}\n />\n </IconButton>\n </DropdownMenu>\n </div>\n }\n onClickTitle={\n isLoadingQuery ? undefined : async () => openProperties(g)\n }\n />\n ))}\n </div>\n )}\n </Surface>\n <DeleteModal\n entityName={selectedGroup?.groupName ?? \"\"}\n show={showDeleteModal}\n setShow={setShowDeleteModal}\n onDelete={async () => {\n const accessToken = await getAccessToken();\n await mappingClient.deleteGroup(\n accessToken,\n iModelId,\n mapping.id,\n selectedGroup?.id ?? \"\",\n );\n }}\n refresh={refresh}\n />\n </>\n );\n }\n};\n"]}
1
+ {"version":3,"file":"Grouping.js","sourceRoot":"","sources":["../../../../src/widget/components/Grouping.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 { useActiveIModelConnection } from \"@itwin/appui-react\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { CreateTypeFromInterface } from \"../utils\";\nimport {\n Button,\n ButtonGroup,\n DropdownMenu,\n IconButton,\n MenuItem,\n ProgressRadial,\n Surface,\n toaster,\n ToggleSwitch,\n} from \"@itwin/itwinui-react\";\nimport {\n SvgAdd,\n SvgCursor,\n SvgDelete,\n SvgDraw,\n SvgEdit,\n SvgList,\n SvgMore,\n SvgSearch,\n SvgVisibilityHide,\n SvgVisibilityShow,\n} from \"@itwin/itwinui-icons-react\";\nimport DeleteModal from \"./DeleteModal\";\nimport \"./Grouping.scss\";\nimport type { IModelConnection } from \"@itwin/core-frontend\";\nimport { PropertyMenu } from \"./PropertyMenu\";\nimport {\n clearEmphasizedElements,\n clearEmphasizedOverriddenElements,\n clearHiddenElements,\n clearOverriddenElements,\n emphasizeElements,\n getHiliteIds,\n hideElements,\n hideElementsByQuery,\n overrideElements,\n zoomToElements,\n} from \"./viewerUtils\";\nimport {\n EmptyMessage,\n handleError,\n LoadingOverlay,\n WidgetHeader,\n} from \"./utils\";\nimport GroupAction from \"./GroupAction\";\nimport type { Group, IMappingsClient, Mapping } from \"@itwin/insights-client\";\nimport { useMappingClient } from \"./context/MappingClientContext\";\nimport { FeatureOverrideType } from \"@itwin/core-common\";\nimport { HorizontalTile } from \"./HorizontalTile\";\nimport type { GetAccessTokenFn } from \"./context/GroupingApiConfigContext\";\nimport { useGroupingMappingApiConfig } from \"./context/GroupingApiConfigContext\";\nimport { useGroupingMappingCustomUI } from \"./context/GroupingMappingCustomUIContext\";\nimport { GroupingMappingCustomUIType } from \"./customUI/GroupingMappingCustomUI\";\nimport type { ContextCustomUI, GroupingCustomUI } from \"./customUI/GroupingMappingCustomUI\";\nimport { Presentation } from \"@itwin/presentation-frontend\";\n\nexport type IGroupTyped = CreateTypeFromInterface<Group>;\n\nexport const defaultUIMetadata = [\n {\n name: \"Selection\",\n displayLabel: \"Selection\",\n icon: <SvgCursor />,\n },\n {\n name: \"Search\",\n displayLabel: \"Query Keywords\",\n icon: <SvgSearch />,\n },\n {\n name: \"Manual\",\n displayLabel: \"Manual Query\",\n icon: <SvgDraw />,\n },\n];\n\nenum GroupsView {\n Add, // Add group view\n Groups, // Group list page\n CustomUI, // Context custom UI view\n Modifying, // Modify group view\n Properties, // Group properties view\n}\n\ninterface GroupsTreeProps {\n mapping: Mapping;\n goBack: () => Promise<void>;\n}\n\nconst goldenAngle = 180 * (3 - Math.sqrt(5));\n\nconst fetchGroups = async (\n setGroups: React.Dispatch<React.SetStateAction<IGroupTyped[]>>,\n iModelId: string,\n mappingId: string,\n setIsLoading: React.Dispatch<React.SetStateAction<boolean>>,\n getAccessToken: GetAccessTokenFn,\n mappingsClient: IMappingsClient,\n): Promise<Group[] | undefined> => {\n try {\n setIsLoading(true);\n const accessToken = await getAccessToken();\n const groups = await mappingsClient.getGroups(\n accessToken,\n iModelId,\n mappingId,\n );\n setGroups(groups);\n return groups;\n } catch (error: any) {\n handleError(error.status);\n } finally {\n setIsLoading(false);\n }\n return undefined;\n};\n\nexport const Groupings = ({ mapping, goBack }: GroupsTreeProps) => {\n const iModelConnection = useActiveIModelConnection() as IModelConnection;\n const { getAccessToken } = useGroupingMappingApiConfig();\n const mappingClient = useMappingClient();\n const iModelId = useActiveIModelConnection()?.iModelId as string;\n const groupUIs: GroupingCustomUI[] = useGroupingMappingCustomUI()\n .filter((p) => p.type === GroupingMappingCustomUIType.Grouping) as GroupingCustomUI[];\n const contextUIs: ContextCustomUI[] = useGroupingMappingCustomUI()\n .filter((p) => p.type === GroupingMappingCustomUIType.Context) as ContextCustomUI[];\n\n const [showDeleteModal, setShowDeleteModal] = useState<boolean>(false);\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [groupsView, setGroupsView] = useState<GroupsView>(GroupsView.Groups);\n const [selectedGroup, setSelectedGroup] = useState<IGroupTyped | undefined>(\n undefined,\n );\n const hilitedElements = useRef<Map<string, string[]>>(new Map());\n const [isLoadingQuery, setLoadingQuery] = useState<boolean>(false);\n const [groups, setGroups] = useState<Group[]>([]);\n const [hiddenGroupsIds, setHiddenGroupsIds] = useState<string[]>([]);\n const [showGroupColor, setShowGroupColor] = useState<boolean>(false);\n\n const [queryGenerationType, setQueryGenerationType] =\n useState<string>(\"Selection\");\n const [selectedContextCustomUI, setSelectedContextCustomUI] = useState<ContextCustomUI | undefined>(undefined);\n\n useEffect(() => {\n void fetchGroups(\n setGroups,\n iModelId,\n mapping.id,\n setIsLoading,\n getAccessToken,\n mappingClient,\n );\n }, [getAccessToken, mappingClient, iModelId, mapping.id, setIsLoading]);\n\n const getGroupColor = function (index: number) {\n return `hsl(${index * goldenAngle + 60}, 100%, 50%)`;\n };\n\n const getHiliteIdsFromGroups = useCallback(\n async (groups: Group[]) => {\n let allIds: string[] = [];\n for (const group of groups) {\n const query = group.query;\n let currentIds: string[] = [];\n if (hilitedElements.current.has(query)) {\n currentIds = hilitedElements.current.get(query) ?? [];\n } else {\n try {\n const queryRowCount = await iModelConnection.queryRowCount(query);\n if (queryRowCount === 0) {\n toaster.warning(\n `${group.groupName}'s query is valid but produced no results.`,\n );\n }\n currentIds = await getHiliteIds(query, iModelConnection);\n hilitedElements.current.set(query, currentIds);\n } catch {\n toaster.negative(\n `Could not hide/show ${group.groupName}. Query could not be resolved.`,\n );\n }\n }\n allIds = allIds.concat(currentIds);\n }\n return allIds;\n },\n [iModelConnection, hilitedElements],\n );\n\n const visualizeGroupColors = useCallback(\n async (viewGroups: Group[]) => {\n setLoadingQuery(true);\n clearEmphasizedOverriddenElements();\n let allIds: string[] = [];\n for (const group of viewGroups) {\n const index =\n viewGroups.length > groups.length\n ? viewGroups.findIndex((g) => g.id === group.id)\n : groups.findIndex((g) => g.id === group.id);\n const hilitedIds = await getHiliteIdsFromGroups([group]);\n overrideElements(\n hilitedIds,\n getGroupColor(index),\n FeatureOverrideType.ColorAndAlpha,\n );\n emphasizeElements(hilitedIds, undefined);\n if (!hiddenGroupsIds.includes(group.id)) {\n allIds = allIds.concat(hilitedIds);\n }\n }\n\n await zoomToElements(allIds);\n setLoadingQuery(false);\n },\n [groups, hiddenGroupsIds, getHiliteIdsFromGroups],\n );\n\n const hideGroups = useCallback(\n async (viewGroups: Group[]) => {\n setLoadingQuery(true);\n for (const viewGroup of viewGroups) {\n const query = viewGroup.query;\n if (hilitedElements.current.has(query)) {\n const hilitedIds = hilitedElements.current.get(query) ?? [];\n hideElements(hilitedIds);\n } else {\n try {\n const queryRowCount = await iModelConnection.queryRowCount(query);\n if (queryRowCount === 0) {\n toaster.warning(\n `${viewGroup.groupName}'s query is valid but produced no results.`,\n );\n }\n const hiliteIds = await hideElementsByQuery(\n query,\n iModelConnection,\n false,\n );\n hilitedElements.current.set(query, hiliteIds);\n } catch {\n toaster.negative(\n `Could not hide/show ${viewGroup.groupName}. Query could not be resolved.`,\n );\n }\n }\n }\n setLoadingQuery(false);\n },\n [iModelConnection],\n );\n\n const showGroup = useCallback(\n async (viewGroup: Group) => {\n clearHiddenElements();\n\n // hide group Ids filter\n const newHiddenGroups: Group[] = hiddenGroupsIds\n .map((id) => groups.find((g) => g.id === id))\n .filter((g): g is Group => !!g && g.id !== viewGroup.id);\n\n // view group Ids filter\n const viewIds = await getHiliteIdsFromGroups(\n groups.filter((g) => !newHiddenGroups.find((hg) => hg.id === g.id)),\n );\n let hiddenIds = await getHiliteIdsFromGroups(newHiddenGroups);\n hiddenIds = hiddenIds.filter((id) => !viewIds.includes(id));\n hideElements(hiddenIds);\n },\n [groups, hiddenGroupsIds, getHiliteIdsFromGroups],\n );\n\n const addGroup = (type: string) => {\n setQueryGenerationType(type);\n clearEmphasizedElements();\n setGroupsView(GroupsView.Add);\n };\n\n const onModify = async (group: Group, type: string) => {\n setQueryGenerationType(type);\n setSelectedGroup(group);\n setGroupsView(GroupsView.Modifying);\n if (group.id && hiddenGroupsIds.includes(group.id)) {\n await showGroup(group);\n setHiddenGroupsIds(hiddenGroupsIds.filter((id) => id !== group.id));\n }\n clearEmphasizedElements();\n };\n\n const openProperties = async (group: Group) => {\n setSelectedGroup(group);\n setGroupsView(GroupsView.Properties);\n if (group.id && hiddenGroupsIds.includes(group.id)) {\n await showGroup(group);\n setHiddenGroupsIds(hiddenGroupsIds.filter((id) => id !== group.id));\n }\n };\n\n const refresh = useCallback(async () => {\n setGroupsView(GroupsView.Groups);\n setSelectedGroup(undefined);\n setSelectedContextCustomUI(undefined);\n setGroups([]);\n const groups = await fetchGroups(\n setGroups,\n iModelId,\n mapping.id,\n setIsLoading,\n getAccessToken,\n mappingClient,\n );\n if (groups) {\n if (showGroupColor) {\n await visualizeGroupColors(groups);\n } else {\n clearEmphasizedOverriddenElements();\n }\n }\n }, [\n getAccessToken,\n mappingClient,\n iModelId,\n mapping.id,\n setGroups,\n showGroupColor,\n visualizeGroupColors,\n ]);\n\n const resetView = async () => {\n if (groups) {\n if (showGroupColor) {\n await visualizeGroupColors(groups);\n } else {\n clearOverriddenElements();\n }\n clearEmphasizedElements();\n }\n };\n\n const showAll = async () => {\n setLoadingQuery(true);\n\n clearHiddenElements();\n setHiddenGroupsIds([]);\n const allIds = await getHiliteIdsFromGroups(groups);\n await zoomToElements(allIds);\n\n setLoadingQuery(false);\n };\n\n const hideAll = useCallback(async () => {\n await hideGroups(groups);\n setHiddenGroupsIds(\n groups.map((g) => g.id).filter((id): id is string => !!id),\n );\n const allIds = await getHiliteIdsFromGroups(groups);\n await zoomToElements(allIds);\n }, [setHiddenGroupsIds, groups, hideGroups, getHiliteIdsFromGroups]);\n\n const toggleGroupColor = useCallback(\n async (e: any) => {\n if (e.target.checked) {\n await visualizeGroupColors(groups);\n setShowGroupColor(true);\n } else {\n clearEmphasizedOverriddenElements();\n setShowGroupColor(false);\n }\n },\n [groups, visualizeGroupColors, setShowGroupColor],\n );\n\n const propertyMenuGoBack = useCallback(async () => {\n setGroupsView(GroupsView.Groups);\n await refresh();\n }, [refresh]);\n\n switch (groupsView) {\n case GroupsView.Add:\n return (\n <GroupAction\n iModelId={iModelId}\n mappingId={mapping.id}\n queryGenerationType={queryGenerationType}\n goBack={async () => {\n setGroupsView(GroupsView.Groups);\n await refresh();\n }}\n resetView={resetView}\n />\n );\n case GroupsView.Modifying:\n return selectedGroup ? (\n <GroupAction\n iModelId={iModelId}\n mappingId={mapping.id}\n group={selectedGroup}\n queryGenerationType={queryGenerationType}\n goBack={async () => {\n setGroupsView(GroupsView.Groups);\n await refresh();\n }}\n resetView={resetView}\n />\n ) : null;\n case GroupsView.Properties:\n return selectedGroup ? (\n <PropertyMenu\n iModelId={iModelId}\n mappingId={mapping.id}\n group={selectedGroup}\n goBack={propertyMenuGoBack}\n />\n ) : null;\n case GroupsView.Groups:\n return (\n <>\n <WidgetHeader\n title={mapping.mappingName}\n disabled={isLoading || isLoadingQuery}\n returnFn={async () => {\n clearEmphasizedOverriddenElements();\n await goBack();\n }}\n />\n\n <Surface className='gmw-groups-container'>\n <div className='gmw-toolbar'>\n <DropdownMenu\n className='gmw-custom-ui-dropdown'\n disabled={isLoadingQuery}\n menuItems={() =>\n (groupUIs.length > 0\n ? groupUIs\n : defaultUIMetadata)\n .map((p, index) => (\n <MenuItem\n key={index}\n onClick={() => addGroup(p.name)}\n icon={p.icon}\n className='gmw-menu-item'\n data-testid={`gmw-add-${index}`}\n >\n {p.displayLabel}\n </MenuItem>\n ))\n }\n >\n <Button\n data-testid=\"gmw-add-group-button\"\n className='add-load-button'\n startIcon={\n isLoadingQuery ? (\n <ProgressRadial size='small' indeterminate />\n ) : (\n <SvgAdd />\n )\n }\n styleType='high-visibility'\n disabled={isLoadingQuery}\n >\n {isLoadingQuery ? \"Loading\" : \"Add Group\"}\n </Button>\n </DropdownMenu>\n <ButtonGroup className='gmw-toolbar-buttons'>\n <ToggleSwitch\n label='Color by Group'\n labelPosition='left'\n className='gmw-toggle'\n disabled={isLoadingQuery}\n checked={showGroupColor}\n onChange={toggleGroupColor}\n ></ToggleSwitch>\n <IconButton\n title='Show All'\n onClick={showAll}\n disabled={isLoadingQuery}\n styleType='borderless'\n className='gmw-group-view-icon'\n >\n <SvgVisibilityShow />\n </IconButton>\n <IconButton\n title='Hide All'\n onClick={hideAll}\n disabled={isLoadingQuery}\n styleType='borderless'\n className='gmw-group-view-icon'\n >\n <SvgVisibilityHide />\n </IconButton>\n </ButtonGroup>\n </div>\n {isLoading ? (\n <LoadingOverlay />\n ) : groups.length === 0 ? (\n <EmptyMessage message='No Groups available.' />\n ) : (\n <div className='gmw-group-list'>\n {groups\n .sort(\n (a, b) =>\n a.groupName?.localeCompare(b.groupName ?? \"\") ?? 1,\n )\n .map((g) => (\n <HorizontalTile\n key={g.id}\n title={g.groupName ? g.groupName : \"Untitled\"}\n subText={g.description}\n actionGroup={\n <div className='gmw-actions'>\n {showGroupColor && (\n <IconButton\n styleType='borderless'\n className='gmw-group-view-icon'\n >\n <div\n className=\"gmw-color-legend\"\n style={{\n backgroundColor: getGroupColor(groups.findIndex((group) => g.id === group.id)),\n }}\n />\n </IconButton>\n )}\n {g.id && hiddenGroupsIds.includes(g.id) ? (\n <IconButton\n disabled={isLoadingQuery}\n styleType='borderless'\n className='gmw-group-view-icon'\n onClick={async () => {\n await showGroup(g);\n setHiddenGroupsIds(\n hiddenGroupsIds.filter((id) => g.id !== id),\n );\n }}\n >\n <SvgVisibilityHide />\n </IconButton>\n ) : (\n <IconButton\n disabled={isLoadingQuery}\n styleType='borderless'\n className='gmw-group-view-icon'\n onClick={async () => {\n await hideGroups([g]);\n setHiddenGroupsIds(\n hiddenGroupsIds.concat(g.id ? [g.id] : []),\n );\n }}\n >\n <SvgVisibilityShow />\n </IconButton>\n )}\n <DropdownMenu\n className='gmw-custom-ui-dropdown'\n disabled={isLoadingQuery}\n menuItems={(close: () => void) =>\n [\n <MenuItem\n key={0}\n icon={<SvgEdit />}\n disabled={isLoadingQuery}\n data-testid=\"gmw-context-menu-item\"\n subMenuItems={\n (groupUIs.length > 0\n ? groupUIs\n : defaultUIMetadata)\n .map((p, index) => (\n <MenuItem\n key={index}\n className='gmw-menu-item'\n data-testid={`gmw-edit-${index}`}\n onClick={async () => onModify(g, p.name)}\n icon={p.icon}\n >\n {p.displayLabel}\n </MenuItem>\n ))\n }\n >\n Edit\n </MenuItem>,\n <MenuItem\n key={1}\n onClick={async () => openProperties(g)}\n icon={<SvgList />}\n data-testid=\"gmw-context-menu-item\"\n >\n Properties\n </MenuItem>,\n <MenuItem\n key={2}\n onClick={() => {\n setSelectedGroup(g);\n setShowDeleteModal(true);\n close();\n }}\n icon={<SvgDelete />}\n data-testid=\"gmw-context-menu-item\"\n >\n Remove\n </MenuItem>,\n ].concat(\n contextUIs.map((p) => {\n return <MenuItem\n key={p.name}\n onClick={() => {\n if(p.uiComponent) {\n setSelectedGroup(g);\n setSelectedContextCustomUI(p);\n setGroupsView(GroupsView.CustomUI);\n }\n if(p.onClick) {\n p.onClick(g.id, mapping.id, 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 }\n >\n <IconButton\n disabled={isLoadingQuery}\n styleType='borderless'\n data-testid=\"gmw-more-button\"\n >\n <SvgMore />\n </IconButton>\n </DropdownMenu>\n </div>\n }\n onClickTitle={\n isLoadingQuery\n ? undefined\n : async () => openProperties(g)\n }\n />\n ))}\n </div>\n )}\n </Surface>\n <DeleteModal\n entityName={selectedGroup?.groupName ?? \"\"}\n show={showDeleteModal}\n setShow={setShowDeleteModal}\n onDelete={async () => {\n const accessToken = await getAccessToken();\n await mappingClient.deleteGroup(\n accessToken,\n iModelId,\n mapping.id,\n selectedGroup?.id ?? \"\",\n );\n }}\n refresh={refresh}\n />\n </>\n );\n case GroupsView.CustomUI:\n return selectedContextCustomUI && selectedContextCustomUI.uiComponent && selectedGroup\n ? (\n <>\n <WidgetHeader\n title={selectedContextCustomUI.displayLabel}\n returnFn={async () => {\n Presentation.selection.clearSelection(\n \"GroupingMappingWidget\",\n iModelConnection,\n );\n await refresh();\n }}\n />\n {React.createElement(selectedContextCustomUI.uiComponent, {\n iModelId,\n mappingId: mapping.id,\n groupId: selectedGroup.id,\n })}\n </>\n )\n : null;\n default:\n return (\n <EmptyMessage message=\"No given group view\"/>\n );\n }\n};\n"]}
@@ -33,8 +33,8 @@
33
33
  display: flex;
34
34
  flex-direction: column;
35
35
  overflow-y: overlay;
36
- gap: 7.5px;
37
- margin-top: 7.5px;
36
+ gap: $iui-s;
37
+ margin-top: $iui-s;
38
38
 
39
39
  .gmw-actions {
40
40
  display: flex;
@@ -49,7 +49,22 @@
49
49
  cursor: pointer;
50
50
 
51
51
  .gmw-color-legend {
52
- border: 2px solid black;
52
+ border: $iui-xxs solid black;
53
53
  }
54
54
  }
55
+
56
+ .gmw-menu-item {
57
+ padding-left: $iui-component-padding-horizontal;
58
+ }
59
+ }
60
+
61
+ .gmw-nest-menu-item {
62
+ width: 100%;
63
+ justify-content: flex-start;
64
+ padding: 0 $iui-component-padding-horizontal;
65
+ gap: $iui-s;
66
+ }
67
+
68
+ .gmw-custom-ui-dropdown {
69
+ width: $iui-3xl + $iui-l;
55
70
  }
@@ -2,6 +2,7 @@
2
2
  import "./GroupingMapping.scss";
3
3
  import type { ClientPrefix, GetAccessTokenFn } from "./context/GroupingApiConfigContext";
4
4
  import type { IMappingsClient } from "@itwin/insights-client";
5
+ import type { GroupingMappingCustomUI } from "./customUI/GroupingMappingCustomUI";
5
6
  export interface GroupingMappingProps {
6
7
  /**
7
8
  * Custom callback to retrieve access token.
@@ -16,7 +17,11 @@ export interface GroupingMappingProps {
16
17
  * A custom implementation of MappingClient.
17
18
  */
18
19
  client?: IMappingsClient;
20
+ /**
21
+ * Custom UI to add and update groups or provide additional group context capabilities.
22
+ */
23
+ customUIs?: GroupingMappingCustomUI[];
19
24
  }
20
- declare const GroupingMapping: ({ getAccessToken, prefix, client }: GroupingMappingProps) => JSX.Element;
25
+ declare const GroupingMapping: (props: GroupingMappingProps) => JSX.Element;
21
26
  export default GroupingMapping;
22
27
  //# sourceMappingURL=GroupingMapping.d.ts.map
@@ -29,24 +29,37 @@ require("./GroupingMapping.scss");
29
29
  const core_frontend_1 = require("@itwin/core-frontend");
30
30
  const GroupingApiConfigContext_1 = require("./context/GroupingApiConfigContext");
31
31
  const MappingClientContext_1 = require("./context/MappingClientContext");
32
- const authorizationClientGetAccessToken = (async () => { var _a, _b; return ((_b = await ((_a = core_frontend_1.IModelApp.authorizationClient) === null || _a === void 0 ? void 0 : _a.getAccessToken())) !== null && _b !== void 0 ? _b : ""); });
33
- const GroupingMapping = ({ getAccessToken, prefix, client }) => {
34
- const clientProp = client !== null && client !== void 0 ? client : prefix;
32
+ const GroupingMappingCustomUIContext_1 = require("./context/GroupingMappingCustomUIContext");
33
+ const authorizationClientGetAccessToken = async () => { var _a, _b; return (_b = (await ((_a = core_frontend_1.IModelApp.authorizationClient) === null || _a === void 0 ? void 0 : _a.getAccessToken()))) !== null && _b !== void 0 ? _b : ""; };
34
+ const GroupingMapping = (props) => {
35
+ var _a, _b;
36
+ const clientProp = (_a = props.client) !== null && _a !== void 0 ? _a : props.prefix;
35
37
  const [mappingClient, setMappingClient] = react_1.useState(MappingClientContext_1.createMappingClient(clientProp));
38
+ const [customUIs, setCustomUIs] = react_1.useState(GroupingMappingCustomUIContext_1.createGroupingMappingCustomUI(props.customUIs));
36
39
  const [apiConfig, setApiConfig] = react_1.useState({
37
- getAccessToken: getAccessToken !== null && getAccessToken !== void 0 ? getAccessToken : authorizationClientGetAccessToken,
38
- prefix,
40
+ getAccessToken: (_b = props.getAccessToken) !== null && _b !== void 0 ? _b : authorizationClientGetAccessToken,
41
+ prefix: props.prefix,
39
42
  });
40
43
  react_1.useEffect(() => {
41
- setApiConfig(() => ({ prefix, getAccessToken: getAccessToken !== null && getAccessToken !== void 0 ? getAccessToken : authorizationClientGetAccessToken }));
42
- }, [getAccessToken, prefix]);
44
+ setApiConfig(() => {
45
+ var _a;
46
+ return ({
47
+ prefix: props.prefix,
48
+ getAccessToken: (_a = props.getAccessToken) !== null && _a !== void 0 ? _a : authorizationClientGetAccessToken,
49
+ });
50
+ });
51
+ }, [props.getAccessToken, props.prefix]);
43
52
  react_1.useEffect(() => {
44
53
  setMappingClient(MappingClientContext_1.createMappingClient(clientProp));
45
54
  }, [clientProp]);
55
+ react_1.useEffect(() => {
56
+ setCustomUIs(GroupingMappingCustomUIContext_1.createGroupingMappingCustomUI(props.customUIs));
57
+ }, [props.customUIs]);
46
58
  return (react_1.default.createElement(GroupingApiConfigContext_1.GroupingMappingApiConfigContext.Provider, { value: apiConfig },
47
59
  react_1.default.createElement(MappingClientContext_1.MappingClientContext.Provider, { value: mappingClient },
48
- react_1.default.createElement("div", { className: 'gmw-group-mapping-container' },
49
- react_1.default.createElement(Mapping_1.Mappings, null)))));
60
+ react_1.default.createElement(GroupingMappingCustomUIContext_1.GroupingMappingCustomUIContext.Provider, { value: customUIs },
61
+ react_1.default.createElement("div", { className: 'gmw-group-mapping-container' },
62
+ react_1.default.createElement(Mapping_1.Mappings, null))))));
50
63
  };
51
64
  exports.default = GroupingMapping;
52
65
  //# sourceMappingURL=GroupingMapping.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GroupingMapping.js","sourceRoot":"","sources":["../../../../src/widget/components/GroupingMapping.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;;+FAG+F;AAC/F,+CAAmD;AACnD,uCAAqC;AACrC,kCAAgC;AAChC,wDAAiD;AAEjD,iFAAqF;AACrF,yEAA2F;AAmB3F,MAAM,iCAAiC,GAAG,CAAC,KAAK,IAAI,EAAE,eAAC,OAAA,CAAC,MAAA,MAAM,CAAA,MAAA,yBAAS,CAAC,mBAAmB,0CAAE,cAAc,EAAE,CAAA,mCAAI,EAAE,CAAC,CAAA,EAAA,CAAC,CAAC;AAEtH,MAAM,eAAe,GAAG,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAwB,EAAE,EAAE;IACnF,MAAM,UAAU,GAAmC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,MAAM,CAAC;IACpE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,gBAAQ,CAAkB,0CAAmB,CAAC,UAAU,CAAC,CAAC,CAAC;IACrG,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,gBAAQ,CAA2B;QACnE,cAAc,EAAE,cAAc,aAAd,cAAc,cAAd,cAAc,GAAI,iCAAiC;QACnE,MAAM;KACP,CAAC,CAAC;IAEH,iBAAS,CAAC,GAAG,EAAE;QACb,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,aAAd,cAAc,cAAd,cAAc,GAAI,iCAAiC,EAAE,CAAC,CAAC,CAAC;IACxG,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;IAE7B,iBAAS,CAAC,GAAG,EAAE;QACb,gBAAgB,CAAC,0CAAmB,CAAC,UAAU,CAAC,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,OAAO,CACL,8BAAC,0DAA+B,CAAC,QAAQ,IACvC,KAAK,EAAE,SAAS;QAEhB,8BAAC,2CAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,aAAa;YACjD,uCAAK,SAAS,EAAC,6BAA6B;gBAC1C,8BAAC,kBAAQ,OAAG,CACR,CACwB,CACS,CAC5C,CAAC;AACJ,CAAC,CAAC;AAEF,kBAAe,eAAe,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 { Mappings } from \"./Mapping\";\nimport \"./GroupingMapping.scss\";\nimport { IModelApp } from \"@itwin/core-frontend\";\nimport type { ClientPrefix, GetAccessTokenFn, GroupingMappingApiConfig } from \"./context/GroupingApiConfigContext\";\nimport { GroupingMappingApiConfigContext } from \"./context/GroupingApiConfigContext\";\nimport { createMappingClient, MappingClientContext } from \"./context/MappingClientContext\";\nimport type { IMappingsClient } from \"@itwin/insights-client\";\n\nexport interface GroupingMappingProps {\n /**\n * Custom callback to retrieve access token.\n */\n getAccessToken?: GetAccessTokenFn;\n /**\n * Used for iTwin and iModel APIs.\n * Also used for Mapping API if a custom {@link client} is not provided.\n */\n prefix?: ClientPrefix;\n /**\n * A custom implementation of MappingClient.\n */\n client?: IMappingsClient;\n}\n\nconst authorizationClientGetAccessToken = (async () => (await IModelApp.authorizationClient?.getAccessToken() ?? \"\"));\n\nconst GroupingMapping = ({ getAccessToken, prefix, client }: GroupingMappingProps) => {\n const clientProp: IMappingsClient | ClientPrefix = client ?? prefix;\n const [mappingClient, setMappingClient] = useState<IMappingsClient>(createMappingClient(clientProp));\n const [apiConfig, setApiConfig] = useState<GroupingMappingApiConfig>({\n getAccessToken: getAccessToken ?? authorizationClientGetAccessToken,\n prefix,\n });\n\n useEffect(() => {\n setApiConfig(() => ({ prefix, getAccessToken: getAccessToken ?? authorizationClientGetAccessToken }));\n }, [getAccessToken, prefix]);\n\n useEffect(() => {\n setMappingClient(createMappingClient(clientProp));\n }, [clientProp]);\n\n return (\n <GroupingMappingApiConfigContext.Provider\n value={apiConfig}\n >\n <MappingClientContext.Provider value={mappingClient}>\n <div className='gmw-group-mapping-container'>\n <Mappings />\n </div>\n </MappingClientContext.Provider>\n </GroupingMappingApiConfigContext.Provider>\n );\n};\n\nexport default GroupingMapping;\n"]}
1
+ {"version":3,"file":"GroupingMapping.js","sourceRoot":"","sources":["../../../../src/widget/components/GroupingMapping.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;;+FAG+F;AAC/F,+CAAmD;AACnD,uCAAqC;AACrC,kCAAgC;AAChC,wDAAiD;AAMjD,iFAAqF;AACrF,yEAGwC;AAExC,6FAAyH;AAuBzH,MAAM,iCAAiC,GAAG,KAAK,IAAI,EAAE,eACnD,OAAA,MAAA,CAAC,MAAM,CAAA,MAAA,yBAAS,CAAC,mBAAmB,0CAAE,cAAc,EAAE,CAAA,CAAC,mCAAI,EAAE,CAAA,EAAA,CAAC;AAEhE,MAAM,eAAe,GAAG,CAAC,KAA2B,EAAE,EAAE;;IACtD,MAAM,UAAU,GAAmC,MAAA,KAAK,CAAC,MAAM,mCAAI,KAAK,CAAC,MAAM,CAAC;IAChF,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,gBAAQ,CAAkB,0CAAmB,CAAC,UAAU,CAAC,CAAC,CAAC;IACrG,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,gBAAQ,CACxC,8DAA6B,CAAC,KAAK,CAAC,SAAS,CAAC,CAC/C,CAAC;IACF,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,gBAAQ,CAA2B;QACnE,cAAc,EAAE,MAAA,KAAK,CAAC,cAAc,mCAAI,iCAAiC;QACzE,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC,CAAC;IAEH,iBAAS,CAAC,GAAG,EAAE;QACb,YAAY,CAAC,GAAG,EAAE;;YAAC,OAAA,CAAC;gBAClB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,cAAc,EAAE,MAAA,KAAK,CAAC,cAAc,mCAAI,iCAAiC;aAC1E,CAAC,CAAA;SAAA,CAAC,CAAC;IACN,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAEzC,iBAAS,CAAC,GAAG,EAAE;QACb,gBAAgB,CAAC,0CAAmB,CAAC,UAAU,CAAC,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,iBAAS,CAAC,GAAG,EAAE;QACb,YAAY,CAAC,8DAA6B,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/D,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IAEtB,OAAO,CACL,8BAAC,0DAA+B,CAAC,QAAQ,IAAC,KAAK,EAAE,SAAS;QACxD,8BAAC,2CAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,aAAa;YACjD,8BAAC,+DAA8B,CAAC,QAAQ,IAAC,KAAK,EAAE,SAAS;gBACvD,uCAAK,SAAS,EAAC,6BAA6B;oBAC1C,8BAAC,kBAAQ,OAAG,CACR,CACkC,CACZ,CACS,CAC5C,CAAC;AACJ,CAAC,CAAC;AAEF,kBAAe,eAAe,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 { Mappings } from \"./Mapping\";\nimport \"./GroupingMapping.scss\";\nimport { IModelApp } from \"@itwin/core-frontend\";\nimport type {\n ClientPrefix,\n GetAccessTokenFn,\n GroupingMappingApiConfig,\n} from \"./context/GroupingApiConfigContext\";\nimport { GroupingMappingApiConfigContext } from \"./context/GroupingApiConfigContext\";\nimport {\n createMappingClient,\n MappingClientContext,\n} from \"./context/MappingClientContext\";\nimport type { IMappingsClient } from \"@itwin/insights-client\";\nimport { createGroupingMappingCustomUI, GroupingMappingCustomUIContext } from \"./context/GroupingMappingCustomUIContext\";\nimport type { GroupingMappingCustomUI } from \"./customUI/GroupingMappingCustomUI\";\n\nexport interface GroupingMappingProps {\n /**\n * Custom callback to retrieve access token.\n */\n getAccessToken?: GetAccessTokenFn;\n /**\n * Used for iTwin and iModel APIs.\n * Also used for Mapping API if a custom {@link client} is not provided.\n */\n prefix?: ClientPrefix;\n /**\n * A custom implementation of MappingClient.\n */\n client?: IMappingsClient;\n /**\n * Custom UI to add and update groups or provide additional group context capabilities.\n */\n customUIs?: GroupingMappingCustomUI[];\n}\n\nconst authorizationClientGetAccessToken = async () =>\n (await IModelApp.authorizationClient?.getAccessToken()) ?? \"\";\n\nconst GroupingMapping = (props: GroupingMappingProps) => {\n const clientProp: IMappingsClient | ClientPrefix = props.client ?? props.prefix;\n const [mappingClient, setMappingClient] = useState<IMappingsClient>(createMappingClient(clientProp));\n const [customUIs, setCustomUIs] = useState<GroupingMappingCustomUI[]>(\n createGroupingMappingCustomUI(props.customUIs),\n );\n const [apiConfig, setApiConfig] = useState<GroupingMappingApiConfig>({\n getAccessToken: props.getAccessToken ?? authorizationClientGetAccessToken,\n prefix: props.prefix,\n });\n\n useEffect(() => {\n setApiConfig(() => ({\n prefix: props.prefix,\n getAccessToken: props.getAccessToken ?? authorizationClientGetAccessToken,\n }));\n }, [props.getAccessToken, props.prefix]);\n\n useEffect(() => {\n setMappingClient(createMappingClient(clientProp));\n }, [clientProp]);\n\n useEffect(() => {\n setCustomUIs(createGroupingMappingCustomUI(props.customUIs));\n }, [props.customUIs]);\n\n return (\n <GroupingMappingApiConfigContext.Provider value={apiConfig}>\n <MappingClientContext.Provider value={mappingClient}>\n <GroupingMappingCustomUIContext.Provider value={customUIs}>\n <div className='gmw-group-mapping-container'>\n <Mappings />\n </div>\n </GroupingMappingCustomUIContext.Provider>\n </MappingClientContext.Provider>\n </GroupingMappingApiConfigContext.Provider>\n );\n};\n\nexport default GroupingMapping;\n"]}
@@ -1,13 +1,15 @@
1
1
  import type { ReactNode } from "react";
2
2
  import "./HorizontalTile.scss";
3
- interface HorizontalTileProps {
3
+ export interface HorizontalTileProps {
4
4
  title: string;
5
5
  actionGroup: ReactNode;
6
6
  subText?: string;
7
+ onClick?: () => void;
7
8
  onClickTitle?: () => void;
8
9
  titleTooltip?: string;
9
10
  subtextToolTip?: string;
11
+ selected?: boolean;
12
+ dragHandle?: ReactNode;
10
13
  }
11
- export declare const HorizontalTile: ({ title, subText, onClickTitle, titleTooltip, subtextToolTip, actionGroup }: HorizontalTileProps) => JSX.Element;
12
- export {};
14
+ export declare const HorizontalTile: (props: HorizontalTileProps) => JSX.Element;
13
15
  //# sourceMappingURL=HorizontalTile.d.ts.map