@itwin/one-click-lca-react 0.1.3 → 0.1.4

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 CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Copyright © Bentley Systems, Incorporated. All rights reserved.
4
4
 
5
- The One Click CLA widget is a UI component for iTwin Viewer applications that simplifies how users (and developers) interface with the [Carbon Calculation One Click LCA APIs](https://developer.bentley.com/apis/carbon-calculation/overview/).
5
+ The One Click LCA widget is a UI component for iTwin Viewer applications that simplifies how users (and developers) interface with the [Carbon Calculation One Click LCA APIs](https://developer.bentley.com/apis/carbon-calculation/overview/).
6
6
  The one-click-lca-react package provides a UiProvider class, `OneClickLCAProvider`, which can be passed into the `uiProviders` prop of the iTwin Viewer's `<Viewer />` component.
7
7
 
8
8
  ## Getting Started
@@ -61,7 +61,8 @@ const ExportModal = (props) => {
61
61
  setJobStatus((_f = currentJobStatus.job) === null || _f === void 0 ? void 0 : _f.status);
62
62
  }
63
63
  else {
64
- throw new Error("failed to get job status");
64
+ setJobStatus(insights_client_1.JobStatus.StatusEnum.Failed);
65
+ itwinui_react_1.toaster.negative("Failed to get job status. 😔");
65
66
  }
66
67
  }
67
68
  }, PIN_INTERVAL);
@@ -80,31 +81,43 @@ const ExportModal = (props) => {
80
81
  pinStatus(jobCreated === null || jobCreated === void 0 ? void 0 : jobCreated.job);
81
82
  }
82
83
  else {
83
- throw new Error("Failed to create job");
84
+ setJobStatus(insights_client_1.JobStatus.StatusEnum.Failed);
85
+ itwinui_react_1.toaster.negative("Failed to create one click lca job. 😔");
84
86
  }
85
87
  }
86
88
  catch (e) {
87
- throw new Error(`Failed to create one click lca job.${e}`);
89
+ setJobStatus(insights_client_1.JobStatus.StatusEnum.Failed);
90
+ itwinui_react_1.toaster.negative("You are not authorized to create carbon calculation jobs. Please contact project administrator.");
91
+ /* eslint-disable no-console */
92
+ console.error(e);
88
93
  }
89
94
  }
90
95
  else {
91
- throw new Error("No reportId or accessToken");
96
+ setJobStatus(insights_client_1.JobStatus.StatusEnum.Failed);
97
+ itwinui_react_1.toaster.negative("Failed to get retrieve reportId or token. 😔");
92
98
  }
93
99
  }, [props, pinStatus, oneClickLCAClientApi]);
