diff --git a/eslint.config.js b/eslint.config.js index edbc56a58..194c3230d 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -13,38 +13,7 @@ export default [ ignores: ["**/dist", "**/results", "**/node_modules", "css", "**/csv_export.js"], }, { - files: ["**/*.{ts,tsx}"], - plugins: { "@typescript-eslint": ts }, - languageOptions: { parser: tsParser }, - rules: ts.configs["recommended"].rules, - }, - /** - * Root - */ - { - files: ["*.js", "utils/**/*", "cli/**/*.js"], - languageOptions: { globals: { ...globals.node } }, - rules: { - "no-unused-vars": "warn", - }, - }, - /** - * Server - */ - { - files: ["server/**/*"], - languageOptions: { globals: { ...globals.node } }, - }, - /** - * Webdriver - */ - { - files: ["webdriver-ts/**/*.ts"], plugins: { unicorn }, - languageOptions: { - parserOptions: { project: ["./webdriver-ts/tsconfig.eslint.json"] }, - globals: { ...globals.node }, - }, rules: { ...unicorn.configs.recommended.rules, // no: @@ -71,7 +40,24 @@ export default [ "unicorn/prefer-dom-node-text-content": "off", "unicorn/prefer-optional-catch-binding": "off", "unicorn/prefer-logical-operator-over-ternary": "off", - + }, + languageOptions: { globals: { ...globals.node } }, + }, + { + files: ["**/*.{ts,tsx}"], + plugins: { "@typescript-eslint": ts }, + languageOptions: { parser: tsParser }, + rules: ts.configs["recommended"].rules, + }, + /** + * Webdriver + */ + { + files: ["webdriver-ts/**/*.ts"], + languageOptions: { + parserOptions: { project: ["./webdriver-ts/tsconfig.eslint.json"] }, + }, + rules: { "@typescript-eslint/no-explicit-any": "off", "require-await": "error", "@typescript-eslint/no-floating-promises": "error", @@ -82,7 +68,13 @@ export default [ * Web */ { - files: ["webdriver-ts-results/**/*.tsx"], + files: ["webdriver-ts-results/**/*"], + rules: { + "@typescript-eslint/no-loss-of-precision": "off", + }, + }, + { + files: ["webdriver-ts-results/src/**/*.{js,ts,jsx,tsx}"], plugins: { react, "react-refresh": reactRefresh, @@ -99,12 +91,4 @@ export default [ settings: { react: { version: "detect" } }, languageOptions: { globals: { ...globals.browser } }, }, - { - files: ["webdriver-ts-results/**/*"], - languageOptions: { globals: { ...globals.browser, ...globals.node } }, - rules: { - "@typescript-eslint/no-loss-of-precision": "off", - "no-debugger": "off", - }, - }, ]; diff --git a/webdriver-ts-results/package-lock.json b/webdriver-ts-results/package-lock.json index ffdc923de..082536692 100644 --- a/webdriver-ts-results/package-lock.json +++ b/webdriver-ts-results/package-lock.json @@ -8,7 +8,9 @@ "name": "webdriver-ts-results", "version": "0.1.0", "dependencies": { + "antd": "^5.14.2", "jstat": "^1.9.6", + "lucide-react": "^0.344.0", "plotly.js-cartesian-dist": "2.18.2", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -37,6 +39,71 @@ "node": ">=6.0.0" } }, + "node_modules/@ant-design/colors": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.0.2.tgz", + "integrity": "sha512-7KJkhTiPiLHSu+LmMJnehfJ6242OCxSlR3xHVBecYxnMW8MS/878NXct1GqYARyL59fyeFdKRxXTfvR9SnDgJg==", + "dependencies": { + "@ctrl/tinycolor": "^3.6.1" + } + }, + "node_modules/@ant-design/cssinjs": { + "version": "1.18.4", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.18.4.tgz", + "integrity": "sha512-IrUAOj5TYuMG556C9gdbFuOrigyhzhU5ZYpWb3gYTxAwymVqRbvLzFCZg6OsjLBR6GhzcxYF3AhxKmjB+rA2xA==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@emotion/hash": "^0.8.0", + "@emotion/unitless": "^0.7.5", + "classnames": "^2.3.1", + "csstype": "^3.1.3", + "rc-util": "^5.35.0", + "stylis": "^4.0.13" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.3.1.tgz", + "integrity": "sha512-85zROTJCCApQn0Ee6L9561+Vd7yVKtSWNm2TpmOsYMrumchbzaRK83x1WWHv2VG+Y1ZAaKkDwcnnSPS/eSwNHA==", + "dependencies": { + "@ant-design/colors": "^7.0.0", + "@ant-design/icons-svg": "^4.4.0", + "@babel/runtime": "^7.11.2", + "classnames": "^2.2.6", + "rc-util": "^5.31.1" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==" + }, + "node_modules/@ant-design/react-slick": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.0.2.tgz", + "integrity": "sha512-Wj8onxL/T8KQLFFiCA4t8eIRGpRR+UPgOdac2sYzonv+i0n3kXHmvHLLiOYL655DQx2Umii9Y9nNgL7ssu5haQ==", + "dependencies": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "resize-observer-polyfill": "^1.5.1", + "throttle-debounce": "^5.0.0" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.23.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", @@ -315,6 +382,17 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/runtime": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", + "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", @@ -364,6 +442,24 @@ "node": ">=6.9.0" } }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, "node_modules/@esbuild/android-arm": { "version": "0.19.8", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.8.tgz", @@ -764,6 +860,118 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@rc-component/color-picker": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-1.5.2.tgz", + "integrity": "sha512-YJXujYzYFAEtlXJXy0yJUhwzUWPTcniBZto+wZ/vnACmFnUTNR7dH+NOeqSwMMsssh74e9H5Jfpr5LAH2PYqUw==", + "dependencies": { + "@babel/runtime": "^7.23.6", + "@ctrl/tinycolor": "^3.6.1", + "classnames": "^2.2.6", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/context": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.4.0.tgz", + "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/mini-decimal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", + "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", + "dependencies": { + "@babel/runtime": "^7.18.0" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@rc-component/mutate-observer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz", + "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/portal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", + "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/tour": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.12.3.tgz", + "integrity": "sha512-U4mf1FiUxGCwrX4ed8op77Y8VKur+8Y/61ylxtqGbcSoh1EBC7bWd/DkLu0ClTUrKZInqEi1FL7YgFtnT90vHA==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/portal": "^1.0.0-9", + "@rc-component/trigger": "^1.3.6", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/trigger": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-1.18.3.tgz", + "integrity": "sha512-Ksr25pXreYe1gX6ayZ1jLrOrl9OAUHUqnuhEx6MeHnNa1zVM5Y2Aj3Q35UrER0ns8D2cJYtmJtVli+i+4eKrvA==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@rc-component/portal": "^1.1.0", + "classnames": "^2.3.2", + "rc-motion": "^2.0.0", + "rc-resize-observer": "^1.3.1", + "rc-util": "^5.38.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.6.0.tgz", @@ -1030,6 +1238,78 @@ "node": ">=4" } }, + "node_modules/antd": { + "version": "5.14.2", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.14.2.tgz", + "integrity": "sha512-ur0oBI9U7hAeON4ZRs1cAF1suIpTR+uj3YliTZacWkiVxNTZYPaaTdnLuAZDRMT9P2IZ007dCQTqxn5t1Z+Dxw==", + "dependencies": { + "@ant-design/colors": "^7.0.2", + "@ant-design/cssinjs": "^1.18.4", + "@ant-design/icons": "^5.3.0", + "@ant-design/react-slick": "~1.0.2", + "@ctrl/tinycolor": "^3.6.1", + "@rc-component/color-picker": "~1.5.2", + "@rc-component/mutate-observer": "^1.1.0", + "@rc-component/tour": "~1.12.3", + "@rc-component/trigger": "^1.18.3", + "classnames": "^2.5.1", + "copy-to-clipboard": "^3.3.3", + "dayjs": "^1.11.10", + "qrcode.react": "^3.1.0", + "rc-cascader": "~3.21.2", + "rc-checkbox": "~3.1.0", + "rc-collapse": "~3.7.2", + "rc-dialog": "~9.3.4", + "rc-drawer": "~7.0.0", + "rc-dropdown": "~4.1.0", + "rc-field-form": "~1.41.0", + "rc-image": "~7.5.1", + "rc-input": "~1.4.3", + "rc-input-number": "~9.0.0", + "rc-mentions": "~2.10.1", + "rc-menu": "~9.12.4", + "rc-motion": "^2.9.0", + "rc-notification": "~5.3.0", + "rc-pagination": "~4.0.4", + "rc-picker": "~4.1.4", + "rc-progress": "~3.5.1", + "rc-rate": "~2.12.0", + "rc-resize-observer": "^1.4.0", + "rc-segmented": "~2.3.0", + "rc-select": "~14.11.0", + "rc-slider": "~10.5.0", + "rc-steps": "~6.0.1", + "rc-switch": "~4.1.0", + "rc-table": "~7.39.0", + "rc-tabs": "~14.0.0", + "rc-textarea": "~1.6.3", + "rc-tooltip": "~6.1.3", + "rc-tree": "~5.8.5", + "rc-tree-select": "~5.17.0", + "rc-upload": "~4.5.2", + "rc-util": "^5.38.2", + "scroll-into-view-if-needed": "^3.1.0", + "throttle-debounce": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, "node_modules/browserslist": { "version": "4.22.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", @@ -1096,6 +1376,11 @@ "node": ">=4" } }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -1111,17 +1396,34 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, + "node_modules/compute-scroll-into-view": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz", + "integrity": "sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==" + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "devOptional": true + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" }, "node_modules/debug": { "version": "4.3.4", @@ -1265,6 +1567,14 @@ "node": ">=4" } }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "dependencies": { + "string-convert": "^0.2.0" + } + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -1302,6 +1612,14 @@ "yallist": "^3.0.2" } }, + "node_modules/lucide-react": { + "version": "0.344.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.344.0.tgz", + "integrity": "sha512-6YyBnn91GB45VuVT96bYCOKElbJzUHqp65vX8cDcu55MQL9T969v4dhGClpljamuI/+KMO9P6w9Acq1CVQGvIQ==", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -1371,6 +1689,586 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/qrcode.react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-3.1.0.tgz", + "integrity": "sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/rc-cascader": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.21.2.tgz", + "integrity": "sha512-J7GozpgsLaOtzfIHFJFuh4oFY0ePb1w10twqK6is3pAkqHkca/PsokbDr822KIRZ8/CK8CqevxohuPDVZ1RO/A==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "array-tree-filter": "^2.1.0", + "classnames": "^2.3.1", + "rc-select": "~14.11.0", + "rc-tree": "~5.8.1", + "rc-util": "^5.37.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-checkbox": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.1.0.tgz", + "integrity": "sha512-PAwpJFnBa3Ei+5pyqMMXdcKYKNBMS+TvSDiLdDnARnMJHC8ESxwPfm4Ao1gJiKtWLdmGfigascnCpwrHFgoOBQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.25.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-collapse": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.7.2.tgz", + "integrity": "sha512-ZRw6ipDyOnfLFySxAiCMdbHtb5ePAsB9mT17PA6y1mRD/W6KHRaZeb5qK/X9xDV1CqgyxMpzw0VdS74PCcUk4A==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.3.4", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dialog": { + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.3.4.tgz", + "integrity": "sha512-975X3018GhR+EjZFbxA2Z57SX5rnu0G0/OxFgMMvZK4/hQWEm3MHaNvP4wXpxYDoJsp+xUvVW+GB9CMMCm81jA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-drawer": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-7.0.0.tgz", + "integrity": "sha512-ePcS4KtQnn57bCbVXazHN2iC8nTPCXlWEIA/Pft87Pd9U7ZeDkdRzG47jWG2/TAFXFlFltRAMcslqmUM8NPCGA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.1.1", + "classnames": "^2.2.6", + "rc-motion": "^2.6.1", + "rc-util": "^5.36.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dropdown": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.1.0.tgz", + "integrity": "sha512-VZjMunpBdlVzYpEdJSaV7WM7O0jf8uyDjirxXLZRNZ+tAC+NzD3PXPEtliFwGzVwBBdCmGuSqiS9DWcOLxQ9tw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@rc-component/trigger": "^1.7.0", + "classnames": "^2.2.6", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" + } + }, + "node_modules/rc-field-form": { + "version": "1.41.0", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.41.0.tgz", + "integrity": "sha512-k9AS0wmxfJfusWDP/YXWTpteDNaQ4isJx9UKxx4/e8Dub4spFeZ54/EuN2sYrMRID/+hUznPgVZeg+Gf7XSYCw==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "async-validator": "^4.1.0", + "rc-util": "^5.32.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-image": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.5.1.tgz", + "integrity": "sha512-Z9loECh92SQp0nSipc0MBuf5+yVC05H/pzC+Nf8xw1BKDFUJzUeehYBjaWlxly8VGBZJcTHYri61Fz9ng1G3Ag==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/portal": "^1.0.2", + "classnames": "^2.2.6", + "rc-dialog": "~9.3.4", + "rc-motion": "^2.6.2", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-input": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.4.3.tgz", + "integrity": "sha512-aHyQUAIRmTlOnvk5EcNqEpJ+XMtfMpYRAJayIlJfsvvH9cAKUWboh4egm23vgMA7E+c/qm4BZcnrDcA960GC1w==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-input-number": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-9.0.0.tgz", + "integrity": "sha512-RfcDBDdWFFetouWFXBA+WPEC8LzBXyngr9b+yTLVIygfFu7HiLRGn/s/v9wwno94X7KFvnb28FNynMGj9XJlDQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/mini-decimal": "^1.0.1", + "classnames": "^2.2.5", + "rc-input": "~1.4.0", + "rc-util": "^5.28.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-mentions": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.10.1.tgz", + "integrity": "sha512-72qsEcr/7su+a07ndJ1j8rI9n0Ka/ngWOLYnWMMv0p2mi/5zPwPrEDTt6Uqpe8FWjWhueDJx/vzunL6IdKDYMg==", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@rc-component/trigger": "^1.5.0", + "classnames": "^2.2.6", + "rc-input": "~1.4.0", + "rc-menu": "~9.12.0", + "rc-textarea": "~1.6.1", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-menu": { + "version": "9.12.4", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.12.4.tgz", + "integrity": "sha512-t2NcvPLV1mFJzw4F21ojOoRVofK2rWhpKPx69q2raUsiHPDP6DDevsBILEYdsIegqBeSXoWs2bf6CueBKg3BFg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^1.17.0", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.3.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-motion": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.0.tgz", + "integrity": "sha512-XIU2+xLkdIr1/h6ohPZXyPBMvOmuyFZQ/T0xnawz+Rh+gh4FINcnZmMT5UTIj6hgI0VLDjTaPeRd+smJeSPqiQ==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-notification": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.3.0.tgz", + "integrity": "sha512-WCf0uCOkZ3HGfF0p1H4Sgt7aWfipxORWTPp7o6prA3vxwtWhtug3GfpYls1pnBp4WA+j8vGIi5c2/hQRpGzPcQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.9.0", + "rc-util": "^5.20.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-overflow": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.3.2.tgz", + "integrity": "sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.37.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-pagination": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-4.0.4.tgz", + "integrity": "sha512-GGrLT4NgG6wgJpT/hHIpL9nELv27A1XbSZzECIuQBQTVSf4xGKxWr6I/jhpRPauYEWEbWVw22ObG6tJQqwJqWQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.38.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-picker": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.1.5.tgz", + "integrity": "sha512-dh2E9j7HomZW10RWIBsdyXs3geHkSslVqKTx3VZfmi9UEabiQrBBNKVIhqn2m0goia0dqyWJ4qRghAsBVLGzbw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^1.5.0", + "classnames": "^2.2.1", + "rc-overflow": "^1.3.2", + "rc-resize-observer": "^1.4.0", + "rc-util": "^5.38.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "date-fns": ">= 2.x", + "dayjs": ">= 1.x", + "luxon": ">= 3.x", + "moment": ">= 2.x", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + }, + "peerDependenciesMeta": { + "date-fns": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + } + } + }, + "node_modules/rc-progress": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.5.1.tgz", + "integrity": "sha512-V6Amx6SbLRwPin/oD+k1vbPrO8+9Qf8zW1T8A7o83HdNafEVvAxPV5YsgtKFP+Ud5HghLj33zKOcEHrcrUGkfw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-rate": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.12.0.tgz", + "integrity": "sha512-g092v5iZCdVzbjdn28FzvWebK2IutoVoiTeqoLTj9WM7SjA/gOJIw5/JFZMRyJYYVe1jLAU2UhAfstIpCNRozg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-resize-observer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.0.tgz", + "integrity": "sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==", + "dependencies": { + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.38.0", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-segmented": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.3.0.tgz", + "integrity": "sha512-I3FtM5Smua/ESXutFfb8gJ8ZPcvFR+qUgeeGFQHBOvRiRKyAk4aBE5nfqrxXx+h8/vn60DQjOt6i4RNtrbOobg==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-motion": "^2.4.4", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-select": { + "version": "14.11.0", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.11.0.tgz", + "integrity": "sha512-8J8G/7duaGjFiTXCBLWfh5P+KDWyA3KTlZDfV3xj/asMPqB2cmxfM+lH50wRiPIRsCQ6EbkCFBccPuaje3DHIg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^1.5.0", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.3.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-slider": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.5.0.tgz", + "integrity": "sha512-xiYght50cvoODZYI43v3Ylsqiw14+D7ELsgzR40boDZaya1HFa1Etnv9MDkQE8X/UrXAffwv2AcNAhslgYuDTw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.27.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-steps": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-6.0.1.tgz", + "integrity": "sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==", + "dependencies": { + "@babel/runtime": "^7.16.7", + "classnames": "^2.2.3", + "rc-util": "^5.16.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-switch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-4.1.0.tgz", + "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "classnames": "^2.2.1", + "rc-util": "^5.30.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-table": { + "version": "7.39.0", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.39.0.tgz", + "integrity": "sha512-7fHLMNsm/2DlGwyIMkdH2xIeRzb5I69bLsFaEVtX+gqmGhByy0wtOAgHkiOew3PtXozSJyh+iXifjLgQzWdczw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/context": "^1.4.0", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.1.0", + "rc-util": "^5.37.0", + "rc-virtual-list": "^3.11.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tabs": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-14.0.0.tgz", + "integrity": "sha512-lp1YWkaPnjlyhOZCPrAWxK6/P6nMGX/BAZcAC3nuVwKz0Byfp+vNnQKK8BRCP2g/fzu+SeB5dm9aUigRu3tRkQ==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.1.0", + "rc-menu": "~9.12.0", + "rc-motion": "^2.6.2", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.34.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-textarea": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.6.3.tgz", + "integrity": "sha512-8k7+8Y2GJ/cQLiClFMg8kUXOOdvcFQrnGeSchOvI2ZMIVvX5a3zQpLxoODL0HTrvU63fPkRmMuqaEcOF9dQemA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-input": "~1.4.0", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tooltip": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.1.3.tgz", + "integrity": "sha512-HMSbSs5oieZ7XddtINUddBLSVgsnlaSb3bZrzzGWjXa7/B7nNedmsuz72s7EWFEro9mNa7RyF3gOXKYqvJiTcQ==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/trigger": "^1.18.0", + "classnames": "^2.3.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tree": { + "version": "5.8.5", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.8.5.tgz", + "integrity": "sha512-PRfcZtVDNkR7oh26RuNe1hpw11c1wfgzwmPFL0lnxGnYefe9lDAO6cg5wJKIAwyXFVt5zHgpjYmaz0CPy1ZtKg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.1" + }, + "engines": { + "node": ">=10.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-tree-select": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.17.0.tgz", + "integrity": "sha512-7sRGafswBhf7n6IuHyCEFCildwQIgyKiV8zfYyUoWfZEFdhuk7lCH+DN0aHt+oJrdiY9+6Io/LDXloGe01O8XQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-select": "~14.11.0-0", + "rc-tree": "~5.8.1", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-upload": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.5.2.tgz", + "integrity": "sha512-QO3ne77DwnAPKFn0bA5qJM81QBjQi0e0NHdkvpFyY73Bea2NfITiotqJqVjHgeYPOJu5lLVR32TNGP084aSoXA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.5", + "rc-util": "^5.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util": { + "version": "5.38.2", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.38.2.tgz", + "integrity": "sha512-yRGRPKyi84H7NkRSP6FzEIYBdUt4ufdsmXUZ7qM2H5qoByPax70NnGPkfo36N+UKUnUBj2f2Q2eUbwYMuAsIOQ==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^18.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-virtual-list": { + "version": "3.11.4", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.11.4.tgz", + "integrity": "sha512-NbBi0fvyIu26gP69nQBiWgUMTPX3mr4FcuBQiVqagU0BnuX8WQkiivnMs105JROeuUIFczLrlgUhLQwTWV1XDA==", + "dependencies": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -1394,6 +2292,11 @@ "react": "^18.2.0" } }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, "node_modules/react-refresh": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", @@ -1403,6 +2306,16 @@ "node": ">=0.10.0" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "node_modules/rollup": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.6.0.tgz", @@ -1439,6 +2352,14 @@ "loose-envify": "^1.1.0" } }, + "node_modules/scroll-into-view-if-needed": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -1457,6 +2378,16 @@ "node": ">=0.10.0" } }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + }, + "node_modules/stylis": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.1.tgz", + "integrity": "sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==" + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -1469,6 +2400,14 @@ "node": ">=4" } }, + "node_modules/throttle-debounce": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.0.tgz", + "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==", + "engines": { + "node": ">=12.22" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -1478,6 +2417,11 @@ "node": ">=4" } }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + }, "node_modules/tsconfck": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.2.tgz", diff --git a/webdriver-ts-results/package.json b/webdriver-ts-results/package.json index dcb4dbf4f..6417ccf9b 100644 --- a/webdriver-ts-results/package.json +++ b/webdriver-ts-results/package.json @@ -4,7 +4,9 @@ "private": true, "type": "module", "dependencies": { + "antd": "^5.14.2", "jstat": "^1.9.6", + "lucide-react": "^0.344.0", "plotly.js-cartesian-dist": "2.18.2", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/webdriver-ts-results/src/App.css b/webdriver-ts-results/src/App.css index e4e459f93..7b66d7745 100644 --- a/webdriver-ts-results/src/App.css +++ b/webdriver-ts-results/src/App.css @@ -1,200 +1,10 @@ -:root { - --border-color: #ccc; +.known-issues { + margin-top: 20px; } -*, -::before, -::after { - box-sizing: border-box; -} - -body { - font-family: Helvetica, Arial, sans-serif; - font-size: 14px; - margin: 10px; -} - -a, -a:active, -a:hover { - text-decoration: none; -} - -button, -select { - font-size: 14px; -} - -select { - border: 1px solid var(--border-color); - border-radius: 4px; - height: 29px; - background: white; -} - -input + label { - margin-left: 5px; -} - -thead.dummy th { - padding: 0; - border: 0; -} -.results__table td.description { - text-align: left; - overflow: visible; - height: 42px; - padding: 0 !important; - border: 0; -} -td > h3 { - position: absolute; - font-size: 16px; - margin: 0px; - padding: 10px; - top: 0; - left: 0; - width: 800px; - height: 40px; - background-color: #fff; -} -td { - text-align: center; -} -.results { - width: 100%; - max-width: 100%; -} -.results__table-container { - overflow-x: auto; -} -.results__table { - font-size: 11px; - width: 150px; - table-layout: fixed; - border-collapse: collapse; -} -.results__table th { - width: 60px; - font-weight: normal; - font-size: 11px; - z-index: 9; - text-align: center; - word-break: normal; - hyphens: auto; - -webkit-hyphens: auto; -} -.results__table th.benchname { - width: 120px; -} -.results__table th, -.results__table td { - padding: 3px; - border: 1px solid #ddd; -} -.results__table th:first-child, -.results__table td:first-child { - position: sticky; - left: 0; - width: 120px; - background-color: white; -} -.results__table th:first-child::before, -.results__table td:not(.description):first-child::before, -.results__table th:first-child::after, -.results__table td:not(.description):first-child::after { - content: ""; - position: absolute; - top: 0; - bottom: 0; - width: 1px; - background-color: #dddddd; -} -.results__table th:first-child::before, -.results__table td:first-child::before { - left: -1px; -} -.results__table th:first-child::after, -.results__table td:first-child::after { - right: -1px; -} - -.rowCount { - font-size: 10px; -} - -.deviation { - font-size: 8px; - padding-left: 5px; -} -.deviation::before { - content: "± "; -} - -.factor { - font-size: 8px; -} - -.sort-key { - text-decoration: underline; -} - -dl { - width: 100%; - overflow: hidden; - padding: 0; - margin-bottom: 16px; -} -dt { +.known-issues__issue-code { float: left; width: 50px; padding: 0; margin: 0; } -dd { - padding: 0; - margin: 0; -} - -.with-issues { - background-color: #faa; -} - -.button { - cursor: pointer; -} - -.button__text { - color: #00e; - font-size: inherit; - border: none; - background: none; -} - -.button__text:disabled { - color: #666; - font-weight: normal; -} - -.button__icon { - border: 1px solid var(--border-color); - border-radius: 4px; - padding: 2px; - width: 26px; -} - -.button__icon:active { - border: 1px solid #888; -} - -.error { - background-color: #f99; -} - -.warning { - background-color: #ff6; -} - -.check-full-width::after { - display: inline-block; -} diff --git a/webdriver-ts-results/src/App.tsx b/webdriver-ts-results/src/App.tsx index ffda531fa..e0e1a404f 100644 --- a/webdriver-ts-results/src/App.tsx +++ b/webdriver-ts-results/src/App.tsx @@ -1,23 +1,27 @@ import "./App.css"; -import { FrameworkType, knownIssues } from "./Common"; -import ResultTable from "./components/ResultTable"; -import SelectionBar from "./components/selection/SelectionBar"; +import { FrameworkType, knownIssues } from "@/Common"; +import ResultTable from "@/components/ResultTable"; +import SelectionToolbar from "@/components/SelectionToolbar"; +import { List, Typography } from "antd"; const KnownIssuesList = () => { + const data = knownIssues; + return ( -
-

Known issues and notes

- {knownIssues.map((issue) => ( -
-
- - {issue.issue.toFixed()} - -
-
{issue.text}
-
- ))} -
+ Known issues and notes} + bordered + className="known-issues" + dataSource={data} + renderItem={(issue) => ( + + + {issue.issue} + {" "} + {issue.text} + + )} + /> ); }; @@ -51,18 +55,23 @@ const App = () => { {disclaimer} {testEnvironmentInfo}

- After chrome 119 official results we've changed a detail for the benchmark: - We now open a new tab for each benchmark iteration, earlier runs reused the tab per benchmark and implementation. + After chrome 119 official results we've changed a detail for the benchmark: We now open a new tab for each + benchmark iteration, earlier runs reused the tab per benchmark and implementation.

- Starting with chrome 118 the benchmark uses a weighted geometric mean to compute the overall result. + Starting with chrome 118 the benchmark uses a{" "} + + weighted geometric mean{" "} + {" "} + to compute the overall result.

-
- - - - + +
+ + +
+
); diff --git a/webdriver-ts-results/src/Common.ts b/webdriver-ts-results/src/Common.ts index 289f2112b..d14627c2c 100644 --- a/webdriver-ts-results/src/Common.ts +++ b/webdriver-ts-results/src/Common.ts @@ -13,7 +13,7 @@ export enum DisplayMode { export enum CpuDurationMode { Total = "total", Script = "script", - Render = "paint" + Render = "paint", } export enum FrameworkType { @@ -95,16 +95,11 @@ export function findIssue(issueNumber: number): Issue | undefined { export enum BenchmarkType { CPU, MEM, - STARTUP=3, - SIZE=5, + STARTUP = 3, + SIZE = 5, } -const benchmarkTypes = [ - BenchmarkType.CPU, - BenchmarkType.MEM, - BenchmarkType.STARTUP, - BenchmarkType.SIZE, -]; +const benchmarkTypes = [BenchmarkType.CPU, BenchmarkType.MEM, BenchmarkType.STARTUP, BenchmarkType.SIZE]; export interface Benchmark { id: string; @@ -176,10 +171,7 @@ export class TableResultValueEntry { public bgColor: string, public textColor: string, public statisticResult: StatisticResult, - public statisticallySignificantFactor: - | string - | number - | undefined = undefined, + public statisticallySignificantFactor: string | number | undefined = undefined ) {} } @@ -189,7 +181,7 @@ export class TableResultComparisonEntry { public framework: Framework, public label: string, public bgColor: string, - public textColor: string, + public textColor: string ) {} } @@ -199,7 +191,7 @@ export class TableResultGeommeanEntry { public framework: Framework, public mean: number, public bgColor: string, - public textColor: string, + public textColor: string ) {} } @@ -209,8 +201,7 @@ export interface ResultLookup { export function convertToMap(results: Array): ResultLookup { const resultMap = new Map>(); results.forEach((r) => { - if (!resultMap.has(r.benchmark)) - resultMap.set(r.benchmark, new Map()); + if (!resultMap.has(r.benchmark)) resultMap.set(r.benchmark, new Map()); resultMap.get(r.benchmark)!.set(r.framework, r); }); return (benchmark: Benchmark, framework: Framework) => { @@ -222,21 +213,9 @@ export function convertToMap(results: Array): ResultLookup { }; } -const undecided: [string, string, StatisticResult] = [ - "#fff", - "#000", - StatisticResult.Undecided, -]; -const faster: [string, string, StatisticResult] = [ - "#00b300", - "#fff", - StatisticResult.Faster, -]; -const slower: [string, string, StatisticResult] = [ - "#b30000", - "#fff", - StatisticResult.Slower, -]; +const undecided: [string, string, StatisticResult] = ["#fff", "#000", StatisticResult.Undecided]; +const faster: [string, string, StatisticResult] = ["#00b300", "#fff", StatisticResult.Faster]; +const slower: [string, string, StatisticResult] = ["#b30000", "#fff", StatisticResult.Slower]; function colorsForStatisticResult(statisticResult: StatisticResult) { switch (statisticResult) { @@ -249,10 +228,7 @@ function colorsForStatisticResult(statisticResult: StatisticResult) { } } -const statisticComputeColor = function ( - sign: number, - pValue: number, -): [string, string, StatisticResult] { +const statisticComputeColor = function (sign: number, pValue: number): [string, string, StatisticResult] { if (pValue > 0.1) { return undecided; //['#fff','#000', StatisticResult.Undecided]; } @@ -295,82 +271,48 @@ export class ResultTableData { public displayMode: DisplayMode, public compareWith: Framework | undefined, public selectedCategories: Set, - public cpuDurationMode: string, + public cpuDurationMode: string ) { const allowedIssues = new Set(knownIssues.map((issue) => issue.issue)); - const defaultFrameworks = [ - "vanillajs-keyed", - "vanillajs-1-keyed", - "vanillajs-non-keyed", - "vanillajs-1-non-keyed", - ]; + const defaultFrameworks = ["vanillajs-keyed", "vanillajs-1-keyed", "vanillajs-non-keyed", "vanillajs-1-non-keyed"]; console.log("ResultTableData", allowedIssues, selectedCategories); this.selectedFameworks = new Set(); selectedFrameworksInDropdown.forEach((framework) => { - if ( - this.isFrameworkAllowed(framework, allowedIssues, defaultFrameworks) - ) { + if (this.isFrameworkAllowed(framework, allowedIssues, defaultFrameworks)) { this.selectedFameworks.add(framework); } }); this.frameworks = this.filterFrameworksByType(this.selectedFameworks, type); this.frameworksForFactors = this.allFrameworks.filter( - (framework) => - framework.type === type && - this.isFrameworkAllowed(framework, allowedIssues, defaultFrameworks), + (framework) => framework.type === type && this.isFrameworkAllowed(framework, allowedIssues, defaultFrameworks) ); this.update(sortKey); } - private isFrameworkAllowed( - framework: Framework, - allowedIssues: Set, - defaultFrameworks: Array, - ) { - return ( - framework.issues.every((i) => allowedIssues.has(i)) || - defaultFrameworks.includes(framework.name) - ); + private isFrameworkAllowed(framework: Framework, allowedIssues: Set, defaultFrameworks: Array) { + return framework.issues.every((i) => allowedIssues.has(i)) || defaultFrameworks.includes(framework.name); } - private filterFrameworksByType( - selectedFrameworks: Set, - type: FrameworkType, - ) { - return this.allFrameworks.filter( - (framework) => - framework.type === type && selectedFrameworks.has(framework), - ); + private filterFrameworksByType(selectedFrameworks: Set, type: FrameworkType) { + return this.allFrameworks.filter((framework) => framework.type === type && selectedFrameworks.has(framework)); } private update(sortKey: string) { console.time("update"); const createResult = (type: BenchmarkType): ResultData => { const benchmarks = this.allBenchmarks.filter( - (benchmark) => - benchmark.type === type && this.selectedBenchmarks.has(benchmark), - ); - const results = benchmarks.map((benchmark) => - this.computeFactors(benchmark), + (benchmark) => benchmark.type === type && this.selectedBenchmarks.has(benchmark) ); + const results = benchmarks.map((benchmark) => this.computeFactors(benchmark)); const geomMean = this.frameworks.map((framework, idx) => { const resultsForFramework = results.map((arr) => arr[idx]); - return this.computeGeometricMean( - type, - framework, - benchmarks, - resultsForFramework - ); + return this.computeGeometricMean(type, framework, benchmarks, resultsForFramework); }); const comparison = this.frameworks.map((framework, idx) => { const resultsForFramework = results.map((arr) => arr[idx]); - return this.computeComparison( - framework, - benchmarks, - resultsForFramework - ); + return this.computeComparison(framework, benchmarks, resultsForFramework); }); return { benchmarks, results, geomMean, comparison }; @@ -391,51 +333,31 @@ export class ResultTableData { let sortValue; if (sortKey === SORT_BY_NAME) sortValue = f.name; else if (sortKey === SORT_BY_GEOMMEAN_CPU) - sortValue = - this.getResult(BenchmarkType.CPU).geomMean[frameworkIndex]!.mean || - Number.POSITIVE_INFINITY; + sortValue = this.getResult(BenchmarkType.CPU).geomMean[frameworkIndex]!.mean || Number.POSITIVE_INFINITY; else if (sortKey === SORT_BY_GEOMMEAN_MEM) - sortValue = - this.getResult(BenchmarkType.MEM).geomMean[frameworkIndex]!.mean || - Number.POSITIVE_INFINITY; + sortValue = this.getResult(BenchmarkType.MEM).geomMean[frameworkIndex]!.mean || Number.POSITIVE_INFINITY; else if (sortKey === SORT_BY_GEOMMEAN_SIZE) - sortValue = - this.getResult(BenchmarkType.SIZE).geomMean[frameworkIndex]!.mean || - Number.POSITIVE_INFINITY; + sortValue = this.getResult(BenchmarkType.SIZE).geomMean[frameworkIndex]!.mean || Number.POSITIVE_INFINITY; else if (sortKey === SORT_BY_GEOMMEAN_STARTUP) - sortValue = - this.getResult(BenchmarkType.STARTUP).geomMean[frameworkIndex]! - .mean || Number.POSITIVE_INFINITY; + sortValue = this.getResult(BenchmarkType.STARTUP).geomMean[frameworkIndex]!.mean || Number.POSITIVE_INFINITY; else { - const cpuIdx = this.getResult(BenchmarkType.CPU).benchmarks.findIndex( - (b) => b.id === sortKey, - ); - const memIdx = this.getResult(BenchmarkType.MEM).benchmarks.findIndex( - (b) => b.id === sortKey, - ); - const sizeIdx = this.getResult(BenchmarkType.SIZE).benchmarks.findIndex( - (b) => b.id === sortKey, - ); - const startupIdx = this.getResult( - BenchmarkType.STARTUP, - ).benchmarks.findIndex((b) => b.id === sortKey); + const cpuIdx = this.getResult(BenchmarkType.CPU).benchmarks.findIndex((b) => b.id === sortKey); + const memIdx = this.getResult(BenchmarkType.MEM).benchmarks.findIndex((b) => b.id === sortKey); + const sizeIdx = this.getResult(BenchmarkType.SIZE).benchmarks.findIndex((b) => b.id === sortKey); + const startupIdx = this.getResult(BenchmarkType.STARTUP).benchmarks.findIndex((b) => b.id === sortKey); if (cpuIdx > -1) sortValue = - this.getResult(BenchmarkType.CPU).results[cpuIdx][frameworkIndex] - ?.value ?? Number.POSITIVE_INFINITY; + this.getResult(BenchmarkType.CPU).results[cpuIdx][frameworkIndex]?.value ?? Number.POSITIVE_INFINITY; else if (startupIdx > -1) sortValue = - this.getResult(BenchmarkType.STARTUP).results[startupIdx][ - frameworkIndex - ]?.value ?? Number.POSITIVE_INFINITY; + this.getResult(BenchmarkType.STARTUP).results[startupIdx][frameworkIndex]?.value ?? + Number.POSITIVE_INFINITY; else if (memIdx > -1) sortValue = - this.getResult(BenchmarkType.MEM).results[memIdx][frameworkIndex] - ?.value ?? Number.POSITIVE_INFINITY; + this.getResult(BenchmarkType.MEM).results[memIdx][frameworkIndex]?.value ?? Number.POSITIVE_INFINITY; else if (sizeIdx > -1) sortValue = - this.getResult(BenchmarkType.SIZE).results[sizeIdx][frameworkIndex] - ?.value ?? Number.POSITIVE_INFINITY; + this.getResult(BenchmarkType.SIZE).results[sizeIdx][frameworkIndex]?.value ?? Number.POSITIVE_INFINITY; else throw Error(`sortKey ${sortKey} not found`); } return { @@ -445,18 +367,14 @@ export class ResultTableData { }; }); - const remappedIdx = zipped - .sort((a, b) => Number(a.sortValue) - Number(b.sortValue)) - .map((z) => z.origIndex); + const remappedIdx = zipped.sort((a, b) => Number(a.sortValue) - Number(b.sortValue)).map((z) => z.origIndex); this.frameworks = this.remap(remappedIdx, this.frameworks); for (const type of benchmarkTypes) { const result = this.getResult(type); - result.results = result.results.map((row) => - this.remap(remappedIdx, row), - ); + result.results = result.results.map((row) => this.remap(remappedIdx, row)); result.geomMean = this.remap(remappedIdx, result.geomMean); result.comparison = this.remap(remappedIdx, result.comparison); } @@ -469,52 +387,37 @@ export class ResultTableData { type: BenchmarkType, framework: Framework, benchmarks: Array, - resultsForFramework: Array, + resultsForFramework: Array ): TableResultGeommeanEntry { let benchmarkWeights: Array; if (type == BenchmarkType.CPU) { - benchmarkWeights = [0.64280248137063,0.5607178150466176,0.5643800750716564,0.1925635870170522,0.13200612879341714,0.5277091212292658,0.5644449600965534,0.5508359820582848,0.4225836631419211]; + benchmarkWeights = [ + 0.64280248137063, 0.5607178150466176, 0.5643800750716564, 0.1925635870170522, 0.13200612879341714, + 0.5277091212292658, 0.5644449600965534, 0.5508359820582848, 0.4225836631419211, + ]; } else { benchmarkWeights = new Array(benchmarks.length).fill(1); } let gMean = 0.0; - resultsForFramework.forEach((r,idx) => { - if (r !== null && !isNaN(r.factor)) { - gMean += benchmarkWeights[idx] * Math.log(r.factor); - } + resultsForFramework.forEach((r, idx) => { + if (r !== null && !isNaN(r.factor)) { + gMean += benchmarkWeights[idx] * Math.log(r.factor); + } }); - const value = Math.exp(gMean / benchmarkWeights.reduce((a,b) => a+b, 0)) + const value = Math.exp(gMean / benchmarkWeights.reduce((a, b) => a + b, 0)); return this.compareWith - ? new TableResultGeommeanEntry( - framework.name, - framework, - value, - "#fff", - "#000", - ) - : new TableResultGeommeanEntry( - framework.name, - framework, - value, - computeColor(value), - "#000", - ); + ? new TableResultGeommeanEntry(framework.name, framework, value, "#fff", "#000") + : new TableResultGeommeanEntry(framework.name, framework, value, computeColor(value), "#000"); } computeComparison( framework: Framework, _benchmarksCPU: Array, // Remove cause unused - resultsCPUForFramework: Array, + resultsCPUForFramework: Array ): TableResultComparisonEntry { if (!this.compareWith) { - return new TableResultComparisonEntry( - framework.name, - framework, - "", - "#fff", - "#000", - ); + return new TableResultComparisonEntry(framework.name, framework, "", "#fff", "#000"); } let statisticResult: StatisticResult | undefined = undefined; @@ -541,19 +444,14 @@ export class ResultTableData { framework, label, colorsForStatisticResult(statisticResult)[0], - colorsForStatisticResult(statisticResult)[1], + colorsForStatisticResult(statisticResult)[1] ); } computeFactors(benchmark: Benchmark): Array { - const resultsKey = - benchmark.type == BenchmarkType.CPU - ? this.cpuDurationMode - : DEFAULT_RESULTS_KEY; + const resultsKey = benchmark.type == BenchmarkType.CPU ? this.cpuDurationMode : DEFAULT_RESULTS_KEY; - const benchmarkResults = this.frameworksForFactors.map((f) => - this.results(benchmark, f), - ); + const benchmarkResults = this.frameworksForFactors.map((f) => this.results(benchmark, f)); const selectFn = (result: Result | null) => { if (result === null) return 0; if (this.displayMode === DisplayMode.DisplayMedian) { @@ -564,10 +462,9 @@ export class ResultTableData { }; const min = Math.max( benchmarkResults.reduce( - (min, result) => - result === null ? min : Math.min(min, selectFn(result)), - Number.POSITIVE_INFINITY, - ), + (min, result) => (result === null ? min : Math.min(min, selectFn(result))), + Number.POSITIVE_INFINITY + ) ); // if (benchmark.type === BenchmarkType.CPU) { // min = Math.max(1000/60, min); @@ -583,12 +480,8 @@ export class ResultTableData { // factor = Math.max(1, factor); // } const conficenceInterval = - (1.959964 * (resultValues.standardDeviation || 0)) / - Math.sqrt(resultValues.values.length); - const conficenceIntervalStr = - benchmark.type === BenchmarkType.CPU - ? conficenceInterval.toFixed(1) - : null; + (1.959964 * (resultValues.standardDeviation || 0)) / Math.sqrt(resultValues.values.length); + const conficenceIntervalStr = benchmark.type === BenchmarkType.CPU ? conficenceInterval.toFixed(1) : null; const formattedValue = formatEn.format(value); if (!this.compareWith) { @@ -601,7 +494,7 @@ export class ResultTableData { factor.toFixed(2), computeColor(factor), "#000", - StatisticResult.Undecided, + StatisticResult.Undecided ); } @@ -625,8 +518,7 @@ export class ResultTableData { const n2 = resultValues.values.length; const ny = Math.pow(s1_2 / n1 + s2_2 / n2, 2) / - ((s1_2 * s1_2) / (n1 * n1 * (n1 - 1)) + - (s2_2 * s2_2) / (n2 * n2 * (n2 - 1))); + ((s1_2 * s1_2) / (n1 * n1 * (n1 - 1)) + (s2_2 * s2_2) / (n2 * n2 * (n2 - 1))); const t = (x1 - x2) / Math.sqrt(s1_2 / n1 + s2_2 / n2); const p = (1.0 - jStat.studentt.cdf(Math.abs(t), ny)) * 2; @@ -643,7 +535,7 @@ export class ResultTableData { statisticalCol[0], statisticalCol[1], statisticalCol[2], - statisticalResult, + statisticalResult ); }); } diff --git a/webdriver-ts-results/src/assets/icons/CopyIcon.tsx b/webdriver-ts-results/src/assets/icons/CopyIcon.tsx deleted file mode 100644 index 85817431b..000000000 --- a/webdriver-ts-results/src/assets/icons/CopyIcon.tsx +++ /dev/null @@ -1,31 +0,0 @@ -const CopyIcon = () => { - return ( - <> - {/* svg from https://ionic.io/ionicons */} - - - - - - ); -}; - -export default CopyIcon; diff --git a/webdriver-ts-results/src/assets/icons/PasteIcon.tsx b/webdriver-ts-results/src/assets/icons/PasteIcon.tsx deleted file mode 100644 index 8dcf593e5..000000000 --- a/webdriver-ts-results/src/assets/icons/PasteIcon.tsx +++ /dev/null @@ -1,29 +0,0 @@ -const PasteIcon = () => { - return ( - <> - {/* svg from https://ionic.io/ionicons */} - - - - - - ); -}; -export default PasteIcon; diff --git a/webdriver-ts-results/src/assets/icons/index.ts b/webdriver-ts-results/src/assets/icons/index.ts deleted file mode 100644 index 8e4b91cef..000000000 --- a/webdriver-ts-results/src/assets/icons/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import CopyIcon from "./CopyIcon.tsx"; -import PasteIcon from "./PasteIcon.tsx"; - -export { CopyIcon, PasteIcon }; diff --git a/webdriver-ts-results/src/assets/styles/global.css b/webdriver-ts-results/src/assets/styles/global.css new file mode 100644 index 000000000..3d4bb6b01 --- /dev/null +++ b/webdriver-ts-results/src/assets/styles/global.css @@ -0,0 +1,155 @@ +:root { + --border-color: #ccc; +} + +thead.dummy th { + padding: 0; + border: 0; +} +.results__table td.description { + text-align: left; + overflow: visible; + height: 42px; + padding: 0 !important; + border: 0; +} +td > h3 { + position: absolute; + font-size: 16px; + margin: 0px; + padding: 10px; + top: 0; + left: 0; + width: 800px; + height: 40px; + background-color: #fff; +} +td { + text-align: center; +} +.results { + width: 100%; + max-width: 100%; +} +.results__table-container { + overflow-x: auto; +} +.results__table { + font-size: 11px; + width: 150px; + table-layout: fixed; + border-collapse: collapse; +} +.results__table th { + width: 60px; + font-weight: normal; + font-size: 11px; + z-index: 9; + text-align: center; + word-break: normal; + hyphens: auto; + -webkit-hyphens: auto; +} +.results__table th.benchname { + width: 120px; +} +.results__table th, +.results__table td { + padding: 3px; + border: 1px solid #ddd; +} +.results__table th:first-child, +.results__table td:first-child { + position: sticky; + left: 0; + width: 120px; + background-color: white; +} +.results__table th:first-child::before, +.results__table td:not(.description):first-child::before, +.results__table th:first-child::after, +.results__table td:not(.description):first-child::after { + content: ""; + position: absolute; + top: 0; + bottom: 0; + width: 1px; + background-color: #ddd; +} +.results__table th:first-child::before, +.results__table td:first-child::before { + left: -1px; +} +.results__table th:first-child::after, +.results__table td:first-child::after { + right: -1px; +} + +.rowCount { + font-size: 10px; +} + +.deviation { + font-size: 8px; + padding-left: 5px; +} +.deviation::before { + content: "± "; +} + +.factor { + font-size: 8px; +} + +.sort-key { + text-decoration: underline; +} + +dl { + width: 100%; + overflow: hidden; + padding: 0; + margin-bottom: 16px; +} +dt { + float: left; + width: 50px; + padding: 0; + margin: 0; +} +dd { + padding: 0; + margin: 0; +} + +.with-issues { + background-color: #faa; +} + +.button { + cursor: pointer; +} + +.button__text { + color: #00e; + font-size: inherit; + border: none; + background: none; +} + +.button__text:disabled { + color: #666; + font-weight: normal; +} + +.error { + background-color: #f99; +} + +.warning { + background-color: #ff6; +} + +.check-full-width::after { + display: inline-block; +} diff --git a/webdriver-ts-results/src/components/BoxPlotTable/index.ts b/webdriver-ts-results/src/components/BoxPlotTable/index.ts new file mode 100644 index 000000000..1f9db156e --- /dev/null +++ b/webdriver-ts-results/src/components/BoxPlotTable/index.ts @@ -0,0 +1 @@ +export { default } from "./BoxPlotTable"; diff --git a/webdriver-ts-results/src/components/ResultTable.tsx b/webdriver-ts-results/src/components/ResultTable/ResultTable.tsx similarity index 74% rename from webdriver-ts-results/src/components/ResultTable.tsx rename to webdriver-ts-results/src/components/ResultTable/ResultTable.tsx index eab60da24..15c2514c8 100644 --- a/webdriver-ts-results/src/components/ResultTable.tsx +++ b/webdriver-ts-results/src/components/ResultTable/ResultTable.tsx @@ -1,13 +1,13 @@ import React from "react"; -import { DisplayMode, BenchmarkType, FrameworkType, CpuDurationMode } from "../Common"; -import CpuResultsTable from "./tables/CpuResultsTable"; -import MemResultsTable from "./tables/MemResultsTable"; +import { DisplayMode, BenchmarkType, FrameworkType, CpuDurationMode } from "../../Common"; +import CpuResultsTable from "@/components/tables/CpuResultsTable"; +import MemResultsTable from "@/components/tables/MemResultsTable"; // import StartupResultsTable from "./tables/StartupResultsTable"; -import { benchmarks } from "../results"; -import { useRootStore } from "../reducer"; -import SizeResultsTable from "./tables/SizeResultsTable"; +import { benchmarks } from "@/results"; +import { useRootStore } from "@/reducer"; +import SizeResultsTable from "@/components/tables/SizeResultsTable"; -const BoxPlotTable = React.lazy(() => import("./BoxPlotTable/BoxPlotTable")); +const BoxPlotTable = React.lazy(() => import("@/components/BoxPlotTable")); interface Props { type: FrameworkType; @@ -52,13 +52,17 @@ const ResultTable = ({ type }: Props) => {

{texts[type].description}

{cpuDurationMode === CpuDurationMode.Script && ( -

Warning: This is an experimental view that includes script duration only. Don't rely on those values yet and don't report them until they are official. - Report bugs in issue 1233. +

+ Warning: This is an experimental view that includes script duration only. Don't rely on those values + yet and don't report them until they are official. Report bugs in issue{" "} + 1233.

)} {cpuDurationMode === CpuDurationMode.Render && ( -

Warning: This is an experimental view that shows the difference between total duration and script duration. Don't rely on those values yet and don't report them until they are official. - Report bugs in issue 1233. +

+ Warning: This is an experimental view that shows the difference between total duration and script duration. + Don't rely on those values yet and don't report them until they are official. Report bugs in issue{" "} + 1233.

)} {displayMode === DisplayMode.BoxPlot ? ( diff --git a/webdriver-ts-results/src/components/ResultTable/index.ts b/webdriver-ts-results/src/components/ResultTable/index.ts new file mode 100644 index 000000000..eba78ed1f --- /dev/null +++ b/webdriver-ts-results/src/components/ResultTable/index.ts @@ -0,0 +1 @@ +export { default } from "./ResultTable"; diff --git a/webdriver-ts-results/src/components/SelectionToolbar/BenchmarkSelector/BenchmarkSelector.tsx b/webdriver-ts-results/src/components/SelectionToolbar/BenchmarkSelector/BenchmarkSelector.tsx new file mode 100644 index 000000000..cf6b40660 --- /dev/null +++ b/webdriver-ts-results/src/components/SelectionToolbar/BenchmarkSelector/BenchmarkSelector.tsx @@ -0,0 +1,47 @@ +import { BenchmarkType } from "@/Common"; +import BenchmarkSelectorCategory from "./BenchmarkSelectorCategory"; +import { Button, Modal } from "antd"; +import { useState, useEffect } from "react"; + +const content = ( + <> + + + + +); + +const BenchmarkSelector = () => { + console.log("BenchmarkSelector"); + + const [isModalOpen, setIsModalOpen] = useState(false); + + useEffect(() => { + isModalOpen ? (document.body.style.overflow = "hidden") : document.body.style.removeProperty("overflow"); + }, [isModalOpen]); + + const showModal = () => { + setIsModalOpen(true); + }; + + const handleOk = () => { + setIsModalOpen(false); + }; + + const handleCancel = () => { + setIsModalOpen(false); + }; + + return ( + <> + + + {content} + + + ); +}; + +export default BenchmarkSelector; diff --git a/webdriver-ts-results/src/components/selection/BenchmarkSelector/BenchmarkSelectorCategory.tsx b/webdriver-ts-results/src/components/SelectionToolbar/BenchmarkSelector/BenchmarkSelectorCategory.tsx similarity index 60% rename from webdriver-ts-results/src/components/selection/BenchmarkSelector/BenchmarkSelectorCategory.tsx rename to webdriver-ts-results/src/components/SelectionToolbar/BenchmarkSelector/BenchmarkSelectorCategory.tsx index 68e9f55fb..af5de01d8 100644 --- a/webdriver-ts-results/src/components/selection/BenchmarkSelector/BenchmarkSelectorCategory.tsx +++ b/webdriver-ts-results/src/components/SelectionToolbar/BenchmarkSelector/BenchmarkSelectorCategory.tsx @@ -1,8 +1,8 @@ import { BenchmarkType } from "@/Common"; import { useRootStore } from "@/reducer"; -import SelectorContentContainer from "@components/selection/SelectorContentContainer"; +import SelectorContentContainer from "@/components/SelectionToolbar/SelectorContentContainer"; import BenchmarkSelectorList from "./BenchmarkSelectorList"; - +import { Flex } from "antd"; interface Props { label: string; benchmarkType: BenchmarkType; @@ -11,17 +11,11 @@ interface Props { const BenchmarkSelectorCategory = ({ label, benchmarkType }: Props) => { console.log("BenchmarkSelectorCategory"); - const benchmarks = useRootStore( - (state) => state.benchmarkLists[benchmarkType], - ); + const benchmarks = useRootStore((state) => state.benchmarkLists[benchmarkType]); const selectedBenchmarks = useRootStore((state) => state.selectedBenchmarks); const isNoneSelected = useRootStore((state) => state.isNoneBenchmarkSelected); - const areAllSelected = useRootStore( - (state) => state.areAllBenchmarksSelected, - ); - const selectAllBenchmarks = useRootStore( - (state) => state.selectAllBenchmarks, - ); + const areAllSelected = useRootStore((state) => state.areAllBenchmarksSelected); + const selectAllBenchmarks = useRootStore((state) => state.selectAllBenchmarks); const selectBenchmark = useRootStore((state) => state.selectBenchmark); return ( @@ -32,11 +26,13 @@ const BenchmarkSelectorCategory = ({ label, benchmarkType }: Props) => { selectAll={() => selectAllBenchmarks(benchmarkType, true)} label={label} > - selectedBenchmarks.has(benchmark)} - select={(benchmark, add) => selectBenchmark(benchmark, add)} - benchmarks={benchmarks} - /> + + selectedBenchmarks.has(benchmark)} + select={(benchmark, add) => selectBenchmark(benchmark, add)} + benchmarks={benchmarks} + /> + ); }; diff --git a/webdriver-ts-results/src/components/SelectionToolbar/BenchmarkSelector/BenchmarkSelectorList.tsx b/webdriver-ts-results/src/components/SelectionToolbar/BenchmarkSelector/BenchmarkSelectorList.tsx new file mode 100644 index 000000000..8bd67ef0e --- /dev/null +++ b/webdriver-ts-results/src/components/SelectionToolbar/BenchmarkSelector/BenchmarkSelectorList.tsx @@ -0,0 +1,24 @@ +import type { Benchmark } from "@/Common"; +import { Checkbox } from "antd"; + +interface Props { + benchmarks: Array; + isSelected: (benchmark: Benchmark) => boolean; + select: (benchmark: Benchmark, add: boolean) => void; +} + +const BenchmarkSelectorList = ({ benchmarks, isSelected, select }: Props) => { + console.log("BenchmarkSelectorList"); + + return ( + <> + {benchmarks.map((item) => ( + select(item, evt.target.checked)} checked={isSelected(item)}> + {item.label} + + ))} + + ); +}; + +export default BenchmarkSelectorList; diff --git a/webdriver-ts-results/src/components/SelectionToolbar/BenchmarkSelector/index.ts b/webdriver-ts-results/src/components/SelectionToolbar/BenchmarkSelector/index.ts new file mode 100644 index 000000000..d17be63d0 --- /dev/null +++ b/webdriver-ts-results/src/components/SelectionToolbar/BenchmarkSelector/index.ts @@ -0,0 +1 @@ +export { default } from "./BenchmarkSelector"; diff --git a/webdriver-ts-results/src/components/SelectionToolbar/CopyPasteControls/CopyPasteControls.css b/webdriver-ts-results/src/components/SelectionToolbar/CopyPasteControls/CopyPasteControls.css new file mode 100644 index 000000000..52d42074e --- /dev/null +++ b/webdriver-ts-results/src/components/SelectionToolbar/CopyPasteControls/CopyPasteControls.css @@ -0,0 +1,10 @@ +.copy-paste-panel { + gap: 0.5rem; + display: flex; + align-items: center; +} + +.copy-paste-panel__buttons { + display: flex; + gap: 0.5rem; +} diff --git a/webdriver-ts-results/src/components/selection/CopyPasteSelection/index.tsx b/webdriver-ts-results/src/components/SelectionToolbar/CopyPasteControls/CopyPasteControls.tsx similarity index 65% rename from webdriver-ts-results/src/components/selection/CopyPasteSelection/index.tsx rename to webdriver-ts-results/src/components/SelectionToolbar/CopyPasteControls/CopyPasteControls.tsx index 585891fc8..419892e38 100644 --- a/webdriver-ts-results/src/components/selection/CopyPasteSelection/index.tsx +++ b/webdriver-ts-results/src/components/SelectionToolbar/CopyPasteControls/CopyPasteControls.tsx @@ -1,15 +1,14 @@ import { useCallback, useEffect } from "react"; import { useRootStore } from "@/reducer"; -import { CopyIcon, PasteIcon} from "@/assets/icons"; -import "./CopyPasteSelection.css"; +import "./CopyPasteControls.css"; +import { CopyIcon, ClipboardPasteIcon } from "lucide-react"; +import { Button } from "antd"; -const CopyPasteSelection = () => { - console.log("CopyPasteSelection"); +const CopyPasteControls = () => { + console.log("CopyPasteControls"); const state = useRootStore((state) => state); - const setStateFromClipboard = useRootStore( - (state) => state.setStateFromClipboard, - ); + const setStateFromClipboard = useRootStore((state) => state.setStateFromClipboard); const handlePasteError = (error: Error) => { alert("Sorry - couldn't parse pasted selection"); @@ -25,7 +24,7 @@ const CopyPasteSelection = () => { handlePasteError(error as Error); } }, - [setStateFromClipboard], + [setStateFromClipboard] ); const handleClipboardPaste = useCallback( @@ -36,7 +35,7 @@ const CopyPasteSelection = () => { handlePaste(text); } }, - [handlePaste], + [handlePaste] ); useEffect(() => { @@ -48,12 +47,8 @@ const CopyPasteSelection = () => { const copy = () => { const serializedState = { - frameworks: state.frameworks - .filter((f) => state.selectedFrameworks.has(f)) - .map((f) => f.dir), - benchmarks: state.benchmarks - .filter((f) => state.selectedBenchmarks.has(f)) - .map((f) => f.id), + frameworks: state.frameworks.filter((f) => state.selectedFrameworks.has(f)).map((f) => f.dir), + benchmarks: state.benchmarks.filter((f) => state.selectedBenchmarks.has(f)).map((f) => f.id), displayMode: state.displayMode, }; @@ -78,25 +73,17 @@ const CopyPasteSelection = () => { return (
-

Copy/paste current selection

-
- -
+
+ + />
); }; -export default CopyPasteSelection; +export default CopyPasteControls; diff --git a/webdriver-ts-results/src/components/SelectionToolbar/CopyPasteControls/index.ts b/webdriver-ts-results/src/components/SelectionToolbar/CopyPasteControls/index.ts new file mode 100644 index 000000000..987ed6825 --- /dev/null +++ b/webdriver-ts-results/src/components/SelectionToolbar/CopyPasteControls/index.ts @@ -0,0 +1 @@ +export { default } from "./CopyPasteControls"; diff --git a/webdriver-ts-results/src/components/SelectionToolbar/FrameworkSelector/FrameworkSelector.tsx b/webdriver-ts-results/src/components/SelectionToolbar/FrameworkSelector/FrameworkSelector.tsx new file mode 100644 index 000000000..98afc8aa3 --- /dev/null +++ b/webdriver-ts-results/src/components/SelectionToolbar/FrameworkSelector/FrameworkSelector.tsx @@ -0,0 +1,54 @@ +import { FrameworkType } from "@/Common"; +import FrameworkSelectorCategory from "./FrameworkSelectorCategory"; + +import { useState, useEffect } from "react"; +import { Button, Modal } from "antd"; + +const content = ( + <> + + + +); + +const FrameworkSelector = () => { + console.log("FrameworkSelector"); + + const [isModalOpen, setIsModalOpen] = useState(false); + + useEffect(() => { + isModalOpen ? (document.body.style.overflow = "hidden") : document.body.style.removeProperty("overflow"); + }, [isModalOpen]); + + const showModal = () => { + setIsModalOpen(true); + }; + + const handleOk = () => { + setIsModalOpen(false); + }; + + const handleCancel = () => { + setIsModalOpen(false); + }; + + return ( + <> + + + {content} + + + ); +}; + +export default FrameworkSelector; diff --git a/webdriver-ts-results/src/components/selection/FrameworkSelector/FrameworkSelectorCategory.tsx b/webdriver-ts-results/src/components/SelectionToolbar/FrameworkSelector/FrameworkSelectorCategory.tsx similarity index 76% rename from webdriver-ts-results/src/components/selection/FrameworkSelector/FrameworkSelectorCategory.tsx rename to webdriver-ts-results/src/components/SelectionToolbar/FrameworkSelector/FrameworkSelectorCategory.tsx index 6510ef564..0bd229fb5 100644 --- a/webdriver-ts-results/src/components/selection/FrameworkSelector/FrameworkSelectorCategory.tsx +++ b/webdriver-ts-results/src/components/SelectionToolbar/FrameworkSelector/FrameworkSelectorCategory.tsx @@ -1,4 +1,4 @@ -import SelectorContentContainer from "@components/selection/SelectorContentContainer"; +import SelectorContentContainer from "@/components/SelectionToolbar/SelectorContentContainer"; import { FrameworkType } from "@/Common"; import { useRootStore } from "@/reducer"; import FrameworkSelectorList from "./FrameworkSelectorList"; @@ -12,18 +12,12 @@ const FrameworkSelectorCategory = ({ label, frameworkType }: Props) => { console.log("FrameworkSelectorCategory"); const selectedFrameworks = useRootStore((state) => state.selectedFrameworks); - const frameworks = useRootStore( - (state) => state.frameworkLists[frameworkType], - ); + const frameworks = useRootStore((state) => state.frameworkLists[frameworkType]); const isNoneSelected = useRootStore((state) => state.isNoneFrameworkSelected); - const areAllSelected = useRootStore( - (state) => state.areAllFrameworksSelected, - ); + const areAllSelected = useRootStore((state) => state.areAllFrameworksSelected); const selectFramework = useRootStore((state) => state.selectFramework); - const selectAllFrameworks = useRootStore( - (state) => state.selectAllFrameworks, - ); + const selectAllFrameworks = useRootStore((state) => state.selectAllFrameworks); return ( ; @@ -12,21 +13,11 @@ const FrameworkSelectorList = ({ frameworks, isSelected, select }: Props) => { return ( <> {frameworks.map((item) => ( -
- select(item, evt.target.checked)} - checked={isSelected(item)} - /> - -
+ + ))} ); diff --git a/webdriver-ts-results/src/components/SelectionToolbar/FrameworkSelector/index.ts b/webdriver-ts-results/src/components/SelectionToolbar/FrameworkSelector/index.ts new file mode 100644 index 000000000..ab7699de6 --- /dev/null +++ b/webdriver-ts-results/src/components/SelectionToolbar/FrameworkSelector/index.ts @@ -0,0 +1 @@ +export { default } from "./FrameworkSelector"; diff --git a/webdriver-ts-results/src/components/SelectionToolbar/ModeSelectors/DisplayModeSelector.tsx b/webdriver-ts-results/src/components/SelectionToolbar/ModeSelectors/DisplayModeSelector.tsx new file mode 100644 index 000000000..f7a82bd1c --- /dev/null +++ b/webdriver-ts-results/src/components/SelectionToolbar/ModeSelectors/DisplayModeSelector.tsx @@ -0,0 +1,30 @@ +import { DisplayMode } from "@/Common"; +import { Select } from "antd"; + +interface Props { + displayMode: DisplayMode; + onChange: (value: DisplayMode) => void; +} + +const DisplayModeSelector = ({ displayMode, onChange }: Props) => { + return ( +
+ + onChange(value as CpuDurationMode)} + /> +
+ ); +}; + +export default DurationModeSelector; diff --git a/webdriver-ts-results/src/components/SelectionToolbar/ModeSelectors/ModeSelectors.css b/webdriver-ts-results/src/components/SelectionToolbar/ModeSelectors/ModeSelectors.css new file mode 100644 index 000000000..0171a5c56 --- /dev/null +++ b/webdriver-ts-results/src/components/SelectionToolbar/ModeSelectors/ModeSelectors.css @@ -0,0 +1,3 @@ +.mode-selector__label { + margin-right: 0.5rem; +} diff --git a/webdriver-ts-results/src/components/SelectionToolbar/ModeSelectors/ModeSelectors.tsx b/webdriver-ts-results/src/components/SelectionToolbar/ModeSelectors/ModeSelectors.tsx new file mode 100644 index 000000000..f209d02b8 --- /dev/null +++ b/webdriver-ts-results/src/components/SelectionToolbar/ModeSelectors/ModeSelectors.tsx @@ -0,0 +1,30 @@ +import { useRootStore } from "@/reducer"; +import DisplayModeSelector from "./DisplayModeSelector"; +import DurationModeSelector from "./DurationModeSelector"; +import "./ModeSelectors.css"; + +interface Props { + showDurationSelection: boolean; +} + +const ModeSelectors = ({ showDurationSelection }: Props) => { + console.log("ModeSelectors"); + + const displayMode = useRootStore((state) => state.displayMode); + const cpuDurationMode = useRootStore((state) => state.cpuDurationMode); + const selectDisplayMode = useRootStore((state) => state.selectDisplayMode); + const selectCpuDurationMode = useRootStore((state) => state.selectCpuDurationMode); + + return ( + <> +
+ selectDisplayMode(value)} /> +
+ {showDurationSelection ? ( + selectCpuDurationMode(value)} /> + ) : null} + + ); +}; + +export default ModeSelectors; diff --git a/webdriver-ts-results/src/components/SelectionToolbar/ModeSelectors/index.ts b/webdriver-ts-results/src/components/SelectionToolbar/ModeSelectors/index.ts new file mode 100644 index 000000000..4bd262000 --- /dev/null +++ b/webdriver-ts-results/src/components/SelectionToolbar/ModeSelectors/index.ts @@ -0,0 +1 @@ +export { default } from "./ModeSelectors"; diff --git a/webdriver-ts-results/src/components/SelectionToolbar/SelectionToolbar.css b/webdriver-ts-results/src/components/SelectionToolbar/SelectionToolbar.css new file mode 100644 index 000000000..0a99b425e --- /dev/null +++ b/webdriver-ts-results/src/components/SelectionToolbar/SelectionToolbar.css @@ -0,0 +1,20 @@ +.select-toolbar { + background-color: #fafafa; + border-top: 1px solid var(--border-color); + border-bottom: 1px solid var(--border-color); + padding: 0.5rem 0; + gap: 1rem; + display: grid; + grid-template-rows: auto auto auto; +} + +.select-toolbar__actions { + display: flex; + gap: 1rem; +} + +@media screen and (width>=1024px) { + .select-toolbar { + display: flex; + } +} diff --git a/webdriver-ts-results/src/components/SelectionToolbar/SelectionToolbar.tsx b/webdriver-ts-results/src/components/SelectionToolbar/SelectionToolbar.tsx new file mode 100644 index 000000000..d316a5f79 --- /dev/null +++ b/webdriver-ts-results/src/components/SelectionToolbar/SelectionToolbar.tsx @@ -0,0 +1,28 @@ +import BenchmarkSelector from "./BenchmarkSelector"; +import FrameworkSelector from "./FrameworkSelector"; +import ModeSelectors from "./ModeSelectors"; +import CopyPasteControls from "./CopyPasteControls"; +import "./SelectionToolbar.css"; + +interface Props { + showDurationSelection: boolean; +} + +const SelectionToolbar = ({ showDurationSelection }: Props) => { + console.log("SelectionToolbar"); + + return ( +
+
+ + +
+ +
+ +
+
+ ); +}; + +export default SelectionToolbar; diff --git a/webdriver-ts-results/src/components/selection/SelectorContentContainer/index.tsx b/webdriver-ts-results/src/components/SelectionToolbar/SelectorContentContainer/SelectionContentContainer.tsx similarity index 54% rename from webdriver-ts-results/src/components/selection/SelectorContentContainer/index.tsx rename to webdriver-ts-results/src/components/SelectionToolbar/SelectorContentContainer/SelectionContentContainer.tsx index c3f02692f..bb46561a5 100644 --- a/webdriver-ts-results/src/components/selection/SelectorContentContainer/index.tsx +++ b/webdriver-ts-results/src/components/SelectionToolbar/SelectorContentContainer/SelectionContentContainer.tsx @@ -1,5 +1,6 @@ import React from "react"; import "./SelectorContentContainer.css"; +import { Button, Flex } from "antd"; interface Props { children: React.ReactElement; @@ -30,29 +31,19 @@ const SelectorContentContainer = ({ return (
-

{label}

-
- - -
-
- {children} + +

{label}

+
+ + +
+
+
+
{children}
); diff --git a/webdriver-ts-results/src/components/SelectionToolbar/SelectorContentContainer/SelectorContentContainer.css b/webdriver-ts-results/src/components/SelectionToolbar/SelectorContentContainer/SelectorContentContainer.css new file mode 100644 index 000000000..c4408004c --- /dev/null +++ b/webdriver-ts-results/src/components/SelectionToolbar/SelectorContentContainer/SelectorContentContainer.css @@ -0,0 +1,15 @@ +.selector-content-container { + position: relative; +} + +@media screen and (width>= 640px) { + .selector-content-container__content.grid .selector-content-container__content-wrapper { + column-count: 2; + } +} + +@media screen and (width>= 1024px) { + .selector-content-container__content.grid .selector-content-container__content-wrapper { + column-count: 3; + } +} diff --git a/webdriver-ts-results/src/components/SelectionToolbar/SelectorContentContainer/index.ts b/webdriver-ts-results/src/components/SelectionToolbar/SelectorContentContainer/index.ts new file mode 100644 index 000000000..3828386aa --- /dev/null +++ b/webdriver-ts-results/src/components/SelectionToolbar/SelectorContentContainer/index.ts @@ -0,0 +1 @@ +export { default } from "./SelectionContentContainer"; diff --git a/webdriver-ts-results/src/components/SelectionToolbar/index.ts b/webdriver-ts-results/src/components/SelectionToolbar/index.ts new file mode 100644 index 000000000..541947c08 --- /dev/null +++ b/webdriver-ts-results/src/components/SelectionToolbar/index.ts @@ -0,0 +1 @@ +export { default } from "./SelectionToolbar"; diff --git a/webdriver-ts-results/src/components/selection/BenchmarkSelector/BenchmarkSelectorList.tsx b/webdriver-ts-results/src/components/selection/BenchmarkSelector/BenchmarkSelectorList.tsx deleted file mode 100644 index 3166e547b..000000000 --- a/webdriver-ts-results/src/components/selection/BenchmarkSelector/BenchmarkSelectorList.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import type { Benchmark } from "@/Common"; - -interface Props { - benchmarks: Array; - isSelected: (benchmark: Benchmark) => boolean; - select: (benchmark: Benchmark, add: boolean) => void; -} - -const BenchmarkSelectorList = ({ benchmarks, isSelected, select }: Props) => { - console.log("BenchmarkSelectorList"); - - return ( - <> - {benchmarks.map((item) => ( -
-
- select(item, evt.target.checked)} - checked={isSelected(item)} - /> - -
-
- ))} - - ); -}; - -export default BenchmarkSelectorList; diff --git a/webdriver-ts-results/src/components/selection/BenchmarkSelector/index.tsx b/webdriver-ts-results/src/components/selection/BenchmarkSelector/index.tsx deleted file mode 100644 index 0446222ad..000000000 --- a/webdriver-ts-results/src/components/selection/BenchmarkSelector/index.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { BenchmarkType } from "@/Common"; -import Dropdown from "@components/ui/Dropdown"; -import BenchmarkSelectorCategory from "./BenchmarkSelectorCategory"; - -const BenchmarkSelector = () => { - console.log("BenchmarkSelector"); - - return ( - - - - - - ); -}; - -export default BenchmarkSelector; diff --git a/webdriver-ts-results/src/components/selection/CopyPasteSelection/CopyPasteSelection.css b/webdriver-ts-results/src/components/selection/CopyPasteSelection/CopyPasteSelection.css deleted file mode 100644 index 6d8189081..000000000 --- a/webdriver-ts-results/src/components/selection/CopyPasteSelection/CopyPasteSelection.css +++ /dev/null @@ -1,5 +0,0 @@ -.copy-paste-panel { - display: flex; - align-items: center; - gap: 0.75rem; -} diff --git a/webdriver-ts-results/src/components/selection/FrameworkSelector/index.tsx b/webdriver-ts-results/src/components/selection/FrameworkSelector/index.tsx deleted file mode 100644 index 25f656b4d..000000000 --- a/webdriver-ts-results/src/components/selection/FrameworkSelector/index.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { FrameworkType } from "@/Common"; -import Dropdown from "@components/ui/Dropdown"; -import FrameworkSelectorCategory from "./FrameworkSelectorCategory"; - -const FrameworkSelector = () => { - console.log("FrameworkSelector"); - - return ( - - - - - ); -}; - -export default FrameworkSelector; diff --git a/webdriver-ts-results/src/components/selection/ModeSelectionPanel/DisplayModeSelector.tsx b/webdriver-ts-results/src/components/selection/ModeSelectionPanel/DisplayModeSelector.tsx deleted file mode 100644 index 960384ca7..000000000 --- a/webdriver-ts-results/src/components/selection/ModeSelectionPanel/DisplayModeSelector.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { DisplayMode } from "@/Common"; - -interface Props { - displayMode: DisplayMode; - onChange: (value: DisplayMode) => void; -} - -const DisplayModeSelector = ({ displayMode, onChange }: Props) => { - return ( -
- - -
- ); -}; - -export default DisplayModeSelector; diff --git a/webdriver-ts-results/src/components/selection/ModeSelectionPanel/DurationModeSelector.tsx b/webdriver-ts-results/src/components/selection/ModeSelectionPanel/DurationModeSelector.tsx deleted file mode 100644 index 90b001864..000000000 --- a/webdriver-ts-results/src/components/selection/ModeSelectionPanel/DurationModeSelector.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { CpuDurationMode } from "@/Common"; - -interface Props { - cpuDurationMode: CpuDurationMode; - onChange: (value: CpuDurationMode) => void; -} - -const DurationModeSelector = ({ cpuDurationMode, onChange }: Props) => { - return ( -
- - -
- ); -}; - -export default DurationModeSelector; diff --git a/webdriver-ts-results/src/components/selection/ModeSelectionPanel/ModeSelectionPanel.css b/webdriver-ts-results/src/components/selection/ModeSelectionPanel/ModeSelectionPanel.css deleted file mode 100644 index 190e2e660..000000000 --- a/webdriver-ts-results/src/components/selection/ModeSelectionPanel/ModeSelectionPanel.css +++ /dev/null @@ -1,30 +0,0 @@ -.mode-selector { - display: flex; - flex-direction: column; - gap: 0.5rem; -} -.mode-selector__select { - width: fit-content; -} - -@media screen and (width>=425px) { - .mode-selector { - flex-direction: row; - align-items: center; - } -} -@media screen and (width>=640px) { - .mode-selector { - align-items: unset; - } -} -@media screen and (640px <= width <= 768px) { - .mode-selector { - flex-direction: column; - } -} -@media screen and (width>= 768px) { - .mode-selector { - align-items: center; - } -} diff --git a/webdriver-ts-results/src/components/selection/ModeSelectionPanel/index.tsx b/webdriver-ts-results/src/components/selection/ModeSelectionPanel/index.tsx deleted file mode 100644 index 88da7d2da..000000000 --- a/webdriver-ts-results/src/components/selection/ModeSelectionPanel/index.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { useRootStore } from "@/reducer"; -import DisplayModeSelector from "./DisplayModeSelector"; -import DurationModeSelector from "./DurationModeSelector"; -import "./ModeSelectionPanel.css"; - -interface Props { - showDurationSelection: boolean; -} - -const ModeSelecionPanel = ({ showDurationSelection }: Props) => { - console.log("ModeSelector"); - - const displayMode = useRootStore((state) => state.displayMode); - const cpuDurationMode = useRootStore((state) => state.cpuDurationMode); - const selectDisplayMode = useRootStore((state) => state.selectDisplayMode); - const selectCpuDurationMode = useRootStore( - (state) => state.selectCpuDurationMode, - ); - - return ( - <> -
- selectDisplayMode(value)} - /> - -
- {showDurationSelection ? ( - selectCpuDurationMode(value)} - /> - ) : null} - - ); -}; - -export default ModeSelecionPanel; diff --git a/webdriver-ts-results/src/components/selection/SelectionBar/SelectionBar.css b/webdriver-ts-results/src/components/selection/SelectionBar/SelectionBar.css deleted file mode 100644 index 1f993b6d9..000000000 --- a/webdriver-ts-results/src/components/selection/SelectionBar/SelectionBar.css +++ /dev/null @@ -1,25 +0,0 @@ -.select-bar { - background-color: #fafafa; - border-top: 1px solid var(--border-color); - border-bottom: 1px solid var(--border-color); - padding: 10px 0; - line-height: 0; -} -.select-bar__dropdowns { - padding: 5px 0; - display: flex; - flex-direction: row; - gap: 1rem; -} - -@media screen and (width>=640px) { - .select-bar { - flex-direction: unset; - align-items: center; - } -} -@media screen and (width>=768px) { - .select-bar { - align-items: center; - } -} diff --git a/webdriver-ts-results/src/components/selection/SelectionBar/index.tsx b/webdriver-ts-results/src/components/selection/SelectionBar/index.tsx deleted file mode 100644 index 512d1eab3..000000000 --- a/webdriver-ts-results/src/components/selection/SelectionBar/index.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import BenchmarkSelector from "../BenchmarkSelector"; -import FrameworkSelector from "../FrameworkSelector"; -import ModeSelecionPanel from "../ModeSelectionPanel"; -import CopyPasteSelection from "../CopyPasteSelection"; -import "./SelectionBar.css"; - -interface Props { - showDurationSelection: boolean; -} - -const SelectionBar = ({ showDurationSelection }: Props) => { - console.log("SelectionBar"); - - return ( -
-
- - - -
-
- -
-
- ); -}; - -export default SelectionBar; diff --git a/webdriver-ts-results/src/components/selection/SelectorContentContainer/SelectorContentContainer.css b/webdriver-ts-results/src/components/selection/SelectorContentContainer/SelectorContentContainer.css deleted file mode 100644 index 22a44a4c9..000000000 --- a/webdriver-ts-results/src/components/selection/SelectorContentContainer/SelectorContentContainer.css +++ /dev/null @@ -1,13 +0,0 @@ -.selector-content-container { - position: relative; -} - -.selector-content-container__actions { - position: absolute; - top: 10px; - right: 10px; -} - -.selector-content-container__content.grid { - column-count: 3; -} diff --git a/webdriver-ts-results/src/components/tables/CompareRow.tsx b/webdriver-ts-results/src/components/tables/CompareRow.tsx index d3834a229..6c4b50aac 100644 --- a/webdriver-ts-results/src/components/tables/CompareRow.tsx +++ b/webdriver-ts-results/src/components/tables/CompareRow.tsx @@ -1,5 +1,5 @@ -import { Framework, TableResultComparisonEntry } from "../../Common"; -import { useRootStore } from "../../reducer"; +import { Framework, TableResultComparisonEntry } from "@/Common"; +import { useRootStore } from "@/reducer"; interface Props { comparison: Array; diff --git a/webdriver-ts-results/src/components/tables/CpuResultsTable.tsx b/webdriver-ts-results/src/components/tables/CpuResultsTable.tsx index bed3221d9..529a9648b 100644 --- a/webdriver-ts-results/src/components/tables/CpuResultsTable.tsx +++ b/webdriver-ts-results/src/components/tables/CpuResultsTable.tsx @@ -4,7 +4,7 @@ import { SORT_BY_NAME, SORT_BY_GEOMMEAN_CPU, BenchmarkType, -} from "../../Common"; +} from "@/Common"; import GeomMeanRow from "./GeomMeanRow"; import CompareRow from "./CompareRow"; import ValueResultRow from "./ValueResultRow"; diff --git a/webdriver-ts-results/src/components/tables/GeomMeanRow.tsx b/webdriver-ts-results/src/components/tables/GeomMeanRow.tsx index 67f520b98..f9508733f 100644 --- a/webdriver-ts-results/src/components/tables/GeomMeanRow.tsx +++ b/webdriver-ts-results/src/components/tables/GeomMeanRow.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { TableResultGeommeanEntry, T_SORT_BY_GEOMMEAN } from "../../Common"; +import { TableResultGeommeanEntry, T_SORT_BY_GEOMMEAN } from "@/Common"; interface Props { weighted: boolean; diff --git a/webdriver-ts-results/src/components/tables/MemResultsTable.tsx b/webdriver-ts-results/src/components/tables/MemResultsTable.tsx index 6d27d08d9..ea2f4c001 100644 --- a/webdriver-ts-results/src/components/tables/MemResultsTable.tsx +++ b/webdriver-ts-results/src/components/tables/MemResultsTable.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { ResultTableData, SORT_BY_NAME, SORT_BY_GEOMMEAN_MEM, BenchmarkType } from "../../Common"; +import { ResultTableData, SORT_BY_NAME, SORT_BY_GEOMMEAN_MEM, BenchmarkType } from "@/Common"; import ValueResultRow from "./ValueResultRow"; import GeomMeanRow from "./GeomMeanRow"; diff --git a/webdriver-ts-results/src/components/tables/SizeResultsTable.tsx b/webdriver-ts-results/src/components/tables/SizeResultsTable.tsx index db5fdffac..cfafb42b0 100644 --- a/webdriver-ts-results/src/components/tables/SizeResultsTable.tsx +++ b/webdriver-ts-results/src/components/tables/SizeResultsTable.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { ResultTableData, SORT_BY_NAME, BenchmarkType, SORT_BY_GEOMMEAN_SIZE } from "../../Common"; +import { ResultTableData, SORT_BY_NAME, BenchmarkType, SORT_BY_GEOMMEAN_SIZE } from "@/Common"; import ValueResultRow from "./ValueResultRow"; import GeomMeanRow from "./GeomMeanRow"; diff --git a/webdriver-ts-results/src/components/tables/StartupResultsTable.tsx b/webdriver-ts-results/src/components/tables/StartupResultsTable.tsx index b13b84c3b..45da3b26e 100644 --- a/webdriver-ts-results/src/components/tables/StartupResultsTable.tsx +++ b/webdriver-ts-results/src/components/tables/StartupResultsTable.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { ResultTableData, SORT_BY_NAME, SORT_BY_GEOMMEAN_STARTUP, BenchmarkType } from "../../Common"; +import { ResultTableData, SORT_BY_NAME, SORT_BY_GEOMMEAN_STARTUP, BenchmarkType } from "@/Common"; import ValueResultRow from "./ValueResultRow"; import GeomMeanRow from "./GeomMeanRow"; diff --git a/webdriver-ts-results/src/components/tables/ValueResultRow.tsx b/webdriver-ts-results/src/components/tables/ValueResultRow.tsx index a1a85e3fc..8d7db3151 100644 --- a/webdriver-ts-results/src/components/tables/ValueResultRow.tsx +++ b/webdriver-ts-results/src/components/tables/ValueResultRow.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { TableResultValueEntry, Benchmark } from "../../Common"; +import { TableResultValueEntry, Benchmark } from "@/Common"; import ValueCell from "./ValueCell"; interface Props { diff --git a/webdriver-ts-results/src/components/ui/Dropdown/Dropdown.css b/webdriver-ts-results/src/components/ui/Dropdown/Dropdown.css deleted file mode 100644 index 180696941..000000000 --- a/webdriver-ts-results/src/components/ui/Dropdown/Dropdown.css +++ /dev/null @@ -1,43 +0,0 @@ -.dropdown-container { - position: relative; - display: inline-block; -} - -.dropdown-content { - position: absolute; - top: 100%; - display: none; - min-width: 160px; - background-color: #f9f9f9; - box-shadow: 0 2px 4px rgb(0 0 0 / 20%); - z-index: 99; -} - -.dropdown-content.open { - display: block; - background: #fff; - border: 1px solid #ccc; - border-radius: 4px; - box-shadow: 4px 4px 5px 5px rgb(0 0 0 / 20%); - padding: 10px; -} - -.dropdown-button { - transition: all 0.5s; - border: 1px solid #ccc; - border-radius: 4px; - padding: 5px 10px; -} - -.dropdown-button.has-shadow { - box-shadow: 0 0 2px 2px rgb(0 0 0 / 20%); -} - -.dropdown-button > .caret { - width: 10px; - height: 5px; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-top: 5px solid #ccc; - display: inline-block; -} diff --git a/webdriver-ts-results/src/components/ui/Dropdown/index.tsx b/webdriver-ts-results/src/components/ui/Dropdown/index.tsx deleted file mode 100644 index af7d9252b..000000000 --- a/webdriver-ts-results/src/components/ui/Dropdown/index.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import { ReactElement, useEffect, useRef, useState } from "react"; -import "./Dropdown.css"; - -interface Props { - label: string; - children: ReactElement | ReactElement[]; - width: string; -} - -const Dropdown = ({ label, children, width }: Props) => { - const [isOpen, setIsOpen] = useState(false); - const dropdownRef = useRef(null); - - const toggleDropdown = () => { - setIsOpen(!isOpen); - }; - - const handleClickOutside = (event: MouseEvent) => { - if ( - dropdownRef.current && - !dropdownRef.current.contains(event.target as HTMLElement) - ) { - setIsOpen(false); - } - }; - - useEffect(() => { - if (isOpen) { - document.addEventListener("click", handleClickOutside); - } else { - document.removeEventListener("click", handleClickOutside); - } - - return () => { - document.removeEventListener("click", handleClickOutside); - }; - }, [isOpen]); - - return ( -
- -
- {children} -
-
- ); -}; - -export default Dropdown; diff --git a/webdriver-ts-results/src/index.css b/webdriver-ts-results/src/index.css new file mode 100644 index 000000000..d05f5bdcc --- /dev/null +++ b/webdriver-ts-results/src/index.css @@ -0,0 +1,18 @@ +*, +::before, +::after { + box-sizing: border-box; +} + +body { + font-family: Helvetica, Arial, sans-serif; + font-size: 14px; + margin: 0; + padding: 0.5rem; +} + +a, +a:active, +a:hover { + text-decoration: none; +} diff --git a/webdriver-ts-results/src/index.tsx b/webdriver-ts-results/src/index.tsx index 9c24325eb..fd245f361 100644 --- a/webdriver-ts-results/src/index.tsx +++ b/webdriver-ts-results/src/index.tsx @@ -2,8 +2,11 @@ import React from "react"; import App from "./App.tsx"; import { createRoot } from "react-dom/client"; +import "./index.css"; +import "./assets/styles/global.css"; + createRoot(document.getElementById("root")!).render( - , + ); diff --git a/webdriver-ts-results/src/reducer.ts b/webdriver-ts-results/src/reducer.ts index 8c6c816be..89184b469 100644 --- a/webdriver-ts-results/src/reducer.ts +++ b/webdriver-ts-results/src/reducer.ts @@ -1,10 +1,6 @@ import { create } from "zustand"; import { jStat } from "jstat"; -import { - frameworks, - benchmarks as rawBenchmarks, - results as rawResults, -} from "./results"; +import { frameworks, benchmarks as rawBenchmarks, results as rawResults } from "./results"; import { Benchmark, BenchmarkType, @@ -18,7 +14,7 @@ import { ResultValues, CpuDurationMode, knownIssues, -} from "./Common"; +} from "@/Common"; const benchmarks = rawBenchmarks; @@ -39,10 +35,8 @@ const results: Result[] = rawResults.map((result) => { }); const removeKeyedSuffix = (value: string) => { - if (value.endsWith("-non-keyed")) - return value.substring(0, value.length - 10); - else if (value.endsWith("-keyed")) - return value.substring(0, value.length - 6); + if (value.endsWith("-non-keyed")) return value.substring(0, value.length - 10); + else if (value.endsWith("-keyed")) return value.substring(0, value.length - 6); return value; }; @@ -129,7 +123,7 @@ function updateResultTable({ displayMode, compareWith[FrameworkType.KEYED], categories, - cpuDurationMode, + cpuDurationMode ), [FrameworkType.NON_KEYED]: new ResultTableData( frameworks, @@ -142,7 +136,7 @@ function updateResultTable({ displayMode, compareWith[FrameworkType.NON_KEYED], categories, - cpuDurationMode, + cpuDurationMode ), }; } @@ -180,18 +174,12 @@ const preInitialState: State = { benchmarkLists: { [BenchmarkType.CPU]: benchmarks.filter((b) => b.type === BenchmarkType.CPU), [BenchmarkType.MEM]: benchmarks.filter((b) => b.type === BenchmarkType.MEM), - [BenchmarkType.STARTUP]: benchmarks.filter( - (b) => b.type === BenchmarkType.STARTUP, - ), + [BenchmarkType.STARTUP]: benchmarks.filter((b) => b.type === BenchmarkType.STARTUP), }, frameworks: mappedFrameworks, frameworkLists: { - [FrameworkType.KEYED]: mappedFrameworks.filter( - (f) => f.type === FrameworkType.KEYED, - ), - [FrameworkType.NON_KEYED]: mappedFrameworks.filter( - (f) => f.type === FrameworkType.NON_KEYED, - ), + [FrameworkType.KEYED]: mappedFrameworks.filter((f) => f.type === FrameworkType.KEYED), + [FrameworkType.NON_KEYED]: mappedFrameworks.filter((f) => f.type === FrameworkType.NON_KEYED), }, // dynamic selectedBenchmarks: allBenchmarks, @@ -219,32 +207,22 @@ export const useRootStore = create((set, get) => ({ ...initialState, // Getters areAllBenchmarksSelected: (type) => { - return get().benchmarkLists[type].every((benchmark) => - get().selectedBenchmarks.has(benchmark), - ); + return get().benchmarkLists[type].every((benchmark) => get().selectedBenchmarks.has(benchmark)); }, isNoneBenchmarkSelected: (type) => { - return get().benchmarkLists[type].every( - (benchmark) => !get().selectedBenchmarks.has(benchmark), - ); + return get().benchmarkLists[type].every((benchmark) => !get().selectedBenchmarks.has(benchmark)); }, areAllFrameworksSelected: (type) => { - return get().frameworkLists[type].every((framework) => - get().selectedFrameworks.has(framework), - ); + return get().frameworkLists[type].every((framework) => get().selectedFrameworks.has(framework)); }, isNoneFrameworkSelected: (type) => { - return get().frameworkLists[type].every( - (framework) => !get().selectedFrameworks.has(framework), - ); + return get().frameworkLists[type].every((framework) => !get().selectedFrameworks.has(framework)); }, // Actions selectFramework: (framework: Framework, add: boolean) => { const newSelectedFramework = new Set(get().selectedFrameworks); - add - ? newSelectedFramework.add(framework) - : newSelectedFramework.delete(framework); + add ? newSelectedFramework.add(framework) : newSelectedFramework.delete(framework); const t = { ...get(), selectedFrameworks: newSelectedFramework }; return set(() => ({ ...t, resultTables: updateResultTable(t) })); @@ -257,9 +235,7 @@ export const useRootStore = create((set, get) => ({ : get().frameworkLists[FrameworkType.NON_KEYED]; for (const framework of frameworks) { - add - ? newSelectedFramework.add(framework) - : newSelectedFramework.delete(framework); + add ? newSelectedFramework.add(framework) : newSelectedFramework.delete(framework); } const t = { ...get(), selectedFrameworks: newSelectedFramework }; @@ -282,9 +258,7 @@ export const useRootStore = create((set, get) => ({ selectBenchmark: (benchmark: Benchmark, add: boolean) => { const newSelectedBenchmark = new Set(get().selectedBenchmarks); - add - ? newSelectedBenchmark.add(benchmark) - : newSelectedBenchmark.delete(benchmark); + add ? newSelectedBenchmark.add(benchmark) : newSelectedBenchmark.delete(benchmark); const t = { ...get(), selectedBenchmarks: newSelectedBenchmark }; return set(() => ({ @@ -297,9 +271,7 @@ export const useRootStore = create((set, get) => ({ const benchmarks = get().benchmarkLists[benchmarkType]; for (const benchmark of benchmarks) { - add - ? newSelectedBenchmark.add(benchmark) - : newSelectedBenchmark.delete(benchmark); + add ? newSelectedBenchmark.add(benchmark) : newSelectedBenchmark.delete(benchmark); } const t = { ...get(), selectedBenchmarks: newSelectedBenchmark }; diff --git a/webdriver-ts-results/tsconfig.json b/webdriver-ts-results/tsconfig.json index b3eccb457..8dfc7fb49 100644 --- a/webdriver-ts-results/tsconfig.json +++ b/webdriver-ts-results/tsconfig.json @@ -14,15 +14,14 @@ "jsx": "react-jsx", "baseUrl": ".", "paths": { - "@/*": ["./src/*"], - "@components/*": ["./src/components/*"], + "@/*": ["./src/*"] }, /* Linting */ "strict": true, "noUnusedLocals": true, "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, + "noFallthroughCasesInSwitch": true }, "include": ["src"], "references": [{ "path": "./tsconfig.node.json" }]