From 2f6f9634fb96abac24b03174658e4d37578148a8 Mon Sep 17 00:00:00 2001 From: Daniele Mangiagli Date: Mon, 3 Aug 2026 19:30:35 +0200 Subject: [PATCH 1/3] deps: react 19 --- package-lock.json | 374 +++++++++++++++++++++++++++------------------- package.json | 14 +- 2 files changed, 226 insertions(+), 162 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5185b2be4b..2de288cbe7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@dnd-kit/helpers": "^0.3.2", "@dnd-kit/react": "^0.5.0", - "@greenbone/ui-lib": "^2.8.1", + "@greenbone/ui-lib": "2.13.6-alpha0", "@mantine/core": "^8.3.16", "@mantine/dates": "^8.3.16", "@mantine/notifications": "^8.3.16", @@ -37,10 +37,10 @@ "lucide-react": "^1.23.0", "memoize-one": "^6.0.0", "prop-types": "^15.8.1", - "react": "^18.3.1", - "react-dom": "^18.3.1", + "react": "19.2.8", + "react-dom": "19.2.8", "react-i18next": "^17.0.11", - "react-is": "^18.3.1", + "react-is": "19.2.8", "react-redux": "^9.2.0", "react-router": "^7.17.0", "redux": "^5.0.1", @@ -66,9 +66,9 @@ "@types/d3-scale": "^4.0.9", "@types/d3-selection": "^3.0.11", "@types/node": "^26.1.2", - "@types/react": "^18.3.18", - "@types/react-dom": "^18.3.5", - "@types/react-is": "^18.3.1", + "@types/react": "19.2.18", + "@types/react-dom": "19.2.4", + "@types/react-is": "19.2.0", "@typescript-eslint/eslint-plugin": "^8.65.0", "@typescript-eslint/parser": "^8.65.0", "@vitejs/plugin-legacy": "^8.1.0", @@ -1878,6 +1878,18 @@ "tslib": "^2.6.2" } }, + "node_modules/@dnd-kit/accessibility": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz", + "integrity": "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, "node_modules/@dnd-kit/collision": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@dnd-kit/collision/-/collision-0.5.0.tgz", @@ -1920,6 +1932,22 @@ "tslib": "^2.6.2" } }, + "node_modules/@dnd-kit/core": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz", + "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@dnd-kit/accessibility": "^3.1.1", + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, "node_modules/@dnd-kit/dom": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@dnd-kit/dom/-/dom-0.5.0.tgz", @@ -1984,6 +2012,20 @@ "tslib": "^2.6.2" } }, + "node_modules/@dnd-kit/modifiers": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@dnd-kit/modifiers/-/modifiers-9.0.0.tgz", + "integrity": "sha512-ybiLc66qRGuZoC20wdSSG6pDXFikui/dCNGthxv4Ndy8ylErY0N3KVxY2bgo7AWwIbxDmXDg3ylAFmnrjcbVvw==", + "license": "MIT", + "dependencies": { + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@dnd-kit/core": "^6.3.0", + "react": ">=16.8.0" + } + }, "node_modules/@dnd-kit/react": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@dnd-kit/react/-/react-0.5.0.tgz", @@ -2031,6 +2073,20 @@ "tslib": "^2.6.2" } }, + "node_modules/@dnd-kit/sortable": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-10.0.0.tgz", + "integrity": "sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==", + "license": "MIT", + "dependencies": { + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@dnd-kit/core": "^6.3.0", + "react": ">=16.8.0" + } + }, "node_modules/@dnd-kit/state": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@dnd-kit/state/-/state-0.3.2.tgz", @@ -2041,6 +2097,18 @@ "tslib": "^2.6.2" } }, + "node_modules/@dnd-kit/utilities": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz", + "integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, "node_modules/@emnapi/core": { "version": "1.11.3", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.3.tgz", @@ -2087,6 +2155,7 @@ "version": "11.13.5", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", @@ -2104,12 +2173,14 @@ "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" }, "node_modules/@emotion/cache": { - "version": "11.13.5", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.5.tgz", - "integrity": "sha512-Z3xbtJ+UcK76eWkagZ1onvn/wAVb1GOMuR15s30Fm2wrMgC7jzpnO2JZXr4eujTTqoQFUrZIw/rT0c6Zzjca1g==", + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", "dependencies": { "@emotion/memoize": "^0.9.0", "@emotion/sheet": "^1.4.0", @@ -2121,7 +2192,8 @@ "node_modules/@emotion/hash": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", - "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==" + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" }, "node_modules/@emotion/is-prop-valid": { "version": "1.4.0", @@ -2138,15 +2210,16 @@ "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" }, "node_modules/@emotion/react": { - "version": "11.13.5", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.5.tgz", - "integrity": "sha512-6zeCUxUH+EPF1s+YF/2hPVODeV/7V07YU5x+2tfuRL8MdW6rv5vb2+CBEGTGwBdux0OIERcOS+RzxeK80k2DsQ==", + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", - "@emotion/cache": "^11.13.5", + "@emotion/cache": "^11.14.0", "@emotion/serialize": "^1.3.3", - "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "hoist-non-react-statics": "^3.3.1" @@ -2164,6 +2237,7 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", "dependencies": { "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", @@ -2175,17 +2249,20 @@ "node_modules/@emotion/sheet": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", - "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==" + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" }, "node_modules/@emotion/unitless": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", - "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==" + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", - "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", "peerDependencies": { "react": ">=16.8.0" } @@ -2193,12 +2270,14 @@ "node_modules/@emotion/utils": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", - "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==" + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" }, "node_modules/@emotion/weak-memoize": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", - "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==" + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", @@ -2411,32 +2490,32 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.4.tgz", - "integrity": "sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.10" + "@floating-ui/utils": "^0.2.12" } }, "node_modules/@floating-ui/dom": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.5.tgz", - "integrity": "sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.7.4", - "@floating-ui/utils": "^0.2.10" + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" } }, "node_modules/@floating-ui/react": { - "version": "0.27.18", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.18.tgz", - "integrity": "sha512-xJWJxvmy3a05j643gQt+pRbht5XnTlGpsEsAPnMi5F5YTOEEJymA90uZKBD8OvIv5XvZ1qi4GcccSlqT3Bq44Q==", + "version": "0.27.20", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.20.tgz", + "integrity": "sha512-CMqMy7OaXl9W0eq1Uy7L7i2Y/anPvHmFmESd2CEw0t5YvZhcVCeo4MBevAmswRllX7Y2dEidA4ozGPunLSTQpw==", "license": "MIT", "dependencies": { - "@floating-ui/react-dom": "^2.1.7", - "@floating-ui/utils": "^0.2.10", + "@floating-ui/react-dom": "^2.1.9", + "@floating-ui/utils": "^0.2.12", "tabbable": "^6.0.0" }, "peerDependencies": { @@ -2445,12 +2524,12 @@ } }, "node_modules/@floating-ui/react-dom": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.7.tgz", - "integrity": "sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==", + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz", + "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==", "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.7.5" + "@floating-ui/dom": "^1.8.0" }, "peerDependencies": { "react": ">=16.8.0", @@ -2458,28 +2537,33 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", - "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", "license": "MIT" }, "node_modules/@greenbone/ui-lib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/@greenbone/ui-lib/-/ui-lib-2.8.1.tgz", - "integrity": "sha512-mTYBObk52SSdjaR0h0aAepQSX6hxbfTdDQx+Mr5mLu0NtlpVHyaMrxNKuQbd8dYUpvBV8EdjSxlxtXuHr0OllQ==", + "version": "2.13.6-alpha0", + "resolved": "https://registry.npmjs.org/@greenbone/ui-lib/-/ui-lib-2.13.6-alpha0.tgz", + "integrity": "sha512-comDT7kviSDe9zstuhvRPtzoluMS2xV10qh5h1akBwzQ14daRVUJ7f0wG6ExYLyL4RTI12PqZKDYmt43UPkorg==", "license": "AGPL-3.0-or-later", "dependencies": { + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/modifiers": "^9.0.0", + "@dnd-kit/sortable": "^10.0.0", + "@dnd-kit/utilities": "^3.2.2", "@mantine/core": "^8.3.16", "@mantine/dates": "^8.3.16", "@mantine/hooks": "^8.3.16", "@mantine/notifications": "^8.3.16", + "@tanstack/react-table": "^8.21.3", "lodash": "^4.17.21", "lucide-react": "^0.577.0", "luxon": "^3.7.2", - "react": "^18.x.x", - "react-dom": "^18.x.x", + "react": "^19.x.x", + "react-dom": "^19.x.x", "react-hook-form": "7.74.0", - "react-i18next": "^16.5.6", + "react-i18next": "^17.0.0", "react-select": "^5.10.2", "tiny-invariant": "^1.3.3", "urlcat": "^3.1.0", @@ -2496,9 +2580,9 @@ "@mantine/hooks": "^8.3.16", "@mantine/notifications": "^8.3.16", "lucide-react": "^0.577.0", - "react": "^18.x.x", - "react-dom": "^18.x.x", - "react-i18next": "^16.5.6" + "react": "^19.x.x", + "react-dom": "^19.x.x", + "react-i18next": "^17.0.0" } }, "node_modules/@greenbone/ui-lib/node_modules/lucide-react": { @@ -2510,33 +2594,6 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/@greenbone/ui-lib/node_modules/react-i18next": { - "version": "16.6.6", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-16.6.6.tgz", - "integrity": "sha512-ZgL2HUoW34UKUkOV7uSQFE1CDnRPD+tCR3ywSuWH7u2iapnz86U8Bi3Vrs620qNDzCf1F47NxglCEkchCTDOHw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.29.2", - "html-parse-stringify": "^3.0.1", - "use-sync-external-store": "^1.6.0" - }, - "peerDependencies": { - "i18next": ">= 25.10.9", - "react": ">= 16.8.0", - "typescript": "^5 || ^6" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -4066,6 +4123,39 @@ "react": "^18 || ^19" } }, + "node_modules/@tanstack/react-table": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.21.3.tgz", + "integrity": "sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==", + "license": "MIT", + "dependencies": { + "@tanstack/table-core": "8.21.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/@tanstack/table-core": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.3.tgz", + "integrity": "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, "node_modules/@testing-library/dom": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", @@ -4291,41 +4381,36 @@ "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" - }, - "node_modules/@types/prop-types": { - "version": "15.7.13", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", - "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==" + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", - "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", "license": "MIT", "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" + "csstype": "^3.2.2" } }, "node_modules/@types/react-dom": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", - "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", "dev": true, "license": "MIT", "peerDependencies": { - "@types/react": "^18.0.0" + "@types/react": "^19.2.0" } }, "node_modules/@types/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-zts4lhQn5ia0cF/y2+3V6Riu0MAfez9/LJYavdM8TvcVl+S91A/7VWxyBT8hbRuWspmuCaiGI0F41OJYGrKhRA==", + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-19.2.0.tgz", + "integrity": "sha512-NP2xtcjZfORsOa4g2JwdseyEnF+wUCx25fTdG/J/HIY6yKga6+NozRBg2xR2gyh7kKYyd6DXndbq0YbQuTJ7Ew==", "dev": true, "license": "MIT", "dependencies": { - "@types/react": "^18" + "@types/react": "*" } }, "node_modules/@types/react-transition-group": { @@ -5134,6 +5219,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", @@ -5569,6 +5655,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -6017,6 +6104,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" @@ -6885,7 +6973,8 @@ "node_modules/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" }, "node_modules/find-up": { "version": "5.0.0", @@ -7266,14 +7355,6 @@ "dev": true, "license": "MIT" }, - "node_modules/html-parse-stringify": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", - "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", - "dependencies": { - "void-elements": "3.1.0" - } - }, "node_modules/human-signals": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", @@ -7344,16 +7425,6 @@ "node": ">=22" } }, - "node_modules/i18next-cli/node_modules/react": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", - "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/i18next-http-backend": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-4.0.0.tgz", @@ -9331,26 +9402,26 @@ } }, "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "license": "MIT", + "peer": true, "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^18.3.1" + "react": "^19.2.8" } }, "node_modules/react-hook-form": { @@ -9406,15 +9477,15 @@ } }, "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.8.tgz", + "integrity": "sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==", "license": "MIT" }, "node_modules/react-number-format": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.4.4.tgz", - "integrity": "sha512-wOmoNZoOpvMminhifQYiYSTCLUDOiUbBunrMrMjA+dV52sY+vck1S4UhR6PkgnoCquvvMSeJjErXZ4qSaWCliA==", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.4.5.tgz", + "integrity": "sha512-y8O2yHHj3w0aE9XO8d2BCcUOOdQTRSVq+WIuMlLVucAm5XNjJAy+BoOJiuQMldVYVOKTMyvVNfnbl2Oqp+YxGw==", "license": "MIT", "peerDependencies": { "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", @@ -9577,6 +9648,7 @@ "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -9926,12 +9998,10 @@ } }, "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "dependencies": { - "loose-envify": "^1.1.0" - } + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" }, "node_modules/semver": { "version": "6.3.1", @@ -10117,6 +10187,7 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -10434,7 +10505,8 @@ "node_modules/stylis": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" }, "node_modules/supports-color": { "version": "7.2.0", @@ -10494,9 +10566,9 @@ "dev": true }, "node_modules/tabbable": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", - "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.5.0.tgz", + "integrity": "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==", "license": "MIT" }, "node_modules/terser": { @@ -11299,14 +11371,6 @@ } } }, - "node_modules/void-elements": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", - "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", diff --git a/package.json b/package.json index 37d7c7a58d..03e920deed 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "dependencies": { "@dnd-kit/helpers": "^0.3.2", "@dnd-kit/react": "^0.5.0", - "@greenbone/ui-lib": "^2.8.1", + "@greenbone/ui-lib": "2.13.6-alpha0", "@mantine/core": "^8.3.16", "@mantine/dates": "^8.3.16", "@mantine/notifications": "^8.3.16", @@ -65,10 +65,10 @@ "lucide-react": "^1.23.0", "memoize-one": "^6.0.0", "prop-types": "^15.8.1", - "react": "^18.3.1", - "react-dom": "^18.3.1", + "react": "19.2.8", + "react-dom": "19.2.8", "react-i18next": "^17.0.11", - "react-is": "^18.3.1", + "react-is": "19.2.8", "react-redux": "^9.2.0", "react-router": "^7.17.0", "redux": "^5.0.1", @@ -94,9 +94,9 @@ "@types/d3-scale": "^4.0.9", "@types/d3-selection": "^3.0.11", "@types/node": "^26.1.2", - "@types/react": "^18.3.18", - "@types/react-dom": "^18.3.5", - "@types/react-is": "^18.3.1", + "@types/react": "19.2.18", + "@types/react-dom": "19.2.4", + "@types/react-is": "19.2.0", "@typescript-eslint/eslint-plugin": "^8.65.0", "@typescript-eslint/parser": "^8.65.0", "@vitejs/plugin-legacy": "^8.1.0", From abfdfd6ece97fcb33fa78bbea6209b557ec5d13d Mon Sep 17 00:00:00 2001 From: Daniele Mangiagli Date: Tue, 4 Aug 2026 20:33:39 +0200 Subject: [PATCH 2/3] change: tests for react 19 --- .../__tests__/withEntitiesActions.test.tsx | 5 ++++- .../__tests__/withEntitiesFooter.test.tsx | 8 ++++---- .../__tests__/AuditReportDetailsPage.test.tsx | 17 +++++++++-------- .../__tests__/ReportDetailsPage.test.tsx | 15 +++++++++------ .../utils/__tests__/withTranslation.test.tsx | 2 +- 5 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/web/entities/__tests__/withEntitiesActions.test.tsx b/src/web/entities/__tests__/withEntitiesActions.test.tsx index aa9fceb6c9..8ed2073e1e 100644 --- a/src/web/entities/__tests__/withEntitiesActions.test.tsx +++ b/src/web/entities/__tests__/withEntitiesActions.test.tsx @@ -24,7 +24,10 @@ describe('withEntitiesActions', () => { render(); - expect(MockComponent).toHaveBeenCalledWith({someProp: 'test', entity}, {}); + expect(MockComponent).toHaveBeenCalledWith( + {someProp: 'test', entity}, + undefined, + ); expect(screen.getByText('Mock Component')).toBeInTheDocument(); }); diff --git a/src/web/entities/__tests__/withEntitiesFooter.test.tsx b/src/web/entities/__tests__/withEntitiesFooter.test.tsx index a9ae4a2a64..ef2d77f6eb 100644 --- a/src/web/entities/__tests__/withEntitiesFooter.test.tsx +++ b/src/web/entities/__tests__/withEntitiesFooter.test.tsx @@ -47,7 +47,7 @@ describe('withEntitiesFooter tests', () => { onTagsClick: mockProps.onTagsBulk, onTrashClick: mockProps.onDeleteBulk, }), - {}, + undefined, ); }); @@ -79,7 +79,7 @@ describe('withEntitiesFooter tests', () => { onDeleteClick: mockProps.onDeleteBulk, onTrashClick: mockProps.onDeleteBulk, }), - {}, + undefined, ); }); @@ -112,7 +112,7 @@ describe('withEntitiesFooter tests', () => { onDeleteClick: mockProps.onDeleteBulk, onTrashClick: mockProps.onDeleteBulk, }), - {}, + undefined, ); }); @@ -134,7 +134,7 @@ describe('withEntitiesFooter tests', () => { onEnableUpdateToLatestClick: expect.any(Function), onDisableUpdateToLatestClick: expect.any(Function), }), - {}, + undefined, ); }); }); diff --git a/src/web/pages/reports/__tests__/AuditReportDetailsPage.test.tsx b/src/web/pages/reports/__tests__/AuditReportDetailsPage.test.tsx index 3651fa80d6..47eb259c54 100644 --- a/src/web/pages/reports/__tests__/AuditReportDetailsPage.test.tsx +++ b/src/web/pages/reports/__tests__/AuditReportDetailsPage.test.tsx @@ -185,12 +185,13 @@ describe('AuditReportDetailsPage', () => { const {render} = setupRenderer(); renderPage(render); - await screen.findByRole('heading', {name: /Audit Report:/}); - expect( - screen.getByRole('heading', {name: /Audit Report:/}), - ).toHaveTextContent( - 'Audit Report:Mon, Jun 3, 2019 1:00 PM Central European Summer TimeDone', - ); + await waitFor(() => { + expect( + screen.getByRole('heading', {name: /Audit Report:/}), + ).toHaveTextContent( + 'Audit Report:Mon, Jun 3, 2019 1:00 PM Central European Summer TimeDone', + ); + }); }); test('should render all 7 tabs once entity is loaded', async () => { @@ -264,7 +265,7 @@ describe('AuditReportDetailsPage', () => { const {render} = setupRenderer(); renderPage(render); - await screen.findByTitle('Edit Filter'); + await screen.findByRole('tablist'); fireEvent.click(screen.getByTitle('Edit Filter')); await screen.findByRole('heading', {name: /Update Filter/}); @@ -274,7 +275,7 @@ describe('AuditReportDetailsPage', () => { const {render} = setupRenderer(); renderPage(render); - await screen.findByTitle('Edit Filter'); + await screen.findByRole('tablist'); fireEvent.click(screen.getByTitle('Edit Filter')); await screen.findByRole('heading', {name: /Update Filter/}); diff --git a/src/web/pages/reports/__tests__/ReportDetailsPage.test.tsx b/src/web/pages/reports/__tests__/ReportDetailsPage.test.tsx index 2f4c9e5a68..40e87c5fcb 100644 --- a/src/web/pages/reports/__tests__/ReportDetailsPage.test.tsx +++ b/src/web/pages/reports/__tests__/ReportDetailsPage.test.tsx @@ -185,10 +185,13 @@ describe('ReportDetailsPage tests', () => { const {render} = setupRenderer(); renderPage(render); - await screen.findByRole('heading', {name: /Report:/}); - expect(screen.getByRole('heading', {name: /Report:/})).toHaveTextContent( - 'Mon, Jun 3, 2019 1:00 PMCentral European Summer TimeDone', - ); + await waitFor(() => { + expect( + screen.getByRole('heading', {name: /Report:/}), + ).toHaveTextContent( + 'Mon, Jun 3, 2019 1:00 PMCentral European Summer TimeDone', + ); + }); }); test('should render all 11 tabs once entity is loaded', async () => { @@ -274,7 +277,7 @@ describe('ReportDetailsPage tests', () => { const {render} = setupRenderer(); renderPage(render); - await screen.findByTitle('Edit Filter'); + await screen.findByRole('tablist'); fireEvent.click(screen.getByTitle('Edit Filter')); await screen.findByRole('heading', {name: /Update Filter/}); @@ -284,7 +287,7 @@ describe('ReportDetailsPage tests', () => { const {render} = setupRenderer(); renderPage(render); - await screen.findByTitle('Edit Filter'); + await screen.findByRole('tablist'); fireEvent.click(screen.getByTitle('Edit Filter')); await screen.findByRole('heading', {name: /Update Filter/}); diff --git a/src/web/utils/__tests__/withTranslation.test.tsx b/src/web/utils/__tests__/withTranslation.test.tsx index 38cee0f5d2..c31a93596d 100644 --- a/src/web/utils/__tests__/withTranslation.test.tsx +++ b/src/web/utils/__tests__/withTranslation.test.tsx @@ -31,7 +31,7 @@ describe('withTranslation HOC', () => { i18n, someProp: 'test', }), - {}, + undefined, ); expect(screen.getByText('Tasks')).toBeInTheDocument(); }); From ac6d3a5b503aa00ab1693f8c41fa39f6e81addf0 Mon Sep 17 00:00:00 2001 From: Daniele Mangiagli Date: Tue, 4 Aug 2026 20:34:51 +0200 Subject: [PATCH 3/3] change: typescript for react 19 --- src/web/components/chart/Donut.tsx | 6 ++- .../components/chart/HostsTopologyChart.tsx | 4 +- src/web/components/chart/base/Legend.tsx | 2 +- src/web/components/chart/base/Line.tsx | 2 +- src/web/components/chart/base/Tooltip.tsx | 4 +- src/web/components/chart/donut/Pie.tsx | 6 +-- .../dashboard/display/DataDisplay.tsx | 6 +-- src/web/components/form/Download.tsx | 4 +- src/web/components/form/ToggleButton.tsx | 5 +- .../hover-card/ComponentWithHoverCard.tsx | 11 +++-- .../info-tip/ComponentWithInfoTip.tsx | 10 ++-- src/web/components/tab/Tabs.tsx | 5 +- src/web/entity/__tests__/Tags.test.tsx | 48 ++++++++++++++++--- src/web/hooks/usePreviousValue.ts | 2 +- src/web/pages/audits/DetailsPage.tsx | 3 ++ src/web/pages/hosts/__tests__/Dialog.test.tsx | 27 +++++++++-- .../hosts/__tests__/HostComponent.test.tsx | 9 +++- src/web/pages/policies/PoliciesComponent.tsx | 2 + .../reports/AuditReportDetailsContent.tsx | 1 - .../VulnerabilitiesHostsBarChart.tsx | 2 +- src/web/utils/Render.tsx | 1 - 21 files changed, 121 insertions(+), 39 deletions(-) diff --git a/src/web/components/chart/Donut.tsx b/src/web/components/chart/Donut.tsx index 8ae99a9cbe..2a6666eb38 100644 --- a/src/web/components/chart/Donut.tsx +++ b/src/web/components/chart/Donut.tsx @@ -48,7 +48,7 @@ interface DonutChartProps { height: number; data?: TData[]; innerRadius?: number; - svgRef?: React.RefObject; + svgRef?: React.RefObject; show3d?: boolean; showLegend?: boolean; onDataClick?: (data: TData) => void; @@ -285,7 +285,9 @@ class DonutChart< return ( , ref => (this.svg = ref))} + ref={setRef(svgRef as Ref, ref => { + this.svg = ref; + })} height={height} width={width} > diff --git a/src/web/components/chart/HostsTopologyChart.tsx b/src/web/components/chart/HostsTopologyChart.tsx index d2adb1b2f8..dee39fda1d 100644 --- a/src/web/components/chart/HostsTopologyChart.tsx +++ b/src/web/components/chart/HostsTopologyChart.tsx @@ -528,7 +528,9 @@ class HostsTopologyChart extends React.Component< )} (this.svg = ref), svgRef)} + ref={setRef(ref => { + this.svg = ref; + }, svgRef)} $dragging={dragging} height={height} width={width} diff --git a/src/web/components/chart/base/Legend.tsx b/src/web/components/chart/base/Legend.tsx index 879cdc1284..83e36985f8 100644 --- a/src/web/components/chart/base/Legend.tsx +++ b/src/web/components/chart/base/Legend.tsx @@ -39,7 +39,7 @@ interface LegendProps { onItemClick?: (d: TData) => void; } -export type LegendRef = RefObject; +export type LegendRef = RefObject; const StyledLegend = styled.div` padding: 5px 10px; diff --git a/src/web/components/chart/base/Line.tsx b/src/web/components/chart/base/Line.tsx index a5fcd8b047..89d956208c 100644 --- a/src/web/components/chart/base/Line.tsx +++ b/src/web/components/chart/base/Line.tsx @@ -244,7 +244,7 @@ const LineChart = ({ y2Line, onRangeSelected, }: LineChartProps) => { - const legendRef: LegendRef = useRef(null); + const legendRef: LegendRef = useRef(null); const svgElementRef = useRef(null); const [displayInfo, setDisplayInfo] = useState(false); diff --git a/src/web/components/chart/base/Tooltip.tsx b/src/web/components/chart/base/Tooltip.tsx index 68456d8a01..b7120c5189 100644 --- a/src/web/components/chart/base/Tooltip.tsx +++ b/src/web/components/chart/base/Tooltip.tsx @@ -71,8 +71,8 @@ const ToolTipDisplay = React.forwardRef( ); class ToolTip extends React.Component { - target: React.RefObject; - tooltip: React.RefObject; + target: React.RefObject; + tooltip: React.RefObject; constructor(props: ToolTipProps) { super(props); diff --git a/src/web/components/chart/donut/Pie.tsx b/src/web/components/chart/donut/Pie.tsx index afd06cc538..43d986f3ae 100644 --- a/src/web/components/chart/donut/Pie.tsx +++ b/src/web/components/chart/donut/Pie.tsx @@ -13,7 +13,7 @@ import PropTypes from 'web/utils/prop-types'; const sortArcsByStartAngle = (a, b) => (a.startAngle > b.startAngle ? -1 : 1); const Pie = ({ - className, + className = undefined, top = 0, left = 0, data, @@ -21,8 +21,8 @@ const Pie = ({ outerRadiusX, innerRadiusY, outerRadiusY, - padAngle, - pieSort, + padAngle = undefined, + pieSort = undefined, pieValue, arcsSort = sortArcsByStartAngle, children, diff --git a/src/web/components/dashboard/display/DataDisplay.tsx b/src/web/components/dashboard/display/DataDisplay.tsx index d853cfed3f..8ff0f09797 100644 --- a/src/web/components/dashboard/display/DataDisplay.tsx +++ b/src/web/components/dashboard/display/DataDisplay.tsx @@ -53,7 +53,7 @@ interface DataDisplayRenderProps { id: string; width: number; height: number; - svgRef: React.RefObject; + svgRef: React.RefObject; data: TData[]; state: TState; setState: SetStateFunc; @@ -185,8 +185,8 @@ class DataDisplay< TTransformedData, TTransformProps = Record, > extends React.Component> { - svgRef: React.RefObject; - downloadRef: React.RefObject; + svgRef: React.RefObject; + downloadRef: React.RefObject; downloadSvgUrl?: string; downloadCsvUrl?: string; diff --git a/src/web/components/form/Download.tsx b/src/web/components/form/Download.tsx index 3ce3ea5a7d..43a3c7446e 100644 --- a/src/web/components/form/Download.tsx +++ b/src/web/components/form/Download.tsx @@ -59,7 +59,9 @@ class Download extends React.Component { const {filename} = this.props; return ( (this.anchor = ref)} + ref={ref => { + this.anchor = ref; + }} aria-hidden download={filename} style={{display: 'none'}} diff --git a/src/web/components/form/ToggleButton.tsx b/src/web/components/form/ToggleButton.tsx index bcb8768063..19658a56a2 100644 --- a/src/web/components/form/ToggleButton.tsx +++ b/src/web/components/form/ToggleButton.tsx @@ -8,7 +8,10 @@ import styled from 'styled-components'; import {isDefined} from 'gmp/utils/identity'; import Theme from 'web/utils/theme'; -interface StyledProps extends React.HTMLAttributes { +interface StyledProps extends Omit< + React.HTMLAttributes, + 'onToggle' +> { checked?: boolean; disabled?: boolean; width?: string; diff --git a/src/web/components/hover-card/ComponentWithHoverCard.tsx b/src/web/components/hover-card/ComponentWithHoverCard.tsx index e66b731953..3e86fd4baf 100644 --- a/src/web/components/hover-card/ComponentWithHoverCard.tsx +++ b/src/web/components/hover-card/ComponentWithHoverCard.tsx @@ -3,13 +3,13 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import {type ReactNode, type ReactElement, cloneElement} from 'react'; +import {type ReactNode, cloneElement} from 'react'; import HoverCard from 'web/components/hover-card/HoverCard'; import useTranslation from 'web/hooks/useTranslation'; interface ComponentWithHoverCardProps { /** The component (TextField, NumberField, etc.) */ - slot: ReactElement; + slot: React.ReactElement>; /** The help content to display in the hover card */ helpContent: ReactNode; /** Aria label for the help button */ @@ -51,12 +51,13 @@ const ComponentWithHoverCard = ({ ); + const slotProps = slot.props as Record; // Clone the slot element and add the HoverCard to its title const slotWithHoverCard = cloneElement(slot, { - ...slot.props, - title: slot.props.title ? ( + ...slotProps, + title: slotProps.title ? ( <> - {slot.props.title} + {slotProps.title} {hoverCardElement} ) : ( diff --git a/src/web/components/info-tip/ComponentWithInfoTip.tsx b/src/web/components/info-tip/ComponentWithInfoTip.tsx index 979ddd7ea4..f9fbaa9c45 100644 --- a/src/web/components/info-tip/ComponentWithInfoTip.tsx +++ b/src/web/components/info-tip/ComponentWithInfoTip.tsx @@ -9,7 +9,7 @@ import useTranslation from 'web/hooks/useTranslation'; interface ComponentWithInfoTipProps { /** The component (TextField, NumberField, etc.) */ - slot: ReactElement; + slot: ReactElement>; /** The help content to display in the infotip */ helpContent: ReactNode; /** Aria label for the help button */ @@ -55,12 +55,14 @@ const ComponentWithInfoTip = ({ ); + const slotProps = slot.props; + // Clone the slot element and add the infoTip to its title const slotWithInfoTip = cloneElement(slot, { - ...slot.props, - title: slot.props.title ? ( + ...slotProps, + title: slotProps.title ? ( <> - {slot.props.title} + {slotProps.title} {infoTipElement} ) : ( diff --git a/src/web/components/tab/Tabs.tsx b/src/web/components/tab/Tabs.tsx index a40c17a5d3..f4e3757d57 100644 --- a/src/web/components/tab/Tabs.tsx +++ b/src/web/components/tab/Tabs.tsx @@ -24,7 +24,10 @@ const Tabs = (props: TabProps) => { const children = React.Children.map(props.children, child => { if (child && typeof child === 'object' && 'type' in child) { if (child.type === TabPanels) { - return React.cloneElement(child, {activeTab}); + return React.cloneElement( + child as React.ReactElement<{activeTab: number}>, + {activeTab}, + ); } else if (child.type === TabList) { return child; } diff --git a/src/web/entity/__tests__/Tags.test.tsx b/src/web/entity/__tests__/Tags.test.tsx index 2cf50db92d..cbd3a667d3 100644 --- a/src/web/entity/__tests__/Tags.test.tsx +++ b/src/web/entity/__tests__/Tags.test.tsx @@ -73,7 +73,13 @@ describe('EntityTags tests', () => { const gmp = createGmp(); const {render} = rendererWith({capabilities: true, gmp}); - render(); + render( + , + ); screen.getByTitle('User Tags (2)'); screen.getByText('Test Tag'); @@ -90,7 +96,13 @@ describe('EntityTags tests', () => { const gmp = createGmp(); const {render} = rendererWith({capabilities: true, gmp}); - render(); + render( + , + ); screen.getByText('No user tags available'); }); @@ -102,7 +114,13 @@ describe('EntityTags tests', () => { const gmp = createGmp(); const {render} = rendererWith({capabilities: true, gmp}); - render(); + render( + , + ); screen.getByText('No user tags available'); }); @@ -111,7 +129,13 @@ describe('EntityTags tests', () => { const gmp = createGmp(); const {render} = rendererWith({capabilities: true, gmp}); - render(); + render( + , + ); // Check table structure screen.getByText('Name'); @@ -163,7 +187,13 @@ describe('EntityTags tests', () => { }); const {render} = rendererWith({capabilities: true, gmp}); - render(); + render( + , + ); const editIcons = screen.getAllByTitle('Edit Tag'); fireEvent.click(editIcons[0]); @@ -185,7 +215,13 @@ describe('EntityTags tests', () => { const {render} = rendererWith({gmp, capabilities: true}); - render(); + render( + , + ); const removeIcons = screen.getAllByTestId('trashcan-icon'); fireEvent.click(removeIcons[0]); diff --git a/src/web/hooks/usePreviousValue.ts b/src/web/hooks/usePreviousValue.ts index b42259f48a..dd6c5d7cbf 100644 --- a/src/web/hooks/usePreviousValue.ts +++ b/src/web/hooks/usePreviousValue.ts @@ -22,7 +22,7 @@ import {useEffect, useRef} from 'react'; * ``` */ const usePreviousValue = (value: TValue) => { - const ref = useRef(); // initially the previous value is undefined + const ref = useRef(undefined); // initially the previous value is undefined useEffect(() => { // will be called AFTER the calling component has rendered diff --git a/src/web/pages/audits/DetailsPage.tsx b/src/web/pages/audits/DetailsPage.tsx index 35141f0a3e..d5af4fd6f0 100644 --- a/src/web/pages/audits/DetailsPage.tsx +++ b/src/web/pages/audits/DetailsPage.tsx @@ -172,12 +172,15 @@ const AuditDetailsPage = () => { { const {render} = rendererWith(); - render(); + render( + , + ); const inputs = screen.queryTextInputs(); expect(inputs[0]).toHaveAttribute('name', 'name'); @@ -157,7 +164,14 @@ describe('HostsDialog component tests', () => { const handleSave = testing.fn(); const {render} = rendererWith(); - render(); + render( + , + ); const commentInput = screen.getByName('comment'); changeInputValue(commentInput, 'test comment'); @@ -176,7 +190,14 @@ describe('HostsDialog component tests', () => { const handleSave = testing.fn(); const {render} = rendererWith(); - render(); + render( + , + ); const closeButton = screen.getDialogCloseButton(); fireEvent.click(closeButton); diff --git a/src/web/pages/hosts/__tests__/HostComponent.test.tsx b/src/web/pages/hosts/__tests__/HostComponent.test.tsx index 50bebee6ea..2e5bed021e 100644 --- a/src/web/pages/hosts/__tests__/HostComponent.test.tsx +++ b/src/web/pages/hosts/__tests__/HostComponent.test.tsx @@ -180,7 +180,14 @@ describe('HostWithTargetComponent tests', () => { > {({edit}) => { editFn = edit; - return ; + return ( + + ); }} , ); diff --git a/src/web/pages/policies/PoliciesComponent.tsx b/src/web/pages/policies/PoliciesComponent.tsx index 52f4b3b642..4782582ec7 100644 --- a/src/web/pages/policies/PoliciesComponent.tsx +++ b/src/web/pages/policies/PoliciesComponent.tsx @@ -687,6 +687,8 @@ const PolicyComponent = ({ )} {createPolicyDialogVisible && ( { const promise = isDefined(d.id) ? save(d) : create(d); diff --git a/src/web/pages/reports/AuditReportDetailsContent.tsx b/src/web/pages/reports/AuditReportDetailsContent.tsx index 694e71ba0d..ec533f082e 100644 --- a/src/web/pages/reports/AuditReportDetailsContent.tsx +++ b/src/web/pages/reports/AuditReportDetailsContent.tsx @@ -101,7 +101,6 @@ const renderWithThreshold = ( return ( ; + svgRef: React.RefObject; onDataClick?: (dataPoint: { x: number; y: number; diff --git a/src/web/utils/Render.tsx b/src/web/utils/Render.tsx index d7e8c2c520..78e368d00f 100644 --- a/src/web/utils/Render.tsx +++ b/src/web/utils/Render.tsx @@ -573,7 +573,6 @@ export const setRef = if (isFunction(rf)) { (rf as React.RefCallback)(ref); } else if (isObject(rf) && isDefined(rf.current)) { - // @ts-expect-error (rf as React.RefObject).current = ref; } }