94
100
  const signin = react_1.useCallback(async (e) => {
95
101
  e.preventDefault();
96
102
  startSigningIn(true);
97
- const result = await oneClickLCAClientApi.getOneclicklcaAccessToken(email, password);
98
- if (result && result.access_token && result.expires_in) {
99
- cacheToken({
100
- token: result.access_token,
101
- exp: Date.now() + result.expires_in * MILI_SECONDS,
102
- });
103
- resetSignin();
104
- setIsSignedIn(true);
103
+ try {
104
+ const result = await oneClickLCAClientApi.getOneclicklcaAccessToken(email, password);
105
+ if (result && result.access_token && result.expires_in) {
106
+ cacheToken({
107
+ token: result.access_token,
108
+ exp: Date.now() + result.expires_in * MILI_SECONDS,
109
+ });
110
+ resetSignin();
111
+ setIsSignedIn(true);
112
+ }
113
+ else {
114
+ showSigninError(true);
115
+ }
105
116
  }
106
- else {
107
- showSigninError(true);
117
+ catch (err) {
118
+ itwinui_react_1.toaster.negative("Failed to sign in One Click LCA.");
119
+ /* eslint-disable no-console */
120
+ console.error(err);
108
121
  }
109
122
  startSigningIn(false);
110
123
  }, [
@@ -135,13 +148,16 @@ const ExportModal = (props) => {
135
148
  case insights_client_1.JobStatus.StatusEnum.Failed:
136
149
  return (jsx_runtime_1.jsxs("div", Object.assign({ className: "oclca-progress-radial-container" }, { children: [jsx_runtime_1.jsx(itwinui_react_1.ProgressRadial, { status: "negative", size: "small", value: 100 }, void 0), jsx_runtime_1.jsx(itwinui_react_1.Text, Object.assign({ variant: "leading", className: "oclca-status-text" }, { children: "Export failed" }), void 0)] }), void 0));
137
150
  default:
138
- throw new Error(`Job status is invalid ${status}`);
151
+ return (jsx_runtime_1.jsx("div", Object.assign({ className: "oclca-progress-radial-container" }, { children: jsx_runtime_1.jsxs(itwinui_react_1.Text, { children: ["Invalid Job Status ", jsx_runtime_1.jsx("span", Object.assign({ role: "img", "aria-label": "sad" }, { children: "\uD83D\uDE14" }), void 0)] }, void 0) }), void 0));
139
152
  }
140
153
  }, []);
141
154
  react_1.useEffect(() => {
142
155
  if (props.isOpen && isSignedIn && (cache === null || cache === void 0 ? void 0 : cache.token)) {
143
156
  runJob(cache.token).catch((err) => {
144
- throw new Error(err);
157
+ setJobStatus(insights_client_1.JobStatus.StatusEnum.Failed);
158
+ itwinui_react_1.toaster.negative("Error occurs while running the job. 😔");
159
+ /* eslint-disable no-console */
160
+ console.error(err);
145
161
  });
146
162
  }
147
163
  }, [props.isOpen, isSignedIn, cache, runJob]);
@@ -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} from \"@itwin/itwinui-react\";\nimport {\n SvgVisibilityHide,\n SvgVisibilityShow,\n} from \"@itwin/itwinui-icons-react\";\nimport type { JobCreation, Link } from \"@itwin/insights-client\";\nimport { JobStatus, OneClickLCAClient } 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 OneClickLCAClient(), []);\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<JobStatus.StatusEnum>();\n const [jobLink, setJobLink] = useState<Link>();\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: JobCreation) => {\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.getOneclicklcaJobStatus(token, job?.id);\n if (currentJobStatus.job?.status) {\n if (\n currentJobStatus.job?.status === JobStatus.StatusEnum.Succeeded\n ) {\n setJobLink(currentJobStatus?.job._links?.oneclicklca);\n }\n setJobStatus(currentJobStatus.job?.status);\n } else {\n throw new Error(\"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.createOneclicklcaJob(\n accessToken,\n {\n reportId: props.reportId,\n token,\n }\n );\n if (jobCreated?.job?.id) {\n pinStatus(jobCreated?.job);\n } else {\n throw new Error(\"Failed to create job\");\n }\n } catch (e) {\n throw new Error(`Failed to create one click lca job.${e}`);\n }\n } else {\n throw new Error(\"No reportId or accessToken\");\n }\n },\n [props, pinStatus, oneClickLCAClientApi]\n );\n\n const signin = useCallback(\n async (e) => {\n e.preventDefault();\n startSigningIn(true);\n const result = await oneClickLCAClientApi.getOneclicklcaAccessToken(\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 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: JobStatus.StatusEnum, link: string | undefined) => {\n switch (status) {\n case JobStatus.StatusEnum.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 JobStatus.StatusEnum.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 JobStatus.StatusEnum.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 JobStatus.StatusEnum.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 throw new Error(`Job status is invalid ${status}`);\n }\n },\n []\n );\n\n useEffect(() => {\n if (props.isOpen && isSignedIn && cache?.token) {\n runJob(cache.token).catch((err) => {\n throw new Error(err);\n });\n }\n }, [props.isOpen, isSignedIn, cache, runJob]);\n\n useEffect(() => {\n if (\n jobStatus === JobStatus.StatusEnum.Succeeded ||\n jobStatus === JobStatus.StatusEnum.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 { JobCreation, Link } from \"@itwin/insights-client\";\nimport { JobStatus, OneClickLCAClient } 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 OneClickLCAClient(), []);\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<JobStatus.StatusEnum>();\n const [jobLink, setJobLink] = useState<Link>();\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: JobCreation) => {\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.getOneclicklcaJobStatus(token, job?.id);\n if (currentJobStatus.job?.status) {\n if (\n currentJobStatus.job?.status === JobStatus.StatusEnum.Succeeded\n ) {\n setJobLink(currentJobStatus?.job._links?.oneclicklca);\n }\n setJobStatus(currentJobStatus.job?.status);\n } else {\n setJobStatus(JobStatus.StatusEnum.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.createOneclicklcaJob(\n accessToken,\n {\n reportId: props.reportId,\n token,\n }\n );\n if (jobCreated?.job?.id) {\n pinStatus(jobCreated?.job);\n } else {\n setJobStatus(JobStatus.StatusEnum.Failed);\n toaster.negative(\"Failed to create one click lca job. 😔\");\n }\n } catch (e) {\n setJobStatus(JobStatus.StatusEnum.Failed);\n toaster.negative(\"You are not authorized to create carbon calculation jobs. Please contact project administrator.\");\n /* eslint-disable no-console */\n console.error(e);\n }\n } else {\n setJobStatus(JobStatus.StatusEnum.Failed);\n toaster.negative(\"Failed to get retrieve reportId or token. 😔\");\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.getOneclicklcaAccessToken(\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: JobStatus.StatusEnum, link: string | undefined) => {\n switch (status) {\n case JobStatus.StatusEnum.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 JobStatus.StatusEnum.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 JobStatus.StatusEnum.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 JobStatus.StatusEnum.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(JobStatus.StatusEnum.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 === JobStatus.StatusEnum.Succeeded ||\n jobStatus === JobStatus.StatusEnum.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"]}
@@ -92,11 +92,16 @@ const Reports = () => {
92
92
  }
