diff --git a/.tekton/koku-frontend-pull-request.yaml b/.tekton/koku-frontend-pull-request.yaml index d0afbcd08..0319341f2 100644 --- a/.tekton/koku-frontend-pull-request.yaml +++ b/.tekton/koku-frontend-pull-request.yaml @@ -194,7 +194,7 @@ spec: - name: name value: prefetch-dependencies - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.1@sha256:058a59f72997c9cf1be20978eb6a145d8d4d436c6098f2460bd96766bb363b20 + value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.1@sha256:fd1fda0dcf53938860ae6fcba37f5572ae25ae02dba44c15754fb7ba7549fb5c - name: kind value: task resolver: bundles diff --git a/.tekton/koku-frontend-push.yaml b/.tekton/koku-frontend-push.yaml index f0471f1f8..04d3ef2b4 100644 --- a/.tekton/koku-frontend-push.yaml +++ b/.tekton/koku-frontend-push.yaml @@ -191,7 +191,7 @@ spec: - name: name value: prefetch-dependencies - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.1@sha256:058a59f72997c9cf1be20978eb6a145d8d4d436c6098f2460bd96766bb363b20 + value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.1@sha256:fd1fda0dcf53938860ae6fcba37f5572ae25ae02dba44c15754fb7ba7549fb5c - name: kind value: task resolver: bundles diff --git a/eslint.config.mjs b/eslint.config.mjs index 81aa1cfff..6c142eecb 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -175,7 +175,7 @@ export default [{ radix: ['error', 'as-needed'], 'react-hooks/exhaustive-deps': 0, 'react/display-name': 0, - + 'react/no-is-mounted': 0, 'react/no-unescaped-entities': ['error', { forbid: ['>', '}'], }], diff --git a/locales/data.json b/locales/data.json index f56421dd8..4f2fe0f95 100644 --- a/locales/data.json +++ b/locales/data.json @@ -3103,6 +3103,14 @@ } ] }, + "usage": { + "value": [ + { + "type": 0, + "value": "Usage" + } + ] + }, "vcpu": { "value": [ { @@ -3744,7 +3752,7 @@ "distributeWorker": [ { "type": 0, - "value": "Worker unallowcated (unused and non-reserved resources)" + "value": "Worker unallocated (unused and non-reserved resources)" } ], "distributionModelDesc": [ diff --git a/locales/translations.json b/locales/translations.json index c88905491..1a18d901d 100644 --- a/locales/translations.json +++ b/locales/translations.json @@ -231,7 +231,7 @@ "detailsEmptyState": "Processing data to generate a list of all services that sums to a total cost...", "detailsMore": "{value} more...", "detailsMoreClusters": ", {value} more...", - "detailsResourceNames": "{value, select, account {Account names} aws_category {Cost category names} cluster {Cluster names} gcp_project {GCP project names} group {Group} instance {Instance names} instance_type {Instance type} memory {Memory} name {Name} node {Node names} org_unit_id {Organizational unit names} os {OS} operating_system {Operating system} payer_tenant_id {Account names} product_service {Service names} project {Project names} region {Region names} resource_location {Region names} service {Service names} service_name {Service names} status {Status} subscription_guid {Account names} source_type {Integration} tag {Tag names} tags {Tags} tag_key {Tag keys} vcpu {vCPU} other {}}", + "detailsResourceNames": "{value, select, account {Account names} aws_category {Cost category names} cluster {Cluster names} gcp_project {GCP project names} group {Group} instance {Instance names} instance_type {Instance type} memory {Memory} name {Name} node {Node names} org_unit_id {Organizational unit names} os {OS} operating_system {Operating system} payer_tenant_id {Account names} product_service {Service names} project {Project names} region {Region names} resource_location {Region names} service {Service names} service_name {Service names} status {Status} subscription_guid {Account names} source_type {Integration} tag {Tag names} tags {Tags} tag_key {Tag keys} usage {Usage} vcpu {vCPU} other {}}", "detailsSummaryModalTitle": "{groupBy, select, account {{name} accounts} aws_category {{name} cost categories} cluster {{name} clusters} gcp_project {{name} GCP projects} node {{name} nodes} org_unit_id {{name} organizational units} payer_tenant_id {{name} accounts} product_service {{name} services} project {{name} projects} region {{name} regions} resource_location {{name} regions} service {{name} services} service_name {{name} services} subscription_guid {{name} accounts} tag {{name} tags} other {}}", "detailsUnusedCapacityLabel": "Unused capacity", "detailsUnusedRequestsLabel": "Unused requests", @@ -253,7 +253,7 @@ "distributePlatformCosts": "{value, select, true {Distribute platform costs}false {Do not distribute platform costs}other {}}", "distributeStorage": "Storage", "distributeUnallocatedCapacity": "{value, select, true {Distribute worker unallocated capacity}false {Do not distribute worker unallocated capacity}other {}}", - "distributeWorker": "Worker unallowcated (unused and non-reserved resources)", + "distributeWorker": "Worker unallocated (unused and non-reserved resources)", "distributionModelDesc": "Choose how your raw costs are distributed at the project level.", "distributionType": "Distribution type", "distributionTypeDesc": "{type, select, cpu {Distribute costs based on CPU usage}memory {Distribute costs based on memory usage}other {}}", diff --git a/package-lock.json b/package-lock.json index f405c5292..9079b5915 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "@patternfly/react-icons": "5.4.0", "@patternfly/react-table": "5.4.0", "@patternfly/react-tokens": "5.4.0", - "@redhat-cloud-services/frontend-components": "^4.2.14", + "@redhat-cloud-services/frontend-components": "^4.2.15", "@redhat-cloud-services/frontend-components-notifications": "^4.1.0", "@redhat-cloud-services/frontend-components-translations": "^3.2.8", "@redhat-cloud-services/frontend-components-utilities": "^4.0.17", @@ -33,7 +33,7 @@ "react-dom": "^18.3.1", "react-intl": "^6.6.8", "react-redux": "^9.1.2", - "react-router-dom": "^6.26.1", + "react-router-dom": "^6.26.2", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "typesafe-actions": "^5.1.0", @@ -45,14 +45,14 @@ "devDependencies": { "@eslint/compat": "^1.1.1", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "^9.9.1", + "@eslint/js": "^9.10.0", "@formatjs/cli": "^6.2.12", "@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.2.8", "@redhat-cloud-services/tsc-transform-imports": "^1.0.16", - "@swc/core": "^1.7.23", + "@swc/core": "^1.7.26", "@swc/jest": "^0.2.36", "@testing-library/jest-dom": "^6.5.0", "@testing-library/react": "^16.0.1", @@ -63,18 +63,18 @@ "@types/react-dom": "^18.3.0", "@types/react-redux": "^7.1.33", "@types/react-router-dom": "^5.3.3", - "@typescript-eslint/eslint-plugin": "^8.4.0", - "@typescript-eslint/parser": "^8.4.0", + "@typescript-eslint/eslint-plugin": "^8.5.0", + "@typescript-eslint/parser": "^8.5.0", "aphrodite": "^2.4.0", "copy-webpack-plugin": "^12.0.2", - "eslint": "^9.9.1", + "eslint": "^9.10.0", "eslint-plugin-formatjs": "^4.13.3", "eslint-plugin-jest-dom": "^5.4.0", "eslint-plugin-jsdoc": "^50.2.2", "eslint-plugin-markdown": "^5.1.0", "eslint-plugin-patternfly-react": "^5.4.0", "eslint-plugin-prettier": "^5.2.1", - "eslint-plugin-react": "^7.35.2", + "eslint-plugin-react": "^7.36.0", "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-sort-keys-fix": "^1.1.2", "eslint-plugin-testing-library": "^6.3.0", @@ -92,7 +92,7 @@ "swc_mut_cjs_exports": "^0.99.0", "ts-jest": "^29.2.5", "ts-patch": "^3.2.1", - "typescript": "^5.5.4", + "typescript": "^5.6.2", "webpack-bundle-analyzer": "^4.10.2" }, "engines": { @@ -817,9 +817,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.9.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.9.1.tgz", - "integrity": "sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==", + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.10.0.tgz", + "integrity": "sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -835,6 +835,19 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/plugin-kit": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.1.0.tgz", + "integrity": "sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@formatjs/cli": { "version": "6.2.12", "resolved": "https://registry.npmjs.org/@formatjs/cli/-/cli-6.2.12.tgz", @@ -2099,6 +2112,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/@openshift/dynamic-plugin-sdk/-/dynamic-plugin-sdk-5.0.1.tgz", "integrity": "sha512-+azUBN6FgcDmlcWMzG0bthcRUJC1u12wf9xa2aJGFbC/uTiOXwjrkcQ7LW/PyK5Em7wDhwaUdapaeOgh8I6Kjg==", + "license": "Apache-2.0", "dependencies": { "lodash": "^4.17.21", "semver": "^7.3.7", @@ -2141,9 +2155,10 @@ } }, "node_modules/@openshift/dynamic-plugin-sdk/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -2416,15 +2431,16 @@ } }, "node_modules/@redhat-cloud-services/frontend-components": { - "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components/-/frontend-components-4.2.14.tgz", - "integrity": "sha512-q3RgMJiJ4Zk4Qim0sKbCzn9IJtQT9oJWetu11FbHwYZV2w25mORM22QA9LS1jOsaywJJJc4J453CPVRBQhrkGw==", + "version": "4.2.15", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components/-/frontend-components-4.2.15.tgz", + "integrity": "sha512-52bu9XFZCosQ7QUzLiA4NNYWWas14Gir3/OBgxWlKQ8UayMfiBP9nuwvelDfC/jU8jLdYVbAznkNzbxQdhTKiw==", + "license": "Apache-2.0", "dependencies": { "@patternfly/react-component-groups": "^5.0.0", "@redhat-cloud-services/frontend-components-utilities": "^4.0.0", "@redhat-cloud-services/types": "^1.0.9", - "@scalprum/core": "^0.7.0", - "@scalprum/react-core": "^0.8.0", + "@scalprum/core": "^0.8.1", + "@scalprum/react-core": "^0.9.1", "classnames": "^2.2.5", "sanitize-html": "^2.12.1" }, @@ -2818,27 +2834,29 @@ } }, "node_modules/@remix-run/router": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.1.tgz", - "integrity": "sha512-S45oynt/WH19bHbIXjtli6QmwNYvaz+vtnubvNpNDvUOoA/OWh6j1OikIP3G+v5GHdxyC6EXoChG3HgYGEUfcg==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.2.tgz", + "integrity": "sha512-baiMx18+IMuD1yyvOGaHM9QrVUPGGG0jC+z+IPHnRJWUAUvaKuWKyE8gjDj2rzv3sz9zOGoRSPgeBVHRhZnBlA==", "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/@scalprum/core": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@scalprum/core/-/core-0.7.0.tgz", - "integrity": "sha512-zvrPXexI+bxHGFY/teuwPI5yjnOuiq8uT+RDsrm3gnpr1AqZQVUiGdskl1ON/ci5lSs1kNadmXceF1BTKlicwg==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@scalprum/core/-/core-0.8.1.tgz", + "integrity": "sha512-bRbquESsjUvgu3QHA9aDIK5uTu7XoXjzqoxAmDmytnedzg8LFk/iNKs/bx4lSP2rufxx8iFkdVVvN3sM1W6a4A==", + "license": "Apache-2.0", "dependencies": { "@openshift/dynamic-plugin-sdk": "^5.0.1", "tslib": "^2.6.2" } }, "node_modules/@scalprum/react-core": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@scalprum/react-core/-/react-core-0.8.0.tgz", - "integrity": "sha512-ADqL6GdjT0ihVfTtIqu8vvYgwUb3IiUGXj9md1+h6tL8yshbq+FAezwuD9jhX7qcjfgL1Sl3g/faO2/SE9jPvw==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@scalprum/react-core/-/react-core-0.9.1.tgz", + "integrity": "sha512-r3ydkxwqtauWUH+NS1pWg9esWhLdOoH9XDomUhA3wLRSMs9R2HStWkKJ4NrryyMGafv+0I1djLkgfmaZk64z0g==", + "license": "Apache-2.0", "dependencies": { "@openshift/dynamic-plugin-sdk": "^5.0.1", "@scalprum/core": "^0.7.0", @@ -2849,6 +2867,16 @@ "react-dom": ">=16.8.0 || >=17.0.0 || ^18.0.0" } }, + "node_modules/@scalprum/react-core/node_modules/@scalprum/core": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@scalprum/core/-/core-0.7.0.tgz", + "integrity": "sha512-zvrPXexI+bxHGFY/teuwPI5yjnOuiq8uT+RDsrm3gnpr1AqZQVUiGdskl1ON/ci5lSs1kNadmXceF1BTKlicwg==", + "license": "Apache-2.0", + "dependencies": { + "@openshift/dynamic-plugin-sdk": "^5.0.1", + "tslib": "^2.6.2" + } + }, "node_modules/@sentry/browser": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-5.30.0.tgz", @@ -3007,9 +3035,9 @@ } }, "node_modules/@swc/core": { - "version": "1.7.23", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.23.tgz", - "integrity": "sha512-VDNkpDvDlreGh2E3tlDj8B3piiuLhhQA/7rIVZpiLUvG1YpucAa6N7iDXA7Gc/+Hah8spaCg/qvEaBkCmcIYCQ==", + "version": "1.7.26", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.26.tgz", + "integrity": "sha512-f5uYFf+TmMQyYIoxkn/evWhNGuUzC730dFwAKGwBVHHVoPyak1/GvJUm6i1SKl+2Hrj9oN0i3WSoWWZ4pgI8lw==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -3025,16 +3053,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.7.23", - "@swc/core-darwin-x64": "1.7.23", - "@swc/core-linux-arm-gnueabihf": "1.7.23", - "@swc/core-linux-arm64-gnu": "1.7.23", - "@swc/core-linux-arm64-musl": "1.7.23", - "@swc/core-linux-x64-gnu": "1.7.23", - "@swc/core-linux-x64-musl": "1.7.23", - "@swc/core-win32-arm64-msvc": "1.7.23", - "@swc/core-win32-ia32-msvc": "1.7.23", - "@swc/core-win32-x64-msvc": "1.7.23" + "@swc/core-darwin-arm64": "1.7.26", + "@swc/core-darwin-x64": "1.7.26", + "@swc/core-linux-arm-gnueabihf": "1.7.26", + "@swc/core-linux-arm64-gnu": "1.7.26", + "@swc/core-linux-arm64-musl": "1.7.26", + "@swc/core-linux-x64-gnu": "1.7.26", + "@swc/core-linux-x64-musl": "1.7.26", + "@swc/core-win32-arm64-msvc": "1.7.26", + "@swc/core-win32-ia32-msvc": "1.7.26", + "@swc/core-win32-x64-msvc": "1.7.26" }, "peerDependencies": { "@swc/helpers": "*" @@ -3046,9 +3074,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.7.23", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.23.tgz", - "integrity": "sha512-yyOHPfti6yKlQulfVWMt7BVKst+SyEZYCWuQSGMn1KgmNCH/bYufRWfQXIhkGSj44ZkEepJmsJ8tDyIb4k5WyA==", + "version": "1.7.26", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.26.tgz", + "integrity": "sha512-FF3CRYTg6a7ZVW4yT9mesxoVVZTrcSWtmZhxKCYJX9brH4CS/7PRPjAKNk6kzWgWuRoglP7hkjQcd6EpMcZEAw==", "cpu": [ "arm64" ], @@ -3063,9 +3091,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.7.23", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.23.tgz", - "integrity": "sha512-GzqHwQ0Y1VyjdI/bBKFX2GKm5HD3PIB6OhuAQtWZMTtEr2yIrlT0YK2T+XKh7oIg31JwxGBeQdBk3KTI7DARmQ==", + "version": "1.7.26", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.26.tgz", + "integrity": "sha512-az3cibZdsay2HNKmc4bjf62QVukuiMRh5sfM5kHR/JMTrLyS6vSw7Ihs3UTkZjUxkLTT8ro54LI6sV6sUQUbLQ==", "cpu": [ "x64" ], @@ -3080,9 +3108,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.7.23", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.23.tgz", - "integrity": "sha512-qwX4gB41OS6/OZkHcpTqLFGsdmvoZyffnJIlgB/kZKwH3lfeJWzv6vx57zXtNpM/t7GoQEe0VZUVdmNjxSxBZw==", + "version": "1.7.26", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.26.tgz", + "integrity": "sha512-VYPFVJDO5zT5U3RpCdHE5v1gz4mmR8BfHecUZTmD2v1JeFY6fv9KArJUpjrHEEsjK/ucXkQFmJ0jaiWXmpOV9Q==", "cpu": [ "arm" ], @@ -3097,9 +3125,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.7.23", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.23.tgz", - "integrity": "sha512-TsrbUZdMaUwzI7+g/8rHPLWbntMKYSu5Bn5IBSqVKPeyqaXxNnlIUnWXgXcUcRAc+T+Y8ADfr7EiFz9iz5DuSA==", + "version": "1.7.26", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.26.tgz", + "integrity": "sha512-YKevOV7abpjcAzXrhsl+W48Z9mZvgoVs2eP5nY+uoMAdP2b3GxC0Df1Co0I90o2lkzO4jYBpTMcZlmUXLdXn+Q==", "cpu": [ "arm64" ], @@ -3114,9 +3142,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.7.23", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.23.tgz", - "integrity": "sha512-JEdtwdthazKq4PBz53KSubwwK8MvqODAihGSAzc8u3Unq4ojcvaS8b0CwLBeD+kTQ78HpxOXTt3DsFIxpgaCAA==", + "version": "1.7.26", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.26.tgz", + "integrity": "sha512-3w8iZICMkQQON0uIcvz7+Q1MPOW6hJ4O5ETjA0LSP/tuKqx30hIniCGOgPDnv3UTMruLUnQbtBwVCZTBKR3Rkg==", "cpu": [ "arm64" ], @@ -3131,9 +3159,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.7.23", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.23.tgz", - "integrity": "sha512-V51gFPWaVAHbI1yg9ahsoya3aB4uawye3SZ5uQWgcP7wdCdiv60dw4F5nuPJf5Z1oXD3U/BslXuamv8Oh9vXqQ==", + "version": "1.7.26", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.26.tgz", + "integrity": "sha512-c+pp9Zkk2lqb06bNGkR2Looxrs7FtGDMA4/aHjZcCqATgp348hOKH5WPvNLBl+yPrISuWjbKDVn3NgAvfvpH4w==", "cpu": [ "x64" ], @@ -3148,9 +3176,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.7.23", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.23.tgz", - "integrity": "sha512-BBqQi4+UdeRqag3yM4IJjaHG4yc1o3l9ksENHToE0o/u2DT0FY5+K/DiYGZLC1JHbSFzNqRCYsa7DIzRtZ0A1A==", + "version": "1.7.26", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.26.tgz", + "integrity": "sha512-PgtyfHBF6xG87dUSSdTJHwZ3/8vWZfNIXQV2GlwEpslrOkGqy+WaiiyE7Of7z9AvDILfBBBcJvJ/r8u980wAfQ==", "cpu": [ "x64" ], @@ -3165,9 +3193,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.7.23", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.23.tgz", - "integrity": "sha512-JPk6pvCKncL6bXG7p+NLZf8PWx4FakVvKNdwGeMrYunb+yk1IZf7qf9LJk8+GDGF5QviDXPs8opZrTrfsW80fA==", + "version": "1.7.26", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.26.tgz", + "integrity": "sha512-9TNXPIJqFynlAOrRD6tUQjMq7KApSklK3R/tXgIxc7Qx+lWu8hlDQ/kVPLpU7PWvMMwC/3hKBW+p5f+Tms1hmA==", "cpu": [ "arm64" ], @@ -3182,9 +3210,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.7.23", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.23.tgz", - "integrity": "sha512-2Whxi8d+bLQBzJcQ5qYPHlk02YYVGsMVav0fWk+FnX2z1QRREIu1L1xvrpi7gBpjXp6BIU40ya8GiKeekNT2bg==", + "version": "1.7.26", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.26.tgz", + "integrity": "sha512-9YngxNcG3177GYdsTum4V98Re+TlCeJEP4kEwEg9EagT5s3YejYdKwVAkAsJszzkXuyRDdnHUpYbTrPG6FiXrQ==", "cpu": [ "ia32" ], @@ -3199,9 +3227,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.7.23", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.23.tgz", - "integrity": "sha512-82fARk4/yJ40kwWKY/gdKDisPdtgJE9jgpl/vkNG3alyJxrCzuNM7+CtiKoYbXLeqM8GQTS3wlvCaJu9oQ8dag==", + "version": "1.7.26", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.26.tgz", + "integrity": "sha512-VR+hzg9XqucgLjXxA13MtV5O3C0bK0ywtLIBw/+a+O+Oc6mxFWHtdUeXDbIi5AiPbn0fjgVJMqYnyjGyyX8u0w==", "cpu": [ "x64" ], @@ -4119,17 +4147,17 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.4.0.tgz", - "integrity": "sha512-rg8LGdv7ri3oAlenMACk9e+AR4wUV0yrrG+XKsGKOK0EVgeEDqurkXMPILG2836fW4ibokTB5v4b6Z9+GYQDEw==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.5.0.tgz", + "integrity": "sha512-lHS5hvz33iUFQKuPFGheAB84LwcJ60G8vKnEhnfcK1l8kGVLro2SFYW6K0/tj8FUhRJ0VHyg1oAfg50QGbPPHw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.4.0", - "@typescript-eslint/type-utils": "8.4.0", - "@typescript-eslint/utils": "8.4.0", - "@typescript-eslint/visitor-keys": "8.4.0", + "@typescript-eslint/scope-manager": "8.5.0", + "@typescript-eslint/type-utils": "8.5.0", + "@typescript-eslint/utils": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -4153,15 +4181,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.4.0.tgz", - "integrity": "sha512-NHgWmKSgJk5K9N16GIhQ4jSobBoJwrmURaLErad0qlLjrpP5bECYg+wxVTGlGZmJbU03jj/dfnb6V9bw+5icsA==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.5.0.tgz", + "integrity": "sha512-gF77eNv0Xz2UJg/NbpWJ0kqAm35UMsvZf1GHj8D9MRFTj/V3tAciIWXfmPLsAAF/vUlpWPvUDyH1jjsr0cMVWw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "8.4.0", - "@typescript-eslint/types": "8.4.0", - "@typescript-eslint/typescript-estree": "8.4.0", - "@typescript-eslint/visitor-keys": "8.4.0", + "@typescript-eslint/scope-manager": "8.5.0", + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/typescript-estree": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0", "debug": "^4.3.4" }, "engines": { @@ -4181,14 +4210,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.4.0.tgz", - "integrity": "sha512-n2jFxLeY0JmKfUqy3P70rs6vdoPjHK8P/w+zJcV3fk0b0BwRXC/zxRTEnAsgYT7MwdQDt/ZEbtdzdVC+hcpF0A==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz", + "integrity": "sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.4.0", - "@typescript-eslint/visitor-keys": "8.4.0" + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4199,14 +4228,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.4.0.tgz", - "integrity": "sha512-pu2PAmNrl9KX6TtirVOrbLPLwDmASpZhK/XU7WvoKoCUkdtq9zF7qQ7gna0GBZFN0hci0vHaSusiL2WpsQk37A==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.5.0.tgz", + "integrity": "sha512-N1K8Ix+lUM+cIDhL2uekVn/ZD7TZW+9/rwz8DclQpcQ9rk4sIL5CAlBC0CugWKREmDjBzI/kQqU4wkg46jWLYA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.4.0", - "@typescript-eslint/utils": "8.4.0", + "@typescript-eslint/typescript-estree": "8.5.0", + "@typescript-eslint/utils": "8.5.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -4224,9 +4253,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.4.0.tgz", - "integrity": "sha512-T1RB3KQdskh9t3v/qv7niK6P8yvn7ja1mS7QK7XfRVL6wtZ8/mFs/FHf4fKvTA0rKnqnYxl/uHFNbnEt0phgbw==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", + "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", "dev": true, "license": "MIT", "engines": { @@ -4238,14 +4267,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.4.0.tgz", - "integrity": "sha512-kJ2OIP4dQw5gdI4uXsaxUZHRwWAGpREJ9Zq6D5L0BweyOrWsL6Sz0YcAZGWhvKnH7fm1J5YFE1JrQL0c9dd53A==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz", + "integrity": "sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "8.4.0", - "@typescript-eslint/visitor-keys": "8.4.0", + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -4296,16 +4325,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.4.0.tgz", - "integrity": "sha512-swULW8n1IKLjRAgciCkTCafyTHHfwVQFt8DovmaF69sKbOxTSFMmIZaSHjqO9i/RV0wIblaawhzvtva8Nmm7lQ==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.5.0.tgz", + "integrity": "sha512-6yyGYVL0e+VzGYp60wvkBHiqDWOpT63pdMV2CVG4LVDd5uR6q1qQN/7LafBZtAtNIn/mqXjsSeS5ggv/P0iECw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.4.0", - "@typescript-eslint/types": "8.4.0", - "@typescript-eslint/typescript-estree": "8.4.0" + "@typescript-eslint/scope-manager": "8.5.0", + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/typescript-estree": "8.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4319,13 +4348,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.4.0.tgz", - "integrity": "sha512-zTQD6WLNTre1hj5wp09nBIDiOc2U5r/qmzo7wxPn4ZgAjHql09EofqhF9WF+fZHzL5aCyaIpPcT2hyxl73kr9A==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", + "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.4.0", + "@typescript-eslint/types": "8.5.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -5407,9 +5436,9 @@ } }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, "dependencies": { "bytes": "3.1.2", @@ -5420,7 +5449,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -5445,21 +5474,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/bonjour-service": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", @@ -7847,9 +7861,9 @@ } }, "node_modules/eslint": { - "version": "9.9.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.9.1.tgz", - "integrity": "sha512-dHvhrbfr4xFQ9/dq+jcVneZMyRYLjggWjk6RVsIiHsP8Rz6yZ8LvZ//iU4TrZF+SXWG+JkNF2OyiZRvzgRDqMg==", + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.10.0.tgz", + "integrity": "sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw==", "dev": true, "license": "MIT", "dependencies": { @@ -7857,7 +7871,8 @@ "@eslint-community/regexpp": "^4.11.0", "@eslint/config-array": "^0.18.0", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.9.1", + "@eslint/js": "9.10.0", + "@eslint/plugin-kit": "^0.1.0", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", @@ -7880,7 +7895,6 @@ "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", @@ -8889,9 +8903,9 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.35.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.2.tgz", - "integrity": "sha512-Rbj2R9zwP2GYNcIak4xoAMV57hrBh3hTaR0k7hVjwCQgryE/pw5px4b13EYjduOI0hfXyZhwBxaGpOTbWSGzKQ==", + "version": "7.36.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.36.0.tgz", + "integrity": "sha512-c+RvVxBH0JE2kHt/8p043nPPhIohSnyQOZApIzGJqM2tXnjEzcZzyKIAg72gymLtuwuKfgGxW2H2aqTJqRgTfQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9546,37 +9560,37 @@ } }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", + "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -9596,27 +9610,21 @@ "ms": "2.0.0" } }, + "node_modules/express/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/express/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -9808,13 +9816,13 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -9834,6 +9842,15 @@ "ms": "2.0.0" } }, + "node_modules/finalhandler/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -14964,10 +14981,13 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -16132,9 +16152,9 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", "dev": true }, "node_modules/path-type": { @@ -16831,12 +16851,12 @@ } }, "node_modules/react-router": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.1.tgz", - "integrity": "sha512-kIwJveZNwp7teQRI5QmwWo39A5bXRyqpH0COKKmPnyD2vBvDwgFXSqDUYtt1h+FEyfnE8eXr7oe0MxRzVwCcvQ==", + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.2.tgz", + "integrity": "sha512-tvN1iuT03kHgOFnLPfLJ8V95eijteveqdOSk+srqfePtQvqCExB8eHOYnlilbOcyJyKnYkr1vJvf7YqotAJu1A==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.19.1" + "@remix-run/router": "1.19.2" }, "engines": { "node": ">=14.0.0" @@ -16846,13 +16866,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.1.tgz", - "integrity": "sha512-veut7m41S1fLql4pLhxeSW3jlqs+4MtjRLj0xvuCEXsxusJCbs6I8yn9BxzzDX2XDgafrccY6hwjmd/bL54tFw==", + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.2.tgz", + "integrity": "sha512-z7YkaEW0Dy35T3/QKPYB1LjMK2R1fxnHO8kWpUMTBdfVzZrWOiY9a7CtN8HqdWtDUWd5FY6Dl8HFsqVwH4uOtQ==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.19.1", - "react-router": "6.26.1" + "@remix-run/router": "1.19.2", + "react-router": "6.26.2" }, "engines": { "node": ">=14.0.0" @@ -17580,9 +17600,9 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, "dependencies": { "debug": "2.6.9", @@ -17712,20 +17732,29 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/serve-static/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -19232,10 +19261,11 @@ } }, "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", + "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", "devOptional": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" diff --git a/package.json b/package.json index e8cae8521..b02423e48 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "start:hmr": "HMR=true npm start", "start:local:api": "LOCAL_API_PORT=8000 LOCAL_API_HOST=localhost KEYCLOAK_PORT=4020 npm start", "start:mfe": "FEC_STATIC_PORT=8003 npm run start", + "start:static": "fec static --port=8004", "stats": "npm run build:prod --profile --json > stats.json", "test": "jest --no-cache", "test:clean": "jest --clearCache", @@ -57,7 +58,7 @@ "@patternfly/react-icons": "5.4.0", "@patternfly/react-table": "5.4.0", "@patternfly/react-tokens": "5.4.0", - "@redhat-cloud-services/frontend-components": "^4.2.14", + "@redhat-cloud-services/frontend-components": "^4.2.15", "@redhat-cloud-services/frontend-components-notifications": "^4.1.0", "@redhat-cloud-services/frontend-components-translations": "^3.2.8", "@redhat-cloud-services/frontend-components-utilities": "^4.0.17", @@ -73,7 +74,7 @@ "react-dom": "^18.3.1", "react-intl": "^6.6.8", "react-redux": "^9.1.2", - "react-router-dom": "^6.26.1", + "react-router-dom": "^6.26.2", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "typesafe-actions": "^5.1.0", @@ -85,14 +86,14 @@ "devDependencies": { "@eslint/compat": "^1.1.1", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "^9.9.1", + "@eslint/js": "^9.10.0", "@formatjs/cli": "^6.2.12", "@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.2.8", "@redhat-cloud-services/tsc-transform-imports": "^1.0.16", - "@swc/core": "^1.7.23", + "@swc/core": "^1.7.26", "@swc/jest": "^0.2.36", "@testing-library/jest-dom": "^6.5.0", "@testing-library/react": "^16.0.1", @@ -103,18 +104,18 @@ "@types/react-dom": "^18.3.0", "@types/react-redux": "^7.1.33", "@types/react-router-dom": "^5.3.3", - "@typescript-eslint/eslint-plugin": "^8.4.0", - "@typescript-eslint/parser": "^8.4.0", + "@typescript-eslint/eslint-plugin": "^8.5.0", + "@typescript-eslint/parser": "^8.5.0", "aphrodite": "^2.4.0", "copy-webpack-plugin": "^12.0.2", - "eslint": "^9.9.1", + "eslint": "^9.10.0", "eslint-plugin-formatjs": "^4.13.3", "eslint-plugin-jest-dom": "^5.4.0", "eslint-plugin-jsdoc": "^50.2.2", "eslint-plugin-markdown": "^5.1.0", "eslint-plugin-patternfly-react": "^5.4.0", "eslint-plugin-prettier": "^5.2.1", - "eslint-plugin-react": "^7.35.2", + "eslint-plugin-react": "^7.36.0", "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-sort-keys-fix": "^1.1.2", "eslint-plugin-testing-library": "^6.3.0", @@ -132,12 +133,12 @@ "swc_mut_cjs_exports": "^0.99.0", "ts-jest": "^29.2.5", "ts-patch": "^3.2.1", - "typescript": "^5.5.4", + "typescript": "^5.6.2", "webpack-bundle-analyzer": "^4.10.2" }, "overrides": { - "@typescript-eslint/eslint-plugin": "^8.4.0", - "eslint": "^9.9.1", + "@typescript-eslint/eslint-plugin": "^8.5.0", + "eslint": "^9.10.0", "redux": "^5.0.1" }, "insights": { diff --git a/src/appEntry.tsx b/src/appEntry.tsx index cc548ecbc..e1624c553 100644 --- a/src/appEntry.tsx +++ b/src/appEntry.tsx @@ -1,4 +1,9 @@ /* eslint-disable no-console */ +// Todo: Uncomment for use with non-shared PatternFly packages +// import '@patternfly/patternfly/patternfly.css'; +import '@patternfly/patternfly/patternfly-addons.css'; +import './styles/global.css'; + import NotificationsPortal from '@redhat-cloud-services/frontend-components-notifications/NotificationPortal'; import IntlProvider from '@redhat-cloud-services/frontend-components-translations/Provider'; import { getLocale } from 'components/i18n'; @@ -10,12 +15,6 @@ import messages from '../locales/data.json'; import App from './app'; import { configureStore } from './store'; -// Todo: Uncomment for use with non-shared PatternFly packages -// require.resolve('@patternfly/patternfly/patternfly.css'); -require.resolve('@patternfly/patternfly/patternfly-addons.css'); - -import './styles/global.css'; - const costStore = configureStore({ // session: { // token: getToken(), diff --git a/src/locales/messages.ts b/src/locales/messages.ts index a4b9001eb..b8103be1b 100644 --- a/src/locales/messages.ts +++ b/src/locales/messages.ts @@ -1335,6 +1335,7 @@ export default defineMessages({ 'tag {Tag names} ' + 'tags {Tags} ' + 'tag_key {Tag keys} ' + + 'usage {Usage} ' + 'vcpu {vCPU} ' + 'other {}}', description: 'Details table resource names', @@ -1493,8 +1494,8 @@ export default defineMessages({ id: 'distributeUnallocatedCapacity', }, distributeWorker: { - defaultMessage: 'Worker unallowcated (unused and non-reserved resources)', - description: 'Worker unallowcated (unused and non-reserved resources)', + defaultMessage: 'Worker unallocated (unused and non-reserved resources)', + description: 'Worker unallocated (unused and non-reserved resources)', id: 'distributeWorker', }, distributionModelDesc: { diff --git a/src/routes/details/awsBreakdown/awsBreakdown.tsx b/src/routes/details/awsBreakdown/awsBreakdown.tsx index 9800a1a6a..ebb70982e 100644 --- a/src/routes/details/awsBreakdown/awsBreakdown.tsx +++ b/src/routes/details/awsBreakdown/awsBreakdown.tsx @@ -122,7 +122,9 @@ const mapStateToProps = createMapStateToProps, instancesComponent: - groupBy === serviceKey && groupByValue === 'AmazonEC2' ? : undefined, + groupBy === serviceKey && groupByValue === 'AmazonEC2' ? ( + + ) : undefined, isAwsEc2InstancesToggleEnabled: FeatureToggleSelectors.selectIsAwsEc2InstancesToggleEnabled(state), providers: filterProviders(providers, ProviderType.aws), providersError, diff --git a/src/routes/details/awsBreakdown/instances/instances.tsx b/src/routes/details/awsBreakdown/instances/instances.tsx index 355675279..ea95384aa 100644 --- a/src/routes/details/awsBreakdown/instances/instances.tsx +++ b/src/routes/details/awsBreakdown/instances/instances.tsx @@ -32,6 +32,7 @@ import { InstancesTable, InstanceTableColumnIds } from './instancesTable'; import { InstancesToolbar } from './instancesToolbar'; interface InstancesOwnProps { + costType?: string; currency?: string; } @@ -70,12 +71,17 @@ const defaultColumnOptions: ColumnManagementModalOption[] = [ value: InstanceTableColumnIds.memory, hidden: true, }, + { + label: messages.usage, + value: InstanceTableColumnIds.usage, + hidden: true, + }, ]; const reportType = ReportType.ec2Compute; const reportPathsType = ReportPathsType.aws; -const Instances: React.FC = ({ currency }) => { +const Instances: React.FC = ({ costType, currency }) => { const intl = useIntl(); const [hiddenColumns, setHiddenColumns] = useState(initHiddenColumns(defaultColumnOptions)); @@ -87,6 +93,7 @@ const Instances: React.FC = ({ currency }) => { const [query, setQuery] = useState({ ...baseQuery }); const { hasAccountFilter, hasRegionFilter, hasTagFilter, report, reportError, reportFetchStatus, reportQueryString } = useMapToProps({ + costType, currency, query, }); @@ -322,12 +329,13 @@ const Instances: React.FC = ({ currency }) => { ); }; -const useMapToProps = ({ currency, query }): InstancesStateProps => { +const useMapToProps = ({ costType, currency, query }): InstancesStateProps => { const dispatch: ThunkDispatch = useDispatch(); const queryFromRoute = useQueryFromRoute(); const queryState = useQueryState('details'); const reportQuery = { + cost_type: costType, currency, filter: { ...(query.filter || baseQuery.filter), @@ -366,7 +374,7 @@ const useMapToProps = ({ currency, query }): InstancesStateProps => { if (!reportError && reportFetchStatus !== FetchStatus.inProgress) { dispatch(reportActions.fetchReport(reportPathsType, reportType, reportQueryString)); } - }, [currency, query]); + }, [costType, currency, query]); return { hasAccountFilter: diff --git a/src/routes/details/awsBreakdown/instances/instancesTable.tsx b/src/routes/details/awsBreakdown/instances/instancesTable.tsx index 07d2f85ad..698612349 100644 --- a/src/routes/details/awsBreakdown/instances/instancesTable.tsx +++ b/src/routes/details/awsBreakdown/instances/instancesTable.tsx @@ -13,7 +13,7 @@ import { Actions } from 'routes/details/components/actions'; import { TagLink } from 'routes/details/components/tag'; import type { ComputedReportItem } from 'routes/utils/computedReport/getComputedReportItems'; import { getUnsortedComputedReportItems } from 'routes/utils/computedReport/getComputedReportItems'; -import { formatCurrency } from 'utils/format'; +import { formatCurrency, formatUnits, unitsLookupKey } from 'utils/format'; interface InstancesTableOwnProps { filterBy?: any; @@ -35,6 +35,7 @@ type InstancesTableProps = InstancesTableOwnProps; export const InstanceTableColumnIds = { memory: 'memory', + usage: 'usage', vcpu: 'vcpu', }; @@ -103,15 +104,18 @@ const InstancesTable: React.FC = ({ { id: InstanceTableColumnIds.vcpu, name: intl.formatMessage(messages.detailsResourceNames, { value: 'vcpu' }), - orderBy: 'vcpu', style: styles.managedColumn, - ...(computedItems.length && { isSortable: true }), }, { id: InstanceTableColumnIds.memory, - orderBy: 'memory', name: intl.formatMessage(messages.detailsResourceNames, { value: 'memory' }), style: styles.managedColumn, + }, + { + id: InstanceTableColumnIds.usage, + orderBy: 'usage', + name: intl.formatMessage(messages.detailsResourceNames, { value: 'usage' }), + style: styles.managedColumn, ...(computedItems.length && { isSortable: true }), }, { @@ -125,8 +129,8 @@ const InstancesTable: React.FC = ({ }, ]; - computedItems.map((item, index) => { - const cost = getTotalCost(item, index); + computedItems.map(item => { + const cost = getTotalCost(item); const actions = getActions(item); newRows.push({ @@ -154,10 +158,6 @@ const InstancesTable: React.FC = ({ { value: item.region ? item.region : null }, { value: item.vcpu ? item.vcpu : '', - // value: intl.formatMessage(messages.valueUnits, { - // value: item.vcpu ? item.vcpu.value : '', - // units: item.vcpu ? intl.formatMessage(messages.units, { units: unitsLookupKey(item.vcpu.units) }) : null, - // }), id: InstanceTableColumnIds.vcpu, style: styles.managedColumn, }, @@ -166,6 +166,16 @@ const InstancesTable: React.FC = ({ id: InstanceTableColumnIds.memory, style: styles.managedColumn, }, + { + value: intl.formatMessage(messages.valueUnits, { + value: item.usage ? formatUnits(item.usage.value, item.usage.units) : '', + units: item.usage + ? intl.formatMessage(messages.units, { units: unitsLookupKey(item.usage.units) }) + : null, + }), + id: InstanceTableColumnIds.usage, + style: styles.managedColumn, + }, { value: cost, style: styles.managedColumn }, { value: actions }, ], @@ -187,9 +197,10 @@ const InstancesTable: React.FC = ({ // There is no group by for instances, but we use it to format messages return ( = ({ ); }; - const getTotalCost = (item: ComputedReportItem, index: number) => { - const cost = report?.meta?.total?.cost?.total ? report.meta.total.cost.total.value : 0; + const getTotalCost = (item: ComputedReportItem) => { const value = item.cost?.total?.value || 0; const units = item.cost?.total?.units || 'USD'; - const percentValue = cost === 0 ? cost.toFixed(2) : ((value / cost) * 100).toFixed(2); - return ( - <> - {formatCurrency(value, units)} - - {intl.formatMessage(messages.percentOfCost, { value: percentValue })} - - > - ); + return formatCurrency(value, units); }; const handleOnSort = (sortType: string, isSortAscending: boolean) => { diff --git a/src/routes/details/awsDetails/detailsTable.tsx b/src/routes/details/awsDetails/detailsTable.tsx index 7db527a08..1e8f4d2fa 100644 --- a/src/routes/details/awsDetails/detailsTable.tsx +++ b/src/routes/details/awsDetails/detailsTable.tsx @@ -2,7 +2,7 @@ import 'routes/components/dataTable/dataTable.scss'; import type { Query } from 'api/queries/query'; import type { AwsReport } from 'api/reports/awsReports'; -import { ReportPathsType } from 'api/reports/report'; +import { ReportPathsType, ReportType } from 'api/reports/report'; import messages from 'locales/messages'; import React from 'react'; import type { WrappedComponentProps } from 'react-intl'; @@ -222,6 +222,7 @@ class DetailsTableBase extends React.Component ); }; diff --git a/src/routes/details/azureDetails/detailsTable.tsx b/src/routes/details/azureDetails/detailsTable.tsx index 8c1aeae43..94a34217a 100644 --- a/src/routes/details/azureDetails/detailsTable.tsx +++ b/src/routes/details/azureDetails/detailsTable.tsx @@ -2,7 +2,7 @@ import 'routes/components/dataTable/dataTable.scss'; import type { Query } from 'api/queries/query'; import type { AzureReport } from 'api/reports/azureReports'; -import { ReportPathsType } from 'api/reports/report'; +import { ReportPathsType, ReportType } from 'api/reports/report'; import messages from 'locales/messages'; import React from 'react'; import type { WrappedComponentProps } from 'react-intl'; @@ -194,6 +194,7 @@ class DetailsTableBase extends React.Component ); }; diff --git a/src/routes/details/components/actions/actions.tsx b/src/routes/details/components/actions/actions.tsx index 1dbce3275..274c1bb89 100644 --- a/src/routes/details/components/actions/actions.tsx +++ b/src/routes/details/components/actions/actions.tsx @@ -17,6 +17,7 @@ import { withRouter } from 'utils/router'; interface DetailsActionsOwnProps extends WrappedComponentProps, RouterComponentProps { groupBy?: string; isDisabled?: boolean; + isTimeScoped?: boolean; item: ComputedReportItem; reportPathsType: ReportPathsType; reportQueryString: string; @@ -52,7 +53,8 @@ class DetailsActionsBase extends React.Component { - const { groupBy, item, reportPathsType, reportQueryString, reportType, showAggregateType } = this.props; + const { groupBy, isTimeScoped, item, reportPathsType, reportQueryString, reportType, showAggregateType } = + this.props; const { isExportModalOpen } = this.state; return ( @@ -60,6 +62,7 @@ class DetailsActionsBase extends React.Component { detailsURL, emptyStateTitle, groupBy, + optimizationsComponent, providers, providersFetchStatus, providerType, @@ -325,6 +326,7 @@ class BreakdownBase extends React.Component { return ; } } + return ( <> { onCurrencySelect={() => handleOnCurrencySelect(query, router, router.location.state)} query={query} report={report} - showCostDistribution={showCostDistribution && activeTabKey !== 2} + showCostDistribution={showCostDistribution && !(optimizationsComponent && activeTabKey === 2)} showCostType={showCostType} - showCurrency={activeTabKey !== 2} + showCurrency={!(optimizationsComponent && activeTabKey === 2)} tabs={this.getTabs(availableTabs)} tagPathsType={tagPathsType} title={title} diff --git a/src/routes/details/gcpDetails/detailsTable.tsx b/src/routes/details/gcpDetails/detailsTable.tsx index 05da7c36a..2987916e5 100644 --- a/src/routes/details/gcpDetails/detailsTable.tsx +++ b/src/routes/details/gcpDetails/detailsTable.tsx @@ -2,7 +2,7 @@ import 'routes/components/dataTable/dataTable.scss'; import type { Query } from 'api/queries/query'; import type { GcpReport } from 'api/reports/gcpReports'; -import { ReportPathsType } from 'api/reports/report'; +import { ReportPathsType, ReportType } from 'api/reports/report'; import messages from 'locales/messages'; import React from 'react'; import type { WrappedComponentProps } from 'react-intl'; @@ -194,6 +194,7 @@ class DetailsTableBase extends React.Component ); }; diff --git a/src/routes/details/ibmDetails/detailsTable.tsx b/src/routes/details/ibmDetails/detailsTable.tsx index d9df2dc6d..287d120b9 100644 --- a/src/routes/details/ibmDetails/detailsTable.tsx +++ b/src/routes/details/ibmDetails/detailsTable.tsx @@ -2,7 +2,7 @@ import 'routes/components/dataTable/dataTable.scss'; import type { Query } from 'api/queries/query'; import type { IbmReport } from 'api/reports/ibmReports'; -import { ReportPathsType } from 'api/reports/report'; +import { ReportPathsType, ReportType } from 'api/reports/report'; import messages from 'locales/messages'; import React from 'react'; import type { WrappedComponentProps } from 'react-intl'; @@ -194,6 +194,7 @@ class DetailsTableBase extends React.Component ); }; diff --git a/src/routes/details/ociDetails/detailsTable.tsx b/src/routes/details/ociDetails/detailsTable.tsx index 5d1cb6898..e3ec79e61 100644 --- a/src/routes/details/ociDetails/detailsTable.tsx +++ b/src/routes/details/ociDetails/detailsTable.tsx @@ -2,7 +2,7 @@ import 'routes/components/dataTable/dataTable.scss'; import type { Query } from 'api/queries/query'; import type { OciReport } from 'api/reports/ociReports'; -import { ReportPathsType } from 'api/reports/report'; +import { ReportPathsType, ReportType } from 'api/reports/report'; import messages from 'locales/messages'; import React from 'react'; import type { WrappedComponentProps } from 'react-intl'; @@ -194,6 +194,7 @@ class DetailsTableBase extends React.Component ); }; diff --git a/src/routes/details/ocpDetails/detailsTable.tsx b/src/routes/details/ocpDetails/detailsTable.tsx index 552dcb5e9..583e5f41d 100644 --- a/src/routes/details/ocpDetails/detailsTable.tsx +++ b/src/routes/details/ocpDetails/detailsTable.tsx @@ -4,7 +4,7 @@ import { Label, Tooltip } from '@patternfly/react-core'; import AsyncComponent from '@redhat-cloud-services/frontend-components/AsyncComponent'; import type { Query } from 'api/queries/query'; import type { OcpReport, OcpReportItem } from 'api/reports/ocpReports'; -import { ReportPathsType } from 'api/reports/report'; +import { ReportPathsType, ReportType } from 'api/reports/report'; import messages from 'locales/messages'; import React from 'react'; import type { WrappedComponentProps } from 'react-intl'; @@ -373,6 +373,7 @@ class DetailsTableBase extends React.Component ); diff --git a/src/routes/details/rhelDetails/detailsTable.tsx b/src/routes/details/rhelDetails/detailsTable.tsx index dfbd42684..425aad110 100644 --- a/src/routes/details/rhelDetails/detailsTable.tsx +++ b/src/routes/details/rhelDetails/detailsTable.tsx @@ -2,7 +2,7 @@ import 'routes/components/dataTable/dataTable.scss'; import { Label } from '@patternfly/react-core'; import type { Query } from 'api/queries/query'; -import { ReportPathsType } from 'api/reports/report'; +import { ReportPathsType, ReportType } from 'api/reports/report'; import type { RhelReport } from 'api/reports/rhelReports'; import messages from 'locales/messages'; import React from 'react'; @@ -287,6 +287,7 @@ class DetailsTableBase extends React.Component ); diff --git a/src/routes/settings/settings.tsx b/src/routes/settings/settings.tsx index 18d9b3af9..563de7688 100644 --- a/src/routes/settings/settings.tsx +++ b/src/routes/settings/settings.tsx @@ -212,7 +212,7 @@ const Settings: React.FC = () => { {getTabs(availableTabs)} )} - {getTabContent(availableTabs)}. + {getTabContent(availableTabs)} ); };