diff --git a/package-lock.json b/package-lock.json
index cee5ead..823e3dd 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,6 +16,7 @@
"@mui/styles": "^5.11.7",
"@mui/system": "^5.11.7",
"@mui/x-date-pickers": "^8.2.0",
+ "@mui/x-date-pickers-pro": "^8.4.0",
"axios": "^1.8.4",
"date-fns": "^4.1.0",
"firebase": "^11.6.0",
@@ -124,12 +125,9 @@
}
},
"node_modules/@babel/runtime": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz",
- "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==",
- "dependencies": {
- "regenerator-runtime": "^0.14.0"
- },
+ "version": "7.27.3",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.3.tgz",
+ "integrity": "sha512-7EYtGezsdiDMyY80+65EzwiGmcJqpmcZCojSXaRgdrBaGtWTgDZKq69cPIVped6MkIM78cTQ2GOiEYjwOlG4xw==",
"engines": {
"node": ">=6.9.0"
}
@@ -857,6 +855,14 @@
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
+ "node_modules/@fingerprintjs/fingerprintjs": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/@fingerprintjs/fingerprintjs/-/fingerprintjs-3.4.2.tgz",
+ "integrity": "sha512-3Ncze6JsJpB7BpYhqIgvBpfvEX1jsEKrad5hQBpyRQxtoAp6hx3+R46zqfsuQG4D9egQZ+xftQ0u4LPFMB7Wmg==",
+ "dependencies": {
+ "tslib": "^2.4.1"
+ }
+ },
"node_modules/@firebase/analytics": {
"version": "0.10.12",
"resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.12.tgz",
@@ -2173,13 +2179,13 @@
}
},
"node_modules/@mui/x-date-pickers": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-8.2.0.tgz",
- "integrity": "sha512-nkFzKkaDr4a9uto4pSOsNBMh+M2YQWiW9iYyBDOi5wOa983e2xMeb7zFjHGJ0xaycg1kfxNcbvJd7tm4Ub+RhA==",
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-8.4.0.tgz",
+ "integrity": "sha512-x7jI7JnKK25xL3yjD2Z1r86gAWtabKj9ogI2WDKd/v9WwE1VxmDD/NTiXprEZFo9psPOoqr+juPGDz5Cb2v7jw==",
"dependencies": {
- "@babel/runtime": "^7.27.0",
+ "@babel/runtime": "^7.27.1",
"@mui/utils": "^7.0.2",
- "@mui/x-internals": "8.2.0",
+ "@mui/x-internals": "8.4.0",
"@types/react-transition-group": "^4.4.12",
"clsx": "^2.1.1",
"prop-types": "^15.8.1",
@@ -2237,12 +2243,74 @@
}
}
},
- "node_modules/@mui/x-internals": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-8.2.0.tgz",
- "integrity": "sha512-qV4Qr+m4sAPBSuqu8/Ofi5m+nMMvIybGno6cp757bHSmwxkqrn5SKaGyFnH5kB58fOhYA9hG1UivFp7mO1dE4A==",
+ "node_modules/@mui/x-date-pickers-pro": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@mui/x-date-pickers-pro/-/x-date-pickers-pro-8.4.0.tgz",
+ "integrity": "sha512-/PTrkeYMu7Dm3W83iUmRb5J98RK6WAKjUksILLTgYfBdzv9CAhHXF+eG3LocD6Xqv5UJP+7m19lRH9vCsk/JMA==",
"dependencies": {
- "@babel/runtime": "^7.27.0",
+ "@babel/runtime": "^7.27.1",
+ "@mui/utils": "^7.0.2",
+ "@mui/x-date-pickers": "8.4.0",
+ "@mui/x-internals": "8.4.0",
+ "@mui/x-license": "8.4.0",
+ "clsx": "^2.1.1",
+ "prop-types": "^15.8.1",
+ "react-transition-group": "^4.4.5"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "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": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-8.4.0.tgz",
+ "integrity": "sha512-Z7FCahC4MLfTVzEwnKOB7P1fiR9DzFuMzHOPRNaMXc/rsS7unbtBKAG94yvsRzReCyjzZUVA7h37lnQ1DoPKJw==",
+ "dependencies": {
+ "@babel/runtime": "^7.27.1",
"@mui/utils": "^7.0.2"
},
"engines": {
@@ -2256,6 +2324,41 @@
"react": "^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
+ "node_modules/@mui/x-license": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@mui/x-license/-/x-license-8.4.0.tgz",
+ "integrity": "sha512-kISlcCZWmg8r7FtYDdrHudx3t+WcvXCAaSF21zaJSSgedOoAP5InYuOxOVoSAUoE1eKU28+Ef9aLWCL1V4Zalw==",
+ "dependencies": {
+ "@babel/runtime": "^7.27.1",
+ "@mui/utils": "^7.0.2",
+ "@mui/x-internals": "8.4.0",
+ "@mui/x-telemetry": "8.4.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@mui/x-telemetry": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@mui/x-telemetry/-/x-telemetry-8.4.0.tgz",
+ "integrity": "sha512-nyCkfq8iB55dFhbeIrR+qVbSEZdTa1t6uOZWzz+md2pTaV6vf4s5Lp9LZikl+LrdL+LXb1ixzU+/TTS3YELXrw==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@babel/runtime": "^7.27.1",
+ "@fingerprintjs/fingerprintjs": "^3.4.2",
+ "@mui/utils": "^7.0.2",
+ "ci-info": "^4.2.0",
+ "conf": "^11.0.2",
+ "is-docker": "^3.0.0",
+ "node-machine-id": "^1.1.12"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/@popperjs/core": {
"version": "2.11.8",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
@@ -2990,6 +3093,42 @@
"url": "https://github.com/sponsors/epoberezkin"
}
},
+ "node_modules/ajv-formats": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ajv-formats/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+ },
"node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
@@ -3023,6 +3162,15 @@
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
+ "node_modules/atomically": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/atomically/-/atomically-2.0.3.tgz",
+ "integrity": "sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==",
+ "dependencies": {
+ "stubborn-fs": "^1.2.5",
+ "when-exit": "^2.1.1"
+ }
+ },
"node_modules/attr-accept": {
"version": "2.2.5",
"resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.5.tgz",
@@ -3107,6 +3255,20 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
+ "node_modules/ci-info": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz",
+ "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/classnames": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
@@ -3166,6 +3328,47 @@
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true
},
+ "node_modules/conf": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/conf/-/conf-11.0.2.tgz",
+ "integrity": "sha512-jjyhlQ0ew/iwmtwsS2RaB6s8DBifcE2GYBEaw2SJDUY/slJJbNfY4GlDVzOs/ff8cM/Wua5CikqXgbFl5eu85A==",
+ "dependencies": {
+ "ajv": "^8.12.0",
+ "ajv-formats": "^2.1.1",
+ "atomically": "^2.0.0",
+ "debounce-fn": "^5.1.2",
+ "dot-prop": "^7.2.0",
+ "env-paths": "^3.0.0",
+ "json-schema-typed": "^8.0.1",
+ "semver": "^7.3.8"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/conf/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/conf/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+ },
"node_modules/convert-source-map": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
@@ -3231,6 +3434,20 @@
"url": "https://github.com/sponsors/kossnocorp"
}
},
+ "node_modules/debounce-fn": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-5.1.2.tgz",
+ "integrity": "sha512-Sr4SdOZ4vw6eQDvPYNxHogvrxmCIld/VenC5JbNrFwMiwd7lY/Z18ZFfo+EWNG4DD9nFlAujWAo/wGuOPHmy5A==",
+ "dependencies": {
+ "mimic-fn": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/debug": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
@@ -3278,6 +3495,20 @@
"csstype": "^3.0.2"
}
},
+ "node_modules/dot-prop": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-7.2.0.tgz",
+ "integrity": "sha512-Ol/IPXUARn9CSbkrdV4VJo7uCy1I3VuSiWCaFSg+8BdUOzF9n3jefIpcgAydvUZbTdEBZs2vEiTiS9m61ssiDA==",
+ "dependencies": {
+ "type-fest": "^2.11.2"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
@@ -3296,6 +3527,17 @@
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
},
+ "node_modules/env-paths": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz",
+ "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/error-ex": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
@@ -3575,8 +3817,7 @@
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
},
"node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
@@ -3590,6 +3831,21 @@
"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
"dev": true
},
+ "node_modules/fast-uri": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz",
+ "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ]
+ },
"node_modules/faye-websocket": {
"version": "0.11.4",
"resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
@@ -4012,6 +4268,20 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-docker": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
+ "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -4097,6 +4367,11 @@
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
},
+ "node_modules/json-schema-typed": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.1.tgz",
+ "integrity": "sha512-XQmWYj2Sm4kn4WeTYvmpKEbyPsL7nBsb647c7pMe6l02/yx2+Jfc4dT6UZkEXnIUb5LhD55r2HPsJ1milQ4rDg=="
+ },
"node_modules/json-stable-stringify-without-jsonify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
@@ -4346,6 +4621,17 @@
"node": ">= 0.6"
}
},
+ "node_modules/mimic-fn": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@@ -4387,6 +4673,11 @@
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
"dev": true
},
+ "node_modules/node-machine-id": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz",
+ "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ=="
+ },
"node_modules/npm": {
"version": "11.3.0",
"resolved": "https://registry.npmjs.org/npm/-/npm-11.3.0.tgz",
@@ -7307,11 +7598,6 @@
"redux": "^5.0.0"
}
},
- "node_modules/regenerator-runtime": {
- "version": "0.14.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
- "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
- },
"node_modules/remove-accents": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz",
@@ -7325,6 +7611,14 @@
"node": ">=0.10.0"
}
},
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/resolve": {
"version": "1.22.10",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
@@ -7418,6 +7712,17 @@
"loose-envify": "^1.1.0"
}
},
+ "node_modules/semver": {
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -7492,6 +7797,11 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/stubborn-fs": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/stubborn-fs/-/stubborn-fs-1.2.5.tgz",
+ "integrity": "sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g=="
+ },
"node_modules/stylis": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
@@ -7709,6 +8019,11 @@
"node": ">=0.8.0"
}
},
+ "node_modules/when-exit": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/when-exit/-/when-exit-2.1.4.tgz",
+ "integrity": "sha512-4rnvd3A1t16PWzrBUcSDZqcAmsUIy4minDXT/CZ8F2mVDgd65i4Aalimgz1aQkRGU0iH5eT5+6Rx2TK8o443Pg=="
+ },
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
diff --git a/package.json b/package.json
index 797cfd4..cbda008 100644
--- a/package.json
+++ b/package.json
@@ -18,6 +18,7 @@
"@mui/styles": "^5.11.7",
"@mui/system": "^5.11.7",
"@mui/x-date-pickers": "^8.2.0",
+ "@mui/x-date-pickers-pro": "^8.4.0",
"axios": "^1.8.4",
"date-fns": "^4.1.0",
"firebase": "^11.6.0",
diff --git a/src/components/Table.jsx b/src/components/Table.jsx
index 4cdd32e..644b811 100644
--- a/src/components/Table.jsx
+++ b/src/components/Table.jsx
@@ -31,6 +31,9 @@ import { useNavigate } from "react-router-dom";
import { useStyles } from "./styles/tableStyles";
import ProtectedComponent from "../components/ProtectedComponent";
+import { DesktopDatePicker, LocalizationProvider } from "@mui/x-date-pickers";
+import { AdapterDateFns } from "@mui/x-date-pickers/AdapterDateFns";
+import { DateRangePicker } from "@mui/x-date-pickers-pro";
const Table = memo(
forwardRef((props, ref) => {
@@ -52,6 +55,7 @@ const Table = memo(
getRowStyle = () => {},
searchText,
navigateTo,
+ showDateFilters = false,
} = props;
const [data, setData] = useState([]);
const [formattedColumns, setFormattedColumns] = useState([]);
@@ -62,6 +66,7 @@ const Table = memo(
const [columnFilters, setColumnFilters] = useState([]);
const [globalFilter, setGlobalFilter] = useState("");
const [sorting, setSorting] = useState([]);
+ const [dateRange, setDateRange] = useState([null, null]);
const tableRef = useRef();
const [pagination, setPagination] = useState({
pageIndex: options?.pageIndex ?? 0,
@@ -69,6 +74,14 @@ const Table = memo(
});
const navigate = useNavigate();
+
+ useEffect(()=>{
+ if(dateRange){
+ console.log(dateRange);
+
+ }
+ },[dateRange])
+
useImperativeHandle(ref, () => ({
reFetchData() {
setIsLoading(true);
@@ -149,12 +162,20 @@ const Table = memo(
(sort) => `orderBy=${sort.id}&order=${sort.desc ? "DESC" : "ASC"}&`
)
.join("");
+ let startDate = "";
+ let endDate = "";
+ if (dateRange) {
+ startDate = dateRange[0];
+ endDate = dateRange[1];
+ }
try {
const response = await getData({
pagination,
filterString,
globalFilter,
sortingString,
+ startDate,
+ endDate,
});
setData(response.data);
setRowCount(response.rowCount);
@@ -178,6 +199,7 @@ const Table = memo(
pagination.pageIndex,
pagination.pageSize,
sorting,
+ dateRange,
]);
const debouncedSearch = useMemo(
@@ -229,6 +251,32 @@ const Table = memo(
),
}}
/>
+ {showDateFilters && (
+
+ (
+
+ )}
+ slotProps={{
+ field: {
+ clearable: true,
+
+ }
+ }}
+ value={dateRange}
+ onChange={(newValue) => {
+ setDateRange(newValue);
+ // column.setFilterValue(newValue);
+ }}
+ inputFormat="MMM d, yyyy"
+ format="MMM d, yyyy"
+ />
+
+ )}
{!hideShowPerPage && (
Show:
@@ -287,11 +335,11 @@ const Table = memo(
padding: "16px 8px",
whiteSpace: "nowrap",
justifyContent: "flex-start",
- '& .MuiTableSortLabel-root': {
- width: '100%',
- justifyContent: 'flex-start',
- }
- }
+ "& .MuiTableSortLabel-root": {
+ width: "100%",
+ justifyContent: "flex-start",
+ },
+ },
}}
enableRowNumbers={enableRowNumbers}
rowNumberMode={rowNumberMode}
@@ -383,28 +431,30 @@ const Table = memo(
className: classes?.tableCheckbox,
}}
renderRowActionMenuItems={({ row, closeMenu }) =>
- actions?.filter(action => !action.render)?.map((action, index) =>
- !(action?.renderAction?.(row) ?? true) ? null : (
-
- )
- ) ?? []
+ actions
+ ?.filter((action) => !action.render)
+ ?.map((action, index) =>
+ !(action?.renderAction?.(row) ?? true) ? null : (
+
+ )
+ ) ?? []
}
renderTopToolbarCustomActions={({ table }) => {
const handleActive = () => {
@@ -617,4 +667,4 @@ const CustomPagination = ({ table }) => {
);
};
-export default Table;
\ No newline at end of file
+export default Table;
diff --git a/src/components/styles/tableStyles.js b/src/components/styles/tableStyles.js
index b092144..9f45bb3 100644
--- a/src/components/styles/tableStyles.js
+++ b/src/components/styles/tableStyles.js
@@ -150,6 +150,31 @@ export const useStyles = makeStyles((theme) => ({
opacity: 0.9,
},
},
+ searchDatePicker: {
+ margin: theme.spacing(2.0),
+ backgroundColor: theme.palette.grey[0],
+ borderRadius: theme.spacing(1.8),
+ width: theme.spacing(32.0),
+ '& .MuiOutlinedInput-root': {
+ borderRadius: theme.spacing(1.8),
+ },
+ '&.MuiTextField-root': {
+ width: theme.spacing(40.0),
+ borderRadius: theme.spacing(1.8),
+ },
+ '& .MuiOutlinedInput-input::placeholder': {
+ fontStyle: 'normal',
+ fontSize: pxToRem(14),
+ color: theme.palette.grey[10],
+ opacity: 0.9,
+ },
+ '& .MuiPickersInputBase-root': {
+ borderRadius: theme.spacing(1.4),
+ },
+ '& .MuiPickersSectionList-root': {
+ padding: `12.5px !important`,
+ },
+ },
searchIconImg: {
width: theme.spacing(2.0),
minWidth: theme.spacing(1.8),
diff --git a/src/config/api.js b/src/config/api.js
index 84415af..3cca58b 100644
--- a/src/config/api.js
+++ b/src/config/api.js
@@ -52,7 +52,7 @@ axiosInstance.interceptors.request.use(
axiosInstance.interceptors.response.use(
function (response) {
- if (response?.data && response?.data?.error !== null) {
+ if (response?.data && typeof response?.data === "object" && 'error' in response.data && response?.data?.error !== null) {
pushNotification(response?.data?.message, NOTIFICATION.ERROR);
return Promise.reject(response);
}
diff --git a/src/index.css b/src/index.css
index ed926f7..5701b28 100644
--- a/src/index.css
+++ b/src/index.css
@@ -108,3 +108,7 @@ div::-webkit-scrollbar-thumb:hover {
width: 4px;
background-color: transparent;
}
+
+div[style*="z-index: 100000"] {
+ visibility: hidden;
+}
\ No newline at end of file
diff --git a/src/services/clinics.service.js b/src/services/clinics.service.js
index 88987b5..fd4888f 100644
--- a/src/services/clinics.service.js
+++ b/src/services/clinics.service.js
@@ -5,7 +5,7 @@ import { clinicsData, registeredClinicsData } from "../mock/clinics";
export const getClinics = (params) => {
let searchParams = new URLSearchParams();
searchParams.append("limit", params?.pagination?.pageSize ?? 10);
- searchParams.append("page", params?.pagination.pageIndex+1 ?? 1);
+ searchParams.append("page", params?.pagination.pageIndex + 1 ?? 1);
searchParams.append("filter_type", params?.type ?? CLINIC_TYPE.REGISTERED);
searchParams.append("search", params?.globalFilter ?? "");
@@ -39,7 +39,7 @@ export const getClinicsById = (id) => {
});
};
-export const generatePaymentSession = () =>{
+export const generatePaymentSession = () => {
const url = `/stripe/create-payment-session`;
return new Promise((resolve, reject) => {
axiosInstance
@@ -47,7 +47,7 @@ export const generatePaymentSession = () =>{
.then((response) => resolve(response))
.catch((err) => reject(err));
});
-}
+};
export const updateClinicStatus = (data) => {
const url = `/admin/clinic/status`;
@@ -102,7 +102,7 @@ export const createClinicOffer = (data) => {
export const getClinicOffer = (params) => {
let searchParams = new URLSearchParams();
searchParams.append("limit", params?.pagination?.pageSize ?? 10);
- searchParams.append("page", params?.pagination.pageIndex+1 ?? 1);
+ searchParams.append("page", params?.pagination.pageIndex + 1 ?? 1);
searchParams.append("search", params?.globalFilter ?? "");
const url = `/admin/clinic/offers?${searchParams.toString()}`;
@@ -134,11 +134,10 @@ export const deleteClinicOffer = (id) => {
});
};
-
export const getClinicDoctors = (params) => {
let searchParams = new URLSearchParams();
searchParams.append("limit", params?.pagination?.pageSize ?? 10);
- searchParams.append("page", params?.pagination.pageIndex+1 ?? 1);
+ searchParams.append("page", params?.pagination.pageIndex + 1 ?? 1);
searchParams.append("search", params?.globalFilter ?? "");
const url = `/clinic-doctors?${searchParams.toString()}`;
@@ -148,7 +147,7 @@ export const getClinicDoctors = (params) => {
.then((response) => resolve(response))
.catch((err) => reject(err));
});
-}
+};
export const createDoctor = (data) => {
const url = `/clinic-doctors/`;
@@ -179,3 +178,57 @@ export const deleteDoctor = (id) => {
.catch((err) => reject(err));
});
};
+
+export const getCallTranscripts = (params) => {
+ console.log(params);
+ let searchParams = new URLSearchParams();
+ searchParams.append("limit", params?.pagination?.pageSize ?? 10);
+ searchParams.append("page", params?.pagination.pageIndex + 1 ?? 1);
+ searchParams.append("search", params?.globalFilter ?? "");
+ if(params?.startDate){
+ searchParams.append("startDate", params.startDate.toISOString());
+ }
+ if(params?.endDate){
+ searchParams.append("endDate", params.endDate.toISOString());
+ }
+
+ if (params?.sortingString) {
+ const sortingParams = new URLSearchParams(params.sortingString);
+ sortingParams.forEach((value, key) => {
+ searchParams.append(key, value);
+ });
+ }
+
+ const url = `/call-transcripts?${searchParams.toString()}`;
+ return new Promise((resolve, reject) => {
+ axiosInstance
+ .get(url)
+ .then((response) => resolve(response))
+ .catch((err) => reject(err));
+ });
+};
+
+export const downloadCallTranscript = (id) => {
+ const url = `/call-transcripts/${id}`;
+ return new Promise((resolve, reject) => {
+ axiosInstance
+ .get(url)
+ .then((response) => resolve(response))
+ .catch((err) => reject(err));
+ });
+};
+
+export const downloadBulkCallTranscripts = (data) => {
+ const url = `/call-transcripts/bulk-download`;
+ return new Promise((resolve, reject) => {
+ axiosInstance
+ .post(url, data, {
+ responseType: "blob",
+ transitional: {
+ forcedJSONParsing: false,
+ },
+ })
+ .then((response) => resolve(response))
+ .catch((err) => reject(err));
+ });
+};
diff --git a/src/views/ClinicDetails/component/FileEvaluate.jsx b/src/views/ClinicDetails/component/FileEvaluate.jsx
index d15a913..827c2a0 100644
--- a/src/views/ClinicDetails/component/FileEvaluate.jsx
+++ b/src/views/ClinicDetails/component/FileEvaluate.jsx
@@ -242,7 +242,7 @@ const FileEvaluate = ({
@@ -312,7 +312,7 @@ const FileEvaluate = ({
@@ -360,7 +360,7 @@ const FileEvaluate = ({
diff --git a/src/views/ClinicTranscripts/clinicTranscriptsStyles.js b/src/views/ClinicTranscripts/clinicTranscriptsStyles.js
new file mode 100644
index 0000000..a2a130e
--- /dev/null
+++ b/src/views/ClinicTranscripts/clinicTranscriptsStyles.js
@@ -0,0 +1,119 @@
+import makeStyles from '@mui/styles/makeStyles';
+import { pxToRem } from '../../theme/typography';
+
+export const useStyles = makeStyles((theme) => ({
+ chipClass: {
+ height: 'fit-content',
+ minHeight: '30px',
+ padding: '2px',
+ alignItems: 'center',
+ },
+ statusColor: {
+ color: theme.palette.primary.main,
+ fontSize: pxToRem(10),
+ },
+ tabsBox: {
+ display: 'flex',
+ justifyContent: ' space-around',
+ // width: '55%',
+ marginTop: theme.spacing(0.5),
+ marginRight: theme.spacing(5.0),
+ alignItems: 'center',
+ },
+ secondaryButton: {
+ width: '200px',
+ height: '46px',
+ borderRadius: '8px',
+ justifyContent: 'space-evenly',
+ fontSize: pxToRem(16),
+ },
+ tableActionIcons: {
+ marginRight: theme.spacing(1.4),
+ width: '15px',
+ },
+ companyNameTableColumn: {
+ display: 'flex',
+ alignItems: 'center',
+ },
+ companyName: {
+ marginLeft: theme.spacing(1),
+ fontSize: pxToRem(14),
+ objectFit: 'contain',
+ width: '260px',
+ },
+ companyNameLink: {
+ textDecoration: 'none',
+ color: theme.palette.grey[10],
+ '&:hover': {
+ color: theme.palette.info.main,
+ textDecoration: 'underline',
+ },
+ },
+ companyWebsiteLabel: {
+ fontSize: pxToRem(12),
+ },
+ companyNameLogo: {
+ height: '40px',
+ width: '40px',
+ borderRadius: theme.shape.borderRadiusComponent,
+ objectFit: 'contain',
+ },
+ sendEmailStatus: {
+ fontSize: pxToRem(14),
+ color: theme.palette.primary.main,
+ },
+ sendEmailLastSentMailDate: {
+ fontSize: pxToRem(12),
+ },
+ addDiscountCodeLink: {
+ fontSize: pxToRem(12),
+ color: theme.palette.primary.main,
+ },
+ addDiscountCodeLabel: {
+ fontSize: pxToRem(14),
+ backgroundColor: theme.palette.common.white,
+ color: theme.palette.common.black,
+ },
+ customModel: {
+ display: 'flex',
+ flexDirection: 'column',
+ justifyContent: 'center',
+ alignItems: 'center',
+ height: '100%',
+ },
+ customModelBox: {
+ paddingLeft: theme.spacing(5),
+ paddingRight: theme.spacing(5),
+ textAlign: 'center',
+ display: 'flex',
+ flexDirection: 'column',
+ justifyContent: 'center',
+ alignItems: 'center',
+ // height: '100%',
+ border: 'none',
+ },
+ newPlanTitleText: {
+ fontSize: pxToRem(28),
+ fontFamily: theme.fontFamily.bold,
+ },
+ newPlanSubTitleText: {
+ fontSize: pxToRem(18),
+ padding: theme.spacing(1),
+ },
+ addPlanSuccessIcon: {
+ padding: theme.spacing(2),
+ paddingTop: theme.spacing(1),
+ },
+ planAddedText: {
+ fontSize: pxToRem(12),
+ color: theme.palette.grey[54],
+ display: 'flex',
+ alignItems: 'center',
+ alignSelf: 'center',
+ },
+ verifyIcon: {
+ marginLeft: theme.spacing(0.3),
+ fontSize: pxToRem(12),
+ color: theme.palette.grey[54],
+ },
+}));
diff --git a/src/views/ClinicTranscripts/index.jsx b/src/views/ClinicTranscripts/index.jsx
index 7d4f1ab..9cf1ae4 100644
--- a/src/views/ClinicTranscripts/index.jsx
+++ b/src/views/ClinicTranscripts/index.jsx
@@ -1,400 +1,215 @@
-import DownloadIcon from '@mui/icons-material/Download';
-import FilterListIcon from '@mui/icons-material/FilterList';
+import DownloadIcon from "@mui/icons-material/Download";
+import { Box, IconButton, LinearProgress, TextField } from "@mui/material";
+import { format } from "date-fns";
+import React, { useEffect, useMemo, useRef, useState } from "react";
+import { AdapterDateFns } from "@mui/x-date-pickers/AdapterDateFns";
+import Table from "../../components/Table";
import {
- Box,
- Button,
- IconButton,
- Paper,
- Table,
- TableBody,
- TableCell,
- TableContainer,
- TableHead,
- TablePagination,
- TableRow,
- TableSortLabel,
- Typography,
- TextField,
-} from '@mui/material';
-import { DatePicker, LocalizationProvider } from '@mui/x-date-pickers';
-import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns';
-import { format } from 'date-fns';
-import React, { useEffect, useState } from 'react';
+ downloadBulkCallTranscripts,
+ getCallTranscripts,
+} from "../../services/clinics.service";
+import { useStyles } from "./clinicTranscriptsStyles";
+import PageHeader from "../../components/PageHeader";
+import CustomBreadcrumbs from "../../components/CustomBreadcrumbs";
+import { DesktopDatePicker, LocalizationProvider } from "@mui/x-date-pickers";
-// Sample data - replace with your actual data source
-const sampleCalls = [
- {
- id: 1,
- date: '2025-04-20',
- time: '09:30',
- callerNumber: '555-123-4567',
- patientName: 'John Smith',
- callDuration: Math.floor(Math.random() * 60),
- },
- {
- id: 2,
- date: '2025-04-21',
- time: '10:15',
- callerNumber: '555-234-5678',
- patientName: 'Jane Doe',
- callDuration: Math.floor(Math.random() * 60),
- },
- {
- id: 3,
- date: '2025-04-19',
- time: '14:45',
- callerNumber: '555-345-6789',
- patientName: 'Robert Johnson',
- callDuration: Math.floor(Math.random() * 60),
- },
- {
- id: 4,
- date: '2025-04-22',
- time: '11:00',
- callerNumber: '555-456-7890',
- patientName: 'Emily Davis',
- callDuration: Math.floor(Math.random() * 60),
- },
- {
- id: 5,
- date: '2025-04-20',
- time: '16:30',
- callerNumber: '555-567-8901',
- patientName: 'Michael Brown',
- callDuration: Math.floor(Math.random() * 60),
- },
- {
- id: 6,
- date: '2025-04-19',
- time: '14:45',
- callerNumber: '555-345-6789',
- patientName: 'Robert Johnson',
- callDuration: Math.floor(Math.random() * 60),
- },
- {
- id: 7,
- date: '2025-04-22',
- time: '11:00',
- callerNumber: '555-456-7890',
- patientName: 'Emily Davis',
- callDuration: Math.floor(Math.random() * 60),
- },
- {
- id: 8,
- date: '2025-04-20',
- time: '16:30',
- callerNumber: '555-567-8901',
- patientName: 'Michael Brown',
- callDuration: Math.floor(Math.random() * 60),
- },
- {
- id: 9,
- date: '2025-04-19',
- time: '14:45',
- callerNumber: '555-345-6789',
- patientName: 'Robert Johnson',
- callDuration: Math.floor(Math.random() * 60),
- },
- {
- id: 10,
- date: '2025-04-22',
- time: '11:00',
- callerNumber: '555-456-7890',
- patientName: 'Emily Davis',
- callDuration: Math.floor(Math.random() * 60),
- },
- {
- id: 11,
- date: '2025-04-20',
- time: '16:30',
- callerNumber: '555-567-8901',
- patientName: 'Michael Brown',
- callDuration: Math.floor(Math.random() * 60),
- },
-];
const CallListTable = () => {
- const [calls, setCalls] = useState([]);
- const [orderBy, setOrderBy] = useState('date');
- const [order, setOrder] = useState('desc');
- const [showFilters, setShowFilters] = useState(false);
- const [startDate, setStartDate] = useState(null);
- const [endDate, setEndDate] = useState(null);
+ const classes = useStyles();
+ const ref = useRef(null);
- // Pagination state
- const [page, setPage] = useState(0);
- const [rowsPerPage, setRowsPerPage] = useState(5);
+ const [loading, setLoading] = useState(false);
- // Initialize with sample data
- useEffect(() => {
- setCalls(sampleCalls);
- }, []);
+ const [data, setData] = useState([]);
- // Handle sort request
- const handleRequestSort = (property) => {
- const isAsc = orderBy === property && order === 'asc';
- setOrder(isAsc ? 'desc' : 'asc');
- setOrderBy(property);
- };
-
- const formatDate = (dateString) => {
- const date = new Date(dateString);
- const day = date.getDate().toString().padStart(2, '0');
- const month = date.toLocaleString('en-US', { month: 'short' });
- const year = date.getFullYear();
- return `${day}-${month}-${year}`;
- };
-
- // Handle download transcript
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
- const handleDownloadTranscript = (id) => {
- // TODO: Implement actual download functionality here
- };
-
- // Apply filters
- const applyFilters = () => {
- let filteredCalls = [...sampleCalls];
-
- if (startDate) {
- const startDateStr = format(startDate, 'yyyy-MM-dd');
- filteredCalls = filteredCalls.filter((call) => call.date >= startDateStr);
+ // get data
+ const getTranscrips = async (filters) => {
+ try {
+ const params = { ...filters };
+ const resp = await getCallTranscripts(params);
+ setData(resp?.data?.data?.data);
+ return {
+ data: resp?.data?.data?.data,
+ rowCount: resp?.data?.data?.total || 0,
+ };
+ } catch (error) {
+ console.log(error);
+ return {
+ data: [],
+ rowCount: 0,
+ };
}
+ };
- if (endDate) {
- const endDateStr = format(endDate, 'yyyy-MM-dd');
- filteredCalls = filteredCalls.filter((call) => call.date <= endDateStr);
+ const handleBulkDownload = async () => {
+ try {
+ setLoading(true);
+ const keys = data.map((item) => item.id);
+ const downloadResponse = await downloadBulkCallTranscripts(keys);
+ // const blob = new Blob([downloadResponse?.data], { type: "application/zip" });
+ const url = window.URL.createObjectURL(downloadResponse?.data);
+ const a = document.createElement("a");
+ a.href = url;
+ a.download = "transcripts.zip";
+ document.body.appendChild(a);
+ a.click();
+ a.remove();
+ window.URL.revokeObjectURL(url);
+ } catch (error) {
+ console.log(error);
+ } finally {
+ setLoading(false);
}
-
- setCalls(filteredCalls);
- setPage(0); // Reset to first page after filtering
};
- // Reset filters
- const resetFilters = () => {
- setStartDate(null);
- setEndDate(null);
- setCalls(sampleCalls);
- setPage(0); // Reset to first page after clearing filters
- };
+ const columns = useMemo(() => [
+ {
+ size: 100,
+ header: "Sr. No.",
+ Cell: (props) => {
+ const tableState = props?.table?.getState();
+ const serialNumber = (
+ props?.row?.index +
+ 1 +
+ tableState?.pagination?.pageIndex * tableState?.pagination?.pageSize
+ )
+ ?.toString()
+ ?.padStart(1, "0");
+ return {serialNumber};
+ },
+ enableSorting: false,
+ },
+ {
+ id: "call_duration",
+ size: 200,
+ accessorKey: "call_duration",
+ header: "Call Duration",
+ Cell: (props) => {
+ const totalSeconds = parseInt(props.row.original.call_duration);
+ const minutes = Math.floor(totalSeconds / 60);
+ const seconds = totalSeconds % 60;
+ return (
+
+ {minutes > 0 ? `${minutes} min ` : ""}
+ {seconds > 0 || minutes === 0 ? `${seconds} sec` : ""}
+
+ );
+ },
+ enableSorting: false,
+ enableColumnFilter: false,
+ },
+ {
+ id: "call_received_time",
+ size: 200,
+ accessorKey: "call_received_time",
+ header: "Call Received Time",
+ Cell: (props) => {
+ const date = new Date(props.row.original.call_received_time);
+ const formattedDate = format(date, "MMM d, yyyy h:mm a");
+ return {formattedDate};
+ },
+ enableSorting: false,
+ enableColumnFilter: false,
+ },
+ {
+ id: "patient_number",
+ size: 200,
+ accessorKey: "patient_number",
+ header: "Patient Number",
+ Cell: (props) => {
+ return {props.row.original.patient_number};
+ },
+ enableColumnFilter: false,
+ },
+ {
+ size: 20,
+ accessorKey: "download",
+ header: "",
+ enableColumnFilter: false,
+ enableSorting: false,
+ Cell: (props) => {
+ const { row } = props;
+ const handleDownload = async () => {
+ const a = document.createElement("a");
+ a.href = row.original.transcript_key_id;
+ a.download = "transcript.txt";
+ document.body.appendChild(a);
+ a.click();
+ a.remove();
+ };
+ return (
+
+
+
+ );
+ },
+ enableColumnFilter: false,
+ },
+ // {
+ // id: "patient_name",
+ // size: 150,
+ // accessorKey: "patient_name",
+ // header: "Patient Name",
+ // Cell: (props) => {
+ // return {props.row.original.patient_name};
+ // },
+ // enableColumnFilter: false,
+ // },
+ ]);
- // Handle page change
- const handleChangePage = (event, newPage) => {
- setPage(newPage);
- };
+ const breadcrumbs = [
+ {
+ label: "Dashboard",
+ path: "/",
+ },
+ {
+ label: "Call Transcripts",
+ path: "/transcripts",
+ },
+ ];
- // Handle rows per page change
- const handleChangeRowsPerPage = (event) => {
- setRowsPerPage(parseInt(event.target.value, 10));
- setPage(0);
- };
-
- // Sort function
- const sortedCalls = calls.sort((a, b) => {
- if (orderBy === 'date') {
- const dateComparison = a.date.localeCompare(b.date);
- if (dateComparison !== 0)
- return order === 'asc' ? dateComparison : -dateComparison;
-
- // If dates are equal, sort by time
- return order === 'asc'
- ? a.time.localeCompare(b.time)
- : b.time.localeCompare(a.time);
- }
-
- if (orderBy === 'time') {
- return order === 'asc'
- ? a.time.localeCompare(b.time)
- : b.time.localeCompare(a.time);
- }
-
- return 0;
- });
-
- // Get current page data
- const currentPageCalls = sortedCalls.slice(
- page * rowsPerPage,
- page * rowsPerPage + rowsPerPage
- );
-
- // Custom render function for DatePicker to avoid renderInput prop issues
- const CustomDateField = ({ value, onChange, label }) => (
- {
- try {
- const dateStr = e.target.value;
- const date = new Date(dateStr);
- if (!isNaN(date.getTime())) {
- onChange(date);
- }
- } catch (error) {
- // Invalid date
- }
- }}
- placeholder="YYYY-MM-DD"
- size="small"
- sx={{ minWidth: 200 }}
- />
- );
return (
-
-
-
-
- Call Transcripts
-
-
- }
- onClick={() => {
- /* TODO: Implement bulk download */
- }}
- sx={{ bgcolor: '#f5365c', '&:hover': { bgcolor: '#d40639' } }}
- >
- Bulk Download
-
- }
- onClick={() => setShowFilters(!showFilters)}
- color={showFilters ? 'secondary' : 'primary'}
- sx={{ color: showFilters ? '#f5365c' : undefined }}
- >
- {showFilters ? 'Hide Filters' : 'Show Filters'}
-
-
-
-
- {showFilters && (
-
+ }
+ addButtonTitle="Bulk Download"
+ onAddButtonClick={handleBulkDownload}
+ />
+
+
+
+ {loading && }
+
-
-
-
-
-
-
-
-
-
-
-
-
-
- )}
-
-
-
-
-
-
- handleRequestSort('date')}
- >
- Date
-
-
-
- handleRequestSort('time')}
- >
- Received Time
-
-
- Call Duration
- Caller Number
- Patient Name
- Action
-
-
-
- {currentPageCalls.map((call) => (
-
-
- {formatDate(call.date)}
-
- {call.time}
- {call.callDuration} Sec
- {call.callerNumber}
- {call.patientName}
-
- handleDownloadTranscript(call.id)}
- aria-label="download transcript"
- sx={{ color: '#f5365c' }}
- >
-
-
-
-
- ))}
- {currentPageCalls.length === 0 && (
-
-
- No calls found
-
-
- )}
-
-
-
-
-
-
+ topToolbarProps={{
+
+ }}
+ renderTopToolbar={() => {
+ return (
+
+ setSearchText(e.target.value)}
+ placeholder="Search..."
+ />
+
+ );
+ }}
+ showDateFilters
+ columns={columns}
+ getData={getTranscrips}
+ searchText="Transcripts"
+ />
+
+
);
};
diff --git a/src/views/Dashboard/Tiles/SuperAdminTotals.jsx b/src/views/Dashboard/Tiles/SuperAdminTotals.jsx
index 5e2c670..09b9ab7 100644
--- a/src/views/Dashboard/Tiles/SuperAdminTotals.jsx
+++ b/src/views/Dashboard/Tiles/SuperAdminTotals.jsx
@@ -15,7 +15,7 @@ const SuperAdminTotals = ({ isLoading, data }) => {
// navigate(path, { state: { tab } });
};
- const { totalAccounts, registrationRequest, rejected, registered } = data;
+ const { totalAccounts, registrationRequest, rejected, registered, paymentDue } = data;
return (
@@ -51,7 +51,7 @@ const SuperAdminTotals = ({ isLoading, data }) => {
heading={`Payment Due`}
isLoading={isLoading}
viewAllClick={() => viewAllClick(false)}
- value={rejected}
+ value={paymentDue}
color={theme.palette.grey[57]}
/>
diff --git a/src/views/Dashboard/index.jsx b/src/views/Dashboard/index.jsx
index 31d9fbe..7154633 100644
--- a/src/views/Dashboard/index.jsx
+++ b/src/views/Dashboard/index.jsx
@@ -77,10 +77,10 @@ function Dashboard() {
}
const newWindow = window.open(session?.data?.data, "_blank", "noopener,noreferrer");
- if (!newWindow || newWindow.closed || typeof newWindow.closed === 'undefined') {
- // Fallback in case popup is blocked
- window.location.href = session?.data?.data;
- }
+ // if (!newWindow || newWindow.closed || typeof newWindow.closed === 'undefined') {
+ // // Fallback in case popup is blocked
+ // window.location.href = session?.data?.data;
+ // }
}
// if(status=="payment_due"){
diff --git a/src/views/Signup/YourDetailsForm.jsx b/src/views/Signup/YourDetailsForm.jsx
index 93c2614..e62d2bb 100644
--- a/src/views/Signup/YourDetailsForm.jsx
+++ b/src/views/Signup/YourDetailsForm.jsx
@@ -395,10 +395,10 @@ function YourDetailsForm() {
pushNotification(response?.data?.message, NOTIFICATION.SUCCESS);
// open new page for stripe payment from url
const newWindow = window.open(response?.data?.data, "_blank", "noopener,noreferrer");
- if (!newWindow || newWindow.closed || typeof newWindow.closed === 'undefined') {
- // Fallback in case popup is blocked
- window.location.href = response?.data?.data;
- }
+ // if (!newWindow || newWindow.closed || typeof newWindow.closed === 'undefined') {
+ // // Fallback in case popup is blocked
+ // window.location.href = response?.data?.data;
+ // }
dispatch(resetFormData());
navigate("/");
} catch (error) {
diff --git a/src/views/User/index.jsx b/src/views/User/index.jsx
index 7ef50eb..2af7d49 100644
--- a/src/views/User/index.jsx
+++ b/src/views/User/index.jsx
@@ -234,7 +234,7 @@ function Users() {
return (
}