diff --git a/package-lock.json b/package-lock.json
index 0c81a3b..86e9027 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,24 +8,14 @@
"name": "mantis-material-react",
"version": "2.1.0",
"dependencies": {
- "@ant-design/colors": "^7.0.0",
"@ant-design/icons": "^5.0.1",
"@astryxdesign/core": "^0.1.9",
"@astryxdesign/theme-neutral": "^0.1.9",
- "@emotion/cache": "^11.10.7",
- "@emotion/react": "^11.10.6",
- "@emotion/styled": "^11.10.6",
- "@mui/base": "^5.0.0-beta.70",
- "@mui/icons-material": "^5.14.19",
- "@mui/lab": "^5.0.0-alpha.127",
- "@mui/material": "^5.12.1",
- "@mui/x-date-pickers": "^7.29.4",
"@reduxjs/toolkit": "^2.12.0",
"@stylexjs/stylex": "^0.19.0",
"@svgr/webpack": "^7.0.0",
"@tanstack/react-query": "^5.101.4",
- "antd": "^5.11.5",
- "autosuggest-highlight": "^3.3.4",
+ "@tanstack/react-table": "^9.1.2",
"axios": "^1.3.5",
"buffer": "^6.0.3",
"chance": "^1.1.11",
@@ -65,7 +55,6 @@
"simplebar": "^6.2.5",
"simplebar-react": "^3.2.4",
"stream-browserify": "^3.0.0",
- "stylis-plugin-rtl": "^2.1.1",
"use-debounce": "^10.0.5",
"util": "^0.12.5",
"web-vitals": "^3.3.1",
@@ -112,52 +101,6 @@
"@ant-design/fast-color": "^2.0.6"
}
},
- "node_modules/@ant-design/cssinjs": {
- "version": "1.23.0",
- "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.23.0.tgz",
- "integrity": "sha512-7GAg9bD/iC9ikWatU9ym+P9ugJhi/WbsTWzcKN6T4gU0aehsprtke1UAaaSxxkjjmkJb3llet/rbUSLPgwlY4w==",
- "license": "MIT",
- "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.3.4"
- },
- "peerDependencies": {
- "react": ">=16.0.0",
- "react-dom": ">=16.0.0"
- }
- },
- "node_modules/@ant-design/cssinjs-utils": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@ant-design/cssinjs-utils/-/cssinjs-utils-1.1.3.tgz",
- "integrity": "sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg==",
- "license": "MIT",
- "dependencies": {
- "@ant-design/cssinjs": "^1.21.0",
- "@babel/runtime": "^7.23.2",
- "rc-util": "^5.38.0"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
- }
- },
- "node_modules/@ant-design/cssinjs/node_modules/@emotion/hash": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz",
- "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==",
- "license": "MIT"
- },
- "node_modules/@ant-design/cssinjs/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==",
- "license": "MIT"
- },
"node_modules/@ant-design/fast-color": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-2.0.6.tgz",
@@ -196,22 +139,6 @@
"integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==",
"license": "MIT"
},
- "node_modules/@ant-design/react-slick": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.1.2.tgz",
- "integrity": "sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==",
- "license": "MIT",
- "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/@astryxdesign/core": {
"version": "0.1.9",
"resolved": "https://registry.npmjs.org/@astryxdesign/core/-/core-0.1.9.tgz",
@@ -2597,182 +2524,6 @@
"postcss-selector-parser": "^6.0.10"
}
},
- "node_modules/@emotion/babel-plugin": {
- "version": "11.10.6",
- "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz",
- "integrity": "sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-imports": "^7.16.7",
- "@babel/runtime": "^7.18.3",
- "@emotion/hash": "^0.9.0",
- "@emotion/memoize": "^0.8.0",
- "@emotion/serialize": "^1.1.1",
- "babel-plugin-macros": "^3.1.0",
- "convert-source-map": "^1.5.0",
- "escape-string-regexp": "^4.0.0",
- "find-root": "^1.1.0",
- "source-map": "^0.5.7",
- "stylis": "4.1.3"
- }
- },
- "node_modules/@emotion/babel-plugin/node_modules/@emotion/memoize": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz",
- "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==",
- "license": "MIT"
- },
- "node_modules/@emotion/babel-plugin/node_modules/stylis": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz",
- "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==",
- "license": "MIT"
- },
- "node_modules/@emotion/cache": {
- "version": "11.14.0",
- "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz",
- "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==",
- "license": "MIT",
- "dependencies": {
- "@emotion/memoize": "^0.9.0",
- "@emotion/sheet": "^1.4.0",
- "@emotion/utils": "^1.4.2",
- "@emotion/weak-memoize": "^0.4.0",
- "stylis": "4.2.0"
- }
- },
- "node_modules/@emotion/cache/node_modules/stylis": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
- "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==",
- "license": "MIT"
- },
- "node_modules/@emotion/hash": {
- "version": "0.9.2",
- "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz",
- "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==",
- "license": "MIT"
- },
- "node_modules/@emotion/is-prop-valid": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz",
- "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==",
- "license": "MIT",
- "dependencies": {
- "@emotion/memoize": "^0.8.0"
- }
- },
- "node_modules/@emotion/is-prop-valid/node_modules/@emotion/memoize": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz",
- "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==",
- "license": "MIT"
- },
- "node_modules/@emotion/memoize": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz",
- "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==",
- "license": "MIT"
- },
- "node_modules/@emotion/react": {
- "version": "11.10.6",
- "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz",
- "integrity": "sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.18.3",
- "@emotion/babel-plugin": "^11.10.6",
- "@emotion/cache": "^11.10.5",
- "@emotion/serialize": "^1.1.1",
- "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0",
- "@emotion/utils": "^1.2.0",
- "@emotion/weak-memoize": "^0.3.0",
- "hoist-non-react-statics": "^3.3.1"
- },
- "peerDependencies": {
- "react": ">=16.8.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@emotion/react/node_modules/@emotion/weak-memoize": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz",
- "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==",
- "license": "MIT"
- },
- "node_modules/@emotion/serialize": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz",
- "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==",
- "license": "MIT",
- "dependencies": {
- "@emotion/hash": "^0.9.2",
- "@emotion/memoize": "^0.9.0",
- "@emotion/unitless": "^0.10.0",
- "@emotion/utils": "^1.4.2",
- "csstype": "^3.0.2"
- }
- },
- "node_modules/@emotion/sheet": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz",
- "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==",
- "license": "MIT"
- },
- "node_modules/@emotion/styled": {
- "version": "11.10.6",
- "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.6.tgz",
- "integrity": "sha512-OXtBzOmDSJo5Q0AFemHCfl+bUueT8BIcPSxu0EGTpGk6DmI5dnhSzQANm1e1ze0YZL7TDyAyy6s/b/zmGOS3Og==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.18.3",
- "@emotion/babel-plugin": "^11.10.6",
- "@emotion/is-prop-valid": "^1.2.0",
- "@emotion/serialize": "^1.1.1",
- "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0",
- "@emotion/utils": "^1.2.0"
- },
- "peerDependencies": {
- "@emotion/react": "^11.0.0-rc.0",
- "react": ">=16.8.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@emotion/unitless": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz",
- "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==",
- "license": "MIT"
- },
- "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz",
- "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==",
- "license": "MIT",
- "peerDependencies": {
- "react": ">=16.8.0"
- }
- },
- "node_modules/@emotion/utils": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz",
- "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==",
- "license": "MIT"
- },
- "node_modules/@emotion/weak-memoize": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz",
- "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==",
- "license": "MIT"
- },
"node_modules/@eslint-community/eslint-utils": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
@@ -3431,44 +3182,6 @@
"integrity": "sha512-jmEnr/pk0yVkA7mIlHNnxCi+wWzOFUg0WyIotgkKAb2u1J7fAeDBcVNSTjTihbAYNusCLQdW5s9IJ5qwnEufcQ==",
"license": "Apache-2.0"
},
- "node_modules/@floating-ui/core": {
- "version": "1.6.9",
- "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz",
- "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==",
- "license": "MIT",
- "dependencies": {
- "@floating-ui/utils": "^0.2.9"
- }
- },
- "node_modules/@floating-ui/dom": {
- "version": "1.6.13",
- "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz",
- "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==",
- "license": "MIT",
- "dependencies": {
- "@floating-ui/core": "^1.6.0",
- "@floating-ui/utils": "^0.2.9"
- }
- },
- "node_modules/@floating-ui/react-dom": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz",
- "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==",
- "license": "MIT",
- "dependencies": {
- "@floating-ui/dom": "^1.0.0"
- },
- "peerDependencies": {
- "react": ">=16.8.0",
- "react-dom": ">=16.8.0"
- }
- },
- "node_modules/@floating-ui/utils": {
- "version": "0.2.9",
- "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz",
- "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==",
- "license": "MIT"
- },
"node_modules/@formatjs/ecma402-abstract": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.6.tgz",
@@ -4196,543 +3909,6 @@
"integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==",
"license": "MIT"
},
- "node_modules/@mui/base": {
- "version": "5.0.0-beta.70",
- "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.70.tgz",
- "integrity": "sha512-Tb/BIhJzb0pa5zv/wu7OdokY9ZKEDqcu1BDFnohyvGCoHuSXbEr90rPq1qeNW3XvTBIbNWHEF7gqge+xpUo6tQ==",
- "deprecated": "This package has been replaced by @base-ui/react",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.26.0",
- "@floating-ui/react-dom": "^2.1.1",
- "@mui/types": "~7.2.24",
- "@mui/utils": "^6.4.8",
- "@popperjs/core": "^2.11.8",
- "clsx": "^2.1.1",
- "prop-types": "^15.8.1"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- },
- "peerDependencies": {
- "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/core-downloads-tracker": {
- "version": "5.16.14",
- "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.14.tgz",
- "integrity": "sha512-sbjXW+BBSvmzn61XyTMun899E7nGPTXwqD9drm1jBUAvWEhJpPFIRxwQQiATWZnd9rvdxtnhhdsDxEGWI0jxqA==",
- "license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- }
- },
- "node_modules/@mui/icons-material": {
- "version": "5.16.14",
- "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.16.14.tgz",
- "integrity": "sha512-heL4S+EawrP61xMXBm59QH6HODsu0gxtZi5JtnXF2r+rghzyU/3Uftlt1ij8rmJh+cFdKTQug1L9KkZB5JgpMQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.23.9"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- },
- "peerDependencies": {
- "@mui/material": "^5.0.0",
- "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/lab": {
- "version": "5.0.0-alpha.175",
- "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.175.tgz",
- "integrity": "sha512-AvM0Nvnnj7vHc9+pkkQkoE1i+dEbr6gsMdnSfy7X4w3Ljgcj1yrjZhIt3jGTCLzyKVLa6uve5eLluOcGkvMqUA==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.23.9",
- "@mui/base": "5.0.0-beta.40-0",
- "@mui/system": "^5.16.12",
- "@mui/types": "^7.2.15",
- "@mui/utils": "^5.16.12",
- "clsx": "^2.1.0",
- "prop-types": "^15.8.1"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- },
- "peerDependencies": {
- "@emotion/react": "^11.5.0",
- "@emotion/styled": "^11.3.0",
- "@mui/material": ">=5.15.0",
- "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@emotion/react": {
- "optional": true
- },
- "@emotion/styled": {
- "optional": true
- },
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/lab/node_modules/@mui/base": {
- "version": "5.0.0-beta.40-0",
- "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40-0.tgz",
- "integrity": "sha512-hG3atoDUxlvEy+0mqdMpWd04wca8HKr2IHjW/fAjlkCHQolSLazhZM46vnHjOf15M4ESu25mV/3PgjczyjVM4w==",
- "deprecated": "This package has been replaced by @base-ui-components/react",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.23.9",
- "@floating-ui/react-dom": "^2.0.8",
- "@mui/types": "^7.2.15",
- "@mui/utils": "^5.16.12",
- "@popperjs/core": "^2.11.8",
- "clsx": "^2.1.0",
- "prop-types": "^15.8.1"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- },
- "peerDependencies": {
- "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/lab/node_modules/@mui/utils": {
- "version": "5.16.14",
- "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.14.tgz",
- "integrity": "sha512-wn1QZkRzSmeXD1IguBVvJJHV3s6rxJrfb6YuC9Kk6Noh9f8Fb54nUs5JRkKm+BOerRhj5fLg05Dhx/H3Ofb8Mg==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.23.9",
- "@mui/types": "^7.2.15",
- "@types/prop-types": "^15.7.12",
- "clsx": "^2.1.1",
- "prop-types": "^15.8.1",
- "react-is": "^19.0.0"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- },
- "peerDependencies": {
- "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/material": {
- "version": "5.16.14",
- "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.16.14.tgz",
- "integrity": "sha512-eSXQVCMKU2xc7EcTxe/X/rC9QsV2jUe8eLM3MUCPYbo6V52eCE436akRIvELq/AqZpxx2bwkq7HC0cRhLB+yaw==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.23.9",
- "@mui/core-downloads-tracker": "^5.16.14",
- "@mui/system": "^5.16.14",
- "@mui/types": "^7.2.15",
- "@mui/utils": "^5.16.14",
- "@popperjs/core": "^2.11.8",
- "@types/react-transition-group": "^4.4.10",
- "clsx": "^2.1.0",
- "csstype": "^3.1.3",
- "prop-types": "^15.8.1",
- "react-is": "^19.0.0",
- "react-transition-group": "^4.4.5"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- },
- "peerDependencies": {
- "@emotion/react": "^11.5.0",
- "@emotion/styled": "^11.3.0",
- "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@emotion/react": {
- "optional": true
- },
- "@emotion/styled": {
- "optional": true
- },
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/material/node_modules/@mui/utils": {
- "version": "5.16.14",
- "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.14.tgz",
- "integrity": "sha512-wn1QZkRzSmeXD1IguBVvJJHV3s6rxJrfb6YuC9Kk6Noh9f8Fb54nUs5JRkKm+BOerRhj5fLg05Dhx/H3Ofb8Mg==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.23.9",
- "@mui/types": "^7.2.15",
- "@types/prop-types": "^15.7.12",
- "clsx": "^2.1.1",
- "prop-types": "^15.8.1",
- "react-is": "^19.0.0"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- },
- "peerDependencies": {
- "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/private-theming": {
- "version": "5.16.14",
- "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.14.tgz",
- "integrity": "sha512-12t7NKzvYi819IO5IapW2BcR33wP/KAVrU8d7gLhGHoAmhDxyXlRoKiRij3TOD8+uzk0B6R9wHUNKi4baJcRNg==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.23.9",
- "@mui/utils": "^5.16.14",
- "prop-types": "^15.8.1"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- },
- "peerDependencies": {
- "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/private-theming/node_modules/@mui/utils": {
- "version": "5.16.14",
- "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.14.tgz",
- "integrity": "sha512-wn1QZkRzSmeXD1IguBVvJJHV3s6rxJrfb6YuC9Kk6Noh9f8Fb54nUs5JRkKm+BOerRhj5fLg05Dhx/H3Ofb8Mg==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.23.9",
- "@mui/types": "^7.2.15",
- "@types/prop-types": "^15.7.12",
- "clsx": "^2.1.1",
- "prop-types": "^15.8.1",
- "react-is": "^19.0.0"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- },
- "peerDependencies": {
- "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/styled-engine": {
- "version": "5.16.14",
- "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.14.tgz",
- "integrity": "sha512-UAiMPZABZ7p8mUW4akDV6O7N3+4DatStpXMZwPlt+H/dA0lt67qawN021MNND+4QTpjaiMYxbhKZeQcyWCbuKw==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.23.9",
- "@emotion/cache": "^11.13.5",
- "csstype": "^3.1.3",
- "prop-types": "^15.8.1"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- },
- "peerDependencies": {
- "@emotion/react": "^11.4.1",
- "@emotion/styled": "^11.3.0",
- "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@emotion/react": {
- "optional": true
- },
- "@emotion/styled": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/system": {
- "version": "5.16.14",
- "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.14.tgz",
- "integrity": "sha512-KBxMwCb8mSIABnKvoGbvM33XHyT+sN0BzEBG+rsSc0lLQGzs7127KWkCA6/H8h6LZ00XpBEME5MAj8mZLiQ1tw==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.23.9",
- "@mui/private-theming": "^5.16.14",
- "@mui/styled-engine": "^5.16.14",
- "@mui/types": "^7.2.15",
- "@mui/utils": "^5.16.14",
- "clsx": "^2.1.0",
- "csstype": "^3.1.3",
- "prop-types": "^15.8.1"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- },
- "peerDependencies": {
- "@emotion/react": "^11.5.0",
- "@emotion/styled": "^11.3.0",
- "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@emotion/react": {
- "optional": true
- },
- "@emotion/styled": {
- "optional": true
- },
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/system/node_modules/@mui/utils": {
- "version": "5.16.14",
- "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.14.tgz",
- "integrity": "sha512-wn1QZkRzSmeXD1IguBVvJJHV3s6rxJrfb6YuC9Kk6Noh9f8Fb54nUs5JRkKm+BOerRhj5fLg05Dhx/H3Ofb8Mg==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.23.9",
- "@mui/types": "^7.2.15",
- "@types/prop-types": "^15.7.12",
- "clsx": "^2.1.1",
- "prop-types": "^15.8.1",
- "react-is": "^19.0.0"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- },
- "peerDependencies": {
- "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/types": {
- "version": "7.2.24",
- "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.24.tgz",
- "integrity": "sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/utils": {
- "version": "6.4.9",
- "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.4.9.tgz",
- "integrity": "sha512-Y12Q9hbK9g+ZY0T3Rxrx9m2m10gaphDuUMgWxyV5kNJevVxXYCLclYUCC9vXaIk1/NdNDTcW2Yfr2OGvNFNmHg==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.26.0",
- "@mui/types": "~7.2.24",
- "@types/prop-types": "^15.7.14",
- "clsx": "^2.1.1",
- "prop-types": "^15.8.1",
- "react-is": "^19.0.0"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- },
- "peerDependencies": {
- "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/x-date-pickers": {
- "version": "7.29.4",
- "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.29.4.tgz",
- "integrity": "sha512-wJ3tsqk/y6dp+mXGtT9czciAMEO5Zr3IIAHg9x6IL0Eqanqy0N3chbmQQZv3iq0m2qUpQDLvZ4utZBUTJdjNzw==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.25.7",
- "@mui/utils": "^5.16.6 || ^6.0.0 || ^7.0.0",
- "@mui/x-internals": "7.29.0",
- "@types/react-transition-group": "^4.4.11",
- "clsx": "^2.1.1",
- "prop-types": "^15.8.1",
- "react-transition-group": "^4.4.5"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- },
- "peerDependencies": {
- "@emotion/react": "^11.9.0",
- "@emotion/styled": "^11.8.1",
- "@mui/material": "^5.15.14 || ^6.0.0 || ^7.0.0",
- "@mui/system": "^5.15.14 || ^6.0.0 || ^7.0.0",
- "date-fns": "^2.25.0 || ^3.2.0 || ^4.0.0",
- "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0 || ^4.0.0-0",
- "dayjs": "^1.10.7",
- "luxon": "^3.0.2",
- "moment": "^2.29.4",
- "moment-hijri": "^2.1.2 || ^3.0.0",
- "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0",
- "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
- "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
- },
- "peerDependenciesMeta": {
- "@emotion/react": {
- "optional": true
- },
- "@emotion/styled": {
- "optional": true
- },
- "date-fns": {
- "optional": true
- },
- "date-fns-jalali": {
- "optional": true
- },
- "dayjs": {
- "optional": true
- },
- "luxon": {
- "optional": true
- },
- "moment": {
- "optional": true
- },
- "moment-hijri": {
- "optional": true
- },
- "moment-jalaali": {
- "optional": true
- }
- }
- },
- "node_modules/@mui/x-internals": {
- "version": "7.29.0",
- "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.29.0.tgz",
- "integrity": "sha512-+Gk6VTZIFD70XreWvdXBwKd8GZ2FlSCuecQFzm6znwqXg1ZsndavrhG9tkxpxo2fM1Zf7Tk8+HcOO0hCbhTQFA==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.25.7",
- "@mui/utils": "^5.16.6 || ^6.0.0 || ^7.0.0"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- },
- "peerDependencies": {
- "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
- }
- },
"node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
"version": "5.1.1-v1",
"resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz",
@@ -4846,16 +4022,6 @@
"node": ">= 8"
}
},
- "node_modules/@popperjs/core": {
- "version": "2.11.8",
- "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
- "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
- "license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/popperjs"
- }
- },
"node_modules/@protobufjs/aspromise": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
@@ -4920,155 +4086,6 @@
"integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==",
"license": "BSD-3-Clause"
},
- "node_modules/@rc-component/async-validator": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.0.4.tgz",
- "integrity": "sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.24.4"
- },
- "engines": {
- "node": ">=14.x"
- }
- },
- "node_modules/@rc-component/color-picker": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-2.0.1.tgz",
- "integrity": "sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==",
- "license": "MIT",
- "dependencies": {
- "@ant-design/fast-color": "^2.0.6",
- "@babel/runtime": "^7.23.6",
- "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==",
- "license": "MIT",
- "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==",
- "license": "MIT",
- "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==",
- "license": "MIT",
- "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==",
- "license": "MIT",
- "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/qrcode": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.0.0.tgz",
- "integrity": "sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.24.7",
- "classnames": "^2.3.2",
- "rc-util": "^5.38.0"
- },
- "engines": {
- "node": ">=8.x"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
- }
- },
- "node_modules/@rc-component/tour": {
- "version": "1.15.1",
- "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.15.1.tgz",
- "integrity": "sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.18.0",
- "@rc-component/portal": "^1.0.0-9",
- "@rc-component/trigger": "^2.0.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/trigger": {
- "version": "2.2.6",
- "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.2.6.tgz",
- "integrity": "sha512-/9zuTnWwhQ3S3WT1T8BubuFTT46kvnXgaERR9f4BTKyn61/wpf/BvbImzYBubzJibU707FxwbKszLlHjcLiv1Q==",
- "license": "MIT",
- "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.44.0"
- },
- "engines": {
- "node": ">=8.x"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
- }
- },
"node_modules/@react-dnd/asap": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-5.0.2.tgz",
@@ -5572,6 +4589,70 @@
"react": "^18 || ^19"
}
},
+ "node_modules/@tanstack/react-store": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.11.1.tgz",
+ "integrity": "sha512-HaIGKI3YLmjBYIvy5DFDY23oNaYZIsTZfngey07Uh5iLVJgM3bIGCnZeOFOqzjFld9JHWcaHJnasD/bKoGKwJQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@tanstack/store": "0.11.1",
+ "use-sync-external-store": "^1.6.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@tanstack/react-table": {
+ "version": "9.1.2",
+ "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-9.1.2.tgz",
+ "integrity": "sha512-YQPZFJ1nIi/bjjwsPZVouABgahDcl7Gdm33CdTStUJBn0DjEVJ2uhSTVmIoWt9MVKdQziXGAsXipSzy949Hygg==",
+ "license": "MIT",
+ "dependencies": {
+ "@tanstack/react-store": "^0.11.0",
+ "@tanstack/table-core": "9.1.2"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ },
+ "peerDependencies": {
+ "react": ">=18"
+ }
+ },
+ "node_modules/@tanstack/store": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/@tanstack/store/-/store-0.11.1.tgz",
+ "integrity": "sha512-mzTOBhypOuDJAy/D8n2MfUZ1HFkXnmSETviRyhqEC8LUE7/IZQExOTxMANj3KjTofYTkFNpBY67qaVrT41YccA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ }
+ },
+ "node_modules/@tanstack/table-core": {
+ "version": "9.1.2",
+ "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-9.1.2.tgz",
+ "integrity": "sha512-ONpWQeass1sfg80CWF1NSwQ8r3GiqxA2lT/EdqIcrDEPZ0Z+0mM94eQoFYLPN0Kztzj8TQVb2+PrSZSItqA61g==",
+ "license": "MIT",
+ "dependencies": {
+ "@tanstack/store": "^0.11.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/tannerlinsley"
+ }
+ },
"node_modules/@tootallnate/once": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
@@ -5864,15 +4945,6 @@
"csstype": "^3.0.2"
}
},
- "node_modules/@types/react-transition-group": {
- "version": "4.4.12",
- "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz",
- "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==",
- "license": "MIT",
- "peerDependencies": {
- "@types/react": "*"
- }
- },
"node_modules/@types/resolve": {
"version": "1.17.1",
"resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
@@ -6633,71 +5705,6 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/antd": {
- "version": "5.24.2",
- "resolved": "https://registry.npmjs.org/antd/-/antd-5.24.2.tgz",
- "integrity": "sha512-7Z9HsE3ZIK3sE/WuUqii3w7Gl1IJuRL21sDUTtkN95JS5KhRYP8ISv7m/HxsJ3Mn/yxgojBCgLPJ212+Dn+aPw==",
- "license": "MIT",
- "dependencies": {
- "@ant-design/colors": "^7.2.0",
- "@ant-design/cssinjs": "^1.23.0",
- "@ant-design/cssinjs-utils": "^1.1.3",
- "@ant-design/fast-color": "^2.0.6",
- "@ant-design/icons": "^5.6.1",
- "@ant-design/react-slick": "~1.1.2",
- "@babel/runtime": "^7.26.0",
- "@rc-component/color-picker": "~2.0.1",
- "@rc-component/mutate-observer": "^1.1.0",
- "@rc-component/qrcode": "~1.0.0",
- "@rc-component/tour": "~1.15.1",
- "@rc-component/trigger": "^2.2.6",
- "classnames": "^2.5.1",
- "copy-to-clipboard": "^3.3.3",
- "dayjs": "^1.11.11",
- "rc-cascader": "~3.33.0",
- "rc-checkbox": "~3.5.0",
- "rc-collapse": "~3.9.0",
- "rc-dialog": "~9.6.0",
- "rc-drawer": "~7.2.0",
- "rc-dropdown": "~4.2.1",
- "rc-field-form": "~2.7.0",
- "rc-image": "~7.11.0",
- "rc-input": "~1.7.2",
- "rc-input-number": "~9.4.0",
- "rc-mentions": "~2.19.1",
- "rc-menu": "~9.16.1",
- "rc-motion": "^2.9.5",
- "rc-notification": "~5.6.3",
- "rc-pagination": "~5.1.0",
- "rc-picker": "~4.11.2",
- "rc-progress": "~4.0.0",
- "rc-rate": "~2.13.1",
- "rc-resize-observer": "^1.4.3",
- "rc-segmented": "~2.7.0",
- "rc-select": "~14.16.6",
- "rc-slider": "~11.1.8",
- "rc-steps": "~6.0.1",
- "rc-switch": "~4.1.0",
- "rc-table": "~7.50.3",
- "rc-tabs": "~15.5.1",
- "rc-textarea": "~1.9.0",
- "rc-tooltip": "~6.4.0",
- "rc-tree": "~5.13.0",
- "rc-tree-select": "~5.27.0",
- "rc-upload": "~4.8.1",
- "rc-util": "^5.44.4",
- "scroll-into-view-if-needed": "^3.1.0",
- "throttle-debounce": "^5.0.2"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/ant-design"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
- }
- },
"node_modules/any-promise": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
@@ -7019,15 +6026,6 @@
"postcss": "^8.1.0"
}
},
- "node_modules/autosuggest-highlight": {
- "version": "3.3.4",
- "resolved": "https://registry.npmjs.org/autosuggest-highlight/-/autosuggest-highlight-3.3.4.tgz",
- "integrity": "sha512-j6RETBD2xYnrVcoV1S5R4t3WxOlWZKyDQjkwnggDPSjF5L4jV98ZltBpvPvbkM1HtoSe5o+bNrTHyjPbieGeYA==",
- "license": "MIT",
- "dependencies": {
- "remove-accents": "^0.4.2"
- }
- },
"node_modules/available-typed-arrays": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
@@ -8011,15 +7009,6 @@
"node": ">=12"
}
},
- "node_modules/clsx": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
- "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -8247,12 +7236,6 @@
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"license": "MIT"
},
- "node_modules/compute-scroll-into-view": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz",
- "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==",
- "license": "MIT"
- },
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -8316,15 +7299,6 @@
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
"license": "MIT"
},
- "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==",
- "license": "MIT",
- "dependencies": {
- "toggle-selection": "^1.0.6"
- }
- },
"node_modules/core-js": {
"version": "3.40.0",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.40.0.tgz",
@@ -8787,15 +7761,6 @@
"node": ">=4"
}
},
- "node_modules/cssjanus": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/cssjanus/-/cssjanus-2.3.0.tgz",
- "integrity": "sha512-ZZXXn51SnxRxAZ6fdY7mBDPmA4OZd83q/J9Gdqz3YmE9TUq+9tZl+tdOnCi7PpNygI6PEkehj9rgifv5+W8a5A==",
- "license": "Apache-2.0",
- "engines": {
- "node": ">=10.0.0"
- }
- },
"node_modules/cssnano": {
"version": "5.1.15",
"resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz",
@@ -9315,16 +8280,6 @@
"utila": "~0.4"
}
},
- "node_modules/dom-helpers": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
- "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.8.7",
- "csstype": "^3.0.2"
- }
- },
"node_modules/dom-serializer": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
@@ -10884,12 +9839,6 @@
"url": "https://github.com/avajs/find-cache-dir?sponsor=1"
}
},
- "node_modules/find-root": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
- "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==",
- "license": "MIT"
- },
"node_modules/find-up": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
@@ -13962,15 +12911,6 @@
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
"license": "MIT"
},
- "node_modules/json2mq": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz",
- "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==",
- "license": "MIT",
- "dependencies": {
- "string-convert": "^0.2.0"
- }
- },
"node_modules/json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
@@ -17285,579 +16225,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/rc-cascader": {
- "version": "3.33.0",
- "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.33.0.tgz",
- "integrity": "sha512-JvZrMbKBXIbEDmpIORxqvedY/bck6hGbs3hxdWT8eS9wSQ1P7//lGxbyKjOSyQiVBbgzNWriSe6HoMcZO/+0rQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.25.7",
- "classnames": "^2.3.1",
- "rc-select": "~14.16.2",
- "rc-tree": "~5.13.0",
- "rc-util": "^5.43.0"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
- }
- },
- "node_modules/rc-checkbox": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.5.0.tgz",
- "integrity": "sha512-aOAQc3E98HteIIsSqm6Xk2FPKIER6+5vyEFMZfo73TqM+VVAIqOkHoPjgKLqSNtVLWScoaM7vY2ZrGEheI79yg==",
- "license": "MIT",
- "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.9.0",
- "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.9.0.tgz",
- "integrity": "sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA==",
- "license": "MIT",
- "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.6.0",
- "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.6.0.tgz",
- "integrity": "sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==",
- "license": "MIT",
- "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.2.0",
- "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-7.2.0.tgz",
- "integrity": "sha512-9lOQ7kBekEJRdEpScHvtmEtXnAsy+NGDXiRWc2ZVC7QXAazNVbeT4EraQKYwCME8BJLa8Bxqxvs5swwyOepRwg==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.23.9",
- "@rc-component/portal": "^1.1.1",
- "classnames": "^2.2.6",
- "rc-motion": "^2.6.1",
- "rc-util": "^5.38.1"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
- }
- },
- "node_modules/rc-dropdown": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.2.1.tgz",
- "integrity": "sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.18.3",
- "@rc-component/trigger": "^2.0.0",
- "classnames": "^2.2.6",
- "rc-util": "^5.44.1"
- },
- "peerDependencies": {
- "react": ">=16.11.0",
- "react-dom": ">=16.11.0"
- }
- },
- "node_modules/rc-field-form": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.7.0.tgz",
- "integrity": "sha512-hgKsCay2taxzVnBPZl+1n4ZondsV78G++XVsMIJCAoioMjlMQR9YwAp7JZDIECzIu2Z66R+f4SFIRrO2DjDNAA==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.18.0",
- "@rc-component/async-validator": "^5.0.3",
- "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.11.0",
- "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.11.0.tgz",
- "integrity": "sha512-aZkTEZXqeqfPZtnSdNUnKQA0N/3MbgR7nUnZ+/4MfSFWPFHZau4p5r5ShaI0KPEMnNjv4kijSCFq/9wtJpwykw==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.11.2",
- "@rc-component/portal": "^1.0.2",
- "classnames": "^2.2.6",
- "rc-dialog": "~9.6.0",
- "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.7.2",
- "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.7.2.tgz",
- "integrity": "sha512-g3nYONnl4edWj2FfVoxsU3Ec4XTE+Hb39Kfh2MFxMZjp/0gGyPUgy/v7ZhS27ZxUFNkuIDYXm9PJsLyJbtg86A==",
- "license": "MIT",
- "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.4.0",
- "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-9.4.0.tgz",
- "integrity": "sha512-Tiy4DcXcFXAf9wDhN8aUAyMeCLHJUHA/VA/t7Hj8ZEx5ETvxG7MArDOSE6psbiSCo+vJPm4E3fGN710ITVn6GA==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.10.1",
- "@rc-component/mini-decimal": "^1.0.1",
- "classnames": "^2.2.5",
- "rc-input": "~1.7.1",
- "rc-util": "^5.40.1"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
- }
- },
- "node_modules/rc-mentions": {
- "version": "2.19.1",
- "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.19.1.tgz",
- "integrity": "sha512-KK3bAc/bPFI993J3necmaMXD2reZTzytZdlTvkeBbp50IGH1BDPDvxLdHDUrpQx2b2TGaVJsn+86BvYa03kGqA==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.22.5",
- "@rc-component/trigger": "^2.0.0",
- "classnames": "^2.2.6",
- "rc-input": "~1.7.1",
- "rc-menu": "~9.16.0",
- "rc-textarea": "~1.9.0",
- "rc-util": "^5.34.1"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
- }
- },
- "node_modules/rc-menu": {
- "version": "9.16.1",
- "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.16.1.tgz",
- "integrity": "sha512-ghHx6/6Dvp+fw8CJhDUHFHDJ84hJE3BXNCzSgLdmNiFErWSOaZNsihDAsKq9ByTALo/xkNIwtDFGIl6r+RPXBg==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.10.1",
- "@rc-component/trigger": "^2.0.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.5",
- "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.5.tgz",
- "integrity": "sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.11.1",
- "classnames": "^2.2.1",
- "rc-util": "^5.44.0"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
- }
- },
- "node_modules/rc-notification": {
- "version": "5.6.3",
- "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.6.3.tgz",
- "integrity": "sha512-42szwnn8VYQoT6GnjO00i1iwqV9D1TTMvxObWsuLwgl0TsOokzhkYiufdtQBsJMFjJravS1hfDKVMHLKLcPE4g==",
- "license": "MIT",
- "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.4.1",
- "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.4.1.tgz",
- "integrity": "sha512-3MoPQQPV1uKyOMVNd6SZfONi+f3st0r8PksexIdBTeIYbMX0Jr+k7pHEDvsXtR4BpCv90/Pv2MovVNhktKrwvw==",
- "license": "MIT",
- "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": "5.1.0",
- "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-5.1.0.tgz",
- "integrity": "sha512-8416Yip/+eclTFdHXLKTxZvn70duYVGTvUUWbckCCZoIl3jagqke3GLsFrMs0bsQBikiYpZLD9206Ej4SOdOXQ==",
- "license": "MIT",
- "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.11.2",
- "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.11.2.tgz",
- "integrity": "sha512-Cwa3frWpefhESBF20HBJtvWx3q1hCrMxSUrzuuWMTGoZVPhQllGEp2IUfzo9jC5LKm4kJx7IrH8q/W/y9wClAw==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.24.7",
- "@rc-component/trigger": "^2.0.0",
- "classnames": "^2.2.1",
- "rc-overflow": "^1.3.2",
- "rc-resize-observer": "^1.4.0",
- "rc-util": "^5.43.0"
- },
- "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": "4.0.0",
- "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-4.0.0.tgz",
- "integrity": "sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==",
- "license": "MIT",
- "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.13.1",
- "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.13.1.tgz",
- "integrity": "sha512-QUhQ9ivQ8Gy7mtMZPAjLbxBt5y9GRp65VcUyGUMF3N3fhiftivPHdpuDIaWIMOTEprAjZPC08bls1dQB+I1F2Q==",
- "license": "MIT",
- "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.3",
- "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.3.tgz",
- "integrity": "sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.20.7",
- "classnames": "^2.2.1",
- "rc-util": "^5.44.1",
- "resize-observer-polyfill": "^1.5.1"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
- }
- },
- "node_modules/rc-segmented": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.7.0.tgz",
- "integrity": "sha512-liijAjXz+KnTRVnxxXG2sYDGd6iLL7VpGGdR8gwoxAXy2KglviKCxLWZdjKYJzYzGSUwKDSTdYk8brj54Bn5BA==",
- "license": "MIT",
- "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.16.6",
- "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.16.6.tgz",
- "integrity": "sha512-YPMtRPqfZWOm2XGTbx5/YVr1HT0vn//8QS77At0Gjb3Lv+Lbut0IORJPKLWu1hQ3u4GsA0SrDzs7nI8JG7Zmyg==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.10.1",
- "@rc-component/trigger": "^2.1.1",
- "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": "11.1.8",
- "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-11.1.8.tgz",
- "integrity": "sha512-2gg/72YFSpKP+Ja5AjC5DPL1YnV8DEITDQrcc1eASrUYjl0esptaBVJBh5nLTXCCp15eD8EuGjwezVGSHhs9tQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.10.1",
- "classnames": "^2.2.5",
- "rc-util": "^5.36.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==",
- "license": "MIT",
- "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==",
- "license": "MIT",
- "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.50.3",
- "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.50.3.tgz",
- "integrity": "sha512-Z4/zNCzjv7f/XzPRecb+vJU0DJKdsYt4YRkDzNl4G05m7JmxrKGYC2KqN1Ew6jw2zJq7cxVv3z39qyZOHMuf7A==",
- "license": "MIT",
- "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.44.3",
- "rc-virtual-list": "^3.14.2"
- },
- "engines": {
- "node": ">=8.x"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
- }
- },
- "node_modules/rc-tabs": {
- "version": "15.5.1",
- "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-15.5.1.tgz",
- "integrity": "sha512-yiWivLAjEo5d1v2xlseB2dQocsOhkoVSfo1krS8v8r+02K+TBUjSjXIf7dgyVSxp6wRIPv5pMi5hanNUlQMgUA==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.11.2",
- "classnames": "2.x",
- "rc-dropdown": "~4.2.0",
- "rc-menu": "~9.16.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.9.0",
- "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.9.0.tgz",
- "integrity": "sha512-dQW/Bc/MriPBTugj2Kx9PMS5eXCCGn2cxoIaichjbNvOiARlaHdI99j4DTxLl/V8+PIfW06uFy7kjfUIDDKyxQ==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.10.1",
- "classnames": "^2.2.1",
- "rc-input": "~1.7.1",
- "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.4.0",
- "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.4.0.tgz",
- "integrity": "sha512-kqyivim5cp8I5RkHmpsp1Nn/Wk+1oeloMv9c7LXNgDxUpGm+RbXJGL+OPvDlcRnx9DBeOe4wyOIl4OKUERyH1g==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.11.2",
- "@rc-component/trigger": "^2.0.0",
- "classnames": "^2.3.1",
- "rc-util": "^5.44.3"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
- }
- },
- "node_modules/rc-tree": {
- "version": "5.13.0",
- "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.13.0.tgz",
- "integrity": "sha512-2+lFvoVRnvHQ1trlpXMOWtF8BUgF+3TiipG72uOfhpL5CUdXCk931kvDdUkTL/IZVtNEDQKwEEmJbAYJSA5NnA==",
- "license": "MIT",
- "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.27.0",
- "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.27.0.tgz",
- "integrity": "sha512-2qTBTzwIT7LRI1o7zLyrCzmo5tQanmyGbSaGTIf7sYimCklAToVVfpMC6OAldSKolcnjorBYPNSKQqJmN3TCww==",
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.25.7",
- "classnames": "2.x",
- "rc-select": "~14.16.2",
- "rc-tree": "~5.13.0",
- "rc-util": "^5.43.0"
- },
- "peerDependencies": {
- "react": "*",
- "react-dom": "*"
- }
- },
- "node_modules/rc-upload": {
- "version": "4.8.1",
- "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.8.1.tgz",
- "integrity": "sha512-toEAhwl4hjLAI1u8/CgKWt30BR06ulPa4iGQSMvSXoHzO88gPCslxqV/mnn4gJU7PDoltGIC9Eh+wkeudqgHyw==",
- "license": "MIT",
- "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.44.4",
"resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.44.4.tgz",
@@ -17878,25 +16245,6 @@
"integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
"license": "MIT"
},
- "node_modules/rc-virtual-list": {
- "version": "3.18.2",
- "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.18.2.tgz",
- "integrity": "sha512-SkPabqstOQgJ2Q2Ob3eDPIHsNrDzQZFl8mzHiXuNablyYwddVU33Ws6oxoA7Fi/6pZeEYonrLEUiJGr/6aBVaw==",
- "license": "MIT",
- "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": "19.2.8",
"resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz",
@@ -18157,12 +16505,6 @@
"tslib": "^2.8.0"
}
},
- "node_modules/react-is": {
- "version": "19.0.0",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.0.0.tgz",
- "integrity": "sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==",
- "license": "MIT"
- },
"node_modules/react-leaflet": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-5.0.0.tgz",
@@ -18838,22 +17180,6 @@
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ~19"
}
},
- "node_modules/react-transition-group": {
- "version": "4.4.5",
- "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
- "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "@babel/runtime": "^7.5.5",
- "dom-helpers": "^5.0.1",
- "loose-envify": "^1.4.0",
- "prop-types": "^15.6.2"
- },
- "peerDependencies": {
- "react": ">=16.6.0",
- "react-dom": ">=16.6.0"
- }
- },
"node_modules/read-cache": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
@@ -19051,12 +17377,6 @@
"node": ">= 0.10"
}
},
- "node_modules/remove-accents": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.4.tgz",
- "integrity": "sha512-EpFcOa/ISetVHEXqu+VwI96KZBmq+a8LJnGkaeFw45epGlxIZz5dhEEnNZMsQXgORu3qaMoLX4qJCzOik6ytAg==",
- "license": "MIT"
- },
"node_modules/renderkid": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz",
@@ -19100,12 +17420,6 @@
"integrity": "sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==",
"license": "MIT"
},
- "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==",
- "license": "MIT"
- },
"node_modules/resolve": {
"version": "1.22.10",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
@@ -19523,15 +17837,6 @@
"url": "https://opencollective.com/webpack"
}
},
- "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==",
- "license": "MIT",
- "dependencies": {
- "compute-scroll-into-view": "^3.0.2"
- }
- },
"node_modules/select-hose": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
@@ -19948,15 +18253,6 @@
"integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
"license": "MIT"
},
- "node_modules/source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/source-map-js": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
@@ -20257,12 +18553,6 @@
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"license": "MIT"
},
- "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==",
- "license": "MIT"
- },
"node_modules/string-length": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
@@ -20546,24 +18836,6 @@
"integrity": "sha512-L0TR0NQb+X4/ktDEKmjWyp27gla+LUYi/by5k5SjKXf6/pvZP7wbwEB5J+tqxdFVPgzbsuz+d4RTScO/QZquBw==",
"license": "MIT"
},
- "node_modules/stylis": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz",
- "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==",
- "license": "MIT"
- },
- "node_modules/stylis-plugin-rtl": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/stylis-plugin-rtl/-/stylis-plugin-rtl-2.1.1.tgz",
- "integrity": "sha512-q6xIkri6fBufIO/sV55md2CbgS5c6gg9EhSVATtHHCdOnbN/jcI0u3lYhNVeuI65c4lQPo67g8xmq5jrREvzlg==",
- "license": "MIT",
- "dependencies": {
- "cssjanus": "^2.0.1"
- },
- "peerDependencies": {
- "stylis": "4.x"
- }
- },
"node_modules/sucrase": {
"version": "3.35.0",
"resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
@@ -21043,15 +19315,6 @@
"integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==",
"license": "MIT"
},
- "node_modules/throttle-debounce": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz",
- "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==",
- "license": "MIT",
- "engines": {
- "node": ">=12.22"
- }
- },
"node_modules/thunky": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
@@ -21088,12 +19351,6 @@
"node": ">=8.0"
}
},
- "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==",
- "license": "MIT"
- },
"node_modules/toidentifier": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
@@ -21346,6 +19603,20 @@
"is-typedarray": "^1.0.0"
}
},
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "license": "Apache-2.0",
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
"node_modules/ua-parser-js": {
"version": "1.0.40",
"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.40.tgz",
@@ -21559,9 +19830,9 @@
}
},
"node_modules/use-sync-external-store": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz",
- "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==",
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
+ "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==",
"license": "MIT",
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
diff --git a/package.json b/package.json
index 9f97bb2..402e78e 100644
--- a/package.json
+++ b/package.json
@@ -10,6 +10,7 @@
"@stylexjs/stylex": "^0.19.0",
"@svgr/webpack": "^7.0.0",
"@tanstack/react-query": "^5.101.4",
+ "@tanstack/react-table": "^9.1.2",
"axios": "^1.3.5",
"buffer": "^6.0.3",
"chance": "^1.1.11",
@@ -110,4 +111,4 @@
"react-app-rewired": "^2.2.1",
"react-error-overlay": "6.0.11"
}
-}
\ No newline at end of file
+}
diff --git a/public/index.html b/public/index.html
index 47973a8..6acbf5b 100644
--- a/public/index.html
+++ b/public/index.html
@@ -30,9 +30,22 @@
-->
Doormile Express Console
-
+
+
+
diff --git a/src/components/nearle_components/CLAUDE.md b/src/components/nearle_components/CLAUDE.md
index 3752def..8f29d9b 100644
--- a/src/components/nearle_components/CLAUDE.md
+++ b/src/components/nearle_components/CLAUDE.md
@@ -17,6 +17,7 @@ These components are imported across every page. Changes here have **fan-out imp
| Component | Use | Status |
|---|---|---|
+| `PageLayout.js` | **The page design language**: `PageShell`, `KpiGrid`, `FilterToolbar`, `DataCard` | ✅ **Astryx** — use these for every operator page (see §2b) |
| `PageHeader.js` | Page title + live subtitle + action slot | ✅ **Astryx** — `Heading`/`Text`/`HStack`/`StatusDot` |
| `StatCard.js` | KPI / metric tile | ✅ **Astryx** — `Card`/`Text`/`Center`/`Skeleton` |
| `StatusBadge.js` | Per-row lifecycle badge | ✅ **Astryx** — `Badge` driven by `themes/dt/status.js` |
@@ -47,6 +48,51 @@ The design system is documented in the root `CLAUDE.md` §6. Read it before edit
---
+## 2b. Page composition — use `PageLayout.js`, don't hand-roll spacing
+
+Every operator page composes from the same four primitives. **Do not set
+`marginTop`, `gap` or `padding` on page sections by hand** — that is exactly how
+23 pages ended up with 23 different rhythms and the UI read as cramped and
+inconsistent.
+
+```jsx
+import { PageShell, KpiGrid, FilterToolbar, DataCard } from 'components/nearle_components/PageLayout';
+
+ {/* gap={6} between regions */}
+ } />
+ … … {/* fills the row, no dead gap */}
+ …selectors, date, search…}
+ tabs={ }
+ >
+ …TableScroll + Table…
+
+
+```
+
+Values come from the Astryx `dashboard` page template (`padding={6}` /
+`VStack gap={6}` / `Grid gap={4}`), not from taste.
+
+**Three Astryx traps these primitives exist to absorb** — all three fail
+*silently*, with no lint or build error:
+
+- **`Grid` has no `padding` prop.** It declares only `columns`/`gap`/`rowGap`/
+ `columnGap`/`align`/`justify`/`width`/`height`. A `padding` you pass is spread
+ onto the DOM and does nothing, so controls sit flush against the card edge.
+ `FilterToolbar` puts the padding on a `VStack` wrapper instead.
+- **`Grid`'s `repeat` defaults to `'fill'`, which preserves empty tracks.** In a
+ wide container that lays out more tracks than you have cards, so they bunch
+ left and leave a dead gap. `KpiGrid` always passes `repeat: 'fit'`.
+- **Page-level actions belong in `PageHeader`; filters do not.**
+ `LocationAutocomplete` carries its own width and ignores a wrapper's, so
+ putting it in the header made it overlap its neighbour.
+
+Before using any Astryx prop, check it is actually declared —
+`grep "export declare function " node_modules/@astryxdesign/core/dist//.d.ts`.
+An undeclared prop is spread to the DOM and fails invisibly.
+
+---
+
## 3. `LocationAutocomplete` — the zone picker
```jsx
diff --git a/src/components/nearle_components/PageLayout.js b/src/components/nearle_components/PageLayout.js
new file mode 100644
index 0000000..0aa7094
--- /dev/null
+++ b/src/components/nearle_components/PageLayout.js
@@ -0,0 +1,190 @@
+import PropTypes from 'prop-types';
+
+import { Grid } from '@astryxdesign/core/Grid';
+import { VStack } from '@astryxdesign/core/VStack';
+import { Card } from '@astryxdesign/core/Card';
+import { Divider } from '@astryxdesign/core/Divider';
+
+// ==============================|| PAGE LAYOUT PRIMITIVES ||============================== //
+//
+// The operator-page design language, in one place.
+//
+// Every page had been composing its own rhythm out of ad-hoc `marginTop: 16`,
+// `gap={2}` and `gap={3}` values, so no two pages agreed on spacing and the
+// result read as cramped. These four primitives fix the vertical rhythm, the
+// grid behaviour and the card chrome so a page only decides WHAT goes in each
+// slot, never how far apart things sit.
+//
+// The values come from the Astryx `dashboard` page template (which uses
+// LayoutContent padding={6} + VStack gap={6} + Grid gap={4}) — i.e. they are the
+// design system's own numbers, not invented here.
+//
+//
+//
+// …StatCard…
+// …} tabs={ }>
+// …table…
+//
+//
+
+// ---------------------------------------------------------------------------
+// PageShell — owns the vertical rhythm between a page's major regions.
+// gap={6} is the template's section spacing. Use this INSTEAD of putting
+// `style={{ marginTop: N }}` on individual sections.
+//
+// `fill` opts a page into FULL-HEIGHT mode: the header (and any KPI row) take
+// only the height they need and the last region — a `` — grows
+// to the bottom of the viewport, with its table scrolling inside itself.
+//
+// Why the `:has()` rule rather than a `height: 100%` chain or a `100vh` calc:
+//
+// AppShell (height="fill") gives its scroll container `.astryx-layout-content`
+// a definite `height: 100%` — so a real flex chain IS available. The chain
+// breaks at exactly one link: MainLayout's `.main-content-area`, the div that
+// holds the page padding, sets `min-height: 100%` and NOT `height`, so its own
+// height is auto. A percentage height on any descendant then resolves against
+// `auto` and is dropped, which is why full-height pages have had to guess with
+// `calc(100vh - 260px)` — a number that is wrong at every viewport the guess
+// wasn't written for, and that leaves dead space under the table.
+//
+// `:has(> .dt-page-fill)` re-definites that one link, and ONLY while a page
+// that asked for fill mode is mounted — every other page keeps the auto-height,
+// grow-with-content behaviour it has today. Scoping it this way is what makes
+// this safe to add to a shared primitive. Astryx's own stylesheet already
+// relies on `:has()`, so it is not a new browser requirement; where it is
+// unsupported the page simply falls back to today's auto-height layout.
+// ---------------------------------------------------------------------------
+const FILL_CLASS = 'dt-page-fill';
+
+export function PageShell({ children, gap = 6, fill = false }) {
+ return (
+ <>
+ {fill && (
+
+ )}
+
+ {children}
+
+ >
+ );
+}
+
+PageShell.propTypes = {
+ children: PropTypes.node,
+ gap: PropTypes.number,
+ fill: PropTypes.bool
+};
+
+// ---------------------------------------------------------------------------
+// KpiGrid — the row of StatCards under the page header.
+//
+// `repeat: 'fit'` is load-bearing and the reason this exists as a shared
+// primitive: Grid's default is `'fill'`, which PRESERVES empty tracks. With a
+// small minWidth in a wide container that lays out more tracks than there are
+// cards, so the cards bunch to the left and leave a dead gap on the right —
+// the single most visible layout bug on these pages. `'fit'` collapses the
+// empty tracks so the cards stretch to fill the row.
+//
+// `max` caps the column count so 3 cards don't each become 400px wide on an
+// ultrawide monitor; it defaults to the number of children.
+// ---------------------------------------------------------------------------
+export function KpiGrid({ children, minWidth = 240, max }) {
+ const count = Array.isArray(children) ? children.filter(Boolean).length : 1;
+ return (
+
+ {children}
+
+ );
+}
+
+KpiGrid.propTypes = {
+ children: PropTypes.node,
+ minWidth: PropTypes.number,
+ max: PropTypes.number
+};
+
+// ---------------------------------------------------------------------------
+// FilterToolbar — the filter/search controls above a table.
+//
+// NOTE the padding lives on the VStack, not the Grid. `Grid` has no `padding`
+// prop (it declares only columns/gap/rowGap/columnGap/align/justify/width/
+// height), so passing one spreads it onto the DOM where it silently does
+// nothing — controls then sit flush against the card edge with no breathing
+// room. That bug is the reason this wrapper exists rather than each page
+// hand-rolling the pair.
+//
+// max 3 keeps a 6-control toolbar as two even rows of three instead of leaving
+// an orphan on a second row.
+// ---------------------------------------------------------------------------
+export function FilterToolbar({ children, minWidth = 220, max = 3, padding = 4 }) {
+ return (
+
+
+ {children}
+
+
+ );
+}
+
+FilterToolbar.propTypes = {
+ children: PropTypes.node,
+ minWidth: PropTypes.number,
+ max: PropTypes.number,
+ padding: PropTypes.number
+};
+
+// ---------------------------------------------------------------------------
+// DataCard — one card holding a table and everything that acts on it.
+//
+// Pages used to stack three separate Cards (filters, then tabs, then table),
+// which read as loose boxes with no relationship to each other. Grouping them
+// into a single card with dividers makes it obvious that the filters and tabs
+// act on the table below them.
+//
+// `tabs` gets its own padded row so the tab strip never sits flush against the
+// card edge or against the toolbar above it.
+//
+// `fill` (pairs with ``) makes the card a flex column that
+// claims the leftover viewport height: the toolbar and tab rows keep their
+// intrinsic height, and the content slot takes the rest with `min-height: 0`
+// so its scroll area can actually shrink rather than pushing the card past the
+// bottom of the screen. A table inside then only needs `maxHeight="100%"` —
+// no viewport arithmetic, and it re-measures on every resize for free.
+// ---------------------------------------------------------------------------
+export function DataCard({ toolbar, tabs, children, fill = false }) {
+ return (
+
+ {toolbar}
+ {toolbar && }
+ {tabs && (
+ <>
+
+ {tabs}
+
+
+ >
+ )}
+
+ {children}
+
+
+ );
+}
+
+DataCard.propTypes = {
+ toolbar: PropTypes.node,
+ tabs: PropTypes.node,
+ children: PropTypes.node,
+ fill: PropTypes.bool
+};
diff --git a/src/config.js b/src/config.js
index cab3cf7..c624a64 100644
--- a/src/config.js
+++ b/src/config.js
@@ -27,14 +27,18 @@ export const ThemeDirection = {
const config = {
/**
- * The props used for the theme font-style.
- * We provide static below options -
- * `'Inter', sans-serif`
- * `'Poppins', sans-serif`
- * `'Roboto', sans-serif`
- * `'Public Sans', sans-serif` (default)
+ * Body font for the MUI theme, which is still mounted for the pages not yet
+ * converted to Astryx.
+ *
+ * Must match `themes/astryx.js`'s `typography.body.family` — otherwise a
+ * converted page and an unconverted one render in different fonts, which is
+ * very visible while the migration is in progress. Was `'Public Sans'`.
+ *
+ * Poppins / Roboto used to be listed here as alternatives; nothing ever used
+ * them and they are no longer loaded in public/index.html, so they have been
+ * dropped rather than left as dead options.
*/
- fontFamily: `'Public Sans', sans-serif`,
+ fontFamily: `'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif`,
/**
* The props used for display menu-items with multi-language.
diff --git a/src/globalPolish.css b/src/globalPolish.css
index 79c7767..c13f0d5 100644
--- a/src/globalPolish.css
+++ b/src/globalPolish.css
@@ -6,19 +6,32 @@
that reset doesn't: crisp font rendering and a thin, unobtrusive scrollbar. */
body {
+ /* Astryx sets --font-family-body on :root (from themes/astryx.js's
+ typography config) but nothing was applying it to the document, and
+ MUI's — which used to do this — is no longer mounted.
+ The result was a body computing to "Times New Roman": Astryx components
+ rendered correctly because they set their own font, but every plain
+ element and any text outside a inherited the browser serif
+ default. Verified in the browser on /login before and after. */
+ font-family: var(--font-family-body);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-rendering: optimizeLegibility;
}
+/* Scrollbars are chrome, not content — they should recede until used.
+ The thumb was rgba(0,0,0,0.26) at 10px, which drew a solid dark bar down the
+ right edge of every scrollable table and read as a heavy border rather than
+ as a scrollbar. Lightened and narrowed; it still darkens on hover so it stays
+ findable. */
* {
scrollbar-width: thin; /* Firefox */
- scrollbar-color: rgba(0, 0, 0, 0.28) transparent;
+ scrollbar-color: rgba(0, 0, 0, 0.16) transparent;
}
*::-webkit-scrollbar {
- width: 10px;
- height: 10px;
+ width: 8px;
+ height: 8px;
}
*::-webkit-scrollbar-track {
@@ -26,14 +39,14 @@ body {
}
*::-webkit-scrollbar-thumb {
- background-color: rgba(0, 0, 0, 0.26);
+ background-color: rgba(0, 0, 0, 0.16);
border-radius: 8px;
border: 2px solid transparent;
background-clip: padding-box;
}
*::-webkit-scrollbar-thumb:hover {
- background-color: rgba(0, 0, 0, 0.45);
+ background-color: rgba(0, 0, 0, 0.34);
}
*::-webkit-scrollbar-corner {
diff --git a/src/pages/nearle/appUsers/appUsers.js b/src/pages/nearle/appUsers/appUsers.js
index cfbf76d..6c72245 100644
--- a/src/pages/nearle/appUsers/appUsers.js
+++ b/src/pages/nearle/appUsers/appUsers.js
@@ -6,7 +6,6 @@ import { enqueueSnackbar } from 'notistack';
import { Grid } from '@astryxdesign/core/Grid';
import { HStack } from '@astryxdesign/core/HStack';
import { VStack } from '@astryxdesign/core/VStack';
-import { Card } from '@astryxdesign/core/Card';
import { Text } from '@astryxdesign/core/Text';
import { Button } from '@astryxdesign/core/Button';
import { IconButton } from '@astryxdesign/core/IconButton';
@@ -22,6 +21,7 @@ import TableLoader from 'components/nearle_components/TableLoader';
import DebounceSearchBar from 'components/nearle_components/DebounceSearchBar';
import PageHeader from 'components/nearle_components/PageHeader';
import StatCard from 'components/nearle_components/StatCard';
+import { PageShell, KpiGrid, FilterToolbar, DataCard } from 'components/nearle_components/PageLayout';
import { getAppUsers, createAppUser, updateAppUser, deleteAppUser } from 'pages/api/doormileApi';
import { DT } from 'themes/dt/tokens';
import { TableScroll, AccentAvatar } from 'themes/dt/primitives';
@@ -136,36 +136,40 @@ const AppUsers = () => {
<>
{(isLoading || saveMutation.isPending || deleteMutation.isPending) && }
- } onClick={openCreate} />}
- />
+
+ } onClick={openCreate} />}
+ />
-
- } color={BRAND} />
- } color="#6366f1" />
-
+
+ } color={BRAND} />
+ } color="#6366f1" />
+
-
-
-
-
- {users.length} total · {rows.length} shown
-
-
-
-
-
-
-
-
+
+
+
+ {users.length} total · {rows.length} shown
+
+
+
+
+
+
+
+
+ }
+ >
@@ -228,8 +232,8 @@ const AppUsers = () => {
-
-
+
+
!next && setDialogOpen(false)} width={480} purpose="form">
{
isRequired={!form.id}
isOptional={!!form.id}
/>
-
+
diff --git a/src/pages/nearle/clientPricing/clientPricing.js b/src/pages/nearle/clientPricing/clientPricing.js
index 02a0689..4417d96 100644
--- a/src/pages/nearle/clientPricing/clientPricing.js
+++ b/src/pages/nearle/clientPricing/clientPricing.js
@@ -40,6 +40,7 @@ import DebounceSearchBar from 'components/nearle_components/DebounceSearchBar';
import LocationAutocomplete from 'components/nearle_components/LocationAutocomplete';
import PageHeader from 'components/nearle_components/PageHeader';
import StatCard from 'components/nearle_components/StatCard';
+import { PageShell, KpiGrid, FilterToolbar, DataCard } from 'components/nearle_components/PageLayout';
import { MobileCard, MobileCardList, MobileField, MobileFieldGrid } from 'components/nearle_components/MobileCard';
import { getallpricing, getTenants, fetchAppLocations } from 'pages/api/api';
import { createAdminPricing, updateAdminPricing, deleteAdminPricing, simulatePricing } from 'pages/api/doormileApi';
@@ -115,7 +116,10 @@ const ClientsPricing = () => {
[locations]
);
const locationOptions = useMemo(() => (locations || []).filter((l) => l.applocationid), [locations]);
- const tenantSelectOptions = useMemo(() => (tenants || []).map((t) => ({ value: String(t.tenantid), label: t.tenantname || `Tenant #${t.tenantid}` })), [tenants]);
+ const tenantSelectOptions = useMemo(
+ () => (tenants || []).map((t) => ({ value: String(t.tenantid), label: t.tenantname || `Tenant #${t.tenantid}` })),
+ [tenants]
+ );
const locationSelectOptions = useMemo(
() => locationOptions.map((l) => ({ value: String(l.applocationid), label: l.locationname || `Zone #${l.applocationid}` })),
[locationOptions]
@@ -123,9 +127,7 @@ const ClientsPricing = () => {
const tenantName = (row) => row.tenantname || tenantMap.get(row.tenantid)?.tenantname || (row.tenantid ? `Tenant #${row.tenantid}` : '—');
const zoneName = (row) =>
- row.applocation ||
- locationMap.get(String(row.applocationid))?.locationname ||
- (row.applocationid ? `Zone #${row.applocationid}` : '—');
+ row.applocation || locationMap.get(String(row.applocationid))?.locationname || (row.applocationid ? `Zone #${row.applocationid}` : '—');
// getallpricing() takes no zone arg (see api.js) — the LocationAutocomplete
// only ever changed the header subtitle text, not which rows were shown.
@@ -136,10 +138,7 @@ const ClientsPricing = () => {
// from) are two independently-serialized resources with no guarantee they
// agree on number-vs-string; a raw === silently zeroed out every row
// whenever they didn't match, making the table look empty for any zone.
- const zonePricing = useMemo(
- () => (appId ? pricing.filter((r) => String(r.applocationid) === String(appId)) : pricing),
- [pricing, appId]
- );
+ const zonePricing = useMemo(() => (appId ? pricing.filter((r) => String(r.applocationid) === String(appId)) : pricing), [pricing, appId]);
const rows = useMemo(() => {
if (!debouncedSearch) return zonePricing;
@@ -286,54 +285,56 @@ const ClientsPricing = () => {
<>
{(isLoading || savePricingMutation.isPending || deletePricingMutation.isPending) && }
-
-
- } onClick={() => setQuoteOpen(true)} />
- } onClick={openCreateDialog} />
-
- }
- />
-
-
- {KPI_META.map((item) => {
- const Icon = item.icon;
- return } color={item.color} />;
- })}
-
-
-
-
-
-
-
-
-
-
-
- Pricing Catalog
-
-
- {pricing.length} total · {rows.length} shown
-
-
+
+
+
+ } onClick={() => setQuoteOpen(true)} />
+ } onClick={openCreateDialog} />
-
-
-
-
-
+ }
+ />
-
+
+ {KPI_META.map((item) => {
+ const Icon = item.icon;
+ return } color={item.color} />;
+ })}
+
+
+
+
+
+
+
+
+
+ Pricing Catalog
+
+
+ {pricing.length} total · {rows.length} shown
+
+
+
+
+
+
+
+
+
+ }
+ >
{isMobile ? (
rows.length === 0 && !isLoading ? (
{
- } onClick={() => openEditDialog(row)} />
+ }
+ onClick={() => openEditDialog(row)}
+ />
{
- } onClick={() => openEditDialog(row)} />
+ }
+ onClick={() => openEditDialog(row)}
+ />
{
)}
-
-
+
+
!next && setDialogOpen(false)} width={720} purpose="form">
{
}
content={
-
-
-
+
+
+
- set('baseprice')(v ?? '')} isRequired />
- set('baseweight')(v ?? '')} isOptional />
- set('priceperkg')(v ?? '')} isOptional />
- set('basedistance')(v ?? '')} isOptional />
- set('priceperkm')(v ?? '')} isRequired />
+ set('baseprice')(v ?? '')}
+ isRequired
+ />
+ set('baseweight')(v ?? '')}
+ isOptional
+ />
+ set('priceperkg')(v ?? '')}
+ isOptional
+ />
+ set('basedistance')(v ?? '')}
+ isOptional
+ />
+ set('priceperkm')(v ?? '')}
+ isRequired
+ />
set('handlingcharges')(v ?? '')}
isOptional
/>
- set('priority')(v ?? '')} isOptional />
+ set('priority')(v ?? '')}
+ isOptional
+ />
}
footer={
- setDialogOpen(false)} isDisabled={savePricingMutation.isPending} />
+ setDialogOpen(false)}
+ isDisabled={savePricingMutation.isPending}
+ />
{
content={
-
-
-
-
- setQuote('weight')(v ?? '')} isOptional />
- setQuote('distance')(v ?? '')} isRequired />
+
+
+
+
+ setQuote('weight')(v ?? '')}
+ isOptional
+ />
+ setQuote('distance')(v ?? '')}
+ isRequired
+ />
- {quoteMutation.isPending && (
- Calculating…
- )}
+ {quoteMutation.isPending && Calculating… }
{quoteMutation.data && (
diff --git a/src/pages/nearle/clients/Tenants.js b/src/pages/nearle/clients/Tenants.js
index 65f50d9..e8b315d 100644
--- a/src/pages/nearle/clients/Tenants.js
+++ b/src/pages/nearle/clients/Tenants.js
@@ -56,6 +56,7 @@ import DebounceSearchBar from 'components/nearle_components/DebounceSearchBar';
import PageHeader from 'components/nearle_components/PageHeader';
import StatCard from 'components/nearle_components/StatCard';
import TableLoader from 'components/nearle_components/TableLoader';
+import { PageShell, KpiGrid, DataCard } from 'components/nearle_components/PageLayout';
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { getalltenants } from 'pages/api/api';
import {
@@ -209,7 +210,14 @@ const TenantLocationsDialog = ({ tenant, open, onClose }) => {
{[loc.address, loc.city, loc.state, loc.pincode].filter(Boolean).join(', ')}
- } onClick={() => openEdit(loc)} />
+ }
+ onClick={() => openEdit(loc)}
+ />
))}
@@ -217,7 +225,11 @@ const TenantLocationsDialog = ({ tenant, open, onClose }) => {
)}
{formOpen && (
-
+
setForm((f) => ({ ...f, locationname: v }))} />
setForm((f) => ({ ...f, pincode: v }))} />
setForm((f) => ({ ...f, address: v }))} />
@@ -393,7 +405,14 @@ const TenantCustomersDialog = ({ tenant, open, onClose }) => {
- } onClick={() => openEdit(c)} />
+ }
+ onClick={() => openEdit(c)}
+ />
{
)}
{formOpen && (
-
+
setForm((f) => ({ ...f, firstname: v }))} />
setForm((f) => ({ ...f, lastname: v }))} />
setForm((f) => ({ ...f, phone: v }))} />
@@ -670,9 +693,7 @@ const Clients1 = () => {
if (String(t.status || '').toLowerCase() !== activeStatus) return false;
if (!q) return true;
return (
- t.tenantname?.toLowerCase().includes(q) ||
- t.primaryemail?.toLowerCase().includes(q) ||
- t.primarycontact?.includes(debouncedSearch)
+ t.tenantname?.toLowerCase().includes(q) || t.primaryemail?.toLowerCase().includes(q) || t.primarycontact?.includes(debouncedSearch)
);
});
}, [tenantList, value0, debouncedSearch]);
@@ -913,12 +934,16 @@ const Clients1 = () => {
>
{value1 == '0' && (
-
+
-
+
)}
@@ -947,20 +972,14 @@ const Clients1 = () => {
{value0 !== 1 && } />}
{value2 == '1' && (
- }
- onClick={() => setDialogopen(true)}
- />
+ } onClick={() => setDialogopen(true)} />
)}
}
>
{value2 == '0' && (
-
+
{
onPlaceSelected={handleAddressPlaceSelected}
/>
-
+
{
/>
-
+
@@ -1034,70 +1053,92 @@ const Clients1 = () => {
<>
{(getalltenantsIsLoading || isloader) && }
- }
- />
+
+
+ }
+ />
-
- {KPI_META.map((item) => {
- const Icon = item.icon;
- const value = tenantStatusCounts[item.countKey] ?? 0;
- // 'total' has no matching entry in STATUS_TABS (there's no "All"
- // tab) — only the three status tiles switch tabs when clicked.
- const tabIdx = STATUS_TABS.findIndex((t) => t.countKey === item.countKey);
- const clickable = tabIdx !== -1;
- return (
- handleChange(tabIdx) : undefined}
- onKeyDown={
- clickable
- ? (e) => {
- if (e.key === 'Enter' || e.key === ' ') handleChange(tabIdx);
- }
- : undefined
- }
- style={{ cursor: clickable ? 'pointer' : 'default', height: '100%' }}
- >
- } color={item.color} loading={getalltenantsIsLoading} />
-
- );
- })}
-
+
+ {KPI_META.map((item) => {
+ const Icon = item.icon;
+ const value = tenantStatusCounts[item.countKey] ?? 0;
+ // 'total' has no matching entry in STATUS_TABS (there's no "All"
+ // tab) — only the three status tiles switch tabs when clicked.
+ const tabIdx = STATUS_TABS.findIndex((t) => t.countKey === item.countKey);
+ const clickable = tabIdx !== -1;
+ return (
+ handleChange(tabIdx) : undefined}
+ onKeyDown={
+ clickable
+ ? (e) => {
+ if (e.key === 'Enter' || e.key === ' ') handleChange(tabIdx);
+ }
+ : undefined
+ }
+ style={{ cursor: clickable ? 'pointer' : 'default', height: '100%' }}
+ >
+ }
+ color={item.color}
+ loading={getalltenantsIsLoading}
+ />
+
+ );
+ })}
+
-
-
-
- {
- const idx = Number(v);
- setstatus(STATUS_TABS[idx].status);
- handleChange(idx);
- }}
- size="sm"
- hasDivider={false}
- >
- {STATUS_TABS.map((t, idx) => {
- const meta = STATUS_META[t.status];
- const Icon = meta.icon;
- const count = tenantStatusCounts[t.countKey] ?? 0;
- return } endContent={ } />;
- })}
-
+
+ {
+ const idx = Number(v);
+ setstatus(STATUS_TABS[idx].status);
+ handleChange(idx);
+ }}
+ size="sm"
+ hasDivider={false}
+ >
+ {STATUS_TABS.map((t, idx) => {
+ const meta = STATUS_META[t.status];
+ const Icon = meta.icon;
+ const count = tenantStatusCounts[t.countKey] ?? 0;
+ return (
+ }
+ endContent={ }
+ />
+ );
+ })}
+
-
-
-
-
-
-
-
+
+
+
+
+ }
+ >
{!isMobile && (
@@ -1272,15 +1313,20 @@ const Clients1 = () => {
>
)}
-
-
+
+
!next && dialogclose()} width={640} purpose="form">
!next && dialogclose()} />}
+ header={
+ !next && dialogclose()}
+ />
+ }
content={
-
+
{
<>
{createCustomerMutation.isPending && }
-
-
-
- }
- />
+
+
+
+
+ }
+ />
-
-
-
-
-
- Location
-
-
-
- {isStaffLogin && (
- setTid(v || '')}
- placeholder="Choose Client"
- hasSearch
+
+
+
+
+
+ Location
+
+
+
+ {isStaffLogin && (
+ setTid(v || '')}
+ placeholder="Choose Client"
+ hasSearch
+ />
+ )}
+
+
+ {
+ const digits = v.replace(/\D/g, '');
+ if (digits.length <= 10) setPhone(digits);
+ }}
+ isRequired
/>
- )}
-
-
- {
- const digits = v.replace(/\D/g, '');
- if (digits.length <= 10) setPhone(digits);
- }}
- isRequired
+
+
+
+
+
+
+
+ The backend doesn't store an address against a customer yet — these fields aren't required and won't be saved
+ on submit.
+
+
+
-
-
-
-
+
+ setPickCust((p) => ({ ...p, suburb: v }))}
+ />
+ setPickCust((p) => ({ ...p, city: v }))}
+ />
+ setPickCust((p) => ({ ...p, state: v }))}
+ />
+ setPickCust((p) => ({ ...p, postcode: v.replace(/\D/g, '') }))}
+ />
+
+
+
+
-
- The backend doesn't store an address against a customer yet — these fields aren't required and won't be saved on submit.
-
-
-
-
-
- setPickCust((p) => ({ ...p, suburb: v }))} />
- setPickCust((p) => ({ ...p, city: v }))} />
- setPickCust((p) => ({ ...p, state: v }))} />
- setPickCust((p) => ({ ...p, postcode: v.replace(/\D/g, '') }))}
- />
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
>
);
};
diff --git a/src/pages/nearle/clients/createclient.js b/src/pages/nearle/clients/createclient.js
index b0a3657..6ffe805 100644
--- a/src/pages/nearle/clients/createclient.js
+++ b/src/pages/nearle/clients/createclient.js
@@ -15,6 +15,7 @@ import { Switch } from '@astryxdesign/core/Switch';
import Loader from 'components/Loader';
import PageHeader from 'components/nearle_components/PageHeader';
+import { PageShell } from 'components/nearle_components/PageLayout';
import { createAdminTenant } from 'pages/api/doormileApi';
import { DT } from 'themes/dt/tokens';
import { AccentAvatar } from 'themes/dt/primitives';
@@ -85,45 +86,60 @@ const Createclient = () => {
<>
{createTenantMutation.isPending && }
-
-
-
- }
- />
+
+
+
+
+ }
+ />
-
-
-
-
-
- {
- const digits = v.replace(/\D/g, '');
- if (digits.length <= 10) setPrimarycontact(digits);
- }}
- isRequired
+
+
+
+
+
+ {
+ const digits = v.replace(/\D/g, '');
+ if (digits.length <= 10) setPrimarycontact(digits);
+ }}
+ isRequired
+ />
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
>
);
};
diff --git a/src/pages/nearle/competitiveIntel/competitiveIntel.js b/src/pages/nearle/competitiveIntel/competitiveIntel.js
index 1e0f0aa..a39215a 100644
--- a/src/pages/nearle/competitiveIntel/competitiveIntel.js
+++ b/src/pages/nearle/competitiveIntel/competitiveIntel.js
@@ -5,7 +5,6 @@ import { enqueueSnackbar } from 'notistack';
import { Grid } from '@astryxdesign/core/Grid';
import { HStack } from '@astryxdesign/core/HStack';
-import { Card } from '@astryxdesign/core/Card';
import { Text } from '@astryxdesign/core/Text';
import { Button } from '@astryxdesign/core/Button';
import { IconButton } from '@astryxdesign/core/IconButton';
@@ -13,6 +12,7 @@ import { Dialog, DialogHeader } from '@astryxdesign/core/Dialog';
import { Layout, LayoutContent, LayoutFooter } from '@astryxdesign/core/Layout';
import { TextInput } from '@astryxdesign/core/TextInput';
import { TabList, Tab } from '@astryxdesign/core/TabList';
+import { Divider } from '@astryxdesign/core/Divider';
import { Pagination } from '@astryxdesign/core/Pagination';
import { EmptyState } from '@astryxdesign/core/EmptyState';
import { Table, TableHeader, TableBody, TableRow, TableCell, TableHeaderCell } from '@astryxdesign/core/Table';
@@ -20,6 +20,7 @@ import { Table, TableHeader, TableBody, TableRow, TableCell, TableHeaderCell } f
import Loader from 'components/Loader';
import TableLoader from 'components/nearle_components/TableLoader';
import PageHeader from 'components/nearle_components/PageHeader';
+import { PageShell, FilterToolbar, DataCard } from 'components/nearle_components/PageLayout';
import {
getCompetitorBranches,
createCompetitorBranch,
@@ -227,119 +228,148 @@ const CompetitiveIntel = () => {
<>
{(isLoading || branchMutation.isPending || carrierMutation.isPending) && }
- }
- onClick={openCreate}
- />
- }
- />
+
+ }
+ onClick={openCreate}
+ />
+ }
+ />
-
- {TABS.map((t) => (
-
- ))}
-
-
-
- {total} total · page {page} of {pageCount}
-
-
-
-
-
-
- {tab === 'branches' ? (
-
- #
- Company
- Area
- Phone
- Address
- Rate/Kg
- Actions
-
- ) : (
-
- #
- Company
- Weight Slab
- Zone
- Rate
- Actions
-
- )}
-
-
- {isLoading && }
- {rows.length === 0 && !isLoading ? (
-
-
- } />
-
-
- ) : (
- rows.map((row, index) => (
-
- {(page - 1) * PAGE_SIZE + index + 1}
- {tab === 'branches' ? (
- <>
- {row.company || '—'}
- {row.area || '—'}
- {row.phone || '—'}
-
-
- {row.address || '—'}
-
-
- {row.rate_per_kg || '—'}
- >
- ) : (
- <>
- {row.company || '—'}
- {row.weight_slab || '—'}
- {row.zone || '—'}
- {row.rate || '—'}
- >
- )}
-
-
- } onClick={() => openEdit(row)} />
- }
- onClick={() => handleDelete(row)}
- />
-
+
+
+ {total} total · page {page} of {pageCount}
+
+
+ }
+ tabs={
+
+ {TABS.map((t) => (
+
+ ))}
+
+ }
+ >
+
+
+
+ {tab === 'branches' ? (
+
+ #
+ Company
+ Area
+ Phone
+ Address
+ Rate/Kg
+ Actions
+
+ ) : (
+
+ #
+ Company
+ Weight Slab
+ Zone
+ Rate
+ Actions
+
+ )}
+
+
+ {isLoading && }
+ {rows.length === 0 && !isLoading ? (
+
+
+ }
+ />
- ))
- )}
-
-
-
-
+ ) : (
+ rows.map((row, index) => (
+
+ {(page - 1) * PAGE_SIZE + index + 1}
+ {tab === 'branches' ? (
+ <>
+ {row.company || '—'}
+ {row.area || '—'}
+ {row.phone || '—'}
+
+
+ {row.address || '—'}
+
+
+ {row.rate_per_kg || '—'}
+ >
+ ) : (
+ <>
+ {row.company || '—'}
+ {row.weight_slab || '—'}
+ {row.zone || '—'}
+ {row.rate || '—'}
+ >
+ )}
+
+
+ }
+ onClick={() => openEdit(row)}
+ />
+ }
+ onClick={() => handleDelete(row)}
+ />
+
+
+
+ ))
+ )}
+
+
+
- {pageCount > 1 && (
-
-
-
- )}
+ {pageCount > 1 && (
+ <>
+
+
+
+
+ >
+ )}
+
+
!next && setDialogOpen(false)} width={720} purpose="form">
!next && setDialogOpen(false)}
startContent={
@@ -351,7 +381,7 @@ const CompetitiveIntel = () => {
content={
{tab === 'branches' ? (
-
+
@@ -364,14 +394,29 @@ const CompetitiveIntel = () => {
placeholder="e.g. 600, or a note like 'Not Answered'"
/>
-
-
+
+
) : (
-
+
-
+
diff --git a/src/pages/nearle/customers/customers.js b/src/pages/nearle/customers/customers.js
index dbfab37..f7210fa 100644
--- a/src/pages/nearle/customers/customers.js
+++ b/src/pages/nearle/customers/customers.js
@@ -17,7 +17,6 @@ import {
import { Grid } from '@astryxdesign/core/Grid';
import { HStack } from '@astryxdesign/core/HStack';
import { VStack } from '@astryxdesign/core/VStack';
-import { Card } from '@astryxdesign/core/Card';
import { Text } from '@astryxdesign/core/Text';
import { Button } from '@astryxdesign/core/Button';
import { IconButton } from '@astryxdesign/core/IconButton';
@@ -34,6 +33,7 @@ import TableLoader from 'components/nearle_components/TableLoader';
import DebounceSearchBar from 'components/nearle_components/DebounceSearchBar';
import PageHeader from 'components/nearle_components/PageHeader';
import StatCard from 'components/nearle_components/StatCard';
+import { PageShell, KpiGrid, FilterToolbar, DataCard } from 'components/nearle_components/PageLayout';
import AddressAutocomplete from 'components/nearle_components/AddressAutocomplete';
import { MobileCard, MobileCardList, MobileField, MobileFieldGrid } from 'components/nearle_components/MobileCard';
import { getAdminCustomers, updateAdminCustomer } from 'pages/api/doormileApi';
@@ -162,55 +162,66 @@ const Customers = () => {
<>
{isLoading && }
-
- } onClick={() => navigate('/doormile/customer/create')} />
-
- }
- />
-
-
- } color={BRAND} />
- } color="#0ea5e9" />
- } color="#8b5cf6" />
- } color="#10b981" />
-
-
-
-
-
-
-
-
-
-
-
- Directory
-
-
- {customers.length} total · {rows.length} shown
-
-
-
-
-
+
+ }
+ onClick={() => navigate('/doormile/customer/create')}
/>
-
-
-
+
+ }
+ />
-
+
+ } color={BRAND} />
+ } color="#0ea5e9" />
+ } color="#8b5cf6" />
+ } color="#10b981" />
+
+
+
+
+
+
+
+
+
+ Directory
+
+
+ {customers.length} total · {rows.length} shown
+
+
+
+
+
+
+
+
+
+ }
+ >
{isMobile ? (
rows.length === 0 && !isLoading ? (
- } />
+ }
+ />
) : (
{rows.map((row, index) => (
@@ -232,7 +243,14 @@ const Customers = () => {
- } onClick={() => openEdit(row)} />
+ }
+ onClick={() => openEdit(row)}
+ />
}
>
@@ -262,7 +280,11 @@ const Customers = () => {
{rows.length === 0 && !isLoading ? (
- } />
+ }
+ />
) : (
@@ -305,7 +327,14 @@ const Customers = () => {
{custBookings(row)}
- } onClick={() => openEdit(row)} />
+ }
+ onClick={() => openEdit(row)}
+ />
@@ -315,8 +344,8 @@ const Customers = () => {
)}
-
-
+
+
!next && setEditRow(null)} width={760} purpose="form">
{
content={
-
+
setForm((f) => ({ ...f, name: v }))} />
{
onChange={(v) => setForm((f) => ({ ...f, phone: v.replace(/\D/g, '').slice(0, 10) }))}
startIcon={MdOutlinePhoneAndroid}
/>
- setForm((f) => ({ ...f, email: v }))} startIcon={MdMail} />
+ setForm((f) => ({ ...f, email: v }))}
+ startIcon={MdMail}
+ />
- The backend doesn't store an address against a customer yet — these fields aren't required and won't be saved on submit.
+ The backend doesn't store an address against a customer yet — these fields aren't required and won't be
+ saved on submit.
-
+
-
- setPickAddress((p) => ({ ...p, suburb: v }))} />
+
+ setPickAddress((p) => ({ ...p, suburb: v }))}
+ />
setPickAddress((p) => ({ ...p, city: v }))} />
setPickAddress((p) => ({ ...p, state: v }))} />
- setPickAddress((p) => ({ ...p, postcode: v }))} />
- setPickAddress((p) => ({ ...p, landmark: v }))} />
+ setPickAddress((p) => ({ ...p, postcode: v }))}
+ />
+ setPickAddress((p) => ({ ...p, landmark: v }))}
+ />
diff --git a/src/pages/nearle/deliveries/deliveries.js b/src/pages/nearle/deliveries/deliveries.js
index 4511ecc..38cd29f 100644
--- a/src/pages/nearle/deliveries/deliveries.js
+++ b/src/pages/nearle/deliveries/deliveries.js
@@ -14,15 +14,34 @@ import {
MdCheckCircle,
MdCancel,
MdInventory2,
- MdTune,
MdOutlineLocalShipping,
MdOutlinePendingActions,
MdOutlineCheckCircle,
MdOutlineCancel,
MdKeyboardArrowDown,
- MdKeyboardArrowUp
+ MdKeyboardArrowUp,
+ MdArrowDownward,
+ MdArrowUpward,
+ MdUnfoldMore,
+ MdViewColumn
} from 'react-icons/md';
import { useQuery, useMutation, useInfiniteQuery } from '@tanstack/react-query';
+// Same TanStack Table v9 entry point orders.js uses — table-core's feature
+// modules come through react-table's re-export, see that file's comment.
+import {
+ useTable,
+ flexRender,
+ tableFeatures,
+ rowSelectionFeature,
+ columnVisibilityFeature,
+ rowSortingFeature,
+ createSortedRowModel,
+ sortFns,
+ columnSizingFeature,
+ columnResizingFeature,
+ rowPaginationFeature,
+ createPaginatedRowModel
+} from '@tanstack/react-table';
import { addDays, addMonths, addWeeks, endOfMonth, endOfWeek, startOfMonth, startOfWeek } from 'date-fns';
import { DateRangePicker } from 'components/nearle_components/DateRangePicker';
@@ -30,17 +49,21 @@ import { DateRangePicker } from 'components/nearle_components/DateRangePicker';
import { Grid } from '@astryxdesign/core/Grid';
import { HStack } from '@astryxdesign/core/HStack';
import { VStack } from '@astryxdesign/core/VStack';
+import { Center } from '@astryxdesign/core/Center';
import { Card } from '@astryxdesign/core/Card';
import { Text } from '@astryxdesign/core/Text';
import { Button } from '@astryxdesign/core/Button';
import { IconButton } from '@astryxdesign/core/IconButton';
import { Tooltip } from '@astryxdesign/core/Tooltip';
import { Badge } from '@astryxdesign/core/Badge';
+import { Divider } from '@astryxdesign/core/Divider';
import { TextInput } from '@astryxdesign/core/TextInput';
import { NumberInput } from '@astryxdesign/core/NumberInput';
import { TextArea } from '@astryxdesign/core/TextArea';
import { Selector } from '@astryxdesign/core/Selector';
import { CheckboxInput } from '@astryxdesign/core/CheckboxInput';
+import { Pagination } from '@astryxdesign/core/Pagination';
+import { DropdownMenu, DropdownMenuCheckboxItem } from '@astryxdesign/core/DropdownMenu';
import { MoreMenu } from '@astryxdesign/core/MoreMenu';
import { Dialog, DialogHeader } from '@astryxdesign/core/Dialog';
import { Layout, LayoutContent, LayoutFooter } from '@astryxdesign/core/Layout';
@@ -69,6 +92,7 @@ import StatCard from 'components/nearle_components/StatCard';
import StatusBadge from 'components/nearle_components/StatusBadge';
import StatusTabs from 'components/nearle_components/StatusTabs';
import TableLoader from 'components/nearle_components/TableLoader';
+import { PageShell, KpiGrid, FilterToolbar, DataCard } from 'components/nearle_components/PageLayout';
import { MobileCard, MobileCardList, MobileField, MobileFieldGrid } from 'components/nearle_components/MobileCard';
import { useIsNarrowViewport } from 'hooks/useIsNarrowViewport';
@@ -77,7 +101,7 @@ import { useIsNarrowViewport } from 'hooks/useIsNarrowViewport';
// KPIs, tabs, status badges, and dialogs stay visually consistent.
// See src/themes/dt/tokens.js for the canonical source.
// ============================================================================
-import { DT, tint, edge } from 'themes/dt/tokens';
+import { DT, tint } from 'themes/dt/tokens';
import { TableScroll, AccentAvatar } from 'themes/dt/primitives';
import { getStatusMeta } from 'themes/dt/status';
@@ -203,28 +227,38 @@ const getRowBatchId = (row) => {
return null;
};
-const MetricPill = ({ color, label, tooltip, minWidth = 75 }) => (
-
-
- {label}
-
-
-);
+// Astryx's Badge IS this pill. The hand-rolled hardcoded 11px/700, its
+// own radius, border and a 75px min-width against the theme, so these cells
+// couldn't move with the type scale. `variant` is an enumerated Badge colour
+// rather than a hex: these are metric readouts (km, ₹), not lifecycle
+// statuses, so they must not go through StatusBadge.
+const MetricPill = ({ variant = 'neutral', label, tooltip }) =>
+ tooltip ? (
+
+
+
+ ) : (
+
+ );
+
+// TanStack Table v9 registers features explicitly, same shape as orders.js's
+// ORDERS_TABLE_FEATURES. Declared at module scope so the reference is stable
+// across renders. Column FILTERING is deliberately absent — the tab strip,
+// batch selector and search filter upstream in `filteredRows`.
+const DELIVERIES_TABLE_FEATURES = tableFeatures({
+ rowSelectionFeature,
+ columnVisibilityFeature,
+ rowSortingFeature,
+ sortedRowModel: createSortedRowModel(),
+ sortFns,
+ columnSizingFeature,
+ columnResizingFeature,
+ rowPaginationFeature,
+ paginatedRowModel: createPaginatedRowModel()
+});
+
+// Page sizes offered under the desktop table. 50 keeps the previous default.
+const PAGE_SIZE_OPTIONS = [10, 25, 50, 100];
// ================================================= || deliveries (initial point)|| =================================================
const Deliveries = () => {
@@ -322,6 +356,26 @@ const Deliveries = () => {
// about "now"); never `null` since there's no longer an "All" option.
const [selectedBatch, setSelectedBatch] = useState(detectInitialBatchId);
+ // showAction/showSelect only depend on tabstatus, computed here (rather than
+ // just before the return, where they used to live) so the TanStack Table
+ // hooks below — which need them for column visibility — can run
+ // unconditionally, before the `errorMessage` early return further down.
+ const showAction = tabstatus !== 'Cancelled' && tabstatus !== 'Delivered';
+ // No tab ever sets tabstatus to 'Created' (see handleChangetab below), so
+ // this — and the desktop table's whole select column — is currently
+ // unreachable. Left as-is; not this task's scope to fix.
+ const showSelect = tabstatus == 'Created';
+
+ // Desktop table's own pagination/sorting/selection/column-visibility state —
+ // deliberately separate from `page`/`rowsPerPage` above, which still drive
+ // fetchCountAPI's query params and the mobile card list's row numbering.
+ // Mixing the two would tie an unrelated API call's params to a UI-only
+ // pagination control.
+ const [sorting, setSorting] = useState([]);
+ const [tablePagination, setTablePagination] = useState({ pageIndex: 0, pageSize: 50 });
+ const [rowSelection, setRowSelection] = useState({});
+ const [userColumnVisibility, setUserColumnVisibility] = useState({});
+
useEffect(() => {
setTenantid(0);
setLocationid(0);
@@ -413,7 +467,9 @@ const Deliveries = () => {
setChangeDialogOpen(false);
if (res.success) {
logger.info(
- `Rider changed successfully for order ID ${selectedRow?.orderid}. New Rider: ${selectedRider?.displayname || selectedRider?.authname}`
+ `Rider changed successfully for order ID ${selectedRow?.orderid}. New Rider: ${
+ selectedRider?.displayname || selectedRider?.authname
+ }`
);
opentoast('Rider Changed Successfully', 'success');
}
@@ -491,6 +547,8 @@ const Deliveries = () => {
setCurrentStatus('cancelled');
}
setSearchword('');
+ setTablePagination((p) => ({ ...p, pageIndex: 0 }));
+ setRowSelection({});
};
const okclicked = () => {
@@ -582,6 +640,506 @@ const Deliveries = () => {
});
}, [countSourceRows, selectedBatch, currentStatus, debouncedSearch]);
+ // A batch/search change re-scopes the list (tab changes already reset this
+ // in handleChangetab), so page 1 is the only page that still means
+ // anything. Sorting and page size are the operator's own choices.
+ useEffect(() => {
+ setTablePagination((p) => ({ ...p, pageIndex: 0 }));
+ }, [selectedBatch, debouncedSearch]);
+
+ // Moved above the columns useMemo below (was previously declared just
+ // before the `errorMessage` early return, alongside tenantOptions etc.) —
+ // the 'action' column's cell closes over it, and a useMemo's factory runs
+ // synchronously the moment it's called, so it needs buildRowMenuItems to
+ // already be initialized, not just declared later in the same function body.
+ const buildRowMenuItems = (row) => {
+ const items = [];
+ if (row.orderstatus !== 'delivered') {
+ items.push({
+ label: 'Notify Rider',
+ icon:
,
+ onClick: () => notifyRiderMutation.mutate(row.milerprofileid)
+ });
+ }
+ if (['pending', 'accepted', 'arrived'].includes(row.orderstatus)) {
+ items.push({
+ label: 'Change Rider',
+ icon:
,
+ onClick: () => {
+ if (appId == null) {
+ opentoast('Please select a location first!', 'warning');
+ return;
+ }
+ setSelectedRow(row);
+ setChangeDialogOpen(true);
+ }
+ });
+ }
+ // Was gated to roleid 1/2 (staff-only), matching the reference app's
+ // identical gate — opened to every login per explicit decision, so
+ // tenant operators can reach the same Update Status fields staff
+ // already could.
+ items.push({
+ label: 'Update Status',
+ icon:
,
+ onClick: () => {
+ // PUT /admin/consignments/:id/status is consignment-scoped — it
+ // only exists once the rider marks pickup-complete (doormile-flow.md).
+ // Without a real consignmentid, updateDeliveryAPI's `?? deliveryid`
+ // fallback was sending the BOOKING id where a consignment id is
+ // required — a different id space, so the call failed against
+ // the wrong (or nonexistent) resource. Combined with the mutation's
+ // onSuccess only handling `res.success === true` with no else
+ // branch, that failure was completely silent — dialog just sat
+ // there looking like nothing happened. Block it here instead,
+ // with a message that explains why, rather than letting the
+ // submit silently no-op.
+ if (!row.consignmentid) {
+ opentoast("This order hasn't been picked up yet — status can only be updated once it becomes a consignment.", 'warning');
+ return;
+ }
+ setSelectedRow(row);
+ setKms(row.kms);
+ setCumulativeKms(row.cumulativekms);
+ setDeliverylat(row.droplat);
+ setDeliverylong(row.droplon);
+ setNotes(row.notes);
+ setDeliveryamount(row.deliveryamt ?? row.deliveryamount);
+ setUpdateStatus(row.orderstatus || 'delivered');
+ setCurrentorder(row);
+ setDialogopen(true);
+ }
+ });
+ if (row.orderstatus !== 'cancelled' && row.orderstatus !== 'delivered') {
+ items.push({
+ label: 'Cancel Delivery',
+ icon:
,
+ onClick: () => {
+ setSelectedRow(row);
+ setCancelDeliveryOpen(true);
+ }
+ });
+ }
+ return items;
+ };
+
+ // ==============================|| Desktop table model (TanStack Table v9) ||==============================
+ // Same engine and anatomy as orders.js's table: explicit column defs,
+ // sortable/resizable columns, a Columns visibility menu, page-scoped row
+ // selection, and page-number Pagination instead of scroll-triggered
+ // "load more". filteredRows is already the fully-loaded, fully-filtered
+ // dataset (see countSourceRows' auto-drain above), so — like orders.js —
+ // the table paginates a FULL in-memory array rather than a server page.
+ const columns = useMemo(
+ () => [
+ {
+ id: 'select',
+ size: 44,
+ minSize: 44,
+ enableSorting: false,
+ enableResizing: false,
+ enableHiding: false,
+ meta: { label: 'Select' },
+ header: ({ table: t }) => (
+
t.toggleAllPageRowsSelected(!!checked)}
+ />
+ ),
+ cell: ({ row }) => (
+ row.toggleSelected(!!checked)}
+ />
+ )
+ },
+ {
+ id: 'serial',
+ size: 56,
+ minSize: 48,
+ enableSorting: false,
+ meta: { label: '#' },
+ header: () => (
+
+ #
+
+ ),
+ cell: ({ table: t, row }) => (
+
+ {String(tablePagination.pageIndex * tablePagination.pageSize + t.getRowModel().rows.indexOf(row) + 1).padStart(2, '0')}
+
+ )
+ },
+ {
+ id: 'status',
+ accessorKey: 'orderstatus',
+ size: 130,
+ minSize: 100,
+ meta: { label: 'Status' },
+ header: () => (
+
+ Status
+
+ ),
+ cell: ({ getValue }) =>
+ },
+ {
+ id: 'tenant',
+ accessorKey: 'tenantname',
+ size: 170,
+ minSize: 130,
+ meta: { label: 'Tenant' },
+ header: () => (
+
+ Tenant
+
+ ),
+ cell: ({ row }) => (
+
+
+
+ {row.original.tenantname}
+
+
+ {row.original.tenantsuburb}
+
+
+ {row.original.applocation}
+
+
+
+ )
+ },
+ {
+ id: 'orderLocation',
+ accessorFn: (row) => row.orderid,
+ size: 220,
+ minSize: 160,
+ enableSorting: false,
+ meta: { label: 'Order / Location' },
+ header: () => (
+
+ Order / Location
+
+ ),
+ cell: ({ row }) => {
+ const r = row.original;
+ return (
+
+
+ {r.locationsuburb ? `${r.locationname}-(${r.locationsuburb})` : r.locationname}
+
+
+
+
+ {r.orderid}
+
+ {/* express-console-api.md: Doormile timestamps are IST
+ wall-clock with no timezone marker — bare dayjs() was
+ still being used here despite this comment saying
+ otherwise (the fix was never actually applied below,
+ only claimed) — a Z-suffixed response reinterprets as
+ local time and shifts 5:30, showing the wrong time
+ (and sometimes the wrong day). parseDoormileTimestamp
+ strips that, matching getRowBatchId above. */}
+
+ {parseDoormileTimestamp(r.orderdate).format('DD/MM/YYYY')}
+
+
+ {parseDoormileTimestamp(r.orderdate).format('hh:mm A')}
+
+
+ -
+
+
+ {r.deliveryid}
+
+
+ {parseDoormileTimestamp(r.deliverydate).format('DD/MM/YYYY')}
+
+
+ {parseDoormileTimestamp(r.deliverydate).format('hh:mm A')}
+
+
+
+
+ );
+ }
+ },
+ {
+ id: 'pickup',
+ accessorKey: 'pickupcustomer',
+ size: 190,
+ minSize: 140,
+ meta: { label: 'Pickup' },
+ header: () => (
+
+ Pickup
+
+ ),
+ // pickup — capped to the same maxWidth as drop below, with CSS ellipsis
+ // truncation, so one long address can't stretch this column wider than
+ // its neighbour. row.pickuplocation is just the full raw address (see
+ // fetchDeliveries in api.js), not a pre-shortened name, so the old
+ // `.slice(0, 14)` fallback never actually ran. Full text still
+ // available via the tooltip.
+ cell: ({ row }) => (
+
+
+ {row.original.pickupcustomer}
+
+
+ {row.original.pickupcontactno}
+
+
+
+ {row.original.pickuplocation || row.original.Pickupaddress || '—'}
+
+
+
+ )
+ },
+ {
+ id: 'drop',
+ accessorKey: 'deliverycustomer',
+ size: 190,
+ minSize: 140,
+ meta: { label: 'Drop' },
+ header: () => (
+
+ Drop
+
+ ),
+ cell: ({ row }) => (
+
+
+ {row.original.deliverycustomer}
+
+
+ {row.original.deliverycontactno}
+
+
+
+ {row.original.deliverylocation || row.original.deliveryaddress || '—'}
+
+
+
+ )
+ },
+ {
+ id: 'rider',
+ accessorKey: 'ridername',
+ size: 180,
+ minSize: 140,
+ sortUndefined: 'last',
+ meta: { label: 'Rider' },
+ header: () => (
+
+ Rider
+
+ ),
+ cell: ({ row }) => {
+ const r = row.original;
+ return r.ridername ? (
+
+
+
+
+
+
+ {r.ridername}
+
+
+ ID #{r.userid} · {r.ridercontact || '—'}
+
+
+
+ ) : (
+
+ Unassigned
+
+ );
+ }
+ },
+ {
+ id: 'eta',
+ accessorFn: (row) => row.expecteddeliverytime || undefined,
+ size: 100,
+ minSize: 90,
+ sortUndefined: 'last',
+ meta: { label: 'ETA' },
+ header: () => (
+
+ ETA
+
+ ),
+ cell: ({ getValue }) => {
+ const v = getValue();
+ return (
+
+ {v ? parseDoormileTimestamp(v).format('hh:mm A') : '—'}
+
+ );
+ }
+ },
+ {
+ id: 'kms',
+ accessorFn: (row) => Number(row.kms) || undefined,
+ size: 110,
+ minSize: 90,
+ sortUndefined: 'last',
+ meta: { label: 'Kms' },
+ header: () => (
+
+ Kms
+
+ ),
+ cell: ({ getValue }) => (
+
+
+
+ )
+ },
+ {
+ id: 'amount',
+ accessorFn: (row) => Number(row.deliverycharges) || undefined,
+ size: 150,
+ minSize: 120,
+ sortUndefined: 'last',
+ meta: { label: 'Amount' },
+ header: () => (
+
+ Amount
+
+ ),
+ cell: ({ row }) => (
+
+
+
+
+ )
+ },
+ {
+ id: 'notes',
+ accessorKey: 'notes',
+ size: 170,
+ minSize: 120,
+ enableSorting: false,
+ meta: { label: 'Notes' },
+ header: () => (
+
+ Notes
+
+ ),
+ cell: ({ getValue }) => {
+ const v = getValue();
+ return v ? (
+
+
+ {v}
+
+
+ ) : (
+
+ —
+
+ );
+ }
+ },
+ {
+ id: 'qty',
+ accessorKey: 'Quantity',
+ size: 80,
+ minSize: 64,
+ meta: { label: 'Qty' },
+ header: () => (
+
+ Qty
+
+ ),
+ cell: ({ row }) => (
+
+ {row.original.Quantity || '—'}
+
+ )
+ },
+ {
+ id: 'action',
+ size: 90,
+ minSize: 80,
+ enableSorting: false,
+ enableResizing: false,
+ enableHiding: false,
+ meta: { label: 'Action', align: 'right' },
+ header: () => (
+
+ Action
+
+ ),
+ cell: ({ row }) => {
+ const r = row.original;
+ const isOpen = productCollapse?.orderid === r?.orderid;
+ return (
+
+ {r.deliverytype == 'C' && (
+ : }
+ onClick={() => {
+ if (isOpen) {
+ setProductCollapse(null);
+ setOrderHeaderId(null);
+ } else {
+ setProductCollapse(r);
+ setOrderHeaderId(r.orderheaderid);
+ }
+ }}
+ />
+ )}
+
+
+ );
+ }
+ }
+ ],
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ [tablePagination.pageIndex, tablePagination.pageSize, productCollapse]
+ );
+
+ // Two sources feed one visibility slice: whatever the operator toggled in
+ // the Columns menu, plus the checkbox/action columns, which the ACTIVE TAB
+ // owns (same pattern as orders.js's `select` column).
+ const columnVisibility = useMemo(
+ () => ({ ...userColumnVisibility, select: showSelect, action: showAction }),
+ [userColumnVisibility, showSelect, showAction]
+ );
+
+ const table = useTable({
+ features: DELIVERIES_TABLE_FEATURES,
+ data: filteredRows,
+ columns,
+ getRowId: (row, index) => String(row.orderheaderid ?? `row-${index}`),
+ columnResizeMode: 'onChange',
+ state: { rowSelection, columnVisibility, sorting, pagination: tablePagination },
+ onRowSelectionChange: setRowSelection,
+ onColumnVisibilityChange: setUserColumnVisibility,
+ onSortingChange: setSorting,
+ onPaginationChange: setTablePagination
+ });
+
+ const colCount = table.getVisibleLeafColumns().length;
+
// Counts per status, scoped to the selected batch. Keys mirror the legacy
// *Length keys returned by fetchCountAPI so the JSX swap-in is mechanical
// (countData?.uncoveredLength → batchCounts.uncoveredLength).
@@ -685,8 +1243,11 @@ const Deliveries = () => {
/* ============================================= || fetchcount | ============================================= */
+ // `data` (fetchCountAPI's own count breakdown) is no longer read — the KPI
+ // tiles above now derive from batchCounts/batchTotals instead (see the
+ // comment there). This query still runs for isLoading/isError/refetch,
+ // which other code below still depends on.
const {
- data: countData = {}, // Default to empty object
isLoading: fetchCountIsLoading,
isError: fetchCountIsError,
error: fetchCountError,
@@ -761,78 +1322,14 @@ const Deliveries = () => {
return { value: String(r.userid), label: r?.contactno ? `${name} (${r.contactno})` : name };
});
- const batchSelectorOptions = BATCH_OPTIONS.map((b) => ({ value: b.id, label: `${b.label} · ${batchTotals[b.id] ?? 0}` }));
-
- const buildRowMenuItems = (row) => {
- const items = [];
- if (row.orderstatus !== 'delivered') {
- items.push({
- label: 'Notify Rider',
- icon: ,
- onClick: () => notifyRiderMutation.mutate(row.milerprofileid)
- });
- }
- if (['pending', 'accepted', 'arrived'].includes(row.orderstatus)) {
- items.push({
- label: 'Change Rider',
- icon: ,
- onClick: () => {
- if (appId == null) {
- opentoast('Please select a location first!', 'warning');
- return;
- }
- setSelectedRow(row);
- setChangeDialogOpen(true);
- }
- });
- }
- // Was gated to roleid 1/2 (staff-only), matching the reference app's
- // identical gate — opened to every login per explicit decision, so
- // tenant operators can reach the same Update Status fields staff
- // already could.
- items.push({
- label: 'Update Status',
- icon: ,
- onClick: () => {
- // PUT /admin/consignments/:id/status is consignment-scoped — it
- // only exists once the rider marks pickup-complete (doormile-flow.md).
- // Without a real consignmentid, updateDeliveryAPI's `?? deliveryid`
- // fallback was sending the BOOKING id where a consignment id is
- // required — a different id space, so the call failed against
- // the wrong (or nonexistent) resource. Combined with the mutation's
- // onSuccess only handling `res.success === true` with no else
- // branch, that failure was completely silent — dialog just sat
- // there looking like nothing happened. Block it here instead,
- // with a message that explains why, rather than letting the
- // submit silently no-op.
- if (!row.consignmentid) {
- opentoast("This order hasn't been picked up yet — status can only be updated once it becomes a consignment.", 'warning');
- return;
- }
- setSelectedRow(row);
- setKms(row.kms);
- setCumulativeKms(row.cumulativekms);
- setDeliverylat(row.droplat);
- setDeliverylong(row.droplon);
- setNotes(row.notes);
- setDeliveryamount(row.deliveryamt ?? row.deliveryamount);
- setUpdateStatus(row.orderstatus || 'delivered');
- setCurrentorder(row);
- setDialogopen(true);
- }
- });
- if (row.orderstatus !== 'cancelled' && row.orderstatus !== 'delivered') {
- items.push({
- label: 'Cancel Delivery',
- icon: ,
- onClick: () => {
- setSelectedRow(row);
- setCancelDeliveryOpen(true);
- }
- });
- }
- return items;
- };
+ // Trims the redundant " Batch" off BATCH_OPTIONS' own label (which stays
+ // full elsewhere, e.g. the empty-state message) — "Afternoon Batch · 89"
+ // was overflowing/wrapping inside the selector's compact trigger, squeezed
+ // to a 200px FilterToolbar track alongside four other filters.
+ const batchSelectorOptions = BATCH_OPTIONS.map((b) => ({
+ value: b.id,
+ label: `${b.label.replace(/ Batch$/, '')} · ${batchTotals[b.id] ?? 0}`
+ }));
const renderProductDetails = () => (
@@ -901,142 +1398,142 @@ const Deliveries = () => {
);
- const showAction = tabstatus !== 'Cancelled' && tabstatus !== 'Delivered';
- const showSelect = tabstatus == 'Created';
- const totalCols = 15 + (showAction ? 1 : 0) + (showSelect ? 1 : 0);
-
const emptyDescription =
selectedBatch === 'all'
? `No ${(getStatusMeta(currentStatus)?.label || tabstatus).toLowerCase()} orders for this filter.`
- : `No ${(getStatusMeta(currentStatus)?.label || tabstatus).toLowerCase()} orders in ${BATCH_OPTIONS.find((b) => b.id === selectedBatch)?.label || 'this batch'}.`;
+ : `No ${(getStatusMeta(currentStatus)?.label || tabstatus).toLowerCase()} orders in ${
+ BATCH_OPTIONS.find((b) => b.id === selectedBatch)?.label || 'this batch'
+ }.`;
return (
<>
- {(fetchCountIsLoading || countSourceIsLoading || fetchtenantsIsLoading || fetchlocationsIsLoading || riderListIsLoading) && }
+ {(fetchCountIsLoading || countSourceIsLoading || fetchtenantsIsLoading || fetchlocationsIsLoading || riderListIsLoading) && (
+
+ )}
- }
- />
+
+
+ }
+ />
-
- {[
- { ...KPI_META[0], value: batchTotals.all },
- { ...KPI_META[1], value: countData?.uncoveredLength },
- { ...KPI_META[2], value: countData?.coveredLength },
- { ...KPI_META[3], value: countData?.cancelLength }
- ].map((item) => {
- const Icon = item.icon;
- return } color={item.color} loading={fetchCountIsLoading} />;
- })}
-
+ {/* All four tiles now read off the same countSourceRows-derived data
+ the StatusTabs pills use (batchTotals/batchCounts), instead of
+ three of them reading a separate, unscoped `fetchCountAPI` call —
+ fetchCountAPI ignores every argument passed to it (see api.js) and
+ returns an ALL-TIME, un-batched, un-dated total, which is why
+ "Pending Orders" could show a number the Pending tab itself
+ disagreed with. Same fix orders.js's KPI row already applies:
+ a tile and its tab must read the same source so they can't drift. */}
+
+ {[
+ { ...KPI_META[0], value: batchTotals.all },
+ { ...KPI_META[1], value: batchCounts.uncoveredLength },
+ { ...KPI_META[2], value: batchCounts.coveredLength },
+ { ...KPI_META[3], value: batchCounts.cancelLength }
+ ].map((item) => {
+ const Icon = item.icon;
+ return (
+ }
+ color={item.color}
+ loading={countSourceIsLoading}
+ />
+ );
+ })}
+
-
-
-
-
-
-
- Filters
-
-
-
- v && setSelectedBatch(v)}
- placeholder="Batch"
- />
+
+ v && setSelectedBatch(v)}
+ placeholder="Batch"
+ />
- setOpen(true)}
- onKeyDown={(e) => {
- if (e.key === 'Enter' || e.key === ' ') setOpen(true);
- }}
- style={{
- display: 'flex',
- alignItems: 'center',
- gap: 8,
- padding: '8px 12px',
- borderRadius: 10,
- cursor: 'pointer',
- background: '#fff',
- border: '1px solid #e2e8f0'
- }}
- >
-
-
-
-
- {startdate && enddate ? `${dayjs(startdate).format('DD MMM')} – ${dayjs(enddate).format('DD MMM')}` : 'Select date range'}
-
-
+ }
+ onClick={() => setOpen(true)}
+ />
- {
- if (!v) {
- setTenantid(0);
- return;
- }
- const t = (tenantlist || []).find((x) => String(x.tenantid) === v);
- setTenantid(t?.tenantid || 0);
- }}
- placeholder="Select Tenant"
- hasSearch
- hasClear
- isDisabled={appId == null}
- disabledMessage="Please select your zone first!"
- />
+ {
+ if (!v) {
+ setTenantid(0);
+ return;
+ }
+ const t = (tenantlist || []).find((x) => String(x.tenantid) === v);
+ setTenantid(t?.tenantid || 0);
+ }}
+ placeholder="Select Tenant"
+ hasSearch
+ hasClear
+ isDisabled={appId == null}
+ disabledMessage="Please select your zone first!"
+ />
- {
- if (!v) {
- setLocationid(0);
- return;
- }
- const l = (locationlist || []).find((x) => String(x.locationid) === v);
- setLocationid(l?.locationid || 0);
- }}
- placeholder="Select Location"
- hasSearch
- hasClear
- isDisabled={!tenantid}
- disabledMessage={appId == null ? 'Please select your Zone and Tenant first!' : 'Please select your Tenant first!'}
- />
+ {
+ if (!v) {
+ setLocationid(0);
+ return;
+ }
+ const l = (locationlist || []).find((x) => String(x.locationid) === v);
+ setLocationid(l?.locationid || 0);
+ }}
+ placeholder="Select Location"
+ hasSearch
+ hasClear
+ isDisabled={!tenantid}
+ disabledMessage={appId == null ? 'Please select your Zone and Tenant first!' : 'Please select your Tenant first!'}
+ />
- setRiderid(v ? Number(v) : 0)}
- placeholder="Choose Rider"
- hasSearch
- hasClear
- isDisabled={riderListIsLoading || appId == null}
- disabledMessage="Please select your zone first!"
- />
-
-
-
-
-
-
-
+ setRiderid(v ? Number(v) : 0)}
+ placeholder="Choose Rider"
+ hasSearch
+ hasClear
+ isDisabled={riderListIsLoading || appId == null}
+ disabledMessage="Please select your zone first!"
+ />
+
+ }
+ tabs={
+
{
@@ -1047,17 +1544,44 @@ const Deliveries = () => {
size="sm"
hasDivider={false}
/>
-
-
-
-
-
-
+
+
+
+
-
+ {/* Columns menu — driven by the same `columnVisibility` slice
+ the tab uses for select/action, so there is one source of
+ truth for "is this column showing" (same pattern as
+ orders.js). Only rendered for the desktop table. */}
+ {!isMobile && (
+ }}
+ menuWidth={200}
+ placement="below"
+ >
+ {table
+ .getAllLeafColumns()
+ .filter((column) => column.getCanHide())
+ .map((column) => (
+ column.toggleVisibility(checked)}
+ hasCloseOnSelect={false}
+ />
+ ))}
+
+ )}
+
+
+ }
+ >
{isMobile ? (
- {filteredRows.length === 0 && !loading1 && !countSourceLoading && } />}
+ {filteredRows.length === 0 && !loading1 && !countSourceLoading && (
+ } />
+ )}
{filteredRows.length === 0 && countSourceLoading && (
@@ -1182,20 +1706,22 @@ const Deliveries = () => {
)}
-
+
-
+
-
-
+
-
-
+
+
@@ -1213,7 +1739,7 @@ const Deliveries = () => {
)}
- {isOpen && {renderProductDetails()}
}
+ {isOpen && {renderProductDetails()}
}
);
})}
@@ -1230,311 +1756,183 @@ const Deliveries = () => {
)}
) : (
-
-
-
-
- {showSelect && (
-
- 0 && deliverylist.length === filteredRows.length ? true : deliverylist.length > 0 ? 'indeterminate' : false}
- onChange={(checked) => setDeliverylist(checked ? [...filteredRows] : [])}
- />
-
- )}
- #
- Status
- Tenant
- Order / Location
- Pickup
- Drop
- Rider
- ETA
- Transit
- Kms
- Amount
- Notes
- Step
- Qty
- COD
- {showAction && Action }
-
-
-
- {(loading1 || countSourceIsLoading) && }
- {filteredRows.length == 0 && !loading1 && !countSourceLoading && (
-
-
- } />
-
-
- )}
- {filteredRows.length == 0 && countSourceLoading && (
-
-
-
-
- Loading deliveries…
-
-
-
- )}
- {filteredRows.map((row, index) => {
- const isSelected = !!deliverylist.find((res1) => res1.orderheaderid == row.orderheaderid);
- const isOpen = productCollapse?.orderid === row?.orderid;
- return (
-
-
- {showSelect && (
-
- {
- if (checked) {
- setDeliverylist([...deliverylist, { ...row, sno: deliverylist.length + 1 }]);
- } else {
- const res = deliverylist.find((res1) => res1.orderheaderid == row.orderheaderid);
- if (res) {
- const arr = deliverylist.filter((_, i) => i !== res.sno - 1);
- arr.forEach((val, i) => (val.sno = i + 1));
- setDeliverylist(arr);
- }
+ <>
+
+
+ {/* table-layout: fixed makes the declared column widths
+ AUTHORITATIVE — same reasoning as orders.js's table.
+ Widths come from header.getSize(), the columnSizing slice
+ the drag handles write to. */}
+
+
+ {table.getHeaderGroups().map((headerGroup) => (
+
+ {headerGroup.headers.map((header) => {
+ const align = header.column.columnDef.meta?.align;
+ const canSort = header.column.getCanSort();
+ const sorted = header.column.getIsSorted();
+ return (
+
+ {
+ if (e.key === 'Enter' || e.key === ' ') {
+ e.preventDefault();
+ header.column.toggleSorting();
+ }
+ }
+ : undefined
}
- }}
- />
-
- )}
-
-
- {String(page * rowsPerPage + index + 1).padStart(2, '0')}
-
-
-
-
-
-
-
-
-
- {row.tenantname}
-
-
- {row.tenantsuburb}
-
-
- {row.applocation}
-
-
-
-
-
-
- {row.locationsuburb ? `${row.locationname}-(${row.locationsuburb})` : row.locationname}
-
-
-
-
- {row.orderid}
-
- {/* express-console-api.md: Doormile timestamps are IST
- wall-clock with no timezone marker — bare dayjs() was
- still being used here despite this comment saying
- otherwise (the fix was never actually applied below,
- only claimed) — a Z-suffixed response reinterprets as
- local time and shifts 5:30, showing the wrong time
- (and sometimes the wrong day). parseDoormileTimestamp
- strips that, matching getRowBatchId above. */}
-
- {parseDoormileTimestamp(row.orderdate).format('DD/MM/YYYY')}
-
-
- {parseDoormileTimestamp(row.orderdate).format('hh:mm A')}
-
-
- -
-
-
- {row.deliveryid}
-
-
- {parseDoormileTimestamp(row.deliverydate).format('DD/MM/YYYY')}
-
-
- {parseDoormileTimestamp(row.deliverydate).format('hh:mm A')}
-
-
-
-
- {/* pickup — capped to the same maxWidth as drop below, with CSS
- ellipsis truncation, so one long address can't stretch this
- column wider than its neighbour. row.pickuplocation is just
- the full raw address (see fetchDeliveries in api.js), not a
- pre-shortened name, so the old `.slice(0, 14)` fallback never
- actually ran — it was always overridden by the untruncated
- value on its left. Full text still available via the tooltip. */}
-
-
-
- {row.pickupcustomer}
-
-
- {row.pickupcontactno}
-
-
-
- {row.pickuplocation || row.Pickupaddress || '—'}
-
-
-
-
- {/* drop — same maxWidth/truncation treatment as pickup above. */}
-
-
-
- {row.deliverycustomer}
-
-
- {row.deliverycontactno}
-
-
-
- {row.deliverylocation || row.deliveryaddress || '—'}
-
-
-
-
-
- {row.ridername ? (
-
-
-
-
-
-
- {row.ridername}
-
-
- ID #{row.userid} · {row.ridercontact || '—'}
-
-
-
- ) : (
-
- Unassigned
-
- )}
-
-
-
- {row.expecteddeliverytime ? parseDoormileTimestamp(row.expecteddeliverytime).format('hh:mm A') : '—'}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {row.notes ? (
-
-
- {row.notes}
-
-
- ) : (
-
- —
-
- )}
-
-
- {row.step ? : (
-
- —
-
- )}
-
-
-
- {row.Quantity || '—'}
-
-
-
-
- {row.collectionamt ? `₹ ${row.collectionamt.toFixed(2)}` : '—'}
-
-
- {showAction && (
-
-
- {row.deliverytype == 'C' && (
- : }
- onClick={() => {
- if (isOpen) {
- setProductCollapse(null);
- setOrderHeaderId(null);
- } else {
- setProductCollapse(row);
- setOrderHeaderId(row.orderheaderid);
- }
+ style={canSort ? { cursor: 'pointer', userSelect: 'none' } : undefined}
+ >
+ {flexRender(header.column.columnDef.header, header.getContext())}
+ {canSort &&
+ (sorted === 'asc' ? (
+
+ ) : sorted === 'desc' ? (
+
+ ) : (
+
+ ))}
+
+
+ {header.column.getCanResize() && (
+
+ >
+
+
)}
-
-
-
- )}
+
+ );
+ })}
- {isOpen && (
-
-
- {renderProductDetails()}
-
-
- )}
-
- );
- })}
- {countSourceRows?.length != 0 && (
-
-
-
- {countIsFetchingNext || countHasNext ? (
+ ))}
+
+
+
+ {(loading1 || countSourceIsLoading) && }
+
+ {filteredRows.length === 0 && !loading1 && !countSourceLoading && (
+
+ {/* Same fix as orders.js: in `fill` mode the row/cell
+ only shrink-to-fit their content — TableScroll's
+ outer div caps at maxHeight but doesn't stretch to
+ it — so a lone empty-state row sat at the top of a
+ lot of leftover space instead of centering in it. */}
+
+
+ } />
+
+
+
+ )}
+
+ {filteredRows.length === 0 && countSourceLoading && (
+
+
- ) : (
-
- · End of list ·
+
+ Loading deliveries…
- )}
-
-
-
- )}
-
-
-
+
+
+ )}
+
+ {table.getRowModel().rows.map((row) => {
+ const isOpen = productCollapse?.orderid === row.original?.orderid;
+ return (
+
+
+ {row.getVisibleCells().map((cell) => (
+
+ {flexRender(cell.column.columnDef.cell, cell.getContext())}
+
+ ))}
+
+ {isOpen && (
+
+
+ {renderProductDetails()}
+
+
+ )}
+
+ );
+ })}
+
+
+
+
+
+ {/* Page-number Pagination replaces the scroll-to-reveal sentinel —
+ same swap orders.js made. filteredRows is the full, already-
+ loaded dataset (see countSourceRows' auto-drain above), so this
+ paginates an in-memory array, not a server page. */}
+ {filteredRows.length > 0 && (
+ <>
+
+
+
+ {`${tablePagination.pageIndex * tablePagination.pageSize + 1}–${Math.min(
+ (tablePagination.pageIndex + 1) * tablePagination.pageSize,
+ filteredRows.length
+ )} of ${filteredRows.length} deliver${filteredRows.length === 1 ? 'y' : 'ies'}`}
+
+ table.setPageIndex(nextPage - 1)}
+ totalItems={filteredRows.length}
+ pageSize={tablePagination.pageSize}
+ pageSizeOptions={PAGE_SIZE_OPTIONS}
+ onPageSizeChange={(size) => table.setPageSize(size)}
+ size="sm"
+ label="Deliveries pagination"
+ />
+
+ >
+ )}
+ >
)}
-
-
+
+
{/* =============================== || cancel dialog || =============================== */}
!next && setCancelDeliveryOpen(false)} width={420} purpose="required">
@@ -1553,7 +1951,13 @@ const Deliveries = () => {
}
content={
-
+
}
footer={
@@ -1621,7 +2025,9 @@ const Deliveries = () => {
onClick={() => {
setLoading1(true);
logger.info(
- `Initiating rider assignment change for order ID ${selectedRow?.orderid} to rider: ${selectedRider?.displayname || selectedRider?.authname}`
+ `Initiating rider assignment change for order ID ${selectedRow?.orderid} to rider: ${
+ selectedRider?.displayname || selectedRider?.authname
+ }`
);
changeRiderMutation.mutate({ selectedRider, selectedRow });
}}
@@ -1634,7 +2040,11 @@ const Deliveries = () => {
{/* =============================== || Date filter Dialog || =============================== */}
!next && setOpen(false)} width={640} purpose="form">
- !next && setOpen(false)} />
+ !next && setOpen(false)}
+ />
{
content={
-
+
setKms(v ?? '')} />
- setCumulativeKms(v ?? '')} />
+ setCumulativeKms(v ?? '')}
+ />
- setDeliveryamount(v ?? '')} />
+ setDeliveryamount(v ?? '')}
+ />
({ value: s, label: getStatusMeta(s).label }))}
+ options={['pending', 'accepted', 'started', 'arrived', 'delivered', 'cancelled'].map((s) => ({
+ value: s,
+ label: getStatusMeta(s).label
+ }))}
value={updateStatus}
onChange={setUpdateStatus}
/>
diff --git a/src/pages/nearle/dispatch/Dispatch.css b/src/pages/nearle/dispatch/Dispatch.css
index 8999344..50d9edf 100644
--- a/src/pages/nearle/dispatch/Dispatch.css
+++ b/src/pages/nearle/dispatch/Dispatch.css
@@ -33,7 +33,7 @@
flex-direction: column;
background: var(--bg);
color: var(--text);
- font-family: 'Inter', -apple-system, sans-serif;
+ font-family: var(--font-family-body);
overflow: hidden;
position: relative;
}
@@ -260,7 +260,7 @@
font-size: 13px;
color: var(--text);
font-weight: 600;
- font-family: 'JetBrains Mono', monospace;
+ font-family: var(--font-family-code);
background: var(--bg-sub);
padding: 7px 16px;
border-radius: 10px;
@@ -4367,7 +4367,7 @@
}
.dispatch-container .cmp-pop {
- font-family: 'Inter', -apple-system, sans-serif;
+ font-family: var(--font-family-body);
color: #0f172a;
line-height: 1.35;
}
@@ -4479,7 +4479,7 @@
}
.dispatch-container .cmp-pop-coord {
- font-family: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
+ font-family: var(--font-family-code);
font-size: 10.5px;
font-weight: 600;
color: #475569;
@@ -4798,7 +4798,7 @@
/* Custom Order ID & Phone tags */
.dispatch-container .pu-order-tag {
- font-family: 'JetBrains Mono', monospace;
+ font-family: var(--font-family-code);
font-size: 11px;
color: #4f46e5 !important;
background: #f5f3ff;
@@ -4808,13 +4808,13 @@
}
.dispatch-container .pu-phone-tag {
- font-family: 'JetBrains Mono', monospace;
+ font-family: var(--font-family-code);
font-size: 11.5px;
color: #334155;
}
.dispatch-container .pu-coord-tag {
- font-family: 'JetBrains Mono', monospace;
+ font-family: var(--font-family-code);
font-size: 10.5px;
color: #64748b !important;
}
@@ -5003,7 +5003,7 @@
}
.dispatch-container .live-rider-popup .pu-order-badge {
- font-family: 'JetBrains Mono', monospace;
+ font-family: var(--font-family-code);
font-size: 11px;
color: #4f46e5;
background: #f5f3ff;
@@ -5017,7 +5017,7 @@
color: #0284c7;
text-decoration: none;
transition: color 0.15s ease;
- font-family: 'JetBrains Mono', monospace;
+ font-family: var(--font-family-code);
font-weight: 700;
}
@@ -5039,7 +5039,7 @@
}
.dispatch-container .live-rider-popup .pu-coordinates {
- font-family: 'JetBrains Mono', monospace;
+ font-family: var(--font-family-code);
font-size: 11px;
color: #64748b;
background: #f8fafc;
@@ -8099,7 +8099,7 @@
}
.dispatch-container .cdp-clock-time {
- font-family: 'SF Mono', 'Roboto Mono', 'Menlo', 'Consolas', monospace;
+ font-family: var(--font-family-code);
font-size: 24px;
font-weight: 700;
color: #f1f5f9;
@@ -9088,7 +9088,7 @@
padding: 1px 6px;
border-radius: 4px;
margin: 0 4px;
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
+ font-family: var(--font-family-code);
font-size: 11.5px;
}
@@ -9404,7 +9404,7 @@
.dispatch-container .da-error-meta {
font-size: 11px;
color: #b45353;
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
+ font-family: var(--font-family-code);
}
/* ---- Single-batch detail view ---- */
@@ -9572,7 +9572,7 @@
background: #f1f5f9;
padding: 2px 6px;
border-radius: 4px;
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
+ font-family: var(--font-family-code);
font-size: 11.5px;
color: #1e293b;
}
@@ -9986,7 +9986,7 @@
.dispatch-container .da-transfer-id {
font-weight: 800;
color: #1e293b;
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
+ font-family: var(--font-family-code);
}
.dispatch-container .da-transfer-from {
diff --git a/src/pages/nearle/dispatch/Preview.js b/src/pages/nearle/dispatch/Preview.js
index d271a77..fad82cc 100644
--- a/src/pages/nearle/dispatch/Preview.js
+++ b/src/pages/nearle/dispatch/Preview.js
@@ -885,7 +885,7 @@ const Preview = () => {
-
+
{r.orders.map((o, idx) => (
}
- />
- );
+ return } />;
}
return (
@@ -295,7 +290,11 @@ function CostTile({ icon, color, label, amount, footnote }) {
return (
-
+
{icon}
@@ -322,7 +321,7 @@ function RiderDetailPanel({ metrics }) {
return (
-
+
}
color={STATUS.info}
@@ -506,7 +505,7 @@ export default function ProfitabilitySection({
-
+
= 0 ? '+' : ''}${slotMargin.toFixed(0)}% margin`}
/>
-
+
Riders list
{sorted.length === 0 ? (
- }
- />
+ } />
) : (
{sorted.map((rider) => (
diff --git a/src/pages/nearle/exceptions/exceptions.js b/src/pages/nearle/exceptions/exceptions.js
index 06e8bca..4f7104b 100644
--- a/src/pages/nearle/exceptions/exceptions.js
+++ b/src/pages/nearle/exceptions/exceptions.js
@@ -6,7 +6,6 @@ import { enqueueSnackbar } from 'notistack';
import { Grid } from '@astryxdesign/core/Grid';
import { HStack } from '@astryxdesign/core/HStack';
import { VStack } from '@astryxdesign/core/VStack';
-import { Card } from '@astryxdesign/core/Card';
import { Text } from '@astryxdesign/core/Text';
import { Button } from '@astryxdesign/core/Button';
import { IconButton } from '@astryxdesign/core/IconButton';
@@ -24,6 +23,7 @@ import TableLoader from 'components/nearle_components/TableLoader';
import DebounceSearchBar from 'components/nearle_components/DebounceSearchBar';
import PageHeader from 'components/nearle_components/PageHeader';
import StatCard from 'components/nearle_components/StatCard';
+import { PageShell, KpiGrid, FilterToolbar, DataCard } from 'components/nearle_components/PageLayout';
import { getExceptions, createException, updateExceptionStatus, getHubs } from 'pages/api/doormileApi';
import { DT } from 'themes/dt/tokens';
import { TableScroll, AccentAvatar } from 'themes/dt/primitives';
@@ -127,38 +127,42 @@ const Exceptions = () => {
<>
{(isLoading || createMutation.isPending || resolveMutation.isPending) && }
- } onClick={() => setDialogOpen(true)} />}
- />
+
+ } onClick={() => setDialogOpen(true)} />}
+ />
-
- } color={BRAND} />
- } color="#f59e0b" />
- } color="#ef4444" />
- } color="#10b981" />
-
+
+ } color={BRAND} />
+ } color="#f59e0b" />
+ } color="#ef4444" />
+ } color="#10b981" />
+
-
-
-
-
- {exceptions.length} total · {rows.length} shown
-
-
-
-
-
-
-
-
+
+
+
+ {exceptions.length} total · {rows.length} shown
+
+
+
+
+
+
+
+
+ }
+ >
@@ -221,8 +225,8 @@ const Exceptions = () => {
-
-
+
+
!next && setDialogOpen(false)} width={640} purpose="form">
{
content={
-
+
-
+
diff --git a/src/pages/nearle/hubs/hubs.js b/src/pages/nearle/hubs/hubs.js
index 8bedbaa..5026f79 100644
--- a/src/pages/nearle/hubs/hubs.js
+++ b/src/pages/nearle/hubs/hubs.js
@@ -6,7 +6,6 @@ import { enqueueSnackbar } from 'notistack';
import { Grid } from '@astryxdesign/core/Grid';
import { HStack } from '@astryxdesign/core/HStack';
import { VStack } from '@astryxdesign/core/VStack';
-import { Card } from '@astryxdesign/core/Card';
import { Text } from '@astryxdesign/core/Text';
import { Button } from '@astryxdesign/core/Button';
import { IconButton } from '@astryxdesign/core/IconButton';
@@ -25,6 +24,7 @@ import DebounceSearchBar from 'components/nearle_components/DebounceSearchBar';
import PageHeader from 'components/nearle_components/PageHeader';
import StatCard from 'components/nearle_components/StatCard';
import StatusBadge from 'components/nearle_components/StatusBadge';
+import { PageShell, KpiGrid, FilterToolbar, DataCard } from 'components/nearle_components/PageLayout';
import { getHubs, createHub, updateHub, deleteHub } from 'pages/api/doormileApi';
import { DT, STATUS } from 'themes/dt/tokens';
import { TableScroll, AccentAvatar } from 'themes/dt/primitives';
@@ -160,38 +160,42 @@ const Hubs = () => {
<>
{(isLoading || deleteMutation.isPending) && }
- } onClick={openCreate} />}
- />
+
+ } onClick={openCreate} />}
+ />
-
- } color={BRAND} />
- } color={STATUS.info} />
- } color={STATUS.delivered} />
- } color={STATUS.active} />
-
+
+ } color={BRAND} />
+ } color={STATUS.info} />
+ } color={STATUS.delivered} />
+ } color={STATUS.active} />
+
-
-
-
-
- {hubs.length} total · {rows.length} shown
-
-
-
-
-
-
-
-
+
+
+
+ {hubs.length} total · {rows.length} shown
+
+
+
+
+
+
+
+
+ }
+ >
@@ -256,8 +260,8 @@ const Hubs = () => {
-
-
+
+
!next && setDialogOpen(false)} width={680} purpose="form">
{
Hub Details
-
+
@@ -302,7 +306,7 @@ const Hubs = () => {
description="Read the correct id from GET /admin/hubs rather than guessing"
isRequired
/>
-
+
{
enabled: appId !== 0 // Ensures query runs only when appId is valid
});
- const paymentOptions = useMemo(() => paymentModes.map((p) => ({ value: String(p.apptypeid), label: p.label || p.name || `Type #${p.apptypeid}` })), [paymentModes]);
+ const paymentOptions = useMemo(
+ () => paymentModes.map((p) => ({ value: String(p.apptypeid), label: p.label || p.name || `Type #${p.apptypeid}` })),
+ [paymentModes]
+ );
const riderOptions = useMemo(() => ridersList.map((r) => ({ value: String(r.userid), label: r.label })), [ridersList]);
// ======================================================= || notifyRiderMutation || =======================================================
@@ -368,104 +371,124 @@ const OrdersPreview = () => {
<>
{(paymentModesLoading || ridersListLoading || isLoading) && }
-
- } onClick={() => navigate('/doormile/orders')} />
- } />
- >
- }
- />
+
+
+ }
+ onClick={() => navigate('/doormile/orders')}
+ />
+ } />
+ >
+ }
+ />
- {aiMode == 1 && (
-
- } color={STATUS.delivered} />
- } color={STATUS.pending} />
- } color="#0ea5e9" />
- } color={STATUS.cancelled} />
-
- )}
+ {aiMode == 1 && (
+
+ }
+ color={STATUS.delivered}
+ />
+ } color={STATUS.pending} />
+ } color="#0ea5e9" />
+ } color={STATUS.cancelled} />
+
+ )}
-
- {isMobile ? (
-
- ) : (
-
-
-
-
- #
- {aiMode == 1 && Zone }
- Tenant
- Order Location
- Pickup
- Delivery
- Notes
- {aiMode == 1 && Rider }
- Type
- Profit
- KMS
-
-
-
- {finaldeliveryList?.length == 0 && (
+
+ {isMobile ? (
+
+ ) : (
+
+
+
-
- } />
-
+ #
+ {aiMode == 1 && Zone }
+ Tenant
+ Order Location
+ Pickup
+ Delivery
+ Notes
+ {aiMode == 1 && Rider }
+ Type
+ Profit
+ KMS
- )}
- {finaldeliveryList?.map((val, index) => renderRow(val, index))}
-
-
-
- )}
+
+
+ {finaldeliveryList?.length == 0 && (
+
+
+ } />
+
+
+ )}
+ {finaldeliveryList?.map((val, index) => renderRow(val, index))}
+
+
+
+ )}
-
- {aiMode == 0 && (
-
- {
- if (!v) {
- setPayment(null);
- return;
- }
- const newValue = paymentModes.find((p) => String(p.apptypeid) === v);
- setPayment(newValue);
- setFinalDeliveryList((list) => list.map((item) => ({ ...item, paymenttype: newValue.apptypeid })));
- }}
- hasClear
- hasSearch
+
+ {aiMode == 0 && (
+
+ {
+ if (!v) {
+ setPayment(null);
+ return;
+ }
+ const newValue = paymentModes.find((p) => String(p.apptypeid) === v);
+ setPayment(newValue);
+ setFinalDeliveryList((list) => list.map((item) => ({ ...item, paymenttype: newValue.apptypeid })));
+ }}
+ hasClear
+ hasSearch
+ />
+ {
+ if (!v) {
+ setRider(null);
+ return;
+ }
+ const newValue = ridersList.find((r) => String(r.userid) === v);
+ setRider(newValue);
+ setFinalDeliveryList((list) =>
+ list.map((item) => ({ ...item, userid: newValue.userid, userfcmtoken: newValue.userfcmtoken }))
+ );
+ }}
+ hasClear
+ hasSearch
+ />
+
+ )}
+
+
+ } onClick={() => navigate('/doormile/orders')} />
+
- {
- if (!v) {
- setRider(null);
- return;
- }
- const newValue = ridersList.find((r) => String(r.userid) === v);
- setRider(newValue);
- setFinalDeliveryList((list) => list.map((item) => ({ ...item, userid: newValue.userid, userfcmtoken: newValue.userfcmtoken })));
- }}
- hasClear
- hasSearch
- />
-
- )}
-
-
- } onClick={() => navigate('/doormile/orders')} />
-
-
-
+
+
+
>
);
};
diff --git a/src/pages/nearle/orders/createorder1.js b/src/pages/nearle/orders/createorder1.js
index 2276484..6133d2b 100644
--- a/src/pages/nearle/orders/createorder1.js
+++ b/src/pages/nearle/orders/createorder1.js
@@ -6,8 +6,16 @@ import { FaLandmarkDome, FaLocationDot } from 'react-icons/fa6';
import { useNavigate } from 'react-router';
import { MdLocationCity } from 'react-icons/md';
import { TbMapPinCode } from 'react-icons/tb';
-import { getAdminPricing, getAdminTenant, getAdminTenants, getAdminCustomers, getTenantLocations, createExpressBooking } from 'pages/api/doormileApi';
+import {
+ getAdminPricing,
+ getAdminTenant,
+ getAdminTenants,
+ getAdminCustomers,
+ getTenantLocations,
+ createExpressBooking
+} from 'pages/api/doormileApi';
import AddressAutocomplete from 'components/nearle_components/AddressAutocomplete';
+import { PageShell } from 'components/nearle_components/PageLayout';
import Loader from 'components/Loader';
import { DateInput } from '@astryxdesign/core/DateInput';
import dayjs from 'dayjs';
@@ -598,472 +606,577 @@ const Createorder1 = () => {
<>
{loading && }
-
-
-
-
-
-
-
-
- Create Order
-
-
-
-
- Fill pickup, drop, schedule & pricing details
+
+
+
+
+
+
+
+
+
+ Create Order
-
-
-
-
- {locationsStatus === 'loading' ? (
-
- Loading business locations…
-
- ) : locationsStatus === 'no-tenant' && isStaffLogin ? (
- // Staff login (express-console-api.md: token tenantid 0/null
- // = "Doormile's own staff... sees everything, all tenants")
- // — pick which tenant to create this order for. Everything
- // downstream (pricing, saved locations, the booking's own
- // tenantid) is keyed off `tid`, which equals selectedTenantId.
-
- setSelectedTenantId(v || '')}
- placeholder="Pick a tenant to create this order for"
- isLoading={staffTenantListLoading}
- hasSearch
- />
-
- ) : locationsStatus === 'no-tenant' ? (
-
- This login has no tenant assigned — sign in as a tenant user
-
- ) : locationsStatus === 'error' ? (
-
- Could not load business locations — tap to retry
-
- ) : locationsStatus === 'empty' ? (
-
- No saved locations — enter pickup details manually below
-
- ) : tenantLocations.length === 1 ? (
- } label={locationDisplayName(tenantLocations[0])} />
- ) : (
-
- {
- if (!v) {
- setIsLocation(false);
- return;
- }
- const value = tenantLocations.find((l) => String(l.tenantlocationid) === v);
- if (value) {
- setIsLocation(true);
- // Also fill pickCust's raw address fields from the
- // picked location — POST /admin/expressbooking's
- // pickuplocationid currently 500s server-side (live-
- // confirmed), so createsubmitobj2() always sends raw
- // pickup* fields instead; this keeps that path working
- // when a saved location is chosen here.
- setPickCust((prev) => ({
- ...prev,
- address: value.address || '',
- suburb: value.locationname || value.city || '',
- city: value.city || '',
- postcode: value.pincode || '',
- landmark: value.address || '',
- latitude: value.latitude,
- longitude: value.longitude
- }));
- }
- }}
- placeholder="Select Business Location"
- hasSearch
- hasClear
- />
-
- )}
-
-
-
-
- {/* ================================================= || Pickup || ================================================= */}
-
- }
- title="Pickup Details"
- subtitle="Where the order is picked up"
- action={
- }
- onClick={() => {
- if (!isLocation) {
- opentoast('Select Business Location', 'warning');
- } else {
- setIsCustomerOpen(true);
- setpickordrop(1);
- setPickCust({});
- setInputValue2('');
- setSearchCustList('');
- }
- }}
- />
- }
- />
-
-
- setPickCust({ ...pickCust, firstname: v })}
- startIcon={FaUser}
- />
- {
- const digits = v.replace(/\D/g, '');
- if (digits.length <= 10) setPickCust({ ...pickCust, contactno: digits });
- setShowCheck1(pickNum == digits ? 0 : 1);
- setNumErr1(digits.length < 10);
- }}
- startIcon={FaPhoneAlt}
- />
-
-
- {addId1 == 0 ? (
-
- ) : (
- {
- setPickCust({ ...pickCust, address: v });
- if (v === '') {
- setAddId1(0);
- setShowDistance(false);
- setStartPoint({ latitude: 0, longitude: 0 });
- }
- }}
- />
- )}
-
-
- setPickCust({ ...pickCust, doorno: v })} startIcon={GiDoorHandle} />
- setPickCust({ ...pickCust, suburb: v })} startIcon={FaLocationDot} />
- setPickCust({ ...pickCust, city: v })} startIcon={MdLocationCity} />
- setPickCust({ ...pickCust, postcode: v })} startIcon={TbMapPinCode} />
-
- setPickCust({ ...pickCust, landmark: v })} startIcon={FaLandmarkDome} />
-
- {showCheck1 == 1 && (
-
- setIsNumChange1(checked ? 1 : 0)} />
-
- )}
-
-
-
- {/* ================================================= || Drop || ================================================= */}
-
- }
- title="Drop Details"
- subtitle="Where the order is delivered"
- action={
- }
- onClick={() => {
- if (!isLocation) {
- opentoast('Select Business Location', 'warning');
- } else {
- setIsCustomerOpen(true);
- setpickordrop(2);
- setInputValue3('');
- setSearchCustList('');
- }
- }}
- />
- }
- />
-
-
- setDropCust({ ...dropCust, firstname: v })} startIcon={FaUser} />
- {
- const digits = v.replace(/\D/g, '');
- if (digits.length <= 10) setDropCust({ ...dropCust, contactno: digits });
- setShowCheck2(dropNum == digits ? 0 : 1);
- setNumErr2(digits.length < 10);
- }}
- startIcon={FaPhoneAlt}
- />
-
-
- {addId2 == 0 ? (
-
- ) : (
- {
- setDropCust({ ...dropCust, address: v });
- if (v === '') {
- setAddId2(0);
- setShowDistance(false);
- setEndPoint({ latitude: 0, longitude: 0 });
- }
- }}
- />
- )}
-
-
- setDropCust({ ...dropCust, doorno: v })} startIcon={GiDoorHandle} />
- setDropCust({ ...dropCust, suburb: v })} startIcon={FaLocationDot} />
- setDropCust({ ...dropCust, city: v })} startIcon={MdLocationCity} />
- setDropCust({ ...dropCust, postcode: v })} startIcon={TbMapPinCode} />
-
- setDropCust({ ...dropCust, landmark: v })} startIcon={FaLandmarkDome} />
-
- {showCheck2 == 1 && (
-
- setIsNumChange2(checked ? 1 : 0)} />
-
- )}
-
-
-
- {/* ================================================= || Time || ================================================= */}
-
- } title="Schedule" subtitle="Pickup date & time slot" />
-
- {
- if (!v) return;
- let dateres11 = dayjs().diff(dayjs(v), 'd');
- setSelectedtime('');
- if (dateres11 <= 0) {
- setStartdate(dayjs(v));
- } else {
- opentoast('choose Upcoming Date', 'warning');
- setStartdate(NaN);
- }
- }}
- />
-
-
-
- Time
-
-
-
- {timeslotarr.map((val, index) => {
- if (dayjs().diff(dayjs(`${dayjs(startdate).format('MM-DD-YYYY')} ${dayjs(val).format('HH:mm:ss')}`), 'm') <= 0) {
- const active = dayjs(selectedtime).format('HH:mm') == dayjs(val).format('HH:mm');
- return (
- {
- if (distance > appLocaRadius) {
- setOpen4(true);
- } else if (showDistance) {
- setSelectedtime(val);
- } else {
- opentoast('Select Pickup and Drop', 'error');
- }
- }}
- style={{
- display: 'inline-flex',
- alignItems: 'center',
- gap: 4,
- padding: '5px 10px',
- cursor: 'pointer',
- borderRadius: 999,
- border: `1.5px solid ${active ? '#f59e0b' : edge('#f59e0b')}`,
- background: active ? '#f59e0b' : tint('#f59e0b'),
- color: active ? '#fff' : '#f59e0b',
- fontSize: 12,
- fontWeight: 800
- }}
- >
- {dayjs(val).format('hh:mm A')}
-
- );
- }
- })}
+
+
+
+ Fill pickup, drop, schedule & pricing details
+
+
+
+
+ {locationsStatus === 'loading' ? (
+
+ Loading business locations…
+
+ ) : locationsStatus === 'no-tenant' && isStaffLogin ? (
+ // Staff login (express-console-api.md: token tenantid 0/null
+ // = "Doormile's own staff... sees everything, all tenants")
+ // — pick which tenant to create this order for. Everything
+ // downstream (pricing, saved locations, the booking's own
+ // tenantid) is keyed off `tid`, which equals selectedTenantId.
+
+ setSelectedTenantId(v || '')}
+ placeholder="Pick a tenant to create this order for"
+ isLoading={staffTenantListLoading}
+ hasSearch
+ />
+ ) : locationsStatus === 'no-tenant' ? (
+
+ This login has no tenant assigned — sign in as a tenant user
+
+ ) : locationsStatus === 'error' ? (
+
+ Could not load business locations — tap to retry
+
+ ) : locationsStatus === 'empty' ? (
+
+ No saved locations — enter pickup details manually below
+
+ ) : tenantLocations.length === 1 ? (
+
} label={locationDisplayName(tenantLocations[0])} />
+ ) : (
+
+ {
+ if (!v) {
+ setIsLocation(false);
+ return;
+ }
+ const value = tenantLocations.find((l) => String(l.tenantlocationid) === v);
+ if (value) {
+ setIsLocation(true);
+ // Also fill pickCust's raw address fields from the
+ // picked location — POST /admin/expressbooking's
+ // pickuplocationid currently 500s server-side (live-
+ // confirmed), so createsubmitobj2() always sends raw
+ // pickup* fields instead; this keeps that path working
+ // when a saved location is chosen here.
+ setPickCust((prev) => ({
+ ...prev,
+ address: value.address || '',
+ suburb: value.locationname || value.city || '',
+ city: value.city || '',
+ postcode: value.pincode || '',
+ landmark: value.address || '',
+ latitude: value.latitude,
+ longitude: value.longitude
+ }));
+ }
+ }}
+ placeholder="Select Business Location"
+ hasSearch
+ hasClear
+ />
+
+ )}
+
+
+
+
+ {/* ================================================= || Pickup || ================================================= */}
+
+ }
+ title="Pickup Details"
+ subtitle="Where the order is picked up"
+ action={
+ }
+ onClick={() => {
+ if (!isLocation) {
+ opentoast('Select Business Location', 'warning');
+ } else {
+ setIsCustomerOpen(true);
+ setpickordrop(1);
+ setPickCust({});
+ setInputValue2('');
+ setSearchCustList('');
+ }
+ }}
+ />
+ }
+ />
+
+
+ setPickCust({ ...pickCust, firstname: v })}
+ startIcon={FaUser}
+ />
+ {
+ const digits = v.replace(/\D/g, '');
+ if (digits.length <= 10) setPickCust({ ...pickCust, contactno: digits });
+ setShowCheck1(pickNum == digits ? 0 : 1);
+ setNumErr1(digits.length < 10);
+ }}
+ startIcon={FaPhoneAlt}
+ />
+
+
+ {addId1 == 0 ? (
+
+ ) : (
+ {
+ setPickCust({ ...pickCust, address: v });
+ if (v === '') {
+ setAddId1(0);
+ setShowDistance(false);
+ setStartPoint({ latitude: 0, longitude: 0 });
+ }
+ }}
+ />
+ )}
+
+
+ setPickCust({ ...pickCust, doorno: v })}
+ startIcon={GiDoorHandle}
+ />
+ setPickCust({ ...pickCust, suburb: v })}
+ startIcon={FaLocationDot}
+ />
+ setPickCust({ ...pickCust, city: v })}
+ startIcon={MdLocationCity}
+ />
+ setPickCust({ ...pickCust, postcode: v })}
+ startIcon={TbMapPinCode}
+ />
+
+ setPickCust({ ...pickCust, landmark: v })}
+ startIcon={FaLandmarkDome}
+ />
+
+ {showCheck1 == 1 && (
+
+ setIsNumChange1(checked ? 1 : 0)}
+ />
+
+ )}
+
+
+ {/* ================================================= || Drop || ================================================= */}
+
+ }
+ title="Drop Details"
+ subtitle="Where the order is delivered"
+ action={
+ }
+ onClick={() => {
+ if (!isLocation) {
+ opentoast('Select Business Location', 'warning');
+ } else {
+ setIsCustomerOpen(true);
+ setpickordrop(2);
+ setInputValue3('');
+ setSearchCustList('');
+ }
+ }}
+ />
+ }
+ />
+
+
+ setDropCust({ ...dropCust, firstname: v })}
+ startIcon={FaUser}
+ />
+ {
+ const digits = v.replace(/\D/g, '');
+ if (digits.length <= 10) setDropCust({ ...dropCust, contactno: digits });
+ setShowCheck2(dropNum == digits ? 0 : 1);
+ setNumErr2(digits.length < 10);
+ }}
+ startIcon={FaPhoneAlt}
+ />
+
+
+ {addId2 == 0 ? (
+
+ ) : (
+ {
+ setDropCust({ ...dropCust, address: v });
+ if (v === '') {
+ setAddId2(0);
+ setShowDistance(false);
+ setEndPoint({ latitude: 0, longitude: 0 });
+ }
+ }}
+ />
+ )}
+
+
+ setDropCust({ ...dropCust, doorno: v })}
+ startIcon={GiDoorHandle}
+ />
+ setDropCust({ ...dropCust, suburb: v })}
+ startIcon={FaLocationDot}
+ />
+ setDropCust({ ...dropCust, city: v })}
+ startIcon={MdLocationCity}
+ />
+ setDropCust({ ...dropCust, postcode: v })}
+ startIcon={TbMapPinCode}
+ />
+
+ setDropCust({ ...dropCust, landmark: v })}
+ startIcon={FaLandmarkDome}
+ />
+
+ {showCheck2 == 1 && (
+
+ setIsNumChange2(checked ? 1 : 0)}
+ />
+
+ )}
+
+
+
+ {/* ================================================= || Time || ================================================= */}
+
+ } title="Schedule" subtitle="Pickup date & time slot" />
+
+ {
+ if (!v) return;
+ let dateres11 = dayjs().diff(dayjs(v), 'd');
+ setSelectedtime('');
+ if (dateres11 <= 0) {
+ setStartdate(dayjs(v));
+ } else {
+ opentoast('choose Upcoming Date', 'warning');
+ setStartdate(NaN);
+ }
+ }}
+ />
+
+
+
+ Time
+
+
+
+ {timeslotarr.map((val, index) => {
+ if (dayjs().diff(dayjs(`${dayjs(startdate).format('MM-DD-YYYY')} ${dayjs(val).format('HH:mm:ss')}`), 'm') <= 0) {
+ const active = dayjs(selectedtime).format('HH:mm') == dayjs(val).format('HH:mm');
+ return (
+ {
+ if (distance > appLocaRadius) {
+ setOpen4(true);
+ } else if (showDistance) {
+ setSelectedtime(val);
+ } else {
+ opentoast('Select Pickup and Drop', 'error');
+ }
+ }}
+ style={{
+ display: 'inline-flex',
+ alignItems: 'center',
+ gap: 4,
+ padding: '5px 10px',
+ cursor: 'pointer',
+ borderRadius: 999,
+ border: `1.5px solid ${active ? '#f59e0b' : edge('#f59e0b')}`,
+ background: active ? '#f59e0b' : tint('#f59e0b'),
+ color: active ? '#fff' : '#f59e0b',
+ fontSize: 12,
+ fontWeight: 800
+ }}
+ >
+ {dayjs(val).format('hh:mm A')}
+
+ );
+ }
+ })}
+
+
+
+
+
+
+ {/* ================================================= || Distance & Pricing || ================================================= */}
+
+ }
+ title="Distance & Pricing"
+ subtitle="Auto-calculated from pickup → drop"
+ />
+
+ {showDistance && (
+
+
+
+
+ )}
+
+
+ Category
+ setCategory(v || null)}
+ placeholder="Select or type a category"
+ />
+
+ {PARCEL_CATEGORIES.map((c) => (
+ setCategory(c)}
+ onKeyDown={(e) => {
+ if (e.key === 'Enter' || e.key === ' ') setCategory(c);
+ }}
+ >
+
+
+ ))}
+
+
+
+
+ Weight
+
+ {WEIGHT_OPTIONS.map((w) => (
+ setWeight(w)}
+ onKeyDown={(e) => {
+ if (e.key === 'Enter' || e.key === ' ') setWeight(w);
+ }}
+ >
+
+
+ ))}
+
+
+
+
+ SMS Delivery
+ setIsSms(checked ? 1 : 0)} />
+
+
+
+
+
+ {/* ============================== || Cash Collect & Quantity || ============================== */}
+
+ }
+ title="Collection & Quantity"
+ subtitle="Cash to collect on delivery, total items"
+ />
+
+
+ setCollectionamt(v.replace(/[^\d.]/g, ''))} />
+ setQuantity(v.replace(/\D/g, ''))} />
+
- {/* ================================================= || Distance & Pricing || ================================================= */}
+ {/* ================================================= || Notes || ================================================= */}
- } title="Distance & Pricing" subtitle="Auto-calculated from pickup → drop" />
-
- {showDistance && (
-
-
-
-
- )}
-
-
- Category
- setCategory(v || null)} placeholder="Select or type a category" />
-
- {PARCEL_CATEGORIES.map((c) => (
- setCategory(c)}
- onKeyDown={(e) => {
- if (e.key === 'Enter' || e.key === ' ') setCategory(c);
- }}
- >
-
-
- ))}
-
-
-
-
- Weight
-
- {WEIGHT_OPTIONS.map((w) => (
- setWeight(w)}
- onKeyDown={(e) => {
- if (e.key === 'Enter' || e.key === ' ') setWeight(w);
- }}
- >
-
-
- ))}
-
-
-
-
- SMS Delivery
- setIsSms(checked ? 1 : 0)} />
+ }
+ title="Notes"
+ subtitle="Add anything the rider should know"
+ />
+
+
+
+
+ {!showDistance && (
+
+ Set pickup & drop to enable
+
+ )}
+ }
+ // Was `!showDistance` only — `loading` wasn't part of the
+ // disabled condition at all, and the separate `btnLoading`
+ // state this button used to drive its spinner got reset by
+ // a hardcoded 1-second setTimeout regardless of whether
+ // createExpressBooking had actually returned yet. On a
+ // slower request the button looked re-enabled well before
+ // the real submission finished, inviting a second click
+ // that created a second real booking — createsubmitobj2()
+ // already tracks `loading` correctly via try/finally, so
+ // just gate on that directly instead of a second,
+ // independently-timed loading flag.
+ isDisabled={!showDistance || loading}
+ isLoading={loading}
+ onClick={createsubmitobj2}
+ />
-
-
- {/* ============================== || Cash Collect & Quantity || ============================== */}
-
- } title="Collection & Quantity" subtitle="Cash to collect on delivery, total items" />
-
-
- setCollectionamt(v.replace(/[^\d.]/g, ''))} />
- setQuantity(v.replace(/\D/g, ''))} />
-
-
-
-
- {/* ================================================= || Notes || ================================================= */}
-
- } title="Notes" subtitle="Add anything the rider should know" />
-
-
-
-
- {!showDistance && (
-
- Set pickup & drop to enable
-
- )}
- }
- // Was `!showDistance` only — `loading` wasn't part of the
- // disabled condition at all, and the separate `btnLoading`
- // state this button used to drive its spinner got reset by
- // a hardcoded 1-second setTimeout regardless of whether
- // createExpressBooking had actually returned yet. On a
- // slower request the button looked re-enabled well before
- // the real submission finished, inviting a second click
- // that created a second real booking — createsubmitobj2()
- // already tracks `loading` correctly via try/finally, so
- // just gate on that directly instead of a second,
- // independently-timed loading flag.
- isDisabled={!showDistance || loading}
- isLoading={loading}
- onClick={createsubmitobj2}
- />
-
-
-
+
{/* ============================================= || saved address Dialog || ============================================= */}
!next && setIsCustomerOpen(false)} width={560} purpose="form">
@@ -1071,7 +1184,9 @@ const Createorder1 = () => {
header={
!next && setIsCustomerOpen(false)}
startContent={
@@ -1095,7 +1210,9 @@ const Createorder1 = () => {
{customerlist.length === 0 ? (
}
/>
) : (
@@ -1132,7 +1249,11 @@ const Createorder1 = () => {
>
- {String(address.name || '?').charAt(0).toUpperCase()}
+
+ {String(address.name || '?')
+ .charAt(0)
+ .toUpperCase()}
+
@@ -1142,7 +1263,12 @@ const Createorder1 = () => {
} label={contactPhone || '—'} />
{isUsed && }
-
+
{address.email || 'No address on file — search it below'}
diff --git a/src/pages/nearle/orders/multipleOrders.js b/src/pages/nearle/orders/multipleOrders.js
index dc648e1..0963d36 100644
--- a/src/pages/nearle/orders/multipleOrders.js
+++ b/src/pages/nearle/orders/multipleOrders.js
@@ -33,6 +33,7 @@ import { FaLocationDot } from 'react-icons/fa6';
import Loader from 'components/Loader';
import PageHeader from 'components/nearle_components/PageHeader';
+import { PageShell } from 'components/nearle_components/PageLayout';
import { TableScroll } from 'themes/dt/primitives';
import './OrdersRedesign.css';
@@ -752,405 +753,489 @@ const MultipleOrders = () => {
<>
{(loading || btnLoading) && }
- }
- />
+
+
+ }
+ />
-
- {/* LEFT — input fields */}
-
-
-
- Schedule & Pickup
-
-
- {locationsStatus === 'loading' ? (
- Loading business locations…
- ) : locationsStatus === 'no-tenant' && isStaffLogin ? (
- // Staff login (express-console-api.md: token tenantid
- // 0/null = "Doormile's own staff... sees everything, all
- // tenants") — pick which tenant this bulk order is for.
- setSelectedTenantId(v || '')}
- placeholder="Pick a tenant to create orders for"
- hasSearch
- isLoading={staffTenantListLoading}
- />
- ) : locationsStatus === 'no-tenant' ? (
- This login has no tenant assigned — sign in as a tenant user
- ) : locationsStatus === 'error' ? (
- gettenantlocations(tenantid)}>
- Could not load business locations — tap to retry
-
- ) : locationsStatus === 'empty' ? (
- No saved business locations for this tenant
- ) : tenantLocations?.length === 1 ? (
-
- ) : (
- {
- if (!v) {
- setLocationid(0);
- setLocationValue(null);
- setPickCust(null);
- return;
- }
- const value = tenantLocations.find((l) => String(l.tenantlocationid) === v);
- setLocationid(value?.tenantlocationid || 0);
- setLocationValue(value || null);
- setPickCust(value || null);
- }}
- placeholder="Select Business Location"
- hasSearch
- hasClear
- />
- )}
+
+ {/* LEFT — input fields */}
+
+
+
+ Schedule & Pickup
+
+
+ {locationsStatus === 'loading' ? (
+ Loading business locations…
+ ) : locationsStatus === 'no-tenant' && isStaffLogin ? (
+ // Staff login (express-console-api.md: token tenantid
+ // 0/null = "Doormile's own staff... sees everything, all
+ // tenants") — pick which tenant this bulk order is for.
+ setSelectedTenantId(v || '')}
+ placeholder="Pick a tenant to create orders for"
+ hasSearch
+ isLoading={staffTenantListLoading}
+ />
+ ) : locationsStatus === 'no-tenant' ? (
+ This login has no tenant assigned — sign in as a tenant user
+ ) : locationsStatus === 'error' ? (
+ gettenantlocations(tenantid)}>
+ Could not load business locations — tap to retry
+
+ ) : locationsStatus === 'empty' ? (
+ No saved business locations for this tenant
+ ) : tenantLocations?.length === 1 ? (
+
+ ) : (
+ {
+ if (!v) {
+ setLocationid(0);
+ setLocationValue(null);
+ setPickCust(null);
+ return;
+ }
+ const value = tenantLocations.find((l) => String(l.tenantlocationid) === v);
+ setLocationid(value?.tenantlocationid || 0);
+ setLocationValue(value || null);
+ setPickCust(value || null);
+ }}
+ placeholder="Select Business Location"
+ hasSearch
+ hasClear
+ />
+ )}
-
- {
- if (!v || !dayjs(v).isValid()) {
- setStartdate(dayjs().format('MM-DD-YYYY'));
- return;
- }
- const diffDays = dayjs().diff(dayjs(v), 'd');
- if (diffDays <= 0) {
- setStartdate(dayjs(v).format('MM-DD-YYYY'));
- setSelectedtime('');
- setPickupSlot(null);
- } else {
- opentoast('Choose an upcoming date', 'warning');
- setStartdate(dayjs().format('MM-DD-YYYY'));
- }
- }}
+
+ {
+ if (!v || !dayjs(v).isValid()) {
+ setStartdate(dayjs().format('MM-DD-YYYY'));
+ return;
+ }
+ const diffDays = dayjs().diff(dayjs(v), 'd');
+ if (diffDays <= 0) {
+ setStartdate(dayjs(v).format('MM-DD-YYYY'));
+ setSelectedtime('');
+ setPickupSlot(null);
+ } else {
+ opentoast('Choose an upcoming date', 'warning');
+ setStartdate(dayjs().format('MM-DD-YYYY'));
+ }
+ }}
+ />
+ {
+ if (!v) {
+ setSelectedtime('');
+ setPickupSlot(null);
+ return;
+ }
+ if (!locationid) {
+ OpenToast('Please select a Business Location first.', 'warning', 3000);
+ return;
+ }
+ const formattedTime = dayjs(v, 'HH:mm').format('hh:mm A');
+ setSelectedtime(formattedTime);
+ const finalDateTime = dayjs(`${startdate} ${formattedTime}`, 'MM-DD-YYYY hh:mm A').format('YYYY-MM-DD hh:mm A');
+ setPickupSlot(finalDateTime);
+ }}
+ placeholder="Select Pickup Slot"
+ hasSearch
+ />
+
+
+ {pickCust ? (
+
+
+
+
+
+
+ {pickCust.locationname || '—'}
+
+
+ {pickCust.address || '—'}
+
+
+
+ ) : (
+
+ Pickup auto-fills once a Business Location is selected.
+
+ )}
+
+
+
+
+
+ Order Notes
+
+
+ Applied to every order
+
+
+
+
+
+
+ Bulk Summary
+
+
+ Live totals
+
+
+
- {
- if (!v) {
- setSelectedtime('');
- setPickupSlot(null);
- return;
- }
- if (!locationid) {
- OpenToast('Please select a Business Location first.', 'warning', 3000);
- return;
- }
- const formattedTime = dayjs(v, 'HH:mm').format('hh:mm A');
- setSelectedtime(formattedTime);
- const finalDateTime = dayjs(`${startdate} ${formattedTime}`, 'MM-DD-YYYY hh:mm A').format('YYYY-MM-DD hh:mm A');
- setPickupSlot(finalDateTime);
- }}
- placeholder="Select Pickup Slot"
- hasSearch
+
+
+ 0} />
- {pickCust ? (
-
-
-
+ {dropCust.length > 0 && (
+
+
-
-
- {pickCust.locationname || '—'}
-
-
- {pickCust.address || '—'}
-
-
-
- ) : (
-
- Pickup auto-fills once a Business Location is selected.
-
+
+ ₹{Number(totalAmt).toFixed(2)}
+
+
)}
-
-
-
-
- Order Notes
-
-
- Applied to every order
-
-
-
-
-
-
- Bulk Summary
-
-
- Live totals
-
-
-
-
-
- 0} />
-
-
- {dropCust.length > 0 && (
-
-
-
- ₹{Number(totalAmt).toFixed(2)}
-
+
+ }
+ isDisabled={!canSubmit}
+ isLoading={btnLoading}
+ onClick={createorders}
+ style={{ width: '100%' }}
+ />
+
+
+
+ {/* RIGHT — file / drop preview */}
+
+
+
+ {previewMode === 'drops' ? 'Drop List' : previewMode === 'preview' ? 'File Preview' : 'Preview'}
+
+ {previewMode === 'drops' && }
+ {previewMode === 'preview' && }
+
+ {previewMode !== 'empty' && (
+
+ }
+ onClick={() => pickHeaderSource(0)}
+ />
+ }
+ onClick={() => pickHeaderSource(1)}
+ />
+
+ )}
+
+
+ {fileName && (
+
+ {fileName}
+
)}
-
- }
- isDisabled={!canSubmit}
- isLoading={btnLoading}
- onClick={createorders}
- style={{ width: '100%' }}
- />
-
-
-
-
- {/* RIGHT — file / drop preview */}
-
-
-
- {previewMode === 'drops' ? 'Drop List' : previewMode === 'preview' ? 'File Preview' : 'Preview'}
-
- {previewMode === 'drops' && }
- {previewMode === 'preview' && }
-
- {previewMode !== 'empty' && (
-
- } onClick={() => pickHeaderSource(0)} />
- } onClick={() => pickHeaderSource(1)} />
+ {previewMode === 'preview' && users.length >= 1 && (
+
+
+
+ Process & Calculate Distances
+
+
+ Click continue to import spreadsheet rows and calculate drop charges.
+
+
+ users.forEach((customer) => handleCheckboxChange1(customer))}
+ />
)}
-
- {fileName && (
-
- {fileName}
-
- )}
-
- {previewMode === 'preview' && users.length >= 1 && (
-
-
-
- Process & Calculate Distances
-
-
- Click continue to import spreadsheet rows and calculate drop charges.
-
-
- users.forEach((customer) => handleCheckboxChange1(customer))}
- />
-
- )}
-
-
- {previewMode === 'drops' && (
-
-
-
-
- #
- Customer
- Address
- Qty
- Cash
- Km
- Charge
-
-
-
-
- {dropCust.map((customer, index) => (
-
- {index + 1}
+
+ {previewMode === 'drops' && (
+
+
+
+
+ #
+ Customer
+ Address
+ Qty
+ Cash
+ Km
+ Charge
+
+
+
+
+ {dropCust.map((customer, index) => (
+
+ {index + 1}
+
+
+ {customer.firstname}
+
+
+
+ {customer.latitude == null || customer.longitude == null ? (
+
+ setDropCust((prev) => prev.map((c) => (c._rowkey === customer._rowkey ? { ...c, address: text } : c)))
+ }
+ onPlaceSelected={(place) => handleRowPlaceSelected(customer._rowkey, place)}
+ bias={pickCust?.latitude ? { lat: pickCust.latitude, lng: pickCust.longitude } : undefined}
+ />
+ ) : (
+
+
+ {customer.address}
+
+
+ )}
+
+
+ {uploadType === 0 ? (
+ customer.quantity
+ ) : (
+ handleQuantityChange(customer._rowkey, v ?? 0)}
+ size="sm"
+ />
+ )}
+
+
+ {uploadType === 0 ? (
+ `₹${Number(customer.collectionamt || 0).toFixed(2)}`
+ ) : (
+ handleCollectionAmtChange(customer._rowkey, v && v > 0 ? v : 0)}
+ size="sm"
+ />
+ )}
+
+ {customer.distance || '—'}
+
+ ₹{Number(customer?.totalcharge || 0).toFixed(2)}
+
+
+ }
+ onClick={() => handleCheckboxChange1(customer)}
+ />
+
+
+ ))}
+
-
- {customer.firstname}
+ Total
+
+
+
+ {totalQty}
+
+
+ ₹{Number(totalCash).toFixed(2)}
+
+
+ {totaldist}
+
+
+
+ ₹{Number(totalAmt).toFixed(2)}
-
- {customer.latitude == null || customer.longitude == null ? (
- setDropCust((prev) => prev.map((c) => (c._rowkey === customer._rowkey ? { ...c, address: text } : c)))}
- onPlaceSelected={(place) => handleRowPlaceSelected(customer._rowkey, place)}
- bias={pickCust?.latitude ? { lat: pickCust.latitude, lng: pickCust.longitude } : undefined}
- />
- ) : (
-
-
- {customer.address}
+
+
+
+
+
+ )}
+
+ {previewMode === 'preview' && (
+
+
+
+
+ #
+ Name
+ Contact
+ Address
+ Qty
+ Cash
+
+
+
+ {users.map((u, i) => (
+
+ {i + 1}
+
+
+ {u.firstname || '—'}
+
+
+ {u.contactno || '—'}
+
+
+
+ {u.address || '—'}
- )}
-
-
- {uploadType === 0 ? (
- customer.quantity
- ) : (
- handleQuantityChange(customer._rowkey, v ?? 0)}
- size="sm"
- />
- )}
-
-
- {uploadType === 0 ? (
- `₹${Number(customer.collectionamt || 0).toFixed(2)}`
- ) : (
- handleCollectionAmtChange(customer._rowkey, v && v > 0 ? v : 0)}
- size="sm"
- />
- )}
-
- {customer.distance || '—'}
-
- ₹{Number(customer?.totalcharge || 0).toFixed(2)}
-
-
- } onClick={() => handleCheckboxChange1(customer)} />
-
-
- ))}
-
-
- Total
-
-
-
- {totalQty}
-
-
- ₹{Number(totalCash).toFixed(2)}
-
-
- {totaldist}
-
-
-
- ₹{Number(totalAmt).toFixed(2)}
-
-
-
-
-
-
-
- )}
+
+
{u.quantity ?? '—'}
+
+ {u.collectionamt != null ? `₹${Number(u.collectionamt).toFixed(2)}` : '—'}
+
+
+ ))}
+
+
+
+ )}
- {previewMode === 'preview' && (
-
-
-
-
- #
- Name
- Contact
- Address
- Qty
- Cash
-
-
-
- {users.map((u, i) => (
-
- {i + 1}
-
-
- {u.firstname || '—'}
-
-
- {u.contactno || '—'}
-
-
-
- {u.address || '—'}
-
-
-
- {u.quantity ?? '—'}
- {u.collectionamt != null ? `₹${Number(u.collectionamt).toFixed(2)}` : '—'}
-
- ))}
-
-
-
- )}
-
- {previewMode === 'empty' && (
-
- Choose a Drop Source to begin
-
- Select a source below to import or pick your delivery customers.
-
-
- pickEmptySource(0)} />
- pickEmptySource(1)} />
-
-
- )}
-
-
-
+ {previewMode === 'empty' && (
+
+ Choose a Drop Source to begin
+
+ Select a source below to import or pick your delivery customers.
+
+
+ pickEmptySource(0)}
+ />
+ pickEmptySource(1)}
+ />
+
+
+ )}
+
+
+
+
{
const rowkey = `sel-${customer.appcustomerid}`;
const checked = dropCust.some((c) => c._rowkey === rowkey);
return (
-
+
{
footer={
- setIsCustomerOpen(false)} />
+ setIsCustomerOpen(false)}
+ />
}
diff --git a/src/pages/nearle/orders/orders.js b/src/pages/nearle/orders/orders.js
index dc88bff..4b2d86b 100644
--- a/src/pages/nearle/orders/orders.js
+++ b/src/pages/nearle/orders/orders.js
@@ -1,40 +1,61 @@
+import PropTypes from 'prop-types';
import { enqueueSnackbar } from 'notistack';
-import { useState, useEffect, useMemo, useCallback, Fragment, useRef } from 'react';
+import { useState, useEffect, useMemo, Fragment } from 'react';
import logger from '../../../utils/logger';
import dayjs from 'dayjs';
var utc = require('dayjs/plugin/utc');
dayjs.extend(utc);
+import { motion } from 'framer-motion';
+// TanStack Table v9. The feature modules come from table-core, which
+// react-table re-exports wholesale — import them from here so the app has one
+// TanStack Table entry point.
+import {
+ useTable,
+ flexRender,
+ tableFeatures,
+ rowSelectionFeature,
+ columnVisibilityFeature,
+ rowSortingFeature,
+ createSortedRowModel,
+ sortFns,
+ columnSizingFeature,
+ columnResizingFeature,
+ rowPaginationFeature,
+ createPaginatedRowModel
+} from '@tanstack/react-table';
+
import {
MdAccessTime,
+ MdArrowDownward,
+ MdArrowUpward,
MdCheckCircle,
- MdClose,
- MdCurrencyRupee,
- MdDeleteOutline,
MdHourglassEmpty,
MdInventory2,
MdLocalShipping,
- MdStraighten,
MdClear,
MdNotes,
MdMyLocation,
MdOutlineFlag,
MdPerson,
MdFlashOn,
- MdCancel
+ MdCancel,
+ MdStraighten,
+ MdUnfoldMore,
+ MdViewColumn
} from 'react-icons/md';
import { HStack } from '@astryxdesign/core/HStack';
import { VStack } from '@astryxdesign/core/VStack';
-import { Card } from '@astryxdesign/core/Card';
+import { Center } from '@astryxdesign/core/Center';
import { Text } from '@astryxdesign/core/Text';
import { Button } from '@astryxdesign/core/Button';
-import { IconButton } from '@astryxdesign/core/IconButton';
import { Tooltip } from '@astryxdesign/core/Tooltip';
import { Badge } from '@astryxdesign/core/Badge';
import { Divider } from '@astryxdesign/core/Divider';
import { CheckboxInput } from '@astryxdesign/core/CheckboxInput';
-import { TabList, Tab } from '@astryxdesign/core/TabList';
+import { Pagination } from '@astryxdesign/core/Pagination';
+import { DropdownMenu, DropdownMenuCheckboxItem } from '@astryxdesign/core/DropdownMenu';
import { Dialog, DialogHeader } from '@astryxdesign/core/Dialog';
import { Layout, LayoutContent, LayoutFooter } from '@astryxdesign/core/Layout';
import { Spinner } from '@astryxdesign/core/Spinner';
@@ -42,15 +63,18 @@ import { EmptyState } from '@astryxdesign/core/EmptyState';
import { Table, TableHeader, TableBody, TableRow, TableCell, TableHeaderCell } from '@astryxdesign/core/Table';
import Loader from 'components/Loader';
-import DateFilterDialog from 'components/DateFilterDialog';
import StatusBadge from 'components/nearle_components/StatusBadge';
+import StatusTabs from 'components/nearle_components/StatusTabs';
+import TableLoader from 'components/nearle_components/TableLoader';
import PageHeader from 'components/nearle_components/PageHeader';
+import DebounceSearchBar from 'components/nearle_components/DebounceSearchBar';
+import { PageShell, DataCard } from 'components/nearle_components/PageLayout';
import { useQuery, useMutation } from '@tanstack/react-query';
import { useNavigate } from 'react-router-dom';
import { fetchPercentageData, createAutomationDeliveries, getallriders, buildMilerLookup, notifyRider } from '../../api/api';
-import { getBookings, cancelBooking, getAdminCustomers, getBookingTrack, batchAssignBookings, getMilers } from 'pages/api/doormileApi';
+import { getBookings, getAdminCustomers, getBookingTrack, batchAssignBookings, getMilers } from 'pages/api/doormileApi';
import { parseDoormileTimestamp } from 'utils/doormileTimestamp';
-import { DT, tint, edge } from 'themes/dt/tokens';
+import { DT, STATUS, tint } from 'themes/dt/tokens';
import { TableScroll, AccentAvatar } from 'themes/dt/primitives';
const BRAND = DT.brand;
@@ -86,19 +110,46 @@ const BRAND = DT.brand;
// primary/representative value for `currentStatus`, the React key, and the
// few `currentStatus === 'pending_pickup'` checks elsewhere in this file.
const ORDERS_STATUS_TABS = [
- { idx: 0, status: 'pending_pickup', statuses: ['pending_pickup'], label: 'Pending', color: '#f59e0b', icon: MdHourglassEmpty },
+ { idx: 0, status: 'pending_pickup', statuses: ['pending_pickup'], label: 'Pending', color: STATUS.pending, icon: MdHourglassEmpty },
{
idx: 1,
status: 'converted_to_consignment',
statuses: ['converted_to_consignment', 'miler_assigned', 'pickup_scheduled'],
label: 'Assigned',
- color: '#6366f1',
+ color: STATUS.accepted,
icon: MdCheckCircle
},
- { idx: 2, status: 'delivered', statuses: ['delivered'], label: 'Delivered', color: '#10b981', icon: MdCheckCircle },
- { idx: 3, status: 'cancelled', statuses: ['cancelled'], label: 'Cancelled', color: '#ef4444', icon: MdCancel }
+ { idx: 2, status: 'delivered', statuses: ['delivered'], label: 'Delivered', color: STATUS.delivered, icon: MdCheckCircle },
+ { idx: 3, status: 'cancelled', statuses: ['cancelled'], label: 'Cancelled', color: STATUS.cancelled, icon: MdCancel }
];
+// TanStack Table v9 registers features explicitly — only what is listed here
+// ships, and only these state slices exist on the instance. Row models are
+// slots on the same object: `rowSortingFeature` is the behaviour,
+// `sortedRowModel` is the algorithm that actually reorders rows, and `sortFns`
+// is the registry that lets a column name a sort function as a string.
+//
+// Column FILTERING is deliberately absent: the tab strip and the search box
+// filter upstream in `filteredRows`, and moving that inside the table would
+// change what the counts on the tabs mean.
+//
+// Declared at module scope so the reference is stable across renders.
+const ORDERS_TABLE_FEATURES = tableFeatures({
+ rowSelectionFeature,
+ columnVisibilityFeature,
+ rowSortingFeature,
+ sortedRowModel: createSortedRowModel(),
+ sortFns,
+ // Sizing carries the widths; resizing is the drag interaction on top of it.
+ columnSizingFeature,
+ columnResizingFeature,
+ rowPaginationFeature,
+ paginatedRowModel: createPaginatedRowModel()
+});
+
+// Page sizes offered under the table. 10 keeps the previous default.
+const PAGE_SIZE_OPTIONS = [10, 25, 50, 100];
+
// Haversine straight-line distance in km — GET /admin/bookings has no `kms`
// field, but does carry both pickup*/delivery* lat/lng, so this is computed
// client-side rather than left blank. It's a straight line, not the road
@@ -113,60 +164,170 @@ const haversineKm = (lat1, lon1, lat2, lon2) => {
return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
};
-const MetricCell = ({ value, color, icon, isMoney = false }) => {
- const n = Number(value);
- const display = isMoney ? `₹${Number.isFinite(n) ? n.toFixed(2) : '0.00'}` : Number.isFinite(n) ? n : value || 0;
- const isZero = !Number.isFinite(n) || n === 0;
- if (isZero) {
- return (
-
- {display}
-
- );
- }
- return (
-
- {icon}
- {display}
-
- );
-};
+// Shared by the Track Order dialog's header (booking's own createdat) and its
+// body (service ETA, assignment timestamps) — one formatter so the two never
+// drift into different date styles.
+const formatTrackTimestamp = (d) => (d ? dayjs(d).format('DD MMM, hh:mm A') : '—');
+// ---------------------------------------------------------------------------
+// Row primitives.
+//
+// Every repeated cell shape in the table is one small component here rather
+// than JSX copy-pasted per column, so a spacing or hierarchy change lands in
+// one place. They are local (not in nearle_components/) on purpose — that
+// folder's §5 rule is "shared only once two pages need it", and these are
+// shaped around this table's columns.
+//
+// The colour rule from root CLAUDE.md §6.3 still holds: only Status is allowed
+// a semantic colour. The distance chip below is a NEUTRAL chip — it groups the
+// digits into a scannable capsule without borrowing amber/green from the
+// lifecycle palette, which is what the old yellow "kms" badge did.
+// ---------------------------------------------------------------------------
+
+// Uppercase micro-label — the table's column headings and the Track dialog's
+// section headings are the same class of text (chrome that labels data), so
+// they share one component.
const SectionLabel = ({ children }) => (
{children}
);
+// Distance. `hasTabularNumbers` is what makes a numeric column look
+// professional: digits get equal width, so the decimal points line up down the
+// column instead of drifting. `0` and `0.0` therefore sit in the same chip as
+// every other value — only a genuinely unknown distance (missing lat/lng)
+// degrades to an em dash.
+//
+// `rest` is spread onto the root on purpose: the Kms cell wraps this in a
+// , which anchors itself by cloning its child with a ref and hover
+// handlers. A component that swallows those props leaves the tooltip with
+// nothing to attach to — that is why the old code needed a bare
+// wrapper around the cell.
+const DistanceChip = ({ km, ...rest }) => {
+ if (!Number.isFinite(km)) {
+ return (
+
+ —
+
+ );
+ }
+ return (
+ }
+ label={
+
+ {`${km.toFixed(1)} km`}
+
+ }
+ />
+ );
+};
+
+// Money. The symbol is deliberately quieter than the figure — the amount is
+// what an operator scans down the column, and a repeated ₹ at full contrast
+// competes with it. Right-aligned + tabular so the decimals stack.
+const MoneyCell = ({ value }) => {
+ const n = Number(value);
+ if (!Number.isFinite(n)) {
+ return (
+
+ —
+
+ );
+ }
+ return (
+
+
+ ₹
+
+
+ {n.toFixed(2)}
+
+
+ );
+};
+
+// Pickup / Drop. A muted leading glyph anchors the two address columns so the
+// eye can tell them apart at a glance, then strict primary → secondary →
+// tertiary weighting inside. Every line is `maxLines`-truncated, which clips to
+// the ACTUAL column width and supplies its own hover tooltip — no manual
+// slice(), which cut short values that didn't need it.
+const PlaceCell = ({ icon, primary, secondary, children }) => (
+
+
+ {icon}
+
+
+
+ {primary}
+
+ {secondary ? (
+
+ {secondary}
+
+ ) : null}
+ {children}
+
+
+);
+
+SectionLabel.propTypes = { children: PropTypes.node };
+DistanceChip.propTypes = { km: PropTypes.number };
+MoneyCell.propTypes = { value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]) };
+PlaceCell.propTypes = {
+ icon: PropTypes.node,
+ primary: PropTypes.node,
+ secondary: PropTypes.node,
+ children: PropTypes.node
+};
+
const Orders = () => {
const navigate = useNavigate();
const tid = localStorage.getItem('tenantid');
- const loadMoreRef = useRef();
- const [page] = useState(0);
- const [rowsPerPage, setRowsPerPage] = useState(10);
- const [tabvalue, setTabvalue] = useState(0);
const [tabstatus, setTabstatus] = useState('Pending');
const [currentStatus, setCurrentStatus] = useState('pending_pickup');
// Orders selected via the checkbox column (Pending tab only) to send to
// the AI dispatch optimiser. Assign Orders used to submit every visible
// row unconditionally, including cancelled ones (no filtering existed at
// all) — this makes assignment an explicit, scoped action instead.
- const [selectedOrders, setSelectedOrders] = useState([]);
- const [cancelOpen, setCancelOpen] = useState(false);
+ //
+ // Now TanStack Table's own `rowSelection` slice — a `{ [bookingid]: true }`
+ // map — rather than a parallel array of row objects. The array had to be
+ // hand-reconciled with the visible rows on every tab/search change; keying
+ // off `getRowId` means a selection can only ever resolve to rows that are
+ // actually in the current row model. `selectedOrders` below derives the full
+ // objects the solver payload needs, so every consumer is unchanged.
+ const [rowSelection, setRowSelection] = useState({});
+ // The remaining TanStack state slices. Each is plain React state the table
+ // reads through `state` and writes through its `on*Change` callback, which is
+ // what makes them inspectable and resettable from the page (see the tab
+ // switch below) instead of being locked inside the table instance.
+ const [sorting, setSorting] = useState([]);
+ const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: 10 });
+ // User-toggled column visibility from the Columns menu. The checkbox column
+ // is NOT in here — it is forced by the active tab (see `columnVisibility`).
+ const [userColumnVisibility, setUserColumnVisibility] = useState({});
+ // Explicitly controlled (not left to TanStack's own internal atom) so a
+ // committed drag-resize from an earlier session can never silently outlive
+ // a `columns` edit — `column.getSize()` resolves `columnSizing[id]` before
+ // `columnDef.size`, so any stray override in here is the ONE thing that can
+ // make a column ignore its column-def width. Starting this at `{}` on every
+ // mount guarantees the column-def `size`/`minSize` values below are always
+ // the ones that actually render, with no other place width can come from.
+ const [columnSizing, setColumnSizing] = useState({});
const [trackBookingId, setTrackBookingId] = useState(null);
// GET /admin/bookings/:id/track — confirmed live shape (not documented in
@@ -179,42 +340,43 @@ const Orders = () => {
queryFn: () => getBookingTrack(trackBookingId),
enabled: !!trackBookingId
});
- const [orderheaderid, setOrderheaderid] = useState('');
const locationId = 0;
const locoName = 'All Locations';
- const [dateOpen, setDateOpen] = useState(false);
- const [datestatus, setDatestatus] = useState('Today');
- const [startdate, setStartdate] = useState(dayjs().format('YYYY-MM-DD'));
- const [enddate, setEnddate] = useState(dayjs().format('YYYY-MM-DD'));
+ // No date-filter UI on this page — the toolbar is search-only. These stay
+ // fixed to "today" (still read by percentageData's query key and by the
+ // solver hand-off's deliverydate/assigntime below).
+ const datestatus = 'Today';
+ const startdate = dayjs().format('YYYY-MM-DD');
+ const enddate = dayjs().format('YYYY-MM-DD');
const [searchword, setSearchword] = useState('');
const [debouncedSearch, setDebouncedSearch] = useState('');
const [createloader, setCreateloader] = useState(false);
const [isLoading, setIsLoading] = useState(false);
- useEffect(() => {
- const handler = setTimeout(() => {
- setDebouncedSearch(searchword);
- }, 400);
- return () => clearTimeout(handler);
- }, [searchword]);
+ // Debouncing itself now lives inside (500ms,
+ // onDebouncedChange={setDebouncedSearch} below) — this page no longer needs
+ // its own parallel setTimeout effect.
- const handleChangetab = (i) => {
+ // Keyed by the tab's representative status string rather than by index: the
+ // shared (the same strip every other list page uses) is
+ // value-keyed by status, so the switch resolves the status back to its entry.
+ // Everything it sets is unchanged — search reset, page size reset, label,
+ // current status, and clearing the solver selection.
+ const handleChangetab = (status) => {
+ const tab = ORDERS_STATUS_TABS.find((t) => t.status === status) || ORDERS_STATUS_TABS[0];
setSearchword('');
- setRowsPerPage(10);
- setTabvalue(i);
- const tab = ORDERS_STATUS_TABS[i];
setTabstatus(tab.label);
setCurrentStatus(tab.status);
- setSelectedOrders([]);
+ setRowSelection({});
+ // Back to page 1 on a tab switch — the page size the operator chose is
+ // theirs and survives, the position in a now-different list does not.
+ setPagination((p) => ({ ...p, pageIndex: 0 }));
};
// React Queries
- const {
- isLoading: fetchpercentageIsLoading,
- refetch: percentagedataRefetch
- } = useQuery({
- queryKey: ['percentageData', locationId, startdate, enddate, tid, locationId],
+ const { isLoading: fetchpercentageIsLoading } = useQuery({
+ queryKey: ['percentageData', locationId, startdate, enddate, tid],
queryFn: fetchPercentageData,
enabled: true,
refetchInterval: 15000
@@ -246,35 +408,6 @@ const Orders = () => {
staleTime: 5 * 60 * 1000
});
- const cancelorder = async () => {
- try {
- const res = await cancelBooking(orderheaderid);
- if (res.success) {
- enqueueSnackbar('Order Cancelled Successfully', {
- variant: 'success',
- anchorOrigin: { vertical: 'top', horizontal: 'right' },
- autoHideDuration: 2000
- });
- refetchOrders();
- percentagedataRefetch();
- setSelectedOrders((prev) => prev.filter((o) => o.bookingid !== orderheaderid));
- setCancelOpen(false);
- } else {
- enqueueSnackbar(res.message || 'Failed to cancel order', {
- variant: 'error',
- anchorOrigin: { vertical: 'top', horizontal: 'right' },
- autoHideDuration: 2000
- });
- }
- } catch (err) {
- enqueueSnackbar(err.response?.data?.message || err.message || 'Failed to cancel order', {
- variant: 'error',
- anchorOrigin: { vertical: 'top', horizontal: 'right' },
- autoHideDuration: 2000
- });
- }
- };
-
// GET /admin/bookings has no status/date/search filter params documented
// (see express-console-api.md's "Conventions") — fetched in one bulk call
// (up to the API's pagesize cap) and filtered/counted entirely client-side.
@@ -338,41 +471,253 @@ const Orders = () => {
});
}, [allBookings, activeTabStatuses, debouncedSearch]);
- // "Load more" now reveals more of the already-fetched, already-filtered
- // set instead of requesting another server page (the bulk fetch above
- // already has everything) — the IntersectionObserver/scroll-triggered
- // reveal below is otherwise unchanged from the previous pagination UX.
- const [visibleCount, setVisibleCount] = useState(rowsPerPage);
+ // A search change re-scopes the list, so page 1 is the only page that still
+ // means anything. Sorting and page size are the operator's choices and are
+ // deliberately left alone.
useEffect(() => {
- setVisibleCount(rowsPerPage);
- }, [currentStatus, debouncedSearch, rowsPerPage]);
+ setPagination((p) => ({ ...p, pageIndex: 0 }));
+ }, [currentStatus, debouncedSearch]);
- const rows = filteredRows.slice(0, visibleCount);
- const hasNextPage = filteredRows.length > visibleCount;
- const isFetchingNextPage = false;
- const fetchNextPage = useCallback(() => setVisibleCount((v) => v + rowsPerPage), [rowsPerPage]);
+ // ==============================|| Table model ||============================== //
- useEffect(() => {
- if (!hasNextPage) return;
- const observer = new IntersectionObserver(
- (entries) => {
- if (entries[0].isIntersecting) {
- fetchNextPage();
+ // The column model. Everything a column IS — its id, where its value comes
+ // from, how it renders, how wide it is, how it aligns, whether it sorts and
+ // what the Columns menu calls it — is declared here in one object per column
+ // instead of being spread across a header cell, a body cell and a width map
+ // that had to be kept in sync by hand.
+ //
+ // WIDTHS ARE PIXELS NOW, not percentages. They have to be: resizing writes
+ // px into the `columnSizing` slice, and a percentage cannot be dragged. The
+ // table still declares `width: 100%` under `table-layout: fixed`, so on a
+ // container wider than the total the surplus is shared out proportionally
+ // and the operator's relative proportions survive; `getTotalSize()` becomes
+ // the horizontal-scroll floor on narrow screens.
+ //
+ // `meta` is TanStack's sanctioned escape hatch for presentation data the core
+ // doesn't model — here the alignment and the human label used by both the
+ // header and the Columns menu.
+ const columns = useMemo(
+ () => [
+ {
+ id: 'select',
+ size: 44,
+ minSize: 44,
+ // Not sortable, not resizable, and not hideable: it is a control, not
+ // data, and hiding it would strand the assign flow with no way back.
+ enableSorting: false,
+ enableResizing: false,
+ enableHiding: false,
+ meta: { label: 'Select' },
+ // PAGE-scoped select-all, deliberately — `toggleAllRowsSelected` would
+ // now check every filtered row, and this folder's CLAUDE.md §3 is
+ // explicit that select-all stays per visible page so nobody hands the
+ // solver a multi-thousand-order run by ticking one box. Under the old
+ // infinite-scroll list "the page" meant the revealed rows; it now means
+ // the pagination page, which is the same intent.
+ header: ({ table }) => (
+ table.toggleAllPageRowsSelected(!!checked)}
+ />
+ ),
+ cell: ({ row }) => (
+ row.toggleSelected(!!checked)}
+ />
+ )
+ },
+ {
+ id: 'serial',
+ size: 50,
+ minSize: 44,
+ enableSorting: false,
+ meta: { label: '#' },
+ header: () => # ,
+ // Numbered by POSITION on screen, not by index in the underlying data:
+ // once rows can be sorted, `row.index` (which is the pre-sort index)
+ // would print a jumbled 4, 1, 9 down the column. This counts from the
+ // top of the current page instead, so it always reads 1, 2, 3 …
+ cell: ({ table: t, row }) => (
+
+ {pagination.pageIndex * pagination.pageSize + t.getRowModel().rows.indexOf(row) + 1}
+
+ )
+ },
+ {
+ id: 'order',
+ accessorFn: (row) => row.bookingno || `#${row.bookingid}`,
+ size: 220,
+ minSize: 140,
+ meta: { label: 'Order' },
+ header: () => Order ,
+ // Order ID is the row's identifier, so it carries the heaviest weight
+ // in the row; the booking time drops to a muted metadata line under it.
+ cell: ({ getValue, row }) => {
+ const dateObj = parseDoormileTimestamp(row.original.createdat);
+ return (
+
+
+
+ {getValue()}
+
+ {/* Notes used to own a 130px column that was "—" on almost
+ every row. It survives as an indicator here: present-only,
+ hover for the text. */}
+ {row.original.notes && (
+
+
+
+ )}
+
+
+
+
+ {dateObj.isValid() ? dateObj.format('hh:mm A') : '—'}
+
+
+ {dateObj.isValid() && `· ${dateObj.format('DD MMM YY')}`}
+
+
+
+ );
}
},
{
- // MainLayout's AppShell scrolls content inside `.astryx-layout-content`
- // (height="fill"), not the window — root: null would never intersect.
- root: document.querySelector('.astryx-layout-content'),
- rootMargin: '0px 0px 400px 0px',
- threshold: 0
+ id: 'pickup',
+ accessorKey: 'pickupaddress',
+ size: 280,
+ minSize: 220,
+ meta: { label: 'Pickup' },
+ header: () => Pickup ,
+ cell: ({ getValue, row }) => (
+ } primary={getValue() || '—'} secondary={row.original.pickuppincode || ''} />
+ )
+ },
+ {
+ id: 'drop',
+ // The customer join lives in the accessor, so the cell only renders.
+ accessorFn: (row) => {
+ const customer = customerMap?.get(row.appcustomerid);
+ return customer?.firstname || customer?.name || `Customer #${row.appcustomerid ?? '—'}`;
+ },
+ size: 320,
+ minSize: 240,
+ meta: { label: 'Drop' },
+ header: () => Drop ,
+ cell: ({ getValue, row }) => {
+ const customer = customerMap?.get(row.original.appcustomerid);
+ return (
+ } primary={getValue()} secondary={customer?.phone || customer?.contactno || ''}>
+
+
+ {row.original.deliveryaddress || '—'}
+
+ {/* Parcel count moved out of its own 64px column — it was "1"
+ on every row. It belongs next to the delivery it describes,
+ and only shows when it is not 1, which is the one thing
+ Astryx's Badge guidance says a badge IS for. */}
+ {(row.original.parcels?.length || 0) > 1 && (
+ } label={`${row.original.parcels.length} parcels`} />
+ )}
+
+
+ );
+ }
+ },
+ {
+ id: 'kms',
+ // The haversine derivation is the column's accessor now, so the value
+ // is part of the row model and available to anything the table grows
+ // later (sorting, export) rather than being computed inside JSX.
+ // `undefined`, not null, when the lat/lngs are missing: that is the
+ // value TanStack's `sortUndefined` understands, so unknown distances
+ // park at the bottom in both directions instead of sorting as zero.
+ accessorFn: (row) => haversineKm(row.pickuplatitude, row.pickuplongitude, row.deliverylatitude, row.deliverylongitude) ?? undefined,
+ size: 110,
+ minSize: 90,
+ sortUndefined: 'last',
+ meta: { label: 'Kms', align: 'center' },
+ header: () => Kms ,
+ cell: ({ getValue }) => {
+ const km = getValue();
+ return km != null ? (
+
+
+
+ ) : (
+
+ );
+ }
+ },
+ {
+ id: 'charges',
+ accessorFn: (row) => row.serviceoptions?.[0]?.estimatedprice,
+ size: 110,
+ minSize: 100,
+ sortUndefined: 'last',
+ meta: { label: 'Charges', align: 'right' },
+ header: () => Charges ,
+ cell: ({ getValue }) =>
+ },
+ {
+ id: 'status',
+ accessorKey: 'status',
+ size: 150,
+ minSize: 120,
+ meta: { label: 'Status' },
+ header: () => Status ,
+ // Resolves the raw booking enum (`miler_assigned`,
+ // `converted_to_consignment`, …) through themes/dt/status.js — the one
+ // place that decides what a lifecycle state is called and coloured.
+ cell: ({ getValue }) =>
}
- );
- if (loadMoreRef.current) observer.observe(loadMoreRef.current);
- return () => {
- if (loadMoreRef.current) observer.unobserve(loadMoreRef.current);
- };
- }, [hasNextPage, fetchNextPage]);
+ ],
+ [customerMap, pagination.pageIndex, pagination.pageSize]
+ );
+
+ // Two sources feed one visibility slice: whatever the operator toggled in
+ // the Columns menu, plus the checkbox column, which the ACTIVE TAB owns
+ // (assignment only exists on Pending). Forcing `select` last means the tab
+ // always wins and the menu can never strand it.
+ const columnVisibility = useMemo(
+ () => ({ ...userColumnVisibility, select: currentStatus === 'pending_pickup' }),
+ [userColumnVisibility, currentStatus]
+ );
+
+ const table = useTable({
+ features: ORDERS_TABLE_FEATURES,
+ // The FULL filtered set — the table paginates it. Previously this was a
+ // hand-sliced `filteredRows.slice(0, visibleCount)` fed to an
+ // IntersectionObserver that revealed ten more rows at a time.
+ data: filteredRows,
+ columns,
+ // Selection is keyed by booking id, so it survives a background refetch
+ // reordering the list; the index fallback only matters for a row the API
+ // returned without one.
+ getRowId: (row, index) => String(row.bookingid ?? `row-${index}`),
+ // `onChange` resizing updates the width on every mouse move rather than on
+ // release, so the column tracks the cursor.
+ columnResizeMode: 'onChange',
+ state: { rowSelection, columnVisibility, sorting, pagination, columnSizing },
+ onRowSelectionChange: setRowSelection,
+ onColumnVisibilityChange: setUserColumnVisibility,
+ onSortingChange: setSorting,
+ onPaginationChange: setPagination,
+ onColumnSizingChange: setColumnSizing
+ });
+
+ // The full row objects for the solver payload — `deliveryData` below needs
+ // pickup/delivery lat-lngs, notes and service options, not just ids.
+ const selectedOrders = table.getSelectedRowModel()?.rows.map((r) => r.original) ?? [];
+
+ // Skeleton rows and the empty state have to span exactly the columns that
+ // are actually visible; asking the table removes the hand-maintained count.
+ const colCount = table.getVisibleLeafColumns().length;
// ==============================|| Mutations ||============================== //
@@ -388,7 +733,7 @@ const Orders = () => {
setCreateloader(false);
// Assigned bookings' status flips away from pending_pickup server-side,
// so refetching above is what makes them drop out of the Pending tab.
- setSelectedOrders([]);
+ setRowSelection({});
navigate('/doormile/dispatch/preview', {
state: {
dispatchPreviewData: data,
@@ -510,7 +855,7 @@ const Orders = () => {
}
refetchOrders();
- setSelectedOrders([]);
+ setRowSelection({});
},
onError: (error) => {
enqueueSnackbar(error.message, { variant: 'error', autoHideDuration: 4000 });
@@ -522,294 +867,355 @@ const Orders = () => {
quickAssignMutation.mutate();
};
- // Table column count for skeleton rows / colSpan — one more than usual
- // while the checkbox column is showing (Pending tab only).
- const colCount = currentStatus === 'pending_pickup' ? 12 : 11;
-
return (
- {(fetchpercentageIsLoading || isLoadingGetOrders || isLoading || createloader) && }
+ {/* The bulk fetch no longer blocks the whole page behind a backdrop — it
+ renders skeleton rows INTO the table instead (see
+ below), so the header, tabs and column structure stay on screen while
+ rows arrive. The backdrop is still correct for the mutations, which
+ genuinely must block interaction. */}
+ {(fetchpercentageIsLoading || isLoading || createloader) && }
+ {/* One floating action bar instead of two separately-positioned buttons
+ at hardcoded `right: 24` / `right: 224` offsets — those overlapped as
+ soon as either label grew, and read as two unrelated floaters. Same
+ two buttons, same order, same handlers; they now sit in a single
+ elevated pill that animates in with the selection. */}
{selectedOrders.length > 0 && currentStatus === 'pending_pickup' && (
-
- } onClick={handleCreateDelivery} />
-
- )}
-
- {selectedOrders.length > 0 && currentStatus === 'pending_pickup' && (
-
-
+
+
+
+ }
+ isLoading={quickAssignMutation.isPending}
+ onClick={handleQuickAssign}
+ />
+
}
- isLoading={quickAssignMutation.isPending}
- onClick={handleQuickAssign}
+ label={`Assign Orders (${selectedOrders.length})`}
+ variant="primary"
+ icon={ }
+ onClick={handleCreateDelivery}
/>
-
-
+
+
)}
-
+ {/* PageShell owns the rhythm between the header and the data region, so
+ this page stops hand-rolling its own margins (nearle_components
+ CLAUDE.md §2b). DataCard then groups the tab strip and the table into
+ ONE card: tabs filter the table, and a card with an internal divider
+ says that; two loose regions floating on the page background did not. */}
+ {/* `fill` on both: the header and tab strip keep their intrinsic height
+ and the card takes every remaining pixel down to the bottom of the
+ viewport, at any window size, with no viewport arithmetic anywhere on
+ this page. See PageLayout.js for why one `:has()` rule is needed to
+ make that flex chain resolve. */}
+
+
-
- handleChangetab(Number(v))} size="sm">
- {ORDERS_STATUS_TABS.map((t) => {
- const Icon = t.icon;
- const count = t.statuses.reduce((sum, s) => sum + (statusCounts[s] ?? 0), 0);
- return } endContent={ } />;
- })}
-
-
+
+ {/* The shared status strip, same component the other list pages
+ use, so tab chrome — selected indicator, hover, focus ring,
+ count badge, arrow-key navigation — is identical across the
+ console instead of re-declared here. Labels stay this page's
+ own ("Assigned", not the registry's "Accepted") because the
+ Orders tabs track the OPERATOR's workflow. */}
+ ({
+ status: t.status,
+ label: t.label,
+ count: t.statuses.reduce((sum, s) => sum + (statusCounts[s] ?? 0), 0)
+ }))}
+ />
-
-
-
-
-
- {currentStatus === 'pending_pickup' && (
-
- 0 && selectedOrders.length === rows.length ? true : selectedOrders.length > 0 ? 'indeterminate' : false}
- onChange={(checked) => setSelectedOrders(checked ? rows : [])}
- />
-
- )}
- #
- Order
- Pickup
- Drop
- Qty
- COD
- Kms (approx)
- Charges
- Notes
- Status
- Actions
-
-
+ {/* Search + Columns menu share the tab row's right side, so the
+ whole toolbar — filter tabs, search, column visibility —
+ reads as one control strip instead of two stacked rows. */}
+
+
+
+
-
- {!isLoadingGetOrders && rows.length === 0 && (
-
-
- }
- actions={searchword ? } onClick={() => setSearchword('')} /> : undefined}
- />
-
-
- )}
+ {/* Columns menu — driven by the same `columnVisibility` slice
+ the tab uses for the checkbox column, so there is one
+ source of truth for "is this column showing". `getCanHide()`
+ is what keeps the checkbox column out of the list. */}
+ }}
+ menuWidth={200}
+ placement="below"
+ >
+ {table
+ .getAllLeafColumns()
+ .filter((column) => column.getCanHide())
+ .map((column) => (
+ column.toggleVisibility(checked)}
+ hasCloseOnSelect={false}
+ />
+ ))}
+
+
+
+ }
+ >
+ {/* The table region takes the leftover card height; the pagination
+ bar below it keeps its intrinsic height. maxHeight="100%" then
+ resolves against THIS wrapper, so the rows scroll and the footer
+ stays put. */}
+
+
+ {/* table-layout: fixed makes the declared column widths
+ AUTHORITATIVE — the browser default treats them as hints and
+ lets cell content override them, which is how one long address
+ used to re-flow the whole table. Widths come from
+ `header.getSize()`, i.e. the columnSizing slice that the drag
+ handles write to. */}
+
+ {/* Header and body are rendered FROM the column model — the
+ header cells, the body cells and the skeleton/empty colSpans
+ all read the same `columns` array, so they cannot drift
+ apart. That drift is what put a Status header above no
+ Status cells. */}
+
+ {table.getHeaderGroups().map((headerGroup) => (
+
+ {headerGroup.headers.map((header) => {
+ const align = header.column.columnDef.meta?.align;
+ const canSort = header.column.getCanSort();
+ const sorted = header.column.getIsSorted();
+ return (
+ itself — screen
+ // readers announce the column's sort state from
+ // here, not from the clickable content inside.
+ aria-sort={sorted === 'asc' ? 'ascending' : sorted === 'desc' ? 'descending' : canSort ? 'none' : undefined}
+ style={{ width: header.getSize(), textAlign: align, position: 'relative' }}
+ >
+ {
+ if (e.key === 'Enter' || e.key === ' ') {
+ e.preventDefault();
+ header.column.toggleSorting();
+ }
+ }
+ : undefined
+ }
+ style={canSort ? { cursor: 'pointer', userSelect: 'none' } : undefined}
+ >
+ {flexRender(header.column.columnDef.header, header.getContext())}
+ {canSort &&
+ (sorted === 'asc' ? (
+
+ ) : sorted === 'desc' ? (
+
+ ) : (
+ // Present but faint on every sortable column:
+ // an affordance that only appears on hover is
+ // an affordance a keyboard user never finds.
+
+ ))}
+
- {rows.map((row, index) => {
- const customer = customerMap?.get(row.appcustomerid);
- const kms = haversineKm(row.pickuplatitude, row.pickuplongitude, row.deliverylatitude, row.deliverylongitude);
- const isCancellable = !['Cancelled', 'Converted_To_Consignment'].includes(row.status);
- const isChecked = selectedOrders.some((o) => o.bookingid === row.bookingid);
+ {/* Resize grip: a hit area straddling the column
+ edge, painted as a hairline that goes brand-black
+ while it is being dragged. */}
+ {header.column.getCanResize() && (
+
+
+
+ )}
+
+ );
+ })}
+
+ ))}
+
- return (
-
- {currentStatus === 'pending_pickup' && (
-
-
- setSelectedOrders((prev) => (checked ? [...prev, row] : prev.filter((o) => o.bookingid !== row.bookingid)))
- }
- />
+
+ {isLoadingGetOrders && }
+
+ {!isLoadingGetOrders && filteredRows.length === 0 && (
+
+ {/* The row/cell only shrink-to-fit their content in `fill`
+ mode — TableScroll's outer div caps at maxHeight but
+ doesn't stretch to it, so a lone empty-state row would
+ otherwise sit at the top of a lot of leftover space.
+ Center gives it a real box to center inside instead. */}
+
+
+ }
+ actions={
+ searchword ? (
+ }
+ onClick={() => setSearchword('')}
+ />
+ ) : undefined
+ }
+ />
+
- )}
-
-
- {page * rowsPerPage + index + 1}
-
-
+
+ )}
-
-
- {row.bookingno || `#${row.bookingid}`}
-
-
-
- {(() => {
- const dateObj = parseDoormileTimestamp(row.createdat);
- return (
- <>
-
- {dateObj.isValid() ? dateObj.format('hh:mm A') : '—'}
-
-
- {dateObj.isValid() && `· ${dateObj.format('DD MMM YY')}`}
-
- >
- );
- })()}
-
-
+ {table.getRowModel().rows.map((row) => (
+ setTrackBookingId(row.original.bookingid)}
+ style={{
+ cursor: 'pointer',
+ backgroundColor: row.getIsSelected() ? tint(DT.brand) : undefined,
+ transition: 'background-color 140ms ease'
+ }}
+ >
+ {row.getVisibleCells().map((cell) => (
+ e.stopPropagation() : undefined}
+ >
+ {flexRender(cell.column.columnDef.cell, cell.getContext())}
+
+ ))}
+
+ ))}
+
+
+
+
-
-
-
-
- {row.pickupaddress ? `${row.pickupaddress.slice(0, 20)}…` : '—'}
-
-
-
- {row.pickuppincode || ''}
-
-
-
+ {/* Pagination replaces the scroll-to-reveal sentinel. The row range on
+ the left is the same information the old "N orders · End of list"
+ footer carried, now true for a windowed page. */}
+ {filteredRows.length > 0 && (
+ <>
+
+
+
+ {`${pagination.pageIndex * pagination.pageSize + 1}–${Math.min(
+ (pagination.pageIndex + 1) * pagination.pageSize,
+ filteredRows.length
+ )} of ${filteredRows.length} order${filteredRows.length === 1 ? '' : 's'}`}
+
+ table.setPageIndex(nextPage - 1)}
+ totalItems={filteredRows.length}
+ pageSize={pagination.pageSize}
+ pageSizeOptions={PAGE_SIZE_OPTIONS}
+ onPageSizeChange={(size) => table.setPageSize(size)}
+ size="sm"
+ label="Orders pagination"
+ />
+
+ >
+ )}
+
+
-
-
-
- {customer?.firstname || customer?.name || `Customer #${row.appcustomerid ?? '—'}`}
-
-
- {customer?.phone || customer?.contactno || ''}
-
-
-
- {row.deliveryaddress?.length > 20 ? `${row.deliveryaddress.slice(0, 20)}…` : row.deliveryaddress || '—'}
-
-
-
-
-
-
- } />
-
-
-
-
-
- —
-
-
-
-
-
- {kms != null ? (
-
-
- } />
-
-
- ) : (
- } />
- )}
-
-
-
- } isMoney />
-
-
-
- {row.notes ? (
-
-
-
-
- {row.notes}
-
-
-
- ) : (
-
- —
-
- )}
-
-
-
-
-
-
-
- {currentStatus === 'pending_pickup' && isCancellable && (
- }
- onClick={(e) => {
- e.stopPropagation();
- setOrderheaderid(row.bookingid);
- setCancelOpen(true);
- }}
- />
- )}
-
-
- );
- })}
-
- {rows.length !== 0 && (
-
-
-
- {isFetchingNextPage || hasNextPage ? (
- <>
-
-
- Loading more orders…
-
- >
- ) : (
-
- {rows.length} order{rows.length === 1 ? '' : 's'} · End of list
-
- )}
-
-
-
- )}
-
-
-
-
-
- !next && setCancelOpen(false)} width={420} purpose="required">
+ !next && setTrackBookingId(null)} width={560} purpose="info">
!next && setCancelOpen(false)}
+ title={trackData?.booking ? trackData.booking.bookingno || `#${trackData.booking.bookingid}` : 'Track Order'}
+ subtitle={trackData?.booking ? `Booked ${formatTrackTimestamp(trackData.booking.createdat)}` : undefined}
+ onOpenChange={(next) => !next && setTrackBookingId(null)}
startContent={
-
-
+
+
}
/>
}
- content={
-
-
- Are you sure you want to cancel this order? This action cannot be undone.
-
-
- }
- footer={
-
-
- setCancelOpen(false)} />
-
-
-
- }
- />
-
-
- !next && setTrackBookingId(null)} width={560} purpose="info">
- !next && setTrackBookingId(null)} />}
content={
{trackLoading ? (
@@ -821,54 +1227,47 @@ const Orders = () => {
const b = trackData.booking;
const assignments = trackData.assignments || [];
const riders = trackData.riders || [];
- const fmt = (d) => (d ? dayjs(d).format('DD MMM, hh:mm A') : '—');
return (
+ {/* Status now lives on its own row instead of doubling
+ up with the order number/booked date, which moved
+ into DialogHeader's title/subtitle above. */}
-
- {b.bookingno || `#${b.bookingid}`}
-
- Booked {fmt(b.createdat)}
-
-
+ Status
-
-
-
-
- Pickup
- {b.pickupaddress || '—'}
- {b.pickuppincode && (
-
- Pincode {b.pickuppincode}
-
- )}
-
-
-
-
-
- Delivery
- {b.deliveryaddress || '—'}
- {(b.deliverypincode || b.deliverycity) && (
-
- {[b.deliverycity, b.deliverypincode].filter(Boolean).join(' · ')}
-
- )}
-
-
+ {/* Same PlaceCell the Orders table uses for its own
+ Pickup/Drop columns — a tinted icon tile + primary/
+ secondary text — so the dialog and the row it was
+ opened from read as the same design language. */}
+
+
+ Pickup
+ }
+ primary={b.pickupaddress || '—'}
+ secondary={b.pickuppincode ? `Pincode ${b.pickuppincode}` : ''}
+ />
+
+
+ Delivery
+ }
+ primary={b.deliveryaddress || '—'}
+ secondary={[b.deliverycity, b.deliverypincode].filter(Boolean).join(' · ')}
+ />
+
{b.notes && (
-
-
-
- Notes
+
+ Notes
+
+
{b.notes}
-
-
+
+
)}
@@ -901,7 +1300,7 @@ const Orders = () => {
{s.servicetype || '—'}
- ETA {fmt(s.estimateddeliveryat)}
+ ETA {formatTrackTimestamp(s.estimateddeliveryat)}
₹{Number(s.estimatedprice || 0).toFixed(2)}
@@ -920,23 +1319,38 @@ const Orders = () => {
{riders.length === 0 && assignments.length === 0 ? (
Not assigned to a rider yet.
) : (
-
+
{riders.map((r, i) => (
-
- {r.displayname || r.name || r.phone || JSON.stringify(r)}
-
- ))}
- {assignments.map((a, i) => (
-
-
- {a.status || a.assignmentstatus || 'Assignment'}
-
-
- {fmt(a.createdat || a.assignedat)}
-
+
+
+
+
+ {r.displayname || r.name || 'Rider'}
+ {r.phone && (
+
+ {r.phone}
+
+ )}
+
))}
+ {/* Each assignment update as a small status chip +
+ timestamp row, instead of the bare "Assigned"
+ text repeating with no visual differentiation
+ between entries. */}
+ {assignments.length > 0 && (
+
+ {assignments.map((a, i) => (
+
+
+
+ {formatTrackTimestamp(a.createdat || a.assignedat)}
+
+
+ ))}
+
+ )}
)}
@@ -959,16 +1373,6 @@ const Orders = () => {
}
/>
-
- setDateOpen(false)}
- onSelect={(range) => {
- setStartdate(range.startDate);
- setEnddate(range.endDate);
- setDatestatus(range.label);
- }}
- />
);
};
diff --git a/src/pages/nearle/reports/ordersDetails.js b/src/pages/nearle/reports/ordersDetails.js
index e849180..0f06c72 100644
--- a/src/pages/nearle/reports/ordersDetails.js
+++ b/src/pages/nearle/reports/ordersDetails.js
@@ -22,10 +22,8 @@ import { FaCircleCheck } from 'react-icons/fa6';
var utc = require('dayjs/plugin/utc');
dayjs.extend(utc);
-import { Grid } from '@astryxdesign/core/Grid';
import { HStack } from '@astryxdesign/core/HStack';
import { VStack } from '@astryxdesign/core/VStack';
-import { Card } from '@astryxdesign/core/Card';
import { Text } from '@astryxdesign/core/Text';
import { Button } from '@astryxdesign/core/Button';
import { IconButton } from '@astryxdesign/core/IconButton';
@@ -50,6 +48,7 @@ import LoaderWithImage from 'components/nearle_components/LoaderWithImage';
import LocationAutocomplete from 'components/nearle_components/LocationAutocomplete';
import PageHeader from 'components/nearle_components/PageHeader';
import StatCard from 'components/nearle_components/StatCard';
+import { PageShell, KpiGrid, FilterToolbar, DataCard } from 'components/nearle_components/PageLayout';
import StatusBadge from 'components/nearle_components/StatusBadge';
import StatusTabs from 'components/nearle_components/StatusTabs';
import TableLoader from 'components/nearle_components/TableLoader';
@@ -57,7 +56,7 @@ import { MobileCard, MobileCardList, MobileField, MobileFieldGrid } from 'compon
import { parseDoormileTimestamp } from 'utils/doormileTimestamp';
import { useIsNarrowViewport } from 'hooks/useIsNarrowViewport';
import { getStatusMeta } from 'themes/dt/status';
-import { DT, tint, edge } from 'themes/dt/tokens';
+import { DT, STATUS, tint, edge } from 'themes/dt/tokens';
import { TableScroll, AccentAvatar } from 'themes/dt/primitives';
const opentoast = (message, variant, time) => {
@@ -77,30 +76,24 @@ const formatKm = (value) => Number(value || 0).toFixed(2);
const STATUS_TABS = ['all', 'pending', 'accepted', 'arrived', 'picked', 'active', 'delivered', 'skipped', 'cancelled'];
// Soft pill used for metric cells (km, charges) inside the table.
-const MetricPill = ({ color, icon, label, tooltip }) => (
-
-
- {icon}
- {label}
-
-
-);
+//
+// This was a hand-rolled with a raw hex, its own border/radius/weight and
+// a fixed 80px min-width — i.e. a re-implementation of Astryx's Badge, which is
+// exactly "a tinted pill with an optional leading icon". Using the real
+// component means these cells pick up the type scale and tinting from the theme
+// instead of hardcoding 11px/800 against it.
+//
+// `variant` is a Badge colour name rather than a hex: these are metric readouts
+// (km, ₹), not lifecycle statuses, so they must not go through StatusBadge — but
+// they also don't need an arbitrary accent, so the enumerated variants fit.
+const MetricPill = ({ variant = 'neutral', icon, label, tooltip }) =>
+ tooltip ? (
+
+
+
+ ) : (
+
+ );
// Stamp cell — date + time stack with a muted dash fallback for empty timestamps.
const StampCell = ({ value, formatDate, formatTime, success }) => {
@@ -120,7 +113,7 @@ const StampCell = ({ value, formatDate, formatTime, success }) => {
{formatTime(value)}
- {success &&
}
+ {success &&
}
);
@@ -272,7 +265,9 @@ export default function OrdersDetails() {
const wantStatus = String(currentStatus || '').toLowerCase();
const wantTenantId = Number(tenantid) || 0;
const wantRiderId = Number(selectedRider?.userid) || 0;
- const q = String(debouncedSearch || '').trim().toLowerCase();
+ const q = String(debouncedSearch || '')
+ .trim()
+ .toLowerCase();
return allRows.filter((r) => {
if (wantStatus !== 'all' && String(r.orderstatus || '').toLowerCase() !== wantStatus) return false;
if (wantTenantId && Number(r.tenantid) !== wantTenantId) return false;
@@ -311,9 +306,20 @@ export default function OrdersDetails() {
}
},
{
- root: document.querySelector('.dt-table-scroll'),
- rootMargin: '0px',
- threshold: 1.0
+ // The sentinel lives AFTER , not inside it. An
+ // IntersectionObserver only reports on targets that are descendants of
+ // its root, so rooting this at `.dt-table-scroll` meant the callback
+ // never fired on desktop and the report stopped at page 1. (It happened
+ // to work on mobile, where MobileCardList renders instead and the
+ // querySelector returned null — falling back to the viewport.)
+ //
+ // The page scrolls inside AppShell's own container, not the window,
+ // because MainLayout mounts AppShell with height="fill" — so
+ // `.astryx-layout-content` is the real scroll root. Same target
+ // orders.js uses; see the comment in layout/MainLayout/index.js.
+ root: document.querySelector('.astryx-layout-content'),
+ rootMargin: '200px',
+ threshold: 0
}
);
if (loadMoreRef.current) observer.observe(loadMoreRef.current);
@@ -360,7 +366,10 @@ export default function OrdersDetails() {
enabled: tenantid !== 0
});
- const tenantOptions = useMemo(() => (tenantlist || []).map((t) => ({ value: String(t.tenantid), label: t.tenantname || `Tenant #${t.tenantid}` })), [tenantlist]);
+ const tenantOptions = useMemo(
+ () => (tenantlist || []).map((t) => ({ value: String(t.tenantid), label: t.tenantname || `Tenant #${t.tenantid}` })),
+ [tenantlist]
+ );
const locationOptions = useMemo(
() =>
(locationlist || []).map((l) => ({
@@ -443,9 +452,9 @@ export default function OrdersDetails() {
const KPI_META = [
{ key: 'total', label: 'Total Orders', color: BRAND, icon: MdOutlineLocalShipping, value: total },
- { key: 'delivered', label: 'Delivered', color: '#10b981', icon: MdOutlineCheckCircle, value: deliveredLenght },
- { key: 'pending', label: 'Pending', color: '#f59e0b', icon: MdOutlinePendingActions, value: pendingLenght },
- { key: 'cancelled', label: 'Cancelled', color: '#ef4444', icon: MdOutlineCancel, value: cancelLenght }
+ { key: 'delivered', label: 'Delivered', color: STATUS.delivered, icon: MdOutlineCheckCircle, value: deliveredLenght },
+ { key: 'pending', label: 'Pending', color: STATUS.pending, icon: MdOutlinePendingActions, value: pendingLenght },
+ { key: 'cancelled', label: 'Cancelled', color: STATUS.cancelled, icon: MdOutlineCancel, value: cancelLenght }
];
return (
@@ -457,117 +466,22 @@ export default function OrdersDetails() {
getriderbydeliveryIsLoading ||
isFetchingNextPage) &&
}
-
}
- />
-
-
- {KPI_META.map((item) => {
- const Icon = item.icon;
- return (
- } color={item.color} loading={fetchDeliveriesIsLoading} />
- );
- })}
-
-
-
-
- {
- if (!v) {
- setTenantid(0);
- setTenantValue(null);
- setLocationid(0);
- setLocationValue(null);
- return;
- }
- const t = (tenantlist || []).find((x) => String(x.tenantid) === v);
- setTenantid(t?.tenantid || 0);
- setTenantValue(t || null);
- setLocationid(t?.locationid || 0);
- setLocationValue(null);
- }}
- placeholder="Select Tenant"
- hasSearch
- hasClear
- isDisabled={appId == null}
- disabledMessage="Please select an App Location first!"
- />
-
- {
- if (!v) {
- setLocationid(0);
- setLocationValue(null);
- return;
- }
- const l = (locationlist || []).find((x) => String(x.locationid) === v);
- setLocationid(l?.locationid || 0);
- setLocationValue(l || null);
- }}
- placeholder="Select Location"
- hasSearch
- hasClear
- isDisabled={!tenantid}
- disabledMessage={appId == null ? 'Please select Location and Tenant first!' : 'Please select a Tenant first!'}
- />
-
- {
- if (!v) {
- setSelectedRider(null);
- setRiderValue(null);
- return;
- }
- const r = (ridersList || []).find((x) => String(x.userid) === v);
- setSelectedRider(r || null);
- setRiderValue(r || null);
- }}
- placeholder="Select Rider"
- hasSearch
- hasClear
- isDisabled={appId == null}
- disabledMessage="Select App Location First"
- />
-
-
-
- setOpen(true)}
- style={{
- display: 'inline-flex',
- alignItems: 'center',
- gap: 6,
- padding: '6px 10px',
- borderRadius: 999,
- cursor: 'pointer',
- background: tint('#f59e0b'),
- border: `1.5px solid ${edge('#f59e0b')}`,
- color: '#f59e0b',
- fontWeight: 800,
- fontSize: 12
- }}
- >
-
- {dayjs(startdate).format('DD/MM/YY')} – {dayjs(enddate).format('DD/MM/YY')}
-
-
+ {/* Page-level actions all live in the header: zone, date range and
+ Export. They used to be split across the header and a separate filter
+ box below, which is why Export kept wrapping onto its own line and
+ left that box half empty. */}
+
+ {/* Only the primary action lives in the header. The zone picker and
+ date range were up here too and the zone picker OVERLAPPED the date
+ button — LocationAutocomplete brings its own width and ignores the
+ wrapper's, so it drew straight over its neighbour. Both now sit in
+ the toolbar with the other filters, which is also where they
+ belong: they filter the table, they aren't page actions. */}
+ setRowsPerPage(''), 0);
}}
/>
-
-
-
+ }
+ />
-
-
-
-
+
+ {KPI_META.map((item) => {
+ const Icon = item.icon;
+ return (
+ }
+ color={item.color}
+ loading={fetchDeliveriesIsLoading}
+ />
+ );
+ })}
+
+
+ {/* Toolbar: Zone · Tenant · Location · Rider · Date · Search. */}
+
+
+
+ {
+ if (!v) {
+ setTenantid(0);
+ setTenantValue(null);
+ setLocationid(0);
+ setLocationValue(null);
+ return;
+ }
+ const t = (tenantlist || []).find((x) => String(x.tenantid) === v);
+ setTenantid(t?.tenantid || 0);
+ setTenantValue(t || null);
+ setLocationid(t?.locationid || 0);
+ setLocationValue(null);
+ }}
+ placeholder="Select Tenant"
+ hasSearch
+ hasClear
+ isDisabled={appId == null}
+ disabledMessage="Please select an App Location first!"
+ />
+
+ {
+ if (!v) {
+ setLocationid(0);
+ setLocationValue(null);
+ return;
+ }
+ const l = (locationlist || []).find((x) => String(x.locationid) === v);
+ setLocationid(l?.locationid || 0);
+ setLocationValue(l || null);
+ }}
+ placeholder="Select Location"
+ hasSearch
+ hasClear
+ isDisabled={!tenantid}
+ disabledMessage={appId == null ? 'Please select Location and Tenant first!' : 'Please select a Tenant first!'}
+ />
+
+ {
+ if (!v) {
+ setSelectedRider(null);
+ setRiderValue(null);
+ return;
+ }
+ const r = (ridersList || []).find((x) => String(x.userid) === v);
+ setSelectedRider(r || null);
+ setRiderValue(r || null);
+ }}
+ placeholder="Select Rider"
+ hasSearch
+ hasClear
+ isDisabled={appId == null}
+ disabledMessage="Select App Location First"
+ />
+
+ }
+ tooltip="Change date range"
+ width="100%"
+ onClick={() => setOpen(true)}
+ />
+
+ }
+ tabs={
+
-
-
-
-
-
-
-
-
- {isMobile ? (
-
- {fetchDeliveriesIsLoading ? (
-
-
-
- Loading orders…
-
-
- ) : rows?.length == 0 ? (
- } />
- ) : (
- rows?.map((row, index) => {
- const rowStatusMeta = getStatusMeta(row.orderstatus);
- const isDelivered = row.orderstatus === 'delivered';
- return (
-
-
-
-
- {String(page * rowsPerPage + index + 1).padStart(2, '0')}
-
-
-
-
-
-
- {row.tenantname}
+
+
+
+
+ }
+ >
+ <>
+ {isMobile ? (
+
+ {fetchDeliveriesIsLoading ? (
+
+
+
+ Loading orders…
+
+
+ ) : rows?.length == 0 ? (
+ }
+ />
+ ) : (
+ rows?.map((row, index) => {
+ const rowStatusMeta = getStatusMeta(row.orderstatus);
+ const isDelivered = row.orderstatus === 'delivered';
+ return (
+
+
+
+
+ {String(page * rowsPerPage + index + 1).padStart(2, '0')}
-
- #{row.orderid}
-
-
-
-
}
- isDisabled={!isDelivered}
- onClick={() => {
- if (isDelivered) {
- getdeliverylogs(row.deliveryid);
- setMapTenant(row);
- }
- }}
- />
-
-
-
- {row.ridername && } label={row.ridername} />}
-
- {parseDoormileTimestamp(row.deliverydate).format('DD/MM/YYYY · hh:mm A')}
-
-
-
- }
- >
-
-
-
-
- {row.pickupcustomer || '—'}
-
-
- {row.pickupcontactno}
-
-
- {row.pickupsuburb || (row.Pickupaddress ? row.Pickupaddress.slice(0, 22) + '…' : '')}
-
- {row.applocation && } label={row.applocation} />}
-
-
-
-
-
- {row.deliverycustomer || '—'}
-
-
- {row.deliverycontactno}
-
-
- {row.deliverysuburb || (row.deliveryaddress ? row.deliveryaddress.slice(0, 22) + '…' : '')}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- } label={row.orderstatus === 'cancelled' || row.kms == '' ? '0.00 km' : `${formatKm(row.kms)} km`} tooltip="KMS" />
- } label={`${formatKm(row.cumulativekms)} km`} tooltip="Actual KMS" />
- }
- label={`${formatKm(row.previouskms || (row.orderstatus === 'cancelled' ? 0 : row.kms))} km`}
- tooltip="Rider KMS"
- />
-
-
-
-
- } label={row.orderstatus === 'cancelled' || row.deliverycharges == '' ? `0.00` : `${row.deliverycharges}.00`} tooltip="Delivery Charge" />
- } label={row.deliveryamt == '' ? `0.00` : `${row.deliveryamt}.00`} tooltip="Delivery Amount" />
-
-
-
- {row.ordernotes && (
-
-
-
-
- {row.ordernotes}
-
-
-
- )}
-
-
- );
- })
- )}
-
- ) : (
-
-
-
-
- #
- Map
- Client
- Pickup
- Drop
- Status / Rider
- Assigned
- Accepted
- Arrived
- Picked
- Active
- Delivered
- Cancelled
- Notes
- KMS
- Charges
-
-
-
-
- {fetchDeliveriesIsLoading ? (
-
- ) : rows?.length == 0 ? (
-
-
- } />
-
-
- ) : (
- rows?.map((row, index) => {
- const isDelivered = row.orderstatus === 'delivered';
- const cancelled = row.orderstatus === 'cancelled';
- return (
-
-
-
- {String(page * rowsPerPage + index + 1).padStart(2, '0')}
-
-
-
-
- }
- isDisabled={!isDelivered}
- onClick={() => {
- if (isDelivered) {
- getdeliverylogs(row.deliveryid);
- setMapTenant(row);
- }
- }}
- />
-
-
-
-
-
-
-
-
-
- {row.tenantname}
-
-
+
+
+
+
+
+ {row.tenantname}
+
#{row.orderid}
-
-
- {parseDoormileTimestamp(row.deliverydate).format('DD/MM/YYYY · hh:mm A')}
-
-
+
+
+ }
+ isDisabled={!isDelivered}
+ onClick={() => {
+ if (isDelivered) {
+ getdeliverylogs(row.deliveryid);
+ setMapTenant(row);
+ }
+ }}
+ />
-
-
-
-
-
+
+
+ {row.ridername && } label={row.ridername} />}
+
+ {parseDoormileTimestamp(row.deliverydate).format('DD/MM/YYYY · hh:mm A')}
+
+
+
+ }
+ >
+
+
+
+
{row.pickupcustomer || '—'}
-
+
{row.pickupcontactno}
-
-
- {row.pickupsuburb || (row.Pickupaddress ? row.Pickupaddress.slice(0, 22) + '…' : '')}
-
-
+
+ {row.pickupsuburb || (row.Pickupaddress ? row.Pickupaddress.slice(0, 22) + '…' : '')}
+
{row.applocation && } label={row.applocation} />}
-
-
-
-
-
+
+
+
+
{row.deliverycustomer || '—'}
-
+
{row.deliverycontactno}
-
-
- {row.deliverysuburb || (row.deliveryaddress ? row.deliveryaddress.slice(0, 22) + '…' : '')}
-
-
+
+ {row.deliverysuburb || (row.deliveryaddress ? row.deliveryaddress.slice(0, 22) + '…' : '')}
+
-
+
-
-
-
- {row.ridername && (
-
-
-
-
- {row.ridername}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ }
+ label={row.orderstatus === 'cancelled' || row.kms == '' ? '0.00 km' : `${formatKm(row.kms)} km`}
+ tooltip="KMS"
+ />
+ }
+ label={`${formatKm(row.cumulativekms)} km`}
+ tooltip="Actual KMS"
+ />
+ }
+ label={`${formatKm(row.previouskms || (row.orderstatus === 'cancelled' ? 0 : row.kms))} km`}
+ tooltip="Rider KMS"
+ />
+
+
+
+
+ }
+ label={row.orderstatus === 'cancelled' || row.deliverycharges == '' ? `0.00` : `${row.deliverycharges}.00`}
+ tooltip="Delivery Charge"
+ />
+ }
+ label={row.deliveryamt == '' ? `0.00` : `${row.deliveryamt}.00`}
+ tooltip="Delivery Amount"
+ />
+
+
+
+ {row.ordernotes && (
+
+
+
+
+ {row.ordernotes}
+
+
+
+ )}
+
+
+ );
+ })
+ )}
+
+ ) : (
+
+
+
+
+ #
+ Map
+ Client
+ Pickup
+ Drop
+ Status / Rider
+ Assigned
+ Accepted
+ Arrived
+ Picked
+ Active
+ Delivered
+ Cancelled
+ Notes
+ KMS
+ Charges
+
+
+
+
+ {fetchDeliveriesIsLoading ? (
+
+ ) : rows?.length == 0 ? (
+
+
+ }
+ />
+
+
+ ) : (
+ rows?.map((row, index) => {
+ const isDelivered = row.orderstatus === 'delivered';
+ const cancelled = row.orderstatus === 'cancelled';
+ return (
+
+
+
+ {String(page * rowsPerPage + index + 1).padStart(2, '0')}
+
+
+
+
+ }
+ isDisabled={!isDelivered}
+ onClick={() => {
+ if (isDelivered) {
+ getdeliverylogs(row.deliveryid);
+ setMapTenant(row);
+ }
+ }}
+ />
+
+
+
+
+
+
+
+
+
+ {row.tenantname}
+
+
+
+ #{row.orderid}
-
- )}
-
-
+
+ {parseDoormileTimestamp(row.deliverydate).format('DD/MM/YYYY · hh:mm A')}
+
+
+
+
-
-
-
-
-
-
-
-
-
-
- {/* GET /admin/bookings has no per-event timestamps (accepted/
+
+
+
+ {row.pickupcustomer || '—'}
+
+
+ {row.pickupcontactno}
+
+
+
+ {row.pickupsuburb || (row.Pickupaddress ? row.Pickupaddress.slice(0, 22) + '…' : '')}
+
+
+ {row.applocation && } label={row.applocation} />}
+
+
+
+
+
+
+ {row.deliverycustomer || '—'}
+
+
+ {row.deliverycontactno}
+
+
+
+ {row.deliverysuburb || (row.deliveryaddress ? row.deliveryaddress.slice(0, 22) + '…' : '')}
+
+
+
+
+
+
+
+
+ {row.ridername && (
+
+
+
+
+ {row.ridername}
+
+
+
+ )}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* GET /admin/bookings has no per-event timestamps (accepted/
arrived/pickup/start/cancel) — only assigntime (updatedat) and
deliverydate exist on the mapped row (see fetchDeliveries in
api.js), so row.pickuptime is always undefined and this cell
@@ -901,72 +957,98 @@ export default function OrdersDetails() {
guessed, since orderstatus's confirmed values
(pending/accepted/active/delivered/cancelled) have no distinct
"picked" state to map it to. */}
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
- {row.ordernotes ? (
-
-
-
- {row.ordernotes}
+
+ {row.ordernotes ? (
+
+
+
+ {row.ordernotes}
+
+
+ ) : (
+
+ —
-
- ) : (
-
- —
-
- )}
-
+ )}
+
-
-
- } label={cancelled || row.kms == '' ? '0.00 km' : `${formatKm(row.kms)} km`} tooltip="KMS" />
- } label={`${formatKm(row.cumulativekms)} km`} tooltip="Actual KMS" />
- } label={`${formatKm(row.previouskms || (cancelled ? 0 : row.kms))} km`} tooltip="Rider KMS" />
-
-
+
+
+ }
+ label={cancelled || row.kms == '' ? '0.00 km' : `${formatKm(row.kms)} km`}
+ tooltip="KMS"
+ />
+ }
+ label={`${formatKm(row.cumulativekms)} km`}
+ tooltip="Actual KMS"
+ />
+ }
+ label={`${formatKm(row.previouskms || (cancelled ? 0 : row.kms))} km`}
+ tooltip="Rider KMS"
+ />
+
+
-
-
- } label={cancelled || row.deliverycharges == '' ? `0.00` : `${row.deliverycharges}.00`} tooltip="Delivery Charge" />
- } label={row.deliveryamt == '' ? `0.00` : `${row.deliveryamt}.00`} tooltip="Delivery Amount" />
-
-
-
- );
- })
+
+
+ }
+ label={cancelled || row.deliverycharges == '' ? `0.00` : `${row.deliverycharges}.00`}
+ tooltip="Delivery Charge"
+ />
+ }
+ label={row.deliveryamt == '' ? `0.00` : `${row.deliveryamt}.00`}
+ tooltip="Delivery Amount"
+ />
+
+
+
+ );
+ })
+ )}
+
+
+
+ )}
+
+ {rows?.length !== 0 && (
+ <>
+
+
+ {isFetchingNextPage || hasNextPage ? (
+
+ ) : (
+
+ No more orders
+
)}
-
-
-
- )}
-
- {rows?.length !== 0 && (
- <>
-
-
- {isFetchingNextPage || hasNextPage ? (
-
- ) : (
-
- No more orders
-
- )}
-
- >
- )}
-
-
+
+ >
+ )}
+ >
+
+
!next && setReportDialog(false)} width={520} purpose="form">
{[
{ label: 'App Location', value: locaName, color: BRAND },
- { label: 'Tenant', value: tenantValue?.tenantname, color: '#0ea5e9' },
- { label: 'Business Location', value: locationValue?.locationname, color: '#10b981' },
- { label: 'Status', value: currentStatus, color: '#f59e0b' },
- { label: 'Rider', value: riderValue ? `${riderValue.firstname} ${riderValue.lastname}` : null, color: '#8b5cf6' },
- { label: 'Keyword', value: searchword, color: '#06b6d4' },
- { label: 'Start Date', value: startdate, color: '#14b8a6' },
- { label: 'End Date', value: enddate, color: '#ef4444' }
+ { label: 'Tenant', value: tenantValue?.tenantname, color: STATUS.info },
+ { label: 'Business Location', value: locationValue?.locationname, color: STATUS.delivered },
+ { label: 'Status', value: currentStatus, color: STATUS.pending },
+ { label: 'Rider', value: riderValue ? `${riderValue.firstname} ${riderValue.lastname}` : null, color: STATUS.picked },
+ { label: 'Keyword', value: searchword, color: STATUS.arrived },
+ { label: 'Start Date', value: startdate, color: STATUS.active },
+ { label: 'End Date', value: enddate, color: STATUS.cancelled }
].map((item, idx) => (
-
+
{item.label}
@@ -1032,7 +1120,12 @@ export default function OrdersDetails() {
!next && setMapOpen(false)} variant="fullscreen">
{riderCoordinates && (
-
+
)}
>
diff --git a/src/pages/nearle/reports/ordersSummary.js b/src/pages/nearle/reports/ordersSummary.js
index 5ea49ff..3ee5191 100644
--- a/src/pages/nearle/reports/ordersSummary.js
+++ b/src/pages/nearle/reports/ordersSummary.js
@@ -25,11 +25,11 @@ import {
var utc = require('dayjs/plugin/utc');
dayjs.extend(utc);
-import { Grid } from '@astryxdesign/core/Grid';
import { HStack } from '@astryxdesign/core/HStack';
import { VStack } from '@astryxdesign/core/VStack';
import { Card } from '@astryxdesign/core/Card';
import { Text } from '@astryxdesign/core/Text';
+import { Button } from '@astryxdesign/core/Button';
import { IconButton } from '@astryxdesign/core/IconButton';
import { Tooltip } from '@astryxdesign/core/Tooltip';
import { Badge } from '@astryxdesign/core/Badge';
@@ -46,6 +46,7 @@ import PageHeader from 'components/nearle_components/PageHeader';
import StatCard from 'components/nearle_components/StatCard';
import DebounceSearchBar from 'components/nearle_components/DebounceSearchBar';
import TableLoader from 'components/nearle_components/TableLoader';
+import { PageShell, KpiGrid, FilterToolbar, DataCard } from 'components/nearle_components/PageLayout';
import { MobileCard, MobileCardList, MobileField, MobileFieldGrid } from 'components/nearle_components/MobileCard';
import { useIsNarrowViewport } from 'hooks/useIsNarrowViewport';
import { DT, tint, edge, ring } from 'themes/dt/tokens';
@@ -183,7 +184,10 @@ export default function OrdersReport() {
enabled: tenantid !== 0
});
- const tenantOptions = useMemo(() => (tenantlist || []).map((t) => ({ value: String(t.tenantid), label: t.tenantname || t.label || `Tenant #${t.tenantid}` })), [tenantlist]);
+ const tenantOptions = useMemo(
+ () => (tenantlist || []).map((t) => ({ value: String(t.tenantid), label: t.tenantname || t.label || `Tenant #${t.tenantid}` })),
+ [tenantlist]
+ );
const locationOptions = useMemo(
() =>
(locationlist || []).map((l) => ({
@@ -321,9 +325,25 @@ export default function OrdersReport() {
} />
} />
} />
- } label={Number(sub.collectionamt || 0).toFixed(2)} tooltip="Collection" minWidth={80} />
- } label={`${Number(sub.kms || 0).toFixed(2)} km`} tooltip="KMS" />
- } label={`${Number(sub.cumulativekms || 0).toFixed(2)} km`} tooltip="Actual KMS" />
+ }
+ label={Number(sub.collectionamt || 0).toFixed(2)}
+ tooltip="Collection"
+ minWidth={80}
+ />
+ }
+ label={`${Number(sub.kms || 0).toFixed(2)} km`}
+ tooltip="KMS"
+ />
+ }
+ label={`${Number(sub.cumulativekms || 0).toFixed(2)} km`}
+ tooltip="Actual KMS"
+ />
}
@@ -344,108 +364,110 @@ export default function OrdersReport() {
<>
{(loading || isLoadingReports) && }
- }
- />
+
+
+ }
+ />
-
- {KPI_META.map((item) => {
- const Icon = item.icon;
- return (
- } color={item.color} loading={isLoadingReports} />
- );
- })}
-
-
-
-
-
-
-
- setOpen(true)}
- style={{
- display: 'inline-flex',
- alignItems: 'center',
- gap: 6,
- padding: '6px 10px',
- borderRadius: 999,
- cursor: 'pointer',
- background: tint('#f59e0b'),
- border: `1.5px solid ${edge('#f59e0b')}`,
- color: '#f59e0b',
- fontWeight: 800,
- fontSize: 12
- }}
- >
-
- Orders · {datestatus} · {dayjs(startdate).format('DD/MM/YY')} – {dayjs(enddate).format('DD/MM/YY')}
-
-
-
-
- {
- if (!v) {
- setTenantid(0);
- setLocationid(0);
- return;
- }
- const t = (tenantlist || []).find((x) => String(x.tenantid) === v);
- setTenantid(t?.tenantid || 0);
- setLocationid(0);
- }}
- placeholder="Select Tenant"
- hasSearch
- hasClear
- isDisabled={!appId}
- disabledMessage="Please select a Zone first!"
- />
-
-
-
- {
- if (!v) {
- setLocationid(0);
- return;
- }
- const l = (locationlist || []).find((x) => String(x.locationid) === v);
- setLocationid(l?.locationid || 0);
- }}
- placeholder="Select Location"
- hasSearch
- hasClear
- isDisabled={!tenantid}
- disabledMessage={!appId ? 'Please select Zone and Tenant first!' : 'Please select a Tenant first!'}
- />
-
-
-
-
-
+ {KPI_META.map((item) => {
+ const Icon = item.icon;
+ return (
+ }
+ color={item.color}
+ loading={isLoadingReports}
/>
-
-
-
+ );
+ })}
+
-
+ {/* No status tabs on this report (it's a tenant/location breakdown,
+ not a lifecycle list), so the toolbar just holds every filter
+ including search — same shape as hubs.js/vehicles.js when there's
+ nothing to pair search with. The two-row grouped Orders/Deliveries
+ header below (rowSpan/colSpan) stays a hand-rolled table rather
+ than a TanStack Table v9 column-group conversion — a materially
+ larger, riskier change than this pass's chrome scope. */}
+
+ }
+ onClick={() => setOpen(true)}
+ />
+
+ {
+ if (!v) {
+ setTenantid(0);
+ setLocationid(0);
+ return;
+ }
+ const t = (tenantlist || []).find((x) => String(x.tenantid) === v);
+ setTenantid(t?.tenantid || 0);
+ setLocationid(0);
+ }}
+ placeholder="Select Tenant"
+ hasSearch
+ hasClear
+ isDisabled={!appId}
+ disabledMessage="Please select a Zone first!"
+ />
+
+ {
+ if (!v) {
+ setLocationid(0);
+ return;
+ }
+ const l = (locationlist || []).find((x) => String(x.locationid) === v);
+ setLocationid(l?.locationid || 0);
+ }}
+ placeholder="Select Location"
+ hasSearch
+ hasClear
+ isDisabled={!tenantid}
+ disabledMessage={!appId ? 'Please select Zone and Tenant first!' : 'Please select a Tenant first!'}
+ />
+
+
+
+
+
+
+
+ }
+ >
{isMobile ? (
<>
{!isLoadingReports && filteredRows.length === 0 && (
@@ -455,8 +477,8 @@ export default function OrdersReport() {
debouncedSearch
? 'Try a different keyword.'
: isErrorReports
- ? 'Something went wrong fetching the summary. Try a different filter.'
- : 'Pick a zone, tenant, or date range to load the summary.'
+ ? 'Something went wrong fetching the summary. Try a different filter.'
+ : 'Pick a zone, tenant, or date range to load the summary.'
}
icon={ }
/>
@@ -522,7 +544,13 @@ export default function OrdersReport() {
} />
- } label={Number(row.collectionamt || 0).toFixed(2)} tooltip="Collection Amount" minWidth={90} />
+ }
+ label={Number(row.collectionamt || 0).toFixed(2)}
+ tooltip="Collection Amount"
+ minWidth={90}
+ />
- } label={`${Number(row.kms || 0).toFixed(2)} km`} tooltip="KMS" />
+ }
+ label={`${Number(row.kms || 0).toFixed(2)} km`}
+ tooltip="KMS"
+ />
- } label={`${Number(row.cumulativekms || 0).toFixed(2)} km`} tooltip="Actual KMS" />
+ }
+ label={`${Number(row.cumulativekms || 0).toFixed(2)} km`}
+ tooltip="Actual KMS"
+ />
{isOpen && (
-
+
)}
@@ -580,12 +618,24 @@ export default function OrdersReport() {
Action
- Pending
- Cancelled
- Completed
- Pending
- Cancelled
- Completed
+
+ Pending
+
+
+ Cancelled
+
+
+ Completed
+
+
+ Pending
+
+
+ Cancelled
+
+
+ Completed
+
@@ -601,8 +651,8 @@ export default function OrdersReport() {
debouncedSearch
? 'Try a different keyword.'
: isErrorReports
- ? 'Something went wrong fetching the summary. Try a different filter.'
- : 'Pick a zone, tenant, or date range to load the summary.'
+ ? 'Something went wrong fetching the summary. Try a different filter.'
+ : 'Pick a zone, tenant, or date range to load the summary.'
}
icon={
}
/>
@@ -662,13 +712,29 @@ export default function OrdersReport() {
- } label={Number(row.collectionamt || 0).toFixed(2)} tooltip="Collection Amount" minWidth={90} />
+ }
+ label={Number(row.collectionamt || 0).toFixed(2)}
+ tooltip="Collection Amount"
+ minWidth={90}
+ />
- } label={`${Number(row.kms || 0).toFixed(2)} km`} tooltip="KMS" />
- } label={`${Number(row.cumulativekms || 0).toFixed(2)} km`} tooltip="Actual KMS" />
+ }
+ label={`${Number(row.kms || 0).toFixed(2)} km`}
+ tooltip="KMS"
+ />
+ }
+ label={`${Number(row.cumulativekms || 0).toFixed(2)} km`}
+ tooltip="Actual KMS"
+ />
@@ -741,8 +807,8 @@ export default function OrdersReport() {
>
)}
-
-
+
+
{
<>
{isLoading && }
-
-
- v && setSelectedDate(v)} />
-
- }
- />
+
+
+
+ v && setSelectedDate(v)} />
+
+ }
+ />
-
{!isLoading && riders.length === 0 ? (
@@ -159,7 +159,7 @@ const Profitability = () => {
) : (
)}
-
+
>
);
};
diff --git a/src/pages/nearle/reports/ridersSummary.js b/src/pages/nearle/reports/ridersSummary.js
index 75ae43a..2f14ae9 100644
--- a/src/pages/nearle/reports/ridersSummary.js
+++ b/src/pages/nearle/reports/ridersSummary.js
@@ -23,11 +23,11 @@ import {
var utc = require('dayjs/plugin/utc');
dayjs.extend(utc);
-import { Grid } from '@astryxdesign/core/Grid';
import { HStack } from '@astryxdesign/core/HStack';
import { VStack } from '@astryxdesign/core/VStack';
import { Card } from '@astryxdesign/core/Card';
import { Text } from '@astryxdesign/core/Text';
+import { Button } from '@astryxdesign/core/Button';
import { IconButton } from '@astryxdesign/core/IconButton';
import { Tooltip } from '@astryxdesign/core/Tooltip';
import { Divider } from '@astryxdesign/core/Divider';
@@ -43,6 +43,7 @@ import DebounceSearchBar from 'components/nearle_components/DebounceSearchBar';
import PageHeader from 'components/nearle_components/PageHeader';
import StatCard from 'components/nearle_components/StatCard';
import TableLoader from 'components/nearle_components/TableLoader';
+import { PageShell, KpiGrid, FilterToolbar, DataCard } from 'components/nearle_components/PageLayout';
import RidersRoutes from './RidersRoutes';
import { MobileCard, MobileCardList, MobileField, MobileFieldGrid } from 'components/nearle_components/MobileCard';
import { useIsNarrowViewport } from 'hooks/useIsNarrowViewport';
@@ -257,7 +258,12 @@ export default function RidersSummary() {
} />
} />
} />
- } label={`${Number(sub.kms || 0).toFixed(2)} km`} tooltip="KMS" />
+ }
+ label={`${Number(sub.kms || 0).toFixed(2)} km`}
+ tooltip="KMS"
+ />
}
@@ -267,7 +273,9 @@ export default function RidersSummary() {
}
- label={formatNumberToRupees(Math.max(Number(sub.charges) || 0, Number(sub.deliveryamt) || 0)).replace('₹', '').trim()}
+ label={formatNumberToRupees(Math.max(Number(sub.charges) || 0, Number(sub.deliveryamt) || 0))
+ .replace('₹', '')
+ .trim()}
tooltip="Total Amount"
minWidth={100}
/>
@@ -283,68 +291,69 @@ export default function RidersSummary() {
<>
{(isLoadingReports || loading) && }
- }
- />
+
+ }
+ />
-
- {KPI_META.map((item) => {
- const Icon = item.icon;
- return (
- } color={item.color} loading={isLoadingReports} />
- );
- })}
-
+
+ {KPI_META.map((item) => {
+ const Icon = item.icon;
+ return (
+ }
+ color={item.color}
+ loading={isLoadingReports}
+ />
+ );
+ })}
+
-
-
-
-
-
-
-
-
-
- Orders · {datestatus}
-
-
- {filteredRows.length} riders · {stats.orders} orders
-
-
-
-
+
+
+
+
+
+
+ Orders · {datestatus}
+
+
+ {filteredRows.length} riders · {stats.orders} orders
+
+
+ }
onClick={() => setOpen(true)}
- style={{
- display: 'inline-flex',
- alignItems: 'center',
- gap: 6,
- padding: '6px 10px',
- borderRadius: 999,
- cursor: 'pointer',
- background: tint('#f59e0b'),
- border: `1.5px solid ${edge('#f59e0b')}`,
- color: '#f59e0b',
- fontWeight: 800,
- fontSize: 12,
- marginInlineStart: 8
- }}
- >
-
- {dayjs(startdate).format('DD/MM/YY')} – {dayjs(enddate).format('DD/MM/YY')}
-
-
-
-
-
-
-
-
-
-
+ />
+
+
+
+
+
+
+
+ }
+ >
{isMobile ? (
{(!filteredRows || filteredRows.length === 0) && !isLoadingReports ? (
@@ -379,7 +388,14 @@ export default function RidersSummary() {
- } onClick={() => openRoutePreview(row)} />
+ }
+ onClick={() => openRoutePreview(row)}
+ />
} />
- } label={`${Number(row.riderkms || 0).toFixed(2)} km`} tooltip="KMS" />
+ }
+ label={`${Number(row.riderkms || 0).toFixed(2)} km`}
+ tooltip="KMS"
+ />
- } label={`${Number(row.riderkms || 0).toFixed(2)} km`} tooltip="KMS" />
+ }
+ label={`${Number(row.riderkms || 0).toFixed(2)} km`}
+ tooltip="KMS"
+ />
@@ -512,7 +538,14 @@ export default function RidersSummary() {
- } onClick={() => openRoutePreview(row)} />
+ }
+ onClick={() => openRoutePreview(row)}
+ />
>
)}
-
-
+
+
);
- return (
+ const filterRow = (
+
+
+
+ Shift Batch:
+
+
+ {BATCH_OPTIONS.map((b) => (
+
+ ))}
+
+
+ v && setSelectedDate(dayjs(v))}
+ />
+
+ );
+
+ const tableRegion = (
<>
-
-
-
-
- Shift Batch:
-
-
- {BATCH_OPTIONS.map((b) => (
-
- ))}
-
-
- v && setSelectedDate(dayjs(v))}
- />
-
-
-
-
- {isMobile ? (
- filteredRows?.length === 0 ? (
- } />
- ) : (
-
- {filteredRows?.map((row, index) => {
- const statusMeta = getRowStatusMeta(row);
- const riderProfile = allRidersList?.find((r) => r.userid === row.userid);
- const starttime = riderProfile?.starttime || row.starttime;
- return (
-
-
-
-
- {String(index + 1).padStart(2, '0')}
-
-
- #{row?.userid}
-
- } label={statusMeta.label} />
-
-
-
-
- {(row.fullname || row.username || '?').charAt(0).toUpperCase()}
-
-
-
- {row.username || '—'}
-
-
- {row.contactno || '—'}
-
-
-
-
- }
- >
-
-
- {renderSubstitutePicker(row, isBatchDisabled(getBatchForTime(starttime)))}
-
-
-
- );
- })}
-
- )
+ {isMobile ? (
+ filteredRows?.length === 0 ? (
+ } />
) : (
-
-
-
-
- #
- ID
- Rider
-
- Substitute Rider
- Status
-
-
-
- {filteredRows?.length === 0 && (
-
-
- } />
-
-
- )}
-
- {filteredRows?.length !== 0 &&
- filteredRows?.map((row, index) => {
- const statusMeta = getRowStatusMeta(row);
- const riderProfile = allRidersList?.find((r) => r.userid === row.userid);
- const starttime = riderProfile?.starttime || row.starttime;
- return (
-
-
+
+ {filteredRows?.map((row, index) => {
+ const statusMeta = getRowStatusMeta(row);
+ const riderProfile = allRidersList?.find((r) => r.userid === row.userid);
+ const starttime = riderProfile?.starttime || row.starttime;
+ return (
+
+
+
{String(index + 1).padStart(2, '0')}
-
-
#{row?.userid}
-
-
-
-
- {(row.fullname || row.username || '?').charAt(0).toUpperCase()}
-
-
- {row.username || '—'}
-
- {row.contactno || '—'}
-
-
-
-
+ } label={statusMeta.label} />
+
+
+
+
+ {(row.fullname || row.username || '?').charAt(0).toUpperCase()}
+
+
+
+ {row.username || '—'}
+
+
+ {row.contactno || '—'}
+
+
+
+
+ }
+ >
+
+
+ {renderSubstitutePicker(row, isBatchDisabled(getBatchForTime(starttime)))}
+
+
+
+ );
+ })}
+
+ )
+ ) : (
+
+
+
+
+ #
+ ID
+ Rider
+
+ Substitute Rider
+ Status
+
+
+
+ {filteredRows?.length === 0 && (
+
+
+ } />
+
+
+ )}
-
-
-
- {renderSubstitutePicker(row, isBatchDisabled(getBatchForTime(starttime)))}
+ {filteredRows?.length !== 0 &&
+ filteredRows?.map((row, index) => {
+ const statusMeta = getRowStatusMeta(row);
+ const riderProfile = allRidersList?.find((r) => r.userid === row.userid);
+ const starttime = riderProfile?.starttime || row.starttime;
+ return (
+
+
+
+ {String(index + 1).padStart(2, '0')}
+
+
+
+
+ #{row?.userid}
+
+
+
+
+
+ {(row.fullname || row.username || '?').charAt(0).toUpperCase()}
+
+
+ {row.username || '—'}
+
+ {row.contactno || '—'}
+
+
+
+
-
- } label={statusMeta.label} />
-
-
- );
- })}
-
-
-
- )}
- {hasAssignments && (
-
-
-
- )}
-
+
+
+
+
+ {renderSubstitutePicker(row, isBatchDisabled(getBatchForTime(starttime)))}
+
+
+
+ } label={statusMeta.label} />
+
+
+ );
+ })}
+
+
+
+ )}
+ {hasAssignments && (
+
+
+
+ )}
+ >
+ );
+
+ return (
+ <>
+ {bare ? (
+
+ {filterRow}
+
+ ) : (
+
+ {filterRow}
+
+ )}
+
+ {bare ? (
+ tableRegion
+ ) : (
+
+ {tableRegion}
+
+ )}
>
);
}
diff --git a/src/pages/nearle/riders/createrider.js b/src/pages/nearle/riders/createrider.js
index c4bb24d..03c8a98 100644
--- a/src/pages/nearle/riders/createrider.js
+++ b/src/pages/nearle/riders/createrider.js
@@ -14,6 +14,7 @@ import { Selector } from '@astryxdesign/core/Selector';
import Loader from 'components/Loader';
import PageHeader from 'components/nearle_components/PageHeader';
+import { PageShell } from 'components/nearle_components/PageLayout';
import { createMiler, getHubs } from 'pages/api/doormileApi';
import { getTenants, fetchAppLocations } from 'pages/api/api';
import { DT } from 'themes/dt/tokens';
@@ -58,10 +59,16 @@ const Createrider = () => {
queryFn: fetchAppLocations
});
- const tenantOptions = useMemo(() => (tenants || []).map((t) => ({ value: String(t.tenantid), label: t.tenantname || `Tenant #${t.tenantid}` })), [tenants]);
+ const tenantOptions = useMemo(
+ () => (tenants || []).map((t) => ({ value: String(t.tenantid), label: t.tenantname || `Tenant #${t.tenantid}` })),
+ [tenants]
+ );
const hubOptions = useMemo(() => (hubs || []).map((h) => ({ value: String(h.hubid), label: h.hubname || `Hub #${h.hubid}` })), [hubs]);
const locationOptions = useMemo(
- () => (locations || []).filter((l) => l.applocationid).map((l) => ({ value: String(l.applocationid), label: l.locationname || `Location #${l.applocationid}` })),
+ () =>
+ (locations || [])
+ .filter((l) => l.applocationid)
+ .map((l) => ({ value: String(l.applocationid), label: l.locationname || `Location #${l.applocationid}` })),
[locations]
);
@@ -125,70 +132,92 @@ const Createrider = () => {
<>
{createMilerMutation.isPending && }
-
-
-
- }
- />
+
+
+
+
+ }
+ />
-
-
-
-
-
- {
- const digits = v.replace(/\D/g, '');
- if (digits.length <= 10) setMobilenumber(digits);
- }}
- isRequired
- />
-
-
-
- {isDoormileStaff && (
+
+
+
+
+
+ {
+ const digits = v.replace(/\D/g, '');
+ if (digits.length <= 10) setMobilenumber(digits);
+ }}
+ isRequired
+ />
+
+
+
+ {isDoormileStaff && (
+
+ )}
- )}
-
-
-
+
+
-
-
-
-
-
+
+
+
+
+
+
>
);
};
diff --git a/src/pages/nearle/riders/editRider.js b/src/pages/nearle/riders/editRider.js
index 8c7641d..8810309 100644
--- a/src/pages/nearle/riders/editRider.js
+++ b/src/pages/nearle/riders/editRider.js
@@ -14,6 +14,7 @@ import { Selector } from '@astryxdesign/core/Selector';
import Loader from 'components/Loader';
import PageHeader from 'components/nearle_components/PageHeader';
+import { PageShell } from 'components/nearle_components/PageLayout';
import { getMiler, updateMiler, getAdminTenant } from 'pages/api/doormileApi';
import { fetchAppLocations as fetchZoneLocations } from 'pages/api/api';
import { DT } from 'themes/dt/tokens';
@@ -118,89 +119,93 @@ const EditRider = () => {
<>
{loading && }
- }
- onClick={() => {
- setRiderdata(null);
- navigate('/doormile/riders');
- }}
- />
- }
- />
-
-
-
-
-
-
- Contact Information
-
-
-
-
- setRiderdata({ ...riderdata, displayname: v })}
- />
-
- setRiderdata({ ...riderdata, phone: v.replace(/\D/g, '') })}
- />
- setRiderdata({ ...riderdata, email: v })}
- />
- setRiderdata({ ...riderdata, identificationno: v })}
- />
- {
- const loc = (partnerlist || []).find((l) => String(l.applocationid) === v);
- setRiderdata({ ...riderdata, applocationid: loc?.applocationid });
+
+ }
+ onClick={() => {
+ setRiderdata(null);
+ navigate('/doormile/riders');
}}
- placeholder={riderdata?.city || 'Choose city / zone'}
- hasSearch
/>
-
- {/* Address/Suburb/City/State removed — GET /admin/milers has no such
- fields at all (confirmed live), so they always loaded blank and
- updateRider() never submitted them. Charges/Bank Details/Vehicle
- Details sections removed — PUT /admin/milers/:id has no matching
- fields for any of them (no shift/basefare/bank/vehicle sub-object on
- a miler), so nothing typed into them ever reached the server. */}
-
-
+ }
+ />
-
-
- } onClick={() => navigate('/doormile/riders')} />
-
-
-
+
+
+
+
+
+ Contact Information
+
+
+
+
+ setRiderdata({ ...riderdata, displayname: v })}
+ />
+
+ setRiderdata({ ...riderdata, phone: v.replace(/\D/g, '') })}
+ />
+ setRiderdata({ ...riderdata, email: v })}
+ />
+ setRiderdata({ ...riderdata, identificationno: v })}
+ />
+ {
+ const loc = (partnerlist || []).find((l) => String(l.applocationid) === v);
+ setRiderdata({ ...riderdata, applocationid: loc?.applocationid });
+ }}
+ placeholder={riderdata?.city || 'Choose city / zone'}
+ hasSearch
+ />
+
+ {/* Address/Suburb/City/State removed — GET /admin/milers has no
+ such fields at all (confirmed live), so they always loaded blank
+ and updateRider() never submitted them. Charges/Bank Details/
+ Vehicle Details sections removed — PUT /admin/milers/:id has no
+ matching fields for any of them (no shift/basefare/bank/vehicle
+ sub-object on a miler), so nothing typed into them ever reached
+ the server. */}
+
+
+
+
+
+ }
+ onClick={() => navigate('/doormile/riders')}
+ />
+
+
+
+
>
);
};
diff --git a/src/pages/nearle/riders/riders.js b/src/pages/nearle/riders/riders.js
index ed27445..d369590 100644
--- a/src/pages/nearle/riders/riders.js
+++ b/src/pages/nearle/riders/riders.js
@@ -50,6 +50,7 @@ import LocationAutocomplete from 'components/nearle_components/LocationAutocompl
import PageHeader from 'components/nearle_components/PageHeader';
import StatCard from 'components/nearle_components/StatCard';
import TableLoader from 'components/nearle_components/TableLoader';
+import { PageShell, KpiGrid, FilterToolbar, DataCard } from 'components/nearle_components/PageLayout';
import { MobileCard, MobileCardList, MobileField, MobileFieldGrid } from 'components/nearle_components/MobileCard';
import DebounceSearchBar from 'components/nearle_components/DebounceSearchBar';
import Loader from 'components/Loader';
@@ -109,7 +110,12 @@ const KPI_META = (summary) => [
// Inline stat chip used in the rider-logs collapse row. Mirrors the StatChip
// pattern from the pricing page so the telemetry block reads at a glance.
const LogChip = ({ color, icon: Icon, label, value }) => (
-
+
@@ -134,8 +140,13 @@ const TelemetryPanel = ({ row, riderLogsdata }) => (
Live telemetry — {row.displayname || row.authname || `Rider #${row.userid}`}
-
-
+
+
(
label="Charging"
value={riderLogsdata?.is_charging ? 'Charging' : 'Not Charging'}
/>
-
-
+
+
-
+
);
@@ -324,7 +350,11 @@ const Riders = () => {
if (tabvalue === 1 && (status === 'offline' || status === 'blocked')) return false;
if (!debouncedSearch) return true;
const q = debouncedSearch.toLowerCase();
- return [row.displayname, row.phone].some((v) => String(v || '').toLowerCase().includes(q));
+ return [row.displayname, row.phone].some((v) =>
+ String(v || '')
+ .toLowerCase()
+ .includes(q)
+ );
});
useEffect(() => {
@@ -416,8 +446,14 @@ const Riders = () => {
}
});
- const substituteOptions = (substituteRidersList || []).map((r) => ({ value: String(r.userid), label: `${r.username || r.fullname || ''} (#${r.userid})` }));
- const vehicleOptions = (vehicles || []).map((v) => ({ value: String(v.vehicleid), label: `${v.vehicleno || ''}${v.vehicletype ? ` (${v.vehicletype})` : ''}` }));
+ const substituteOptions = (substituteRidersList || []).map((r) => ({
+ value: String(r.userid),
+ label: `${r.username || r.fullname || ''} (#${r.userid})`
+ }));
+ const vehicleOptions = (vehicles || []).map((v) => ({
+ value: String(v.vehicleid),
+ label: `${v.vehicleno || ''}${v.vehicletype ? ` (${v.vehicletype})` : ''}`
+ }));
const RowActions = ({ row, expanded }) => (
@@ -429,8 +465,22 @@ const Riders = () => {
icon={ }
onClick={() => navigate('/doormile/riders/edit', { state: { riderdata: row } })}
/>
- } onClick={() => handleBlockRider(row)} />
- } onClick={() => setAssignVehicleRider(row)} />
+ }
+ onClick={() => handleBlockRider(row)}
+ />
+ }
+ onClick={() => setAssignVehicleRider(row)}
+ />
{tabvalue != 0 && (
{
return (
<>
- {(allRidersLoading || riderSummarysLoading || (tabvalue === 2 && subRidersLogsLoading) || (tabvalue === 3 && subHistoryLoading)) && }
-
- }
- />
-
-
- {KPI_META(allRidersSummary).map((item) => {
- const Icon = item.icon;
- return } color={item.color} loading={riderSummarysLoading} />;
- })}
-
-
-
-
- handleChangetab(Number(v))} size="sm">
- {TAB_META.map((t) => {
- const Icon = t.icon;
- const count = t.key === 2 ? subRidersLogsData?.length || 0 : t.key === 3 ? subHistoryData?.length || 0 : allRidersSummary?.[t.countKey] ?? 0;
- return } endContent={ } />;
- })}
-
-
-
-
-
-
-
-
- {tabvalue === 3 && (
-
-
-
-
- Status:
-
-
- {HISTORY_STATUS_OPTIONS.map((o) => (
-
- ))}
-
-
- v && setHistoryDate(dayjs(v))}
- />
-
-
+ {(allRidersLoading || riderSummarysLoading || (tabvalue === 2 && subRidersLogsLoading) || (tabvalue === 3 && subHistoryLoading)) && (
+
)}
- {tabvalue === 3 ? (
-
- {subHistoryData?.length === 0 ? (
- } />
- ) : isMobile ? (
-
- {subHistoryData?.map((row, index) => (
-
-
-
- {dayjs(row.sub_date).format('DD MMM YYYY')}
-
-
-
-
-
-
- Absent Rider
-
-
- {row.absent_rider_name}
-
-
- #{row.absent_rider_id}
-
-
-
-
-
- Substitute
-
-
- {row.sub_rider_name}
-
-
- #{row.sub_rider_id}
-
-
-
- {row.reason && (
-
- Reason: {row.reason}
-
- )}
-
- }
- />
- ))}
-
- ) : (
-
-
-
-
- Date
- Absent Rider
-
- Substitute Rider
- Reason
- Status
- Action
-
-
-
- {subHistoryData?.map((row, index) => (
-
-
- {dayjs(row.sub_date).format('DD MMM YYYY')}
-
-
-
-
- {(row.absent_rider_name || '?').charAt(0).toUpperCase()}
-
-
- {row.absent_rider_name}
-
- #{row.absent_rider_id}
-
-
-
-
-
-
-
-
-
-
- {(row.sub_rider_name || '?').charAt(0).toUpperCase()}
-
-
- {row.sub_rider_name}
-
- #{row.sub_rider_id}
-
-
-
-
-
- {row.reason || '—'}
-
-
-
-
-
- {(row.status || '').toLowerCase() !== 'cancelled' && (
-
- }
- onClick={() => {
- setEditingSub(row);
- setNewSubRider(null);
- }}
- />
- }
- onClick={() => handleDeleteSubstitution(row)}
- />
-
- )}
-
-
- ))}
-
-
-
- )}
-
- ) : tabvalue === 2 ? (
-
+ }
/>
- ) : (
-
- {isMobile ? (
-
- {allRidersLoading && (
-
-
-
- Loading riders…
-
-
- )}
- {filteredRows?.length === 0 && !allRidersLoading && (
- }
+
+ {KPI_META(allRidersSummary).map((item) => {
+ const Icon = item.icon;
+ return (
+ }
+ color={item.color}
+ loading={riderSummarysLoading}
+ />
+ );
+ })}
+
+
+
+
+
+
+
+
+ {tabvalue === 3 && (
+
+
+ Status:
+
+
+ {HISTORY_STATUS_OPTIONS.map((o) => (
+
+ ))}
+
+
+ )}
+ {tabvalue === 3 && (
+ v && setHistoryDate(dayjs(v))}
/>
)}
-
- {filteredRows?.length !== 0 &&
- filteredRows?.map((row, index) => {
- const statusMeta = getRowStatusMeta(row);
- const expanded = logsRow === row.milerprofileid;
- return (
+
+ }
+ tabs={
+ handleChangetab(Number(v))} size="sm">
+ {TAB_META.map((t) => {
+ const Icon = t.icon;
+ const count =
+ t.key === 2
+ ? subRidersLogsData?.length || 0
+ : t.key === 3
+ ? subHistoryData?.length || 0
+ : allRidersSummary?.[t.countKey] ?? 0;
+ return (
+ }
+ endContent={ }
+ />
+ );
+ })}
+
+ }
+ >
+ {tabvalue === 3 ? (
+ <>
+ {subHistoryData?.length === 0 ? (
+ }
+ />
+ ) : isMobile ? (
+
+ {subHistoryData?.map((row, index) => (
-
-
-
- {String(index + 1).padStart(2, '0')}
-
-
- #{row?.userid}
-
- } label={statusMeta.label} />
-
- {roleid == 1 && }
+
+
+ {dayjs(row.sub_date).format('DD MMM YYYY')}
+
+
-
-
- {(row.displayname || row.authname || '?').charAt(0).toUpperCase()}
-
-
-
- {row.displayname || row.authname || '—'}
+
+
+
+ Absent Rider
-
- {row.phone || '—'}
+
+ {row.absent_rider_name}
+
+
+ #{row.absent_rider_id}
+
+
+
+
+
+ Substitute
+
+
+ {row.sub_rider_name}
+
+
+ #{row.sub_rider_id}
+ {row.reason && (
+
+ Reason: {row.reason}
+
+ )}
}
- >
-
-
-
- {row.suburb || (row.address ? row.address.slice(0, 20) + '…' : '—')}
-
-
- {row.city || ''}
-
-
-
-
-
-
-
-
- {row.defaultvehicletype || '—'}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {expanded && tabvalue !== 0 && (
-
-
-
- )}
-
- );
- })}
-
- {filteredRows?.length !== 0 && (
-
- {isFetchingNextPage || hasNextPage ? (
-
- ) : (
-
- No more riders
-
- )}
-
+ />
+ ))}
+
+ ) : (
+
+
+
+
+ Date
+ Absent Rider
+
+ Substitute Rider
+ Reason
+ Status
+ Action
+
+
+
+ {subHistoryData?.map((row, index) => (
+
+
+ {dayjs(row.sub_date).format('DD MMM YYYY')}
+
+
+
+
+ {(row.absent_rider_name || '?').charAt(0).toUpperCase()}
+
+
+ {row.absent_rider_name}
+
+ #{row.absent_rider_id}
+
+
+
+
+
+
+
+
+
+
+ {(row.sub_rider_name || '?').charAt(0).toUpperCase()}
+
+
+ {row.sub_rider_name}
+
+ #{row.sub_rider_id}
+
+
+
+
+
+ {row.reason || '—'}
+
+
+
+
+
+ {(row.status || '').toLowerCase() !== 'cancelled' && (
+
+ }
+ onClick={() => {
+ setEditingSub(row);
+ setNewSubRider(null);
+ }}
+ />
+ }
+ onClick={() => handleDeleteSubstitution(row)}
+ />
+
+ )}
+
+
+ ))}
+
+
+
)}
-
+ >
+ ) : tabvalue === 2 ? (
+
) : (
-
-
-
-
- #
- ID
- Rider
- Address
- Vehicle
- Shift
- Time
- Fare
- Fuel
- Status
- {roleid == 1 && Action }
-
-
-
- {allRidersLoading && }
+ <>
+ {isMobile ? (
+
+ {allRidersLoading && (
+
+
+
+ Loading riders…
+
+
+ )}
{filteredRows?.length === 0 && !allRidersLoading && (
-
-
- }
- />
-
-
+ }
+ />
)}
{filteredRows?.length !== 0 &&
@@ -823,60 +774,62 @@ const Riders = () => {
const statusMeta = getRowStatusMeta(row);
const expanded = logsRow === row.milerprofileid;
return (
-
-
-
-
- {String(index + 1).padStart(2, '0')}
-
-
-
-
- #{row?.userid}
-
-
-
+
+
+
+
+ {String(index + 1).padStart(2, '0')}
+
+
+ #{row?.userid}
+
+ } label={statusMeta.label} />
+
+ {roleid == 1 && }
+
{(row.displayname || row.authname || '?').charAt(0).toUpperCase()}
-
+
{row.displayname || row.authname || '—'}
-
+
{row.phone || '—'}
-
-
-
-
-
- {row.suburb || (row.address ? row.address.slice(0, 20) + '…' : '—')}
-
-
- {row.city || ''}
-
-
-
-
-
+
+ }
+ >
+
+
+
+ {row.suburb || (row.address ? row.address.slice(0, 20) + '…' : '—')}
+
+
+ {row.city || ''}
+
+
+
@@ -885,70 +838,221 @@ const Riders = () => {
{row.defaultvehicletype || '—'}
-
-
-
- #{row.shiftid ?? '—'}
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
- {row.basefare ?? '—'}
-
-
-
-
- {row.fuelcharge ?? '—'}
-
-
-
- } label={statusMeta.label} />
-
- {roleid == 1 && (
-
-
-
- )}
-
+
+
+
+
{expanded && tabvalue !== 0 && (
-
-
-
-
-
+
+
+
)}
-
+
);
})}
{filteredRows?.length !== 0 && (
-
-
-
- {isFetchingNextPage || hasNextPage ? (
-
- ) : (
-
- No more riders
-
- )}
-
-
-
+
+ {isFetchingNextPage || hasNextPage ? (
+
+ ) : (
+
+ No more riders
+
+ )}
+
)}
-
-
-
+
+ ) : (
+
+
+
+
+ #
+ ID
+ Rider
+ Address
+ Vehicle
+ Shift
+ Time
+ Fare
+ Fuel
+ Status
+ {roleid == 1 && Action }
+
+
+
+ {allRidersLoading && }
+
+ {filteredRows?.length === 0 && !allRidersLoading && (
+
+
+ }
+ />
+
+
+ )}
+
+ {filteredRows?.length !== 0 &&
+ filteredRows?.map((row, index) => {
+ const statusMeta = getRowStatusMeta(row);
+ const expanded = logsRow === row.milerprofileid;
+ return (
+
+
+
+
+ {String(index + 1).padStart(2, '0')}
+
+
+
+
+ #{row?.userid}
+
+
+
+
+
+ {(row.displayname || row.authname || '?').charAt(0).toUpperCase()}
+
+
+
+ {row.displayname || row.authname || '—'}
+
+
+ {row.phone || '—'}
+
+
+
+
+
+
+
+
+ {row.suburb || (row.address ? row.address.slice(0, 20) + '…' : '—')}
+
+
+ {row.city || ''}
+
+
+
+
+
+
+
+
+
+
+ {row.defaultvehicletype || '—'}
+
+
+
+
+
+ #{row.shiftid ?? '—'}
+
+
+
+
+
+
+
+
+
+
+ {row.basefare ?? '—'}
+
+
+
+
+ {row.fuelcharge ?? '—'}
+
+
+
+ } label={statusMeta.label} />
+
+ {roleid == 1 && (
+
+
+
+ )}
+
+
+ {expanded && tabvalue !== 0 && (
+
+
+
+
+
+ )}
+
+ );
+ })}
+
+ {filteredRows?.length !== 0 && (
+
+
+
+ {isFetchingNextPage || hasNextPage ? (
+
+ ) : (
+
+ No more riders
+
+ )}
+
+
+
+ )}
+
+
+
+ )}
+ >
)}
-
- )}
+
+
!next && setEditingSub(null)} width={420} purpose="form">
{
<>
{(isLoading || createMutation.isPending || lifecycleMutation.isPending) && }
- } onClick={() => setDialogOpen(true)} />}
- />
+
+ } onClick={() => setDialogOpen(true)} />}
+ />
-
- } color={BRAND} />
- } color="#14b8a6" />
-
+
+ } color={BRAND} />
+ } color="#14b8a6" />
+
-
-
-
-
-
- #
- Source Hub
- Destination Hub
- Status
- Actions
-
-
-
- {isLoading && }
- {tripsheets.length === 0 && !isLoading ? (
+
+
+
+
-
- }
- />
-
+ #
+ Source Hub
+ Destination Hub
+ Status
+ Actions
- ) : (
- tripsheets.map((row, index) => (
-
- {index + 1}
- {hubMap.get(row.sourcehubid)?.hubname || (row.sourcehubid ? `Hub #${row.sourcehubid}` : '—')}
-
- {hubMap.get(row.destinationhubid)?.hubname || (row.destinationhubid ? `Hub #${row.destinationhubid}` : '—')}
-
- {row.status || '—'}
-
-
- }
- onClick={() => setItemDialogTrip(row)}
- />
- }
- onClick={() => lifecycleMutation.mutate({ action: 'dispatch', id: row.tripsheetid })}
- />
- }
- onClick={() => lifecycleMutation.mutate({ action: 'arrive', id: row.tripsheetid })}
- />
-
+
+
+ {isLoading && }
+ {tripsheets.length === 0 && !isLoading ? (
+
+
+ }
+ />
- ))
- )}
-
-
-
-
+ ) : (
+ tripsheets.map((row, index) => (
+
+ {index + 1}
+ {hubMap.get(row.sourcehubid)?.hubname || (row.sourcehubid ? `Hub #${row.sourcehubid}` : '—')}
+
+ {hubMap.get(row.destinationhubid)?.hubname || (row.destinationhubid ? `Hub #${row.destinationhubid}` : '—')}
+
+ {row.status || '—'}
+
+
+ }
+ onClick={() => setItemDialogTrip(row)}
+ />
+ }
+ onClick={() => lifecycleMutation.mutate({ action: 'dispatch', id: row.tripsheetid })}
+ />
+ }
+ onClick={() => lifecycleMutation.mutate({ action: 'arrive', id: row.tripsheetid })}
+ />
+
+
+
+ ))
+ )}
+
+
+
+
+
!next && setDialogOpen(false)} width={480} purpose="form">
{
}
content={
-
+
}
footer={
diff --git a/src/pages/nearle/vehicles/vehicles.js b/src/pages/nearle/vehicles/vehicles.js
index 0f1f641..ee79026 100644
--- a/src/pages/nearle/vehicles/vehicles.js
+++ b/src/pages/nearle/vehicles/vehicles.js
@@ -4,7 +4,6 @@ import { MdDirectionsCar, MdEdit, MdDeleteOutline, MdAdd, MdBatteryStd, MdBatter
import { Grid } from '@astryxdesign/core/Grid';
import { HStack } from '@astryxdesign/core/HStack';
import { VStack } from '@astryxdesign/core/VStack';
-import { Card } from '@astryxdesign/core/Card';
import { Text } from '@astryxdesign/core/Text';
import { Button } from '@astryxdesign/core/Button';
import { IconButton } from '@astryxdesign/core/IconButton';
@@ -21,6 +20,7 @@ import DebounceSearchBar from 'components/nearle_components/DebounceSearchBar';
import PageHeader from 'components/nearle_components/PageHeader';
import StatCard from 'components/nearle_components/StatCard';
import TableLoader from 'components/nearle_components/TableLoader';
+import { PageShell, KpiGrid, FilterToolbar, DataCard } from 'components/nearle_components/PageLayout';
import { getVehicles, createVehicle, updateVehicle, deleteVehicle, getPartners } from 'pages/api/doormileApi';
import { enqueueSnackbar } from 'notistack';
import { DT, STATUS } from 'themes/dt/tokens';
@@ -59,7 +59,9 @@ const Vehicles = () => {
const rows = useMemo(() => {
if (!debouncedSearch) return vehicles;
const q = debouncedSearch.toLowerCase().trim();
- return vehicles.filter((row) => [row.vehicleno, row.vehicletype, row.status].filter(Boolean).some((f) => String(f).toLowerCase().includes(q)));
+ return vehicles.filter((row) =>
+ [row.vehicleno, row.vehicletype, row.status].filter(Boolean).some((f) => String(f).toLowerCase().includes(q))
+ );
}, [vehicles, debouncedSearch]);
const stats = useMemo(() => {
@@ -150,38 +152,42 @@ const Vehicles = () => {
<>
{(isLoading || saveMutation.isPending || deleteMutation.isPending) && }
- } onClick={openCreate} />}
- />
+
+ } onClick={openCreate} />}
+ />
-
- } color={BRAND} />
- } color={STATUS.delivered} />
- } color={STATUS.pending} />
- } color={STATUS.active} />
-
+
+ } color={BRAND} />
+ } color={STATUS.delivered} />
+ } color={STATUS.pending} />
+ } color={STATUS.active} />
+
-
-
-
-
- {vehicles.length} total · {rows.length} shown
-
-
-
-
-
-
-
-
+
+
+
+ {vehicles.length} total · {rows.length} shown
+
+
+
+
+
+
+
+
+ }
+ >
@@ -244,13 +250,13 @@ const Vehicles = () => {
-
-
+
+
!next && setDialogOpen(false)} width={640} purpose="form">
-
+
{
/>
-
+
{
<>
{isLoading && }
-
+
+
-
-
-
-
-
- {fullname}
-
-
- {roleLabel !== '—' && } label={roleLabel} />}
- {(userData?.id != null || userData?.userid != null) && (
-
- ID #{userData.id ?? userData.userid}
-
- )}
-
-
-
- {tenantLabel}
-
+
+
+
+
+
+ {fullname}
+
+
+ {roleLabel !== '—' && } label={roleLabel} />}
+ {(userData?.id != null || userData?.userid != null) && (
+
+ ID #{userData.id ?? userData.userid}
+
+ )}
+
+
+
+ {tenantLabel}
+
+
-
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
- }
- onClick={handleChangePassword}
- isLoading={changePasswordMutation.isPending}
- style={{ alignSelf: 'flex-start' }}
- />
-
-
-
+
+
+
+
+
+
+ }
+ onClick={handleChangePassword}
+ isLoading={changePasswordMutation.isPending}
+ style={{ alignSelf: 'flex-start' }}
+ />
+
+
+
+
>
);
};
diff --git a/src/themes/astryx.js b/src/themes/astryx.js
index f36f480..49d4d3d 100644
--- a/src/themes/astryx.js
+++ b/src/themes/astryx.js
@@ -19,10 +19,39 @@ import { DT } from 'themes/dt/tokens';
const BRAND_ON_LIGHT = DT.brand; // #000000
const BRAND_ON_DARK = '#FFFFFF';
+// Shared fallback stack. Every role appends this after its own family, so a
+// blocked/slow Google Fonts request degrades to the platform UI font rather
+// than to Times New Roman.
+const SYSTEM_SANS = '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif';
+
export const doormileTheme = defineTheme({
name: 'doormile',
extends: neutralTheme,
color: { neutralStyle: 'cool' },
+ // ---------------------------------------------------------------------
+ // Typography. This is the ONLY place font families and the type scale are
+ // decided; it drives --font-family-body/-heading/-code and the whole
+ // --text-heading-*/--text-body-* scale, so every Astryx component in the
+ // app moves together.
+ //
+ // Before this existed the app had three disagreeing sources and no scale at
+ // all: this file set no typography, config.js said 'Public Sans' (MUI), and
+ // Dispatch.css hardcoded 'Inter' + 'JetBrains Mono' in ~25 declarations.
+ //
+ // The families themselves are loaded by the in public/index.html —
+ // Astryx explicitly does not load fonts, it only names them. Change one
+ // without the other and you get a silent fallback.
+ //
+ // base 14, not 16: this is a dense operator console and 14px is what the
+ // existing tables already assume. ratio 1.2 keeps the heading steps tight
+ // so an h1 doesn't tower over a data-heavy page.
+ // ---------------------------------------------------------------------
+ typography: {
+ scale: { base: 14, ratio: 1.2 },
+ body: { family: 'Inter', fallbacks: SYSTEM_SANS },
+ heading: { family: 'Sora', fallbacks: SYSTEM_SANS, weight: 'semibold' },
+ code: { family: 'ui-monospace', fallbacks: 'SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace' }
+ },
tokens: {
'--color-accent': [BRAND_ON_LIGHT, BRAND_ON_DARK],
'--color-icon-accent': [BRAND_ON_LIGHT, BRAND_ON_DARK],
diff --git a/src/themes/dt/primitives.js b/src/themes/dt/primitives.js
index a47790b..40b34fd 100644
--- a/src/themes/dt/primitives.js
+++ b/src/themes/dt/primitives.js
@@ -30,19 +30,34 @@ export const softPopupStyle = {
// sticky-header or max-height affordance (MUI's TableContainer used to provide that),
// so pages wrap it in this. The brand-red scrollbar can't be expressed inline
// — ::-webkit-scrollbar-* are pseudo-elements — hence the one-time
-
+
>
@@ -51,6 +66,7 @@ export const TableScroll = ({ maxHeight = 'calc(100vh - 260px)', minWidth, child
TableScroll.propTypes = {
maxHeight: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
minWidth: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
+ flush: PropTypes.bool,
children: PropTypes.node
};
diff --git a/yarn.lock b/yarn.lock
index 258b11b..f222ba6 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -7,35 +7,13 @@
resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz"
integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==
-"@ant-design/colors@^7.0.0", "@ant-design/colors@^7.2.0":
+"@ant-design/colors@^7.0.0":
version "7.2.0"
resolved "https://registry.npmjs.org/@ant-design/colors/-/colors-7.2.0.tgz"
integrity sha512-bjTObSnZ9C/O8MB/B4OUtd/q9COomuJAR2SYfhxLyHvCKn4EKwCN3e+fWGMo7H5InAyV0wL17jdE9ALrdOW/6A==
dependencies:
"@ant-design/fast-color" "^2.0.6"
-"@ant-design/cssinjs-utils@^1.1.3":
- version "1.1.3"
- resolved "https://registry.npmjs.org/@ant-design/cssinjs-utils/-/cssinjs-utils-1.1.3.tgz"
- integrity sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg==
- dependencies:
- "@ant-design/cssinjs" "^1.21.0"
- "@babel/runtime" "^7.23.2"
- rc-util "^5.38.0"
-
-"@ant-design/cssinjs@^1.21.0", "@ant-design/cssinjs@^1.23.0":
- version "1.23.0"
- resolved "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.23.0.tgz"
- integrity sha512-7GAg9bD/iC9ikWatU9ym+P9ugJhi/WbsTWzcKN6T4gU0aehsprtke1UAaaSxxkjjmkJb3llet/rbUSLPgwlY4w==
- 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.3.4"
-
"@ant-design/fast-color@^2.0.6":
version "2.0.6"
resolved "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-2.0.6.tgz"
@@ -48,7 +26,7 @@
resolved "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz"
integrity sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==
-"@ant-design/icons@^5.0.1", "@ant-design/icons@^5.6.1":
+"@ant-design/icons@^5.0.1":
version "5.6.1"
resolved "https://registry.npmjs.org/@ant-design/icons/-/icons-5.6.1.tgz"
integrity sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==
@@ -59,17 +37,6 @@
classnames "^2.2.6"
rc-util "^5.31.1"
-"@ant-design/react-slick@~1.1.2":
- version "1.1.2"
- resolved "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.1.2.tgz"
- integrity sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==
- 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"
-
"@apideck/better-ajv-errors@^0.3.1":
version "0.3.6"
resolved "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz"
@@ -79,7 +46,7 @@
jsonpointer "^5.0.0"
leven "^3.1.0"
-"@astryxdesign/core@^0.1.9":
+"@astryxdesign/core@^0.1.9", "@astryxdesign/core@0.1.9":
version "0.1.9"
resolved "https://registry.npmjs.org/@astryxdesign/core/-/core-0.1.9.tgz"
integrity sha512-2ZNypZFfujMPxdU8M9Jbe77vwFPP1FYvA0Pk/3L3OLxEIzi98qLbRJjhDEHLbrflANSFVB4l5+qYpJjYtFFXMQ==
@@ -107,7 +74,7 @@
resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz"
integrity sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==
-"@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.21.3", "@babel/core@^7.21.4", "@babel/core@^7.7.2", "@babel/core@^7.8.0":
+"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.0", "@babel/core@^7.16.0", "@babel/core@^7.21.3", "@babel/core@^7.21.4", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.4.0-0", "@babel/core@^7.7.2", "@babel/core@^7.8.0", "@babel/core@>=7.11.0":
version "7.29.7"
resolved "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz"
integrity sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==
@@ -467,7 +434,7 @@
dependencies:
"@babel/helper-plugin-utils" "^7.16.7"
-"@babel/plugin-syntax-flow@^7.16.7":
+"@babel/plugin-syntax-flow@^7.14.5", "@babel/plugin-syntax-flow@^7.16.7":
version "7.26.0"
resolved "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz"
integrity sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==
@@ -917,7 +884,7 @@
dependencies:
"@babel/plugin-transform-react-jsx" "^7.27.1"
-"@babel/plugin-transform-react-jsx@^7.27.1":
+"@babel/plugin-transform-react-jsx@^7.14.9", "@babel/plugin-transform-react-jsx@^7.27.1":
version "7.27.1"
resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz"
integrity sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==
@@ -1155,7 +1122,7 @@
"@babel/plugin-transform-modules-commonjs" "^7.21.2"
"@babel/plugin-transform-typescript" "^7.21.3"
-"@babel/runtime@^7.10.1", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.16.7", "@babel/runtime@^7.18.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.0", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.6", "@babel/runtime@^7.23.9", "@babel/runtime@^7.24.4", "@babel/runtime@^7.24.7", "@babel/runtime@^7.24.8", "@babel/runtime@^7.25.7", "@babel/runtime@^7.26.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
+"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.24.7", "@babel/runtime@^7.24.8", "@babel/runtime@^7.9.2":
version "7.26.9"
resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.9.tgz"
integrity sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==
@@ -1308,133 +1275,6 @@
resolved "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz"
integrity sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==
-"@emotion/babel-plugin@^11.10.6":
- version "11.10.6"
- resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz"
- integrity sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==
- dependencies:
- "@babel/helper-module-imports" "^7.16.7"
- "@babel/runtime" "^7.18.3"
- "@emotion/hash" "^0.9.0"
- "@emotion/memoize" "^0.8.0"
- "@emotion/serialize" "^1.1.1"
- babel-plugin-macros "^3.1.0"
- convert-source-map "^1.5.0"
- escape-string-regexp "^4.0.0"
- find-root "^1.1.0"
- source-map "^0.5.7"
- stylis "4.1.3"
-
-"@emotion/cache@^11.10.5", "@emotion/cache@^11.10.7", "@emotion/cache@^11.13.5":
- version "11.14.0"
- resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz"
- integrity sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==
- dependencies:
- "@emotion/memoize" "^0.9.0"
- "@emotion/sheet" "^1.4.0"
- "@emotion/utils" "^1.4.2"
- "@emotion/weak-memoize" "^0.4.0"
- stylis "4.2.0"
-
-"@emotion/hash@^0.8.0":
- version "0.8.0"
- resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz"
- integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==
-
-"@emotion/hash@^0.9.0", "@emotion/hash@^0.9.2":
- version "0.9.2"
- resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz"
- integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==
-
-"@emotion/is-prop-valid@^1.2.0":
- version "1.2.0"
- resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz"
- integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==
- dependencies:
- "@emotion/memoize" "^0.8.0"
-
-"@emotion/memoize@^0.8.0":
- version "0.8.0"
- resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz"
- integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==
-
-"@emotion/memoize@^0.9.0":
- version "0.9.0"
- resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz"
- integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==
-
-"@emotion/react@^11.10.6":
- version "11.10.6"
- resolved "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz"
- integrity sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==
- dependencies:
- "@babel/runtime" "^7.18.3"
- "@emotion/babel-plugin" "^11.10.6"
- "@emotion/cache" "^11.10.5"
- "@emotion/serialize" "^1.1.1"
- "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0"
- "@emotion/utils" "^1.2.0"
- "@emotion/weak-memoize" "^0.3.0"
- hoist-non-react-statics "^3.3.1"
-
-"@emotion/serialize@^1.1.1":
- version "1.3.3"
- resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz"
- integrity sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==
- dependencies:
- "@emotion/hash" "^0.9.2"
- "@emotion/memoize" "^0.9.0"
- "@emotion/unitless" "^0.10.0"
- "@emotion/utils" "^1.4.2"
- csstype "^3.0.2"
-
-"@emotion/sheet@^1.4.0":
- version "1.4.0"
- resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz"
- integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==
-
-"@emotion/styled@^11.10.6":
- version "11.10.6"
- resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.6.tgz"
- integrity sha512-OXtBzOmDSJo5Q0AFemHCfl+bUueT8BIcPSxu0EGTpGk6DmI5dnhSzQANm1e1ze0YZL7TDyAyy6s/b/zmGOS3Og==
- dependencies:
- "@babel/runtime" "^7.18.3"
- "@emotion/babel-plugin" "^11.10.6"
- "@emotion/is-prop-valid" "^1.2.0"
- "@emotion/serialize" "^1.1.1"
- "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0"
- "@emotion/utils" "^1.2.0"
-
-"@emotion/unitless@^0.10.0":
- version "0.10.0"
- resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz"
- integrity sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==
-
-"@emotion/unitless@^0.7.5":
- version "0.7.5"
- resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz"
- integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==
-
-"@emotion/use-insertion-effect-with-fallbacks@^1.0.0":
- version "1.0.0"
- resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz"
- integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==
-
-"@emotion/utils@^1.2.0", "@emotion/utils@^1.4.2":
- version "1.4.2"
- resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz"
- integrity sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==
-
-"@emotion/weak-memoize@^0.3.0":
- version "0.3.0"
- resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz"
- integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==
-
-"@emotion/weak-memoize@^0.4.0":
- version "0.4.0"
- resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz"
- integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==
-
"@eslint-community/eslint-utils@^4.2.0":
version "4.4.0"
resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz"
@@ -1526,7 +1366,7 @@
"@firebase/util" "1.10.0"
tslib "^2.1.0"
-"@firebase/app-compat@0.2.43":
+"@firebase/app-compat@0.2.43", "@firebase/app-compat@0.x":
version "0.2.43"
resolved "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.43.tgz"
integrity sha512-HM96ZyIblXjAC7TzE8wIk2QhHlSvksYkQ4Ukh1GmEenzkucSNUmUX4QvoKrqeWsLEQ8hdcojABeCV8ybVyZmeg==
@@ -1537,12 +1377,12 @@
"@firebase/util" "1.10.0"
tslib "^2.1.0"
-"@firebase/app-types@0.9.2":
+"@firebase/app-types@0.9.2", "@firebase/app-types@0.x":
version "0.9.2"
resolved "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.2.tgz"
integrity sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ==
-"@firebase/app@0.10.13":
+"@firebase/app@0.10.13", "@firebase/app@0.x":
version "0.10.13"
resolved "https://registry.npmjs.org/@firebase/app/-/app-0.10.13.tgz"
integrity sha512-OZiDAEK/lDB6xy/XzYAyJJkaDqmQ+BCtOEPLqFvxWKUz5JbBmej7IiiRHdtiIOD/twW7O5AxVsfaaGA/V1bNsA==
@@ -1839,7 +1679,7 @@
tslib "^2.1.0"
undici "6.19.7"
-"@firebase/util@1.10.0":
+"@firebase/util@1.10.0", "@firebase/util@1.x":
version "1.10.0"
resolved "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz"
integrity sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==
@@ -1862,33 +1702,6 @@
resolved "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.1.tgz"
integrity sha512-jmEnr/pk0yVkA7mIlHNnxCi+wWzOFUg0WyIotgkKAb2u1J7fAeDBcVNSTjTihbAYNusCLQdW5s9IJ5qwnEufcQ==
-"@floating-ui/core@^1.6.0":
- version "1.6.9"
- resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz"
- integrity sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==
- dependencies:
- "@floating-ui/utils" "^0.2.9"
-
-"@floating-ui/dom@^1.0.0":
- version "1.6.13"
- resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz"
- integrity sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==
- dependencies:
- "@floating-ui/core" "^1.6.0"
- "@floating-ui/utils" "^0.2.9"
-
-"@floating-ui/react-dom@^2.0.8", "@floating-ui/react-dom@^2.1.1":
- version "2.1.2"
- resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz"
- integrity sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==
- dependencies:
- "@floating-ui/dom" "^1.0.0"
-
-"@floating-ui/utils@^0.2.9":
- version "0.2.9"
- resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz"
- integrity sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==
-
"@formatjs/ecma402-abstract@2.3.6":
version "2.3.6"
resolved "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.6.tgz"
@@ -2280,170 +2093,6 @@
resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz"
integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==
-"@mui/base@^5.0.0-beta.70":
- version "5.0.0-beta.70"
- resolved "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.70.tgz"
- integrity sha512-Tb/BIhJzb0pa5zv/wu7OdokY9ZKEDqcu1BDFnohyvGCoHuSXbEr90rPq1qeNW3XvTBIbNWHEF7gqge+xpUo6tQ==
- dependencies:
- "@babel/runtime" "^7.26.0"
- "@floating-ui/react-dom" "^2.1.1"
- "@mui/types" "~7.2.24"
- "@mui/utils" "^6.4.8"
- "@popperjs/core" "^2.11.8"
- clsx "^2.1.1"
- prop-types "^15.8.1"
-
-"@mui/base@5.0.0-beta.40-0":
- version "5.0.0-beta.40-0"
- resolved "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40-0.tgz"
- integrity sha512-hG3atoDUxlvEy+0mqdMpWd04wca8HKr2IHjW/fAjlkCHQolSLazhZM46vnHjOf15M4ESu25mV/3PgjczyjVM4w==
- dependencies:
- "@babel/runtime" "^7.23.9"
- "@floating-ui/react-dom" "^2.0.8"
- "@mui/types" "^7.2.15"
- "@mui/utils" "^5.16.12"
- "@popperjs/core" "^2.11.8"
- clsx "^2.1.0"
- prop-types "^15.8.1"
-
-"@mui/core-downloads-tracker@^5.16.14":
- version "5.16.14"
- resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.14.tgz"
- integrity sha512-sbjXW+BBSvmzn61XyTMun899E7nGPTXwqD9drm1jBUAvWEhJpPFIRxwQQiATWZnd9rvdxtnhhdsDxEGWI0jxqA==
-
-"@mui/icons-material@^5.14.19":
- version "5.16.14"
- resolved "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.16.14.tgz"
- integrity sha512-heL4S+EawrP61xMXBm59QH6HODsu0gxtZi5JtnXF2r+rghzyU/3Uftlt1ij8rmJh+cFdKTQug1L9KkZB5JgpMQ==
- dependencies:
- "@babel/runtime" "^7.23.9"
-
-"@mui/lab@^5.0.0-alpha.127":
- version "5.0.0-alpha.175"
- resolved "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.175.tgz"
- integrity sha512-AvM0Nvnnj7vHc9+pkkQkoE1i+dEbr6gsMdnSfy7X4w3Ljgcj1yrjZhIt3jGTCLzyKVLa6uve5eLluOcGkvMqUA==
- dependencies:
- "@babel/runtime" "^7.23.9"
- "@mui/base" "5.0.0-beta.40-0"
- "@mui/system" "^5.16.12"
- "@mui/types" "^7.2.15"
- "@mui/utils" "^5.16.12"
- clsx "^2.1.0"
- prop-types "^15.8.1"
-
-"@mui/material@^5.12.1":
- version "5.16.14"
- resolved "https://registry.npmjs.org/@mui/material/-/material-5.16.14.tgz"
- integrity sha512-eSXQVCMKU2xc7EcTxe/X/rC9QsV2jUe8eLM3MUCPYbo6V52eCE436akRIvELq/AqZpxx2bwkq7HC0cRhLB+yaw==
- dependencies:
- "@babel/runtime" "^7.23.9"
- "@mui/core-downloads-tracker" "^5.16.14"
- "@mui/system" "^5.16.14"
- "@mui/types" "^7.2.15"
- "@mui/utils" "^5.16.14"
- "@popperjs/core" "^2.11.8"
- "@types/react-transition-group" "^4.4.10"
- clsx "^2.1.0"
- csstype "^3.1.3"
- prop-types "^15.8.1"
- react-is "^19.0.0"
- react-transition-group "^4.4.5"
-
-"@mui/private-theming@^5.16.14":
- version "5.16.14"
- resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.14.tgz"
- integrity sha512-12t7NKzvYi819IO5IapW2BcR33wP/KAVrU8d7gLhGHoAmhDxyXlRoKiRij3TOD8+uzk0B6R9wHUNKi4baJcRNg==
- dependencies:
- "@babel/runtime" "^7.23.9"
- "@mui/utils" "^5.16.14"
- prop-types "^15.8.1"
-
-"@mui/styled-engine@^5.16.14":
- version "5.16.14"
- resolved "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.14.tgz"
- integrity sha512-UAiMPZABZ7p8mUW4akDV6O7N3+4DatStpXMZwPlt+H/dA0lt67qawN021MNND+4QTpjaiMYxbhKZeQcyWCbuKw==
- dependencies:
- "@babel/runtime" "^7.23.9"
- "@emotion/cache" "^11.13.5"
- csstype "^3.1.3"
- prop-types "^15.8.1"
-
-"@mui/system@^5.16.12", "@mui/system@^5.16.14":
- version "5.16.14"
- resolved "https://registry.npmjs.org/@mui/system/-/system-5.16.14.tgz"
- integrity sha512-KBxMwCb8mSIABnKvoGbvM33XHyT+sN0BzEBG+rsSc0lLQGzs7127KWkCA6/H8h6LZ00XpBEME5MAj8mZLiQ1tw==
- dependencies:
- "@babel/runtime" "^7.23.9"
- "@mui/private-theming" "^5.16.14"
- "@mui/styled-engine" "^5.16.14"
- "@mui/types" "^7.2.15"
- "@mui/utils" "^5.16.14"
- clsx "^2.1.0"
- csstype "^3.1.3"
- prop-types "^15.8.1"
-
-"@mui/types@^7.2.15", "@mui/types@~7.2.24":
- version "7.2.24"
- resolved "https://registry.npmjs.org/@mui/types/-/types-7.2.24.tgz"
- integrity sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==
-
-"@mui/utils@^5.16.12":
- version "5.16.14"
- resolved "https://registry.npmjs.org/@mui/utils/-/utils-5.16.14.tgz"
- integrity sha512-wn1QZkRzSmeXD1IguBVvJJHV3s6rxJrfb6YuC9Kk6Noh9f8Fb54nUs5JRkKm+BOerRhj5fLg05Dhx/H3Ofb8Mg==
- dependencies:
- "@babel/runtime" "^7.23.9"
- "@mui/types" "^7.2.15"
- "@types/prop-types" "^15.7.12"
- clsx "^2.1.1"
- prop-types "^15.8.1"
- react-is "^19.0.0"
-
-"@mui/utils@^5.16.14":
- version "5.16.14"
- resolved "https://registry.npmjs.org/@mui/utils/-/utils-5.16.14.tgz"
- integrity sha512-wn1QZkRzSmeXD1IguBVvJJHV3s6rxJrfb6YuC9Kk6Noh9f8Fb54nUs5JRkKm+BOerRhj5fLg05Dhx/H3Ofb8Mg==
- dependencies:
- "@babel/runtime" "^7.23.9"
- "@mui/types" "^7.2.15"
- "@types/prop-types" "^15.7.12"
- clsx "^2.1.1"
- prop-types "^15.8.1"
- react-is "^19.0.0"
-
-"@mui/utils@^5.16.6 || ^6.0.0 || ^7.0.0", "@mui/utils@^6.4.8":
- version "6.4.9"
- resolved "https://registry.npmjs.org/@mui/utils/-/utils-6.4.9.tgz"
- integrity sha512-Y12Q9hbK9g+ZY0T3Rxrx9m2m10gaphDuUMgWxyV5kNJevVxXYCLclYUCC9vXaIk1/NdNDTcW2Yfr2OGvNFNmHg==
- dependencies:
- "@babel/runtime" "^7.26.0"
- "@mui/types" "~7.2.24"
- "@types/prop-types" "^15.7.14"
- clsx "^2.1.1"
- prop-types "^15.8.1"
- react-is "^19.0.0"
-
-"@mui/x-date-pickers@^7.29.4":
- version "7.29.4"
- resolved "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.29.4.tgz"
- integrity sha512-wJ3tsqk/y6dp+mXGtT9czciAMEO5Zr3IIAHg9x6IL0Eqanqy0N3chbmQQZv3iq0m2qUpQDLvZ4utZBUTJdjNzw==
- dependencies:
- "@babel/runtime" "^7.25.7"
- "@mui/utils" "^5.16.6 || ^6.0.0 || ^7.0.0"
- "@mui/x-internals" "7.29.0"
- "@types/react-transition-group" "^4.4.11"
- clsx "^2.1.1"
- prop-types "^15.8.1"
- react-transition-group "^4.4.5"
-
-"@mui/x-internals@7.29.0":
- version "7.29.0"
- resolved "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.29.0.tgz"
- integrity sha512-+Gk6VTZIFD70XreWvdXBwKd8GZ2FlSCuecQFzm6znwqXg1ZsndavrhG9tkxpxo2fM1Zf7Tk8+HcOO0hCbhTQFA==
- dependencies:
- "@babel/runtime" "^7.25.7"
- "@mui/utils" "^5.16.6 || ^6.0.0 || ^7.0.0"
-
"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1":
version "5.1.1-v1"
resolved "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz"
@@ -2492,11 +2141,6 @@
schema-utils "^3.0.0"
source-map "^0.7.3"
-"@popperjs/core@^2.11.8":
- version "2.11.8"
- resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz"
- integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==
-
"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2":
version "1.1.2"
resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz"
@@ -2550,88 +2194,6 @@
resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz"
integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==
-"@rc-component/async-validator@^5.0.3":
- version "5.0.4"
- resolved "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.0.4.tgz"
- integrity sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==
- dependencies:
- "@babel/runtime" "^7.24.4"
-
-"@rc-component/color-picker@~2.0.1":
- version "2.0.1"
- resolved "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-2.0.1.tgz"
- integrity sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==
- dependencies:
- "@ant-design/fast-color" "^2.0.6"
- "@babel/runtime" "^7.23.6"
- classnames "^2.2.6"
- rc-util "^5.38.1"
-
-"@rc-component/context@^1.4.0":
- 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"
-
-"@rc-component/mini-decimal@^1.0.1":
- 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"
-
-"@rc-component/mutate-observer@^1.1.0":
- 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"
-
-"@rc-component/portal@^1.0.0-8", "@rc-component/portal@^1.0.0-9", "@rc-component/portal@^1.0.2", "@rc-component/portal@^1.1.0", "@rc-component/portal@^1.1.1":
- 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"
-
-"@rc-component/qrcode@~1.0.0":
- version "1.0.0"
- resolved "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.0.0.tgz"
- integrity sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==
- dependencies:
- "@babel/runtime" "^7.24.7"
- classnames "^2.3.2"
- rc-util "^5.38.0"
-
-"@rc-component/tour@~1.15.1":
- version "1.15.1"
- resolved "https://registry.npmjs.org/@rc-component/tour/-/tour-1.15.1.tgz"
- integrity sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ==
- dependencies:
- "@babel/runtime" "^7.18.0"
- "@rc-component/portal" "^1.0.0-9"
- "@rc-component/trigger" "^2.0.0"
- classnames "^2.3.2"
- rc-util "^5.24.4"
-
-"@rc-component/trigger@^2.0.0", "@rc-component/trigger@^2.1.1", "@rc-component/trigger@^2.2.6":
- version "2.2.6"
- resolved "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.2.6.tgz"
- integrity sha512-/9zuTnWwhQ3S3WT1T8BubuFTT46kvnXgaERR9f4BTKyn61/wpf/BvbImzYBubzJibU707FxwbKszLlHjcLiv1Q==
- 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.44.0"
-
"@react-dnd/asap@^5.0.1":
version "5.0.2"
resolved "https://registry.npmjs.org/@react-dnd/asap/-/asap-5.0.2.tgz"
@@ -2872,16 +2434,7 @@
"@svgr/babel-plugin-transform-react-native-svg" "^7.0.0"
"@svgr/babel-plugin-transform-svg-component" "^7.0.0"
-"@svgr/core@^5.5.0":
- version "5.5.0"
- resolved "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz"
- integrity sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==
- dependencies:
- "@svgr/plugin-jsx" "^5.5.0"
- camelcase "^6.2.0"
- cosmiconfig "^7.0.0"
-
-"@svgr/core@^7.0.0":
+"@svgr/core@*", "@svgr/core@^7.0.0":
version "7.0.0"
resolved "https://registry.npmjs.org/@svgr/core/-/core-7.0.0.tgz"
integrity sha512-ztAoxkaKhRVloa3XydohgQQCb0/8x9T63yXovpmHzKMkHO6pkjdsIAWKOS4bE95P/2quVh1NtjSKlMRNzSBffw==
@@ -2891,6 +2444,15 @@
camelcase "^6.2.0"
cosmiconfig "^8.1.3"
+"@svgr/core@^5.5.0":
+ version "5.5.0"
+ resolved "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz"
+ integrity sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==
+ dependencies:
+ "@svgr/plugin-jsx" "^5.5.0"
+ camelcase "^6.2.0"
+ cosmiconfig "^7.0.0"
+
"@svgr/hast-util-to-babel-ast@^5.5.0":
version "5.5.0"
resolved "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz"
@@ -2984,6 +2546,34 @@
dependencies:
"@tanstack/query-core" "5.101.4"
+"@tanstack/react-store@^0.11.0":
+ version "0.11.1"
+ resolved "https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.11.1.tgz"
+ integrity sha512-HaIGKI3YLmjBYIvy5DFDY23oNaYZIsTZfngey07Uh5iLVJgM3bIGCnZeOFOqzjFld9JHWcaHJnasD/bKoGKwJQ==
+ dependencies:
+ "@tanstack/store" "0.11.1"
+ use-sync-external-store "^1.6.0"
+
+"@tanstack/react-table@^9.1.2":
+ version "9.1.2"
+ resolved "https://registry.npmjs.org/@tanstack/react-table/-/react-table-9.1.2.tgz"
+ integrity sha512-YQPZFJ1nIi/bjjwsPZVouABgahDcl7Gdm33CdTStUJBn0DjEVJ2uhSTVmIoWt9MVKdQziXGAsXipSzy949Hygg==
+ dependencies:
+ "@tanstack/react-store" "^0.11.0"
+ "@tanstack/table-core" "9.1.2"
+
+"@tanstack/store@^0.11.0", "@tanstack/store@0.11.1":
+ version "0.11.1"
+ resolved "https://registry.npmjs.org/@tanstack/store/-/store-0.11.1.tgz"
+ integrity sha512-mzTOBhypOuDJAy/D8n2MfUZ1HFkXnmSETviRyhqEC8LUE7/IZQExOTxMANj3KjTofYTkFNpBY67qaVrT41YccA==
+
+"@tanstack/table-core@9.1.2":
+ version "9.1.2"
+ resolved "https://registry.npmjs.org/@tanstack/table-core/-/table-core-9.1.2.tgz"
+ integrity sha512-ONpWQeass1sfg80CWF1NSwQ8r3GiqxA2lT/EdqIcrDEPZ0Z+0mM94eQoFYLPN0Kztzj8TQVb2+PrSZSItqA61g==
+ dependencies:
+ "@tanstack/store" "^0.11.0"
+
"@tootallnate/once@1":
version "1.1.2"
resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz"
@@ -2994,7 +2584,7 @@
resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz"
integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==
-"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14":
+"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14", "@types/babel__core@^7.1.9":
version "7.1.19"
resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz"
integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==
@@ -3109,7 +2699,7 @@
dependencies:
"@types/node" "*"
-"@types/hoist-non-react-statics@^3.3.1":
+"@types/hoist-non-react-statics@^3.3.1", "@types/hoist-non-react-statics@>= 3.3.1":
version "3.3.1"
resolved "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz"
integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==
@@ -3175,7 +2765,7 @@
dependencies:
"@types/node" "*"
-"@types/node@*", "@types/node@>=12.12.47", "@types/node@>=13.7.0":
+"@types/node@*", "@types/node@>= 12", "@types/node@>=12.12.47", "@types/node@>=13.7.0":
version "22.13.5"
resolved "https://registry.npmjs.org/@types/node/-/node-22.13.5.tgz"
integrity sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==
@@ -3192,7 +2782,7 @@
resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz"
integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==
-"@types/prop-types@*", "@types/prop-types@^15.7.12", "@types/prop-types@^15.7.14":
+"@types/prop-types@*":
version "15.7.14"
resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz"
integrity sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==
@@ -3212,12 +2802,7 @@
resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz"
integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==
-"@types/react-transition-group@^4.4.10", "@types/react-transition-group@^4.4.11":
- version "4.4.12"
- resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz"
- integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==
-
-"@types/react@*", "@types/react@16 || 17 || 18 || 19":
+"@types/react@*", "@types/react@^18.2.25 || ^19", "@types/react@>= 16", "@types/react@16 || 17 || 18 || 19":
version "18.3.18"
resolved "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz"
integrity sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==
@@ -3314,7 +2899,7 @@
dependencies:
"@types/yargs-parser" "*"
-"@typescript-eslint/eslint-plugin@^5.5.0":
+"@typescript-eslint/eslint-plugin@^4.0.0 || ^5.0.0", "@typescript-eslint/eslint-plugin@^5.5.0":
version "5.62.0"
resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz"
integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==
@@ -3337,7 +2922,7 @@
dependencies:
"@typescript-eslint/utils" "5.62.0"
-"@typescript-eslint/parser@^5.5.0":
+"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.5.0":
version "5.62.0"
resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz"
integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==
@@ -3572,16 +3157,16 @@ acorn-walk@^7.1.1:
resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz"
integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
+"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.14.0, acorn@^8.2.4, acorn@^8.8.2, acorn@^8.9.0:
+ version "8.14.0"
+ resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz"
+ integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==
+
acorn@^7.1.1:
version "7.4.1"
resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz"
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
-acorn@^8.14.0, acorn@^8.2.4, acorn@^8.8.2, acorn@^8.9.0:
- version "8.14.0"
- resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz"
- integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==
-
address@^1.0.1, address@^1.1.2:
version "1.2.2"
resolved "https://registry.npmjs.org/address/-/address-1.2.2.tgz"
@@ -3626,7 +3211,7 @@ ajv-keywords@^5.1.0:
dependencies:
fast-deep-equal "^3.1.3"
-ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5:
+ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1:
version "6.12.6"
resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
@@ -3646,7 +3231,7 @@ ajv@^8.0.0:
json-schema-traverse "^1.0.0"
require-from-string "^2.0.2"
-ajv@^8.6.0:
+ajv@^8.6.0, ajv@>=8:
version "8.17.1"
resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz"
integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==
@@ -3656,7 +3241,7 @@ ajv@^8.6.0:
json-schema-traverse "^1.0.0"
require-from-string "^2.0.2"
-ajv@^8.9.0:
+ajv@^8.8.2, ajv@^8.9.0:
version "8.17.1"
resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz"
integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==
@@ -3712,61 +3297,6 @@ ansi-styles@^6.1.0:
resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz"
integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
-antd@^5.11.5:
- version "5.24.2"
- resolved "https://registry.npmjs.org/antd/-/antd-5.24.2.tgz"
- integrity sha512-7Z9HsE3ZIK3sE/WuUqii3w7Gl1IJuRL21sDUTtkN95JS5KhRYP8ISv7m/HxsJ3Mn/yxgojBCgLPJ212+Dn+aPw==
- dependencies:
- "@ant-design/colors" "^7.2.0"
- "@ant-design/cssinjs" "^1.23.0"
- "@ant-design/cssinjs-utils" "^1.1.3"
- "@ant-design/fast-color" "^2.0.6"
- "@ant-design/icons" "^5.6.1"
- "@ant-design/react-slick" "~1.1.2"
- "@babel/runtime" "^7.26.0"
- "@rc-component/color-picker" "~2.0.1"
- "@rc-component/mutate-observer" "^1.1.0"
- "@rc-component/qrcode" "~1.0.0"
- "@rc-component/tour" "~1.15.1"
- "@rc-component/trigger" "^2.2.6"
- classnames "^2.5.1"
- copy-to-clipboard "^3.3.3"
- dayjs "^1.11.11"
- rc-cascader "~3.33.0"
- rc-checkbox "~3.5.0"
- rc-collapse "~3.9.0"
- rc-dialog "~9.6.0"
- rc-drawer "~7.2.0"
- rc-dropdown "~4.2.1"
- rc-field-form "~2.7.0"
- rc-image "~7.11.0"
- rc-input "~1.7.2"
- rc-input-number "~9.4.0"
- rc-mentions "~2.19.1"
- rc-menu "~9.16.1"
- rc-motion "^2.9.5"
- rc-notification "~5.6.3"
- rc-pagination "~5.1.0"
- rc-picker "~4.11.2"
- rc-progress "~4.0.0"
- rc-rate "~2.13.1"
- rc-resize-observer "^1.4.3"
- rc-segmented "~2.7.0"
- rc-select "~14.16.6"
- rc-slider "~11.1.8"
- rc-steps "~6.0.1"
- rc-switch "~4.1.0"
- rc-table "~7.50.3"
- rc-tabs "~15.5.1"
- rc-textarea "~1.9.0"
- rc-tooltip "~6.4.0"
- rc-tree "~5.13.0"
- rc-tree-select "~5.27.0"
- rc-upload "~4.8.1"
- rc-util "^5.44.4"
- scroll-into-view-if-needed "^3.1.0"
- throttle-debounce "^5.0.2"
-
any-promise@^1.0.0:
version "1.3.0"
resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz"
@@ -3964,13 +3494,6 @@ autoprefixer@^10.4.13:
picocolors "^1.0.1"
postcss-value-parser "^4.2.0"
-autosuggest-highlight@^3.3.4:
- version "3.3.4"
- resolved "https://registry.npmjs.org/autosuggest-highlight/-/autosuggest-highlight-3.3.4.tgz"
- integrity sha512-j6RETBD2xYnrVcoV1S5R4t3WxOlWZKyDQjkwnggDPSjF5L4jV98ZltBpvPvbkM1HtoSe5o+bNrTHyjPbieGeYA==
- dependencies:
- remove-accents "^0.4.2"
-
available-typed-arrays@^1.0.7:
version "1.0.7"
resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz"
@@ -4341,7 +3864,7 @@ browserify-sign@^4.2.3:
readable-stream "^2.3.8"
safe-buffer "^5.2.1"
-browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.21.4, browserslist@^4.23.3, browserslist@^4.24.0, browserslist@^4.25.0:
+browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.21.4, browserslist@^4.23.3, browserslist@^4.24.0, browserslist@^4.25.0, "browserslist@>= 4", "browserslist@>= 4.21.0", browserslist@>=4:
version "4.25.1"
resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz"
integrity sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==
@@ -4553,7 +4076,7 @@ cjs-module-lexer@^1.0.0:
resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz"
integrity sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==
-classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2, classnames@^2.5.1, classnames@2.x:
+classnames@^2.2.6:
version "2.5.1"
resolved "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz"
integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==
@@ -4588,11 +4111,6 @@ clsx@^1.1.0:
resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz"
integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==
-clsx@^2.1.0, clsx@^2.1.1:
- version "2.1.1"
- resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz"
- integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==
-
co@^4.6.0:
version "4.6.0"
resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz"
@@ -4713,11 +4231,6 @@ compression@^1.7.4:
safe-buffer "5.2.1"
vary "~1.1.2"
-compute-scroll-into-view@^3.0.2:
- version "3.1.1"
- resolved "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz"
- integrity sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==
-
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
@@ -4745,7 +4258,7 @@ content-type@~1.0.4, content-type@~1.0.5:
resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz"
integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==
-convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0:
+convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0:
version "1.9.0"
resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz"
integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
@@ -4765,13 +4278,6 @@ cookie@0.7.1:
resolved "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz"
integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==
-copy-to-clipboard@^3.3.3:
- 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"
-
core-js-compat@^3.21.0, core-js-compat@^3.43.0:
version "3.43.0"
resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.43.0.tgz"
@@ -5038,11 +4544,6 @@ cssesc@^3.0.0:
resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz"
integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
-cssjanus@^2.0.1:
- version "2.3.0"
- resolved "https://registry.npmjs.org/cssjanus/-/cssjanus-2.3.0.tgz"
- integrity sha512-ZZXXn51SnxRxAZ6fdY7mBDPmA4OZd83q/J9Gdqz3YmE9TUq+9tZl+tdOnCi7PpNygI6PEkehj9rgifv5+W8a5A==
-
cssnano-preset-default@^5.2.14:
version "5.2.14"
resolved "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz"
@@ -5130,7 +4631,7 @@ cssstyle@^2.3.0:
dependencies:
cssom "~0.3.6"
-csstype@^3.0.2, csstype@^3.1.3:
+csstype@^3.0.10, csstype@^3.0.2:
version "3.1.3"
resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz"
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
@@ -5183,7 +4684,7 @@ date-fns@^2.30.0:
dependencies:
"@babel/runtime" "^7.21.0"
-dayjs@^1.11.10, dayjs@^1.11.11:
+dayjs@^1.11.10:
version "1.11.13"
resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz"
integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==
@@ -5385,14 +4886,6 @@ dom-converter@^0.2.0:
dependencies:
utila "~0.4"
-dom-helpers@^5.0.1:
- version "5.2.1"
- resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz"
- integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==
- dependencies:
- "@babel/runtime" "^7.8.7"
- csstype "^3.0.2"
-
dom-serializer@^1.0.1:
version "1.4.1"
resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz"
@@ -5997,7 +5490,7 @@ eslint-webpack-plugin@^3.1.1:
normalize-path "^3.0.0"
schema-utils "^4.0.0"
-eslint@^8.3.0, eslint@^8.38.0:
+eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", "eslint@^7.5.0 || ^8.0.0", eslint@^8.0.0, eslint@^8.1.0, eslint@^8.3.0, eslint@^8.38.0, "eslint@>= 6", eslint@>=7.0.0, eslint@>=7.28.0:
version "8.57.1"
resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz"
integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==
@@ -6302,11 +5795,6 @@ find-cache-dir@^3.3.1:
make-dir "^3.0.2"
pkg-dir "^4.1.0"
-find-root@^1.1.0:
- version "1.1.0"
- resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz"
- integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
-
find-up@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz"
@@ -6820,7 +6308,7 @@ hmac-drbg@^1.0.1:
minimalistic-assert "^1.0.0"
minimalistic-crypto-utils "^1.0.1"
-hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2:
+hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2:
version "3.3.2"
resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz"
integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
@@ -7720,7 +7208,7 @@ jest-resolve-dependencies@^27.5.1:
jest-regex-util "^27.5.1"
jest-snapshot "^27.5.1"
-jest-resolve@^27.4.2, jest-resolve@^27.5.1:
+jest-resolve@*, jest-resolve@^27.4.2, jest-resolve@^27.5.1:
version "27.5.1"
resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz"
integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==
@@ -7930,7 +7418,7 @@ jest-worker@^28.0.2:
merge-stream "^2.0.0"
supports-color "^8.0.0"
-jest@^27.4.3:
+"jest@^27.0.0 || ^28.0.0", jest@^27.4.3:
version "27.5.1"
resolved "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz"
integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==
@@ -8037,13 +7525,6 @@ json-stable-stringify-without-jsonify@^1.0.1:
resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz"
integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
-json2mq@^0.2.0:
- 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"
-
json5@^1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz"
@@ -8169,7 +7650,7 @@ launch-editor@^2.6.0:
picocolors "^1.0.0"
shell-quote "^1.8.1"
-leaflet@^1.9.4:
+leaflet@^1.9.0, leaflet@^1.9.4:
version "1.9.4"
resolved "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz"
integrity sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==
@@ -9618,15 +9099,7 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^
resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
-postcss@^7.0.35:
- version "7.0.39"
- resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz"
- integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==
- dependencies:
- picocolors "^0.2.1"
- source-map "^0.6.1"
-
-postcss@^8.3.5, postcss@^8.4.33, postcss@^8.4.4, postcss@^8.4.47:
+"postcss@^7.0.0 || ^8.0.1", postcss@^8, postcss@^8.0.0, postcss@^8.0.3, postcss@^8.0.9, postcss@^8.1.0, postcss@^8.1.4, postcss@^8.2, postcss@^8.2.14, postcss@^8.2.15, postcss@^8.2.2, postcss@^8.3, postcss@^8.3.5, postcss@^8.4, postcss@^8.4.21, postcss@^8.4.33, postcss@^8.4.4, postcss@^8.4.47, postcss@^8.4.6, "postcss@>= 8", postcss@>=8, postcss@>=8.0.9:
version "8.5.3"
resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz"
integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==
@@ -9635,6 +9108,14 @@ postcss@^8.3.5, postcss@^8.4.33, postcss@^8.4.4, postcss@^8.4.47:
picocolors "^1.1.1"
source-map-js "^1.2.1"
+postcss@^7.0.35:
+ version "7.0.39"
+ resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz"
+ integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==
+ dependencies:
+ picocolors "^0.2.1"
+ source-map "^0.6.1"
+
prelude-ls@^1.2.1:
version "1.2.1"
resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz"
@@ -9652,7 +9133,7 @@ prettier-linter-helpers@^1.0.0:
dependencies:
fast-diff "^1.1.2"
-prettier@^2.8.7:
+prettier@^2.8.7, prettier@>=2.0.0:
version "2.8.8"
resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz"
integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
@@ -9714,7 +9195,7 @@ prompts@^2.0.1, prompts@^2.4.2:
kleur "^3.0.3"
sisteransi "^1.0.5"
-prop-types@^15.6.2, prop-types@^15.8.1:
+prop-types@^15.8.1:
version "15.8.1"
resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz"
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
@@ -9842,340 +9323,7 @@ raw-body@2.5.2:
iconv-lite "0.4.24"
unpipe "1.0.0"
-rc-cascader@~3.33.0:
- version "3.33.0"
- resolved "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.33.0.tgz"
- integrity sha512-JvZrMbKBXIbEDmpIORxqvedY/bck6hGbs3hxdWT8eS9wSQ1P7//lGxbyKjOSyQiVBbgzNWriSe6HoMcZO/+0rQ==
- dependencies:
- "@babel/runtime" "^7.25.7"
- classnames "^2.3.1"
- rc-select "~14.16.2"
- rc-tree "~5.13.0"
- rc-util "^5.43.0"
-
-rc-checkbox@~3.5.0:
- version "3.5.0"
- resolved "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.5.0.tgz"
- integrity sha512-aOAQc3E98HteIIsSqm6Xk2FPKIER6+5vyEFMZfo73TqM+VVAIqOkHoPjgKLqSNtVLWScoaM7vY2ZrGEheI79yg==
- dependencies:
- "@babel/runtime" "^7.10.1"
- classnames "^2.3.2"
- rc-util "^5.25.2"
-
-rc-collapse@~3.9.0:
- version "3.9.0"
- resolved "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.9.0.tgz"
- integrity sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA==
- dependencies:
- "@babel/runtime" "^7.10.1"
- classnames "2.x"
- rc-motion "^2.3.4"
- rc-util "^5.27.0"
-
-rc-dialog@~9.6.0:
- version "9.6.0"
- resolved "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.6.0.tgz"
- integrity sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==
- 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"
-
-rc-drawer@~7.2.0:
- version "7.2.0"
- resolved "https://registry.npmjs.org/rc-drawer/-/rc-drawer-7.2.0.tgz"
- integrity sha512-9lOQ7kBekEJRdEpScHvtmEtXnAsy+NGDXiRWc2ZVC7QXAazNVbeT4EraQKYwCME8BJLa8Bxqxvs5swwyOepRwg==
- dependencies:
- "@babel/runtime" "^7.23.9"
- "@rc-component/portal" "^1.1.1"
- classnames "^2.2.6"
- rc-motion "^2.6.1"
- rc-util "^5.38.1"
-
-rc-dropdown@~4.2.0, rc-dropdown@~4.2.1:
- version "4.2.1"
- resolved "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.2.1.tgz"
- integrity sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA==
- dependencies:
- "@babel/runtime" "^7.18.3"
- "@rc-component/trigger" "^2.0.0"
- classnames "^2.2.6"
- rc-util "^5.44.1"
-
-rc-field-form@~2.7.0:
- version "2.7.0"
- resolved "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.7.0.tgz"
- integrity sha512-hgKsCay2taxzVnBPZl+1n4ZondsV78G++XVsMIJCAoioMjlMQR9YwAp7JZDIECzIu2Z66R+f4SFIRrO2DjDNAA==
- dependencies:
- "@babel/runtime" "^7.18.0"
- "@rc-component/async-validator" "^5.0.3"
- rc-util "^5.32.2"
-
-rc-image@~7.11.0:
- version "7.11.0"
- resolved "https://registry.npmjs.org/rc-image/-/rc-image-7.11.0.tgz"
- integrity sha512-aZkTEZXqeqfPZtnSdNUnKQA0N/3MbgR7nUnZ+/4MfSFWPFHZau4p5r5ShaI0KPEMnNjv4kijSCFq/9wtJpwykw==
- dependencies:
- "@babel/runtime" "^7.11.2"
- "@rc-component/portal" "^1.0.2"
- classnames "^2.2.6"
- rc-dialog "~9.6.0"
- rc-motion "^2.6.2"
- rc-util "^5.34.1"
-
-rc-input-number@~9.4.0:
- version "9.4.0"
- resolved "https://registry.npmjs.org/rc-input-number/-/rc-input-number-9.4.0.tgz"
- integrity sha512-Tiy4DcXcFXAf9wDhN8aUAyMeCLHJUHA/VA/t7Hj8ZEx5ETvxG7MArDOSE6psbiSCo+vJPm4E3fGN710ITVn6GA==
- dependencies:
- "@babel/runtime" "^7.10.1"
- "@rc-component/mini-decimal" "^1.0.1"
- classnames "^2.2.5"
- rc-input "~1.7.1"
- rc-util "^5.40.1"
-
-rc-input@~1.7.1, rc-input@~1.7.2:
- version "1.7.2"
- resolved "https://registry.npmjs.org/rc-input/-/rc-input-1.7.2.tgz"
- integrity sha512-g3nYONnl4edWj2FfVoxsU3Ec4XTE+Hb39Kfh2MFxMZjp/0gGyPUgy/v7ZhS27ZxUFNkuIDYXm9PJsLyJbtg86A==
- dependencies:
- "@babel/runtime" "^7.11.1"
- classnames "^2.2.1"
- rc-util "^5.18.1"
-
-rc-mentions@~2.19.1:
- version "2.19.1"
- resolved "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.19.1.tgz"
- integrity sha512-KK3bAc/bPFI993J3necmaMXD2reZTzytZdlTvkeBbp50IGH1BDPDvxLdHDUrpQx2b2TGaVJsn+86BvYa03kGqA==
- dependencies:
- "@babel/runtime" "^7.22.5"
- "@rc-component/trigger" "^2.0.0"
- classnames "^2.2.6"
- rc-input "~1.7.1"
- rc-menu "~9.16.0"
- rc-textarea "~1.9.0"
- rc-util "^5.34.1"
-
-rc-menu@~9.16.0, rc-menu@~9.16.1:
- version "9.16.1"
- resolved "https://registry.npmjs.org/rc-menu/-/rc-menu-9.16.1.tgz"
- integrity sha512-ghHx6/6Dvp+fw8CJhDUHFHDJ84hJE3BXNCzSgLdmNiFErWSOaZNsihDAsKq9ByTALo/xkNIwtDFGIl6r+RPXBg==
- dependencies:
- "@babel/runtime" "^7.10.1"
- "@rc-component/trigger" "^2.0.0"
- classnames "2.x"
- rc-motion "^2.4.3"
- rc-overflow "^1.3.1"
- rc-util "^5.27.0"
-
-rc-motion@^2.0.0, rc-motion@^2.0.1, rc-motion@^2.3.0, rc-motion@^2.3.4, rc-motion@^2.4.3, rc-motion@^2.4.4, rc-motion@^2.6.1, rc-motion@^2.6.2, rc-motion@^2.9.0, rc-motion@^2.9.5:
- version "2.9.5"
- resolved "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.5.tgz"
- integrity sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==
- dependencies:
- "@babel/runtime" "^7.11.1"
- classnames "^2.2.1"
- rc-util "^5.44.0"
-
-rc-notification@~5.6.3:
- version "5.6.3"
- resolved "https://registry.npmjs.org/rc-notification/-/rc-notification-5.6.3.tgz"
- integrity sha512-42szwnn8VYQoT6GnjO00i1iwqV9D1TTMvxObWsuLwgl0TsOokzhkYiufdtQBsJMFjJravS1hfDKVMHLKLcPE4g==
- dependencies:
- "@babel/runtime" "^7.10.1"
- classnames "2.x"
- rc-motion "^2.9.0"
- rc-util "^5.20.1"
-
-rc-overflow@^1.3.1, rc-overflow@^1.3.2:
- version "1.4.1"
- resolved "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.4.1.tgz"
- integrity sha512-3MoPQQPV1uKyOMVNd6SZfONi+f3st0r8PksexIdBTeIYbMX0Jr+k7pHEDvsXtR4BpCv90/Pv2MovVNhktKrwvw==
- dependencies:
- "@babel/runtime" "^7.11.1"
- classnames "^2.2.1"
- rc-resize-observer "^1.0.0"
- rc-util "^5.37.0"
-
-rc-pagination@~5.1.0:
- version "5.1.0"
- resolved "https://registry.npmjs.org/rc-pagination/-/rc-pagination-5.1.0.tgz"
- integrity sha512-8416Yip/+eclTFdHXLKTxZvn70duYVGTvUUWbckCCZoIl3jagqke3GLsFrMs0bsQBikiYpZLD9206Ej4SOdOXQ==
- dependencies:
- "@babel/runtime" "^7.10.1"
- classnames "^2.3.2"
- rc-util "^5.38.0"
-
-rc-picker@~4.11.2:
- version "4.11.2"
- resolved "https://registry.npmjs.org/rc-picker/-/rc-picker-4.11.2.tgz"
- integrity sha512-Cwa3frWpefhESBF20HBJtvWx3q1hCrMxSUrzuuWMTGoZVPhQllGEp2IUfzo9jC5LKm4kJx7IrH8q/W/y9wClAw==
- dependencies:
- "@babel/runtime" "^7.24.7"
- "@rc-component/trigger" "^2.0.0"
- classnames "^2.2.1"
- rc-overflow "^1.3.2"
- rc-resize-observer "^1.4.0"
- rc-util "^5.43.0"
-
-rc-progress@~4.0.0:
- version "4.0.0"
- resolved "https://registry.npmjs.org/rc-progress/-/rc-progress-4.0.0.tgz"
- integrity sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==
- dependencies:
- "@babel/runtime" "^7.10.1"
- classnames "^2.2.6"
- rc-util "^5.16.1"
-
-rc-rate@~2.13.1:
- version "2.13.1"
- resolved "https://registry.npmjs.org/rc-rate/-/rc-rate-2.13.1.tgz"
- integrity sha512-QUhQ9ivQ8Gy7mtMZPAjLbxBt5y9GRp65VcUyGUMF3N3fhiftivPHdpuDIaWIMOTEprAjZPC08bls1dQB+I1F2Q==
- dependencies:
- "@babel/runtime" "^7.10.1"
- classnames "^2.2.5"
- rc-util "^5.0.1"
-
-rc-resize-observer@^1.0.0, rc-resize-observer@^1.1.0, rc-resize-observer@^1.3.1, rc-resize-observer@^1.4.0, rc-resize-observer@^1.4.3:
- version "1.4.3"
- resolved "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.3.tgz"
- integrity sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==
- dependencies:
- "@babel/runtime" "^7.20.7"
- classnames "^2.2.1"
- rc-util "^5.44.1"
- resize-observer-polyfill "^1.5.1"
-
-rc-segmented@~2.7.0:
- version "2.7.0"
- resolved "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.7.0.tgz"
- integrity sha512-liijAjXz+KnTRVnxxXG2sYDGd6iLL7VpGGdR8gwoxAXy2KglviKCxLWZdjKYJzYzGSUwKDSTdYk8brj54Bn5BA==
- dependencies:
- "@babel/runtime" "^7.11.1"
- classnames "^2.2.1"
- rc-motion "^2.4.4"
- rc-util "^5.17.0"
-
-rc-select@~14.16.2, rc-select@~14.16.6:
- version "14.16.6"
- resolved "https://registry.npmjs.org/rc-select/-/rc-select-14.16.6.tgz"
- integrity sha512-YPMtRPqfZWOm2XGTbx5/YVr1HT0vn//8QS77At0Gjb3Lv+Lbut0IORJPKLWu1hQ3u4GsA0SrDzs7nI8JG7Zmyg==
- dependencies:
- "@babel/runtime" "^7.10.1"
- "@rc-component/trigger" "^2.1.1"
- classnames "2.x"
- rc-motion "^2.0.1"
- rc-overflow "^1.3.1"
- rc-util "^5.16.1"
- rc-virtual-list "^3.5.2"
-
-rc-slider@~11.1.8:
- version "11.1.8"
- resolved "https://registry.npmjs.org/rc-slider/-/rc-slider-11.1.8.tgz"
- integrity sha512-2gg/72YFSpKP+Ja5AjC5DPL1YnV8DEITDQrcc1eASrUYjl0esptaBVJBh5nLTXCCp15eD8EuGjwezVGSHhs9tQ==
- dependencies:
- "@babel/runtime" "^7.10.1"
- classnames "^2.2.5"
- rc-util "^5.36.0"
-
-rc-steps@~6.0.1:
- 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"
-
-rc-switch@~4.1.0:
- 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"
-
-rc-table@~7.50.3:
- version "7.50.3"
- resolved "https://registry.npmjs.org/rc-table/-/rc-table-7.50.3.tgz"
- integrity sha512-Z4/zNCzjv7f/XzPRecb+vJU0DJKdsYt4YRkDzNl4G05m7JmxrKGYC2KqN1Ew6jw2zJq7cxVv3z39qyZOHMuf7A==
- 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.44.3"
- rc-virtual-list "^3.14.2"
-
-rc-tabs@~15.5.1:
- version "15.5.1"
- resolved "https://registry.npmjs.org/rc-tabs/-/rc-tabs-15.5.1.tgz"
- integrity sha512-yiWivLAjEo5d1v2xlseB2dQocsOhkoVSfo1krS8v8r+02K+TBUjSjXIf7dgyVSxp6wRIPv5pMi5hanNUlQMgUA==
- dependencies:
- "@babel/runtime" "^7.11.2"
- classnames "2.x"
- rc-dropdown "~4.2.0"
- rc-menu "~9.16.0"
- rc-motion "^2.6.2"
- rc-resize-observer "^1.0.0"
- rc-util "^5.34.1"
-
-rc-textarea@~1.9.0:
- version "1.9.0"
- resolved "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.9.0.tgz"
- integrity sha512-dQW/Bc/MriPBTugj2Kx9PMS5eXCCGn2cxoIaichjbNvOiARlaHdI99j4DTxLl/V8+PIfW06uFy7kjfUIDDKyxQ==
- dependencies:
- "@babel/runtime" "^7.10.1"
- classnames "^2.2.1"
- rc-input "~1.7.1"
- rc-resize-observer "^1.0.0"
- rc-util "^5.27.0"
-
-rc-tooltip@~6.4.0:
- version "6.4.0"
- resolved "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.4.0.tgz"
- integrity sha512-kqyivim5cp8I5RkHmpsp1Nn/Wk+1oeloMv9c7LXNgDxUpGm+RbXJGL+OPvDlcRnx9DBeOe4wyOIl4OKUERyH1g==
- dependencies:
- "@babel/runtime" "^7.11.2"
- "@rc-component/trigger" "^2.0.0"
- classnames "^2.3.1"
- rc-util "^5.44.3"
-
-rc-tree-select@~5.27.0:
- version "5.27.0"
- resolved "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.27.0.tgz"
- integrity sha512-2qTBTzwIT7LRI1o7zLyrCzmo5tQanmyGbSaGTIf7sYimCklAToVVfpMC6OAldSKolcnjorBYPNSKQqJmN3TCww==
- dependencies:
- "@babel/runtime" "^7.25.7"
- classnames "2.x"
- rc-select "~14.16.2"
- rc-tree "~5.13.0"
- rc-util "^5.43.0"
-
-rc-tree@~5.13.0:
- version "5.13.0"
- resolved "https://registry.npmjs.org/rc-tree/-/rc-tree-5.13.0.tgz"
- integrity sha512-2+lFvoVRnvHQ1trlpXMOWtF8BUgF+3TiipG72uOfhpL5CUdXCk931kvDdUkTL/IZVtNEDQKwEEmJbAYJSA5NnA==
- 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"
-
-rc-upload@~4.8.1:
- version "4.8.1"
- resolved "https://registry.npmjs.org/rc-upload/-/rc-upload-4.8.1.tgz"
- integrity sha512-toEAhwl4hjLAI1u8/CgKWt30BR06ulPa4iGQSMvSXoHzO88gPCslxqV/mnn4gJU7PDoltGIC9Eh+wkeudqgHyw==
- dependencies:
- "@babel/runtime" "^7.18.3"
- classnames "^2.2.5"
- rc-util "^5.2.0"
-
-rc-util@^5.0.1, rc-util@^5.16.1, rc-util@^5.17.0, rc-util@^5.18.1, rc-util@^5.2.0, rc-util@^5.20.1, rc-util@^5.21.0, rc-util@^5.24.4, rc-util@^5.25.2, rc-util@^5.27.0, rc-util@^5.30.0, rc-util@^5.31.1, rc-util@^5.32.2, rc-util@^5.34.1, rc-util@^5.35.0, rc-util@^5.36.0, rc-util@^5.37.0, rc-util@^5.38.0, rc-util@^5.38.1, rc-util@^5.40.1, rc-util@^5.43.0, rc-util@^5.44.0, rc-util@^5.44.1, rc-util@^5.44.3, rc-util@^5.44.4:
+rc-util@^5.31.1:
version "5.44.4"
resolved "https://registry.npmjs.org/rc-util/-/rc-util-5.44.4.tgz"
integrity sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==
@@ -10183,16 +9331,6 @@ rc-util@^5.0.1, rc-util@^5.16.1, rc-util@^5.17.0, rc-util@^5.18.1, rc-util@^5.2.
"@babel/runtime" "^7.18.3"
react-is "^18.2.0"
-rc-virtual-list@^3.14.2, rc-virtual-list@^3.5.1, rc-virtual-list@^3.5.2:
- version "3.18.2"
- resolved "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.18.2.tgz"
- integrity sha512-SkPabqstOQgJ2Q2Ob3eDPIHsNrDzQZFl8mzHiXuNablyYwddVU33Ws6oxoA7Fi/6pZeEYonrLEUiJGr/6aBVaw==
- dependencies:
- "@babel/runtime" "^7.20.0"
- classnames "^2.2.6"
- rc-resize-observer "^1.0.0"
- rc-util "^5.36.0"
-
react-app-polyfill@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz"
@@ -10272,7 +9410,7 @@ react-dnd@^16.0.1:
fast-deep-equal "^3.1.3"
hoist-non-react-statics "^3.3.2"
-react-dom@^19.2.8:
+"react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0", react-dom@^19.0.0, react-dom@^19.2.8, "react-dom@>= 0.14.0", react-dom@>=16.0.0, react-dom@>=16.8, react-dom@>=16.9.0, react-dom@>=19.0.0:
version "19.2.8"
resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz"
integrity sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==
@@ -10333,11 +9471,6 @@ react-is@^18.2.0:
resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz"
integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==
-react-is@^19.0.0:
- version "19.0.0"
- resolved "https://registry.npmjs.org/react-is/-/react-is-19.0.0.tgz"
- integrity sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==
-
react-leaflet@^5.0.0:
version "5.0.0"
resolved "https://registry.npmjs.org/react-leaflet/-/react-leaflet-5.0.0.tgz"
@@ -10350,7 +9483,7 @@ react-loading-icons@^1.1.0:
resolved "https://registry.npmjs.org/react-loading-icons/-/react-loading-icons-1.1.0.tgz"
integrity sha512-Y9eZ6HAufmUd8DIQd6rFrx5Bt/oDlTM9Nsjvf8YpajTa3dI8cLNU8jUN5z7KTANU+Yd6/KJuBjxVlrU2dMw33g==
-react-redux@^9.2.0:
+"react-redux@^7.2.1 || ^8.1.3 || ^9.0.0", react-redux@^9.2.0:
version "9.2.0"
resolved "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz"
integrity sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==
@@ -10358,7 +9491,7 @@ react-redux@^9.2.0:
"@types/use-sync-external-store" "^0.0.6"
use-sync-external-store "^1.4.0"
-react-refresh@^0.11.0:
+react-refresh@^0.11.0, "react-refresh@>=0.10.0 <1.0.0":
version "0.11.0"
resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz"
integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==
@@ -10378,7 +9511,7 @@ react-router@^6.10.0, react-router@6.29.0:
dependencies:
"@remix-run/router" "1.22.0"
-react-scripts@^5.0.1:
+react-scripts@^5.0.1, react-scripts@>=2.1.3:
version "5.0.1"
resolved "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz"
integrity sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==
@@ -10443,17 +9576,7 @@ react-to-print@^3.3.0:
resolved "https://registry.npmjs.org/react-to-print/-/react-to-print-3.3.0.tgz"
integrity sha512-7j9GIeNZA9glZlbv9mIbIHDOOx+WYfRMbJzh04NiSKjdaeGkxJuKjJQrtRuNKtt5AvEVVjrLCPokZ9yJX51Fvg==
-react-transition-group@^4.4.5:
- version "4.4.5"
- resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz"
- integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==
- dependencies:
- "@babel/runtime" "^7.5.5"
- dom-helpers "^5.0.1"
- loose-envify "^1.4.0"
- prop-types "^15.6.2"
-
-react@^19.2.8:
+react@*, "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ~19", "react@^16.9.0 || ^17.0.0 || ^18 || ^19", "react@^17.0.0 || ^18.0.0 || ^19.0.0", "react@^18 || ^19", "react@^18.0 || ^19", "react@^18.0.0 || ^19.0.0", react@^19.0.0, react@^19.2.8, "react@>= 0.14.0", "react@>= 16", "react@>= 16.14", react@>=16.0.0, react@>=16.8, react@>=16.8.0, react@>=16.9.0, react@>=18, react@>=19, react@>=19.0.0, "react@16 || 17 || 18 || 19":
version "19.2.8"
resolved "https://registry.npmjs.org/react/-/react-19.2.8.tgz"
integrity sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==
@@ -10522,7 +9645,7 @@ redux@^4.2.0:
dependencies:
"@babel/runtime" "^7.9.2"
-redux@^5.0.1:
+redux@^5.0.0, redux@^5.0.1:
version "5.0.1"
resolved "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz"
integrity sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==
@@ -10609,11 +9732,6 @@ relateurl@^0.2.7:
resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz"
integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==
-remove-accents@^0.4.2:
- version "0.4.4"
- resolved "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.4.tgz"
- integrity sha512-EpFcOa/ISetVHEXqu+VwI96KZBmq+a8LJnGkaeFw45epGlxIZz5dhEEnNZMsQXgORu3qaMoLX4qJCzOik6ytAg==
-
renderkid@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz"
@@ -10645,11 +9763,6 @@ reselect@^5.1.0:
resolved "https://registry.npmjs.org/reselect/-/reselect-5.2.0.tgz"
integrity sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==
-resize-observer-polyfill@^1.5.1:
- version "1.5.1"
- resolved "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz"
- integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==
-
resolve-cwd@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz"
@@ -10736,7 +9849,7 @@ rollup-plugin-terser@^7.0.0:
serialize-javascript "^4.0.0"
terser "^5.0.0"
-rollup@^2.43.1:
+"rollup@^1.20.0 || ^2.0.0", rollup@^1.20.0||^2.0.0, rollup@^2.0.0, rollup@^2.43.1:
version "2.79.2"
resolved "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz"
integrity sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==
@@ -10875,13 +9988,6 @@ schema-utils@2.7.0:
ajv "^6.12.2"
ajv-keywords "^3.4.1"
-scroll-into-view-if-needed@^3.1.0:
- 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"
-
select-hose@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz"
@@ -11174,11 +10280,6 @@ source-map-support@^0.5.6, source-map-support@~0.5.20:
buffer-from "^1.0.0"
source-map "^0.6.0"
-source-map@^0.5.7:
- version "0.5.7"
- resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz"
- integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
-
source-map@^0.6.0:
version "0.6.1"
resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
@@ -11300,11 +10401,6 @@ string_decoder@^1.1.1, string_decoder@~1.1.1:
dependencies:
safe-buffer "~5.1.0"
-string-convert@^0.2.0:
- version "0.2.1"
- resolved "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz"
- integrity sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==
-
string-length@^4.0.1:
version "4.0.2"
resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz"
@@ -11494,28 +10590,6 @@ styleq@0.2.1:
resolved "https://registry.npmjs.org/styleq/-/styleq-0.2.1.tgz"
integrity sha512-L0TR0NQb+X4/ktDEKmjWyp27gla+LUYi/by5k5SjKXf6/pvZP7wbwEB5J+tqxdFVPgzbsuz+d4RTScO/QZquBw==
-stylis-plugin-rtl@^2.1.1:
- version "2.1.1"
- resolved "https://registry.npmjs.org/stylis-plugin-rtl/-/stylis-plugin-rtl-2.1.1.tgz"
- integrity sha512-q6xIkri6fBufIO/sV55md2CbgS5c6gg9EhSVATtHHCdOnbN/jcI0u3lYhNVeuI65c4lQPo67g8xmq5jrREvzlg==
- dependencies:
- cssjanus "^2.0.1"
-
-stylis@^4.3.4:
- version "4.3.6"
- resolved "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz"
- integrity sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==
-
-stylis@4.1.3:
- version "4.1.3"
- resolved "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz"
- integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==
-
-stylis@4.2.0:
- version "4.2.0"
- resolved "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz"
- integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==
-
sucrase@^3.35.0:
version "3.35.0"
resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz"
@@ -11733,11 +10807,6 @@ throat@^6.0.1:
resolved "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz"
integrity sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==
-throttle-debounce@^5.0.0, throttle-debounce@^5.0.2:
- version "5.0.2"
- resolved "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz"
- integrity sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==
-
thunky@^1.0.2:
version "1.1.0"
resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz"
@@ -11765,11 +10834,6 @@ to-regex-range@^5.0.1:
dependencies:
is-number "^7.0.0"
-toggle-selection@^1.0.6:
- version "1.0.6"
- resolved "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz"
- integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==
-
toidentifier@1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz"
@@ -11870,7 +10934,7 @@ type-fest@^0.20.2:
resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz"
integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
-type-fest@^0.21.3:
+type-fest@^0.21.3, "type-fest@>=0.17.0 <4.0.0":
version "0.21.3"
resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz"
integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
@@ -11940,6 +11004,11 @@ typedarray-to-buffer@^3.1.5:
dependencies:
is-typedarray "^1.0.0"
+"typescript@^3.2.1 || ^4", typescript@^5.6.0, "typescript@>= 2.7", "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@>=4.9.5:
+ version "5.9.3"
+ resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz"
+ integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==
+
ua-parser-js@^1.0.33:
version "1.0.40"
resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.40.tgz"
@@ -12053,10 +11122,10 @@ use-debounce@^10.0.5:
resolved "https://registry.npmjs.org/use-debounce/-/use-debounce-10.0.5.tgz"
integrity sha512-Q76E3lnIV+4YT9AHcrHEHYmAd9LKwUAbPXDm7FlqVGDHiSOhX3RDjT8dm0AxbJup6WgOb1YEcKyCr11kBJR5KQ==
-use-sync-external-store@^1.4.0:
- version "1.4.0"
- resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz"
- integrity sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==
+use-sync-external-store@^1.4.0, use-sync-external-store@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz"
+ integrity sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==
util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
version "1.0.2"
@@ -12180,7 +11249,7 @@ webpack-dev-middleware@^5.3.4:
range-parser "^1.2.1"
schema-utils "^4.0.0"
-webpack-dev-server@^4.6.0:
+webpack-dev-server@^4.6.0, "webpack-dev-server@3.x || 4.x":
version "4.15.2"
resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz"
integrity sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==
@@ -12245,7 +11314,7 @@ webpack-sources@^3.2.3:
resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz"
integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
-webpack@^5.64.4:
+"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", "webpack@^4.4.0 || ^5.9.0", "webpack@^4.44.2 || ^5.47.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.20.0, webpack@^5.64.4, "webpack@>= 4", webpack@>=2, "webpack@>=4.43.0 <6.0.0":
version "5.98.0"
resolved "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz"
integrity sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==