93
93
  })
94
94
  .catch((err) => {
95
- throw new Error(err);
95
+ setIsLoading(false);
96
+ itwinui_react_1.toaster.negative("You are not authorized to get reports for this projects. Please contact project administrator.");
97
+ /* eslint-disable no-console */
98
+ console.error(err);
96
99
  });
97
100
  })
98
101
  .catch((err) => {
99
- throw new Error(err);
102
+ itwinui_react_1.toaster.negative("You are not authorized to use this system.");
103
+ /* eslint-disable no-console */
104
+ console.error(err);
100
105
  });
101
106
  }, [projectId, reportingClientApi]);
102
107
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [jsx_runtime_1.jsx(utils_1.WidgetHeader, { title: "Reports" }, void 0), jsx_runtime_1.jsxs("div", Object.assign({ className: "oclca-reports-container" }, { children: [jsx_runtime_1.jsx("div", Object.assign({ className: "oclca-searchbox-container" }, { children: jsx_runtime_1.jsx(core_react_1.SearchBox, { onValueChanged: onSearchBoxValueChanged, placeholder: "Search reports" }, void 0) }), void 0), jsx_runtime_1.jsx("div", Object.assign({ className: "oclca-scrollable-table" }, { children: jsx_runtime_1.jsx(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 }, void 0) }), void 0)] }), void 0), jsx_runtime_1.jsx(itwinui_react_1.Button, Object.assign({ onClick: () => openModal(true), styleType: "cta", disabled: buttonIsDisabled, className: "oclca-button-center" }, { children: "One Click LCA Export" }), void 0), jsx_runtime_1.jsx(ExportModal_1.default, { isOpen: modalIsOpen, close: () => openModal(false), reportId: selectedReport === null || selectedReport === void 0 ? void 0 : selectedReport.id }, void 0)] }, void 0));
@@ -1 +1 @@
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 } from \"@itwin/itwinui-react\";\nimport type { Report} from \"@itwin/insights-client\";\nimport { ReportingClient } 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 reportingClientApi = useMemo(() => new ReportingClient(), []);\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 reportingClientApi\n .getReports(token, projectId)\n .then((data) => {\n if (data) {\n const fetchedReports = data.reports ?? [];\n setReports(fetchedReports);\n setFilteredReports(fetchedReports);\n setIsLoading(false);\n }\n })\n .catch((err) => {\n throw new Error(err);\n });\n })\n .catch((err) => {\n throw new Error(err);\n });\n }, [projectId, reportingClientApi]);\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"]}
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 { ReportingClient } 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 reportingClientApi = useMemo(() => new ReportingClient(), []);\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 reportingClientApi\n .getReports(token, projectId)\n .then((data) => {\n if (data) {\n const fetchedReports = data.reports ?? [];\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, reportingClientApi]);\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"]}
@@ -6,7 +6,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
6
6
  import "./ExportModal.scss";
7
7
  import { useCallback, useEffect, useMemo, useRef, useState, } from "react";
8
8
  import { IModelApp } from "@itwin/core-frontend";
9
- import { Alert, Button, LabeledInput, Modal, ProgressLinear, ProgressRadial, Text, } from "@itwin/itwinui-react";
9
+ import { Alert, Button, LabeledInput, Modal, ProgressLinear, ProgressRadial, Text, toaster, } from "@itwin/itwinui-react";
10
10
  import { SvgVisibilityHide, SvgVisibilityShow, } from "@itwin/itwinui-icons-react";
11
11
  import { JobStatus, OneClickLCAClient } from "@itwin/insights-client";
12
12
  import logo from "../../public/logo/oneClickLCALogo.png";
@@ -56,7 +56,8 @@ const ExportModal = (props) => {
56
56
  setJobStatus((_f = currentJobStatus.job) === null || _f === void 0 ? void 0 : _f.status);
57
57
  }
58
58
  else {
59
- throw new Error("failed to get job status");
59
+ setJobStatus(JobStatus.StatusEnum.Failed);
60
+ toaster.negative("Failed to get job status. 😔");
60
61
  }
61
62
  }
