diff --git a/frontend/.babelrc b/frontend/.babelrc index 0eecbfacfe83..db5e82e93703 100644 --- a/frontend/.babelrc +++ b/frontend/.babelrc @@ -1,6 +1,6 @@ { "presets": [ - "@babel/preset-react", + ["@babel/preset-react", { "runtime": "automatic" }], "@babel/preset-typescript", [ "@babel/preset-env", @@ -33,8 +33,7 @@ "production": { "plugins": [ "transform-react-remove-prop-types", - "@babel/transform-react-constant-elements", - "@babel/transform-react-inline-elements" + "@babel/transform-react-constant-elements" ] } } diff --git a/frontend/common/Component.js b/frontend/common/Component.js deleted file mode 100644 index 0ce0fb97852d..000000000000 --- a/frontend/common/Component.js +++ /dev/null @@ -1,55 +0,0 @@ -module.exports = function Component(options) { - // eslint-disable-next-line - return React.createClass(Object.assign({}, options, { - _listeners: [], - componentWillUnmount() { - _.each(this._listeners, (listener, index) => { - listener && this.stopListening(index) - }) - return options.componentWillUnmount - ? options.componentWillUnmount() - : true - }, - listenTo(store, event, callback) { - this._listeners.push({ - callback, - event, - store, - }) - store.on(event, callback) - return this._listeners.length - }, - - req(val) { - return val ? 'validate valid' : 'validate invalid' - }, - - setPathState(path, e) { - return _.partial(() => { - const newState = {} - newState[path] = Utils.safeParseEventValue(e) - this.setState(newState) - }) - }, - - setTheme(theme) { - window.theme = theme - - this.forceUpdate() - }, - - stopListening(index) { - const listener = this._listeners[index] - listener.store.off(listener.event, listener.callback) - }, - - toggleState(path) { - return _.partial(() => { - const newState = {} - newState[path] = !this.state[path] - this.setState(newState) - }) - }, - }), - ) -} diff --git a/frontend/common/providers/ConfigProvider.js b/frontend/common/providers/ConfigProvider.js index c6293a9da735..f9445d3201e6 100644 --- a/frontend/common/providers/ConfigProvider.js +++ b/frontend/common/providers/ConfigProvider.js @@ -28,7 +28,6 @@ export default (WrappedComponent) => { return ( { render() { return ( =6.9.0" } }, - "node_modules/@babel/helper-builder-react-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.27.1.tgz", - "integrity": "sha512-l/OHIt7g/cpCcj+ngMbyZ8PTsCiZhaa4/sG5Qy33VhrdIaWD3lyRH4V8v0CsL67CSQDPynYT83x5SL9weRQ8uw==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-compilation-targets": { "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", @@ -1984,22 +1964,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-inline-elements": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-inline-elements/-/plugin-transform-react-inline-elements-7.27.1.tgz", - "integrity": "sha512-zlcXrd4ZO09aY3aMa/jFwDUm7FdyFv/fNA7IXauajDUbiP9duHHDcGWPxO/RBmfgsKJpMuQpON70oVmoQ852jg==", - "license": "MIT", - "dependencies": { - "@babel/helper-builder-react-jsx": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-react-jsx": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", @@ -2626,7 +2590,6 @@ "resolved": "https://registry.npmjs.org/@datadog/ui-extensions-sdk/-/ui-extensions-sdk-0.32.0.tgz", "integrity": "sha512-3eJGis/WU48d0GVB5+3zEuJVyTARCltx7T6ANwtPZPXoc2XqHlkXrT1HUWT415EeOCNJuCFtjt5Gh7Tyle4moA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@datadog/framepost": "^0.3.0" } @@ -2717,6 +2680,59 @@ "node": ">=10.0.0" } }, + "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/core": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz", + "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", + "license": "MIT", + "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/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/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/@dword-design/endent": { "version": "1.4.7", "resolved": "https://registry.npmjs.org/@dword-design/endent/-/endent-1.4.7.tgz", @@ -2882,56 +2898,6 @@ "node": ">=0.10.0" } }, - "node_modules/@emotion/babel-utils": { - "version": "0.6.10", - "resolved": "https://registry.npmjs.org/@emotion/babel-utils/-/babel-utils-0.6.10.tgz", - "integrity": "sha512-/fnkM/LTEp3jKe++T0KyTszVGWNKPNOUJfjNKLO17BzQ6QPxgbg3whayom1Qr2oLFH3V92tDymU+dT5q676uow==", - "license": "MIT", - "dependencies": { - "@emotion/hash": "^0.6.6", - "@emotion/memoize": "^0.6.6", - "@emotion/serialize": "^0.9.1", - "convert-source-map": "^1.5.1", - "find-root": "^1.1.0", - "source-map": "^0.7.2" - } - }, - "node_modules/@emotion/babel-utils/node_modules/@emotion/hash": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.6.6.tgz", - "integrity": "sha512-ojhgxzUHZ7am3D2jHkMzPpsBAiB005GF5YU4ea+8DNPybMk01JJUM9V9YRlF/GE95tcOm8DxQvWA2jq19bGalQ==", - "license": "MIT" - }, - "node_modules/@emotion/babel-utils/node_modules/@emotion/memoize": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.6.6.tgz", - "integrity": "sha512-h4t4jFjtm1YV7UirAFuSuFGyLa+NNxjdkq6DpFLANNQY5rHueFZHVY+8Cu1HYVP6DrheB0kv4m5xPjo7eKT7yQ==", - "license": "MIT" - }, - "node_modules/@emotion/babel-utils/node_modules/@emotion/serialize": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.9.1.tgz", - "integrity": "sha512-zTuAFtyPvCctHBEL8KZ5lJuwBanGSutFEncqLn/m9T1a6a93smBStK+bZzcNPgj4QS8Rkw9VTwJGhRIUVO8zsQ==", - "license": "MIT", - "dependencies": { - "@emotion/hash": "^0.6.6", - "@emotion/memoize": "^0.6.6", - "@emotion/unitless": "^0.6.7", - "@emotion/utils": "^0.8.2" - } - }, - "node_modules/@emotion/babel-utils/node_modules/@emotion/unitless": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.6.7.tgz", - "integrity": "sha512-Arj1hncvEVqQ2p7Ega08uHLr1JuRYBuO5cIvcA+WWEQ5+VmkOE3ZXzl04NbQxeQpWX78G7u6MqxKuNX3wvYZxg==", - "license": "MIT" - }, - "node_modules/@emotion/babel-utils/node_modules/@emotion/utils": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.8.2.tgz", - "integrity": "sha512-rLu3wcBWH4P5q1CGoSSH/i9hrXs7SlbRLkoq9IGuoPYNGQvDJ3pt/wmOM+XgYjIDRMVIdkUWt0RsfzF50JfnCw==", - "license": "MIT" - }, "node_modules/@emotion/cache": { "version": "11.14.0", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", @@ -2958,18 +2924,36 @@ "@emotion/utils": "^1.4.2" } }, - "node_modules/@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", - "license": "MIT" - }, "node_modules/@emotion/memoize": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", "license": "MIT" }, + "node_modules/@emotion/react": { + "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.14.0", + "@emotion/serialize": "^1.3.3", + "@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" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@emotion/serialize": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", @@ -3001,18 +2985,21 @@ "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", "license": "MIT" }, - "node_modules/@emotion/stylis": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.7.1.tgz", - "integrity": "sha512-/SLmSIkN13M//53TtNxgxo57mcJk/UJIDFRKwOiLIBEyBHEcipgR6hNMQ/59Sl4VjCJ0Z/3zeAZyvnSLPG/1HQ==", - "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==", "license": "MIT" }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "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" + } + }, "node_modules/@emotion/utils": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", @@ -4104,215 +4091,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@material-ui/core": { - "version": "4.12.4", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", - "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", - "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.11.5", - "@material-ui/system": "^4.12.2", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "@types/react-transition-group": "^4.2.0", - "clsx": "^1.0.4", - "hoist-non-react-statics": "^3.3.2", - "popper.js": "1.16.1-lts", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0", - "react-transition-group": "^4.4.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@material-ui/core/node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/@material-ui/core/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/@material-ui/styles": { - "version": "4.11.5", - "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", - "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", - "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@emotion/hash": "^0.8.0", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "clsx": "^1.0.4", - "csstype": "^2.5.2", - "hoist-non-react-statics": "^3.3.2", - "jss": "^10.5.1", - "jss-plugin-camel-case": "^10.5.1", - "jss-plugin-default-unit": "^10.5.1", - "jss-plugin-global": "^10.5.1", - "jss-plugin-nested": "^10.5.1", - "jss-plugin-props-sort": "^10.5.1", - "jss-plugin-rule-value-function": "^10.5.1", - "jss-plugin-vendor-prefixer": "^10.5.1", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@material-ui/styles/node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/@material-ui/styles/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/@material-ui/system": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", - "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.11.3", - "csstype": "^2.5.2", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@material-ui/system/node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/@material-ui/system/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/@material-ui/types": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", - "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@material-ui/utils": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", - "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.4.4", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - } - }, - "node_modules/@material-ui/utils/node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/@material-ui/utils/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, "node_modules/@napi-rs/wasm-runtime": { "version": "0.2.12", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", @@ -5030,7 +4808,6 @@ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "license": "MIT", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -6049,7 +5826,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.2.0.tgz", "integrity": "sha512-3xyG3pMCq3oYCNg7/ZP+E1ooTaGB4cG8JWRsqqOYQdbWNY4zbaV0Ennrd7stjiJEFZCaybcIgpTjJWHRfBSIDw==", "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.10.0" } @@ -6083,15 +5859,22 @@ } }, "node_modules/@types/react": { - "version": "17.0.87", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.87.tgz", - "integrity": "sha512-wpg9AbtJ6agjA+BKYmhG6dRWEU/2DHYwMzCaBzsz137ft6IyuqZ5fI4ic1DWL4DrI03Zy78IyVE6ucrXl0mu4g==", + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", "license": "MIT", - "peer": true, "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "^0.16", - "csstype": "^3.0.2" + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "devOptional": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" } }, "node_modules/@types/react-router": { @@ -6117,46 +5900,6 @@ "@types/react-router": "*" } }, - "node_modules/@types/react-select": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/@types/react-select/-/react-select-2.0.19.tgz", - "integrity": "sha512-5GGBO3npQ0G/poQmEn+kI3Vn3DoJ9WjRXCeGcpwLxd5rYmjYPH235lbYPX5aclXE2RqEXyFxd96oh0wYwPXYpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "@types/react-transition-group": "*" - } - }, - "node_modules/@types/react-select/node_modules/@types/react": { - "version": "19.1.9", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.9.tgz", - "integrity": "sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-select/node_modules/@types/react-dom": { - "version": "19.1.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.7.tgz", - "integrity": "sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.0.0" - } - }, - "node_modules/@types/react-select/node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/react-transition-group": { "version": "4.4.12", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", @@ -6177,31 +5920,10 @@ "@types/react": "*" } }, - "node_modules/@types/react-window": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.8.tgz", - "integrity": "sha512-8Ls660bHR1AUA2kuRvVG9D/4XpRC6wjAaPT9dil7Ckc76eP9TKWZwwmgfq8Q1LANX3QNDnoU4Zp48A3w+zK69Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-window-infinite-loader": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/react-window-infinite-loader/-/react-window-infinite-loader-1.0.9.tgz", - "integrity": "sha512-gEInTjQwURCnDOFyIEK2+fWB5gTjqwx30O62QfxA9stE5aiB6EWkGj4UMhc0axq7/FV++Gs/TGW8FtgEx0S6Tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/react": "*", - "@types/react-window": "*" - } - }, "node_modules/@types/react/node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, "node_modules/@types/retry": { @@ -6210,12 +5932,6 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "license": "MIT" }, - "node_modules/@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", - "license": "MIT" - }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -6265,7 +5981,6 @@ "integrity": "sha512-9/yPSBlwzsetCsGEn9j24D8vGQgJkOTr4oMLas/w886ZtzKIs1iyoqFrwsX2fqYEeUwsdBpC21gcjRGo57u0eg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/experimental-utils": "5.4.0", "@typescript-eslint/scope-manager": "5.4.0", @@ -6324,7 +6039,6 @@ "integrity": "sha512-JoB41EmxiYpaEsRwpZEYAJ9XQURPFer8hpkIW9GiaspVLX8oqbqNM8P4EP8HOZg96yaALiLEVWllA2E8vwsIKw==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "5.4.0", "@typescript-eslint/types": "5.4.0", @@ -6901,12 +6615,6 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "license": "Apache-2.0" }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "license": "ISC" - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -6925,7 +6633,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -7021,7 +6728,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -7632,128 +7338,36 @@ "node_modules/babel-loader/node_modules/schema-utils": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/babel-loader/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-add-module-exports": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.4.tgz", - "integrity": "sha512-g+8yxHUZ60RcyaUpfNzy56OtWW+x9cyEe9j+CranqLiqbju2yf/Cy6ZtYK40EZxtrdHllzlVZgLmcOUCTlJ7Jg==", - "license": "MIT" - }, - "node_modules/babel-plugin-emotion": { - "version": "9.2.11", - "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-9.2.11.tgz", - "integrity": "sha512-dgCImifnOPPSeXod2znAmgc64NhaaOjGEHROR/M+lmStb3841yK1sgaDYAYMnlvWNz8GnpwIPN0VmNpbWYZ+VQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@emotion/babel-utils": "^0.6.4", - "@emotion/hash": "^0.6.2", - "@emotion/memoize": "^0.6.1", - "@emotion/stylis": "^0.7.0", - "babel-plugin-macros": "^2.0.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "convert-source-map": "^1.5.0", - "find-root": "^1.1.0", - "mkdirp": "^0.5.1", - "source-map": "^0.5.7", - "touch": "^2.0.1" - } - }, - "node_modules/babel-plugin-emotion/node_modules/@emotion/hash": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.6.6.tgz", - "integrity": "sha512-ojhgxzUHZ7am3D2jHkMzPpsBAiB005GF5YU4ea+8DNPybMk01JJUM9V9YRlF/GE95tcOm8DxQvWA2jq19bGalQ==", - "license": "MIT" - }, - "node_modules/babel-plugin-emotion/node_modules/@emotion/memoize": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.6.6.tgz", - "integrity": "sha512-h4t4jFjtm1YV7UirAFuSuFGyLa+NNxjdkq6DpFLANNQY5rHueFZHVY+8Cu1HYVP6DrheB0kv4m5xPjo7eKT7yQ==", - "license": "MIT" - }, - "node_modules/babel-plugin-emotion/node_modules/babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - } - }, - "node_modules/babel-plugin-emotion/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-emotion/node_modules/source-map": { - "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" - } - }, - "node_modules/babel-plugin-emotion/node_modules/touch": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/touch/-/touch-2.0.2.tgz", - "integrity": "sha512-qjNtvsFXTRq7IuMLweVgFxmEuQ6gLbRs2jQxL80TtZ31dEKWYIxRXquij6w6VimyDek5hD3PytljHmEtAs2u0A==", - "license": "ISC", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "license": "MIT", "dependencies": { - "nopt": "~1.0.10" - }, - "bin": { - "nodetouch": "bin/nodetouch.js" + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">=0.6" + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/babel-plugin-emotion/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "node_modules/babel-loader/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", - "engines": { - "node": ">= 6" + "bin": { + "semver": "bin/semver.js" } }, + "node_modules/babel-plugin-add-module-exports": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.4.tgz", + "integrity": "sha512-g+8yxHUZ60RcyaUpfNzy56OtWW+x9cyEe9j+CranqLiqbju2yf/Cy6ZtYK40EZxtrdHllzlVZgLmcOUCTlJ7Jg==", + "license": "MIT" + }, "node_modules/babel-plugin-istanbul": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", @@ -7887,12 +7501,6 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==", - "license": "MIT" - }, "node_modules/babel-plugin-syntax-object-rest-spread": { "version": "7.0.0-beta.3", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-7.0.0-beta.3.tgz", @@ -8196,7 +7804,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -9063,55 +8670,6 @@ "node": ">= 6" } }, - "node_modules/create-emotion": { - "version": "9.2.12", - "resolved": "https://registry.npmjs.org/create-emotion/-/create-emotion-9.2.12.tgz", - "integrity": "sha512-P57uOF9NL2y98Xrbl2OuiDQUZ30GVmASsv5fbsjF4Hlraip2kyAvMm+2PoYUvFFw03Fhgtxk3RqZSm2/qHL9hA==", - "license": "MIT", - "dependencies": { - "@emotion/hash": "^0.6.2", - "@emotion/memoize": "^0.6.1", - "@emotion/stylis": "^0.7.0", - "@emotion/unitless": "^0.6.2", - "csstype": "^2.5.2", - "stylis": "^3.5.0", - "stylis-rule-sheet": "^0.0.10" - } - }, - "node_modules/create-emotion/node_modules/@emotion/hash": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.6.6.tgz", - "integrity": "sha512-ojhgxzUHZ7am3D2jHkMzPpsBAiB005GF5YU4ea+8DNPybMk01JJUM9V9YRlF/GE95tcOm8DxQvWA2jq19bGalQ==", - "license": "MIT" - }, - "node_modules/create-emotion/node_modules/@emotion/memoize": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.6.6.tgz", - "integrity": "sha512-h4t4jFjtm1YV7UirAFuSuFGyLa+NNxjdkq6DpFLANNQY5rHueFZHVY+8Cu1HYVP6DrheB0kv4m5xPjo7eKT7yQ==", - "license": "MIT" - }, - "node_modules/create-emotion/node_modules/@emotion/unitless": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.6.7.tgz", - "integrity": "sha512-Arj1hncvEVqQ2p7Ega08uHLr1JuRYBuO5cIvcA+WWEQ5+VmkOE3ZXzl04NbQxeQpWX78G7u6MqxKuNX3wvYZxg==", - "license": "MIT" - }, - "node_modules/create-emotion/node_modules/stylis": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", - "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==", - "license": "MIT", - "peer": true - }, - "node_modules/create-emotion/node_modules/stylis-rule-sheet": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz", - "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==", - "license": "MIT", - "peerDependencies": { - "stylis": "^3.5.0" - } - }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -9246,16 +8804,6 @@ "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/css-vendor": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", - "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.3", - "is-in-browser": "^1.0.2" - } - }, "node_modules/css-what": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", @@ -9280,12 +8828,6 @@ "node": ">=4" } }, - "node_modules/csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", - "license": "MIT" - }, "node_modules/d3-array": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", @@ -10114,16 +9656,6 @@ "node": ">= 4" } }, - "node_modules/emotion": { - "version": "9.2.12", - "resolved": "https://registry.npmjs.org/emotion/-/emotion-9.2.12.tgz", - "integrity": "sha512-hcx7jppaI8VoXxIWEhxpDW7I+B4kq9RNzQLmsrF6LY8BGKqe2N+gFAQr0EfuFucFlPs2A9HM4+xNj4NeqEWIOQ==", - "license": "MIT", - "dependencies": { - "babel-plugin-emotion": "^9.2.11", - "create-emotion": "^9.2.12" - } - }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -10385,7 +9917,6 @@ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -12930,12 +12461,6 @@ "node": ">=4" } }, - "node_modules/hyphenate-style-name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", - "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==", - "license": "BSD-3-Clause" - }, "node_modules/iconv-lite": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", @@ -13328,15 +12853,6 @@ "node": ">= 0.10" } }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, "node_modules/ionicons": { "version": "7.4.0", "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-7.4.0.tgz", @@ -13704,12 +13220,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-in-browser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", - "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==", - "license": "MIT" - }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -14252,7 +13762,6 @@ "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/core": "30.2.0", "@jest/types": "30.2.0", @@ -15318,102 +14827,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jss": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz", - "integrity": "sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "csstype": "^3.0.2", - "is-in-browser": "^1.1.3", - "tiny-warning": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/jss" - } - }, - "node_modules/jss-plugin-camel-case": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz", - "integrity": "sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "hyphenate-style-name": "^1.0.3", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-default-unit": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz", - "integrity": "sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-global": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz", - "integrity": "sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-nested": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz", - "integrity": "sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0", - "tiny-warning": "^1.0.2" - } - }, - "node_modules/jss-plugin-props-sort": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz", - "integrity": "sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-rule-value-function": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz", - "integrity": "sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0", - "tiny-warning": "^1.0.2" - } - }, - "node_modules/jss-plugin-vendor-prefixer": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz", - "integrity": "sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.3.1", - "css-vendor": "^2.0.8", - "jss": "10.10.0" - } - }, - "node_modules/jss/node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" - }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -16041,21 +15454,6 @@ "node": ">=0.8.0" } }, - "node_modules/material-ui-chip-input": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/material-ui-chip-input/-/material-ui-chip-input-1.1.0.tgz", - "integrity": "sha512-95JsxYtzBFUyvzLC0Ae8qo1h8heu9wcSgnGjF/Sy9QQ9pL/ufLVUyjS8uFULW4kEyeNZbZurux3KZKC3FLnoqg==", - "license": "MIT", - "dependencies": { - "classnames": "^2.2.5", - "prop-types": "^15.6.1" - }, - "peerDependencies": { - "@material-ui/core": "^1.0.0 || ^3.1.0", - "react": "^16.3.0", - "react-dom": "^16.3.0" - } - }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -17053,21 +16451,6 @@ "node": ">=4" } }, - "node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "license": "MIT", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "*" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -17659,12 +17042,6 @@ "node": "*" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "license": "MIT" - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -17891,12 +17268,6 @@ "deep-assign": "^2.0.0" } }, - "node_modules/popper.js": { - "version": "1.16.1-lts", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", - "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==", - "license": "MIT" - }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -17926,7 +17297,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -18072,7 +17442,6 @@ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin-prettier.js" }, @@ -18209,7 +17578,6 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.3.1", "object-assign": "^4.1.1" @@ -18368,15 +17736,6 @@ ], "license": "MIT" }, - "node_modules/raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "license": "MIT", - "dependencies": { - "performance-now": "^2.1.0" - } - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -18562,11 +17921,10 @@ } }, "node_modules/react": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", - "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -18589,21 +17947,6 @@ "react": ">=16.4.1" } }, - "node_modules/react-click-outside": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/react-click-outside/-/react-click-outside-3.0.1.tgz", - "integrity": "sha512-d0KWFvBt+esoZUF15rL2UBB7jkeAqLU8L/Ny35oLK6fW6mIbOv/ChD+ExF4sR9PD26kVx+9hNfD0FTIqRZEyRQ==", - "license": "MIT", - "dependencies": { - "hoist-non-react-statics": "^2.1.1" - } - }, - "node_modules/react-click-outside/node_modules/hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==", - "license": "BSD-3-Clause" - }, "node_modules/react-datepicker": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-8.4.0.tgz", @@ -18726,19 +18069,15 @@ "license": "MIT" }, "node_modules/react-dom": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", - "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", "license": "MIT", - "peer": true, "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" + "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^16.14.0" + "react": "^19.2.4" } }, "node_modules/react-dropzone": { @@ -18781,18 +18120,6 @@ "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", "license": "MIT" }, - "node_modules/react-input-autosize": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-2.2.2.tgz", - "integrity": "sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw==", - "license": "MIT", - "dependencies": { - "prop-types": "^15.5.8" - }, - "peerDependencies": { - "react": "^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0" - } - }, "node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", @@ -18869,7 +18196,6 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.0.2.tgz", "integrity": "sha512-nBwiscMw3NoP59NFCXFf02f8xdo+vSHT/uZ1ldDwF7XaTpzm+Phk97VT4urYBl5TYAPNVaFm12UHAEyzkpNzRA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.12.1", "@types/hoist-non-react-statics": "^3.3.1", @@ -18910,7 +18236,6 @@ "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -18976,53 +18301,24 @@ "license": "MIT" }, "node_modules/react-select": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-2.4.3.tgz", - "integrity": "sha512-cmxNaiHpviRYkojeW9rGEUJ4jpX7QTmPe2wcscwA4d1lStzw/cJtr4ft5H2O/YhfpkrcwaLghu3XmEYdXhBo8Q==", + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.10.2.tgz", + "integrity": "sha512-Z33nHdEFWq9tfnfVXaiM12rbJmk+QjFEztWLtmXqQhz6Al4UZZ9xc0wiatmGtUOCCnHN0WizL3tCMYRENX4rVQ==", "license": "MIT", "dependencies": { - "classnames": "^2.2.5", - "emotion": "^9.1.2", - "memoize-one": "^5.0.0", + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", "prop-types": "^15.6.0", - "raf": "^3.4.0", - "react-input-autosize": "^2.2.1", - "react-transition-group": "^2.2.1" - }, - "peerDependencies": { - "react": "^15.3.0 || ^16.0.0", - "react-dom": "^15.3.0 || ^16.0.0" - } - }, - "node_modules/react-select/node_modules/dom-helpers": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", - "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.1.2" - } - }, - "node_modules/react-select/node_modules/memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "license": "MIT" - }, - "node_modules/react-select/node_modules/react-transition-group": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", - "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", - "license": "BSD-3-Clause", - "dependencies": { - "dom-helpers": "^3.4.0", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2", - "react-lifecycles-compat": "^3.0.4" + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.2.0" }, "peerDependencies": { - "react": ">=15.0.0", - "react-dom": ">=15.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/react-smooth": { @@ -19057,63 +18353,18 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, - "node_modules/react-sortable-hoc": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/react-sortable-hoc/-/react-sortable-hoc-1.9.1.tgz", - "integrity": "sha512-2VeofjRav8+eZeE5Nm/+b8mrA94rQ+gBsqhXi8pRBSjOWNqslU3ZEm+0XhSlfoXJY2lkgHipfYAUuJbDtCixRg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.2.0", - "invariant": "^2.2.4", - "prop-types": "^15.5.7" - }, - "peerDependencies": { - "prop-types": "^15.5.7", - "react": "^0.14.0 || ^15.0.0 || ^16.0.0", - "react-dom": "^0.14.0 || ^15.0.0 || ^16.0.0" - } - }, "node_modules/react-tooltip": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-4.5.1.tgz", - "integrity": "sha512-Zo+CSFUGXar1uV+bgXFFDe7VeS2iByeIp5rTgTcc2HqtuOS5D76QapejNNfx320MCY91TlhTQat36KGFTqgcvw==", + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.30.0.tgz", + "integrity": "sha512-Yn8PfbgQ/wmqnL7oBpz1QiDaLKrzZMdSUUdk7nVeGTwzbxCAJiJzR4VSYW+eIO42F1INt57sPUmpgKv0KwJKtg==", "license": "MIT", "dependencies": { - "prop-types": "^15.8.1", - "uuid": "^7.0.3" - }, - "engines": { - "npm": ">=6.13" + "@floating-ui/dom": "^1.6.1", + "classnames": "^2.3.0" }, "peerDependencies": { - "react": ">=16.0.0", - "react-dom": ">=16.0.0" - } - }, - "node_modules/react-tooltip/node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/react-tooltip/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/react-tooltip/node_modules/uuid": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", - "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "react": ">=16.14.0", + "react-dom": ">=16.14.0" } }, "node_modules/react-transition-group": { @@ -19150,19 +18401,6 @@ "react-dom": "^16.3.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/react-virtualized-auto-sizer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.2.tgz", - "integrity": "sha512-MYXhTY1BZpdJFjUovvYHVBmkq79szK/k7V3MO+36gJkWGkrXKtyr4vCPtpphaTLRAdDNoYEYFZWE8LjN+PIHNg==", - "license": "MIT", - "engines": { - "node": ">8.0.0" - }, - "peerDependencies": { - "react": "^15.3.0 || ^16.0.0-alpha", - "react-dom": "^15.3.0 || ^16.0.0-alpha" - } - }, "node_modules/react-virtualized/node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -19180,46 +18418,10 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, - "node_modules/react-window": { - "version": "1.8.11", - "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.11.tgz", - "integrity": "sha512-+SRbUVT2scadgFSWx+R1P754xHPEqvcfSfVX10QYg6POOz+WNgkN48pS+BtZNIMGiL1HYrSEiCkwsMS15QogEQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.0.0", - "memoize-one": ">=3.1.1 <6" - }, - "engines": { - "node": ">8.0.0" - }, - "peerDependencies": { - "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-window-infinite-loader": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/react-window-infinite-loader/-/react-window-infinite-loader-1.0.10.tgz", - "integrity": "sha512-NO/csdHlxjWqA2RJZfzQgagAjGHspbO2ik9GtWZb0BY1Nnapq0auG8ErI+OhGCzpjYJsCYerqUlK6hkq9dfAAA==", - "license": "MIT", - "engines": { - "node": ">8.0.0" - }, - "peerDependencies": { - "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-window/node_modules/memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "license": "MIT" - }, "node_modules/reactstrap": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/reactstrap/-/reactstrap-9.0.1.tgz", - "integrity": "sha512-89VOv7SRlAlpS7RwXhzOQkSWkuhBR8LBsPGfNHifNL3WhtNP9y1sBdTcTYyH1ee2QtI8zRdwD0T5I/blHiwemg==", + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/reactstrap/-/reactstrap-9.2.3.tgz", + "integrity": "sha512-1nXy7FIBIoOgXr3AIHOpgzcZXdj6rZE5YvNSPd1hYgwv8X64m6TAJsU0ExlieJdlRXhaRfTYRSZoTWa127b0gw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", @@ -19356,7 +18558,6 @@ "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.9.2" } @@ -19957,7 +19158,6 @@ "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.8.tgz", "integrity": "sha512-ib4JhLRRgbg6QVy6bsv5uJxnJMTS2soVcCp9Y88Extyy13A8vV0G1fAwujOzmNkFQbR3LvedudAMbtuNRPbQww==", "license": "MIT", - "peer": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -20011,14 +19211,10 @@ } }, "node_modules/scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } + "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/schema-utils": { "version": "4.3.3", @@ -20044,7 +19240,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -20478,6 +19673,7 @@ "version": "0.7.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">= 12" @@ -21130,7 +20326,6 @@ "resolved": "https://registry.npmjs.org/testcafe/-/testcafe-3.7.3.tgz", "integrity": "sha512-PZfNGVXYX+KjKgHepsnPv4xgeA+PK9GiQF+OUl4R2tG8KBjqFgGP1sl5UOnFIIaL6ncbf5Erhpubt0VvsJlJ/w==", "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.23.2", "@babel/plugin-proposal-decorators": "^7.23.2", @@ -22526,7 +21721,6 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "license": "(MIT OR CC0-1.0)", - "peer": true, "engines": { "node": ">=10" }, @@ -22630,7 +21824,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.4.tgz", "integrity": "sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==", "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -22994,6 +22187,20 @@ "node": ">=8" } }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz", + "integrity": "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/use-sync-external-store": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", @@ -23233,7 +22440,6 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz", "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -23317,7 +22523,6 @@ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", "license": "MIT", - "peer": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^1.2.0", @@ -23397,7 +22602,6 @@ "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.26.1.tgz", "integrity": "sha512-khZGfAeJx6I8K9zKohEWWYN6KDlVw2DHownoe+6Vtwj1LP9WFgegXnVMSkZ/dBEBtXFwrkkydsaPFlB7f8wU2A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-html-community": "0.0.8", "html-entities": "^2.1.0", diff --git a/frontend/package.json b/frontend/package.json index 2e9c627337f8..220b43430aeb 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -33,8 +33,10 @@ "npm": "10.x" }, "overrides": { - "react": "16.14.0", - "@material-ui/core": "4.12.4" + "react": "$react", + "react-dom": "$react-dom", + "@types/react": "$@types/react", + "@types/react-dom": "$@types/react-dom" }, "dependencies": { "@amplitude/analytics-browser": "^2.11.3", @@ -44,15 +46,16 @@ "@babel/plugin-proposal-class-properties": "^7.12.1", "@babel/plugin-transform-modules-commonjs": "^7.12.1", "@babel/plugin-transform-react-constant-elements": "^7.12.1", - "@babel/plugin-transform-react-inline-elements": "^7.12.1", "@babel/preset-env": "^7.12.1", "@babel/preset-react": "^7.12.1", "@babel/preset-typescript": "^7.18.6", "@babel/register": "^7.12.1", "@datadog/ui-extensions-react": "0.32.0", "@datadog/ui-extensions-sdk": "0.32.0", + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/sortable": "^10.0.0", + "@dnd-kit/utilities": "^3.2.2", "@ionic/react": "^7.5.3", - "@material-ui/core": "4.12.4", "@react-oauth/google": "^0.2.8", "@reduxjs/toolkit": "1.9.1", "@sentry/browser": "^7.119.1", @@ -96,7 +99,6 @@ "js-cookie": "2.2.1", "json-loader": "0.5.4", "lodash": "4.17.23", - "material-ui-chip-input": "^1.1.0", "mini-css-extract-plugin": "^2.6.0", "moment": "2.29.4", "node-fetch": "2.6.7", @@ -108,27 +110,22 @@ "qrcode.react": "1.0.0", "rc-slider": "^9.7.2", "rc-switch": "1.9.0", - "react": "16.14.0", + "react": "^19.0.0", "react-async-script": "1.2.0", - "react-click-outside": "3.0.1", "react-datepicker": "^8.1.0", "react-device-detect": "1.9.9", "react-diff-viewer-continued": "^3.3.1", - "react-dom": "16.14.0", + "react-dom": "^19.0.0", "react-dropzone": "^14.2.3", "react-markdown": "^8.0.5", "react-maskedinput": "4.0.1", "react-redux": "8.0.2", "react-router": "5.3.3", "react-router-dom": "5.3.3", - "react-select": "2.4.3", - "react-sortable-hoc": "1.9.1", - "react-tooltip": "4.5.1", + "react-select": "^5.9.0", + "react-tooltip": "^5.30.0", "react-virtualized": "^9.22.5", - "react-virtualized-auto-sizer": "1.0.2", - "react-window": "^1.8.10", - "react-window-infinite-loader": "^1.0.9", - "reactstrap": "9.0.1", + "reactstrap": "^9.2.3", "recharts": "^2.1.14", "redux-persist": "^6.0.0", "refractor": "^4.8.1", @@ -160,11 +157,11 @@ "@types/dompurify": "^3.0.2", "@types/jest": "^30.0.0", "@types/rc-switch": "^1.9.5", + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", "@types/react-router": "^5.1.20", "@types/react-router-dom": "^5.3.3", - "@types/react-select": "^2.0.3", "@types/react-virtualized": "^9.22.0", - "@types/react-window-infinite-loader": "^1.0.9", "@typescript-eslint/eslint-plugin": "5.4.0", "@typescript-eslint/parser": "5.4.0", "eslint": "^8.0.1", diff --git a/frontend/tsconfig.jest.json b/frontend/tsconfig.jest.json index ec83611f0c55..4fd5045d7dcc 100644 --- a/frontend/tsconfig.jest.json +++ b/frontend/tsconfig.jest.json @@ -1,6 +1,6 @@ { "extends": "./tsconfig.json", "compilerOptions": { - "jsx": "react" + "jsx": "react-jsx" } } diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index c645de8d36f2..6967c4cc770d 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -13,7 +13,7 @@ "lib": [ "dom" ], - "jsx": "preserve", + "jsx": "react-jsx", "incremental": true, "skipLibCheck": true, "paths": { diff --git a/frontend/web/components/ChipInput.tsx b/frontend/web/components/ChipInput.tsx index a85160ab79bc..cbc20fc57ed5 100644 --- a/frontend/web/components/ChipInput.tsx +++ b/frontend/web/components/ChipInput.tsx @@ -1,8 +1,11 @@ -import React, { FC, FormEventHandler, useState } from 'react' -import TheInput from 'material-ui-chip-input' +import React, { + FC, + FormEventHandler, + KeyboardEventHandler, + useState, +} from 'react' import Utils from 'common/utils/utils' import { filter } from 'lodash' -import Chip from '@material-ui/core/Chip' import { close } from 'ionicons/icons' import { IonIcon } from '@ionic/react' @@ -14,65 +17,77 @@ type ChipInputType = { const ChipInput: FC = ({ onChange, placeholder, value }) => { const [inputValue, setInputValue] = useState('') + + const addChips = (chips: string[]) => { + const currentValue = value || [] + const filtered = filter( + chips, + (v) => v !== ' ' && v !== ',' && v !== ';' && v !== '', + ) + if (filtered.length) { + onChange(currentValue.concat(filtered)) + } + setInputValue('') + } + const onChangeText: FormEventHandler = (e) => { const v = Utils.safeParseEventValue(e) - const currentValue = value || [] if (v.search(/[ ,]/) !== -1) { - //delimit when detecting one of the following characters - const split = filter( - v.split(/[ ,;]/), - (v) => v !== ' ' && v !== ',' && v !== ';' && v !== '', - ) - setInputValue('') - onChange(currentValue.concat(split)) + addChips(v.split(/[ ,;]/)) } else { setInputValue(v) } } - const onDelete = (_: any, index: number) => { - const v = value || [] - onChange(Utils.removeElementFromArray(v, index)) + const onKeyDown: KeyboardEventHandler = (e) => { + if (e.key === 'Enter') { + e.preventDefault() + if (inputValue.trim()) { + addChips([inputValue.trim()]) + } + } } - const onSubmit = (chip: string) => { - if (chip) { - onChange((value || []).concat([chip])) + const onBlur = () => { + if (inputValue.trim()) { + addChips([inputValue.trim()]) } - setInputValue('') - return true + } + + const onDelete = (index: number) => { + const v = value || [] + onChange(Utils.removeElementFromArray(v, index)) } return ( - ( - +
+
+ {value?.map((chip, index) => ( + + {chip} + onDelete(index)} + role='button' + tabIndex={0} + onKeyDown={(e) => { + if (e.key === 'Enter' || e.key === ' ') onDelete(index) + }} + > - } + + ))} + - )} - /> +
+
) } diff --git a/frontend/web/components/SegmentOverrides.js b/frontend/web/components/SegmentOverrides.js index d681d59e13a3..e1c84703e453 100644 --- a/frontend/web/components/SegmentOverrides.js +++ b/frontend/web/components/SegmentOverrides.js @@ -1,6 +1,21 @@ // import propTypes from 'prop-types'; import React, { Component, Fragment } from 'react' -import { SortableContainer, SortableElement } from 'react-sortable-hoc' +import { + DndContext, + closestCenter, + KeyboardSensor, + PointerSensor, + useSensor, + useSensors, +} from '@dnd-kit/core' +import { + SortableContext, + sortableKeyboardCoordinates, + useSortable, + verticalListSortingStrategy, + arrayMove, +} from '@dnd-kit/sortable' +import { CSS } from '@dnd-kit/utilities' import ProjectStore from 'common/stores/project-store' import ValueEditor from './ValueEditor' import { VariationOptions } from './mv/VariationOptions' @@ -22,15 +37,6 @@ import SegmentsIcon from './svg/SegmentsIcon' import SegmentOverrideActions from './SegmentOverrideActions' import Button from './base/forms/Button' -const arrayMoveMutate = (array, from, to) => { - array.splice(to < 0 ? array.length + to : to, 0, array.splice(from, 1)[0]) -} - -const arrayMove = (array, from, to) => { - array = array.slice() - arrayMoveMutate(array, from, to) - return array -} const SegmentOverrideInner = class Override extends React.Component { constructor(props) { super(props) @@ -345,7 +351,25 @@ const SegmentOverrideInner = class Override extends React.Component { ) } } -const SegmentOverride = ConfigProvider(SortableElement(SegmentOverrideInner)) + +const SortableSegmentOverrideInner = ConfigProvider(SegmentOverrideInner) + +const SortableSegmentOverride = (props) => { + const { attributes, listeners, setNodeRef, transform, transition } = + useSortable({ id: props.sortId }) + + const style = { + transform: CSS.Transform.toString(transform), + transition, + } + + return ( +
+ +
+ ) +} + const SegmentOverrideListInner = ({ confirmRemove, controlValue, @@ -368,58 +392,157 @@ const SegmentOverrideListInner = ({ showEditSegment, toggle, }) => { - const InnerComponent = id || disabled ? SegmentOverrideInner : SegmentOverride + const useSortable = !id && !disabled return (
- {items.map((value, index) => ( - - confirmRemove(index)} - controlValue={controlValue} - toggle={() => toggle(index)} - setValue={(value) => { - setValue(index, value) - }} - setVariations={(i, override, mvOptions) => { - const newValue = _.cloneDeep(mvOptions) - newValue[i] = { - ...newValue[i], - percentage_allocation: override.default_percentage_allocation, - } - setVariations(index, newValue) - }} - projectFlag={projectFlag} - /> -
- { + const sortId = `segment-${value.segment}-${index}` + if (useSortable) { + return ( + + confirmRemove(index)} + controlValue={controlValue} + toggle={() => toggle(index)} + setValue={(value) => { + setValue(index, value) + }} + setVariations={(i, override, mvOptions) => { + const newValue = _.cloneDeep(mvOptions) + newValue[i] = { + ...newValue[i], + percentage_allocation: + override.default_percentage_allocation, + } + setVariations(index, newValue) + }} + projectFlag={projectFlag} + /> +
+ +
+
+ ) + } + + return ( + + confirmRemove(index)} + controlValue={controlValue} + toggle={() => toggle(index)} + setValue={(value) => { + setValue(index, value) + }} + setVariations={(i, override, mvOptions) => { + const newValue = _.cloneDeep(mvOptions) + newValue[i] = { + ...newValue[i], + percentage_allocation: override.default_percentage_allocation, + } + setVariations(index, newValue) + }} + projectFlag={projectFlag} /> -
-
- ))} +
+ +
+ + ) + })}
) } -const SegmentOverrideList = SortableContainer(SegmentOverrideListInner) +const SortableSegmentOverrideList = ({ + items, + onSortEnd: handleSortEnd, + ...rest +}) => { + const sensors = useSensors( + useSensor(PointerSensor, { + activationConstraint: { + distance: 5, + }, + }), + useSensor(KeyboardSensor, { + coordinateGetter: sortableKeyboardCoordinates, + }), + ) + + const sortableIds = items.map( + (value, index) => `segment-${value.segment}-${index}`, + ) + + const handleDragEnd = (event) => { + const { active, over } = event + if (active.id !== over?.id) { + const oldIndex = sortableIds.indexOf(active.id) + const newIndex = sortableIds.indexOf(over.id) + handleSortEnd({ newIndex, oldIndex }) + } + } + + return ( + + + + + + ) +} class TheComponent extends Component { static displayName = 'TheComponent' @@ -593,7 +716,7 @@ class TheComponent extends Component { const InnerComponent = this.props.id || this.props.readOnly ? SegmentOverrideListInner - : SegmentOverrideList + : SortableSegmentOverrideList const visibleValues = value && value.filter((v) => !v.toRemove) @@ -723,29 +846,6 @@ class TheComponent extends Component { {value && ( <> { - const tagName = e.target.tagName.toLowerCase() - - // Check if the clicked element is a button, input, or textarea - if ( - tagName === 'input' || - tagName === 'textarea' || - tagName === 'button' - ) { - return true // Cancel sorting for inputs, buttons, etc. - } - - // Cancel if the clicked element has class 'feature-action__list' - if ( - e.target.closest('.feature-action__item') || // Checks for parent elements with the class - e.target.closest('.hljs') - ) { - return true // Cancel sorting if the target or parent has these classes - } - - // Otherwise, allow sorting - return false - }} // Here we pass the function to prevent sorting in certain cases disabled={this.props.readOnly} id={this.props.id} name={this.props.name} diff --git a/frontend/web/components/SegmentSelect.tsx b/frontend/web/components/SegmentSelect.tsx index 020e3cfea366..f8c2e9fbeae6 100644 --- a/frontend/web/components/SegmentSelect.tsx +++ b/frontend/web/components/SegmentSelect.tsx @@ -4,7 +4,6 @@ import { useGetSegmentsQuery } from 'common/services/useSegment' import useInfiniteScroll from 'common/useInfiniteScroll' import { Req } from 'common/types/requests' import { components } from 'react-select' -import { SelectProps } from '@material-ui/core/Select/Select' import Utils from 'common/utils/utils' import Button from './base/forms/Button' @@ -14,8 +13,8 @@ type SegmentSelectType = { 'data-test'?: string placeholder?: string className?: string - value: SelectProps['value'] - onChange: SelectProps['onChange'] + value: number | string | undefined + onChange: (value: any) => void filter?: (segments: Segment) => Segment[] } @@ -30,13 +29,19 @@ const SegmentSelect: FC = ({ Res['segments'] >(useGetSegmentsQuery, { page_size: 100, projectId }) - const options = ( - data - ? filter - ? (data.results.filter(filter) as Res['segments']['results']) - : data.results - : [] - ).map(({ feature, id: value, name: label }) => ({ feature, label, value })) + let filteredResults: Res['segments']['results'] = [] + if (data) { + filteredResults = filter + ? (data.results.filter(filter) as Res['segments']['results']) + : data.results + } + const options = filteredResults.map( + ({ feature, id: value, name: label }) => ({ + feature, + label, + value, + }), + ) return ( //@ts-ignore diff --git a/frontend/web/components/Tooltip.tsx b/frontend/web/components/Tooltip.tsx index 041241f07844..9d011bc0490c 100644 --- a/frontend/web/components/Tooltip.tsx +++ b/frontend/web/components/Tooltip.tsx @@ -1,31 +1,19 @@ -import React, { FC, ReactNode } from 'react' -import ReactTooltip, { TooltipProps as _TooltipProps } from 'react-tooltip' -import Utils from 'common/utils/utils' +import React, { FC, ReactNode, useId } from 'react' +import { Tooltip as ReactTooltip, PlacesType } from 'react-tooltip' +import 'react-tooltip/dist/react-tooltip.css' import classNames from 'classnames' import { sanitize } from 'dompurify' -import { createPortal } from 'react-dom' export type TooltipProps = { title: ReactNode | React.ReactNode children: string | undefined | null - place?: _TooltipProps['place'] + place?: PlacesType plainText?: boolean titleClassName?: string tooltipClassName?: string - effect?: _TooltipProps['effect'] - afterShow?: _TooltipProps['afterShow'] - renderInPortal?: boolean // Controls backwards compatibility for rendering in portal -} - -const TooltipPortal: FC<{ children: ReactNode; renderInPortal?: boolean }> = ({ - children, - renderInPortal = false, -}) => { - const domNode = document.createElement('div') - document.body.appendChild(domNode) - - if (!renderInPortal) return <>{children} - return domNode ? createPortal(children, domNode) : null + effect?: 'float' | 'solid' + afterShow?: () => void + renderInPortal?: boolean } const Tooltip: FC = ({ @@ -34,44 +22,39 @@ const Tooltip: FC = ({ effect, place, plainText, - renderInPortal, title, titleClassName, tooltipClassName, }) => { - const id = Utils.GUID() + const id = useId().replace(/:/g, '-') if (!children) { // Skip tooltip by supplying falsy children return <>{title} } + + const content = plainText ? `${children}` : sanitize(children) + return ( <> {title && ( - + {title} )} - {!!children && ( - - - {plainText ? ( - `${children}` - ) : ( -
- )} - - - )} + ) } diff --git a/frontend/web/components/base/accordion/AccordionCard.tsx b/frontend/web/components/base/accordion/AccordionCard.tsx index 646320d31952..957d96b8607e 100644 --- a/frontend/web/components/base/accordion/AccordionCard.tsx +++ b/frontend/web/components/base/accordion/AccordionCard.tsx @@ -1,5 +1,4 @@ -import React, { useState, FC } from 'react' -import { IconButton, Collapse } from '@material-ui/core' +import React, { useState, FC, useRef, useEffect } from 'react' import { chevronDown, chevronUp } from 'ionicons/icons' import { IonIcon } from '@ionic/react' @@ -18,6 +17,26 @@ const AccordionCard: FC = ({ title = 'Summary', }) => { const [open, setOpen] = useState(defaultOpen) + const contentRef = useRef(null) + const [height, setHeight] = useState( + defaultOpen ? undefined : 0, + ) + + useEffect(() => { + if (!contentRef.current) return + if (open) { + setHeight(contentRef.current.scrollHeight) + const timer = setTimeout(() => setHeight(undefined), 300) + return () => clearTimeout(timer) + } else { + setHeight(contentRef.current.scrollHeight) + requestAnimationFrame(() => { + requestAnimationFrame(() => { + setHeight(0) + }) + }) + } + }, [open]) return (
@@ -36,17 +55,24 @@ const AccordionCard: FC = ({ {isLoading && }
{!isLoading && ( - + - + )}
- +
{children}
- +
) } diff --git a/frontend/web/components/feature-health/components/EventTextBlocks.tsx b/frontend/web/components/feature-health/components/EventTextBlocks.tsx index 7ba688b1ae00..7de7c45fecd6 100644 --- a/frontend/web/components/feature-health/components/EventTextBlocks.tsx +++ b/frontend/web/components/feature-health/components/EventTextBlocks.tsx @@ -1,6 +1,5 @@ -import React, { useState } from 'react' +import React, { useRef, useEffect, useState } from 'react' import Constants from 'common/constants' -import Collapse from '@material-ui/core/Collapse' import { IonIcon } from '@ionic/react' import { chevronDown, chevronUp } from 'ionicons/icons' import { FeatureHealthEventReasonTextBlock } from 'common/types/responses' @@ -9,9 +8,46 @@ interface EventTextBlocksProps { textBlocks: FeatureHealthEventReasonTextBlock[] | undefined } +const CollapsibleText: React.FC<{ + collapsed: boolean + children: React.ReactNode +}> = ({ children, collapsed }) => { + const contentRef = useRef(null) + const [height, setHeight] = useState( + collapsed ? 0 : undefined, + ) + + useEffect(() => { + if (!contentRef.current) return + if (!collapsed) { + setHeight(contentRef.current.scrollHeight) + const timer = setTimeout(() => setHeight(undefined), 300) + return () => clearTimeout(timer) + } else { + setHeight(contentRef.current.scrollHeight) + requestAnimationFrame(() => { + requestAnimationFrame(() => { + setHeight(0) + }) + }) + } + }, [collapsed]) + + return ( +
+ {children} +
+ ) +} + const EventTextBlocks: React.FC = ({ textBlocks }) => { - // Index is used here only because the data is read only. - // Backend sorts created_at in descending order. const initialValue = textBlocks?.map((_, index) => ({ collapsed: index !== 0, id: index })) ?? [] const [collapsibleItems, setCollapsibleItems] = @@ -57,9 +93,9 @@ const EventTextBlocks: React.FC = ({ textBlocks }) => { )} )} - + {textBlock.text} - + ))} diff --git a/frontend/web/components/modals/base/Modal.tsx b/frontend/web/components/modals/base/Modal.tsx index 369252dbc624..159139a24fb8 100644 --- a/frontend/web/components/modals/base/Modal.tsx +++ b/frontend/web/components/modals/base/Modal.tsx @@ -6,13 +6,21 @@ import { ModalProps, } from 'reactstrap' import { JSXElementConstructor, ReactNode, useCallback, useState } from 'react' -import { render, unmountComponentAtNode } from 'react-dom' +import { createRoot, Root } from 'react-dom/client' import Confirm from './ModalConfirm' import ModalDefault, { interceptClose, setInterceptClose } from './ModalDefault' import { getStore } from 'common/store' import { Provider } from 'react-redux' -import { OpenConfirm } from '../../../../global' -import Utils from 'common/utils/utils' + +type OpenConfirmParams = { + title: ReactNode + body: ReactNode + onYes: () => void + onNo?: () => void + destructive?: boolean + yesText?: string + noText?: string +} export const ModalHeader = _ModalHeader export const ModalFooter = _ModalFooter @@ -21,7 +29,13 @@ export const ModalBody = _ModalBody const withModal = ( WrappedComponent: JSXElementConstructor, - { closePointer = 'closeModal', shouldInterceptClose = false } = {}, + { + closePointer = 'closeModal', + shouldInterceptClose = false, + }: { + closePointer?: string + shouldInterceptClose?: boolean + } = {}, ) => { return (props: ModalProps) => { // eslint-disable-next-line react-hooks/rules-of-hooks @@ -42,14 +56,42 @@ const withModal = ( // @ts-ignore global[closePointer] = toggle + const onClosed = () => { + if (props.onClosed) { + props.onClosed() + } + } + return ( - + ) } } +function createFreshRoot( + elementId: string, + rootRef: { current: Root | null }, +): Root { + if (rootRef.current) { + rootRef.current.unmount() + } + const el = document.getElementById(elementId) + if (!el) throw new Error(`Element #${elementId} not found`) + rootRef.current = createRoot(el) + return rootRef.current +} + +const confirmRootRef: { current: Root | null } = { current: null } +const modalRootRef: { current: Root | null } = { current: null } +const modal2RootRef: { current: Root | null } = { current: null } + const _Confirm = withModal(Confirm) const _ModalDefault2 = withModal(ModalDefault, { closePointer: 'closeModal2' }) const _ModalDefault = withModal(ModalDefault, { shouldInterceptClose: true }) @@ -62,11 +104,9 @@ export const openConfirm = (global.openConfirm = ({ onYes, title, yesText, -}: OpenConfirm) => { - document.getElementById('confirm') && - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - unmountComponentAtNode(document.getElementById('confirm')!) - render( +}: OpenConfirmParams) => { + const root = createFreshRoot('confirm', confirmRootRef) + root.render( <_Confirm isOpen isDanger={destructive} @@ -78,7 +118,6 @@ export const openConfirm = (global.openConfirm = ({ > {body} , - document.getElementById('confirm'), ) }) @@ -88,12 +127,9 @@ export const openModal = (global.openModal = ( className?: string, onClose?: () => void, ) => { - document.getElementById('modal') && - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - unmountComponentAtNode(document.getElementById('modal')!) - render( + const root = createFreshRoot('modal', modalRootRef) + root.render( <_ModalDefault - key={Utils.GUID()} isOpen className={className} onClosed={onClose} @@ -101,7 +137,6 @@ export const openModal = (global.openModal = ( > {body} , - document.getElementById('modal'), ) }) @@ -112,10 +147,8 @@ export const openModal2 = (global.openModal2 = ( className?: string, onClose?: () => void, ) => { - document.getElementById('modal2') && - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - unmountComponentAtNode(document.getElementById('modal2')!) - render( + const root = createFreshRoot('modal2', modal2RootRef) + root.render( <_ModalDefault2 isOpen className={className} @@ -124,6 +157,5 @@ export const openModal2 = (global.openModal2 = ( > {body} , - document.getElementById('modal2'), ) }) diff --git a/frontend/web/components/modals/base/ModalConfirm.tsx b/frontend/web/components/modals/base/ModalConfirm.tsx index e29504df97c1..c885d7c7cc1f 100644 --- a/frontend/web/components/modals/base/ModalConfirm.tsx +++ b/frontend/web/components/modals/base/ModalConfirm.tsx @@ -10,6 +10,7 @@ interface Confirm { isDanger?: boolean onYes?: () => void onNo?: () => void + onClosed?: () => void noText?: string disabled?: boolean destructive?: boolean @@ -25,6 +26,7 @@ const Confirm: FC = ({ isDanger, isOpen, noText = 'Cancel', + onClosed, onNo, onYes, title, @@ -46,6 +48,7 @@ const Confirm: FC = ({ unmountOnClose isOpen={isOpen} toggle={no} + onClosed={onClosed} > {title} {children} diff --git a/frontend/web/components/segments/Rule/components/RuleConditionPropertySelect.tsx b/frontend/web/components/segments/Rule/components/RuleConditionPropertySelect.tsx index 6f5f032f8f48..ec5feced282c 100644 --- a/frontend/web/components/segments/Rule/components/RuleConditionPropertySelect.tsx +++ b/frontend/web/components/segments/Rule/components/RuleConditionPropertySelect.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useState } from 'react' -import { components } from 'react-select/lib/components' +import { components } from 'react-select' import Utils from 'common/utils/utils' import Constants from 'common/constants' import { GroupLabel } from 'components/base/select/SearchableSelect' diff --git a/frontend/web/main.js b/frontend/web/main.js index 7b6fdf1b2a6b..debde69d091e 100644 --- a/frontend/web/main.js +++ b/frontend/web/main.js @@ -86,14 +86,15 @@ setTimeout(() => { ) } - ReactDOM.render( - {routes}, - rootElement, - ) + const { createRoot } = require('react-dom/client') + const root = createRoot(rootElement) + root.render({routes}) }, 1) // Setup for toast messages -ReactDOM.render(, document.getElementById('toast')) +const { createRoot: createToastRoot } = require('react-dom/client') +const toastRoot = createToastRoot(document.getElementById('toast')) +toastRoot.render() if (E2E) { document.body.classList.add('disable-transitions') diff --git a/frontend/web/styles/components/_chip.scss b/frontend/web/styles/components/_chip.scss index 2fe1bc1736d8..e0114a2cace9 100644 --- a/frontend/web/styles/components/_chip.scss +++ b/frontend/web/styles/components/_chip.scss @@ -17,14 +17,6 @@ border: 1px solid $primary-alfa-32; } - &.MuiChip-root { - color: $primary400; - .MuiChip-deleteIcon { - &:hover { - color: $primary400; - } - } - } .chip-icon { color: $primary400; @@ -129,49 +121,27 @@ } } } -.mui-root { - .MuiChip-root { - background-color: $primary-alfa-8; - border: 1px solid $primary-alfa-24; - border-radius: $border-radius; - color: $primary600; +.chip-input { + border: 1px solid $input-border-color; + padding: 0.5rem; + border-radius: $border-radius; + + &__chips { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 4px; + min-height: auto; + } + + &__input { + border: none; + outline: none; + flex: 1; + min-width: 80px; + background: transparent; font-size: $font-sm; line-height: $line-height-sm; + padding: 2px 0; } - .MuiChip-clickable:hover, - .MuiChip-clickable:focus { - background-color: $primary-alfa-8; - } - .MuiChip-deleteIcon { - width: 18px; - height: 18px; - margin-right: 12px; - &:hover { - color: $primary; - } - } - .MuiChip-label { - padding-right: 0; - } -} - -.WAMuiChipInput-underline-14:before { - display: none; -} -.WAMuiChipInput-underline-14:after { - display: none; -} - -.MuiFormControl-root { - border: 1px solid $input-border-color !important; - padding: 0.5rem !important; - border-radius: $border-radius; -} - -.WAMuiChipInput-chip-16 { - margin: 0 8px 0 0 !important; -} -.WAMuiChipInput-chipContainer-4 { - min-height: auto !important; - row-gap: 4px; } diff --git a/frontend/web/styles/project/_tooltips.scss b/frontend/web/styles/project/_tooltips.scss index 3723bf7ca98f..eca9f57270bf 100644 --- a/frontend/web/styles/project/_tooltips.scss +++ b/frontend/web/styles/project/_tooltips.scss @@ -1,7 +1,7 @@ $arrow: 6px; $shadow: 0 4px 4px 0 rgba(100, 116, 139, 0.12); $shadow-dark: 0 4px 4px 0 #00000029; -.__react_component_tooltip.show { +.react-tooltip { box-shadow: $shadow; max-width: 400px; font-family: $btn-font-family; @@ -9,11 +9,11 @@ $shadow-dark: 0 4px 4px 0 #00000029; color: $body-color !important; text-transform: none; text-wrap: wrap; - &.show { - opacity: 1; - } + opacity: 1 !important; + background-color: white !important; + z-index: 9999; - &.tooltip-lg.show { + &.tooltip-lg { max-width: 900px; } i { @@ -21,96 +21,19 @@ $shadow-dark: 0 4px 4px 0 #00000029; color: $primary; } - background-color: white; - - &:before { - z-index: -1 !important; - } - &.place-top { - &:after { - box-shadow: $shadow; - border-top-color: white; - background-color: white; - border-right-width: $arrow; - border-left-width: $arrow; - margin-top: -$arrow; - padding-top: 1px; - } - } - - &.place-bottom { - &:after { - box-shadow: $shadow; - border-bottom-color: white; - background-color: white; - border-right-width: $arrow; - border-left-width: $arrow; - margin-left: -$arrow; - padding-bottom: 1px; - } - } - - &.place-right { - &:after { - box-shadow: $shadow; - border-right-color: white; - background-color: white; - border-top-width: $arrow; - border-bottom-width: $arrow; - margin-top: -5px; - padding-right: 1px; - } - } - - &.place-left { - &:after { - box-shadow: $shadow; - border-left-color: white; - background-color: white; - border-top-width: $arrow; - border-bottom-width: $arrow; - margin-top: -5px; - padding-left: 1px; - } + .react-tooltip-arrow { + border-color: white; } } .dark { - .__react_component_tooltip { - background-color: $body-color; + .react-tooltip { + background-color: $body-color !important; color: white !important; box-shadow: $shadow-dark; - &.place-top { - &:after { - box-shadow: $shadow-dark; - border-top-color: $body-color; - background-color: $body-color; - } - } - - &.place-bottom { - &:after { - box-shadow: $shadow-dark; - border-bottom-color: $body-color; - background-color: $body-color; - } - } - - &.place-right { - &:after { - box-shadow: $shadow-dark; - border-right-color: $body-color; - background-color: $body-color; - } - } - - &.place-left { - &:after { - box-shadow: $shadow-dark; - border-left-color: $body-color; - background-color: $body-color; - } + .react-tooltip-arrow { + border-color: $body-color; } } }