From 0d5161d20dee777701cb4bfaf2888c35418f33f4 Mon Sep 17 00:00:00 2001 From: deepvasoya Date: Thu, 29 May 2025 17:55:28 +0530 Subject: [PATCH] feat: call transcripts --- package-lock.json | 361 ++++++++++- package.json | 1 + src/components/Table.jsx | 106 +++- src/components/styles/tableStyles.js | 25 + src/config/api.js | 2 +- src/index.css | 4 + src/services/clinics.service.js | 67 +- .../ClinicDetails/component/FileEvaluate.jsx | 6 +- .../clinicTranscriptsStyles.js | 119 ++++ src/views/ClinicTranscripts/index.jsx | 575 ++++++------------ .../Dashboard/Tiles/SuperAdminTotals.jsx | 4 +- src/views/Dashboard/index.jsx | 8 +- src/views/Signup/YourDetailsForm.jsx | 8 +- src/views/User/index.jsx | 4 +- 14 files changed, 836 insertions(+), 454 deletions(-) create mode 100644 src/views/ClinicTranscripts/clinicTranscriptsStyles.js 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 : ( - { - event.stopPropagation(); - action.onClick && action.onClick(row); - closeMenu(); - }} - disabled={ - action?.isDisabledValue - ? action?.isDisabledValue === - row?.original?.[action?.rowKey] - : false - } - > - {action?.icon} {action?.text}{" "} - {action.textFn && action.textFn(row)} - - ) - ) ?? [] + actions + ?.filter((action) => !action.render) + ?.map((action, index) => + !(action?.renderAction?.(row) ?? true) ? null : ( + { + event.stopPropagation(); + action.onClick && action.onClick(row); + closeMenu(); + }} + disabled={ + action?.isDisabledValue + ? action?.isDisabledValue === + row?.original?.[action?.rowKey] + : false + } + > + {action?.icon} {action?.text}{" "} + {action.textFn && action.textFn(row)} + + ) + ) ?? [] } 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 = ({ Uploaded File @@ -312,7 +312,7 @@ const FileEvaluate = ({ Uploaded File @@ -360,7 +360,7 @@ const FileEvaluate = ({ {file.documentType} 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 - - - - - - - - {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 ( }