62
63
  }, PIN_INTERVAL);
@@ -75,31 +76,43 @@ const ExportModal = (props) => {
75
76
  pinStatus(jobCreated === null || jobCreated === void 0 ? void 0 : jobCreated.job);
76
77
  }
77
78
  else {
78
- throw new Error("Failed to create job");
79
+ setJobStatus(JobStatus.StatusEnum.Failed);
80
+ toaster.negative("Failed to create one click lca job. 😔");
79
81
  }
80
82
  }
81
83
  catch (e) {
82
- throw new Error(`Failed to create one click lca job.${e}`);
84
+ setJobStatus(JobStatus.StatusEnum.Failed);
85
+ toaster.negative("You are not authorized to create carbon calculation jobs. Please contact project administrator.");
86
+ /* eslint-disable no-console */
87
+ console.error(e);
83
88
  }
84
89
  }
85
90
  else {
86
- throw new Error("No reportId or accessToken");
91
+ setJobStatus(JobStatus.StatusEnum.Failed);
92
+ toaster.negative("Failed to get retrieve reportId or token. 😔");
87
93
  }
88
94
  }, [props, pinStatus, oneClickLCAClientApi]);
89
95
  const signin = useCallback(async (e) => {
90
96
  e.preventDefault();
91
97
  startSigningIn(true);
92
- const result = await oneClickLCAClientApi.getOneclicklcaAccessToken(email, password);
93
- if (result && result.access_token && result.expires_in) {
94
- cacheToken({
95
- token: result.access_token,
96
- exp: Date.now() + result.expires_in * MILI_SECONDS,
97
- });
98
- resetSignin();
99
- setIsSignedIn(true);
98
+ try {
99
+ const result = await oneClickLCAClientApi.getOneclicklcaAccessToken(email, password);
100
+ if (result && result.access_token && result.expires_in) {
101
+ cacheToken({
102
+ token: result.access_token,
103
+ exp: Date.now() + result.expires_in * MILI_SECONDS,
104
+ });
105
+ resetSignin();
106
+ setIsSignedIn(true);
107
+ }
108
+ else {
109
+ showSigninError(true);
110
+ }
100
111
  }
101
- else {
102
- showSigninError(true);
112
+ catch (err) {
113
+ toaster.negative("Failed to sign in One Click LCA.");
114
+ /* eslint-disable no-console */
115
+ console.error(err);
103
116
  }
104
117
  startSigningIn(false);
105
118
  }, [
@@ -130,13 +143,16 @@ const ExportModal = (props) => {
130
143
  case JobStatus.StatusEnum.Failed:
131
144
  return (_jsxs("div", Object.assign({ className: "oclca-progress-radial-container" }, { children: [_jsx(ProgressRadial, { status: "negative", size: "small", value: 100 }, void 0), _jsx(Text, Object.assign({ variant: "leading", className: "oclca-status-text" }, { children: "Export failed" }), void 0)] }), void 0));
132
145
  default:
133
- throw new Error(`Job status is invalid ${status}`);
146
+ return (_jsx("div", Object.assign({ className: "oclca-progress-radial-container" }, { children: _jsxs(Text, { children: ["Invalid Job Status ", _jsx("span", Object.assign({ role: "img", "aria-label": "sad" }, { children: "\uD83D\uDE14" }), void 0)] }, void 0) }), void 0));
134
147
  }
135
148
  }, []);
136
149
  useEffect(() => {
137
150
  if (props.isOpen && isSignedIn && (cache === null || cache === void 0 ? void 0 : cache.token)) {
138
151
  runJob(cache.token).catch((err) => {
139
- throw new Error(err);
152
+ setJobStatus(JobStatus.StatusEnum.Failed);
153
+ toaster.negative("Error occurs while running the job. 😔");
154
+ /* eslint-disable no-console */
155
+ console.error(err);
140
156
  });
141
157
  }
142
158
  }, [props.isOpen, isSignedIn, cache, runJob]);
@@ -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} from \"@itwin/itwinui-react\";\nimport {\n SvgVisibilityHide,\n SvgVisibilityShow,\n} from \"@itwin/itwinui-icons-react\";\nimport type { JobCreation, Link } from \"@itwin/insights-client\";\nimport { JobStatus, OneClickLCAClient } 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 OneClickLCAClient(), []);\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<JobStatus.StatusEnum>();\n const [jobLink, setJobLink] = useState<Link>();\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: JobCreation) => {\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.getOneclicklcaJobStatus(token, job?.id);\n if (currentJobStatus.job?.status) {\n if (\n currentJobStatus.job?.status === JobStatus.StatusEnum.Succeeded\n ) {\n setJobLink(currentJobStatus?.job._links?.oneclicklca);\n }\n setJobStatus(currentJobStatus.job?.status);\n } else {\n throw new Error(\"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.createOneclicklcaJob(\n accessToken,\n {\n reportId: props.reportId,\n token,\n }\n );\n if (jobCreated?.job?.id) {\n pinStatus(jobCreated?.job);\n } else {\n throw new Error(\"Failed to create job\");\n }\n } catch (e) {\n throw new Error(`Failed to create one click lca job.${e}`);\n }\n } else {\n throw new Error(\"No reportId or accessToken\");\n }\n },\n [props, pinStatus, oneClickLCAClientApi]\n );\n\n const signin = useCallback(\n async (e) => {\n e.preventDefault();\n startSigningIn(true);\n const result = await oneClickLCAClientApi.getOneclicklcaAccessToken(\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 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: JobStatus.StatusEnum, link: string | undefined) => {\n switch (status) {\n case JobStatus.StatusEnum.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 JobStatus.StatusEnum.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 JobStatus.StatusEnum.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 JobStatus.StatusEnum.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 throw new Error(`Job status is invalid ${status}`);\n }\n },\n []\n );\n\n useEffect(() => {\n if (props.isOpen && isSignedIn && cache?.token) {\n runJob(cache.token).catch((err) => {\n throw new Error(err);\n });\n }\n }, [props.isOpen, isSignedIn, cache, runJob]);\n\n useEffect(() => {\n if (\n jobStatus === JobStatus.StatusEnum.Succeeded ||\n jobStatus === JobStatus.StatusEnum.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 { JobCreation, Link } from \"@itwin/insights-client\";\nimport { JobStatus, OneClickLCAClient } 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 OneClickLCAClient(), []);\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<JobStatus.StatusEnum>();\n const [jobLink, setJobLink] = useState<Link>();\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: JobCreation) => {\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.getOneclicklcaJobStatus(token, job?.id);\n if (currentJobStatus.job?.status) {\n if (\n currentJobStatus.job?.status === JobStatus.StatusEnum.Succeeded\n ) {\n setJobLink(currentJobStatus?.job._links?.oneclicklca);\n }\n setJobStatus(currentJobStatus.job?.status);\n } else {\n setJobStatus(JobStatus.StatusEnum.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.createOneclicklcaJob(\n accessToken,\n {\n reportId: props.reportId,\n token,\n }\n );\n if (jobCreated?.job?.id) {\n pinStatus(jobCreated?.job);\n } else {\n setJobStatus(JobStatus.StatusEnum.Failed);\n toaster.negative(\"Failed to create one click lca job. 😔\");\n }\n } catch (e) {\n setJobStatus(JobStatus.StatusEnum.Failed);\n toaster.negative(\"You are not authorized to create carbon calculation jobs. Please contact project administrator.\");\n /* eslint-disable no-console */\n console.error(e);\n }\n } else {\n setJobStatus(JobStatus.StatusEnum.Failed);\n toaster.negative(\"Failed to get retrieve reportId or token. 😔\");\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.getOneclicklcaAccessToken(\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: JobStatus.StatusEnum, link: string | undefined) => {\n switch (status) {\n case JobStatus.StatusEnum.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 JobStatus.StatusEnum.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 JobStatus.StatusEnum.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 JobStatus.StatusEnum.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(JobStatus.StatusEnum.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 === JobStatus.StatusEnum.Succeeded ||\n jobStatus === JobStatus.StatusEnum.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"]}
@@ -7,7 +7,7 @@ import { useEffect, useMemo, useState } from "react";
7
7
  import { SearchBox } from "@itwin/core-react";
