From 54663497c8bfd0273845a1ef662914af7819151f Mon Sep 17 00:00:00 2001 From: Dan Labrecque Date: Thu, 5 Dec 2024 12:26:43 -0500 Subject: [PATCH 1/9] Dependency updates --- package-lock.json | 209 ++++++++++++++++++++++++++++------------------ package.json | 20 ++--- src/api/rbac.ts | 2 +- 3 files changed, 138 insertions(+), 93 deletions(-) diff --git a/package-lock.json b/package-lock.json index c3f593ba0..e60b02712 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,12 +19,12 @@ "@patternfly/react-tokens": "5.4.1", "@redhat-cloud-services/frontend-components": "^4.2.22", "@redhat-cloud-services/frontend-components-notifications": "^4.1.1", - "@redhat-cloud-services/frontend-components-translations": "3.2.9", + "@redhat-cloud-services/frontend-components-translations": "^3.2.11", "@redhat-cloud-services/frontend-components-utilities": "^5.0.3", - "@redhat-cloud-services/rbac-client": "^2.2.11", + "@redhat-cloud-services/rbac-client": "^3.0.2", "@reduxjs/toolkit": "^2.4.0", "@unleash/proxy-client-react": "^4.4.0", - "axios": "^1.7.8", + "axios": "^1.7.9", "date-fns": "^4.1.0", "js-file-download": "^0.4.12", "lodash": "^4.17.21", @@ -40,7 +40,7 @@ "victory": "^37.3.2" }, "devDependencies": { - "@eslint/compat": "^1.2.3", + "@eslint/compat": "^1.2.4", "@eslint/eslintrc": "^3.2.0", "@eslint/js": "^9.16.0", "@formatjs/cli": "^6.3.11", @@ -50,14 +50,14 @@ "@formatjs/intl-localematcher": "^0.5.8", "@redhat-cloud-services/frontend-components-config": "^6.3.5", "@redhat-cloud-services/tsc-transform-imports": "^1.0.21", - "@swc/core": "^1.9.3", + "@swc/core": "1.9.3", "@swc/jest": "^0.2.37", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.0.1", "@testing-library/user-event": "^14.5.2", "@types/jest": "^29.5.14", "@types/qs": "^6.9.17", - "@types/react": "^18.3.12", + "@types/react": "^18.3.13", "@types/react-dom": "^18.3.1", "@types/react-redux": "^7.1.34", "@types/react-router-dom": "^5.3.3", @@ -71,10 +71,10 @@ "eslint-plugin-markdown": "^5.1.0", "eslint-plugin-prettier": "^5.2.1", "eslint-plugin-react": "^7.37.2", - "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-sort-keys-fix": "^1.1.2", - "eslint-plugin-testing-library": "^7.0.0", + "eslint-plugin-testing-library": "^7.1.0", "git-revision-webpack-plugin": "^5.0.0", "globals": "^15.13.0", "identity-obj-proxy": "^3.0.0", @@ -83,11 +83,11 @@ "jest-mock-axios": "^4.8.0", "jest-transform-stub": "^2.0.0", "npm-run-all": "^4.1.5", - "prettier": "^3.4.1", + "prettier": "^3.4.2", "rimraf": "^6.0.1", "swc_mut_cjs_exports": "^0.109.1", "ts-jest": "^29.2.5", - "ts-patch": "^3.2.1", + "ts-patch": "^3.3.0", "typescript": "^5.7.2" }, "engines": { @@ -688,9 +688,9 @@ } }, "node_modules/@eslint/compat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.3.tgz", - "integrity": "sha512-wlZhwlDFxkxIZ571aH0FoK4h4Vwx7P3HJx62Gp8hTc10bfpwT2x0nULuAHmQSJBOWPgPeVf+9YtnD4j50zVHmA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.4.tgz", + "integrity": "sha512-S8ZdQj/N69YAtuqFt7653jwcvuUj131+6qGLUyDqfDg1OIoBQ66OCuXC473YQfO2AaxITTutiRQiDwoo7ZLYyg==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3075,10 +3075,21 @@ "react-router-dom": "^5.0.0 || ^6.0.0" } }, + "node_modules/@redhat-cloud-services/frontend-components-notifications/node_modules/@redhat-cloud-services/rbac-client": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/rbac-client/-/rbac-client-2.2.11.tgz", + "integrity": "sha512-3LLW5XtBMqcdlYJ4lAFo7MaGnHXUBP01O3kty4ocU69EPjiip6/Gtj83vAx5hkgAWX9h6ZEntTDeDuU/ZfGdKQ==", + "license": "Apache-2.0", + "dependencies": { + "@redhat-cloud-services/javascript-clients-shared": "^1.2.4", + "axios": "^1.7.2", + "tslib": "^2.6.2" + } + }, "node_modules/@redhat-cloud-services/frontend-components-translations": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-translations/-/frontend-components-translations-3.2.9.tgz", - "integrity": "sha512-hkIEV7BG5vT0CxwHiqgBkeuUGM93bZqeF6lvbq/DgOyMcevZ1eiFM0iQKPNrw8jS8UfDawaCiHhXOGGrD7T4Sw==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-translations/-/frontend-components-translations-3.2.11.tgz", + "integrity": "sha512-4ZATW+7yaNZopMPl5QopSoYes7kv9TMFzxYO8bWP0LFXm605HQqBS17JTbm7kHbThY+msRX277sAwT/BrMLyaQ==", "license": "Apache-2.0", "optionalDependencies": { "@redhat-cloud-services/frontend-components-utilities": "^4.0.13" @@ -3116,6 +3127,18 @@ "react-router-dom": "^5.0.0 || ^6.0.0" } }, + "node_modules/@redhat-cloud-services/frontend-components-translations/node_modules/@redhat-cloud-services/rbac-client": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/rbac-client/-/rbac-client-2.2.11.tgz", + "integrity": "sha512-3LLW5XtBMqcdlYJ4lAFo7MaGnHXUBP01O3kty4ocU69EPjiip6/Gtj83vAx5hkgAWX9h6ZEntTDeDuU/ZfGdKQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@redhat-cloud-services/javascript-clients-shared": "^1.2.4", + "axios": "^1.7.2", + "tslib": "^2.6.2" + } + }, "node_modules/@redhat-cloud-services/frontend-components-utilities": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-utilities/-/frontend-components-utilities-5.0.3.tgz", @@ -3141,6 +3164,17 @@ "react-router-dom": "^5.0.0 || ^6.0.0" } }, + "node_modules/@redhat-cloud-services/frontend-components-utilities/node_modules/@redhat-cloud-services/rbac-client": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/rbac-client/-/rbac-client-2.2.11.tgz", + "integrity": "sha512-3LLW5XtBMqcdlYJ4lAFo7MaGnHXUBP01O3kty4ocU69EPjiip6/Gtj83vAx5hkgAWX9h6ZEntTDeDuU/ZfGdKQ==", + "license": "Apache-2.0", + "dependencies": { + "@redhat-cloud-services/javascript-clients-shared": "^1.2.4", + "axios": "^1.7.2", + "tslib": "^2.6.2" + } + }, "node_modules/@redhat-cloud-services/frontend-components-utilities/node_modules/p-map": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.2.tgz", @@ -3178,6 +3212,17 @@ "react-router-dom": "^5.0.0 || ^6.0.0" } }, + "node_modules/@redhat-cloud-services/frontend-components/node_modules/@redhat-cloud-services/rbac-client": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/rbac-client/-/rbac-client-2.2.11.tgz", + "integrity": "sha512-3LLW5XtBMqcdlYJ4lAFo7MaGnHXUBP01O3kty4ocU69EPjiip6/Gtj83vAx5hkgAWX9h6ZEntTDeDuU/ZfGdKQ==", + "license": "Apache-2.0", + "dependencies": { + "@redhat-cloud-services/javascript-clients-shared": "^1.2.4", + "axios": "^1.7.2", + "tslib": "^2.6.2" + } + }, "node_modules/@redhat-cloud-services/javascript-clients-shared": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@redhat-cloud-services/javascript-clients-shared/-/javascript-clients-shared-1.2.6.tgz", @@ -3189,12 +3234,12 @@ } }, "node_modules/@redhat-cloud-services/rbac-client": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/rbac-client/-/rbac-client-2.2.11.tgz", - "integrity": "sha512-3LLW5XtBMqcdlYJ4lAFo7MaGnHXUBP01O3kty4ocU69EPjiip6/Gtj83vAx5hkgAWX9h6ZEntTDeDuU/ZfGdKQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/rbac-client/-/rbac-client-3.0.2.tgz", + "integrity": "sha512-CVBpGksMiMbrpI0dZFeqFtVpggLcyYt/kZvGBdkhk7U8X1J/9kncFxBEQ6tRXd1ogg2qUQT/PwUSbSsex8Ds5g==", "license": "Apache-2.0", "dependencies": { - "@redhat-cloud-services/javascript-clients-shared": "^1.2.4", + "@redhat-cloud-services/javascript-clients-shared": "^1.2.6", "axios": "^1.7.2", "tslib": "^2.6.2" } @@ -4408,9 +4453,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.12", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", - "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", + "version": "18.3.13", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.13.tgz", + "integrity": "sha512-ii/gswMmOievxAJed4PAHT949bpYjPKXvXo1v6cRB/kqc2ZR4n+SgyCyvyc5Fec5ez8VnUumI1Vk7j6fRyRogg==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -5459,9 +5504,9 @@ } }, "node_modules/axios": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.8.tgz", - "integrity": "sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==", + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -8464,9 +8509,9 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0.tgz", - "integrity": "sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz", + "integrity": "sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==", "dev": true, "license": "MIT", "engines": { @@ -8587,9 +8632,9 @@ } }, "node_modules/eslint-plugin-testing-library": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-7.0.0.tgz", - "integrity": "sha512-Bwrn5Qi08Lf5Huv4ZGDNYxwkFLAyGQIPB9lC0ALlojymP32aKsSxWnccP1NvIcI5vMhkENg4Y5Td/Q9/tLYmGQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-7.1.0.tgz", + "integrity": "sha512-VWuQWeLcsuj0ywBkXFHnLANN6AqHRzhIgmVgAN5DdlXdl5XBHl3hEZ7uKkSW+cCN2Ws4ODrN/Yp2u/YBJ7s/nA==", "dev": true, "license": "MIT", "dependencies": { @@ -8598,7 +8643,7 @@ }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0", - "npm": ">=9.8.1" + "pnpm": "^9.14.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0" @@ -9700,35 +9745,44 @@ } }, "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-4.0.0.tgz", + "integrity": "sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==", "dev": true, + "license": "MIT", "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" + "ini": "^4.1.3", + "kind-of": "^6.0.3", + "which": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=16" } }, - "node_modules/global-prefix/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "node_modules/global-prefix/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } }, "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, + "license": "ISC", "dependencies": { - "isexe": "^2.0.0" + "isexe": "^3.1.1" }, "bin": { - "which": "bin/which" + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" } }, "node_modules/globals": { @@ -10453,6 +10507,16 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/inquirer": { "version": "8.2.6", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", @@ -15816,9 +15880,9 @@ } }, "node_modules/prettier": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.1.tgz", - "integrity": "sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", + "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", "dev": true, "license": "MIT", "bin": { @@ -18343,16 +18407,17 @@ "dev": true }, "node_modules/ts-patch": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ts-patch/-/ts-patch-3.2.1.tgz", - "integrity": "sha512-hlR43v+GUIUy8/ZGFP1DquEqPh7PFKQdDMTAmYt671kCCA6AkDQMoeFaFmZ7ObPLYOmpMgyKUqL1C+coFMf30w==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ts-patch/-/ts-patch-3.3.0.tgz", + "integrity": "sha512-zAOzDnd5qsfEnjd9IGy1IRuvA7ygyyxxdxesbhMdutt8AHFjD8Vw8hU2rMF89HX1BKRWFYqKHrO8Q6lw0NeUZg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.2", - "global-prefix": "^3.0.0", + "global-prefix": "^4.0.0", "minimist": "^1.2.8", "resolve": "^1.22.2", - "semver": "^7.5.4", + "semver": "^7.6.3", "strip-ansi": "^6.0.1" }, "bin": { @@ -18418,26 +18483,12 @@ "node": ">=8" } }, - "node_modules/ts-patch/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/ts-patch/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -18457,12 +18508,6 @@ "node": ">=8" } }, - "node_modules/ts-patch/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/tslib": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", diff --git a/package.json b/package.json index b25419e57..f3772fdb1 100644 --- a/package.json +++ b/package.json @@ -61,12 +61,12 @@ "@patternfly/react-tokens": "5.4.1", "@redhat-cloud-services/frontend-components": "^4.2.22", "@redhat-cloud-services/frontend-components-notifications": "^4.1.1", - "@redhat-cloud-services/frontend-components-translations": "3.2.9", + "@redhat-cloud-services/frontend-components-translations": "^3.2.11", "@redhat-cloud-services/frontend-components-utilities": "^5.0.3", - "@redhat-cloud-services/rbac-client": "^2.2.11", + "@redhat-cloud-services/rbac-client": "^3.0.2", "@reduxjs/toolkit": "^2.4.0", "@unleash/proxy-client-react": "^4.4.0", - "axios": "^1.7.8", + "axios": "^1.7.9", "date-fns": "^4.1.0", "js-file-download": "^0.4.12", "lodash": "^4.17.21", @@ -82,7 +82,7 @@ "victory": "^37.3.2" }, "devDependencies": { - "@eslint/compat": "^1.2.3", + "@eslint/compat": "^1.2.4", "@eslint/eslintrc": "^3.2.0", "@eslint/js": "^9.16.0", "@formatjs/cli": "^6.3.11", @@ -92,14 +92,14 @@ "@formatjs/intl-localematcher": "^0.5.8", "@redhat-cloud-services/frontend-components-config": "^6.3.5", "@redhat-cloud-services/tsc-transform-imports": "^1.0.21", - "@swc/core": "^1.9.3", + "@swc/core": "1.9.3", "@swc/jest": "^0.2.37", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.0.1", "@testing-library/user-event": "^14.5.2", "@types/jest": "^29.5.14", "@types/qs": "^6.9.17", - "@types/react": "^18.3.12", + "@types/react": "^18.3.13", "@types/react-dom": "^18.3.1", "@types/react-redux": "^7.1.34", "@types/react-router-dom": "^5.3.3", @@ -108,7 +108,7 @@ "copy-webpack-plugin": "^12.0.2", "eslint": "^9.16.0", "eslint-plugin-formatjs": "^5.2.5", - "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-jest-dom": "^5.5.0", "eslint-plugin-jsdoc": "^50.6.0", "eslint-plugin-markdown": "^5.1.0", @@ -116,7 +116,7 @@ "eslint-plugin-react": "^7.37.2", "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-sort-keys-fix": "^1.1.2", - "eslint-plugin-testing-library": "^7.0.0", + "eslint-plugin-testing-library": "^7.1.0", "git-revision-webpack-plugin": "^5.0.0", "globals": "^15.13.0", "identity-obj-proxy": "^3.0.0", @@ -125,11 +125,11 @@ "jest-mock-axios": "^4.8.0", "jest-transform-stub": "^2.0.0", "npm-run-all": "^4.1.5", - "prettier": "^3.4.1", + "prettier": "^3.4.2", "rimraf": "^6.0.1", "swc_mut_cjs_exports": "^0.109.1", "ts-jest": "^29.2.5", - "ts-patch": "^3.2.1", + "ts-patch": "^3.3.0", "typescript": "^5.7.2" }, "overrides": { diff --git a/src/api/rbac.ts b/src/api/rbac.ts index eabd82eed..778896fa8 100644 --- a/src/api/rbac.ts +++ b/src/api/rbac.ts @@ -1,4 +1,4 @@ -import type { Access } from '@redhat-cloud-services/rbac-client'; +import type { Access } from '@redhat-cloud-services/rbac-client/dist/types'; export interface RBAC { isOrgAdmin: boolean; From 9159c2712bb9630751961e92ea3b539530429703 Mon Sep 17 00:00:00 2001 From: "red-hat-konflux[bot]" <126015336+red-hat-konflux[bot]@users.noreply.github.com> Date: Sat, 7 Dec 2024 12:14:26 +0000 Subject: [PATCH 2/9] Update Konflux references Signed-off-by: red-hat-konflux <126015336+red-hat-konflux[bot]@users.noreply.github.com> --- .tekton/koku-frontend-pull-request.yaml | 10 +++++----- .tekton/koku-frontend-push.yaml | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.tekton/koku-frontend-pull-request.yaml b/.tekton/koku-frontend-pull-request.yaml index afae711b5..eccd8b19b 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:d3d8a8bfee292afee3c683692fdd70c031ef430446124285f6abc73365839a6f + value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.1@sha256:53fc6d82b06534878e509f3e37f05b818f38fba01729dd1fbee6f97a9562c1ed - name: kind value: task resolver: bundles @@ -299,7 +299,7 @@ spec: - name: name value: buildah - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.2@sha256:7d3f090943ecb839cc505b3a5e5305c0203dfc6dbc0096713c0add9ef1e45d90 + value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.2@sha256:23883131ea90adb2b8e411420084e13e1dd4d2a9350ee567200a60360e820d10 - name: kind value: task resolver: bundles @@ -331,7 +331,7 @@ spec: - name: name value: build-image-index - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-build-image-index:0.1@sha256:7b2c5ab5d711d1d487693072dec6a10ede0076290dabc673bc6ccde9a322674a + value: quay.io/konflux-ci/tekton-catalog/task-build-image-index:0.1@sha256:a89c141c8d35b2e9d9904c92c9b128f7ccf36681adac7f7422b4537b8bb077e7 - name: kind value: task resolver: bundles @@ -351,7 +351,7 @@ spec: - name: name value: source-build - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.1@sha256:957f765b9d7ea9e69f26cd56b11412699574d8543dc99eaf7f3c04cb713d6ac4 + value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.1@sha256:bacd55a3caa34a30bcf51c00f3f719cb3f783e325257f04c27a91f688cbe9644 - name: kind value: task resolver: bundles @@ -469,7 +469,7 @@ spec: - name: name value: clamav-scan - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-clamav-scan:0.1@sha256:b4f450f1447b166da671f1d5819ab5a1485083e5c27ab91f7d8b7a2ff994c8c2 + value: quay.io/konflux-ci/tekton-catalog/task-clamav-scan:0.2@sha256:6e08cf608240f57442ca5458f3c0dade3558f4f2953be8ea939232f5d5378d58 - name: kind value: task resolver: bundles diff --git a/.tekton/koku-frontend-push.yaml b/.tekton/koku-frontend-push.yaml index e36ecadf0..4a005a1a6 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:d3d8a8bfee292afee3c683692fdd70c031ef430446124285f6abc73365839a6f + value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.1@sha256:53fc6d82b06534878e509f3e37f05b818f38fba01729dd1fbee6f97a9562c1ed - name: kind value: task resolver: bundles @@ -296,7 +296,7 @@ spec: - name: name value: buildah - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.2@sha256:7d3f090943ecb839cc505b3a5e5305c0203dfc6dbc0096713c0add9ef1e45d90 + value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.2@sha256:23883131ea90adb2b8e411420084e13e1dd4d2a9350ee567200a60360e820d10 - name: kind value: task resolver: bundles @@ -328,7 +328,7 @@ spec: - name: name value: build-image-index - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-build-image-index:0.1@sha256:7b2c5ab5d711d1d487693072dec6a10ede0076290dabc673bc6ccde9a322674a + value: quay.io/konflux-ci/tekton-catalog/task-build-image-index:0.1@sha256:a89c141c8d35b2e9d9904c92c9b128f7ccf36681adac7f7422b4537b8bb077e7 - name: kind value: task resolver: bundles @@ -348,7 +348,7 @@ spec: - name: name value: source-build - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.1@sha256:957f765b9d7ea9e69f26cd56b11412699574d8543dc99eaf7f3c04cb713d6ac4 + value: quay.io/konflux-ci/tekton-catalog/task-source-build:0.1@sha256:bacd55a3caa34a30bcf51c00f3f719cb3f783e325257f04c27a91f688cbe9644 - name: kind value: task resolver: bundles @@ -466,7 +466,7 @@ spec: - name: name value: clamav-scan - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-clamav-scan:0.1@sha256:b4f450f1447b166da671f1d5819ab5a1485083e5c27ab91f7d8b7a2ff994c8c2 + value: quay.io/konflux-ci/tekton-catalog/task-clamav-scan:0.2@sha256:6e08cf608240f57442ca5458f3c0dade3558f4f2953be8ea939232f5d5378d58 - name: kind value: task resolver: bundles From 61ca7504e1f2346e54fc4c6dafd450e347e2ede9 Mon Sep 17 00:00:00 2001 From: Dan Labrecque Date: Sat, 7 Dec 2024 13:33:29 -0500 Subject: [PATCH 3/9] Group-by dropdown on Details pages lacks Tag option with Previous month view https://issues.redhat.com/browse/COST-5753 --- src/routes/components/groupBy/groupBy.tsx | 23 +++++++++++-------- .../details/awsDetails/detailsHeader.tsx | 2 +- .../details/azureDetails/azureDetails.tsx | 3 ++- .../details/azureDetails/detailsHeader.tsx | 2 +- .../details/gcpDetails/detailsHeader.tsx | 2 +- .../details/ibmDetails/detailsHeader.tsx | 2 +- .../details/ociDetails/detailsHeader.tsx | 2 +- .../details/ocpDetails/detailsHeader.tsx | 2 +- .../details/rhelDetails/detailsHeader.tsx | 2 +- src/routes/explorer/explorerHeader.tsx | 1 - 10 files changed, 23 insertions(+), 18 deletions(-) diff --git a/src/routes/components/groupBy/groupBy.tsx b/src/routes/components/groupBy/groupBy.tsx index ce3394423..33fd16a56 100644 --- a/src/routes/components/groupBy/groupBy.tsx +++ b/src/routes/components/groupBy/groupBy.tsx @@ -15,7 +15,6 @@ import { connect } from 'react-redux'; import type { SelectWrapperOption } from 'routes/components/selectWrapper'; import { SelectWrapper } from 'routes/components/selectWrapper'; import type { PerspectiveType } from 'routes/explorer/explorerUtils'; -import { getTimeScopeValue } from 'routes/utils/timeScope'; import type { FetchStatus } from 'store/common'; import { createMapStateToProps } from 'store/common'; import { orgActions, orgSelectors } from 'store/orgs'; @@ -30,7 +29,6 @@ import { GroupByOrg } from './groupByOrg'; import { GroupBySelect } from './groupBySelect'; interface GroupByOwnProps extends RouterComponentProps, WrappedComponentProps { - dateRangeType?: string; endDate?: string; getIdKeyForGroupBy: (groupBy: Query['group_by']) => string; groupBy?: string; @@ -48,6 +46,7 @@ interface GroupByOwnProps extends RouterComponentProps, WrappedComponentProps { showTags?: boolean; startDate?: string; tagPathsType: TagPathsType; + timeScopeValue?: number; } interface GroupByStateProps { @@ -123,13 +122,16 @@ class GroupByBase extends React.Component { } public componentDidUpdate(prevProps: GroupByProps) { - const { dateRangeType, groupBy, perspective } = this.props; + const { endDate, groupBy, perspective, startDate, timeScopeValue } = this.props; + if ( + prevProps.endDate !== endDate || prevProps.groupBy !== groupBy || prevProps.perspective !== perspective || - prevProps.dateRangeType !== dateRangeType + prevProps.startDate !== startDate || + prevProps.timeScopeValue !== timeScopeValue ) { - let options; + let options = {}; if (prevProps.perspective !== perspective) { options = { isGroupByCostCategoryVisible: false, @@ -137,6 +139,12 @@ class GroupByBase extends React.Component { isGroupByTagVisible: false, }; } + if (prevProps.timeScopeValue !== timeScopeValue && this.getCurrentGroupBy() !== tagKey) { + options = { + ...options, + isGroupByTagVisible: false, + }; + } this.setState({ currentItem: this.getCurrentGroupBy(), ...(options ? options : {}) }, () => { this.updateReport(); }); @@ -331,10 +339,7 @@ class GroupByBase extends React.Component { } const mapStateToProps = createMapStateToProps( - (state, { endDate, orgPathsType, router, resourcePathsType, startDate, tagPathsType }) => { - const queryFromRoute = parseQuery(router.location.search); - const timeScopeValue = getTimeScopeValue(queryFromRoute); - + (state, { endDate, orgPathsType, resourcePathsType, startDate, tagPathsType, timeScopeValue }) => { // Use start and end dates with Cost Explorer // Default to current month filter for details pages const tagFilter = diff --git a/src/routes/details/awsDetails/detailsHeader.tsx b/src/routes/details/awsDetails/detailsHeader.tsx index f30a11610..83a3a42d8 100644 --- a/src/routes/details/awsDetails/detailsHeader.tsx +++ b/src/routes/details/awsDetails/detailsHeader.tsx @@ -157,7 +157,6 @@ class DetailsHeaderBase extends React.Component { { showOrgs showTags tagPathsType={tagPathsType} + timeScopeValue={timeScopeValue} /> diff --git a/src/routes/details/azureDetails/azureDetails.tsx b/src/routes/details/azureDetails/azureDetails.tsx index f9c5f3975..2bfe92b02 100644 --- a/src/routes/details/azureDetails/azureDetails.tsx +++ b/src/routes/details/azureDetails/azureDetails.tsx @@ -233,7 +233,7 @@ class AzureDetails extends React.Component }; private getToolbar = (computedItems: ComputedReportItem[]) => { - const { query, router, report } = this.props; + const { query, router, report, timeScopeValue } = this.props; const { isAllSelected, selectedItems } = this.state; const groupById = getIdKeyForGroupBy(query.group_by); @@ -256,6 +256,7 @@ class AzureDetails extends React.Component pagination={this.getPagination(isDisabled)} query={query} selectedItems={selectedItems} + timeScopeValue={timeScopeValue} /> ); }; diff --git a/src/routes/details/azureDetails/detailsHeader.tsx b/src/routes/details/azureDetails/detailsHeader.tsx index f12b346d4..1354cbd10 100644 --- a/src/routes/details/azureDetails/detailsHeader.tsx +++ b/src/routes/details/azureDetails/detailsHeader.tsx @@ -141,7 +141,6 @@ class DetailsHeaderBase extends React.Component { { options={groupByOptions} showTags tagPathsType={tagPathsType} + timeScopeValue={timeScopeValue} /> {isDetailsDateRangeToggleEnabled && ( diff --git a/src/routes/details/gcpDetails/detailsHeader.tsx b/src/routes/details/gcpDetails/detailsHeader.tsx index e32664b0a..e7baa1223 100644 --- a/src/routes/details/gcpDetails/detailsHeader.tsx +++ b/src/routes/details/gcpDetails/detailsHeader.tsx @@ -142,7 +142,6 @@ class DetailsHeaderBase extends React.Component { { options={groupByOptions} showTags tagPathsType={tagPathsType} + timeScopeValue={timeScopeValue} /> {isDetailsDateRangeToggleEnabled && ( diff --git a/src/routes/details/ibmDetails/detailsHeader.tsx b/src/routes/details/ibmDetails/detailsHeader.tsx index 344f2efdb..057e6e3ee 100644 --- a/src/routes/details/ibmDetails/detailsHeader.tsx +++ b/src/routes/details/ibmDetails/detailsHeader.tsx @@ -142,7 +142,6 @@ class DetailsHeaderBase extends React.Component { { options={groupByOptions} showTags tagPathsType={tagPathsType} + timeScopeValue={timeScopeValue} /> {isDetailsDateRangeToggleEnabled && ( diff --git a/src/routes/details/ociDetails/detailsHeader.tsx b/src/routes/details/ociDetails/detailsHeader.tsx index 455229996..319bf6c23 100644 --- a/src/routes/details/ociDetails/detailsHeader.tsx +++ b/src/routes/details/ociDetails/detailsHeader.tsx @@ -141,7 +141,6 @@ class DetailsHeaderBase extends React.Component { { options={groupByOptions} showTags tagPathsType={tagPathsType} + timeScopeValue={timeScopeValue} /> {isDetailsDateRangeToggleEnabled && ( diff --git a/src/routes/details/ocpDetails/detailsHeader.tsx b/src/routes/details/ocpDetails/detailsHeader.tsx index 0dade11ce..73ab7454c 100644 --- a/src/routes/details/ocpDetails/detailsHeader.tsx +++ b/src/routes/details/ocpDetails/detailsHeader.tsx @@ -172,7 +172,6 @@ class DetailsHeaderBase extends React.Component {showCostDistribution && ( diff --git a/src/routes/details/rhelDetails/detailsHeader.tsx b/src/routes/details/rhelDetails/detailsHeader.tsx index 08f7b083e..b68f076e5 100644 --- a/src/routes/details/rhelDetails/detailsHeader.tsx +++ b/src/routes/details/rhelDetails/detailsHeader.tsx @@ -165,7 +165,6 @@ class DetailsHeaderBase extends React.Component { { options={groupByOptions} showTags tagPathsType={tagPathsType} + timeScopeValue={timeScopeValue} /> {isDetailsDateRangeToggleEnabled && ( diff --git a/src/routes/explorer/explorerHeader.tsx b/src/routes/explorer/explorerHeader.tsx index 66f934b5c..00de88155 100644 --- a/src/routes/explorer/explorerHeader.tsx +++ b/src/routes/explorer/explorerHeader.tsx @@ -320,7 +320,6 @@ class ExplorerHeaderBase extends React.Component{this.getPerspective(noProviders)} Date: Tue, 10 Dec 2024 10:44:56 -0500 Subject: [PATCH 4/9] Move handleOnDateRangeSelect out of detailsHeader --- src/routes/details/awsDetails/awsDetails.tsx | 13 +++++++++++++ .../details/awsDetails/detailsHeader.tsx | 17 +++++++---------- .../details/azureDetails/azureDetails.tsx | 13 +++++++++++++ .../details/azureDetails/detailsHeader.tsx | 17 +++++++---------- .../details/gcpDetails/detailsHeader.tsx | 17 +++++++---------- src/routes/details/gcpDetails/gcpDetails.tsx | 13 +++++++++++++ .../details/ibmDetails/detailsHeader.tsx | 17 +++++++---------- src/routes/details/ibmDetails/ibmDetails.tsx | 13 +++++++++++++ .../details/ociDetails/detailsHeader.tsx | 17 +++++++---------- src/routes/details/ociDetails/ociDetails.tsx | 13 +++++++++++++ .../details/ocpDetails/detailsHeader.tsx | 18 +++++++----------- src/routes/details/ocpDetails/ocpDetails.tsx | 13 +++++++++++++ .../details/rhelDetails/detailsHeader.tsx | 17 +++++++---------- src/routes/details/rhelDetails/rhelDetails.tsx | 13 +++++++++++++ 14 files changed, 140 insertions(+), 71 deletions(-) diff --git a/src/routes/details/awsDetails/awsDetails.tsx b/src/routes/details/awsDetails/awsDetails.tsx index aae526664..73e0dfc9b 100644 --- a/src/routes/details/awsDetails/awsDetails.tsx +++ b/src/routes/details/awsDetails/awsDetails.tsx @@ -25,6 +25,7 @@ import { ProviderStatus } from 'routes/details/components/providerStatus'; import { getIdKeyForGroupBy } from 'routes/utils/computedReport/getComputedAwsReportItems'; import type { ComputedReportItem } from 'routes/utils/computedReport/getComputedReportItems'; import { getUnsortedComputedReportItems } from 'routes/utils/computedReport/getComputedReportItems'; +import { DateRangeType } from 'routes/utils/dateRange'; import { getGroupByCostCategory, getGroupByOrgValue, getGroupByTagKey } from 'routes/utils/groupBy'; import { filterProviders, hasCurrentMonthData, hasPreviousMonthData } from 'routes/utils/providers'; import { getRouteForQuery } from 'routes/utils/query'; @@ -312,6 +313,17 @@ class AwsDetails extends React.Component { } }; + private handleOnDateRangeSelect = (value: string) => { + const { query, router } = this.props; + + const newQuery = { + filter: {}, + ...JSON.parse(JSON.stringify(query)), + }; + newQuery.filter.time_scope_value = value === DateRangeType.previousMonth ? -2 : -1; + router.navigate(getRouteForQuery(newQuery, router.location, true), { replace: true }); + }; + private handleOnExportModalClose = (isOpen: boolean) => { this.setState({ isExportModalOpen: isOpen }); }; @@ -430,6 +442,7 @@ class AwsDetails extends React.Component { isPreviousMonthData={isPreviousMonthData} onCostTypeSelect={() => handleOnCostTypeSelect(query, router)} onCurrencySelect={() => handleOnCurrencySelect(query, router)} + onDateRangeSelect={this.handleOnDateRangeSelect} onGroupBySelect={this.handleOnGroupBySelect} query={query} report={report} diff --git a/src/routes/details/awsDetails/detailsHeader.tsx b/src/routes/details/awsDetails/detailsHeader.tsx index 83a3a42d8..39cd67a75 100644 --- a/src/routes/details/awsDetails/detailsHeader.tsx +++ b/src/routes/details/awsDetails/detailsHeader.tsx @@ -23,7 +23,6 @@ import type { ComputedAwsReportItemsParams } from 'routes/utils/computedReport/g import { getIdKeyForGroupBy } from 'routes/utils/computedReport/getComputedAwsReportItems'; import { DateRangeType } from 'routes/utils/dateRange'; import { filterProviders } from 'routes/utils/providers'; -import { getRouteForQuery } from 'routes/utils/query'; import type { FetchStatus } from 'store/common'; import { createMapStateToProps } from 'store/common'; import { FeatureToggleSelectors } from 'store/featureToggle'; @@ -43,6 +42,7 @@ interface DetailsHeaderOwnProps { isPreviousMonthData?: boolean; onCostTypeSelect(value: string); onCurrencySelect(value: string); + onDateRangeSelect(value: string); onGroupBySelect(value: string); query?: Query; report: AwsReport; @@ -96,16 +96,13 @@ class DetailsHeaderBase extends React.Component { } }; - private handleOnDateRangeSelected = (value: string) => { - const { query, router } = this.props; + private handleOnDateRangeSelect = (value: string) => { + const { onDateRangeSelect } = this.props; this.setState({ currentDateRangeType: value }, () => { - const newQuery = { - filter: {}, - ...JSON.parse(JSON.stringify(query)), - }; - newQuery.filter.time_scope_value = value === DateRangeType.previousMonth ? -2 : -1; - router.navigate(getRouteForQuery(newQuery, router.location, true), { replace: true }); + if (onDateRangeSelect) { + onDateRangeSelect(value); + } }); }; @@ -181,7 +178,7 @@ class DetailsHeaderBase extends React.Component { isCurrentMonthData={isCurrentMonthData} isDisabled={!showContent} isPreviousMonthData={isPreviousMonthData} - onSelect={this.handleOnDateRangeSelected} + onSelect={this.handleOnDateRangeSelect} /> )} diff --git a/src/routes/details/azureDetails/azureDetails.tsx b/src/routes/details/azureDetails/azureDetails.tsx index 2bfe92b02..18cea4aab 100644 --- a/src/routes/details/azureDetails/azureDetails.tsx +++ b/src/routes/details/azureDetails/azureDetails.tsx @@ -23,6 +23,7 @@ import { ProviderStatus } from 'routes/details/components/providerStatus'; import { getIdKeyForGroupBy } from 'routes/utils/computedReport/getComputedAzureReportItems'; import type { ComputedReportItem } from 'routes/utils/computedReport/getComputedReportItems'; import { getUnsortedComputedReportItems } from 'routes/utils/computedReport/getComputedReportItems'; +import { DateRangeType } from 'routes/utils/dateRange'; import { getGroupByTagKey } from 'routes/utils/groupBy'; import { filterProviders, hasCurrentMonthData, hasPreviousMonthData } from 'routes/utils/providers'; import { getRouteForQuery } from 'routes/utils/query'; @@ -282,6 +283,17 @@ class AzureDetails extends React.Component } }; + private handleOnDateRangeSelect = (value: string) => { + const { query, router } = this.props; + + const newQuery = { + filter: {}, + ...JSON.parse(JSON.stringify(query)), + }; + newQuery.filter.time_scope_value = value === DateRangeType.previousMonth ? -2 : -1; + router.navigate(getRouteForQuery(newQuery, router.location, true), { replace: true }); + }; + private handleOnExportModalClose = (isOpen: boolean) => { this.setState({ isExportModalOpen: isOpen }); }; @@ -387,6 +399,7 @@ class AzureDetails extends React.Component isCurrentMonthData={isCurrentMonthData} isPreviousMonthData={isPreviousMonthData} onCurrencySelect={() => handleOnCurrencySelect(query, router)} + onDateRangeSelect={this.handleOnDateRangeSelect} onGroupBySelect={this.handleOnGroupBySelect} query={query} report={report} diff --git a/src/routes/details/azureDetails/detailsHeader.tsx b/src/routes/details/azureDetails/detailsHeader.tsx index 1354cbd10..18dc975b3 100644 --- a/src/routes/details/azureDetails/detailsHeader.tsx +++ b/src/routes/details/azureDetails/detailsHeader.tsx @@ -20,7 +20,6 @@ import type { ComputedAzureReportItemsParams } from 'routes/utils/computedReport import { getIdKeyForGroupBy } from 'routes/utils/computedReport/getComputedAzureReportItems'; import { DateRangeType } from 'routes/utils/dateRange'; import { filterProviders } from 'routes/utils/providers'; -import { getRouteForQuery } from 'routes/utils/query'; import type { FetchStatus } from 'store/common'; import { createMapStateToProps } from 'store/common'; import { FeatureToggleSelectors } from 'store/featureToggle'; @@ -38,6 +37,7 @@ interface DetailsHeaderOwnProps { isCurrentMonthData?: boolean; isPreviousMonthData?: boolean; onCurrencySelect(value: string); + onDateRangeSelect(value: string); onGroupBySelect(value: string); query?: Query; report: AzureReport; @@ -81,16 +81,13 @@ class DetailsHeaderBase extends React.Component { }; public state: DetailsHeaderState = { ...this.defaultState }; - private handleOnDateRangeSelected = (value: string) => { - const { query, router } = this.props; + private handleOnDateRangeSelect = (value: string) => { + const { onDateRangeSelect } = this.props; this.setState({ currentDateRangeType: value }, () => { - const newQuery = { - filter: {}, - ...JSON.parse(JSON.stringify(query)), - }; - newQuery.filter.time_scope_value = value === DateRangeType.previousMonth ? -2 : -1; - router.navigate(getRouteForQuery(newQuery, router.location, true), { replace: true }); + if (onDateRangeSelect) { + onDateRangeSelect(value); + } }); }; @@ -158,7 +155,7 @@ class DetailsHeaderBase extends React.Component { isCurrentMonthData={isCurrentMonthData} isDisabled={!showContent} isPreviousMonthData={isPreviousMonthData} - onSelect={this.handleOnDateRangeSelected} + onSelect={this.handleOnDateRangeSelect} /> )} diff --git a/src/routes/details/gcpDetails/detailsHeader.tsx b/src/routes/details/gcpDetails/detailsHeader.tsx index e7baa1223..9d3b93b92 100644 --- a/src/routes/details/gcpDetails/detailsHeader.tsx +++ b/src/routes/details/gcpDetails/detailsHeader.tsx @@ -20,7 +20,6 @@ import type { ComputedGcpReportItemsParams } from 'routes/utils/computedReport/g import { getIdKeyForGroupBy } from 'routes/utils/computedReport/getComputedGcpReportItems'; import { DateRangeType } from 'routes/utils/dateRange'; import { filterProviders } from 'routes/utils/providers'; -import { getRouteForQuery } from 'routes/utils/query'; import type { FetchStatus } from 'store/common'; import { createMapStateToProps } from 'store/common'; import { FeatureToggleSelectors } from 'store/featureToggle'; @@ -38,6 +37,7 @@ interface DetailsHeaderOwnProps { isCurrentMonthData?: boolean; isPreviousMonthData?: boolean; onCurrencySelect(value: string); + onDateRangeSelect(value: string); onGroupBySelect(value: string); query?: Query; report: GcpReport; @@ -82,16 +82,13 @@ class DetailsHeaderBase extends React.Component { }; public state: DetailsHeaderState = { ...this.defaultState }; - private handleOnDateRangeSelected = (value: string) => { - const { query, router } = this.props; + private handleOnDateRangeSelect = (value: string) => { + const { onDateRangeSelect } = this.props; this.setState({ currentDateRangeType: value }, () => { - const newQuery = { - filter: {}, - ...JSON.parse(JSON.stringify(query)), - }; - newQuery.filter.time_scope_value = value === DateRangeType.previousMonth ? -2 : -1; - router.navigate(getRouteForQuery(newQuery, router.location, true), { replace: true }); + if (onDateRangeSelect) { + onDateRangeSelect(value); + } }); }; @@ -159,7 +156,7 @@ class DetailsHeaderBase extends React.Component { isCurrentMonthData={isCurrentMonthData} isDisabled={!showContent} isPreviousMonthData={isPreviousMonthData} - onSelect={this.handleOnDateRangeSelected} + onSelect={this.handleOnDateRangeSelect} /> )} diff --git a/src/routes/details/gcpDetails/gcpDetails.tsx b/src/routes/details/gcpDetails/gcpDetails.tsx index 8d916ea73..f9c51d479 100644 --- a/src/routes/details/gcpDetails/gcpDetails.tsx +++ b/src/routes/details/gcpDetails/gcpDetails.tsx @@ -23,6 +23,7 @@ import { ProviderStatus } from 'routes/details/components/providerStatus'; import { getIdKeyForGroupBy } from 'routes/utils/computedReport/getComputedGcpReportItems'; import type { ComputedReportItem } from 'routes/utils/computedReport/getComputedReportItems'; import { getUnsortedComputedReportItems } from 'routes/utils/computedReport/getComputedReportItems'; +import { DateRangeType } from 'routes/utils/dateRange'; import { getGroupByTagKey } from 'routes/utils/groupBy'; import { filterProviders, hasCurrentMonthData, hasPreviousMonthData } from 'routes/utils/providers'; import { getRouteForQuery } from 'routes/utils/query'; @@ -281,6 +282,17 @@ class GcpDetails extends React.Component { } }; + private handleOnDateRangeSelect = (value: string) => { + const { query, router } = this.props; + + const newQuery = { + filter: {}, + ...JSON.parse(JSON.stringify(query)), + }; + newQuery.filter.time_scope_value = value === DateRangeType.previousMonth ? -2 : -1; + router.navigate(getRouteForQuery(newQuery, router.location, true), { replace: true }); + }; + private handleOnExportModalClose = (isOpen: boolean) => { this.setState({ isExportModalOpen: isOpen }); }; @@ -386,6 +398,7 @@ class GcpDetails extends React.Component { isCurrentMonthData={isCurrentMonthData} isPreviousMonthData={isPreviousMonthData} onCurrencySelect={() => handleOnCurrencySelect(query, router)} + onDateRangeSelect={this.handleOnDateRangeSelect} onGroupBySelect={this.handleOnGroupBySelect} query={query} report={report} diff --git a/src/routes/details/ibmDetails/detailsHeader.tsx b/src/routes/details/ibmDetails/detailsHeader.tsx index 057e6e3ee..e06c0908a 100644 --- a/src/routes/details/ibmDetails/detailsHeader.tsx +++ b/src/routes/details/ibmDetails/detailsHeader.tsx @@ -20,7 +20,6 @@ import type { ComputedIbmReportItemsParams } from 'routes/utils/computedReport/g import { getIdKeyForGroupBy } from 'routes/utils/computedReport/getComputedIbmReportItems'; import { DateRangeType } from 'routes/utils/dateRange'; import { filterProviders } from 'routes/utils/providers'; -import { getRouteForQuery } from 'routes/utils/query'; import type { FetchStatus } from 'store/common'; import { createMapStateToProps } from 'store/common'; import { FeatureToggleSelectors } from 'store/featureToggle'; @@ -38,6 +37,7 @@ interface DetailsHeaderOwnProps { isCurrentMonthData?: boolean; isPreviousMonthData?: boolean; onCurrencySelect(value: string); + onDateRangeSelect(value: string); onGroupBySelect(value: string); query?: Query; report: IbmReport; @@ -82,16 +82,13 @@ class DetailsHeaderBase extends React.Component { }; public state: DetailsHeaderState = { ...this.defaultState }; - private handleOnDateRangeSelected = (value: string) => { - const { query, router } = this.props; + private handleOnDateRangeSelect = (value: string) => { + const { onDateRangeSelect } = this.props; this.setState({ currentDateRangeType: value }, () => { - const newQuery = { - filter: {}, - ...JSON.parse(JSON.stringify(query)), - }; - newQuery.filter.time_scope_value = value === DateRangeType.previousMonth ? -2 : -1; - router.navigate(getRouteForQuery(newQuery, router.location, true), { replace: true }); + if (onDateRangeSelect) { + onDateRangeSelect(value); + } }); }; @@ -159,7 +156,7 @@ class DetailsHeaderBase extends React.Component { isCurrentMonthData={isCurrentMonthData} isDisabled={!showContent} isPreviousMonthData={isPreviousMonthData} - onSelect={this.handleOnDateRangeSelected} + onSelect={this.handleOnDateRangeSelect} /> )} diff --git a/src/routes/details/ibmDetails/ibmDetails.tsx b/src/routes/details/ibmDetails/ibmDetails.tsx index 775a2938c..4ab5ebd1e 100644 --- a/src/routes/details/ibmDetails/ibmDetails.tsx +++ b/src/routes/details/ibmDetails/ibmDetails.tsx @@ -23,6 +23,7 @@ import { ProviderStatus } from 'routes/details/components/providerStatus'; import { getIdKeyForGroupBy } from 'routes/utils/computedReport/getComputedIbmReportItems'; import type { ComputedReportItem } from 'routes/utils/computedReport/getComputedReportItems'; import { getUnsortedComputedReportItems } from 'routes/utils/computedReport/getComputedReportItems'; +import { DateRangeType } from 'routes/utils/dateRange'; import { getGroupByTagKey } from 'routes/utils/groupBy'; import { hasCurrentMonthData, hasPreviousMonthData } from 'routes/utils/providers'; import { filterProviders } from 'routes/utils/providers'; @@ -283,6 +284,17 @@ class IbmDetails extends React.Component { } }; + private handleOnDateRangeSelect = (value: string) => { + const { query, router } = this.props; + + const newQuery = { + filter: {}, + ...JSON.parse(JSON.stringify(query)), + }; + newQuery.filter.time_scope_value = value === DateRangeType.previousMonth ? -2 : -1; + router.navigate(getRouteForQuery(newQuery, router.location, true), { replace: true }); + }; + private handleOnExportModalClose = (isOpen: boolean) => { this.setState({ isExportModalOpen: isOpen }); }; @@ -388,6 +400,7 @@ class IbmDetails extends React.Component { isCurrentMonthData={isCurrentMonthData} isPreviousMonthData={isPreviousMonthData} onCurrencySelect={() => handleOnCurrencySelect(query, router)} + onDateRangeSelect={this.handleOnDateRangeSelect} onGroupBySelect={this.handleOnGroupBySelect} query={query} report={report} diff --git a/src/routes/details/ociDetails/detailsHeader.tsx b/src/routes/details/ociDetails/detailsHeader.tsx index 319bf6c23..ab03edd03 100644 --- a/src/routes/details/ociDetails/detailsHeader.tsx +++ b/src/routes/details/ociDetails/detailsHeader.tsx @@ -20,7 +20,6 @@ import type { ComputedOciReportItemsParams } from 'routes/utils/computedReport/g import { getIdKeyForGroupBy } from 'routes/utils/computedReport/getComputedOciReportItems'; import { DateRangeType } from 'routes/utils/dateRange'; import { filterProviders } from 'routes/utils/providers'; -import { getRouteForQuery } from 'routes/utils/query'; import type { FetchStatus } from 'store/common'; import { createMapStateToProps } from 'store/common'; import { FeatureToggleSelectors } from 'store/featureToggle'; @@ -38,6 +37,7 @@ interface DetailsHeaderOwnProps { isCurrentMonthData?: boolean; isPreviousMonthData?: boolean; onCurrencySelect(value: string); + onDateRangeSelect(value: string); onGroupBySelect(value: string); query?: Query; report: OciReport; @@ -81,16 +81,13 @@ class DetailsHeaderBase extends React.Component { }; public state: DetailsHeaderState = { ...this.defaultState }; - private handleOnDateRangeSelected = (value: string) => { - const { query, router } = this.props; + private handleOnDateRangeSelect = (value: string) => { + const { onDateRangeSelect } = this.props; this.setState({ currentDateRangeType: value }, () => { - const newQuery = { - filter: {}, - ...JSON.parse(JSON.stringify(query)), - }; - newQuery.filter.time_scope_value = value === DateRangeType.previousMonth ? -2 : -1; - router.navigate(getRouteForQuery(newQuery, router.location, true), { replace: true }); + if (onDateRangeSelect) { + onDateRangeSelect(value); + } }); }; @@ -158,7 +155,7 @@ class DetailsHeaderBase extends React.Component { isCurrentMonthData={isCurrentMonthData} isDisabled={!showContent} isPreviousMonthData={isPreviousMonthData} - onSelect={this.handleOnDateRangeSelected} + onSelect={this.handleOnDateRangeSelect} /> )} diff --git a/src/routes/details/ociDetails/ociDetails.tsx b/src/routes/details/ociDetails/ociDetails.tsx index 5dc140572..5c4a5af00 100644 --- a/src/routes/details/ociDetails/ociDetails.tsx +++ b/src/routes/details/ociDetails/ociDetails.tsx @@ -23,6 +23,7 @@ import { ProviderStatus } from 'routes/details/components/providerStatus'; import { getIdKeyForGroupBy } from 'routes/utils/computedReport/getComputedOciReportItems'; import type { ComputedReportItem } from 'routes/utils/computedReport/getComputedReportItems'; import { getUnsortedComputedReportItems } from 'routes/utils/computedReport/getComputedReportItems'; +import { DateRangeType } from 'routes/utils/dateRange'; import { getGroupByTagKey } from 'routes/utils/groupBy'; import { filterProviders, hasCurrentMonthData, hasPreviousMonthData } from 'routes/utils/providers'; import { getRouteForQuery } from 'routes/utils/query'; @@ -282,6 +283,17 @@ class OciDetails extends React.Component { } }; + private handleOnDateRangeSelect = (value: string) => { + const { query, router } = this.props; + + const newQuery = { + filter: {}, + ...JSON.parse(JSON.stringify(query)), + }; + newQuery.filter.time_scope_value = value === DateRangeType.previousMonth ? -2 : -1; + router.navigate(getRouteForQuery(newQuery, router.location, true), { replace: true }); + }; + private handleOnExportModalClose = (isOpen: boolean) => { this.setState({ isExportModalOpen: isOpen }); }; @@ -387,6 +399,7 @@ class OciDetails extends React.Component { isCurrentMonthData={isCurrentMonthData} isPreviousMonthData={isPreviousMonthData} onCurrencySelect={() => handleOnCurrencySelect(query, router)} + onDateRangeSelect={this.handleOnDateRangeSelect} onGroupBySelect={this.handleOnGroupBySelect} query={query} report={report} diff --git a/src/routes/details/ocpDetails/detailsHeader.tsx b/src/routes/details/ocpDetails/detailsHeader.tsx index 73ab7454c..14d7e2be7 100644 --- a/src/routes/details/ocpDetails/detailsHeader.tsx +++ b/src/routes/details/ocpDetails/detailsHeader.tsx @@ -23,7 +23,6 @@ import type { ComputedOcpReportItemsParams } from 'routes/utils/computedReport/g import { getIdKeyForGroupBy } from 'routes/utils/computedReport/getComputedOcpReportItems'; import { DateRangeType } from 'routes/utils/dateRange'; import { filterProviders } from 'routes/utils/providers'; -import { getRouteForQuery } from 'routes/utils/query'; import type { FetchStatus } from 'store/common'; import { createMapStateToProps } from 'store/common'; import { FeatureToggleSelectors } from 'store/featureToggle'; @@ -43,7 +42,7 @@ interface DetailsHeaderOwnProps { isPreviousMonthData?: boolean; onCurrencySelect(value: string); onCostDistributionSelect(value: string); - onDateRangeSelected(value: string); + onDateRangeSelect(value: string); onGroupBySelect(value: string); query?: Query; report: OcpReport; @@ -87,16 +86,13 @@ class DetailsHeaderBase extends React.Component { - const { query, router } = this.props; + private handleOnDateRangeSelect = (value: string) => { + const { onDateRangeSelect } = this.props; this.setState({ currentDateRangeType: value }, () => { - const newQuery = { - filter: {}, - ...JSON.parse(JSON.stringify(query)), - }; - newQuery.filter.time_scope_value = value === DateRangeType.previousMonth ? -2 : -1; - router.navigate(getRouteForQuery(newQuery, router.location, true), { replace: true }); + if (onDateRangeSelect) { + onDateRangeSelect(value); + } }); }; @@ -194,7 +190,7 @@ class DetailsHeaderBase extends React.Component )} diff --git a/src/routes/details/ocpDetails/ocpDetails.tsx b/src/routes/details/ocpDetails/ocpDetails.tsx index 889285e91..55ff2ac27 100644 --- a/src/routes/details/ocpDetails/ocpDetails.tsx +++ b/src/routes/details/ocpDetails/ocpDetails.tsx @@ -27,6 +27,7 @@ import { ProviderStatus } from 'routes/details/components/providerStatus'; import { getIdKeyForGroupBy } from 'routes/utils/computedReport/getComputedOcpReportItems'; import type { ComputedReportItem } from 'routes/utils/computedReport/getComputedReportItems'; import { getUnsortedComputedReportItems } from 'routes/utils/computedReport/getComputedReportItems'; +import { DateRangeType } from 'routes/utils/dateRange'; import { getGroupById, getGroupByTagKey } from 'routes/utils/groupBy'; import { filterProviders, hasCurrentMonthData, hasPreviousMonthData } from 'routes/utils/providers'; import { getRouteForQuery } from 'routes/utils/query'; @@ -343,6 +344,17 @@ class OcpDetails extends React.Component { this.setState({ hiddenColumns }); }; + private handleOnDateRangeSelect = (value: string) => { + const { query, router } = this.props; + + const newQuery = { + filter: {}, + ...JSON.parse(JSON.stringify(query)), + }; + newQuery.filter.time_scope_value = value === DateRangeType.previousMonth ? -2 : -1; + router.navigate(getRouteForQuery(newQuery, router.location, true), { replace: true }); + }; + private handleOnExportModalClose = (isOpen: boolean) => { this.setState({ isExportModalOpen: isOpen }); }; @@ -464,6 +476,7 @@ class OcpDetails extends React.Component { isPreviousMonthData={isPreviousMonthData} onCostDistributionSelect={() => handleOnCostDistributionSelect(query, router)} onCurrencySelect={() => handleOnCurrencySelect(query, router)} + onDateRangeSelect={this.handleOnDateRangeSelect} onGroupBySelect={this.handleOnGroupBySelect} query={query} report={report} diff --git a/src/routes/details/rhelDetails/detailsHeader.tsx b/src/routes/details/rhelDetails/detailsHeader.tsx index b68f076e5..19c71edae 100644 --- a/src/routes/details/rhelDetails/detailsHeader.tsx +++ b/src/routes/details/rhelDetails/detailsHeader.tsx @@ -21,7 +21,6 @@ import type { ComputedRhelReportItemsParams } from 'routes/utils/computedReport/ import { getIdKeyForGroupBy } from 'routes/utils/computedReport/getComputedRhelReportItems'; import { DateRangeType } from 'routes/utils/dateRange'; import { filterProviders } from 'routes/utils/providers'; -import { getRouteForQuery } from 'routes/utils/query'; import type { FetchStatus } from 'store/common'; import { createMapStateToProps } from 'store/common'; import { FeatureToggleSelectors } from 'store/featureToggle'; @@ -39,6 +38,7 @@ interface DetailsHeaderOwnProps { isCurrentMonthData?: boolean; isPreviousMonthData?: boolean; onCurrencySelect(value: string); + onDateRangeSelect(value: string); onGroupBySelect(value: string); query?: Query; report: RhelReport; @@ -84,16 +84,13 @@ class DetailsHeaderBase extends React.Component { }; public state: DetailsHeaderState = { ...this.defaultState }; - private handleOnDateRangeSelected = (value: string) => { - const { query, router } = this.props; + private handleOnDateRangeSelect = (value: string) => { + const { onDateRangeSelect } = this.props; this.setState({ currentDateRangeType: value }, () => { - const newQuery = { - filter: {}, - ...JSON.parse(JSON.stringify(query)), - }; - newQuery.filter.time_scope_value = value === DateRangeType.previousMonth ? -2 : -1; - router.navigate(getRouteForQuery(newQuery, router.location, true), { replace: true }); + if (onDateRangeSelect) { + onDateRangeSelect(value); + } }); }; @@ -182,7 +179,7 @@ class DetailsHeaderBase extends React.Component { isCurrentMonthData={isCurrentMonthData} isDisabled={!showContent} isPreviousMonthData={isPreviousMonthData} - onSelect={this.handleOnDateRangeSelected} + onSelect={this.handleOnDateRangeSelect} /> )} diff --git a/src/routes/details/rhelDetails/rhelDetails.tsx b/src/routes/details/rhelDetails/rhelDetails.tsx index 9bc4007ed..efbb02d82 100644 --- a/src/routes/details/rhelDetails/rhelDetails.tsx +++ b/src/routes/details/rhelDetails/rhelDetails.tsx @@ -26,6 +26,7 @@ import { ProviderStatus } from 'routes/details/components/providerStatus'; import type { ComputedReportItem } from 'routes/utils/computedReport/getComputedReportItems'; import { getUnsortedComputedReportItems } from 'routes/utils/computedReport/getComputedReportItems'; import { getIdKeyForGroupBy } from 'routes/utils/computedReport/getComputedRhelReportItems'; +import { DateRangeType } from 'routes/utils/dateRange'; import { getGroupByTagKey } from 'routes/utils/groupBy'; import { filterProviders, hasCurrentMonthData, hasPreviousMonthData } from 'routes/utils/providers'; import { getRouteForQuery } from 'routes/utils/query'; @@ -336,6 +337,17 @@ class RhelDetails extends React.Component { this.setState({ hiddenColumns }); }; + private handleOnDateRangeSelect = (value: string) => { + const { query, router } = this.props; + + const newQuery = { + filter: {}, + ...JSON.parse(JSON.stringify(query)), + }; + newQuery.filter.time_scope_value = value === DateRangeType.previousMonth ? -2 : -1; + router.navigate(getRouteForQuery(newQuery, router.location, true), { replace: true }); + }; + private handleOnExportModalClose = (isOpen: boolean) => { this.setState({ isExportModalOpen: isOpen }); }; @@ -442,6 +454,7 @@ class RhelDetails extends React.Component { isCurrentMonthData={isCurrentMonthData} isPreviousMonthData={isPreviousMonthData} onCurrencySelect={() => handleOnCurrencySelect(query, router)} + onDateRangeSelect={this.handleOnDateRangeSelect} onGroupBySelect={this.handleOnGroupBySelect} query={query} report={report} From 06fcb8814f4203ec292f84ef4067eac2b73e22f0 Mon Sep 17 00:00:00 2001 From: Dan Labrecque Date: Tue, 10 Dec 2024 13:52:54 -0500 Subject: [PATCH 5/9] Ensure tag keys are available for given date range https://issues.redhat.com/browse/COST-5753 --- .../components/dataToolbar/dataToolbar.tsx | 10 ++- .../components/dataToolbar/utils/tags.tsx | 78 ++++++++++++++++++- src/routes/components/groupBy/groupBy.tsx | 4 +- .../details/awsDetails/detailsToolbar.tsx | 19 +++-- .../details/azureDetails/detailsToolbar.tsx | 19 +++-- .../details/gcpDetails/detailsToolbar.tsx | 19 +++-- .../details/ibmDetails/detailsToolbar.tsx | 19 +++-- .../details/ociDetails/detailsToolbar.tsx | 19 +++-- .../details/ocpDetails/detailsToolbar.tsx | 20 ++--- .../details/rhelDetails/detailsToolbar.tsx | 20 ++--- src/routes/explorer/explorerFilter.tsx | 15 ++-- 11 files changed, 158 insertions(+), 84 deletions(-) diff --git a/src/routes/components/dataToolbar/dataToolbar.tsx b/src/routes/components/dataToolbar/dataToolbar.tsx index c1a1af26f..fc944fc2b 100644 --- a/src/routes/components/dataToolbar/dataToolbar.tsx +++ b/src/routes/components/dataToolbar/dataToolbar.tsx @@ -135,7 +135,9 @@ export class DataToolbarBase extends React.Component { const filters = getActiveFilters(query); - return categoryOptions !== prevProps.categoryOptions || prevProps.groupBy !== groupBy + return prevProps.groupBy !== groupBy || + !isEqual(tagReport, prevProps.tagReport) || + !isEqual(categoryOptions, prevProps.categoryOptions) ? { categoryInput: '', costCategoryKeyValueInput: '', @@ -582,9 +584,9 @@ export class DataToolbarBase extends React.Component option.key !== awsCategoryKey && option.key !== tagKey && option.key !== orgUnitIdKey @@ -766,7 +770,7 @@ export class DataToolbarBase extends React.Component this.getTagValueSelect(option))} + {getTagKeyOptions(tagReport, query).map(option => this.getTagValueSelect(option))} {this.getOrgUnitSelectComponent()} {filteredOptions.map(option => this.getCategoryInputComponent(option))} {filteredOptions.map(option => this.getCustomSelectComponent(option))} diff --git a/src/routes/components/dataToolbar/utils/tags.tsx b/src/routes/components/dataToolbar/utils/tags.tsx index e32a09fe5..d1db3ce06 100644 --- a/src/routes/components/dataToolbar/utils/tags.tsx +++ b/src/routes/components/dataToolbar/utils/tags.tsx @@ -1,5 +1,6 @@ import type { ToolbarChipGroup } from '@patternfly/react-core'; import { ToolbarFilter, ToolbarItem } from '@patternfly/react-core'; +import type { Query } from 'api/queries/query'; import type { Tag, TagPathsType } from 'api/tags/tag'; import { intl } from 'components/i18n'; import messages from 'locales/messages'; @@ -35,7 +36,7 @@ export const getTagKeySelect = ({ return null; } - const selectOptions = getTagKeyOptions(tagReport, true) as SelectWrapperOption[]; + const selectOptions = getTagKeyOptions(tagReport, undefined, true) as SelectWrapperOption[]; return ( @@ -53,7 +54,78 @@ export const getTagKeySelect = ({ ); }; +// Ensure tag keys are available for given date range +// +// Note: It's possible the user applied a tag filter which is no longer available in a new date range. +// For example, when switching the date range between current and previous months. Tags may only be available in the +// current month and vice versa. +// +// The problem is that we obtain a list of tag keys from the tag report, in order to show the currently applied filters +// using PatternFly filter chips. If an applied filter is not available in the tag report, then the associated +// filter chip will not be shown and users cannot clear that filter. +// +// As a workaround, we can use the filter_by query params to discover any missing tag keys. This represents the +// previously applied filters, which we combine with keys from the tag report. export const getTagKeyOptions = ( + tagReport: Tag, + query: Query, + isSelectWrapperOption = false +): ToolbarChipGroup[] | SelectWrapperOption[] => { + const options = []; + const reportOptions = getTagKeyOptionsFromReport(tagReport, isSelectWrapperOption); + const queryOptions = getTagKeyOptionsFromQuery(query, isSelectWrapperOption); + + const isTagKeyEqual = (a, b) => { + if (isSelectWrapperOption) { + return a.value === b.value; + } else { + return a.name === b.name; + } + }; + + for (const reportoption of reportOptions) { + if (!options.find(option => isTagKeyEqual(option, reportoption))) { + options.push(reportoption); + } + } + for (const queryOption of queryOptions) { + if (!options.find(option => isTagKeyEqual(option, queryOption))) { + options.push(queryOption); + } + } + return options; +}; + +const getTagKeyOptionsFromQuery = ( + query: Query, + isSelectWrapperOption = false +): ToolbarChipGroup[] | SelectWrapperOption[] => { + const options = []; + + if (!query?.filter_by) { + return options; + } + + for (const filter of Object.keys(query.filter_by)) { + if (filter.indexOf(tagPrefix) !== -1) { + const key = filter.substring(tagPrefix.length); + options.push( + isSelectWrapperOption + ? { + toString: () => key, // Tag keys not localized + value: key, + } + : { + key, + name: key, // Tag keys not localized + } + ); + } + } + return options; +}; + +const getTagKeyOptionsFromReport = ( tagReport: Tag, isSelectWrapperOption = false ): ToolbarChipGroup[] | SelectWrapperOption[] => { @@ -112,9 +184,9 @@ export const getTagValueSelect = ({ onTagValueSelect, onTagValueInput, onTagValueInputChange, + tagKeyValueInput, tagKeyOption, tagPathsType, - tagKeyValueInput, }: { currentCategory?: string; currentTagKey?: string; @@ -124,9 +196,9 @@ export const getTagValueSelect = ({ onTagValueSelect?: (event: any, selection) => void; onTagValueInput?: (event: any) => void; onTagValueInputChange?: (value: string) => void; + tagKeyValueInput?: string; tagKeyOption?: ToolbarChipGroup; tagPathsType?: TagPathsType; - tagKeyValueInput?: string; }) => { // Todo: categoryName workaround for https://issues.redhat.com/browse/COST-2094 const categoryName = { diff --git a/src/routes/components/groupBy/groupBy.tsx b/src/routes/components/groupBy/groupBy.tsx index 33fd16a56..d04021b48 100644 --- a/src/routes/components/groupBy/groupBy.tsx +++ b/src/routes/components/groupBy/groupBy.tsx @@ -131,7 +131,7 @@ class GroupByBase extends React.Component { prevProps.startDate !== startDate || prevProps.timeScopeValue !== timeScopeValue ) { - let options = {}; + let options; if (prevProps.perspective !== perspective) { options = { isGroupByCostCategoryVisible: false, @@ -141,7 +141,7 @@ class GroupByBase extends React.Component { } if (prevProps.timeScopeValue !== timeScopeValue && this.getCurrentGroupBy() !== tagKey) { options = { - ...options, + ...(options && options), isGroupByTagVisible: false, }; } diff --git a/src/routes/details/awsDetails/detailsToolbar.tsx b/src/routes/details/awsDetails/detailsToolbar.tsx index d51d96132..49699fb17 100644 --- a/src/routes/details/awsDetails/detailsToolbar.tsx +++ b/src/routes/details/awsDetails/detailsToolbar.tsx @@ -92,22 +92,21 @@ export class DetailsToolbarBase extends React.Component { - this.updateReport(); - } - ); - } else if (query && !isEqual(query, prevProps.query)) { + this.setState({ + categoryOptions: this.getCategoryOptions(), + }); + } + if ( + (query && !isEqual(query, prevProps.query)) || + (tagQueryString && !isEqual(tagQueryString, prevProps.tagQueryString)) + ) { this.updateReport(); } } diff --git a/src/routes/details/azureDetails/detailsToolbar.tsx b/src/routes/details/azureDetails/detailsToolbar.tsx index 0b9559de6..418bce99a 100644 --- a/src/routes/details/azureDetails/detailsToolbar.tsx +++ b/src/routes/details/azureDetails/detailsToolbar.tsx @@ -74,18 +74,17 @@ export class DetailsToolbarBase extends React.Component { - this.updateReport(); - } - ); - } else if (query && !isEqual(query, prevProps.query)) { + this.setState({ + categoryOptions: this.getCategoryOptions(), + }); + } + if ( + (query && !isEqual(query, prevProps.query)) || + (tagQueryString && !isEqual(tagQueryString, prevProps.tagQueryString)) + ) { this.updateReport(); } } diff --git a/src/routes/details/gcpDetails/detailsToolbar.tsx b/src/routes/details/gcpDetails/detailsToolbar.tsx index 196559e6d..9666d386b 100644 --- a/src/routes/details/gcpDetails/detailsToolbar.tsx +++ b/src/routes/details/gcpDetails/detailsToolbar.tsx @@ -75,18 +75,17 @@ export class DetailsToolbarBase extends React.Component { - this.updateReport(); - } - ); - } else if (query && !isEqual(query, prevProps.query)) { + this.setState({ + categoryOptions: this.getCategoryOptions(), + }); + } + if ( + (query && !isEqual(query, prevProps.query)) || + (tagQueryString && !isEqual(tagQueryString, prevProps.tagQueryString)) + ) { this.updateReport(); } } diff --git a/src/routes/details/ibmDetails/detailsToolbar.tsx b/src/routes/details/ibmDetails/detailsToolbar.tsx index 3a4ca85da..587af507a 100644 --- a/src/routes/details/ibmDetails/detailsToolbar.tsx +++ b/src/routes/details/ibmDetails/detailsToolbar.tsx @@ -75,18 +75,17 @@ export class DetailsToolbarBase extends React.Component { - this.updateReport(); - } - ); - } else if (query && !isEqual(query, prevProps.query)) { + this.setState({ + categoryOptions: this.getCategoryOptions(), + }); + } + if ( + (query && !isEqual(query, prevProps.query)) || + (tagQueryString && !isEqual(tagQueryString, prevProps.tagQueryString)) + ) { this.updateReport(); } } diff --git a/src/routes/details/ociDetails/detailsToolbar.tsx b/src/routes/details/ociDetails/detailsToolbar.tsx index a7e5259cd..6efc84e82 100644 --- a/src/routes/details/ociDetails/detailsToolbar.tsx +++ b/src/routes/details/ociDetails/detailsToolbar.tsx @@ -74,18 +74,17 @@ export class DetailsToolbarBase extends React.Component { - this.updateReport(); - } - ); - } else if (query && !isEqual(query, prevProps.query)) { + this.setState({ + categoryOptions: this.getCategoryOptions(), + }); + } + if ( + (query && !isEqual(query, prevProps.query)) || + (tagQueryString && !isEqual(tagQueryString, prevProps.tagQueryString)) + ) { this.updateReport(); } } diff --git a/src/routes/details/ocpDetails/detailsToolbar.tsx b/src/routes/details/ocpDetails/detailsToolbar.tsx index 0af210f88..4d45d343a 100644 --- a/src/routes/details/ocpDetails/detailsToolbar.tsx +++ b/src/routes/details/ocpDetails/detailsToolbar.tsx @@ -75,17 +75,17 @@ export class DetailsToolbarBase extends React.Component { - this.updateReport(); - } - ); - } else if (query && !isEqual(query, prevProps.query)) { + this.setState({ + categoryOptions: this.getCategoryOptions(), + }); + } + if ( + (query && !isEqual(query, prevProps.query)) || + (tagQueryString && !isEqual(tagQueryString, prevProps.tagQueryString)) + ) { this.updateReport(); } } diff --git a/src/routes/details/rhelDetails/detailsToolbar.tsx b/src/routes/details/rhelDetails/detailsToolbar.tsx index 6f87a4a85..fd2a26262 100644 --- a/src/routes/details/rhelDetails/detailsToolbar.tsx +++ b/src/routes/details/rhelDetails/detailsToolbar.tsx @@ -74,17 +74,17 @@ export class DetailsToolbarBase extends React.Component { } public componentDidUpdate(prevProps: DetailsToolbarProps) { - const { query, tagReport } = this.props; + const { query, tagQueryString, tagReport } = this.props; + if (!isEqual(tagReport, prevProps.tagReport)) { - this.setState( - { - categoryOptions: this.getCategoryOptions(), - }, - () => { - this.updateReport(); - } - ); - } else if (query && !isEqual(query, prevProps.query)) { + this.setState({ + categoryOptions: this.getCategoryOptions(), + }); + } + if ( + (query && !isEqual(query, prevProps.query)) || + (tagQueryString && !isEqual(tagQueryString, prevProps.tagQueryString)) + ) { this.updateReport(); } } diff --git a/src/routes/explorer/explorerFilter.tsx b/src/routes/explorer/explorerFilter.tsx index 6fa996004..63ef7177c 100644 --- a/src/routes/explorer/explorerFilter.tsx +++ b/src/routes/explorer/explorerFilter.tsx @@ -106,21 +106,24 @@ export class ExplorerFilterBase extends React.Component { From b9a2b6dfe9ee15187c6040ffee1f1415eaded965 Mon Sep 17 00:00:00 2001 From: Dan Labrecque Date: Wed, 11 Dec 2024 09:37:58 -0500 Subject: [PATCH 6/9] Ensure tag key values are available for given date range https://issues.redhat.com/browse/COST-5753 --- .../components/dataToolbar/dataToolbar.tsx | 12 +++- .../components/dataToolbar/tagValue.tsx | 50 ++++++++++++-- .../components/dataToolbar/utils/tags.tsx | 65 ++++++++++--------- src/routes/components/groupBy/groupBy.tsx | 9 +-- .../details/awsBreakdown/awsBreakdown.tsx | 2 +- .../awsBreakdown/instances/instances.tsx | 2 +- .../instances/instancesToolbar.tsx | 13 ++-- .../details/awsDetails/detailsToolbar.tsx | 4 +- .../details/azureBreakdown/azureBreakdown.tsx | 2 +- .../details/azureDetails/detailsToolbar.tsx | 5 +- .../historicalDataCostChart.tsx | 6 +- .../historicalDataNetworkChart.tsx | 6 +- .../historicalDataTrendChart.tsx | 6 +- .../historicalDataUsageChart.tsx | 6 +- .../historicalDataVolumeChart.tsx | 6 +- .../components/pvcChart/modal/pvcContent.tsx | 2 +- .../details/components/pvcChart/pvcChart.tsx | 2 +- .../summary/modal/summaryContent.tsx | 2 +- .../components/summary/summaryCard.tsx | 2 +- .../details/components/tag/modal/tagModal.tsx | 4 +- src/routes/details/components/tag/tagLink.tsx | 4 +- .../components/usageChart/usageChart.tsx | 2 +- .../details/gcpBreakdown/gcpBreakdown.tsx | 2 +- .../details/gcpDetails/detailsToolbar.tsx | 4 +- .../details/ibmBreakdown/ibmBreakdown.tsx | 2 +- .../details/ibmDetails/detailsToolbar.tsx | 4 +- .../details/ociBreakdown/ociBreakdown.tsx | 2 +- .../details/ociDetails/detailsToolbar.tsx | 5 +- .../details/ocpBreakdown/ocpBreakdown.tsx | 2 +- .../virtualization/virtualization.tsx | 2 +- .../virtualization/virtualizationToolbar.tsx | 13 ++-- .../details/ocpDetails/detailsToolbar.tsx | 5 +- .../details/rhelBreakdown/rhelBreakdown.tsx | 2 +- .../details/rhelDetails/detailsToolbar.tsx | 5 +- src/routes/explorer/explorerFilter.tsx | 4 ++ src/routes/utils/timeScope.ts | 2 +- 36 files changed, 153 insertions(+), 113 deletions(-) diff --git a/src/routes/components/dataToolbar/dataToolbar.tsx b/src/routes/components/dataToolbar/dataToolbar.tsx index fc944fc2b..548794036 100644 --- a/src/routes/components/dataToolbar/dataToolbar.tsx +++ b/src/routes/components/dataToolbar/dataToolbar.tsx @@ -47,6 +47,7 @@ interface DataToolbarOwnProps { className?: string; dateRange?: React.ReactNode; // Optional date range controls to display in toolbar datePicker?: React.ReactNode; // Optional date picker controls to display in toolbar + endDate?: string; // For Cost Explorer tag key value groupBy?: string; // Sync category selection with groupBy value isAllSelected?: boolean; isBulkSelectDisabled?: boolean; @@ -72,9 +73,11 @@ interface DataToolbarOwnProps { showExport?: boolean; // Show export icon showFilter?: boolean; // Show export icon showPlatformCosts?: boolean; // Show platform costs switch + startDate?: string; // For Cost Explorer tag key value style?: React.CSSProperties; tagPathsType?: TagPathsType; tagReport?: Tag; // Data containing tag key and value data + timeScopeValue?: number; } interface DataToolbarState { @@ -572,21 +575,24 @@ export class DataToolbarBase extends React.Component { - const { isDisabled, tagPathsType } = this.props; + const { endDate, isDisabled, startDate, tagPathsType, timeScopeValue } = this.props; const { currentCategory, currentTagKey, filters, tagKeyValueInput } = this.state; return getTagValueSelect({ currentCategory, currentTagKey, + endDate, filters, isDisabled, onDelete: this.handleOnDelete, onTagValueSelect: this.handleOnTagValueSelect, onTagValueInput: this.handleOnTagValueInput, onTagValueInputChange: this.handleOnTagValueInputChange, + startDate, tagKeyValueInput, tagKeyOption, tagPathsType, + timeScopeValue, }); }; @@ -741,9 +747,9 @@ export class DataToolbarBase extends React.Component this.getTagValueSelect(option))} + {getTagKeyOptions(tagReport, filters).map(option => this.getTagValueSelect(option))} {this.getOrgUnitSelectComponent()} {filteredOptions.map(option => this.getCategoryInputComponent(option))} {filteredOptions.map(option => this.getCustomSelectComponent(option))} diff --git a/src/routes/components/dataToolbar/tagValue.tsx b/src/routes/components/dataToolbar/tagValue.tsx index 7173a5e09..16e303df6 100644 --- a/src/routes/components/dataToolbar/tagValue.tsx +++ b/src/routes/components/dataToolbar/tagValue.tsx @@ -19,14 +19,17 @@ import type { RouterComponentProps } from 'utils/router'; import { withRouter } from 'utils/router'; interface TagValueOwnProps extends RouterComponentProps, WrappedComponentProps { + endDate?: string; isDisabled?: boolean; onTagValueSelect(event, selection); onTagValueInput(event); onTagValueInputChange(value: string); selections?: SelectWrapperOption[]; + startDate?: string; tagKey: string; tagKeyValue: string; tagPathsType: TagPathsType; + timeScopeValue?: number; } interface TagValueStateProps { @@ -71,6 +74,29 @@ class TagValueBase extends React.Component { } } + // Ensure tag key values are available for given date range + private getSelections() { + const { selections, tagKey, tagReport } = this.props; + + const result = []; + if (!selections?.length) { + return result; + } + + const tagKeyItem = tagReport?.data?.find(item => item.key === tagKey); + selections?.map(selection => { + if (tagKeyItem?.values?.length) { + for (const item of tagKeyItem.values) { + if (item === selection) { + result.push(selection); + break; + } + } + } + }); + return result; + } + private getTagValueOptions(): SelectWrapperOption[] { const { tagKey, tagReport } = this.props; @@ -112,7 +138,7 @@ class TagValueBase extends React.Component { }; public render() { - const { intl, isDisabled, onTagValueInput, onTagValueSelect, selections, tagKeyValue } = this.props; + const { intl, isDisabled, onTagValueInput, onTagValueSelect, tagKeyValue } = this.props; const selectOptions = this.getTagValueOptions(); @@ -125,7 +151,7 @@ class TagValueBase extends React.Component { onSelect={onTagValueSelect} options={selectOptions} placeholder={intl.formatMessage(messages.chooseValuePlaceholder)} - selections={selections} + selections={this.getSelections()} /> ); } @@ -145,7 +171,7 @@ class TagValueBase extends React.Component { } const mapStateToProps = createMapStateToProps( - (state, { router, tagKey, tagPathsType }) => { + (state, { endDate, router, startDate, tagKey, tagPathsType, timeScopeValue = -1 }) => { const queryFromRoute = parseQuery(router.location.search); const groupByOrgValue = getGroupByOrgValue(queryFromRoute); @@ -154,10 +180,22 @@ const mapStateToProps = createMapStateToProps { const options = []; const reportOptions = getTagKeyOptionsFromReport(tagReport, isSelectWrapperOption); - const queryOptions = getTagKeyOptionsFromQuery(query, isSelectWrapperOption); + const filterOptions = getTagKeyOptionsFromFilters(filters, isSelectWrapperOption); const isTagKeyEqual = (a, b) => { if (isSelectWrapperOption) { @@ -88,39 +87,36 @@ export const getTagKeyOptions = ( options.push(reportoption); } } - for (const queryOption of queryOptions) { - if (!options.find(option => isTagKeyEqual(option, queryOption))) { - options.push(queryOption); + for (const filterOption of filterOptions) { + if (!options.find(option => isTagKeyEqual(option, filterOption))) { + options.push(filterOption); } } return options; }; -const getTagKeyOptionsFromQuery = ( - query: Query, +const getTagKeyOptionsFromFilters = ( + filter: Filters, isSelectWrapperOption = false ): ToolbarChipGroup[] | SelectWrapperOption[] => { const options = []; - if (!query?.filter_by) { + if (!filter?.tag) { return options; } - for (const filter of Object.keys(query.filter_by)) { - if (filter.indexOf(tagPrefix) !== -1) { - const key = filter.substring(tagPrefix.length); - options.push( - isSelectWrapperOption - ? { - toString: () => key, // Tag keys not localized - value: key, - } - : { - key, - name: key, // Tag keys not localized - } - ); - } + for (const key of Object.keys(filter.tag)) { + options.push( + isSelectWrapperOption + ? { + toString: () => key, // Tag keys not localized + value: key, + } + : { + key, + name: key, // Tag keys not localized + } + ); } return options; }; @@ -178,27 +174,33 @@ const getTagKeyOptionsFromReport = ( export const getTagValueSelect = ({ currentCategory, currentTagKey, + endDate, filters, isDisabled, onDelete, onTagValueSelect, onTagValueInput, onTagValueInputChange, + startDate, tagKeyValueInput, tagKeyOption, tagPathsType, + timeScopeValue, }: { currentCategory?: string; currentTagKey?: string; + endDate?: string; filters?: Filters; isDisabled?: boolean; onDelete?: (type: any, chip: any) => void; onTagValueSelect?: (event: any, selection) => void; onTagValueInput?: (event: any) => void; onTagValueInputChange?: (value: string) => void; + startDate?: string; tagKeyValueInput?: string; tagKeyOption?: ToolbarChipGroup; tagPathsType?: TagPathsType; + timeScopeValue?: number; }) => { // Todo: categoryName workaround for https://issues.redhat.com/browse/COST-2094 const categoryName = { @@ -215,14 +217,17 @@ export const getTagValueSelect = ({ showToolbarItem={currentCategory === tagKey && currentTagKey === tagKeyOption.key} > filter.value) : []} + selections={filters?.tag?.[tagKeyOption.key]?.map(filter => filter.value)} + startDate={startDate} tagKey={currentTagKey} tagKeyValue={tagKeyValueInput} tagPathsType={tagPathsType} + timeScopeValue={timeScopeValue} /> ); diff --git a/src/routes/components/groupBy/groupBy.tsx b/src/routes/components/groupBy/groupBy.tsx index d04021b48..3e47afb2f 100644 --- a/src/routes/components/groupBy/groupBy.tsx +++ b/src/routes/components/groupBy/groupBy.tsx @@ -339,9 +339,8 @@ class GroupByBase extends React.Component { } const mapStateToProps = createMapStateToProps( - (state, { endDate, orgPathsType, resourcePathsType, startDate, tagPathsType, timeScopeValue }) => { - // Use start and end dates with Cost Explorer - // Default to current month filter for details pages + (state, { endDate, orgPathsType, resourcePathsType, startDate, tagPathsType, timeScopeValue = -1 }) => { + // Use start and end dates with Cost Explorer, default to current month filter for details pages const tagFilter = startDate && endDate ? { @@ -350,9 +349,7 @@ const mapStateToProps = createMapStateToProps { ...(query.filter || baseQuery.filter), resolution: 'monthly', time_scope_units: 'month', - time_scope_value: timeScopeValue !== undefined ? timeScopeValue : -1, + time_scope_value: timeScopeValue, }, filter_by: { // Add filters here to apply logical OR/AND diff --git a/src/routes/details/awsBreakdown/instances/instancesToolbar.tsx b/src/routes/details/awsBreakdown/instances/instancesToolbar.tsx index 1e6647b3f..1fcb0ec15 100644 --- a/src/routes/details/awsBreakdown/instances/instancesToolbar.tsx +++ b/src/routes/details/awsBreakdown/instances/instancesToolbar.tsx @@ -187,22 +187,17 @@ export class InstancesToolbarBase extends React.Component( - (state, { timeScopeValue }) => { + (state, { timeScopeValue = -1 }) => { // Note: Omitting key_only would help to share a single, cached request. Only the toolbar requires key values; // however, for better server-side performance, we chose to use key_only here. - const baseQuery = { + const tagQueryString = getQuery({ filter: { - resolution: 'monthly', - time_scope_units: 'month', - time_scope_value: timeScopeValue !== undefined ? timeScopeValue : -1, + time_scope_value: timeScopeValue, }, key_only: true, limit: 1000, - }; - - const tagQueryString = getQuery({ - ...baseQuery, }); + const tagReport = tagSelectors.selectTag(state, tagPathsType, tagType, tagQueryString); const tagReportFetchStatus = tagSelectors.selectTagFetchStatus(state, tagPathsType, tagType, tagQueryString); diff --git a/src/routes/details/awsDetails/detailsToolbar.tsx b/src/routes/details/awsDetails/detailsToolbar.tsx index 49699fb17..49050d125 100644 --- a/src/routes/details/awsDetails/detailsToolbar.tsx +++ b/src/routes/details/awsDetails/detailsToolbar.tsx @@ -175,6 +175,7 @@ export class DetailsToolbarBase extends React.Component ); } @@ -215,8 +217,6 @@ const mapStateToProps = createMapStateToProps ); } @@ -168,13 +170,12 @@ const mapStateToProps = createMapStateToProps( - (state, { costType, currency, reportPathsType, reportType, router, timeScopeValue }) => { + (state, { costType, currency, reportPathsType, reportType, router, timeScopeValue = -1 }) => { const queryFromRoute = parseQuery(router.location.search); const queryState = getQueryState(router.location, 'details'); @@ -183,7 +183,7 @@ const mapStateToProps = createMapStateToProps( - (state, { reportPathsType, reportType, router, timeScopeValue }) => { + (state, { reportPathsType, reportType, router, timeScopeValue = -1 }) => { const queryFromRoute = parseQuery(router.location.search); const queryState = getQueryState(router.location, 'details'); @@ -177,7 +177,7 @@ const mapStateToProps = createMapStateToProps( - (state, { costType, currency, reportPathsType, reportType, router, timeScopeValue }) => { + (state, { costType, currency, reportPathsType, reportType, router, timeScopeValue = -1 }) => { const queryFromRoute = parseQuery(router.location.search); const queryState = getQueryState(router.location, 'details'); @@ -190,7 +190,7 @@ const mapStateToProps = createMapStateToProps( - (state, { reportPathsType, reportType, router, timeScopeValue }) => { + (state, { reportPathsType, reportType, router, timeScopeValue = -1 }) => { const queryFromRoute = parseQuery(router.location.search); const queryState = getQueryState(router.location, 'details'); @@ -161,7 +161,7 @@ const mapStateToProps = createMapStateToProps( - (state, { reportPathsType, reportType, router, timeScopeValue }) => { + (state, { reportPathsType, reportType, router, timeScopeValue = -1 }) => { const queryFromRoute = parseQuery(router.location.search); const queryState = getQueryState(router.location, 'details'); @@ -158,7 +158,7 @@ const mapStateToProps = createMapStateToProps { offset: query.offset, resolution: 'monthly', time_scope_units: 'month', - time_scope_value: timeScopeValue !== undefined ? timeScopeValue : -1, + time_scope_value: timeScopeValue, }, filter_by: { // Add filters here to apply logical OR/AND diff --git a/src/routes/details/components/pvcChart/pvcChart.tsx b/src/routes/details/components/pvcChart/pvcChart.tsx index 2a26fe4eb..dec23d925 100644 --- a/src/routes/details/components/pvcChart/pvcChart.tsx +++ b/src/routes/details/components/pvcChart/pvcChart.tsx @@ -364,7 +364,7 @@ const mapStateToProps = createMapStateToProps ); } @@ -166,8 +168,6 @@ const mapStateToProps = createMapStateToProps ); } @@ -166,8 +168,6 @@ const mapStateToProps = createMapStateToProps( filter: { resolution: 'monthly', time_scope_units: 'month', - time_scope_value: timeScopeValue !== undefined ? timeScopeValue : -1, + time_scope_value: timeScopeValue, }, filter_by: { // Add filters here to apply logical OR/AND diff --git a/src/routes/details/ociDetails/detailsToolbar.tsx b/src/routes/details/ociDetails/detailsToolbar.tsx index 6efc84e82..b2c1e742d 100644 --- a/src/routes/details/ociDetails/detailsToolbar.tsx +++ b/src/routes/details/ociDetails/detailsToolbar.tsx @@ -134,6 +134,7 @@ export class DetailsToolbarBase extends React.Component ); } @@ -171,13 +173,12 @@ const mapStateToProps = createMapStateToProps( - (state, { timeScopeValue }) => { + (state, { timeScopeValue = -1 }) => { // Note: Omitting key_only would help to share a single, cached request. Only the toolbar requires key values; // however, for better server-side performance, we chose to use key_only here. - const baseQuery = { + const tagQueryString = getQuery({ filter: { - resolution: 'monthly', - time_scope_units: 'month', - time_scope_value: timeScopeValue !== undefined ? timeScopeValue : -1, + time_scope_value: timeScopeValue, }, key_only: true, limit: 1000, - }; - - const tagQueryString = getQuery({ - ...baseQuery, }); + const tagReport = tagSelectors.selectTag(state, tagPathsType, tagType, tagQueryString); const tagReportFetchStatus = tagSelectors.selectTagFetchStatus(state, tagPathsType, tagType, tagQueryString); diff --git a/src/routes/details/ocpDetails/detailsToolbar.tsx b/src/routes/details/ocpDetails/detailsToolbar.tsx index 4d45d343a..907761ec9 100644 --- a/src/routes/details/ocpDetails/detailsToolbar.tsx +++ b/src/routes/details/ocpDetails/detailsToolbar.tsx @@ -135,6 +135,7 @@ export class DetailsToolbarBase extends React.Component ); } @@ -176,13 +178,12 @@ const mapStateToProps = createMapStateToProps { query, selectedItems, tagReport, + timeScopeValue, } = this.props; const { categoryOptions } = this.state; @@ -157,6 +158,7 @@ export class DetailsToolbarBase extends React.Component { showFilter tagReport={tagReport} tagPathsType={tagPathsType} + timeScopeValue={timeScopeValue} /> ); } @@ -168,13 +170,12 @@ const mapStateToProps = createMapStateToProps { export const getTimeScopeValue = (query: Query) => { const timeScope = getTimeScope(query); - return timeScope ? query.filter[timeScope] : undefined; + return timeScope ? query.filter[timeScope] : -1; }; From 6b01fb27177d265a70976189ad835b5ae0237c0c Mon Sep 17 00:00:00 2001 From: Dan Labrecque Date: Thu, 12 Dec 2024 09:39:40 -0500 Subject: [PATCH 7/9] Dependency updates --- package-lock.json | 848 ++++++++++++++++++++++++++++------------------ package.json | 46 +-- 2 files changed, 539 insertions(+), 355 deletions(-) diff --git a/package-lock.json b/package-lock.json index e60b02712..0f34d1a2f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,8 +21,8 @@ "@redhat-cloud-services/frontend-components-notifications": "^4.1.1", "@redhat-cloud-services/frontend-components-translations": "^3.2.11", "@redhat-cloud-services/frontend-components-utilities": "^5.0.3", - "@redhat-cloud-services/rbac-client": "^3.0.2", - "@reduxjs/toolkit": "^2.4.0", + "@redhat-cloud-services/rbac-client": "^3.0.3", + "@reduxjs/toolkit": "^2.5.0", "@unleash/proxy-client-react": "^4.4.0", "axios": "^1.7.9", "date-fns": "^4.1.0", @@ -31,50 +31,50 @@ "qs": "^6.13.1", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-intl": "^7.0.1", - "react-redux": "^9.1.2", + "react-intl": "^7.0.4", + "react-redux": "^9.2.0", "react-router-dom": "^6.28.0", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "typesafe-actions": "^5.1.0", - "victory": "^37.3.2" + "victory": "37.3.2" }, "devDependencies": { "@eslint/compat": "^1.2.4", "@eslint/eslintrc": "^3.2.0", "@eslint/js": "^9.16.0", - "@formatjs/cli": "^6.3.11", - "@formatjs/ecma402-abstract": "^2.2.4", - "@formatjs/fast-memoize": "^2.2.3", - "@formatjs/icu-messageformat-parser": "^2.9.4", - "@formatjs/intl-localematcher": "^0.5.8", + "@formatjs/cli": "^6.3.14", + "@formatjs/ecma402-abstract": "^2.3.1", + "@formatjs/fast-memoize": "^2.2.5", + "@formatjs/icu-messageformat-parser": "^2.9.7", + "@formatjs/intl-localematcher": "^0.5.9", "@redhat-cloud-services/frontend-components-config": "^6.3.5", "@redhat-cloud-services/tsc-transform-imports": "^1.0.21", - "@swc/core": "1.9.3", + "@swc/core": "^1.10.1", "@swc/jest": "^0.2.37", "@testing-library/jest-dom": "^6.6.3", - "@testing-library/react": "^16.0.1", + "@testing-library/react": "^16.1.0", "@testing-library/user-event": "^14.5.2", "@types/jest": "^29.5.14", "@types/qs": "^6.9.17", - "@types/react": "^18.3.13", - "@types/react-dom": "^18.3.1", + "@types/react": "^18.3.16", + "@types/react-dom": "^18.3.5", "@types/react-redux": "^7.1.34", "@types/react-router-dom": "^5.3.3", - "@typescript-eslint/eslint-plugin": "^8.17.0", - "@typescript-eslint/parser": "^8.17.0", + "@typescript-eslint/eslint-plugin": "^8.18.0", + "@typescript-eslint/parser": "^8.18.0", "copy-webpack-plugin": "^12.0.2", "eslint": "^9.16.0", - "eslint-plugin-formatjs": "^5.2.5", + "eslint-plugin-formatjs": "^5.2.8", "eslint-plugin-jest-dom": "^5.5.0", - "eslint-plugin-jsdoc": "^50.6.0", + "eslint-plugin-jsdoc": "^50.6.1", "eslint-plugin-markdown": "^5.1.0", "eslint-plugin-prettier": "^5.2.1", "eslint-plugin-react": "^7.37.2", "eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-sort-keys-fix": "^1.1.2", - "eslint-plugin-testing-library": "^7.1.0", + "eslint-plugin-testing-library": "^7.1.1", "git-revision-webpack-plugin": "^5.0.0", "globals": "^15.13.0", "identity-obj-proxy": "^3.0.0", @@ -85,7 +85,7 @@ "npm-run-all": "^4.1.5", "prettier": "^3.4.2", "rimraf": "^6.0.1", - "swc_mut_cjs_exports": "^0.109.1", + "swc_mut_cjs_exports": "^8.0.1", "ts-jest": "^29.2.5", "ts-patch": "^3.3.0", "typescript": "^5.7.2" @@ -846,9 +846,9 @@ } }, "node_modules/@formatjs/cli": { - "version": "6.3.11", - "resolved": "https://registry.npmjs.org/@formatjs/cli/-/cli-6.3.11.tgz", - "integrity": "sha512-TonnLTxrSLoD/ZMNz+XrswN8sTwGBxvq0ff7Tmh7Wx3Mw7U0h1p+bXfevHfHp/5ANra8tfHUd9c3InYOOIp4XQ==", + "version": "6.3.14", + "resolved": "https://registry.npmjs.org/@formatjs/cli/-/cli-6.3.14.tgz", + "integrity": "sha512-jvoerjlZ8qFMZuVA2S/mBf3vldPnZCgUYt6yhEr+8xokdAGY4hK59OmK3sYVKQLg+P4L9GqXOWotVfDiYxmr2Q==", "dev": true, "license": "MIT", "bin": { @@ -859,11 +859,11 @@ }, "peerDependencies": { "@glimmer/env": "^0.1.7", - "@glimmer/reference": "^0.91.1 || ^0.92.0", - "@glimmer/syntax": "^0.92.0", - "@glimmer/validator": "^0.92.0", + "@glimmer/reference": "^0.91.1 || ^0.92.0 || ^0.93.0", + "@glimmer/syntax": "^0.92.0 || ^0.93.0", + "@glimmer/validator": "^0.92.0 || ^0.93.0", "@vue/compiler-core": "^3.4.0", - "content-tag": "^2.0.1", + "content-tag": "^2.0.1 || ^3.0.0", "ember-template-recast": "^6.1.4", "vue": "^3.4.0" }, @@ -895,55 +895,57 @@ } }, "node_modules/@formatjs/ecma402-abstract": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.4.tgz", - "integrity": "sha512-lFyiQDVvSbQOpU+WFd//ILolGj4UgA/qXrKeZxdV14uKiAUiPAtX6XAn7WBCRi7Mx6I7EybM9E5yYn4BIpZWYg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.1.tgz", + "integrity": "sha512-Ip9uV+/MpLXWRk03U/GzeJMuPeOXpJBSB5V1tjA6kJhvqssye5J5LoYLc7Z5IAHb7nR62sRoguzrFiVCP/hnzw==", "license": "MIT", "dependencies": { - "@formatjs/fast-memoize": "2.2.3", - "@formatjs/intl-localematcher": "0.5.8", + "@formatjs/fast-memoize": "2.2.5", + "@formatjs/intl-localematcher": "0.5.9", + "decimal.js": "10", "tslib": "2" } }, "node_modules/@formatjs/fast-memoize": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.3.tgz", - "integrity": "sha512-3jeJ+HyOfu8osl3GNSL4vVHUuWFXR03Iz9jjgI7RwjG6ysu/Ymdr0JRCPHfF5yGbTE6JCrd63EpvX1/WybYRbA==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.5.tgz", + "integrity": "sha512-6PoewUMrrcqxSoBXAOJDiW1m+AmkrAj0RiXnOMD59GRaswjXhm3MDhgepXPBgonc09oSirAJTsAggzAGQf6A6g==", "license": "MIT", "dependencies": { "tslib": "2" } }, "node_modules/@formatjs/icu-messageformat-parser": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.4.tgz", - "integrity": "sha512-Tbvp5a9IWuxUcpWNIW6GlMQYEc4rwNHR259uUFoKWNN1jM9obf9Ul0e+7r7MvFOBNcN+13K7NuKCKqQiAn1QEg==", + "version": "2.9.7", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.7.tgz", + "integrity": "sha512-cuEHyRM5VqLQobANOjtjlgU7+qmk9Q3fDQuBiRRJ3+Wp3ZoZhpUPtUfuimZXsir6SaI2TaAJ+SLo9vLnV5QcbA==", "license": "MIT", "dependencies": { - "@formatjs/ecma402-abstract": "2.2.4", - "@formatjs/icu-skeleton-parser": "1.8.8", + "@formatjs/ecma402-abstract": "2.3.1", + "@formatjs/icu-skeleton-parser": "1.8.11", "tslib": "2" } }, "node_modules/@formatjs/icu-skeleton-parser": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.8.tgz", - "integrity": "sha512-vHwK3piXwamFcx5YQdCdJxUQ1WdTl6ANclt5xba5zLGDv5Bsur7qz8AD7BevaKxITwpgDeU0u8My3AIibW9ywA==", + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.11.tgz", + "integrity": "sha512-8LlHHE/yL/zVJZHAX3pbKaCjZKmBIO6aJY1mkVh4RMSEu/2WRZ4Ysvv3kKXJ9M8RJLBHdnk1/dUQFdod1Dt7Dw==", "license": "MIT", "dependencies": { - "@formatjs/ecma402-abstract": "2.2.4", + "@formatjs/ecma402-abstract": "2.3.1", "tslib": "2" } }, "node_modules/@formatjs/intl": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@formatjs/intl/-/intl-3.0.1.tgz", - "integrity": "sha512-QzdeMxOnSuGJhF0eWOIXHDtXZgIBwAqBZ4/bgZmPMC+FmYI8X2Akmu/j/ABKKO85GnxPV6KN8hJ8zytLnTJuYQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@formatjs/intl/-/intl-3.0.4.tgz", + "integrity": "sha512-pnetak6R7Xp/ET96O5kx9zRYoQQqr6sbRXWkJHKw0Hr/jr3ls4CddZKq+suwCDuW6p/ior2BhpOSh/WLLcJM6w==", "license": "MIT", "dependencies": { - "@formatjs/fast-memoize": "2.2.3", - "@formatjs/icu-messageformat-parser": "2.9.4", - "intl-messageformat": "10.7.7", + "@formatjs/ecma402-abstract": "2.3.1", + "@formatjs/fast-memoize": "2.2.5", + "@formatjs/icu-messageformat-parser": "2.9.7", + "intl-messageformat": "10.7.10", "tslib": "2" }, "peerDependencies": { @@ -956,22 +958,22 @@ } }, "node_modules/@formatjs/intl-localematcher": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.8.tgz", - "integrity": "sha512-I+WDNWWJFZie+jkfkiK5Mp4hEDyRSEvmyfYadflOno/mmKJKcB17fEpEH0oJu/OWhhCJ8kJBDz2YMd/6cDl7Mg==", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.9.tgz", + "integrity": "sha512-8zkGu/sv5euxbjfZ/xmklqLyDGQSxsLqg8XOq88JW3cmJtzhCP8EtSJXlaKZnVO4beEaoiT9wj4eIoCQ9smwxA==", "license": "MIT", "dependencies": { "tslib": "2" } }, "node_modules/@formatjs/ts-transformer": { - "version": "3.13.23", - "resolved": "https://registry.npmjs.org/@formatjs/ts-transformer/-/ts-transformer-3.13.23.tgz", - "integrity": "sha512-9ufpij2uHlc/yzb2WDOswaslTQQ7nOIE7aDLWErmc7Kpm5uPU6MihSuEa//DVoNoOD+fywYkbqsZnDjvXeLuAQ==", + "version": "3.13.26", + "resolved": "https://registry.npmjs.org/@formatjs/ts-transformer/-/ts-transformer-3.13.26.tgz", + "integrity": "sha512-SLvuvGg8wwxubV9ahiP4/a7quFQha56IHDo9N/+bxp+nlw+xyV6BWrQcJqK1x2M0m0U7PLQff3rPnbahfSlrgg==", "dev": true, "license": "MIT", "dependencies": { - "@formatjs/icu-messageformat-parser": "2.9.4", + "@formatjs/icu-messageformat-parser": "2.9.7", "@types/json-stable-stringify": "1", "@types/node": "14 || 16 || 17 || 18 || 20 || 22", "chalk": "4", @@ -3234,9 +3236,9 @@ } }, "node_modules/@redhat-cloud-services/rbac-client": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/rbac-client/-/rbac-client-3.0.2.tgz", - "integrity": "sha512-CVBpGksMiMbrpI0dZFeqFtVpggLcyYt/kZvGBdkhk7U8X1J/9kncFxBEQ6tRXd1ogg2qUQT/PwUSbSsex8Ds5g==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/rbac-client/-/rbac-client-3.0.3.tgz", + "integrity": "sha512-B1EMF2eXoJxpf0J+SSrDjQqVLkY/s49loRpOHv/EDHCa4z3+YTN7RFz7Cx0eKKAAbLCoTC9wZHzicKJxDToEkA==", "license": "Apache-2.0", "dependencies": { "@redhat-cloud-services/javascript-clients-shared": "^1.2.6", @@ -3285,9 +3287,9 @@ "license": "Apache-2.0" }, "node_modules/@reduxjs/toolkit": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.4.0.tgz", - "integrity": "sha512-wJZEuSKj14tvNfxiIiJws0tQN77/rDqucBq528ApebMIRHyWpCanJVQRxQ8WWZC19iCDKxDsGlbAir3F1layxA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.5.0.tgz", + "integrity": "sha512-awNe2oTodsZ6LmRqmkFhtb/KH03hUhxOamEQy411m3Njj3BbFvoBovxo4Q1cBWnV1ErprVj9MlF0UPXkng0eyg==", "license": "MIT", "dependencies": { "immer": "^10.0.3", @@ -3296,7 +3298,7 @@ "reselect": "^5.1.0" }, "peerDependencies": { - "react": "^16.9.0 || ^17.0.0 || ^18", + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" }, "peerDependenciesMeta": { @@ -3536,9 +3538,9 @@ } }, "node_modules/@swc/core": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.9.3.tgz", - "integrity": "sha512-oRj0AFePUhtatX+BscVhnzaAmWjpfAeySpM1TCbxA1rtBDeH/JDhi5yYzAKneDYtVtBvA7ApfeuzhMC9ye4xSg==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.10.1.tgz", + "integrity": "sha512-rQ4dS6GAdmtzKiCRt3LFVxl37FaY1cgL9kSUTnhQ2xc3fmHOd7jdJK/V4pSZMG1ruGTd0bsi34O2R0Olg9Zo/w==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -3554,16 +3556,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.9.3", - "@swc/core-darwin-x64": "1.9.3", - "@swc/core-linux-arm-gnueabihf": "1.9.3", - "@swc/core-linux-arm64-gnu": "1.9.3", - "@swc/core-linux-arm64-musl": "1.9.3", - "@swc/core-linux-x64-gnu": "1.9.3", - "@swc/core-linux-x64-musl": "1.9.3", - "@swc/core-win32-arm64-msvc": "1.9.3", - "@swc/core-win32-ia32-msvc": "1.9.3", - "@swc/core-win32-x64-msvc": "1.9.3" + "@swc/core-darwin-arm64": "1.10.1", + "@swc/core-darwin-x64": "1.10.1", + "@swc/core-linux-arm-gnueabihf": "1.10.1", + "@swc/core-linux-arm64-gnu": "1.10.1", + "@swc/core-linux-arm64-musl": "1.10.1", + "@swc/core-linux-x64-gnu": "1.10.1", + "@swc/core-linux-x64-musl": "1.10.1", + "@swc/core-win32-arm64-msvc": "1.10.1", + "@swc/core-win32-ia32-msvc": "1.10.1", + "@swc/core-win32-x64-msvc": "1.10.1" }, "peerDependencies": { "@swc/helpers": "*" @@ -3575,9 +3577,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.9.3.tgz", - "integrity": "sha512-hGfl/KTic/QY4tB9DkTbNuxy5cV4IeejpPD4zo+Lzt4iLlDWIeANL4Fkg67FiVceNJboqg48CUX+APhDHO5G1w==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.10.1.tgz", + "integrity": "sha512-NyELPp8EsVZtxH/mEqvzSyWpfPJ1lugpTQcSlMduZLj1EASLO4sC8wt8hmL1aizRlsbjCX+r0PyL+l0xQ64/6Q==", "cpu": [ "arm64" ], @@ -3592,9 +3594,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.9.3.tgz", - "integrity": "sha512-IaRq05ZLdtgF5h9CzlcgaNHyg4VXuiStnOFpfNEMuI5fm5afP2S0FHq8WdakUz5WppsbddTdplL+vpeApt/WCQ==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.10.1.tgz", + "integrity": "sha512-L4BNt1fdQ5ZZhAk5qoDfUnXRabDOXKnXBxMDJ+PWLSxOGBbWE6aJTnu4zbGjJvtot0KM46m2LPAPY8ttknqaZA==", "cpu": [ "x64" ], @@ -3609,9 +3611,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.9.3.tgz", - "integrity": "sha512-Pbwe7xYprj/nEnZrNBvZfjnTxlBIcfApAGdz2EROhjpPj+FBqBa3wOogqbsuGGBdCphf8S+KPprL1z+oDWkmSQ==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.10.1.tgz", + "integrity": "sha512-Y1u9OqCHgvVp2tYQAJ7hcU9qO5brDMIrA5R31rwWQIAKDkJKtv3IlTHF0hrbWk1wPR0ZdngkQSJZple7G+Grvw==", "cpu": [ "arm" ], @@ -3626,9 +3628,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.9.3.tgz", - "integrity": "sha512-AQ5JZiwNGVV/2K2TVulg0mw/3LYfqpjZO6jDPtR2evNbk9Yt57YsVzS+3vHSlUBQDRV9/jqMuZYVU3P13xrk+g==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.10.1.tgz", + "integrity": "sha512-tNQHO/UKdtnqjc7o04iRXng1wTUXPgVd8Y6LI4qIbHVoVPwksZydISjMcilKNLKIwOoUQAkxyJ16SlOAeADzhQ==", "cpu": [ "arm64" ], @@ -3643,9 +3645,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.9.3.tgz", - "integrity": "sha512-tzVH480RY6RbMl/QRgh5HK3zn1ZTFsThuxDGo6Iuk1MdwIbdFYUY034heWUTI4u3Db97ArKh0hNL0xhO3+PZdg==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.10.1.tgz", + "integrity": "sha512-x0L2Pd9weQ6n8dI1z1Isq00VHFvpBClwQJvrt3NHzmR+1wCT/gcYl1tp9P5xHh3ldM8Cn4UjWCw+7PaUgg8FcQ==", "cpu": [ "arm64" ], @@ -3660,9 +3662,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.9.3.tgz", - "integrity": "sha512-ivXXBRDXDc9k4cdv10R21ccBmGebVOwKXT/UdH1PhxUn9m/h8erAWjz5pcELwjiMf27WokqPgaWVfaclDbgE+w==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.10.1.tgz", + "integrity": "sha512-yyYEwQcObV3AUsC79rSzN9z6kiWxKAVJ6Ntwq2N9YoZqSPYph+4/Am5fM1xEQYf/kb99csj0FgOelomJSobxQA==", "cpu": [ "x64" ], @@ -3677,9 +3679,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.9.3.tgz", - "integrity": "sha512-ILsGMgfnOz1HwdDz+ZgEuomIwkP1PHT6maigZxaCIuC6OPEhKE8uYna22uU63XvYcLQvZYDzpR3ms47WQPuNEg==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.10.1.tgz", + "integrity": "sha512-tcaS43Ydd7Fk7sW5ROpaf2Kq1zR+sI5K0RM+0qYLYYurvsJruj3GhBCaiN3gkzd8m/8wkqNqtVklWaQYSDsyqA==", "cpu": [ "x64" ], @@ -3694,9 +3696,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.9.3.tgz", - "integrity": "sha512-e+XmltDVIHieUnNJHtspn6B+PCcFOMYXNJB1GqoCcyinkEIQNwC8KtWgMqUucUbEWJkPc35NHy9k8aCXRmw9Kg==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.10.1.tgz", + "integrity": "sha512-D3Qo1voA7AkbOzQ2UGuKNHfYGKL6eejN8VWOoQYtGHHQi1p5KK/Q7V1ku55oxXBsj79Ny5FRMqiRJpVGad7bjQ==", "cpu": [ "arm64" ], @@ -3711,9 +3713,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.9.3.tgz", - "integrity": "sha512-rqpzNfpAooSL4UfQnHhkW8aL+oyjqJniDP0qwZfGnjDoJSbtPysHg2LpcOBEdSnEH+uIZq6J96qf0ZFD8AGfXA==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.10.1.tgz", + "integrity": "sha512-WalYdFoU3454Og+sDKHM1MrjvxUGwA2oralknXkXL8S0I/8RkWZOB++p3pLaGbTvOO++T+6znFbQdR8KRaa7DA==", "cpu": [ "ia32" ], @@ -3728,9 +3730,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.9.3.tgz", - "integrity": "sha512-3YJJLQ5suIEHEKc1GHtqVq475guiyqisKSoUnoaRtxkDaW5g1yvPt9IoSLOe2mRs7+FFhGGU693RsBUSwOXSdQ==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.10.1.tgz", + "integrity": "sha512-JWobfQDbTnoqaIwPKQ3DVSywihVXlQMbDuwik/dDWlj33A8oEHcjPOGs4OqcA3RHv24i+lfCQpM3Mn4FAMfacA==", "cpu": [ "x64" ], @@ -3969,9 +3971,9 @@ } }, "node_modules/@testing-library/react": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.1.tgz", - "integrity": "sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.1.0.tgz", + "integrity": "sha512-Q2ToPvg0KsVL0ohND9A3zLJWcOXXcO8IDu3fj11KhNt0UlCWyFyvnCIBkd12tidB2lkiVRG8VFqdhcqhqnAQtg==", "dev": true, "license": "MIT", "dependencies": { @@ -3982,10 +3984,10 @@ }, "peerDependencies": { "@testing-library/dom": "^10.0.0", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -4453,9 +4455,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.13", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.13.tgz", - "integrity": "sha512-ii/gswMmOievxAJed4PAHT949bpYjPKXvXo1v6cRB/kqc2ZR4n+SgyCyvyc5Fec5ez8VnUumI1Vk7j6fRyRogg==", + "version": "18.3.16", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.16.tgz", + "integrity": "sha512-oh8AMIC4Y2ciKufU8hnKgs+ufgbA/dhPTACaZPM86AbwX9QwnFtSoPWEeRUj8fge+v6kFt78BXcDhAU1SrrAsw==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -4463,12 +4465,13 @@ } }, "node_modules/@types/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", + "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", "dev": true, - "dependencies": { - "@types/react": "*" + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" } }, "node_modules/@types/react-redux": { @@ -4573,9 +4576,10 @@ "dev": true }, "node_modules/@types/use-sync-external-store": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", - "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" }, "node_modules/@types/ws": { "version": "8.5.12", @@ -4603,17 +4607,17 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.17.0.tgz", - "integrity": "sha512-HU1KAdW3Tt8zQkdvNoIijfWDMvdSweFYm4hWh+KwhPstv+sCmWb89hCIP8msFm9N1R/ooh9honpSuvqKWlYy3w==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.0.tgz", + "integrity": "sha512-NR2yS7qUqCL7AIxdJUQf2MKKNDVNaig/dEB0GBLU7D+ZdHgK1NoH/3wsgO3OnPVipn51tG3MAwaODEGil70WEw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.17.0", - "@typescript-eslint/type-utils": "8.17.0", - "@typescript-eslint/utils": "8.17.0", - "@typescript-eslint/visitor-keys": "8.17.0", + "@typescript-eslint/scope-manager": "8.18.0", + "@typescript-eslint/type-utils": "8.18.0", + "@typescript-eslint/utils": "8.18.0", + "@typescript-eslint/visitor-keys": "8.18.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -4628,25 +4632,135 @@ }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.0.tgz", + "integrity": "sha512-PNGcHop0jkK2WVYGotk/hxj+UFLhXtGPiGtiaWgVBVP1jhMoMCHlTyJA+hEj4rszoSdLTK3fN4oOatrL0Cp+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/visitor-keys": "8.18.0" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.0.tgz", + "integrity": "sha512-FNYxgyTCAnFwTrzpBGq+zrnoTO4x0c1CKYY5MuUTzpScqmY5fmsh2o3+57lqdI3NZucBDCzDgdEbIaNfAjAHQA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.0.tgz", + "integrity": "sha512-rqQgFRu6yPkauz+ms3nQpohwejS8bvgbPyIDq13cgEDbkXt4LH4OkDMT0/fN1RUtzG8e8AKJyDBoocuQh8qNeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/visitor-keys": "8.18.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.0.tgz", + "integrity": "sha512-p6GLdY383i7h5b0Qrfbix3Vc3+J2k6QWw6UMUeY5JGfm3C5LbZ4QIZzJNoNOfgyRe0uuYKjvVOsO/jD4SJO+xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.18.0", + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/typescript-estree": "8.18.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.0.tgz", + "integrity": "sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.18.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.17.0.tgz", - "integrity": "sha512-Drp39TXuUlD49F7ilHHCG7TTg8IkA+hxCuULdmzWYICxGXvDXmDmWEjJYZQYgf6l/TFfYNE167m7isnc3xlIEg==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.0.tgz", + "integrity": "sha512-hgUZ3kTEpVzKaK3uNibExUYm6SKKOmTU2BOxBSvOYwtJEPdVQ70kZJpPjstlnhCHcuc2WGfSbpKlb/69ttyN5Q==", "dev": true, - "license": "BSD-2-Clause", + "license": "MITClause", "dependencies": { - "@typescript-eslint/scope-manager": "8.17.0", - "@typescript-eslint/types": "8.17.0", - "@typescript-eslint/typescript-estree": "8.17.0", - "@typescript-eslint/visitor-keys": "8.17.0", + "@typescript-eslint/scope-manager": "8.18.0", + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/typescript-estree": "8.18.0", + "@typescript-eslint/visitor-keys": "8.18.0", "debug": "^4.3.4" }, "engines": { @@ -4657,12 +4771,98 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.0.tgz", + "integrity": "sha512-PNGcHop0jkK2WVYGotk/hxj+UFLhXtGPiGtiaWgVBVP1jhMoMCHlTyJA+hEj4rszoSdLTK3fN4oOatrL0Cp+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/visitor-keys": "8.18.0" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.0.tgz", + "integrity": "sha512-FNYxgyTCAnFwTrzpBGq+zrnoTO4x0c1CKYY5MuUTzpScqmY5fmsh2o3+57lqdI3NZucBDCzDgdEbIaNfAjAHQA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.0.tgz", + "integrity": "sha512-rqQgFRu6yPkauz+ms3nQpohwejS8bvgbPyIDq13cgEDbkXt4LH4OkDMT0/fN1RUtzG8e8AKJyDBoocuQh8qNeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/visitor-keys": "8.18.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.0.tgz", + "integrity": "sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.18.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/@typescript-eslint/scope-manager": { @@ -4684,14 +4884,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.17.0.tgz", - "integrity": "sha512-q38llWJYPd63rRnJ6wY/ZQqIzPrBCkPdpIsaCfkR3Q4t3p6sb422zougfad4TFW9+ElIFLVDzWGiGAfbb/v2qw==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.0.tgz", + "integrity": "sha512-er224jRepVAVLnMF2Q7MZJCq5CsdH2oqjP4dT7K6ij09Kyd+R21r7UVJrF0buMVdZS5QRhDzpvzAxHxabQadow==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.17.0", - "@typescript-eslint/utils": "8.17.0", + "@typescript-eslint/typescript-estree": "8.18.0", + "@typescript-eslint/utils": "8.18.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -4703,12 +4903,122 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.0.tgz", + "integrity": "sha512-PNGcHop0jkK2WVYGotk/hxj+UFLhXtGPiGtiaWgVBVP1jhMoMCHlTyJA+hEj4rszoSdLTK3fN4oOatrL0Cp+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/visitor-keys": "8.18.0" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.0.tgz", + "integrity": "sha512-FNYxgyTCAnFwTrzpBGq+zrnoTO4x0c1CKYY5MuUTzpScqmY5fmsh2o3+57lqdI3NZucBDCzDgdEbIaNfAjAHQA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.0.tgz", + "integrity": "sha512-rqQgFRu6yPkauz+ms3nQpohwejS8bvgbPyIDq13cgEDbkXt4LH4OkDMT0/fN1RUtzG8e8AKJyDBoocuQh8qNeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/visitor-keys": "8.18.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.0.tgz", + "integrity": "sha512-p6GLdY383i7h5b0Qrfbix3Vc3+J2k6QWw6UMUeY5JGfm3C5LbZ4QIZzJNoNOfgyRe0uuYKjvVOsO/jD4SJO+xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.18.0", + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/typescript-estree": "8.18.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.0.tgz", + "integrity": "sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.18.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/@typescript-eslint/types": { @@ -7376,8 +7686,7 @@ "node_modules/decimal.js": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" }, "node_modules/dedent": { "version": "1.5.1", @@ -8205,17 +8514,17 @@ } }, "node_modules/eslint-plugin-formatjs": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-formatjs/-/eslint-plugin-formatjs-5.2.5.tgz", - "integrity": "sha512-WodxExFb82vZZbtAoAqO3as2cM+mxq39BYXUtbgv+RtWxCCtq67ysVxF5NHmUoEtj5rkR178toIdZ85yBpnZTQ==", + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/eslint-plugin-formatjs/-/eslint-plugin-formatjs-5.2.8.tgz", + "integrity": "sha512-X2vgGsXwoBCAYvo8w59JScuo8foP5cbLz1FkSNeav2fGwBqe9WMvWDFt5V9IJDd895GffHnnX5Zy+Tjl5dDl1g==", "dev": true, "license": "MIT", "dependencies": { - "@formatjs/icu-messageformat-parser": "2.9.4", - "@formatjs/ts-transformer": "3.13.23", + "@formatjs/icu-messageformat-parser": "2.9.7", + "@formatjs/ts-transformer": "3.13.26", "@types/eslint": "9", "@types/picomatch": "3", - "@typescript-eslint/utils": "8.14.0", + "@typescript-eslint/utils": "8.17.0", "emoji-regex": "10", "magic-string": "^0.30.0", "picomatch": "2 || 3 || 4", @@ -8226,134 +8535,6 @@ "eslint": "9" } }, - "node_modules/eslint-plugin-formatjs/node_modules/@typescript-eslint/scope-manager": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.14.0.tgz", - "integrity": "sha512-aBbBrnW9ARIDn92Zbo7rguLnqQ/pOrUguVpbUwzOhkFg2npFDwTgPGqFqE0H5feXcOoJOfX3SxlJaKEVtq54dw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.14.0", - "@typescript-eslint/visitor-keys": "8.14.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-plugin-formatjs/node_modules/@typescript-eslint/types": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.14.0.tgz", - "integrity": "sha512-yjeB9fnO/opvLJFAsPNYlKPnEM8+z4og09Pk504dkqonT02AyL5Z9SSqlE0XqezS93v6CXn49VHvB2G7XSsl0g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-plugin-formatjs/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.14.0.tgz", - "integrity": "sha512-OPXPLYKGZi9XS/49rdaCbR5j/S14HazviBlUQFvSKz3npr3NikF+mrgK7CFVur6XEt95DZp/cmke9d5i3vtVnQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "8.14.0", - "@typescript-eslint/visitor-keys": "8.14.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-formatjs/node_modules/@typescript-eslint/utils": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.14.0.tgz", - "integrity": "sha512-OGqj6uB8THhrHj0Fk27DcHPojW7zKwKkPmHXHvQ58pLYp4hy8CSUdTKykKeh+5vFqTTVmjz0zCOOPKRovdsgHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.14.0", - "@typescript-eslint/types": "8.14.0", - "@typescript-eslint/typescript-estree": "8.14.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-formatjs/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.14.0.tgz", - "integrity": "sha512-vG0XZo8AdTH9OE6VFRwAZldNc7qtJ/6NLGWak+BtENuEUXGZgFpihILPiBvKXvJ2nFu27XNGC6rKiwuaoMbYzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.14.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-plugin-formatjs/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-plugin-formatjs/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint-plugin-jest-dom": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/eslint-plugin-jest-dom/-/eslint-plugin-jest-dom-5.5.0.tgz", @@ -8380,9 +8561,9 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "50.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.6.0.tgz", - "integrity": "sha512-tCNp4fR79Le3dYTPB0dKEv7yFyvGkUCa+Z3yuTrrNGGOxBlXo9Pn0PEgroOZikUQOGjxoGMVKNjrOHcYEdfszg==", + "version": "50.6.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.6.1.tgz", + "integrity": "sha512-UWyaYi6iURdSfdVVqvfOs2vdCVz0J40O/z/HTsv2sFjdjmdlUI/qlKLOTmwbPQ2tAfQnE5F9vqx+B+poF71DBQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -8632,9 +8813,9 @@ } }, "node_modules/eslint-plugin-testing-library": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-7.1.0.tgz", - "integrity": "sha512-VWuQWeLcsuj0ywBkXFHnLANN6AqHRzhIgmVgAN5DdlXdl5XBHl3hEZ7uKkSW+cCN2Ws4ODrN/Yp2u/YBJ7s/nA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-7.1.1.tgz", + "integrity": "sha512-nszC833aZPwB6tik1nMkbFqmtgIXTT0sfJEYs0zMBKMlkQ4to2079yUV96SvmLh00ovSBJI4pgcBC1TiIP8mXg==", "dev": true, "license": "MIT", "dependencies": { @@ -10646,14 +10827,14 @@ } }, "node_modules/intl-messageformat": { - "version": "10.7.7", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.7.tgz", - "integrity": "sha512-F134jIoeYMro/3I0h08D0Yt4N9o9pjddU/4IIxMMURqbAtI2wu70X8hvG1V48W49zXHXv3RKSF/po+0fDfsGjA==", + "version": "10.7.10", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.10.tgz", + "integrity": "sha512-hp7iejCBiJdW3zmOe18FdlJu8U/JsADSDiBPQhfdSeI8B9POtvPRvPh3nMlvhYayGMKLv6maldhR7y3Pf1vkpw==", "license": "BSD-3-Clause", "dependencies": { - "@formatjs/ecma402-abstract": "2.2.4", - "@formatjs/fast-memoize": "2.2.3", - "@formatjs/icu-messageformat-parser": "2.9.4", + "@formatjs/ecma402-abstract": "2.3.1", + "@formatjs/fast-memoize": "2.2.5", + "@formatjs/icu-messageformat-parser": "2.9.7", "tslib": "2" } }, @@ -16183,21 +16364,22 @@ "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" }, "node_modules/react-intl": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-7.0.1.tgz", - "integrity": "sha512-djq5s6d96mw+84vNh7Zz9/dUa2v2A4VNfpZbQdjvVHrvogGfTRp5WUgacwyWjGNAIrzmcpa8blcjQFps/3gwXw==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-7.0.4.tgz", + "integrity": "sha512-WGNfCPNcRQhNAZBN+amz2hfR8Kd7jngScJ4WaRZcsaOWsvva1ciStnUIGj9MvOAxPqTf1D78J5OdRdc3l0wgKQ==", "license": "BSD-3-Clause", "dependencies": { - "@formatjs/icu-messageformat-parser": "2.9.4", - "@formatjs/intl": "3.0.1", + "@formatjs/ecma402-abstract": "2.3.1", + "@formatjs/icu-messageformat-parser": "2.9.7", + "@formatjs/intl": "3.0.4", "@types/hoist-non-react-statics": "3", - "@types/react": "16 || 17 || 18", + "@types/react": "16 || 17 || 18 || 19", "hoist-non-react-statics": "3", - "intl-messageformat": "10.7.7", + "intl-messageformat": "10.7.10", "tslib": "2" }, "peerDependencies": { - "react": "^16.6.0 || 17 || 18", + "react": "^16.6.0 || 17 || 18 || 19", "typescript": "5" }, "peerDependenciesMeta": { @@ -16233,16 +16415,17 @@ } }, "node_modules/react-redux": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", - "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", + "license": "MIT", "dependencies": { - "@types/use-sync-external-store": "^0.0.3", - "use-sync-external-store": "^1.0.0" + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" }, "peerDependencies": { - "@types/react": "^18.2.25", - "react": "^18.0", + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", "redux": "^5.0.0" }, "peerDependenciesMeta": { @@ -17832,14 +18015,14 @@ } }, "node_modules/swc_mut_cjs_exports": { - "version": "0.109.1", - "resolved": "https://registry.npmjs.org/swc_mut_cjs_exports/-/swc_mut_cjs_exports-0.109.1.tgz", - "integrity": "sha512-964w4tAFD9jqEgk9igW4o4qfW9iNHhf7VdeEJcxH27XmbcWgcSwdsRg7ou4gNRoVuZNnpKMXa5sVH2HSD8yxOg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/swc_mut_cjs_exports/-/swc_mut_cjs_exports-8.0.1.tgz", + "integrity": "sha512-Ki9JxC1JTL8us4/LzgiFGnBnz+7a/UCyIiIEz3HdFu6a4OF7yXkhlR5pOCfgFvIfqS6Xgwrb+BP76raR2pmw9w==", "dev": true, "license": "MIT", "peerDependencies": { - "@swc/core": "^1.7.35", - "@swc/jest": "^0.2.36" + "@swc/core": "^1.10.0", + "@swc/jest": "^0.2.37" } }, "node_modules/swc-loader": { @@ -18841,11 +19024,12 @@ "dev": true }, "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", + "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", + "license": "MIT", "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/util": { diff --git a/package.json b/package.json index f3772fdb1..628eb3aa8 100644 --- a/package.json +++ b/package.json @@ -63,8 +63,8 @@ "@redhat-cloud-services/frontend-components-notifications": "^4.1.1", "@redhat-cloud-services/frontend-components-translations": "^3.2.11", "@redhat-cloud-services/frontend-components-utilities": "^5.0.3", - "@redhat-cloud-services/rbac-client": "^3.0.2", - "@reduxjs/toolkit": "^2.4.0", + "@redhat-cloud-services/rbac-client": "^3.0.3", + "@reduxjs/toolkit": "^2.5.0", "@unleash/proxy-client-react": "^4.4.0", "axios": "^1.7.9", "date-fns": "^4.1.0", @@ -73,50 +73,50 @@ "qs": "^6.13.1", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-intl": "^7.0.1", - "react-redux": "^9.1.2", + "react-intl": "^7.0.4", + "react-redux": "^9.2.0", "react-router-dom": "^6.28.0", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "typesafe-actions": "^5.1.0", - "victory": "^37.3.2" + "victory": "37.3.2" }, "devDependencies": { "@eslint/compat": "^1.2.4", "@eslint/eslintrc": "^3.2.0", "@eslint/js": "^9.16.0", - "@formatjs/cli": "^6.3.11", - "@formatjs/ecma402-abstract": "^2.2.4", - "@formatjs/fast-memoize": "^2.2.3", - "@formatjs/icu-messageformat-parser": "^2.9.4", - "@formatjs/intl-localematcher": "^0.5.8", + "@formatjs/cli": "^6.3.14", + "@formatjs/ecma402-abstract": "^2.3.1", + "@formatjs/fast-memoize": "^2.2.5", + "@formatjs/icu-messageformat-parser": "^2.9.7", + "@formatjs/intl-localematcher": "^0.5.9", "@redhat-cloud-services/frontend-components-config": "^6.3.5", "@redhat-cloud-services/tsc-transform-imports": "^1.0.21", - "@swc/core": "1.9.3", + "@swc/core": "^1.10.1", "@swc/jest": "^0.2.37", "@testing-library/jest-dom": "^6.6.3", - "@testing-library/react": "^16.0.1", + "@testing-library/react": "^16.1.0", "@testing-library/user-event": "^14.5.2", "@types/jest": "^29.5.14", "@types/qs": "^6.9.17", - "@types/react": "^18.3.13", - "@types/react-dom": "^18.3.1", + "@types/react": "^18.3.16", + "@types/react-dom": "^18.3.5", "@types/react-redux": "^7.1.34", "@types/react-router-dom": "^5.3.3", - "@typescript-eslint/eslint-plugin": "^8.17.0", - "@typescript-eslint/parser": "^8.17.0", + "@typescript-eslint/eslint-plugin": "^8.18.0", + "@typescript-eslint/parser": "^8.18.0", "copy-webpack-plugin": "^12.0.2", "eslint": "^9.16.0", - "eslint-plugin-formatjs": "^5.2.5", + "eslint-plugin-formatjs": "^5.2.8", "eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-jest-dom": "^5.5.0", - "eslint-plugin-jsdoc": "^50.6.0", + "eslint-plugin-jsdoc": "^50.6.1", "eslint-plugin-markdown": "^5.1.0", "eslint-plugin-prettier": "^5.2.1", "eslint-plugin-react": "^7.37.2", "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-sort-keys-fix": "^1.1.2", - "eslint-plugin-testing-library": "^7.1.0", + "eslint-plugin-testing-library": "^7.1.1", "git-revision-webpack-plugin": "^5.0.0", "globals": "^15.13.0", "identity-obj-proxy": "^3.0.0", @@ -127,17 +127,17 @@ "npm-run-all": "^4.1.5", "prettier": "^3.4.2", "rimraf": "^6.0.1", - "swc_mut_cjs_exports": "^0.109.1", + "swc_mut_cjs_exports": "^8.0.1", "ts-jest": "^29.2.5", "ts-patch": "^3.3.0", "typescript": "^5.7.2" }, "overrides": { - "@typescript-eslint/eslint-plugin": "^8.17.0", + "@typescript-eslint/eslint-plugin": "^8.18.0", "eslint": "^9.16.0", - "react-intl": "^7.0.1", + "react-intl": "^7.0.4", "redux": "^5.0.1", - "react-redux": "^9.1.2" + "react-redux": "^9.2.0" }, "insights": { "appname": "cost-management" From dfbfcd780db3ffb95384766b09649207aedea6e3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Dec 2024 15:14:10 +0000 Subject: [PATCH 8/9] Bump nanoid from 3.3.7 to 3.3.8 Bumps [nanoid](https://github.com/ai/nanoid) from 3.3.7 to 3.3.8. - [Release notes](https://github.com/ai/nanoid/releases) - [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md) - [Commits](https://github.com/ai/nanoid/compare/3.3.7...3.3.8) --- updated-dependencies: - dependency-name: nanoid dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0f34d1a2f..9d1d5ffe0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14830,9 +14830,9 @@ "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "funding": [ { "type": "github", From e68e4b7dd8884ed474b8dd7550de2c9124a45565 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Dec 2024 15:24:54 +0000 Subject: [PATCH 9/9] (chore): Bump @redhat-cloud-services/rbac-client Bumps the ci-dependencies group with 1 update in the / directory: [@redhat-cloud-services/rbac-client](https://github.com/RedHatInsights/javascript-clients). Updates `@redhat-cloud-services/rbac-client` from 3.0.3 to 3.0.4 - [Release notes](https://github.com/RedHatInsights/javascript-clients/releases) - [Changelog](https://github.com/RedHatInsights/javascript-clients/blob/main/release.config.js) - [Commits](https://github.com/RedHatInsights/javascript-clients/compare/@redhat-cloud-services/rbac-client-3.0.3...@redhat-cloud-services/rbac-client-3.0.4) --- updated-dependencies: - dependency-name: "@redhat-cloud-services/rbac-client" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: ci-dependencies ... Signed-off-by: dependabot[bot] --- package-lock.json | 9 ++++----- package.json | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0f34d1a2f..636f841b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "@redhat-cloud-services/frontend-components-notifications": "^4.1.1", "@redhat-cloud-services/frontend-components-translations": "^3.2.11", "@redhat-cloud-services/frontend-components-utilities": "^5.0.3", - "@redhat-cloud-services/rbac-client": "^3.0.3", + "@redhat-cloud-services/rbac-client": "^3.0.4", "@reduxjs/toolkit": "^2.5.0", "@unleash/proxy-client-react": "^4.4.0", "axios": "^1.7.9", @@ -3236,10 +3236,9 @@ } }, "node_modules/@redhat-cloud-services/rbac-client": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/rbac-client/-/rbac-client-3.0.3.tgz", - "integrity": "sha512-B1EMF2eXoJxpf0J+SSrDjQqVLkY/s49loRpOHv/EDHCa4z3+YTN7RFz7Cx0eKKAAbLCoTC9wZHzicKJxDToEkA==", - "license": "Apache-2.0", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/rbac-client/-/rbac-client-3.0.4.tgz", + "integrity": "sha512-wUnAJyAM6zCLxpK4kLKgAfGoB0Nku++8umgN/35+nS+Aoau/Y7W2PtGyB9ENUvdHPtRb500PvITCUZiGmRaA/A==", "dependencies": { "@redhat-cloud-services/javascript-clients-shared": "^1.2.6", "axios": "^1.7.2", diff --git a/package.json b/package.json index 628eb3aa8..99b3c38de 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "@redhat-cloud-services/frontend-components-notifications": "^4.1.1", "@redhat-cloud-services/frontend-components-translations": "^3.2.11", "@redhat-cloud-services/frontend-components-utilities": "^5.0.3", - "@redhat-cloud-services/rbac-client": "^3.0.3", + "@redhat-cloud-services/rbac-client": "^3.0.4", "@reduxjs/toolkit": "^2.5.0", "@unleash/proxy-client-react": "^4.4.0", "axios": "^1.7.9",