diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c9310441c..8d4cbaa51 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -89,7 +89,7 @@ jobs: type=raw,value=${{ github.sha }} - name: Build and push Docker image - uses: docker/build-push-action@16ebe778df0e7752d2cfcbd924afdbbd89c1a755 # v6.6.1 + uses: docker/build-push-action@5cd11c3a4ced054e52742c5fd54dca954e0edd85 # v6.7.0 with: context: . file: .conf/Dockerfile.prebuilt diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index f1cfa7edb..8b12ca748 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -75,7 +75,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@eb055d739abdc2e8de2e5f4ba1a8b246daa779aa # v2.227 + uses: github/codeql-action/init@4dd16135b69a43b6c8efb853346f8437d92d3c93 # v2.227 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -89,7 +89,7 @@ jobs: # Automates dependency installation for Python, Ruby, and JavaScript, optimizing the CodeQL analysis setup. # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@eb055d739abdc2e8de2e5f4ba1a8b246daa779aa # v2.227 + uses: github/codeql-action/autobuild@4dd16135b69a43b6c8efb853346f8437d92d3c93 # v2.227 # ℹ️ Command-line programs to run using the OS shell. # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun @@ -102,6 +102,6 @@ jobs: # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@eb055d739abdc2e8de2e5f4ba1a8b246daa779aa # v2.227 + uses: github/codeql-action/analyze@4dd16135b69a43b6c8efb853346f8437d92d3c93 # v2.227 with: category: '/language:${{matrix.language}}' diff --git a/.github/workflows/dependencies.yaml b/.github/workflows/dependencies.yaml index bd73e7a17..7f9c4396f 100644 --- a/.github/workflows/dependencies.yaml +++ b/.github/workflows/dependencies.yaml @@ -65,7 +65,7 @@ jobs: if: steps.dependencies-changed.outputs.changed == 'true' - name: Upload DEPENDENCIES file - uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4.3.6 + uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0 with: path: DEPENDENCIES if: steps.dependencies-changed.outputs.changed == 'true' diff --git a/.github/workflows/kics.yml b/.github/workflows/kics.yml index 2bfe68a5b..89ea9a7e4 100644 --- a/.github/workflows/kics.yml +++ b/.github/workflows/kics.yml @@ -45,7 +45,7 @@ jobs: - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: KICS scan - uses: checkmarx/kics-github-action@252e73959bd4809a14863cbfbb42d7a90d5a4860 # v2.1.1 + uses: checkmarx/kics-github-action@530ac1f8efe6202b0f12c9a6e952597ae707b755 # v2.1.2 with: # Scanning directory . path: '.' @@ -67,6 +67,6 @@ jobs: # Upload findings to GitHub Advanced Security Dashboard - name: Upload SARIF file for GitHub Advanced Security Dashboard if: always() - uses: github/codeql-action/upload-sarif@eb055d739abdc2e8de2e5f4ba1a8b246daa779aa # v3.26.0 + uses: github/codeql-action/upload-sarif@4dd16135b69a43b6c8efb853346f8437d92d3c93 # v3.26.6 with: sarif_file: kicsResults/results.sarif diff --git a/.github/workflows/release-release_candidate.yml b/.github/workflows/release-release_candidate.yml index f06587034..d3ad2ff0e 100644 --- a/.github/workflows/release-release_candidate.yml +++ b/.github/workflows/release-release_candidate.yml @@ -111,7 +111,7 @@ jobs: type=semver,pattern=v{{major}}.{{minor}} - name: Build and push Docker image - uses: docker/build-push-action@16ebe778df0e7752d2cfcbd924afdbbd89c1a755 # v6.6.1 + uses: docker/build-push-action@5cd11c3a4ced054e52742c5fd54dca954e0edd85 # v6.7.0 with: context: . file: .conf/Dockerfile.prebuilt diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cceeb24a5..48ce0e90a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -112,7 +112,7 @@ jobs: type=semver,pattern=v{{major}}.{{minor}} - name: Build and push Docker image - uses: docker/build-push-action@16ebe778df0e7752d2cfcbd924afdbbd89c1a755 # v6.6.1 + uses: docker/build-push-action@5cd11c3a4ced054e52742c5fd54dca954e0edd85 # v6.7.0 with: context: . file: .conf/Dockerfile.prebuilt diff --git a/.github/workflows/release_candidate.yml b/.github/workflows/release_candidate.yml index 1d40771b5..bfec1ede7 100644 --- a/.github/workflows/release_candidate.yml +++ b/.github/workflows/release_candidate.yml @@ -86,7 +86,7 @@ jobs: type=raw,value=${{ github.sha }} - name: Build and push Docker image - uses: docker/build-push-action@16ebe778df0e7752d2cfcbd924afdbbd89c1a755 # v6.6.1 + uses: docker/build-push-action@5cd11c3a4ced054e52742c5fd54dca954e0edd85 # v6.7.0 with: context: . file: .conf/Dockerfile.prebuilt diff --git a/.github/workflows/trivy-main.yml b/.github/workflows/trivy-main.yml index 48e934c93..77ff0b96f 100644 --- a/.github/workflows/trivy-main.yml +++ b/.github/workflows/trivy-main.yml @@ -63,7 +63,7 @@ jobs: vuln-type: 'os,library' - name: Upload Trivy scan results to GitHub Security tab - uses: github/codeql-action/upload-sarif@eb055d739abdc2e8de2e5f4ba1a8b246daa779aa # v3.26.0 + uses: github/codeql-action/upload-sarif@4dd16135b69a43b6c8efb853346f8437d92d3c93 # v3.26.6 if: always() with: sarif_file: 'trivy-results1.sarif' @@ -96,6 +96,6 @@ jobs: - name: Upload Trivy scan results to GitHub Security tab if: always() - uses: github/codeql-action/upload-sarif@eb055d739abdc2e8de2e5f4ba1a8b246daa779aa # v3.26.0 + uses: github/codeql-action/upload-sarif@4dd16135b69a43b6c8efb853346f8437d92d3c93 # v3.26.6 with: sarif_file: 'trivy-results2.sarif' diff --git a/.github/workflows/trivy.yml b/.github/workflows/trivy.yml index 09b306425..09d2dd01f 100644 --- a/.github/workflows/trivy.yml +++ b/.github/workflows/trivy.yml @@ -63,7 +63,7 @@ jobs: vuln-type: 'os,library' - name: Upload Trivy scan results to GitHub Security tab - uses: github/codeql-action/upload-sarif@eb055d739abdc2e8de2e5f4ba1a8b246daa779aa # v3.26.0 + uses: github/codeql-action/upload-sarif@4dd16135b69a43b6c8efb853346f8437d92d3c93 # v3.26.6 if: always() with: sarif_file: 'trivy-results1.sarif' @@ -96,6 +96,6 @@ jobs: - name: Upload Trivy scan results to GitHub Security tab if: always() - uses: github/codeql-action/upload-sarif@eb055d739abdc2e8de2e5f4ba1a8b246daa779aa # v3.26.0 + uses: github/codeql-action/upload-sarif@4dd16135b69a43b6c8efb853346f8437d92d3c93 # v3.26.6 with: sarif_file: 'trivy-results2.sarif' diff --git a/CHANGELOG.md b/CHANGELOG.md index e845d39e2..3ff1f60fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,40 +5,66 @@ ### Bugfixes - **Connector Management** - - fixed technical user selection - fixed customer link selection and fixed resetting values ## 2.2.0-RC2 ### Feature -- **Onboarding Service Provider Management**: - - Create new page for onboarding service provider management [#1052](https://github.com/eclipse-tractusx/portal-frontend/pull/1052) -- **Company data** - - Disable confirm button if input value is not matching with the regular expression [#1056](https://github.com/eclipse-tractusx/portal-frontend/pull/1056) - - Fix infinite loop issue in add New Address Modal - - Add new csv bulk upload modal [#1056](https://github.com/eclipse-tractusx/portal-frontend/pull/1056) -- **Service Subscription** - - Update auto setup api response data in the service subscription response overlay +- **Roles and Permissions** + - Enable more fine grained permission checks by client id and roles +- **Customer Detail Data Overlay** + - implement new UI design for customer detail data overlay +- **Company Subscription Management** + - extended the subscription detail page for customer to include more app-related information [#1051](https://github.com/eclipse-tractusx/portal-frontend/pull/1051) + +### Change + +- **Company Subscriptions** + - Update and bind API with filter options [#1062](https://github.com/eclipse-tractusx/portal-frontend/pull/1062) ### Bugfixes -- **Partner Network** - - Change interface of the partner network apis. add /members to the POST api and update the business logic accordingly [#1002](https://github.com/eclipse-tractusx/portal-frontend/pull/1002) -- **Business Partner invite** - - fix person name regex patter [#1040](https://github.com/eclipse-tractusx/portal-frontend/pull/1040) +- fixed onClick of "Overview My Apps" button in App Release Process screen [#1022](https://github.com/eclipse-tractusx/portal-frontend/issues/1022) +- fixed 400 Bad Request error in App Access Management -> Add Role search filter [#1057](https://github.com/eclipse-tractusx/portal-frontend/issues/1057) +- **Connector Management** + - fixed technical user selection +- **IDP management** + - Fixed IDP management page title & description +- **Technical User** + - Show appropriate error message. + - Fix closing page notification bar issue +- **IDP management** + - Fixed statusTag color in status column [#978](https://github.com/eclipse-tractusx/portal-frontend/pull/978) +- **Connector Management** + - Updated SD document download API to fix downloading SD document issue [#1038](https://github.com/eclipse-tractusx/portal-frontend/pull/1038) +- **Service Release Process** + - Fixed back button navigation to service management instead of navigating to home page[#1038](https://github.com/eclipse-tractusx/portal-frontend/pull/1038) +- **Application Requests** + - Fixed 'activeTab' conditions to load data for Tab-2(Registration Process) [#1050](https://github.com/eclipse-tractusx/portal-frontend/pull/1050) +- **App Release Process**: + - Fixed role upload does not work using Firefox [#1003](https://github.com/eclipse-tractusx/portal-frontend/pull/1003) +- **Technical User Management** + - Display technicalUserManagement button based on role validation [#1073](https://github.com/eclipse-tractusx/portal-frontend/pull/1073) +- **OSP Consent form** + - Display invited company name in OSP consent form (Previously hard coded with 'BMW') [#1083](https://github.com/eclipse-tractusx/portal-frontend/pull/1083) -## 2.2.0-RC1 +## 2.2.0 ### Change -- **Page headers** - - harmonized and standardized page headers: added consistent headers and removed unused code [#864](https://github.com/eclipse-tractusx/portal-frontend/pull/864) -- **Company data Management** +- **Company Data Management** - integrated /ready api to trigger once the new record is created [#958](https://github.com/eclipse-tractusx/portal-frontend/pull/958) - enabled displaying of sharing state error details in the company overlay details page [#958](https://github.com/eclipse-tractusx/portal-frontend/pull/958) -- **Business partner invite** - - updated first name and last name pattern to allow 2 characters in business partner invite application form [#1025](https://github.com/eclipse-tractusx/portal-frontend/pull/1025) +- **Technical User Management** + - removed 'Inactive' filter in technical user management [#1046](https://github.com/eclipse-tractusx/portal-frontend/pull/1046) + - updated filters view and logic [#1087](https://github.com/eclipse-tractusx/portal-frontend/pull/1087) +- **Skipping of GX compliance service interface** + - updated the status (skipped) in application requests and changed checkbox in connector management [#1019](https://github.com/eclipse-tractusx/portal-frontend/pull/1019) +- **Connector Management** + - updated delete connector confirmation logic with technical user [#1076](https://github.com/eclipse-tractusx/portal-frontend/pull/1076) +- **Page headers** + - harmonized and standardized page headers: added consistent headers and removed unused code [#864](https://github.com/eclipse-tractusx/portal-frontend/pull/864) ### Feature @@ -47,6 +73,13 @@ - **Technical User Management** - enhanced technical user table by adding StatusTag to the status column [#967](https://github.com/eclipse-tractusx/portal-frontend/pull/967) - enhanced technical user table status column by adding new status 'pending deletion' [#967](https://github.com/eclipse-tractusx/portal-frontend/pull/967) +- **Onboarding Service Provider Management**: + - created new page for onboarding service provider management [#1052](https://github.com/eclipse-tractusx/portal-frontend/pull/1052) +- **Company Data Management** + - added new csv bulk upload BUT it is currently not enabled: further enhancements will follow [#1056](https://github.com/eclipse-tractusx/portal-frontend/pull/1056), [#1091](https://github.com/eclipse-tractusx/portal-frontend/pull/1091) + - disabled confirm button if input value is not matching with the regular expression [#1056](https://github.com/eclipse-tractusx/portal-frontend/pull/1056) +- **Service Subscription** + - updated auto setup api response data in the service subscription response overlay ### Technical Support @@ -57,12 +90,34 @@ ### Bugfixes +- **Partner Network** + - changed BPDM interface integration so that partners are listed in the Partner Network: added /members to the POST api and updated the business logic accordingly [#1002](https://github.com/eclipse-tractusx/portal-frontend/pull/1002) +- **Company Data Management** + - fixed infinite loop issue in add new address modal [#1048](https://github.com/eclipse-tractusx/portal-frontend/pull/1048) + - fixed broken title and description in modal [#1070](https://github.com/eclipse-tractusx/portal-frontend/pull/1070) + - fixed translation error [#1070](https://github.com/eclipse-tractusx/portal-frontend/pull/1070) +- **Business Partner Invitation** + - updated first name and last name pattern to allow 2 characters in application form [#1025](https://github.com/eclipse-tractusx/portal-frontend/pull/1025) + - fixed person name regex pattern [#1040](https://github.com/eclipse-tractusx/portal-frontend/pull/1040) - fixed usage of scroll to top button from shared components [#868](https://github.com/eclipse-tractusx/portal-frontend/pull/868) - fixed naming consistency of constants: used camel case for all page paths and update corresponding usage in other files [#895](https://github.com/eclipse-tractusx/portal-frontend/pull/895) - removed unnecessary condition in semantic hub page's table [#979](https://github.com/eclipse-tractusx/portal-frontend/pull/979) - fixed unchanged text of button when user requests subscription [#985](https://github.com/eclipse-tractusx/portal-frontend/pull/985) - fixed height for "Admin Service Detail" page content [#1001](https://github.com/eclipse-tractusx/portal-frontend/pull/1001) +### Known Knowns + +- Technical Issues and Limitations + - Technical User Accounts + - There is an issue where attempting to display details for inactive technical users results in a blank page due to a lack of necessary backend support. + - Long Description field in German (de) does not accept German special characters [#965](https://github.com/eclipse-tractusx/portal-frontend/pull/965). + - Role Upload does not work during App Release Process when using Firefox [#961](https://github.com/eclipse-tractusx/portal-frontend/pull/961). +- Feature Support and Development + - Auto-setup Process Worker + - There is no frontend support for the extended auto-setup process worker, specifically in terms of error handling and status transparency. + - Registration Approval Process + - The frontend provides limited support for the registration approval process, particularly concerning the retriggering of jobs. + ## 2.1.0 ### Change diff --git a/DEPENDENCIES b/DEPENDENCIES index 7300986a7..6373a6976 100644 --- a/DEPENDENCIES +++ b/DEPENDENCIES @@ -601,7 +601,7 @@ npm/npmjs/@babel/template/7.24.0, MIT, approved, clearlydefined npm/npmjs/@babel/traverse/7.24.1, MIT AND (BSD-2-Clause AND ISC AND MIT) AND BSD-2-Clause AND BSD-3-Clause, approved, #13926 npm/npmjs/@babel/types/7.24.0, MIT, approved, clearlydefined npm/npmjs/@bcoe/v8-coverage/0.2.3, ISC AND MIT, approved, clearlydefined -npm/npmjs/@catena-x/portal-shared-components/3.4.0, Apache-2.0 AND CC-BY-4.0 AND OFL-1.1, approved, #16027 +npm/npmjs/@catena-x/portal-shared-components/3.5.2, Apache-2.0 AND CC-BY-4.0 AND OFL-1.1, approved, #16079 npm/npmjs/@cspotcode/source-map-support/0.8.1, MIT, approved, clearlydefined npm/npmjs/@date-io/core/3.0.0, MIT, approved, clearlydefined npm/npmjs/@date-io/date-fns/3.0.0, MIT, approved, #14023 diff --git a/index.html b/index.html index 1a72c3909..ef42715e5 100644 --- a/index.html +++ b/index.html @@ -29,8 +29,8 @@
- \ No newline at end of file + diff --git a/package.json b/package.json index e4701b741..ac39cf16c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@catena-x/portal-frontend", - "version": "v2.2.0-RC2", + "version": "v2.2.0", "description": "Catena-X Portal Frontend", "author": "Catena-X Contributors", "license": "Apache-2.0", @@ -34,19 +34,19 @@ ] }, "dependencies": { - "@catena-x/portal-shared-components": "^3.4.0", + "@catena-x/portal-shared-components": "^3.5.2", "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.5", "@hookform/error-message": "^2.0.1", - "@mui/icons-material": "^5.15.14", - "@mui/material": "^5.15.14", + "@mui/icons-material": "^5.15.21", + "@mui/material": "^5.15.21", "@mui/x-data-grid": "^6.19.11", "@react-hook/cache": "^1.1.1", - "@reduxjs/toolkit": "^2.2.6", + "@reduxjs/toolkit": "^2.2.7", "autosuggest-highlight": "^3.3.4", "axios": "^1.6.8", "buffer": "^6.0.3", - "dayjs": "^1.11.12", + "dayjs": "^1.11.13", "i18next": "^23.10.1", "i18next-browser-languagedetector": "^7.2.1", "keycloak-js": "^23.0.7", @@ -54,7 +54,7 @@ "lodash.uniq": "^4.5.0", "nanoid": "^5.0.7", "papaparse": "^5.4.1", - "phone": "^3.1.49", + "phone": "^3.1.50", "qs": "^6.12.3", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -68,7 +68,7 @@ }, "devDependencies": { "@testing-library/dom": "^9.3.4", - "@testing-library/jest-dom": "^6.4.6", + "@testing-library/jest-dom": "^6.4.8", "@testing-library/react": "^14.2.2", "@testing-library/user-event": "^14.5.2", "@types/autosuggest-highlight": "^3.2.3", diff --git a/providers.html b/providers.html new file mode 100644 index 000000000..fdf3299e0 --- /dev/null +++ b/providers.html @@ -0,0 +1,515 @@ +const data = [ + { + "name": "CX-Operator", + "alias": "CX-Operator", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/CX-Operator/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Uniper SE", + "alias": "idp2", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp2/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Krones AG", + "alias": "idp3", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp3/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "MAN SE", + "alias": "idp4", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp4/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "SOH Dataspace AG", + "alias": "idp6", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp6/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Krones Dup AG", + "alias": "idp7", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp7/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Resöüt", + "alias": "idp8", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp8/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "4zero Solutions GmbH", + "alias": "idp9", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp9/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Saller GmbH", + "alias": "idp18", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp18/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Arnsburg Apotheke "Alte Bornheimer Apotheke" e.K.", + "alias": "idp19", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp19/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Automotive Cells Co", + "alias": "idp20", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp20/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "SAP Deutschland SE & Co. KG", + "alias": "idp21", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp21/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Continental Automotive Technologies GmbH", + "alias": "idp22", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp22/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "SAP France", + "alias": "idp23", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp23/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "SAP Italia S.p.A.", + "alias": "idp24", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp24/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "SAP Österreich GmbH", + "alias": "idp25", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp25/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Covestro Deutschland AG", + "alias": "idp26", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp26/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "SAP SE", + "alias": "idp27", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp27/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Schaeffler AG", + "alias": "idp28", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp28/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Schaeffler Technologies AG & Co. KG", + "alias": "idp29", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp29/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Schaeffler Engineering GmbH", + "alias": "idp30", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp30/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "DatafabriQ UG", + "alias": "idp31", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp31/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "B. Fischer AG", + "alias": "idp32", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp32/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Siemens Advanta Solutions GmbH", + "alias": "idp33", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp33/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Delos Cloud GmbH", + "alias": "idp34", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp34/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "BASF Digital Solutions S.L.U.", + "alias": "idp35", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp35/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "BASF SE", + "alias": "idp36", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp36/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Denso Automotive Deutschland GmbH", + "alias": "idp37", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp37/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "BloqSens AG", + "alias": "idp38", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp38/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "DENSO CORPORATION", + "alias": "idp39", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp39/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "BMW AG", + "alias": "idp40", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp40/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "HELLA GmbH & Co. KGaA", + "alias": "idp41", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp41/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Detecon International GmbH", + "alias": "idp42", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp42/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Capgemini Deutschland GmbH", + "alias": "idp43", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp43/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "CatX Service GmbH", + "alias": "idp44", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp44/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Eberspächer Controls Esslingen GmbH & Co. KG", + "alias": "idp45", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp45/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Hirschmann Automotive GmbH", + "alias": "idp46", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp46/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Siemens AG", + "alias": "idp47", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp47/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "EJOT SE & Co. KG", + "alias": "idp48", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp48/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Hybris GmbH", + "alias": "idp49", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp49/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Flex Automotive GmbH", + "alias": "idp50", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp50/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Siemens Industry Software GmbH", + "alias": "idp51", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp51/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "sovity GmbH", + "alias": "idp54", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp54/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "SK Inc.", + "alias": "idp55", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp55/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Ford Werke GmbH", + "alias": "idp56", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp56/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Forvia", + "alias": "idp57", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp57/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Spherity GmbH", + "alias": "idp58", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp58/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "FORD ESPANA SL", + "alias": "idp52", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp52/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "IAV GmbH Ingenieurgesellschaft Auto und Verkehr", + "alias": "idp53", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp53/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "IBM Deutschland GmbH", + "alias": "idp59", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp59/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Light ds GmbH", + "alias": "idp60", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp60/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "SSC-Services GmbH", + "alias": "idp61", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp61/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "German Edge Cloud GmbH & Co. KG", + "alias": "idp62", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp62/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Stellantis N.V.", + "alias": "idp63", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp63/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Lisa Dräxlmaier GmbH", + "alias": "idp64", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp64/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Harman Becker Automotive Systems GmbH", + "alias": "idp65", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp65/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "SupplyOn AG", + "alias": "idp66", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp66/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Trebing & Himstedt Prozeßautomation GmbH & Co. KG", + "alias": "idp67", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp67/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "T-Systems International GmbH", + "alias": "idp68", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp68/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Volkswagen AG", + "alias": "idp69", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp69/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "WITTE Automotive GmbH", + "alias": "idp70", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp70/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "ZF Friedrichshafen AG", + "alias": "idp71", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp71/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Antipodean GmbH", + "alias": "idp72", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp72/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Magna International (Germany) GmbH", + "alias": "idp73", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp73/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "AROMA GLOBAL 3 d.o.o", + "alias": "idp74", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp74/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "MAHLE International GmbH", + "alias": "idp75", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp75/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Materna Information & Communications SE", + "alias": "idp76", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp76/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Mercedes-Benz Group AG", + "alias": "idp77", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp77/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "MHP Management- und IT-Beratung GmbH", + "alias": "idp78", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp78/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "NTT Communications Corporation", + "alias": "idp79", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp79/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "NTT Germany", + "alias": "idp80", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp80/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "NTT Luxembourg PSF SA", + "alias": "idp81", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp81/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "NTT Netherlands B.V.", + "alias": "idp82", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp82/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "OETINGER Aluminum GmbH", + "alias": "idp83", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp83/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Polygran GmbH", + "alias": "idp84", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp84/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Pöppelmann Kunststoff-Technik GmbH & Co. KG", + "alias": "idp85", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp85/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Contemporary Amperex Technology", + "alias": "idp86", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp86/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Renault SAS", + "alias": "idp87", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp87/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "RenewEarth Lab Inc", + "alias": "idp88", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp88/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Franke Holding AG", + "alias": "idp89", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp89/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Rhenus Automotive SE", + "alias": "idp90", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp90/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "RITTAL GmbH & Co. KG", + "alias": "idp91", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp91/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Robert Bosch GmbH", + "alias": "idp92", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp92/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "Robert Bosch Manufacturing Solutions GmbH", + "alias": "idp93", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp93/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + { + "name": "S1Seven GmbH", + "alias": "idp94", + "provider": "keycloak-oidc", + "url": "/auth/realms/CX-Central/broker/idp94/login?client_id=Cl2-CX-Portal&tab_id=n0o38pB50y8&session_code=oWrl70zGNNgkCIaNN5nRuom6CuEu3DInyHI4Pn7e7AE" + }, + null +] + +console.log(data) \ No newline at end of file diff --git a/scripts/inject-dynamic-env.sh b/scripts/inject-dynamic-env.sh index 84de178ba..dfa698eb2 100644 --- a/scripts/inject-dynamic-env.sh +++ b/scripts/inject-dynamic-env.sh @@ -20,9 +20,9 @@ ############################################################### # Define custom variable -custom_env_vars='{REQUIRE_HTTPS_URL_PATTERN:"'$REQUIRE_HTTPS_URL_PATTERN'",PORTAL_ASSETS_URL:"'$PORTAL_ASSETS_URL'",PORTAL_BACKEND_URL:"'$PORTAL_BACKEND_URL'",CENTRALIDP_URL:"'$CENTRALIDP_URL'",SSI_CREDENTIAL_URL:"'$SSI_CREDENTIAL_URL'",BPDM_POOL_API_URL:"'$BPDM_POOL_API_URL'",BPDM_GATE_API_URL:"'$BPDM_GATE_API_URL'",SEMANTICS_URL:"'$SEMANTICS_URL'",MANAGED_IDENTITY_WALLETS_NEW_URL:"'$MANAGED_IDENTITY_WALLETS_NEW_URL'",REALM:"'$REALM'",CLIENT_ID:"'$CLIENT_ID'",CLIENT_ID_SEMANTIC:"'$CLIENT_ID_SEMANTIC'",CLIENT_ID_MIW:"'$CLIENT_ID_MIW'",CLIENT_ID_SSI_CREDENTIAL:"'$CLIENT_ID_SSI_CREDENTIAL'"}' +custom_env_vars='{REQUIRE_HTTPS_URL_PATTERN:"'$REQUIRE_HTTPS_URL_PATTERN'",PORTAL_ASSETS_URL:"'$PORTAL_ASSETS_URL'",PORTAL_BACKEND_URL:"'$PORTAL_BACKEND_URL'",CENTRALIDP_URL:"'$CENTRALIDP_URL'",SSI_CREDENTIAL_URL:"'$SSI_CREDENTIAL_URL'",BPDM_POOL_API_URL:"'$BPDM_POOL_API_URL'",BPDM_GATE_API_URL:"'$BPDM_GATE_API_URL'",SEMANTICS_URL:"'$SEMANTICS_URL'",MANAGED_IDENTITY_WALLETS_NEW_URL:"'$MANAGED_IDENTITY_WALLETS_NEW_URL'",REALM:"'$REALM'",CLIENT_ID:"'$CLIENT_ID'",CLIENT_ID_REGISTRATION:"'$CLIENT_ID_REGISTRATION'",CLIENT_ID_SEMANTIC:"'$CLIENT_ID_SEMANTIC'",CLIENT_ID_BPDM:"'$CLIENT_ID_BPDM'",CLIENT_ID_MIW:"'$CLIENT_ID_MIW'",CLIENT_ID_SSI_CREDENTIAL:"'$CLIENT_ID_SSI_CREDENTIAL'"}' # Define anchor variable -custom_env_vars_anchor='{REQUIRE_HTTPS_URL_PATTERN:"true",PORTAL_ASSETS_URL:"http://localhost:3000/assets",PORTAL_BACKEND_URL:"https://portal-backend.example.org",CENTRALIDP_URL:"https://centralidp.example.org/auth",SSI_CREDENTIAL_URL:"https://ssi-credential-issuer.example.org",BPDM_POOL_API_URL:"https://business-partners.example.org/pool/v6",BPDM_GATE_API_URL:"https://business-partners.example.org/companies/test-company/v6",SEMANTICS_URL:"https://semantics.example.org",MANAGED_IDENTITY_WALLETS_NEW_URL:"https://managed-identity-wallets-new.example.org",REALM:"CX-Central",CLIENT_ID:"Cl2-CX-Portal",CLIENT_ID_SEMANTIC:"Cl3-CX-Semantic",CLIENT_ID_MIW:"Cl5-CX-Custodian",CLIENT_ID_SSI_CREDENTIAL:"Cl24-CX-SSI-CredentialIssuer"}' +custom_env_vars_anchor='{REQUIRE_HTTPS_URL_PATTERN:"true",PORTAL_ASSETS_URL:"http://localhost:3000/assets",PORTAL_BACKEND_URL:"https://portal-backend.example.org",CENTRALIDP_URL:"https://centralidp.example.org/auth",SSI_CREDENTIAL_URL:"https://ssi-credential-issuer.example.org",BPDM_POOL_API_URL:"https://business-partners.example.org/pool/v6",BPDM_GATE_API_URL:"https://business-partners.example.org/companies/test-company/v6",SEMANTICS_URL:"https://semantics.example.org",MANAGED_IDENTITY_WALLETS_NEW_URL:"https://managed-identity-wallets-new.example.org",REALM:"CX-Central",CLIENT_ID:"Cl2-CX-Portal",CLIENT_ID_REGISTRATION:"Cl1-CX-Registration",CLIENT_ID_SEMANTIC:"Cl3-CX-Semantic",CLIENT_ID_BPDM:"Cl7-CX-BPDM",CLIENT_ID_MIW:"Cl5-CX-Custodian",CLIENT_ID_SSI_CREDENTIAL:"Cl24-CX-SSI-CredentialIssuer"}' # Read content of the reference index.html file into the index_html_reference variable index_html_reference=`cat /usr/share/nginx/html/index.html.reference` # Replace the anchor variable with the custom variable in the index.html file diff --git a/src/assets/locales/de/idp.json b/src/assets/locales/de/idp.json index 3906a3453..f5fd62b1a 100644 --- a/src/assets/locales/de/idp.json +++ b/src/assets/locales/de/idp.json @@ -45,8 +45,8 @@ "metadata_url_invalid_error": "Please enter valid metadata url" }, "page": { - "title": "Identity Provider Config", - "desc": "Here you can manage how the users of your company authenticate with Catena-X.