8
8
  import { IModelApp } from "@itwin/core-frontend";
9
9
  import { useActiveIModelConnection } from "@itwin/appui-react";
10
- import { Button, Table } from "@itwin/itwinui-react";
10
+ import { Button, Table, toaster } from "@itwin/itwinui-react";
11
11
  import { ReportingClient } from "@itwin/insights-client";
12
12
  import { WidgetHeader } from "./utils";
13
13
  import ExportModal from "./ExportModal";
@@ -87,11 +87,16 @@ const Reports = () => {
87
87
  }
88
88
  })
89
89
  .catch((err) => {
90
- throw new Error(err);
90
+ setIsLoading(false);
91
+ toaster.negative("You are not authorized to get reports for this projects. Please contact project administrator.");
92
+ /* eslint-disable no-console */
93
+ console.error(err);
91
94
  });
92
95
  })
93
96
  .catch((err) => {
94
- throw new Error(err);
97
+ toaster.negative("You are not authorized to use this system.");
98
+ /* eslint-disable no-console */
99
+ console.error(err);
95
100
  });
96
101
  }, [projectId, reportingClientApi]);
97
102
  return (_jsxs(_Fragment, { children: [_jsx(WidgetHeader, { title: "Reports" }, void 0), _jsxs("div", Object.assign({ className: "oclca-reports-container" }, { children: [_jsx("div", Object.assign({ className: "oclca-searchbox-container" }, { children: _jsx(SearchBox, { onValueChanged: onSearchBoxValueChanged, placeholder: "Search reports" }, void 0) }), void 0), _jsx("div", Object.assign({ className: "oclca-scrollable-table" }, { children: _jsx(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 }, void 0) }), void 0)] }), void 0), _jsx(Button, Object.assign({ onClick: () => openModal(true), styleType: "cta", disabled: buttonIsDisabled, className: "oclca-button-center" }, { children: "One Click LCA Export" }), void 0), _jsx(ExportModal, { isOpen: modalIsOpen, close: () => openModal(false), reportId: selectedReport === null || selectedReport === void 0 ? void 0 : selectedReport.id }, void 0)] }, void 0));
