Compare commits
68 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8b9a84c4bb | ||
|
|
6895562d9e | ||
|
|
d19f3549e0 | ||
|
|
cb0eb3a163 | ||
|
|
1a883a6711 | ||
|
|
9121dda277 | ||
|
|
1cf3ee09d9 | ||
|
|
81d4c756fa | ||
|
|
e497f2dda1 | ||
|
|
520fb58c3f | ||
|
|
e57ae45596 | ||
|
|
147fb23546 | ||
|
|
ed649d0350 | ||
|
|
e1bbdff49f | ||
|
|
a0bb626923 | ||
|
|
0646c8f11d | ||
|
|
7b594d658e | ||
|
|
2f519952b2 | ||
|
|
f6a6622095 | ||
|
|
45e5dbcd1a | ||
|
|
97b592ce72 | ||
|
|
4ce2178af5 | ||
|
|
cbcccccae4 | ||
|
|
8b5d071d0f | ||
|
|
78aa6004f1 | ||
|
|
5ebdd68f50 | ||
|
|
ac49d93342 | ||
|
|
8f3812ab67 | ||
|
|
93f2f4b569 | ||
|
|
d0b59833c8 | ||
|
|
c6494b7eaf | ||
|
|
d124e67552 | ||
|
|
772db018ee | ||
|
|
b86db17e88 | ||
|
|
82c90abf80 | ||
|
|
c4040961c8 | ||
|
|
47cc2de888 | ||
|
|
c83ad998a1 | ||
|
|
01b3bec343 | ||
|
|
7380207449 | ||
|
|
05e5e45b27 | ||
|
|
0c493dc646 | ||
|
|
cbd252b6ad | ||
|
|
1bd398ba69 | ||
|
|
31a4b3f278 | ||
|
|
c81f11fd8e | ||
|
|
f8a8c6a789 | ||
|
|
0715733163 | ||
|
|
aefcecf90f | ||
|
|
ebd9d23f12 | ||
|
|
e681a4a9bf | ||
|
|
f17408f5ce | ||
|
|
60a8044041 | ||
|
|
2d040ff1c8 | ||
|
|
e9da7a7983 | ||
|
|
4579ad914d | ||
|
|
b4ab8cbff0 | ||
|
|
d35510d39a | ||
|
|
5af8197664 | ||
|
|
29b7db446e | ||
|
|
ca71641341 | ||
|
|
45aecc658e | ||
|
|
5524f135ff | ||
|
|
65f5fdc428 | ||
|
|
4bf75a2473 | ||
|
|
87e4ca7c9a | ||
|
|
e34a618198 | ||
|
|
f9c054c62b |
25
.firebaserc
@@ -1,30 +1,5 @@
|
||||
{
|
||||
"projects": {
|
||||
"default": "hpos-af3cc"
|
||||
},
|
||||
"targets": {
|
||||
"hpos-af3cc": {
|
||||
"hosting": {
|
||||
"dev1": [
|
||||
"hpos-dev1"
|
||||
],
|
||||
"qa": [
|
||||
"hpos-qa"
|
||||
],
|
||||
"dev": [
|
||||
"hpos-dev"
|
||||
],
|
||||
"preprod": [
|
||||
"hpos-preprod"
|
||||
],
|
||||
"uat": [
|
||||
"hpos-uat"
|
||||
],
|
||||
"iocl": [
|
||||
"iocl-iisc"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"etags": {}
|
||||
}
|
||||
11
.gitignore
vendored
@@ -13,7 +13,6 @@
|
||||
|
||||
# misc
|
||||
.DS_Store
|
||||
.env
|
||||
.env.local
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
@@ -29,15 +28,9 @@ src/components/testData.json
|
||||
public/world-110m.json
|
||||
public/india-states.json
|
||||
*.apk
|
||||
*.apk
|
||||
|
||||
scripts/reports
|
||||
scripts/data
|
||||
firebase-debug.log
|
||||
.env.preprod
|
||||
.env.prod
|
||||
.env.qa
|
||||
.env.dev
|
||||
.env.uat
|
||||
.env.iocl
|
||||
|
||||
certificate_path/
|
||||
*.log
|
||||
|
||||
@@ -5,9 +5,9 @@ unit-test:
|
||||
image: node:latest
|
||||
stage: test
|
||||
before_script:
|
||||
- npm install --force
|
||||
- npm install
|
||||
script:
|
||||
- npm run test-ci
|
||||
- npm run test
|
||||
coverage: /All files[^|]*\|[^|]*\s+([\d\.]+)/
|
||||
artifacts:
|
||||
paths:
|
||||
|
||||
22
README.md
@@ -14,26 +14,4 @@
|
||||
http://localhost:3000
|
||||
|
||||
|
||||
|
||||
### add target (multi site), if not already defined for that site
|
||||
|
||||
firebase target:apply hosting dev1 hpos-dev1
|
||||
|
||||
### add or change to firebase.json
|
||||
|
||||
"target": "dev1",
|
||||
|
||||
### run build
|
||||
|
||||
npm run build
|
||||
|
||||
|
||||
### deploy
|
||||
|
||||
firebase deploy --only hosting:dev
|
||||
|
||||
pyinstaller --noconfirm --noconsole -i "smi.ico" --windowed --clean hemocube.py
|
||||
|
||||
### known issues
|
||||
|
||||
gemini starts giving error after 70 odd messages in a chat discussion
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
module.exports = {};
|
||||
@@ -1 +0,0 @@
|
||||
module.exports = 'test-file-stub';
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"presets": ["@babel/preset-env", "@babel/preset-react", "@babel/preset-typescript"]
|
||||
}
|
||||
|
||||
146
device_5_result_csv_final.ipynb
Normal file
@@ -0,0 +1,146 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "edbb2bd6-e678-4401-9c0d-83d9ad948bb7",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import csv\n",
|
||||
"\n",
|
||||
"def copy_columns(source_file, destination_file, header_names):\n",
|
||||
" with open(source_file, 'r', newline='') as source_csvfile, open(destination_file, 'w', newline='') as destination_csvfile:\n",
|
||||
" reader = csv.DictReader(source_csvfile)\n",
|
||||
" fieldnames = header_names\n",
|
||||
" writer = csv.DictWriter(destination_csvfile, fieldnames=fieldnames)\n",
|
||||
"\n",
|
||||
" writer.writeheader()\n",
|
||||
"\n",
|
||||
" for row in reader:\n",
|
||||
" selected_data = {key: row[key] for key in fieldnames if key in row}\n",
|
||||
" writer.writerow(selected_data)\n",
|
||||
"\n",
|
||||
"if __name__ == \"__main__\":\n",
|
||||
" source_csv = \"path/to/source_file.csv\" # Replace with the path to your source CSV file\n",
|
||||
" destination_csv = \"path/to/destination_file.csv\" # Replace with the path to your destination CSV file\n",
|
||||
" header_names = [\"Name\", \"ABHA ID\", \"Age\", \"Gender\", \"Category\", \"Marital Status\", \"Care-of\", \"Address\", \"District\", \"State\", \"Pincode\", \"Mobile Number\", \"Blood group\", \"Test Result\"] # Replace with the header names you want to copy\n",
|
||||
"\n",
|
||||
" copy_columns(source_csv, destination_csv, header_names)\n",
|
||||
"\n",
|
||||
" print(\"Data copied successfully.\")\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"id": "c242e21e-48a9-462c-8e3f-453913f84564",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Data copied successfully with new header.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import csv\n",
|
||||
"from datetime import datetime\n",
|
||||
"\n",
|
||||
"def calculate_age(birth_year):\n",
|
||||
" current_year = datetime.now().year\n",
|
||||
" return current_year - birth_year\n",
|
||||
"\n",
|
||||
"def copy_csv_with_new_header(source_file, destination_file, destination_header):\n",
|
||||
" # Create a list to store the filtered data from the source CSV file\n",
|
||||
" temp_data = []\n",
|
||||
"\n",
|
||||
" # Create a mapping for the destination header names to the source header names\n",
|
||||
" header_mapping = {\n",
|
||||
" \"Name\": \"name\",\n",
|
||||
" \"ABHA ID\": \"abhaId\",\n",
|
||||
" \"Age\": \"birthYear\",\n",
|
||||
" \"Gender\": \"gender\",\n",
|
||||
" \"Category\": \"category\",\n",
|
||||
" \"Marital Status\": \"maritalStatus\",\n",
|
||||
" \"Care-of\": \"careOf\",\n",
|
||||
" \"Address\": \"house\",\n",
|
||||
" \"District\": \"district\",\n",
|
||||
" \"State\": \"state\",\n",
|
||||
" \"Pincode\": \"pinCode\",\n",
|
||||
" \"Mobile Number\": \"phoneNumber\",\n",
|
||||
" \"Blood Group\": \"bloodGroup\",\n",
|
||||
" \"Test Result\": \"Class\"\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" with open(source_file, 'r', newline='') as source_csvfile:\n",
|
||||
" reader = csv.DictReader(source_csvfile)\n",
|
||||
"\n",
|
||||
" # Read the data from the source CSV file\n",
|
||||
" for row in reader:\n",
|
||||
" # Assuming the column \"birthYear\" exists in the CSV\n",
|
||||
" birth_year = int(row.get(\"birthYear\", 0))\n",
|
||||
" updated_age = calculate_age(birth_year)\n",
|
||||
"\n",
|
||||
" # Filter out unwanted fields from the row based on the destination header\n",
|
||||
" filtered_row = {key: row[header_mapping[key]] if key != \"Age\" else updated_age for key in destination_header}\n",
|
||||
"\n",
|
||||
" # Add the filtered row to the temporary data list\n",
|
||||
" temp_data.append(filtered_row)\n",
|
||||
"\n",
|
||||
" with open(destination_file, 'w', newline='') as destination_csvfile:\n",
|
||||
" writer = csv.DictWriter(destination_csvfile, fieldnames=destination_header)\n",
|
||||
"\n",
|
||||
" # Write the new header to the destination CSV file\n",
|
||||
" writer.writeheader()\n",
|
||||
"\n",
|
||||
" # Write the updated data to the destination CSV file\n",
|
||||
" writer.writerows(temp_data)\n",
|
||||
"\n",
|
||||
"if __name__ == \"__main__\":\n",
|
||||
" source_csv = r\"C:\\Users\\Durga\\Desktop\\from27.csv\" # Replace with the path to your source CSV file\n",
|
||||
"\n",
|
||||
" # Replace with the destination header names you want in the new CSV\n",
|
||||
" destination_header = [\"Name\", \"ABHA ID\", \"Age\", \"Gender\", \"Category\", \"Marital Status\", \"Care-of\", \"Address\", \n",
|
||||
" \"District\", \"State\", \"Pincode\", \"Mobile Number\", \"Blood Group\", \"Test Result\"]\n",
|
||||
"\n",
|
||||
" destination_csv = r\"C:\\Users\\Durga\\Desktop\\result tilljuly31.csv\" # Replace with the path to your destination CSV file\n",
|
||||
"\n",
|
||||
" copy_csv_with_new_header(source_csv, destination_csv, destination_header)\n",
|
||||
"\n",
|
||||
" print(\"Data copied successfully with new header.\")\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "965db908-c717-40a3-81cb-3da73b744ec5",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.10.9"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"hosting": {
|
||||
"target": "iocl",
|
||||
"public": "build",
|
||||
"ignore": [
|
||||
"firebase.json",
|
||||
|
||||
45
firmware/hemocube_mock/hemocube_mock.ino
Normal file
@@ -0,0 +1,45 @@
|
||||
void setup() {
|
||||
// put your setup code here, to run once:
|
||||
Serial.begin(115200);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// put your main code here, to run repeatedly:
|
||||
|
||||
Serial.println("SN:182829");
|
||||
while (Serial.available() == 0) {} //wait for data available
|
||||
String bufferCommand = Serial.readString(); //read until timeout
|
||||
bufferCommand.trim(); // remove any \r \n whitespace at the end of the String
|
||||
if (bufferCommand == "B") {
|
||||
Serial.println("#Start Buffer");
|
||||
delay(2000);
|
||||
Serial.println("#Buffer Completed");
|
||||
}
|
||||
|
||||
while (Serial.available() == 0) {} //wait for data available
|
||||
String SampleCommand = Serial.readString(); //read until timeout
|
||||
SampleCommand.trim(); // remove any \r \n whitespace at the end of the String
|
||||
if (SampleCommand == "S") {
|
||||
Serial.println("#Sample Started");
|
||||
delay(2000);
|
||||
Serial.println("#Sample Completed");
|
||||
}
|
||||
|
||||
while (Serial.available() == 0) {} //wait for data available
|
||||
String resultCommand = Serial.readString(); //read until timeout
|
||||
resultCommand.trim(); // remove any \r \n whitespace at the end of the String
|
||||
if (resultCommand == "P") {
|
||||
delay(3000);
|
||||
Serial.println("RESULT SN 18291 1937.23 2828.11 28211.20 121829.12 REND");
|
||||
delay(15000);
|
||||
}
|
||||
|
||||
// while (Serial.available() == 0) {} //wait for data available
|
||||
// String resultCommand = Serial.readString(); //read until timeout
|
||||
// resultCommand.trim(); // remove any \r \n whitespace at the end of the String
|
||||
// if (resultCommand == "B") {
|
||||
// delay(3000);
|
||||
// Serial.println("ERROR 500 REND");
|
||||
// delay(15000);
|
||||
// }
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
module.exports = {
|
||||
testEnvironment: 'jsdom',
|
||||
setupFilesAfterEnv: ['@testing-library/jest-dom/extend-expect'],
|
||||
transform: {
|
||||
"^.+\\.jsx?$": "babel-jest",
|
||||
'^.+\\.mjs': 'babel-jest',
|
||||
},
|
||||
transformIgnorePatterns: [
|
||||
'/node_modules/',
|
||||
'node_modules/(?!(d3|other-module-to-transform)/)',
|
||||
'\\.css$',
|
||||
],
|
||||
moduleNameMapper: {
|
||||
'\\.(svg)$': '<rootDir>/__mocks__/svgMock.js',
|
||||
'\\.(css|less|sass|scss)$': '<rootDir>/__mocks__/styleMock.js',
|
||||
'^d3$': '<rootDir>/node_modules/d3/src/index.js',
|
||||
},
|
||||
};
|
||||
|
||||
74
nats.js
@@ -1,74 +0,0 @@
|
||||
// const nats = require('nats');
|
||||
// const fs = require('fs');
|
||||
|
||||
// const privateKey = fs.readFileSync('clientCertificate/client-key.pem');
|
||||
// const certificate = fs.readFileSync('clientCertificate/client-cert.pem');
|
||||
|
||||
// const nc = nats.connect({
|
||||
// servers: ['nats://nanodgx.in:4222'],
|
||||
// token: 'SUADA3R4HRQG5ZEGR7E65P5P2JUQ2LMVLEOGJWEIKLEYOZEPQES2WHW2KU',
|
||||
// tls: {
|
||||
// key: privateKey,
|
||||
// cert: certificate,
|
||||
// },
|
||||
// connect: function() {
|
||||
// console.log('Connected to NATS server');
|
||||
|
||||
// // Subscribe to a subject
|
||||
// const subscription = nc.subscribe('your-subject');
|
||||
|
||||
// // Listen for incoming messages
|
||||
// subscription.on('message', function(msg) {
|
||||
// console.log(`Received message: ${msg.getData()}`);
|
||||
// });
|
||||
|
||||
// // Publish a message
|
||||
// nc.publish('your-subject', 'Hello NATS!');
|
||||
// },
|
||||
// error: function(err) {
|
||||
// console.error(`Error connecting to NATS server: ${err}`);
|
||||
// },
|
||||
// close: function() {
|
||||
// console.log('Connection to NATS server closed');
|
||||
// },
|
||||
// });
|
||||
|
||||
|
||||
const NATS = require('nats');
|
||||
const sc = NATS.StringCodec();
|
||||
const seed = new TextEncoder().encode(
|
||||
"SUACFBL4SJNFOYVB6F4AHK7A7VCHDENCKVLKJTTKAH3I47BOTSOE3Z2K7M",
|
||||
);
|
||||
const servers = [
|
||||
{
|
||||
servers: "nats://nanodgx.in:4222",
|
||||
|
||||
authenticator: NATS.nkeyAuthenticator(seed),
|
||||
tls: {
|
||||
keyFile: "certificate_path/client-key.pem",
|
||||
certFile: "certificate_path/client-cert.pem",
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
servers.forEach(async (v) => {
|
||||
try {
|
||||
// console.log(v);
|
||||
const nc = await NATS.connect(v);
|
||||
|
||||
// Subscribe to a subject
|
||||
const subscription = await nc.subscribe("server.hpos.HCV-000-3998.ping");
|
||||
/*
|
||||
(async () => {
|
||||
for await (const msg of subscription) {
|
||||
console.log(`Received message: ${sc.decode(msg.data)}`);
|
||||
// Your custom logic for handling the incoming message goes here
|
||||
}
|
||||
})();
|
||||
*/
|
||||
nc.publish("server.hpos.HCV-000-3998.ping", "ALIVE");
|
||||
|
||||
} catch (err) {
|
||||
console.log(`error connecting to ${JSON.stringify(v)} ${err}`);
|
||||
}
|
||||
});
|
||||
16509
package-lock.json
generated
28
package.json
@@ -3,11 +3,6 @@
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@emotion/react": "^11.11.1",
|
||||
"@emotion/styled": "^11.11.0",
|
||||
"@mui/icons-material": "^5.14.1",
|
||||
"@mui/material": "^5.14.2",
|
||||
"@reduxjs/toolkit": "^1.9.5",
|
||||
"@testing-library/jest-dom": "^5.16.5",
|
||||
"@testing-library/react": "^13.4.0",
|
||||
"@testing-library/user-event": "^13.5.0",
|
||||
@@ -15,26 +10,18 @@
|
||||
"d3": "^7.8.5",
|
||||
"d3-selection": "^3.0.0",
|
||||
"firebase": "^9.23.0",
|
||||
"katex": "^0.16.9",
|
||||
"lodash": "^4.17.21",
|
||||
"ml-savitzky-golay-generalized": "^4.0.1",
|
||||
"moment": "^2.29.4",
|
||||
"nats": "^2.19.0",
|
||||
"react": "^18.2.0",
|
||||
"react-datepicker": "^4.16.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"react-dropdown": "^1.11.0",
|
||||
"react-flip-numbers": "^3.0.8",
|
||||
"react-icons": "^4.10.1",
|
||||
"react-katex": "^3.0.1",
|
||||
"react-markdown": "^9.0.1",
|
||||
"react-mathjax": "^1.0.1",
|
||||
"react-redux": "^8.1.2",
|
||||
"react-odometerjs": "^3.1.0",
|
||||
"react-router-dom": "^6.14.2",
|
||||
"react-scripts": "5.0.1",
|
||||
"react-select": "^5.7.4",
|
||||
"remark-gfm": "^4.0.0",
|
||||
"remark-math": "^6.0.0",
|
||||
"topojson-client": "^3.1.0",
|
||||
"web-vitals": "^2.1.4"
|
||||
},
|
||||
@@ -44,8 +31,7 @@
|
||||
"test": "react-scripts test",
|
||||
"eject": "react-scripts eject",
|
||||
"deploy": "npm run build && firebase deploy",
|
||||
"coverage": "react-scripts test --coverage",
|
||||
"test-ci": "jest --testPathIgnorePatterns=src/tests/ --passWithNoTests --ci --bail"
|
||||
"coverage": "react-scripts test --coverage"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"extends": [
|
||||
@@ -64,15 +50,5 @@
|
||||
"last 1 firefox version",
|
||||
"last 1 safari version"
|
||||
]
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.23.7",
|
||||
"@babel/preset-env": "^7.23.8",
|
||||
"@babel/preset-react": "^7.23.3",
|
||||
"@babel/preset-typescript": "^7.23.3",
|
||||
"csv-parser": "^3.0.0",
|
||||
"html-pdf-node": "^1.0.8",
|
||||
"jest-environment-jsdom": "^29.7.0",
|
||||
"ts-jest": "^29.1.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,11 +25,6 @@
|
||||
Learn how to configure a non-root public URL by running `npm run build`.
|
||||
-->
|
||||
<title>HPOS Sickle Cell Test Dashboard</title>
|
||||
<script
|
||||
type="text/javascript"
|
||||
async
|
||||
src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS_HTML-full"
|
||||
></script>
|
||||
</head>
|
||||
<body>
|
||||
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||
|
||||
BIN
scripts/224321944144PADGMC.pdf
Normal file
100
scripts/226183001745JAHGMC.pdf
Normal file
62
scripts/UserCollection.py
Normal file
@@ -0,0 +1,62 @@
|
||||
import os
|
||||
import firebase_admin
|
||||
from IPython.core.display import Image
|
||||
from IPython.core.display_functions import display
|
||||
from firebase_admin import credentials
|
||||
from firebase_admin import firestore
|
||||
import pandas as pd
|
||||
import datetime
|
||||
|
||||
|
||||
# Initialize Firebase Admin SDK
|
||||
cred = credentials.Certificate(r'C:\Users\smila\PycharmProjects\pythonProject\hpos-prod-firebase-adminsdk-bionp-5486f7becd.json') # Replace with your own service account key path
|
||||
|
||||
firebase_admin.initialize_app(cred)
|
||||
|
||||
# Get a reference to the Firestore database
|
||||
db = firestore.client()
|
||||
|
||||
# Specify the collections
|
||||
patient_collection = db.collection("patientData")
|
||||
test_collection = db.collection("testData")
|
||||
start_date = input("Please enter the start date (yyyy-mm-dd): ")
|
||||
end_date = input("Please enter the end date (yyyy-mm-dd): ")
|
||||
|
||||
query = patient_collection.where("createdAt", ">=", start_date).where("createdAt", "<", end_date)
|
||||
patient_docs = query.stream()
|
||||
|
||||
# Prepare data to store in CSV
|
||||
data = []
|
||||
for patient_doc in patient_docs:
|
||||
patient_data = patient_doc.to_dict()
|
||||
patient_id = patient_data["_id"]
|
||||
|
||||
# Query the document from testData collection based on the common _id
|
||||
test_docs = test_collection.where("_id", "==", patient_id).stream()
|
||||
|
||||
for test_doc in test_docs:
|
||||
test_data = test_doc.to_dict()
|
||||
|
||||
# Combine the data from both collections into a single dictionary
|
||||
combined_data = {**patient_data, **test_data}
|
||||
|
||||
# Skip if the csvPath is not a valid URL
|
||||
|
||||
data.append(combined_data)
|
||||
|
||||
# Convert the data to a DataFrame
|
||||
df = pd.DataFrame(data)
|
||||
print(df.size)
|
||||
|
||||
# Save the DataFrame to a CSV file
|
||||
output_filename = "data.csv"
|
||||
df.to_csv(output_filename, index=False)
|
||||
|
||||
downloads_dir = os.path.join(os.path.expanduser("~"), "Downloads")
|
||||
output_path = os.path.join(downloads_dir, output_filename)
|
||||
df.to_csv(output_path, index=False)
|
||||
|
||||
print(f"Data saved to '{output_path}'")
|
||||
|
||||
# Close the Firebase Admin SDK
|
||||
firebase_admin.delete_app(firebase_admin.get_app())
|
||||
129
scripts/UserImageDownload.py
Normal file
@@ -0,0 +1,129 @@
|
||||
import os
|
||||
import firebase_admin
|
||||
from firebase_admin import credentials, firestore
|
||||
import pandas as pd
|
||||
from urllib.request import urlopen
|
||||
import datetime
|
||||
import tkinter as tk
|
||||
from tkinter import filedialog
|
||||
|
||||
# Initialize Firebase Admin SDK
|
||||
cred = credentials.Certificate(r'C:\Users\smila\PycharmProjects\pythonProject\hpos-prod-firebase-adminsdk-bionp-5486f7becd.json') # Replace with your own service account key path
|
||||
firebase_admin.initialize_app(cred)
|
||||
|
||||
# Get a reference to the Firestore database
|
||||
db = firestore.client()
|
||||
|
||||
# Specify the collections
|
||||
patient_collection = db.collection("patientData")
|
||||
test_collection = db.collection("testData")
|
||||
|
||||
# Create a tkinter root window (hidden)
|
||||
root = tk.Tk()
|
||||
root.withdraw()
|
||||
|
||||
# Ask the user to select the base folder where images and data will be saved
|
||||
base_output_folder = filedialog.askdirectory(title="Select Base Output Folder")
|
||||
|
||||
# Get user-defined date ranges
|
||||
start_date = "2023-08-01"
|
||||
end_date = "2023-08-10"
|
||||
|
||||
# Parse the date range to get a list of days
|
||||
start_datetime = datetime.datetime.strptime(start_date, "%Y-%m-%d")
|
||||
end_datetime = datetime.datetime.strptime(end_date, "%Y-%m-%d")
|
||||
date_range = [start_datetime + datetime.timedelta(days=x) for x in range((end_datetime - start_datetime).days + 1)]
|
||||
|
||||
# Iterate through each day
|
||||
for date in date_range:
|
||||
current_date = date.strftime("%Y-%m-%d")
|
||||
output_folder = os.path.join(base_output_folder, current_date)
|
||||
os.makedirs(output_folder, exist_ok=True)
|
||||
|
||||
print(f"Processing data for {current_date}...")
|
||||
|
||||
# Query Firestore for patient data
|
||||
query = patient_collection.where("createdAt", ">=", current_date).where("createdAt", "<", (date + datetime.timedelta(days=1)).strftime("%Y-%m-%d"))
|
||||
patient_docs = query.stream()
|
||||
|
||||
# Initialize a list to hold the combined data
|
||||
data = []
|
||||
|
||||
# Iterate through patient documents
|
||||
for patient_doc in patient_docs:
|
||||
patient_data = patient_doc.to_dict()
|
||||
patient_id = patient_data["_id"]
|
||||
|
||||
# Query the document from testData collection based on the common _id
|
||||
test_docs = test_collection.where("_id", "==", patient_id).stream()
|
||||
|
||||
# Iterate through test documents
|
||||
for test_doc in test_docs:
|
||||
test_data = test_doc.to_dict()
|
||||
|
||||
# Combine the data from both collections into a single dictionary
|
||||
combined_data = {**patient_data, **test_data}
|
||||
|
||||
# Access specific attributes from the combined data
|
||||
csv_path = combined_data.get("csvPath", "")
|
||||
if csv_path and not csv_path.startswith("http"):
|
||||
# Perform the desired action
|
||||
print("CSV path does not start with 'http'.")
|
||||
|
||||
# Append the combined_data dictionary to the list
|
||||
data.append(combined_data)
|
||||
|
||||
# Download images separately and store them in the specified folder
|
||||
user_image_url = combined_data.get("userImageURL", "")
|
||||
if user_image_url and user_image_url.startswith("http"):
|
||||
image_data = urlopen(user_image_url).read()
|
||||
image_filename = f"{patient_id}.jpg" # Use only patient ID as the filename
|
||||
image_path = os.path.join(output_folder, image_filename)
|
||||
with open(image_path, "wb") as image_file:
|
||||
image_file.write(image_data)
|
||||
|
||||
# Convert the data to a DataFrame
|
||||
df = pd.DataFrame(data)
|
||||
|
||||
# Rename columns
|
||||
df.rename(columns={
|
||||
"name": "Name",
|
||||
"abhaId": "ABHA ID",
|
||||
"birthYear": "Age",
|
||||
"gender": "Gender",
|
||||
"category": "Category",
|
||||
"maritalStatus": "Marital Status",
|
||||
"careOf": "Care-of",
|
||||
"city": "Address",
|
||||
"district": "District",
|
||||
"state": "State",
|
||||
"pinCode": "Pincode",
|
||||
"phoneNumber": "Mobile Number",
|
||||
"bloodGroup": "Blood group",
|
||||
"result": "Test Result"
|
||||
}, inplace=True)
|
||||
|
||||
# Select specific columns
|
||||
selected_columns = [
|
||||
"Name", "ABHA ID", "Age", "Gender", "Category", "Marital Status",
|
||||
"Care-of", "Address", "District", "State", "Pincode", "Mobile Number",
|
||||
"Blood group", "Test Result"
|
||||
]
|
||||
|
||||
# Check if selected columns are present in the DataFrame
|
||||
missing_columns = [col for col in selected_columns if col not in df.columns]
|
||||
if missing_columns:
|
||||
print(f"Missing columns: {missing_columns}")
|
||||
else:
|
||||
# Create a new DataFrame with selected columns
|
||||
df = df[selected_columns]
|
||||
|
||||
# Save the DataFrame to a CSV file
|
||||
output_filename = f"data_{current_date}.csv"
|
||||
output_path = os.path.join(output_folder, output_filename)
|
||||
df.to_csv(output_path, index=False)
|
||||
|
||||
print(f"Data and images for {current_date} saved to '{output_folder}'")
|
||||
|
||||
# Close the Firebase Admin SDK
|
||||
firebase_admin.delete_app(firebase_admin.get_app())
|
||||
219
scripts/data/result.csv
Normal file
@@ -0,0 +1,219 @@
|
||||
Sample No.,Name,Aadhar ID,ABHA ID,_id,Age,Gender,Category,Marital Status,Care-of,Address,District,State,Pincode,Mobile Number,Blood Group,Test Right device 5 ratio,Denovix Ratio,Test Result,testTime,sickleCellHistory
|
||||
7,Yogesh Kanchanlal Choure,203986612834,91623848874425,203986612834YOGGMC,29,MALE,mahar,Single,kanchan lal ,"C/O Mahendra Dongre Plot No 40 Jaitala Road Near Rahi Hall Janhit Co-Op Soc, Zade Layout Nagpur",Nagpur,MAHARASHTRA,440036,7620241967,,0.1864,0.0959,Normal (HbA),22-07-2023 11:45,
|
||||
124,Parag Pramod Diwate,208937728105,71420673838565,208937728105PARGMC,21,MALE,kunbi ,Single,pramod diwate ,"C/O Kisanrao Diwate Ghar No. 195 New Shukrawari Road Near Gandhi Shala New Shukrawari, Mahal Mahal S.O",NAGPUR,MAHARASHTRA,440032,9370866090,,0.4147,0.1554,Inconclusive,25-07-2023 11:38,
|
||||
47,Sandip Ramrao Mahure,210547712613,91403684150424,210547712613SANGMC,27,MALE,dhangar,Single,ram rao,C/O Ramrao Mahure At Po Pahungoan Tah Pauni Dist Bhandara Pahungaon,BHANDARA,MAHARASHTRA,441910,9172942525,A+ve,0.2608,0.118,Normal (HbA),22-07-2023 10:39,
|
||||
193,Arpit Nath,215423576300,91377506662123,215423576300ARPGMC,18,MALE,,Single,sukumar nath ,C/O Sukmar Nath 15 Meera nagar E-6 Arera Colony Huzur,nagpur,Maharashtra ,441102,9926310912,O+ve,0.615,0.2318,Inconclusive,19-07-2023 11:18,
|
||||
66,Monali Sureshrao Vaidya,220257248283,91636562654245,220257248283MONGMC,31,FEMALE,,Single,suresh mansaramji vaidya, behind daulatsing vidyalaya vidya vihar colony pipari meghe wardha Pipri,Wardha,MAHARASHTRA,440221,8767775652,O+ve,0.2826,0.1235,Normal (HbA),18-07-2023 12:17,
|
||||
145,Pratik Vijay Rangari,224218333792,91288115824766,224218333792PRAGMC,33,MALE,mahar,Single,Vijay , PLOT NO 22/A NILGRUH SOCIETY JAITALA ROAD MALAPURE LAYOUT NAGPUR Nagpur (Urban),Nagpur,MAHARASHTRA,440036,9604758900,,0.4794,0.1738,Sickle Cell Trait (HbAS),22-07-2023 11:41,
|
||||
165,Namrta Shrikrushan Dhone,224611407212,91614815065808,224611407212NAMGMC,32,FEMALE,mahar,Married,Krishna ,C/O Shrikrushan Dhone Mu po Ramthi Tah Narkhed Ramthi,Nagpur,MAHARASHTRA,440027,9356445464,,0.5215,0.1884,Sickle Cell Trait (HbAS),25-07-2023 10:39,
|
||||
152,Prafulla Niranjan Thorat,225065546079,91652426707012,225065546079PRAGMC,26,MALE,Buddhists ,Single,Niranjan Thorat ,C/O Niranjan Thorat Jasapur Bhatkuli,Amravati,MAHARASHTRA,444602,7378909926,B+ve,0.4894,0.1771,Sickle Cell Trait (HbAS),21-07-2023 11:19,
|
||||
107,Prachi Krushnaji Anjankar,232034355701,91385177656621,232034355701PRAGMC,18,FEMALE,mali,Single,krushanaji anjankar ,"C/O D/O Krushnaji Anjankar ward no. 2, house no. 387 Behind Hanuman Mandir Lonkhairi",Nagpur,MAHARASHTRA,441111,9545811381,,0.3537,0.1405,Inconclusive,26-07-2023 10:35,
|
||||
207,Raj Lalit Vitole,236152092688,91354238446349,236152092688RAJGMC,10,MALE,fulmali,Single,lalit vitoe,C/O : N.M.C Ram Nagar Marathi Girls School Near Ram Mandir Ram Nagar Shankar Nagar,Nagpur,MAHARASHTRA,440010,7709100411,,0.6719,0.268,Sickle cell Disease (HbSS),26-07-2023 13:51,Lalit vitole AS pattern 7709100411
|
||||
40,Sagar Sahebrao Gangurde,236855835504,91178542875335,236855835504SAGGMC,22,MALE,,Single,sahebrao gangurde,C/O Sahebrao Vitthal Gangurde sakorepada Sakore,Nashik,MAHARASHTRA,423501,8378897855,B+ve,0.2364,0.1113,Normal (HbA),20-07-2023 14:06,
|
||||
94,Shivani Prakash Dhurve,240636077483,44881100866756,240636077483SHIGMC,25,FEMALE,gond,Single,prakash dhurve,"C/O D/O Prakash Dhurve kavadas,patansavangi,word no-3 at-po-patansavangi,ta-savner Patansavangi",NAGPUR,MAHARASHTRA,441113,8378876953,B+ve,0.3299,0.1349,Normal (HbA),24-07-2023 11:22,
|
||||
34,Dinesh Sheshrao Badwaik,248277393938,91385308532253,248277393938DINGMC,36,MALE,,Single,sheshrao , Near Hanuman Mandir Rambag Colony Ajni,#NAME?,KARNATAKA,440003,8668348590,B+ve,0.2271,0.1087,Normal (HbA),20-07-2023 11:14,
|
||||
211,Harshal Madhukar Rodge,251385655953,91551260601853,251385655953HARGMC,22,MALE,,Single,madhukar rodge, ward no.01 mu.Post.jivnapur Jiwanapur,Nagpur,MAHARASHTRA,441210,9370675745,B+ve,0.679,0.2731,Sickle cell Disease (HbSS),18-07-2023 10:52,uncle
|
||||
106,Suraj Manraj Atram,256564101722,91514156376204,256564101722SURGMC,20,MALE,aadivasi,Single,manraj,"C/O Manraj Atram At. Kohla, Post. Pipara, Tah. Umred Kohla",Nagpur,MAHARASHTRA,441108,8262814092,,0.3534,0.1404,Inconclusive,22-07-2023 12:13,
|
||||
114,Pranuti Suresh Sonsare,261435672727,91563526850703,261435672727PRAGMC,14,FEMALE,,Single,Suresh sonsare ,"C/O D/O: Suyesh Sonsare plot no. 40 sarwshri nagar ,umred road hatwar ration dukan dighori Hanuman Nagar",Nagpur,MAHARASHTRA,441204,9284317488,AB+ve,0.3755,0.1457,Inconclusive,19-07-2023 13:20,
|
||||
131,Tanuja Prakashchandra Yele,261512400931,91143515883476,261512400931TANGMC,22,FEMALE,powar ,Single,Parkashchandra yele,C/O D/O: Tanuja Prakashchandra Yele gumadhawada Gumadhawada,Gondiya,MAHARASHTRA,441911,7820885790,,0.4425,0.1628,Inconclusive,21-07-2023 11:07,
|
||||
56,rohan ramesh narule,262819245799,91587003274020,262819245799ROHGMC,27,Male,,Single,ramesh narule,"s/o ramesh narule near dharamraj school dhammanand nagar pili nadi , Uppalawadi nagpur",nagpur,Maharashtra,440026,8007034845,O+ve,0.2701,0.1204,Normal (HbA),19-07-2023 11:15,
|
||||
5,Suhani Mukunda Gajbhiye,266861946497,91423327336065,266861946497SUHGMC,17,FEMALE,,Single,mukunda,C/O D/O Mukunda Gajbhiye NEAR POHARKAR KIRANA STORS JAGDISH NAGAR KATOL ROAD,Nagpur,MAHARASHTRA,440013,9579257972,O-ve,0.1806,0.0939,Normal (HbA),20-07-2023 11:00,
|
||||
213,Heena Pradip Lonare,270722892447,91541045221671,270722892447HEEGMC,19,FEMALE,mahar ,Single,pradip,C/O Tikaram Meshram House No. 1128B/616 K.D.K. College Road Ambedkar Chowk Nandanvan Zopadpatti Nagpur,Nagpur,MAHARASHTRA,440024,7517769583,,0.726,0.3111,Sickle cell Disease (HbSS),25-07-2023 13:22,pradip :F
|
||||
177,Jaya Movade,271991172310,91704508113427,271991172310JAYGMC,23,FEMALE,kunbi ,Single,gopal mowade ,C/O D/O: Gopalji Movade ward no. 15 mu. kabar pipla tah sausar Kabarpipla,Chhindwara,Madhya Pradesh,480108,9302742959,,0.5702,0.2089,Inconclusive,21-07-2023 10:50,
|
||||
140,Chaitali Mahendra Tambe,273695959825,91135318140252,273695959825CHAGMC,21,FEMALE,Hindu ,Single,Mahendra ,C/O D/O: Mahendra Tambe near anusaya mandir butibori Bori,Nagpur,MAHARASHTRA,441108,9623735881,AB+ve,0.4635,0.1689,Inconclusive,25-07-2023 11:30,
|
||||
184,Taranya Vijay Markam,281376469920,91155441810670,281376469920TARGMC,11,FEMALE,,Single,Vijay markam,C/O : Kanta Raut Plot No. 1 IT Park Road Behind Gayatri Mandir Lokhande Nagar Ranapratap Nagar,Nagpur,MAHARASHTRA,440022,7620933159,B+ve,0.5935,0.2202,Inconclusive,18-07-2023 10:54,"bhagyashree markam (mother)age 43 , juhi markam (sister) age 24"
|
||||
113,Mahendra Wasudev Bawankar,290033869037,91360068085172,290033869037MAHGMC,34,MALE,Teli,Married,wasudev bawankar,C/O Mahendra Wasudev Bawankar mu.garada Garada,Gondiya,MAHARASHTRA,441001,8007879455,,0.3731,0.1451,Inconclusive,24-07-2023 10:16,
|
||||
122,Sonam Dinesh Gupta,293908356872,91474378850454,293908356872SONGMC,21,FEMALE,Pardeshi,Single,Dinesh gupta,C/O D/O: Dinesh Gupta YASHWANT STADIUM DHANTOLI Patwardhan Ground,Nagpur,MAHARASHTRA,440012,8669778863,,0.4019,0.1521,Inconclusive,24-07-2023 10:44,
|
||||
133,Sayyam Rajendra Mate,295115060017,91773467438877,295115060017SAYGMC,12,MALE,,Single,Rajendra mate,C/O Rajendra Mate mhasli Mhasli,Nagpur,MAHARASHTRA,441202,7387457568,B+ve,0.4469,0.1641,Inconclusive,19-07-2023 11:57,Father
|
||||
187,Jamnotri Chouhan,300726681624,91353187841674,300726681624JAMGMC,22,FEMALE,rajput,Single,bharatsingh, Qtr No. 662 Mediical Qtr GMC Medical Campus Hanuman Nagar,#NAME?,#NAME?,440003,7083642002,A+ve,0.599,0.2231,Inconclusive,21-07-2023 12:16,
|
||||
44,Dhanashri Satishrao Dhurai,300927118299,91581435735823,300927118299DHAGMC,21,FEMALE,,Single,Satish dhurai ,C/O D/O Satishrao Dhurai near chhoti gad payri bhagatsingh ward Ramtek,Nagpur,MAHARASHTRA,441106,8855968742,A+ve,0.2537,0.1161,Normal (HbA),19-07-2023 13:51,
|
||||
29,Saurabh Pramod Wankhede,303806120289,91731718170616,303806120289SAUGMC,24,MALE,sc,Single,pramod,C/O Pramod Wankhede Manewada Besa Road Near Boudha Vihar Kapil Nagar Besa,Nagpur,MAHARASHTRA,440034,9172338439,A+ve,0.2209,0.1069,Normal (HbA),22-07-2023 10:21,
|
||||
25,Rohit Shravanrao Alone,304447045628,91648248476042,304447045628ROHGMC,22,MALE,bhat,Single,shravanrao alone ,"C/O : Ashok Bawane Plot No. 158 Umred Road Near Hanuman Mandir Manav Shakti Gruhanirman Society, Dighori Naka No. 7 Hanuman Nagar",Nagpur,MAHARASHTRA,440009,9307041214,,0.2153,0.1052,Normal (HbA),22-07-2023 12:52,
|
||||
35,Adarsh Kavdu Larokar,304883348213,34815238814702,304883348213ADAGMC,24,MALE,khatik,Single,kawdu larokar, S/O KAVDU LAROKAR 297 KHATIKPURA MACHHISATH MUTTON MARKET TIN NAL CHOWK ITWARI Nagpur City,NAGPUR,MAHARASHTRA,440002,9766557572,B+ve,0.2271,0.1087,Normal (HbA),22-07-2023 10:29,
|
||||
204,Aniruddha Pralhad Waghmare,307289914993,60786156505100,307289914993ANIGMC,22,MALE,mahar ,Single,pralhad waghmare ,C/O Pralhad Waghmare indira nagar jatat rodi no 3 b/h ramesh kirana STORS Ajni,NAGPUR,MAHARASHTRA,440003,7020034226,,0.649,0.2524,Sickle cell Disease (HbSS),25-07-2023 11:25,shila waghmare 9561602332
|
||||
101,Divakar Aahake,317888402317,30088647358331,317888402317DIVGMC,34,MALE,st,Married,kashiram,C/O Kashiram Aahake ward no 3 gram Khutamba post Aamladepo Tehsil sausar Amla F.V.,Chhindwara,Madhya Pradesh,480106,9644316266,,0.3457,0.1386,Normal (HbA),24-07-2023 13:33,"sagunabai aahakey ( mother) , Vandana aahakey ( wife)"
|
||||
196,Suraj Rameshwar Gadling,320550327487,42426287243155,320550327487SURGMC,37,MALE,,Married,rameshwar gadling ,"C/O Rameshwar Gadling Near Suraj Kirana store Ghar No.169/A/100, Indira nagar, Jatatarodi Ajni S.O",NAGPUR,MAHARASHTRA,440003,7709106467,O+ve,0.6196,0.2344,Inconclusive,19-07-2023 12:57,kanta gadling (mother)age 60
|
||||
173,Payal Sheshrao Bhimte,323854818047,91517703077266,323854818047PAYGMC,23,FEMALE,,Single,sheshrao bhimte,C/O D/O Shesharav Bhimte hari om kirana stor jwal 225 raut nagar umred road dighori Adegaon,Nagpur,MAHARASHTRA,440034,9075524167,B+ve,0.5535,0.2014,Inconclusive,18-07-2023 11:05,
|
||||
163,Sunanda sonsare ,331175211385,91763261421831,331175211385SUNGMC,42,Female,,Married,Sureshji sonsare ,"45 k k developer , umread road bahadura Nagpur ",NAGPUR ,Maharashtra ,441204,9607753850,A+ve,0.5207,0.1881,Sickle Cell Trait (HbAS),19-07-2023 13:10,
|
||||
126,Sanket Manohar Rasekar,334381433308,75588776350856,334381433308SANGMC,25,MALE,kunbi,Single,manohar,"C/O Natthuji Kolhe GANDHI KANYA ROAD NEW SHUKRAWARI, GADIKHANA Mahal S.O",#NAME?,#NAME?,440032,7709723090,,0.43,0.1594,Inconclusive,25-07-2023 11:46,
|
||||
148,Lavkit Manraj Surpam,338035943530,91671726251570,338035943530LAVGMC,23,MALE,,Single,manraj,C/O Manraj Surpam KOHALA KOHALA Kohla,Nagpur,MAHARASHTRA,441108,8080231809,O+ve,0.4812,0.1744,Sickle Cell Trait (HbAS),20-07-2023 11:31,manraj surpam (Father) ss pattern
|
||||
22,Shivam Raghunath Yewale,338225111489,91304875026128,338225111489SHIGMC,17,MALE,kunbi,Single,raghunath yewale ,"C/O Raghunath Yewale ZENDA CHOWK,BESIDE N.M.C HOSPITAL HOUSE NO-737,ZINGABAI TAKLI Mankapur S.O",Nagpur,MAHARASHTRA,440006,9284969427,,0.2112,0.1039,Normal (HbA),24-07-2023 13:22,
|
||||
71,Karan Devendra Bhalavi,339468601438,91287557703637,339468601438KARGMC,19,MALE,gondhi,Single,Devendra bhalavi,C/O Devendra Bhalavi NEAR police chauki RAMDASPETH Shankar Nagar,Nagpur,MAHARASHTRA,440010,7821863823,,0.2904,0.1255,Normal (HbA),24-07-2023 13:41,
|
||||
138,Rajat Yadav Ramteke,348941978528,91451681445446,348941978528RAJGMC,29,MALE,mahar,Single,yadav maniram ramteke , 194 NEAR ALOK BAUDDHA VIHAR JUNA BAGADGANJ nagpur,Nagpur,MAHARASHTRA,440008,8999723156,O+ve,0.4584,0.1674,Inconclusive,21-07-2023 11:33,
|
||||
142,Rita Gowardhan Sakure,349918148748,91681724868051,349918148748RITGMC,33,FEMALE,,Married,govardhan sakure, plot 105 Manewada Ring road Near Prerna Convent New Amar Nagar Manewada Parvati Nagar,Nagpur,MAHARASHTRA,440027,7709592984,O+ve,0.4687,0.1705,Sickle Cell Trait (HbAS),18-07-2023 11:41,
|
||||
171,Ravichandra Pramod Muneshwar,352405884025,91511212402016,352405884025RAVGMC,25,MALE,,Single,pramod," bakane layout , ward no 1 Deoli",Wardha,MAHARASHTRA,442101,7517583179,A+ve,0.547,0.1986,Sickle Cell Trait (HbAS),14-07-2023 13:13,mother name : nanda mb no: 8329830890
|
||||
50,Prashant Rambhauji Kavde,352620541105,91317642528309,352620541105PRAGMC,34,MALE,,Single,Rambhauji kavde ,C/O Rambhauji Kavde chichghat Pardi,Wardha,MAHARASHTRA,442301,9689969951,A-ve,0.2646,0.119,Normal (HbA),18-07-2023 12:11,
|
||||
8,Krushik Gangaram Pawar,353546842014,91238243437031,353546842014KRUGMC,23,MALE,,Single,gangaram,C/O : Lahudas Somkuwar Plot No 273 Near BSNL Office Jagjiwanram Nagar Bhandewadi,Nagpur,MAHARASHTRA,440008,7218112996,B+ve,0.1881,0.0965,Normal (HbA),20-07-2023 11:28,
|
||||
51,Usha Ashish Meshram,361309473890,91716158774118,361309473890USHGMC,28,FEMALE,,Married,ashish meshram ,C/O : Ashish Meshram kundanlal gupta nagar buddha vihar Nagpur City,Nagpur,MAHARASHTRA,440002,8390206642,B+ve,0.2658,0.1193,Normal (HbA),20-07-2023 14:00,
|
||||
9,Aditya Anil Meshram,362838010356,91744875650775,362838010356ADIGMC,23,MALE,mahar ,Single,Anil meshram ," Plot N.21,H.N.3266 Near Kushinara Buddha Vihar New Kailasha Nagar Bhagwan Nagar",Nagpur,MAHARASHTRA,440027,9767093130,O+ve,0.193,0.0981,Normal (HbA),22-07-2023 09:51,
|
||||
45,Shivlal Batti,375993866028,91310836436744,375993866028SHIGMC,19,MALE,,Single,munnu,C/O Munnu Batti Ward N--07 Damua Mal Damua,#NAME?,#NAME?,480441,8959181696,A+ve,0.2551,0.1165,Normal (HbA),19-07-2023 11:48,
|
||||
159,Gaurav Anil Kaikade,380000668093,91176155701806,380000668093GAUGMC,17,MALE,,Single,anil kaikade,C/O Anil Kaikade Plot No. 17 Near Manbhav Pant Mandir Vijayalaxmi Pandit Nagar Hanuman Nagar,Nagpur,MAHARASHTRA,440009,9765771868,A+ve,0.5088,0.1838,Sickle Cell Trait (HbAS),19-07-2023 10:57,"varsha kaikade , 39/f, nagpur, (AS) ( mother ) "
|
||||
179,sujata patil ,383542775017,91628242000717,383542775017SUJGMC,37,Other,,Married,Amar patil ,01 jaybhim nagar Nagpur ,NAGPUR ,Maharashtra ,441106,8805056416,B+ve,0.5744,0.2108,Inconclusive,19-07-2023 11:04,
|
||||
97,Sunita Bipin Bangade,399734067075,91255707582177,399734067075SUNGMC,39,FEMALE,teli ,Married,Bipin bangade,C/O W/O: Bipin Bangade At-Post-Parvati Nagar Parvati Nagar,Nagpur,MAHARASHTRA,440027,9637440543,,0.3361,0.1364,Normal (HbA),24-07-2023 12:18,
|
||||
83,Swapnil Rajeshwar Motalwar,402131951644,91534084067600,402131951644SWAGMC,40,MALE,Beldar,Married,rajeshwar motalwar,C/O Rajeshwar Motalwar plot no.498/05 near shiv mandir chandan nagar Hanuman Nagar,Nagpur,MAHARASHTRA,440009,8329883744,A+ve,0.3051,0.129,Normal (HbA),22-07-2023 09:59,
|
||||
93,Pawan Vijay Ginnare,406979678757,91280610037754,406979678757PAWGMC,23,MALE,bhavsar,Single,Vijay ginnare,"C/O Vijay Ginnare 128 Kumbhartoli Chowk Juna Bagadganj, Bajrang Nagar Bhandewadi",Nagpur,MAHARASHTRA,440008,7709644160,,0.3275,0.1343,Normal (HbA),24-07-2023 13:26,
|
||||
91,Premchand Chandrakant Kumbhare,407895809526,91517308425670,407895809526PREGMC,33,MALE,costi,Single,chandrakant kumbhare ,"C/O Chandrakant Kumbhare BEHIND PANCHSHEEL VIDYALAYA P.N.807,BALA BHAU PETH,BAPUKUTI NAGAR Dr.Ambedkar Marg S.O",Nagpur,MAHARASHTRA,440017,8459333800,O+ve,0.3223,0.1331,Normal (HbA),24-07-2023 11:56,
|
||||
149,Dinesh Chintamanji Dodke,409322281980,91423706206566,409322281980DINGMC,39,MALE,mang ,Married,chitamanji dodke," House 97 Amravati Road Near Avdhoot Ata Chakki Heti , 8th mile , Dawlameti Nagpur (Urban)",Nagpur,MAHARASHTRA,440023,7620441989,,0.4839,0.1753,Sickle Cell Trait (HbAS),21-07-2023 10:44,
|
||||
110,Vaishali Santosh Bagde,411806169311,91113882174262,411806169311VAIGMC,22,FEMALE,mahar,Single,Santosh bagde,"C/O D/O Santosh Bagde near narendra sawaji bhojanalay 88, gurudeo nagar,hudkeshwar road Ayodhya Nagar S.O",Nagpur,MAHARASHTRA,440024,7558230604,B+ve,0.3614,0.1423,Inconclusive,25-07-2023 10:22,
|
||||
98,Pratik Sahebrao Umare,413378207996,75845328112089,413378207996PRAGMC,21,MALE,Buddha ,Married,sahebrao umare ,C/O Sahebarao Umare kinhi Kinhi,yavatmal ,Maharashtra ,445306,7887973520,,0.3376,0.1367,Normal (HbA),21-07-2023 10:58,
|
||||
12,Shivam Sanjay Chourasia,414109196042,91472032745326,414109196042SHIGMC,22,MALE,,Single,Sanjay chourasia ,C/O Sanjay Chourasiya CHOURASIYA HOTEL CHOWK OPP. SUVIDHA LODGE KHALASI LINE MOHAN NAGAR Nagpur (Urban),Nagpur,MAHARASHTRA,440001,9175860682,O+ve,0.1951,0.0988,Normal (HbA),20-07-2023 12:34,
|
||||
203,Shweta Vijay Tekam,415802529942,91618863285630,415802529942SHWGMC,29,FEMALE,,Married,Vijay , House No 299 Near sharda Mata Mandir Takiya Dhantoli Nagpur,Nagpur,MAHARASHTRA,440012,8669751942,A+ve,0.6454,0.2501,Sickle cell Disease (HbSS),19-07-2023 10:37,"gaura Vijay tekam 42 /f , ( AS ) Vijay tekam , 61/m ( AS ) , Nagpur "
|
||||
77,Rina Rajesh Kumbhare,417687247525,91500481223278,417687247525RINGMC,31,FEMALE,,Married,Rajesh kumbhare,C/O : Rajesh Laxman Kumbhare H.N 61 Ward No.1 Near Gram Panchayat Bhowari Bhowari,Nagpur,MAHARASHTRA,441104,9579516122,B+ve,0.2958,0.1268,Normal (HbA),18-07-2023 13:27,
|
||||
41,Mandar Ratnakar Kawale,423160089593,91553642455784,423160089593MANGMC,19,MALE,sonar,Single,ratnakar kawale,C/O Ratnakar Deoraoji Kawale near gajanan maharaj mandir waard no.5 laxmi nagar at.po.th.mauda Mauda,Nagpur,MAHARASHTRA,441104,9420221535,,0.2406,0.1125,Normal (HbA),25-07-2023 13:15,
|
||||
134,Adarsh Bhupesh Bhaisare,427882870427,91680136107447,427882870427ADAGMC,31,MALE,,Single,bhupesh bhaisare ,C/O Bhupesh Bhaisare NEAR FAMOUS LAIBRARY GAUTAM NAGAR GADDIGODAM Nagpur (Urban),Nagpur,MAHARASHTRA,440001,7218981011,A+ve,0.4495,0.1648,Inconclusive,19-07-2023 13:26,
|
||||
64,Raushan Khatun Jahagir Ansari,428367386324,37554086082438,428367386324RAUGMC,40,FEMALE,Ansari ,Married,jahagir Ansari , WARD NO.1 HARIHAR NAGAR KANDRI KANHAN TAL PARSEONI Sihora,NAGPUR,MAHARASHTRA,441401,9637175096,B+ve,0.2799,0.1229,Normal (HbA),24-07-2023 11:10,
|
||||
150,Trupti Gajanan Ingole,436950545584,91275755531447,436950545584TRUGMC,17,FEMALE,,Single,gajanan engole,C/O : Harichand Naik naik talaw bangaladesh near hanuman mandir Nagpur City,Nagpur,MAHARASHTRA,440032,8830143644,B+ve,0.4853,0.1757,Sickle Cell Trait (HbAS),18-07-2023 11:27,Ranjita gajanan engole 883043644
|
||||
69,Vanshika Ajay Khairkar,439523119226,91338683063808,439523119226VANGMC,18,FEMALE,SC,Single,ajay khaikar,C/O D/O: Ajay Khairkar Plot No.01 Galli No.01 Near NIT Garden Chandramani Nagar Parvati Nagar,Nagpur,MAHARASHTRA,440027,9545750833,,0.286,0.1244,Normal (HbA),24-07-2023 12:55,
|
||||
130,Sandip Madhukarrao Wankhede,441043890523,91714015452036,441043890523SANGMC,34,MALE,kunbi,Married,madhukar wankhede ,"C/O Madhukarrao Wankhede near thavkar kirana store plot no. 131, mini mata nagar, galli no. 5, Bhandewadi",Nagpur,MAHARASHTRA,440008,9326321466,,0.4425,0.1628,Inconclusive,22-07-2023 13:07,sonu wankhede 9322261341
|
||||
65,Ehsas Ratan Patil,443970336106,91114806507520,443970336106EHSGMC,16,FEMALE,,Single,Ratan patil,"C/O D/O Ratan Patil front of ishwar deshmukh college ghar no.-423, tana kuti, chandan nagar Hanuman Nagar S.O",Nagpur,MAHARASHTRA,440009,7558658318,O+ve,0.2814,0.1232,Normal (HbA),18-07-2023 10:41,
|
||||
39,Sachin Gangadhar Bhajabhuje,453249725047,91277431250566,453249725047SACGMC,32,MALE,tili,Married,Sachin bhajabhuje,C/O Gangadhar Bhajabhuje wasi Wasi,Nagpur,MAHARASHTRA,402107,8010262556,B+ve,0.2333,0.1105,Normal (HbA),25-07-2023 10:09,
|
||||
79,Tanmay Sachchidanand Patil,455783858620,91464664174818,455783858620TANGMC,20,MALE,mahar ,Single,sachinad patil ,C/O Sachchidanand Patil PARDESI PURA ROAD Gaddigodam gautam nagar Nagpur (Urban),Nagpur,MAHARASHTRA,440005,8080760288,,0.3008,0.128,Normal (HbA),24-07-2023 10:27,
|
||||
70,Durga Manoj Shende,459620981698,91416847780523,459620981698DURGMC,33,FEMALE,Lohar,Married,Manoj shende,C/O W/O Manoj Shende Near Primary Highschool Ashok Nagar Ner,Yavatmal ,Maharashtra ,445102,9921524052,,0.2888,0.1251,Normal (HbA),24-07-2023 12:15,
|
||||
24,Amruta Ravindra Bhoyar,460877597788,58620744415171,460877597788AMRGMC,25,FEMALE,,Single,ravindra,C/O D/O: Ravindra Bhoyar Plot No 87 Bharatwada Road Talmale Lay Out Pardi,NAGPUR,MAHARASHTRA,440035,9529596923,O+ve,0.2149,0.1051,Normal (HbA),19-07-2023 10:33,
|
||||
14,Akash Dashrath Pantavane,461481548603,70385844387373,461481548603AKAGMC,26,MALE,sc,Single,dashrath pantavane ,"C/O Dashrath Pantavane C/O Rekha Dharamji Mate Plot No. 4, Chikali Road Near Shewade Hardware Awdhoot Nagar Hudkeshwar bk.",Nagpur,Maharashtra,440034,8087796939,,0.1988,0.1,Normal (HbA),22-07-2023 12:07,
|
||||
167,Nihar Sanjeev Aglawe,463136022041,91145636022041,463136022041NIHGMC,16,MALE,,Single,sanjeev,C/O Sanjeev Aglawe PLOT NO 307 NEAR N I T GARDEN UNTKHAN DAHIPURA Hanuman Nagar,Nagpur,MAHARASHTRA,440009,8888728581,O+ve,0.5284,0.1911,Sickle Cell Trait (HbAS),20-07-2023 12:30,Father AS pattern
|
||||
137,Tushar Dinesh Bhede,464127789021,91448028757541,464127789021TUSGMC,19,MALE,,Single,DINESH ,C/O Dinesh Bhede navnat mandir jawal bhagatsing ward navin takli Bhandara,Bhandara,MAHARASHTRA,441904,7249361700,A+ve,0.4578,0.1672,Inconclusive,20-07-2023 12:22,
|
||||
104,Bhagyashri Ramesh Patil,466265959859,91207140174401,466265959859BHAGMC,20,FEMALE,SC ,Single,ramesh patil,C/O D/O: Ramesh Patil PLOT NO 15 MAA AMBE NAGAR PARDI Bhandewadi,Nagpur,MAHARASHTRA,440008,9511886322,,0.3471,0.1389,Normal (HbA),24-07-2023 10:20,
|
||||
108,Bhagyashri Vijay Markam,470615271987,91716877641242,470615271987BHAGMC,43,FEMALE,,Married,Vijay markam ,C/O : Smt. Kantabai K Raut Plot No. 01 Lokhande Nagar Parsodi Ranapratap Nagar,Nagpur,MAHARASHTRA,440022,7620933159,O+ve,0.3557,0.141,Inconclusive,18-07-2023 10:58,tarnya Vijay markam 7620933159
|
||||
63,Supriya Rajesh Ukey,471195123226,91273774142189,471195123226SUPGMC,20,FEMALE,,Single,rajesh ukey,C/O D/O Rajesh Ganpat Ukey Plot No. 26 Near Lanjewar School Saibaba Nagar Kharbi Adegaon,Nagpur,MAHARASHTRA,440034,9325657894,O+ve,0.2785,0.1225,Normal (HbA),18-07-2023 13:28,
|
||||
111,Shivani Mahesh Wasnik,471452821855,91686888822869,471452821855SHIGMC,28,FEMALE,mahar,Married,dhiraj ,C/O D/O Mahesh Wasnik NEAR BUDDHAM RAUT PLOT NO-76 RAMAKANT ROAD LAL CHOWK INDORA Bezonbagh S.O,Nagpur,MAHARASHTRA,441106,9657308384,,0.3639,0.1429,Inconclusive,22-07-2023 12:44,
|
||||
181,Lata Vilas Shende,486617024152,91328310746271,486617024152LATGMC,36,FEMALE,Diwar,Married,vilas shende,"C/O W/O Vilas Shende waard n,5 po mul tah mul Mul",chandrapur ,Maharashtra ,441224,7030182528,,0.5797,0.2134,Inconclusive,24-07-2023 12:12,Nanaji tingusle (brother)
|
||||
154,Kalpanabai Pruthviraj Patil,488108407429,91452574782713,488108407429KALGMC,37,FEMALE,,Married,pruthviraj,C/O : Pruthviraj Patil Plot no. 49 Bidgaon.,Nagpur,MAHARASHTRA,441203,9049902587,AB+ve,0.4934,0.1784,Sickle Cell Trait (HbAS),18-07-2023 11:34,"boy and girl tanushri patil ,shenhsir patil"
|
||||
67,Soniya Prakash Dhurve,494966371438,12546573528013,494966371438SONGMC,32,FEMALE,gnode,Single,"prakash dhurve
|
||||
","C/O D/O Prakash Dhurve kavadas,patansavangi,word no-3 at-po-patansavangi,ta-savner Patansavangi",NAGPUR,MAHARASHTRA,441113,9021287856,,0.2834,0.1237,Normal (HbA),24-07-2023 11:46,
|
||||
31,Amar Pancham Hirekhan,503248707508,91256223328400,503248707508AMAGMC,29,MALE,mahar,Single,panchan, Plot No 314 Milan nagar Near Chandmari Mandir Wathoda Lay Out Vathoda,Nagpur,MAHARASHTRA,440035,9075357319,,0.5737,0.2105,Inconclusive,22-07-2023 12:01,
|
||||
178,Rahul Vijay Kharkar,505426056223,91762713747165,505426056223RAHGMC,33,MALE,kunbhi,Married,Vijay , at post ghumthala tah kamptee Gumthala,Nagpur,MAHARASHTRA,441210,9307371637,,0.223,0.1075,Normal (HbA),22-07-2023 11:25,
|
||||
32,Vaibhav Vinod Sukhchain,508159976113,91444072285539,508159976113VAIGMC,25,MALE,OBC ,Single,vinod Ramdas sukhchain , Pinjar Pinjar Pinjar Ta.Barshitakli Kardu,Akola,MAHARASHTRA,444407,7028284680,,0.2057,0.1022,Normal (HbA),22-07-2023 12:21,
|
||||
15,Yogesh Girish Nirmal,509529186304,91784438125717,509529186304YOGGMC,20,MALE,chambhar,Single,Girish nirmal ,C/O Girish Nirmal bhande plot Sevadal nagar Ayodhya Nagar S.O, ,MAHARASHTRA,440024,8446858744,B+ve,0.4923,0.1781,Sickle Cell Trait (HbAS),21-07-2023 11:35,
|
||||
153,Parag Jayawant Bhamare,509661674793,10678745568023,509661674793PARGMC,34,MALE,,Married,jayawant bhamare,C/O Jayawant Bhamare mu post bazar peth pimpalner Pimpalner,Dhule,Maharashtra,424306,9370476800,AB-ve,0.1668,0.089,Normal (HbA),20-07-2023 11:37,
|
||||
26,Tanushree Gowardhan Sakure,514252542417,91621304260568,514252542417TANGMC,7,FEMALE,,Single,govardhan ,C/O D/O: Gowardhan Sakure gangabai ghat road ganesh mandir shivaji nagar Mahal,Nagpur,MAHARASHTRA,440032,7709592984,O+ve,0.2908,0.1256,Normal (HbA),18-07-2023 11:24,mother
|
||||
72,Ratnmala Rajendra Gajbhiye,518517486144,91461147733202,518517486144RATGMC,34,FEMALE,Mahar,Married,Rajendra ,C/O W/O: Rajendra Gajbhiye ward No. 3 Paradi Deshmukh Pardi (Desh),Nagpur,MAHARASHTRA,441502,7378316656,,0.3724,0.1449,Inconclusive,24-07-2023 12:20,
|
||||
112,Pratham Pravin Narel,524553947204,91728056052232,524553947204PRAGMC,21,MALE,beldar,Single,pravin neral,C/O : Vitthal Manjare plot no.9-b near jagdamba tayping shiv nagar nandanvan Hanuman Nagar,Nagpur,MAHARASHTRA,440009,7498436782,A+ve,0.6802,0.274,Sickle cell Disease (HbSS),21-07-2023 11:37,
|
||||
212,Vinod Vitthalrao Moon,529539693651,47871414834456,529539693651VINGMC,43,MALE,,Married,vitthalrao moon, 92 chandika nagar no 2 manewada besa road Parvati Nagar S.O,Nagpur,Maharashtra,440027,9604939578,B+ve,0.5906,0.2188,Inconclusive,18-07-2023 11:13,vinod vitthalrao moon 9604939578
|
||||
182,Priya Ranjanji Gaydhane,530419420624,91440108307222,530419420624PRIGMC,23,FEMALE,madi,Single,Ranjan ji ,"C/O D/O Ranjanji Gaydhane WAARD NO-03 AT-POST-MASORA,TAH-NARKHED MASORA",Nagpur,MAHARASHTRA,441306,9834736598,,0.5201,0.1879,Sickle Cell Trait (HbAS),21-07-2023 11:09,
|
||||
162,Samay Manoj Shende,536079615618,91365820568670,536079615618SAMGMC,19,MALE,mahar,Single,manoj shende,C/O Manoj Shende 3331/7A 00 Nara Ghat Road Triratna Nagar Jaripatka,Nagpur,MAHARASHTRA,440014,7796793803,,0.3974,0.151,Inconclusive,25-07-2023 12:00,
|
||||
119,Aditya Vinod Patil,540252260849,91534361104258,540252260849ADIGMC,23,MALE,mahar,Single,vinod patil , ghar no. 803 near vishakha mahila mandal jat tarodi no. 2 Ajni,Nagpur,MAHARASHTRA,440003,8600772466,AB-ve,0.3189,0.1323,Normal (HbA),24-07-2023 11:17,
|
||||
90,Payal Pravin Shamkuwar,542345482977,91431200368832,542345482977PAYGMC,28,FEMALE,,Married,Pravin,C/O : Pravin Shamkuwar Bhande Plot Umred Road Sewadal Nagar Nagpur (Urban),Nagpur,MAHARASHTRA,440001,7620224122,O+ve,0.2661,0.1193,Normal (HbA),18-07-2023 12:15,
|
||||
52,Manish Ganesh Badwaik,547500432358,91738102200842,547500432358MANGMC,22,MALE,teli,Single,ganesh,"C/O Ganesh Badwaik behind vrundawan lawn plot no. 33, shahu nagar, manewada besa road Mhalgi Nagar",Nagpur,MAHARASHTRA,440034,8788840502,,0.4808,0.1743,Sickle Cell Trait (HbAS),25-07-2023 10:30,"priti chakole ( sister ) ss , aashish balwaik ( ss ) , Sunita balwaik ( mother ) (as) , ganesh balwaik ( father ) ( as ) "
|
||||
147,Aniket Dipak Korde,547636109632,91466065681549,547636109632ANIGMC,22,MALE,pawar,Single,dipak korde,C/O Dipak Korde gali no 2 k d k college road near nag mandir nandanvan zopadpatti Hanuman Nagar,Nagpur,MAHARASHTRA,440024,7066280727,O+ve,0.23,0.1095,Normal (HbA),24-07-2023 11:51,
|
||||
37,Kashish Dinesh Sahagal,550398198758,31401661775000,550398198758KASGMC,18,FEMALE,Panjabi khatri,Single,Dinesh sahagal,C/O : Abahy Shinde House No 1128/B/750 Galli No 13 Near SHiv Mandir Nandanvan Zopadpatti Hanuman Nagar,NAGPUR,MAHARASHTRA,440009,7517612833,,0.5434,0.1971,Sickle Cell Trait (HbAS),21-07-2023 13:29,
|
||||
170,Sakshi Pannalal Lanjewar,555872236142,91764467850641,555872236142SAKGMC,19,FEMALE,teli ,Single,Pannalal lanjewar , plot no.180 jay durga SocIety layout 3 beltarodi road behind mahajan hadwear shyam nagar somalwada Vivekanand Nagar,Nagpur,MAHARASHTRA,440037,9307179481,A+ve,0.4498,0.1649,Inconclusive,25-07-2023 10:16,
|
||||
135,Swapnil Ramrav Nat,557610954424,91157866102039,557610954424SWAGMC,27,MALE,gawali,Single,ramrav nat, TA WARORA AT ARJUNI POST ARJUNI Arjuni Tukum,Chandrapur,MAHARASHTRA,440009,8669394913,,0.3937,0.1501,Inconclusive,25-07-2023 11:54,
|
||||
118,Priti Chandrashekhar Sangole,566216578679,91132834636525,566216578679PRIGMC,39,FEMALE,sc,Single,chandrashekhar sangole,C/O D/O Chandrashekhar Sangole kamptee road shende nagar teka naka near samta school Uppalwadi,Nagpur,MAHARASHTRA,440026,9595592881,,0.6721,0.2681,Sickle cell Disease (HbSS),24-07-2023 13:10,Chandrashekhar sangole
|
||||
208,Maithili Ravi Ade,571322451864,91100245552235,571322451864MAIGMC,9,FEMALE,,Single,Ravi ade,C/O : Ravi Govind Ade Dattnagar Gokunda,#NAME?,#NAME?,440034,8250292877,A+ve,0.3231,0.1333,Normal (HbA),19-07-2023 13:14,
|
||||
57,Sadu Vinod Sawarkar,578479578451,91481088112158,578479578451SADGMC,17,FEMALE,tali,Single,Vinod ,C/O : Ashok Rewatkar Plot No. 7 Manewada Road Near Gajanan Maharaj Mandir Mitra Nagar Parvati Nagar,Nagpur,MAHARASHTRA,440024,9922182175,A+ve,0.2728,0.1211,Normal (HbA),22-07-2023 10:58,
|
||||
81,Amol Ramsingh Uikey,579588566410,91151088476842,579588566410AMOGMC,58,MALE,,Single,ramsingh uikey,"C/O Ramsingh Mallusing Uikey Near Hanuman Mandir Mu -Wela (Harishchandra), Tal Dist- Nagpur Pipla",Nagpur,MAHARASHTRA,440034,8208738819,B+ve,0.3026,0.1284,Normal (HbA),19-07-2023 11:46,
|
||||
160,Ram Laxman Wadibhashme,580785890063,91358352650362,580785890063RAMGMC,27,MALE,Teli,Single,laxman wadibhashme ,C/O Laxman Wadibhashme ashti ashti po khat th mouda Khat,Nagpur,MAHARASHTRA,441106,8796455216,,0.5147,0.1859,Sickle Cell Trait (HbAS),25-07-2023 12:15,
|
||||
27,Rajkiran Kishor Patil,581532368548,91526833353836,581532368548RAJGMC,33,MALE,mahar,Single,kishor,C/O Kishor Patil killapura ward no. 13 Savner,Nagpur,MAHARASHTRA,441107,8956816990,B+ve,0.2184,0.1061,Normal (HbA),22-07-2023 10:36,
|
||||
202,Priyanka Milind Bahadure,588442092331,91631705403568,588442092331PRIGMC,23,FEMALE,mahar ,Single,Milind bahadure,"C/O D/O Milind Bahadure PLOT NO 49, AVDHUT NAGAR, MANEWADA RING ROAD Parvati Nagar S.O",Nagpur,MAHARASHTRA,440027,9699893065,O+ve,0.6422,0.248,Inconclusive,25-07-2023 09:55,Priyanka bahadure (self )
|
||||
75,Ravikala Dinesh Rahangdale,590357992304,91573806303075,590357992304RAVGMC,29,FEMALE,pavar,Married,dinesh rahangdale,C/O W/O Dinesh Rahangdale House No 611 At Chicholi Near Hanuman Mandir Chicholi,Bhandara,MAHARASHTRA,441912,8208717517,,0.2954,0.1267,Normal (HbA),25-07-2023 13:26,
|
||||
6,Pranav Rajendraji Supatkar,590783464069,91711286466638,590783464069PRAGMC,20,MALE,sutat,Single,Rajendra ji,"C/O Rajendraji Supatkar AT-PO- MENDHEPATHAR, TAH-KATOL Mendhepathar",#NAME?,#NAME?,441302,9623942514,,0.1838,0.095,Normal (HbA),22-07-2023 11:11,
|
||||
68,Ujwal Ravindra Raut,592922714261,91411043783678,592922714261UJWGMC,21,MALE,,Single,ravindra Raut , S/O Ravindra Raut Plot No 89 Antuji Nagar Near Masjid Railway Station Road Bhandewadi Pardi,Nagpur,MAHARASHTRA,440008,7448147081,O+ve,0.2845,0.124,Normal (HbA),20-07-2023 12:27,
|
||||
54,Vinay Doliram Neware,595195901827,91171663238375,595195901827VINGMC,19,MALE,,Single,doliram neware ,C/O : Doliram Neware House No 237 Ganga Nagar Hajari Pahad Katolroad,Nagpur,MAHARASHTRA,440013,7498891146,O+ve,0.2692,0.1201,Normal (HbA),18-07-2023 11:02,
|
||||
197,Ashish Ganesh Badwaik,603304665354,91301142706086,603304665354ASHGMC,25,MALE,teli ,Single,ganesh badwaik ,C/O Ganesh Badwaik Plot No 13 Gita Nagar Besa Road Near Essar Petrol Pump Manewada Hudkeshwar bk.,Nagpur,MAHARASHTRA,440034,7030787811,,0.6213,0.2354,Inconclusive,24-07-2023 10:41,ganesh badwaik (Father)age 54 As pattern 2) Sunita badwaik ( mother) 48 As 3) Manish badwaik (brother) As. age - 22 9011255055
|
||||
128,Latika Diliprao Gadge,603473023065,91587613477187,603473023065LATGMC,20,FEMALE,pawar,Single,dilip gadge,C/O : Aarti D Sawarkar PLOT NO 11 LUV KUSH NAGAR MANEWADA ROAD Hudkeshwar bk.,Nagpur,MAHARASHTRA,440034,9112323962,O+ve,0.4353,0.1609,Inconclusive,25-07-2023 09:49,
|
||||
201,Shrushti Sunil Gedam,603931916214,91578100733802,603931916214SHRGMC,5,FEMALE,,Single,Sunil Gedam , Ward No 01 At Owala Tah Nagbhir Palasgaon Kh,Chandrapur,MAHARASHTRA,441221,7798630025,AB+ve,0.6378,0.2453,Inconclusive,18-07-2023 13:39,1) Papa AS pattern 2) Mummy AS pattern
|
||||
151,Rasika Dhanpal Bawankar,617155943301,91681228510878,617155943301RASGMC,22,FEMALE,teli,Single,dhanpal bawankar,C/O D/O Dhanpal Bawankar hanuman mandir mage mu.keshalwada po.mohadura Kesalwada,Bhandara,MAHARASHTRA,441906,9923524930,,0.4881,0.1767,Sickle Cell Trait (HbAS),25-07-2023 11:15,
|
||||
103,Rahul Kisanrao Masram,620868858979,91171144386637,620868858979RAHGMC,31,MALE,,Married,kisanrao," Plot N. 7,Jay Durga Society Wardha Road Somalwada Nagpur",Nagpur,MAHARASHTRA,440037,7058302977,B+ve,0.3464,0.1388,Normal (HbA),18-07-2023 11:00,
|
||||
17,Pravin Dnyandev Gadbail,621199873463,91774355001124,621199873463PRAGMC,32,MALE,teli,Single,dnyandev gadbail, ta barshitakali havili pura Kardu,Akola,MAHARASHTRA,444407,9730332410,,0.2062,0.1024,Normal (HbA),22-07-2023 12:23,
|
||||
192,Tony Arjun Indurkar,623091631843,91672876316361,623091631843TONGMC,40,MALE,mahar ,Married,Arjun indurkar ,"C/O Arjun Indurkar MAHAPRAJAPATI BUDDHA VIHAR 329, GADDIGODAM, GAUTAM NAGAR Nagpur (Urban)",Nagpur,MAHARASHTRA,440001,9272473637,,0.6093,0.2286,Inconclusive,24-07-2023 12:26,
|
||||
174,Shrawan Shamrao Dhurve,628888307576,91184565854256,628888307576SHRGMC,20,MALE,gond,Single,sham rao,C/O Shamrao Dhurve bidgaon Bid jatamkhora,Nagpur,MAHARASHTRA,441112,8010205596,O+ve,0.5573,0.203,Inconclusive,21-07-2023 12:04,
|
||||
33,Diksha Arun Meshram,631723025707,91261037271200,631723025707DIKGMC,22,FEMALE,,Single,Arun meshram , Hiwara Tarsa,Nagpur,MAHARASHTRA,441106,8208289938,B+ve,0.2235,0.1076,Normal (HbA),19-07-2023 13:53,
|
||||
92,Aachal Laxminarayan Varma,637764680553,91431713428040,637764680553AACGMC,22,FEMALE,,Single,Laxminarayan ,C/O D/O Laxminarayan Varma shivshakti bar jawal plot no 146 chintamani nagar kalmana juna kamthi road Uppalwadi S.O,Nagpur,MAHARASHTRA,440026,8806489105,O+ve,0.3258,0.1339,Normal (HbA),19-07-2023 13:52,
|
||||
191,ritik Ramteke ,640047110809,91615878003867,640047110809RITGMC,21,Male,Buddhists ,Single,Yadav Ramteke ,juna bagadganj NAGPUR ,NAGPUR ,Maharashtra ,440008,8668470265,O+ve,0.6074,0.2276,Inconclusive,21-07-2023 11:29,
|
||||
158,Vijay Kartik Kamble,644339826735,91451654172662,644339826735VIJGMC,39,MALE,bhudhist ,Married,kartik kamble,"C/O Kartik Kamble OLD POLICE STATION JATTARODI NO. 3, INDIRA NAGAR Ajni",Nagpur,MAHARASHTRA,440003,8446044438,,0.5015,0.1812,Sickle Cell Trait (HbAS),25-07-2023 11:22,
|
||||
125,Aman Dinesh Tiwari,646290058285,91502115875119,646290058285AMAGMC,19,MALE,bramhan,Single,dinesh tiwari,C/O Dinesh Tiwari Hanuman Mandir. Shivaji Nagar Tumsar Tah.Tumsar Tumsar,Bhandara,MAHARASHTRA,441912,9673427245,,0.4266,0.1585,Inconclusive,25-07-2023 11:17,
|
||||
132,Nilima Ritesh Sawarkar,647852551889,91270856621205,647852551889NILGMC,22,FEMALE,Sonar ,Single,ritesh sawarkar ," numbini nagara koradi road near ranu school mankapur, nagpur Mankapur",Nagpur,MAHARASHTRA,440014,9561721815,AB+ve,0.4431,0.163,Inconclusive,25-07-2023 09:34,
|
||||
99,Prachi Tarun Gupta,650657749196,91434312526016,650657749196PRAGMC,23,FEMALE,baniya,Single,Tarun Gupta ,C/O D/O Tarun Gupta NEAR TAPASYA KIRANA STORES PLOT NO.19 BAJRANG NAGAR GALLI NO.1 Parvati Nagar S.O,Nagpur,MAHARASHTRA,440027,7387374506,,0.338,0.1368,Normal (HbA),25-07-2023 10:27,
|
||||
120,Monali Ishwar Kulsange,653246965397,91432886206080,653246965397MONGMC,21,FEMALE,gond,Single,ishwar kulsange,C/O D/O: Ishwar Kulsange Plot No.48 Manewada Road Near Durga Mata Mandir Durga Nagar Ayodhya Nagar,Nagpur,MAHARASHTRA,440024,7840957615,O+ve,0.3997,0.1516,Inconclusive,21-07-2023 11:25,
|
||||
46,Abhay Vishal Manohre,664411976347,91642574173844,664411976347ABHGMC,19,MALE,,Single,vishal manohare, Behind Isoleshan Hospital Imamwada Ajni S.O,Nagpur,MAHARASHTRA,440003,8308897762,O+ve,0.2586,0.1174,Normal (HbA),20-07-2023 10:41,
|
||||
117,Devansh Bipin Bangade,665137592302,91462703788622,665137592302DEVGMC,11,MALE,teli ,Single,bipin bangade ,C/O Bipin Bangade At-Post-Parvati Nagar Parvati Nagar,Nagpur,MAHARASHTRA,440027,9637440543,,0.3882,0.1487,Inconclusive,25-07-2023 13:34,
|
||||
62,Vandana Ravindra Patil,668553845136,91405005461463,668553845136VANGMC,40,FEMALE,agari ,Married,ravindra Patil ,"C/O W/O: Ravindra Pundalik Patil Room No-202, Vaishnav Banganga CHS Plot No-161 Sector-9, New Panvel(West) Panvel",Raigarh,MAHARASHTRA,410206,9082724401,,0.2768,0.1221,Normal (HbA),25-07-2023 13:36,
|
||||
43,Vaibhav Vinod Kamde,673233437701,91338346703022,673233437701VAIGMC,22,MALE,teli ,Single,vinod kamde , Babupeth Junona Fata Near Hinglaj Bhavani Chandrapur Chandrapur,Chandrapur,MAHARASHTRA,442403,9130443081,,0.2512,0.1154,Normal (HbA),24-07-2023 13:43,
|
||||
30,Bhagyashree Bhimraoji Thool,683495280995,91262273506374,683495280995BHAGMC,33,FEMALE,,Married,bhimraoji, 29 maskey layout near railway crossing tunnel narendra nagar Vivekanand Nagar,Nagpur,MAHARASHTRA,440015,8600290825,O+ve,0.2226,0.1074,Normal (HbA),20-07-2023 13:06,
|
||||
143,Sairam Rajanna Margoni,685217003162,61628030116846,685217003162SAIGMC,24,MALE,kalar ,Single,rajanna margoni ,C/O Rajanna ward no.3 sironcha sironcha Sironcha,Gadchiroli,Maharashtra,442504,9423350048,,0.4728,0.1718,Sickle Cell Trait (HbAS),21-07-2023 13:34,
|
||||
3,Pradip Balaji Kawale,685709514415,91703746280667,685709514415PRAGMC,38,MALE,kalar,Married,Balaji kawale,C/O Balaji Kawale Wagheda,Chandrapur,MAHARASHTRA,442904,8767613832,,0.1789,0.0933,Normal (HbA),22-07-2023 12:59,
|
||||
141,Ashvini Kavadu Saratkar,686278624501,91326137030069,686278624501ASHGMC,23,FEMALE,TELI,Single,Kawdu Saratkar ,C/O D/O: Kavadu Saratkar at.narsala Post-salwa Tah-mouda Narsala,Nagpur,MAHARASHTRA,441401,8080505103,,0.4683,0.1704,Sickle Cell Trait (HbAS),25-07-2023 13:49,
|
||||
216,Shubhangi Narhari Tirpude,690924196328,91425683040215,690924196328SHUGMC,38,FEMALE,sc,Single,narhari, H.N.761/A Near Buddha Vihar Jai Bhim Nagar Parvati Nagar S.O,Nagpur,MAHARASHTRA,440027,9511661474,,0.7561,0.3392,Sickle cell Disease (HbSS),25-07-2023 12:48,Shilpa kamble ( cousin sister ) diseased
|
||||
10,Abhishek Balvant Jadhav,700012335166,91756080051714,700012335166ABHGMC,23,MALE,,Single,balvant jadhav ,C/O Balwant Jadhaw ranmangli ranmangli Ranmangli,Nagpur,MAHARASHTRA,440035,9545010689,A+ve,0.1937,0.0984,Normal (HbA),20-07-2023 12:20,
|
||||
121,Manohar Mohan Kokane,701218955983,46218837158538,701218955983MANGMC,28,MALE,mahar,Single,mohan, AT MANA Mana,Akola,Maharashtra,444106,8551988081,,0.4013,0.152,Inconclusive,21-07-2023 11:12,
|
||||
59,Mahendra Tidke ,707385421565,58182360251372,707385421565MAHGMC,35,Male,,Married,eknath tidke,"w/no. 11 at post . garra rampayli tahsil waraseoni , ",balaghat ,madya pradesh ,481331,7798301890,B+ve,0.2755,0.1218,Normal (HbA),19-07-2023 10:55,
|
||||
215,Pawan Chintaman Sukhadeve,714731803867,91521553832606,714731803867PAWGMC,26,MALE,mahar ,Married,chintamanrao sukhadeve ,C/O Chintaman Sukhadeve house no. 199 near buddha vihar mu wag Wag,Nagpur,MAHARASHTRA,441210,9657358513,B+ve,0.7531,0.3363,Sickle cell Disease (HbSS),21-07-2023 11:31,
|
||||
188,Reshama Vijay Mahurkar,721374376369,78062413481463,721374376369RESGMC,23,FEMALE,OBC ,Single,Vijay mahurkar , ADEGAON Gidamgad,NAGPUR,MAHARASHTRA,440023,9049630847,A+ve,0.5993,0.2233,Inconclusive,22-07-2023 10:53,
|
||||
80,Kashish Bharatlal Bedre,722943981553,91358153442449,722943981553KASGMC,19,MALE,,Single,bharatlal,"C/O Bharatlal Bedre Near Rashtriya zenda Rambag ,Medical Chowk Ajni S.O",Nagpur,MAHARASHTRA,440003,8669459915,B+ve,0.3007,0.128,Normal (HbA),20-07-2023 10:44,
|
||||
86,Aarav Amit Manusmare,725508986060,91771814506883,725508986060AARGMC,9,MALE,wadi,Single,Amit manusamare ,C/O Amit Manusmare plot no 55 kharabi layout saibaba nagar near hanuman mandir kharabi Hudkeshwar bk.,Nagpur,MAHARASHTRA,440034,9561158402,,0.3082,0.1298,Normal (HbA),24-07-2023 10:18,
|
||||
85,Nirmal Ade,725800506696,91125036380470,725800506696NIRGMC,35,MALE,,Married,deneshlal ade,C/O : Dineshlal Ade Building No. B-12 Flat No. 005 Khasara No. 63 PMAY Tarodi Road Near Symbiosis University Wathoda Kapsi bk,Nagpur,MAHARASHTRA,440035,9669187517,A+ve,0.3055,0.1291,Normal (HbA),19-07-2023 11:00,
|
||||
146,Chaturthi Dinesh Dodke,726312176282,91211736120455,726312176282CHAGMC,12,FEMALE,mang ,Single,Dinesh dodke,"C/O D/O: Dinesh Dodke house no.143 Amravati Road behind avdhut atta chakki Dawalameti,8th mile,nagpur Nagpur (Urban)",Nagpur,MAHARASHTRA,440023,7620441989,,0.4797,0.1739,Sickle Cell Trait (HbAS),21-07-2023 10:33,
|
||||
189,Atul Sunil Bagde,727951395008,91281856514324,727951395008ATUGMC,34,MALE,,Married,Sunil bagde,C/O Sunil Bagde NEAR NIT GARDEN PARDESI GALLI 7L B/H MEDICAL HOSPITAL CHANDRAMANI NAGAR Parvati Nagar S.O,Nagpur,MAHARASHTRA,440027,9175062346,B+ve,0.6019,0.2246,Inconclusive,20-07-2023 14:03,1) sunil bagde 2) mala bagde AS pattern 3) pratiksha bagde SS 9607457973
|
||||
105,anjal bagde,733075981147,91207564267889,733075981147ANJGMC,12,Female,,Single,shri rajesh,bhopal,chinwada,madhya pradesh ,462003,8517849357,A+ve,0.3504,0.1397,Normal (HbA),14-07-2023 13:33,
|
||||
180,Sneha Ravindra Ramteke,734572655691,70802843134812,734572655691SNEGMC,24,FEMALE,SC,Single,ravindra ramteke,"C/O D/O Ravindra Lahanu Ramteke At-Post-Andhalgaon,tha-Mohadi Andhalgaon",#NAME?,#NAME?,441419,9579471636,,0.5787,0.2129,Inconclusive,24-07-2023 10:38,
|
||||
102,Harshali Rushinath Narnavare,735191918963,91745021562723,735191918963HARGMC,21,FEMALE,mahar ,Single,rushinath narnavare ,C/O D/O: Rushinath Narnavare WARD NO 11 AMBEDKAR CHOWK AMBEDKAR NAGAR Narkhed,Nagpur,MAHARASHTRA,441304,7350519462,O+ve,0.3457,0.1386,Normal (HbA),22-07-2023 09:55,
|
||||
28,Akshay Sudhir Khadatkar,740142460820,72607565165110,740142460820AKSGMC,24,MALE,bhat ,Single,sudhir khadatkar ,"C/O Sudhir Khadatkar galli no.14 plot no.148, ladekar layout, ayodhya nagar Ayodhya Nagar S.O",Nagpur,Maharashtra,440024,8623026880,,0.2202,0.1066,Normal (HbA),25-07-2023 11:13,
|
||||
84,Gaurav Vinodrao Tayade,742641129802,91401422152884,742641129802GAUGMC,21,MALE,,Single,vinod,C/O Vinodrao Tayade plot no 24 samta nagar arni road wadgaon road Yavatmal (R),Yavatmal,MAHARASHTRA,445001,9604501864,A+ve,0.3048,0.129,Normal (HbA),20-07-2023 12:37,
|
||||
4,Roshan Kumre,755746779209,91364210722138,755746779209ROSGMC,25,MALE,aadivasi,Single,rambhau,C/O Rambhaoo Kumre ward no.26 jvahar ward manganj gwon road pandhurna Pandhurna,#NAME?,#NAME?,480001,7559307254,,0.1803,0.0938,Normal (HbA),22-07-2023 12:37,
|
||||
127,mukata Rameshwar vanwe ,756784842776,91102685081188,756784842776MUKGMC,34,FEMALE,,Married,Rameshwar vanwe ,ward no 2 at pandegaon po salwa th kuhi pandegaon nagpur ,nagpur ,MAHARASHTRA,441202,9637158336,B+ve,0.4348,0.1607,Inconclusive,18-07-2023 11:51,mukata Rameshwar vanwe 9325180992
|
||||
209,Tanushree Vinayak Gawhale,757486916738,91342810878260,757486916738TANGMC,15,FEMALE,brahman,Single,vinayak gawhale , Plot No 78 Chamat Lay-Out Near Bawankule Sabhagruh Sai Baba Nagar Hudkeshwar bk.,Nagpur,MAHARASHTRA,440034,9730340085,B-ve,0.6748,0.2701,Sickle cell Disease (HbSS),21-07-2023 11:45,
|
||||
73,Chandragupta Tukaram Bansod,761821800952,60507573313625,761821800952CHAGMC,38,MALE,mahar,Married,tukaram bansod,C/O Tukaram Bansod mu po Nanded Nanded,Chandrapur,Maharashtra,441221,9673799973,A+ve,0.2909,0.1256,Normal (HbA),24-07-2023 11:13,samyak=cousin ss pattern
|
||||
210,Samiksha Ulhas Purkam,766401336144,91367422704307,766401336144SAMGMC,14,FEMALE,gondh,Single,ulhas purkam,"C/O D/O: Ulhas Purkam Plot no. 79, yogendra nagar Katolroad",Nagpur,MAHARASHTRA,440013,9423739604,,0.6756,0.2707,Sickle cell Disease (HbSS),24-07-2023 13:03,f-ulhas purkam(AS). m-jayanti purkam(AS)
|
||||
13,Sagar Niranjan Patil,771317362729,91184781875275,771317362729SAGGMC,21,MALE,SC,Single,Niranjan patil,C/O Niranjan Patil SAMTA KIRDANGAN JAVAL PLOT NO. 165 B PRAVESH NAGAR WANJRI LAYOUT Uppalwadi S.O,Nagpur,MAHARASHTRA,440026,9673099354,O+ve,0.1984,0.0999,Normal (HbA),22-07-2023 09:48,
|
||||
206,Tejaswini Dilip Marskolhe,772882060539,91434066200362,772882060539TEJGMC,19,FEMALE,gondh,Single,dilip,"C/O D/O: Dilip Marskolhe chunabhati chunabatti , F.C.I. godown ajani ,nagpur Vivekanand Nagar",Nagpur,MAHARASHTRA,440015,8999530867,,0.6662,0.264,Sickle cell Disease (HbSS),25-07-2023 12:44,F- dilip maraskolhe(as) / M- kusum maraskolhe (AS)
|
||||
88,Bhavisha Prakash Bhagchandani,786163067750,91711785884554,786163067750BHAGMC,38,FEMALE,shindhi,Married,prakash bhagchandani ," 4th Floor,Flat No.403,Minarava Apartment Goal Maidan Road Near Post Office Ulhasnagar-1 Ulhasnagar",Thane,MAHARASHTRA,421001,7709160857,,0.3096,0.1301,Normal (HbA),24-07-2023 12:58,
|
||||
100,Pranay Moreshwar Bhagadkar,786991281673,91256243011044,786991281673PRAGMC,21,MALE,kunbi ,Single,moreshwar bhagadkar ,C/O Moreshwar Bhagadkar awleghat mu.awleghat po.navegaon khairi Parshivni,Nagpur,MAHARASHTRA,441105,9373659361,,0.3415,0.1376,Normal (HbA),24-07-2023 10:48,
|
||||
16,Surbhi Radheshyam Dhoble,807025536597,91767203676048,807025536597SURGMC,22,FEMALE,,Single,Radheshyam dhoble ,C/O D/O: Radheshyam Dhoble lodha Karwahi,Nagpur,MAHARASHTRA,441401,8815360481,A+ve,0.2055,0.1021,Normal (HbA),20-07-2023 14:05,
|
||||
53,Nisha Dhanraj Mandalwar,814517961871,91345020522784,814517961871NISGMC,17,FEMALE,,Single,Dhanraj , at chandewani po ta karanja Chandewani,WARDHA,MAHARASHTRA,442203,9356048939,O+ve,0.2673,0.1197,Normal (HbA),19-07-2023 12:00,
|
||||
48,Mrunali Ravindra Bhoyar,817229321951,91315165134026,817229321951MRUGMC,22,FEMALE,,Single,ravindra ,C/O D/O: Ravindra Bhoyar Plot No 87 Bharatwada Road Talmale Lay Out Pardi,Nagpur,MAHARASHTRA,440035,7498664807,O+ve,0.2612,0.1181,Normal (HbA),19-07-2023 10:29,
|
||||
82,Subodh Onkar Gawande,820884796263,91141515316844,820884796263SUBGMC,21,MALE,,Single,onkar Gawande ,C/O Onkar Gawande Manikwada Ward No.01 Manikwada,yawatmal ,Maharashtra ,445102,8805602024,O+ve,0.3029,0.1285,Normal (HbA),19-07-2023 10:41,
|
||||
157,Swati Keshav Patil,824805035216,91742265088366,824805035216SWAGMC,33,FEMALE,mahar,Married,keshav,C/O : Keshav Patil Ward No.3 Near Bus Stop At.Tishti Po.Telgaon Tishti bk.,Nagpur,MAHARASHTRA,440016,8080735790,,0.5007,0.1809,Sickle Cell Trait (HbAS),22-07-2023 11:35,
|
||||
23,Mayur Keshavrao Hatwar,829555623625,91588763823444,829555623625MAYGMC,29,MALE,,Single,keshavrao,"C/O : Rajendra V Hatwar A / 22, Indraprastha Anushaktinagar Anushaktinagar Mumbai",Mumbai Suburban,MAHARASHTRA,400094,7030478956,B+ve,0.2146,0.105,Normal (HbA),20-07-2023 11:34,
|
||||
76,Rohini Dilip Tantrapale,838467168469,91373820521012,838467168469ROHGMC,21,FEMALE,Buddhists ,Single,dilip tantrapale,C/O D/O: Dilip Tantrapale Galli No.13 Punjabrao Deshmukh marg Savitribai Fule Nagar Parvati Nagar,Nagpur,MAHARASHTRA,440027,8983403021,,0.2953,0.1267,Normal (HbA),22-07-2023 11:49,
|
||||
186,Shrikrushn Sadashiv Dhone,841625523860,91376214770707,841625523860SHRGMC,37,MALE,mahar ,Married,Sadashiv dhone ,C/O Sadashiv Dhone mu post ramthi tah narkhed Ramthi,Nagpur,MAHARASHTRA,441301,7218301492,,0.5986,0.2229,Inconclusive,25-07-2023 10:33,
|
||||
18,Vaishali Khemraj Parate,841675795081,91707070143557,841675795081VAIGMC,41,FEMALE,,Married,khemraj,"C/O W/O: Khemraj Parate FLAT NO. 301 C.A. ROAD BESIDE PUNJAB NATIONAL BANK UMIYA CO-OPERATIVE SOCIETY, CHHAPRU NAGAR CHOWK Kolar",Nagpur,MAHARASHTRA,440008,9579007670,O+ve,0.2063,0.1024,Normal (HbA),20-07-2023 10:21,
|
||||
11,Misbah ansari ,841781136811,91103121823258,841781136811MISGMC,18,Female,julaha,Single,Nazeer ansari ,ahemad nagar wanjra nabiyan masjid ke pass NAGPUR ,NAGPUR ,Maharashtra ,440001,9075241881,,0.1935,0.0983,Normal (HbA),22-07-2023 13:47,
|
||||
156,Ojas Ajay Ingole,842371907157,91761752336526,842371907157OJAGMC,13,MALE,matang ,Single,ajay ingole ,"C/O Ajay Ingole BEHIND SARSWATI NIGHT HIGH SCHOOL FAKIRAWADI, SARSWATI NAGAR, DHANTOLI Patwardhan Ground",Nagpur,MAHARASHTRA,440012,7507465571,,0.5003,0.1808,Sickle Cell Trait (HbAS),22-07-2023 12:55,ojas ingole( self ) age 13
|
||||
87,Manoj Haribhau Rewatkar,847806990494,91484401101536,847806990494MANGMC,40,MALE,,Single,Haribhau Retkar,C/O Haribhau Rewatkar WAARD NO-03 AT-POST-BHISHNOOR TAH-NARKHED BHISHNUR,Nagpur,MAHARASHTRA,441305,7066916098,A+ve,0.3089,0.1299,Normal (HbA),19-07-2023 12:03,
|
||||
109,Jayashree Vijay Puttewar,850730992932,91513724712528,850730992932JAYGMC,37,FEMALE,,Married,vijay puttewar ,C/O Nitin Darshanwar 980 Hudkeshwar Road Near Hanumaan Mandir Ashirwad Nagar Ayodhya Nagar,Nagpur,MAHARASHTRA,440024,9011107365,B+ve,0.3566,0.1412,Inconclusive,19-07-2023 11:39,
|
||||
190,Nilesh Arjun Indurkar,851357352601,91644586351657,851357352601NILGMC,34,MALE,,Single,Arjun indurkar ,"C/O Arjun Indurkar MAHAPRAJAPATI BUDDHA VIHAR 329, GADDIGODAM, GAUTAM NAGAR Nagpur (Urban)",Nagpur,MAHARASHTRA,440001,8928729359,O+ve,0.6037,0.2256,Inconclusive,19-07-2023 13:23,
|
||||
38,Shrusti Rama Hiwarkar,855086418995,35562154577124,855086418995SHRGMC,20,FEMALE,Dhobi ,Single,rama hiwarkar,C/O D/O: Rama Pandurang Hiwarkar F- 3 nisha mohan apartment central avenue near itwari highschool darodkar chouk Nagpur City,NAGPUR,MAHARASHTRA,440002,8080813740,,0.2317,0.11,Normal (HbA),24-07-2023 13:30,F-Rama hiwarkar (AS). M-archana hiwarkar(AS)
|
||||
217,Priyanka Shrikant Malhari,855896569818,91770768353367,855896569818PRIGMC,29,FEMALE,,Married,shrikant malhari, plot no. 78 dayalu society mahavir nagar Jaripatka,Nagpur,MAHARASHTRA,440014,9923621310,A+ve,1.3524,1.8827,Unknown,19-07-2023 12:33,
|
||||
115,Suhani Ratan Patil,857173745901,91375764438772,857173745901SUHGMC,38,FEMALE,,Married,ratan patil ,"C/O W/O Ratan Patil opp. ishwar deshmukh college plot no. 423/C, tana kuti, krida chowk, chandan nagar Hanuman Nagar S.O",Nagpur,MAHARASHTRA,440009,7558658318,O+ve,0.38,0.1467,Inconclusive,18-07-2023 10:45,
|
||||
198,Kokila Sunil Ambekar,857681733150,91306258282236,857681733150KOKGMC,32,FEMALE,,Married,sunil ambekr,C/O W/O: Sunil Ambekar at mangali (jagrap) post nakshi Bhiwapur,Nagpur,MAHARASHTRA,441201,8830524271,O+ve,0.6246,0.2373,Inconclusive,19-07-2023 13:30,1)Jay ambekar 2)Sunit ambekar 8830524270
|
||||
2,Umra Anjum,877075527709,91122110521350,877075527709UMRGMC,19,FEMALE,muslim ,Single,Mohammad Naushad,C/O D/O Mohammad Naushad NEAR MATAN MARKET 866/A HANSAPURI QASABPURA Mahatma Fule Bazar S.O,Nagpur,MAHARASHTRA,440018,7823002033,,0.1698,0.0901,Normal (HbA),22-07-2023 11:29,
|
||||
19,Pallavi Dilip Khandekar,879721983759,91464464248374,879721983759PALGMC,26,FEMALE,,Single,dilip khandekar,"C/O D/O Dilip Khandekar rameshwari ring road near vimaltai tidke convent plot no. 32, maa renuka colony, rama nagar, Parvati Nagar S.O",Nagpur,MAHARASHTRA,440027,9767251905,A+ve,0.207,0.1026,Normal (HbA),19-07-2023 12:27, elder sister (AS ) pattern
|
||||
36,Minakshi harishrao Parise ,879876717068,91465440552615,879876717068MINGMC,27,FEMALE,bhoi ,Married,Harishrao ,C/O D/O Tejrao Gawale Hingana Road Near Santosh Kirana Storss Sant Tukdoji Nagar Nagpur,amrawati,#NAME?,444708,9130060621,,0.2283,0.109,Normal (HbA),25-07-2023 12:42,
|
||||
168,Yogini Ritesh Bawne,887901922176,91315764355840,887901922176YOGGMC,30,FEMALE,mahar,Married,ritesh bawane,C/O W/O: Ritesh Bawne H.No.95 Indira Nagar Mata Mai Mandir Ranala Kamptee,#NAME?,KARNATAKA,441002,8180010853,,0.5312,0.1922,Sickle Cell Trait (HbAS),22-07-2023 13:11,1)dhananjay bawane 2) Ritesh bawane
|
||||
194,Sunil Haridas Gedam,888289621212,91567370341354,888289621212SUNGMC,46,MALE,,Married,Haridas gedam,C/O Haridas Gedam ward no.1 owala Owala,Chandrapur,MAHARASHTRA,440009,7798630025,A+ve,0.6153,0.232,Inconclusive,18-07-2023 13:36,1) shrushti gedam 2)shardha gedam 7798630025
|
||||
42,Samata Bhagwan Wanjari,890515543459,91503474246868,890515543459SAMGMC,35,FEMALE,,Single,bhagwan wanjari,"C/O D/O: Bhagwan Wanjari M I G 32 Quarter no, 4/4 umred road OPP, mahatma fule sabhagruh vakil peth Hanuman Nagar",Nagpur,MAHARASHTRA,440024,9513087557,B+ve,0.2404,0.1125,Normal (HbA),20-07-2023 11:17,bhagwan wanjari (father)
|
||||
185,Nagraju Raghunandan Gattu,890976574668,68806733608326,890976574668NAGGMC,24,MALE,Kalar,Single,Raghunandhan gattu, ward no 1 sironcha Sironcha,NAGPUR,MAHARASHTRA,440001,9423757761,,0.5956,0.2213,Inconclusive,21-07-2023 13:46,
|
||||
169,Akshay Tulshiram Kohapare,891054393112,91504125357559,891054393112AKSGMC,23,MALE,kombhi,Single,tulshiram khopare,C/O Tulshiram Kohapare waard no. 2 at. kharalpeth po. wadholi tah gondpipari Kharal Peth,Chandrapur,MAHARASHTRA,442702,9370289668,,0.5382,0.195,Sickle Cell Trait (HbAS),25-07-2023 12:46,
|
||||
89,Anmolkumar Ramaji Shahare,895889644479,20370331733504,895889644479ANMGMC,39,MALE,,Married,ramaji ,C/O Ramaji Shahare 266 paraswada road near bajar chowk ward no.01 Gond mohadi,gondiya,MAHARASHTRA,441911,8793207022,O+ve,0.3183,0.1322,Normal (HbA),18-07-2023 10:56,
|
||||
172,Vaishnavi Chandrashekhar Chellirwar,897471476601,91276660034212,897471476601VAIGMC,22,FEMALE,navi,Single,chandrashekhar ,C/O D/O: Chandrashekhar Chellirwar Ward No.01 Balapur Bk,Chandrapur,MAHARASHTRA,441221,9370413667,O+ve,0.5527,0.201,Inconclusive,21-07-2023 12:14,
|
||||
176,vrushabh zibal jangam,904422031827,91500347264631,904422031827VRUGMC,25,Male,,Married,zibal,"s/o zibal jangam, near nari bus stop, building no. 60 mhada colony ",NAGPUR ,Maharashtra ,440026,9923988364,A+ve,0.5682,0.2079,Inconclusive,20-07-2023 11:21,Swati vrushabh jangam ( wife) 23/f
|
||||
144,kajal Sunil lode,908366621257,91432276056871,908366621257KAJGMC,16,Female,,Single,Sunil lode,Mahatma Gandhi nagar nagpur ,nagpur ,Maharashtra ,440013,9637359800,A+ve,0.4745,0.1723,Sickle Cell Trait (HbAS),18-07-2023 10:49,
|
||||
200,Girish dongre ,910102695992,91387050633727,910102695992GIRGMC,19,Male,,Single,Gautam Dongre ,"59 hudkeshwar road , pipla ,Nagpur 34",Nagpur ,Maharashtra ,440034,7218301167,O+ve,0.6354,0.2438,Inconclusive,18-07-2023 13:52,"Gautam Dongre (Father) age 49, 2) padamshri Dongre (mother) age 49. 3) sumedha dongre (sister) age 13"
|
||||
136,Vaishnavi Patiramji Nagpure,913429336058,91488081057314,913429336058VAIGMC,19,FEMALE,,Single,Patiramji,C/O D/O Patiramji Nagpure ward no. 4 ghogali road near hanuman nagar bajarang nagar Koradi (n.v.),Nagpur,MAHARASHTRA,441111,8767968029,B+ve,0.4508,0.1652,Inconclusive,20-07-2023 10:49,
|
||||
116,Pranita Praful Dhengre,918225140668,91236224340620,918225140668PRAGMC,11,FEMALE,Buddhists ,Single,praful dhengre ,C/O D/O: Praful Dhengre PLOT NO.137 AKASH NAGAR PANCHASHIL CHOWK Hudkeshwar bk.,Nagpur,MAHARASHTRA,440034,9373931878,,0.3827,0.1474,Inconclusive,22-07-2023 13:49,
|
||||
164,Nandu Dashrath Nagose,919427713788,91237718305152,919427713788NANGMC,28,MALE,,Single,dasrat,"C/O Dashrath Nagose NEAR GANGA APARTMENT SEWA NAGAR, HILL TOP Shankar Nagar",Nagpur,MAHARASHTRA,440010,9545438059,O+ve,0.5206,0.1881,Sickle Cell Trait (HbAS),18-07-2023 12:21,
|
||||
161,Manish Vinayak Gavhale,931004981466,91228211872319,931004981466MANGMC,18,MALE,bramhan,Single,vinayak,"C/O : Ramesh Gangadhar Shikarkhan Plot No. 780,475 Near Bavankude Samaj Bhavan Chamat Lay-out Saibaba Nagar, Kharbi Ayodhya Nagar",Nagpur,MAHARASHTRA,440024,9730340085,B+ve,0.5154,0.1862,Sickle Cell Trait (HbAS),21-07-2023 11:39,
|
||||
183,Bhawna Mohan Tiwari,933890898788,91464652232586,933890898788BHAGMC,40,FEMALE,brahamn,Married,mohan tiwari ,"C/O W/O Mohan Tiwari C/O, Vasant H. Kathalkar Behind Binzani Collage Qtr.no. 108/2, Somwari Qtr. Hanuman Nagar S.O",Nagpur,MAHARASHTRA,440009,7350413489,AB+ve,0.5929,0.2199,Inconclusive,21-07-2023 12:21,
|
||||
1,Sagar Sunil Salve,934157112332,91730205704648,934157112332SAGGMC,23,MALE,mahar,Single,Sunil salve, At-Pasodi Post-Bharaj tq-Jafrabad Dist-Jalna Pasodi,Jalna,MAHARASHTRA,431206,8208289938,,0.1464,0.0812,Unknown,22-07-2023 12:15,
|
||||
166,Ashit Yuwaraj Ramteke,940241847588,91326558387188,940241847588ASHGMC,33,MALE,,Married,yuwaraj ramteke,C/O D. N FULZELE H NO 3465/A/29 MASKE LAYOUT NEAR SMALL RAILWAY CROSSING TUNNEL NARENDRA NAGAR Parvati Nagar,Nagpur,MAHARASHTRA,440015,9766455260,B+ve,0.5273,0.1907,Sickle Cell Trait (HbAS),20-07-2023 13:04,Meghavi ramteke (sister)age 35
|
||||
155,Rohan Shyamrao Kohle,940621638046,91545102802711,940621638046ROHGMC,24,MALE,,Single,shyamrao , shitala mata mandir rani bhosale nagar jhopadpatti Ayodhya Nagar S.O,Nagpur,MAHARASHTRA,440024,7447872388,AB+ve,0.4999,0.1806,Sickle Cell Trait (HbAS),20-07-2023 12:45,rohan shyamrao kohle
|
||||
205,Nikhil Rajkapur,942132784866,91664481518424,942132784866NIKGMC,29,Male,,Single,rajkapur humne,"rajkapor humne, kharbu road, shivankar nagar zopadpatti Galli no9 nagpur ",nagpur ,Maharashtra ,440009,7798864183,O+ve,0.6577,0.2582,Sickle cell Disease (HbSS),19-07-2023 12:59,
|
||||
20,Vaishnavi Shubhash Bhardwaj,947274661101,91140566312306,947274661101VAIGMC,23,FEMALE,St ,Single,Subhash bhardwaj ,"C/O D/O Shubhash Bhardwaj Q N- 74/1 at-chanakapur,po-sillewada,ta-savner chankapur",Nagpur,MAHARASHTRA,441109,9822488996,,0.2071,0.1026,Normal (HbA),22-07-2023 11:59,
|
||||
60,Laxmikant Vrundavan Kushwah,948154309895,91388524178851,948154309895LAXGMC,26,MALE,kahhi,Single,vrundavan kushwah,"C/O Vrundavan Kushwah kavadas,patansavangi at-patansavangi,po-patansavangi ta-savner Patansavangi",Nagpur,MAHARASHTRA,441113,7758090088,AB+ve,0.2755,0.1218,Normal (HbA),24-07-2023 11:25,
|
||||
129,Urjita Umesh Sukhdeve,948285350683,91321876213232,948285350683URJGMC,7,FEMALE,mahar ,Single,Umesh sukhdeve ,C/O D/O: Umesh Sukhdeve Plot No 190 Near Noori Masjid Noori Colony Nara Road Jaripatka,Nagpur,MAHARASHTRA,440014,8055582886,AB+ve,0.4416,0.1626,Inconclusive,24-07-2023 11:28,
|
||||
95,Gokul Devidas Gawande,958015234228,91752747834311,958015234228GOKGMC,39,MALE,,Married,devidas Gawande , Near Ambedkar Statue Indira Nagar Jatatroadi No 1 Ajni,NAGPUR ,Maharashtra ,440003,9960036075,A-ve,0.3305,0.135,Normal (HbA),19-07-2023 10:53,
|
||||
175,Prajwal Gulab Gaddamwar,960306918228,11241336830168,960306918228PRAGMC,21,MALE,,Single,gulab gaddamwar,C/O Gulab Gaddamwar Kelzar,Chandrapur,Maharashtra,441224,9325917742,A+ve,0.5653,0.2066,Inconclusive,20-07-2023 13:17,
|
||||
61,Ashwini Jageshwar Shendre.,960753131759,91482631604014,960753131759ASHGMC,22,FEMALE,teli ,Single,jageshwar shendre ,C/O D/O Jageshwar Shendre near jatiram barve school shivaji ward Ramtek,Nagpur,MAHARASHTRA,441106,9665234117,,0.2759,0.1219,Normal (HbA),25-07-2023 13:45,
|
||||
214,Seema Ashish Pazare,965594454564,91286736203246,965594454564SEEGMC,34,FEMALE,SC,Married,Ashish pazare," Plot No 217 Kamptee, Tarodi Bk Bidbina",Nagpur,MAHARASHTRA,441001,9359424580,,0.7273,0.3122,Sickle cell Disease (HbSS),21-07-2023 13:15,Dharti pazer 9359424580
|
||||
78,Trunal Arun Meshram,968814953390,91184065484372,968814953390TRUGMC,21,MALE,hindu,Single,arun meshram, garada garada Garada,#NAME?,#NAME?,441804,9325365350,B+ve,0.2968,0.127,Normal (HbA),24-07-2023 11:07,
|
||||
49,Nitesh Gulab Shende,971447394581,91242757472400,971447394581NITGMC,28,MALE,,Single,gulab,C/O Gulab Shende JAGDISH NAGAR Katolroad S.O,Nagpur,MAHARASHTRA,440013,7743822252,O+ve,0.263,0.1185,Normal (HbA),19-07-2023 11:51,
|
||||
195,Sahili Dasharath Bagde,971645125119,91686023636836,971645125119SAHGMC,21,FEMALE,Buddhists ,Single,dashrath bagde ,"C/O D/O Dasharath Bagde WAARD NO-02 AT-AGRA, POST-MOHGAON BHADADE, TAH-NARKHED AGRA",Nagpur,MAHARASHTRA,441306,7020851533,,0.6166,0.2327,Inconclusive,21-07-2023 11:14,sahili bagde (self) AS pattern
|
||||
21,Pratik Prakash Dhole,971897603219,91110362336486,971897603219PRAGMC,30,MALE,Sonar ,Single,prakash dhole,C/O Prakash Dhole PLOT NO. 95/B PAVESHA NAGAR YASHODHARA CHOUK KAMPTEE ROAD aUppalwadi S. O.,Nagpur,MAHARASHTRA,440026,8928970083,B+ve,0.2094,0.1034,Normal (HbA),22-07-2023 10:25,
|
||||
123,Vishal Bhuranlal Chakole,979536997367,91628767712100,979536997367VISGMC,34,MALE,teli,Married,bhuranlal , PLOT NO 67 SHANTI HOUSING SOCIETY PARDHI LAYOUT BELTARODI ROAD NEAR SAURYA STATE BELTARODI Nagpur,Nagpur,MAHARASHTRA,440018,9273755861,,0.4031,0.1524,Inconclusive,25-07-2023 12:03,wife - priti. ss pattern
|
||||
74,Nitesh Ramchandra Chakulkar,982649459847,91525518450404,982649459847NITGMC,30,MALE,teli ,Married,ramchandra chakulkar ,C/O Ramchandra Chakulkar ward no. 2 house no. 96 near talav chauk mu weltur Weltur,nagpur ,Maharashtra ,441210,9595962003,,0.292,0.1259,Normal (HbA),25-07-2023 12:06,
|
||||
58,Supriya Bhagwan Wanjari,982998735155,91236107782625,982998735155SUPGMC,40,FEMALE,,Single,bhagwan wanjri ,"C/O D/O: Bhagwan Wanjari Quarters No. 4/4, MIG -32 Opp Mahatama Phule Sabhagrah Vakil Peth Hanuman Nagar",Nagpur,MAHARASHTRA,440024,9513087557,A+ve,0.273,0.1211,Normal (HbA),20-07-2023 11:09,Bhagwan Wanjari-Father
|
||||
139,Mohammad Hamid Jahagir Ansari,984441839919,91327281227410,984441839919MOHGMC,18,MALE,muslim,Single,Jahangir ansari, ward no 1 harihar nagr kandri kanhan near kali mata kandri kanhan Sihora,Nagpur,MAHARASHTRA,441401,9637175096,B+ve,0.4582,0.1673,Inconclusive,24-07-2023 11:19,
|
||||
199,Sharda Sunil Gedam,988221580719,91112284528760,988221580719SHAGMC,37,FEMALE,,Married,Sunil Gedam , WARD NO 01 PALAGON OWALA Owala,Chandrapur,MAHARASHTRA,441601,7798630025,B+ve,0.6284,0.2396,Inconclusive,18-07-2023 13:30,1) Husband AS pattern
|
||||
55,Baliram Dhote,989971800101,91218347354720,989971800101BALGMC,30,MALE,,Single,vishweshwar dhote ,C/O Vishweshwar Dhote chichpura Saoner,Nagpur,MAHARASHTRA,441107,7249086637,O+ve,0.2695,0.1202,Normal (HbA),19-07-2023 11:09,
|
||||
96,Sneha Nandkishor Benote,994928579041,18622183642157,994928579041SNEGMC,20,FEMALE,lodhi,Single,nandkishor benote, shriram waard Nandpur,WARDHA,MAHARASHTRA,442201,8010136506,O+ve,0.3337,0.1358,Normal (HbA),24-07-2023 11:41,
|
||||
|
BIN
scripts/logo.png
Normal file
|
After Width: | Height: | Size: 57 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 46 KiB |
281
scripts/pdf.js
235
scripts/report_template.html
Normal file
@@ -0,0 +1,235 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<style>
|
||||
@media print {
|
||||
body {
|
||||
-webkit-print-color-adjust: exact;
|
||||
}
|
||||
}
|
||||
|
||||
.person-details-row {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.person-details-col {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 90px;
|
||||
width: 50%;
|
||||
margin: 1px;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
.test-details-row {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
.test-details-col {
|
||||
height: 100px;
|
||||
}
|
||||
|
||||
.test-cell-div {
|
||||
/* border: 1px solid black; */
|
||||
border-collapse: collapse;
|
||||
height: 20px;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.table-header {
|
||||
border: 1px solid black;
|
||||
margin: 0 0 -10px 10px;
|
||||
background-color: rgb(191, 191, 191);
|
||||
text-align: center;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
display: flex;
|
||||
font-weight: 600;
|
||||
height: 50px;
|
||||
width: 98%;
|
||||
}
|
||||
|
||||
@media print {
|
||||
.table-header {
|
||||
background-color: rgb(191, 191, 191) !important;
|
||||
print-color-adjust: exact;
|
||||
}
|
||||
}
|
||||
|
||||
@media print {
|
||||
.vendorListHeading th {
|
||||
color: white !important;
|
||||
}
|
||||
}
|
||||
|
||||
.test-method {
|
||||
font-weight: 200 !important;
|
||||
color: rgb(191, 191, 191);
|
||||
}
|
||||
|
||||
.result-value {
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.end-of-report {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.logo {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
table,
|
||||
th,
|
||||
td {
|
||||
border: 1px solid black;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style-type: none;
|
||||
/* margin: 0; */
|
||||
/* padding: 0; */
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div>
|
||||
<div class="logo">
|
||||
<img src="./logo_nobg.png" width="128" height="128" alt="sickle cell logo" />
|
||||
</div>
|
||||
<table style="border: 1px solid black; margin: 10px; width: 98%;">
|
||||
<tr class="person-details-row">
|
||||
<td class="person-details-col" style="border-right: 2; width: 70%;">
|
||||
<div><strong>Name:</strong></div>
|
||||
<div><strong>Age / Gender:</strong></div>
|
||||
<div><strong>Sample type:</strong></div>
|
||||
<div><strong>Family History of Sickle Cell Anemia:</strong></div>
|
||||
</td>
|
||||
<td class="person-details-col" style="width: 30%;">
|
||||
<div><strong>Marital Status:</strong></div>
|
||||
<div><strong>Test Date:</strong></div>
|
||||
<div><strong>Patient ID:</strong></div>
|
||||
<div><strong>Sample ID:</strong></div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div style="height: 2px;width: 98%; background-color: rgb(56, 105, 166); margin: 30px 10px 40px 10px;"></div>
|
||||
|
||||
|
||||
<div>
|
||||
<div class="table-header">POINT OF CARE SICKLE CELL ANEMIA TEST</div>
|
||||
<table class="test-details-table" style="border: 1px solid black; margin: 10px; width: 98%;">
|
||||
<tr style="height: 50px;">
|
||||
<th>
|
||||
Test Description
|
||||
</th>
|
||||
<th>
|
||||
RESULT
|
||||
</th>
|
||||
<th>
|
||||
REFERENCE RANGES
|
||||
</th>
|
||||
</tr>
|
||||
<tr class="test-details-row">
|
||||
<td class="test-details-col" style="width: 20%; margin: 10px;">
|
||||
<div style="margin: 10px;">Sickle Cell
|
||||
Anemia
|
||||
<div class="test-method">(Method: HPOS)</div>
|
||||
</div>
|
||||
</td>
|
||||
<td style="width: 30%;">
|
||||
<div class="result-value">Ra = 0.16</div>
|
||||
<!-- <div class="test-cell-div">Normal</div>
|
||||
<div class="test-cell-div">Sickle Cell Trait</div>
|
||||
<div class="test-cell-div">Sickle Cell Disease</div>
|
||||
<div class="test-cell-div">Negative Borderline</div>
|
||||
<div class="test-cell-div">Positive Borderline</div> -->
|
||||
</td>
|
||||
<td style="width: 50%;">
|
||||
<div class="test-cell-div">
|
||||
< 0.16: Normal (HbA)</div>
|
||||
<div class="test-cell-div">0.165 – 0.235: Sickle-cell Trait (HbAS)</div>
|
||||
<div class="test-cell-div">> 0.24: Sickle-cell Disease (HbSS)</div>
|
||||
<div class="test-cell-div">0.16-0.165: Inconclusive (Negative Borderline)</div>
|
||||
<div class="test-cell-div">0.235 – 0.24: Inconclusive (Positive Borderline)</div>
|
||||
</td>
|
||||
<!-- <td style="width: 25%;">
|
||||
<div class="test-cell-div">Normal</div>
|
||||
<div class="test-cell-div">Sickle Cell Trait</div>
|
||||
<div class="test-cell-div">Sickle Cell Disease</div>
|
||||
<div class="test-cell-div">Recommended for HPLC or Electrophoresis Tests</div>
|
||||
<div class="test-cell-div">Recommended for HPLC or Electrophore</div>
|
||||
</td> -->
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<!-- <div style="font-weight: 600; margin: 10px;">INTERPRETATION:</div> -->
|
||||
|
||||
<div style="margin: 10px;">
|
||||
<strong>Test Principle:</strong> This point of care quantitative diagnostic test for sickle-cell anemia
|
||||
works on the principle of absorption
|
||||
spectroscopy. The test helps in differentiating heterozygous/homozygous hemoglobin from normal hemoglobin.
|
||||
</div>
|
||||
|
||||
<div style="margin: 10px;">
|
||||
<strong>Method:</strong> High Performance Optical Spectroscopy (HPOS) for detection of Sickle cell trait and
|
||||
sickle cell disease in whole blood capillary blood samples.
|
||||
</div>
|
||||
|
||||
<div style="margin: 10px;">
|
||||
<strong> Note:</strong>
|
||||
<!-- <ul>
|
||||
<li>a. Blood transfusion may have an impact on the test results.</li>
|
||||
|
||||
<li>
|
||||
b. Patients already on sickle-cell medications may impact test results.
|
||||
</li>
|
||||
</ul> -->
|
||||
|
||||
Borderline cases are reported as inconclusive. It may occur due to several factors such as medication,
|
||||
transfusion, field conditions and assay process. Further clinical tests are recommended in these cases for
|
||||
diagnosis.
|
||||
</div>
|
||||
|
||||
<!-- <div
|
||||
style="margin: 80px 10px 20px 50px; width: 88%; display: flex; flex-direction: row; justify-content: space-between; align-items: center;">
|
||||
<div style="margin: 5px;">DATE:</div>
|
||||
<div style="margin: 5px;">Hematologist</div>
|
||||
</div> -->
|
||||
|
||||
<!-- <div style="margin: 30px;">
|
||||
This report is for the perusal of doctor only. Not for medico legal cases. Clinical correlation is
|
||||
essential.
|
||||
Please contact us in case of unexpected result.
|
||||
</div> -->
|
||||
<div style="height: 3px;width: 98%; background-color: black; margin-top: 150px;"></div>
|
||||
<div class="end-of-report">
|
||||
*** END OF REPORT ***</div>
|
||||
<div style="display: flex; justify-content: center; align-items: center; flex-direction: column;">
|
||||
<div style="font-style: italic; color: rgb(191, 191, 191);">
|
||||
This is an electronically generated report. Generated at HH:MM hrs on DD-MMM-YYYY.
|
||||
</div>
|
||||
<div>
|
||||
Note: Assay results should be correlated clinically with other clinical findings
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
BIN
scripts/reports/203986612834YOGGMC.pdf
Normal file
701
scripts/result_generation.ipynb
Normal file
@@ -0,0 +1,701 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"id": "30bd0387-b182-49a0-9591-6136df91f9b7",
|
||||
"metadata": {
|
||||
"tags": []
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Requirement already satisfied: xhtml2pdf in c:\\users\\acer\\anaconda3\\lib\\site-packages (0.2.11)\n",
|
||||
"Requirement already satisfied: arabic-reshaper>=3.0.0 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from xhtml2pdf) (3.0.0)\n",
|
||||
"Requirement already satisfied: html5lib>=1.0.1 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from xhtml2pdf) (1.1)\n",
|
||||
"Requirement already satisfied: Pillow>=8.1.1 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from xhtml2pdf) (9.4.0)\n",
|
||||
"Requirement already satisfied: pyHanko>=0.12.1 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from xhtml2pdf) (0.20.0)\n",
|
||||
"Requirement already satisfied: pyhanko-certvalidator>=0.19.5 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from xhtml2pdf) (0.23.0)\n",
|
||||
"Requirement already satisfied: pypdf>=3.1.0 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from xhtml2pdf) (3.15.2)\n",
|
||||
"Requirement already satisfied: python-bidi>=0.4.2 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from xhtml2pdf) (0.4.2)\n",
|
||||
"Requirement already satisfied: reportlab<4,>=3.5.53 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from xhtml2pdf) (3.6.13)\n",
|
||||
"Requirement already satisfied: svglib>=1.2.1 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from xhtml2pdf) (1.5.1)\n",
|
||||
"Requirement already satisfied: six>=1.9 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from html5lib>=1.0.1->xhtml2pdf) (1.16.0)\n",
|
||||
"Requirement already satisfied: webencodings in c:\\users\\acer\\anaconda3\\lib\\site-packages (from html5lib>=1.0.1->xhtml2pdf) (0.5.1)\n",
|
||||
"Requirement already satisfied: asn1crypto>=1.5.1 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from pyHanko>=0.12.1->xhtml2pdf) (1.5.1)\n",
|
||||
"Requirement already satisfied: qrcode>=6.1 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from pyHanko>=0.12.1->xhtml2pdf) (7.4.2)\n",
|
||||
"Requirement already satisfied: tzlocal>=4.3 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from pyHanko>=0.12.1->xhtml2pdf) (5.0.1)\n",
|
||||
"Requirement already satisfied: click>=7.1.2 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from pyHanko>=0.12.1->xhtml2pdf) (8.0.4)\n",
|
||||
"Requirement already satisfied: requests>=2.24.0 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from pyHanko>=0.12.1->xhtml2pdf) (2.29.0)\n",
|
||||
"Requirement already satisfied: pyyaml>=5.3.1 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from pyHanko>=0.12.1->xhtml2pdf) (6.0)\n",
|
||||
"Requirement already satisfied: cryptography>=3.3.1 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from pyHanko>=0.12.1->xhtml2pdf) (39.0.1)\n",
|
||||
"Requirement already satisfied: oscrypto>=1.1.0 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from pyhanko-certvalidator>=0.19.5->xhtml2pdf) (1.3.0)\n",
|
||||
"Requirement already satisfied: uritools>=3.0.1 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from pyhanko-certvalidator>=0.19.5->xhtml2pdf) (4.0.1)\n",
|
||||
"Requirement already satisfied: lxml in c:\\users\\acer\\anaconda3\\lib\\site-packages (from svglib>=1.2.1->xhtml2pdf) (4.9.2)\n",
|
||||
"Requirement already satisfied: tinycss2>=0.6.0 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from svglib>=1.2.1->xhtml2pdf) (1.2.1)\n",
|
||||
"Requirement already satisfied: cssselect2>=0.2.0 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from svglib>=1.2.1->xhtml2pdf) (0.7.0)\n",
|
||||
"Requirement already satisfied: colorama in c:\\users\\acer\\anaconda3\\lib\\site-packages (from click>=7.1.2->pyHanko>=0.12.1->xhtml2pdf) (0.4.6)\n",
|
||||
"Requirement already satisfied: cffi>=1.12 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from cryptography>=3.3.1->pyHanko>=0.12.1->xhtml2pdf) (1.15.1)\n",
|
||||
"Requirement already satisfied: typing-extensions in c:\\users\\acer\\anaconda3\\lib\\site-packages (from qrcode>=6.1->pyHanko>=0.12.1->xhtml2pdf) (4.6.3)\n",
|
||||
"Requirement already satisfied: pypng in c:\\users\\acer\\anaconda3\\lib\\site-packages (from qrcode>=6.1->pyHanko>=0.12.1->xhtml2pdf) (0.20220715.0)\n",
|
||||
"Requirement already satisfied: charset-normalizer<4,>=2 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from requests>=2.24.0->pyHanko>=0.12.1->xhtml2pdf) (2.0.4)\n",
|
||||
"Requirement already satisfied: idna<4,>=2.5 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from requests>=2.24.0->pyHanko>=0.12.1->xhtml2pdf) (3.4)\n",
|
||||
"Requirement already satisfied: urllib3<1.27,>=1.21.1 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from requests>=2.24.0->pyHanko>=0.12.1->xhtml2pdf) (1.26.16)\n",
|
||||
"Requirement already satisfied: certifi>=2017.4.17 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from requests>=2.24.0->pyHanko>=0.12.1->xhtml2pdf) (2023.5.7)\n",
|
||||
"Requirement already satisfied: tzdata in c:\\users\\acer\\anaconda3\\lib\\site-packages (from tzlocal>=4.3->pyHanko>=0.12.1->xhtml2pdf) (2023.3)\n",
|
||||
"Requirement already satisfied: pycparser in c:\\users\\acer\\anaconda3\\lib\\site-packages (from cffi>=1.12->cryptography>=3.3.1->pyHanko>=0.12.1->xhtml2pdf) (2.21)\n",
|
||||
"C:\\Users\\acer\\Desktop\\SMI\n",
|
||||
"Creating report 224321944144PADGMC.pdf ...\n",
|
||||
"Created PDF report 224321944144PADGMC.pdf.\n",
|
||||
"Creating report 226183001745JAHGMC.pdf ...\n",
|
||||
"Created PDF report 226183001745JAHGMC.pdf.\n",
|
||||
"Creating report 226878454892ROSGMC.pdf ...\n",
|
||||
"Created PDF report 226878454892ROSGMC.pdf.\n",
|
||||
"Creating report 229745607482KAHGMC.pdf ...\n",
|
||||
"Created PDF report 229745607482KAHGMC.pdf.\n",
|
||||
"Creating report 237087936489DEEGMC.pdf ...\n",
|
||||
"Created PDF report 237087936489DEEGMC.pdf.\n",
|
||||
"Creating report 237203051990AMAGMC.pdf ...\n",
|
||||
"Created PDF report 237203051990AMAGMC.pdf.\n",
|
||||
"Creating report 255647157660SAUGMC.pdf ...\n",
|
||||
"Created PDF report 255647157660SAUGMC.pdf.\n",
|
||||
"Creating report 263271759284SANGMC.pdf ...\n",
|
||||
"Created PDF report 263271759284SANGMC.pdf.\n",
|
||||
"Creating report 268796021035MONGMC.pdf ...\n",
|
||||
"Created PDF report 268796021035MONGMC.pdf.\n",
|
||||
"Creating report 269278670283SASGMC.pdf ...\n",
|
||||
"Created PDF report 269278670283SASGMC.pdf.\n",
|
||||
"Creating report 271596197534ISHGMC.pdf ...\n",
|
||||
"Created PDF report 271596197534ISHGMC.pdf.\n",
|
||||
"Creating report 272237948944PRAGMC.pdf ...\n",
|
||||
"Created PDF report 272237948944PRAGMC.pdf.\n",
|
||||
"Creating report 278272632291SHOGMC.pdf ...\n",
|
||||
"Created PDF report 278272632291SHOGMC.pdf.\n",
|
||||
"Creating report 283856462155ABDGMC.pdf ...\n",
|
||||
"Created PDF report 283856462155ABDGMC.pdf.\n",
|
||||
"Creating report 284146609891KUSGMC.pdf ...\n",
|
||||
"Created PDF report 284146609891KUSGMC.pdf.\n",
|
||||
"Creating report 285846592059GAUGMC.pdf ...\n",
|
||||
"Created PDF report 285846592059GAUGMC.pdf.\n",
|
||||
"Creating report 287500935512MANGMC.pdf ...\n",
|
||||
"Created PDF report 287500935512MANGMC.pdf.\n",
|
||||
"Creating report 294917378637PRAGMC.pdf ...\n",
|
||||
"Created PDF report 294917378637PRAGMC.pdf.\n",
|
||||
"Creating report 296362702170SAHGMC.pdf ...\n",
|
||||
"Created PDF report 296362702170SAHGMC.pdf.\n",
|
||||
"Creating report 298781876459RITGMC.pdf ...\n",
|
||||
"Created PDF report 298781876459RITGMC.pdf.\n",
|
||||
"Creating report 299644159567ROSGMC.pdf ...\n",
|
||||
"Created PDF report 299644159567ROSGMC.pdf.\n",
|
||||
"Creating report 307721259755AMOGMC.pdf ...\n",
|
||||
"Created PDF report 307721259755AMOGMC.pdf.\n",
|
||||
"Creating report 310010093502PRAGMC.pdf ...\n",
|
||||
"Created PDF report 310010093502PRAGMC.pdf.\n",
|
||||
"Creating report 311128923689HARGMC.pdf ...\n",
|
||||
"Created PDF report 311128923689HARGMC.pdf.\n",
|
||||
"Creating report 311606424900VIJGMC.pdf ...\n",
|
||||
"Created PDF report 311606424900VIJGMC.pdf.\n",
|
||||
"Creating report 314426028466NIRGMC.pdf ...\n",
|
||||
"Created PDF report 314426028466NIRGMC.pdf.\n",
|
||||
"Creating report 317380302501TRUGMC.pdf ...\n",
|
||||
"Created PDF report 317380302501TRUGMC.pdf.\n",
|
||||
"Creating report 319753488845SARGMC.pdf ...\n",
|
||||
"Created PDF report 319753488845SARGMC.pdf.\n",
|
||||
"Creating report 319753488845SARGMC.pdf ...\n",
|
||||
"Created PDF report 319753488845SARGMC.pdf.\n",
|
||||
"Creating report 325603399153CHIGMC.pdf ...\n",
|
||||
"Created PDF report 325603399153CHIGMC.pdf.\n",
|
||||
"Creating report 327678894405SANGMC.pdf ...\n",
|
||||
"Created PDF report 327678894405SANGMC.pdf.\n",
|
||||
"Creating report 337846930324RANGMC.pdf ...\n",
|
||||
"Created PDF report 337846930324RANGMC.pdf.\n",
|
||||
"Creating report 341450969561PURGMC.pdf ...\n",
|
||||
"Created PDF report 341450969561PURGMC.pdf.\n",
|
||||
"Creating report 342593460393PRAGMC.pdf ...\n",
|
||||
"Created PDF report 342593460393PRAGMC.pdf.\n",
|
||||
"Creating report 353279260573AJAGMC.pdf ...\n",
|
||||
"Created PDF report 353279260573AJAGMC.pdf.\n",
|
||||
"Creating report 353306947152ZAKGMC.pdf ...\n",
|
||||
"Created PDF report 353306947152ZAKGMC.pdf.\n",
|
||||
"Creating report 355360873978PRAGMC.pdf ...\n",
|
||||
"Created PDF report 355360873978PRAGMC.pdf.\n",
|
||||
"Creating report 359765748394SAKGMC.pdf ...\n",
|
||||
"Created PDF report 359765748394SAKGMC.pdf.\n",
|
||||
"Creating report 360535868118MANGMC.pdf ...\n",
|
||||
"Created PDF report 360535868118MANGMC.pdf.\n",
|
||||
"Creating report 360908191249SHUGMC.pdf ...\n",
|
||||
"Created PDF report 360908191249SHUGMC.pdf.\n",
|
||||
"Creating report 373377473748MANGMC.pdf ...\n",
|
||||
"Created PDF report 373377473748MANGMC.pdf.\n",
|
||||
"Creating report 389121687339RIDGMC.pdf ...\n",
|
||||
"Created PDF report 389121687339RIDGMC.pdf.\n",
|
||||
"Creating report 393597721191BHAGMC.pdf ...\n",
|
||||
"Created PDF report 393597721191BHAGMC.pdf.\n",
|
||||
"Creating report 405674149187NEEGMC.pdf ...\n",
|
||||
"Created PDF report 405674149187NEEGMC.pdf.\n",
|
||||
"Creating report 417508588250ARCGMC.pdf ...\n",
|
||||
"Created PDF report 417508588250ARCGMC.pdf.\n",
|
||||
"Creating report 421583296569AARGMC.pdf ...\n",
|
||||
"Created PDF report 421583296569AARGMC.pdf.\n",
|
||||
"Creating report 433985179851ANKGMC.pdf ...\n",
|
||||
"Created PDF report 433985179851ANKGMC.pdf.\n",
|
||||
"Creating report 443279685870SWAGMC.pdf ...\n",
|
||||
"Created PDF report 443279685870SWAGMC.pdf.\n",
|
||||
"Creating report 455600775837SHEGMC.pdf ...\n",
|
||||
"Created PDF report 455600775837SHEGMC.pdf.\n",
|
||||
"Creating report 459277955751SHUGMC.pdf ...\n",
|
||||
"Created PDF report 459277955751SHUGMC.pdf.\n",
|
||||
"Creating report 465580226263RIKGMC.pdf ...\n",
|
||||
"Created PDF report 465580226263RIKGMC.pdf.\n",
|
||||
"Creating report 471615484151ABHGMC.pdf ...\n",
|
||||
"Created PDF report 471615484151ABHGMC.pdf.\n",
|
||||
"Creating report 475525838861YASGMC.pdf ...\n",
|
||||
"Created PDF report 475525838861YASGMC.pdf.\n",
|
||||
"Creating report 479202598101RIDGMC.pdf ...\n",
|
||||
"Created PDF report 479202598101RIDGMC.pdf.\n",
|
||||
"Creating report 479442143845MUKGMC.pdf ...\n",
|
||||
"Created PDF report 479442143845MUKGMC.pdf.\n",
|
||||
"Creating report 488029920533PRIGMC.pdf ...\n",
|
||||
"Created PDF report 488029920533PRIGMC.pdf.\n",
|
||||
"Creating report 489219388428SHAGMC.pdf ...\n",
|
||||
"Created PDF report 489219388428SHAGMC.pdf.\n",
|
||||
"Creating report 490503954532JATGMC.pdf ...\n",
|
||||
"Created PDF report 490503954532JATGMC.pdf.\n",
|
||||
"Creating report 491019906660RITGMC.pdf ...\n",
|
||||
"Created PDF report 491019906660RITGMC.pdf.\n",
|
||||
"Creating report 492125075012NISGMC.pdf ...\n",
|
||||
"Created PDF report 492125075012NISGMC.pdf.\n",
|
||||
"Creating report 493341165989RUPGMC.pdf ...\n",
|
||||
"Created PDF report 493341165989RUPGMC.pdf.\n",
|
||||
"Creating report 494297417882ANIGMC.pdf ...\n",
|
||||
"Created PDF report 494297417882ANIGMC.pdf.\n",
|
||||
"Creating report 506852177535SAPGMC.pdf ...\n",
|
||||
"Created PDF report 506852177535SAPGMC.pdf.\n",
|
||||
"Creating report 509244275563RASGMC.pdf ...\n",
|
||||
"Created PDF report 509244275563RASGMC.pdf.\n",
|
||||
"Creating report 512348509509YASGMC.pdf ...\n",
|
||||
"Created PDF report 512348509509YASGMC.pdf.\n",
|
||||
"Creating report 513119622787SUPGMC.pdf ...\n",
|
||||
"Created PDF report 513119622787SUPGMC.pdf.\n",
|
||||
"Creating report 514901607969DULGMC.pdf ...\n",
|
||||
"Created PDF report 514901607969DULGMC.pdf.\n",
|
||||
"Creating report 519280474150UPLGMC.pdf ...\n",
|
||||
"Created PDF report 519280474150UPLGMC.pdf.\n",
|
||||
"Creating report 538108658900SAMGMC.pdf ...\n",
|
||||
"Created PDF report 538108658900SAMGMC.pdf.\n",
|
||||
"Creating report 541941536175AKAGMC.pdf ...\n",
|
||||
"Created PDF report 541941536175AKAGMC.pdf.\n",
|
||||
"Creating report 550461542642NITGMC.pdf ...\n",
|
||||
"Created PDF report 550461542642NITGMC.pdf.\n",
|
||||
"Creating report 560034121333SACGMC.pdf ...\n",
|
||||
"Created PDF report 560034121333SACGMC.pdf.\n",
|
||||
"Creating report 565038512261AKSGMC.pdf ...\n",
|
||||
"Created PDF report 565038512261AKSGMC.pdf.\n",
|
||||
"Creating report 567222979316VANGMC.pdf ...\n",
|
||||
"Created PDF report 567222979316VANGMC.pdf.\n",
|
||||
"Creating report 567798756109NITGMC.pdf ...\n",
|
||||
"Created PDF report 567798756109NITGMC.pdf.\n",
|
||||
"Creating report 575462464598KAJGMC.pdf ...\n",
|
||||
"Created PDF report 575462464598KAJGMC.pdf.\n",
|
||||
"Creating report 580350702718KESGMC.pdf ...\n",
|
||||
"Created PDF report 580350702718KESGMC.pdf.\n",
|
||||
"Creating report 585270001058AADGMC.pdf ...\n",
|
||||
"Created PDF report 585270001058AADGMC.pdf.\n",
|
||||
"Creating report 587938357479DURGMC.pdf ...\n",
|
||||
"Created PDF report 587938357479DURGMC.pdf.\n",
|
||||
"Creating report 590553453852YOGGMC.pdf ...\n",
|
||||
"Created PDF report 590553453852YOGGMC.pdf.\n",
|
||||
"Creating report 590890585020CHEGMC.pdf ...\n",
|
||||
"Created PDF report 590890585020CHEGMC.pdf.\n",
|
||||
"Creating report 591363992210DURGMC.pdf ...\n",
|
||||
"Created PDF report 591363992210DURGMC.pdf.\n",
|
||||
"Creating report 594841376463KRIGMC.pdf ...\n",
|
||||
"Created PDF report 594841376463KRIGMC.pdf.\n",
|
||||
"Creating report 597085427787SAUGMC.pdf ...\n",
|
||||
"Created PDF report 597085427787SAUGMC.pdf.\n",
|
||||
"Creating report 600608817741JITGMC.pdf ...\n",
|
||||
"Created PDF report 600608817741JITGMC.pdf.\n",
|
||||
"Creating report 603297566444CHAGMC.pdf ...\n",
|
||||
"Created PDF report 603297566444CHAGMC.pdf.\n",
|
||||
"Creating report 603297566444CHAGMC.pdf ...\n",
|
||||
"Created PDF report 603297566444CHAGMC.pdf.\n",
|
||||
"Creating report 616513617547SHAGMC.pdf ...\n",
|
||||
"Created PDF report 616513617547SHAGMC.pdf.\n",
|
||||
"Creating report 616520778409KASGMC.pdf ...\n",
|
||||
"Created PDF report 616520778409KASGMC.pdf.\n",
|
||||
"Creating report 622752150758SINGMC.pdf ...\n",
|
||||
"Created PDF report 622752150758SINGMC.pdf.\n",
|
||||
"Creating report 626223576285SANGMC.pdf ...\n",
|
||||
"Created PDF report 626223576285SANGMC.pdf.\n",
|
||||
"Creating report 626223576285SANGMC.pdf ...\n",
|
||||
"Created PDF report 626223576285SANGMC.pdf.\n",
|
||||
"Creating report 626683507657ROSGMC.pdf ...\n",
|
||||
"Created PDF report 626683507657ROSGMC.pdf.\n",
|
||||
"Creating report 638267012322ANCGMC.pdf ...\n",
|
||||
"Created PDF report 638267012322ANCGMC.pdf.\n",
|
||||
"Creating report 642098628989VANGMC.pdf ...\n",
|
||||
"Created PDF report 642098628989VANGMC.pdf.\n",
|
||||
"Creating report 643701315855RAJGMC.pdf ...\n",
|
||||
"Created PDF report 643701315855RAJGMC.pdf.\n",
|
||||
"Creating report 647499673461DURGMC.pdf ...\n",
|
||||
"Created PDF report 647499673461DURGMC.pdf.\n",
|
||||
"Creating report 653065092904CHAGMC.pdf ...\n",
|
||||
"Created PDF report 653065092904CHAGMC.pdf.\n",
|
||||
"Creating report 669591213509DIPGMC.pdf ...\n",
|
||||
"Created PDF report 669591213509DIPGMC.pdf.\n",
|
||||
"Creating report 670035450038ABHGMC.pdf ...\n",
|
||||
"Created PDF report 670035450038ABHGMC.pdf.\n",
|
||||
"Creating report 670376336482MOIGMC.pdf ...\n",
|
||||
"Created PDF report 670376336482MOIGMC.pdf.\n",
|
||||
"Creating report 674393517322HARGMC.pdf ...\n",
|
||||
"Created PDF report 674393517322HARGMC.pdf.\n",
|
||||
"Creating report 681272836240SHUGMC.pdf ...\n",
|
||||
"Created PDF report 681272836240SHUGMC.pdf.\n",
|
||||
"Creating report 684874896145KU.GMC.pdf ...\n",
|
||||
"Created PDF report 684874896145KU.GMC.pdf.\n",
|
||||
"Creating report 697644331965VAIGMC.pdf ...\n",
|
||||
"Created PDF report 697644331965VAIGMC.pdf.\n",
|
||||
"Creating report 720576449689ANNGMC.pdf ...\n",
|
||||
"Created PDF report 720576449689ANNGMC.pdf.\n",
|
||||
"Creating report 725974004210JITGMC.pdf ...\n",
|
||||
"Created PDF report 725974004210JITGMC.pdf.\n",
|
||||
"Creating report 728666171817KAJGMC.pdf ...\n",
|
||||
"Created PDF report 728666171817KAJGMC.pdf.\n",
|
||||
"Creating report 733220053897AKSGMC.pdf ...\n",
|
||||
"Created PDF report 733220053897AKSGMC.pdf.\n",
|
||||
"Creating report 750322934305SARGMC.pdf ...\n",
|
||||
"Created PDF report 750322934305SARGMC.pdf.\n",
|
||||
"Creating report 750853208769PRIGMC.pdf ...\n",
|
||||
"Created PDF report 750853208769PRIGMC.pdf.\n",
|
||||
"Creating report 758907770937DHAGMC.pdf ...\n",
|
||||
"Created PDF report 758907770937DHAGMC.pdf.\n",
|
||||
"Creating report 759014921528SUMGMC.pdf ...\n",
|
||||
"Created PDF report 759014921528SUMGMC.pdf.\n",
|
||||
"Creating report 765225110445VAIGMC.pdf ...\n",
|
||||
"Created PDF report 765225110445VAIGMC.pdf.\n",
|
||||
"Creating report 771905165783SHAGMC.pdf ...\n",
|
||||
"Created PDF report 771905165783SHAGMC.pdf.\n",
|
||||
"Creating report 774602363978SHLGMC.pdf ...\n",
|
||||
"Created PDF report 774602363978SHLGMC.pdf.\n",
|
||||
"Creating report 782614827816HARGMC.pdf ...\n",
|
||||
"Created PDF report 782614827816HARGMC.pdf.\n",
|
||||
"Creating report 789364502481S AGMC.pdf ...\n",
|
||||
"Created PDF report 789364502481S AGMC.pdf.\n",
|
||||
"Creating report 792467787662SHRGMC.pdf ...\n",
|
||||
"Created PDF report 792467787662SHRGMC.pdf.\n",
|
||||
"Creating report 805043473836SUMGMC.pdf ...\n",
|
||||
"Created PDF report 805043473836SUMGMC.pdf.\n",
|
||||
"Creating report 815306073532MUSGMC.pdf ...\n",
|
||||
"Created PDF report 815306073532MUSGMC.pdf.\n",
|
||||
"Creating report 819077305910KHAGMC.pdf ...\n",
|
||||
"Created PDF report 819077305910KHAGMC.pdf.\n",
|
||||
"Creating report 827465570428ZEEGMC.pdf ...\n",
|
||||
"Created PDF report 827465570428ZEEGMC.pdf.\n",
|
||||
"Creating report 831357896529CHAGMC.pdf ...\n",
|
||||
"Created PDF report 831357896529CHAGMC.pdf.\n",
|
||||
"Creating report 834051733492PRAGMC.pdf ...\n",
|
||||
"Created PDF report 834051733492PRAGMC.pdf.\n",
|
||||
"Creating report 838194370051GAUGMC.pdf ...\n",
|
||||
"Created PDF report 838194370051GAUGMC.pdf.\n",
|
||||
"Creating report 844097319729SHAGMC.pdf ...\n",
|
||||
"Created PDF report 844097319729SHAGMC.pdf.\n",
|
||||
"Creating report 846948594390YASGMC.pdf ...\n",
|
||||
"Created PDF report 846948594390YASGMC.pdf.\n",
|
||||
"Creating report 848136889726MUGGMC.pdf ...\n",
|
||||
"Created PDF report 848136889726MUGGMC.pdf.\n",
|
||||
"Creating report 849079906443RAHGMC.pdf ...\n",
|
||||
"Created PDF report 849079906443RAHGMC.pdf.\n",
|
||||
"Creating report 877147864729AKAGMC.pdf ...\n",
|
||||
"Created PDF report 877147864729AKAGMC.pdf.\n",
|
||||
"Creating report 888760045335RAKGMC.pdf ...\n",
|
||||
"Created PDF report 888760045335RAKGMC.pdf.\n",
|
||||
"Creating report 892921681188ASHGMC.pdf ...\n",
|
||||
"Created PDF report 892921681188ASHGMC.pdf.\n",
|
||||
"Creating report 895316097017RAKGMC.pdf ...\n",
|
||||
"Created PDF report 895316097017RAKGMC.pdf.\n",
|
||||
"Creating report 895989269042TILGMC.pdf ...\n",
|
||||
"Created PDF report 895989269042TILGMC.pdf.\n",
|
||||
"Creating report 900769653784TARGMC.pdf ...\n",
|
||||
"Created PDF report 900769653784TARGMC.pdf.\n",
|
||||
"Creating report 903247738868VAIGMC.pdf ...\n",
|
||||
"Created PDF report 903247738868VAIGMC.pdf.\n",
|
||||
"Creating report 908300994257SATGMC.pdf ...\n",
|
||||
"Created PDF report 908300994257SATGMC.pdf.\n",
|
||||
"Creating report 908300994257SATGMC.pdf ...\n",
|
||||
"Created PDF report 908300994257SATGMC.pdf.\n",
|
||||
"Creating report 910605003271SUJGMC.pdf ...\n",
|
||||
"Created PDF report 910605003271SUJGMC.pdf.\n",
|
||||
"Creating report 918039154000ANTGMC.pdf ...\n",
|
||||
"Created PDF report 918039154000ANTGMC.pdf.\n",
|
||||
"Creating report 920680985699ABHGMC.pdf ...\n",
|
||||
"Created PDF report 920680985699ABHGMC.pdf.\n",
|
||||
"Creating report 921761502414SUNGMC.pdf ...\n",
|
||||
"Created PDF report 921761502414SUNGMC.pdf.\n",
|
||||
"Creating report 942751311120ABHGMC.pdf ...\n",
|
||||
"Created PDF report 942751311120ABHGMC.pdf.\n",
|
||||
"Creating report 949461709290SNEGMC.pdf ...\n",
|
||||
"Created PDF report 949461709290SNEGMC.pdf.\n",
|
||||
"Creating report 950292912605HEMGMC.pdf ...\n",
|
||||
"Created PDF report 950292912605HEMGMC.pdf.\n",
|
||||
"Creating report 960105176414RITGMC.pdf ...\n",
|
||||
"Created PDF report 960105176414RITGMC.pdf.\n",
|
||||
"Creating report 964003970313MANGMC.pdf ...\n",
|
||||
"Created PDF report 964003970313MANGMC.pdf.\n",
|
||||
"Creating report 992346311078SHUGMC.pdf ...\n",
|
||||
"Created PDF report 992346311078SHUGMC.pdf.\n",
|
||||
"Creating report 995305552243MOHGMC.pdf ...\n",
|
||||
"Created PDF report 995305552243MOHGMC.pdf.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"\n",
|
||||
"import sys\n",
|
||||
"import csv\n",
|
||||
"#import qrcode\n",
|
||||
"! pip install xhtml2pdf\n",
|
||||
"from xhtml2pdf import pisa\n",
|
||||
"from jinja2 import Environment, FileSystemLoader\n",
|
||||
"import os\n",
|
||||
"import pandas as pd\n",
|
||||
"\n",
|
||||
"# Capture our current directory\n",
|
||||
"THIS_DIR = os.path.dirname(os.path.abspath(r\"C:\\Users\\acer\\Desktop\\SMI\"))\n",
|
||||
"print(os.getcwd())\n",
|
||||
"\n",
|
||||
"#def generateQRCode(rptD):\n",
|
||||
" # qrc = qrcode.QRCode(version=10,error_correction=qrcode.constants.ERROR_CORRECT_H)\n",
|
||||
" # data = \"SRF ID : {} \\n ICMR ID: {} \\n IISc ID: {} \\n Name: {} \\n Age: {} \\n Gender: {} \\n Swab Collected On: {} \\n Lab Name: Indian Institute of Science, Bangalore\\n Result Date: {} \\n Test Type: RT-PCR\\n Test Result: {}.\\n\".format(rptD['srfid'],rptD['sampleICMRID'],rptD['sampleIIScID'],rptD['patientName'],rptD['patientAge'],rptD['patientGender'],rptD['sampleCollectionDate'],rptD['testDate'],rptD['testResult'])\n",
|
||||
" # qrc.add_data(data)\n",
|
||||
" #qrImg = qrc.make_image(fill_color=\"black\", back_color=\"white\")\n",
|
||||
" #qrImg.save(rptD['qrcodeImgFile'])\n",
|
||||
" #return\n",
|
||||
"\n",
|
||||
"def prepareData(row):\n",
|
||||
" rptData = {}\n",
|
||||
"\n",
|
||||
" rptData['Person Name'] = row['Name']\n",
|
||||
" rptData['Age'] = row['Age']\n",
|
||||
" rptData['Gender'] = row['Gender']\n",
|
||||
" rptData['Age / Sex'] = f\"{rptData['Age']} ({rptData['Gender']})\"\n",
|
||||
" rptData['Sample type'] = 'Capillary Whole Blood'\n",
|
||||
" rptData['Family History of Sickle Cell Anemia'] = 'Unknown'\n",
|
||||
" rptData['Marital Status'] = row['Marital Status']\n",
|
||||
" rptData['Test Date'] = pd.to_datetime(row['testTime']).date()\n",
|
||||
" rptData['Patient ID'] = row['ABHA ID']\n",
|
||||
" rptData['Sample ID'] = row['_id']\n",
|
||||
" rptData['value'] = row['Measured Deovix Ratio']\n",
|
||||
" #rptData['qrcodeImgFile'] = 'qr_' + row['SRF ID'] + '.png'\n",
|
||||
" # generateQRCode(rptData)\n",
|
||||
" return rptData\n",
|
||||
"\n",
|
||||
"def generatePDFReport(row):\n",
|
||||
" outFilename = row['_id'] + '.pdf'\n",
|
||||
" # fill template with sample result values\n",
|
||||
" # generate report\n",
|
||||
" # generate qr code\n",
|
||||
" # convert to pdf\n",
|
||||
" print(\"Creating report %s ...\" % outFilename)\n",
|
||||
" j2_env = Environment(loader=FileSystemLoader(THIS_DIR),\n",
|
||||
" trim_blocks=True)\n",
|
||||
" rd = prepareData(row)\n",
|
||||
" # template_path = os.path.join(THIS_DIR, 'report_template.html')\n",
|
||||
"\n",
|
||||
" report_template =r'''\n",
|
||||
"<!DOCTYPE html>\n",
|
||||
"<html>\n",
|
||||
"\n",
|
||||
"<head>\n",
|
||||
" <style>\n",
|
||||
" @media print {\n",
|
||||
" body {\n",
|
||||
" -webkit-print-color-adjust: exact;\n",
|
||||
" }\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" .person-details-row {\n",
|
||||
" display: flex;\n",
|
||||
" flex-direction: row;\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" .person-details-col {\n",
|
||||
" display: flex;\n",
|
||||
" flex-direction: column;\n",
|
||||
" height: 90px;\n",
|
||||
" width: 50%;\n",
|
||||
" margin: 1px;\n",
|
||||
" border: 0;\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" .test-details-row {\n",
|
||||
" border: 0;\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" .test-details-col {\n",
|
||||
" height: 100px;\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" .test-cell-div {\n",
|
||||
" /* border: 1px solid black; */\n",
|
||||
" border-collapse: collapse;\n",
|
||||
" height: 20px;\n",
|
||||
" padding: 10px;\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" .table-header {\n",
|
||||
" border: 1px solid black;\n",
|
||||
" margin: 0 0 -10px 10px;\n",
|
||||
" background-color: rgb(191, 191, 191);\n",
|
||||
" text-align: center;\n",
|
||||
" justify-content: center;\n",
|
||||
" align-items: center;\n",
|
||||
" display: flex;\n",
|
||||
" font-weight: 600;\n",
|
||||
" height: 50px;\n",
|
||||
" width: 98%;\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" @media print {\n",
|
||||
" .table-header {\n",
|
||||
" background-color: rgb(191, 191, 191) !important;\n",
|
||||
" print-color-adjust: exact;\n",
|
||||
" }\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" @media print {\n",
|
||||
" .vendorListHeading th {\n",
|
||||
" color: white !important;\n",
|
||||
" }\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" .test-method {\n",
|
||||
" font-weight: 200 !important;\n",
|
||||
" color: rgb(191, 191, 191);\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" .result-value {\n",
|
||||
" justify-content: center;\n",
|
||||
" align-items: center;\n",
|
||||
" display: flex;\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" .end-of-report {\n",
|
||||
" display: flex;\n",
|
||||
" align-items: center;\n",
|
||||
" justify-content: center;\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" .logo {\n",
|
||||
" display: flex;\n",
|
||||
" justify-content: center;\n",
|
||||
" align-items: center;\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" table,\n",
|
||||
" th,\n",
|
||||
" td {\n",
|
||||
" border: 1px solid black;\n",
|
||||
" border-collapse: collapse;\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" ul {\n",
|
||||
" list-style-type: none;\n",
|
||||
" /* margin: 0; */\n",
|
||||
" /* padding: 0; */\n",
|
||||
" }\n",
|
||||
" </style>\n",
|
||||
"</head>\n",
|
||||
"\n",
|
||||
"<body>\n",
|
||||
" <div>\n",
|
||||
" <div class=\"logo\">\n",
|
||||
" <img src=\"C:\\Users\\acer\\Desktop\\SMI\\logo_nobg.png\" width=\"128\" height=\"128\" alt=\"sickle cell logo\" />\n",
|
||||
" </div>\n",
|
||||
" <table style=\"border: 1px solid black; margin: 10px; width: 98%;\">\n",
|
||||
" <tr class=\"person-details-row\">\n",
|
||||
" <td class=\"person-details-col\" style=\"border-right: 2; width: 70%;\">\n",
|
||||
" <div><strong>Person Name:</strong> {{ reportData[\"Person Name\"] }}</div>\n",
|
||||
" <div><strong>Age / Sex:</strong> {{reportData['Age']}} / {{reportData['Gender']}}</div>\n",
|
||||
" <div><strong>Sample type:</strong>{{ reportData[\"Sample type\"] }}</div>\n",
|
||||
" <div><strong>Family History of Sickle Cell Anemia:</strong>{{ reportData[\"Family History of Sickle Cell Anemia\"] }}</div>\n",
|
||||
" </td>\n",
|
||||
" <td class=\"person-details-col\" style=\"width: 30%;\">\n",
|
||||
" <div><strong>Marital Status:</strong>{{ reportData[\"Marital Status\"] }}</div>\n",
|
||||
" <div><strong>Test Date:</strong>{{ reportData[\"Test Date\"] }}</div> \n",
|
||||
" <div><strong>ABHA ID:</strong>{{ reportData[\"Patient ID\"] }}</div>\n",
|
||||
" <div><strong>Sample ID:</strong>{{ reportData[\"Sample ID\"] }}</div>\n",
|
||||
" </td>\n",
|
||||
" </tr>\n",
|
||||
" </table>\n",
|
||||
" </div>\n",
|
||||
"\n",
|
||||
"\n",
|
||||
" <div style=\"height: 2px;width: 98%; background-color: rgb(56, 105, 166); margin: 30px 10px 40px 10px;\"></div>\n",
|
||||
"\n",
|
||||
"\n",
|
||||
" <div>\n",
|
||||
" <div class=\"table-header\">POINT OF CARE SICKLE CELL ANEMIA TEST</div>\n",
|
||||
" <table class=\"test-details-table\" style=\"border: 1px solid black; margin: 10px; width: 98%;\">\n",
|
||||
" <tr style=\"height: 50px;\">\n",
|
||||
" <th>\n",
|
||||
" Test Description\n",
|
||||
" </th>\n",
|
||||
" <th>\n",
|
||||
" RESULT\n",
|
||||
" </th>\n",
|
||||
" <th>\n",
|
||||
" REFERENCE RANGES\n",
|
||||
" </th>\n",
|
||||
" </tr>\n",
|
||||
" <tr class=\"test-details-row\">\n",
|
||||
" <td class=\"test-details-col\" style=\"width: 20%; margin: 10px;\">\n",
|
||||
" <div style=\"margin: 10px;\">Sickle Cell\n",
|
||||
" Anemia\n",
|
||||
" <div class=\"test-method\">(Method: HPOS)</div>\n",
|
||||
" </div>\n",
|
||||
" </td>\n",
|
||||
" <td style=\"width: 30%;\">\n",
|
||||
" <div class=\"result-value\">Ra = {{ reportData[\"value\"] }}</div>\n",
|
||||
" <!-- <div class=\"test-cell-div\">Normal</div>\n",
|
||||
" <div class=\"test-cell-div\">Sickle Cell Trait</div>\n",
|
||||
" <div class=\"test-cell-div\">Sickle Cell Disease</div>\n",
|
||||
" <div class=\"test-cell-div\">Negative Borderline</div>\n",
|
||||
" <div class=\"test-cell-div\">Positive Borderline</div> -->\n",
|
||||
" </td>\n",
|
||||
" <td style=\"width: 50%;\">\n",
|
||||
" <div class=\"test-cell-div\">\n",
|
||||
" < 0.16: Normal (HbA)</div>\n",
|
||||
" <div class=\"test-cell-div\">0.165 – 0.235: Sickle-cell Trait (HbAS)</div>\n",
|
||||
" <div class=\"test-cell-div\">> 0.24: Sickle-cell Disease (HbSS)</div>\n",
|
||||
" <div class=\"test-cell-div\">0.16-0.165: Inconclusive (Negative Borderline)</div>\n",
|
||||
" <div class=\"test-cell-div\">0.235 – 0.24: Inconclusive (Positive Borderline)</div>\n",
|
||||
" </td>\n",
|
||||
" <!-- <td style=\"width: 25%;\">\n",
|
||||
" <div class=\"test-cell-div\">Normal</div>\n",
|
||||
" <div class=\"test-cell-div\">Sickle Cell Trait</div>\n",
|
||||
" <div class=\"test-cell-div\">Sickle Cell Disease</div>\n",
|
||||
" <div class=\"test-cell-div\">Recommended for HPLC or Electrophoresis Tests</div>\n",
|
||||
" <div class=\"test-cell-div\">Recommended for HPLC or Electrophore</div>\n",
|
||||
" </td> -->\n",
|
||||
" </tr>\n",
|
||||
" </table>\n",
|
||||
" </div>\n",
|
||||
"\n",
|
||||
" <div>\n",
|
||||
" <!-- <div style=\"font-weight: 600; margin: 10px;\">INTERPRETATION:</div> -->\n",
|
||||
"\n",
|
||||
" <div style=\"margin: 10px;\">\n",
|
||||
" <strong>Test Principle:</strong> This point of care quantitative diagnostic test for sickle-cell anemia\n",
|
||||
" works on the principle of absorption\n",
|
||||
" spectroscopy. The test helps in differentiating heterozygous/homozygous hemoglobin from normal hemoglobin.\n",
|
||||
" </div>\n",
|
||||
"\n",
|
||||
" <div style=\"margin: 10px;\">\n",
|
||||
" <strong>Method:</strong> High Performance Optical Spectroscopy (HPOS) for detection of Sickle cell trait and\n",
|
||||
" sickle cell disease in whole blood capillary blood samples.\n",
|
||||
" </div>\n",
|
||||
"\n",
|
||||
" <div style=\"margin: 10px;\">\n",
|
||||
" <strong> Note:</strong>\n",
|
||||
" <!-- <ul>\n",
|
||||
" <li>a. Blood transfusion may have an impact on the test results.</li>\n",
|
||||
"\n",
|
||||
" <li>\n",
|
||||
" b. Patients already on sickle-cell medications may impact test results.\n",
|
||||
" </li>\n",
|
||||
" </ul> -->\n",
|
||||
"\n",
|
||||
" Borderline cases are reported as inconclusive. It may occur due to several factors such as medication,\n",
|
||||
" transfusion, field conditions and assay process. Further clinical tests are recommended in these cases for\n",
|
||||
" diagnosis.\n",
|
||||
" </div>\n",
|
||||
"\n",
|
||||
" <!-- <div\n",
|
||||
" style=\"margin: 80px 10px 20px 50px; width: 88%; display: flex; flex-direction: row; justify-content: space-between; align-items: center;\">\n",
|
||||
" <div style=\"margin: 5px;\">DATE:</div>\n",
|
||||
" <div style=\"margin: 5px;\">Hematologist</div>\n",
|
||||
" </div> -->\n",
|
||||
"\n",
|
||||
" <!-- <div style=\"margin: 30px;\">\n",
|
||||
" This report is for the perusal of doctor only. Not for medico legal cases. Clinical correlation is\n",
|
||||
" essential.\n",
|
||||
" Please contact us in case of unexpected result.\n",
|
||||
" </div> -->\n",
|
||||
" <div style=\"height: 3px;width: 98%; background-color: black; margin-top: 150px;\"></div>\n",
|
||||
" <div class=\"end-of-report\">\n",
|
||||
" *** END OF REPORT ***</div>\n",
|
||||
" <div style=\"display: flex; justify-content: center; align-items: center; flex-direction: column;\">\n",
|
||||
" <div style=\"font-style: italic; color: rgb(191, 191, 191);\">\n",
|
||||
" This is an electronically generated report. Generated at HH:MM hrs on DD-MMM-YYYY.\n",
|
||||
" </div>\n",
|
||||
" <div>\n",
|
||||
" Note: Assay results should be correlated clinically with other clinical findings\n",
|
||||
" </div>\n",
|
||||
" </div>\n",
|
||||
" </div>\n",
|
||||
"</body>\n",
|
||||
"\n",
|
||||
"</html>\n",
|
||||
"'''\n",
|
||||
" rptHtml = j2_env.from_string(report_template).render(reportData=rd)\n",
|
||||
" reportFile = open('reports/' + rd['Sample ID'] + '.pdf','w+b')\n",
|
||||
" pisa_status = pisa.CreatePDF(rptHtml, dest=reportFile)\n",
|
||||
" if not pisa_status.err:\n",
|
||||
" print(\"Created PDF report %s.\" % outFilename)\n",
|
||||
" #os.remove(rd['qrcodeImgFile'])\n",
|
||||
" return\n",
|
||||
"\n",
|
||||
"if (len(sys.argv) < 2):\n",
|
||||
" print(\"Usage: genLabReport.py <results_file.csv>\")\n",
|
||||
" sys.exit(1)\n",
|
||||
"\n",
|
||||
"csv_file_path = r\"C:\\Users\\acer\\Desktop\\SMI\\TILL AUG5.csv\" # Replace this with the actual path to your CSV file\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"with open(csv_file_path) as resultsCSVFile:\n",
|
||||
" reader = csv.DictReader(resultsCSVFile)\n",
|
||||
" for row in reader:\n",
|
||||
" generatePDFReport(row)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "90a2f709-7521-41ed-ba1b-99cbbf108ab0",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "3e31b418-eb4c-48e1-9a4f-bdfdc50365f4",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.11.3"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
16
src/App.css
@@ -50,7 +50,7 @@ body {
|
||||
display: inline-flex;
|
||||
flex-direction: row;
|
||||
font-size: xx-large;
|
||||
background-color: rgb(215, 192, 252);
|
||||
background-color: rgb(207, 235, 250);
|
||||
}
|
||||
|
||||
.last-update {
|
||||
@@ -146,7 +146,7 @@ body {
|
||||
text-align: center;
|
||||
align-self: center;
|
||||
font-size: xx-large;
|
||||
background-color: rgb(215, 192, 252);
|
||||
background-color: rgb(207, 235, 250);
|
||||
}
|
||||
|
||||
.nscm-logo {
|
||||
@@ -206,7 +206,7 @@ body {
|
||||
text-align: center;
|
||||
align-self: center;
|
||||
font-size: xx-large;
|
||||
background-color: rgb(215, 192, 252);
|
||||
background-color: rgb(207, 235, 250);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -253,7 +253,7 @@ body {
|
||||
text-align: center;
|
||||
align-self: center;
|
||||
font-size: xx-large;
|
||||
background-color: rgb(215, 192, 252);
|
||||
background-color: rgb(207, 235, 250);
|
||||
}
|
||||
|
||||
.title-text {
|
||||
@@ -289,7 +289,7 @@ body {
|
||||
}
|
||||
|
||||
.cards-container {
|
||||
height: 80vh;
|
||||
height: 84vh;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
display: flex;
|
||||
@@ -307,7 +307,7 @@ body {
|
||||
text-align: center;
|
||||
align-self: center;
|
||||
font-size: xx-large;
|
||||
background-color: rgb(215, 192, 252);
|
||||
background-color: rgb(207, 235, 250);
|
||||
}
|
||||
|
||||
.title-text {
|
||||
@@ -356,7 +356,7 @@ body {
|
||||
}
|
||||
|
||||
.cards-container {
|
||||
height: 80vh;
|
||||
height: 90vh;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
display: flex;
|
||||
@@ -372,7 +372,7 @@ body {
|
||||
.dashboard-title {
|
||||
text-align: center;
|
||||
align-self: center;
|
||||
background-color: rgb(215, 192, 252);
|
||||
background-color: rgb(207, 235, 250);
|
||||
}
|
||||
|
||||
.title-text {
|
||||
|
||||
50
src/App.js
@@ -2,27 +2,17 @@ import './App.css';
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import moment from 'moment';
|
||||
|
||||
import { BrowserRouter, Route, Routes } from "react-router-dom";
|
||||
import MainLayout from "./components/MainLayout";
|
||||
import { routes } from "./routes";
|
||||
|
||||
import { collection, onSnapshot, query } from "firebase/firestore";
|
||||
import { collection, onSnapshot, query, where } from "firebase/firestore";
|
||||
import Card from './components/Card';
|
||||
import db from './firebase';
|
||||
|
||||
function App() {
|
||||
return (
|
||||
<BrowserRouter>
|
||||
<Routes>
|
||||
<Route path="/" element={<MainLayout />}>
|
||||
{routes}
|
||||
</Route>
|
||||
</Routes>
|
||||
</BrowserRouter>
|
||||
);
|
||||
}
|
||||
|
||||
function App1() {
|
||||
const registrationCached = 19453;
|
||||
const malesCached = 8321;
|
||||
const femalesCached = 10646;
|
||||
const normalCached = 9626;
|
||||
const traitsCached = 2575;
|
||||
const diseasesCached = 388;
|
||||
const [totalScreened, setTotalScreened] = useState(0);
|
||||
const [males, setMales] = useState(0);
|
||||
const [females, setFemales] = useState(0);
|
||||
@@ -35,7 +25,9 @@ function App1() {
|
||||
|
||||
useEffect(() => {
|
||||
|
||||
const q = query(collection(db, "patientData"));
|
||||
// const q = query(collection(db, "patientData")); // cached
|
||||
const notCachedDate = "2023-12-17";
|
||||
const q = query(collection(db, "patientData"), where("createdAt", ">=", moment(notCachedDate).format("YYYY-MM-DD")));
|
||||
|
||||
const unsub = onSnapshot(q, (querySnapshot) => {
|
||||
const patients = [];
|
||||
@@ -52,9 +44,9 @@ function App1() {
|
||||
femaleCount++;
|
||||
}
|
||||
});
|
||||
setTotalScreened(patients.length);
|
||||
setMales(maleCount);
|
||||
setFemales(femaleCount);
|
||||
setTotalScreened(registrationCached + patients?.length);
|
||||
setMales(malesCached + maleCount);
|
||||
setFemales(femalesCached + femaleCount);
|
||||
setLastUpdate(moment());
|
||||
});
|
||||
|
||||
@@ -62,7 +54,8 @@ function App1() {
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
const q = query(collection(db, "testData"));
|
||||
const notCachedDate = "2023-12-17";
|
||||
const q = query(collection(db, "testData"), where("testTime", ">=", moment(notCachedDate).format("YYYY-MM-DD")));
|
||||
|
||||
const unsub = onSnapshot(q, (querySnapshot) => {
|
||||
const hposTests = [];
|
||||
@@ -73,20 +66,21 @@ function App1() {
|
||||
const hposTestData = document.data();
|
||||
hposTests.push(hposTestData);
|
||||
const { result } = hposTestData;
|
||||
if (result === "NORMAL") {
|
||||
const { classificationResult } = hposTestData;
|
||||
if (result === "NORMAL" || classificationResult === 'Normal') {
|
||||
normalCount++;
|
||||
}
|
||||
if (result === 'SICKLECELLTRAIT') {
|
||||
if (result === 'SICKLECELLTRAIT' || classificationResult === 'Sickle Cell Trait') {
|
||||
traitCount++;
|
||||
}
|
||||
if (result === 'SICKLECELLDISEASE') {
|
||||
if (result === 'SICKLECELLDISEASE' || classificationResult === 'Sickle Cell Disease') {
|
||||
diseaseCount++;
|
||||
}
|
||||
});
|
||||
setNormal(normalCount);
|
||||
setNormal(normalCached + normalCount);
|
||||
// setPositives(traitCount + diseaseCount);
|
||||
setTraits(traitCount);
|
||||
setDiseases(diseaseCount);
|
||||
setTraits(traitsCached + traitCount);
|
||||
setDiseases(diseasesCached + diseaseCount);
|
||||
setLastUpdate(moment());
|
||||
});
|
||||
|
||||
|
||||
422
src/AppOp.css
Normal file
@@ -0,0 +1,422 @@
|
||||
body {
|
||||
background-color: rgb(247, 245, 249);
|
||||
}
|
||||
|
||||
.App {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.App-logo {
|
||||
height: 40vmin;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: no-preference) {
|
||||
.App-logo {
|
||||
animation: App-logo-spin infinite 20s linear;
|
||||
}
|
||||
}
|
||||
|
||||
.App-header {
|
||||
background-color: #282c34;
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: calc(10px + 2vmin);
|
||||
color: white;
|
||||
}
|
||||
|
||||
/* ::-webkit-scrollbar {
|
||||
display: none;
|
||||
} */
|
||||
|
||||
.dashboard-title::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.title {
|
||||
font-weight: 900;
|
||||
}
|
||||
|
||||
.dashboard-title {
|
||||
width: 100%;
|
||||
font-family: Arial Black;
|
||||
text-align: center;
|
||||
align-self: center;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
display: inline-flex;
|
||||
flex-direction: row;
|
||||
font-size: xx-large;
|
||||
background-color: rgb(207, 235, 250);
|
||||
}
|
||||
|
||||
.last-update {
|
||||
width: 100%;
|
||||
font-size: small;
|
||||
text-align: center;
|
||||
font-weight: 200;
|
||||
}
|
||||
|
||||
.developer {
|
||||
font-size: medium;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.dev-logo {
|
||||
width: 1em;
|
||||
}
|
||||
|
||||
.nscm-logo {
|
||||
width: 1em;
|
||||
}
|
||||
|
||||
.gov-logo {
|
||||
width: 1em;
|
||||
}
|
||||
|
||||
.gov-logo-1 {
|
||||
width: 1.79em;
|
||||
}
|
||||
|
||||
.gov-logo-3 {
|
||||
width: 1.79em;
|
||||
}
|
||||
|
||||
.title-text {
|
||||
margin: 0 1em 0 1em;
|
||||
font-size: medium;
|
||||
}
|
||||
|
||||
.numeric-card {
|
||||
height: 30vh;
|
||||
width: 28vw;
|
||||
padding: 20px;
|
||||
box-shadow: 5px 10px 8px 10px #888888;
|
||||
border-radius: 15px;
|
||||
margin: 20px;
|
||||
justify-content: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
@media screen and (min-width: 320px) {
|
||||
.numeric-card {
|
||||
height: 200px;
|
||||
width: 300px;
|
||||
padding: 20px;
|
||||
box-shadow: 5px 10px 8px 10px #888888;
|
||||
border-radius: 15px;
|
||||
margin: 20px;
|
||||
justify-content: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.card-title {
|
||||
color: black;
|
||||
font-size: 1em;
|
||||
font-weight: 600;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
.card-data {
|
||||
color: black;
|
||||
font-size: 4em;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
.cards-container {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.cards-row {
|
||||
margin: 5px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.dashboard-title {
|
||||
text-align: center;
|
||||
align-self: center;
|
||||
font-size: xx-large;
|
||||
background-color: rgb(207, 235, 250);
|
||||
}
|
||||
|
||||
.nscm-logo {
|
||||
width: 2em;
|
||||
}
|
||||
|
||||
.gov-logo {
|
||||
width: 2em;
|
||||
}
|
||||
|
||||
.title-text {
|
||||
margin: 0 1em 0 1em;
|
||||
font-size: small;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (min-width: 500px) {
|
||||
.numeric-card {
|
||||
height: 200px;
|
||||
width: 300px;
|
||||
padding: 20px;
|
||||
box-shadow: 5px 10px 8px 10px #888888;
|
||||
border-radius: 15px;
|
||||
margin: 20px;
|
||||
justify-content: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.card-title {
|
||||
color: black;
|
||||
font-size: 1em;
|
||||
font-weight: 600;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
.card-data {
|
||||
color: black;
|
||||
font-size: 8em;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
.cards-container {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.cards-row {
|
||||
margin: 30px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.dashboard-title {
|
||||
text-align: center;
|
||||
align-self: center;
|
||||
font-size: xx-large;
|
||||
background-color: rgb(207, 235, 250);
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 900px) {
|
||||
.numeric-card {
|
||||
height: 150px;
|
||||
width: 200px;
|
||||
padding: 20px;
|
||||
box-shadow: 5px 10px 8px 10px #888888;
|
||||
border-radius: 15px;
|
||||
margin: 20px;
|
||||
justify-content: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.card-title {
|
||||
color: black;
|
||||
font-size: 1.5em;
|
||||
font-weight: 600;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
.card-data {
|
||||
color: black;
|
||||
font-size: 4em;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
.cards-container {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.cards-row {
|
||||
margin: 5px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.dashboard-title {
|
||||
text-align: center;
|
||||
align-self: center;
|
||||
font-size: xx-large;
|
||||
background-color: rgb(207, 235, 250);
|
||||
}
|
||||
|
||||
.title-text {
|
||||
font-size: x-large;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (min-width: 1200px) {
|
||||
.numeric-card {
|
||||
height: 200px;
|
||||
width: 320px;
|
||||
padding: 20px;
|
||||
box-shadow: 5px 10px 8px 10px #888888;
|
||||
border-radius: 15px;
|
||||
margin: 20px;
|
||||
justify-content: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.card-title {
|
||||
color: black;
|
||||
font-size: 1.6em;
|
||||
font-weight: 600;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
.card-data {
|
||||
color: black;
|
||||
font-size: 6em;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
.cards-container {
|
||||
height: 90vh;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.cards-row {
|
||||
margin: 5px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.dashboard-title {
|
||||
height: 10vh;
|
||||
text-align: center;
|
||||
align-self: center;
|
||||
font-size: xx-large;
|
||||
background-color: rgb(207, 235, 250);
|
||||
}
|
||||
|
||||
.title-text {
|
||||
font-size: xx-large;
|
||||
}
|
||||
|
||||
.nscm-logo {
|
||||
width: 2em;
|
||||
}
|
||||
|
||||
.gov-logo {
|
||||
width: 2.5em;
|
||||
}
|
||||
|
||||
.gov-logo-3 {
|
||||
width: 2.5em;
|
||||
margin-top: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (min-width: 2560px) {
|
||||
.numeric-card {
|
||||
height: 30vh;
|
||||
width: 28vw;
|
||||
padding: 20px;
|
||||
box-shadow: 5px 10px 8px 10px #888888;
|
||||
border-radius: 15px;
|
||||
margin: 20px;
|
||||
justify-content: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.card-title {
|
||||
color: black;
|
||||
font-size: 6em;
|
||||
font-weight: 600;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
.card-data {
|
||||
color: black;
|
||||
font-size: 18em;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
.cards-container {
|
||||
height: 90vh;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.cards-row {
|
||||
margin: 20px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.dashboard-title {
|
||||
text-align: center;
|
||||
align-self: center;
|
||||
background-color: rgb(207, 235, 250);
|
||||
}
|
||||
|
||||
.title-text {
|
||||
font-size: 2vw;
|
||||
}
|
||||
|
||||
.nscm-logo {
|
||||
width: 5em;
|
||||
}
|
||||
|
||||
.gov-logo-1 {
|
||||
width: 4em;
|
||||
}
|
||||
|
||||
.gov-logo {
|
||||
width: 5em;
|
||||
}
|
||||
|
||||
.gov-logo-3 {
|
||||
width: 5em;
|
||||
}
|
||||
}
|
||||
|
||||
div.chart {
|
||||
font-family: sans-serif;
|
||||
font-size: 0.7em;
|
||||
}
|
||||
|
||||
div.bar {
|
||||
background-color: DarkRed;
|
||||
color: white;
|
||||
height: 3em;
|
||||
line-height: 3em;
|
||||
padding-right: 1em;
|
||||
margin-bottom: 2px;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.footer {
|
||||
position: fixed;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
background-color: rgb(207, 235, 250);
|
||||
color: black;
|
||||
text-align: center;
|
||||
}
|
||||
120
src/AppOp.js
Normal file
@@ -0,0 +1,120 @@
|
||||
// import './AppOp.css';
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import moment from 'moment';
|
||||
|
||||
import { collection, onSnapshot, query } from "firebase/firestore";
|
||||
import Card from './components/Card';
|
||||
import db from './firebase';
|
||||
|
||||
function AppOp() {
|
||||
const [totalScreened, setTotalScreened] = useState(0);
|
||||
const [males, setMales] = useState(0);
|
||||
const [females, setFemales] = useState(0);
|
||||
const [normal, setNormal] = useState(0);
|
||||
// const [positives, setPositives] = useState(0);
|
||||
const [traits, setTraits] = useState(0);
|
||||
const [diseases, setDiseases] = useState(0);
|
||||
const [lastUpdate, setLastUpdate] = useState(moment());
|
||||
const [devMode, setDevMode] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
|
||||
const q = query(collection(db, "patientData"));
|
||||
|
||||
const unsub = onSnapshot(q, (querySnapshot) => {
|
||||
const patients = [];
|
||||
let maleCount = 0;
|
||||
let femaleCount = 0;
|
||||
querySnapshot.forEach((document) => {
|
||||
const patient = document.data();
|
||||
patients.push(patient);
|
||||
const { gender } = patient;
|
||||
if (gender?.toLowerCase() === 'male') {
|
||||
maleCount++;
|
||||
}
|
||||
if (gender?.toLowerCase() === 'female') {
|
||||
femaleCount++;
|
||||
}
|
||||
});
|
||||
setTotalScreened(patients.length);
|
||||
setMales(maleCount);
|
||||
setFemales(femaleCount);
|
||||
setLastUpdate(moment());
|
||||
});
|
||||
|
||||
return () => unsub;
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
const q = query(collection(db, "testData"));
|
||||
|
||||
const unsub = onSnapshot(q, (querySnapshot) => {
|
||||
const hposTests = [];
|
||||
let normalCount = 0;
|
||||
let traitCount = 0;
|
||||
let diseaseCount = 0;
|
||||
querySnapshot.forEach((document) => {
|
||||
const hposTestData = document.data();
|
||||
hposTests.push(hposTestData);
|
||||
const { result } = hposTestData;
|
||||
if (result === "NORMAL") {
|
||||
normalCount++;
|
||||
}
|
||||
if (result === 'SICKLECELLTRAIT') {
|
||||
traitCount++;
|
||||
}
|
||||
if (result === 'SICKLECELLDISEASE') {
|
||||
diseaseCount++;
|
||||
}
|
||||
});
|
||||
setNormal(normalCount);
|
||||
// setPositives(traitCount + diseaseCount);
|
||||
setTraits(traitCount);
|
||||
setDiseases(diseaseCount);
|
||||
setLastUpdate(moment());
|
||||
});
|
||||
|
||||
return () => unsub;
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<div>
|
||||
<div className='dashboard-title'>
|
||||
<img className="nscm-logo" src={require('./logo_nobg.png')} alt='img' />
|
||||
<div className='title-text'>HPOS Sickle Cell Test Dashboard</div>
|
||||
<img className="gov-logo-1" src={require('./gov_logo2.png')} alt='img' />
|
||||
<img className="gov-logo" src={require('./gov_logo3.png')} alt='img' />
|
||||
<img className="gov-logo-3" src={require('./gov_logo4.png')} alt='img' />
|
||||
</div>
|
||||
|
||||
<div className='cards-container'>
|
||||
<div className='cards-row'>
|
||||
<Card title={"Total"} counter={"726"} color={'black'} backgroundColor={'rgb(254, 240, 227)'} />
|
||||
<Card title={"Male"} counter={"406"} backgroundColor={'rgb(237, 190, 190)'} />
|
||||
<Card title={"Female"} counter={"320"} backgroundColor={'rgb(249, 195, 195)'} />
|
||||
</div>
|
||||
|
||||
<div className='cards-row'>
|
||||
<Card title={"Normal"} counter={"405"} backgroundColor={'rgb(234, 240, 230)'} />
|
||||
<Card title={"Sickle Cell Disease (HbSS)"} counter={"29"} backgroundColor={'rgb(234, 246, 245)'} />
|
||||
<Card title={"Sickle Cell Trait (HbAS)"} counter={"50"} backgroundColor={'rgb(192,233, 199)'} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className='footer'>
|
||||
<div className='last-update'>
|
||||
Updated at: {moment(lastUpdate).format("DD-MM-YYYY hh:mm:ss a")}
|
||||
</div>
|
||||
|
||||
<div className='developer' onClick={() => setDevMode(!devMode)}>
|
||||
Developed by <img className="dev-logo" alt='img' src={require('./smi-logo-120x120.webp')} /> ShanMukha
|
||||
</div>
|
||||
|
||||
{/* {devMode &&
|
||||
<div>dev mode is on</div>} */}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default AppOp;
|
||||
|
Before Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 24 KiB |
@@ -1,63 +0,0 @@
|
||||
.button {
|
||||
background-color: #4CAF50;
|
||||
/* Green */
|
||||
border: none;
|
||||
color: white;
|
||||
/* padding: 15px 32px; */
|
||||
padding: 5px 10px;
|
||||
text-align: center;
|
||||
text-decoration: none;
|
||||
display: inline-block;
|
||||
font-size: 16px;
|
||||
margin: 15px;
|
||||
}
|
||||
|
||||
.file-row {
|
||||
flex-direction: row;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin: 1.5rem;
|
||||
}
|
||||
|
||||
.file-label {
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
.dates {
|
||||
flex-direction: row;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin: 1.5rem;
|
||||
}
|
||||
|
||||
.start-date {
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
.end-date {
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
.download-row {
|
||||
flex-direction: row;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin: 1.5rem;
|
||||
}
|
||||
|
||||
.loading-icon {
|
||||
animation: rotate 2s linear infinite;
|
||||
}
|
||||
|
||||
@keyframes rotate {
|
||||
from {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
@@ -1,107 +0,0 @@
|
||||
import React, { useState } from 'react';
|
||||
import { FaInfoCircle } from "react-icons/fa";
|
||||
import { AiOutlineLoading } from "react-icons/ai";
|
||||
import DatePicker from "react-datepicker";
|
||||
import moment from 'moment';
|
||||
import axios from 'axios';
|
||||
|
||||
import "react-datepicker/dist/react-datepicker.css";
|
||||
import './Accuracy.css';
|
||||
|
||||
function Accuracy({ show }) {
|
||||
const [showCardInfo, setShowCardInfo] = useState(false);
|
||||
const [startDate, setStartDate] = useState("");
|
||||
const [endDate, setEndDate] = useState("");
|
||||
const [selectedFile, setSelectedFile] = useState(null);
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [error, setError] = useState(null); // New state for handling errors
|
||||
|
||||
const handleFileChange = (event) => {
|
||||
setSelectedFile(event.target.files[0]);
|
||||
};
|
||||
|
||||
|
||||
const fetchFile = async (start_date, end_date) => {
|
||||
try {
|
||||
setLoading(true);
|
||||
setError(null); // Reset error state before making a new request
|
||||
|
||||
if (!selectedFile) {
|
||||
const formData = new FormData();
|
||||
// formData.append('file', selectedFile);
|
||||
|
||||
const queryString = `start_date=${moment(startDate).format(
|
||||
'YYYY-MM-DD'
|
||||
)}&end_date=${moment(endDate).format('YYYY-MM-DD')}`;
|
||||
|
||||
const url = `https://asia-south1-${process.env.REACT_APP_FIREBASE_PROJECT_ID}.cloudfunctions.net/performance?${queryString}`;
|
||||
|
||||
// Make a POST request using the Fetch API
|
||||
const response = await fetch(url, {
|
||||
method: 'POST',
|
||||
body: formData,
|
||||
headers: {
|
||||
// Add any necessary headers
|
||||
// 'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
|
||||
},
|
||||
});
|
||||
|
||||
// Check if the request was successful (status code 2xx)
|
||||
if (response.ok) {
|
||||
// Create a blob from the response data
|
||||
const blob = await response.blob();
|
||||
|
||||
// Create a download link and trigger a click to download the file
|
||||
const link = document.createElement('a');
|
||||
link.href = window.URL.createObjectURL(blob);
|
||||
link.download = 'autoanlysis.xlsx'; // Set the desired file name
|
||||
document.body.appendChild(link);
|
||||
link.click();
|
||||
|
||||
// Clean up
|
||||
document.body.removeChild(link);
|
||||
} else {
|
||||
console.error('Error downloading file:', response.statusText);
|
||||
setError('Error downloading file. Please try again.'); // Set error message
|
||||
}
|
||||
} else {
|
||||
setError("Select file from reference device");
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error downloading file:', error);
|
||||
setError('Error downloading file. Please try again.'); // Set error message
|
||||
} finally {
|
||||
setLoading(false); // Set loading back to false when the request completes
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
return (
|
||||
<div>
|
||||
<h1>Auto Analysis</h1>
|
||||
{/* <div className='file-row'>
|
||||
<div className='file-label'>Reference file</div>
|
||||
<input type="file" onChange={handleFileChange} />
|
||||
</div> */}
|
||||
<div className='dates'>
|
||||
<div className='start-date'>
|
||||
<DatePicker selected={startDate} onChange={(date) => setStartDate(date)} placeholderText='start date' />
|
||||
</div>
|
||||
<div className='end-date'>
|
||||
<DatePicker selected={endDate} onChange={(date) => setEndDate(date)} placeholderText='end date' />
|
||||
</div>
|
||||
</div>
|
||||
<div className='download-row'>
|
||||
<div className='button' onClick={() => fetchFile(startDate, endDate)}>
|
||||
{loading ? (
|
||||
<AiOutlineLoading className="loading-icon" />
|
||||
) : (
|
||||
'Download Excel'
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
{error && <div className="error-message">{error}</div>} {/* Display error message if there's an error */}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
export default Accuracy;
|
||||
@@ -0,0 +1,10 @@
|
||||
.alert-card {
|
||||
width: 30vw;
|
||||
height: 10vh;
|
||||
background-color: white;
|
||||
margin: 10px;
|
||||
border-style: solid;
|
||||
border-color: rgb(219, 219, 219);
|
||||
border-radius: 6px;
|
||||
border-width: max(1px, 0.0625rem);
|
||||
}
|
||||
@@ -8,21 +8,20 @@ const Alerts = () => {
|
||||
const [alerts, setAlerts] = useState([]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!allTests) {
|
||||
if (!alerts.length) {
|
||||
const q = query(collection(db, "alerts"));
|
||||
|
||||
const unsub = onSnapshot(q, (querySnapshot) => {
|
||||
const testDevices = new Set();
|
||||
const hposTests = [];
|
||||
const alerts = [];
|
||||
querySnapshot.forEach((document) => {
|
||||
const hposTestData = document.data();
|
||||
hposTests.push(hposTestData);
|
||||
const { deviceSerialNumber } = hposTestData;
|
||||
testDevices.add(deviceSerialNumber);
|
||||
console.log(document.data());
|
||||
const alert = document.data();
|
||||
alerts.push(alert);
|
||||
});
|
||||
const groups = [...testDevices];
|
||||
// setDevices(groups);
|
||||
setAlerts(hposTests);
|
||||
setAlerts(alerts.sort((a, b) => { return a.createdAt < b.createdAt; }));
|
||||
});
|
||||
|
||||
return () => unsub;
|
||||
@@ -31,7 +30,11 @@ const Alerts = () => {
|
||||
|
||||
return (
|
||||
<div>
|
||||
{alerts.length}
|
||||
{alerts.length &&
|
||||
alerts.map((alert) => <div key={alert.id} className='alert-card'>
|
||||
{alert.message}
|
||||
{alert.createdAt}
|
||||
</div>)}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
.app-qrcode {
|
||||
height: 250px;
|
||||
width: 250px;
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
import React, { useEffect, useState, useRef } from 'react';
|
||||
import { query, collection, onSnapshot } from 'firebase/firestore';
|
||||
|
||||
import './AppInstallation.css';
|
||||
import db from '../firebase';
|
||||
|
||||
const AppInstallation = () => {
|
||||
const [alerts, setAlerts] = useState([]);
|
||||
|
||||
useEffect(() => {
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<div>
|
||||
<h1>App Installation</h1>
|
||||
|
||||
<h3>First try the firebase app distribution which is email linked. After adding the email from backend. Check the email to get started.</h3>
|
||||
{/* <div>
|
||||
<div>Testing 2.1.27 (Preprod - 07-11-2023)</div>
|
||||
<a href="https://www.dropbox.com/scl/fi/v0hux8qrby54rjns8mhum/hpos-testing_preprod_2.1.27.apk?rlkey=ias0fe0zq72avy01rk4cvzmvp&dl=1">
|
||||
<img className="app-qrcode" src={require('../assets/hpos-testing_preprod.png')} alt='icon'></img>
|
||||
</a>
|
||||
</div>
|
||||
<div>
|
||||
<p>Steps to install:</p>
|
||||
<p>
|
||||
<ul>
|
||||
<li>use an QR code scanner app to download the app</li>
|
||||
<li>if the phone browser prompts an warning, select download anyway</li>
|
||||
<li>install the downloaded apk and give permissions</li>
|
||||
</ul>
|
||||
</p>
|
||||
</div> */}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default AppInstallation;
|
||||
9
src/components/Calibrations.css
Normal file
@@ -0,0 +1,9 @@
|
||||
.page-title {
|
||||
/* width: 100vw; */
|
||||
padding: 10px;
|
||||
text-align: center;
|
||||
background: rgb(207, 235, 250);
|
||||
color: black;
|
||||
font-size: 30px;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
78
src/components/Calibrations.js
Normal file
@@ -0,0 +1,78 @@
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import { query, collection, onSnapshot } from 'firebase/firestore';
|
||||
import Dropdown from 'react-dropdown';
|
||||
import 'react-dropdown/style.css';
|
||||
import moment from 'moment';
|
||||
|
||||
import db from '../firebase';
|
||||
import './Calibrations.css';
|
||||
|
||||
const Calibrations = () => {
|
||||
const [device, setDevice] = useState("Select a device");
|
||||
const [devices, setDevices] = useState([]);
|
||||
const [curDeviceData, setCurDeviceData] = useState(null);
|
||||
|
||||
const changeDevice = ({ value }) => {
|
||||
setDevice(value);
|
||||
}
|
||||
|
||||
const toggleShowDevice = () => {
|
||||
console.log(devices.filter(x => x.deviceId === device))
|
||||
setCurDeviceData(devices.find(x => x.deviceId === device));
|
||||
// if (!device) {
|
||||
// setCurDeviceData(devices.filter(x => x.deviceId === device));
|
||||
// } else {
|
||||
// setDevice(null);
|
||||
// }
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
if (!devices?.length) {
|
||||
const q = query(collection(db, "devices"));
|
||||
|
||||
const unsub = onSnapshot(q, (querySnapshot) => {
|
||||
const testDevices = [];
|
||||
querySnapshot.forEach((document) => {
|
||||
const deviceData = document.data();
|
||||
testDevices.push(deviceData);
|
||||
});
|
||||
setDevices(testDevices);
|
||||
});
|
||||
|
||||
return () => unsub;
|
||||
}
|
||||
}, [device, curDeviceData]);
|
||||
|
||||
return (
|
||||
<div className="calibrations-page">
|
||||
<div className='page-title'>Calibrations</div>
|
||||
<div className='dropdown-group'>
|
||||
<Dropdown className='device-dropdown' options={devices?.map(x => x.deviceId)} onChange={changeDevice} value={device} placeholder="Select an device" />
|
||||
|
||||
<button className='clear-button' onClick={toggleShowDevice}><img className="graph-icon" src={require('../assets/graph_icon.png')} alt='icon'></img>{device ? 'Clear' : 'Show'}</button>
|
||||
</div>
|
||||
|
||||
<div className='graph-person-conatiner'>
|
||||
{curDeviceData && <div className='test-details'>
|
||||
<table>
|
||||
<tr>
|
||||
<th>key</th>
|
||||
<th>value</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>device</td> <td>{curDeviceData?.deviceId} </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>calibratedAt</td> <td>{curDeviceData?.calibratedAt} </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>coefficients</td> <td>{curDeviceData?.coefficients?.toString()} </td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>}
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default Calibrations;
|
||||
@@ -1,13 +1,55 @@
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import Odometer from 'react-odometerjs';
|
||||
|
||||
import './Card.css'; // Import your CSS file
|
||||
import 'odometer/themes/odometer-theme-default.css';
|
||||
|
||||
const Card = ({ title, counter, color, backgroundColor }) => {
|
||||
const [animatedCounter, setAnimatedCounter] = useState(0);
|
||||
|
||||
useEffect(() => {
|
||||
const updateCounter = () => {
|
||||
// Set the maximum number of iterations for the animation
|
||||
const maxIterations = 50;
|
||||
|
||||
// Calculate the step value for each iteration
|
||||
const step = Math.ceil(counter / maxIterations);
|
||||
|
||||
// Use setInterval to increment the counter gradually
|
||||
const intervalId = setInterval(() => {
|
||||
setAnimatedCounter((prevCounter) => {
|
||||
const newCounter = prevCounter + step;
|
||||
|
||||
// Stop the animation when the counter reaches its final value
|
||||
if (newCounter >= counter) {
|
||||
clearInterval(intervalId);
|
||||
return counter;
|
||||
}
|
||||
|
||||
return newCounter;
|
||||
});
|
||||
}, 30); // Adjust the duration of each iteration as needed
|
||||
|
||||
// Clear the interval when the component is unmounted
|
||||
return () => clearInterval(intervalId);
|
||||
};
|
||||
|
||||
// Call the updateCounter function when the component mounts or the counter value changes
|
||||
updateCounter();
|
||||
}, [counter]);
|
||||
|
||||
return (
|
||||
<div className='numeric-card' style={{color: color, backgroundColor: backgroundColor}}>
|
||||
<div className='card-title'>
|
||||
{title}
|
||||
</div>
|
||||
<div className='numeric-card' style={{ color, backgroundColor }}>
|
||||
<div className='card-title'>{title}</div>
|
||||
<div className='card-data'>
|
||||
{counter}
|
||||
{/* <div className='odometer'>
|
||||
<div>{animatedCounter}</div>
|
||||
</div> */}
|
||||
|
||||
<Odometer value={counter} style={{ cursor: 'pointer' }} />
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export default Card;
|
||||
@@ -1,65 +0,0 @@
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import { FaInfoCircle } from "react-icons/fa";
|
||||
import axios from 'axios';
|
||||
|
||||
import './CurveFit.css';
|
||||
import ImageDownloader from './ImageDownloader';
|
||||
|
||||
function CurveFit({ show }) {
|
||||
const [showCardInfo, setShowCardInfo] = useState(false);
|
||||
const [svgData, setSvgData] = useState(null);
|
||||
const [loading, setLoading] = useState(true);
|
||||
|
||||
const fetchSvg = () => {
|
||||
axios({
|
||||
method: 'get',
|
||||
url: "https://asia-south1-hpos-af3cc.cloudfunctions.net/crdboxplot",
|
||||
data: {
|
||||
"_id": "id",
|
||||
"underMedication": false,
|
||||
"underTransfusion": false,
|
||||
"userImageURL": "https://hpos-prod.web.app/logo.png"
|
||||
},
|
||||
withCredentials: false,
|
||||
secure: false,
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
// "x-client": "e16a1bd15af2ee640f5a7a18c8d8333f5f01f7c66e003bbc21ee52870f1bce27",
|
||||
},
|
||||
})
|
||||
.then(response => response.data)
|
||||
.then((data) => {
|
||||
setSvgData(data?.plot?.replace('\"', '').replace('\n', '').replace('"', "'"));
|
||||
setLoading(false); // Set loading to false once data is fetched
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
setLoading(false); // Set loading to false in case of an error
|
||||
});
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
if (!svgData) {
|
||||
fetchSvg();
|
||||
}
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<div>
|
||||
<h1>Plots</h1>
|
||||
|
||||
{loading ? (
|
||||
<div className="spinner-container">
|
||||
{/* Add your spinner component here or use a simple text */}
|
||||
<p>Loading...</p>
|
||||
</div>
|
||||
) : (
|
||||
<img src={`https://asia-south1-${process.env.REACT_APP_FIREBASE_PROJECT_ID}.cloudfunctions.net/crdboxplot`} width="450" height="340" />
|
||||
)}
|
||||
|
||||
{/* <ImageDownloader /> */}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default CurveFit;
|
||||
@@ -2,12 +2,14 @@
|
||||
display: none;
|
||||
}
|
||||
|
||||
.title {
|
||||
.insights-title {
|
||||
/* width: 100vw; */
|
||||
padding: 10px;
|
||||
text-align: center;
|
||||
background: rgb(215, 192, 252);
|
||||
background: rgb(207, 235, 250);
|
||||
color: black;
|
||||
font-size: 30px;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
.device-dropdown {
|
||||
@@ -79,7 +81,7 @@
|
||||
background-color: rgb(207, 235, 250);
|
||||
width: 10vw;
|
||||
height: 5vh;
|
||||
margin: 5px;
|
||||
/* margin: 5px; */
|
||||
border-radius: 10px;
|
||||
font-size: medium;
|
||||
font-weight: 600;
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import React, { useEffect, useState, useRef } from 'react';
|
||||
import { query, collection, onSnapshot } from 'firebase/firestore';
|
||||
import Dropdown from 'react-dropdown';
|
||||
import 'react-dropdown/style.css';
|
||||
import moment from 'moment';
|
||||
import Select from 'react-select';
|
||||
|
||||
import DeviceGraph from "./DeviceGraph";
|
||||
import db from '../firebase';
|
||||
@@ -18,13 +19,17 @@ const Devices = () => {
|
||||
const [tests, setTests] = useState([]);
|
||||
const [allTests, setAllTests] = useState(null);
|
||||
const [showGraph, setShowGraph] = useState(false);
|
||||
const selectDateDropdownRef = useRef();
|
||||
const selectTestDropdownRef = useRef();
|
||||
|
||||
const changeDevice = ({ value }) => {
|
||||
setDevice(value);
|
||||
setTestDate(null);
|
||||
setCurTest(null);
|
||||
selectDateDropdownRef.current?.setValue("");
|
||||
selectTestDropdownRef.current?.setValue("");
|
||||
setDays([...new Set(allTests
|
||||
.filter((x) => x.deviceSerialNumber === value || x.deviceId === value)
|
||||
.filter((x) => x.deviceSerialNumber === value)
|
||||
.map(x => moment(x.testTime).format("YYYY-MM-DD")))]
|
||||
.sort()
|
||||
.reverse());
|
||||
@@ -32,11 +37,12 @@ const Devices = () => {
|
||||
|
||||
const changeTestDate = ({ value }) => {
|
||||
setTestDate(value);
|
||||
selectTestDropdownRef.current?.setValue("");
|
||||
setCurTest(null);
|
||||
setCurTestData(null);
|
||||
setShowGraph(false);
|
||||
setTests(allTests
|
||||
.filter((x) => (x.deviceSerialNumber === device || x.deviceId === device) && moment(x.testTime).isBetween(moment(value).startOf('day'), moment(value).endOf('day')))
|
||||
.filter((x) => x.deviceSerialNumber === device && moment(x.testTime).isBetween(moment(value).startOf('day'), moment(value).endOf('day')))
|
||||
.map(x => x._id)
|
||||
.sort());
|
||||
}
|
||||
@@ -70,13 +76,8 @@ const Devices = () => {
|
||||
querySnapshot.forEach((document) => {
|
||||
const hposTestData = document.data();
|
||||
hposTests.push(hposTestData);
|
||||
const { deviceType, deviceId, deviceSerialNumber } = hposTestData;
|
||||
if (deviceType === 'HEMOCUBE' && deviceId) {
|
||||
testDevices.add(deviceId);
|
||||
}
|
||||
if (deviceType !== 'HEMOCUBE' && deviceSerialNumber) {
|
||||
const { deviceSerialNumber } = hposTestData;
|
||||
testDevices.add(deviceSerialNumber);
|
||||
}
|
||||
});
|
||||
const groups = [...testDevices];
|
||||
setDevices(groups);
|
||||
@@ -89,22 +90,45 @@ const Devices = () => {
|
||||
|
||||
return (
|
||||
<div className="devices-page">
|
||||
<div className='title'>Insights</div>
|
||||
<div className='insights-title'>Insights</div>
|
||||
<div className='dropdown-group'>
|
||||
<Dropdown className='device-dropdown' options={devices} onChange={changeDevice} value={device} placeholder="Select an device" />
|
||||
{/* <Dropdown className='device-dropdown' options={devices} onChange={changeDevice} value={device} placeholder="Select an device" />
|
||||
<Dropdown className='day-dropdown' options={days} onChange={changeTestDate} value={testDate} placeholder="Select an test date" />
|
||||
<Dropdown className='test-dropdown' options={tests} onChange={changeTest} value={curTest} placeholder="Select an test" />
|
||||
<Dropdown className='test-dropdown' options={tests} onChange={changeTest} value={curTest} placeholder="Select an test" /> */}
|
||||
|
||||
{/* <Select className='device-dropdown' options={devices.map(x => { return { value: x, label: x }; })} menuPlacement='auto' maxMenuHeight={250} menuShouldScrollIntoView={true} onChange={changeDevice} />
|
||||
<Select className='day-dropdown' options={days.map(x => { return { value: x, label: x }; })} menuPlacement='auto' maxMenuHeight={250} menuShouldScrollIntoView={true} onChange={changeTestDate} />
|
||||
<Select className='test-dropdown' options={tests.map(x => { return { value: x, label: x }; })} menuPlacement='auto' maxMenuHeight={220} menuShouldScrollIntoView={true} onChange={changeTestDate} /> */}
|
||||
<Select
|
||||
className='device-dropdown'
|
||||
defaultValue={{ label: "Select a device", value: "Select a device" }}
|
||||
options={devices.map(x => { return { value: x, label: x }; })}
|
||||
menuPlacement='auto'
|
||||
maxMenuHeight={250}
|
||||
menuShouldScrollIntoView={true}
|
||||
onChange={changeDevice} />
|
||||
<Select
|
||||
ref={selectDateDropdownRef}
|
||||
className='day-dropdown'
|
||||
defaultValue={{ label: "Select a test date", value: "Select a test date" }}
|
||||
options={days.map(x => { return { value: x, label: x }; })}
|
||||
menuPlacement='auto'
|
||||
maxMenuHeight={250}
|
||||
menuShouldScrollIntoView={true}
|
||||
onChange={changeTestDate} />
|
||||
<Select
|
||||
ref={selectTestDropdownRef}
|
||||
className='test-dropdown'
|
||||
defaultValue={{ label: "Select a test", value: "Select a test" }}
|
||||
options={tests.map(x => { return { value: x, label: x }; })}
|
||||
menuPlacement='auto'
|
||||
maxMenuHeight={220}
|
||||
menuShouldScrollIntoView={true}
|
||||
onChange={changeTest} />
|
||||
|
||||
<button className='clear-button' onClick={toggleShowGraph}><img className="graph-icon" src={require('../assets/graph_icon.png')} alt='icon'></img>{curTestData ? 'Clear' : 'Show'}</button>
|
||||
</div>
|
||||
|
||||
<div className='graph-person-conatiner'>
|
||||
{!curTestData && <div className='refresh-graph-message'>Select test device, date and person to get the detailed graph. Then, click show button to render graph.</div>}
|
||||
{curTestData?.csvPath && <DeviceGraph url={curTestData?.csvPath} show={showGraph} />}
|
||||
{curTestData?.csvPath && curTestData?.testType !== 'HEMOCUBE' && <DeviceGraph url={curTestData?.csvPath} show={showGraph} />}
|
||||
|
||||
{curTestData && <div className='test-details'>
|
||||
<table>
|
||||
@@ -127,6 +151,26 @@ const Devices = () => {
|
||||
<tr>
|
||||
<td>result</td> <td>{curTestData?.result}</td>
|
||||
</tr>
|
||||
{curTestData?.testType === 'HEMOCUBE' && <tr>
|
||||
<td>calculatedRatio</td>
|
||||
<td>{curTestData?.calculatedRatio}</td>
|
||||
</tr>}
|
||||
{curTestData?.testType === 'HEMOCUBE' && <tr>
|
||||
<td>deviceRatio</td>
|
||||
<td>{curTestData?.deviceRatio}</td>
|
||||
</tr>}
|
||||
{curTestData?.testType === 'HEMOCUBE' && <tr>
|
||||
<td>green led Average</td>
|
||||
<td>{curTestData?.led1Average}</td>
|
||||
</tr>}
|
||||
{curTestData?.testType === 'HEMOCUBE' && <tr>
|
||||
<td>blue led Average</td>
|
||||
<td>{curTestData?.led2Average}</td>
|
||||
</tr>}
|
||||
{curTestData?.testType === 'HEMOCUBE' && <tr>
|
||||
<td>blue led Average</td>
|
||||
<td>{curTestData?.led2Average}</td>
|
||||
</tr>}
|
||||
</table>
|
||||
{/* <img src={curTestData?.userImageURL} width={100} height={150} /> */}
|
||||
</div>}
|
||||
|
||||
@@ -1,68 +0,0 @@
|
||||
import React, { useEffect, useState, useRef } from 'react';
|
||||
import { query, collection, onSnapshot, where, orderBy, limit } from 'firebase/firestore';
|
||||
import moment from 'moment';
|
||||
|
||||
import db from '../firebase';
|
||||
import './Diagnostics.css';
|
||||
|
||||
const Diagnostics = () => {
|
||||
const [samples, setSamples] = useState([]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!samples.length) {
|
||||
const q = query(collection(db, "diagnostics"), where("runTime", ">=", moment().format("YYYY-MM-DD").toString()), orderBy("runTime", "desc"));
|
||||
|
||||
const unsub = onSnapshot(q, (querySnapshot) => {
|
||||
const samples = [];
|
||||
querySnapshot.forEach((document) => {
|
||||
console.log(document.id);
|
||||
const data = document.data();
|
||||
const id = document.id;
|
||||
samples.push({id, ...data});
|
||||
});
|
||||
setSamples(samples);
|
||||
});
|
||||
|
||||
return () => unsub;
|
||||
}
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<div>
|
||||
{/* <div className='samples-heading'><h3>Samples page for denovix useage</h3></div>
|
||||
{samples.length ? (
|
||||
samples.map((alert, index) => (
|
||||
<div key={index} className='samples-card'>
|
||||
<div tabIndex={index}><strong>{alert._id}</strong></div>
|
||||
<p className='sample-time'>{alert.testTime}</p>
|
||||
<p className='sample-time-ago'>{moment(alert.testTime).fromNow()}</p>
|
||||
</div>
|
||||
))
|
||||
) : (
|
||||
<div className='no-samples-message'>Samples will appear as in when a test is recorded</div>
|
||||
)} */}
|
||||
|
||||
|
||||
<h1>Device Data</h1>
|
||||
|
||||
<div className='samples-container'>
|
||||
<table id="samples-table">
|
||||
<tr>
|
||||
<th>Device</th>
|
||||
<th>Raw Data</th>
|
||||
<th>Time</th>
|
||||
</tr>
|
||||
{samples.map((sample, index) => (
|
||||
<tr key={index} className='samples-table-tr'>
|
||||
<td>{sample.deviceId}</td>
|
||||
<td>{sample.deviceData || 'NA'}</td>
|
||||
<td>{moment(sample.runTime).format('HH:mm:ss')}</td>
|
||||
</tr>
|
||||
))}
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default Diagnostics;
|
||||
@@ -1,29 +0,0 @@
|
||||
.button {
|
||||
background-color: #4CAF50;
|
||||
/* Green */
|
||||
border: none;
|
||||
color: white;
|
||||
/* padding: 15px 32px; */
|
||||
padding: 5px 10px;
|
||||
text-align: center;
|
||||
text-decoration: none;
|
||||
display: inline-block;
|
||||
font-size: 16px;
|
||||
margin: 15px;
|
||||
}
|
||||
|
||||
.dates {
|
||||
flex-direction: row;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin: 1.5rem;
|
||||
}
|
||||
|
||||
.start-date {
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
.end-date {
|
||||
margin: 10px;
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
import React, { useState } from 'react';
|
||||
import DatePicker from "react-datepicker";
|
||||
import moment from 'moment';
|
||||
|
||||
import "react-datepicker/dist/react-datepicker.css";
|
||||
|
||||
import './ExportData.css';
|
||||
|
||||
function ExportData({ url, show }) {
|
||||
const [startDate, setStartDate] = useState("");
|
||||
const [endDate, setEndDate] = useState("");
|
||||
|
||||
const fetchFile = (start_date, end_date) => {
|
||||
window.location.href = `https://asia-south1-${process.env.REACT_APP_FIREBASE_PROJECT_ID}.cloudfunctions.net/consolidation?start_date=${moment(startDate).format("YYYY-MM-DD")}&end_date=${moment(endDate).format("YYYY-MM-DD")}`;
|
||||
}
|
||||
|
||||
return (
|
||||
<div>
|
||||
<div className='dates'>
|
||||
<div className='start-date'>
|
||||
<DatePicker selected={startDate} onChange={(date) => setStartDate(date)} placeholderText='start date' />
|
||||
</div>
|
||||
<div className='end-date'>
|
||||
<DatePicker selected={endDate} onChange={(date) => setEndDate(date)} placeholderText='end date' />
|
||||
</div>
|
||||
|
||||
<div className='button' onClick={() => fetchFile(startDate, endDate)}>Download Excel</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
export default ExportData;
|
||||
@@ -1,103 +0,0 @@
|
||||
.user-chat-input {
|
||||
margin: 10px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: start;
|
||||
justify-content: start;
|
||||
}
|
||||
|
||||
.user-message {
|
||||
background-color: #aaffaa;
|
||||
padding: 5px;
|
||||
margin: 5px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.other-message {
|
||||
background-color: #aaaaff;
|
||||
padding: 5px;
|
||||
margin: 5px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.typing-animation {
|
||||
overflow: hidden; /* Hide overflowing text */
|
||||
border-right: 0.1em solid #000; /* Add a border to simulate the cursor */
|
||||
white-space: nowrap; /* Ensure the text stays in one line */
|
||||
animation: typing 1s steps(40, end), blink-caret 0.5s step-end infinite; /* Typing animation */
|
||||
}
|
||||
|
||||
@keyframes typing {
|
||||
from {
|
||||
width: 0;
|
||||
}
|
||||
to {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes blink-caret {
|
||||
from, to {
|
||||
border-color: transparent; /* Blinking cursor effect */
|
||||
}
|
||||
50% {
|
||||
border-color: #000;
|
||||
}
|
||||
}
|
||||
|
||||
/* Apply basic styles to the table */
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
/* Add styling to the table header */
|
||||
th, td {
|
||||
border: 1px solid #dddddd;
|
||||
text-align: left;
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
/* Style the table header */
|
||||
th {
|
||||
background-color: #f2f2f2;
|
||||
}
|
||||
|
||||
/* Add some hover effect to the table rows */
|
||||
tr:hover {
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
|
||||
.loading-container {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 200px;
|
||||
}
|
||||
|
||||
.loading-icon {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 10px;
|
||||
/* background-color: #f5f5f5; */
|
||||
/* border: 1px solid #ddd; */
|
||||
border-radius: 4px;
|
||||
margin-bottom: 10px;
|
||||
width: 100px;
|
||||
}
|
||||
|
||||
.spin {
|
||||
animation: spin 1s linear infinite;
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
from {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
@@ -1,239 +0,0 @@
|
||||
import React, { useState, useEffect, useRef } from 'react';
|
||||
import { query, collection, onSnapshot, addDoc, where, getDocs, orderBy, getCountFromServer } from 'firebase/firestore';
|
||||
import Markdown from 'react-markdown';
|
||||
import MathJax from 'react-mathjax';
|
||||
import RemarkMathPlugin from 'remark-math';
|
||||
import remarkGfm from 'remark-gfm';
|
||||
import { debounce } from 'lodash';
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
import { FaSpinner } from 'react-icons/fa';
|
||||
// import { MathJax, MathJaxContext } from "better-react-mathjax";
|
||||
|
||||
import './Gemini.css'; // Make sure to have your CSS styles for the typewriter effect
|
||||
import db from '../firebase';
|
||||
|
||||
import 'katex/dist/katex.min.css';
|
||||
|
||||
function Gemini(props) {
|
||||
const [messages, setMessages] = useState([]);
|
||||
const [newMessage, setNewMessage] = useState('');
|
||||
const [isTyping, setIsTyping] = useState(false);
|
||||
const [discussionId, setDiscussionId] = useState(uuidv4());
|
||||
const [isLoading, setIsLoading] = useState(false);
|
||||
const [chatCount, setChatCount] = useState(0);
|
||||
|
||||
const scrollRef = useRef(null);
|
||||
|
||||
const newProps = {
|
||||
...props,
|
||||
options: {
|
||||
...props.options,
|
||||
inlineMath: [['$', '$'], ['\\(', '\\)']], // Adjust delimiters if needed
|
||||
displayMath: [['$$', '$$'], ['\\[', '\\]']], // Adjust delimiters if needed
|
||||
},
|
||||
remarkPlugins: [
|
||||
RemarkMathPlugin,
|
||||
remarkGfm,
|
||||
],
|
||||
// renderers: {
|
||||
// ...props.renderers,
|
||||
// math: (props) =>
|
||||
// <MathJax.Node formula={props.value} />,
|
||||
// inlineMath: (props) =>
|
||||
// <MathJax.Node inline formula={props.value} />
|
||||
// }
|
||||
};
|
||||
|
||||
const newComponents = {
|
||||
...props.components,
|
||||
math: (props) => (
|
||||
<MathJax.Node formula={props.value} />
|
||||
),
|
||||
inlineMath: (props) => (
|
||||
<MathJax.Node inline formula={props.value} />
|
||||
)
|
||||
};
|
||||
|
||||
const getDocumentCount = async (uid) => {
|
||||
const collectionPath = `users/uid/discussions`;
|
||||
try {
|
||||
const querySnapshot = await getCountFromServer(collection(db, collectionPath));
|
||||
// const documentCount = querySnapshot.size;
|
||||
// setChatCount(querySnapshot);
|
||||
console.log(`Document count in the collection "${collectionPath}": ${JSON.stringify(querySnapshot._data.count.integerValue)}`);
|
||||
} catch (error) {
|
||||
console.error("Error getting document count:", error);
|
||||
}
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
const loadChatHistory = async () => {
|
||||
const uid = 'uid'; // Replace with your user ID
|
||||
// const discussionId = uuidv4();
|
||||
console.log(discussionId)
|
||||
|
||||
getDocumentCount(uid);
|
||||
|
||||
const collectionPath = `users/${uid}/discussions/${discussionId}/messages`;
|
||||
|
||||
const q = query(collection(db, collectionPath), orderBy('createTime'));
|
||||
|
||||
try {
|
||||
const querySnapshot = await getDocs(q);
|
||||
const loadedMessages = [];
|
||||
|
||||
querySnapshot.forEach((doc) => {
|
||||
const data = doc.data();
|
||||
loadedMessages.push({ text: data.prompt, sender: 'user' });
|
||||
|
||||
if (data.response) {
|
||||
// console.log(data.response)
|
||||
// Simulate delay for typewriter effect
|
||||
// setTimeout(() => {
|
||||
// // Update the state with the Gemini's response
|
||||
// setMessages((prevMessages) => [
|
||||
// ...prevMessages,
|
||||
// { text: data.response, sender: 'gemini' },
|
||||
// ]);
|
||||
|
||||
// // if (scrollRef.current) {
|
||||
// // // alert(scrollRef.current.scrollHeight)
|
||||
// // scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
|
||||
// // }
|
||||
// }, 10); // You can adjust the delay as needed
|
||||
|
||||
|
||||
loadedMessages.push({ text: data.response, sender: 'gemini' });
|
||||
}
|
||||
});
|
||||
|
||||
// Sort the messages by createTime before updating the state
|
||||
// loadedMessages.sort((a, b) => a.createTime - b.createTime);
|
||||
setMessages(loadedMessages);
|
||||
} catch (error) {
|
||||
console.error('Error loading chat history:', error);
|
||||
}
|
||||
|
||||
|
||||
setTimeout(() => {
|
||||
if (scrollRef.current) {
|
||||
// alert(scrollRef.current.scrollHeight)
|
||||
scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
|
||||
}
|
||||
}, 300);
|
||||
};
|
||||
|
||||
loadChatHistory();
|
||||
}, []); // Empty dependency array ensures the effect runs only once on component mount
|
||||
|
||||
const handleSendMessage = async () => {
|
||||
if (newMessage.trim() === '') return;
|
||||
|
||||
setIsLoading(true);
|
||||
|
||||
const uid = 'uid'; // Replace with your user ID
|
||||
|
||||
const collectionPath = `users/${uid}/discussions/${discussionId}/messages`;
|
||||
const collectionRef = collection(db, collectionPath);
|
||||
|
||||
// Add user's message to the local state first
|
||||
setMessages([...messages, { text: newMessage, sender: 'user' }]);
|
||||
setNewMessage('');
|
||||
|
||||
// Then, add the user's message to the Firestore collection
|
||||
// Your existing code for adding user's message remains unchanged
|
||||
|
||||
const docRef = await addDoc(collectionRef, {
|
||||
prompt: newMessage,
|
||||
});
|
||||
|
||||
// Listen for changes in the Firestore document
|
||||
const unsub = onSnapshot(docRef, (doc) => {
|
||||
const data = doc.data();
|
||||
if (data && data.response) {
|
||||
// console.log(data.response)
|
||||
// Start typewriter animation
|
||||
// setIsTyping(true);
|
||||
|
||||
// Simulate delay for typewriter effect
|
||||
setTimeout(() => {
|
||||
// Update the state with the Gemini's response
|
||||
setMessages((prevMessages) => [...prevMessages, { text: data.response, sender: 'gemini' }]);
|
||||
// Stop typewriter animation
|
||||
// setIsTyping(false);
|
||||
|
||||
setIsLoading(false);
|
||||
}, 200); // You can adjust the delay as needed
|
||||
}
|
||||
// Scroll to the bottom
|
||||
if (scrollRef.current) {
|
||||
scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
|
||||
}
|
||||
});
|
||||
|
||||
if (scrollRef.current) {
|
||||
scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
|
||||
}
|
||||
|
||||
return unsub;
|
||||
};
|
||||
|
||||
const handleInputChange = debounce((value) => {
|
||||
setNewMessage(value);
|
||||
}, 30); // Adjust the delay as needed
|
||||
|
||||
|
||||
return (
|
||||
<div>
|
||||
{/* <div>Chats: {chatCount}</div> */}
|
||||
<div style={{ height: '500px', overflowY: 'scroll', border: '1px solid #ccc' }} ref={scrollRef}>
|
||||
{messages.map((message, index) => (
|
||||
<div key={index} className={message.sender === 'user' ? 'user-message' : 'other-message'}>
|
||||
{message.sender === 'gemini' && isTyping ? (
|
||||
<div className="typing-animation">Gemini is typing...</div>
|
||||
) : (
|
||||
<MathJax.Provider input="tex">
|
||||
<Markdown components={newComponents} {...newProps}>{message.text}</Markdown>
|
||||
</MathJax.Provider>
|
||||
)}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
<div className="user-chat-input">
|
||||
<input
|
||||
type="text"
|
||||
value={newMessage}
|
||||
onChange={(e) => setNewMessage(e.target.value)}
|
||||
onKeyDown={(e) => {
|
||||
if (e.key === 'Enter') {
|
||||
handleSendMessage();
|
||||
}
|
||||
}}
|
||||
placeholder="Type your message..."
|
||||
style={{ marginRight: '8px', padding: '8px', fontSize: '16px', width: '50vw' }}
|
||||
/>
|
||||
<button
|
||||
onClick={handleSendMessage}
|
||||
style={{
|
||||
backgroundColor: '#4CAF50',
|
||||
color: 'white',
|
||||
padding: '10px 20px',
|
||||
border: 'none',
|
||||
borderRadius: '4px',
|
||||
cursor: 'pointer',
|
||||
fontSize: '16px',
|
||||
}}
|
||||
>
|
||||
Send
|
||||
</button>
|
||||
{isLoading && <div className='loading-container'>
|
||||
<div className="loading-icon">
|
||||
<FaSpinner className="spin" />
|
||||
</div>
|
||||
</div>}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default Gemini;
|
||||
@@ -1,19 +0,0 @@
|
||||
.step-title {
|
||||
font-weight: 600;
|
||||
margin: 10px;
|
||||
margin-top: 50px;
|
||||
}
|
||||
|
||||
.help-image {
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
.step-description {
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
.help-feature {
|
||||
font-weight: 900;
|
||||
font-size: 1.5rem;
|
||||
margin: 10px;
|
||||
}
|
||||
@@ -1,128 +0,0 @@
|
||||
import React, { useState } from 'react';
|
||||
import Accordion from '@mui/material/Accordion';
|
||||
import AccordionDetails from '@mui/material/AccordionDetails';
|
||||
import AccordionSummary from '@mui/material/AccordionSummary';
|
||||
import Typography from '@mui/material/Typography';
|
||||
import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
|
||||
|
||||
import './Help.css';
|
||||
|
||||
function Help({ url, show }) {
|
||||
const [startDate, setStartDate] = useState("");
|
||||
const [endDate, setEndDate] = useState("");
|
||||
|
||||
const [expanded, setExpanded] = useState(false);
|
||||
|
||||
const handleChange =
|
||||
(panel) => (event, isExpanded) => {
|
||||
setExpanded(isExpanded ? panel : false);
|
||||
};
|
||||
|
||||
return (
|
||||
<div>
|
||||
<Accordion expanded={expanded === 'panel1'} onChange={handleChange('panel1')}>
|
||||
<AccordionSummary
|
||||
expandIcon={<ExpandMoreIcon />}
|
||||
aria-controls="panel1bh-content"
|
||||
id="panel1bh-header"
|
||||
>
|
||||
<Typography sx={{ width: '33%', flexShrink: 0 }}>
|
||||
Auto Analysis
|
||||
</Typography>
|
||||
<Typography sx={{ color: 'text.secondary' }}>Auto Analysis of device data with dye and HB</Typography>
|
||||
</AccordionSummary>
|
||||
<AccordionDetails>
|
||||
<Typography>
|
||||
<div className='step-title'>Step 1:</div>
|
||||
<div className='step-description'>Click on the start date tab and select the necessary date. Repeat the same process on the end date tab as well.</div>
|
||||
<img className="help-image" src={require('../assets/auto_analysis_help-1.png')} alt='icon'></img>
|
||||
|
||||
<div className='step-title'>Step 2:</div>
|
||||
<div className='step-description'>Select an end date, it has to be at least one date post the start date.</div>
|
||||
<img className="help-image" src={require('../assets/auto_analysis_help-2.png')} alt='icon'></img>
|
||||
|
||||
<div className='step-title'>Step 3:</div>
|
||||
<div className='step-description'>Click on the Download Excel button and wait for the document to download.</div>
|
||||
<img className="help-image" src={require('../assets/auto_analysis_help-3.png')} alt='icon'></img>
|
||||
</Typography>
|
||||
</AccordionDetails>
|
||||
</Accordion>
|
||||
|
||||
|
||||
<Accordion expanded={expanded === 'panel2'} onChange={handleChange('panel2')}>
|
||||
<AccordionSummary
|
||||
expandIcon={<ExpandMoreIcon />}
|
||||
aria-controls="panel2bh-content"
|
||||
id="panel2bh-header"
|
||||
>
|
||||
<Typography sx={{ width: '33%', flexShrink: 0 }}>Raw Data</Typography>
|
||||
<Typography sx={{ color: 'text.secondary' }}>
|
||||
Download raw data
|
||||
</Typography>
|
||||
</AccordionSummary>
|
||||
<AccordionDetails>
|
||||
<Typography>
|
||||
<div className='step-title'>Step 1:</div>
|
||||
<div className='step-description'>Click on the <strong>start date</strong> tab and select the necessary date. Repeat the same process on the <strong>end date</strong> tab as well.</div>
|
||||
<img className="help-image" src={require('../assets/raw_data_help_1.png')} alt='icon'></img>
|
||||
<img className="help-image" src={require('../assets/raw_data_help_2.png')} alt='icon'></img>
|
||||
|
||||
<div className='step-title'>Step 2:</div>
|
||||
<div className='step-description'>Click on the <strong>Download Excel</strong> button and wait for the document to download.</div>
|
||||
<img className="help-image" src={require('../assets/raw_data_help_3.png')} alt='icon'></img>
|
||||
</Typography>
|
||||
</AccordionDetails>
|
||||
</Accordion>
|
||||
|
||||
|
||||
<Accordion expanded={expanded === 'panel3'} onChange={handleChange('panel3')}>
|
||||
<AccordionSummary
|
||||
expandIcon={<ExpandMoreIcon />}
|
||||
aria-controls="panel3bh-content"
|
||||
id="panel3bh-header"
|
||||
>
|
||||
<Typography sx={{ width: '33%', flexShrink: 0 }}>
|
||||
Registration
|
||||
</Typography>
|
||||
<Typography sx={{ color: 'text.secondary' }}>
|
||||
Create and clear entries for taking readings in devices
|
||||
</Typography>
|
||||
</AccordionSummary>
|
||||
<AccordionDetails>
|
||||
<Typography>
|
||||
|
||||
<div className='step-title'>Step 1:</div>
|
||||
<div className='step-description'>Enter the sample or solution name in the <strong>name</strong> tab with appropriate format given below.</div>
|
||||
<img className="help-image" src={require('../assets/registration_help_1.png')} alt='icon'></img>
|
||||
|
||||
|
||||
<div className='step-title'>Step 2:</div>
|
||||
<div className='step-description'>Click on the create button to get an ID and you will receive a confirmation message.
|
||||
|
||||
If you wish to clear the generated IDs click on the clear button and you will receive a confirmation message.</div>
|
||||
<img className="help-image" src={require('../assets/raw_data_help_2.png')} alt='icon'></img>
|
||||
<img className="help-image" src={require('../assets/raw_data_help_3.png')} alt='icon'></img>
|
||||
</Typography>
|
||||
</AccordionDetails>
|
||||
</Accordion>
|
||||
|
||||
|
||||
{/* <Accordion expanded={expanded === 'panel4'} onChange={handleChange('panel4')}>
|
||||
<AccordionSummary
|
||||
expandIcon={<ExpandMoreIcon />}
|
||||
aria-controls="panel4bh-content"
|
||||
id="panel4bh-header"
|
||||
>
|
||||
<Typography sx={{ width: '33%', flexShrink: 0 }}>Personal data</Typography>
|
||||
</AccordionSummary>
|
||||
<AccordionDetails>
|
||||
<Typography>
|
||||
Nunc vitae orci ultricies, auctor nunc in, volutpat nisl. Integer sit
|
||||
amet egestas eros, vitae egestas augue. Duis vel est augue.
|
||||
</Typography>
|
||||
</AccordionDetails>
|
||||
</Accordion> */}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
export default Help;
|
||||
@@ -1,9 +0,0 @@
|
||||
import React from 'react';
|
||||
|
||||
const HomePage = (props) => {
|
||||
return (
|
||||
<div>HomePage</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default HomePage;
|
||||
@@ -1,47 +0,0 @@
|
||||
import React, { useState } from 'react';
|
||||
|
||||
const ImageDownloader = () => {
|
||||
const [imageUrl, setImageUrl] = useState('');
|
||||
const [imageData, setImageData] = useState(null);
|
||||
|
||||
const handleInputChange = (e) => {
|
||||
setImageUrl(e.target.value);
|
||||
};
|
||||
|
||||
const handleFetchImage = async () => {
|
||||
try {
|
||||
const response = await fetch(imageUrl, { mode: 'no-cors'});
|
||||
const blob = await response.blob();
|
||||
console.log(blob);
|
||||
setImageData(URL.createObjectURL(blob));
|
||||
} catch (error) {
|
||||
console.error('Error fetching image:', error);
|
||||
}
|
||||
};
|
||||
|
||||
const handleDownloadImage = () => {
|
||||
const link = document.createElement('a');
|
||||
link.href = imageData;
|
||||
link.download = 'downloaded_image';
|
||||
link.click();
|
||||
};
|
||||
|
||||
return (
|
||||
<div>
|
||||
<label>
|
||||
Image URL:
|
||||
<input type="text" value={imageUrl} onChange={handleInputChange} />
|
||||
</label>
|
||||
<button onClick={handleFetchImage}>Fetch Image</button>
|
||||
|
||||
{imageData && (
|
||||
<div>
|
||||
<img src={imageData} alt="Downloadable" style={{ maxWidth: '100%' }} />
|
||||
<button onClick={handleDownloadImage}>Download Image</button>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default ImageDownloader;
|
||||
@@ -1,70 +0,0 @@
|
||||
import React, { useEffect, useState, useRef } from 'react';
|
||||
import { query, collection, onSnapshot, where, orderBy, limit } from 'firebase/firestore';
|
||||
import moment from 'moment';
|
||||
|
||||
import db from '../firebase';
|
||||
import './KitCheck.css';
|
||||
|
||||
const KitCheck = () => {
|
||||
const [samples, setSamples] = useState([]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!samples.length) {
|
||||
const q = query(collection(db, "buffers"), where("runTime", ">=", moment().format("YYYY-MM-DD").toString()), orderBy("runTime", "desc"));
|
||||
|
||||
const unsub = onSnapshot(q, (querySnapshot) => {
|
||||
const samples = [];
|
||||
querySnapshot.forEach((document) => {
|
||||
console.log(document.id);
|
||||
const data = document.data();
|
||||
const id = document.id;
|
||||
samples.push({id, ...data});
|
||||
});
|
||||
setSamples(samples);
|
||||
});
|
||||
|
||||
return () => unsub;
|
||||
}
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<div>
|
||||
{/* <div className='samples-heading'><h3>Samples page for denovix useage</h3></div>
|
||||
{samples.length ? (
|
||||
samples.map((alert, index) => (
|
||||
<div key={index} className='samples-card'>
|
||||
<div tabIndex={index}><strong>{alert._id}</strong></div>
|
||||
<p className='sample-time'>{alert.testTime}</p>
|
||||
<p className='sample-time-ago'>{moment(alert.testTime).fromNow()}</p>
|
||||
</div>
|
||||
))
|
||||
) : (
|
||||
<div className='no-samples-message'>Samples will appear as in when a test is recorded</div>
|
||||
)} */}
|
||||
|
||||
|
||||
<h1>Kit Check</h1>
|
||||
|
||||
<div className='samples-container'>
|
||||
<table id="samples-table">
|
||||
<tr>
|
||||
<th>Device</th>
|
||||
<th>Kit</th>
|
||||
<th>Result</th>
|
||||
<th>Time</th>
|
||||
</tr>
|
||||
{samples.map((sample, index) => (
|
||||
<tr key={index} className='samples-table-tr'>
|
||||
<td>{sample.deviceId}</td>
|
||||
<td>{sample.kitSerial || 'NA'}</td>
|
||||
<td>{sample.classificationResult || 'NA'}</td>
|
||||
<td>{moment(sample.runTime).format('HH:mm:ss')}</td>
|
||||
</tr>
|
||||
))}
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default KitCheck;
|
||||
@@ -1,6 +1,6 @@
|
||||
.locations-card {
|
||||
width: 40vw;
|
||||
height: 45vh;
|
||||
height: 40vh;
|
||||
background-color: white;
|
||||
margin: 10px;
|
||||
display: flex;
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
.locations-graph-card {
|
||||
width: 40vw;
|
||||
height: 45vh;
|
||||
height: 40vh;
|
||||
background-color: white;
|
||||
margin: 10px;
|
||||
border-style: solid;
|
||||
@@ -27,7 +27,7 @@
|
||||
.locations-card-title {
|
||||
text-align: center;
|
||||
font-weight: 600;
|
||||
padding-top: 10px;
|
||||
/* padding-top: 10px; */
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
import { Outlet } from "react-router-dom";
|
||||
import { Box, Toolbar } from "@mui/material";
|
||||
import colorConfigs from "../configs/colorConfigs";
|
||||
import sizeConfigs from "../configs/sizeConfigs";
|
||||
import Sidebar from "./nav/Sidebar";
|
||||
import Topbar from "./nav/Topbar";
|
||||
|
||||
const MainLayout = () => {
|
||||
return (
|
||||
<Box sx={{ display: "flex" }}>
|
||||
<Topbar />
|
||||
<Box
|
||||
component="nav"
|
||||
sx={{
|
||||
width: sizeConfigs.sidebar.width,
|
||||
flexShrink: 0
|
||||
}}
|
||||
>
|
||||
<Sidebar />
|
||||
</Box>
|
||||
<Box
|
||||
component="main"
|
||||
sx={{
|
||||
flexGrow: 1,
|
||||
p: 3,
|
||||
width: `calc(100% - ${sizeConfigs.sidebar.width})`,
|
||||
minHeight: "100vh",
|
||||
backgroundColor: colorConfigs.mainBg
|
||||
}}
|
||||
>
|
||||
<Toolbar />
|
||||
<Outlet />
|
||||
</Box>
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
|
||||
export default MainLayout;
|
||||
@@ -1,19 +0,0 @@
|
||||
import { useEffect } from "react";
|
||||
import { useDispatch } from "react-redux";
|
||||
import { setAppState } from "../store/appStateSlice";
|
||||
|
||||
const PageWrapper = (props) => {
|
||||
const dispatch = useDispatch();
|
||||
|
||||
useEffect(() => {
|
||||
if (props.state) {
|
||||
dispatch(setAppState(props.state));
|
||||
}
|
||||
}, [dispatch, props]);
|
||||
|
||||
return (
|
||||
<>{props.children}</>
|
||||
);
|
||||
};
|
||||
|
||||
export default PageWrapper;
|
||||
@@ -1,15 +0,0 @@
|
||||
import React, { useState } from 'react';
|
||||
import { FaInfoCircle } from "react-icons/fa";
|
||||
|
||||
import './Precision.css';
|
||||
|
||||
function Precision({ show }) {
|
||||
const [showCardInfo, setShowCardInfo] = useState(false);
|
||||
|
||||
return (
|
||||
<div>
|
||||
<h1>Precision</h1>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
export default Precision;
|
||||
@@ -1,32 +0,0 @@
|
||||
.message {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 80vw;
|
||||
height: 50px;
|
||||
background-color: rgb(187, 218, 174);
|
||||
}
|
||||
|
||||
.user-creation {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.clear-users-button {
|
||||
background-color: #b62200;
|
||||
border: none;
|
||||
color: white;
|
||||
padding: 5px;
|
||||
text-align: center;
|
||||
text-decoration: none;
|
||||
display: inline-block;
|
||||
font-size: 16px;
|
||||
margin: 5px;
|
||||
}
|
||||
|
||||
.format-text {
|
||||
color: red;
|
||||
}
|
||||
@@ -1,107 +0,0 @@
|
||||
import React, { useState } from 'react';
|
||||
import moment from 'moment';
|
||||
import axios from 'axios';
|
||||
|
||||
import './Registration.css';
|
||||
|
||||
function Registration() {
|
||||
const [userId, setUserId] = useState("2808202300103SMIBLR");
|
||||
const [counter, setCounter] = useState(0);
|
||||
const [message, setMessage] = useState("");
|
||||
const [name, setName] = useState("");
|
||||
|
||||
const createUser = () => {
|
||||
setMessage("");
|
||||
const id = moment().unix() + counter + "SMIBLR";
|
||||
setCounter(counter + 1);
|
||||
axios({
|
||||
method: 'post',
|
||||
url: `https://asia-south1-${process.env.REACT_APP_FIREBASE_PROJECT_ID}.cloudfunctions.net/registerUser`,
|
||||
data: {
|
||||
"_id": id,
|
||||
"aadharId": "2808202300001",
|
||||
"abhaId": "12434949797979",
|
||||
"birthYear": "2000",
|
||||
"bloodGroup": "",
|
||||
"careOf": "",
|
||||
"caste": "",
|
||||
"city": "Bengaluru",
|
||||
"district": "Bengaluru",
|
||||
"gender": "Male",
|
||||
"house": "42",
|
||||
"maritalStatus": "Single",
|
||||
"name": name ? name : "Web",
|
||||
"phoneNumber": "9123456789",
|
||||
"pinCode": "560060",
|
||||
"registeredBy": "admin",
|
||||
"registrationCenterName": "SMI",
|
||||
"sickleCellHistory": null,
|
||||
"state": "Karnataka",
|
||||
"subCaste": "",
|
||||
"testStatus": false,
|
||||
"incubationTime": moment().subtract('15', 'minutes').utcOffset("+05:30").format("YYYY-MM-DD HH:mm:ss"),
|
||||
"underMedication": false,
|
||||
"underTransfusion": false,
|
||||
"userImageURL": "https://hpos-prod.web.app/logo.png"
|
||||
},
|
||||
withCredentials: false,
|
||||
secure: false,
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
"x-client": "e16a1bd15af2ee640f5a7a18c8d8333f5f01f7c66e003bbc21ee52870f1bce27",
|
||||
},
|
||||
})
|
||||
.then(response => response.data)
|
||||
.then((data) => {
|
||||
setMessage(`${id} is being created`);
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
setMessage(`error: ${err?.message}`);
|
||||
});
|
||||
}
|
||||
|
||||
const clearsUsers = () => {
|
||||
setMessage("");
|
||||
axios({
|
||||
method: 'get',
|
||||
url: `https://asia-south1-${process.env.REACT_APP_FIREBASE_PROJECT_ID}.cloudfunctions.net/clearUsers`,
|
||||
withCredentials: false,
|
||||
secure: false,
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
// "x-client": "e16a1bd15af2ee640f5a7a18c8d8333f5f01f7c66e003bbc21ee52870f1bce27",
|
||||
},
|
||||
})
|
||||
.then(response => response.data)
|
||||
.then((data) => {
|
||||
setMessage(`${data}`);
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
setMessage(`error: ${err?.message}`);
|
||||
});
|
||||
}
|
||||
|
||||
const onNameChange = (event) => {
|
||||
setName(event.target.value);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="user-creation">
|
||||
<label>
|
||||
name:
|
||||
<input name="name" value={name} placeholder="350 UMOL KMNO4" onChange={onNameChange} />
|
||||
</label>
|
||||
<h5 className='format-text'>Correct formats for automatic analysis are: 100 UMOL KMNO4, 290uM KMnO4, KMnO4-720umol, 350 UMOL TAR, Tar-120umol, HB-13-N-4, HB-11-4</h5>
|
||||
<div className='dates'>
|
||||
<div className='button' onClick={() => createUser()}>Create</div>
|
||||
</div>
|
||||
<div className='dates'>
|
||||
<div className='clear-users-button' onClick={() => clearsUsers()}>Clear</div>
|
||||
</div>
|
||||
<div>{message && <div className='message'>{message}</div>}</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
export default Registration;
|
||||
@@ -1,39 +1,31 @@
|
||||
#samples-table {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
.samples-card {
|
||||
width: 35vw;
|
||||
height: 25vh;
|
||||
background-color: white;
|
||||
margin: 1rem;
|
||||
padding: 1rem;
|
||||
border-style: solid;
|
||||
border-color: rgb(219, 219, 219);
|
||||
border-radius: 6px;
|
||||
border-width: max(1px, 0.0625rem);
|
||||
}
|
||||
|
||||
.samples-heading {
|
||||
margin: 30px;
|
||||
}
|
||||
|
||||
.sample-classification {
|
||||
font-size: small;
|
||||
}
|
||||
|
||||
#samples-table td,
|
||||
#samples-table th {
|
||||
border: 1px solid #ddd;
|
||||
padding: 8px;
|
||||
width: 10vw;
|
||||
.sample-time {
|
||||
font-size: small;
|
||||
}
|
||||
|
||||
#samples-table td {
|
||||
width: 15vw;
|
||||
.sample-time-ago {
|
||||
font-size: x-small;
|
||||
}
|
||||
|
||||
#samples-table tr:nth-child(even) {
|
||||
background-color: #f2f2f2;
|
||||
}
|
||||
|
||||
#samples-table tr:hover {
|
||||
background-color: #ddd;
|
||||
}
|
||||
|
||||
#samples-table th {
|
||||
padding-top: 12px;
|
||||
padding-bottom: 12px;
|
||||
text-align: center;
|
||||
background-color: rgb(144, 183, 255);
|
||||
color: black;
|
||||
width: 5vw;
|
||||
}
|
||||
|
||||
.samples-container {
|
||||
overflow-x: auto;
|
||||
overflow-y: auto;
|
||||
.no-samples-message {
|
||||
margin: 35px;
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
import React, { useEffect, useState, useRef } from 'react';
|
||||
import { query, collection, onSnapshot, where, orderBy, limit } from 'firebase/firestore';
|
||||
import { query, collection, onSnapshot, where, orderBy } from 'firebase/firestore';
|
||||
|
||||
import './Samples.css';
|
||||
import db from '../firebase';
|
||||
@@ -10,15 +10,14 @@ const Samples = () => {
|
||||
|
||||
useEffect(() => {
|
||||
if (!samples.length) {
|
||||
const q = query(collection(db, "testData"), where("testTime", ">=", moment().format("YYYY-MM-DD").toString()), orderBy("testTime", "desc"));
|
||||
const q = query(collection(db, "testData"), where("testTime", ">=", moment().format("YYYY-MM-DD")), orderBy("testTime", "desc"));
|
||||
|
||||
const unsub = onSnapshot(q, (querySnapshot) => {
|
||||
const samples = [];
|
||||
querySnapshot.forEach((document) => {
|
||||
console.log(document.id);
|
||||
const data = document.data();
|
||||
const id = document.id;
|
||||
samples.push({id, ...data});
|
||||
console.log(document.data());
|
||||
const alert = document.data();
|
||||
samples.push(alert);
|
||||
});
|
||||
setSamples(samples);
|
||||
});
|
||||
@@ -29,57 +28,22 @@ const Samples = () => {
|
||||
|
||||
return (
|
||||
<div>
|
||||
{/* <div className='samples-heading'><h3>Samples page for denovix useage</h3></div>
|
||||
<div className='samples-heading'><h3>Samples page for denovix useage</h3></div>
|
||||
{samples.length ? (
|
||||
samples.map((alert, index) => (
|
||||
<div key={index} className='samples-card'>
|
||||
<div tabIndex={index}><strong>{alert._id}</strong></div>
|
||||
<p className='sample-classification'>{alert.classificationResult}</p>
|
||||
<p className='sample-classification'>{alert.deviceSerialNumber}</p>
|
||||
<p className='sample-classification'>led1Buffer: {alert.led1Buffer}</p>
|
||||
<p className='sample-classification'>led2Buffer: {alert.led2Buffer}</p>
|
||||
<p className='sample-time'>{alert.testTime}</p>
|
||||
<p className='sample-time-ago'>{moment(alert.testTime).fromNow()}</p>
|
||||
</div>
|
||||
))
|
||||
) : (
|
||||
<div className='no-samples-message'>Samples will appear as in when a test is recorded</div>
|
||||
)} */}
|
||||
|
||||
|
||||
<h1>Samples</h1>
|
||||
|
||||
<div className='samples-container'>
|
||||
<table id="samples-table">
|
||||
<tr>
|
||||
<th>Sample Name</th>
|
||||
<th>CResult</th>
|
||||
<th>Dev Ratio Class</th>
|
||||
<th>BM2 Class</th>
|
||||
<th>Dev Ratio</th>
|
||||
<th>Slope Ratio</th>
|
||||
<th>led1Sam.</th>
|
||||
{/* <th>led2Average</th> */}
|
||||
<th>led2Sam.</th>
|
||||
<th>led3Sam.</th>
|
||||
<th>led4Sam.</th>
|
||||
<th>Device</th>
|
||||
<th>Time</th>
|
||||
</tr>
|
||||
{samples.map((sample, index) => (
|
||||
<tr key={index} className='samples-table-tr'>
|
||||
<td>{sample.name || sample._id}</td>
|
||||
<td>{sample.classificationResult}</td>
|
||||
<td>{sample.deviceRatioClass}</td>
|
||||
<td>{sample.borderlineMethod2Class}</td>
|
||||
<td>{sample?.deviceRatio?.toFixed(4)}</td>
|
||||
<td>{sample?.slopeRatio?.toFixed(4)}</td>
|
||||
<td>{sample.led1Sample || 'NA'}</td>
|
||||
<td>{sample.led2Sample || 'NA'}</td>
|
||||
<td>{sample.led3Sample || 'NA'}</td>
|
||||
<td>{sample.led4Sample || 'NA'}</td>
|
||||
<td>{sample.deviceId}</td>
|
||||
<td>{moment(sample.testTime).format('HH:mm:ss')}</td>
|
||||
</tr>
|
||||
))}
|
||||
</table>
|
||||
</div>
|
||||
<div className='no-samples-message'>No tests are conducted today</div>
|
||||
)}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
.resultratio-graph-card {
|
||||
width: 40vw;
|
||||
height: 45vh;
|
||||
height: 40vh;
|
||||
background-color: white;
|
||||
margin: 10px;
|
||||
border-style: solid;
|
||||
|
||||
@@ -19,12 +19,10 @@ class ScatterPlot extends Component {
|
||||
}
|
||||
|
||||
drawChart(data) {
|
||||
console.log(data);
|
||||
|
||||
if (!data) return;
|
||||
|
||||
// set the dimensions and margins of the graph
|
||||
var margin = { top: 10, right: 30, bottom: 30, left: 60 },
|
||||
var margin = { top: 10, right: 30, bottom: 40, left: 60 },
|
||||
width = 460 - margin.left - margin.right,
|
||||
height = 250 - margin.top - margin.bottom;
|
||||
|
||||
@@ -37,11 +35,9 @@ class ScatterPlot extends Component {
|
||||
.attr("transform",
|
||||
"translate(" + margin.left + "," + margin.top + ")");
|
||||
|
||||
//Read the data
|
||||
|
||||
// Add X axis
|
||||
var x = d3.scaleLinear()
|
||||
.domain([0, 100])
|
||||
.domain([0, 50])
|
||||
.range([0, width]);
|
||||
svg.append("g")
|
||||
.attr("transform", "translate(0," + height + ")")
|
||||
@@ -49,7 +45,7 @@ class ScatterPlot extends Component {
|
||||
|
||||
// Add Y axis
|
||||
var y = d3.scaleLinear()
|
||||
.domain([0, 2])
|
||||
.domain([0, 1.2])
|
||||
.range([height, 0]);
|
||||
svg.append("g")
|
||||
.call(d3.axisLeft(y));
|
||||
@@ -61,7 +57,7 @@ class ScatterPlot extends Component {
|
||||
.enter()
|
||||
.append("circle")
|
||||
.attr("cx", function (d, i) { return x(2023 - d.birthYear); })
|
||||
.attr("cy", function (d) { return y(d.resultRatio); })
|
||||
.attr("cy", function (d) { return y(d.resultRatio || d.calculatedRatio); })
|
||||
.attr("r", 1.5)
|
||||
.style("fill", "#69b3a2")
|
||||
}
|
||||
|
||||
@@ -1,17 +1,38 @@
|
||||
.container {
|
||||
.analytics-page::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.analytics-title::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.analytics-page {
|
||||
width: 100vw;
|
||||
}
|
||||
|
||||
.analytics-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 50vh;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
.analytics-title {
|
||||
padding: 10px;
|
||||
text-align: center;
|
||||
background: rgb(207, 235, 250);
|
||||
color: black;
|
||||
font-size: 30px;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
@media screen and (min-width: 900px) {
|
||||
.container {
|
||||
.analytics-container {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 50vh;
|
||||
height: 45vh;
|
||||
}
|
||||
}
|
||||
@@ -67,7 +67,7 @@ const TestAnalytics = () => {
|
||||
const todaysTests = hposTests.filter((x) => moment(x.testTime).isBetween(moment(lastTestedDate).startOf('day'), moment(lastTestedDate).endOf('day')));
|
||||
setCurDayTests(todaysTests);
|
||||
const dailyCategoryCounts = todaysTests.reduce(function (result, test) {
|
||||
const category = test.result;
|
||||
const category = test.classificationResult;
|
||||
if (!result[category]) {
|
||||
result[category] = 0;
|
||||
}
|
||||
@@ -85,8 +85,8 @@ const TestAnalytics = () => {
|
||||
}, [curTestData, curTest, device, testDate]);
|
||||
|
||||
return (
|
||||
<div className="devices-page">
|
||||
<div className='title'>Analytics</div>
|
||||
<div className="analytics-page">
|
||||
<div className='analytics-title'>Analytics</div>
|
||||
{/* <div className='dropdown-group'>
|
||||
<Dropdown className='device-dropdown' options={devices} onChange={changeDevice} value={device} placeholder="Select an device" />
|
||||
<Dropdown className='day-dropdown' options={days} onChange={changeTestDate} value={testDate} placeholder="Select an test date" />
|
||||
@@ -95,11 +95,11 @@ const TestAnalytics = () => {
|
||||
<button className='clear-button' onClick={toggleShowGraph}><img className="graph-icon" src={require('./graph_icon.png')}></img>{curTestData ? 'Clear' : 'Show'}</button>
|
||||
</div> */}
|
||||
|
||||
<div className='container'>
|
||||
<div className='analytics-container'>
|
||||
{dailyCategoryCounts && <TestAnalyticsPie data={dailyCategoryCounts} />}
|
||||
{dailyResults && <TestAnalyticsGraph data={dailyResults} />}
|
||||
</div>
|
||||
<div className='container'>
|
||||
<div className='analytics-container'>
|
||||
{allTests && <ScatterPlot data={allTests} />}
|
||||
{allTests && <Locations />}
|
||||
</div>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
.tests-count-card {
|
||||
width: 40vw;
|
||||
height: 45vh;
|
||||
height: 40vh;
|
||||
background-color: white;
|
||||
margin: 10px;
|
||||
/* display: flex;
|
||||
@@ -59,3 +59,17 @@
|
||||
font-weight: 400;
|
||||
padding: 0.5em;
|
||||
}
|
||||
|
||||
div#tests-count-graph {
|
||||
height: 250px;
|
||||
width: 450px;
|
||||
/* border: 2px solid #000; */
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
svg#bargraph {
|
||||
height: 240px; /* 500px; */
|
||||
width: 450px; /* 1100px; */
|
||||
/* border: 1px dotted #ccc; */
|
||||
/* background-color: #ccc; */
|
||||
}
|
||||
@@ -23,13 +23,14 @@ class TestAnalyticsGraph extends Component {
|
||||
drawBar(data) {
|
||||
if (!data) return;
|
||||
|
||||
data.reverse();
|
||||
// data.reverse();
|
||||
|
||||
var margin = { top: 30, right: 20, bottom: 50, left: 15 },
|
||||
width = 400 - margin.left - margin.right,
|
||||
height = 180 - margin.top - margin.bottom;
|
||||
var margin = { top: 30, right: 20, bottom: 50, left: 55 },
|
||||
width = 440 - margin.left - margin.right,
|
||||
height = 250 - margin.top - margin.bottom;
|
||||
|
||||
var svg = d3.select("#tests-count-graph").append('svg')
|
||||
.attr("id", "bargraph")
|
||||
.attr("width", width + margin.left + margin.right)
|
||||
.attr("height", height + margin.top + margin.bottom)
|
||||
.append("g").attr("transform",
|
||||
@@ -40,7 +41,7 @@ class TestAnalyticsGraph extends Component {
|
||||
yScale = d3.scaleLinear().range([height, 0]);
|
||||
|
||||
var g = svg.append("g")
|
||||
.attr("transform", "translate(" + 10 + "," + 10 + ")");
|
||||
.attr("transform", "translate(" + 5 + "," + 5 + ")");
|
||||
|
||||
|
||||
xScale.domain(data.map(function (d) { return moment(d.date).format("MM-DD"); }));
|
||||
@@ -113,7 +114,7 @@ class TestAnalyticsGraph extends Component {
|
||||
drawChart(data) {
|
||||
if (!data) return;
|
||||
var margin = { top: 20, right: 20, bottom: 30, left: 50 },
|
||||
width = 420 - margin.left - margin.right,
|
||||
width = 960 - margin.left - margin.right,
|
||||
height = 500 - margin.top - margin.bottom;
|
||||
|
||||
const INNER_WIDTH = width;// - margin.left - margin.right;
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
.category-graph-card {
|
||||
width: 40vw;
|
||||
height: 45vh;
|
||||
height: 40vh;
|
||||
background-color: white;
|
||||
margin: 10px;
|
||||
border-style: solid;
|
||||
@@ -55,3 +55,37 @@
|
||||
font-weight: 400;
|
||||
padding: 0.5em;
|
||||
}
|
||||
|
||||
.category-tooltip {
|
||||
max-width: 200px;
|
||||
/* padding: 0.5rem 0.75rem; */
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
background-color: #000;
|
||||
border-radius: 0.25rem;
|
||||
line-height: 1rem;
|
||||
font-weight: 400;
|
||||
padding-top: 0.5rem;
|
||||
padding-bottom: 0.5rem;
|
||||
padding-left: 0.75rem;
|
||||
padding-right: 0.75rem;
|
||||
word-wrap: break-word;
|
||||
/* position: absolute; */
|
||||
/* will-change: transform; */
|
||||
/* top: 0px; */
|
||||
/* left: 0px; */
|
||||
/* transform: translate3d(590px, 403px, 0px); */
|
||||
font-family: "Segoe UI", Roboto, "Noto Sans", Ubuntu, Cantarell, "Helvetica Neue", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
||||
font-style: normal;
|
||||
line-height: 1.5;
|
||||
/* text-align: left; */
|
||||
/* text-align: start; */
|
||||
text-shadow: none;
|
||||
text-transform: none;
|
||||
letter-spacing: normal;
|
||||
word-break: normal;
|
||||
white-space: normal;
|
||||
word-spacing: normal;
|
||||
line-break: auto;
|
||||
font-size: 0.75rem;
|
||||
}
|
||||
@@ -24,7 +24,7 @@ class TestAnalyticsPie extends Component {
|
||||
drawChart(data) {
|
||||
if (!data) return;
|
||||
|
||||
var margin = { top: 30, right: 10, bottom: 15, left: 25 },
|
||||
var margin = { top: 15, right: 10, bottom: 45, left: 10 },
|
||||
width = 480 - margin.left - margin.right,
|
||||
height = 250 - margin.top - margin.bottom,
|
||||
radius = Math.min(width, height) / 2;
|
||||
@@ -64,26 +64,26 @@ class TestAnalyticsPie extends Component {
|
||||
.style("position", "absolute")
|
||||
.style("z-index", "10")
|
||||
.style("visibility", "hidden")
|
||||
.style("background", "#fff")
|
||||
// .style("background", "#fff")
|
||||
.text("a simple tooltip");
|
||||
|
||||
arc.append("path")
|
||||
.attr("d", path)
|
||||
.attr("fill", function (d) { return color(d.data.category); })
|
||||
.on('mouseover', (event, d) => {
|
||||
tooltip.text(`${d.data.category}: ${d.data.count}, ${Math.floor(100 * d.data.count / data.reduce((a, c) => a + c.count, 0)).toFixed(2)}%`);
|
||||
tooltip.text(`${d.data.category} => count: ${d.data.count}, percent: ${Math.floor(100 * d.data.count / data.reduce((a, c) => a + c.count, 0)).toFixed(2)}%`);
|
||||
return tooltip
|
||||
.style("visibility", "visible")
|
||||
.style("font-size", "0.65em")
|
||||
// .style("font-size", "0.65em")
|
||||
.style("font-weight", "600")
|
||||
.style("z-index", "9999")
|
||||
.style("width", "200px")
|
||||
.style("height", "50px")
|
||||
// .style("width", "200px")
|
||||
// .style("height", "50px")
|
||||
.style("display", "flex")
|
||||
.style("align-items", "center")
|
||||
.style("justify-content", "center")
|
||||
.style("border-radius", "3px")
|
||||
.style("box-shadow", "1px 1px 1px 1px #888888");
|
||||
// .style("border-radius", "3px")
|
||||
// .style("box-shadow", "1px 1px 1px 1px #888888");
|
||||
})
|
||||
.on('mouseout', (event, d) => {
|
||||
return tooltip
|
||||
|
||||
49
src/components/Users.js
Normal file
@@ -0,0 +1,49 @@
|
||||
import React, { useEffect, useState, useRef } from 'react';
|
||||
import { query, collection, onSnapshot, where, orderBy } from 'firebase/firestore';
|
||||
|
||||
import './Samples.css';
|
||||
import db from '../firebase';
|
||||
import moment from 'moment';
|
||||
|
||||
const Users = () => {
|
||||
const [samples, setSamples] = useState([]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!samples.length) {
|
||||
const q = query(collection(db, "patientData"), where("createdAt", ">=", moment().format("YYYY-MM-DD")), orderBy("createdAt", "desc"));
|
||||
|
||||
const unsub = onSnapshot(q, (querySnapshot) => {
|
||||
const samples = [];
|
||||
querySnapshot.forEach((document) => {
|
||||
console.log(document.data());
|
||||
const alert = document.data();
|
||||
samples.push(alert);
|
||||
});
|
||||
setSamples(samples);
|
||||
});
|
||||
|
||||
return () => unsub;
|
||||
}
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<div>
|
||||
<div className='samples-heading'><h3>Users page for denovix useage</h3></div>
|
||||
{samples.length ? (
|
||||
samples.map((alert, index) => (
|
||||
<div key={index} className='samples-card'>
|
||||
<div tabIndex={index}><strong>{alert._id}</strong></div>
|
||||
<p className='sample-classification'>{alert.registrationCenterName}</p>
|
||||
{/* <p className='sample-classification'>{alert.deviceSerialNumber}</p> */}
|
||||
{/* <p className='sample-time'>Test Status: {alert.testStatus}</p> */}
|
||||
<p className='sample-time-ago'>{moment(alert.createdAt).fromNow()}</p>
|
||||
</div>
|
||||
))
|
||||
) : (
|
||||
<div className='no-samples-message'>No tests are conducted today</div>
|
||||
)}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default Users;
|
||||
@@ -44,7 +44,7 @@ const WorldMap = () => {
|
||||
}
|
||||
|
||||
return (
|
||||
<svg width={ '40vw' } height={ '50vh' } viewBox="0 0 800 450">
|
||||
<svg width={ '40vw' } height={ '35vh' } viewBox="0 0 800 450">
|
||||
<g className="countries">
|
||||
{
|
||||
geographies.map((d,i) => (
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
import { Avatar, Drawer, List, Stack, Toolbar } from "@mui/material";
|
||||
|
||||
// import assets from "../../assets";
|
||||
import colorConfigs from "../../configs/colorConfigs";
|
||||
import sizeConfigs from "../../configs/sizeConfigs";
|
||||
import appRoutes from "../../routes/appRoutes";
|
||||
import SidebarItem from "./SidebarItem";
|
||||
import SidebarItemCollapse from "./SidebarItemCollapse";
|
||||
|
||||
const Sidebar = () => {
|
||||
return (
|
||||
<Drawer
|
||||
variant="permanent"
|
||||
sx={{
|
||||
width: sizeConfigs.sidebar.width,
|
||||
flexShrink: 0,
|
||||
"& .MuiDrawer-paper": {
|
||||
width: sizeConfigs.sidebar.width,
|
||||
boxSizing: "border-box",
|
||||
borderRight: "0px",
|
||||
backgroundColor: colorConfigs.sidebar.bg,
|
||||
color: colorConfigs.sidebar.color
|
||||
}
|
||||
}}
|
||||
>
|
||||
<List disablePadding>
|
||||
<Toolbar sx={{ marginBottom: "20px" }}>
|
||||
<Stack
|
||||
sx={{ width: "100%" }}
|
||||
direction="row"
|
||||
justifyContent="center"
|
||||
>
|
||||
<Avatar src={require('../../smi-logo-120x120.webp')} />
|
||||
</Stack>
|
||||
</Toolbar>
|
||||
{appRoutes.map((route, index) => (
|
||||
route.sidebarProps ? (
|
||||
route.child ? (
|
||||
<SidebarItemCollapse item={route} key={index} />
|
||||
) : (
|
||||
<SidebarItem item={route} key={index} />
|
||||
)
|
||||
) : null
|
||||
))}
|
||||
</List>
|
||||
</Drawer>
|
||||
);
|
||||
};
|
||||
|
||||
export default Sidebar;
|
||||
@@ -1,34 +0,0 @@
|
||||
import { ListItemButton, ListItemIcon } from "@mui/material";
|
||||
import { useSelector } from "react-redux";
|
||||
import { Link } from "react-router-dom";
|
||||
import colorConfigs from "../../configs/colorConfigs";
|
||||
|
||||
const SidebarItem = ({ item }) => {
|
||||
const { appState } = useSelector((state) => state.appState);
|
||||
|
||||
return (
|
||||
item.sidebarProps && item.path ? (
|
||||
<ListItemButton
|
||||
component={Link}
|
||||
to={item.path}
|
||||
sx={{
|
||||
"&: hover": {
|
||||
backgroundColor: colorConfigs.sidebar.hoverBg
|
||||
},
|
||||
backgroundColor: appState === item.state ? colorConfigs.sidebar.activeBg : "unset",
|
||||
paddingY: "12px",
|
||||
paddingX: "24px"
|
||||
}}
|
||||
>
|
||||
<ListItemIcon sx={{
|
||||
color: colorConfigs.sidebar.color
|
||||
}}>
|
||||
{item.sidebarProps.icon && item.sidebarProps.icon}
|
||||
</ListItemIcon>
|
||||
{item.sidebarProps.displayText}
|
||||
</ListItemButton>
|
||||
) : null
|
||||
);
|
||||
};
|
||||
|
||||
export default SidebarItem;
|
||||
@@ -1,66 +0,0 @@
|
||||
import { Collapse, List, ListItemButton, ListItemIcon, ListItemText, Typography } from "@mui/material";
|
||||
import { useEffect, useState } from "react";
|
||||
import colorConfigs from "../../configs/colorConfigs";
|
||||
import ExpandLessOutlinedIcon from '@mui/icons-material/ExpandLessOutlined';
|
||||
import ExpandMoreOutlinedIcon from '@mui/icons-material/ExpandMoreOutlined';
|
||||
import SidebarItem from "./SidebarItem";
|
||||
import { useSelector } from "react-redux";
|
||||
|
||||
const SidebarItemCollapse = ({ item }) => {
|
||||
const [open, setOpen] = useState(false);
|
||||
|
||||
const { appState } = useSelector((state) => state.appState);
|
||||
|
||||
useEffect(() => {
|
||||
if (appState.includes(item.state)) {
|
||||
setOpen(true);
|
||||
}
|
||||
}, [appState, item]);
|
||||
|
||||
return (
|
||||
item.sidebarProps ? (
|
||||
<>
|
||||
<ListItemButton
|
||||
onClick={() => setOpen(!open)}
|
||||
sx={{
|
||||
"&: hover": {
|
||||
backgroundColor: colorConfigs.sidebar.hoverBg
|
||||
},
|
||||
paddingY: "12px",
|
||||
paddingX: "24px"
|
||||
}}
|
||||
>
|
||||
<ListItemIcon sx={{
|
||||
color: colorConfigs.sidebar.color
|
||||
}}>
|
||||
{item.sidebarProps.icon && item.sidebarProps.icon}
|
||||
</ListItemIcon>
|
||||
<ListItemText
|
||||
disableTypography
|
||||
primary={
|
||||
<Typography>
|
||||
{item.sidebarProps.displayText}
|
||||
</Typography>
|
||||
}
|
||||
/>
|
||||
{open ? <ExpandLessOutlinedIcon /> : <ExpandMoreOutlinedIcon />}
|
||||
</ListItemButton>
|
||||
<Collapse in={open} timeout="auto">
|
||||
<List>
|
||||
{item.child?.map((route, index) => (
|
||||
route.sidebarProps ? (
|
||||
route.child ? (
|
||||
<SidebarItemCollapse item={route} key={index} />
|
||||
) : (
|
||||
<SidebarItem item={route} key={index} />
|
||||
)
|
||||
) : null
|
||||
))}
|
||||
</List>
|
||||
</Collapse>
|
||||
</>
|
||||
) : null
|
||||
);
|
||||
};
|
||||
|
||||
export default SidebarItemCollapse;
|
||||
@@ -1,26 +0,0 @@
|
||||
import { AppBar, Toolbar, Typography } from "@mui/material";
|
||||
import colorConfigs from "../../configs/colorConfigs";
|
||||
import sizeConfigs from "../../configs/sizeConfigs";
|
||||
|
||||
const Topbar = () => {
|
||||
return (
|
||||
<AppBar
|
||||
position="fixed"
|
||||
sx={{
|
||||
width: `calc(100% - ${sizeConfigs.sidebar.width})`,
|
||||
ml: sizeConfigs.sidebar.width,
|
||||
boxShadow: "unset",
|
||||
backgroundColor: colorConfigs.topbar.bg,
|
||||
color: colorConfigs.topbar.color
|
||||
}}
|
||||
>
|
||||
<Toolbar>
|
||||
<Typography variant="h6">
|
||||
HPOS Web - {process.env.REACT_APP_TOPBAR_TITLE}
|
||||
</Typography>
|
||||
</Toolbar>
|
||||
</AppBar>
|
||||
);
|
||||
};
|
||||
|
||||
export default Topbar;
|
||||
@@ -1,17 +0,0 @@
|
||||
import { colors } from "@mui/material";
|
||||
|
||||
const colorConfigs = {
|
||||
sidebar: {
|
||||
bg: "#233044",
|
||||
color: "#eeeeee",
|
||||
hoverBg: "#1e293a",
|
||||
activeBg: "#1e253a"
|
||||
},
|
||||
topbar: {
|
||||
bg: "#fff",
|
||||
color: "#000"
|
||||
},
|
||||
mainBg: colors.grey["100"]
|
||||
};
|
||||
|
||||
export default colorConfigs;
|
||||
@@ -1,10 +1,12 @@
|
||||
const constants = {
|
||||
categoryshortname: {
|
||||
"SICKLECELLTRAIT": "Trait",
|
||||
"SICKLECELLDISEASE": "Disease",
|
||||
"NEGATIVEBORDERLINE": "-Borderline",
|
||||
"POSITIVEBORDERLINE": "+Borderline",
|
||||
"NORMAL": "Normal",
|
||||
"Sickle Cell Trait": "Trait",
|
||||
"Sickle Cell Disease": "Disease",
|
||||
"Negative Borderline. Repeat Test": "-Borderline",
|
||||
"Positive for Sickle Cell. HPLC for Confirmation": "+Borderline",
|
||||
"Normal": "Normal",
|
||||
"Inconclusive. Very low Absorbance - Repeat test with Higher Blood Volume": "Inconclusive - Low Abs",
|
||||
"Inconclusive. Repeat with test with lower volume of blood": "Inconclusive - Low vol. retest",
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
const sizeConfigs = {
|
||||
sidebar: {
|
||||
width: "260px"
|
||||
}
|
||||
};
|
||||
|
||||
export default sizeConfigs;
|
||||
@@ -3,16 +3,42 @@ import { getFirestore} from "firebase/firestore";
|
||||
import { initializeApp } from "firebase/app";
|
||||
import { getAnalytics } from "firebase/analytics";
|
||||
|
||||
// /* dev and test */
|
||||
// const firebaseConfig = {
|
||||
// apiKey: "AIzaSyBFl_YkJ5PMIvMY3G70313SyrqemjFnUv8",
|
||||
// authDomain: "hpos-af3cc.firebaseapp.com",
|
||||
// projectId: "hpos-af3cc",
|
||||
// storageBucket: "hpos-af3cc.appspot.com",
|
||||
// messagingSenderId: "650071678820",
|
||||
// appId: "1:650071678820:web:ce50538bf46632d46c6471",
|
||||
// measurementId: "G-6JHQ47S9DD"
|
||||
// };
|
||||
|
||||
|
||||
// /* preprod */
|
||||
// const firebaseConfig = {
|
||||
// apiKey: "AIzaSyB2-suWmKh2PgQbRmx7rzPjYhgoovQIsQ8",
|
||||
// authDomain: "hpos-preprod.firebaseapp.com",
|
||||
// projectId: "hpos-preprod",
|
||||
// storageBucket: "hpos-preprod.appspot.com",
|
||||
// messagingSenderId: "121176529204",
|
||||
// appId: "1:121176529204:web:6c0db8e642992192bbed61",
|
||||
// measurementId: "G-GYM6LRQ8KR"
|
||||
// };
|
||||
|
||||
|
||||
/* prod */
|
||||
const firebaseConfig = {
|
||||
apiKey: process.env.REACT_APP_FIREBASE_API_KEY,
|
||||
authDomain: process.env.REACT_APP_FIREBASE_AUTH_DOMAIN,
|
||||
projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID,
|
||||
storageBucket: process.env.REACT_APP_FIREBASE_STORAGE_BUCKET,
|
||||
messagingSenderId: process.env.REACT_APP_FIREBASE_MESSAGING_SENDER_ID,
|
||||
appId: process.env.REACT_APP_FIREBASE_APP_ID,
|
||||
measurementId: process.env.REACT_APP_FIREBASE_MEASUREMENT_ID,
|
||||
apiKey: "AIzaSyBF4pLZReAedU4dWX1eRJNFNIaOIz2xk4s",
|
||||
authDomain: "hpos-prod.firebaseapp.com",
|
||||
projectId: "hpos-prod",
|
||||
storageBucket: "hpos-prod.appspot.com",
|
||||
messagingSenderId: "1012719870714",
|
||||
appId: "1:1012719870714:web:fcd00acef93f6612de5f43",
|
||||
measurementId: "G-B0NZ7DEF69"
|
||||
};
|
||||
|
||||
|
||||
const app = initializeApp(firebaseConfig);
|
||||
const analytics = getAnalytics(app);
|
||||
|
||||
|
||||
41
src/index.js
@@ -4,17 +4,18 @@ import {
|
||||
createBrowserRouter,
|
||||
RouterProvider,
|
||||
} from "react-router-dom";
|
||||
import { Provider } from 'react-redux';
|
||||
|
||||
import { store } from './store/store';
|
||||
import './index.css';
|
||||
import App from './App';
|
||||
import AppOp from './AppOp';
|
||||
import reportWebVitals from './reportWebVitals';
|
||||
import Devices from './components/Devices';
|
||||
import TestAnalytics from './components/TestAnalytics';
|
||||
import WorldMap from './components/WorldMap';
|
||||
import RegistraionChart from './RegistraionChart';
|
||||
import TestAnalyticsGraph from './components/TestAnalyticsGraph';
|
||||
import Calibrations from './components/Calibrations';
|
||||
import Alerts from './components/Alerts';
|
||||
import Samples from './components/Samples';
|
||||
import Users from './components/Users';
|
||||
|
||||
const router = createBrowserRouter([
|
||||
{
|
||||
@@ -33,24 +34,36 @@ const router = createBrowserRouter([
|
||||
path: "/analytics",
|
||||
element: <TestAnalytics />,
|
||||
},
|
||||
{
|
||||
path: "/hposdata",
|
||||
element: <TestAnalyticsGraph />,
|
||||
},
|
||||
{
|
||||
path: "/map",
|
||||
element: <RegistraionChart />,
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/calibrations",
|
||||
element: <Calibrations />,
|
||||
},
|
||||
{
|
||||
path: "/op",
|
||||
element: <AppOp />,
|
||||
},
|
||||
{
|
||||
path: "/alerts",
|
||||
element: <Alerts />,
|
||||
},
|
||||
{
|
||||
path: "/samples",
|
||||
element: <Samples />,
|
||||
},
|
||||
{
|
||||
path: "/users",
|
||||
element: <Users />,
|
||||
},
|
||||
]);
|
||||
|
||||
|
||||
const root = ReactDOM.createRoot(document.getElementById('root'));
|
||||
root.render(
|
||||
<Provider store={store}>
|
||||
{/* <CssBaseline /> */}
|
||||
{/* <RouterProvider router={router} /> */}
|
||||
<App />
|
||||
</Provider>
|
||||
<RouterProvider router={router} />
|
||||
);
|
||||
|
||||
// If you want to start measuring performance in your app, pass a function
|
||||
|
||||
@@ -1,146 +0,0 @@
|
||||
import DashboardOutlinedIcon from '@mui/icons-material/DashboardOutlined';
|
||||
import AppsOutlinedIcon from '@mui/icons-material/AppsOutlined';
|
||||
|
||||
import TestAnalytics from "../components/TestAnalytics";
|
||||
import HomePage from '../components/HomePage';
|
||||
import Devices from '../components/Devices';
|
||||
import { Download, FactCheck } from '@mui/icons-material';
|
||||
import ExportData from '../components/ExportData';
|
||||
import Registration from '../components/Registration';
|
||||
import { FaAndroid, FaArrowCircleLeft, FaBars, FaBezierCurve, FaBox, FaChalkboardTeacher, FaChartArea, FaChartLine, FaCheck, FaCommentAlt, FaExclamation, FaFlask, FaGolfBall, FaMicrochip, FaPhone, FaQuestionCircle, FaSearch, FaUser } from 'react-icons/fa';
|
||||
import AppInstallation from '../components/AppInstallation';
|
||||
import Samples from '../components/Samples';
|
||||
import Precision from '../components/Precision';
|
||||
import Accuracy from '../components/Accuracy';
|
||||
import CurveFit from '../components/CurveFit';
|
||||
import Help from '../components/Help';
|
||||
import Gemini from '../components/Gemini';
|
||||
import Diagnostics from '../components/Diagnostics';
|
||||
import KitCheck from '../components/KitCheck';
|
||||
|
||||
const appRoutes = [
|
||||
{
|
||||
index: true,
|
||||
element: <HomePage />,
|
||||
state: "home"
|
||||
},
|
||||
{
|
||||
path: "/analytics",
|
||||
element: <TestAnalytics />,
|
||||
state: "analytics",
|
||||
sidebarProps: {
|
||||
displayText: "Analytics",
|
||||
icon: <DashboardOutlinedIcon />
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/tests/insights",
|
||||
element: <Devices />,
|
||||
state: "insights",
|
||||
sidebarProps: {
|
||||
displayText: "Insights",
|
||||
icon: <AppsOutlinedIcon />
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/downloaddata",
|
||||
element: <ExportData />,
|
||||
state: "downloaddata",
|
||||
sidebarProps: {
|
||||
displayText: "Raw Data",
|
||||
icon: <Download />
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/registration",
|
||||
element: <Registration />,
|
||||
state: "registration",
|
||||
sidebarProps: {
|
||||
displayText: "Registration",
|
||||
icon: <FaUser />
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/appinstallation",
|
||||
element: <AppInstallation />,
|
||||
state: "appinstallation",
|
||||
sidebarProps: {
|
||||
displayText: "App Installation",
|
||||
icon: <FaAndroid />
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/samples",
|
||||
element: <Samples />,
|
||||
state: "Samples",
|
||||
sidebarProps: {
|
||||
displayText: "Samples",
|
||||
icon: <FaFlask />
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/kits",
|
||||
element: <KitCheck />,
|
||||
state: "kits",
|
||||
sidebarProps: {
|
||||
displayText: "Kit Check",
|
||||
icon: <FaBox />
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/diagnostics",
|
||||
element: <Diagnostics />,
|
||||
state: "Diagnostics",
|
||||
sidebarProps: {
|
||||
displayText: "Device Data",
|
||||
icon: <FaMicrochip />
|
||||
}
|
||||
},
|
||||
// {
|
||||
// path: "/precision",
|
||||
// element: <Precision />,
|
||||
// state: "precision",
|
||||
// sidebarProps: {
|
||||
// displayText: "Precision",
|
||||
// icon: <FaCheck />
|
||||
// }
|
||||
// },
|
||||
{
|
||||
path: "/autoanalysis",
|
||||
element: <Accuracy />,
|
||||
state: "autoanalysis",
|
||||
sidebarProps: {
|
||||
displayText: "Auto Analysis",
|
||||
icon: <FaChartLine />
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/plots",
|
||||
element: <CurveFit />,
|
||||
state: "plots",
|
||||
sidebarProps: {
|
||||
displayText: "EDA Plots",
|
||||
icon: <FaBezierCurve />
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/chat",
|
||||
element: <Gemini />,
|
||||
state: "chat",
|
||||
sidebarProps: {
|
||||
displayText: "Chat Gemini",
|
||||
icon: <FaCommentAlt />
|
||||
}
|
||||
},
|
||||
{
|
||||
path: "/helpcenter",
|
||||
element: <Help />,
|
||||
state: "helpcenter",
|
||||
sidebarProps: {
|
||||
displayText: "Help Center",
|
||||
icon: <FaQuestionCircle />
|
||||
}
|
||||
},
|
||||
]
|
||||
|
||||
export default appRoutes;
|
||||
@@ -1,34 +0,0 @@
|
||||
import { Route } from "react-router-dom";
|
||||
import PageWrapper from "../components/PageWrapper";
|
||||
import appRoutes from "./appRoutes";
|
||||
|
||||
const generateRoute = (routes) => {
|
||||
return routes.map((route, index) => (
|
||||
route.index ? (
|
||||
<Route
|
||||
index
|
||||
path={route.path}
|
||||
element={<PageWrapper state={route.state}>
|
||||
{route.element}
|
||||
</PageWrapper>}
|
||||
key={index}
|
||||
/>
|
||||
) : (
|
||||
<Route
|
||||
path={route.path}
|
||||
element={
|
||||
<PageWrapper state={route.child ? undefined : route.state}>
|
||||
{route.element}
|
||||
</PageWrapper>
|
||||
}
|
||||
key={index}
|
||||
>
|
||||
{route.child && (
|
||||
generateRoute(route.child)
|
||||
)}
|
||||
</Route>
|
||||
)
|
||||
));
|
||||
};
|
||||
|
||||
export const routes = generateRoute(appRoutes);
|
||||
@@ -3,4 +3,3 @@
|
||||
// expect(element).toHaveTextContent(/react/i)
|
||||
// learn more: https://github.com/testing-library/jest-dom
|
||||
import '@testing-library/jest-dom';
|
||||
// import '@testing-library/jest-dom/extend-expect';
|
||||
@@ -1,21 +0,0 @@
|
||||
import { createSlice, PayloadAction } from "@reduxjs/toolkit";
|
||||
|
||||
const initialState = {
|
||||
appState: ""
|
||||
};
|
||||
|
||||
export const appStateSlice = createSlice({
|
||||
name: "appState",
|
||||
initialState,
|
||||
reducers: {
|
||||
setAppState: (state, action) => {
|
||||
state.appState = action.payload;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
export const {
|
||||
setAppState
|
||||
} = appStateSlice.actions;
|
||||
|
||||
export default appStateSlice.reducer;
|
||||