@itwin/one-click-lca-react 0.3.0 → 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/components/ExportModal.js +83 -41
- package/lib/cjs/components/ExportModal.js.map +1 -1
- package/lib/cjs/components/ExportModal.scss +14 -16
- package/lib/cjs/components/OneClickLCA.js +7 -2
- package/lib/cjs/components/OneClickLCA.js.map +1 -1
- package/lib/cjs/components/Reports.js +41 -16
- package/lib/cjs/components/Reports.js.map +1 -1
- package/lib/cjs/components/Reports.scss +3 -5
- package/lib/cjs/components/utils.js +8 -2
- package/lib/cjs/components/utils.js.map +1 -1
- package/lib/cjs/components/utils.scss +4 -12
- package/lib/cjs/test/ExportModal.test.js +9 -5
- package/lib/cjs/test/ExportModal.test.js.map +1 -1
- package/lib/cjs/test/WidgetHeader.test.js +20 -16
- package/lib/cjs/test/WidgetHeader.test.js.map +1 -1
- package/lib/cjs/widgets/OneClickLCAWidget.d.ts +3 -3
- package/lib/cjs/widgets/OneClickLCAWidget.js +6 -8
- package/lib/cjs/widgets/OneClickLCAWidget.js.map +1 -1
- package/lib/esm/components/ExportModal.js +39 -16
- package/lib/esm/components/ExportModal.js.map +1 -1
- package/lib/esm/components/ExportModal.scss +14 -16
- package/lib/esm/components/OneClickLCA.js +7 -2
- package/lib/esm/components/OneClickLCA.js.map +1 -1
- package/lib/esm/components/Reports.js +12 -6
- package/lib/esm/components/Reports.js.map +1 -1
- package/lib/esm/components/Reports.scss +3 -5
- package/lib/esm/components/utils.js +5 -2
- package/lib/esm/components/utils.js.map +1 -1
- package/lib/esm/components/utils.scss +4 -12
- package/lib/esm/test/ExportModal.test.js +6 -2
- package/lib/esm/test/ExportModal.test.js.map +1 -1
- package/lib/esm/test/WidgetHeader.test.js +14 -13
- package/lib/esm/test/WidgetHeader.test.js.map +1 -1
- package/lib/esm/widgets/OneClickLCAWidget.d.ts +3 -3
- package/lib/esm/widgets/OneClickLCAWidget.js +3 -5
- package/lib/esm/widgets/OneClickLCAWidget.js.map +1 -1
- package/package.json +27 -27
|
@@ -1,15 +1,33 @@
|
|
|
1
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
|
+
};
|
|
2
21
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
22
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
23
|
};
|
|
5
24
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
25
|
/*---------------------------------------------------------------------------------------------
|
|
8
26
|
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
9
27
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
10
28
|
*--------------------------------------------------------------------------------------------*/
|
|
11
29
|
require("./ExportModal.scss");
|
|
12
|
-
const react_1 = require("react");
|
|
30
|
+
const react_1 = __importStar(require("react"));
|
|
13
31
|
const core_frontend_1 = require("@itwin/core-frontend");
|
|
14
32
|
const itwinui_react_1 = require("@itwin/itwinui-react");
|
|
15
33
|
const itwinui_icons_react_1 = require("@itwin/itwinui-icons-react");
|
|
@@ -18,45 +36,44 @@ const oneClickLCALogo_png_1 = __importDefault(require("../../public/logo/oneClic
|
|
|
18
36
|
const ExportModal = (props) => {
|
|
19
37
|
const MILI_SECONDS = 1000;
|
|
20
38
|
const PIN_INTERVAL = 1000;
|
|
21
|
-
const oneClickLCAClientApi = react_1.useMemo(() => new insights_client_1.OCLCAJobsClient(), []);
|
|
22
|
-
const [email, setEmail] = react_1.useState("");
|
|
23
|
-
const [password, setPassword] = react_1.useState("");
|
|
24
|
-
const [passwordIsVisible, showPassword] = react_1.useState(false);
|
|
25
|
-
const [signinError, showSigninError] = react_1.useState(false);
|
|
26
|
-
const [emailError, setEmailError] = react_1.useState(false);
|
|
27
|
-
const [cache, cacheToken] = react_1.useState();
|
|
28
|
-
const [jobStatus, setJobStatus] = react_1.useState();
|
|
29
|
-
const [jobLink, setJobLink] = react_1.useState();
|
|
30
|
-
const isValidEmail = react_1.useCallback(() => {
|
|
39
|
+
const oneClickLCAClientApi = (0, react_1.useMemo)(() => new insights_client_1.OCLCAJobsClient(), []);
|
|
40
|
+
const [email, setEmail] = (0, react_1.useState)("");
|
|
41
|
+
const [password, setPassword] = (0, react_1.useState)("");
|
|
42
|
+
const [passwordIsVisible, showPassword] = (0, react_1.useState)(false);
|
|
43
|
+
const [signinError, showSigninError] = (0, react_1.useState)(false);
|
|
44
|
+
const [emailError, setEmailError] = (0, react_1.useState)(false);
|
|
45
|
+
const [cache, cacheToken] = (0, react_1.useState)();
|
|
46
|
+
const [jobStatus, setJobStatus] = (0, react_1.useState)();
|
|
47
|
+
const [jobLink, setJobLink] = (0, react_1.useState)();
|
|
48
|
+
const isValidEmail = (0, react_1.useCallback)(() => {
|
|
31
49
|
return /\S+@\S+\.\S+/.test(email);
|
|
32
50
|
}, [email]);
|
|
33
|
-
const isValidPassword = react_1.useCallback(() => {
|
|
51
|
+
const isValidPassword = (0, react_1.useCallback)(() => {
|
|
34
52
|
return password !== "";
|
|
35
53
|
}, [password]);
|
|
36
|
-
const validateSignin = react_1.useCallback(() => {
|
|
37
|
-
return
|
|
54
|
+
const validateSignin = (0, react_1.useCallback)(() => {
|
|
55
|
+
return cache?.token && cache?.exp > Date.now();
|
|
38
56
|
}, [cache]);
|
|
39
|
-
const [isSignedIn, setIsSignedIn] = react_1.useState(validateSignin());
|
|
40
|
-
const [isSigningIn, startSigningIn] = react_1.useState(false);
|
|
41
|
-
const intervalRef = react_1.useRef();
|
|
42
|
-
const isValidSignin = react_1.useCallback(() => {
|
|
57
|
+
const [isSignedIn, setIsSignedIn] = (0, react_1.useState)(validateSignin());
|
|
58
|
+
const [isSigningIn, startSigningIn] = (0, react_1.useState)(false);
|
|
59
|
+
const intervalRef = (0, react_1.useRef)();
|
|
60
|
+
const isValidSignin = (0, react_1.useCallback)(() => {
|
|
43
61
|
return isValidEmail() && isValidPassword();
|
|
44
62
|
}, [isValidEmail, isValidPassword]);
|
|
45
|
-
const resetSignin = react_1.useCallback(() => {
|
|
63
|
+
const resetSignin = (0, react_1.useCallback)(() => {
|
|
46
64
|
setEmail("");
|
|
47
65
|
setPassword("");
|
|
48
66
|
showPassword(false);
|
|
49
67
|
showSigninError(false);
|
|
50
68
|
}, [setEmail, setPassword, showPassword, showSigninError]);
|
|
51
|
-
const pinStatus = react_1.useCallback((job) => {
|
|
69
|
+
const pinStatus = (0, react_1.useCallback)((job) => {
|
|
52
70
|
const intervalId = window.setInterval(async () => {
|
|
53
|
-
|
|
54
|
-
const token = (_b = (await ((_a = core_frontend_1.IModelApp.authorizationClient) === null || _a === void 0 ? void 0 : _a.getAccessToken()))) !== null && _b !== void 0 ? _b : "";
|
|
71
|
+
const token = (await core_frontend_1.IModelApp.authorizationClient?.getAccessToken()) ?? "";
|
|
55
72
|
if (job.id && token) {
|
|
56
|
-
const currentJobStatus = await oneClickLCAClientApi.getOCLCAJobStatus(token, job
|
|
73
|
+
const currentJobStatus = await oneClickLCAClientApi.getOCLCAJobStatus(token, job?.id);
|
|
57
74
|
if (currentJobStatus.status) {
|
|
58
75
|
if (currentJobStatus.status === insights_client_1.CarbonUploadState.Succeeded) {
|
|
59
|
-
setJobLink(!!
|
|
76
|
+
setJobLink(!!currentJobStatus?._links?.oneclicklca?.href ? { href: currentJobStatus._links.oneclicklca.href } : undefined);
|
|
60
77
|
}
|
|
61
78
|
setJobStatus(currentJobStatus.status);
|
|
62
79
|
}
|
|
@@ -68,9 +85,8 @@ const ExportModal = (props) => {
|
|
|
68
85
|
}, PIN_INTERVAL);
|
|
69
86
|
intervalRef.current = intervalId;
|
|
70
87
|
}, [setJobLink, setJobStatus, oneClickLCAClientApi]);
|
|
71
|
-
const runJob = react_1.useCallback(async (token) => {
|
|
72
|
-
|
|
73
|
-
const accessToken = (_b = (await ((_a = core_frontend_1.IModelApp.authorizationClient) === null || _a === void 0 ? void 0 : _a.getAccessToken()))) !== null && _b !== void 0 ? _b : "";
|
|
88
|
+
const runJob = (0, react_1.useCallback)(async (token) => {
|
|
89
|
+
const accessToken = (await core_frontend_1.IModelApp.authorizationClient?.getAccessToken()) ?? "";
|
|
74
90
|
if (props.reportId && token) {
|
|
75
91
|
try {
|
|
76
92
|
const jobCreated = await oneClickLCAClientApi.createJob(accessToken, {
|
|
@@ -97,7 +113,7 @@ const ExportModal = (props) => {
|
|
|
97
113
|
itwinui_react_1.toaster.negative("Invalid reportId.");
|
|
98
114
|
}
|
|
99
115
|
}, [props, pinStatus, oneClickLCAClientApi]);
|
|
100
|
-
const signin = react_1.useCallback(async (e) => {
|
|
116
|
+
const signin = (0, react_1.useCallback)(async (e) => {
|
|
101
117
|
e.preventDefault();
|
|
102
118
|
startSigningIn(true);
|
|
103
119
|
try {
|
|
@@ -128,7 +144,7 @@ const ExportModal = (props) => {
|
|
|
128
144
|
showSigninError,
|
|
129
145
|
oneClickLCAClientApi,
|
|
130
146
|
]);
|
|
131
|
-
const onClose = react_1.useCallback(() => {
|
|
147
|
+
const onClose = (0, react_1.useCallback)(() => {
|
|
132
148
|
resetSignin();
|
|
133
149
|
setJobStatus(undefined);
|
|
134
150
|
setJobLink(undefined);
|
|
@@ -137,22 +153,34 @@ const ExportModal = (props) => {
|
|
|
137
153
|
}
|
|
138
154
|
props.close();
|
|
139
155
|
}, [props, resetSignin]);
|
|
140
|
-
const getStatusComponent = react_1.useCallback((status, link) => {
|
|
156
|
+
const getStatusComponent = (0, react_1.useCallback)((status, link) => {
|
|
141
157
|
switch (status) {
|
|
142
158
|
case insights_client_1.CarbonUploadState.Queued:
|
|
143
|
-
return (
|
|
159
|
+
return (react_1.default.createElement("div", { className: "oclca-progress-radial-container" },
|
|
160
|
+
react_1.default.createElement(itwinui_react_1.ProgressRadial, { indeterminate: true, size: "small", value: 50 }),
|
|
161
|
+
react_1.default.createElement(itwinui_react_1.Text, { variant: "leading", className: "oclca-status-text" }, "Export queued")));
|
|
144
162
|
case insights_client_1.CarbonUploadState.Running:
|
|
145
|
-
return (
|
|
163
|
+
return (react_1.default.createElement("div", { className: "oclca-progress-linear-container" },
|
|
164
|
+
react_1.default.createElement(itwinui_react_1.ProgressLinear, { indeterminate: true }),
|
|
165
|
+
react_1.default.createElement(itwinui_react_1.Text, { variant: "leading", className: "oclca-status-text" }, "Export running")));
|
|
146
166
|
case insights_client_1.CarbonUploadState.Succeeded:
|
|
147
|
-
return (link && (
|
|
167
|
+
return (link && (react_1.default.createElement("div", { className: "oclca-progress-radial-container" },
|
|
168
|
+
react_1.default.createElement(itwinui_react_1.ProgressRadial, { status: "positive", size: "small", value: 50 }),
|
|
169
|
+
react_1.default.createElement("a", { className: "oclca-report-button", href: link, target: "_blank", rel: "noopener noreferrer" },
|
|
170
|
+
react_1.default.createElement(itwinui_react_1.Button, { styleType: "cta" }, "Open in One Click LCA")))));
|
|
148
171
|
case insights_client_1.CarbonUploadState.Failed:
|
|
149
|
-
return (
|
|
172
|
+
return (react_1.default.createElement("div", { className: "oclca-progress-radial-container" },
|
|
173
|
+
react_1.default.createElement(itwinui_react_1.ProgressRadial, { status: "negative", size: "small", value: 100 }),
|
|
174
|
+
react_1.default.createElement(itwinui_react_1.Text, { variant: "leading", className: "oclca-status-text" }, "Export failed")));
|
|
150
175
|
default:
|
|
151
|
-
return (
|
|
176
|
+
return (react_1.default.createElement("div", { className: "oclca-progress-radial-container" },
|
|
177
|
+
react_1.default.createElement(itwinui_react_1.Text, null,
|
|
178
|
+
"Invalid Job Status ",
|
|
179
|
+
react_1.default.createElement("span", { role: "img", "aria-label": "sad" }, "\uD83D\uDE14"))));
|
|
152
180
|
}
|
|
153
181
|
}, []);
|
|
154
|
-
react_1.useEffect(() => {
|
|
155
|
-
if (props.isOpen && isSignedIn &&
|
|
182
|
+
(0, react_1.useEffect)(() => {
|
|
183
|
+
if (props.isOpen && isSignedIn && cache?.token) {
|
|
156
184
|
runJob(cache.token).catch((err) => {
|
|
157
185
|
setJobStatus(insights_client_1.CarbonUploadState.Failed);
|
|
158
186
|
itwinui_react_1.toaster.negative("Error occurs while running the job. 😔");
|
|
@@ -161,7 +189,7 @@ const ExportModal = (props) => {
|
|
|
161
189
|
});
|
|
162
190
|
}
|
|
163
191
|
}, [props.isOpen, isSignedIn, cache, runJob]);
|
|
164
|
-
react_1.useEffect(() => {
|
|
192
|
+
(0, react_1.useEffect)(() => {
|
|
165
193
|
if (jobStatus === insights_client_1.CarbonUploadState.Succeeded ||
|
|
166
194
|
jobStatus === insights_client_1.CarbonUploadState.Failed) {
|
|
167
195
|
if (intervalRef.current) {
|
|
@@ -169,7 +197,7 @@ const ExportModal = (props) => {
|
|
|
169
197
|
}
|
|
170
198
|
}
|
|
171
199
|
}, [jobStatus]);
|
|
172
|
-
react_1.useEffect(() => {
|
|
200
|
+
(0, react_1.useEffect)(() => {
|
|
173
201
|
if (email !== "") {
|
|
174
202
|
const timeoutId = setTimeout(() => setEmailError(!isValidEmail()), 1000);
|
|
175
203
|
return () => clearTimeout(timeoutId);
|
|
@@ -179,7 +207,21 @@ const ExportModal = (props) => {
|
|
|
179
207
|
return;
|
|
180
208
|
}
|
|
181
209
|
}, [email, isValidEmail]);
|
|
182
|
-
return (
|
|
210
|
+
return (react_1.default.createElement(itwinui_react_1.Modal, { "data-testid": "export-modal", isOpen: props.isOpen, onClose: onClose, title: null, closeOnExternalClick: false },
|
|
211
|
+
!isSignedIn && (react_1.default.createElement("div", { className: "oclca-signin" },
|
|
212
|
+
react_1.default.createElement("img", { className: "oclca-signin-icon", src: oneClickLCALogo_png_1.default, alt: "One Click LCA\u00AE software", "data-height-percentage": "80", "data-actual-width": "1200", "data-actual-height": "600" }),
|
|
213
|
+
react_1.default.createElement("form", { onSubmit: signin, className: "oclca-signin-form" },
|
|
214
|
+
react_1.default.createElement("div", { className: "oclca-signin-prompt" }, "Sign in to One Click LCA."),
|
|
215
|
+
signinError && (react_1.default.createElement(itwinui_react_1.Alert, { type: "negative", className: "oclca-signin-error" }, "Incorrect email or password.")),
|
|
216
|
+
react_1.default.createElement("div", { className: "oclca-signin-input" },
|
|
217
|
+
react_1.default.createElement(itwinui_react_1.LabeledInput, { label: "Email", value: email, onChange: (v) => setEmail(v.target.value), type: "email", status: emailError ? "negative" : undefined, message: emailError ? "Invalid email address." : "", required: true })),
|
|
218
|
+
react_1.default.createElement("div", { className: "oclca-signin-input" },
|
|
219
|
+
react_1.default.createElement(itwinui_react_1.LabeledInput, { label: "Password", value: password, onChange: (e) => setPassword(e.target.value), type: passwordIsVisible ? "text" : "password", svgIcon: passwordIsVisible ? (react_1.default.createElement(itwinui_icons_react_1.SvgVisibilityHide, { onClick: () => showPassword(!passwordIsVisible) })) : (react_1.default.createElement(itwinui_icons_react_1.SvgVisibilityShow, null)), iconDisplayStyle: "inline", required: true })),
|
|
220
|
+
react_1.default.createElement("div", { className: "oclca-signin-button-container" },
|
|
221
|
+
react_1.default.createElement(itwinui_react_1.Button, { className: "oclca-signin-button", type: "submit", styleType: "cta", disabled: !isValidSignin() }, isSigningIn ? (react_1.default.createElement(itwinui_react_1.ProgressRadial, { className: "oclca-signin-wait", indeterminate: true, size: "small", value: 50 })) : ("Sign In")))))),
|
|
222
|
+
isSignedIn && !jobStatus && (react_1.default.createElement("div", { className: "oclca-progress-radial-container" },
|
|
223
|
+
react_1.default.createElement(itwinui_react_1.ProgressRadial, { indeterminate: true, size: "large", value: 50 }))),
|
|
224
|
+
isSignedIn && jobStatus && getStatusComponent(jobStatus, jobLink?.href)));
|
|
183
225
|
};
|
|
184
226
|
exports.default = ExportModal;
|
|
185
227
|
//# sourceMappingURL=ExportModal.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExportModal.js","sourceRoot":"","sources":["../../../src/components/ExportModal.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 \"./ExportModal.scss\";\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { IModelApp } from \"@itwin/core-frontend\";\nimport {\n Alert,\n Button,\n LabeledInput,\n Modal,\n ProgressLinear,\n ProgressRadial,\n Text,\n toaster,\n} from \"@itwin/itwinui-react\";\nimport {\n SvgVisibilityHide,\n SvgVisibilityShow,\n} from \"@itwin/itwinui-icons-react\";\nimport type { Link, OCLCAJob } from \"@itwin/insights-client\";\nimport { CarbonUploadState, OCLCAJobsClient } from \"@itwin/insights-client\";\nimport logo from \"../../public/logo/oneClickLCALogo.png\";\n\ninterface ExportProps {\n isOpen: boolean;\n close: () => void;\n reportId: string | undefined;\n}\n\ninterface OclcaTokenCache {\n token: string;\n exp: number;\n}\n\nconst ExportModal = (props: ExportProps) => {\n const MILI_SECONDS = 1000;\n const PIN_INTERVAL = 1000;\n const oneClickLCAClientApi = useMemo(() => new OCLCAJobsClient(), []);\n\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [passwordIsVisible, showPassword] = useState(false);\n const [signinError, showSigninError] = useState(false);\n const [emailError, setEmailError] = useState(false);\n const [cache, cacheToken] = useState<OclcaTokenCache>();\n\n const [jobStatus, setJobStatus] = useState<CarbonUploadState>();\n const [jobLink, setJobLink] = useState<Link | undefined>();\n\n const isValidEmail = useCallback(() => {\n return /\\S+@\\S+\\.\\S+/.test(email);\n }, [email]);\n\n const isValidPassword = useCallback(() => {\n return password !== \"\";\n }, [password]);\n\n const validateSignin = useCallback(() => {\n return cache?.token && cache?.exp > Date.now();\n }, [cache]);\n\n const [isSignedIn, setIsSignedIn] = useState(validateSignin());\n const [isSigningIn, startSigningIn] = useState(false);\n const intervalRef = useRef<number>();\n\n const isValidSignin = useCallback(() => {\n return isValidEmail() && isValidPassword();\n }, [isValidEmail, isValidPassword]);\n\n const resetSignin = useCallback(() => {\n setEmail(\"\");\n setPassword(\"\");\n showPassword(false);\n showSigninError(false);\n }, [setEmail, setPassword, showPassword, showSigninError]);\n\n const pinStatus = useCallback(\n (job: OCLCAJob) => {\n const intervalId = window.setInterval(async () => {\n const token =\n (await IModelApp.authorizationClient?.getAccessToken()) ?? \"\";\n if (job.id && token) {\n const currentJobStatus =\n await oneClickLCAClientApi.getOCLCAJobStatus(token, job?.id);\n if (currentJobStatus.status) {\n if (\n currentJobStatus.status === CarbonUploadState.Succeeded\n ) {\n setJobLink(!!currentJobStatus?._links?.oneclicklca?.href ? { href: currentJobStatus._links.oneclicklca.href } : undefined);\n }\n setJobStatus(currentJobStatus.status);\n } else {\n setJobStatus(CarbonUploadState.Failed);\n toaster.negative(\"Failed to get job status. 😔\");\n }\n }\n }, PIN_INTERVAL);\n intervalRef.current = intervalId;\n },\n [setJobLink, setJobStatus, oneClickLCAClientApi]\n );\n\n const runJob = useCallback(\n async (token: string) => {\n const accessToken =\n (await IModelApp.authorizationClient?.getAccessToken()) ?? \"\";\n if (props.reportId && token) {\n try {\n const jobCreated = await oneClickLCAClientApi.createJob(\n accessToken,\n {\n reportId: props.reportId,\n token,\n }\n );\n if (jobCreated.id) {\n pinStatus(jobCreated);\n } else {\n setJobStatus(CarbonUploadState.Failed);\n toaster.negative(\"Failed to create one click lca job. 😔\");\n }\n } catch (e) {\n setJobStatus(CarbonUploadState.Failed);\n toaster.negative(\"You do not have the required permissions. Please contact the project administrator.\");\n /* eslint-disable no-console */\n console.error(e);\n }\n } else {\n setJobStatus(CarbonUploadState.Failed);\n toaster.negative(\"Invalid reportId.\");\n }\n },\n [props, pinStatus, oneClickLCAClientApi]\n );\n\n const signin = useCallback(\n async (e) => {\n e.preventDefault();\n startSigningIn(true);\n try {\n const result = await oneClickLCAClientApi.getOCLCAAccessToken(\n email,\n password\n );\n if (result && result.access_token && result.expires_in) {\n cacheToken({\n token: result.access_token,\n exp: Date.now() + result.expires_in * MILI_SECONDS,\n });\n resetSignin();\n setIsSignedIn(true);\n } else {\n showSigninError(true);\n }\n } catch (err) {\n toaster.negative(\"Failed to sign in One Click LCA.\");\n /* eslint-disable no-console */\n console.error(err);\n }\n startSigningIn(false);\n },\n [\n email,\n password,\n resetSignin,\n cacheToken,\n showSigninError,\n oneClickLCAClientApi,\n ]\n );\n\n const onClose = useCallback(() => {\n resetSignin();\n setJobStatus(undefined);\n setJobLink(undefined);\n if (intervalRef.current) {\n window.clearInterval(intervalRef.current);\n }\n props.close();\n }, [props, resetSignin]);\n\n const getStatusComponent = useCallback(\n (status: CarbonUploadState, link: string | undefined) => {\n switch (status) {\n case CarbonUploadState.Queued:\n return (\n <div className=\"oclca-progress-radial-container\">\n <ProgressRadial indeterminate size=\"small\" value={50} />\n <Text variant=\"leading\" className=\"oclca-status-text\">\n Export queued\n </Text>\n </div>\n );\n case CarbonUploadState.Running:\n return (\n <div className=\"oclca-progress-linear-container\">\n <ProgressLinear indeterminate />\n <Text variant=\"leading\" className=\"oclca-status-text\">\n Export running\n </Text>\n </div>\n );\n case CarbonUploadState.Succeeded:\n return (\n link && (\n <div className=\"oclca-progress-radial-container\">\n <ProgressRadial status=\"positive\" size=\"small\" value={50} />\n <a\n className=\"oclca-report-button\"\n href={link}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <Button styleType=\"cta\">Open in One Click LCA</Button>\n </a>\n </div>\n )\n );\n case CarbonUploadState.Failed:\n return (\n <div className=\"oclca-progress-radial-container\">\n <ProgressRadial status=\"negative\" size=\"small\" value={100} />\n <Text variant=\"leading\" className=\"oclca-status-text\">\n Export failed\n </Text>\n </div>\n );\n default:\n return (\n <div className=\"oclca-progress-radial-container\">\n <Text>Invalid Job Status <span role=\"img\" aria-label=\"sad\">😔</span></Text>\n </div>\n );\n }\n },\n []\n );\n\n useEffect(() => {\n if (props.isOpen && isSignedIn && cache?.token) {\n runJob(cache.token).catch((err) => {\n setJobStatus(CarbonUploadState.Failed);\n toaster.negative(\"Error occurs while running the job. 😔\");\n /* eslint-disable no-console */\n console.error(err);\n });\n }\n }, [props.isOpen, isSignedIn, cache, runJob]);\n\n useEffect(() => {\n if (\n jobStatus === CarbonUploadState.Succeeded ||\n jobStatus === CarbonUploadState.Failed\n ) {\n if (intervalRef.current) {\n window.clearInterval(intervalRef.current);\n }\n }\n }, [jobStatus]);\n\n useEffect(() => {\n if (email !== \"\") {\n const timeoutId = setTimeout(() => setEmailError(!isValidEmail()), 1000);\n return () => clearTimeout(timeoutId);\n } else {\n setEmailError(false);\n return;\n }\n }, [email, isValidEmail]);\n\n return (\n <Modal\n data-testid=\"export-modal\"\n isOpen={props.isOpen}\n onClose={onClose}\n title={null}\n closeOnExternalClick={false}\n >\n {!isSignedIn && (\n <div className=\"oclca-signin\">\n <img\n className=\"oclca-signin-icon\"\n src={logo}\n alt=\"One Click LCA® software\"\n data-height-percentage=\"80\"\n data-actual-width=\"1200\"\n data-actual-height=\"600\"\n />\n <form onSubmit={signin} className=\"oclca-signin-form\">\n <div className=\"oclca-signin-prompt\">Sign in to One Click LCA.</div>\n {signinError && (\n <Alert type=\"negative\" className=\"oclca-signin-error\">\n Incorrect email or password.\n </Alert>\n )}\n <div className=\"oclca-signin-input\">\n <LabeledInput\n label=\"Email\"\n value={email}\n onChange={(v) => setEmail(v.target.value)}\n type=\"email\"\n status={emailError ? \"negative\" : undefined}\n message={emailError ? \"Invalid email address.\" : \"\"}\n required\n />\n </div>\n <div className=\"oclca-signin-input\">\n <LabeledInput\n label=\"Password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n type={passwordIsVisible ? \"text\" : \"password\"}\n svgIcon={\n passwordIsVisible ? (\n <SvgVisibilityHide\n onClick={() => showPassword(!passwordIsVisible)}\n />\n ) : (\n <SvgVisibilityShow />\n )\n }\n iconDisplayStyle=\"inline\"\n required\n />\n </div>\n\n <div className=\"oclca-signin-button-container\">\n <Button\n className=\"oclca-signin-button\"\n type=\"submit\"\n styleType=\"cta\"\n disabled={!isValidSignin()}\n >\n {isSigningIn ? (\n <ProgressRadial\n className=\"oclca-signin-wait\"\n indeterminate\n size=\"small\"\n value={50}\n />\n ) : (\n \"Sign In\"\n )}\n </Button>\n </div>\n </form>\n </div>\n )}\n {isSignedIn && !jobStatus && (\n <div className=\"oclca-progress-radial-container\">\n <ProgressRadial indeterminate size=\"large\" value={50} />\n </div>\n )}\n {isSignedIn && jobStatus && getStatusComponent(jobStatus, jobLink?.href)}\n </Modal>\n );\n};\n\nexport default ExportModal;\n"]}
|
|
1
|
+
{"version":3,"file":"ExportModal.js","sourceRoot":"","sources":["../../../src/components/ExportModal.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 \"./ExportModal.scss\";\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { IModelApp } from \"@itwin/core-frontend\";\nimport {\n Alert,\n Button,\n LabeledInput,\n Modal,\n ProgressLinear,\n ProgressRadial,\n Text,\n toaster,\n} from \"@itwin/itwinui-react\";\nimport {\n SvgVisibilityHide,\n SvgVisibilityShow,\n} from \"@itwin/itwinui-icons-react\";\nimport type { Link, OCLCAJob } from \"@itwin/insights-client\";\nimport { CarbonUploadState, OCLCAJobsClient } from \"@itwin/insights-client\";\nimport logo from \"../../public/logo/oneClickLCALogo.png\";\n\ninterface ExportProps {\n isOpen: boolean;\n close: () => void;\n reportId: string | undefined;\n}\n\ninterface OclcaTokenCache {\n token: string;\n exp: number;\n}\n\nconst ExportModal = (props: ExportProps) => {\n const MILI_SECONDS = 1000;\n const PIN_INTERVAL = 1000;\n const oneClickLCAClientApi = useMemo(() => new OCLCAJobsClient(), []);\n\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [passwordIsVisible, showPassword] = useState(false);\n const [signinError, showSigninError] = useState(false);\n const [emailError, setEmailError] = useState(false);\n const [cache, cacheToken] = useState<OclcaTokenCache>();\n\n const [jobStatus, setJobStatus] = useState<CarbonUploadState>();\n const [jobLink, setJobLink] = useState<Link | undefined>();\n\n const isValidEmail = useCallback(() => {\n return /\\S+@\\S+\\.\\S+/.test(email);\n }, [email]);\n\n const isValidPassword = useCallback(() => {\n return password !== \"\";\n }, [password]);\n\n const validateSignin = useCallback(() => {\n return cache?.token && cache?.exp > Date.now();\n }, [cache]);\n\n const [isSignedIn, setIsSignedIn] = useState(validateSignin());\n const [isSigningIn, startSigningIn] = useState(false);\n const intervalRef = useRef<number>();\n\n const isValidSignin = useCallback(() => {\n return isValidEmail() && isValidPassword();\n }, [isValidEmail, isValidPassword]);\n\n const resetSignin = useCallback(() => {\n setEmail(\"\");\n setPassword(\"\");\n showPassword(false);\n showSigninError(false);\n }, [setEmail, setPassword, showPassword, showSigninError]);\n\n const pinStatus = useCallback(\n (job: OCLCAJob) => {\n const intervalId = window.setInterval(async () => {\n const token =\n (await IModelApp.authorizationClient?.getAccessToken()) ?? \"\";\n if (job.id && token) {\n const currentJobStatus =\n await oneClickLCAClientApi.getOCLCAJobStatus(token, job?.id);\n if (currentJobStatus.status) {\n if (\n currentJobStatus.status === CarbonUploadState.Succeeded\n ) {\n setJobLink(!!currentJobStatus?._links?.oneclicklca?.href ? { href: currentJobStatus._links.oneclicklca.href } : undefined);\n }\n setJobStatus(currentJobStatus.status);\n } else {\n setJobStatus(CarbonUploadState.Failed);\n toaster.negative(\"Failed to get job status. 😔\");\n }\n }\n }, PIN_INTERVAL);\n intervalRef.current = intervalId;\n },\n [setJobLink, setJobStatus, oneClickLCAClientApi]\n );\n\n const runJob = useCallback(\n async (token: string) => {\n const accessToken =\n (await IModelApp.authorizationClient?.getAccessToken()) ?? \"\";\n if (props.reportId && token) {\n try {\n const jobCreated = await oneClickLCAClientApi.createJob(\n accessToken,\n {\n reportId: props.reportId,\n token,\n }\n );\n if (jobCreated.id) {\n pinStatus(jobCreated);\n } else {\n setJobStatus(CarbonUploadState.Failed);\n toaster.negative(\"Failed to create one click lca job. 😔\");\n }\n } catch (e) {\n setJobStatus(CarbonUploadState.Failed);\n toaster.negative(\"You do not have the required permissions. Please contact the project administrator.\");\n /* eslint-disable no-console */\n console.error(e);\n }\n } else {\n setJobStatus(CarbonUploadState.Failed);\n toaster.negative(\"Invalid reportId.\");\n }\n },\n [props, pinStatus, oneClickLCAClientApi]\n );\n\n const signin = useCallback(\n async (e) => {\n e.preventDefault();\n startSigningIn(true);\n try {\n const result = await oneClickLCAClientApi.getOCLCAAccessToken(\n email,\n password\n );\n if (result && result.access_token && result.expires_in) {\n cacheToken({\n token: result.access_token,\n exp: Date.now() + result.expires_in * MILI_SECONDS,\n });\n resetSignin();\n setIsSignedIn(true);\n } else {\n showSigninError(true);\n }\n } catch (err) {\n toaster.negative(\"Failed to sign in One Click LCA.\");\n /* eslint-disable no-console */\n console.error(err);\n }\n startSigningIn(false);\n },\n [\n email,\n password,\n resetSignin,\n cacheToken,\n showSigninError,\n oneClickLCAClientApi,\n ]\n );\n\n const onClose = useCallback(() => {\n resetSignin();\n setJobStatus(undefined);\n setJobLink(undefined);\n if (intervalRef.current) {\n window.clearInterval(intervalRef.current);\n }\n props.close();\n }, [props, resetSignin]);\n\n const getStatusComponent = useCallback(\n (status: CarbonUploadState, link: string | undefined) => {\n switch (status) {\n case CarbonUploadState.Queued:\n return (\n <div className=\"oclca-progress-radial-container\">\n <ProgressRadial indeterminate size=\"small\" value={50} />\n <Text variant=\"leading\" className=\"oclca-status-text\">\n Export queued\n </Text>\n </div>\n );\n case CarbonUploadState.Running:\n return (\n <div className=\"oclca-progress-linear-container\">\n <ProgressLinear indeterminate />\n <Text variant=\"leading\" className=\"oclca-status-text\">\n Export running\n </Text>\n </div>\n );\n case CarbonUploadState.Succeeded:\n return (\n link && (\n <div className=\"oclca-progress-radial-container\">\n <ProgressRadial status=\"positive\" size=\"small\" value={50} />\n <a\n className=\"oclca-report-button\"\n href={link}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <Button styleType=\"cta\">Open in One Click LCA</Button>\n </a>\n </div>\n )\n );\n case CarbonUploadState.Failed:\n return (\n <div className=\"oclca-progress-radial-container\">\n <ProgressRadial status=\"negative\" size=\"small\" value={100} />\n <Text variant=\"leading\" className=\"oclca-status-text\">\n Export failed\n </Text>\n </div>\n );\n default:\n return (\n <div className=\"oclca-progress-radial-container\">\n <Text>Invalid Job Status <span role=\"img\" aria-label=\"sad\">😔</span></Text>\n </div>\n );\n }\n },\n []\n );\n\n useEffect(() => {\n if (props.isOpen && isSignedIn && cache?.token) {\n runJob(cache.token).catch((err) => {\n setJobStatus(CarbonUploadState.Failed);\n toaster.negative(\"Error occurs while running the job. 😔\");\n /* eslint-disable no-console */\n console.error(err);\n });\n }\n }, [props.isOpen, isSignedIn, cache, runJob]);\n\n useEffect(() => {\n if (\n jobStatus === CarbonUploadState.Succeeded ||\n jobStatus === CarbonUploadState.Failed\n ) {\n if (intervalRef.current) {\n window.clearInterval(intervalRef.current);\n }\n }\n }, [jobStatus]);\n\n useEffect(() => {\n if (email !== \"\") {\n const timeoutId = setTimeout(() => setEmailError(!isValidEmail()), 1000);\n return () => clearTimeout(timeoutId);\n } else {\n setEmailError(false);\n return;\n }\n }, [email, isValidEmail]);\n\n return (\n <Modal\n data-testid=\"export-modal\"\n isOpen={props.isOpen}\n onClose={onClose}\n title={null}\n closeOnExternalClick={false}\n >\n {!isSignedIn && (\n <div className=\"oclca-signin\">\n <img\n className=\"oclca-signin-icon\"\n src={logo}\n alt=\"One Click LCA® software\"\n data-height-percentage=\"80\"\n data-actual-width=\"1200\"\n data-actual-height=\"600\"\n />\n <form onSubmit={signin} className=\"oclca-signin-form\">\n <div className=\"oclca-signin-prompt\">Sign in to One Click LCA.</div>\n {signinError && (\n <Alert type=\"negative\" className=\"oclca-signin-error\">\n Incorrect email or password.\n </Alert>\n )}\n <div className=\"oclca-signin-input\">\n <LabeledInput\n label=\"Email\"\n value={email}\n onChange={(v) => setEmail(v.target.value)}\n type=\"email\"\n status={emailError ? \"negative\" : undefined}\n message={emailError ? \"Invalid email address.\" : \"\"}\n required\n />\n </div>\n <div className=\"oclca-signin-input\">\n <LabeledInput\n label=\"Password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n type={passwordIsVisible ? \"text\" : \"password\"}\n svgIcon={\n passwordIsVisible ? (\n <SvgVisibilityHide\n onClick={() => showPassword(!passwordIsVisible)}\n />\n ) : (\n <SvgVisibilityShow />\n )\n }\n iconDisplayStyle=\"inline\"\n required\n />\n </div>\n\n <div className=\"oclca-signin-button-container\">\n <Button\n className=\"oclca-signin-button\"\n type=\"submit\"\n styleType=\"cta\"\n disabled={!isValidSignin()}\n >\n {isSigningIn ? (\n <ProgressRadial\n className=\"oclca-signin-wait\"\n indeterminate\n size=\"small\"\n value={50}\n />\n ) : (\n \"Sign In\"\n )}\n </Button>\n </div>\n </form>\n </div>\n )}\n {isSignedIn && !jobStatus && (\n <div className=\"oclca-progress-radial-container\">\n <ProgressRadial indeterminate size=\"large\" value={50} />\n </div>\n )}\n {isSignedIn && jobStatus && getStatusComponent(jobStatus, jobLink?.href)}\n </Modal>\n );\n};\n\nexport default ExportModal;\n"]}
|
|
@@ -2,23 +2,21 @@
|
|
|
2
2
|
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
|
-
@import "~@itwin/itwinui-css/scss/variables";
|
|
6
|
-
|
|
7
5
|
.oclca {
|
|
8
6
|
&-signin {
|
|
9
7
|
display: flex;
|
|
10
8
|
flex-direction: column;
|
|
11
9
|
align-items: center;
|
|
12
|
-
padding-bottom: 4 *
|
|
13
|
-
padding-top: 2 *
|
|
10
|
+
padding-bottom: calc(4 * var(--iui-size-s));
|
|
11
|
+
padding-top: calc(2 * var(--iui-size-s));
|
|
14
12
|
|
|
15
13
|
&-icon {
|
|
16
|
-
width: 2 *
|
|
17
|
-
height: 1 *
|
|
14
|
+
width: calc(2 * var(--iui-size-3xl));
|
|
15
|
+
height: calc(1 * var(--iui-size-3xl));
|
|
18
16
|
}
|
|
19
17
|
|
|
20
18
|
&-prompt {
|
|
21
|
-
margin:
|
|
19
|
+
margin: var(--iui-size-l) 0;
|
|
22
20
|
font-size: medium;
|
|
23
21
|
display: flex;
|
|
24
22
|
flex-direction: column;
|
|
@@ -31,11 +29,11 @@
|
|
|
31
29
|
|
|
32
30
|
&-input {
|
|
33
31
|
width: 100%;
|
|
34
|
-
margin:
|
|
32
|
+
margin: var(--iui-size-2xs) 0;
|
|
35
33
|
}
|
|
36
34
|
|
|
37
35
|
&-button-container {
|
|
38
|
-
margin:
|
|
36
|
+
margin: var(--iui-size-s) 0;
|
|
39
37
|
}
|
|
40
38
|
|
|
41
39
|
&-button {
|
|
@@ -43,7 +41,7 @@
|
|
|
43
41
|
}
|
|
44
42
|
|
|
45
43
|
&-error {
|
|
46
|
-
height:
|
|
44
|
+
height: var(--iui-size-xl);
|
|
47
45
|
font-size: small;
|
|
48
46
|
}
|
|
49
47
|
|
|
@@ -54,7 +52,7 @@
|
|
|
54
52
|
}
|
|
55
53
|
|
|
56
54
|
&-report-button {
|
|
57
|
-
margin:
|
|
55
|
+
margin: var(--iui-size-l);
|
|
58
56
|
text-decoration: none;
|
|
59
57
|
:hover {
|
|
60
58
|
cursor: pointer;
|
|
@@ -62,15 +60,15 @@
|
|
|
62
60
|
}
|
|
63
61
|
|
|
64
62
|
&-status-text {
|
|
65
|
-
margin:
|
|
63
|
+
margin: var(--iui-size-xs);
|
|
66
64
|
}
|
|
67
65
|
|
|
68
66
|
&-progress-radial-container {
|
|
69
67
|
display: flex;
|
|
70
68
|
flex-direction: column;
|
|
71
69
|
align-items: center;
|
|
72
|
-
margin:
|
|
73
|
-
height:
|
|
70
|
+
margin: var(--iui-size-l);
|
|
71
|
+
height: var(--iui-size-3xl);
|
|
74
72
|
place-content: space-evenly;
|
|
75
73
|
}
|
|
76
74
|
|
|
@@ -78,8 +76,8 @@
|
|
|
78
76
|
display: flex;
|
|
79
77
|
flex-direction: column;
|
|
80
78
|
text-align: center;
|
|
81
|
-
margin:
|
|
82
|
-
height:
|
|
79
|
+
margin: var(--iui-size-l);
|
|
80
|
+
height: var(--iui-size-3xl);
|
|
83
81
|
place-content: space-evenly;
|
|
84
82
|
}
|
|
85
83
|
}
|
|
@@ -3,11 +3,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
|
|
6
|
+
/*---------------------------------------------------------------------------------------------
|
|
7
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
8
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
9
|
+
*--------------------------------------------------------------------------------------------*/
|
|
10
|
+
const react_1 = __importDefault(require("react"));
|
|
7
11
|
const Reports_1 = __importDefault(require("./Reports"));
|
|
8
12
|
require("./Reports.scss");
|
|
9
13
|
const OneClickLCA = () => {
|
|
10
|
-
return (
|
|
14
|
+
return (react_1.default.createElement("div", { className: "oclca-container" },
|
|
15
|
+
react_1.default.createElement(Reports_1.default, null)));
|
|
11
16
|
};
|
|
12
17
|
exports.default = OneClickLCA;
|
|
13
18
|
//# sourceMappingURL=OneClickLCA.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OneClickLCA.js","sourceRoot":"","sources":["../../../src/components/OneClickLCA.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"OneClickLCA.js","sourceRoot":"","sources":["../../../src/components/OneClickLCA.tsx"],"names":[],"mappings":";;;;;AAAA;;;+FAG+F;AAC/F,kDAA0B;AAC1B,wDAAgC;AAChC,0BAAwB;AAExB,MAAM,WAAW,GAAG,GAAG,EAAE;IACvB,OAAO,CACL,uCAAK,SAAS,EAAC,iBAAiB;QAC9B,8BAAC,iBAAO,OAAG,CACP,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,kBAAe,WAAW,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport React from \"react\";\nimport Reports from \"./Reports\";\nimport \"./Reports.scss\";\n\nconst OneClickLCA = () => {\n return (\n <div className=\"oclca-container\">\n <Reports />\n </div>\n );\n};\n\nexport default OneClickLCA;\n"]}
|
|
@@ -1,14 +1,32 @@
|
|
|
1
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
|
+
};
|
|
2
21
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
22
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
23
|
};
|
|
5
24
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
25
|
/*---------------------------------------------------------------------------------------------
|
|
8
26
|
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
9
27
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
10
28
|
*--------------------------------------------------------------------------------------------*/
|
|
11
|
-
const react_1 = require("react");
|
|
29
|
+
const react_1 = __importStar(require("react"));
|
|
12
30
|
const core_react_1 = require("@itwin/core-react");
|
|
13
31
|
const core_frontend_1 = require("@itwin/core-frontend");
|
|
14
32
|
const appui_react_1 = require("@itwin/appui-react");
|
|
@@ -18,16 +36,15 @@ const utils_1 = require("./utils");
|
|
|
18
36
|
const ExportModal_1 = __importDefault(require("./ExportModal"));
|
|
19
37
|
require("./Reports.scss");
|
|
20
38
|
const Reports = () => {
|
|
21
|
-
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
const [
|
|
25
|
-
const [
|
|
26
|
-
const [
|
|
27
|
-
const [
|
|
28
|
-
const [
|
|
29
|
-
const
|
|
30
|
-
const reportsColumns = react_1.useMemo(() => [
|
|
39
|
+
const projectId = (0, appui_react_1.useActiveIModelConnection)()?.iTwinId;
|
|
40
|
+
const reportsClientApi = (0, react_1.useMemo)(() => new insights_client_1.ReportsClient(), []);
|
|
41
|
+
const [isLoading, setIsLoading] = (0, react_1.useState)(true);
|
|
42
|
+
const [reports, setReports] = (0, react_1.useState)([]);
|
|
43
|
+
const [buttonIsDisabled, disableButton] = (0, react_1.useState)(true);
|
|
44
|
+
const [filteredReports, setFilteredReports] = (0, react_1.useState)(reports);
|
|
45
|
+
const [selectedReport, setSelectedReport] = (0, react_1.useState)();
|
|
46
|
+
const [modalIsOpen, openModal] = (0, react_1.useState)(false);
|
|
47
|
+
const reportsColumns = (0, react_1.useMemo)(() => [
|
|
31
48
|
{
|
|
32
49
|
Header: "Table",
|
|
33
50
|
columns: [
|
|
@@ -60,7 +77,7 @@ const Reports = () => {
|
|
|
60
77
|
}
|
|
61
78
|
return newState;
|
|
62
79
|
};
|
|
63
|
-
const onReportRowClick = react_1.useMemo(() => (_, row) => {
|
|
80
|
+
const onReportRowClick = (0, react_1.useMemo)(() => (_, row) => {
|
|
64
81
|
if (row.original === selectedReport) {
|
|
65
82
|
disableButton(!buttonIsDisabled);
|
|
66
83
|
row.toggleRowSelected();
|
|
@@ -71,7 +88,7 @@ const Reports = () => {
|
|
|
71
88
|
}
|
|
72
89
|
setSelectedReport(row.original);
|
|
73
90
|
}, [buttonIsDisabled, selectedReport]);
|
|
74
|
-
react_1.useEffect(() => {
|
|
91
|
+
(0, react_1.useEffect)(() => {
|
|
75
92
|
if (!core_frontend_1.IModelApp.authorizationClient)
|
|
76
93
|
throw new Error("AuthorizationClient is not defined. Most likely IModelApp.startup was not called yet.");
|
|
77
94
|
core_frontend_1.IModelApp.authorizationClient
|
|
@@ -81,7 +98,7 @@ const Reports = () => {
|
|
|
81
98
|
.getReports(token, projectId)
|
|
82
99
|
.then((data) => {
|
|
83
100
|
if (data) {
|
|
84
|
-
const fetchedReports = data
|
|
101
|
+
const fetchedReports = data ?? [];
|
|
85
102
|
setReports(fetchedReports);
|
|
86
103
|
setFilteredReports(fetchedReports);
|
|
87
104
|
setIsLoading(false);
|
|
@@ -100,7 +117,15 @@ const Reports = () => {
|
|
|
100
117
|
console.error(err);
|
|
101
118
|
});
|
|
102
119
|
}, [projectId, reportsClientApi]);
|
|
103
|
-
return (
|
|
120
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
121
|
+
react_1.default.createElement(utils_1.WidgetHeader, { title: "Reports" }),
|
|
122
|
+
react_1.default.createElement("div", { className: "oclca-reports-container" },
|
|
123
|
+
react_1.default.createElement("div", { className: "oclca-searchbox-container" },
|
|
124
|
+
react_1.default.createElement(core_react_1.SearchBox, { onValueChanged: onSearchBoxValueChanged, placeholder: "Search reports" })),
|
|
125
|
+
react_1.default.createElement("div", { className: "oclca-scrollable-table" },
|
|
126
|
+
react_1.default.createElement(itwinui_react_1.Table, { className: "oclca-reports-table", data: filteredReports, density: "extra-condensed", columns: reportsColumns, emptyTableContent: "No reports available.", isSortable: true, onRowClick: onReportRowClick, stateReducer: tableStateSingleSelectReducer, isLoading: isLoading, selectRowOnClick: true, selectSubRows: false }))),
|
|
127
|
+
react_1.default.createElement(itwinui_react_1.Button, { onClick: () => openModal(true), styleType: "cta", disabled: buttonIsDisabled, className: "oclca-button-center" }, "One Click LCA Export"),
|
|
128
|
+
react_1.default.createElement(ExportModal_1.default, { isOpen: modalIsOpen, close: () => openModal(false), reportId: selectedReport?.id })));
|
|
104
129
|
};
|
|
105
130
|
exports.default = Reports;
|
|
106
131
|
//# sourceMappingURL=Reports.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Reports.js","sourceRoot":"","sources":["../../../src/components/Reports.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Reports.js","sourceRoot":"","sources":["../../../src/components/Reports.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 React, { useEffect, useMemo, useState } from \"react\";\nimport { SearchBox } from \"@itwin/core-react\";\nimport { IModelApp } from \"@itwin/core-frontend\";\nimport { useActiveIModelConnection } from \"@itwin/appui-react\";\nimport { Button, Table, toaster } from \"@itwin/itwinui-react\";\nimport type { Report } from \"@itwin/insights-client\";\nimport { ReportsClient } from \"@itwin/insights-client\";\nimport { WidgetHeader } from \"./utils\";\nimport ExportModal from \"./ExportModal\";\nimport \"./Reports.scss\";\n\ntype CreateTypeFromInterface<Interface> = {\n [Property in keyof Interface]: Interface[Property];\n};\n\ntype Reporting = CreateTypeFromInterface<Report>;\n\nconst Reports = () => {\n const projectId = useActiveIModelConnection()?.iTwinId as string;\n const reportsClientApi = useMemo(() => new ReportsClient(), []);\n\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [reports, setReports] = useState<Report[]>([]);\n const [buttonIsDisabled, disableButton] = useState<boolean>(true);\n const [filteredReports, setFilteredReports] = useState<Report[]>(reports);\n const [selectedReport, setSelectedReport] = useState<Reporting>();\n\n const [modalIsOpen, openModal] = useState(false);\n\n const reportsColumns = useMemo(\n () => [\n {\n Header: \"Table\",\n columns: [\n {\n id: \"displayName\",\n Header: \"Name\",\n accessor: \"displayName\",\n },\n {\n id: \"description\",\n Header: \"Description\",\n accessor: \"description\",\n },\n ],\n },\n ],\n []\n );\n\n const onSearchBoxValueChanged = async (value: string) => {\n disableButton(true);\n const filterReports = reports.filter(\n (x) =>\n x.displayName &&\n x.displayName.toLowerCase().indexOf(value.toLowerCase()) > -1\n );\n setFilteredReports(filterReports);\n };\n\n const tableStateSingleSelectReducer = (newState: any, action: any): any => {\n switch (action.type) {\n case \"toggleRowSelected\": {\n return { ...newState, selectedRowIds: { [action.id]: action.value } };\n }\n default:\n break;\n }\n return newState;\n };\n\n const onReportRowClick = useMemo(\n () => (_: any, row: any) => {\n if (row.original === selectedReport) {\n disableButton(!buttonIsDisabled);\n row.toggleRowSelected();\n } else {\n disableButton(false);\n row.toggleRowSelected(true);\n }\n setSelectedReport(row.original);\n },\n [buttonIsDisabled, selectedReport]\n );\n\n useEffect(() => {\n if (!IModelApp.authorizationClient)\n throw new Error(\n \"AuthorizationClient is not defined. Most likely IModelApp.startup was not called yet.\"\n );\n IModelApp.authorizationClient\n .getAccessToken()\n .then((token: string) => {\n reportsClientApi\n .getReports(token, projectId)\n .then((data) => {\n if (data) {\n const fetchedReports = data ?? [];\n setReports(fetchedReports);\n setFilteredReports(fetchedReports);\n setIsLoading(false);\n }\n })\n .catch((err) => {\n setIsLoading(false);\n toaster.negative(\"You are not authorized to get reports for this projects. Please contact project administrator.\");\n /* eslint-disable no-console */\n console.error(err);\n });\n })\n .catch((err) => {\n toaster.negative(\"You are not authorized to use this system.\");\n /* eslint-disable no-console */\n console.error(err);\n });\n }, [projectId, reportsClientApi]);\n\n return (\n <>\n <WidgetHeader title=\"Reports\" />\n <div className=\"oclca-reports-container\">\n <div className=\"oclca-searchbox-container\">\n <SearchBox\n onValueChanged={onSearchBoxValueChanged}\n placeholder={\"Search reports\"}\n />\n </div>\n <div className=\"oclca-scrollable-table\">\n <Table<Reporting>\n className=\"oclca-reports-table\"\n data={filteredReports}\n density=\"extra-condensed\"\n columns={reportsColumns}\n emptyTableContent=\"No reports available.\"\n isSortable\n onRowClick={onReportRowClick}\n stateReducer={tableStateSingleSelectReducer}\n isLoading={isLoading}\n selectRowOnClick={true}\n selectSubRows={false}\n />\n </div>\n </div>\n <Button\n onClick={() => openModal(true)}\n styleType=\"cta\"\n disabled={buttonIsDisabled}\n className=\"oclca-button-center\"\n >\n One Click LCA Export\n </Button>\n <ExportModal\n isOpen={modalIsOpen}\n close={() => openModal(false)}\n reportId={selectedReport?.id}\n />\n </>\n );\n};\n\nexport default Reports;\n"]}
|