@@ -1 +1 @@
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 } from \"@itwin/itwinui-react\";\nimport type { Report} from \"@itwin/insights-client\";\nimport { ReportingClient } 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 reportingClientApi = useMemo(() => new ReportingClient(), []);\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 reportingClientApi\n .getReports(token, projectId)\n .then((data) => {\n if (data) {\n const fetchedReports = data.reports ?? [];\n setReports(fetchedReports);\n setFilteredReports(fetchedReports);\n setIsLoading(false);\n }\n })\n .catch((err) => {\n throw new Error(err);\n });\n })\n .catch((err) => {\n throw new Error(err);\n });\n }, [projectId, reportingClientApi]);\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"]}
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 { ReportingClient } 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 reportingClientApi = useMemo(() => new ReportingClient(), []);\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 reportingClientApi\n .getReports(token, projectId)\n .then((data) => {\n if (data) {\n const fetchedReports = data.reports ?? [];\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, reportingClientApi]);\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/one-click-lca-react",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "An iTwin.js 3D Viewer Widget that interfaces with the iTwin Carbon Calculation.",
5
5
  "keywords": [
6
6
  "Bentley",
@@ -103,5 +103,5 @@
103
103
  "test": "jest",
104
104
  "cover": "nyc npm test"
105
105
  },
106
- "readme": "# @itwin/one-click-lca-react\n\nCopyright © Bentley Systems, Incorporated. All rights reserved.\n\nThe One Click CLA widget is a UI component for iTwin Viewer applications that simplifies how users (and developers) interface with the [Carbon Calculation One Click LCA APIs](https://developer.bentley.com/apis/carbon-calculation/overview/).\nThe one-click-lca-react package provides a UiProvider class, `OneClickLCAProvider`, which can be passed into the `uiProviders` prop of the iTwin Viewer's `<Viewer />` component.\n\n## Getting Started\n\nThis is not a standalone UI and requires a parent iTwin Viewer application to work as intended.\nA guide on how to create a basic iTwin Viewer application can be found [here](https://www.itwinjs.org/learning/tutorials/develop-web-viewer).\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).\n\n## Permissions and Scopes\n\nThe SPA client used by your iTwin viewer application must have allowed scopes `insights:read` and `insights:write`, found under the Reporting & Insights category.\nUsers must have the `imodels_read` and `insights_view` [permissions](https://developer.bentley.com/apis/carbon-calculation/operations/create-oneclicklca-job/#authorization) assigned at either the Project or iModel level. Additional 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/).\n\n## Sample usage\n\n```tsx\nimport { OneClickLCAProvider } from \"@itwin/one-click-lca-react\";\n\n<Viewer\n ...\n uiProviders={[new OneClickLCAProvider()]}\n/>\n```\n"
106
+ "readme": "# @itwin/one-click-lca-react\n\nCopyright © Bentley Systems, Incorporated. All rights reserved.\n\nThe One Click LCA widget is a UI component for iTwin Viewer applications that simplifies how users (and developers) interface with the [Carbon Calculation One Click LCA APIs](https://developer.bentley.com/apis/carbon-calculation/overview/).\nThe one-click-lca-react package provides a UiProvider class, `OneClickLCAProvider`, which can be passed into the `uiProviders` prop of the iTwin Viewer's `<Viewer />` component.\n\n## Getting Started\n\nThis is not a standalone UI and requires a parent iTwin Viewer application to work as intended.\nA guide on how to create a basic iTwin Viewer application can be found [here](https://www.itwinjs.org/learning/tutorials/develop-web-viewer).\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).\n\n## Permissions and Scopes\n\nThe SPA client used by your iTwin viewer application must have allowed scopes `insights:read` and `insights:write`, found under the Reporting & Insights category.\nUsers must have the `imodels_read` and `insights_view` [permissions](https://developer.bentley.com/apis/carbon-calculation/operations/create-oneclicklca-job/#authorization) assigned at either the Project or iModel level. Additional 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/).\n\n## Sample usage\n\n```tsx\nimport { OneClickLCAProvider } from \"@itwin/one-click-lca-react\";\n\n<Viewer\n ...\n uiProviders={[new OneClickLCAProvider()]}\n/>\n```\n"
107
107
  }