@itwin/one-click-lca-react 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/LICENSE.md +9 -0
  2. package/README.md +28 -0
  3. package/lib/cjs/components/ExportModal.d.ts +10 -0
  4. package/lib/cjs/components/ExportModal.js +169 -0
  5. package/lib/cjs/components/ExportModal.js.map +1 -0
  6. package/lib/cjs/components/ExportModal.scss +85 -0
  7. package/lib/cjs/components/OneClickLCA.d.ts +5 -0
  8. package/lib/cjs/components/OneClickLCA.js +13 -0
  9. package/lib/cjs/components/OneClickLCA.js.map +1 -0
  10. package/lib/cjs/components/Reports.d.ts +5 -0
  11. package/lib/cjs/components/Reports.js +105 -0
  12. package/lib/cjs/components/Reports.js.map +1 -0
  13. package/lib/cjs/components/Reports.scss +44 -0
  14. package/lib/cjs/components/utils.d.ts +9 -0
  15. package/lib/cjs/components/utils.js +16 -0
  16. package/lib/cjs/components/utils.js.map +1 -0
  17. package/lib/cjs/components/utils.scss +35 -0
  18. package/lib/cjs/one-click-lca-widget.d.ts +3 -0
  19. package/lib/cjs/one-click-lca-widget.js +19 -0
  20. package/lib/cjs/one-click-lca-widget.js.map +1 -0
  21. package/lib/cjs/test/ExportModal.test.d.ts +2 -0
  22. package/lib/cjs/test/ExportModal.test.js +17 -0
  23. package/lib/cjs/test/ExportModal.test.js.map +1 -0
  24. package/lib/cjs/test/WidgetHeader.test.d.ts +2 -0
  25. package/lib/cjs/test/WidgetHeader.test.js +37 -0
  26. package/lib/cjs/test/WidgetHeader.test.js.map +1 -0
  27. package/lib/cjs/widgets/OneClickLCAWidget.d.ts +7 -0
  28. package/lib/cjs/widgets/OneClickLCAWidget.js +32 -0
  29. package/lib/cjs/widgets/OneClickLCAWidget.js.map +1 -0
  30. package/lib/esm/components/ExportModal.d.ts +10 -0
  31. package/lib/esm/components/ExportModal.js +164 -0
  32. package/lib/esm/components/ExportModal.js.map +1 -0
  33. package/lib/esm/components/ExportModal.scss +85 -0
  34. package/lib/esm/components/OneClickLCA.d.ts +5 -0
  35. package/lib/esm/components/OneClickLCA.js +8 -0
  36. package/lib/esm/components/OneClickLCA.js.map +1 -0
  37. package/lib/esm/components/Reports.d.ts +5 -0
  38. package/lib/esm/components/Reports.js +100 -0
  39. package/lib/esm/components/Reports.js.map +1 -0
  40. package/lib/esm/components/Reports.scss +44 -0
  41. package/lib/esm/components/utils.d.ts +9 -0
  42. package/lib/esm/components/utils.js +12 -0
  43. package/lib/esm/components/utils.js.map +1 -0
  44. package/lib/esm/components/utils.scss +35 -0
  45. package/lib/esm/one-click-lca-widget.d.ts +3 -0
  46. package/lib/esm/one-click-lca-widget.js +7 -0
  47. package/lib/esm/one-click-lca-widget.js.map +1 -0
  48. package/lib/esm/test/ExportModal.test.d.ts +2 -0
  49. package/lib/esm/test/ExportModal.test.js +12 -0
  50. package/lib/esm/test/ExportModal.test.js.map +1 -0
  51. package/lib/esm/test/WidgetHeader.test.d.ts +2 -0
  52. package/lib/esm/test/WidgetHeader.test.js +35 -0
  53. package/lib/esm/test/WidgetHeader.test.js.map +1 -0
  54. package/lib/esm/widgets/OneClickLCAWidget.d.ts +7 -0
  55. package/lib/esm/widgets/OneClickLCAWidget.js +25 -0
  56. package/lib/esm/widgets/OneClickLCAWidget.js.map +1 -0
  57. package/lib/public/logo/oneClickLCALogo.png +0 -0
  58. package/package.json +107 -0
