@itwin/grouping-mapping-widget 0.15.0 → 0.16.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/README.md +1 -1
- package/lib/cjs/widget/GroupingMappingWidget.d.ts +3 -3
- package/lib/cjs/widget/GroupingMappingWidget.js +5 -6
- package/lib/cjs/widget/GroupingMappingWidget.js.map +1 -1
- package/lib/cjs/widget/components/GroupPropertyAction.js +4 -6
- package/lib/cjs/widget/components/GroupPropertyAction.js.map +1 -1
- package/lib/cjs/widget/components/Mapping.d.ts +7 -0
- package/lib/cjs/widget/components/Mapping.js +7 -0
- package/lib/cjs/widget/components/Mapping.js.map +1 -1
- package/lib/cjs/widget/components/MappingImportWizardModal.d.ts +7 -0
- package/lib/cjs/widget/components/MappingImportWizardModal.js +38 -20
- package/lib/cjs/widget/components/MappingImportWizardModal.js.map +1 -1
- package/lib/cjs/widget/components/MappingImportWizardModal.scss +8 -1
- package/lib/cjs/widget/components/SelectIModel.d.ts +9 -4
- package/lib/cjs/widget/components/SelectIModel.js +71 -16
- package/lib/cjs/widget/components/SelectIModel.js.map +1 -1
- package/lib/cjs/widget/components/SelectIModel.scss +2 -2
- package/lib/cjs/widget/components/SelectITwin.d.ts +18 -0
- package/lib/cjs/widget/components/SelectITwin.js +115 -0
- package/lib/cjs/widget/components/SelectITwin.js.map +1 -0
- package/lib/{esm/widget/components/SelectProject.scss → cjs/widget/components/SelectITwin.scss} +6 -16
- package/lib/cjs/widget/components/SelectMapping.scss +1 -2
- package/lib/cjs/widget/components/context/IModelsClientContext.d.ts +7 -0
- package/lib/cjs/widget/components/context/IModelsClientContext.js +32 -0
- package/lib/cjs/widget/components/context/IModelsClientContext.js.map +1 -0
- package/lib/cjs/widget/components/context/ITwinsClientContext.d.ts +7 -0
- package/lib/cjs/widget/components/context/ITwinsClientContext.js +31 -0
- package/lib/cjs/widget/components/context/ITwinsClientContext.js.map +1 -0
- package/lib/esm/widget/GroupingMappingWidget.d.ts +3 -3
- package/lib/esm/widget/GroupingMappingWidget.js +4 -5
- package/lib/esm/widget/GroupingMappingWidget.js.map +1 -1
- package/lib/esm/widget/components/GroupPropertyAction.js +4 -6
- package/lib/esm/widget/components/GroupPropertyAction.js.map +1 -1
- package/lib/esm/widget/components/Mapping.d.ts +7 -0
- package/lib/esm/widget/components/Mapping.js +7 -0
- package/lib/esm/widget/components/Mapping.js.map +1 -1
- package/lib/esm/widget/components/MappingImportWizardModal.d.ts +7 -0
- package/lib/esm/widget/components/MappingImportWizardModal.js +38 -20
- package/lib/esm/widget/components/MappingImportWizardModal.js.map +1 -1
- package/lib/esm/widget/components/MappingImportWizardModal.scss +8 -1
- package/lib/esm/widget/components/SelectIModel.d.ts +9 -4
- package/lib/esm/widget/components/SelectIModel.js +73 -18
- package/lib/esm/widget/components/SelectIModel.js.map +1 -1
- package/lib/esm/widget/components/SelectIModel.scss +2 -2
- package/lib/esm/widget/components/SelectITwin.d.ts +18 -0
- package/lib/esm/widget/components/SelectITwin.js +94 -0
- package/lib/esm/widget/components/SelectITwin.js.map +1 -0
- package/lib/{cjs/widget/components/SelectProject.scss → esm/widget/components/SelectITwin.scss} +6 -16
- package/lib/esm/widget/components/SelectMapping.scss +1 -2
- package/lib/esm/widget/components/context/IModelsClientContext.d.ts +7 -0
- package/lib/esm/widget/components/context/IModelsClientContext.js +27 -0
- package/lib/esm/widget/components/context/IModelsClientContext.js.map +1 -0
- package/lib/esm/widget/components/context/ITwinsClientContext.d.ts +7 -0
- package/lib/esm/widget/components/context/ITwinsClientContext.js +26 -0
- package/lib/esm/widget/components/context/ITwinsClientContext.js.map +1 -0
- package/package.json +31 -30
- package/lib/cjs/widget/components/SelectProject.d.ts +0 -10
- package/lib/cjs/widget/components/SelectProject.js +0 -86
- package/lib/cjs/widget/components/SelectProject.js.map +0 -1
- package/lib/esm/widget/components/SelectProject.d.ts +0 -10
- package/lib/esm/widget/components/SelectProject.js +0 -65
- package/lib/esm/widget/components/SelectProject.js.map +0 -1
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
@import '~@itwin/itwinui-css/scss/variables';
|
|
6
6
|
|
|
7
|
-
.gmw-imodel-
|
|
7
|
+
.gmw-select-imodel-table-container {
|
|
8
8
|
display: flex;
|
|
9
9
|
flex-direction: column;
|
|
10
10
|
flex-grow: 1;
|
|
11
11
|
min-height: 0;
|
|
12
12
|
|
|
13
|
-
.gmw-imodel-
|
|
13
|
+
.gmw-select-imodel-table {
|
|
14
14
|
overflow: auto;
|
|
15
15
|
flex-grow: 1;
|
|
16
16
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import "./SelectITwin.scss";
|
|
3
|
+
declare const defaultDisplayStrings: {
|
|
4
|
+
iTwins: string;
|
|
5
|
+
iTwinNumber: string;
|
|
6
|
+
iTwinName: string;
|
|
7
|
+
iTwinStatus: string;
|
|
8
|
+
};
|
|
9
|
+
interface SelectITwinProps {
|
|
10
|
+
onSelect: (iTwinId: string) => void;
|
|
11
|
+
onCancel: () => void;
|
|
12
|
+
onChangeITwinType: (iTwinType: number) => void;
|
|
13
|
+
displayStrings?: Partial<typeof defaultDisplayStrings>;
|
|
14
|
+
defaultITwinType?: number;
|
|
15
|
+
}
|
|
16
|
+
declare const SelectITwin: ({ onSelect, onCancel, onChangeITwinType, displayStrings: userDisplayStrings, defaultITwinType, }: SelectITwinProps) => JSX.Element;
|
|
17
|
+
export default SelectITwin;
|
|
18
|
+
//# sourceMappingURL=SelectITwin.d.ts.map
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { ITwinSubClass } from "@itwin/itwins-client";
|
|
2
|
+
import { SvgCalendar, SvgList, SvgStarHollow } from "@itwin/itwinui-icons-react";
|
|
3
|
+
import { Button, HorizontalTabs, Tab, Table, tableFilters, TablePaginator } from "@itwin/itwinui-react";
|
|
4
|
+
import React, { useCallback, useEffect, useMemo, useState } from "react";
|
|
5
|
+
import "./SelectITwin.scss";
|
|
6
|
+
import { useGroupingMappingApiConfig } from "./context/GroupingApiConfigContext";
|
|
7
|
+
import { useITwinsClient } from "./context/ITwinsClientContext";
|
|
8
|
+
import { handleError } from "./utils";
|
|
9
|
+
const defaultDisplayStrings = {
|
|
10
|
+
iTwins: "iTwins",
|
|
11
|
+
iTwinNumber: "Number",
|
|
12
|
+
iTwinName: "Name",
|
|
13
|
+
iTwinStatus: "Status",
|
|
14
|
+
};
|
|
15
|
+
const tabsWithIcons = [
|
|
16
|
+
React.createElement(Tab, { key: "favorite", label: "Favorite iTwins", startIcon: React.createElement(SvgStarHollow, null) }),
|
|
17
|
+
React.createElement(Tab, { key: "recents", label: "Recent iTwins", startIcon: React.createElement(SvgCalendar, null) }),
|
|
18
|
+
React.createElement(Tab, { key: "all", label: "My iTwins", startIcon: React.createElement(SvgList, null) }),
|
|
19
|
+
];
|
|
20
|
+
const fetchITwins = async (setITwins, setIsLoading, getAccessToken, iTwinsClient, iTwinType) => {
|
|
21
|
+
try {
|
|
22
|
+
setITwins([]);
|
|
23
|
+
setIsLoading(true);
|
|
24
|
+
const accessToken = await getAccessToken();
|
|
25
|
+
let iTwinsResponse;
|
|
26
|
+
switch (iTwinType) {
|
|
27
|
+
case 0:
|
|
28
|
+
iTwinsResponse = await iTwinsClient.queryFavoritesAsync(accessToken, ITwinSubClass.Project);
|
|
29
|
+
break;
|
|
30
|
+
case 1:
|
|
31
|
+
iTwinsResponse = await iTwinsClient.queryRecentsAsync(accessToken, ITwinSubClass.Project);
|
|
32
|
+
break;
|
|
33
|
+
default:
|
|
34
|
+
iTwinsResponse = await iTwinsClient.queryAsync(accessToken, ITwinSubClass.Project);
|
|
35
|
+
}
|
|
36
|
+
setITwins(iTwinsResponse.data);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
handleError(error.status);
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
setIsLoading(false);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
const SelectITwin = ({ onSelect, onCancel, onChangeITwinType, displayStrings: userDisplayStrings, defaultITwinType = 0, }) => {
|
|
46
|
+
const { getAccessToken } = useGroupingMappingApiConfig();
|
|
47
|
+
const iTwinsClient = useITwinsClient();
|
|
48
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
49
|
+
const [iTwins, setITwins] = useState([]);
|
|
50
|
+
const [iTwinType, setITwinType] = useState(defaultITwinType);
|
|
51
|
+
useEffect(() => {
|
|
52
|
+
void fetchITwins(setITwins, setIsLoading, getAccessToken, iTwinsClient, iTwinType);
|
|
53
|
+
}, [getAccessToken, iTwinsClient, setIsLoading, iTwinType]);
|
|
54
|
+
const displayStrings = React.useMemo(() => ({ ...defaultDisplayStrings, ...userDisplayStrings }), [userDisplayStrings]);
|
|
55
|
+
const iTwinsColumns = useMemo(() => [
|
|
56
|
+
{
|
|
57
|
+
Header: "Table",
|
|
58
|
+
columns: [
|
|
59
|
+
{
|
|
60
|
+
id: "iTwinNumber",
|
|
61
|
+
Header: `${displayStrings.iTwinNumber}`,
|
|
62
|
+
accessor: "number",
|
|
63
|
+
Filter: tableFilters.TextFilter(),
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: "iTwinName",
|
|
67
|
+
Header: `${displayStrings.iTwinName}`,
|
|
68
|
+
accessor: "displayName",
|
|
69
|
+
Filter: tableFilters.TextFilter(),
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
id: "iTwinStatus",
|
|
73
|
+
Header: `${displayStrings.iTwinStatus}`,
|
|
74
|
+
accessor: "status",
|
|
75
|
+
Filter: tableFilters.TextFilter(),
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
], [displayStrings.iTwinNumber, displayStrings.iTwinName, displayStrings.iTwinStatus]);
|
|
80
|
+
const pageSizeList = useMemo(() => [10, 25, 50], []);
|
|
81
|
+
const paginator = useCallback((props) => (React.createElement(TablePaginator, { ...props, pageSizeList: pageSizeList })), [pageSizeList]);
|
|
82
|
+
return (React.createElement("div", { className: "gmw-select-itwin-table-container" },
|
|
83
|
+
React.createElement(HorizontalTabs, { labels: tabsWithIcons, onTabSelected: (type) => {
|
|
84
|
+
onChangeITwinType(type);
|
|
85
|
+
setITwinType(type);
|
|
86
|
+
}, activeIndex: iTwinType, type: "borderless", contentClassName: "gmw-table-holding-tab" }),
|
|
87
|
+
React.createElement(Table, { data: iTwins, columns: iTwinsColumns, className: 'gmw-select-itwin-table', emptyTableContent: `No ${displayStrings.iTwins} available.`, isSortable: true, isLoading: isLoading, onRowClick: (_, row) => {
|
|
88
|
+
onSelect(row.original.id);
|
|
89
|
+
}, paginatorRenderer: paginator }),
|
|
90
|
+
React.createElement("div", { className: "gmw-import-action-panel" },
|
|
91
|
+
React.createElement(Button, { onClick: onCancel }, "Cancel"))));
|
|
92
|
+
};
|
|
93
|
+
export default SelectITwin;
|
|
94
|
+
//# sourceMappingURL=SelectITwin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectITwin.js","sourceRoot":"","sources":["../../../../src/widget/components/SelectITwin.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 { ITwin, ITwinsAccessClient, ITwinsAPIResponse } from \"@itwin/itwins-client\";\nimport { ITwinSubClass } from \"@itwin/itwins-client\";\nimport { SvgCalendar, SvgList, SvgStarHollow } from \"@itwin/itwinui-icons-react\";\nimport type { TablePaginatorRendererProps } from \"@itwin/itwinui-react\";\nimport { Button, HorizontalTabs, Tab, Table, tableFilters, TablePaginator } from \"@itwin/itwinui-react\";\nimport React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { CreateTypeFromInterface } from \"../utils\";\nimport \"./SelectITwin.scss\";\nimport type { GetAccessTokenFn } from \"./context/GroupingApiConfigContext\";\nimport { useGroupingMappingApiConfig } from \"./context/GroupingApiConfigContext\";\nimport { useITwinsClient } from \"./context/ITwinsClientContext\";\nimport { handleError } from \"./utils\";\n\ntype IITwinTyped = CreateTypeFromInterface<ITwin>;\n\nconst defaultDisplayStrings = {\n iTwins: \"iTwins\",\n iTwinNumber: \"Number\",\n iTwinName: \"Name\",\n iTwinStatus: \"Status\",\n};\n\nconst tabsWithIcons = [\n <Tab key=\"favorite\" label=\"Favorite iTwins\" startIcon={<SvgStarHollow />} />,\n <Tab key=\"recents\" label=\"Recent iTwins\" startIcon={<SvgCalendar />} />,\n <Tab key=\"all\" label=\"My iTwins\" startIcon={<SvgList />} />,\n];\n\nconst fetchITwins = async (\n setITwins: (iTwins: ITwin[]) => void,\n setIsLoading: (isLoading: boolean) => void,\n getAccessToken: GetAccessTokenFn,\n iTwinsClient: ITwinsAccessClient,\n iTwinType: number,\n) => {\n try {\n setITwins([]);\n setIsLoading(true);\n const accessToken = await getAccessToken();\n let iTwinsResponse: ITwinsAPIResponse<ITwin[]>;\n switch (iTwinType) {\n case 0:\n iTwinsResponse = await iTwinsClient.queryFavoritesAsync(accessToken, ITwinSubClass.Project);\n break;\n case 1:\n iTwinsResponse = await iTwinsClient.queryRecentsAsync(accessToken, ITwinSubClass.Project);\n break;\n default:\n iTwinsResponse = await iTwinsClient.queryAsync(accessToken, ITwinSubClass.Project);\n }\n setITwins(iTwinsResponse.data!);\n } catch (error: any) {\n handleError(error.status);\n } finally {\n setIsLoading(false);\n }\n};\n\ninterface SelectITwinProps {\n onSelect: (iTwinId: string) => void;\n onCancel: () => void;\n onChangeITwinType: (iTwinType: number) => void;\n displayStrings?: Partial<typeof defaultDisplayStrings>;\n defaultITwinType?: number;\n}\nconst SelectITwin = ({\n onSelect,\n onCancel,\n onChangeITwinType,\n displayStrings: userDisplayStrings,\n defaultITwinType = 0,\n}: SelectITwinProps) => {\n const { getAccessToken } = useGroupingMappingApiConfig();\n const iTwinsClient = useITwinsClient();\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [iTwins, setITwins] = useState<ITwin[]>([]);\n const [iTwinType, setITwinType] = useState<number>(defaultITwinType);\n\n useEffect(() => {\n void fetchITwins(setITwins, setIsLoading, getAccessToken, iTwinsClient, iTwinType);\n }, [getAccessToken, iTwinsClient, setIsLoading, iTwinType]);\n\n const displayStrings = React.useMemo(\n () => ({ ...defaultDisplayStrings, ...userDisplayStrings }),\n [userDisplayStrings]\n );\n\n const iTwinsColumns = useMemo(\n () => [\n {\n Header: \"Table\",\n columns: [\n {\n id: \"iTwinNumber\",\n Header: `${displayStrings.iTwinNumber}`,\n accessor: \"number\",\n Filter: tableFilters.TextFilter(),\n },\n {\n id: \"iTwinName\",\n Header: `${displayStrings.iTwinName}`,\n accessor: \"displayName\",\n Filter: tableFilters.TextFilter(),\n },\n {\n id: \"iTwinStatus\",\n Header: `${displayStrings.iTwinStatus}`,\n accessor: \"status\",\n Filter: tableFilters.TextFilter(),\n },\n ],\n },\n ],\n [displayStrings.iTwinNumber, displayStrings.iTwinName, displayStrings.iTwinStatus]\n );\n\n const pageSizeList = useMemo(() => [10, 25, 50], []);\n const paginator = useCallback(\n (props: TablePaginatorRendererProps) => (\n <TablePaginator {...props} pageSizeList={pageSizeList} />\n ),\n [pageSizeList]\n );\n\n return (\n <div className=\"gmw-select-itwin-table-container\">\n <HorizontalTabs\n labels={tabsWithIcons}\n onTabSelected={(type) => {\n onChangeITwinType(type);\n setITwinType(type);\n }}\n activeIndex={iTwinType}\n type={\"borderless\"}\n contentClassName=\"gmw-table-holding-tab\">\n </HorizontalTabs>\n <Table<IITwinTyped>\n data={iTwins}\n columns={iTwinsColumns}\n className='gmw-select-itwin-table'\n emptyTableContent={`No ${displayStrings.iTwins} available.`}\n isSortable\n isLoading={isLoading}\n onRowClick={(_, row) => {\n onSelect(row.original.id!);\n }}\n paginatorRenderer={paginator}\n />\n <div className=\"gmw-import-action-panel\">\n <Button onClick={onCancel}>Cancel</Button>\n </div>\n </div>\n );\n};\n\nexport default SelectITwin;\n"]}
|
package/lib/{cjs/widget/components/SelectProject.scss → esm/widget/components/SelectITwin.scss}
RENAMED
|
@@ -4,30 +4,20 @@
|
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
@import '~@itwin/itwinui-css/scss/variables';
|
|
6
6
|
|
|
7
|
-
.gmw-select-
|
|
7
|
+
.gmw-select-itwin-table-container {
|
|
8
8
|
display: flex;
|
|
9
9
|
flex-direction: column;
|
|
10
10
|
flex-grow: 1;
|
|
11
11
|
min-height: 0;
|
|
12
12
|
|
|
13
|
-
.gmw-
|
|
14
|
-
margin-left: auto;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
.gmw-project-grid {
|
|
18
|
-
overflow: auto;
|
|
19
|
-
flex-grow: 1;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
.gmw-grid-holding-tab {
|
|
13
|
+
.gmw-table-holding-tab {
|
|
23
14
|
display: flex;
|
|
24
15
|
flex-direction: column;
|
|
25
16
|
gap: $iui-baseline;
|
|
26
17
|
}
|
|
27
18
|
|
|
28
|
-
.gmw-select-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
padding: $iui-baseline * 2 $iui-m $iui-baseline;
|
|
19
|
+
.gmw-select-itwin-table {
|
|
20
|
+
overflow: auto;
|
|
21
|
+
flex-grow: 1;
|
|
32
22
|
}
|
|
33
|
-
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { IModelsClient } from "@itwin/imodels-client-management";
|
|
3
|
+
import type { ClientPrefix } from "./GroupingApiConfigContext";
|
|
4
|
+
export declare const createIModelsClient: (prefix?: ClientPrefix) => IModelsClient;
|
|
5
|
+
export declare const IModelsClientContext: import("react").Context<IModelsClient>;
|
|
6
|
+
export declare const useIModelsClient: () => IModelsClient;
|
|
7
|
+
//# sourceMappingURL=IModelsClientContext.d.ts.map
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { IModelsClient } from "@itwin/imodels-client-management";
|
|
2
|
+
import { createContext, useContext } from "react";
|
|
3
|
+
const baseUrl = "https://api.bentley.com/imodels";
|
|
4
|
+
const prefixUrl = (baseUrl, prefix) => {
|
|
5
|
+
if (prefix && baseUrl) {
|
|
6
|
+
return baseUrl.replace("api.bentley.com", `${prefix}-api.bentley.com`);
|
|
7
|
+
}
|
|
8
|
+
return baseUrl;
|
|
9
|
+
};
|
|
10
|
+
export const createIModelsClient = (prefix) => {
|
|
11
|
+
const url = prefixUrl(baseUrl, prefix);
|
|
12
|
+
const options = {
|
|
13
|
+
api: {
|
|
14
|
+
baseUrl: url,
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
return new IModelsClient(options);
|
|
18
|
+
};
|
|
19
|
+
export const IModelsClientContext = createContext(createIModelsClient());
|
|
20
|
+
export const useIModelsClient = () => {
|
|
21
|
+
const context = useContext(IModelsClientContext);
|
|
22
|
+
if (!context) {
|
|
23
|
+
throw new Error("useIModelsClient should be used within an IModelsClientContext provider");
|
|
24
|
+
}
|
|
25
|
+
return context;
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=IModelsClientContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IModelsClientContext.js","sourceRoot":"","sources":["../../../../../src/widget/components/context/IModelsClientContext.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAGlD,MAAM,OAAO,GAAW,iCAAiC,CAAC;AAE1D,MAAM,SAAS,GAAG,CAAC,OAAgB,EAAE,MAAe,EAAE,EAAE;IACtD,IAAI,MAAM,IAAI,OAAO,EAAE;QACrB,OAAO,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,MAAM,kBAAkB,CAAC,CAAC;KACxE;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAqB,EAAiB,EAAE;IAC1E,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACvC,MAAM,OAAO,GAAyB;QACpC,GAAG,EAAE;YACH,OAAO,EAAE,GAAG;SACb;KACF,CAAC;IACF,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,aAAa,CAAgB,mBAAmB,EAAE,CAAC,CAAC;AAExF,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,EAAE;IACnC,MAAM,OAAO,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;IACjD,IAAI,CAAC,OAAO,EAAE;QACZ,MAAM,IAAI,KAAK,CACb,yEAAyE,CAC1E,CAAC;KACH;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport type { IModelsClientOptions } from \"@itwin/imodels-client-management\";\nimport { IModelsClient } from \"@itwin/imodels-client-management\";\nimport { createContext, useContext } from \"react\";\nimport type { ClientPrefix } from \"./GroupingApiConfigContext\";\n\nconst baseUrl: string = \"https://api.bentley.com/imodels\";\n\nconst prefixUrl = (baseUrl?: string, prefix?: string) => {\n if (prefix && baseUrl) {\n return baseUrl.replace(\"api.bentley.com\", `${prefix}-api.bentley.com`);\n }\n return baseUrl;\n};\n\nexport const createIModelsClient = (prefix?: ClientPrefix): IModelsClient => {\n const url = prefixUrl(baseUrl, prefix);\n const options: IModelsClientOptions = {\n api: {\n baseUrl: url,\n },\n };\n return new IModelsClient(options);\n};\n\nexport const IModelsClientContext = createContext<IModelsClient>(createIModelsClient());\n\nexport const useIModelsClient = () => {\n const context = useContext(IModelsClientContext);\n if (!context) {\n throw new Error(\n \"useIModelsClient should be used within an IModelsClientContext provider\"\n );\n }\n return context;\n};\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { ITwinsAccessClient } from "@itwin/itwins-client";
|
|
3
|
+
import type { ClientPrefix } from "./GroupingApiConfigContext";
|
|
4
|
+
export declare const createITwinsClient: (prefix?: ClientPrefix) => ITwinsAccessClient;
|
|
5
|
+
export declare const ITwinsClientContext: import("react").Context<ITwinsAccessClient>;
|
|
6
|
+
export declare const useITwinsClient: () => ITwinsAccessClient;
|
|
7
|
+
//# sourceMappingURL=ITwinsClientContext.d.ts.map
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { ITwinsAccessClient } from "@itwin/itwins-client";
|
|
6
|
+
import { createContext, useContext } from "react";
|
|
7
|
+
const baseUrl = "https://api.bentley.com/itwins";
|
|
8
|
+
const prefixUrl = (baseUrl, prefix) => {
|
|
9
|
+
if (prefix && baseUrl) {
|
|
10
|
+
return baseUrl.replace("api.bentley.com", `${prefix}-api.bentley.com`);
|
|
11
|
+
}
|
|
12
|
+
return baseUrl;
|
|
13
|
+
};
|
|
14
|
+
export const createITwinsClient = (prefix) => {
|
|
15
|
+
const url = prefixUrl(baseUrl, prefix);
|
|
16
|
+
return new ITwinsAccessClient(url);
|
|
17
|
+
};
|
|
18
|
+
export const ITwinsClientContext = createContext(createITwinsClient());
|
|
19
|
+
export const useITwinsClient = () => {
|
|
20
|
+
const context = useContext(ITwinsClientContext);
|
|
21
|
+
if (!context) {
|
|
22
|
+
throw new Error("useITwinsClient should be used within an ITwinsClientContext provider");
|
|
23
|
+
}
|
|
24
|
+
return context;
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=ITwinsClientContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ITwinsClientContext.js","sourceRoot":"","sources":["../../../../../src/widget/components/context/ITwinsClientContext.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAGlD,MAAM,OAAO,GAAW,gCAAgC,CAAC;AAEzD,MAAM,SAAS,GAAG,CAAC,OAAgB,EAAE,MAAe,EAAE,EAAE;IACtD,IAAI,MAAM,IAAI,OAAO,EAAE;QACrB,OAAO,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,MAAM,kBAAkB,CAAC,CAAC;KACxE;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAqB,EAAsB,EAAE;IAC9E,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACvC,OAAO,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC;AACrC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,aAAa,CAAqB,kBAAkB,EAAE,CAAC,CAAC;AAE3F,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,EAAE;IAClC,MAAM,OAAO,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAC;IAChD,IAAI,CAAC,OAAO,EAAE;QACZ,MAAM,IAAI,KAAK,CACb,uEAAuE,CACxE,CAAC;KACH;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { ITwinsAccessClient } from \"@itwin/itwins-client\";\nimport { createContext, useContext } from \"react\";\nimport type { ClientPrefix } from \"./GroupingApiConfigContext\";\n\nconst baseUrl: string = \"https://api.bentley.com/itwins\";\n\nconst prefixUrl = (baseUrl?: string, prefix?: string) => {\n if (prefix && baseUrl) {\n return baseUrl.replace(\"api.bentley.com\", `${prefix}-api.bentley.com`);\n }\n return baseUrl;\n};\n\nexport const createITwinsClient = (prefix?: ClientPrefix): ITwinsAccessClient => {\n const url = prefixUrl(baseUrl, prefix);\n return new ITwinsAccessClient(url);\n};\n\nexport const ITwinsClientContext = createContext<ITwinsAccessClient>(createITwinsClient());\n\nexport const useITwinsClient = () => {\n const context = useContext(ITwinsClientContext);\n if (!context) {\n throw new Error(\n \"useITwinsClient should be used within an ITwinsClientContext provider\"\n );\n }\n return context;\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itwin/grouping-mapping-widget",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.0",
|
|
4
4
|
"description": "An iTwin.js 3D Viewer Widget that interfaces with the iTwin Reporting Platform.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Bentley",
|
|
@@ -40,8 +40,9 @@
|
|
|
40
40
|
"@dnd-kit/core": "^6.0.5",
|
|
41
41
|
"@dnd-kit/sortable": "7.0.1",
|
|
42
42
|
"@dnd-kit/utilities": "3.2.0",
|
|
43
|
-
"@itwin/
|
|
43
|
+
"@itwin/imodels-client-management": "^3.1.0",
|
|
44
44
|
"@itwin/insights-client": "^0.4.0",
|
|
45
|
+
"@itwin/itwins-client": "^1.1.0",
|
|
45
46
|
"@itwin/itwinui-icons-react": "^1.15.1",
|
|
46
47
|
"@itwin/itwinui-react": "^1.42.0",
|
|
47
48
|
"classnames": "^2.3.1",
|
|
@@ -53,26 +54,26 @@
|
|
|
53
54
|
},
|
|
54
55
|
"devDependencies": {
|
|
55
56
|
"@faker-js/faker": "^7.5.0",
|
|
56
|
-
"@itwin/appui-abstract": "^3.
|
|
57
|
-
"@itwin/appui-layout-react": "^3.
|
|
58
|
-
"@itwin/appui-react": "^3.
|
|
59
|
-
"@itwin/build-tools": "^3.
|
|
60
|
-
"@itwin/components-react": "^3.
|
|
61
|
-
"@itwin/core-bentley": "^3.
|
|
62
|
-
"@itwin/core-common": "^3.
|
|
63
|
-
"@itwin/core-frontend": "^3.
|
|
64
|
-
"@itwin/core-geometry": "^3.
|
|
65
|
-
"@itwin/core-i18n": "^3.
|
|
66
|
-
"@itwin/core-markup": "^3.
|
|
67
|
-
"@itwin/core-orbitgt": "^3.
|
|
68
|
-
"@itwin/core-quantity": "^3.
|
|
69
|
-
"@itwin/core-react": "^3.
|
|
70
|
-
"@itwin/eslint-plugin": "^3.
|
|
71
|
-
"@itwin/imodel-components-react": "^3.
|
|
72
|
-
"@itwin/presentation-common": "^3.
|
|
73
|
-
"@itwin/presentation-components": "^3.
|
|
74
|
-
"@itwin/presentation-frontend": "^3.
|
|
75
|
-
"@itwin/webgl-compatibility": "^3.
|
|
57
|
+
"@itwin/appui-abstract": "^3.7.4",
|
|
58
|
+
"@itwin/appui-layout-react": "^3.7.4",
|
|
59
|
+
"@itwin/appui-react": "^3.7.4",
|
|
60
|
+
"@itwin/build-tools": "^3.7.4",
|
|
61
|
+
"@itwin/components-react": "^3.7.4",
|
|
62
|
+
"@itwin/core-bentley": "^3.7.4",
|
|
63
|
+
"@itwin/core-common": "^3.7.4",
|
|
64
|
+
"@itwin/core-frontend": "^3.7.4",
|
|
65
|
+
"@itwin/core-geometry": "^3.7.4",
|
|
66
|
+
"@itwin/core-i18n": "^3.7.4",
|
|
67
|
+
"@itwin/core-markup": "^3.7.4",
|
|
68
|
+
"@itwin/core-orbitgt": "^3.7.4",
|
|
69
|
+
"@itwin/core-quantity": "^3.7.4",
|
|
70
|
+
"@itwin/core-react": "^3.7.4",
|
|
71
|
+
"@itwin/eslint-plugin": "^3.7.4",
|
|
72
|
+
"@itwin/imodel-components-react": "^3.7.4",
|
|
73
|
+
"@itwin/presentation-common": "^3.7.4",
|
|
74
|
+
"@itwin/presentation-components": "^3.7.4",
|
|
75
|
+
"@itwin/presentation-frontend": "^3.7.4",
|
|
76
|
+
"@itwin/webgl-compatibility": "^3.7.4",
|
|
76
77
|
"@testing-library/dom": "^8.12.0",
|
|
77
78
|
"@testing-library/jest-dom": "^5.16.3",
|
|
78
79
|
"@testing-library/react": "^12.1.4",
|
|
@@ -111,13 +112,13 @@
|
|
|
111
112
|
"typescript": "~4.3.0"
|
|
112
113
|
},
|
|
113
114
|
"peerDependencies": {
|
|
114
|
-
"@itwin/appui-abstract": "^3.
|
|
115
|
-
"@itwin/appui-react": "^3.
|
|
116
|
-
"@itwin/components-react": "^3.
|
|
117
|
-
"@itwin/core-frontend": "^3.
|
|
118
|
-
"@itwin/core-react": "^3.
|
|
119
|
-
"@itwin/presentation-components": "^3.
|
|
120
|
-
"@itwin/presentation-frontend": "^3.
|
|
115
|
+
"@itwin/appui-abstract": "^3.7.4",
|
|
116
|
+
"@itwin/appui-react": "^3.7.4",
|
|
117
|
+
"@itwin/components-react": "^3.7.4",
|
|
118
|
+
"@itwin/core-frontend": "^3.7.4",
|
|
119
|
+
"@itwin/core-react": "^3.7.4",
|
|
120
|
+
"@itwin/presentation-components": "^3.7.4",
|
|
121
|
+
"@itwin/presentation-frontend": "^3.7.4",
|
|
121
122
|
"react": "^17.0.2",
|
|
122
123
|
"react-dom": "^17.0.2",
|
|
123
124
|
"react-redux": "^7.2.0"
|
|
@@ -140,5 +141,5 @@
|
|
|
140
141
|
"test": "jest",
|
|
141
142
|
"test:watch": "jest --watch "
|
|
142
143
|
},
|
|
143
|
-
"readme": "# @itwin/grouping-mapping-widget\r\n\r\nCopyright © Bentley Systems, Incorporated. All rights reserved.\r\nThe Grouping Mapping widget is a UI component for iTwin Viewer applications that simplifies how users (and developers) interface with the [Reporting Platform APIs](https://developer.bentley.com/apis/insights/overview/).\r\nThe grouping-mapping-widget package provides a UiProvider class - `GroupingMappingProvider` - which can be passed into the `uiProviders` prop of the iTwin Viewer's `<Viewer />` component.\r\n\r\n## Getting Started\r\n\r\nThis is not a standalone UI and requires a parent iTwin Viewer application to work as intended.\r\nA guide on how to create a basic iTwin Viewer application can be found here: <https://www.itwinjs.org/learning/tutorials/develop-web-viewer/>.\r\nThis package provides a viewer 'widget'. Documentation on how to add a widget to your application can be found here: <https://developer.bentley.com/tutorials/itwin-viewer-hello-world/#2-your-first-ui-widget>.\r\n\r\n## Permissions and Scopes\r\n\r\nThe SPA client used by your iTwin viewer must have these additional scopes:\r\n\r\n- `insights:read`\r\n- `insights:modify`\r\n- `
|
|
144
|
+
"readme": "# @itwin/grouping-mapping-widget\r\n\r\nCopyright © Bentley Systems, Incorporated. All rights reserved.\r\nThe Grouping Mapping widget is a UI component for iTwin Viewer applications that simplifies how users (and developers) interface with the [Reporting Platform APIs](https://developer.bentley.com/apis/insights/overview/).\r\nThe grouping-mapping-widget package provides a UiProvider class - `GroupingMappingProvider` - which can be passed into the `uiProviders` prop of the iTwin Viewer's `<Viewer />` component.\r\n\r\n## Getting Started\r\n\r\nThis is not a standalone UI and requires a parent iTwin Viewer application to work as intended.\r\nA guide on how to create a basic iTwin Viewer application can be found here: <https://www.itwinjs.org/learning/tutorials/develop-web-viewer/>.\r\nThis package provides a viewer 'widget'. Documentation on how to add a widget to your application can be found here: <https://developer.bentley.com/tutorials/itwin-viewer-hello-world/#2-your-first-ui-widget>.\r\n\r\n## Permissions and Scopes\r\n\r\nThe SPA client used by your iTwin viewer must have these additional scopes:\r\n\r\n- `insights:read`\r\n- `insights:modify`\r\n- `itwins:read`\r\n\r\nIn addition, users must have the `imodels_read` and `imodels_write` [permissions](https://developer.bentley.com/apis/insights/operations/create-mapping/#authorization) assigned at either the Project or iModel level. Further instruction on how to create roles and assign permissions can be found in the [iTwin Platform Projects API documentation](https://developer.bentley.com/apis/projects/tutorials/).\r\n\r\n## Sample usage\r\n\r\n```tsx\r\nimport { GroupingMappingProvider } from \"@itwin/grouping-mapping-widget\";\r\n<Viewer\r\n ...\r\n uiProviders={[new GroupingMappingProvider()]}\r\n/>\r\n```\r\n\r\n## Custom UI\r\n\r\nThis package provides an interface to define your own custom UI or callback functions in grouping mapping widget. There are different types of custom UIs provided.\r\n\r\n### Grouping Custom UI\r\n\r\nYou can use your own UI component to define group creation method.\r\n\r\nAn example of grouping custom UI, [ManualGroupingCustomUI](./src/widget/components/customUI/ManualGroupingCustomUI.tsx) helps user to manually define ECSQL query for groups.\r\n\r\nIn `GroupingCustomUIProps`:\r\n\r\n- `updateQuery` is used to run the query and visualize results in the viewer.\r\n- `isUpdating` keeps track of the status of query execution.\r\n- `resetView` enables you to reset the viewer state.\r\n\r\nTo configure your own grouping custom UI, you need to give it:\r\n\r\n- a `type` as `GroupingMappingCustomUIType.Grouping`\r\n- a `name` as identifier\r\n- a `displayLabel` which will be shown in the 'Add Group' dropdown list\r\n- a `uiComponent` like above\r\n- an optional `icon`\r\n\r\nYou can define your UI provider as follows in the GroupingMappingProvider:\r\n\r\n```tsx\r\nnew GroupingMappingProvider({\r\n customUIs: [\r\n {\r\n type: GroupingMappingCustomUIType.Grouping,\r\n name: \"Manual\",\r\n displayLabel: \"Manual Query\",\r\n uiComponent: ManualGroupingCustomUI,\r\n icon: <SvgDraw />,\r\n },\r\n ],\r\n});\r\n```\r\n\r\nAfter adding the grouping custom UI, it will be presented in the 'Add Group' drop down list.\r\n\r\n\r\n\r\n### Context Custom UI\r\n\r\nYou can also add custom UI in context menu for each group. This could be UI driven interaction or simply a callback function to execute your own code.\r\n\r\nYou can use the `iModelId`, `mappingId` and `groupId` in `ContextCustomUIProps` provided by Grouping Mapping Widget in your UI component or callback.\r\n\r\nTo configure your own context custom UI, you need to give it:\r\n\r\n- a `type` as `GroupingMappingCustomUIType.Context`\r\n- a `name` as identifier\r\n- a `displayLabel` which will be shown in the context dropdown list in each group tile\r\n- an optional `uiComponent` which will be presented in the widget as a UI component\r\n- an optional `onClick` callback function where you could make your own API calls\r\n- an optional `icon`\r\n\r\nYou can define your context custom UI as following example in the GroupingMappingProvider with an example is to use [clash detection](https://www.itwinjs.org/sandboxes/iTwinPlatform/Clash%20Review) in the widget:\r\n\r\n```tsx\r\nconst customCB = (groupId: string, mappingId: string, iModelId: string) => {\r\n toaster.informational(`Called callback for group ${groupId}`)\r\n}\r\n\r\nnew GroupingMappingProvider({\r\n customUIs: [\r\n {\r\n type: GroupingMappingCustomUIType.Context,\r\n name: \"ClashDetection\",\r\n displayLabel: \"Clash Detection\",\r\n uiComponent: ClashDetectionCustomUI,\r\n onClick: customCB,\r\n icon: <SvgClash />,\r\n },\r\n ],\r\n});\r\n```\r\n\r\nAfter adding the context custom UI, the context menu item will look like this with additional `Clash Detection` menu item.\r\n\r\n\r\n"
|
|
144
145
|
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/// <reference types="react" />
|
|
2
|
-
import type { ProjectFull } from "@itwin/imodel-browser-react";
|
|
3
|
-
import "./SelectProject.scss";
|
|
4
|
-
interface SelectProjectProps {
|
|
5
|
-
onSelect: (project: ProjectFull) => void;
|
|
6
|
-
onCancel: () => void;
|
|
7
|
-
}
|
|
8
|
-
declare const SelectProject: ({ onSelect, onCancel }: SelectProjectProps) => JSX.Element;
|
|
9
|
-
export default SelectProject;
|
|
10
|
-
//# sourceMappingURL=SelectProject.d.ts.map
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
-
}) : (function(o, m, k, k2) {
|
|
6
|
-
if (k2 === undefined) k2 = k;
|
|
7
|
-
o[k2] = m[k];
|
|
8
|
-
}));
|
|
9
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
-
}) : function(o, v) {
|
|
12
|
-
o["default"] = v;
|
|
13
|
-
});
|
|
14
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
-
if (mod && mod.__esModule) return mod;
|
|
16
|
-
var result = {};
|
|
17
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
-
__setModuleDefault(result, mod);
|
|
19
|
-
return result;
|
|
20
|
-
};
|
|
21
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
-
const imodel_browser_react_1 = require("@itwin/imodel-browser-react");
|
|
23
|
-
const itwinui_icons_react_1 = require("@itwin/itwinui-icons-react");
|
|
24
|
-
const itwinui_react_1 = require("@itwin/itwinui-react");
|
|
25
|
-
const react_1 = __importStar(require("react"));
|
|
26
|
-
const GroupingApiConfigContext_1 = require("./context/GroupingApiConfigContext");
|
|
27
|
-
require("./SelectProject.scss");
|
|
28
|
-
const tabsWithIcons = [
|
|
29
|
-
react_1.default.createElement(itwinui_react_1.Tab, { key: "favorite", label: "Favorite projects", startIcon: react_1.default.createElement(itwinui_icons_react_1.SvgStarHollow, null) }),
|
|
30
|
-
react_1.default.createElement(itwinui_react_1.Tab, { key: "recents", label: "Recent projects", startIcon: react_1.default.createElement(itwinui_icons_react_1.SvgCalendar, null) }),
|
|
31
|
-
react_1.default.createElement(itwinui_react_1.Tab, { key: "all", label: "My projects", startIcon: react_1.default.createElement(itwinui_icons_react_1.SvgList, null) }),
|
|
32
|
-
];
|
|
33
|
-
const SelectProject = ({ onSelect, onCancel }) => {
|
|
34
|
-
const { getAccessToken, prefix } = GroupingApiConfigContext_1.useGroupingMappingApiConfig();
|
|
35
|
-
const [projectType, setProjectType] = react_1.useState(0);
|
|
36
|
-
const [searchInput, setSearchInput] = react_1.useState("");
|
|
37
|
-
const [activeSearchInput, setActiveSearchInput] = react_1.useState("");
|
|
38
|
-
const [accessToken, setAccessToken] = react_1.useState();
|
|
39
|
-
const [apiOverrides, setApiOverrides] = react_1.useState({
|
|
40
|
-
serverEnvironmentPrefix: prefix,
|
|
41
|
-
});
|
|
42
|
-
const [searched, setSearched] = react_1.useState(false);
|
|
43
|
-
react_1.useEffect(() => setApiOverrides({ serverEnvironmentPrefix: prefix }), [prefix]);
|
|
44
|
-
react_1.useEffect(() => {
|
|
45
|
-
const fetchAccessToken = async () => {
|
|
46
|
-
const accessToken = await getAccessToken();
|
|
47
|
-
setAccessToken(accessToken);
|
|
48
|
-
};
|
|
49
|
-
void fetchAccessToken();
|
|
50
|
-
}, [getAccessToken]);
|
|
51
|
-
const startSearch = react_1.useCallback(() => {
|
|
52
|
-
if (!searchInput)
|
|
53
|
-
return;
|
|
54
|
-
setActiveSearchInput(searchInput);
|
|
55
|
-
setSearched(true);
|
|
56
|
-
}, [searchInput]);
|
|
57
|
-
const clearSearch = react_1.useCallback(() => {
|
|
58
|
-
setSearchInput("");
|
|
59
|
-
setActiveSearchInput("");
|
|
60
|
-
setSearched(false);
|
|
61
|
-
}, []);
|
|
62
|
-
react_1.useEffect(() => {
|
|
63
|
-
if (searchInput.length === 0) {
|
|
64
|
-
setSearched(false);
|
|
65
|
-
clearSearch();
|
|
66
|
-
}
|
|
67
|
-
}, [searchInput, setSearched, clearSearch]);
|
|
68
|
-
return (react_1.default.createElement("div", { className: "gmw-select-project-grid-container" },
|
|
69
|
-
react_1.default.createElement(itwinui_react_1.HorizontalTabs, { labels: tabsWithIcons, onTabSelected: setProjectType, activeIndex: projectType, type: "borderless", contentClassName: "gmw-grid-holding-tab" },
|
|
70
|
-
react_1.default.createElement(itwinui_react_1.LabeledInput, { displayStyle: "inline", iconDisplayStyle: "inline", className: "gmw-search-input", label: "Search", value: searchInput, placeholder: "Search....", onChange: (event) => {
|
|
71
|
-
const { target: { value }, } = event;
|
|
72
|
-
setSearchInput(value);
|
|
73
|
-
}, onKeyDown: (event) => {
|
|
74
|
-
if (event.key === "Enter") {
|
|
75
|
-
startSearch();
|
|
76
|
-
}
|
|
77
|
-
}, svgIcon: searched ? (react_1.default.createElement(itwinui_react_1.IconButton, { onClick: clearSearch, styleType: "borderless" },
|
|
78
|
-
react_1.default.createElement(itwinui_icons_react_1.SvgClose, null))) : (react_1.default.createElement(itwinui_react_1.IconButton, { onClick: startSearch, styleType: "borderless" },
|
|
79
|
-
react_1.default.createElement(itwinui_icons_react_1.SvgSearch, null))) })),
|
|
80
|
-
react_1.default.createElement("div", { className: "gmw-project-grid" },
|
|
81
|
-
react_1.default.createElement(imodel_browser_react_1.ProjectGrid, { onThumbnailClick: onSelect, accessToken: accessToken, apiOverrides: apiOverrides, filterOptions: activeSearchInput, requestType: projectType === 0 ? "favorites" : projectType === 1 ? "recents" : "" })),
|
|
82
|
-
react_1.default.createElement("div", { className: "gmw-select-project-action-panel" },
|
|
83
|
-
react_1.default.createElement(itwinui_react_1.Button, { onClick: onCancel }, "Cancel"))));
|
|
84
|
-
};
|
|
85
|
-
exports.default = SelectProject;
|
|
86
|
-
//# sourceMappingURL=SelectProject.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SelectProject.js","sourceRoot":"","sources":["../../../../src/widget/components/SelectProject.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 { AccessToken } from \"@itwin/core-bentley\";\nimport type {\n ApiOverrides,\n IModelFull,\n ProjectFull,\n} from \"@itwin/imodel-browser-react\";\nimport { ProjectGrid } from \"@itwin/imodel-browser-react\";\nimport {\n SvgCalendar,\n SvgClose,\n SvgList,\n SvgSearch,\n SvgStarHollow,\n} from \"@itwin/itwinui-icons-react\";\nimport {\n Button,\n HorizontalTabs,\n IconButton,\n LabeledInput,\n Tab,\n} from \"@itwin/itwinui-react\";\nimport React, { useCallback, useEffect, useState } from \"react\";\nimport { useGroupingMappingApiConfig } from \"./context/GroupingApiConfigContext\";\nimport \"./SelectProject.scss\";\n\nconst tabsWithIcons = [\n <Tab\n key=\"favorite\"\n label=\"Favorite projects\"\n startIcon={<SvgStarHollow />}\n />,\n <Tab key=\"recents\" label=\"Recent projects\" startIcon={<SvgCalendar />} />,\n <Tab key=\"all\" label=\"My projects\" startIcon={<SvgList />} />,\n];\ninterface SelectProjectProps {\n onSelect: (project: ProjectFull) => void;\n onCancel: () => void;\n}\nconst SelectProject = ({ onSelect, onCancel }: SelectProjectProps) => {\n const { getAccessToken, prefix } = useGroupingMappingApiConfig();\n const [projectType, setProjectType] = useState<number>(0);\n const [searchInput, setSearchInput] = useState<string>(\"\");\n const [activeSearchInput, setActiveSearchInput] = useState<string>(\"\");\n const [accessToken, setAccessToken] = useState<AccessToken>();\n const [apiOverrides, setApiOverrides] = useState<ApiOverrides<IModelFull[]>>({\n serverEnvironmentPrefix: prefix,\n });\n const [searched, setSearched] = useState<boolean>(false);\n\n useEffect(\n () => setApiOverrides({ serverEnvironmentPrefix: prefix }),\n [prefix]\n );\n\n useEffect(() => {\n const fetchAccessToken = async () => {\n const accessToken = await getAccessToken();\n setAccessToken(accessToken);\n };\n void fetchAccessToken();\n }, [getAccessToken]);\n\n const startSearch = useCallback(() => {\n if (!searchInput) return;\n setActiveSearchInput(searchInput);\n setSearched(true);\n }, [searchInput]);\n\n const clearSearch = useCallback(() => {\n setSearchInput(\"\");\n setActiveSearchInput(\"\");\n setSearched(false);\n }, []);\n\n useEffect(() => {\n if (searchInput.length === 0) {\n setSearched(false);\n clearSearch();\n }\n }, [searchInput, setSearched, clearSearch]);\n\n return (\n <div className=\"gmw-select-project-grid-container\">\n <HorizontalTabs\n labels={tabsWithIcons}\n onTabSelected={setProjectType}\n activeIndex={projectType}\n type={\"borderless\"}\n contentClassName=\"gmw-grid-holding-tab\"\n >\n <LabeledInput\n displayStyle=\"inline\"\n iconDisplayStyle=\"inline\"\n className=\"gmw-search-input\"\n label=\"Search\"\n value={searchInput}\n placeholder=\"Search....\"\n onChange={(event) => {\n const {\n target: { value },\n } = event;\n setSearchInput(value);\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") {\n startSearch();\n }\n }}\n svgIcon={\n searched ? (\n <IconButton onClick={clearSearch} styleType=\"borderless\">\n <SvgClose />\n </IconButton>\n ) : (\n <IconButton onClick={startSearch} styleType=\"borderless\">\n <SvgSearch />\n </IconButton>\n )\n }\n />\n </HorizontalTabs>\n <div className=\"gmw-project-grid\">\n <ProjectGrid\n onThumbnailClick={onSelect}\n accessToken={accessToken}\n apiOverrides={apiOverrides}\n filterOptions={activeSearchInput}\n requestType={\n projectType === 0 ? \"favorites\" : projectType === 1 ? \"recents\" : \"\"\n }\n />\n </div>\n <div className=\"gmw-select-project-action-panel\">\n <Button onClick={onCancel}>Cancel</Button>\n </div>\n </div>\n );\n};\n\nexport default SelectProject;\n"]}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/// <reference types="react" />
|
|
2
|
-
import type { ProjectFull } from "@itwin/imodel-browser-react";
|
|
3
|
-
import "./SelectProject.scss";
|
|
4
|
-
interface SelectProjectProps {
|
|
5
|
-
onSelect: (project: ProjectFull) => void;
|
|
6
|
-
onCancel: () => void;
|
|
7
|
-
}
|
|
8
|
-
declare const SelectProject: ({ onSelect, onCancel }: SelectProjectProps) => JSX.Element;
|
|
9
|
-
export default SelectProject;
|
|
10
|
-
//# sourceMappingURL=SelectProject.d.ts.map
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { ProjectGrid } from "@itwin/imodel-browser-react";
|
|
2
|
-
import { SvgCalendar, SvgClose, SvgList, SvgSearch, SvgStarHollow, } from "@itwin/itwinui-icons-react";
|
|
3
|
-
import { Button, HorizontalTabs, IconButton, LabeledInput, Tab, } from "@itwin/itwinui-react";
|
|
4
|
-
import React, { useCallback, useEffect, useState } from "react";
|
|
5
|
-
import { useGroupingMappingApiConfig } from "./context/GroupingApiConfigContext";
|
|
6
|
-
import "./SelectProject.scss";
|
|
7
|
-
const tabsWithIcons = [
|
|
8
|
-
React.createElement(Tab, { key: "favorite", label: "Favorite projects", startIcon: React.createElement(SvgStarHollow, null) }),
|
|
9
|
-
React.createElement(Tab, { key: "recents", label: "Recent projects", startIcon: React.createElement(SvgCalendar, null) }),
|
|
10
|
-
React.createElement(Tab, { key: "all", label: "My projects", startIcon: React.createElement(SvgList, null) }),
|
|
11
|
-
];
|
|
12
|
-
const SelectProject = ({ onSelect, onCancel }) => {
|
|
13
|
-
const { getAccessToken, prefix } = useGroupingMappingApiConfig();
|
|
14
|
-
const [projectType, setProjectType] = useState(0);
|
|
15
|
-
const [searchInput, setSearchInput] = useState("");
|
|
16
|
-
const [activeSearchInput, setActiveSearchInput] = useState("");
|
|
17
|
-
const [accessToken, setAccessToken] = useState();
|
|
18
|
-
const [apiOverrides, setApiOverrides] = useState({
|
|
19
|
-
serverEnvironmentPrefix: prefix,
|
|
20
|
-
});
|
|
21
|
-
const [searched, setSearched] = useState(false);
|
|
22
|
-
useEffect(() => setApiOverrides({ serverEnvironmentPrefix: prefix }), [prefix]);
|
|
23
|
-
useEffect(() => {
|
|
24
|
-
const fetchAccessToken = async () => {
|
|
25
|
-
const accessToken = await getAccessToken();
|
|
26
|
-
setAccessToken(accessToken);
|
|
27
|
-
};
|
|
28
|
-
void fetchAccessToken();
|
|
29
|
-
}, [getAccessToken]);
|
|
30
|
-
const startSearch = useCallback(() => {
|
|
31
|
-
if (!searchInput)
|
|
32
|
-
return;
|
|
33
|
-
setActiveSearchInput(searchInput);
|
|
34
|
-
setSearched(true);
|
|
35
|
-
}, [searchInput]);
|
|
36
|
-
const clearSearch = useCallback(() => {
|
|
37
|
-
setSearchInput("");
|
|
38
|
-
setActiveSearchInput("");
|
|
39
|
-
setSearched(false);
|
|
40
|
-
}, []);
|
|
41
|
-
useEffect(() => {
|
|
42
|
-
if (searchInput.length === 0) {
|
|
43
|
-
setSearched(false);
|
|
44
|
-
clearSearch();
|
|
45
|
-
}
|
|
46
|
-
}, [searchInput, setSearched, clearSearch]);
|
|
47
|
-
return (React.createElement("div", { className: "gmw-select-project-grid-container" },
|
|
48
|
-
React.createElement(HorizontalTabs, { labels: tabsWithIcons, onTabSelected: setProjectType, activeIndex: projectType, type: "borderless", contentClassName: "gmw-grid-holding-tab" },
|
|
49
|
-
React.createElement(LabeledInput, { displayStyle: "inline", iconDisplayStyle: "inline", className: "gmw-search-input", label: "Search", value: searchInput, placeholder: "Search....", onChange: (event) => {
|
|
50
|
-
const { target: { value }, } = event;
|
|
51
|
-
setSearchInput(value);
|
|
52
|
-
}, onKeyDown: (event) => {
|
|
53
|
-
if (event.key === "Enter") {
|
|
54
|
-
startSearch();
|
|
55
|
-
}
|
|
56
|
-
}, svgIcon: searched ? (React.createElement(IconButton, { onClick: clearSearch, styleType: "borderless" },
|
|
57
|
-
React.createElement(SvgClose, null))) : (React.createElement(IconButton, { onClick: startSearch, styleType: "borderless" },
|
|
58
|
-
React.createElement(SvgSearch, null))) })),
|
|
59
|
-
React.createElement("div", { className: "gmw-project-grid" },
|
|
60
|
-
React.createElement(ProjectGrid, { onThumbnailClick: onSelect, accessToken: accessToken, apiOverrides: apiOverrides, filterOptions: activeSearchInput, requestType: projectType === 0 ? "favorites" : projectType === 1 ? "recents" : "" })),
|
|
61
|
-
React.createElement("div", { className: "gmw-select-project-action-panel" },
|
|
62
|
-
React.createElement(Button, { onClick: onCancel }, "Cancel"))));
|
|
63
|
-
};
|
|
64
|
-
export default SelectProject;
|
|
65
|
-
//# sourceMappingURL=SelectProject.js.map
|