@itwin/grouping-mapping-widget 0.3.3 → 0.4.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.
- package/lib/cjs/formula/FormulaTokensValidator.d.ts +1 -1
- package/lib/cjs/formula/FormulaTokensValidator.js +3 -1
- package/lib/cjs/formula/FormulaTokensValidator.js.map +1 -1
- package/lib/cjs/formula/FormulaValidator.d.ts +1 -1
- package/lib/cjs/formula/FormulaValidator.js +2 -2
- package/lib/cjs/formula/FormulaValidator.js.map +1 -1
- package/lib/cjs/grouping-mapping-widget.d.ts +4 -0
- package/lib/cjs/grouping-mapping-widget.js +6 -1
- package/lib/cjs/grouping-mapping-widget.js.map +1 -1
- package/lib/cjs/widget/GroupingMappingWidget.d.ts +3 -1
- package/lib/cjs/widget/GroupingMappingWidget.js +3 -2
- package/lib/cjs/widget/GroupingMappingWidget.js.map +1 -1
- package/lib/cjs/widget/IMappingClient.d.ts +327 -0
- package/lib/cjs/widget/IMappingClient.js +7 -0
- package/lib/cjs/widget/IMappingClient.js.map +1 -0
- package/lib/cjs/widget/components/BlockingOverlay.d.ts +7 -0
- package/lib/cjs/widget/components/BlockingOverlay.js +21 -0
- package/lib/cjs/widget/components/BlockingOverlay.js.map +1 -0
- package/lib/cjs/widget/components/BlockingOverlay.scss +26 -0
- package/lib/cjs/widget/components/CalculatedPropertyAction.js +3 -4
- package/lib/cjs/widget/components/CalculatedPropertyAction.js.map +1 -1
- package/lib/cjs/widget/components/CalculatedPropertyTable.js +2 -3
- package/lib/cjs/widget/components/CalculatedPropertyTable.js.map +1 -1
- package/lib/cjs/widget/components/ConfirmMappingsImport.js +2 -3
- package/lib/cjs/widget/components/ConfirmMappingsImport.js.map +1 -1
- package/lib/cjs/widget/components/CustomCalculationAction.js +4 -5
- package/lib/cjs/widget/components/CustomCalculationAction.js.map +1 -1
- package/lib/cjs/widget/components/CustomCalculationTable.js +2 -3
- package/lib/cjs/widget/components/CustomCalculationTable.js.map +1 -1
- package/lib/cjs/widget/components/GroupAction.d.ts +2 -1
- package/lib/cjs/widget/components/GroupAction.js +15 -10
- package/lib/cjs/widget/components/GroupAction.js.map +1 -1
- package/lib/cjs/widget/components/GroupPropertyAction.js +5 -7
- package/lib/cjs/widget/components/GroupPropertyAction.js.map +1 -1
- package/lib/cjs/widget/components/GroupPropertyTable.js +2 -3
- package/lib/cjs/widget/components/GroupPropertyTable.js.map +1 -1
- package/lib/cjs/widget/components/GroupQueryBuilderContainer.js +1 -0
- package/lib/cjs/widget/components/GroupQueryBuilderContainer.js.map +1 -1
- package/lib/cjs/widget/components/GroupQueryBuilderContext.d.ts +1 -0
- package/lib/cjs/widget/components/GroupQueryBuilderContext.js +1 -0
- package/lib/cjs/widget/components/GroupQueryBuilderContext.js.map +1 -1
- package/lib/cjs/widget/components/GroupTile.d.ts +13 -0
- package/lib/cjs/widget/components/GroupTile.js +18 -0
- package/lib/cjs/widget/components/GroupTile.js.map +1 -0
- package/lib/cjs/widget/components/GroupTile.scss +32 -0
- package/lib/cjs/widget/components/Grouping.js +224 -164
- package/lib/cjs/widget/components/Grouping.js.map +1 -1
- package/lib/cjs/widget/components/Grouping.scss +39 -4
- package/lib/cjs/widget/components/GroupingMapping.d.ts +15 -3
- package/lib/cjs/widget/components/GroupingMapping.js +29 -5
- package/lib/cjs/widget/components/GroupingMapping.js.map +1 -1
- package/lib/cjs/widget/components/Mapping.js +33 -12
- package/lib/cjs/widget/components/Mapping.js.map +1 -1
- package/lib/cjs/widget/components/MappingAction.js +10 -5
- package/lib/cjs/widget/components/MappingAction.js.map +1 -1
- package/lib/cjs/widget/components/PropertyMenu.js +26 -19
- package/lib/cjs/widget/components/PropertyMenu.js.map +1 -1
- package/lib/cjs/widget/components/QueryBuilder.d.ts +11 -5
- package/lib/cjs/widget/components/QueryBuilder.js +229 -141
- package/lib/cjs/widget/components/QueryBuilder.js.map +1 -1
- package/lib/cjs/widget/components/SelectMappings.js +5 -6
- package/lib/cjs/widget/components/SelectMappings.js.map +1 -1
- package/lib/cjs/widget/components/property-grid/PropertyView.js +5 -0
- package/lib/cjs/widget/components/property-grid/PropertyView.js.map +1 -1
- package/lib/cjs/widget/components/utils.d.ts +6 -0
- package/lib/cjs/widget/components/utils.js +9 -1
- package/lib/cjs/widget/components/utils.js.map +1 -1
- package/lib/cjs/widget/components/utils.scss +12 -3
- package/lib/cjs/widget/components/viewerUtils.d.ts +19 -0
- package/lib/cjs/widget/components/viewerUtils.js +224 -3
- package/lib/cjs/widget/components/viewerUtils.js.map +1 -1
- package/lib/cjs/widget/hooks/useFormulaValidation.d.ts +1 -1
- package/lib/cjs/widget/hooks/useFormulaValidation.js +5 -5
- package/lib/cjs/widget/hooks/useFormulaValidation.js.map +1 -1
- package/lib/esm/formula/FormulaTokensValidator.d.ts +1 -1
- package/lib/esm/formula/FormulaTokensValidator.js +3 -1
- package/lib/esm/formula/FormulaTokensValidator.js.map +1 -1
- package/lib/esm/formula/FormulaValidator.d.ts +1 -1
- package/lib/esm/formula/FormulaValidator.js +2 -2
- package/lib/esm/formula/FormulaValidator.js.map +1 -1
- package/lib/esm/grouping-mapping-widget.d.ts +4 -0
- package/lib/esm/grouping-mapping-widget.js +4 -0
- package/lib/esm/grouping-mapping-widget.js.map +1 -1
- package/lib/esm/widget/GroupingMappingWidget.d.ts +3 -1
- package/lib/esm/widget/GroupingMappingWidget.js +3 -2
- package/lib/esm/widget/GroupingMappingWidget.js.map +1 -1
- package/lib/esm/widget/IMappingClient.d.ts +327 -0
- package/lib/esm/widget/IMappingClient.js +6 -0
- package/lib/esm/widget/IMappingClient.js.map +1 -0
- package/lib/esm/widget/components/BlockingOverlay.d.ts +7 -0
- package/lib/esm/widget/components/BlockingOverlay.js +14 -0
- package/lib/esm/widget/components/BlockingOverlay.js.map +1 -0
- package/lib/esm/widget/components/BlockingOverlay.scss +26 -0
- package/lib/esm/widget/components/CalculatedPropertyAction.js +4 -5
- package/lib/esm/widget/components/CalculatedPropertyAction.js.map +1 -1
- package/lib/esm/widget/components/CalculatedPropertyTable.js +3 -4
- package/lib/esm/widget/components/CalculatedPropertyTable.js.map +1 -1
- package/lib/esm/widget/components/ConfirmMappingsImport.js +3 -4
- package/lib/esm/widget/components/ConfirmMappingsImport.js.map +1 -1
- package/lib/esm/widget/components/CustomCalculationAction.js +5 -6
- package/lib/esm/widget/components/CustomCalculationAction.js.map +1 -1
- package/lib/esm/widget/components/CustomCalculationTable.js +3 -4
- package/lib/esm/widget/components/CustomCalculationTable.js.map +1 -1
- package/lib/esm/widget/components/GroupAction.d.ts +2 -1
- package/lib/esm/widget/components/GroupAction.js +17 -12
- package/lib/esm/widget/components/GroupAction.js.map +1 -1
- package/lib/esm/widget/components/GroupPropertyAction.js +6 -8
- package/lib/esm/widget/components/GroupPropertyAction.js.map +1 -1
- package/lib/esm/widget/components/GroupPropertyTable.js +3 -4
- package/lib/esm/widget/components/GroupPropertyTable.js.map +1 -1
- package/lib/esm/widget/components/GroupQueryBuilderContainer.js +1 -0
- package/lib/esm/widget/components/GroupQueryBuilderContainer.js.map +1 -1
- package/lib/esm/widget/components/GroupQueryBuilderContext.d.ts +1 -0
- package/lib/esm/widget/components/GroupQueryBuilderContext.js +1 -0
- package/lib/esm/widget/components/GroupQueryBuilderContext.js.map +1 -1
- package/lib/esm/widget/components/GroupTile.d.ts +13 -0
- package/lib/esm/widget/components/GroupTile.js +11 -0
- package/lib/esm/widget/components/GroupTile.js.map +1 -0
- package/lib/esm/widget/components/GroupTile.scss +32 -0
- package/lib/esm/widget/components/Grouping.js +230 -170
- package/lib/esm/widget/components/Grouping.js.map +1 -1
- package/lib/esm/widget/components/Grouping.scss +39 -4
- package/lib/esm/widget/components/GroupingMapping.d.ts +15 -3
- package/lib/esm/widget/components/GroupingMapping.js +27 -4
- package/lib/esm/widget/components/GroupingMapping.js.map +1 -1
- package/lib/esm/widget/components/Mapping.js +35 -14
- package/lib/esm/widget/components/Mapping.js.map +1 -1
- package/lib/esm/widget/components/MappingAction.js +12 -7
- package/lib/esm/widget/components/MappingAction.js.map +1 -1
- package/lib/esm/widget/components/PropertyMenu.js +28 -21
- package/lib/esm/widget/components/PropertyMenu.js.map +1 -1
- package/lib/esm/widget/components/QueryBuilder.d.ts +11 -5
- package/lib/esm/widget/components/QueryBuilder.js +230 -142
- package/lib/esm/widget/components/QueryBuilder.js.map +1 -1
- package/lib/esm/widget/components/SelectMappings.js +6 -7
- package/lib/esm/widget/components/SelectMappings.js.map +1 -1
- package/lib/esm/widget/components/property-grid/PropertyView.js +5 -0
- package/lib/esm/widget/components/property-grid/PropertyView.js.map +1 -1
- package/lib/esm/widget/components/utils.d.ts +6 -0
- package/lib/esm/widget/components/utils.js +6 -0
- package/lib/esm/widget/components/utils.js.map +1 -1
- package/lib/esm/widget/components/utils.scss +12 -3
- package/lib/esm/widget/components/viewerUtils.d.ts +19 -0
- package/lib/esm/widget/components/viewerUtils.js +207 -3
- package/lib/esm/widget/components/viewerUtils.js.map +1 -1
- package/lib/esm/widget/hooks/useFormulaValidation.d.ts +1 -1
- package/lib/esm/widget/hooks/useFormulaValidation.js +5 -5
- package/lib/esm/widget/hooks/useFormulaValidation.js.map +1 -1
- package/package.json +30 -30
|
@@ -1,16 +1,20 @@
|
|
|
1
|
-
|
|
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
|
+
*--------------------------------------------------------------------------------------------*/
|
|
2
5
|
import { useActiveIModelConnection } from "@itwin/appui-react";
|
|
3
|
-
import React, { useCallback, useContext, useEffect,
|
|
4
|
-
import { Button, DropdownMenu, IconButton, MenuItem, ProgressRadial,
|
|
5
|
-
import { SvgAdd, SvgDelete, SvgEdit, SvgList, SvgMore, } from "@itwin/itwinui-icons-react";
|
|
6
|
+
import React, { useCallback, useContext, useEffect, useRef, useState, } from "react";
|
|
7
|
+
import { Button, ButtonGroup, DropdownMenu, IconButton, MenuItem, ProgressRadial, Surface, toaster, ToggleSwitch, } from "@itwin/itwinui-react";
|
|
8
|
+
import { SvgAdd, SvgDelete, SvgEdit, SvgList, SvgMore, SvgVisibilityHide, SvgVisibilityShow, } from "@itwin/itwinui-icons-react";
|
|
6
9
|
import DeleteModal from "./DeleteModal";
|
|
7
10
|
import "./Grouping.scss";
|
|
8
11
|
import { PropertyMenu } from "./PropertyMenu";
|
|
9
|
-
import { clearEmphasizedElements,
|
|
10
|
-
import { fetchIdsFromQuery, handleError, WidgetHeader } from "./utils";
|
|
12
|
+
import { clearEmphasizedElements, clearEmphasizedOverriddenElements, clearHiddenElements, clearOverriddenElements, emphasisElementsById, emphasizeElements, getHiliteIds, hideElements, hideElementsById, overrideElements, overrideElementsById, zoomToElements, } from "./viewerUtils";
|
|
13
|
+
import { EmptyMessage, fetchIdsFromQuery, handleError, LoadingOverlay, WidgetHeader, } from "./utils";
|
|
11
14
|
import GroupAction from "./GroupAction";
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
15
|
+
import { ApiContext, MappingClientContext } from "./GroupingMapping";
|
|
16
|
+
import { FeatureOverrideType } from "@itwin/core-common";
|
|
17
|
+
import { GroupTile } from "./GroupTile";
|
|
14
18
|
var GroupsView;
|
|
15
19
|
(function (GroupsView) {
|
|
16
20
|
GroupsView["GROUPS"] = "groups";
|
|
@@ -18,12 +22,13 @@ var GroupsView;
|
|
|
18
22
|
GroupsView["ADD"] = "ADD";
|
|
19
23
|
GroupsView["PROPERTIES"] = "properties";
|
|
20
24
|
})(GroupsView || (GroupsView = {}));
|
|
21
|
-
const
|
|
25
|
+
const goldenAngle = 180 * (3 - Math.sqrt(5));
|
|
26
|
+
const fetchGroups = async (setGroups, iModelId, mappingId, setIsLoading, apiContext, mappingClient) => {
|
|
22
27
|
try {
|
|
23
28
|
setIsLoading(true);
|
|
24
|
-
const
|
|
25
|
-
const groups = await reportingClientApi.getGroups(apiContext.accessToken, iModelId, mappingId);
|
|
29
|
+
const groups = await mappingClient.getGroups(apiContext.accessToken, iModelId, mappingId);
|
|
26
30
|
setGroups(groups);
|
|
31
|
+
return groups;
|
|
27
32
|
}
|
|
28
33
|
catch (error) {
|
|
29
34
|
handleError(error.status);
|
|
@@ -31,214 +36,269 @@ const fetchGroups = async (setGroups, iModelId, mappingId, setIsLoading, apiCont
|
|
|
31
36
|
finally {
|
|
32
37
|
setIsLoading(false);
|
|
33
38
|
}
|
|
39
|
+
return undefined;
|
|
34
40
|
};
|
|
35
41
|
export const Groupings = ({ mapping, goBack }) => {
|
|
36
42
|
var _a, _b, _c, _d, _e, _f;
|
|
37
43
|
const iModelConnection = useActiveIModelConnection();
|
|
38
44
|
const apiContext = useContext(ApiContext);
|
|
45
|
+
const mappingClient = useContext(MappingClientContext);
|
|
39
46
|
const iModelId = (_a = useActiveIModelConnection()) === null || _a === void 0 ? void 0 : _a.iModelId;
|
|
40
47
|
const [showDeleteModal, setShowDeleteModal] = useState(false);
|
|
41
48
|
const [isLoading, setIsLoading] = useState(true);
|
|
42
49
|
const [groupsView, setGroupsView] = useState(GroupsView.GROUPS);
|
|
43
50
|
const [selectedGroup, setSelectedGroup] = useState(undefined);
|
|
44
51
|
const hilitedElements = useRef(new Map());
|
|
45
|
-
const [selectedRows, setSelectedRows] = useState({});
|
|
46
52
|
const [isLoadingQuery, setLoadingQuery] = useState(false);
|
|
47
53
|
const [groups, setGroups] = useState([]);
|
|
54
|
+
const [hiddenGroupsIds, setHiddenGroupsIds] = useState([]);
|
|
55
|
+
const [showGroupColor, setShowGroupColor] = useState(false);
|
|
48
56
|
useEffect(() => {
|
|
49
57
|
var _a;
|
|
50
|
-
void fetchGroups(setGroups, iModelId, (_a = mapping.id) !== null && _a !== void 0 ? _a : "", setIsLoading, apiContext);
|
|
51
|
-
}, [apiContext, iModelId, mapping.id, setIsLoading]);
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
setGroupsView(GroupsView.GROUPS);
|
|
55
|
-
setSelectedGroup(undefined);
|
|
56
|
-
setGroups([]);
|
|
57
|
-
await fetchGroups(setGroups, iModelId, (_a = mapping.id) !== null && _a !== void 0 ? _a : "", setIsLoading, apiContext);
|
|
58
|
-
}, [apiContext, iModelId, mapping.id, setGroups]);
|
|
59
|
-
const addGroup = () => {
|
|
60
|
-
// TODO Retain selection in view without emphasizes. Goal is to make it so we can distinguish
|
|
61
|
-
// hilited elements from regular elements without emphasis due to it blocking selection. For now clearing
|
|
62
|
-
// selection.
|
|
63
|
-
clearEmphasizedElements();
|
|
64
|
-
setGroupsView(GroupsView.ADD);
|
|
58
|
+
void fetchGroups(setGroups, iModelId, (_a = mapping.id) !== null && _a !== void 0 ? _a : "", setIsLoading, apiContext, mappingClient);
|
|
59
|
+
}, [apiContext, mappingClient, iModelId, mapping.id, setIsLoading]);
|
|
60
|
+
const getGroupColor = function (index) {
|
|
61
|
+
return `hsl(${index * goldenAngle + 60}, 100%, 50%)`;
|
|
65
62
|
};
|
|
66
|
-
const
|
|
67
|
-
clearEmphasizedElements();
|
|
68
|
-
setSelectedGroup(value.row.original);
|
|
69
|
-
setGroupsView(GroupsView.MODIFYING);
|
|
70
|
-
}, []);
|
|
71
|
-
const openProperties = useCallback((value) => {
|
|
72
|
-
clearEmphasizedElements();
|
|
73
|
-
setSelectedGroup(value.row.original);
|
|
74
|
-
setGroupsView(GroupsView.PROPERTIES);
|
|
75
|
-
}, []);
|
|
76
|
-
const groupsColumns = useMemo(() => [
|
|
77
|
-
{
|
|
78
|
-
Header: "Table",
|
|
79
|
-
columns: [
|
|
80
|
-
{
|
|
81
|
-
id: "groupName",
|
|
82
|
-
Header: "Group",
|
|
83
|
-
accessor: "groupName",
|
|
84
|
-
Cell: (value) => (React.createElement(React.Fragment, null, isLoadingQuery ? (value.row.original.groupName) : (React.createElement("div", { className: 'iui-anchor', onClick: (e) => {
|
|
85
|
-
e.stopPropagation();
|
|
86
|
-
openProperties(value);
|
|
87
|
-
} }, value.row.original.groupName)))),
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
id: "description",
|
|
91
|
-
Header: "Description",
|
|
92
|
-
accessor: "description",
|
|
93
|
-
},
|
|
94
|
-
{
|
|
95
|
-
id: "dropdown",
|
|
96
|
-
Header: "",
|
|
97
|
-
width: 80,
|
|
98
|
-
Cell: (value) => {
|
|
99
|
-
return (React.createElement("div", { onClick: (e) => e.stopPropagation() },
|
|
100
|
-
React.createElement(DropdownMenu, { disabled: isLoadingQuery, menuItems: (close) => [
|
|
101
|
-
React.createElement(MenuItem, { key: 0, onClick: () => onModify(value), icon: React.createElement(SvgEdit, null) }, "Modify"),
|
|
102
|
-
React.createElement(MenuItem, { key: 1, onClick: () => openProperties(value), icon: React.createElement(SvgList, null) }, "Properties"),
|
|
103
|
-
React.createElement(MenuItem, { key: 2, onClick: () => {
|
|
104
|
-
setSelectedGroup(value.row.original);
|
|
105
|
-
setShowDeleteModal(true);
|
|
106
|
-
close();
|
|
107
|
-
}, icon: React.createElement(SvgDelete, null) }, "Remove"),
|
|
108
|
-
] },
|
|
109
|
-
React.createElement(IconButton, { disabled: isLoadingQuery, styleType: 'borderless' },
|
|
110
|
-
React.createElement(SvgMore, { style: {
|
|
111
|
-
width: "16px",
|
|
112
|
-
height: "16px",
|
|
113
|
-
} })))));
|
|
114
|
-
},
|
|
115
|
-
},
|
|
116
|
-
],
|
|
117
|
-
},
|
|
118
|
-
], [isLoadingQuery, onModify, openProperties]);
|
|
119
|
-
// Temp
|
|
120
|
-
const stringToColor = function (str) {
|
|
121
|
-
let hash = 0;
|
|
122
|
-
for (let i = 0; i < str.length; i++) {
|
|
123
|
-
hash = str.charCodeAt(i) + ((hash << 5) - hash);
|
|
124
|
-
}
|
|
125
|
-
let colour = "#";
|
|
126
|
-
for (let i = 0; i < 3; i++) {
|
|
127
|
-
const value = (hash >> (i * 8)) & 0xff;
|
|
128
|
-
colour += (`00${value.toString(16)}`).substr(-2);
|
|
129
|
-
}
|
|
130
|
-
return colour;
|
|
131
|
-
};
|
|
132
|
-
const onSelect = useCallback(async (selectedData) => {
|
|
63
|
+
const visualizeGroupColors = useCallback(async (viewGroups) => {
|
|
133
64
|
var _a, _b, _c, _d;
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
65
|
+
setLoadingQuery(true);
|
|
66
|
+
clearEmphasizedOverriddenElements();
|
|
67
|
+
let allIds = [];
|
|
68
|
+
for (const group of viewGroups) {
|
|
69
|
+
const index = viewGroups.length > groups.length
|
|
70
|
+
? viewGroups.findIndex((g) => g.id === group.id)
|
|
71
|
+
: groups.findIndex((g) => g.id === group.id);
|
|
72
|
+
const query = (_a = group.query) !== null && _a !== void 0 ? _a : "";
|
|
73
|
+
if (hilitedElements.current.has(query)) {
|
|
74
|
+
const hilitedIds = (_b = hilitedElements.current.get(query)) !== null && _b !== void 0 ? _b : [];
|
|
75
|
+
overrideElements(hilitedIds, getGroupColor(index), FeatureOverrideType.ColorAndAlpha);
|
|
76
|
+
emphasizeElements(hilitedIds, undefined);
|
|
77
|
+
if (!hiddenGroupsIds.includes((_c = group.id) !== null && _c !== void 0 ? _c : "")) {
|
|
143
78
|
allIds = allIds.concat(hilitedIds);
|
|
144
79
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
}
|
|
151
|
-
const hiliteIds = await visualizeElementsById(ids, stringToColor((_d = row.id) !== null && _d !== void 0 ? _d : ""), iModelConnection);
|
|
152
|
-
hilitedElements.current.set(query, hiliteIds);
|
|
153
|
-
allIds = allIds.concat(ids);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
try {
|
|
83
|
+
const ids = await fetchIdsFromQuery(query, iModelConnection);
|
|
84
|
+
if (ids.length === 0) {
|
|
85
|
+
toaster.warning(`${group.groupName}'s query is valid but produced no results.`);
|
|
154
86
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
return selectedRowIds;
|
|
161
|
-
});
|
|
162
|
-
toaster.negative(`Could not load ${row.groupName}. Query could not be resolved.`);
|
|
87
|
+
await overrideElementsById(iModelConnection, ids, getGroupColor(index), FeatureOverrideType.ColorAndAlpha);
|
|
88
|
+
const hiliteIds = await emphasisElementsById(iModelConnection, ids, undefined);
|
|
89
|
+
hilitedElements.current.set(query, hiliteIds);
|
|
90
|
+
if (!hiddenGroupsIds.includes((_d = group.id) !== null && _d !== void 0 ? _d : "")) {
|
|
91
|
+
allIds = allIds.concat(hiliteIds);
|
|
163
92
|
}
|
|
164
93
|
}
|
|
94
|
+
catch {
|
|
95
|
+
toaster.negative(`Could not load ${group.groupName}. Query could not be resolved.`);
|
|
96
|
+
}
|
|
165
97
|
}
|
|
166
|
-
await zoomToElements(allIds);
|
|
167
|
-
setLoadingQuery(false);
|
|
168
98
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
99
|
+
await zoomToElements(allIds);
|
|
100
|
+
setLoadingQuery(false);
|
|
101
|
+
}, [iModelConnection, groups, hiddenGroupsIds]);
|
|
102
|
+
const hideGroups = useCallback(async (viewGroups, zoomTo = true) => {
|
|
103
|
+
var _a, _b;
|
|
104
|
+
setLoadingQuery(true);
|
|
105
|
+
let allIds = [];
|
|
106
|
+
for (const viewGroup of viewGroups) {
|
|
107
|
+
const query = (_a = viewGroup.query) !== null && _a !== void 0 ? _a : "";
|
|
108
|
+
if (hilitedElements.current.has(query)) {
|
|
109
|
+
const hilitedIds = (_b = hilitedElements.current.get(query)) !== null && _b !== void 0 ? _b : [];
|
|
110
|
+
hideElements(hilitedIds);
|
|
111
|
+
allIds = allIds.concat(hilitedIds);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
try {
|
|
115
|
+
const ids = await fetchIdsFromQuery(query, iModelConnection);
|
|
116
|
+
if (ids.length === 0) {
|
|
117
|
+
toaster.warning(`${viewGroup.groupName}'s query is valid but produced no results.`);
|
|
118
|
+
}
|
|
119
|
+
const hiliteIds = await hideElementsById(ids, iModelConnection, false);
|
|
120
|
+
hilitedElements.current.set(query, hiliteIds);
|
|
121
|
+
allIds = allIds.concat(hiliteIds);
|
|
189
122
|
}
|
|
190
|
-
|
|
191
|
-
|
|
123
|
+
catch {
|
|
124
|
+
toaster.negative(`Could not hide/show ${viewGroup.groupName}. Query could not be resolved.`);
|
|
192
125
|
}
|
|
193
|
-
setSelectedRows(newSelectedRows);
|
|
194
|
-
newState.selectedRowIds = newSelectedRows;
|
|
195
|
-
break;
|
|
196
126
|
}
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
127
|
+
}
|
|
128
|
+
if (zoomTo) {
|
|
129
|
+
await zoomToElements(allIds);
|
|
130
|
+
}
|
|
131
|
+
setLoadingQuery(false);
|
|
132
|
+
}, [iModelConnection]);
|
|
133
|
+
const showGroup = useCallback(async (viewGroup) => {
|
|
134
|
+
var _a, _b;
|
|
135
|
+
clearHiddenElements();
|
|
136
|
+
const newHiddenGroups = [];
|
|
137
|
+
for (const id of hiddenGroupsIds) {
|
|
138
|
+
if (id === viewGroup.id) {
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
const newHiddenGroup = groups.find((g) => g.id === id);
|
|
142
|
+
if (newHiddenGroup) {
|
|
143
|
+
newHiddenGroups.push(newHiddenGroup);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
await hideGroups(newHiddenGroups, false);
|
|
147
|
+
// zoom to showed elements
|
|
148
|
+
const query = (_a = viewGroup.query) !== null && _a !== void 0 ? _a : "";
|
|
149
|
+
if (hilitedElements.current.has(query)) {
|
|
150
|
+
const hiliteIds = (_b = hilitedElements.current.get(query)) !== null && _b !== void 0 ? _b : [];
|
|
151
|
+
await zoomToElements(hiliteIds);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
try {
|
|
155
|
+
const ids = await fetchIdsFromQuery(query, iModelConnection);
|
|
156
|
+
if (ids.length === 0) {
|
|
157
|
+
toaster.warning(`${viewGroup.groupName}'s query is valid but produced no results.`);
|
|
204
158
|
}
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
159
|
+
const hiliteIds = await getHiliteIds(ids, iModelConnection);
|
|
160
|
+
await zoomToElements(hiliteIds);
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
toaster.negative(`Could not hide/show ${viewGroup.groupName}. Query could not be resolved.`);
|
|
208
164
|
}
|
|
209
|
-
default:
|
|
210
|
-
break;
|
|
211
165
|
}
|
|
212
|
-
|
|
166
|
+
}, [groups, hiddenGroupsIds, hideGroups, iModelConnection, hilitedElements]);
|
|
167
|
+
const addGroup = () => {
|
|
168
|
+
clearEmphasizedElements();
|
|
169
|
+
setGroupsView(GroupsView.ADD);
|
|
213
170
|
};
|
|
171
|
+
const onModify = async (group) => {
|
|
172
|
+
setSelectedGroup(group);
|
|
173
|
+
setGroupsView(GroupsView.MODIFYING);
|
|
174
|
+
if ((group === null || group === void 0 ? void 0 : group.id) && hiddenGroupsIds.includes(group.id)) {
|
|
175
|
+
await showGroup(group);
|
|
176
|
+
setHiddenGroupsIds(hiddenGroupsIds.filter((id) => id !== group.id));
|
|
177
|
+
}
|
|
178
|
+
clearEmphasizedElements();
|
|
179
|
+
};
|
|
180
|
+
const openProperties = async (group) => {
|
|
181
|
+
setSelectedGroup(group);
|
|
182
|
+
setGroupsView(GroupsView.PROPERTIES);
|
|
183
|
+
if ((group === null || group === void 0 ? void 0 : group.id) && hiddenGroupsIds.includes(group.id)) {
|
|
184
|
+
await showGroup(group);
|
|
185
|
+
setHiddenGroupsIds(hiddenGroupsIds.filter((id) => id !== group.id));
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
const refresh = useCallback(async () => {
|
|
189
|
+
var _a;
|
|
190
|
+
setGroupsView(GroupsView.GROUPS);
|
|
191
|
+
setSelectedGroup(undefined);
|
|
192
|
+
setGroups([]);
|
|
193
|
+
const groups = await fetchGroups(setGroups, iModelId, (_a = mapping.id) !== null && _a !== void 0 ? _a : "", setIsLoading, apiContext, mappingClient);
|
|
194
|
+
if (groups) {
|
|
195
|
+
if (showGroupColor) {
|
|
196
|
+
await visualizeGroupColors(groups);
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
clearEmphasizedOverriddenElements();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}, [
|
|
203
|
+
apiContext,
|
|
204
|
+
mappingClient,
|
|
205
|
+
iModelId,
|
|
206
|
+
mapping.id,
|
|
207
|
+
setGroups,
|
|
208
|
+
showGroupColor,
|
|
209
|
+
visualizeGroupColors,
|
|
210
|
+
]);
|
|
211
|
+
const resetView = async () => {
|
|
212
|
+
if (groups) {
|
|
213
|
+
if (showGroupColor) {
|
|
214
|
+
await visualizeGroupColors(groups);
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
clearOverriddenElements();
|
|
218
|
+
}
|
|
219
|
+
clearEmphasizedElements();
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
const showAll = async () => {
|
|
223
|
+
setLoadingQuery(true);
|
|
224
|
+
clearHiddenElements();
|
|
225
|
+
setHiddenGroupsIds([]);
|
|
226
|
+
await zoomToElements(Array.from(hilitedElements.current.values()).flat());
|
|
227
|
+
setLoadingQuery(false);
|
|
228
|
+
};
|
|
229
|
+
const hideAll = useCallback(async () => {
|
|
230
|
+
await hideGroups(groups);
|
|
231
|
+
setHiddenGroupsIds(groups.map((g) => g.id).filter((id) => !!id));
|
|
232
|
+
}, [setHiddenGroupsIds, groups, hideGroups]);
|
|
233
|
+
const toggleGroupColor = useCallback(async (e) => {
|
|
234
|
+
if (e.target.checked) {
|
|
235
|
+
await visualizeGroupColors(groups);
|
|
236
|
+
setShowGroupColor(true);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
clearEmphasizedOverriddenElements();
|
|
240
|
+
setShowGroupColor(false);
|
|
241
|
+
}
|
|
242
|
+
}, [groups, visualizeGroupColors, setShowGroupColor]);
|
|
243
|
+
const propertyMenuGoBack = useCallback(async () => {
|
|
244
|
+
setGroupsView(GroupsView.GROUPS);
|
|
245
|
+
await refresh();
|
|
246
|
+
}, [refresh]);
|
|
214
247
|
switch (groupsView) {
|
|
215
248
|
case GroupsView.ADD:
|
|
216
249
|
return (React.createElement(GroupAction, { iModelId: iModelId, mappingId: (_b = mapping.id) !== null && _b !== void 0 ? _b : "", goBack: async () => {
|
|
217
|
-
clearEmphasizedElements();
|
|
218
250
|
setGroupsView(GroupsView.GROUPS);
|
|
219
251
|
await refresh();
|
|
220
|
-
} }));
|
|
252
|
+
}, resetView: resetView }));
|
|
221
253
|
case GroupsView.MODIFYING:
|
|
222
254
|
return selectedGroup ? (React.createElement(GroupAction, { iModelId: iModelId, mappingId: (_c = mapping.id) !== null && _c !== void 0 ? _c : "", group: selectedGroup, goBack: async () => {
|
|
223
|
-
clearEmphasizedElements();
|
|
224
255
|
setGroupsView(GroupsView.GROUPS);
|
|
225
256
|
await refresh();
|
|
226
|
-
} })) : null;
|
|
257
|
+
}, resetView: resetView })) : null;
|
|
227
258
|
case GroupsView.PROPERTIES:
|
|
228
259
|
return selectedGroup ? (React.createElement(PropertyMenu, { iModelId: iModelId, mappingId: (_d = mapping.id) !== null && _d !== void 0 ? _d : "", group: selectedGroup, goBack: propertyMenuGoBack })) : null;
|
|
229
260
|
default:
|
|
230
261
|
return (React.createElement(React.Fragment, null,
|
|
231
262
|
React.createElement(WidgetHeader, { title: (_e = mapping.mappingName) !== null && _e !== void 0 ? _e : "", disabled: isLoading || isLoadingQuery, returnFn: async () => {
|
|
232
|
-
|
|
263
|
+
clearEmphasizedOverriddenElements();
|
|
233
264
|
await goBack();
|
|
234
265
|
} }),
|
|
235
|
-
React.createElement(
|
|
236
|
-
React.createElement(
|
|
237
|
-
|
|
266
|
+
React.createElement(Surface, { className: "groups-container" },
|
|
267
|
+
React.createElement("div", { className: "toolbar" },
|
|
268
|
+
React.createElement(Button, { startIcon: isLoadingQuery ? (React.createElement(ProgressRadial, { size: "small", indeterminate: true })) : (React.createElement(SvgAdd, null)), styleType: "high-visibility", disabled: isLoadingQuery, onClick: addGroup }, isLoadingQuery ? "Loading Group(s)" : "Add Group"),
|
|
269
|
+
React.createElement(ButtonGroup, { className: "toolbar-buttons" },
|
|
270
|
+
React.createElement(ToggleSwitch, { label: "Color by Group", labelPosition: "left", className: "group-view-icon toggle", disabled: isLoadingQuery, checked: showGroupColor, onChange: toggleGroupColor }),
|
|
271
|
+
React.createElement(IconButton, { title: "Show All", onClick: showAll, disabled: isLoadingQuery, styleType: "borderless", className: "group-view-icon" },
|
|
272
|
+
React.createElement(SvgVisibilityShow, null)),
|
|
273
|
+
React.createElement(IconButton, { title: "Hide All", onClick: hideAll, disabled: isLoadingQuery, styleType: "borderless", className: "group-view-icon" },
|
|
274
|
+
React.createElement(SvgVisibilityHide, null)))),
|
|
275
|
+
isLoading ? (React.createElement(LoadingOverlay, null)) : groups.length === 0 ? (React.createElement(EmptyMessage, { message: "No Groups available." })) : (React.createElement("div", { className: "group-list" }, groups.map((g) => (React.createElement(GroupTile, { key: g.id, title: g.groupName ? g.groupName : "Untitled", subText: g.description, actionGroup: React.createElement("div", { className: "actions" },
|
|
276
|
+
g.id && hiddenGroupsIds.includes(g.id) ? (React.createElement(IconButton, { disabled: isLoadingQuery, styleType: "borderless", className: "group-view-icon", onClick: async () => {
|
|
277
|
+
await showGroup(g);
|
|
278
|
+
setHiddenGroupsIds(hiddenGroupsIds.filter((id) => g.id !== id));
|
|
279
|
+
} },
|
|
280
|
+
React.createElement(SvgVisibilityHide, null))) : (React.createElement(IconButton, { disabled: isLoadingQuery, styleType: "borderless", className: "group-view-icon", onClick: async () => {
|
|
281
|
+
await hideGroups([g]);
|
|
282
|
+
setHiddenGroupsIds(hiddenGroupsIds.concat(g.id ? [g.id] : []));
|
|
283
|
+
} },
|
|
284
|
+
React.createElement(SvgVisibilityShow, null))),
|
|
285
|
+
React.createElement(DropdownMenu, { disabled: isLoadingQuery, menuItems: (close) => [
|
|
286
|
+
React.createElement(MenuItem, { key: 0, onClick: async () => onModify(g), icon: React.createElement(SvgEdit, null) }, "Modify"),
|
|
287
|
+
React.createElement(MenuItem, { key: 1, onClick: async () => openProperties(g), icon: React.createElement(SvgList, null) }, "Properties"),
|
|
288
|
+
React.createElement(MenuItem, { key: 2, onClick: () => {
|
|
289
|
+
setSelectedGroup(g);
|
|
290
|
+
setShowDeleteModal(true);
|
|
291
|
+
close();
|
|
292
|
+
}, icon: React.createElement(SvgDelete, null) }, "Remove"),
|
|
293
|
+
] },
|
|
294
|
+
React.createElement(IconButton, { disabled: isLoadingQuery, styleType: "borderless" },
|
|
295
|
+
React.createElement(SvgMore, { style: {
|
|
296
|
+
width: "16px",
|
|
297
|
+
height: "16px",
|
|
298
|
+
} })))), onClickTitle: isLoadingQuery ? undefined : async () => openProperties(g) })))))),
|
|
238
299
|
React.createElement(DeleteModal, { entityName: (_f = selectedGroup === null || selectedGroup === void 0 ? void 0 : selectedGroup.groupName) !== null && _f !== void 0 ? _f : "", show: showDeleteModal, setShow: setShowDeleteModal, onDelete: async () => {
|
|
239
300
|
var _a, _b;
|
|
240
|
-
|
|
241
|
-
await reportingClientApi.deleteGroup(apiContext.accessToken, iModelId, (_a = mapping.id) !== null && _a !== void 0 ? _a : "", (_b = selectedGroup === null || selectedGroup === void 0 ? void 0 : selectedGroup.id) !== null && _b !== void 0 ? _b : "");
|
|
301
|
+
await mappingClient.deleteGroup(apiContext.accessToken, iModelId, (_a = mapping.id) !== null && _a !== void 0 ? _a : "", (_b = selectedGroup === null || selectedGroup === void 0 ? void 0 : selectedGroup.id) !== null && _b !== void 0 ? _b : "");
|
|
242
302
|
}, refresh: refresh })));
|
|
243
303
|
}
|
|
244
304
|
};
|
|
@@ -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 type {\n ActionType,\n CellProps,\n TableInstance,\n TableState,\n} from \"react-table\";\nimport {\n actions,\n} from \"react-table\";\nimport { useActiveIModelConnection } from \"@itwin/appui-react\";\nimport React, {\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { CreateTypeFromInterface } from \"../utils\";\nimport {\n Button,\n DropdownMenu,\n IconButton,\n MenuItem,\n ProgressRadial,\n Table,\n toaster,\n} from \"@itwin/itwinui-react\";\nimport {\n SvgAdd,\n SvgDelete,\n SvgEdit,\n SvgList,\n SvgMore,\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 visualizeElements,\n visualizeElementsById,\n zoomToElements,\n} from \"./viewerUtils\";\nimport { fetchIdsFromQuery, handleError, WidgetHeader } from \"./utils\";\nimport GroupAction from \"./GroupAction\";\nimport type { Group, Mapping } from \"@itwin/insights-client\";\nimport { ReportingClient } from \"@itwin/insights-client\";\nimport type { Api } from \"./GroupingMapping\";\nimport { ApiContext } from \"./GroupingMapping\";\n\nexport type GroupType = 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 fetchGroups = async (\n setGroups: React.Dispatch<React.SetStateAction<GroupType[]>>,\n iModelId: string,\n mappingId: string,\n setIsLoading: React.Dispatch<React.SetStateAction<boolean>>,\n apiContext: Api\n) => {\n try {\n setIsLoading(true);\n const reportingClientApi = new ReportingClient(apiContext.prefix);\n const groups = await reportingClientApi.getGroups(apiContext.accessToken, iModelId, mappingId);\n setGroups(groups);\n } catch (error: any) {\n handleError(error.status);\n } finally {\n setIsLoading(false);\n }\n};\n\nexport const Groupings = ({ mapping, goBack }: GroupsTreeProps) => {\n const iModelConnection = useActiveIModelConnection() as IModelConnection;\n const apiContext = useContext(ApiContext);\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<GroupType | undefined>(\n undefined,\n );\n const hilitedElements = useRef<Map<string, string[]>>(new Map());\n const [selectedRows, setSelectedRows] = useState<Record<string, boolean>>({});\n const [isLoadingQuery, setLoadingQuery] = useState<boolean>(false);\n const [groups, setGroups] = useState<Group[]>([]);\n\n useEffect(() => {\n void fetchGroups(setGroups, iModelId, mapping.id ?? \"\", setIsLoading, apiContext);\n }, [apiContext, iModelId, mapping.id, setIsLoading]);\n\n const refresh = useCallback(async () => {\n setGroupsView(GroupsView.GROUPS);\n setSelectedGroup(undefined);\n setGroups([]);\n await fetchGroups(setGroups, iModelId, mapping.id ?? \"\", setIsLoading, apiContext);\n }, [apiContext, iModelId, mapping.id, setGroups]);\n\n const addGroup = () => {\n // TODO Retain selection in view without emphasizes. Goal is to make it so we can distinguish\n // hilited elements from regular elements without emphasis due to it blocking selection. For now clearing\n // selection.\n clearEmphasizedElements();\n setGroupsView(GroupsView.ADD);\n };\n\n const onModify = useCallback((value) => {\n clearEmphasizedElements();\n setSelectedGroup(value.row.original);\n setGroupsView(GroupsView.MODIFYING);\n }, []);\n\n const openProperties = useCallback((value) => {\n clearEmphasizedElements();\n setSelectedGroup(value.row.original);\n setGroupsView(GroupsView.PROPERTIES);\n }, []);\n\n const groupsColumns = useMemo(\n () => [\n {\n Header: \"Table\",\n columns: [\n {\n id: \"groupName\",\n Header: \"Group\",\n accessor: \"groupName\",\n Cell: (value: CellProps<GroupType>) => (\n <>\n {isLoadingQuery ? (\n value.row.original.groupName\n ) : (\n <div\n className='iui-anchor'\n onClick={(e) => {\n e.stopPropagation();\n openProperties(value);\n }}\n >\n {value.row.original.groupName}\n </div>\n )}\n </>\n ),\n },\n {\n id: \"description\",\n Header: \"Description\",\n accessor: \"description\",\n },\n {\n id: \"dropdown\",\n Header: \"\",\n width: 80,\n Cell: (value: CellProps<GroupType>) => {\n return (\n <div onClick={(e) => e.stopPropagation()}>\n <DropdownMenu\n disabled={isLoadingQuery}\n menuItems={(close: () => void) => [\n <MenuItem\n key={0}\n onClick={() => onModify(value)}\n icon={<SvgEdit />}\n >\n Modify\n </MenuItem>,\n <MenuItem\n key={1}\n onClick={() => openProperties(value)}\n icon={<SvgList />}\n >\n Properties\n </MenuItem>,\n <MenuItem\n key={2}\n onClick={() => {\n setSelectedGroup(value.row.original);\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 },\n },\n ],\n },\n ],\n [isLoadingQuery, onModify, openProperties],\n );\n\n // Temp\n const stringToColor = function (str: string) {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\n }\n let colour = \"#\";\n for (let i = 0; i < 3; i++) {\n const value = (hash >> (i * 8)) & 0xff;\n colour += (`00${value.toString(16)}`).substr(-2);\n }\n return colour;\n };\n\n const onSelect = useCallback(\n async (selectedData: GroupType[] | undefined) => {\n clearEmphasizedElements();\n if (selectedData && selectedData.length > 0) {\n setLoadingQuery(true);\n let allIds: string[] = [];\n for (const row of selectedData) {\n const query = row.query ?? \"\";\n if (hilitedElements.current.has(query)) {\n const hilitedIds = hilitedElements.current.get(query) ?? [];\n visualizeElements(hilitedIds, stringToColor(row.id ?? \"\"));\n allIds = allIds.concat(hilitedIds);\n } else {\n try {\n const ids: string[] = await fetchIdsFromQuery(\n query,\n iModelConnection,\n );\n if (ids.length === 0) {\n toaster.warning(`${row.groupName}'s query is valid but produced no results.`);\n }\n const hiliteIds = await visualizeElementsById(\n ids,\n stringToColor(row.id ?? \"\"),\n iModelConnection,\n );\n hilitedElements.current.set(query, hiliteIds);\n\n allIds = allIds.concat(ids);\n } catch {\n const index = groups.findIndex((group) => group.id === row.id);\n setSelectedRows((rowIds) => {\n const selectedRowIds = { ...rowIds };\n delete selectedRowIds[index];\n return selectedRowIds;\n });\n toaster.negative(`Could not load ${row.groupName}. Query could not be resolved.`);\n\n }\n }\n }\n await zoomToElements(allIds);\n setLoadingQuery(false);\n }\n },\n [iModelConnection, groups],\n );\n\n const controlledState = useCallback(\n (state) => {\n return {\n ...state,\n selectedRowIds: { ...selectedRows },\n };\n },\n [selectedRows],\n );\n\n const propertyMenuGoBack = useCallback(async () => {\n clearEmphasizedElements();\n setGroupsView(GroupsView.GROUPS);\n await refresh();\n }, [refresh]);\n\n const tableStateReducer = (\n newState: TableState,\n action: ActionType,\n _previousState: TableState,\n instance?: TableInstance,\n ): TableState => {\n switch (action.type) {\n case actions.toggleRowSelected: {\n const newSelectedRows = {\n ...selectedRows,\n };\n if (action.value) {\n newSelectedRows[action.id] = true;\n } else {\n delete newSelectedRows[action.id];\n }\n setSelectedRows(newSelectedRows);\n newState.selectedRowIds = newSelectedRows;\n break;\n }\n case actions.toggleAllRowsSelected: {\n if (!instance?.rowsById) {\n break;\n }\n const newSelectedRows = {} as Record<string, boolean>;\n if (action.value) {\n Object.keys(instance.rowsById).forEach(\n (id) => (newSelectedRows[id] = true),\n );\n }\n setSelectedRows(newSelectedRows);\n newState.selectedRowIds = newSelectedRows;\n break;\n }\n default:\n break;\n }\n return newState;\n };\n\n switch (groupsView) {\n case GroupsView.ADD:\n return (\n <GroupAction\n iModelId={iModelId}\n mappingId={mapping.id ?? \"\"}\n goBack={async () => {\n clearEmphasizedElements();\n setGroupsView(GroupsView.GROUPS);\n await refresh();\n }}\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 clearEmphasizedElements();\n setGroupsView(GroupsView.GROUPS);\n await refresh();\n }}\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 clearEmphasizedElements();\n await goBack();\n }}\n />\n <div className='groups-container'>\n <Button\n startIcon={\n isLoadingQuery ? <ProgressRadial size=\"small\" indeterminate /> : <SvgAdd />\n }\n styleType='high-visibility'\n disabled={isLoadingQuery}\n onClick={() => addGroup()}\n >\n {isLoadingQuery ? \"Loading Group(s)\" : \"Add Group\"}\n </Button>\n <Table<GroupType>\n data={groups}\n density='extra-condensed'\n columns={groupsColumns}\n emptyTableContent='No Groups available.'\n isSortable\n isSelectable\n onSelect={onSelect}\n isLoading={isLoading}\n isRowDisabled={() => isLoadingQuery}\n stateReducer={tableStateReducer}\n useControlledState={controlledState}\n />\n </div>\n <DeleteModal\n entityName={selectedGroup?.groupName ?? \"\"}\n show={showDeleteModal}\n setShow={setShowDeleteModal}\n onDelete={async () => {\n const reportingClientApi = new ReportingClient(apiContext.prefix);\n await reportingClientApi.deleteGroup(\n apiContext.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, {\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} 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 emphasisElementsById,\n emphasizeElements,\n getHiliteIds,\n hideElements,\n hideElementsById,\n overrideElements,\n overrideElementsById,\n zoomToElements,\n} from \"./viewerUtils\";\nimport {\n EmptyMessage,\n fetchIdsFromQuery,\n handleError,\n LoadingOverlay,\n WidgetHeader,\n} from \"./utils\";\nimport GroupAction from \"./GroupAction\";\nimport type { Group, Mapping } from \"@itwin/insights-client\";\nimport type { Api } from \"./GroupingMapping\";\nimport { ApiContext, MappingClientContext } from \"./GroupingMapping\";\nimport { FeatureOverrideType } from \"@itwin/core-common\";\nimport { GroupTile } from \"./GroupTile\";\nimport type { IMappingClient } from \"../IMappingClient\";\n\nexport type GroupType = 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<GroupType[]>>,\n iModelId: string,\n mappingId: string,\n setIsLoading: React.Dispatch<React.SetStateAction<boolean>>,\n apiContext: Api,\n mappingClient: IMappingClient,\n): Promise<Group[] | undefined> => {\n try {\n setIsLoading(true);\n const groups = await mappingClient.getGroups(\n apiContext.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 apiContext = useContext(ApiContext);\n const mappingClient = useContext(MappingClientContext);\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<GroupType | 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 apiContext,\n mappingClient,\n );\n }, [apiContext, mappingClient, iModelId, mapping.id, setIsLoading]);\n\n const getGroupColor = function (index: number) {\n return `hsl(${index * goldenAngle + 60}, 100%, 50%)`;\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 query = group.query ?? \"\";\n if (hilitedElements.current.has(query)) {\n const hilitedIds = hilitedElements.current.get(query) ?? [];\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 } else {\n try {\n const ids: string[] = await fetchIdsFromQuery(\n query,\n iModelConnection,\n );\n if (ids.length === 0) {\n toaster.warning(\n `${group.groupName}'s query is valid but produced no results.`,\n );\n }\n await overrideElementsById(\n iModelConnection,\n ids,\n getGroupColor(index),\n FeatureOverrideType.ColorAndAlpha,\n );\n const hiliteIds = await emphasisElementsById(\n iModelConnection,\n ids,\n undefined,\n );\n hilitedElements.current.set(query, hiliteIds);\n if (!hiddenGroupsIds.includes(group.id ?? \"\")) {\n allIds = allIds.concat(hiliteIds);\n }\n } catch {\n toaster.negative(\n `Could not load ${group.groupName}. Query could not be resolved.`,\n );\n }\n }\n }\n await zoomToElements(allIds);\n setLoadingQuery(false);\n },\n [iModelConnection, groups, hiddenGroupsIds],\n );\n\n const hideGroups = useCallback(\n async (viewGroups: Group[], zoomTo: boolean = true) => {\n setLoadingQuery(true);\n let allIds: string[] = [];\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 allIds = allIds.concat(hilitedIds);\n } else {\n try {\n const ids: string[] = await fetchIdsFromQuery(\n query,\n iModelConnection,\n );\n if (ids.length === 0) {\n toaster.warning(\n `${viewGroup.groupName}'s query is valid but produced no results.`,\n );\n }\n const hiliteIds = await hideElementsById(\n ids,\n iModelConnection,\n false,\n );\n hilitedElements.current.set(query, hiliteIds);\n allIds = allIds.concat(hiliteIds);\n } catch {\n toaster.negative(\n `Could not hide/show ${viewGroup.groupName}. Query could not be resolved.`,\n );\n }\n }\n }\n if (zoomTo) {\n await zoomToElements(allIds);\n }\n setLoadingQuery(false);\n },\n [iModelConnection],\n );\n\n const showGroup = useCallback(\n async (viewGroup: Group) => {\n clearHiddenElements();\n const newHiddenGroups: Group[] = [];\n for (const id of hiddenGroupsIds) {\n if (id === viewGroup.id) {\n continue;\n }\n const newHiddenGroup = groups.find((g) => g.id === id);\n if (newHiddenGroup) {\n newHiddenGroups.push(newHiddenGroup);\n }\n }\n await hideGroups(newHiddenGroups, false);\n\n // zoom to showed elements\n const query = viewGroup.query ?? \"\";\n if (hilitedElements.current.has(query)) {\n const hiliteIds = hilitedElements.current.get(query) ?? [];\n await zoomToElements(hiliteIds);\n } else {\n try {\n const ids: string[] = await fetchIdsFromQuery(\n query,\n iModelConnection,\n );\n if (ids.length === 0) {\n toaster.warning(\n `${viewGroup.groupName}'s query is valid but produced no results.`,\n );\n }\n const hiliteIds = await getHiliteIds(ids, iModelConnection);\n await zoomToElements(hiliteIds);\n } catch {\n toaster.negative(\n `Could not hide/show ${viewGroup.groupName}. Query could not be resolved.`,\n );\n }\n }\n },\n [groups, hiddenGroupsIds, hideGroups, iModelConnection, hilitedElements],\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 apiContext,\n mappingClient,\n );\n if (groups) {\n if (showGroupColor) {\n await visualizeGroupColors(groups);\n } else {\n clearEmphasizedOverriddenElements();\n }\n }\n }, [\n apiContext,\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 await zoomToElements(Array.from(hilitedElements.current.values()).flat());\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 }, [setHiddenGroupsIds, groups, hideGroups]);\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=\"groups-container\">\n <div className=\"toolbar\">\n <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 Group(s)\" : \"Add Group\"}\n </Button>\n <ButtonGroup className=\"toolbar-buttons\">\n <ToggleSwitch\n label=\"Color by Group\"\n labelPosition=\"left\"\n className=\"group-view-icon 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=\"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=\"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=\"group-list\">\n {groups.map((g) => (\n <GroupTile\n key={g.id}\n title={g.groupName ? g.groupName : \"Untitled\"}\n subText={g.description}\n actionGroup={\n <div className=\"actions\">\n {g.id && hiddenGroupsIds.includes(g.id) ? (\n <IconButton\n disabled={isLoadingQuery}\n styleType=\"borderless\"\n className=\"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=\"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 await mappingClient.deleteGroup(\n apiContext.accessToken,\n iModelId,\n mapping.id ?? \"\",\n selectedGroup?.id ?? \"\",\n );\n }}\n refresh={refresh}\n />\n </>\n );\n }\n};\n"]}
|