diff --git a/src/components/drawers/exports/exportActions.tsx b/.archive/components/drawers/exports/exportActions.tsx similarity index 100% rename from src/components/drawers/exports/exportActions.tsx rename to .archive/components/drawers/exports/exportActions.tsx diff --git a/.github/dependabot.yml b/.github/dependabot.yml index e775a1f9b..067137189 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -7,6 +7,9 @@ updates: target-branch: "main" schedule: interval: "weekly" + day: "monday" + time: "06:00" + timezone: "America/New_York" labels: - "dependency-bot" commit-message: diff --git a/locales/data.json b/locales/data.json index 822fe105b..b994fb930 100644 --- a/locales/data.json +++ b/locales/data.json @@ -6836,7 +6836,7 @@ "exportNameTooLong": [ { "type": 0, - "value": "Should not exceed 50 characters" + "value": "Should not exceed 255 characters" } ], "exportResolution": [ diff --git a/locales/translations.json b/locales/translations.json index dd0b1a2ac..1c81ca727 100644 --- a/locales/translations.json +++ b/locales/translations.json @@ -301,7 +301,7 @@ "exportHeading": "{groupBy, select, account {Aggregates of the following accounts will be exported to a .csv file.} aws_category {Aggregates of the following cost categories will be exported to a .csv file.} cluster {Aggregates of the following clusters will be exported to a .csv file.} gcp_project {Aggregates of the following GCP projects will be exported to a .csv file.} instance {Aggregates of the following instances will be exported to a .csv file.} node {Aggregates of the following nodes will be exported to a .csv file.} org_unit_id {Aggregates of the following organizational units will be exported to a .csv file.} payer_tenant_id {Aggregates of the following accounts will be exported to a .csv file.} product_service {Aggregates of the following services will be exported to a .csv file.} project {Aggregates of the following projects will be exported to a .csv file.} region {Aggregates of the following regions will be exported to a .csv file.} resource_location {Aggregates of the regions will be exported to a .csv file.} service {Aggregates of the following services will be exported to a .csv file.} service_name {Aggregates of the following services will be exported to a .csv file.} subscription_guid {Aggregates of the following accounts will be exported to a .csv file.} tag {Aggregates of the following tags will be exported to a .csv file.} other {}}", "exportName": "{groupBy, select, account {{provider, select, aws {Amazon Web Services grouped by Account} aws_ocp {Amazon Web Services filtered by OpenShift grouped by Account} azure {Microsoft Azure grouped by Account} oci {Oracle Cloud Infrastructure grouped by Account} azure_ocp {Microsoft Azure filtered by OpenShift grouped by Account} gcp {Google Cloud Platform grouped by Account} gcp_ocp {Google Cloud Platform filtered by OpenShift grouped by Account} ibm {IBM Cloud grouped by Account} ibm_ocp {IBM Cloud filtered by OpenShift grouped by Account} ocp {OpenShift grouped by Account} ocp_cloud {All cloud filtered by OpenShift grouped by Account} other {}}} aws_category {{provider, select, aws {Amazon Web Services grouped by Cost category} aws_ocp {Amazon Web Services filtered by OpenShift grouped by Cost category} azure {Microsoft Azure grouped by Cost category} oci {Oracle Cloud Infrastructure grouped by Cost category} azure_ocp {Microsoft Azure filtered by OpenShift grouped by Cost category} gcp {Google Cloud Platform grouped by Cost category} gcp_ocp {Google Cloud Platform filtered by OpenShift grouped by Cost category} ibm {IBM Cloud grouped by Cost category} ibm_ocp {IBM Cloud filtered by OpenShift grouped by Cost category} ocp {OpenShift grouped by Cost category} ocp_cloud {All cloud filtered by OpenShift grouped by Cost category} other {}}} cluster {{provider, select, aws {Amazon Web Services grouped by Cluster} aws_ocp {Amazon Web Services filtered by OpenShift grouped by Cluster} azure {Microsoft Azure grouped by Cluster} oci {Oracle Cloud Infrastructure grouped by Cluster} azure_ocp {Microsoft Azure filtered by OpenShift grouped by Cluster} gcp {Google Cloud Platform grouped by Cluster} gcp_ocp {Google Cloud Platform filtered by OpenShift grouped by Cluster} ibm {IBM Cloud grouped by Cluster} ibm_ocp {IBM Cloud filtered by OpenShift grouped by Cluster} ocp {OpenShift grouped by Cluster} ocp_cloud {All cloud filtered by OpenShift grouped by Cluster} other {}}} gcp_project {{provider, select, aws {Amazon Web Services grouped by GCP Project} aws_ocp {Amazon Web Services filtered by OpenShift grouped by GCP Project} azure {Microsoft Azure grouped by GCP Project} oci {Oracle Cloud Infrastructure grouped by GCP Project} azure_ocp {Microsoft Azure filtered by OpenShift grouped by GCP Project} gcp {Google Cloud Platform grouped by GCP Project} gcp_ocp {Google Cloud Platform filtered by OpenShift grouped by GCP Project} ibm {IBM Cloud grouped by GCP Project} ibm_ocp {IBM Cloud filtered by OpenShift grouped by GCP Project} ocp {OpenShift grouped by GCP Project} ocp_cloud {All cloud filtered by OpenShift grouped by GCP Project} other {}}} instance {{provider, select, aws {Amazon Web Services grouped by instance} aws_ocp {Amazon Web Services filtered by OpenShift grouped by instance} azure {Microsoft Azure grouped by instance} oci {Oracle Cloud Infrastructure grouped by instance} azure_ocp {Microsoft Azure filtered by OpenShift grouped by instance} gcp {Google Cloud Platform grouped by instance} gcp_ocp {Google Cloud Platform filtered by OpenShift grouped by instance} ibm {IBM Cloud grouped by instance} ibm_ocp {IBM Cloud filtered by OpenShift grouped by instance} ocp {OpenShift grouped by instance} ocp_cloud {All cloud filtered by OpenShift grouped by instance} other {}}} node {{provider, select, aws {Amazon Web Services grouped by Node} aws_ocp {Amazon Web Services filtered by OpenShift grouped by Node} azure {Microsoft Azure grouped by Node} oci {Oracle Cloud Infrastructure grouped by Node} azure_ocp {Microsoft Azure filtered by OpenShift grouped by Node} gcp {Google Cloud Platform grouped by Node} gcp_ocp {Google Cloud Platform filtered by OpenShift grouped by Node} ibm {IBM Cloud grouped by Node} ibm_ocp {IBM Cloud filtered by OpenShift grouped by Node} ocp {OpenShift grouped by Node} ocp_cloud {All cloud filtered by OpenShift grouped by Node} other {}}} org_unit_id {{provider, select, aws {Amazon Web Services grouped by Organizational unit} aws_ocp {Amazon Web Services filtered by OpenShift grouped by Organizational unit} azure {Microsoft Azure grouped by Organizational unit} oci {Oracle Cloud Infrastructure grouped by Organizational unit} azure_ocp {Microsoft Azure filtered by OpenShift grouped by Organizational unit} gcp {Google Cloud Platform grouped by Organizational unit} gcp_ocp {Google Cloud Platform filtered by OpenShift grouped by Organizational unit} ibm {IBM Cloud grouped by Organizational unit} ibm_ocp {IBM Cloud filtered by OpenShift grouped by Organizational unit} ocp {OpenShift grouped by Organizational unit} ocp_cloud {All cloud filtered by OpenShift grouped by Organizational unit} other {}}} payer_tenant_id {{provider, select, oci {Oracle Cloud Infrastructure grouped by Account} other {}}}product_service {{provider, select, oci {Oracle Cloud Infrastructure grouped by Service} other {}}}project {{provider, select, aws {Amazon Web Services grouped by Project} aws_ocp {Amazon Web Services filtered by OpenShift grouped by Project} azure {Microsoft Azure grouped by Project} oci {Oracle Cloud Infrastructure grouped by Project} azure_ocp {Microsoft Azure filtered by OpenShift grouped by Project} gcp {Google Cloud Platform grouped by Project} gcp_ocp {Google Cloud Platform filtered by OpenShift grouped by Project} ibm {IBM Cloud grouped by Project} ibm_ocp {IBM Cloud filtered by OpenShift grouped by Project} ocp {OpenShift grouped by Project} ocp_cloud {All cloud filtered by OpenShift grouped by Project} other {}}} region {{provider, select, aws {Amazon Web Services grouped by Region} aws_ocp {Amazon Web Services filtered by OpenShift grouped by Region} azure {Microsoft Azure grouped by Region} oci {Oracle Cloud Infrastructure grouped by Region} azure_ocp {Microsoft Azure filtered by OpenShift grouped by Region} gcp {Google Cloud Platform grouped by Region} gcp_ocp {Google Cloud Platform filtered by OpenShift grouped by Region} ibm {IBM Cloud grouped by Region} ibm_ocp {IBM Cloud filtered by OpenShift grouped by Region} ocp {OpenShift grouped by Region} ocp_cloud {All cloud filtered by OpenShift grouped by Region} other {}}} resource_location {{provider, select, aws {Amazon Web Services grouped by Region} aws_ocp {Amazon Web Services filtered by OpenShift grouped by Region} azure {Microsoft Azure grouped by Region} oci {Oracle Cloud Infrastructure grouped by Region} azure_ocp {Microsoft Azure filtered by OpenShift grouped by Region} gcp {Google Cloud Platform grouped by Region} gcp_ocp {Google Cloud Platform filtered by OpenShift grouped by Region} ibm {IBM Cloud grouped by Region} ibm_ocp {IBM Cloud filtered by OpenShift grouped by Region} ocp {OpenShift grouped by Region} ocp_cloud {All cloud filtered by OpenShift grouped by Region} other {}}} service {{provider, select, aws {Amazon Web Services grouped by Service} aws_ocp {Amazon Web Services filtered by OpenShift grouped by Service} azure {Microsoft Azure grouped by Service} oci {Oracle Cloud Infrastructure grouped by Service} azure_ocp {Microsoft Azure filtered by OpenShift grouped by Service} gcp {Google Cloud Platform grouped by Service} gcp_ocp {Google Cloud Platform filtered by OpenShift grouped by Service} ibm {IBM Cloud grouped by Service} ibm_ocp {IBM Cloud filtered by OpenShift grouped by Service} ocp {OpenShift grouped by Service} ocp_cloud {All cloud filtered by OpenShift grouped by Service} other {}}} service_name {{provider, select, aws {Amazon Web Services grouped by Service} aws_ocp {Amazon Web Services filtered by OpenShift grouped by Service} azure {Microsoft Azure grouped by Service} oci {Oracle Cloud Infrastructure grouped by Service} azure_ocp {Microsoft Azure filtered by OpenShift grouped by Service} gcp {Google Cloud Platform grouped by Service} gcp_ocp {Google Cloud Platform filtered by OpenShift grouped by Service} ibm {IBM Cloud grouped by Service} ibm_ocp {IBM Cloud filtered by OpenShift grouped by Service} ocp {OpenShift grouped by Service} ocp_cloud {All cloud filtered by OpenShift grouped by Service} other {}}} subscription_guid {{provider, select, aws {Amazon Web Services grouped by Account} aws_ocp {Amazon Web Services filtered by OpenShift grouped by Account} azure {Microsoft Azure grouped by Account} oci {Oracle Cloud Infrastructure grouped by Account} azure_ocp {Microsoft Azure filtered by OpenShift grouped by Account} gcp {Google Cloud Platform grouped by Account} gcp_ocp {Google Cloud Platform filtered by OpenShift grouped by Account} ibm {IBM Cloud grouped by Account} ibm_ocp {IBM Cloud filtered by OpenShift grouped by Account} ocp {OpenShift grouped by Account} ocp_cloud {All cloud filtered by OpenShift grouped by Account} other {}}} tag {{provider, select, aws {Amazon Web Services grouped by Tag} aws_ocp {Amazon Web Services filtered by OpenShift grouped by Tag} azure {Microsoft Azure grouped by Tag} oci {Oracle Cloud Infrastructure grouped by Tag} azure_ocp {Microsoft Azure filtered by OpenShift grouped by Tag} gcp {Google Cloud Platform grouped by Tag} gcp_ocp {Google Cloud Platform filtered by OpenShift grouped by Tag} ibm {IBM Cloud grouped by Tag} ibm_ocp {IBM Cloud filtered by OpenShift grouped by Tag} ocp {OpenShift grouped by Tag} ocp_cloud {All cloud filtered by OpenShift grouped by Tag} other {}}} other {}}", "exportNameRequired": "Please enter a name for the export", - "exportNameTooLong": "Should not exceed 50 characters", + "exportNameTooLong": "Should not exceed 255 characters", "exportResolution": "{value, select, daily {Daily} monthly {Monthly} other {}}", "exportSelected": "{groupBy, select, account {Selected accounts ({count})} aws_category {Selected cost categories ({count})} cluster {Selected clusters ({count})} gcp_project {Selected GCP projects ({count})} instance {Selected instances ({count})} node {Selected nodes ({count})} org_unit_id {Selected organizational units ({count})} payer_tenant_id {Selected accounts ({count})} product_service {Selected services ({count})} project {Selected projects ({count})} region {Selected regions ({count})} resource_location {Selected regions ({count})} service {Selected services ({count})} service_name {Selected services ({count})} subscription_guid {Selected accounts ({count})} tag {Selected tags ({count})} other {}}", "exportTimeScope": "{value, select, current {Current ({date})} previous {Previous ({date})} other {}}", diff --git a/package-lock.json b/package-lock.json index 49e7310c8..e48405cc3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "@redhat-cloud-services/frontend-components-notifications": "^4.1.0", "@redhat-cloud-services/frontend-components-translations": "^3.2.7", "@redhat-cloud-services/frontend-components-utilities": "^4.0.11", - "@redhat-cloud-services/rbac-client": "^2.0.2", + "@redhat-cloud-services/rbac-client": "^2.0.3", "@reduxjs/toolkit": "^2.2.5", "@unleash/proxy-client-react": "^4.2.4", "axios": "^1.7.2", @@ -33,7 +33,7 @@ "react-dom": "^18.3.1", "react-intl": "^6.6.8", "react-redux": "^9.1.2", - "react-router-dom": "^6.23.1", + "react-router-dom": "^6.24.0", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "typesafe-actions": "^5.1.0", @@ -47,9 +47,9 @@ "@formatjs/ecma402-abstract": "^2.0.0", "@formatjs/icu-messageformat-parser": "^2.7.8", "@redhat-cloud-services/eslint-config-redhat-cloud-services": "^2.0.4", - "@redhat-cloud-services/frontend-components-config": "^6.0.16", + "@redhat-cloud-services/frontend-components-config": "^6.0.17", "@redhat-cloud-services/tsc-transform-imports": "^1.0.11", - "@swc/core": "^1.6.1", + "@swc/core": "^1.6.5", "@swc/jest": "^0.2.36", "@testing-library/jest-dom": "^6.4.6", "@testing-library/react": "^16.0.0", @@ -60,18 +60,18 @@ "@types/react-dom": "^18.3.0", "@types/react-redux": "^7.1.33", "@types/react-router-dom": "^5.3.3", - "@typescript-eslint/eslint-plugin": "^7.13.0", - "@typescript-eslint/parser": "^7.13.0", + "@typescript-eslint/eslint-plugin": "^7.14.1", + "@typescript-eslint/parser": "^7.14.1", "aphrodite": "^2.4.0", "copy-webpack-plugin": "^12.0.2", "eslint": "^9.5.0", "eslint-plugin-formatjs": "^4.13.3", "eslint-plugin-jest-dom": "^5.4.0", - "eslint-plugin-jsdoc": "^48.2.12", + "eslint-plugin-jsdoc": "^48.4.0", "eslint-plugin-markdown": "^5.0.0", "eslint-plugin-patternfly-react": "^5.3.0", "eslint-plugin-prettier": "^5.1.3", - "eslint-plugin-react": "^7.34.2", + "eslint-plugin-react": "^7.34.3", "eslint-plugin-simple-import-sort": "^12.1.0", "eslint-plugin-sort-keys-fix": "^1.1.2", "eslint-plugin-testing-library": "^6.2.2", @@ -89,7 +89,7 @@ "swc_mut_cjs_exports": "^0.90.24", "ts-jest": "^29.1.5", "ts-patch": "^3.2.0", - "typescript": "^5.4.5", + "typescript": "^5.5.2", "webpack-bundle-analyzer": "^4.10.2" }, "engines": { @@ -2546,9 +2546,9 @@ } }, "node_modules/@redhat-cloud-services/frontend-components-config": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-config/-/frontend-components-config-6.0.16.tgz", - "integrity": "sha512-yjKC6Duredwck/Jx4imbznIkZg+HC5PzMXhSveWvc1A7LBlB7aPh5Y3hXBh+umRng7/1HScEB1xGYe97+FomZQ==", + "version": "6.0.17", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-config/-/frontend-components-config-6.0.17.tgz", + "integrity": "sha512-vjK1im7aE6s7k3rBCB/wBNioRO9DtegieD78mwRTCBXJaaOvuPXm5yzg5+SIR4Q/CNlccrcjle9ISN8gSfqaLQ==", "dev": true, "dependencies": { "@pmmmwh/react-refresh-webpack-plugin": "^0.5.8", @@ -3056,24 +3056,15 @@ } }, "node_modules/@redhat-cloud-services/rbac-client": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/rbac-client/-/rbac-client-2.0.2.tgz", - "integrity": "sha512-xI6KssmZzz76dWbBVaDsJROfbbEBAy/66SVChbLGzqAYaIPVeB2LVjfT7K512vhieoReKBA5u9mZPsNUdsbVHg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/rbac-client/-/rbac-client-2.0.3.tgz", + "integrity": "sha512-aBvojrpP5pFjuQVgcF7oo0FqdYVwK2GcVte+Adyxh002Pv9McU60FoZBzGSk+hJ9NztW7aFeyS+HmGau/iqYGg==", "dependencies": { "@redhat-cloud-services/javascript-clients-shared": "^1.2.2", - "axios": "^0.27.2", + "axios": "^1.7.2", "tslib": "^2.6.2" } }, - "node_modules/@redhat-cloud-services/rbac-client/node_modules/axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", - "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - }, "node_modules/@redhat-cloud-services/tsc-transform-imports": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@redhat-cloud-services/tsc-transform-imports/-/tsc-transform-imports-1.0.11.tgz", @@ -3138,9 +3129,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.1.tgz", - "integrity": "sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.17.0.tgz", + "integrity": "sha512-2D6XaHEVvkCn682XBnipbJjgZUU7xjLtA4dGJRBVUKpEaDYOZMENZoZjAOSb7qirxt5RupjzZxz4fK2FO+EFPw==", "engines": { "node": ">=14.0.0" } @@ -3305,14 +3296,14 @@ } }, "node_modules/@swc/core": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.6.1.tgz", - "integrity": "sha512-Yz5uj5hNZpS5brLtBvKY0L4s2tBAbQ4TjmW8xF1EC3YLFxQRrUjMP49Zm1kp/KYyYvTkSaG48Ffj2YWLu9nChw==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.6.5.tgz", + "integrity": "sha512-tyVvUK/HDOUUsK6/GmWvnqUtD9oDpPUA4f7f7JCOV8hXxtfjMtAZeBKf93yrB1XZet69TDR7EN0hFC6i4MF0Ig==", "dev": true, "hasInstallScript": true, "dependencies": { "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.8" + "@swc/types": "^0.1.9" }, "engines": { "node": ">=10" @@ -3322,16 +3313,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.6.1", - "@swc/core-darwin-x64": "1.6.1", - "@swc/core-linux-arm-gnueabihf": "1.6.1", - "@swc/core-linux-arm64-gnu": "1.6.1", - "@swc/core-linux-arm64-musl": "1.6.1", - "@swc/core-linux-x64-gnu": "1.6.1", - "@swc/core-linux-x64-musl": "1.6.1", - "@swc/core-win32-arm64-msvc": "1.6.1", - "@swc/core-win32-ia32-msvc": "1.6.1", - "@swc/core-win32-x64-msvc": "1.6.1" + "@swc/core-darwin-arm64": "1.6.5", + "@swc/core-darwin-x64": "1.6.5", + "@swc/core-linux-arm-gnueabihf": "1.6.5", + "@swc/core-linux-arm64-gnu": "1.6.5", + "@swc/core-linux-arm64-musl": "1.6.5", + "@swc/core-linux-x64-gnu": "1.6.5", + "@swc/core-linux-x64-musl": "1.6.5", + "@swc/core-win32-arm64-msvc": "1.6.5", + "@swc/core-win32-ia32-msvc": "1.6.5", + "@swc/core-win32-x64-msvc": "1.6.5" }, "peerDependencies": { "@swc/helpers": "*" @@ -3343,9 +3334,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.6.1.tgz", - "integrity": "sha512-u6GdwOXsOEdNAdSI6nWq6G2BQw5HiSNIZVcBaH1iSvBnxZvWbnIKyDiZKaYnDwTLHLzig2GuUjjE2NaCJPy4jg==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.6.5.tgz", + "integrity": "sha512-RGQhMdni2v1/ANQ/2K+F+QYdzaucekYBewZcX1ogqJ8G5sbPaBdYdDN1qQ4kHLCIkPtGP6qC7c71qPEqL2RidQ==", "cpu": [ "arm64" ], @@ -3359,9 +3350,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.6.1.tgz", - "integrity": "sha512-/tXwQibkDNLVbAtr7PUQI0iQjoB708fjhDDDfJ6WILSBVZ3+qs/LHjJ7jHwumEYxVq1XA7Fv2Q7SE/ZSQoWHcQ==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.6.5.tgz", + "integrity": "sha512-/pSN0/Jtcbbb9+ovS9rKxR3qertpFAM3OEJr/+Dh/8yy7jK5G5EFPIrfsw/7Q5987ERPIJIH6BspK2CBB2tgcg==", "cpu": [ "x64" ], @@ -3375,9 +3366,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.6.1.tgz", - "integrity": "sha512-aDgipxhJTms8iH78emHVutFR2c16LNhO+NTRCdYi+X4PyIn58/DyYTH6VDZ0AeEcS5f132ZFldU5AEgExwihXA==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.6.5.tgz", + "integrity": "sha512-B0g/dROCE747RRegs/jPHuKJgwXLracDhnqQa80kFdgWEMjlcb7OMCgs5OX86yJGRS4qcYbiMGD0Pp7Kbqn3yw==", "cpu": [ "arm" ], @@ -3391,9 +3382,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.6.1.tgz", - "integrity": "sha512-XkJ+eO4zUKG5g458RyhmKPyBGxI0FwfWFgpfIj5eDybxYJ6s4HBT5MoxyBLorB5kMlZ0XoY/usUMobPVY3nL0g==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.6.5.tgz", + "integrity": "sha512-W8meapgXTq8AOtSvDG4yKR8ant2WWD++yOjgzAleB5VAC+oC+aa8YJROGxj8HepurU8kurqzcialwoMeq5SZZQ==", "cpu": [ "arm64" ], @@ -3407,9 +3398,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.6.1.tgz", - "integrity": "sha512-dr6YbLBg/SsNxs1hDqJhxdcrS8dGMlOXJwXIrUvACiA8jAd6S5BxYCaqsCefLYXtaOmu0bbx1FB/evfodqB70Q==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.6.5.tgz", + "integrity": "sha512-jyCKqoX50Fg8rJUQqh4u5PqnE7nqYKXHjVH2WcYr114/MU21zlsI+YL6aOQU1XP8bJQ2gPQ1rnlnGJdEHiKS/w==", "cpu": [ "arm64" ], @@ -3423,9 +3414,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.6.1.tgz", - "integrity": "sha512-A0b/3V+yFy4LXh3O9umIE7LXPC7NBWdjl6AQYqymSMcMu0EOb1/iygA6s6uWhz9y3e172Hpb9b/CGsuD8Px/bg==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.6.5.tgz", + "integrity": "sha512-G6HmUn/RRIlXC0YYFfBz2qh6OZkHS/KUPkhoG4X9ADcgWXXjOFh6JrefwsYj8VBAJEnr5iewzjNfj+nztwHaeA==", "cpu": [ "x64" ], @@ -3439,9 +3430,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.6.1.tgz", - "integrity": "sha512-5dJjlzZXhC87nZZZWbpiDP8kBIO0ibis893F/rtPIQBI5poH+iJuA32EU3wN4/WFHeK4et8z6SGSVghPtWyk4g==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.6.5.tgz", + "integrity": "sha512-AQpBjBnelQDSbeTJA50AXdS6+CP66LsXIMNTwhPSgUfE7Bx1ggZV11Fsi4Q5SGcs6a8Qw1cuYKN57ZfZC5QOuA==", "cpu": [ "x64" ], @@ -3455,9 +3446,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.6.1.tgz", - "integrity": "sha512-HBi1ZlwvfcUibLtT3g/lP57FaDPC799AD6InolB2KSgkqyBbZJ9wAXM8/CcH67GLIP0tZ7FqblrJTzGXxetTJQ==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.6.5.tgz", + "integrity": "sha512-MZTWM8kUwS30pVrtbzSGEXtek46aXNb/mT9D6rsS7NvOuv2w+qZhjR1rzf4LNbbn5f8VnR4Nac1WIOYZmfC5ng==", "cpu": [ "arm64" ], @@ -3471,9 +3462,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.6.1.tgz", - "integrity": "sha512-AKqHohlWERclexar5y6ux4sQ8yaMejEXNxeKXm7xPhXrp13/1p4/I3E5bPVX/jMnvpm4HpcKSP0ee2WsqmhhPw==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.6.5.tgz", + "integrity": "sha512-WZdu4gISAr3yOm1fVwKhhk6+MrP7kVX0KMP7+ZQFTN5zXQEiDSDunEJKVgjMVj3vlR+6mnAqa/L0V9Qa8+zKlQ==", "cpu": [ "ia32" ], @@ -3487,9 +3478,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.6.1.tgz", - "integrity": "sha512-0dLdTLd+ONve8kgC5T6VQ2Y5G+OZ7y0ujjapnK66wpvCBM6BKYGdT/OKhZKZydrC5gUKaxFN6Y5oOt9JOFUrOQ==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.6.5.tgz", + "integrity": "sha512-ezXgucnMTzlFIxQZw7ls/5r2hseFaRoDL04cuXUOs97E8r+nJSmFsRQm/ygH5jBeXNo59nyZCalrjJAjwfgACA==", "cpu": [ "x64" ], @@ -3526,9 +3517,9 @@ } }, "node_modules/@swc/types": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.8.tgz", - "integrity": "sha512-RNFA3+7OJFNYY78x0FYwi1Ow+iF1eF5WvmfY1nXPOEH4R2p/D4Cr1vzje7dNAI2aLFqpv8Wyz4oKSWqIZArpQA==", + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.9.tgz", + "integrity": "sha512-qKnCno++jzcJ4lM4NTfYifm1EFSCeIfKiAHAfkENZAV5Kl9PjJIyd2yeeVv6c/2CckuLyv2NmRC5pv6pm2WQBg==", "dev": true, "dependencies": { "@swc/counter": "^0.1.3" @@ -4453,16 +4444,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.13.0.tgz", - "integrity": "sha512-FX1X6AF0w8MdVFLSdqwqN/me2hyhuQg4ykN6ZpVhh1ij/80pTvDKclX1sZB9iqex8SjQfVhwMKs3JtnnMLzG9w==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.14.1.tgz", + "integrity": "sha512-aAJd6bIf2vvQRjUG3ZkNXkmBpN+J7Wd0mfQiiVCJMu9Z5GcZZdcc0j8XwN/BM97Fl7e3SkTXODSk4VehUv7CGw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.13.0", - "@typescript-eslint/type-utils": "7.13.0", - "@typescript-eslint/utils": "7.13.0", - "@typescript-eslint/visitor-keys": "7.13.0", + "@typescript-eslint/scope-manager": "7.14.1", + "@typescript-eslint/type-utils": "7.14.1", + "@typescript-eslint/utils": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -4486,15 +4477,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.13.0.tgz", - "integrity": "sha512-EjMfl69KOS9awXXe83iRN7oIEXy9yYdqWfqdrFAYAAr6syP8eLEFI7ZE4939antx2mNgPRW/o1ybm2SFYkbTVA==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.14.1.tgz", + "integrity": "sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.13.0", - "@typescript-eslint/types": "7.13.0", - "@typescript-eslint/typescript-estree": "7.13.0", - "@typescript-eslint/visitor-keys": "7.13.0", + "@typescript-eslint/scope-manager": "7.14.1", + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/typescript-estree": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1", "debug": "^4.3.4" }, "engines": { @@ -4514,13 +4505,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.13.0.tgz", - "integrity": "sha512-ZrMCe1R6a01T94ilV13egvcnvVJ1pxShkE0+NDjDzH4nvG1wXpwsVI5bZCvE7AEDH1mXEx5tJSVR68bLgG7Dng==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.14.1.tgz", + "integrity": "sha512-gPrFSsoYcsffYXTOZ+hT7fyJr95rdVe4kGVX1ps/dJ+DfmlnjFN/GcMxXcVkeHDKqsq6uAcVaQaIi3cFffmAbA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.13.0", - "@typescript-eslint/visitor-keys": "7.13.0" + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -4531,13 +4522,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.13.0.tgz", - "integrity": "sha512-xMEtMzxq9eRkZy48XuxlBFzpVMDurUAfDu5Rz16GouAtXm0TaAoTFzqWUFPPuQYXI/CDaH/Bgx/fk/84t/Bc9A==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.14.1.tgz", + "integrity": "sha512-/MzmgNd3nnbDbOi3LfasXWWe292+iuo+umJ0bCCMCPc1jLO/z2BQmWUUUXvXLbrQey/JgzdF/OV+I5bzEGwJkQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.13.0", - "@typescript-eslint/utils": "7.13.0", + "@typescript-eslint/typescript-estree": "7.14.1", + "@typescript-eslint/utils": "7.14.1", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -4558,9 +4549,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.13.0.tgz", - "integrity": "sha512-QWuwm9wcGMAuTsxP+qz6LBBd3Uq8I5Nv8xb0mk54jmNoCyDspnMvVsOxI6IsMmway5d1S9Su2+sCKv1st2l6eA==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.14.1.tgz", + "integrity": "sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg==", "dev": true, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -4571,13 +4562,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.13.0.tgz", - "integrity": "sha512-cAvBvUoobaoIcoqox1YatXOnSl3gx92rCZoMRPzMNisDiM12siGilSM4+dJAekuuHTibI2hVC2fYK79iSFvWjw==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.14.1.tgz", + "integrity": "sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.13.0", - "@typescript-eslint/visitor-keys": "7.13.0", + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -4626,15 +4617,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.13.0.tgz", - "integrity": "sha512-jceD8RgdKORVnB4Y6BqasfIkFhl4pajB1wVxrF4akxD2QPM8GNYjgGwEzYS+437ewlqqrg7Dw+6dhdpjMpeBFQ==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.14.1.tgz", + "integrity": "sha512-CMmVVELns3nak3cpJhZosDkm63n+DwBlDX8g0k4QUa9BMnF+lH2lr3d130M1Zt1xxmB3LLk3NV7KQCq86ZBBhQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.13.0", - "@typescript-eslint/types": "7.13.0", - "@typescript-eslint/typescript-estree": "7.13.0" + "@typescript-eslint/scope-manager": "7.14.1", + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/typescript-estree": "7.14.1" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -4648,12 +4639,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.13.0.tgz", - "integrity": "sha512-nxn+dozQx+MK61nn/JP+M4eCkHDSxSLDpgE3WcQo0+fkjEolnaB5jswvIKC4K56By8MMgIho7f1PVxERHEo8rw==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.14.1.tgz", + "integrity": "sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.13.0", + "@typescript-eslint/types": "7.14.1", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -5342,16 +5333,19 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", - "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.1.0", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/arraybuffer.prototype.slice": { @@ -8489,9 +8483,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, "node_modules/es-object-atoms": { @@ -9317,9 +9311,9 @@ "dev": true }, "node_modules/eslint-plugin-jsdoc": { - "version": "48.2.12", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.12.tgz", - "integrity": "sha512-sO9sKkJx5ovWoRk9hV0YiNzXQ4Z6j27CqE/po2E3wddZVuy9wvKPSTiIhpxMTrP/qURvKayJIDB2+o9kyCW1Fw==", + "version": "48.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.4.0.tgz", + "integrity": "sha512-xBUxuAx03cKoEA7y+MYSUdwyN8AJyZHbAJ257sOFXgVgCScm574S4zEYJpBoARwaCu4chhCbvA+gdm+00whlxA==", "dev": true, "dependencies": { "@es-joy/jsdoccomment": "~0.43.1", @@ -9328,8 +9322,10 @@ "debug": "^4.3.4", "escape-string-regexp": "^4.0.0", "esquery": "^1.5.0", + "parse-imports": "^2.1.0", "semver": "^7.6.2", - "spdx-expression-parse": "^4.0.0" + "spdx-expression-parse": "^4.0.0", + "synckit": "^0.9.0" }, "engines": { "node": ">=18" @@ -9362,6 +9358,22 @@ "node": ">=10" } }, + "node_modules/eslint-plugin-jsdoc/node_modules/synckit": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.0.tgz", + "integrity": "sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/eslint-plugin-jsx-a11y": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", @@ -9677,16 +9689,16 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.34.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.2.tgz", - "integrity": "sha512-2HCmrU+/JNigDN6tg55cRDKCQWicYAPB38JGSFDQt95jDm8rrvSUo7YPkOIm5l6ts1j1zCvysNcasvfTMQzUOw==", + "version": "7.34.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz", + "integrity": "sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==", "dev": true, "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.2", "array.prototype.toreversed": "^1.1.2", - "array.prototype.tosorted": "^1.1.3", + "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.0.19", "estraverse": "^5.3.0", @@ -17117,6 +17129,19 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/parse-imports": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.1.0.tgz", + "integrity": "sha512-JQWgmK2o4w8leUkZeZPatWdAny6vXGU/3siIUvMF6J2rDCud9aTt8h/px9oZJ6U3EcfhngBJ635uPFI0q0VAeA==", + "dev": true, + "dependencies": { + "es-module-lexer": "^1.5.3", + "slashes": "^3.0.12" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -18000,11 +18025,11 @@ } }, "node_modules/react-router": { - "version": "6.23.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.23.1.tgz", - "integrity": "sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==", + "version": "6.24.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.24.0.tgz", + "integrity": "sha512-sQrgJ5bXk7vbcC4BxQxeNa5UmboFm35we1AFK0VvQaz9g0LzxEIuLOhHIoZ8rnu9BO21ishGeL9no1WB76W/eg==", "dependencies": { - "@remix-run/router": "1.16.1" + "@remix-run/router": "1.17.0" }, "engines": { "node": ">=14.0.0" @@ -18014,12 +18039,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.23.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.1.tgz", - "integrity": "sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==", + "version": "6.24.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.24.0.tgz", + "integrity": "sha512-960sKuau6/yEwS8e+NVEidYQb1hNjAYM327gjEyXlc6r3Skf2vtwuJ2l7lssdegD2YjoKG5l8MsVyeTDlVeY8g==", "dependencies": { - "@remix-run/router": "1.16.1", - "react-router": "6.23.1" + "@remix-run/router": "1.17.0", + "react-router": "6.24.0" }, "engines": { "node": ">=14.0.0" @@ -18997,6 +19022,12 @@ "node": ">=8" } }, + "node_modules/slashes": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz", + "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==", + "dev": true + }, "node_modules/slice-ansi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", @@ -20468,9 +20499,9 @@ } }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.2.tgz", + "integrity": "sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==", "devOptional": true, "bin": { "tsc": "bin/tsc", @@ -21522,9 +21553,9 @@ } }, "node_modules/webpack-bundle-analyzer/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "engines": { "node": ">=8.3.0" @@ -22118,9 +22149,9 @@ } }, "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, "engines": { "node": ">=10.0.0" diff --git a/package.json b/package.json index 55e351e0c..9f69843ee 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "@redhat-cloud-services/frontend-components-notifications": "^4.1.0", "@redhat-cloud-services/frontend-components-translations": "^3.2.7", "@redhat-cloud-services/frontend-components-utilities": "^4.0.11", - "@redhat-cloud-services/rbac-client": "^2.0.2", + "@redhat-cloud-services/rbac-client": "^2.0.3", "@reduxjs/toolkit": "^2.2.5", "@unleash/proxy-client-react": "^4.2.4", "axios": "^1.7.2", @@ -73,7 +73,7 @@ "react-dom": "^18.3.1", "react-intl": "^6.6.8", "react-redux": "^9.1.2", - "react-router-dom": "^6.23.1", + "react-router-dom": "^6.24.0", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "typesafe-actions": "^5.1.0", @@ -87,9 +87,9 @@ "@formatjs/ecma402-abstract": "^2.0.0", "@formatjs/icu-messageformat-parser": "^2.7.8", "@redhat-cloud-services/eslint-config-redhat-cloud-services": "^2.0.4", - "@redhat-cloud-services/frontend-components-config": "^6.0.16", + "@redhat-cloud-services/frontend-components-config": "^6.0.17", "@redhat-cloud-services/tsc-transform-imports": "^1.0.11", - "@swc/core": "^1.6.1", + "@swc/core": "^1.6.5", "@swc/jest": "^0.2.36", "@testing-library/jest-dom": "^6.4.6", "@testing-library/react": "^16.0.0", @@ -100,18 +100,18 @@ "@types/react-dom": "^18.3.0", "@types/react-redux": "^7.1.33", "@types/react-router-dom": "^5.3.3", - "@typescript-eslint/eslint-plugin": "^7.13.0", - "@typescript-eslint/parser": "^7.13.0", + "@typescript-eslint/eslint-plugin": "^7.14.1", + "@typescript-eslint/parser": "^7.14.1", "aphrodite": "^2.4.0", "copy-webpack-plugin": "^12.0.2", "eslint": "^9.5.0", "eslint-plugin-formatjs": "^4.13.3", "eslint-plugin-jest-dom": "^5.4.0", - "eslint-plugin-jsdoc": "^48.2.12", + "eslint-plugin-jsdoc": "^48.4.0", "eslint-plugin-markdown": "^5.0.0", "eslint-plugin-patternfly-react": "^5.3.0", "eslint-plugin-prettier": "^5.1.3", - "eslint-plugin-react": "^7.34.2", + "eslint-plugin-react": "^7.34.3", "eslint-plugin-simple-import-sort": "^12.1.0", "eslint-plugin-sort-keys-fix": "^1.1.2", "eslint-plugin-testing-library": "^6.2.2", @@ -129,7 +129,7 @@ "swc_mut_cjs_exports": "^0.90.24", "ts-jest": "^29.1.5", "ts-patch": "^3.2.0", - "typescript": "^5.4.5", + "typescript": "^5.5.2", "webpack-bundle-analyzer": "^4.10.2" }, "overrides": { diff --git a/src/components/drawers/exports/exportsTable.tsx b/src/components/drawers/exports/exportsTable.tsx index f5a4096a8..337cb0b16 100644 --- a/src/components/drawers/exports/exportsTable.tsx +++ b/src/components/drawers/exports/exportsTable.tsx @@ -1,5 +1,4 @@ import { - Bullseye, Button, ButtonVariant, EmptyState, @@ -9,15 +8,12 @@ import { EmptyStateIcon, Label, Popover, - Spinner, } from '@patternfly/react-core'; import { DownloadIcon } from '@patternfly/react-icons/dist/esm/icons/download-icon'; import { ExclamationCircleIcon } from '@patternfly/react-icons/dist/esm/icons/exclamation-circle-icon'; import { OutlinedClockIcon } from '@patternfly/react-icons/dist/esm/icons/outlined-clock-icon'; import { PlusCircleIcon } from '@patternfly/react-icons/dist/esm/icons/plus-circle-icon'; import { SyncIcon } from '@patternfly/react-icons/dist/esm/icons/sync-icon'; -import { sortable, SortByDirection, TableVariant } from '@patternfly/react-table'; -import { Table, TableBody, TableHeader } from '@patternfly/react-table/deprecated'; import type { Query } from 'api/queries/query'; import { getQuery } from 'api/queries/query'; import type { Report } from 'api/reports/report'; @@ -25,46 +21,34 @@ import messages from 'locales/messages'; import React from 'react'; import type { WrappedComponentProps } from 'react-intl'; import { injectIntl } from 'react-intl'; +import { DataTable } from 'routes/components/dataTable'; +import type { DropdownWrapperItem } from 'routes/components/dropdownWrapper'; +import { DropdownWrapper } from 'routes/components/dropdownWrapper'; import { EmptyFilterState } from 'routes/components/state/emptyFilterState'; -import { ExportsActions } from './exportActions'; import { styles } from './exportsTable.styles'; interface ExportsTableOwnProps { isLoading?: boolean; onClose(); - onSort(value: string, isSortAscending: boolean); + onSort(sortType: string, isSortAscending: boolean); query: Query; report: Report; } interface ExportsTableState { columns?: any[]; - loadingRows?: any[]; rows?: any[]; } type ExportsTableProps = ExportsTableOwnProps & WrappedComponentProps; -export const ExportsTableColumnIds = { - actions: 'actions', - created: 'created', - expires: 'expires', - names: 'names', - status: 'status', -}; - class ExportsTableBase extends React.Component { public state: ExportsTableState = { columns: [], rows: [], }; - constructor(props: ExportsTableProps) { - super(props); - this.handleOnSort = this.handleOnSort.bind(this); - } - public componentDidMount() { this.initDatum(); } @@ -90,30 +74,25 @@ class ExportsTableBase extends React.Component { rows.push({ cells: [ - { title:
{item.name}
, id: ExportsTableColumnIds.names }, - { title:
{item.created}
, id: ExportsTableColumnIds.created }, - { title:
{item.expires}
, id: ExportsTableColumnIds.expires }, - { title: this.getStatus(item.status), id: ExportsTableColumnIds.status }, - { title: , id: ExportsTableColumnIds.actions }, + { value: item.name }, + { value: item.created }, + { value: item.expires }, + { value: this.getStatus(item.status) }, + { value: this.getActions() }, ], item, }); }); } - - const loadingRows = [ - { - heightAuto: true, - cells: [ - { - props: { colSpan: 7 }, - title: ( - -
- -
-
- ), - }, - ], - }, - ]; - this.setState({ columns, - loadingRows, rows, }); }; + private getActions = () => { + const { intl } = this.props; + + const items: DropdownWrapperItem[] = [ + { + onClick: this.handleOnDelete, + toString: () => intl.formatMessage(messages.delete), + }, + ]; + return ; + }; + private getEmptyState = () => { const { onClose, query, intl } = this.props; @@ -185,27 +156,6 @@ class ExportsTableBase extends React.Component { - const { query } = this.props; - const { columns } = this.state; - - let index = -1; - let direction: any = SortByDirection.asc; - - for (const key of Object.keys(query.order_by)) { - let c = 0; - for (const column of columns) { - if (column.orderBy === key) { - direction = query.order_by[key] === 'asc' ? SortByDirection.asc : SortByDirection.desc; - index = c; - break; - } - c++; - } - } - return index > -1 ? { index, direction } : {}; - }; - private getStatus = (status: string) => { const { intl } = this.props; @@ -275,36 +225,20 @@ class ExportsTableBase extends React.Component { - const { onSort } = this.props; - const { columns } = this.state; - - if (onSort) { - const orderBy = columns[index - 1].orderBy; - const isSortAscending = direction === SortByDirection.asc; - onSort(orderBy, isSortAscending); - } - }; - public render() { - const { intl, isLoading } = this.props; - const { columns, loadingRows, rows } = this.state; + const { intl, isLoading, onSort, query } = this.props; + const { columns, rows } = this.state; return ( - <> - - - -
- {rows.length === 0 &&
{this.getEmptyState()}
} - + ); } } diff --git a/src/locales/messages.ts b/src/locales/messages.ts index f5b245a67..89ce907f6 100644 --- a/src/locales/messages.ts +++ b/src/locales/messages.ts @@ -1834,8 +1834,8 @@ export default defineMessages({ id: 'exportNameRequired', }, exportNameTooLong: { - defaultMessage: 'Should not exceed 50 characters', - description: 'Should not exceed 50 characters', + defaultMessage: 'Should not exceed 255 characters', + description: 'Should not exceed 255 characters', id: 'exportNameTooLong', }, exportResolution: { diff --git a/src/routes/components/dataTable/dataTable.tsx b/src/routes/components/dataTable/dataTable.tsx index 4871f9f03..07ae4a492 100644 --- a/src/routes/components/dataTable/dataTable.tsx +++ b/src/routes/components/dataTable/dataTable.tsx @@ -23,6 +23,7 @@ import { withRouter } from 'utils/router'; import { styles } from './dataTable.styles'; interface DataTableOwnProps { + ariaLabel?: string; columns?: any[]; emptyState?: React.ReactNode; filterBy: any; @@ -30,7 +31,7 @@ interface DataTableOwnProps { isLoading?: boolean; isSelectable?: boolean; onSelect(items: any[], isSelected: boolean); - onSort(value: string, isSortAscending: boolean); + onSort(sortType: string, isSortAscending: boolean); orderBy: any; rows?: any[]; selectedItems?: ComputedReportItem[]; @@ -114,12 +115,12 @@ class DataTable extends React.Component { }; public render() { - const { columns, intl, isActionsCell, isLoading, isSelectable, rows, variant } = this.props; + const { ariaLabel, columns, intl, isActionsCell, isLoading, isSelectable, rows, variant } = this.props; return ( <> 50) { + if (value.length > 255) { return messages.exportNameTooLong; } return undefined; diff --git a/src/routes/details/awsBreakdown/instances/instancesTable.tsx b/src/routes/details/awsBreakdown/instances/instancesTable.tsx index 5c16e1382..8ef4f8fa2 100644 --- a/src/routes/details/awsBreakdown/instances/instancesTable.tsx +++ b/src/routes/details/awsBreakdown/instances/instancesTable.tsx @@ -21,7 +21,7 @@ interface InstancesTableOwnProps { isAllSelected?: boolean; isLoading?: boolean; onSelect(items: ComputedReportItem[], isSelected: boolean); - onSort(value: string, isSortAscending: boolean); + onSort(sortType: string, isSortAscending: boolean); orderBy?: any; query?: Query; report?: Report; @@ -203,9 +203,9 @@ const InstancesTable: React.FC = ({ ); }; - const handleOnSort = (value: string, isSortAscending: boolean) => { + const handleOnSort = (sortType: string, isSortAscending: boolean) => { if (onSort) { - onSort(value, isSortAscending); + onSort(sortType, isSortAscending); } }; diff --git a/src/routes/details/awsDetails/detailsTable.tsx b/src/routes/details/awsDetails/detailsTable.tsx index d4b81acdd..7db527a08 100644 --- a/src/routes/details/awsDetails/detailsTable.tsx +++ b/src/routes/details/awsDetails/detailsTable.tsx @@ -33,7 +33,7 @@ interface DetailsTableOwnProps extends RouterComponentProps, WrappedComponentPro isAllSelected?: boolean; isLoading?: boolean; onSelect(items: ComputedReportItem[], isSelected: boolean); - onSort(value: string, isSortAscending: boolean); + onSort(sortType: string, isSortAscending: boolean); orderBy?: any; query?: Query; report: AwsReport; diff --git a/src/routes/details/azureDetails/detailsTable.tsx b/src/routes/details/azureDetails/detailsTable.tsx index b6450f569..8c1aeae43 100644 --- a/src/routes/details/azureDetails/detailsTable.tsx +++ b/src/routes/details/azureDetails/detailsTable.tsx @@ -31,7 +31,7 @@ interface DetailsTableOwnProps extends RouterComponentProps, WrappedComponentPro groupByTagKey?: string; isLoading?: boolean; onSelect(items: ComputedReportItem[], isSelected: boolean); - onSort(value: string, isSortAscending: boolean); + onSort(sortType: string, isSortAscending: boolean); orderBy?: any; query?: Query; report: AzureReport; diff --git a/src/routes/details/components/pvcChart/modal/pvcTable.tsx b/src/routes/details/components/pvcChart/modal/pvcTable.tsx index d0152b266..f1daffd1c 100644 --- a/src/routes/details/components/pvcChart/modal/pvcTable.tsx +++ b/src/routes/details/components/pvcChart/modal/pvcTable.tsx @@ -13,7 +13,7 @@ import { formatUsage, unitsLookupKey } from 'utils/format'; interface PvcTableOwnProps { filterBy?: any; isLoading?: boolean; - onSort(value: string, isSortAscending: boolean); + onSort(sortType: string, isSortAscending: boolean); orderBy?: any; report: OcpReport; reportQueryString: string; @@ -115,9 +115,9 @@ const PvcTable: React.FC = ({ filterBy, isLoading, onSort, orderB setRows(filteredRows); }; - const handleOnSort = (value: string, isSortAscending: boolean) => { + const handleOnSort = (sortType: string, isSortAscending: boolean) => { if (onSort) { - onSort(value, isSortAscending); + onSort(sortType, isSortAscending); } }; diff --git a/src/routes/details/gcpDetails/detailsTable.tsx b/src/routes/details/gcpDetails/detailsTable.tsx index 56e855f68..05da7c36a 100644 --- a/src/routes/details/gcpDetails/detailsTable.tsx +++ b/src/routes/details/gcpDetails/detailsTable.tsx @@ -31,7 +31,7 @@ interface DetailsTableOwnProps extends RouterComponentProps, WrappedComponentPro isAllSelected?: boolean; isLoading?: boolean; onSelect(items: ComputedReportItem[], isSelected: boolean); - onSort(value: string, isSortAscending: boolean); + onSort(sortType: string, isSortAscending: boolean); orderBy?: any; query?: Query; report: GcpReport; diff --git a/src/routes/details/ibmDetails/detailsTable.tsx b/src/routes/details/ibmDetails/detailsTable.tsx index 9723c8344..d9df2dc6d 100644 --- a/src/routes/details/ibmDetails/detailsTable.tsx +++ b/src/routes/details/ibmDetails/detailsTable.tsx @@ -31,7 +31,7 @@ interface DetailsTableOwnProps extends RouterComponentProps, WrappedComponentPro isAllSelected?: boolean; isLoading?: boolean; onSelect(items: ComputedReportItem[], isSelected: boolean); - onSort(value: string, isSortAscending: boolean); + onSort(sortType: string, isSortAscending: boolean); orderBy?: any; query?: Query; report: IbmReport; diff --git a/src/routes/details/ociDetails/detailsTable.tsx b/src/routes/details/ociDetails/detailsTable.tsx index 318665219..5d1cb6898 100644 --- a/src/routes/details/ociDetails/detailsTable.tsx +++ b/src/routes/details/ociDetails/detailsTable.tsx @@ -31,7 +31,7 @@ interface DetailsTableOwnProps extends RouterComponentProps, WrappedComponentPro groupByTagKey?: string; isLoading?: boolean; onSelect(items: ComputedReportItem[], isSelected: boolean); - onSort(value: string, isSortAscending: boolean); + onSort(sortType: string, isSortAscending: boolean); orderBy?: any; query?: Query; report: OciReport; diff --git a/src/routes/details/ocpDetails/detailsTable.tsx b/src/routes/details/ocpDetails/detailsTable.tsx index 875e6d0d5..0399e5395 100644 --- a/src/routes/details/ocpDetails/detailsTable.tsx +++ b/src/routes/details/ocpDetails/detailsTable.tsx @@ -42,7 +42,7 @@ interface DetailsTableOwnProps extends RouterComponentProps, WrappedComponentPro isLoading?: boolean; isRosToggleEnabled?: boolean; onSelect(items: ComputedReportItem[], isSelected: boolean); - onSort(value: string, isSortAscending: boolean); + onSort(sortType: string, isSortAscending: boolean); orderBy?: any; query?: Query; report: OcpReport; diff --git a/src/routes/details/rhelDetails/detailsTable.tsx b/src/routes/details/rhelDetails/detailsTable.tsx index 9b699b1d5..dfbd42684 100644 --- a/src/routes/details/rhelDetails/detailsTable.tsx +++ b/src/routes/details/rhelDetails/detailsTable.tsx @@ -33,7 +33,7 @@ interface DetailsTableOwnProps extends RouterComponentProps, WrappedComponentPro isAllSelected?: boolean; isLoading?: boolean; onSelect(items: ComputedReportItem[], isSelected: boolean); - onSort(value: string, isSortAscending: boolean); + onSort(sortType: string, isSortAscending: boolean); orderBy?: any; query?: Query; report: RhelReport; diff --git a/src/routes/explorer/explorerTable.tsx b/src/routes/explorer/explorerTable.tsx index 723056f76..ab08d63a5 100644 --- a/src/routes/explorer/explorerTable.tsx +++ b/src/routes/explorer/explorerTable.tsx @@ -55,7 +55,7 @@ interface ExplorerTableOwnProps extends RouterComponentProps, WrappedComponentPr isAllSelected?: boolean; isLoading?: boolean; onSelect(items: ComputedReportItem[], isSelected: boolean); - onSort(value: string, isSortAscending: boolean, date: string); + onSort(sortType: string, isSortAscending: boolean, date: string); perspective: PerspectiveType; query: Query; report: Report; diff --git a/src/routes/settings/costCategory/costCategoryTable.tsx b/src/routes/settings/costCategory/costCategoryTable.tsx index 3eeaa1d81..bb1b1c2cb 100644 --- a/src/routes/settings/costCategory/costCategoryTable.tsx +++ b/src/routes/settings/costCategory/costCategoryTable.tsx @@ -12,7 +12,7 @@ interface CostCategoryTableOwnProps { filterBy?: any; isLoading?: boolean; onSelect(items: SettingsData[], isSelected: boolean); - onSort(value: string, isSortAscending: boolean); + onSort(sortType: string, isSortAscending: boolean); orderBy?: any; selectedItems?: SettingsData[]; settings: Settings; diff --git a/src/routes/settings/costModels/costModelWizard/costModelWizard.tsx b/src/routes/settings/costModels/costModelWizard/costModelWizard.tsx index 21db7d921..258886e4a 100644 --- a/src/routes/settings/costModels/costModelWizard/costModelWizard.tsx +++ b/src/routes/settings/costModels/costModelWizard/costModelWizard.tsx @@ -1,6 +1,5 @@ -import { Button, Icon, Modal, Title, TitleSizes } from '@patternfly/react-core'; -import type { WizardStepFunctionType } from '@patternfly/react-core/deprecated'; -import { Wizard } from '@patternfly/react-core/deprecated'; +import { Button, Icon, Modal, Title, TitleSizes, Wizard, WizardHeader, WizardStep } from '@patternfly/react-core'; +import { ModalVariant } from '@patternfly/react-core/next'; import { ExclamationTriangleIcon } from '@patternfly/react-icons/dist/esm/icons/exclamation-triangle-icon'; import { addCostModel } from 'api/costModels'; import type { MetricHash } from 'api/metrics'; @@ -33,12 +32,12 @@ interface InternalWizardBaseProps extends WrappedComponentProps { isSuccess: boolean; closeFnc: () => void; isOpen: boolean; - onMove: WizardStepFunctionType; + onMove: (id: number) => void; validators: ((any) => boolean)[]; steps: any[]; current: number; context: any; - setError: (string) => void; + setError: (error: string) => void; setSuccess: () => void; updateCostModel: () => void; metricsHash: MetricHash; @@ -73,80 +72,102 @@ const InternalWizardBase: React.FC = ({ onMove, validators, steps, - current = 1, + current = 0, context, setError, setSuccess, updateCostModel, }) => { - const newSteps = steps.map((step, ix) => { - return { - ...step, - canJumpTo: current > ix, + const EmptyFooter = () => null; + const isAddingRate = context.type === 'OCP' && current === 1 && !validators[current](context); + const isFooterHidden = isSuccess || isProcess || isAddingRate; + + const newSteps = [...steps]; + newSteps[current].isNextDisabled = !validators[current](context); + + if (current === newSteps.length - 1) { + newSteps[current].onNext = () => { + const { + currency, + description, + distribution, + distributeNetwork, + distributePlatformUnallocated, + distributeStorage, + distributeWorkerUnallocated, + isDiscount, + markup, + name, + type, + tiers, + sources, + } = context; + addCostModel({ + name, + source_type: type, + currency, + description, + distribution_info: { + distribution_type: distribution, + network_unattributed: distributeNetwork, + platform_cost: distributePlatformUnallocated, + storage_unattributed: distributeStorage, + worker_cost: distributeWorkerUnallocated, + }, + rates: tiers, + markup: { + value: `${isDiscount ? '-' : ''}${unFormat(markup)}`, + unit: 'percent', + }, + source_uuids: sources.map(src => src.uuid), + }) + .then(() => { + setSuccess(); + updateCostModel(); + }) + .catch(err => setError(parseApiError(err))); }; - }); - newSteps[current - 1].enableNext = validators[current - 1](context); - const isAddingRate = context.type === 'OCP' && current === 2 && !validators[current - 1](context); - if (current === steps.length && context.type !== '') { - newSteps[current - 1].nextButtonText = intl.formatMessage(messages.create); } - return isOpen ? ( - : null} - onSave={() => { - const { - currency, - description, - distribution, - distributeNetwork, - distributePlatformUnallocated, - distributeStorage, - distributeWorkerUnallocated, - isDiscount, - markup, - name, - type, - tiers, - sources, - } = context; - addCostModel({ - name, - source_type: type, - currency, - description, - distribution_info: { - distribution_type: distribution, - network_unattributed: distributeNetwork, - platform_cost: distributePlatformUnallocated, - storage_unattributed: distributeStorage, - worker_cost: distributeWorkerUnallocated, - }, - rates: tiers, - markup: { - value: `${isDiscount ? '-' : ''}${unFormat(markup)}`, - unit: 'percent', - }, - source_uuids: sources.map(src => src.uuid), - }) - .then(() => { - setSuccess(); - updateCostModel(); - }) - .catch(err => setError(parseApiError(err))); - }} - /> - ) : null; + // Todo: Remove key={newSteps.length} workaround -- see https://github.com/patternfly/patternfly-react/issues/9752 + return ( + + + } + isVisitRequired + key={newSteps.length} + onClose={closeFnc} + onStepChange={(_evt, currentStep) => onMove(currentStep.id as number)} + > + {newSteps.map(step => ( + + ) : ( + { + isNextDisabled: step.isNextDisabled, + ...(step.nextButtonText && { nextButtonText: step.nextButtonText }), + ...(step.onNext && { onNext: step.onNext }), + } + ) + } + id={step.id} + key={step.id} + name={step.name} + > + {step.component} + + ))} + + + ); }; const InternalWizard = injectIntl(InternalWizardBase); @@ -238,7 +259,7 @@ class CostModelWizardBase extends React.Component ({ '': [ { - id: 1, + id: 0, name: intl.formatMessage(messages.costModelsWizardStepsGenInfo), component: , }, ], Azure: [ { - id: 1, + id: 0, name: intl.formatMessage(messages.costModelsWizardStepsGenInfo), component: , }, { - id: 2, + id: 1, name: intl.formatMessage(messages.costCalculations), component: , }, { - id: 3, + id: 2, name: intl.formatMessage(messages.costModelsWizardStepsSources), component: , }, { - id: 4, + id: 3, name: intl.formatMessage(messages.costModelsWizardStepsReview), component: , + nextButtonText: intl.formatMessage(messages.create), }, ], AWS: [ { - id: 1, + id: 0, name: intl.formatMessage(messages.costModelsWizardStepsGenInfo), component: , }, { - id: 2, + id: 1, name: intl.formatMessage(messages.costCalculations), component: , }, { - id: 3, + id: 2, name: intl.formatMessage(messages.costModelsWizardStepsSources), component: , }, { - id: 4, + id: 3, name: intl.formatMessage(messages.costModelsWizardStepsReview), component: , + nextButtonText: intl.formatMessage(messages.create), }, ], GCP: [ { - id: 1, + id: 0, name: intl.formatMessage(messages.costModelsWizardStepsGenInfo), component: , }, { - id: 2, + id: 1, name: intl.formatMessage(messages.costCalculations), component: , }, { - id: 3, + id: 2, name: intl.formatMessage(messages.costModelsWizardStepsSources), component: , }, { - id: 4, + id: 3, name: intl.formatMessage(messages.costModelsWizardStepsReview), component: , + nextButtonText: intl.formatMessage(messages.create), }, ], OCP: [ { - id: 1, + id: 0, name: intl.formatMessage(messages.costModelsWizardStepsGenInfo), component: , }, { - id: 2, + id: 1, name: intl.formatMessage(messages.priceList), component: , }, { - id: 3, + id: 2, name: intl.formatMessage(messages.costCalculations), component: , }, { - id: 4, + id: 3, name: intl.formatMessage(messages.costDistribution), component: , }, { - id: 5, + id: 4, name: intl.formatMessage(messages.costModelsWizardStepsSources), component: , }, { - id: 6, + id: 5, name: intl.formatMessage(messages.costModelsWizardStepsReview), component: , + nextButtonText: intl.formatMessage(messages.create), }, ], }); @@ -527,8 +552,8 @@ class CostModelWizardBase extends React.Component { if ( - (this.state.type === 'OCP' && this.state.step > 1 && this.state.tiers.length > 0) || - (this.state.type !== 'OCP' && this.state.step > 2) + (this.state.type === 'OCP' && this.state.step > 0 && this.state.tiers.length > 0) || + (this.state.type !== 'OCP' && this.state.step > 1) ) { this.setState({ isDialogOpen: true }, this.props.closeWizard); } else { @@ -536,7 +561,7 @@ class CostModelWizardBase extends React.Component this.setState({ step: Number(curr.id) })} + onMove={id => this.setState({ step: Number(id) })} steps={stepsHash()[this.state.type]} current={this.state.step} validators={validatorsHash[this.state.type]} diff --git a/src/routes/settings/platformProjects/platformProjectsTable.tsx b/src/routes/settings/platformProjects/platformProjectsTable.tsx index fd6633591..17e352f93 100644 --- a/src/routes/settings/platformProjects/platformProjectsTable.tsx +++ b/src/routes/settings/platformProjects/platformProjectsTable.tsx @@ -14,7 +14,7 @@ interface PlatformProjectsTableOwnProps { filterBy?: any; isLoading?: boolean; onSelect(items: SettingsData[], isSelected: boolean); - onSort(value: string, isSortAscending: boolean); + onSort(sortType: string, isSortAscending: boolean); orderBy?: any; selectedItems?: SettingsData[]; settings: Settings; diff --git a/src/routes/settings/tagLabels/tagMapping/components/childTags/childTagsTable.tsx b/src/routes/settings/tagLabels/tagMapping/components/childTags/childTagsTable.tsx index 5713b9441..f4463ab31 100644 --- a/src/routes/settings/tagLabels/tagMapping/components/childTags/childTagsTable.tsx +++ b/src/routes/settings/tagLabels/tagMapping/components/childTags/childTagsTable.tsx @@ -12,7 +12,7 @@ interface ChildTagsTableOwnProps { isAllSelected?: boolean; isLoading?: boolean; onSelect(items: SettingsData[], isSelected: boolean); - onSort(value: string, isSortAscending: boolean); + onSort(sortType: string, isSortAscending: boolean); orderBy?: any; selectedItems?: SettingsData[]; settings: Settings; diff --git a/src/routes/settings/tagLabels/tagMapping/components/parentTags/parentTagsTable.tsx b/src/routes/settings/tagLabels/tagMapping/components/parentTags/parentTagsTable.tsx index f2df28e42..e7cbeb2b6 100644 --- a/src/routes/settings/tagLabels/tagMapping/components/parentTags/parentTagsTable.tsx +++ b/src/routes/settings/tagLabels/tagMapping/components/parentTags/parentTagsTable.tsx @@ -11,7 +11,7 @@ interface ParentTagsTableOwnProps { filterBy?: any; isLoading?: boolean; onSelect(items: SettingsData[], isSelected: boolean); - onSort(value: string, isSortAscending: boolean); + onSort(sortType: string, isSortAscending: boolean); orderBy?: any; selectedItems?: SettingsData[]; settings: Settings; diff --git a/src/routes/settings/tagLabels/tagMapping/tagMappingTable.tsx b/src/routes/settings/tagLabels/tagMapping/tagMappingTable.tsx index 3b63973a2..b1189a38c 100644 --- a/src/routes/settings/tagLabels/tagMapping/tagMappingTable.tsx +++ b/src/routes/settings/tagLabels/tagMapping/tagMappingTable.tsx @@ -16,7 +16,7 @@ interface TagMappingTableOwnProps { isDisabled?: boolean; isLoading?: boolean; onClose?: () => void; - onSort(value: string, isSortAscending: boolean); + onSort(sortType: string, isSortAscending: boolean); orderBy?: any; settings: Settings; } diff --git a/src/routes/settings/tagLabels/tags/tagsTable.tsx b/src/routes/settings/tagLabels/tags/tagsTable.tsx index 6722d6d03..d2389aceb 100644 --- a/src/routes/settings/tagLabels/tags/tagsTable.tsx +++ b/src/routes/settings/tagLabels/tags/tagsTable.tsx @@ -12,7 +12,7 @@ interface TagsTableOwnProps { filterBy?: any; isLoading?: boolean; onSelect(items: SettingsData[], isSelected: boolean); - onSort(value: string, isSortAscending: boolean); + onSort(sortType: string, isSortAscending: boolean); orderBy?: any; selectedItems?: SettingsData[]; settings: Settings;