@@ -0,0 +1,19 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ /*---------------------------------------------------------------------------------------------
14
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
15
+ * See LICENSE.md in the project root for license terms and full copyright notice.
16
+ *--------------------------------------------------------------------------------------------*/
17
+ /** UI Provider for iTwin Viewer Applications */
18
+ __exportStar(require("./widgets/OneClickLCAWidget"), exports);
19
+ //# sourceMappingURL=one-click-lca-widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"one-click-lca-widget.js","sourceRoot":"","sources":["../../src/one-click-lca-widget.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA;;;gGAGgG;AAChG,gDAAgD;AAChD,8DAA4C","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 *--------------------------------------------------------------------------------------------*/\n/** UI Provider for iTwin Viewer Applications */\nexport * from \"./widgets/OneClickLCAWidget\";\n"]}
@@ -0,0 +1,2 @@
1
+ import "@testing-library/jest-dom";
2
+ //# sourceMappingURL=ExportModal.test.d.ts.map
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const jsx_runtime_1 = require("react/jsx-runtime");
7
+ require("@testing-library/jest-dom");
8
+ const react_1 = require("@testing-library/react");
9
+ const ExportModal_1 = __importDefault(require("../components/ExportModal"));
10
+ describe("Testing Export Modal", function () {
11
+ it("signin", function () {
12
+ react_1.render(jsx_runtime_1.jsx(ExportModal_1.default, { isOpen: true, close: () => { }, reportId: undefined }, void 0));
13
+ expect(react_1.screen.getByLabelText("Email")).toBeDefined();
14
+ expect(react_1.screen.getByLabelText("Password")).toBeDefined();
15
+ });
16
+ });
17
+ //# sourceMappingURL=ExportModal.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExportModal.test.js","sourceRoot":"","sources":["../../../src/test/ExportModal.test.tsx"],"names":[],"mappings":";;;;;;AAKA,qCAAmC;AACnC,kDAAwD;AACxD,4EAAoD;AAEpD,QAAQ,CAAC,sBAAsB,EAAE;IAC/B,EAAE,CAAC,QAAQ,EAAE;QACX,cAAM,CAAC,kBAAC,qBAAW,IAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,QAAQ,EAAE,SAAS,WAAI,CAAC,CAAC;QAC5E,MAAM,CAAC,cAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACrD,MAAM,CAAC,cAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport React from \"react\";\nimport \"@testing-library/jest-dom\";\nimport { render, screen } from \"@testing-library/react\";\nimport ExportModal from \"../components/ExportModal\";\n\ndescribe(\"Testing Export Modal\", function () {\n it(\"signin\", function () {\n render(<ExportModal isOpen={true} close={() => {}} reportId={undefined} />);\n expect(screen.getByLabelText(\"Email\")).toBeDefined();\n expect(screen.getByLabelText(\"Password\")).toBeDefined();\n });\n});\n"]}
@@ -0,0 +1,2 @@
1
+ import "@testing-library/jest-dom";
2
+ //# sourceMappingURL=WidgetHeader.test.d.ts.map
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const jsx_runtime_1 = require("react/jsx-runtime");
4
+ require("@testing-library/jest-dom");
5
+ const react_1 = require("@testing-library/react");
6
+ const utils_1 = require("../components/utils");
7
+ describe("Widget Header Component", function () {
8
+ it("should have hello as title", function () {
9
+ var _a;
10
+ const { container } = react_1.render(jsx_runtime_1.jsx(utils_1.WidgetHeader, { title: "hello" }, void 0));
11
+ expect(react_1.screen.getByText("hello")).toBeDefined();
12
+ expect(container.firstChild).toHaveClass("oclca-widget-header-container");
13
+ expect((_a = container.firstChild) === null || _a === void 0 ? void 0 : _a.firstChild).toHaveClass("oclca-title");
14
+ });
15
+ it("with return function", function () {
16
+ var _a, _b;
17
+ const { container } = react_1.render(jsx_runtime_1.jsx(utils_1.WidgetHeader, { title: "hello", returnFn: async () => { } }, void 0));
18
+ expect((_a = container.firstChild) === null || _a === void 0 ? void 0 : _a.firstChild).toHaveClass("oclca-chevron");
19
+ expect((_b = container.firstChild) === null || _b === void 0 ? void 0 : _b.firstChild).not.toHaveClass("oclca-chevron-disabled");
20
+ });
21
+ it("with disabled", function () {
22
+ var _a, _b;
23
+ const { container } = react_1.render(jsx_runtime_1.jsx(utils_1.WidgetHeader, { title: "hello", disabled: true, returnFn: async () => { } }, void 0));
24
+ expect((_a = container.firstChild) === null || _a === void 0 ? void 0 : _a.firstChild).not.toHaveClass("oclca-chevron");
25
+ expect((_b = container.firstChild) === null || _b === void 0 ? void 0 : _b.firstChild).toHaveClass("oclca-chevron-disabled");
26
+ });
27
+ it("with mocked return function", function () {
28
+ const mockReturnFn = jest.fn();
29
+ const { container } = react_1.render(jsx_runtime_1.jsx(utils_1.WidgetHeader, { title: "hello", returnFn: mockReturnFn }, void 0));
30
+ const toTestElement = container.querySelector("SvgChevronLeft");
31
+ if (toTestElement !== null) {
32
+ react_1.fireEvent.click(toTestElement);
33
+ }
34
+ expect(mockReturnFn).toHaveBeenCalled;
35
+ });
36
+ });
37
+ //# sourceMappingURL=WidgetHeader.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WidgetHeader.test.js","sourceRoot":"","sources":["../../../src/test/WidgetHeader.test.tsx"],"names":[],"mappings":";;;AAKA,qCAAmC;AACnC,kDAAmE;AACnE,+CAAmD;AAEnD,QAAQ,CAAC,yBAAyB,EAAE;IAClC,EAAE,CAAC,4BAA4B,EAAE;;QAC/B,MAAM,EAAE,SAAS,EAAE,GAAG,cAAM,CAAC,kBAAC,oBAAY,IAAC,KAAK,EAAC,OAAO,WAAG,CAAC,CAAC;QAC7D,MAAM,CAAC,cAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAChD,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,+BAA+B,CAAC,CAAC;QAC1E,MAAM,CAAC,MAAA,SAAS,CAAC,UAAU,0CAAE,UAAU,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE;;QACzB,MAAM,EAAE,SAAS,EAAE,GAAG,cAAM,CAC1B,kBAAC,oBAAY,IAAC,KAAK,EAAC,OAAO,EAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,WAAI,CACzD,CAAC;QACF,MAAM,CAAC,MAAA,SAAS,CAAC,UAAU,0CAAE,UAAU,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;QACtE,MAAM,CAAC,MAAA,SAAS,CAAC,UAAU,0CAAE,UAAU,CAAC,CAAC,GAAG,CAAC,WAAW,CACtD,wBAAwB,CACzB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,eAAe,EAAE;;QAClB,MAAM,EAAE,SAAS,EAAE,GAAG,cAAM,CAC1B,kBAAC,oBAAY,IAAC,KAAK,EAAC,OAAO,EAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,WAAI,CACzE,CAAC;QACF,MAAM,CAAC,MAAA,SAAS,CAAC,UAAU,0CAAE,UAAU,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;QAC1E,MAAM,CAAC,MAAA,SAAS,CAAC,UAAU,0CAAE,UAAU,CAAC,CAAC,WAAW,CAClD,wBAAwB,CACzB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE;QAChC,MAAM,YAAY,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,EAAE,SAAS,EAAE,GAAG,cAAM,CAC1B,kBAAC,oBAAY,IAAC,KAAK,EAAC,OAAO,EAAC,QAAQ,EAAE,YAAY,WAAI,CACvD,CAAC;QAEF,MAAM,aAAa,GAAG,SAAS,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;QAChE,IAAI,aAAa,KAAK,IAAI,EAAE;YAC1B,iBAAS,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;SAChC;QACD,MAAM,CAAC,YAAY,CAAC,CAAC,gBAAgB,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport React from \"react\";\nimport \"@testing-library/jest-dom\";\nimport { fireEvent, render, screen } from \"@testing-library/react\";\nimport { WidgetHeader } from \"../components/utils\";\n\ndescribe(\"Widget Header Component\", function () {\n it(\"should have hello as title\", function () {\n const { container } = render(<WidgetHeader title=\"hello\" />);\n expect(screen.getByText(\"hello\")).toBeDefined();\n expect(container.firstChild).toHaveClass(\"oclca-widget-header-container\");\n expect(container.firstChild?.firstChild).toHaveClass(\"oclca-title\");\n });\n\n it(\"with return function\", function () {\n const { container } = render(\n <WidgetHeader title=\"hello\" returnFn={async () => {}} />\n );\n expect(container.firstChild?.firstChild).toHaveClass(\"oclca-chevron\");\n expect(container.firstChild?.firstChild).not.toHaveClass(\n \"oclca-chevron-disabled\"\n );\n });\n\n it(\"with disabled\", function () {\n const { container } = render(\n <WidgetHeader title=\"hello\" disabled={true} returnFn={async () => {}} />\n );\n expect(container.firstChild?.firstChild).not.toHaveClass(\"oclca-chevron\");\n expect(container.firstChild?.firstChild).toHaveClass(\n \"oclca-chevron-disabled\"\n );\n });\n\n it(\"with mocked return function\", function () {\n const mockReturnFn = jest.fn();\n const { container } = render(\n <WidgetHeader title=\"hello\" returnFn={mockReturnFn} />\n );\n\n const toTestElement = container.querySelector(\"SvgChevronLeft\");\n if (toTestElement !== null) {\n fireEvent.click(toTestElement);\n }\n expect(mockReturnFn).toHaveBeenCalled;\n });\n});\n"]}
@@ -0,0 +1,7 @@
1
+ import type { AbstractWidgetProps, UiItemsProvider } from "@itwin/appui-abstract";
2
+ import { StagePanelLocation, StagePanelSection } from "@itwin/appui-abstract";
3
+ export declare class OneClickLCAProvider implements UiItemsProvider {
4
+ readonly id = "OneClickLCAProvider";
5
+ provideWidgets(_stageId: string, stageUsage: string, location: StagePanelLocation, section?: StagePanelSection): ReadonlyArray<AbstractWidgetProps>;
6
+ }
7
+ //# sourceMappingURL=OneClickLCAWidget.d.ts.map
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OneClickLCAProvider = void 0;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const appui_abstract_1 = require("@itwin/appui-abstract");
9
+ const OneClickLCA_1 = __importDefault(require("../components/OneClickLCA"));
10
+ class OneClickLCAProvider {
11
+ constructor() {
12
+ this.id = "OneClickLCAProvider";
13
+ }
14
+ provideWidgets(_stageId, stageUsage, location, section) {
15
+ const widgets = [];
16
+ if (location === appui_abstract_1.StagePanelLocation.Left &&
17
+ section === appui_abstract_1.StagePanelSection.Start &&
18
+ stageUsage === appui_abstract_1.StageUsage.General) {
19
+ const OneClickLCAWidget = {
20
+ id: "OneClickLCAWidget",
21
+ label: "One Click LCA",
22
+ getWidgetContent() {
23
+ return jsx_runtime_1.jsx(OneClickLCA_1.default, {}, void 0);
24
+ },
25
+ };
26
+ widgets.push(OneClickLCAWidget);
27
+ }
28
+ return widgets;
29
+ }
30
+ }
31
+ exports.OneClickLCAProvider = OneClickLCAProvider;
32
+ //# sourceMappingURL=OneClickLCAWidget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OneClickLCAWidget.js","sourceRoot":"","sources":["../../../src/widgets/OneClickLCAWidget.tsx"],"names":[],"mappings":";;;;;;;AAQA,0DAI+B;AAC/B,4EAAoD;AAGpD,MAAa,mBAAmB;IAAhC;QACkB,OAAE,GAAG,qBAAqB,CAAC;IA2B7C,CAAC;IAzBQ,cAAc,CACnB,QAAgB,EAChB,UAAkB,EAClB,QAA4B,EAC5B,OAA2B;QAE3B,MAAM,OAAO,GAA0B,EAAE,CAAC;QAC1C,IACE,QAAQ,KAAK,mCAAkB,CAAC,IAAI;YACpC,OAAO,KAAK,kCAAiB,CAAC,KAAK;YACnC,UAAU,KAAK,2BAAU,CAAC,OAAO,EACjC;YACA,MAAM,iBAAiB,GAAwB;gBAC7C,EAAE,EAAE,mBAAmB;gBACvB,KAAK,EAAE,eAAe;gBACtB,gBAAgB;oBACd,OAAO,kBAAC,qBAAW,aAAG,CAAC;gBACzB,CAAC;aACF,CAAC;YAEF,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;SACjC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AA5BD,kDA4BC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport type {\n AbstractWidgetProps,\n UiItemsProvider,\n} from \"@itwin/appui-abstract\";\nimport {\n StagePanelLocation,\n StagePanelSection,\n StageUsage,\n} from \"@itwin/appui-abstract\";\nimport OneClickLCA from \"../components/OneClickLCA\";\nimport React from \"react\";\n\nexport class OneClickLCAProvider implements UiItemsProvider {\n public readonly id = \"OneClickLCAProvider\";\n\n public provideWidgets(\n _stageId: string,\n stageUsage: string,\n location: StagePanelLocation,\n section?: StagePanelSection\n ): ReadonlyArray<AbstractWidgetProps> {\n const widgets: AbstractWidgetProps[] = [];\n if (\n location === StagePanelLocation.Left &&\n section === StagePanelSection.Start &&\n stageUsage === StageUsage.General\n ) {\n const OneClickLCAWidget: AbstractWidgetProps = {\n id: \"OneClickLCAWidget\",\n label: \"One Click LCA\",\n getWidgetContent() {\n return <OneClickLCA />;\n },\n };\n\n widgets.push(OneClickLCAWidget);\n }\n\n return widgets;\n }\n}\n"]}
@@ -0,0 +1,10 @@
1
+ /// <reference types="react" />
2
+ import "./ExportModal.scss";
3
+ interface ExportProps {
4
+ isOpen: boolean;
5
+ close: () => void;
6
+ reportId: string | undefined;
7
+ }
8
+ declare const ExportModal: (props: ExportProps) => JSX.Element;
9
+ export default ExportModal;
10
+ //# sourceMappingURL=ExportModal.d.ts.map
@@ -0,0 +1,164 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ import "./ExportModal.scss";
7
+ import { useCallback, useEffect, useMemo, useRef, useState, } from "react";
8
+ import { IModelApp } from "@itwin/core-frontend";
9
+ import { Alert, Button, LabeledInput, Modal, ProgressLinear, ProgressRadial, Text, } from "@itwin/itwinui-react";
10
+ import { SvgVisibilityHide, SvgVisibilityShow, } from "@itwin/itwinui-icons-react";
11
+ import { JobStatus, OneClickLCAClient } from "@itwin/insights-client";
12
+ import logo from "../../public/logo/oneClickLCALogo.png";
13
+ const ExportModal = (props) => {
14
+ const MILI_SECONDS = 1000;
15
+ const PIN_INTERVAL = 1000;
16
+ const oneClickLCAClientApi = useMemo(() => new OneClickLCAClient(), []);
17
+ const [email, setEmail] = useState("");
18
+ const [password, setPassword] = useState("");
19
+ const [passwordIsVisible, showPassword] = useState(false);
20
+ const [signinError, showSigninError] = useState(false);
21
+ const [emailError, setEmailError] = useState(false);
22
+ const [cache, cacheToken] = useState();
23
+ const [jobStatus, setJobStatus] = useState();
24
+ const [jobLink, setJobLink] = useState();
25
+ const isValidEmail = useCallback(() => {
26
+ return /\S+@\S+\.\S+/.test(email);
27
+ }, [email]);
28
+ const isValidPassword = useCallback(() => {
29
+ return password !== "";
30
+ }, [password]);
31
+ const validateSignin = useCallback(() => {
32
+ return (cache === null || cache === void 0 ? void 0 : cache.token) && (cache === null || cache === void 0 ? void 0 : cache.exp) > Date.now();
33
+ }, [cache]);
34
+ const [isSignedIn, setIsSignedIn] = useState(validateSignin());
35
+ const [isSigningIn, startSigningIn] = useState(false);
36
+ const intervalRef = useRef();
37
+ const isValidSignin = useCallback(() => {
38
+ return isValidEmail() && isValidPassword();
39
+ }, [isValidEmail, isValidPassword]);
40
+ const resetSignin = useCallback(() => {
41
+ setEmail("");
42
+ setPassword("");
43
+ showPassword(false);
44
+ showSigninError(false);
45
+ }, [setEmail, setPassword, showPassword, showSigninError]);
46
+ const pinStatus = useCallback((job) => {
47
+ const intervalId = window.setInterval(async () => {
48
+ var _a, _b, _c, _d, _e, _f;
49
+ const token = (_b = (await ((_a = IModelApp.authorizationClient) === null || _a === void 0 ? void 0 : _a.getAccessToken()))) !== null && _b !== void 0 ? _b : "";
50
+ if (job.id && token) {
51
+ const currentJobStatus = await oneClickLCAClientApi.getOneclicklcaJobStatus(token, job === null || job === void 0 ? void 0 : job.id);
52
+ if ((_c = currentJobStatus.job) === null || _c === void 0 ? void 0 : _c.status) {
53
+ if (((_d = currentJobStatus.job) === null || _d === void 0 ? void 0 : _d.status) === JobStatus.StatusEnum.Succeeded) {
54
+ setJobLink((_e = currentJobStatus === null || currentJobStatus === void 0 ? void 0 : currentJobStatus.job._links) === null || _e === void 0 ? void 0 : _e.oneclicklca);
55
+ }
56
+ setJobStatus((_f = currentJobStatus.job) === null || _f === void 0 ? void 0 : _f.status);
57
+ }
58
+ else {
59
+ throw new Error("failed to get job status");
60
+ }
61
+ }
62
+ }, PIN_INTERVAL);
63
+ intervalRef.current = intervalId;
64
+ }, [setJobLink, setJobStatus, oneClickLCAClientApi]);
65
+ const runJob = useCallback(async (token) => {
66
+ var _a, _b, _c;
67
+ const accessToken = (_b = (await ((_a = IModelApp.authorizationClient) === null || _a === void 0 ? void 0 : _a.getAccessToken()))) !== null && _b !== void 0 ? _b : "";
68
+ if (props.reportId && token) {
69
+ try {
70
+ const jobCreated = await oneClickLCAClientApi.createOneclicklcaJob(accessToken, {
71
+ reportId: props.reportId,
72
+ token,
73
+ });
74
+ if ((_c = jobCreated === null || jobCreated === void 0 ? void 0 : jobCreated.job) === null || _c === void 0 ? void 0 : _c.id) {
75
+ pinStatus(jobCreated === null || jobCreated === void 0 ? void 0 : jobCreated.job);
76
+ }
77
+ else {
78
+ throw new Error("Failed to create job");
79
+ }
80
+ }
81
+ catch (e) {
82
+ throw new Error(`Failed to create one click lca job.${e}`);
83
+ }
84
+ }
85
+ else {
86
+ throw new Error("No reportId or accessToken");
87
+ }
88
+ }, [props, pinStatus, oneClickLCAClientApi]);
89
+ const signin = useCallback(async (e) => {
90
+ e.preventDefault();
91
+ 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);
100
+ }
101
+ else {
102
+ showSigninError(true);
103
+ }
104
+ startSigningIn(false);
105
+ }, [
106
+ email,
107
+ password,
108
+ resetSignin,
109
+ cacheToken,
110
+ showSigninError,
111
+ oneClickLCAClientApi,
112
+ ]);
113
+ const onClose = useCallback(() => {
114
+ resetSignin();
115
+ setJobStatus(undefined);
116
+ setJobLink(undefined);
117
+ if (intervalRef.current) {
118
+ window.clearInterval(intervalRef.current);
119
+ }
120
+ props.close();
121
+ }, [props, resetSignin]);
122
+ const getStatusComponent = useCallback((status, link) => {
123
+ switch (status) {
124
+ case JobStatus.StatusEnum.Queued:
125
+ return (_jsxs("div", Object.assign({ className: "oclca-progress-radial-container" }, { children: [_jsx(ProgressRadial, { indeterminate: true, size: "small", value: 50 }, void 0), _jsx(Text, Object.assign({ variant: "leading", className: "oclca-status-text" }, { children: "Export queued" }), void 0)] }), void 0));
126
+ case JobStatus.StatusEnum.Running:
127
+ return (_jsxs("div", Object.assign({ className: "oclca-progress-linear-container" }, { children: [_jsx(ProgressLinear, { indeterminate: true }, void 0), _jsx(Text, Object.assign({ variant: "leading", className: "oclca-status-text" }, { children: "Export running" }), void 0)] }), void 0));
128
+ case JobStatus.StatusEnum.Succeeded:
129
+ return (link && (_jsxs("div", Object.assign({ className: "oclca-progress-radial-container" }, { children: [_jsx(ProgressRadial, { status: "positive", size: "small", value: 50 }, void 0), _jsx("a", Object.assign({ className: "oclca-report-button", href: link, target: "_blank", rel: "noopener noreferrer" }, { children: _jsx(Button, Object.assign({ styleType: "cta" }, { children: "Open in One Click LCA" }), void 0) }), void 0)] }), void 0)));
130
+ case JobStatus.StatusEnum.Failed:
131
+ 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
+ default:
133
+ throw new Error(`Job status is invalid ${status}`);
134
+ }
135
+ }, []);
136
+ useEffect(() => {
137
+ if (props.isOpen && isSignedIn && (cache === null || cache === void 0 ? void 0 : cache.token)) {
138
+ runJob(cache.token).catch((err) => {
139
+ throw new Error(err);
140
+ });
141
+ }
142
+ }, [props.isOpen, isSignedIn, cache, runJob]);
143
+ useEffect(() => {
144
+ if (jobStatus === JobStatus.StatusEnum.Succeeded ||
145
+ jobStatus === JobStatus.StatusEnum.Failed) {
146
+ if (intervalRef.current) {
147
+ window.clearInterval(intervalRef.current);
148
+ }
149
+ }
150
+ }, [jobStatus]);
151
+ useEffect(() => {
152
+ if (email !== "") {
153
+ const timeoutId = setTimeout(() => setEmailError(!isValidEmail()), 1000);
154
+ return () => clearTimeout(timeoutId);
155
+ }
156
+ else {
157
+ setEmailError(false);
158
+ return;
159
+ }
160
+ }, [email, isValidEmail]);
161
+ return (_jsxs(Modal, Object.assign({ "data-testid": "export-modal", isOpen: props.isOpen, onClose: onClose, title: null, closeOnExternalClick: false }, { children: [!isSignedIn && (_jsxs("div", Object.assign({ className: "oclca-signin" }, { children: [_jsx("img", { className: "oclca-signin-icon", src: logo, alt: "One Click LCA\u00AE software", "data-height-percentage": "80", "data-actual-width": "1200", "data-actual-height": "600" }, void 0), _jsxs("form", Object.assign({ onSubmit: signin, className: "oclca-signin-form" }, { children: [_jsx("div", Object.assign({ className: "oclca-signin-prompt" }, { children: "Sign in to One Click LCA." }), void 0), signinError && (_jsx(Alert, Object.assign({ type: "negative", className: "oclca-signin-error" }, { children: "Incorrect email or password." }), void 0)), _jsx("div", Object.assign({ className: "oclca-signin-input" }, { children: _jsx(LabeledInput, { label: "Email", value: email, onChange: (v) => setEmail(v.target.value), type: "email", status: emailError ? "negative" : undefined, message: emailError ? "Invalid email address." : "", required: true }, void 0) }), void 0), _jsx("div", Object.assign({ className: "oclca-signin-input" }, { children: _jsx(LabeledInput, { label: "Password", value: password, onChange: (e) => setPassword(e.target.value), type: passwordIsVisible ? "text" : "password", svgIcon: passwordIsVisible ? (_jsx(SvgVisibilityHide, { onClick: () => showPassword(!passwordIsVisible) }, void 0)) : (_jsx(SvgVisibilityShow, {}, void 0)), iconDisplayStyle: "inline", required: true }, void 0) }), void 0), _jsx("div", Object.assign({ className: "oclca-signin-button-container" }, { children: _jsx(Button, Object.assign({ className: "oclca-signin-button", type: "submit", styleType: "cta", disabled: !isValidSignin() }, { children: isSigningIn ? (_jsx(ProgressRadial, { className: "oclca-signin-wait", indeterminate: true, size: "small", value: 50 }, void 0)) : ("Sign In") }), void 0) }), void 0)] }), void 0)] }), void 0)), isSignedIn && !jobStatus && (_jsx("div", Object.assign({ className: "oclca-progress-radial-container" }, { children: _jsx(ProgressRadial, { indeterminate: true, size: "large", value: 50 }, void 0) }), void 0)), isSignedIn && jobStatus && getStatusComponent(jobStatus, jobLink === null || jobLink === void 0 ? void 0 : jobLink.href)] }), void 0));
162
+ };
163
+ export default ExportModal;
164
+ //# sourceMappingURL=ExportModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExportModal.js","sourceRoot":"","sources":["../../../src/components/ExportModal.tsx"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F,OAAO,oBAAoB,CAAC;AAC5B,OAAc,EACZ,WAAW,EACX,SAAS,EACT,OAAO,EACP,MAAM,EACN,QAAQ,GACT,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EACL,KAAK,EACL,MAAM,EACN,YAAY,EACZ,KAAK,EACL,cAAc,EACd,cAAc,EACd,IAAI,GACL,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,IAAI,MAAM,uCAAuC,CAAC;AAazD,MAAM,WAAW,GAAG,CAAC,KAAkB,EAAE,EAAE;IACzC,MAAM,YAAY,GAAG,IAAI,CAAC;IAC1B,MAAM,YAAY,GAAG,IAAI,CAAC;IAC1B,MAAM,oBAAoB,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,iBAAiB,EAAE,EAAE,EAAE,CAAC,CAAC;IAExE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,CAAC,iBAAiB,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1D,MAAM,CAAC,WAAW,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACvD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAmB,CAAC;IAExD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,EAAwB,CAAC;IACnE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAQ,CAAC;IAE/C,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QACvC,OAAO,QAAQ,KAAK,EAAE,CAAC;IACzB,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,OAAO,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK,KAAI,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,GAAG,IAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACjD,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC;IAC/D,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,MAAM,EAAU,CAAC;IAErC,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;QACrC,OAAO,YAAY,EAAE,IAAI,eAAe,EAAE,CAAC;IAC7C,CAAC,EAAE,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC;IAEpC,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;QACnC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACb,WAAW,CAAC,EAAE,CAAC,CAAC;QAChB,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,eAAe,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC;IAE3D,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAC,GAAgB,EAAE,EAAE;QACnB,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;;YAC/C,MAAM,KAAK,GACT,MAAA,CAAC,MAAM,CAAA,MAAA,SAAS,CAAC,mBAAmB,0CAAE,cAAc,EAAE,CAAA,CAAC,mCAAI,EAAE,CAAC;YAChE,IAAI,GAAG,CAAC,EAAE,IAAI,KAAK,EAAE;gBACnB,MAAM,gBAAgB,GACpB,MAAM,oBAAoB,CAAC,uBAAuB,CAAC,KAAK,EAAE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,EAAE,CAAC,CAAC;gBACrE,IAAI,MAAA,gBAAgB,CAAC,GAAG,0CAAE,MAAM,EAAE;oBAChC,IACE,CAAA,MAAA,gBAAgB,CAAC,GAAG,0CAAE,MAAM,MAAK,SAAS,CAAC,UAAU,CAAC,SAAS,EAC/D;wBACA,UAAU,CAAC,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,GAAG,CAAC,MAAM,0CAAE,WAAW,CAAC,CAAC;qBACvD;oBACD,YAAY,CAAC,MAAA,gBAAgB,CAAC,GAAG,0CAAE,MAAM,CAAC,CAAC;iBAC5C;qBAAM;oBACL,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;iBAC7C;aACF;QACH,CAAC,EAAE,YAAY,CAAC,CAAC;QACjB,WAAW,CAAC,OAAO,GAAG,UAAU,CAAC;IACnC,CAAC,EACD,CAAC,UAAU,EAAE,YAAY,EAAE,oBAAoB,CAAC,CACjD,CAAC;IAEF,MAAM,MAAM,GAAG,WAAW,CACxB,KAAK,EAAE,KAAa,EAAE,EAAE;;QACtB,MAAM,WAAW,GACf,MAAA,CAAC,MAAM,CAAA,MAAA,SAAS,CAAC,mBAAmB,0CAAE,cAAc,EAAE,CAAA,CAAC,mCAAI,EAAE,CAAC;QAChE,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,EAAE;YAC3B,IAAI;gBACF,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,oBAAoB,CAChE,WAAW,EACX;oBACE,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,KAAK;iBACN,CACF,CAAC;gBACF,IAAI,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,GAAG,0CAAE,EAAE,EAAE;oBACvB,SAAS,CAAC,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,GAAG,CAAC,CAAC;iBAC5B;qBAAM;oBACL,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;iBACzC;aACF;YAAC,OAAO,CAAC,EAAE;gBACV,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,EAAE,CAAC,CAAC;aAC5D;SACF;aAAM;YACL,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;SAC/C;IACH,CAAC,EACD,CAAC,KAAK,EAAE,SAAS,EAAE,oBAAoB,CAAC,CACzC,CAAC;IAEF,MAAM,MAAM,GAAG,WAAW,CACxB,KAAK,EAAE,CAAC,EAAE,EAAE;QACV,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,cAAc,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,yBAAyB,CACjE,KAAK,EACL,QAAQ,CACT,CAAC;QACF,IAAI,MAAM,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,UAAU,EAAE;YACtD,UAAU,CAAC;gBACT,KAAK,EAAE,MAAM,CAAC,YAAY;gBAC1B,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,UAAU,GAAG,YAAY;aACnD,CAAC,CAAC;YACH,WAAW,EAAE,CAAC;YACd,aAAa,CAAC,IAAI,CAAC,CAAC;SACrB;aAAM;YACL,eAAe,CAAC,IAAI,CAAC,CAAC;SACvB;QACD,cAAc,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC,EACD;QACE,KAAK;QACL,QAAQ;QACR,WAAW;QACX,UAAU;QACV,eAAe;QACf,oBAAoB;KACrB,CACF,CAAC;IAEF,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/B,WAAW,EAAE,CAAC;QACd,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,UAAU,CAAC,SAAS,CAAC,CAAC;QACtB,IAAI,WAAW,CAAC,OAAO,EAAE;YACvB,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;SAC3C;QACD,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;IAEzB,MAAM,kBAAkB,GAAG,WAAW,CACpC,CAAC,MAA4B,EAAE,IAAwB,EAAE,EAAE;QACzD,QAAQ,MAAM,EAAE;YACd,KAAK,SAAS,CAAC,UAAU,CAAC,MAAM;gBAC9B,OAAO,CACL,6BAAK,SAAS,EAAC,iCAAiC,iBAC9C,KAAC,cAAc,IAAC,aAAa,QAAC,IAAI,EAAC,OAAO,EAAC,KAAK,EAAE,EAAE,WAAI,EACxD,KAAC,IAAI,kBAAC,OAAO,EAAC,SAAS,EAAC,SAAS,EAAC,mBAAmB,2CAE9C,aACH,CACP,CAAC;YACJ,KAAK,SAAS,CAAC,UAAU,CAAC,OAAO;gBAC/B,OAAO,CACL,6BAAK,SAAS,EAAC,iCAAiC,iBAC9C,KAAC,cAAc,IAAC,aAAa,iBAAG,EAChC,KAAC,IAAI,kBAAC,OAAO,EAAC,SAAS,EAAC,SAAS,EAAC,mBAAmB,4CAE9C,aACH,CACP,CAAC;YACJ,KAAK,SAAS,CAAC,UAAU,CAAC,SAAS;gBACjC,OAAO,CACL,IAAI,IAAI,CACN,6BAAK,SAAS,EAAC,iCAAiC,iBAC9C,KAAC,cAAc,IAAC,MAAM,EAAC,UAAU,EAAC,IAAI,EAAC,OAAO,EAAC,KAAK,EAAE,EAAE,WAAI,EAC5D,0BACE,SAAS,EAAC,qBAAqB,EAC/B,IAAI,EAAE,IAAI,EACV,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,gBAEzB,KAAC,MAAM,kBAAC,SAAS,EAAC,KAAK,mDAA+B,YACpD,aACA,CACP,CACF,CAAC;YACJ,KAAK,SAAS,CAAC,UAAU,CAAC,MAAM;gBAC9B,OAAO,CACL,6BAAK,SAAS,EAAC,iCAAiC,iBAC9C,KAAC,cAAc,IAAC,MAAM,EAAC,UAAU,EAAC,IAAI,EAAC,OAAO,EAAC,KAAK,EAAE,GAAG,WAAI,EAC7D,KAAC,IAAI,kBAAC,OAAO,EAAC,SAAS,EAAC,SAAS,EAAC,mBAAmB,2CAE9C,aACH,CACP,CAAC;YACJ;gBACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,EAAE,CAAC,CAAC;SACtD;IACH,CAAC,EACD,EAAE,CACH,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,CAAC,MAAM,IAAI,UAAU,KAAI,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK,CAAA,EAAE;YAC9C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBAChC,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;SACJ;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAE9C,SAAS,CAAC,GAAG,EAAE;QACb,IACE,SAAS,KAAK,SAAS,CAAC,UAAU,CAAC,SAAS;YAC5C,SAAS,KAAK,SAAS,CAAC,UAAU,CAAC,MAAM,EACzC;YACA,IAAI,WAAW,CAAC,OAAO,EAAE;gBACvB,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;aAC3C;SACF;IACH,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,KAAK,EAAE,EAAE;YAChB,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,YAAY,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YACzE,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;SACtC;aAAM;YACL,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,OAAO;SACR;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;IAE1B,OAAO,CACL,MAAC,KAAK,iCACQ,cAAc,EAC1B,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,IAAI,EACX,oBAAoB,EAAE,KAAK,iBAE1B,CAAC,UAAU,IAAI,CACd,6BAAK,SAAS,EAAC,cAAc,iBAC3B,cACE,SAAS,EAAC,mBAAmB,EAC7B,GAAG,EAAE,IAAI,EACT,GAAG,EAAC,8BAAyB,4BACN,IAAI,uBACT,MAAM,wBACL,KAAK,WACxB,EACF,8BAAM,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAC,mBAAmB,iBACnD,4BAAK,SAAS,EAAC,qBAAqB,uDAAgC,EACnE,WAAW,IAAI,CACd,KAAC,KAAK,kBAAC,IAAI,EAAC,UAAU,EAAC,SAAS,EAAC,oBAAoB,0DAE7C,CACT,EACD,4BAAK,SAAS,EAAC,oBAAoB,gBACjC,KAAC,YAAY,IACX,KAAK,EAAC,OAAO,EACb,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,IAAI,EAAC,OAAO,EACZ,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,EAC3C,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,EACnD,QAAQ,iBACR,YACE,EACN,4BAAK,SAAS,EAAC,oBAAoB,gBACjC,KAAC,YAAY,IACX,KAAK,EAAC,UAAU,EAChB,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC5C,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,EAC7C,OAAO,EACL,iBAAiB,CAAC,CAAC,CAAC,CAClB,KAAC,iBAAiB,IAChB,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,iBAAiB,CAAC,WAC/C,CACH,CAAC,CAAC,CAAC,CACF,KAAC,iBAAiB,aAAG,CACtB,EAEH,gBAAgB,EAAC,QAAQ,EACzB,QAAQ,iBACR,YACE,EAEN,4BAAK,SAAS,EAAC,+BAA+B,gBAC5C,KAAC,MAAM,kBACL,SAAS,EAAC,qBAAqB,EAC/B,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,KAAK,EACf,QAAQ,EAAE,CAAC,aAAa,EAAE,gBAEzB,WAAW,CAAC,CAAC,CAAC,CACb,KAAC,cAAc,IACb,SAAS,EAAC,mBAAmB,EAC7B,aAAa,QACb,IAAI,EAAC,OAAO,EACZ,KAAK,EAAE,EAAE,WACT,CACH,CAAC,CAAC,CAAC,CACF,SAAS,CACV,YACM,YACL,aACD,aACH,CACP,EACA,UAAU,IAAI,CAAC,SAAS,IAAI,CAC3B,4BAAK,SAAS,EAAC,iCAAiC,gBAC9C,KAAC,cAAc,IAAC,aAAa,QAAC,IAAI,EAAC,OAAO,EAAC,KAAK,EAAE,EAAE,WAAI,YACpD,CACP,EACA,UAAU,IAAI,SAAS,IAAI,kBAAkB,CAAC,SAAS,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,CAAC,aAClE,CACT,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,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 \"./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"]}
@@ -0,0 +1,85 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ @import "~@itwin/itwinui-css/scss/variables";
6
+
7
+ .oclca {
8
+ &-signin {
9
+ display: flex;
10
+ flex-direction: column;
11
+ align-items: center;
12
+ padding-bottom: 4 * $iui-baseline;
13
+ padding-top: 2 * $iui-baseline;
14
+
15
+ &-icon {
16
+ width: 2 * $iui-icons-3xl;
17
+ height: 1 * $iui-icons-3xl;
18
+ }
19
+
20
+ &-prompt {
21
+ margin: $iui-l 0;
22
+ font-size: medium;
23
+ display: flex;
24
+ flex-direction: column;
25
+ align-items: center;
26
+ }
27
+
28
+ &-form {
29
+ width: 70%;
30
+ }
31
+
32
+ &-input {
33
+ width: 100%;
34
+ margin: $iui-xs 0;
35
+ }
36
+
37
+ &-button-container {
38
+ margin: $iui-sm 0;
39
+ }
40
+
41
+ &-button {
42
+ width: 100%;
43
+ }
44
+
45
+ &-error {
46
+ height: $iui-xl;
47
+ font-size: small;
48
+ }
49
+
50
+ &-wait {
51
+ vertical-align: middle;
52
+ line-height: normal;
53
+ }
54
+ }
55
+
56
+ &-report-button {
57
+ margin: $iui-l;
58
+ text-decoration: none;
59
+ :hover {
60
+ cursor: pointer;
61
+ }
62
+ }
63
+
64
+ &-status-text {
65
+ margin: $iui-s;
66
+ }
67
+
68
+ &-progress-radial-container {
69
+ display: flex;
70
+ flex-direction: column;
71
+ align-items: center;
72
+ margin: $iui-l;
73
+ height: $iui-3xl;
74
+ place-content: space-evenly;
75
+ }
76
+
77
+ &-progress-linear-container {
78
+ display: flex;
79
+ flex-direction: column;
80
+ text-align: center;
81
+ margin: $iui-l;
82
+ height: $iui-3xl;
83
+ place-content: space-evenly;
84
+ }
85
+ }
@@ -0,0 +1,5 @@
1
+ /// <reference types="react" />
2
+ import "./Reports.scss";
3
+ declare const OneClickLCA: () => JSX.Element;
4
+ export default OneClickLCA;
5
+ //# sourceMappingURL=OneClickLCA.d.ts.map
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import Reports from "./Reports";
3
+ import "./Reports.scss";
4
+ const OneClickLCA = () => {
5
+ return (_jsx("div", Object.assign({ className: "oclca-container" }, { children: _jsx(Reports, {}, void 0) }), void 0));
6
+ };
7
+ export default OneClickLCA;
8
+ //# sourceMappingURL=OneClickLCA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OneClickLCA.js","sourceRoot":"","sources":["../../../src/components/OneClickLCA.tsx"],"names":[],"mappings":";AAKA,OAAO,OAAO,MAAM,WAAW,CAAC;AAChC,OAAO,gBAAgB,CAAC;AAExB,MAAM,WAAW,GAAG,GAAG,EAAE;IACvB,OAAO,CACL,4BAAK,SAAS,EAAC,iBAAiB,gBAC9B,KAAC,OAAO,aAAG,YACP,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,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"]}
@@ -0,0 +1,5 @@
1
+ /// <reference types="react" />
2
+ import "./Reports.scss";
3
+ declare const Reports: () => JSX.Element;
4
+ export default Reports;
5
+ //# sourceMappingURL=Reports.d.ts.map
@@ -0,0 +1,100 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ import { useEffect, useMemo, useState } from "react";
7
+ import { SearchBox } from "@itwin/core-react";
8
+ import { IModelApp } from "@itwin/core-frontend";
9
+ import { useActiveIModelConnection } from "@itwin/appui-react";
10
+ import { Button, Table } from "@itwin/itwinui-react";
11
+ import { ReportingClient } from "@itwin/insights-client";
12
+ import { WidgetHeader } from "./utils";
13
+ import ExportModal from "./ExportModal";
14
+ import "./Reports.scss";
15
+ const Reports = () => {
16
+ var _a;
17
+ const projectId = (_a = useActiveIModelConnection()) === null || _a === void 0 ? void 0 : _a.iTwinId;
18
+ const reportingClientApi = useMemo(() => new ReportingClient(), []);
19
+ const [isLoading, setIsLoading] = useState(true);
20
+ const [reports, setReports] = useState([]);
21
+ const [buttonIsDisabled, disableButton] = useState(true);
22
+ const [filteredReports, setFilteredReports] = useState(reports);
23
+ const [selectedReport, setSelectedReport] = useState();
24
+ const [modalIsOpen, openModal] = useState(false);
25
+ const reportsColumns = useMemo(() => [
26
+ {
27
+ Header: "Table",
28
+ columns: [
29
+ {
30
+ id: "displayName",
31
+ Header: "Name",
32
+ accessor: "displayName",
33
+ },
34
+ {
35
+ id: "description",
36
+ Header: "Description",
37
+ accessor: "description",
38
+ },
39
+ ],
40
+ },
41
+ ], []);
42
+ const onSearchBoxValueChanged = async (value) => {
43
+ disableButton(true);
44
+ const filterReports = reports.filter((x) => {
45
+ var _a;
46
+ return x.displayName &&
47
+ ((_a = x.displayName.toLowerCase()) === null || _a === void 0 ? void 0 : _a.indexOf(value.toLowerCase())) > -1;
48
+ });
49
+ setFilteredReports(filterReports);
50
+ };
51
+ const tableStateSingleSelectReducer = (newState, action) => {
52
+ switch (action.type) {
53
+ case "toggleRowSelected": {
54
+ return { ...newState, selectedRowIds: { [action.id]: action.value } };
55
+ }
56
+ default:
57
+ break;
58
+ }
59
+ return newState;
60
+ };
61
+ const onReportRowClick = useMemo(() => (_, row) => {
62
+ if (row.original === selectedReport) {
63
+ disableButton(!buttonIsDisabled);
64
+ row.toggleRowSelected();
65
+ }
66
+ else {
67
+ disableButton(false);
68
+ row.toggleRowSelected(true);
69
+ }
70
+ setSelectedReport(row.original);
71
+ }, [buttonIsDisabled, selectedReport]);
72
+ useEffect(() => {
73
+ if (!IModelApp.authorizationClient)
74
+ throw new Error("AuthorizationClient is not defined. Most likely IModelApp.startup was not called yet.");
75
+ IModelApp.authorizationClient
76
+ .getAccessToken()
77
+ .then((token) => {
78
+ reportingClientApi
79
+ .getReports(token, projectId)
80
+ .then((data) => {
81
+ var _a;
82
+ if (data) {
83
+ const fetchedReports = (_a = data.reports) !== null && _a !== void 0 ? _a : [];
84
+ setReports(fetchedReports);
85
+ setFilteredReports(fetchedReports);
86
+ setIsLoading(false);
87
+ }
88
+ })
89
+ .catch((err) => {
90
+ throw new Error(err);
91
+ });
92
+ })
93
+ .catch((err) => {
94
+ throw new Error(err);
95
+ });
96
+ }, [projectId, reportingClientApi]);
97
+ 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));
98
+ };
99
+ export default Reports;
100
+ //# sourceMappingURL=Reports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Reports.js","sourceRoot":"","sources":["../../../src/components/Reports.tsx"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F,OAAc,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,gBAAgB,CAAC;AAQxB,MAAM,OAAO,GAAG,GAAG,EAAE;;IACnB,MAAM,SAAS,GAAG,MAAA,yBAAyB,EAAE,0CAAE,OAAiB,CAAC;IACjE,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,eAAe,EAAE,EAAE,EAAE,CAAC,CAAC;IAEpE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAU,IAAI,CAAC,CAAC;IAC1D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAC;IACrD,MAAM,CAAC,gBAAgB,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAU,IAAI,CAAC,CAAC;IAClE,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAW,OAAO,CAAC,CAAC;IAC1E,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,EAAa,CAAC;IAElE,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEjD,MAAM,cAAc,GAAG,OAAO,CAC5B,GAAG,EAAE,CAAC;QACJ;YACE,MAAM,EAAE,OAAO;YACf,OAAO,EAAE;gBACP;oBACE,EAAE,EAAE,aAAa;oBACjB,MAAM,EAAE,MAAM;oBACd,QAAQ,EAAE,aAAa;iBACxB;gBACD;oBACE,EAAE,EAAE,aAAa;oBACjB,MAAM,EAAE,aAAa;oBACrB,QAAQ,EAAE,aAAa;iBACxB;aACF;SACF;KACF,EACD,EAAE,CACH,CAAC;IAEF,MAAM,uBAAuB,GAAG,KAAK,EAAE,KAAa,EAAE,EAAE;QACtD,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAClC,CAAC,CAAC,EAAE,EAAE;;YACJ,OAAA,CAAC,CAAC,WAAW;gBACb,CAAA,MAAA,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,0CAAE,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,IAAG,CAAC,CAAC,CAAA;SAAA,CACjE,CAAC;QACF,kBAAkB,CAAC,aAAa,CAAC,CAAC;IACpC,CAAC,CAAC;IAEF,MAAM,6BAA6B,GAAG,CAAC,QAAa,EAAE,MAAW,EAAO,EAAE;QACxE,QAAQ,MAAM,CAAC,IAAI,EAAE;YACnB,KAAK,mBAAmB,CAAC,CAAC;gBACxB,OAAO,EAAE,GAAG,QAAQ,EAAE,cAAc,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;aACvE;YACD;gBACE,MAAM;SACT;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,OAAO,CAC9B,GAAG,EAAE,CAAC,CAAC,CAAM,EAAE,GAAQ,EAAE,EAAE;QACzB,IAAI,GAAG,CAAC,QAAQ,KAAK,cAAc,EAAE;YACnC,aAAa,CAAC,CAAC,gBAAgB,CAAC,CAAC;YACjC,GAAG,CAAC,iBAAiB,EAAE,CAAC;SACzB;aAAM;YACL,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;SAC7B;QACD,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC,EACD,CAAC,gBAAgB,EAAE,cAAc,CAAC,CACnC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,SAAS,CAAC,mBAAmB;YAChC,MAAM,IAAI,KAAK,CACb,uFAAuF,CACxF,CAAC;QACJ,SAAS,CAAC,mBAAmB;aAC1B,cAAc,EAAE;aAChB,IAAI,CAAC,CAAC,KAAa,EAAE,EAAE;YACtB,kBAAkB;iBACf,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC;iBAC5B,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;;gBACb,IAAI,IAAI,EAAE;oBACR,MAAM,cAAc,GAAG,MAAA,IAAI,CAAC,OAAO,mCAAI,EAAE,CAAC;oBAC1C,UAAU,CAAC,cAAc,CAAC,CAAC;oBAC3B,kBAAkB,CAAC,cAAc,CAAC,CAAC;oBACnC,YAAY,CAAC,KAAK,CAAC,CAAC;iBACrB;YACH,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACb,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;QACP,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACb,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;IACP,CAAC,EAAE,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAEpC,OAAO,CACL,8BACE,KAAC,YAAY,IAAC,KAAK,EAAC,SAAS,WAAG,EAChC,6BAAK,SAAS,EAAC,yBAAyB,iBACtC,4BAAK,SAAS,EAAC,2BAA2B,gBACxC,KAAC,SAAS,IACR,cAAc,EAAE,uBAAuB,EACvC,WAAW,EAAE,gBAAgB,WAC7B,YACE,EACN,4BAAK,SAAS,EAAC,wBAAwB,gBACrC,KAAC,KAAK,IACJ,SAAS,EAAC,qBAAqB,EAC/B,IAAI,EAAE,eAAe,EACrB,OAAO,EAAC,iBAAiB,EACzB,OAAO,EAAE,cAAc,EACvB,iBAAiB,EAAC,uBAAuB,EACzC,UAAU,QACV,UAAU,EAAE,gBAAgB,EAC5B,YAAY,EAAE,6BAA6B,EAC3C,SAAS,EAAE,SAAS,EACpB,gBAAgB,EAAE,IAAI,EACtB,aAAa,EAAE,KAAK,WACpB,YACE,aACF,EACN,KAAC,MAAM,kBACL,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAC9B,SAAS,EAAC,KAAK,EACf,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAC,qBAAqB,kDAGxB,EACT,KAAC,WAAW,IACV,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAC7B,QAAQ,EAAE,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,EAAE,WAC5B,YACD,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,OAAO,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport React, { useEffect, 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"]}