On registration we have created an IDP with one user entry for the admin (that's probably you ;).
Many companies already have their own IDP where users authenticate using their known company user id and a familiar login mask. In this case you will probably prefer to use your own company IDP and you can create and manage the federation on this page." + "title": "Konfiguration des Identitätsanbieters", + "desc": "Auf dieser Seite können Sie die Benutzerauthentifizierung für Ihr Unternehmen verwalten.

Bei der Registrierung haben wir einen Identity Provider (IDP) mit einem einzigen Benutzereintrag für den Administrator eingerichtet. Viele Organisationen unterhalten bereits ihren eigenen IDP, bei dem sich Benutzer mit ihren etablierten Unternehmensbenutzer-IDs und vertrauten Anmeldeoberflächen authentifizieren. In solchen Fällen möchten Sie möglicherweise Ihren vorhandenen Unternehmens-IDP nutzen. Auf dieser Seite können Sie die erforderliche Föderation erstellen und verwalten." }, "add": { "title": "Add your Identity Provider (IdP)", diff --git a/src/assets/locales/de/main.json b/src/assets/locales/de/main.json index b566cf13b..519096281 100644 --- a/src/assets/locales/de/main.json +++ b/src/assets/locales/de/main.json @@ -39,7 +39,7 @@ "deactivate": "Deactivate", "appReleaseProcess": "App Release Process", "appSubscription": "App Subscription MGT", - "adminboard": "Admin Board", + "appAdminBoard": "Admin Board", "appUserManagement": "App Benutzer Verwaltung", "userdetails": "Benutzer Details", "technicalUserManagement": "Technische Benutzer Verwaltung", @@ -188,6 +188,7 @@ "buttonprogress": "in progress", "buttonrejected": "rejected", "buttoncompleted": "completed", + "buttonPartiallyCompleted": "teilweise abgeschlossen", "buttonerror": "error", "cellconfirmed": "bestätigt", "celldeclined": "abgelehnt", @@ -459,9 +460,38 @@ "action": "Aktion" }, "filter": { - "requested": "angefordert", + "pending": "ausstehend", "active": "aktiv", - "showAll": "zeige alles" + "inactive": "inaktiv", + "showAll": "Alles anzeigen" + } + }, + "companySubscriptionsDetail": { + "language": "Verfügbare App Sprachen", + "description": "Description", + "subscribed": "Gezeichnet", + "requested": "Angefordert", + "declined": "Abgelehnt", + "howtouse": { + "heading": "Nutzungsbedingungen", + "message": "Die Nutzungsbedingungen regeln das Verhältnis zwischen App Interessenten und App Anbieter. Die Nutzungsbedingungen, sowie die Datenmodelle und weitere Informationen können durch Anklicken der Hyperlinks eingesehen werden." + }, + "privacy": { + "heading": "Datenschutz", + "message": "Die Datenschutzerklärung gibt an, welche Daten die Geschäftsanwendungen erheben, handhaben und verarbeiten. Die nachstehenden Details zeigen explizit, welche Unternehmens-/Benutzerinformationen gesammelt/gespeichert werden.", + "notSupportedMessage": "Currently not yet supported", + "COMPANY_DATA": "Company Data", + "USER_DATA": "User Data", + "LOCATION": "Location", + "BROWSER_HISTORY": "Browser History", + "NONE": "None" + }, + "table": { + "connector": "Verbinder", + "technicalUser": "Technischer Benutzer" + }, + "technicalUser": { + "heading": "Technischer Details" } }, "appOverview": { @@ -569,7 +599,7 @@ "location": "Location", "tooltipText": "Connector's status is pending", "sdDescription": "SD Registration", - "sdRegistrationToolTip": "Die Selbstbeschreibung wurde ausgelöst. Der Vorgang kann bis zu ein paar Minuten dauern.", + "sdRegistrationToolTip": "Das SD-Dokument ist noch nicht geladen. Dies könnte auf die Deaktivierung der SD-Fabrik zurückzuführen sein. Dieser Prozess wird so bald wie möglich vom CX-Administrator neu ausgelöst.", "hostCompanyName": "Host", "providerCompanyName": "Customer", "connectorUrl": "Connector-URL" @@ -645,7 +675,7 @@ "deletemodal": { "title": "EDC-Connector Löschen", "description": "Möchten Sie den ausgewählten Connector wirklich löschen? Die Löschung kann nicht rückgängig gemacht werden.", - "techUserdescription": "Möchten Sie den Connector wirklich löschen? Mit der Löschung wird der Connector automatisch vom Endpunkt „Connector Discovery“ gelöscht und das Selbstbeschreibungsdokument auf inaktiv gesetzt.\n Bitte beachten Sie, dass mit dem Connector ein technischer Benutzer verbunden ist – der technische Benutzer wird ebenfalls sofort inaktiviert, wenn mit dem Löschen fortgefahren wird.", + "techUserdescription": "Möchten Sie den Connector wirklich löschen? Mit der Löschung wird der Connector automatisch vom Endpunkt „Connector Discovery“ gelöscht und das Selbstbeschreibungsdokument auf inaktiv gesetzt.\n Bitte beachten Sie, dass mit dem Connector ein technischer Benutzer verbunden ist. Der technische Benutzer kann gelöscht werden, wenn Sie das Kontrollkästchen unten aktivieren. Andernfalls wird nur die Zuordnung zwischen Connector und technischem Benutzer gelöscht.", "techUserCheckBoxLabel": "Ja, ich möchte den Connector deaktivieren, wodurch automatisch auch der erwähnte technische Benutzer gelöscht wird.", "techDetails": { "title": "Technical Details", @@ -922,7 +952,9 @@ "userDetails": "Technischer Benutzer Details", "description": "Beschreibung", "spoc": "SPOC", - "permission": "Berechtigungen" + "permission": "Berechtigungen", + "companyServiceAccountTypeID": "Firmenservicekontotyp", + "authenticationType": "Authentifizierungstyp" }, "status": { "ACTIVE": "AKTIV", @@ -939,8 +971,7 @@ "resetCredentialError": "Something went wrong", "resetCredentialSuccess": "Credential reset was successful", "tabs": { - "active": "Aktiv", - "inactive": "Inaktiv", + "showAll": "Alle anzeigen", "managed": "Gelang es", "owned": "Besessen" }, @@ -1528,7 +1559,34 @@ "helpText": "For any questions regarding these change(s), please contact the Catena-X helpdesk:", "email": "xxx@xxxx.xxxx", "tenantUrlSuccessMsg": "App Tenant URL successfully updated", - "tenantUrlErrorMsg": "Error! Something went wrong" + "tenantUrlErrorMsg": "Error! Something went wrong", + "externalServices": { + "heading": "Details zum externen Dienst", + "trustedIssuer": { + "label": "Vertrauenswürdiger Aussteller", + "description": "Der vertrauenswürdige Aussteller, der für die Ausstellung der Identitätsnachweise verantwortlich ist." + }, + "participantId": { + "label": "Teilnehmer-ID", + "description": "Die eindeutige Kennung des Teilnehmers im externen System." + }, + "iatpId": { + "label": "IATP-ID", + "description": "Die eindeutige Kennung des IATP-Programms (Identity and Trust Protocol)." + }, + "didResolver": { + "label": "DID-Resolver", + "description": "Die URL des DID-Resolvers (Decentralized Identifier), der für die Auflösung der dezentralen Identitäten verwendet wird." + }, + "decentralIdentityManagementAuthUrl": { + "label": "Auth-URL für dezentrales Identitätsmanagement", + "description": "Die URL des Authentifizierungsendpunkts für das dezentrale Identitätsmanagement." + }, + "decentralIdentityManagementServiceUrl": { + "label": "Service-URL für dezentrales Identitätsmanagement", + "description": "Die URL des Dienstendpunkts für das dezentrale Identitätsmanagement." + } + } } }, "adminBoard": { @@ -1616,7 +1674,8 @@ "DONE": "approved", "IN_PROGRESS": "in progress", "FAILED": "failed", - "TO_DO": "to do" + "TO_DO": "to do", + "SKIPPED": "skipped" }, "buttonApprove": "Approve", "buttonConfirm": "Confirm", @@ -1774,6 +1833,10 @@ "FAILED": { "title": "Ihre Aktion ist erforderlich, um fortzufahren.", "description": "The self-description creation was unsuccessful. Details regarding the unsuccessful process can get found below. Additionally you can retrigger the endpoint (by resetting the status) or close/reject the company registration." + }, + "SKIPPED": { + "title": "Von Ihrer Seite sind keine Maßnahmen erforderlich", + "description": "Die Erstellung der Selbstbeschreibung wurde absichtlich übersprungen. Dieser Prozess wird vom CX-Operator so bald wie möglich wieder ausgelöst." } } }, @@ -2231,7 +2294,8 @@ }, "userRoles": { "title": "Assigned Catena-X Portal Roles", - "changeRoleBtn": "Change Portal Role" + "changeRoleBtn": "Change Portal Role", + "errorMsg": "Sie sind nicht berechtigt, Ihre eigenen Administrator-Rollen zu ändern. Bitte wenden Sie sich an einen anderen Administrator." } }, "global": { diff --git a/src/assets/locales/de/notification.json b/src/assets/locales/de/notification.json index e9fc8600a..541814a1f 100644 --- a/src/assets/locales/de/notification.json +++ b/src/assets/locales/de/notification.json @@ -104,8 +104,8 @@ "appmanagementboard": "App Management Board öffnen", "servicemanagementboard": "Service Management Board öffnen", "appOverview": "Get there", - "appsubscription": "Get there", - "adminboard": "Get there", + "appSubscription": "Get there", + "appAdminBoard": "Get there", "technicaluser": "Get there", "companyRolesServiceProvider": "Get there", "usermanagement": "Get there", diff --git a/src/assets/locales/en/idp.json b/src/assets/locales/en/idp.json index 866939bee..ee41681bb 100644 --- a/src/assets/locales/en/idp.json +++ b/src/assets/locales/en/idp.json @@ -45,8 +45,8 @@ "metadata_url_invalid_error": "Please enter valid metadata url" }, "page": { - "title": "Identity Provider Config", - "desc": "Here you can manage how the users of your company authenticate with Catena-X.

On registration we have created an IDP with one user entry for the admin (that's probably you ;).
Many companies already have their own IDP where users authenticate using their known company user id and a familiar login mask. In this case you will probably prefer to use your own company IDP and you can create and manage the federation on this page." + "title": "Identity Provider configuration", + "desc": "This page provides the functionality to manage user authentication for your company.

Upon registration, we have established an Identity Provider (IDP) with a single user entry for the administrator. Many organizations already maintain their own IDP, where users authenticate using their established company user IDs and familiar login interfaces. In such cases, you may prefer to leverage your existing company IDP. You can create and manage the necessary federation on this page." }, "add": { "title": "Add your Identity Provider (IdP)", diff --git a/src/assets/locales/en/main.json b/src/assets/locales/en/main.json index aef08c23b..d259d062b 100644 --- a/src/assets/locales/en/main.json +++ b/src/assets/locales/en/main.json @@ -38,7 +38,7 @@ "deactivate": "Deactivate", "appReleaseProcess": "App Release Process", "appSubscription": "App Subscription MGT", - "adminboard": "Admin Board", + "appAdminBoard": "Admin Board", "appUserManagement": "App User Management", "userdetails": "User Details", "technicalUserManagement": "Technical User Management", @@ -187,6 +187,7 @@ "buttonprogress": "in progress", "buttonrejected": "rejected", "buttoncompleted": "completed", + "buttonPartiallyCompleted": "partially completed", "buttonerror": "error", "cellconfirmed": "confirmed", "celldeclined": "declined", @@ -455,11 +456,41 @@ "action": "Action" }, "filter": { - "requested": "requested", + "pending": "pending", "active": "active", + "inactive": "inactive", "showAll": "show all" } }, + "companySubscriptionsDetail": { + "language": "Language", + "description": "Description", + "subscribed": "Subscribed", + "requested": "Requested", + "declined": "Declined", + "howtouse": { + "heading": "Documents", + "message": "The terms of use, as well as the data models and further information can be viewed by clicking on the documents shared below." + }, + "privacy": { + "heading": "Privacy Policy", + "message": "The Privacy Policy states which data the business applications collects, handles and processes. The details below explicitly show which company / user information are getting collected/stored.", + "notSupportedMessage": "Currently not yet supported", + "COMPANY_DATA": "Company Data", + "COMPANY_DATA_ICON": "ApartmentIcon", + "USER_DATA": "User Data", + "LOCATION": "Location", + "BROWSER_HISTORY": "Browser History", + "NONE": "None" + }, + "table": { + "connector": "Connector", + "technicalUser": "Technical User" + }, + "technicalUser": { + "heading": "Technical Details" + } + }, "datamanagement": { "message": "Contents of Data Management" }, @@ -568,7 +599,7 @@ "location": "Location", "tooltipText": "Connector's status is pending", "sdDescription": "SD Registration", - "sdRegistrationToolTip": "The Self-Description is triggered. Process might take up to a couple of minutes.", + "sdRegistrationToolTip": "The SD Document is not yet loaded. This could be due to the deactivation of the Sd Factory. This process will be retriggered as soon as possible by the CX Admin", "hostCompanyName": "Host", "providerCompanyName": "Customer", "connectorUrl": "Connector URL" @@ -649,7 +680,7 @@ "deletemodal": { "title": "Delete Connector", "description": "Do you really want to delete the registered connector? Please note that the deletion is not reversable.", - "techUserdescription": "Do you really want to delete the connector? With the deletion the connector will be automatically deleted from the „connector discovery“ endpoint as well as the self-description document will be set to inactive.\n\n Please note, the connector has a technical user connected – the technical user will get inactived immediadetly as well when proceeding with the deletion.", + "techUserdescription": "Do you really want to delete the connector? With the deletion the connector will be automatically deleted from the „connector discovery“ endpoint as well as the self-description document will be set to inactive.\n\n Please note, the connector has a technical user connected - the technical user can be deleted if you select the checkbox below otherwise only the mapping between connector and technical user will be deleted.", "techUserCheckBoxLabel": "Yes, I want to deactivate the connector which will automatically also delete the mentioned technical user.", "techDetails": { "title": "Technical Details", @@ -926,7 +957,9 @@ "userDetails": "Technical User Details", "description": "Description", "spoc": "SPOC", - "permission": "Permission" + "permission": "Permission", + "companyServiceAccountTypeID": "Company Service Account Type", + "authenticationType": "Authentication Type" }, "status": { "ACTIVE": "ACTIVE", @@ -943,8 +976,7 @@ "resetCredentialError": "Something went wrong", "resetCredentialSuccess": "Credential reset was successful", "tabs": { - "active": "Active", - "inactive": "Inactive", + "showAll": "Show All", "managed": "Managed", "owned": "Owned" }, @@ -1495,7 +1527,34 @@ "helpText": "For any questions regarding these change(s), please contact the Catena-X helpdesk:", "email": "xxx@xxxx.xxxx", "tenantUrlSuccessMsg": "App Tenant URL successfully updated", - "tenantUrlErrorMsg": "Error! Something went wrong" + "tenantUrlErrorMsg": "Error! Something went wrong", + "externalServices": { + "heading": "External Service Details", + "trustedIssuer": { + "label": "Trusted Issuer", + "description": "The trusted issuer responsible for issuing the identity credentials." + }, + "participantId": { + "label": "Participant ID", + "description": "The unique identifier of the participant in the external system." + }, + "iatpId": { + "label": "IATP ID", + "description": "The unique identifier of the IATP (Identity and Trust Protocol)." + }, + "didResolver": { + "label": "DID Resolver", + "description": "The URL of the DID (Decentralized Identifier) resolver used for resolving decentralized identities." + }, + "decentralIdentityManagementAuthUrl": { + "label": "Decentralized Identity Management Auth URL", + "description": "The URL of the authentication endpoint for the decentralized identity management." + }, + "decentralIdentityManagementServiceUrl": { + "label": "Decentralized Identity Management Service URL", + "description": "The URL of the service endpoint for the decentralized identity management." + } + } } }, "adminBoard": { @@ -1583,7 +1642,8 @@ "DONE": "approved", "IN_PROGRESS": "in progress", "FAILED": "failed", - "TO_DO": "to do" + "TO_DO": "to do", + "SKIPPED": "skipped" }, "buttonApprove": "Approve", "buttonConfirm": "Confirm", @@ -1741,6 +1801,10 @@ "FAILED": { "title": "Your action is needed.", "description": "The self-description creation was unsuccessful. Details regarding the unsuccessful process can get found below. Additionally you can retrigger the endpoint (by resetting the status) or close/reject the company registration." + }, + "SKIPPED": { + "title": "No action needed from your side", + "description": "The self-description creation was skipped on purpose. This process will be retriggered by the CX Operator as soon as possible." } } }, @@ -2203,7 +2267,8 @@ }, "userRoles": { "title": "Assigned Catena-X Portal Roles", - "changeRoleBtn": "Change Portal Role" + "changeRoleBtn": "Change Portal Role", + "errorMsg": "You are not authorized to change your own admin roles. Please contact another admin." } }, "global": { diff --git a/src/assets/locales/en/notification.json b/src/assets/locales/en/notification.json index 23c467580..b1caf5d9e 100644 --- a/src/assets/locales/en/notification.json +++ b/src/assets/locales/en/notification.json @@ -104,8 +104,8 @@ "appmanagementboard": "Get there", "servicemanagementboard": "Get there", "appOverview": "Get there", - "appsubscription": "Get there", - "adminboard": "Get there", + "appSubscription": "Get there", + "appAdminBoard": "Get there", "technicaluser": "Get there", "companyRolesServiceProvider": "Get there", "usermanagement": "Get there", diff --git a/src/components/AuthProvider.tsx b/src/components/AuthProvider.tsx deleted file mode 100644 index 75fc2f080..000000000 --- a/src/components/AuthProvider.tsx +++ /dev/null @@ -1,35 +0,0 @@ -/******************************************************************************** - * Copyright (c) 2023 BMW Group AG - * Copyright (c) 2023 Contributors to the Eclipse Foundation - * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * SPDX-License-Identifier: Apache-2.0 - ********************************************************************************/ - -import { useEffect } from 'react' -import { useDispatch } from 'react-redux' -import { setLoggedUser } from 'features/user/slice' -import type { IUser } from 'features/user/types' - -export function AuthProvider(props: { - children: JSX.Element - user: IUser -}): JSX.Element { - const dispatch = useDispatch() - useEffect(() => { - dispatch(setLoggedUser(props.user)) - }, [dispatch, props.user]) - return <>{props.children} -} diff --git a/src/components/overlays/ActivateServiceSubscription/index.tsx b/src/components/overlays/ActivateServiceSubscription/index.tsx index bace44311..1806fc8d1 100644 --- a/src/components/overlays/ActivateServiceSubscription/index.tsx +++ b/src/components/overlays/ActivateServiceSubscription/index.tsx @@ -93,45 +93,49 @@ export default function ActivateserviceSubscription({ const tableData: TableType = { head: [t('serviceSubscription.activation.tableheader'), ''], - body: [ - [ - t('serviceSubscription.activation.userId'), - techUserInfo?.technicalUserInfo[0]?.technicalClientId ?? '', - ], - [ - t('serviceSubscription.activation.sercret'), - techUserInfo?.technicalUserInfo[0]?.technicalUserSecret ?? '', - ], - [ - t('serviceSubscription.activation.url'), - techUserInfo?.clientInfo?.clientUrl ?? 'n/a', - ], - [ - t('serviceSubscription.activation.technicaluserType'), - techUserInfo?.technicalUserInfo[0]?.technicalUserPermissions?.join( - ', ' - ) ?? '', - ], - ], - edit: [ - [ - { - icon: false, - }, - { - icon: false, - }, - ], - [ - { - icon: false, - }, - { - icon: false, - copyValue: techUserInfo?.technicalUserInfo[0]?.technicalUserSecret, - }, - ], - ], + body: + techUserInfo?.technicalUserInfo + ?.map((userData) => [ + [ + t('serviceSubscription.activation.userId'), + userData.technicalClientId ?? '', + ], + [ + t('serviceSubscription.activation.sercret'), + userData.technicalUserSecret ?? '', + ], + [ + t('serviceSubscription.activation.url'), + techUserInfo?.clientInfo?.clientUrl ?? 'N/A', + ], + [ + t('serviceSubscription.activation.technicaluserType'), + userData.technicalUserPermissions.join(', ') ?? '', + ], + ]) + .flat(1) ?? [], + edit: + techUserInfo?.technicalUserInfo + ?.map((userData) => [ + [ + { + icon: false, + }, + { + icon: false, + }, + ], + [ + { + icon: false, + }, + { + icon: false, + copyValue: userData.technicalUserSecret, + }, + ], + ]) + .flat(1) ?? [], } return ( @@ -178,7 +182,10 @@ export default function ActivateserviceSubscription({ - + {techUserInfo?.technicalUserInfo && + techUserInfo?.technicalUserInfo?.length > 0 ? ( + + ) : null} - { diff --git a/src/components/pages/CompanySubscriptions/CompanySubscriptionDetail.tsx b/src/components/pages/CompanySubscriptions/CompanySubscriptionDetail.tsx index 425129ac1..359b9b06a 100644 --- a/src/components/pages/CompanySubscriptions/CompanySubscriptionDetail.tsx +++ b/src/components/pages/CompanySubscriptions/CompanySubscriptionDetail.tsx @@ -17,170 +17,60 @@ * SPDX-License-Identifier: Apache-2.0 ********************************************************************************/ -import { - Button, - LogoGrayData, - StaticTable, - Typography, - Image, - BackButton, -} from '@catena-x/portal-shared-components' +import { BackButton } from '@catena-x/portal-shared-components' import { useLocation, useNavigate } from 'react-router-dom' +import { useTranslation } from 'react-i18next' +import { Box } from '@mui/material' import { useFetchAppDetailsQuery, useFetchSubscriptionAppQuery, } from 'features/apps/apiSlice' -import { useTranslation } from 'react-i18next' -import { useEffect, useState } from 'react' -import CommonService from 'services/CommonService' -import { Box } from '@mui/material' import { PAGES } from 'types/Constants' -import CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline' -import UnpublishedIcon from '@mui/icons-material/Unpublished' -import HourglassEmptyIcon from '@mui/icons-material/HourglassEmpty' -import { - type SubscribeTechnicalUserData, - SubscriptionStatus, -} from 'features/apps/types' -import { fetchImageWithToken } from 'services/ImageService' -import { getApiBase } from 'services/EnvironmentService' +import CompanySubscriptionTechnical from './components/CompanySubscriptionTechnical' +import CompanySubscriptionContent from './components/CompanySubscriptionContent' +import CompanySubscriptionHeader from './components/CompanySubscriptionHeader' +import CompanySubscriptionDocument from './components/CompanySubscriptionDocument' +import CompanySubscriptionPrivacy from './components/CompanySubscriptionPrivacyContent' import './CompanySubscriptions.scss' export default function CompanySubscriptionDetail() { const navigate = useNavigate() - const { state } = useLocation() - const items = state + const { state: items } = useLocation() const { t } = useTranslation() - const appId = items.offerId ?? '' - const subscriptionId = items.subscriptionId ?? '' - const { data } = useFetchSubscriptionAppQuery({ appId, subscriptionId }) - const fetchAppsData = useFetchAppDetailsQuery(appId).data - const [docId, setDocId] = useState('') - - const tableData = { - head: [ - t('content.companySubscriptions.connector'), - t('content.companySubscriptions.technicalUser'), - ], - body: [ - [data?.connectorData?.[0]?.name ?? ''], - [ - data?.technicalUserData - ?.map((userdata: SubscribeTechnicalUserData) => userdata.name) - .toString() ?? '', - ], - ], - } - useEffect(() => { - if (fetchAppsData?.leadPictureId) { - const id = CommonService.isValidPictureId(fetchAppsData?.leadPictureId) - setDocId(id) - } - }, [fetchAppsData]) + const appId = items ? items.offerId : '' + const subscriptionId = items ? items.subscriptionId : '' - const renderStatusButton = (status: string) => { - if (status === SubscriptionStatus.ACTIVE) - return ( - - ) - else if (status === SubscriptionStatus.PENDING) - return ( - - ) - else - return ( - - ) - } + // Prevent API call when appId does not exist + const { data } = appId + ? useFetchSubscriptionAppQuery({ appId, subscriptionId }) + : { data: undefined } + const { data: fetchAppsData } = appId + ? useFetchAppDetailsQuery(appId) + : { data: undefined } return (
- - { - navigate(`/${PAGES.COMPANY_SUBSCRIPTIONS}`) - }} - /> - - {data && fetchAppsData && ( - - -
- {fetchAppsData.title} -
-
- - {renderStatusButton(fetchAppsData.isSubscribed)} - - {fetchAppsData.provider} - - - {fetchAppsData.title} - - -
-
- - {'Long description'} - - - {fetchAppsData.longDescription} - - - - {'Technical Details'} - - - + + + { + navigate(`/${PAGES.COMPANY_SUBSCRIPTIONS}`) + }} + /> - )} + {data && fetchAppsData && ( + <> + + + + + + + )} +
) } diff --git a/src/components/pages/CompanySubscriptions/CompanySubscriptions.scss b/src/components/pages/CompanySubscriptions/CompanySubscriptions.scss index 5704f5136..341a448bb 100644 --- a/src/components/pages/CompanySubscriptions/CompanySubscriptions.scss +++ b/src/components/pages/CompanySubscriptions/CompanySubscriptions.scss @@ -10,31 +10,69 @@ * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, eith er express or implied. See the + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. * * SPDX-License-Identifier: Apache-2.0 ********************************************************************************/ +@import 'src/components/styles/_breakpoints'; +@import 'src/components/styles/_colors'; + .company-subscription-detail { min-width: 1440px; + + @include media-breakpoint-up(xs) { + min-width: fit-content; + } + .company-subscription-back { - padding: 48px 256px 48px 160px; + padding: 80px 0 40px; + + @include media-breakpoint-up(md) { + padding: 70px 0 30px; + } + @include media-breakpoint-up(lg) { + transform: translateX(-75px); + } } .company-subscription-content { + width: 100%; + margin: 0 auto; - width: 620px; + + @include media-breakpoint-up(xs) { + max-width: 300px; + } + @include media-breakpoint-up(md) { + max-width: 620px; + } + @include media-breakpoint-up(lg) { + max-width: 970px; + } + .company-subscription-header { background-color: #ffffff; border-radius: 26px; - padding: 12px 0px 5px 12px; - margin-bottom: 55px; + padding: 12px; height: auto; box-shadow: 0px 2px 4px 0px #5050504d; - width: 606px; display: flex; flex-wrap: wrap; + flex-direction: column; + align-items: center; + width: 90%; + margin: 0 auto 55px; + + @include media-breakpoint-up(md) { + width: 100%; + margin-bottom: 55px; + flex-direction: row; + align-items: flex-start; + justify-content: space-between; + } + .lead-image > img { border-radius: 16px; width: 107px !important; @@ -44,6 +82,26 @@ flex: 1 1 0%; display: flex; flex-direction: column; + justify-content: space-between; + padding: 11px 12px; + gap: 10px; + + h5 { + color: color('text-tertiary'); + } + } + } + + #image-gallery { + max-width: calc(80% - 64px); + margin-left: auto; + margin-right: auto; + + @include media-breakpoint-up(md) { + max-width: calc(100% - 64px); + } + @include media-breakpoint-up(lg) { + max-width: 100%; } } } @@ -54,3 +112,9 @@ pointer-events: none !important; padding-left: 0 !important; } +.company-subscription-content-section:not(:last-of-type) { + margin-bottom: 40px; +} +.doc-list { + padding: 0 20px; +} diff --git a/src/components/pages/CompanySubscriptions/components/CompanySubscriptionContent/index.tsx b/src/components/pages/CompanySubscriptions/components/CompanySubscriptionContent/index.tsx new file mode 100644 index 000000000..d984d8c3a --- /dev/null +++ b/src/components/pages/CompanySubscriptions/components/CompanySubscriptionContent/index.tsx @@ -0,0 +1,58 @@ +/******************************************************************************** + * Copyright (c) 2024 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +import { useTranslation } from 'react-i18next' +import { Box, useMediaQuery, useTheme } from '@mui/material' +import { ImageGallery, Typography } from '@catena-x/portal-shared-components' +import { type AppDetails } from 'features/apps/types' +import CommonService from 'services/CommonService' + +export default function CompanySubscriptionContent({ + detail, +}: Readonly<{ + detail: AppDetails +}>) { + const { t } = useTranslation() + const theme = useTheme() + const isMobile = useMediaQuery(theme.breakpoints.down('sm'), { + defaultMatches: true, + }) + return ( + <> + + + {t('content.companySubscriptionsDetail.description')} + + + {detail.longDescription} + + + + + + + ) +} diff --git a/src/components/pages/CompanySubscriptions/components/CompanySubscriptionDocument/index.tsx b/src/components/pages/CompanySubscriptions/components/CompanySubscriptionDocument/index.tsx new file mode 100644 index 000000000..c996573c0 --- /dev/null +++ b/src/components/pages/CompanySubscriptions/components/CompanySubscriptionDocument/index.tsx @@ -0,0 +1,101 @@ +/******************************************************************************** + * Copyright (c) 2024 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +import { useTranslation } from 'react-i18next' +import { Box } from '@mui/material' +import ArticleOutlinedIcon from '@mui/icons-material/ArticleOutlined' +import { Typography } from '@catena-x/portal-shared-components' +import { DocumentTypeId } from 'features/appManagement/apiSlice' +import { useFetchDocumentByIdMutation } from 'features/apps/apiSlice' +import { type AppDetails, type Documents } from 'features/apps/types' +import { download } from 'utils/downloadUtils' +import 'components/styles/document.scss' + +export default function CompanySubscriptionDocument({ + detail, +}: Readonly<{ + detail: AppDetails +}>) { + const { t } = useTranslation() + + const [getDocumentById] = useFetchDocumentByIdMutation() + + const handleDownloadClick = async ( + documentId: string, + documentName: string + ) => { + try { + const response = await getDocumentById({ + appId: detail.id, + documentId, + }).unwrap() + const fileType = response.headers.get('content-type') + const file = response.data + download(file, fileType, documentName) + } catch (error) { + console.error(error, 'ERROR WHILE FETCHING DOCUMENT') + } + } + return ( + + + {t('content.companySubscriptionsDetail.howtouse.heading')} + + + {t('content.companySubscriptionsDetail.howtouse.message')} + + {detail.documents.hasOwnProperty( + DocumentTypeId.APP_TECHNICAL_INFORMATION + ) || + detail.documents.hasOwnProperty(DocumentTypeId.APP_CONTRACT) || + detail.documents.hasOwnProperty(DocumentTypeId.ADDITIONAL_DETAILS) ? ( + Object.keys(detail.documents).map( + (document) => + (document === DocumentTypeId.APP_TECHNICAL_INFORMATION || + document === DocumentTypeId.APP_CONTRACT || + document === DocumentTypeId.ADDITIONAL_DETAILS) && ( +
  • + + +
  • + ) + ) + ) : ( + + {t('global.errors.noDocumentsAvailable')} + + )} +
    + ) +} diff --git a/src/components/pages/CompanySubscriptions/components/CompanySubscriptionHeader/index.tsx b/src/components/pages/CompanySubscriptions/components/CompanySubscriptionHeader/index.tsx new file mode 100644 index 000000000..57ed54406 --- /dev/null +++ b/src/components/pages/CompanySubscriptions/components/CompanySubscriptionHeader/index.tsx @@ -0,0 +1,135 @@ +/******************************************************************************** + * Copyright (c) 2024 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +import { + Button, + Image, + LogoGrayData, + Typography, +} from '@catena-x/portal-shared-components' +import { Box } from '@mui/material' +import CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline' +import UnpublishedIcon from '@mui/icons-material/Unpublished' +import HourglassEmptyIcon from '@mui/icons-material/HourglassEmpty' +import { useTranslation } from 'react-i18next' +import { useEffect, useState } from 'react' +import { type AppDetails, SubscriptionStatus } from 'features/apps/types' +import CommonService from 'services/CommonService' +import { fetchImageWithToken } from 'services/ImageService' +import { getApiBase } from 'services/EnvironmentService' + +export default function CompanySubscriptionHeader({ + detail, +}: Readonly<{ + detail: AppDetails +}>) { + const { t } = useTranslation() + const [docId, setDocId] = useState('') + + useEffect(() => { + if (detail.leadPictureId) { + const id = CommonService.isValidPictureId(detail.leadPictureId) + setDocId(id) + } + }, [detail]) + + const renderStatusButton = (status: string) => { + if (status === SubscriptionStatus.ACTIVE) + return ( + + ) + else if (status === SubscriptionStatus.PENDING) + return ( + + ) + else + return ( + + ) + } + + return ( + +
    + {detail.title} +
    + +
    + {detail.provider} + {detail.title} +
    + + {t('content.companySubscriptionsDetail.language')}: + + {detail.languages.length + ? detail.languages.map((lang, index) => ( + + {` ${index ? ', ' : ''}${lang.toUpperCase()} `} + + )) + : ''} + + +
    + {renderStatusButton(detail.isSubscribed)} +
    + ) +} diff --git a/src/features/user/types.ts b/src/components/pages/CompanySubscriptions/components/CompanySubscriptionPrivacyContent/CompanySubscriptionPrivacyContent.scss similarity index 63% rename from src/features/user/types.ts rename to src/components/pages/CompanySubscriptions/components/CompanySubscriptionPrivacyContent/CompanySubscriptionPrivacyContent.scss index 654dd5483..6df56b2cb 100644 --- a/src/features/user/types.ts +++ b/src/components/pages/CompanySubscriptions/components/CompanySubscriptionPrivacyContent/CompanySubscriptionPrivacyContent.scss @@ -1,6 +1,5 @@ /******************************************************************************** - * Copyright (c) 2023 BMW Group AG - * Copyright (c) 2023 Contributors to the Eclipse Foundation + * Copyright (c) 2024 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -18,16 +17,27 @@ * SPDX-License-Identifier: Apache-2.0 ********************************************************************************/ -import { type KeycloakTokenParsed } from 'keycloak-js' - -export interface IUser { - userName: string - name: string - email: string - company: string - tenant: string - roles: Array - isAdmin: boolean - token?: string - parsedToken?: KeycloakTokenParsed +.company-subscription-detail-privacy { + .privacy-content { + margin-bottom: 32px; + } + .app-policies { + padding: 0 20px; + } + .policies-list { + display: flex; + flex-wrap: wrap; + max-width: none; + margin: 0; + .policy-name { + width: 50%; + display: flex; + align-items: center; + margin-bottom: 10px; + } + .policy-icon { + font-size: 20; + margin-right: 5px; + } + } } diff --git a/src/components/pages/CompanySubscriptions/components/CompanySubscriptionPrivacyContent/index.tsx b/src/components/pages/CompanySubscriptions/components/CompanySubscriptionPrivacyContent/index.tsx new file mode 100644 index 000000000..f57347048 --- /dev/null +++ b/src/components/pages/CompanySubscriptions/components/CompanySubscriptionPrivacyContent/index.tsx @@ -0,0 +1,79 @@ +/******************************************************************************** + * Copyright (c) 2024 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +import { uniqueId } from 'lodash' +import { Apartment, Person, LocationOn, Web, Info } from '@mui/icons-material' +import { useTranslation } from 'react-i18next' +import { Typography } from '@catena-x/portal-shared-components' +import { PrivacyPolicyType } from 'features/adminBoard/adminBoardApiSlice' +import { type AppDetails } from 'features/apps/types' +import './CompanySubscriptionPrivacyContent.scss' + +const policyIcons = { + [PrivacyPolicyType.COMPANY_DATA]: Apartment, + [PrivacyPolicyType.USER_DATA]: Person, + [PrivacyPolicyType.LOCATION]: LocationOn, + [PrivacyPolicyType.BROWSER_HISTORY]: Web, + [PrivacyPolicyType.NONE]: Info, +} + +export default function CompanySubscriptionPrivacy({ + detail, +}: Readonly<{ + detail: AppDetails +}>) { + const { t } = useTranslation('', { + keyPrefix: 'content.companySubscriptionsDetail.privacy', + }) + + const renderPrivacy = (policy: PrivacyPolicyType) => { + const IconComponent = policyIcons[policy] || Apartment + return + } + + return ( +
    +
    + {t('heading')} + {t('message')} +
    + {detail?.privacyPolicies?.length ? ( +
    + {detail.privacyPolicies.map((policy: PrivacyPolicyType) => ( + + {renderPrivacy(policy)} + {t(policy)} + + ))} +
    + ) : ( + + {t('notSupportedMessage')} + + )} +
    + ) +} diff --git a/src/components/pages/CompanySubscriptions/components/CompanySubscriptionTechnical/index.tsx b/src/components/pages/CompanySubscriptions/components/CompanySubscriptionTechnical/index.tsx new file mode 100644 index 000000000..a297ad1e5 --- /dev/null +++ b/src/components/pages/CompanySubscriptions/components/CompanySubscriptionTechnical/index.tsx @@ -0,0 +1,71 @@ +/******************************************************************************** + * Copyright (c) 2024 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +import { Box } from '@mui/material' +import { useTranslation } from 'react-i18next' +import { StaticTable, Typography } from '@catena-x/portal-shared-components' +import { type ActiveSubscriptionDetails } from 'features/apps/types' +import { PAGES, ROLES } from 'types/Constants' +import { userHasPortalRole } from 'services/AccessService' + +export default function CompanySubscriptionTechnical({ + detail, +}: Readonly<{ + detail: ActiveSubscriptionDetails +}>) { + const { t } = useTranslation() + + const tableData = { + head: [ + t('content.companySubscriptionsDetail.table.connector'), + t('content.companySubscriptionsDetail.table.technicalUser'), + ], + body: [ + [ + !detail.connectorData.length ? '' : detail.connectorData[0].name, + !detail.technicalUserData.length + ? '' + : detail.technicalUserData[0].name, + ], + ], + edit: [ + [ + { + icon: false, + }, + { + icon: false, + clickableLink: + userHasPortalRole(ROLES.VIEW_USER_ACCOUNT) && + detail.technicalUserData.length + ? `/${PAGES.USER_DETAILS}/${detail.technicalUserData[0].id}` + : undefined, + }, + ], + ], + } + return ( + + + {t('content.companySubscriptionsDetail.technicalUser.heading')} + + + + ) +} diff --git a/src/components/pages/CompanySubscriptions/index.tsx b/src/components/pages/CompanySubscriptions/index.tsx index 097d5dd03..9c609877f 100644 --- a/src/components/pages/CompanySubscriptions/index.tsx +++ b/src/components/pages/CompanySubscriptions/index.tsx @@ -40,7 +40,7 @@ import { import { CompanySubscriptionsTableColumns } from './CompanySubscriptionsTableColumns' interface FetchHookArgsType { - statusFilter: string + statusId: string expr: string } @@ -50,7 +50,9 @@ export default function CompanySubscriptions() { const [refresh, setRefresh] = useState(0) const [searchExpr, setSearchExpr] = useState('') const [fetchHookArgs, setFetchHookArgs] = useState() - const [filterStatus, setFilterStatus] = useState('') + const [filterStatus, setFilterStatus] = useState( + CompanySubscriptionFilterType.SHOW_ALL + ) const searchInputData = useSelector(updateApplicationRequestSelector) const [group, setGroup] = useState( t('content.companySubscriptions.filter.showAll') @@ -72,8 +74,8 @@ export default function CompanySubscriptions() { const filterView = [ { - buttonText: t('content.companySubscriptions.filter.requested'), - buttonValue: CompanySubscriptionFilterType.REQUESTED, + buttonText: t('content.companySubscriptions.filter.pending'), + buttonValue: CompanySubscriptionFilterType.PENDING, onButtonClick: setView, }, { @@ -81,6 +83,11 @@ export default function CompanySubscriptions() { buttonValue: CompanySubscriptionFilterType.ACTIVE, onButtonClick: setView, }, + { + buttonText: t('content.companySubscriptions.filter.inactive'), + buttonValue: CompanySubscriptionFilterType.INACTIVE, + onButtonClick: setView, + }, { buttonText: t('content.companySubscriptions.filter.showAll'), buttonValue: CompanySubscriptionFilterType.SHOW_ALL, @@ -89,12 +96,10 @@ export default function CompanySubscriptions() { ] useEffect(() => { - if (onValidate(searchExpr)) { - setFetchHookArgs({ - statusFilter: filterStatus, - expr: searchExpr, - }) - } + setFetchHookArgs({ + statusId: filterStatus, + expr: searchExpr, + }) }, [filterStatus, searchExpr]) const onValidate = (expr: string) => { diff --git a/src/components/pages/CompanyWallet/RuleCard.tsx b/src/components/pages/CompanyWallet/RuleCard.tsx index db917ab0c..9d77d6b92 100644 --- a/src/components/pages/CompanyWallet/RuleCard.tsx +++ b/src/components/pages/CompanyWallet/RuleCard.tsx @@ -29,6 +29,8 @@ import { useTranslation } from 'react-i18next' import { Box, Grid } from '@mui/material' import SettingsBackupRestoreIcon from '@mui/icons-material/SettingsBackupRestore' import { getAssetBase } from 'services/EnvironmentService' +import { userHasSsiCredentialRole } from 'services/AccessService' +import { ROLES } from 'types/Constants' type Hash = Record @@ -61,6 +63,7 @@ export default function RuleCard({ const canShowRevoke = (item: WalletContent) => { return ( + userHasSsiCredentialRole(ROLES.REVOKE_CREDENTIALS_ISSUER) && item.status === CredentialSubjectStatus.ACTIVE && item?.credentialType !== CredentialType.MEMBERSHIP && item.credentialType !== CredentialType.BUSINESS_PARTNER_NUMBER diff --git a/src/components/pages/EdcConnector/ConnectorDetailsOverlay.tsx b/src/components/pages/EdcConnector/ConnectorDetailsOverlay.tsx index 525262a2a..cc8169467 100644 --- a/src/components/pages/EdcConnector/ConnectorDetailsOverlay.tsx +++ b/src/components/pages/EdcConnector/ConnectorDetailsOverlay.tsx @@ -32,9 +32,9 @@ import { } from '@catena-x/portal-shared-components' import { type ConnectorDetailsType, - useDeleteConnectorMutation, useUpdateConnectorUrlMutation, useFetchConnectorDetailsQuery, + useFetchSdDocumentMutation, } from 'features/connector/connectorApiSlice' import { Box, Divider, Grid } from '@mui/material' import ArticleOutlinedIcon from '@mui/icons-material/ArticleOutlined' @@ -42,10 +42,9 @@ import { useEffect, useState } from 'react' import { error, success } from 'services/NotifyService' import EditIcon from '@mui/icons-material/Edit' import Patterns from 'types/Patterns' -import { useFetchDocumentMutation } from 'features/serviceManagement/apiSlice' import { download } from 'utils/downloadUtils' -import UserService from 'services/UserService' import { ROLES } from 'types/Constants' +import { userHasPortalRole } from 'services/AccessService' interface DeleteConfirmationOverlayProps { openDialog?: boolean @@ -59,17 +58,13 @@ const ConnectorDetailsOverlay = ({ overlayData, }: DeleteConfirmationOverlayProps) => { const { t } = useTranslation() - const [fetchDocumentById] = useFetchDocumentMutation() + const [fetchSDDocument] = useFetchSdDocumentMutation() const { data: fetchConnectorDetails, isFetching, error: fetchError, refetch, } = useFetchConnectorDetailsQuery(overlayData?.id ?? '') - const [openDeleteConnector, setOpenDeleteConnector] = useState(false) - const [deleteConnectorSuccess, setDeleteConnectorSuccess] = useState(false) - const [deleteConnector] = useDeleteConnectorMutation() - const [deleteLoading, setDeleteLoading] = useState(false) const [enableConnectorUrl, setEnableConnectorUrl] = useState(true) const [updateConnectorUrl] = useUpdateConnectorUrlMutation() const [confirmLoading, setConfirmLoading] = useState(false) @@ -135,10 +130,7 @@ const ConnectorDetailsOverlay = ({ const handleDownloadFn = async (documentId: string, documentName: string) => { if (fetchConnectorDetails?.id) { try { - const response = await fetchDocumentById({ - appId: fetchConnectorDetails.id, - documentId, - }).unwrap() + const response = await fetchSDDocument(documentId).unwrap() const fileType = response.headers.get('content-type') const file = response.data @@ -149,27 +141,6 @@ const ConnectorDetailsOverlay = ({ } } - const handleDeleteConnector = async () => { - setDeleteLoading(true) - await deleteConnector(fetchConnectorDetails?.id ?? '') - .unwrap() - .then(() => { - setDeleteConnectorSuccess(true) - setDeleteLoading(false) - }) - .catch((err) => { - setDeleteConnectorSuccess(false) - setDeleteLoading(false) - error( - err.status === 409 - ? err.data.title - : t('content.edcconnector.details.errormessage'), - '', - err - ) - }) - } - const handleUrlSubmit = async () => { setConfirmLoading(true) @@ -303,86 +274,6 @@ const ConnectorDetailsOverlay = ({ )} - {openDeleteConnector && ( - - - - - {deleteConnectorSuccess - ? t('content.edcconnector.details.connectorDeletedSuccessfully') - : t('content.edcconnector.details.wantToDeleteConnector')} - - - - {deleteConnectorSuccess ? ( - - ) : ( - - )} - - {deleteLoading ? ( - - - - ) : ( - !deleteConnectorSuccess && ( - - ) - )} - - - )} - + + - + )} - )} diff --git a/src/components/pages/EdcConnector/DeleteConfirmationOverlay/DeleteConfirmationOverlay.tsx b/src/components/pages/EdcConnector/DeleteConfirmationOverlay/DeleteConfirmationOverlay.tsx index 017d180fe..78b0ae933 100644 --- a/src/components/pages/EdcConnector/DeleteConfirmationOverlay/DeleteConfirmationOverlay.tsx +++ b/src/components/pages/EdcConnector/DeleteConfirmationOverlay/DeleteConfirmationOverlay.tsx @@ -35,7 +35,7 @@ import Box from '@mui/material/Box' interface DeleteConfirmationOverlayProps { openDialog?: boolean handleOverlayClose: React.MouseEventHandler - handleConfirmClick: React.MouseEventHandler + handleConfirmClick: (status: boolean) => void loading?: boolean techUser?: { id: string @@ -138,9 +138,8 @@ const DeleteConfirmationOverlay = ({ {!loading && (