From 41e04609fc8f76d58b8f3c6c79a4b890c2184fc9 Mon Sep 17 00:00:00 2001 From: Arun George Date: Mon, 6 Jan 2025 17:47:13 -0500 Subject: [PATCH] seems to compile and run fine. need to review changes --- common/config/rush/pnpm-lock.yaml | 307 ++++++++++++------ packages/apps/desktop-viewer-test/.env | 2 +- .../apps/desktop-viewer-test/package.json | 2 +- packages/apps/web-viewer-test/.env | 2 +- packages/apps/web-viewer-test/package.json | 10 +- .../src/components/home/ViewerHome.tsx | 11 - packages/apps/web-viewer-test/src/index.tsx | 9 +- .../modules/desktop-viewer-react/package.json | 4 +- .../modules/desktop-viewer-react/src/types.ts | 31 +- packages/modules/viewer-react/package.json | 11 +- .../src/components/BaseViewer.tsx | 10 +- .../providers/BackstageItemsProvider.ts | 42 +-- .../providers/DefaultContentGroupProvider.ts | 72 ---- .../providers/DefaultContentGroupProvider.tsx | 101 ++++++ .../UnifiedSelectionViewportControl.tsx | 47 +-- .../providers/ViewerContentToolsProvider.tsx | 22 +- .../ViewerNavigationToolsProvider.tsx | 128 +------- .../ViewerStatusbarItemsProvider.tsx | 72 ++-- .../src/components/error/ErrorBoundary.tsx | 2 +- .../src/components/iModel/IModelLoader.tsx | 43 +-- .../src/components/iModel/IModelViewer.tsx | 16 +- .../modules/viewer-react/src/hooks/index.ts | 1 - .../src/hooks/useBaseViewerInitializer.tsx | 8 +- .../viewer-react/src/hooks/useFrontstages.tsx | 23 +- .../viewer-react/src/hooks/useTheme.tsx | 17 - .../src/services/BaseInitializer.ts | 39 ++- .../src/services/iModel/IModelService.ts | 2 +- .../src/tests/components/BaseViewer.test.tsx | 11 +- .../components/iModel/IModelLoader.test.tsx | 26 +- .../tests/services/BaseInitializer.test.ts | 11 +- packages/modules/viewer-react/src/types.ts | 11 +- .../src/utilities/MakeCancellable.ts | 4 +- packages/modules/viewer-react/tsconfig.json | 3 +- .../modules/web-viewer-react/package.json | 4 +- .../modules/web-viewer-react/src/types.ts | 20 +- .../modules/web-viewer-react/tsconfig.json | 3 +- .../cra-template-desktop-viewer/template.json | 2 +- .../cra-template-desktop-viewer/template/.env | 2 +- .../cra-template-web-viewer/template.json | 2 +- .../cra-template-web-viewer/template/.env | 2 +- 40 files changed, 599 insertions(+), 536 deletions(-) delete mode 100644 packages/modules/viewer-react/src/components/app-ui/providers/DefaultContentGroupProvider.ts create mode 100644 packages/modules/viewer-react/src/components/app-ui/providers/DefaultContentGroupProvider.tsx delete mode 100644 packages/modules/viewer-react/src/hooks/useTheme.tsx diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index bfb11870..354892cd 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -53,7 +53,7 @@ importers: '@itwin/itwinui-illustrations-react': ^2.0.1 '@itwin/itwinui-layouts-css': ^0.2.0 '@itwin/itwinui-layouts-react': ^0.2.0 - '@itwin/itwinui-react': ^2.12.0 + '@itwin/itwinui-react': ^3.16.0 '@itwin/itwinui-variables': ^2.0.0 '@itwin/measure-tools-react': ^0.23.2 '@itwin/presentation-backend': ^4.7.3 @@ -118,15 +118,15 @@ importers: '@itwin/itwinui-illustrations-react': 2.1.0_nnrd3gsncyragczmpvfhocinkq '@itwin/itwinui-layouts-css': 0.2.0 '@itwin/itwinui-layouts-react': 0.2.0_nnrd3gsncyragczmpvfhocinkq - '@itwin/itwinui-react': 2.12.26_nnrd3gsncyragczmpvfhocinkq + '@itwin/itwinui-react': 3.16.3_psuonouaqi5wuc37nxyknoubym '@itwin/itwinui-variables': 2.1.2 '@itwin/measure-tools-react': 0.23.2_4lk5crizznvcytyjhv4sytu6si '@itwin/presentation-backend': 4.7.4_nztxufmverfbgaq2tic42bdzqu '@itwin/presentation-common': 4.7.4_jrcxtioaccikuahb3i3h6f5rhe - '@itwin/presentation-components': 5.4.1_coeiqitrdc3kbyoxwt3ak4fycm + '@itwin/presentation-components': 5.4.1_vsgychkrhhcqnl34xxqvqnicea '@itwin/presentation-frontend': 4.7.4_lbci6e5ivpkspr33wpe53pcp5i '@itwin/property-grid-react': 1.10.0_qjr4doayn7cutuokumbiwhomja - '@itwin/tree-widget-react': 3.0.1_i672swagn374al3m4ors5guk4q + '@itwin/tree-widget-react': 3.0.1_qmonqnyb76mcc5lxvubqnbx5ki '@itwin/unified-selection': 1.1.1 '@itwin/webgl-compatibility': 4.7.4 dotenv-flow: 3.3.0 @@ -160,9 +160,9 @@ importers: '@bentley/icons-generic': ^1.0.34 '@bentley/react-scripts': ^5.0.4 '@itwin/appui-abstract': ^4.7.3 - '@itwin/appui-react': ^4.3.0 + '@itwin/appui-react': ^5.0.0 '@itwin/browser-authorization': ^1.0.1 - '@itwin/components-react': ^4.3.0 + '@itwin/components-react': ^5.0.0 '@itwin/core-bentley': ^4.7.3 '@itwin/core-common': ^4.7.3 '@itwin/core-frontend': ^4.7.3 @@ -171,14 +171,14 @@ importers: '@itwin/core-markup': ^4.7.3 '@itwin/core-orbitgt': ^4.7.3 '@itwin/core-quantity': ^4.7.3 - '@itwin/core-react': ^4.3.0 + '@itwin/core-react': ^5.0.0 '@itwin/core-telemetry': ^4.7.3 '@itwin/ecschema-metadata': ^4.7.3 '@itwin/ecschema-rpcinterface-common': ^4.7.3 '@itwin/frontend-devtools': ^4.7.3 - '@itwin/imodel-components-react': ^4.3.0 + '@itwin/imodel-components-react': ^5.0.0 '@itwin/imodels-access-frontend': ^5.2.1 - '@itwin/itwinui-react': ^2.12.0 + '@itwin/itwinui-react': ^3.16.0 '@itwin/measure-tools-react': ^0.23.2 '@itwin/presentation-common': ^4.7.3 '@itwin/presentation-components': ^5.0.0 @@ -205,9 +205,9 @@ importers: dependencies: '@bentley/icons-generic': 1.0.34 '@itwin/appui-abstract': 4.7.4_@itwin+core-bentley@4.7.4 - '@itwin/appui-react': 4.15.1_yrqai5hl5gvsf4dek6el5aloii + '@itwin/appui-react': 5.0.0_bb3u4xzbep6lfapdosie4rdavm '@itwin/browser-authorization': 1.1.2_7i4fuy3zzvrtjsnyekcav72ie4 - '@itwin/components-react': 4.15.1_jscgs7su4cyo55wt5klvj3iepa + '@itwin/components-react': 5.0.0_vdvcaslqtdzlaqofn3df2kfe3y '@itwin/core-bentley': 4.7.4 '@itwin/core-common': 4.7.4_7i4fuy3zzvrtjsnyekcav72ie4 '@itwin/core-frontend': 4.7.4_phc4rse3pm3zzqfro3xbf2awbu @@ -216,22 +216,22 @@ importers: '@itwin/core-markup': 4.7.4_aa3bt7vk4zzsxcvhcdi4ojlcwe '@itwin/core-orbitgt': 4.7.4 '@itwin/core-quantity': 4.7.4_@itwin+core-bentley@4.7.4 - '@itwin/core-react': 4.15.1_bpptdsfauwdziiwg4uklizbr74 + '@itwin/core-react': 5.0.0_bat3aeftvdggsll265mlscthr4 '@itwin/core-telemetry': 4.7.4_@itwin+core-geometry@4.7.4 '@itwin/ecschema-metadata': 4.7.4_jokiwfzdpldlrb2ppvojwoxovq '@itwin/ecschema-rpcinterface-common': 4.7.4_bcf6l4a62o6ayq645yaljtfq2i '@itwin/frontend-devtools': 4.7.4_7jxo73lwmrfxldbvkntwilqkhe - '@itwin/imodel-components-react': 4.15.1_avm2jbcgpodgccdhk4zetypeem + '@itwin/imodel-components-react': 5.0.0_fsn2txmqjvoy7xalov6bf4jq34 '@itwin/imodels-access-frontend': 5.2.1_r7pomf6q3izykcd6xffknqbpim - '@itwin/itwinui-react': 2.12.26_nnrd3gsncyragczmpvfhocinkq - '@itwin/measure-tools-react': 0.23.2_4lk5crizznvcytyjhv4sytu6si + '@itwin/itwinui-react': 3.16.3_psuonouaqi5wuc37nxyknoubym + '@itwin/measure-tools-react': 0.23.2_vuwuhgtuamybjudj7a3k6i7fzy '@itwin/presentation-common': 4.7.4_jrcxtioaccikuahb3i3h6f5rhe - '@itwin/presentation-components': 5.4.1_coeiqitrdc3kbyoxwt3ak4fycm + '@itwin/presentation-components': 5.4.1_c6sfquaec4rzsgis43ur6hv4ui '@itwin/presentation-frontend': 4.7.4_lbci6e5ivpkspr33wpe53pcp5i - '@itwin/property-grid-react': 1.10.0_qjr4doayn7cutuokumbiwhomja + '@itwin/property-grid-react': 1.10.0_zgwkemo3kfhesxpfdnsxiis6ka '@itwin/reality-data-client': 1.2.1_@itwin+core-bentley@4.7.4 '@itwin/test-local-extension': link:../../modules/test-local-extension - '@itwin/tree-widget-react': 3.0.1_i672swagn374al3m4ors5guk4q + '@itwin/tree-widget-react': 3.0.1_zup47iojulowp72m2r6fz4nihq '@itwin/unified-selection': 1.1.1 '@itwin/web-viewer-react': link:../../modules/web-viewer-react '@itwin/webgl-compatibility': 4.7.4 @@ -441,7 +441,7 @@ importers: '@itwin/imodels-access-frontend': ^5.2.1 '@itwin/imodels-client-management': ^5.2.1 '@itwin/itwinui-illustrations-react': ^2.0.1 - '@itwin/itwinui-react': ^2.6.0 + '@itwin/itwinui-react': ^3.16.0 '@itwin/presentation-common': ^4.7.3 '@itwin/presentation-components': ^5.0.0 '@itwin/presentation-core-interop': ^1.0.0 @@ -476,7 +476,7 @@ importers: dependencies: '@bentley/icons-generic-webfont': 1.0.34 '@itwin/itwinui-illustrations-react': 2.1.0_nnrd3gsncyragczmpvfhocinkq - '@itwin/itwinui-react': 2.12.26_nnrd3gsncyragczmpvfhocinkq + '@itwin/itwinui-react': 3.16.3_psuonouaqi5wuc37nxyknoubym '@itwin/presentation-core-interop': 1.1.1_rll2n26bhzrezeyt23jhdcbtsy '@itwin/presentation-shared': 1.1.0 '@itwin/reality-data-client': 1.2.1_@itwin+core-bentley@4.7.4 @@ -484,9 +484,9 @@ importers: lodash.isequal: 4.5.0 devDependencies: '@itwin/appui-abstract': 4.7.4_@itwin+core-bentley@4.7.4 - '@itwin/appui-react': 5.0.0_6epex25z66yggmvzksim3phs2e + '@itwin/appui-react': 5.0.0_bb3u4xzbep6lfapdosie4rdavm '@itwin/build-tools': 4.7.4_@types+node@18.19.39 - '@itwin/components-react': 5.0.0_6eyyr2a7tr3dtj2uzemx5ifasa + '@itwin/components-react': 5.0.0_vdvcaslqtdzlaqofn3df2kfe3y '@itwin/core-bentley': 4.7.4 '@itwin/core-common': 4.7.4_7i4fuy3zzvrtjsnyekcav72ie4 '@itwin/core-frontend': 4.7.4_phc4rse3pm3zzqfro3xbf2awbu @@ -495,14 +495,14 @@ importers: '@itwin/core-markup': 4.7.4_aa3bt7vk4zzsxcvhcdi4ojlcwe '@itwin/core-orbitgt': 4.7.4 '@itwin/core-quantity': 4.7.4_@itwin+core-bentley@4.7.4 - '@itwin/core-react': 5.0.0_y4ozd6sj6g5wkcztyvbfg5oqua + '@itwin/core-react': 5.0.0_bat3aeftvdggsll265mlscthr4 '@itwin/core-telemetry': 4.7.4_@itwin+core-geometry@4.7.4 '@itwin/ecschema-metadata': 4.7.4_jokiwfzdpldlrb2ppvojwoxovq - '@itwin/imodel-components-react': 5.0.0_er2fj7dqb54ujaatr6hgnukoom + '@itwin/imodel-components-react': 5.0.0_fsn2txmqjvoy7xalov6bf4jq34 '@itwin/imodels-access-frontend': 5.2.1_r7pomf6q3izykcd6xffknqbpim '@itwin/imodels-client-management': 5.8.1 '@itwin/presentation-common': 4.7.4_jrcxtioaccikuahb3i3h6f5rhe - '@itwin/presentation-components': 5.4.1_esj5ijvlkcvixi6vkbonlwg7be + '@itwin/presentation-components': 5.4.1_c6sfquaec4rzsgis43ur6hv4ui '@itwin/presentation-frontend': 4.7.4_lbci6e5ivpkspr33wpe53pcp5i '@itwin/webgl-compatibility': 4.7.4 '@testing-library/jest-dom': 4.2.4 @@ -2775,16 +2775,16 @@ packages: /@floating-ui/core/1.6.4: resolution: {integrity: sha512-a4IowK4QkXl4SCWTGUR0INAfEOX3wtsYw3rKK5InQEHMGObkR8Xk44qYQD9P4r6HHw0iIfK6GUKECmY8sTkqRA==} dependencies: - '@floating-ui/utils': 0.2.4 + '@floating-ui/utils': 0.2.8 /@floating-ui/dom/1.6.7: resolution: {integrity: sha512-wmVfPG5o2xnKDU4jx/m4w5qva9FWHcnZ8BvzEe90D/RpwsJaTAVYPEPdQ8sbr/N8zZTAHlZUTQdqg8ZUbzHmng==} dependencies: '@floating-ui/core': 1.6.4 - '@floating-ui/utils': 0.2.4 + '@floating-ui/utils': 0.2.8 - /@floating-ui/react-dom/2.1.1_nnrd3gsncyragczmpvfhocinkq: - resolution: {integrity: sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==} + /@floating-ui/react-dom/2.1.2_nnrd3gsncyragczmpvfhocinkq: + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' @@ -2792,23 +2792,21 @@ packages: '@floating-ui/dom': 1.6.7 react: 18.3.1 react-dom: 18.3.1_react@18.3.1 - dev: false - /@floating-ui/react/0.26.19_nnrd3gsncyragczmpvfhocinkq: - resolution: {integrity: sha512-Jk6zITdjjIvjO/VdQFvpRaD3qPwOHH6AoDHxjhpy+oK4KFgaSP871HYWUAPdnLmx1gQ+w/pB312co3tVml+BXA==} + /@floating-ui/react/0.26.28_nnrd3gsncyragczmpvfhocinkq: + resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@floating-ui/react-dom': 2.1.1_nnrd3gsncyragczmpvfhocinkq - '@floating-ui/utils': 0.2.4 + '@floating-ui/react-dom': 2.1.2_nnrd3gsncyragczmpvfhocinkq + '@floating-ui/utils': 0.2.8 react: 18.3.1 react-dom: 18.3.1_react@18.3.1 tabbable: 6.2.0 - dev: false - /@floating-ui/utils/0.2.4: - resolution: {integrity: sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA==} + /@floating-ui/utils/0.2.8: + resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} /@humanwhocodes/config-array/0.11.14: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} @@ -2915,7 +2913,7 @@ packages: '@itwin/imodel-components-react': 4.15.1_avm2jbcgpodgccdhk4zetypeem '@itwin/itwinui-icons-react': 2.8.0_nnrd3gsncyragczmpvfhocinkq '@itwin/itwinui-illustrations-react': 2.1.0_nnrd3gsncyragczmpvfhocinkq - '@itwin/itwinui-react': 3.12.2_psuonouaqi5wuc37nxyknoubym + '@itwin/itwinui-react': 3.16.3_psuonouaqi5wuc37nxyknoubym '@itwin/itwinui-react-v2': /@itwin/itwinui-react/2.12.26_nnrd3gsncyragczmpvfhocinkq '@itwin/itwinui-variables': 3.2.0 classnames: 2.3.1 @@ -2935,7 +2933,7 @@ packages: - '@types/react' dev: false - /@itwin/appui-react/5.0.0_6epex25z66yggmvzksim3phs2e: + /@itwin/appui-react/5.0.0_bb3u4xzbep6lfapdosie4rdavm: resolution: {integrity: sha512-Q+ao006pPbMHp24U8PjEbumNiWhhpsRL9ktD94N2i/m40HCwChamqWUZqcCKTUUkt7KjxeyssBTCjiSIxkEQ8g==} peerDependencies: '@itwin/appui-abstract': ^4.0.0 @@ -2955,18 +2953,18 @@ packages: redux: ^4.1.0 || ^5.0.0 dependencies: '@itwin/appui-abstract': 4.7.4_@itwin+core-bentley@4.7.4 - '@itwin/components-react': 5.0.0_6eyyr2a7tr3dtj2uzemx5ifasa + '@itwin/components-react': 5.0.0_vdvcaslqtdzlaqofn3df2kfe3y '@itwin/core-bentley': 4.7.4 '@itwin/core-common': 4.7.4_7i4fuy3zzvrtjsnyekcav72ie4 '@itwin/core-frontend': 4.7.4_phc4rse3pm3zzqfro3xbf2awbu '@itwin/core-geometry': 4.7.4 '@itwin/core-quantity': 4.7.4_@itwin+core-bentley@4.7.4 - '@itwin/core-react': 5.0.0_y4ozd6sj6g5wkcztyvbfg5oqua + '@itwin/core-react': 5.0.0_bat3aeftvdggsll265mlscthr4 '@itwin/core-telemetry': 4.7.4_@itwin+core-geometry@4.7.4 - '@itwin/imodel-components-react': 5.0.0_er2fj7dqb54ujaatr6hgnukoom + '@itwin/imodel-components-react': 5.0.0_fsn2txmqjvoy7xalov6bf4jq34 '@itwin/itwinui-icons-react': 2.8.0_nnrd3gsncyragczmpvfhocinkq '@itwin/itwinui-illustrations-react': 2.1.0_nnrd3gsncyragczmpvfhocinkq - '@itwin/itwinui-react': 2.12.26_nnrd3gsncyragczmpvfhocinkq + '@itwin/itwinui-react': 3.16.3_psuonouaqi5wuc37nxyknoubym classnames: 2.5.1 immer: 10.1.1 lodash: 4.17.21 @@ -2981,7 +2979,6 @@ packages: zustand: 4.5.4_pkovrptl7wv2iqloyky3y37yx4 transitivePeerDependencies: - '@types/react' - dev: true /@itwin/appui-react/5.0.0_f7mluli6gphi644ppji74mdem4: resolution: {integrity: sha512-Q+ao006pPbMHp24U8PjEbumNiWhhpsRL9ktD94N2i/m40HCwChamqWUZqcCKTUUkt7KjxeyssBTCjiSIxkEQ8g==} @@ -3126,7 +3123,7 @@ packages: '@itwin/core-bentley': 4.7.4 '@itwin/core-react': 4.15.1_bpptdsfauwdziiwg4uklizbr74 '@itwin/itwinui-icons-react': 2.8.0_nnrd3gsncyragczmpvfhocinkq - '@itwin/itwinui-react': 3.12.2_psuonouaqi5wuc37nxyknoubym + '@itwin/itwinui-react': 3.16.3_psuonouaqi5wuc37nxyknoubym '@itwin/itwinui-variables': 3.2.0 classnames: 2.3.1 immer: 9.0.6 @@ -3142,7 +3139,7 @@ packages: - '@types/react' dev: false - /@itwin/components-react/5.0.0_6eyyr2a7tr3dtj2uzemx5ifasa: + /@itwin/components-react/5.0.0_ek5rphe37jjarmnycbpdu4q62a: resolution: {integrity: sha512-kFZqb8CCaC8XEtDvIIj4a/OiFep0VQO8+BTFVkb06oN/UZWEF+vBKKP351Y9zmHo/SXAA5rl/Uu5eodS+d4ksw==} peerDependencies: '@itwin/appui-abstract': ^4.0.0 @@ -3154,9 +3151,8 @@ packages: dependencies: '@itwin/appui-abstract': 4.7.4_@itwin+core-bentley@4.7.4 '@itwin/core-bentley': 4.7.4 - '@itwin/core-react': 5.0.0_y4ozd6sj6g5wkcztyvbfg5oqua + '@itwin/core-react': 5.0.0_pziseddj4fywh45qpm2erfqgyy '@itwin/itwinui-icons-react': 2.8.0_nnrd3gsncyragczmpvfhocinkq - '@itwin/itwinui-react': 2.12.26_nnrd3gsncyragczmpvfhocinkq classnames: 2.5.1 immer: 10.1.1 linkify-it: 2.2.0 @@ -3168,7 +3164,7 @@ packages: ts-key-enum: 2.0.12 dev: true - /@itwin/components-react/5.0.0_ek5rphe37jjarmnycbpdu4q62a: + /@itwin/components-react/5.0.0_vdvcaslqtdzlaqofn3df2kfe3y: resolution: {integrity: sha512-kFZqb8CCaC8XEtDvIIj4a/OiFep0VQO8+BTFVkb06oN/UZWEF+vBKKP351Y9zmHo/SXAA5rl/Uu5eodS+d4ksw==} peerDependencies: '@itwin/appui-abstract': ^4.0.0 @@ -3180,8 +3176,9 @@ packages: dependencies: '@itwin/appui-abstract': 4.7.4_@itwin+core-bentley@4.7.4 '@itwin/core-bentley': 4.7.4 - '@itwin/core-react': 5.0.0_pziseddj4fywh45qpm2erfqgyy + '@itwin/core-react': 5.0.0_bat3aeftvdggsll265mlscthr4 '@itwin/itwinui-icons-react': 2.8.0_nnrd3gsncyragczmpvfhocinkq + '@itwin/itwinui-react': 3.16.3_psuonouaqi5wuc37nxyknoubym classnames: 2.5.1 immer: 10.1.1 linkify-it: 2.2.0 @@ -3191,7 +3188,6 @@ packages: react-window: 1.8.10_nnrd3gsncyragczmpvfhocinkq rxjs: 7.8.1 ts-key-enum: 2.0.12 - dev: true /@itwin/core-backend/4.7.4_zzr6hivuljmnvzdhcyobjpaqme: resolution: {integrity: sha512-pHWHZdgn3dIuOjiC0eJIo8F3MapkeZBTHIwLJr57M3BJH0kyJ8zRy5fWvK20lE985m6VR7a2SxGcybgRVv4sBg==} @@ -3389,7 +3385,7 @@ packages: '@itwin/appui-abstract': 4.7.4_@itwin+core-bentley@4.7.4 '@itwin/core-bentley': 4.7.4 '@itwin/itwinui-icons-react': 2.8.0_nnrd3gsncyragczmpvfhocinkq - '@itwin/itwinui-react': 3.12.2_psuonouaqi5wuc37nxyknoubym + '@itwin/itwinui-react': 3.16.3_psuonouaqi5wuc37nxyknoubym '@itwin/itwinui-variables': 3.2.0 classnames: 2.3.1 dompurify: 2.5.6 @@ -3403,7 +3399,7 @@ packages: - '@types/react' dev: false - /@itwin/core-react/5.0.0_pziseddj4fywh45qpm2erfqgyy: + /@itwin/core-react/5.0.0_bat3aeftvdggsll265mlscthr4: resolution: {integrity: sha512-GBtCGt+FBqckVRDeQ8YZS0BTo67cmzLUzcetnslgSoJP679yVmvSCeOzfZQEgRAtvaEsx8pDK7AOsoD2c5lekQ==} peerDependencies: '@itwin/appui-abstract': ^4.0.0 @@ -3415,6 +3411,7 @@ packages: '@itwin/appui-abstract': 4.7.4_@itwin+core-bentley@4.7.4 '@itwin/core-bentley': 4.7.4 '@itwin/itwinui-icons-react': 2.8.0_nnrd3gsncyragczmpvfhocinkq + '@itwin/itwinui-react': 3.16.3_psuonouaqi5wuc37nxyknoubym classnames: 2.5.1 dompurify: 2.5.6 lodash: 4.17.21 @@ -3422,9 +3419,8 @@ packages: react-autosuggest: 10.1.0_react@18.3.1 react-dom: 18.3.1_react@18.3.1 ts-key-enum: 2.0.12 - dev: true - /@itwin/core-react/5.0.0_y4ozd6sj6g5wkcztyvbfg5oqua: + /@itwin/core-react/5.0.0_pziseddj4fywh45qpm2erfqgyy: resolution: {integrity: sha512-GBtCGt+FBqckVRDeQ8YZS0BTo67cmzLUzcetnslgSoJP679yVmvSCeOzfZQEgRAtvaEsx8pDK7AOsoD2c5lekQ==} peerDependencies: '@itwin/appui-abstract': ^4.0.0 @@ -3436,7 +3432,6 @@ packages: '@itwin/appui-abstract': 4.7.4_@itwin+core-bentley@4.7.4 '@itwin/core-bentley': 4.7.4 '@itwin/itwinui-icons-react': 2.8.0_nnrd3gsncyragczmpvfhocinkq - '@itwin/itwinui-react': 2.12.26_nnrd3gsncyragczmpvfhocinkq classnames: 2.5.1 dompurify: 2.5.6 lodash: 4.17.21 @@ -3601,7 +3596,7 @@ packages: '@itwin/core-quantity': 4.7.4_@itwin+core-bentley@4.7.4 '@itwin/core-react': 4.15.1_bpptdsfauwdziiwg4uklizbr74 '@itwin/itwinui-icons-react': 2.8.0_nnrd3gsncyragczmpvfhocinkq - '@itwin/itwinui-react': 3.12.2_psuonouaqi5wuc37nxyknoubym + '@itwin/itwinui-react': 3.16.3_psuonouaqi5wuc37nxyknoubym '@itwin/itwinui-variables': 3.2.0 classnames: 2.3.1 react: 18.3.1 @@ -3641,7 +3636,7 @@ packages: ts-key-enum: 2.0.12 dev: true - /@itwin/imodel-components-react/5.0.0_er2fj7dqb54ujaatr6hgnukoom: + /@itwin/imodel-components-react/5.0.0_fsn2txmqjvoy7xalov6bf4jq34: resolution: {integrity: sha512-gCn73sIMnJR95kYHRnT42fXpGRCFQUML5irE9IOn64kV7Dkh+t2G1wU0oVIPvJbSWyO81gxnAU9T8bHasaKSxQ==} peerDependencies: '@itwin/appui-abstract': ^4.0.0 @@ -3657,20 +3652,19 @@ packages: react-dom: ^18.0.0 dependencies: '@itwin/appui-abstract': 4.7.4_@itwin+core-bentley@4.7.4 - '@itwin/components-react': 5.0.0_6eyyr2a7tr3dtj2uzemx5ifasa + '@itwin/components-react': 5.0.0_vdvcaslqtdzlaqofn3df2kfe3y '@itwin/core-bentley': 4.7.4 '@itwin/core-common': 4.7.4_7i4fuy3zzvrtjsnyekcav72ie4 '@itwin/core-frontend': 4.7.4_phc4rse3pm3zzqfro3xbf2awbu '@itwin/core-geometry': 4.7.4 '@itwin/core-quantity': 4.7.4_@itwin+core-bentley@4.7.4 - '@itwin/core-react': 5.0.0_y4ozd6sj6g5wkcztyvbfg5oqua + '@itwin/core-react': 5.0.0_bat3aeftvdggsll265mlscthr4 '@itwin/itwinui-icons-react': 2.8.0_nnrd3gsncyragczmpvfhocinkq - '@itwin/itwinui-react': 2.12.26_nnrd3gsncyragczmpvfhocinkq + '@itwin/itwinui-react': 3.16.3_psuonouaqi5wuc37nxyknoubym classnames: 2.5.1 react: 18.3.1 react-dom: 18.3.1_react@18.3.1 ts-key-enum: 2.0.12 - dev: true /@itwin/imodels-access-backend/5.2.1_4z423c7twni3c7p4vwjttw7w4q: resolution: {integrity: sha512-A913LDaA6K0va71s3hhqpiIHNUcX7TAIcOt1Qqvu84P57/DdR45fh3+bI0dWY4DqzD3Cu7cnFL9Qw1xSh3qP9w==} @@ -3783,6 +3777,7 @@ packages: /@itwin/itwinui-react/2.12.26_nnrd3gsncyragczmpvfhocinkq: resolution: {integrity: sha512-SzedS6sz1iupq0JZm0SAfynFPR8xB9/GbTtQz/8XyuTEvrBoXyHMZJGAySR99TdLwpm3r+cxAEpFK5UOpQ+0Vw==} + deprecated: iTwinUI v2 has reached end-of-life. Please upgrade to the latest version. peerDependencies: react: '>=16.8.6 < 19.0.0' react-dom: '>=16.8.6 < 19.0.0' @@ -3796,16 +3791,18 @@ packages: react-table: 7.8.0_react@18.3.1 react-transition-group: 4.4.5_nnrd3gsncyragczmpvfhocinkq tippy.js: 6.3.7 + dev: false - /@itwin/itwinui-react/3.12.2_psuonouaqi5wuc37nxyknoubym: - resolution: {integrity: sha512-ARRr8rx3YlBkL02gJ59wt7qVK93/qpB91neXMnXTJ1QkADIl32fUtzOXvx3nlgt9RzBnoj3NbswIm75HQd/joQ==} + /@itwin/itwinui-react/3.16.3_psuonouaqi5wuc37nxyknoubym: + resolution: {integrity: sha512-lXv+gWVSR8ItqGU3Kmr2yCRTiZQg8gZiLeqtVZUyD77lcUMwRQ+FvJq65Bbr62py9/IfHwFOFdaNEBP5cV259g==} peerDependencies: - react: '>= 17.0.0 < 19.0.0' - react-dom: '>=17.0.0 < 19.0.0' + react: '>=17.0.0 <19.0.0' + react-dom: '>=17.0.0 <19.0.0' dependencies: - '@floating-ui/react': 0.26.19_nnrd3gsncyragczmpvfhocinkq + '@floating-ui/react': 0.26.28_nnrd3gsncyragczmpvfhocinkq '@itwin/itwinui-illustrations-react': 2.1.0_nnrd3gsncyragczmpvfhocinkq '@swc/helpers': 0.5.11 + '@tanstack/react-virtual': 3.11.2_nnrd3gsncyragczmpvfhocinkq classnames: 2.5.1 jotai: 2.9.0_3vdbhqr2ncalcx7opnshezpx3q react: 18.3.1 @@ -3814,7 +3811,6 @@ packages: react-transition-group: 4.4.5_nnrd3gsncyragczmpvfhocinkq transitivePeerDependencies: - '@types/react' - dev: false /@itwin/itwinui-variables/1.0.0: resolution: {integrity: sha512-f78S401k1romzL6jgJuNZTe8P0/PCtrKUDVZwMsIJHLlgwyMKGR7nqDWQBV03tY2/TF/qMLt9S96Tej4f1Xrtg==} @@ -3861,6 +3857,39 @@ packages: redux: 4.2.1 dev: false + /@itwin/measure-tools-react/0.23.2_vuwuhgtuamybjudj7a3k6i7fzy: + resolution: {integrity: sha512-CqkJW8hY2YHlcJCoH2dabUNp0t0jxjzaJZmsvYKqGr+wmjp5j4lhOSwtHDfVBTE6a9/pWQS+/yVou/9rTt4TLg==} + peerDependencies: + '@itwin/appui-abstract': ^4.7.0 + '@itwin/appui-layout-react': ^4.4.0 + '@itwin/appui-react': ^4.4.0 + '@itwin/components-react': ^4.4.0 + '@itwin/core-bentley': ^4.7.0 + '@itwin/core-common': ^4.7.0 + '@itwin/core-frontend': ^4.7.0 + '@itwin/core-geometry': ^4.7.0 + '@itwin/core-react': ^4.4.0 + react: ^17.0.0 + react-dom: ^17.0.0 + redux: ^4.2.1 + dependencies: + '@bentley/icons-generic-webfont': 1.0.34 + '@itwin/appui-abstract': 4.7.4_@itwin+core-bentley@4.7.4 + '@itwin/appui-react': 5.0.0_bb3u4xzbep6lfapdosie4rdavm + '@itwin/components-react': 5.0.0_vdvcaslqtdzlaqofn3df2kfe3y + '@itwin/core-bentley': 4.7.4 + '@itwin/core-common': 4.7.4_7i4fuy3zzvrtjsnyekcav72ie4 + '@itwin/core-frontend': 4.7.4_phc4rse3pm3zzqfro3xbf2awbu + '@itwin/core-geometry': 4.7.4 + '@itwin/core-react': 5.0.0_bat3aeftvdggsll265mlscthr4 + '@itwin/core-telemetry': 4.7.4_@itwin+core-geometry@4.7.4 + '@itwin/itwinui-icons-react': 2.8.0_nnrd3gsncyragczmpvfhocinkq + '@itwin/itwinui-react': 2.12.26_nnrd3gsncyragczmpvfhocinkq + react: 18.3.1 + react-dom: 18.3.1_react@18.3.1 + redux: 4.2.1 + dev: false + /@itwin/object-storage-azure/2.2.4_gteov7on4oycvgy3jqh4tz3uta: resolution: {integrity: sha512-mJjX090FBR//tqQfCjV01qYQsiU0wv2x+XTDx8sA+b8mQqYUHdCgeD55ZLecCQRihU0Aebd1qw3PadrLuv0GeQ==} peerDependencies: @@ -3963,7 +3992,7 @@ packages: '@itwin/core-quantity': 4.7.4_@itwin+core-bentley@4.7.4 '@itwin/ecschema-metadata': 4.7.4_jokiwfzdpldlrb2ppvojwoxovq - /@itwin/presentation-components/5.4.1_coeiqitrdc3kbyoxwt3ak4fycm: + /@itwin/presentation-components/5.4.1_c6sfquaec4rzsgis43ur6hv4ui: resolution: {integrity: sha512-o1ysqcbyVAWHyYTGVisFNfbix7GJdXp69c3QAeX/Xv2K0AS1ce2qYDEQCGwxwL1qIseIBbq9pZXADYjf9GH2bQ==} peerDependencies: '@itwin/appui-abstract': ^4.4.0 @@ -3982,17 +4011,17 @@ packages: react-dom: ^17.0.0 || ^18.0.0 dependencies: '@itwin/appui-abstract': 4.7.4_@itwin+core-bentley@4.7.4 - '@itwin/components-react': 4.15.1_jscgs7su4cyo55wt5klvj3iepa + '@itwin/components-react': 5.0.0_vdvcaslqtdzlaqofn3df2kfe3y '@itwin/core-bentley': 4.7.4 '@itwin/core-common': 4.7.4_7i4fuy3zzvrtjsnyekcav72ie4 '@itwin/core-frontend': 4.7.4_phc4rse3pm3zzqfro3xbf2awbu '@itwin/core-quantity': 4.7.4_@itwin+core-bentley@4.7.4 - '@itwin/core-react': 4.15.1_bpptdsfauwdziiwg4uklizbr74 + '@itwin/core-react': 5.0.0_bat3aeftvdggsll265mlscthr4 '@itwin/ecschema-metadata': 4.7.4_jokiwfzdpldlrb2ppvojwoxovq - '@itwin/imodel-components-react': 4.15.1_avm2jbcgpodgccdhk4zetypeem + '@itwin/imodel-components-react': 5.0.0_fsn2txmqjvoy7xalov6bf4jq34 '@itwin/itwinui-icons-react': 2.8.0_nnrd3gsncyragczmpvfhocinkq '@itwin/itwinui-illustrations-react': 2.1.0_nnrd3gsncyragczmpvfhocinkq - '@itwin/itwinui-react': 2.12.26_nnrd3gsncyragczmpvfhocinkq + '@itwin/itwinui-react': 3.16.3_psuonouaqi5wuc37nxyknoubym '@itwin/presentation-common': 4.7.4_jrcxtioaccikuahb3i3h6f5rhe '@itwin/presentation-frontend': 4.7.4_lbci6e5ivpkspr33wpe53pcp5i classnames: 2.5.1 @@ -4008,9 +4037,8 @@ packages: transitivePeerDependencies: - '@types/react' - supports-color - dev: false - /@itwin/presentation-components/5.4.1_esj5ijvlkcvixi6vkbonlwg7be: + /@itwin/presentation-components/5.4.1_g2rvzsgzcfmjwruzqwltjgx5mq: resolution: {integrity: sha512-o1ysqcbyVAWHyYTGVisFNfbix7GJdXp69c3QAeX/Xv2K0AS1ce2qYDEQCGwxwL1qIseIBbq9pZXADYjf9GH2bQ==} peerDependencies: '@itwin/appui-abstract': ^4.4.0 @@ -4029,17 +4057,16 @@ packages: react-dom: ^17.0.0 || ^18.0.0 dependencies: '@itwin/appui-abstract': 4.7.4_@itwin+core-bentley@4.7.4 - '@itwin/components-react': 5.0.0_6eyyr2a7tr3dtj2uzemx5ifasa + '@itwin/components-react': 5.0.0_ek5rphe37jjarmnycbpdu4q62a '@itwin/core-bentley': 4.7.4 '@itwin/core-common': 4.7.4_7i4fuy3zzvrtjsnyekcav72ie4 '@itwin/core-frontend': 4.7.4_phc4rse3pm3zzqfro3xbf2awbu '@itwin/core-quantity': 4.7.4_@itwin+core-bentley@4.7.4 - '@itwin/core-react': 5.0.0_y4ozd6sj6g5wkcztyvbfg5oqua + '@itwin/core-react': 5.0.0_pziseddj4fywh45qpm2erfqgyy '@itwin/ecschema-metadata': 4.7.4_jokiwfzdpldlrb2ppvojwoxovq - '@itwin/imodel-components-react': 5.0.0_er2fj7dqb54ujaatr6hgnukoom + '@itwin/imodel-components-react': 5.0.0_bonqqwr76xuyqrlfhkxxm53o4y '@itwin/itwinui-icons-react': 2.8.0_nnrd3gsncyragczmpvfhocinkq '@itwin/itwinui-illustrations-react': 2.1.0_nnrd3gsncyragczmpvfhocinkq - '@itwin/itwinui-react': 2.12.26_nnrd3gsncyragczmpvfhocinkq '@itwin/presentation-common': 4.7.4_jrcxtioaccikuahb3i3h6f5rhe '@itwin/presentation-frontend': 4.7.4_lbci6e5ivpkspr33wpe53pcp5i classnames: 2.5.1 @@ -4057,7 +4084,7 @@ packages: - supports-color dev: true - /@itwin/presentation-components/5.4.1_g2rvzsgzcfmjwruzqwltjgx5mq: + /@itwin/presentation-components/5.4.1_vsgychkrhhcqnl34xxqvqnicea: resolution: {integrity: sha512-o1ysqcbyVAWHyYTGVisFNfbix7GJdXp69c3QAeX/Xv2K0AS1ce2qYDEQCGwxwL1qIseIBbq9pZXADYjf9GH2bQ==} peerDependencies: '@itwin/appui-abstract': ^4.4.0 @@ -4076,16 +4103,17 @@ packages: react-dom: ^17.0.0 || ^18.0.0 dependencies: '@itwin/appui-abstract': 4.7.4_@itwin+core-bentley@4.7.4 - '@itwin/components-react': 5.0.0_ek5rphe37jjarmnycbpdu4q62a + '@itwin/components-react': 4.15.1_jscgs7su4cyo55wt5klvj3iepa '@itwin/core-bentley': 4.7.4 '@itwin/core-common': 4.7.4_7i4fuy3zzvrtjsnyekcav72ie4 '@itwin/core-frontend': 4.7.4_phc4rse3pm3zzqfro3xbf2awbu '@itwin/core-quantity': 4.7.4_@itwin+core-bentley@4.7.4 - '@itwin/core-react': 5.0.0_pziseddj4fywh45qpm2erfqgyy + '@itwin/core-react': 4.15.1_bpptdsfauwdziiwg4uklizbr74 '@itwin/ecschema-metadata': 4.7.4_jokiwfzdpldlrb2ppvojwoxovq - '@itwin/imodel-components-react': 5.0.0_bonqqwr76xuyqrlfhkxxm53o4y + '@itwin/imodel-components-react': 4.15.1_avm2jbcgpodgccdhk4zetypeem '@itwin/itwinui-icons-react': 2.8.0_nnrd3gsncyragczmpvfhocinkq '@itwin/itwinui-illustrations-react': 2.1.0_nnrd3gsncyragczmpvfhocinkq + '@itwin/itwinui-react': 3.16.3_psuonouaqi5wuc37nxyknoubym '@itwin/presentation-common': 4.7.4_jrcxtioaccikuahb3i3h6f5rhe '@itwin/presentation-frontend': 4.7.4_lbci6e5ivpkspr33wpe53pcp5i classnames: 2.5.1 @@ -4101,7 +4129,7 @@ packages: transitivePeerDependencies: - '@types/react' - supports-color - dev: true + dev: false /@itwin/presentation-core-interop/1.1.1_rll2n26bhzrezeyt23jhdcbtsy: resolution: {integrity: sha512-Ts3U1/0pJ+igKT2cRlUiO+QKldz/92ma2hKWxTgJWfBAybPR3DI34NAy1Jl7q/r7QcZ+5DAsIcO9Et/SP+Lt9A==} @@ -4141,7 +4169,7 @@ packages: rxjs: 7.8.1 rxjs-for-await: 1.0.0_rxjs@7.8.1 - /@itwin/presentation-hierarchies-react/1.1.1_qnkn5lfpltqtw66hig7mudvuci: + /@itwin/presentation-hierarchies-react/1.1.1_wrx22x3z54gp6n6sl5xreeqzfy: resolution: {integrity: sha512-lVOYZOJxwk/EgmMHpgOl3l6GLBvTHzeXw0312dnwnV2gT/KIaBJ7KyLzNur8CGKPprtOkgu0KZ0wVRGk8j6TAw==} peerDependencies: '@itwin/itwinui-react': ^3.0.0 @@ -4154,7 +4182,7 @@ packages: '@itwin/core-bentley': 4.9.5 '@itwin/itwinui-icons-react': 2.8.0_nnrd3gsncyragczmpvfhocinkq '@itwin/itwinui-illustrations-react': 2.1.0_nnrd3gsncyragczmpvfhocinkq - '@itwin/itwinui-react': 2.12.26_nnrd3gsncyragczmpvfhocinkq + '@itwin/itwinui-react': 3.16.3_psuonouaqi5wuc37nxyknoubym '@itwin/presentation-hierarchies': 1.2.1 '@itwin/presentation-shared': 1.1.0 '@itwin/unified-selection': 1.1.1 @@ -4205,8 +4233,41 @@ packages: '@itwin/core-react': 4.15.1_bpptdsfauwdziiwg4uklizbr74 '@itwin/itwinui-icons-react': 2.8.0_nnrd3gsncyragczmpvfhocinkq '@itwin/itwinui-illustrations-react': 2.1.0_nnrd3gsncyragczmpvfhocinkq - '@itwin/itwinui-react': 3.12.2_psuonouaqi5wuc37nxyknoubym - '@itwin/presentation-components': 5.4.1_coeiqitrdc3kbyoxwt3ak4fycm + '@itwin/itwinui-react': 3.16.3_psuonouaqi5wuc37nxyknoubym + '@itwin/presentation-components': 5.4.1_vsgychkrhhcqnl34xxqvqnicea + '@itwin/presentation-frontend': 4.7.4_lbci6e5ivpkspr33wpe53pcp5i + classnames: 2.5.1 + react: 18.3.1 + react-dom: 18.3.1_react@18.3.1 + react-error-boundary: 4.0.13_react@18.3.1 + transitivePeerDependencies: + - '@types/react' + dev: false + + /@itwin/property-grid-react/1.10.0_zgwkemo3kfhesxpfdnsxiis6ka: + resolution: {integrity: sha512-n5o+NnH8tGvLTkEHls6uZ7SmHBFby5LkZCVAcrY6cFsVD+tceIOZzgiIJbsEp/+OANGY3AnkAdg76yOrVQAxOg==} + peerDependencies: + '@itwin/appui-abstract': ^4.0.0 + '@itwin/appui-react': ^4.3.0 + '@itwin/components-react': ^4.3.0 + '@itwin/core-bentley': ^4.0.0 + '@itwin/core-frontend': ^4.0.0 + '@itwin/core-react': ^4.3.0 + '@itwin/presentation-components': ^4.0.0 || ^5.0.0 + '@itwin/presentation-frontend': ^4.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + dependencies: + '@itwin/appui-abstract': 4.7.4_@itwin+core-bentley@4.7.4 + '@itwin/appui-react': 5.0.0_bb3u4xzbep6lfapdosie4rdavm + '@itwin/components-react': 5.0.0_vdvcaslqtdzlaqofn3df2kfe3y + '@itwin/core-bentley': 4.7.4 + '@itwin/core-frontend': 4.7.4_phc4rse3pm3zzqfro3xbf2awbu + '@itwin/core-react': 5.0.0_bat3aeftvdggsll265mlscthr4 + '@itwin/itwinui-icons-react': 2.8.0_nnrd3gsncyragczmpvfhocinkq + '@itwin/itwinui-illustrations-react': 2.1.0_nnrd3gsncyragczmpvfhocinkq + '@itwin/itwinui-react': 3.16.3_psuonouaqi5wuc37nxyknoubym + '@itwin/presentation-components': 5.4.1_c6sfquaec4rzsgis43ur6hv4ui '@itwin/presentation-frontend': 4.7.4_lbci6e5ivpkspr33wpe53pcp5i classnames: 2.5.1 react: 18.3.1 @@ -4228,7 +4289,7 @@ packages: - debug dev: false - /@itwin/tree-widget-react/3.0.1_i672swagn374al3m4ors5guk4q: + /@itwin/tree-widget-react/3.0.1_qmonqnyb76mcc5lxvubqnbx5ki: resolution: {integrity: sha512-FbfrHXfk9e+YqZqRbzTiALufGZaMThcPVz59bvMXIpnvBLPwo+PVtGe1cL9Hq8lY1XaKqPc3sDiXux1kPww5ug==} peerDependencies: '@itwin/appui-abstract': ^4.0.0 @@ -4250,11 +4311,52 @@ packages: '@itwin/ecschema-metadata': 4.7.4_jokiwfzdpldlrb2ppvojwoxovq '@itwin/itwinui-icons-react': 2.8.0_nnrd3gsncyragczmpvfhocinkq '@itwin/itwinui-illustrations-react': 2.1.0_nnrd3gsncyragczmpvfhocinkq - '@itwin/itwinui-react': 2.12.26_nnrd3gsncyragczmpvfhocinkq - '@itwin/presentation-components': 5.4.1_coeiqitrdc3kbyoxwt3ak4fycm + '@itwin/itwinui-react': 3.16.3_psuonouaqi5wuc37nxyknoubym + '@itwin/presentation-components': 5.4.1_vsgychkrhhcqnl34xxqvqnicea + '@itwin/presentation-core-interop': 1.1.1_rll2n26bhzrezeyt23jhdcbtsy + '@itwin/presentation-hierarchies': 1.2.1 + '@itwin/presentation-hierarchies-react': 1.1.1_wrx22x3z54gp6n6sl5xreeqzfy + '@itwin/presentation-shared': 1.1.0 + '@itwin/unified-selection': 1.1.1 + classnames: 2.5.1 + react: 18.3.1 + react-dom: 18.3.1_react@18.3.1 + react-error-boundary: 4.0.13_react@18.3.1 + rxjs: 7.8.1 + transitivePeerDependencies: + - '@itwin/core-bentley' + - '@itwin/core-common' + - '@itwin/core-geometry' + - '@itwin/core-quantity' + dev: false + + /@itwin/tree-widget-react/3.0.1_zup47iojulowp72m2r6fz4nihq: + resolution: {integrity: sha512-FbfrHXfk9e+YqZqRbzTiALufGZaMThcPVz59bvMXIpnvBLPwo+PVtGe1cL9Hq8lY1XaKqPc3sDiXux1kPww5ug==} + peerDependencies: + '@itwin/appui-abstract': ^4.0.0 + '@itwin/appui-react': ^4.10.0 + '@itwin/components-react': ^4.10.0 + '@itwin/core-frontend': ^4.0.0 + '@itwin/core-react': ^4.10.0 + '@itwin/ecschema-metadata': ^4.0.0 + '@itwin/itwinui-react': ^3.11.0 + '@itwin/presentation-components': ^5.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + dependencies: + '@itwin/appui-abstract': 4.7.4_@itwin+core-bentley@4.7.4 + '@itwin/appui-react': 5.0.0_bb3u4xzbep6lfapdosie4rdavm + '@itwin/components-react': 5.0.0_vdvcaslqtdzlaqofn3df2kfe3y + '@itwin/core-frontend': 4.7.4_phc4rse3pm3zzqfro3xbf2awbu + '@itwin/core-react': 5.0.0_bat3aeftvdggsll265mlscthr4 + '@itwin/ecschema-metadata': 4.7.4_jokiwfzdpldlrb2ppvojwoxovq + '@itwin/itwinui-icons-react': 2.8.0_nnrd3gsncyragczmpvfhocinkq + '@itwin/itwinui-illustrations-react': 2.1.0_nnrd3gsncyragczmpvfhocinkq + '@itwin/itwinui-react': 3.16.3_psuonouaqi5wuc37nxyknoubym + '@itwin/presentation-components': 5.4.1_c6sfquaec4rzsgis43ur6hv4ui '@itwin/presentation-core-interop': 1.1.1_rll2n26bhzrezeyt23jhdcbtsy '@itwin/presentation-hierarchies': 1.2.1 - '@itwin/presentation-hierarchies-react': 1.1.1_qnkn5lfpltqtw66hig7mudvuci + '@itwin/presentation-hierarchies-react': 1.1.1_wrx22x3z54gp6n6sl5xreeqzfy '@itwin/presentation-shared': 1.1.0 '@itwin/unified-selection': 1.1.1 classnames: 2.5.1 @@ -4990,6 +5092,7 @@ packages: /@popperjs/core/2.11.8: resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + dev: false /@probe.gl/env/3.6.0: resolution: {integrity: sha512-4tTZYUg/8BICC3Yyb9rOeoKeijKbZHRXBEKObrfPmX4sQmYB15ZOUpoVBhAyJkOYVAM8EkPci6Uw5dLCwx2BEQ==} @@ -5396,7 +5499,6 @@ packages: resolution: {integrity: sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==} dependencies: tslib: 2.6.3 - dev: false /@szmarczak/http-timer/4.0.6: resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} @@ -5404,6 +5506,19 @@ packages: dependencies: defer-to-connect: 2.0.1 + /@tanstack/react-virtual/3.11.2_nnrd3gsncyragczmpvfhocinkq: + resolution: {integrity: sha512-OuFzMXPF4+xZgx8UzJha0AieuMihhhaWG0tCqpp6tDzlFwOmNBPYMuLOtMJ1Tr4pXLHmgjcWhG6RlknY2oNTdQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + dependencies: + '@tanstack/virtual-core': 3.11.2 + react: 18.3.1 + react-dom: 18.3.1_react@18.3.1 + + /@tanstack/virtual-core/3.11.2: + resolution: {integrity: sha512-vTtpNt7mKCiZ1pwU9hfKPhpdVO2sVzFQsxoVBGtOSHxlrRRzYr8iQ2TlwbAcRYCcEiZ9ECAM8kBzH0v2+VzfKw==} + /@testing-library/dom/9.3.4: resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} engines: {node: '>=14'} @@ -5462,6 +5577,7 @@ packages: react: 18.3.1 react-dom: 18.3.1_react@18.3.1 tippy.js: 6.3.7 + dev: false /@tootallnate/once/1.1.2: resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} @@ -5759,6 +5875,7 @@ packages: resolution: {integrity: sha512-ahMp4pmjVlnExxNwxyaDrFgmKxSbPwU23sGQw2gJK4EhCvnvmib2s/O/+y1dfV57dXOwpr2plfyBol+vEHbi2w==} dependencies: '@types/react': 18.3.3 + dev: false /@types/react-transition-group/4.4.10: resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==} @@ -12372,7 +12489,6 @@ packages: dependencies: '@types/react': 18.3.3 react: 18.3.1 - dev: false /js-base64/3.7.7: resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} @@ -16697,7 +16813,6 @@ packages: /tabbable/6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - dev: false /table/6.8.2: resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} @@ -16858,6 +16973,7 @@ packages: resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} dependencies: '@popperjs/core': 2.11.8 + dev: false /tmpl/1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -18297,7 +18413,6 @@ packages: immer: 10.1.1 react: 18.3.1 use-sync-external-store: 1.2.0_react@18.3.1 - dev: true /zwitch/1.0.5: resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} diff --git a/packages/apps/desktop-viewer-test/.env b/packages/apps/desktop-viewer-test/.env index 97aa7319..c819fdff 100644 --- a/packages/apps/desktop-viewer-test/.env +++ b/packages/apps/desktop-viewer-test/.env @@ -13,7 +13,7 @@ GENERATE_SOURCEMAP=false DISABLE_NEW_JSX_TRANSFORM=true # Advanced iModel.js CRA Config: https://github.com/imodeljs/create-react-app/blob/imodeljs/packages/react-scripts/README-imodeljs.md -USE_FAST_SASS=true +USE_FAST_SASS=false USE_FULL_SOURCEMAP=true TRANSPILE_DEPS=false DISABLE_TERSER=true diff --git a/packages/apps/desktop-viewer-test/package.json b/packages/apps/desktop-viewer-test/package.json index 20bfe540..58fbc903 100644 --- a/packages/apps/desktop-viewer-test/package.json +++ b/packages/apps/desktop-viewer-test/package.json @@ -63,7 +63,7 @@ "@itwin/itwinui-illustrations-react": "^2.0.1", "@itwin/itwinui-layouts-css": "^0.2.0", "@itwin/itwinui-layouts-react": "^0.2.0", - "@itwin/itwinui-react": "^2.12.0", + "@itwin/itwinui-react": "^3.16.0", "@itwin/itwinui-variables": "^2.0.0", "@itwin/measure-tools-react": "^0.23.2", "@itwin/presentation-backend": "^4.7.3", diff --git a/packages/apps/web-viewer-test/.env b/packages/apps/web-viewer-test/.env index b1d52891..7ea5009f 100644 --- a/packages/apps/web-viewer-test/.env +++ b/packages/apps/web-viewer-test/.env @@ -27,7 +27,7 @@ IMJS_AUTH_CLIENT_SCOPES ="imodelaccess:read imodels:read realitydata:read" IMJS_ITWIN_STACK_ITWIN_ID="678a34a5-3ed1-412c-a9ba-086dee14d6c2" IMJS_ITWIN_STACK_IMODEL_ID="4dcff98f-8570-497e-b7ce-8df981b5b8c7" -USE_FAST_SASS=true +USE_FAST_SASS=false USE_FULL_SOURCEMAPS=true TRANSPILE_DEPS=false DISABLE_TERSER=true diff --git a/packages/apps/web-viewer-test/package.json b/packages/apps/web-viewer-test/package.json index 79441a4e..c2754888 100644 --- a/packages/apps/web-viewer-test/package.json +++ b/packages/apps/web-viewer-test/package.json @@ -5,10 +5,10 @@ "dependencies": { "@bentley/icons-generic": "^1.0.34", "@itwin/appui-abstract": "^4.7.3", - "@itwin/appui-react": "^4.3.0", + "@itwin/appui-react": "^5.0.0", "@itwin/unified-selection": "^1.1.1", "@itwin/browser-authorization": "^1.0.1", - "@itwin/components-react": "^4.3.0", + "@itwin/components-react": "^5.0.0", "@itwin/core-bentley": "^4.7.3", "@itwin/core-common": "^4.7.3", "@itwin/core-frontend": "^4.7.3", @@ -17,14 +17,14 @@ "@itwin/core-markup": "^4.7.3", "@itwin/core-orbitgt": "^4.7.3", "@itwin/core-quantity": "^4.7.3", - "@itwin/core-react": "^4.3.0", + "@itwin/core-react": "^5.0.0", "@itwin/core-telemetry": "^4.7.3", "@itwin/ecschema-metadata": "^4.7.3", "@itwin/ecschema-rpcinterface-common": "^4.7.3", "@itwin/frontend-devtools": "^4.7.3", - "@itwin/imodel-components-react": "^4.3.0", + "@itwin/imodel-components-react": "^5.0.0", "@itwin/imodels-access-frontend": "^5.2.1", - "@itwin/itwinui-react": "^2.12.0", + "@itwin/itwinui-react": "^3.16.0", "@itwin/measure-tools-react": "^0.23.2", "@itwin/presentation-common": "^4.7.3", "@itwin/presentation-components": "^5.0.0", diff --git a/packages/apps/web-viewer-test/src/components/home/ViewerHome.tsx b/packages/apps/web-viewer-test/src/components/home/ViewerHome.tsx index c9d6e043..2f1e91af 100644 --- a/packages/apps/web-viewer-test/src/components/home/ViewerHome.tsx +++ b/packages/apps/web-viewer-test/src/components/home/ViewerHome.tsx @@ -126,16 +126,6 @@ const ViewerHome: React.FC = () => { }, ]; - const backstageItems2: ViewerBackstageItem[] = [ - { - id: "BS4", - execute: () => console.log("BS1"), - groupPriority: 20, - itemPriority: 100, - label: "BackstageItems 1", - }, - ]; - return (
{ // manifestUrl: "http://localhost:3001/package.json", // }), // ]} - backstageItems={backstageItems2} defaultUiConfig={{ cornerButton: }} // renderSys={{doIdleWork: true}} selectionStorage={unifiedSelectionStorage} diff --git a/packages/apps/web-viewer-test/src/index.tsx b/packages/apps/web-viewer-test/src/index.tsx index 9b31babf..1fe70e29 100644 --- a/packages/apps/web-viewer-test/src/index.tsx +++ b/packages/apps/web-viewer-test/src/index.tsx @@ -4,8 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import "./index.scss"; +import "@itwin/itwinui-react/styles.css"; -import { UiFramework } from "@itwin/appui-react"; +import { ThemeProvider } from "@itwin/itwinui-react"; import React from "react"; import { createRoot } from "react-dom/client"; @@ -16,11 +17,11 @@ globalThis.IMJS_URL_PREFIX = process.env.IMJS_URL_PREFIX || ""; const container = document.getElementById("root"); const root = createRoot(container!); // createRoot(container!) if you use TypeScript -UiFramework.childWindows.useCreateRoot(createRoot); - root.render( - + + + ); diff --git a/packages/modules/desktop-viewer-react/package.json b/packages/modules/desktop-viewer-react/package.json index 17cae7e5..5ced50e4 100644 --- a/packages/modules/desktop-viewer-react/package.json +++ b/packages/modules/desktop-viewer-react/package.json @@ -81,8 +81,8 @@ "@itwin/ecschema-metadata": "^4.0.0", "@itwin/electron-authorization": "^0.13.0 || ^0.14.0 || ^0.15.0", "electron": "^24.0.0", - "react": "^17.0.2 || ^18.0.0", - "react-dom": "^17.0.2 || ^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-redux": "^7.2.0", "redux": "^4.0.5" }, diff --git a/packages/modules/desktop-viewer-react/src/types.ts b/packages/modules/desktop-viewer-react/src/types.ts index 90378160..8e3ebe3d 100644 --- a/packages/modules/desktop-viewer-react/src/types.ts +++ b/packages/modules/desktop-viewer-react/src/types.ts @@ -17,23 +17,28 @@ export type DesktopInitializerParams = ViewerCommonProps & { clientId?: string; }; -type ClientIdProps = { - clientId: string; - iTwinId: string; -} | { - clientId?: string; - iTwinId?: never; -}; +type ClientIdProps = + | { + clientId: string; + iTwinId: string; + } + | { + clientId?: string; + iTwinId?: never; + }; -type ConnectedViewerDesktopProps = ConnectedViewerProps & Required> +type ConnectedViewerDesktopProps = ConnectedViewerProps & + Required>; type BlankViewerDesktopProps = BlankViewerProps & ClientIdProps; -type FileViewerDesktopProps = FileViewerProps & Pick; +type FileViewerDesktopProps = FileViewerProps & + Pick; /** Desktop Viewer can open local (snapshot/briefcase), connected or blank connection models */ -export type DesktopViewerProps = DesktopInitializerParams & XOR< - XOR, - ConnectedViewerDesktopProps ->; +export type DesktopViewerProps = DesktopInitializerParams & + XOR< + XOR, + ConnectedViewerDesktopProps + >; // todo: rm enum in favor of as const export enum ModelStatus { diff --git a/packages/modules/viewer-react/package.json b/packages/modules/viewer-react/package.json index dd4f78b4..681ed5e7 100644 --- a/packages/modules/viewer-react/package.json +++ b/packages/modules/viewer-react/package.json @@ -35,7 +35,7 @@ "@itwin/presentation-core-interop": "^1.0.0", "@itwin/presentation-shared": "^1.0.0", "@itwin/itwinui-illustrations-react": "^2.0.1", - "@itwin/itwinui-react": "^2.6.0", + "@itwin/itwinui-react": "^3.16.0", "@itwin/reality-data-client": "^1.0.0", "@itwin/unified-selection": "^1.0.0", "lodash.isequal": "^4.5.0" @@ -100,8 +100,8 @@ "@itwin/presentation-common": "^4.0.0", "@itwin/presentation-components": "^4.0.0 || ^5.0.0", "@itwin/presentation-frontend": "^4.0.0", - "react": "^17.0.2 || ^18.0.0", - "react-dom": "^17.0.2 || ^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-redux": "^7.2.0", "redux": "^4.0.5" }, @@ -145,6 +145,9 @@ "project": [ "./tsconfig.json" ] - } + }, + "ignorePatterns": [ + "tests/" + ] } } diff --git a/packages/modules/viewer-react/src/components/BaseViewer.tsx b/packages/modules/viewer-react/src/components/BaseViewer.tsx index e126b041..42a04b82 100644 --- a/packages/modules/viewer-react/src/components/BaseViewer.tsx +++ b/packages/modules/viewer-react/src/components/BaseViewer.tsx @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IModelApp } from "@itwin/core-frontend"; -import { FillCentered } from "@itwin/core-react"; +import { Flex } from "@itwin/itwinui-react"; import React from "react"; import { useAccessToken } from "../hooks/useAccessToken"; @@ -39,18 +39,18 @@ export const BaseViewer = ({ viewerInitialized ? ( ) : ( - + {IModelApp.localization.getLocalizedString( "iTwinViewer:baseViewerInitializer.baseViewerInitializing" )} - + ) ) : ( - + {IModelApp.localization.getLocalizedString( "iTwinViewer:baseViewerInitializer.validTokenNeeded" )} - + )} ); diff --git a/packages/modules/viewer-react/src/components/app-ui/providers/BackstageItemsProvider.ts b/packages/modules/viewer-react/src/components/app-ui/providers/BackstageItemsProvider.ts index f5c9e668..572c8706 100644 --- a/packages/modules/viewer-react/src/components/app-ui/providers/BackstageItemsProvider.ts +++ b/packages/modules/viewer-react/src/components/app-ui/providers/BackstageItemsProvider.ts @@ -13,38 +13,42 @@ import { IModelApp } from "@itwin/core-frontend"; import type { ViewerBackstageItem } from "../../../types"; +// todo remove icon in favor of iconNode export class BackstageItemsProvider implements UiItemsProvider { - constructor(private _backstageItems: ViewerBackstageItem[], public readonly id = "iTwinViewer.BackstageItemsProvider") { } + constructor( + private _backstageItems: ViewerBackstageItem[], + public readonly id = "iTwinViewer.BackstageItemsProvider" + ) {} - public provideBackstageItems() { + public getBackstageItems() { const allBackstageItems: ViewerBackstageItem[] = []; this._backstageItems.forEach((backstageItem) => { // check for label i18n key and translate if needed if (backstageItem.labeli18nKey) { let newItem; if ((backstageItem as BackstageStageLauncher).stageId) { - newItem = BackstageItemUtilities.createStageLauncher( - (backstageItem as BackstageStageLauncher).stageId, - backstageItem.groupPriority, - backstageItem.itemPriority, - IModelApp.localization.getLocalizedString( + newItem = BackstageItemUtilities.createStageLauncher({ + stageId: (backstageItem as BackstageStageLauncher).stageId, + groupPriority: backstageItem.groupPriority, + itemPriority: backstageItem.itemPriority, + label: IModelApp.localization.getLocalizedString( backstageItem.labeli18nKey ), - backstageItem.subtitle?.toString(), - backstageItem.icon?.toString() - ); + subtitle: backstageItem.subtitle?.toString(), + icon: backstageItem.icon?.toString(), // eslint-disable-line deprecation/deprecation + }); } else { - newItem = BackstageItemUtilities.createActionItem( - backstageItem.id, - backstageItem.groupPriority, - backstageItem.itemPriority, - (backstageItem as BackstageActionItem).execute, - IModelApp.localization.getLocalizedString( + newItem = BackstageItemUtilities.createActionItem({ + id: backstageItem.id, + groupPriority: backstageItem.groupPriority, + itemPriority: backstageItem.itemPriority, + execute: (backstageItem as BackstageActionItem).execute, + label: IModelApp.localization.getLocalizedString( backstageItem.labeli18nKey ), - backstageItem.subtitle?.toString(), - backstageItem.icon?.toString() - ); + subtitle: backstageItem.subtitle?.toString(), + icon: backstageItem.icon?.toString(), // eslint-disable-line deprecation/deprecation + }); } allBackstageItems.push(newItem); } else { diff --git a/packages/modules/viewer-react/src/components/app-ui/providers/DefaultContentGroupProvider.ts b/packages/modules/viewer-react/src/components/app-ui/providers/DefaultContentGroupProvider.ts deleted file mode 100644 index 1a38f808..00000000 --- a/packages/modules/viewer-react/src/components/app-ui/providers/DefaultContentGroupProvider.ts +++ /dev/null @@ -1,72 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Bentley Systems, Incorporated. All rights reserved. - * See LICENSE.md in the project root for license terms and full copyright notice. - *--------------------------------------------------------------------------------------------*/ - -import { StandardContentLayouts } from "@itwin/appui-abstract"; -import type { FrontstageConfig } from "@itwin/appui-react"; -import { - ContentGroup, - ContentGroupProvider, - IModelViewportControl, - UiFramework, -} from "@itwin/appui-react"; - -import { getAndSetViewState } from "../../../services/iModel"; -import type { - BlankConnectionViewState, - ViewerViewCreator3dOptions, - ViewerViewportControlOptions, -} from "../../../types"; -import { UnifiedSelectionViewportControl } from "./UnifiedSelectionViewportControl"; - -/** - * Provide a default content group to the default frontstage - */ -export class DefaultContentGroupProvider extends ContentGroupProvider { - private _viewportOptions: ViewerViewportControlOptions | undefined; - private _blankConnectionViewState: BlankConnectionViewState | undefined; - private _viewCreatorOptions: ViewerViewCreator3dOptions | undefined; - private _syncWithUnifiedSelectionStorage: boolean | undefined; - - constructor( - viewportOptions?: ViewerViewportControlOptions, - viewCreatorOptions?: ViewerViewCreator3dOptions, - blankConnectionViewStateOptions?: BlankConnectionViewState, - syncWithUnifiedSelectionStorage?: boolean, - ) { - super(); - this._viewportOptions = viewportOptions; - this._blankConnectionViewState = blankConnectionViewStateOptions; - this._viewCreatorOptions = viewCreatorOptions; - this._syncWithUnifiedSelectionStorage = syncWithUnifiedSelectionStorage; - } - - public async contentGroup(_config: FrontstageConfig): Promise { - const iModelConnection = UiFramework.getIModelConnection(); - let viewState; - if (iModelConnection) { - viewState = await getAndSetViewState( - iModelConnection, - this._viewportOptions, - this._viewCreatorOptions, - this._blankConnectionViewState - ); - } - return new ContentGroup({ - id: "iTwinViewer.default-content-group", - layout: StandardContentLayouts.singleView, - contents: [ - { - id: "iTwinViewer.UnifiedSelectionViewport", - classId: this._syncWithUnifiedSelectionStorage ? IModelViewportControl : UnifiedSelectionViewportControl, - applicationData: { - ...this._viewportOptions, - viewState, - iModelConnection, - }, - }, - ], - }); - } -} diff --git a/packages/modules/viewer-react/src/components/app-ui/providers/DefaultContentGroupProvider.tsx b/packages/modules/viewer-react/src/components/app-ui/providers/DefaultContentGroupProvider.tsx new file mode 100644 index 00000000..c2e9ee57 --- /dev/null +++ b/packages/modules/viewer-react/src/components/app-ui/providers/DefaultContentGroupProvider.tsx @@ -0,0 +1,101 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Bentley Systems, Incorporated. All rights reserved. + * See LICENSE.md in the project root for license terms and full copyright notice. + *--------------------------------------------------------------------------------------------*/ + +import { StandardContentLayouts } from "@itwin/appui-abstract"; +import type { FrontstageConfig } from "@itwin/appui-react"; +import { + ContentGroup, + ContentGroupProvider, + IModelViewportControl, + UiFramework, +} from "@itwin/appui-react"; +import { ScreenViewport } from "@itwin/core-frontend"; +import React from "react"; + +import { getAndSetViewState } from "../../../services/iModel"; +import type { + BlankConnectionViewState, + ViewerViewCreator3dOptions, + ViewerViewportControlOptions, +} from "../../../types"; +import { + UnifiedSelectionViewport, + UnifiedSelectionViewportControl, +} from "./UnifiedSelectionViewportControl"; + +/** + * Provide a default content group to the default frontstage + */ +export class DefaultContentGroupProvider extends ContentGroupProvider { + private _viewportOptions: ViewerViewportControlOptions | undefined; + private _blankConnectionViewState: BlankConnectionViewState | undefined; + private _viewCreatorOptions: ViewerViewCreator3dOptions | undefined; + // private _syncWithUnifiedSelectionStorage: boolean | undefined; + + constructor( + viewportOptions?: ViewerViewportControlOptions, + viewCreatorOptions?: ViewerViewCreator3dOptions, + blankConnectionViewStateOptions?: BlankConnectionViewState + // syncWithUnifiedSelectionStorage?: boolean + ) { + super(); + this._viewportOptions = viewportOptions; + this._blankConnectionViewState = blankConnectionViewStateOptions; + this._viewCreatorOptions = viewCreatorOptions; + // this._syncWithUnifiedSelectionStorage = syncWithUnifiedSelectionStorage; + } + + public async contentGroup(): Promise { + const iModelConnection = UiFramework.getIModelConnection(); + if (!iModelConnection) { + throw "Never expected to get here without an iModelConnection"; + } + + const viewState = await getAndSetViewState( + iModelConnection, + this._viewportOptions, + this._viewCreatorOptions, + this._blankConnectionViewState + ); + + return new ContentGroup({ + id: "iTwinViewer.default-content-group", + layout: StandardContentLayouts.singleView, + contents: [ + { + id: "iTwinViewer.UnifiedSelectionViewport", + classId: "", + // content: , + // classId: UnifiedSelectionViewportControl, + // applicationData: { + // ...this._viewportOptions, + // viewState, + // iModelConnection, + // }, + content: ( + { + // // this.viewport = v; + // // for convenience, if window defined bind viewport to window + // if (undefined !== window) { + // (window as any).viewport = v; + // } + // if (!UiFramework.frontstages.isLoading) { + // UiFramework.frontstages.activeFrontstageDef?.setActiveViewFromViewport( + // v + // ); + // } + // }} + // getViewOverlay={this._getViewOverlay} + /> + ), + }, + ], + }); + } +} diff --git a/packages/modules/viewer-react/src/components/app-ui/providers/UnifiedSelectionViewportControl.tsx b/packages/modules/viewer-react/src/components/app-ui/providers/UnifiedSelectionViewportControl.tsx index 9645e7ac..289c53e8 100644 --- a/packages/modules/viewer-react/src/components/app-ui/providers/UnifiedSelectionViewportControl.tsx +++ b/packages/modules/viewer-react/src/components/app-ui/providers/UnifiedSelectionViewportControl.tsx @@ -14,36 +14,40 @@ import { ViewportComponent } from "@itwin/imodel-components-react"; import { viewWithUnifiedSelection } from "@itwin/presentation-components"; import * as React from "react"; -const UnifiedSelectionViewport = viewWithUnifiedSelection(ViewportComponent); +// todo figure out what to do with this class + +export const UnifiedSelectionViewport = + viewWithUnifiedSelection(ViewportComponent); /** @internal fork of IModelViewportControl from AppUI, to provide Unified Selection * https://github.com/iTwin/appui/blob/master/ui/appui-react/src/appui-react/content/IModelViewport.tsx */ +// eslint-disable-next-line deprecation/deprecation export class UnifiedSelectionViewportControl extends IModelViewportControl { public static override get id() { return "iTwinViewer.UnifiedSelectionViewportControl"; } - /** Get the React component that will contain the Viewport */ - protected override getImodelConnectedViewportReactElement(): React.ReactNode { - return ( - { - this.viewport = v; - // for convenience, if window defined bind viewport to window - if (undefined !== window) { - (window as any).viewport = v; - } - if (!UiFramework.frontstages.isLoading) { - UiFramework.frontstages.activeFrontstageDef?.setActiveViewFromViewport( - v - ); - } - }} - getViewOverlay={this._getViewOverlay} - /> - ); - } + // /** Get the React component that will contain the Viewport */ + // protected override getImodelConnectedViewportReactElement(): React.ReactNode { + // return ( + // { + // this.viewport = v; + // // for convenience, if window defined bind viewport to window + // if (undefined !== window) { + // (window as any).viewport = v; + // } + // if (!UiFramework.frontstages.isLoading) { + // UiFramework.frontstages.activeFrontstageDef?.setActiveViewFromViewport( + // v + // ); + // } + // }} + // getViewOverlay={this._getViewOverlay} + // /> + // ); + // } protected override getImodelViewportReactElement( iModelConnection: IModelConnection, @@ -61,6 +65,7 @@ export class UnifiedSelectionViewportControl extends IModelViewportControl { (window as any).viewport = v; } if (!UiFramework.frontstages.isLoading) { + // eslint-disable-next-line deprecation/deprecation UiFramework.frontstages.activeFrontstageDef?.setActiveViewFromViewport( v ); diff --git a/packages/modules/viewer-react/src/components/app-ui/providers/ViewerContentToolsProvider.tsx b/packages/modules/viewer-react/src/components/app-ui/providers/ViewerContentToolsProvider.tsx index 806a54fb..93d7d62a 100644 --- a/packages/modules/viewer-react/src/components/app-ui/providers/ViewerContentToolsProvider.tsx +++ b/packages/modules/viewer-react/src/components/app-ui/providers/ViewerContentToolsProvider.tsx @@ -6,15 +6,15 @@ import type { DefaultContentTools, StatusBarItem } from "@itwin/appui-react"; import { SectionsStatusField, - StandardContentToolsProvider, + StandardContentToolsUiItemsProvider, StatusBarItemUtilities, StatusBarSection, } from "@itwin/appui-react"; import * as React from "react"; -export class ViewerContentToolsProvider extends StandardContentToolsProvider { +export class ViewerContentToolsProvider extends StandardContentToolsUiItemsProvider { constructor(private _defaultItems?: DefaultContentTools) { - super("ViewerDefaultContentTools", { + super({ horizontal: { clearSelection: true, clearDisplayOverrides: true, @@ -32,6 +32,10 @@ export class ViewerContentToolsProvider extends StandardContentToolsProvider { }); } + public override get id(): string { + return "ViewerContentToolsProvider"; + } + // need to override this method to move sectioning "clear" tool to its proper position on the left public override provideStatusBarItems(): StatusBarItem[] { const statusBarItems: StatusBarItem[] = []; @@ -42,12 +46,12 @@ export class ViewerContentToolsProvider extends StandardContentToolsProvider { this._defaultItems.vertical.sectionGroup ) { statusBarItems.push( - StatusBarItemUtilities.createCustomItem( - "Sections", - StatusBarSection.Left, - 30, - - ) + StatusBarItemUtilities.createCustomItem({ + id: "Sections", + section: StatusBarSection.Left, + itemPriority: 30, + content: , + }) ); } diff --git a/packages/modules/viewer-react/src/components/app-ui/providers/ViewerNavigationToolsProvider.tsx b/packages/modules/viewer-react/src/components/app-ui/providers/ViewerNavigationToolsProvider.tsx index da4836e5..fcd41f91 100644 --- a/packages/modules/viewer-react/src/components/app-ui/providers/ViewerNavigationToolsProvider.tsx +++ b/packages/modules/viewer-react/src/components/app-ui/providers/ViewerNavigationToolsProvider.tsx @@ -7,12 +7,12 @@ import type { DefaultNavigationTools, ToolbarItem } from "@itwin/appui-react"; import { ToolbarOrientation, ToolbarUsage } from "@itwin/appui-react"; import { CoreTools } from "@itwin/appui-react"; import { ToolbarHelper, ToolItemDef } from "@itwin/appui-react"; -import { StandardNavigationToolsProvider } from "@itwin/appui-react"; +import { StandardNavigationToolsUiItemsProvider } from "@itwin/appui-react"; import { IModelApp } from "@itwin/core-frontend"; -export class ViewerNavigationToolsProvider extends StandardNavigationToolsProvider { +export class ViewerNavigationToolsProvider extends StandardNavigationToolsUiItemsProvider { constructor(private defaultItems?: DefaultNavigationTools) { - super("ViewerDefaultNavigationTools", { + super({ horizontal: { fitView: true, panView: true, @@ -29,122 +29,12 @@ export class ViewerNavigationToolsProvider extends StandardNavigationToolsProvid }); } - public override provideToolbarItemsInternal( - _stageId: string, - _stageUsage: string, - toolbarUsage: ToolbarUsage, - toolbarOrientation: ToolbarOrientation - ): ToolbarItem[] { - const items: ToolbarItem[] = []; + override get id(): string { + return "ViewerDefaultNavigationTools"; + } - if ( - toolbarUsage === ToolbarUsage.ViewNavigation && - toolbarOrientation === ToolbarOrientation.Horizontal - ) { - if ( - !this.defaultItems || - !this.defaultItems.horizontal || - this.defaultItems.horizontal.rotateView - ) { - items.push( - ToolbarHelper.createToolbarItemFromItemDef( - 10, - CoreTools.rotateViewCommand - ) - ); - } - if ( - !this.defaultItems || - !this.defaultItems.horizontal || - this.defaultItems.horizontal.panView - ) { - items.push( - ToolbarHelper.createToolbarItemFromItemDef( - 20, - CoreTools.panViewCommand - ) - ); - } - if ( - !this.defaultItems || - !this.defaultItems.horizontal || - this.defaultItems.horizontal.fitView - ) { - items.push( - ToolbarHelper.createToolbarItemFromItemDef( - 30, - CoreTools.fitViewCommand - ) - ); - } - if ( - !this.defaultItems || - !this.defaultItems.horizontal || - this.defaultItems.horizontal.windowArea - ) { - items.push( - ToolbarHelper.createToolbarItemFromItemDef( - 40, - CoreTools.windowAreaCommand - ) - ); - } - if ( - !this.defaultItems || - !this.defaultItems.horizontal || - this.defaultItems.horizontal.viewUndoRedo - ) { - items.push( - ToolbarHelper.createToolbarItemFromItemDef( - 50, - CoreTools.viewUndoCommand - ) - ); - items.push( - ToolbarHelper.createToolbarItemFromItemDef( - 60, - CoreTools.viewRedoCommand - ) - ); - } - } else if ( - toolbarUsage === ToolbarUsage.ViewNavigation && - toolbarOrientation === ToolbarOrientation.Vertical - ) { - if ( - !this.defaultItems || - !this.defaultItems.vertical || - this.defaultItems.vertical.walk - ) { - items.push( - ToolbarHelper.createToolbarItemFromItemDef( - 10, - new ToolItemDef({ - toolId: "View.LookAndMove", - iconSpec: "icon-walk", - execute: () => - IModelApp.tools.run( - "View.LookAndMove", - IModelApp.viewManager.selectedView - ), - labelKey: "iTwinViewer:tools.walkTool", - }) - ) - ); - } - if ( - !this.defaultItems || - !this.defaultItems.vertical || - this.defaultItems.vertical.toggleCamera - ) { - items.push( - ToolbarHelper.createToolbarItemFromItemDef( - 20, - CoreTools.toggleCameraViewCommand - ) - ); - } - } - return items; + // todo replace walk view tool with look and move tool + override getToolbarItems(): readonly ToolbarItem[] { + return super.getToolbarItems(); } } diff --git a/packages/modules/viewer-react/src/components/app-ui/providers/ViewerStatusbarItemsProvider.tsx b/packages/modules/viewer-react/src/components/app-ui/providers/ViewerStatusbarItemsProvider.tsx index 08246d33..3561fbd0 100644 --- a/packages/modules/viewer-react/src/components/app-ui/providers/ViewerStatusbarItemsProvider.tsx +++ b/packages/modules/viewer-react/src/components/app-ui/providers/ViewerStatusbarItemsProvider.tsx @@ -32,62 +32,62 @@ export class ViewerStatusbarItemsProvider implements UiItemsProvider { if (!this._defaultItems || this._defaultItems.messageCenter) { items.push( - StatusBarItemUtilities.createCustomItem( - "MessageCenter", - StatusBarSection.Left, - 10, - - ) + StatusBarItemUtilities.createCustomItem({ + id: "MessageCenter", + section: StatusBarSection.Left, + itemPriority: 10, + content: , + }) ); } if (!this._defaultItems || this._defaultItems.toolAssistance) { items.push( - StatusBarItemUtilities.createCustomItem( - "ToolAssistance", - StatusBarSection.Left, - 20, - - ) + StatusBarItemUtilities.createCustomItem({ + id: "ToolAssistance", + section: StatusBarSection.Left, + itemPriority: 20, + content: , + }) ); } if (!this._defaultItems || this._defaultItems.tileLoadIndicator) { items.push( - StatusBarItemUtilities.createCustomItem( - "TileLoadIndicator", - StatusBarSection.Right, - 10, - - ) + StatusBarItemUtilities.createCustomItem({ + id: "TileLoadIndicator", + section: StatusBarSection.Right, + itemPriority: 10, + content: , + }) ); } if (!this._defaultItems || this._defaultItems.accuSnapModePicker) { items.push( - StatusBarItemUtilities.createCustomItem( - "SnapModeField", - StatusBarSection.Right, - 20, - - ) + StatusBarItemUtilities.createCustomItem({ + id: "SnapModeField", + section: StatusBarSection.Right, + itemPriority: 20, + content: , + }) ); } if (!this._defaultItems || this._defaultItems.selectionScope) { items.push( - StatusBarItemUtilities.createCustomItem( - "SelectionScope", - StatusBarSection.Right, - 30, - - ) + StatusBarItemUtilities.createCustomItem({ + id: "SelectionScope", + section: StatusBarSection.Right, + itemPriority: 30, + content: , + }) ); } if (!this._defaultItems || this._defaultItems.selectionInfo) { items.push( - StatusBarItemUtilities.createCustomItem( - "SelectionInfo", - StatusBarSection.Right, - 40, - - ) + StatusBarItemUtilities.createCustomItem({ + id: "SelectionInfo", + section: StatusBarSection.Right, + itemPriority: 40, + content: , // eslint-disable-line deprecation/deprecation + }) ); } diff --git a/packages/modules/viewer-react/src/components/error/ErrorBoundary.tsx b/packages/modules/viewer-react/src/components/error/ErrorBoundary.tsx index 7d3fa919..b211225c 100644 --- a/packages/modules/viewer-react/src/components/error/ErrorBoundary.tsx +++ b/packages/modules/viewer-react/src/components/error/ErrorBoundary.tsx @@ -29,7 +29,7 @@ export class ErrorBoundary extends Component< }; } - override render(): JSX.Element { + override render() { if (this.state.fallback) { return ( } heading={this.state.error.message} /> diff --git a/packages/modules/viewer-react/src/components/iModel/IModelLoader.tsx b/packages/modules/viewer-react/src/components/iModel/IModelLoader.tsx index 161740f3..82698185 100644 --- a/packages/modules/viewer-react/src/components/iModel/IModelLoader.tsx +++ b/packages/modules/viewer-react/src/components/iModel/IModelLoader.tsx @@ -19,7 +19,8 @@ import { Presentation } from "@itwin/presentation-frontend"; import React, { useEffect, useMemo, useState } from "react"; import { Provider } from "react-redux"; -import { useFrontstages, useTheme, useUiProviders } from "../../hooks"; +import { useFrontstages, useUiProviders } from "../../hooks"; +import { useUnifiedSelectionSync } from "../../hooks/useUnifiedSelectionSync"; import { gatherRequiredViewerProps, getAndSetViewState, @@ -29,7 +30,6 @@ import { ViewerPerformance } from "../../services/telemetry"; import type { ModelLoaderProps } from "../../types"; import { BackstageItemsProvider } from "../app-ui/providers"; import { IModelViewer } from "./IModelViewer"; -import { useUnifiedSelectionSync } from "../../hooks/useUnifiedSelectionSync"; const IModelLoader = React.memo((viewerProps: ModelLoaderProps) => { const { @@ -40,23 +40,26 @@ const IModelLoader = React.memo((viewerProps: ModelLoaderProps) => { blankConnectionViewState, uiProviders, theme, - backstageItems, // eslint-disable-line deprecation/deprecation loadingComponent, selectionStorage, getSchemaContext, } = viewerProps; const { error, connection } = useConnection(viewerProps); - const providers = useMemo(() => { - const providers = [...(uiProviders || [])]; - if (backstageItems?.length) { - providers.push(new BackstageItemsProvider(backstageItems)); - } - return providers; - }, [uiProviders, backstageItems]); - - useUiProviders(providers); - useUnifiedSelectionSync({ iModelConnection: connection, selectionStorage, getSchemaContext }) + // const providers = useMemo(() => { + // const providers = [...(uiProviders || [])]; + // if (backstageItems?.length) { + // providers.push(new BackstageItemsProvider(backstageItems)); + // } + // return providers; + // }, [uiProviders, backstageItems]); + + useUiProviders(uiProviders); + useUnifiedSelectionSync({ + iModelConnection: connection, + selectionStorage, + getSchemaContext, + }); const { finalFrontstages, noConnectionRequired, customDefaultFrontstage } = useFrontstages({ @@ -65,11 +68,9 @@ const IModelLoader = React.memo((viewerProps: ModelLoaderProps) => { viewportOptions, viewCreatorOptions, blankConnectionViewState, - syncWithUnifiedSelectionStorage: !!selectionStorage, + // syncWithUnifiedSelectionStorage: !!selectionStorage, }); - useTheme(theme); - useEffect(() => { if (customDefaultFrontstage && connection) { // there is a custom default frontstage so we need to generate a viewstate for backwards compatibility @@ -96,12 +97,10 @@ const IModelLoader = React.memo((viewerProps: ModelLoaderProps) => {
{finalFrontstages && (connection || noConnectionRequired) && - StateManager.store ? ( + StateManager.store ? ( //eslint-disable-line deprecation/deprecation + //eslint-disable-next-line deprecation/deprecation - + ) : (
@@ -219,7 +218,9 @@ async function syncSelectionScopeList(iModelConnection: IModelConnection) { try { const availableScopes = await Presentation.selection.scopes.getSelectionScopes(iModelConnection); + // eslint-disable-next-line deprecation/deprecation UiFramework.dispatchActionToStore( + // eslint-disable-next-line deprecation/deprecation SessionStateActionId.SetAvailableSelectionScopes, availableScopes ); diff --git a/packages/modules/viewer-react/src/components/iModel/IModelViewer.tsx b/packages/modules/viewer-react/src/components/iModel/IModelViewer.tsx index 7d6f5b04..d34f026d 100644 --- a/packages/modules/viewer-react/src/components/iModel/IModelViewer.tsx +++ b/packages/modules/viewer-react/src/components/iModel/IModelViewer.tsx @@ -7,6 +7,7 @@ import type { BackstageItem, FrontstageDef, FrontstageProvider, + ThemeId, } from "@itwin/appui-react"; import { UiFramework, UiItemsManager } from "@itwin/appui-react"; import { @@ -19,7 +20,7 @@ import React, { useEffect, useState } from "react"; import type { ViewerFrontstage } from "../../types"; interface ModelProps { frontstages: ViewerFrontstage[]; - backstageItems?: BackstageItem[]; // TODO next remove this and just use the UiItemsManager to get the items in the next major version + theme?: ThemeId; } /* @@ -30,6 +31,7 @@ the issue is no longer occuring. */ export const IModelViewer: React.FC = ({ frontstages, + theme, }: ModelProps) => { const [defaultFrontstageDef, setDefaultFrontstageDef] = useState(); @@ -41,10 +43,10 @@ export const IModelViewer: React.FC = ({ }, [defaultFrontstageDef]); useEffect(() => { - let defaultFrontstage: FrontstageProvider | undefined; + let defaultFrontstage: FrontstageProvider | undefined; // eslint-disable-line deprecation/deprecation frontstages.forEach((viewerFrontstage) => { // register the provider - UiFramework.frontstages.addFrontstageProvider(viewerFrontstage.provider); + UiFramework.frontstages.addFrontstageProvider(viewerFrontstage.provider); // eslint-disable-line deprecation/deprecation // override the default (last wins) if (viewerFrontstage.default) { defaultFrontstage = viewerFrontstage.provider; @@ -62,16 +64,14 @@ export const IModelViewer: React.FC = ({ } return () => { - UiFramework.frontstages.clearFrontstageProviders(); + UiFramework.frontstages.clearFrontstageProviders(); // eslint-disable-line deprecation/deprecation }; }, [frontstages]); // there will always be at least one (for the default frontstage). Wait for it to be loaded into the list before rendering the content return ( - - } - /> + + } /> ); }; diff --git a/packages/modules/viewer-react/src/hooks/index.ts b/packages/modules/viewer-react/src/hooks/index.ts index 5b7e2c0c..a04f24e8 100644 --- a/packages/modules/viewer-react/src/hooks/index.ts +++ b/packages/modules/viewer-react/src/hooks/index.ts @@ -3,7 +3,6 @@ * See LICENSE.md in the project root for license terms and full copyright notice. *--------------------------------------------------------------------------------------------*/ -export * from "./useTheme"; export * from "./useUiProviders"; export * from "./useIsMounted"; export * from "./useBaseViewerInitializer"; diff --git a/packages/modules/viewer-react/src/hooks/useBaseViewerInitializer.tsx b/packages/modules/viewer-react/src/hooks/useBaseViewerInitializer.tsx index 2d86139c..c183415a 100644 --- a/packages/modules/viewer-react/src/hooks/useBaseViewerInitializer.tsx +++ b/packages/modules/viewer-react/src/hooks/useBaseViewerInitializer.tsx @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import { useEffect, useMemo, useState } from "react"; + import { BaseInitializer } from "../services/BaseInitializer"; +import type { ViewerCommonProps, ViewerInitializerParams } from "../types"; import { getInitializationOptions, isEqual } from "../utilities"; import { useIsMounted } from "./useIsMounted"; -import type { ViewerCommonProps, ViewerInitializerParams } from "../types"; - export const useBaseViewerInitializer = ( options?: ViewerCommonProps, delay?: boolean @@ -48,7 +48,9 @@ export const useBaseViewerInitializer = ( return baseViewerInitialized; }; -function overridePresentationProps(inputProps: ViewerCommonProps | undefined): ViewerInitializerParams | undefined { +function overridePresentationProps( + inputProps: ViewerCommonProps | undefined +): ViewerInitializerParams | undefined { return inputProps ? { ...inputProps, diff --git a/packages/modules/viewer-react/src/hooks/useFrontstages.tsx b/packages/modules/viewer-react/src/hooks/useFrontstages.tsx index 9f9a7f7c..7f2aa3f3 100644 --- a/packages/modules/viewer-react/src/hooks/useFrontstages.tsx +++ b/packages/modules/viewer-react/src/hooks/useFrontstages.tsx @@ -3,7 +3,12 @@ * See LICENSE.md in the project root for license terms and full copyright notice. *--------------------------------------------------------------------------------------------*/ -import { BackstageAppButton, StageUsage, StandardFrontstageProvider, UiItemsManager } from "@itwin/appui-react"; +import { + BackstageAppButton, + StageUsage, + StandardFrontstageProvider, + UiItemsManager, +} from "@itwin/appui-react"; import React, { useEffect, useState } from "react"; import { DefaultContentGroupProvider } from "../components/app-ui/providers"; @@ -21,7 +26,7 @@ export interface UseFrontstagesProps { viewportOptions?: ViewerViewportControlOptions; viewCreatorOptions?: ViewerViewCreator3dOptions; blankConnectionViewState?: BlankConnectionViewState; - syncWithUnifiedSelectionStorage?: boolean; + // syncWithUnifiedSelectionStorage?: boolean; } export const ViewerDefaultFrontstageProviderId = @@ -33,8 +38,8 @@ export const useFrontstages = ({ defaultUiConfig, viewCreatorOptions, viewportOptions, - syncWithUnifiedSelectionStorage, -}: UseFrontstagesProps) => { +}: // syncWithUnifiedSelectionStorage, +UseFrontstagesProps) => { const [finalFrontstages, setFinalFrontstages] = useState(); const [noConnectionRequired, setNoConnectionRequired] = @@ -42,7 +47,6 @@ export const useFrontstages = ({ const [customDefaultFrontstage, setCustomDefaultFrontstage] = useState(false); - useEffect(() => { let allFrontstages: ViewerFrontstage[] = []; let defaultExists = false; @@ -72,15 +76,18 @@ export const useFrontstages = ({ const contentGroup = new DefaultContentGroupProvider( viewportOptions, viewCreatorOptions, - blankConnectionViewState, - syncWithUnifiedSelectionStorage, + blankConnectionViewState + // syncWithUnifiedSelectionStorage ); + //eslint-disable-next-line deprecation/deprecation const defaultFrontstageProvider = new StandardFrontstageProvider({ id: ViewerDefaultFrontstageProviderId, usage: StageUsage.General, contentGroupProps: contentGroup, - cornerButton: UiItemsManager.getBackstageItems().length ? : undefined, + cornerButton: UiItemsManager.getBackstageItems().length ? ( + + ) : undefined, ...defaultUiConfig, }); diff --git a/packages/modules/viewer-react/src/hooks/useTheme.tsx b/packages/modules/viewer-react/src/hooks/useTheme.tsx deleted file mode 100644 index 266fd7b3..00000000 --- a/packages/modules/viewer-react/src/hooks/useTheme.tsx +++ /dev/null @@ -1,17 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Bentley Systems, Incorporated. All rights reserved. - * See LICENSE.md in the project root for license terms and full copyright notice. - *--------------------------------------------------------------------------------------------*/ - -import type { ColorTheme } from "@itwin/appui-react"; -import { UiFramework } from "@itwin/appui-react"; -import { useEffect } from "react"; - -export function useTheme(theme?: ColorTheme | string): void { - useEffect(() => { - if (theme) { - // use the provided theme - UiFramework.setColorTheme(theme); - } - }, [theme]); -} diff --git a/packages/modules/viewer-react/src/services/BaseInitializer.ts b/packages/modules/viewer-react/src/services/BaseInitializer.ts index 91637e7b..129fa212 100644 --- a/packages/modules/viewer-react/src/services/BaseInitializer.ts +++ b/packages/modules/viewer-react/src/services/BaseInitializer.ts @@ -46,22 +46,25 @@ const syncSelectionCount = () => { const selection = provider.getSelection(args.imodel, args.level); const numSelected = getInstancesCount(selection); + //eslint-disable-next-line deprecation/deprecation UiFramework.dispatchActionToStore( - SessionStateActionId.SetNumItemsSelected, + SessionStateActionId.SetNumItemsSelected, //eslint-disable-line deprecation/deprecation numSelected ); // NOTE: add an event listener to the iModelConnection.selectionSet.onChanged to restore the numSelected to the value that we // extracted from the Presentation.selection.selectionChange event in order to override the numSelected AppUi sets from // the iModelConnection.selectionSet.onChanged that will treat assemblies as a collection of elements instead of a single one - removeListenerFunc = UiFramework.getIModelConnection()?.selectionSet.onChanged.addListener( - (_ev) => { - UiFramework.dispatchActionToStore( - SessionStateActionId.SetNumItemsSelected, - numSelected - ); - } - ); + removeListenerFunc = + UiFramework.getIModelConnection()?.selectionSet.onChanged.addListener( + (_ev) => { + //eslint-disable-next-line deprecation/deprecation + UiFramework.dispatchActionToStore( + SessionStateActionId.SetNumItemsSelected, //eslint-disable-line deprecation/deprecation + numSelected + ); + } + ); } ); }; @@ -71,14 +74,15 @@ const syncActiveSelectionScope = () => { // If the user doesn't set any active scope and uses the default scope, then the Presentation active scope would be undefined. // Thus, we have to sync it for the first time here. Presentation.selection.scopes.activeScope = - UiFramework.getActiveSelectionScope(); - + UiFramework.getActiveSelectionScope(); //eslint-disable-line deprecation/deprecation + //eslint-disable-next-line deprecation/deprecation SyncUiEventDispatcher.onSyncUiEvent.addListener((args: UiSyncEventArgs) => { + //eslint-disable-next-line deprecation/deprecation if (args.eventIds.has(SessionStateActionId.SetSelectionScope)) { // After 4.x the AppUI no longer has a presentation dep and therefore we have the responsibility of // syncing the Presentation.selection.scopes.activeScope with the AppUi's UiSyncEvent for SetSelectionScope Presentation.selection.scopes.activeScope = - UiFramework.getActiveSelectionScope(); + UiFramework.getActiveSelectionScope(); //eslint-disable-line deprecation/deprecation } }); }; @@ -144,6 +148,7 @@ export class BaseInitializer { "IModelApp must be initialized prior to rendering the Base Viewer" ); } + //eslint-disable-next-line deprecation/deprecation if (UiCore.initialized && !this._initializing) { return (this._initialized = Promise.resolve()); } else if (this._initializing) { @@ -157,9 +162,11 @@ export class BaseInitializer { const cancellable = makeCancellable(function* () { // Initialize state manager // This will setup a singleton store inside the StoreManager class. + //eslint-disable-next-line deprecation/deprecation if (!StateManager.isInitialized()) { + //eslint-disable-next-line deprecation/deprecation new StateManager({ - frameworkState: FrameworkReducer, + frameworkState: FrameworkReducer, //eslint-disable-line deprecation/deprecation }); } @@ -183,14 +190,15 @@ export class BaseInitializer { yield Promise.all(i18nPromises); // initialize UiCore + //eslint-disable-next-line deprecation/deprecation yield UiCore.initialize(IModelApp.localization); // initialize UiComponents yield UiComponents.initialize(IModelApp.localization); // initialize UiFramework - // Use undefined so that UiFramework uses StateManager - yield UiFramework.initialize(undefined); + //eslint-disable-next-line deprecation/deprecation + yield UiFramework.initialize(); // initialize Presentation yield Presentation.initialize(viewerOptions?.presentationProps); @@ -284,6 +292,7 @@ export const getIModelAppOptions = ( class ViewerAccuSnap extends AccuSnap { public override getActiveSnapModes(): SnapMode[] { // The SnapMode in the UiFramework is a bit mask. + //eslint-disable-next-line deprecation/deprecation const snapMode = UiFramework.getAccudrawSnapMode(); const snaps: SnapMode[] = []; if (0 < (snapMode & SnapMode.Bisector)) { diff --git a/packages/modules/viewer-react/src/services/iModel/IModelService.ts b/packages/modules/viewer-react/src/services/iModel/IModelService.ts index 66d35d01..d37b32ba 100644 --- a/packages/modules/viewer-react/src/services/iModel/IModelService.ts +++ b/packages/modules/viewer-react/src/services/iModel/IModelService.ts @@ -151,7 +151,7 @@ export const getViewState = async ( // attempt to construct a default viewState const viewCreator = new ViewCreator3d(connection); view = await viewCreator.createDefaultView(viewCreatorOptions); - UiFramework.setActiveSelectionScope("top-assembly"); + UiFramework.setActiveSelectionScope("top-assembly"); // eslint-disable-line deprecation/deprecation } } return view; diff --git a/packages/modules/viewer-react/src/tests/components/BaseViewer.test.tsx b/packages/modules/viewer-react/src/tests/components/BaseViewer.test.tsx index aecadff0..40f6c52b 100644 --- a/packages/modules/viewer-react/src/tests/components/BaseViewer.test.tsx +++ b/packages/modules/viewer-react/src/tests/components/BaseViewer.test.tsx @@ -1,7 +1,8 @@ /*--------------------------------------------------------------------------------------------- - * Copyright (c) Bentley Systems, Incorporated. All rights reserved. - * See LICENSE.md in the project root for license terms and full copyright notice. - *--------------------------------------------------------------------------------------------*/ +* Copyright (c) Bentley Systems, Incorporated. All rights reserved. +* See LICENSE.md in the project root for license terms and full copyright notice. +*--------------------------------------------------------------------------------------------*/ + import "@testing-library/jest-dom/extend-expect"; @@ -22,8 +23,8 @@ jest.mock("@itwin/appui-react", () => { }, UiItemsManager: { ...jest.createMockFromModule("@itwin/appui-react").UiItemsManager, - getBackstageItems: jest.fn().mockReturnValue([]) - } + getBackstageItems: jest.fn().mockReturnValue([]), + }, }; }); jest.mock("@itwin/presentation-frontend", () => { diff --git a/packages/modules/viewer-react/src/tests/components/iModel/IModelLoader.test.tsx b/packages/modules/viewer-react/src/tests/components/iModel/IModelLoader.test.tsx index 2060c004..3b08afc7 100644 --- a/packages/modules/viewer-react/src/tests/components/iModel/IModelLoader.test.tsx +++ b/packages/modules/viewer-react/src/tests/components/iModel/IModelLoader.test.tsx @@ -1,7 +1,8 @@ /*--------------------------------------------------------------------------------------------- - * Copyright (c) Bentley Systems, Incorporated. All rights reserved. - * See LICENSE.md in the project root for license terms and full copyright notice. - *--------------------------------------------------------------------------------------------*/ +* Copyright (c) Bentley Systems, Incorporated. All rights reserved. +* See LICENSE.md in the project root for license terms and full copyright notice. +*--------------------------------------------------------------------------------------------*/ + import "@testing-library/jest-dom/extend-expect"; @@ -293,7 +294,10 @@ describe("IModelLoader", () => { }); it("synchronizes with unified selection storage when storage provided", async () => { - const enableUnifiedSelectionSyncWithIModelSpy = jest.spyOn(unifiedSelection, 'enableUnifiedSelectionSyncWithIModel'); + const enableUnifiedSelectionSyncWithIModelSpy = jest.spyOn( + unifiedSelection, + "enableUnifiedSelectionSyncWithIModel" + ); enableUnifiedSelectionSyncWithIModelSpy.mockReturnValue(jest.fn()); const connection = { isBlankConnection: () => false, @@ -305,7 +309,12 @@ describe("IModelLoader", () => { .spyOn(IModelServices, "openRemoteIModel") .mockResolvedValue(connection as any); const result = render( - new SchemaContext()} /> + new SchemaContext()} + /> ); await waitFor(() => result.getByTestId("viewer")); @@ -334,7 +343,10 @@ describe("IModelLoader", () => { }); it("closes connection on unmount", async () => { - const enableUnifiedSelectionSyncWithIModelSpy = jest.spyOn(unifiedSelection, 'enableUnifiedSelectionSyncWithIModel'); + const enableUnifiedSelectionSyncWithIModelSpy = jest.spyOn( + unifiedSelection, + "enableUnifiedSelectionSyncWithIModel" + ); enableUnifiedSelectionSyncWithIModelSpy.mockReturnValue(jest.fn()); const connection = { isBlankConnection: () => false, @@ -349,7 +361,7 @@ describe("IModelLoader", () => { ); await waitFor(() => result.getByTestId("viewer")); - expect(enableUnifiedSelectionSyncWithIModelSpy).not.toHaveBeenCalled() + expect(enableUnifiedSelectionSyncWithIModelSpy).not.toHaveBeenCalled(); result.unmount(); await waitFor(() => { diff --git a/packages/modules/viewer-react/src/tests/services/BaseInitializer.test.ts b/packages/modules/viewer-react/src/tests/services/BaseInitializer.test.ts index 9cc461d6..a768613a 100644 --- a/packages/modules/viewer-react/src/tests/services/BaseInitializer.test.ts +++ b/packages/modules/viewer-react/src/tests/services/BaseInitializer.test.ts @@ -1,7 +1,8 @@ /*--------------------------------------------------------------------------------------------- - * Copyright (c) Bentley Systems, Incorporated. All rights reserved. - * See LICENSE.md in the project root for license terms and full copyright notice. - *--------------------------------------------------------------------------------------------*/ +* Copyright (c) Bentley Systems, Incorporated. All rights reserved. +* See LICENSE.md in the project root for license terms and full copyright notice. +*--------------------------------------------------------------------------------------------*/ + import { StateManager } from "@itwin/appui-react"; import { IModelApp } from "@itwin/core-frontend"; @@ -53,8 +54,8 @@ jest.mock("@itwin/presentation-frontend", () => { .Presentation, initialize: jest.fn().mockImplementation(() => Promise.resolve()), selection: { - selectionChange : { - addListener: jest.fn() + selectionChange: { + addListener: jest.fn(), }, scopes: {}, }, diff --git a/packages/modules/viewer-react/src/types.ts b/packages/modules/viewer-react/src/types.ts index 74eea526..66c879e7 100644 --- a/packages/modules/viewer-react/src/types.ts +++ b/packages/modules/viewer-react/src/types.ts @@ -61,7 +61,7 @@ export interface ViewerViewCreator3dOptions extends ViewCreator3dOptions { export interface ViewerFrontstage { /** frontstage provider to register */ - provider: FrontstageProvider; + provider: FrontstageProvider; //eslint-disable-line deprecation/deprecation /** should this be the default frontstage? If multiple are defined as default, the last will be used */ default?: boolean; /** the frontstage requires an iModel connection */ @@ -73,6 +73,7 @@ export type ViewerBackstageItem = BackstageItem & { }; export interface ViewerViewportControlOptions + //eslint-disable-next-line deprecation/deprecation extends Omit { /** ViewState or a function to return a ViewState */ viewState?: @@ -99,10 +100,6 @@ export interface LoaderProps { | ((iModel: IModelConnection) => Promise); /** additional frontstages to register */ frontstages?: ViewerFrontstage[]; - /** menu items for the backstage - * @deprecated in 4.x. Use [UiItemsProvider.provideBackstageItems](https://www.itwinjs.org/reference/appui-react/uiprovider/uiitemsprovider/). - */ - backstageItems?: ViewerBackstageItem[]; /** additional viewport options for the default frontstage's viewport control */ viewportOptions?: ViewerViewportControlOptions; /** [UI Providers](https://www.itwinjs.org/learning/ui/abstract/uiitemsprovider/) to register */ @@ -113,7 +110,9 @@ export interface LoaderProps { loadingComponent?: React.ReactNode; } -export type ViewerCommonProps = ViewerInitializerParams & LoaderProps & UnifiedSelectionProps; +export type ViewerCommonProps = ViewerInitializerParams & + LoaderProps & + UnifiedSelectionProps; // Note: When updating this, also update getIModelAppOptions export type ViewerIModelAppOptions = Pick< diff --git a/packages/modules/viewer-react/src/utilities/MakeCancellable.ts b/packages/modules/viewer-react/src/utilities/MakeCancellable.ts index bfe4e9d9..06cd02f7 100644 --- a/packages/modules/viewer-react/src/utilities/MakeCancellable.ts +++ b/packages/modules/viewer-react/src/utilities/MakeCancellable.ts @@ -28,7 +28,7 @@ export function makeCancellable( } catch (e) { return reject(e); } - next(result); + void next(result); return null; } } @@ -40,7 +40,7 @@ export function makeCancellable( } catch (e) { return reject(e); } - next(result); + void next(result); } function next({ diff --git a/packages/modules/viewer-react/tsconfig.json b/packages/modules/viewer-react/tsconfig.json index 3bae4657..e4a99461 100644 --- a/packages/modules/viewer-react/tsconfig.json +++ b/packages/modules/viewer-react/tsconfig.json @@ -4,5 +4,6 @@ "allowSyntheticDefaultImports": true, "esModuleInterop": true, }, - "include": ["./src/**/*.ts*"] + "include": ["./src/**/*.ts*"], + "exclude": ["./src/**/*.test.ts*"], } diff --git a/packages/modules/web-viewer-react/package.json b/packages/modules/web-viewer-react/package.json index 53716d55..3460587a 100644 --- a/packages/modules/web-viewer-react/package.json +++ b/packages/modules/web-viewer-react/package.json @@ -75,8 +75,8 @@ "@itwin/core-frontend": "^4.0.0", "@itwin/core-react": "^5.0.0", "@itwin/presentation-common": "^4.0.0", - "react": "^17.0.2 || ^18.0.0", - "react-dom": "^17.0.2 || ^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-redux": "^7.2.0", "redux": "^4.0.5" }, diff --git a/packages/modules/web-viewer-react/src/types.ts b/packages/modules/web-viewer-react/src/types.ts index 867abad3..92f81970 100644 --- a/packages/modules/web-viewer-react/src/types.ts +++ b/packages/modules/web-viewer-react/src/types.ts @@ -23,16 +23,18 @@ export type WebInitializerParams = ViewerCommonProps & { authClient?: ViewerAuthorizationClient; }; -type AuthClientProps = { - authClient: ViewerAuthorizationClient; - iTwinId: string; -} -| { - authClient?: ViewerAuthorizationClient; - iTwinId?: never; -} +type AuthClientProps = + | { + authClient: ViewerAuthorizationClient; + iTwinId: string; + } + | { + authClient?: ViewerAuthorizationClient; + iTwinId?: never; + }; -type ConnectedViewerWebProps = ConnectedViewerProps & Required>; +type ConnectedViewerWebProps = ConnectedViewerProps & + Required>; type BlankViewerWebProps = BlankViewerProps & AuthClientProps; export type WebViewerProps = XOR & diff --git a/packages/modules/web-viewer-react/tsconfig.json b/packages/modules/web-viewer-react/tsconfig.json index 2ee142ec..b4bbf06d 100644 --- a/packages/modules/web-viewer-react/tsconfig.json +++ b/packages/modules/web-viewer-react/tsconfig.json @@ -4,5 +4,6 @@ "allowSyntheticDefaultImports": true, "esModuleInterop": true }, - "include": ["./src/**/*.ts*"] + "include": ["./src/**/*.ts*"], + "exclude": ["./src/**/*.test.ts*"] } \ No newline at end of file diff --git a/packages/templates/cra-template-desktop-viewer/template.json b/packages/templates/cra-template-desktop-viewer/template.json index 88aa4e64..8d3a06f9 100644 --- a/packages/templates/cra-template-desktop-viewer/template.json +++ b/packages/templates/cra-template-desktop-viewer/template.json @@ -34,7 +34,7 @@ "@itwin/itwinui-illustrations-react": "^2.0.1", "@itwin/itwinui-layouts-css": "^0.2.0", "@itwin/itwinui-layouts-react": "^0.2.0", - "@itwin/itwinui-react": "^2.11.4", + "@itwin/itwinui-react": "^3.16.0", "@itwin/itwinui-variables": "^2.0.0", "@itwin/measure-tools-react": "^0.23.2", "@itwin/presentation-backend": "^4.7.3", diff --git a/packages/templates/cra-template-desktop-viewer/template/.env b/packages/templates/cra-template-desktop-viewer/template/.env index 490db576..6abc6c9f 100644 --- a/packages/templates/cra-template-desktop-viewer/template/.env +++ b/packages/templates/cra-template-desktop-viewer/template/.env @@ -13,7 +13,7 @@ GENERATE_SOURCEMAP=false DISABLE_NEW_JSX_TRANSFORM=true # Advanced iModel.js CRA Config: https://github.com/imodeljs/create-react-app/blob/imodeljs/packages/react-scripts/README-imodeljs.md -USE_FAST_SASS=true +USE_FAST_SASS=false USE_FULL_SOURCEMAP=true TRANSPILE_DEPS=false # Remove the following env var if using a different package manager diff --git a/packages/templates/cra-template-web-viewer/template.json b/packages/templates/cra-template-web-viewer/template.json index cb6b2fda..5e3d41e0 100644 --- a/packages/templates/cra-template-web-viewer/template.json +++ b/packages/templates/cra-template-web-viewer/template.json @@ -21,7 +21,7 @@ "@itwin/ecschema-rpcinterface-common": "^4.7.3", "@itwin/imodel-components-react": "^4.3.0", "@itwin/imodels-access-frontend": "^4.0.0", - "@itwin/itwinui-react": "^2.7.0", + "@itwin/itwinui-react": "^3.16.0", "@itwin/measure-tools-react": "^0.23.2", "@itwin/presentation-common": "^4.7.3", "@itwin/presentation-components": "^5.0.0", diff --git a/packages/templates/cra-template-web-viewer/template/.env b/packages/templates/cra-template-web-viewer/template/.env index 280a06f4..9289d9c4 100644 --- a/packages/templates/cra-template-web-viewer/template/.env +++ b/packages/templates/cra-template-web-viewer/template/.env @@ -13,7 +13,7 @@ IMJS_IMODEL_ID = "" SKIP_PREFLIGHT_CHECK=true # Advanced iTwin.js CRA Config: https://github.com/imodeljs/create-react-app/blob/imodeljs/packages/react-scripts/README-imodeljs.md -USE_FAST_SASS=true +USE_FAST_SASS=false USE_FULL_SOURCEMAP=true TRANSPILE_DEPS=false # Remove the following env var if using a different package manager