From a1fa2c072720bbba186890d103e196ec63bc5a2f Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Wed, 12 Aug 2020 10:43:11 +0300 Subject: [PATCH] done vital sign --- assets/images/heartbeat.png | Bin 0 -> 1439 bytes ios/Runner.xcodeproj/project.pbxproj | 68 +++++ .../contents.xcworkspacedata | 3 + lib/config/config.dart | 4 + lib/config/localized_values.dart | 10 + lib/core/enum/patient_lookup.dart | 36 +++ .../vital_sign/vital_sign_req_model.dart | 69 +++++ .../vital_sign/vital_sign_res_model.dart | 259 ++++++++++++++++++ lib/core/service/medical/labs_service.dart | 6 - .../service/medical/radiology_service.dart | 12 - .../service/medical/vital_sign_service.dart | 26 ++ .../medical/vital_sign_view_model.dart | 23 ++ lib/locator.dart | 6 +- lib/pages/medical/medical_profile_page.dart | 20 +- .../vital_sign/vital_sign_details_screen.dart | 184 +++++++++++++ .../vital_sign_details_wideget.dart | 113 ++++++++ .../medical/vital_sign/vital_sign_item.dart | 81 ++++++ .../vital_sign_item_details_screen.dart | 162 +++++++++++ .../vital_sing_chart_and_detials.dart | 82 ++++++ lib/uitl/date_uitl.dart | 21 +- lib/uitl/translations_delegate_base.dart | 76 +++++ lib/widgets/charts/app_time_series_chart.dart | 2 +- .../data_display/list/flexible_container.dart | 6 +- .../others/app_expandable_notifier.dart | 2 +- 24 files changed, 1230 insertions(+), 41 deletions(-) create mode 100644 assets/images/heartbeat.png create mode 100644 lib/core/enum/patient_lookup.dart create mode 100644 lib/core/model/vital_sign/vital_sign_req_model.dart create mode 100644 lib/core/model/vital_sign/vital_sign_res_model.dart create mode 100644 lib/core/service/medical/vital_sign_service.dart create mode 100644 lib/core/viewModels/medical/vital_sign_view_model.dart create mode 100644 lib/pages/medical/vital_sign/vital_sign_details_screen.dart create mode 100644 lib/pages/medical/vital_sign/vital_sign_details_wideget.dart create mode 100644 lib/pages/medical/vital_sign/vital_sign_item.dart create mode 100644 lib/pages/medical/vital_sign/vital_sign_item_details_screen.dart create mode 100644 lib/pages/medical/vital_sign/vital_sing_chart_and_detials.dart diff --git a/assets/images/heartbeat.png b/assets/images/heartbeat.png new file mode 100644 index 0000000000000000000000000000000000000000..3a83ddee293cb307b9c42cf361dbf3ffa105dcaf GIT binary patch literal 1439 zcmV;Q1z`G#P)Jw1Xci%3hF~3?>6oK_05k( z8VS4oQE4ZTt!C{~D3S}N#iVz(dA;4Nj{&}-!Al1a@~PV&R@2fcxvr60=g|kAY&Gj0 zA*;DyR>%s_AJl5pCimh0+#8IFy8zU0+l|@{MaI4Uu#?=o1X7bcu=ZN4efitRzZUtI z^)QzvHXr58G~D%qdPW?2b1^sOAX!XHAY(70)Ex{9S%H1;?_4w>=iR|D^0rq%x?DU> zevk&D)u^9|ut?&lHyDl6zE4|kH|imUm0o{zxE5r)S?4aHR)YXT%_9JnUVnIy1|n_U zhrHV#E*!YzNd-y6!)+~Nr5dk=_`rY@v2vL+)2ENg#iY$lAhUY%mpAp22*&wfy05@? zjl%Z6X)d;UGAqb-vvv;19Sx&AW;fG$?tC@j(?Yv$J>8Ryx-!E!t#Ev+(pF)ty#R13 zz`h>p8@RF#=Xj#;7zDRz{Oke8d5&tb!>m?!q=#*zC^gn<)*?{F2F45 zCi>1XrrI@@94_o~NnuE5qZ% zIuC-PXD0=xl|8fhzd?MVa3Yi&2;RGJ6XzsOjlo$g^W;{~6TzKEP4m!-EKy+$SoSES zv>Nq0fM*cds0kB6b2s}3KkNn8b^z|_A!@_WmMA8I;5mpRf+Z2Tu@>jr1xQqlfm1qK zY_Rew)hFaWAZ3YL2^aBqHxPN@Jo3Q1Qh*@Jn`tz&xod0XwaPf9GS!O$swjS?9l{!O zLW?6^cf}w)&Y9W46uJF{j7!*8ujvJy_Dtq7MeF3@<75~4tUDOJOs=*XwWLFPZ>w3_v6U)h`NdydYc z6}EcPAK+Vv4q2OIoD-{HNoSih$(NWWH|AmTa+yHthS*cesmnu>H|9MG`hzr2_4hhe6OXm1DC4ZF)P)Ck0C>;wX<50vo+b3_EItR9H!y5@RZr6M`R-8gZBS?VOVjxm->_MBTygXie{Y4?(z&UjH|c&ZA+i zpnNUhWiFVNl|ua=UW6PXU@=QdYyeT=M002ovPDHLkV1hh~vXcM+ literal 0 HcmV?d00001 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index b1c7ff05..09e6f207 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 01B727A4E8B2EFCAA6437F86 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1166D4F0F15F05B78C13BE93 /* Pods_Runner.framework */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; @@ -29,9 +30,11 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 1166D4F0F15F05B78C13BE93 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 4B7A8408EB9C8D43854CA413 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; @@ -42,6 +45,8 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + AF9A77F02311D014BC3BA0FF /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + C1E79435C712ACA543000177 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -49,12 +54,32 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 01B727A4E8B2EFCAA6437F86 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 1D566A6E3CFB74C45E7A265A /* Frameworks */ = { + isa = PBXGroup; + children = ( + 1166D4F0F15F05B78C13BE93 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 7B1804909A05D0DCEBE1A9EF /* Pods */ = { + isa = PBXGroup; + children = ( + C1E79435C712ACA543000177 /* Pods-Runner.debug.xcconfig */, + 4B7A8408EB9C8D43854CA413 /* Pods-Runner.release.xcconfig */, + AF9A77F02311D014BC3BA0FF /* Pods-Runner.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -72,6 +97,8 @@ 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, + 7B1804909A05D0DCEBE1A9EF /* Pods */, + 1D566A6E3CFB74C45E7A265A /* Frameworks */, ); sourceTree = ""; }; @@ -113,12 +140,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + 4F08ECBBB6A48E6DD9728611 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + A39BB3E0D2E2CC43B570CFCE /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -191,6 +220,28 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; + 4F08ECBBB6A48E6DD9728611 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -205,6 +256,23 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; + A39BB3E0D2E2CC43B570CFCE /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata index 1d526a16..21a3cc14 100644 --- a/ios/Runner.xcworkspace/contents.xcworkspacedata +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/lib/config/config.dart b/lib/config/config.dart index 100a493e..05469c27 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -37,6 +37,10 @@ const SEND_RAD_REPORT_EMAIL = '/Notifications.svc/REST/SendRadReportEmail'; const SEND_FEEDBACK = '/COCWS.svc/REST/InsertCOCItemInSPList'; const GET_STATUS_FOR_COCO = '/COCWS.svc/REST/GetStatusforCOC'; +///VITAL SIGN +const GET_PATIENT_VITAL_SIGN = '/Doctors.svc/REST/Doctor_GetPatientVitalSign'; + + //const BASE_URL = 'https://hmgwebservices.com/'; // Production Environment //const BASE_URL = 'https://uat.hmgwebservices.com/Services'; // UAT Environment diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 69356729..2ddac8c0 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -160,5 +160,15 @@ const Map> localizedValues = { "sent-requests": {"en": "Sent Requests", "ar": "الطلبات المرسلة"}, "recieved-requests": {"en": "Recieved Requests", "ar": "الطلبات المستلمة"}, "manage-files": {"en": "Manage Family Files", "ar": "إدارة ملفات العائلة"}, + 'oxygenation': {'en': 'Oxygenation', 'ar': 'الأوكسجين'}, + 'bodyMeasurements': {'en': 'Body Measurements', 'ar': 'قياسات الجسم'}, + 'temperature': {'en': 'Temperature', 'ar': 'درجة الحرارة'}, + 'pulse': {'en': 'Pulse', 'ar': 'النبض'}, + 'respiration': {'en': 'Respiration', 'ar': 'التنفس'}, + 'bloodPressure': {'en': 'Blood Pressure', 'ar': 'ضغط الدم'}, + 'painScale': {'en': 'Pain Scale', 'ar': 'مقياس الألم'}, + + + // "my-family": {"en": "MY FAMILY", "ar": "عائلتي"}, }; diff --git a/lib/core/enum/patient_lookup.dart b/lib/core/enum/patient_lookup.dart new file mode 100644 index 00000000..dc0da340 --- /dev/null +++ b/lib/core/enum/patient_lookup.dart @@ -0,0 +1,36 @@ +const PATIENT_TYPE = const [ + {"text": "outPatiant", "text_ar": "المريض الخارجي", "val": "0"}, + {"text": "InPatiant", "text_ar": "المريض المنوم", "val": "1"}, + {"text": "Discharge", "text_ar": "المريض المعافى", "val": "2"}, + {"text": "Referrd", "text_ar": "المريض المحول الي", "val": "3"}, + { + "text": "Referral Discharge", + "text_ar": "المريض المحال المعافى", + "val": "4" + }, + {"text": "Tomorrow Patient", "text_ar": "مريض الغد", "val": "5"}, + {"text": "Referral", "text_ar": "المريض المحول مني", "val": "6"}, +]; + +const LOCATIONS = const [ + { + "text": "In Saudi Arabia", + "text-ar": "داخل المملكة العربية السعودية", + "val": "1" + }, + { + "text": "Out Saudi Arabia", + "text-ar": "خارج المملكة العربية السعودية", + "val": "2" + }, +]; + +enum VitalSignDetails { + BodyMeasurements, + Temperature, + Pulse, + Prescriptions, + BloodPressure, + Oxygenation, + PainScale +} diff --git a/lib/core/model/vital_sign/vital_sign_req_model.dart b/lib/core/model/vital_sign/vital_sign_req_model.dart new file mode 100644 index 00000000..7cad3ef7 --- /dev/null +++ b/lib/core/model/vital_sign/vital_sign_req_model.dart @@ -0,0 +1,69 @@ +class VitalSignReqModel { + int patientID; + int projectID; + int patientTypeID; + int inOutpatientType; + int transNo; + int languageID; + String stamp ; + String iPAdress; + double versionID; + int channel; + String tokenID; + String sessionID; + bool isLoginForDoctorApp; + bool patientOutSA; + + VitalSignReqModel( + {this.patientID, + this.projectID, + this.inOutpatientType, + this.transNo, + this.languageID, + this.tokenID, + this.stamp = '2020-04-26T09:32:18.317Z', + this.iPAdress='11.11.11.11', + this.versionID=1.2, + this.channel=9, + this.sessionID='E2bsEeYEJo', + this.isLoginForDoctorApp=true, + this.patientTypeID, + this.patientOutSA=false}); + + VitalSignReqModel.fromJson(Map json) { + projectID = json['ProjectID']; + patientID = json['PatientID']; + languageID = json['LanguageID']; + inOutpatientType = json['InOutpatientType']; + transNo = json['TransNo']; + stamp = json['stamp']; + iPAdress = json['IPAdress']; + versionID = json['VersionID']; + channel = json['Channel']; + tokenID = json['TokenID']; + sessionID = json['SessionID']; + isLoginForDoctorApp = json['IsLoginForDoctorApp']; + patientOutSA = json['PatientOutSA']; + patientTypeID = json['PatientTypeID']; + } + + Map toJson() { + final Map data = new Map(); + data['ProjectID'] = this.projectID; + data['PatientID'] = this.patientID; + data['InOutPatientType'] = this.inOutpatientType; + data['TransNo'] = this.transNo; + data['LanguageID'] = this.languageID; + data['stamp'] = this.stamp; + data['IPAdress'] = this.iPAdress; + data['VersionID'] = this.versionID; + data['Channel'] = this.channel; + data['TokenID'] = this.tokenID; + data['SessionID'] = this.sessionID; + data['IsLoginForDoctorApp'] = this.isLoginForDoctorApp; + data['PatientOutSA'] = this.patientOutSA; + data['PatientTypeID'] = this.patientTypeID; + return data; + } + +} diff --git a/lib/core/model/vital_sign/vital_sign_res_model.dart b/lib/core/model/vital_sign/vital_sign_res_model.dart new file mode 100644 index 00000000..1377e626 --- /dev/null +++ b/lib/core/model/vital_sign/vital_sign_res_model.dart @@ -0,0 +1,259 @@ +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; + +class VitalSignResModel { + var transNo; + var projectID; + var weightKg; + var heightCm; + var temperatureCelcius; + var pulseBeatPerMinute; + var respirationBeatPerMinute; + var bloodPressureLower; + var bloodPressureHigher; + var sAO2; + var fIO2; + var painScore; + var bodyMassIndex; + var headCircumCm; + var leanBodyWeightLbs; + var idealBodyWeightLbs; + var temperatureCelciusMethod; + var pulseRhythm; + var respirationPattern; + var bloodPressureCuffLocation; + var bloodPressureCuffSize; + var bloodPressurePatientPosition; + var painLocation; + var painDuration; + var painCharacter; + var painFrequency; + bool isPainManagementDone; + var status; + bool isVitalsRequired; + var patientID; + var createdOn; + var doctorID; + var clinicID; + var triageCategory; + var gCScore; + var lineItemNo; + DateTime vitalSignDate; + var actualTimeTaken; + var sugarLevel; + var fBS; + var rBS; + var observationType; + var heartRate; + var muscleTone; + var reflexIrritability; + var bodyColor; + var isFirstAssessment; + var dateofBirth; + var timeOfBirth; + var bloodPressure; + var bloodPressureCuffLocationDesc; + var bloodPressureCuffSizeDesc; + var bloodPressurePatientPositionDesc; + var clinicName; + var doctorImageURL; + var doctorName; + var painScoreDesc; + var pulseRhythmDesc; + var respirationPatternDesc; + var temperatureCelciusMethodDesc; + var time; + + VitalSignResModel( + {this.transNo, + this.projectID, + this.weightKg, + this.heightCm, + this.temperatureCelcius, + this.pulseBeatPerMinute, + this.respirationBeatPerMinute, + this.bloodPressureLower, + this.bloodPressureHigher, + this.sAO2, + this.fIO2, + this.painScore, + this.bodyMassIndex, + this.headCircumCm, + this.leanBodyWeightLbs, + this.idealBodyWeightLbs, + this.temperatureCelciusMethod, + this.pulseRhythm, + this.respirationPattern, + this.bloodPressureCuffLocation, + this.bloodPressureCuffSize, + this.bloodPressurePatientPosition, + this.painLocation, + this.painDuration, + this.painCharacter, + this.painFrequency, + this.isPainManagementDone, + this.status, + this.isVitalsRequired, + this.patientID, + this.createdOn, + this.doctorID, + this.clinicID, + this.triageCategory, + this.gCScore, + this.lineItemNo, + this.vitalSignDate, + this.actualTimeTaken, + this.sugarLevel, + this.fBS, + this.rBS, + this.observationType, + this.heartRate, + this.muscleTone, + this.reflexIrritability, + this.bodyColor, + this.isFirstAssessment, + this.dateofBirth, + this.timeOfBirth, + this.bloodPressure, + this.bloodPressureCuffLocationDesc, + this.bloodPressureCuffSizeDesc, + this.bloodPressurePatientPositionDesc, + this.clinicName, + this.doctorImageURL, + this.doctorName, + this.painScoreDesc, + this.pulseRhythmDesc, + this.respirationPatternDesc, + this.temperatureCelciusMethodDesc, + this.time}); + + VitalSignResModel.fromJson(Map json) { + transNo = json['TransNo']; + projectID = json['ProjectID']; + weightKg = json['WeightKg']; + heightCm = json['HeightCm']; + temperatureCelcius = json['TemperatureCelcius']; + pulseBeatPerMinute = json['PulseBeatPerMinute']; + respirationBeatPerMinute = json['RespirationBeatPerMinute']; + bloodPressureLower = json['BloodPressureLower']; + bloodPressureHigher = json['BloodPressureHigher']; + sAO2 = json['SAO2']; + fIO2 = json['FIO2']; + painScore = json['PainScore']; + bodyMassIndex = json['BodyMassIndex']; + headCircumCm = json['HeadCircumCm']; + leanBodyWeightLbs = json['LeanBodyWeightLbs']; + idealBodyWeightLbs = json['IdealBodyWeightLbs']; + temperatureCelciusMethod = json['TemperatureCelciusMethod']; + pulseRhythm = json['PulseRhythm']; + respirationPattern = json['RespirationPattern']; + bloodPressureCuffLocation = json['BloodPressureCuffLocation']; + bloodPressureCuffSize = json['BloodPressureCuffSize']; + bloodPressurePatientPosition = json['BloodPressurePatientPosition']; + painLocation = json['PainLocation']; + painDuration = json['PainDuration']; + painCharacter = json['PainCharacter']; + painFrequency = json['PainFrequency']; + isPainManagementDone = json['IsPainManagementDone']; + status = json['Status']; + isVitalsRequired = json['IsVitalsRequired']; + patientID = json['PatientID']; + createdOn = json['CreatedOn']; + doctorID = json['DoctorID']; + clinicID = json['ClinicID']; + triageCategory = json['TriageCategory']; + gCScore = json['GCScore']; + lineItemNo = json['LineItemNo']; + vitalSignDate = DateUtil.convertStringToDate(json['CreatedOn']); + actualTimeTaken = json['ActualTimeTaken']; + sugarLevel = json['SugarLevel']; + fBS = json['FBS']; + rBS = json['RBS']; + observationType = json['ObservationType']; + heartRate = json['HeartRate']; + muscleTone = json['MuscleTone']; + reflexIrritability = json['ReflexIrritability']; + bodyColor = json['BodyColor']; + isFirstAssessment = json['IsFirstAssessment']; + dateofBirth = json['DateofBirth']; + timeOfBirth = json['TimeOfBirth']; + bloodPressure = json['BloodPressure']; + bloodPressureCuffLocationDesc = json['BloodPressureCuffLocationDesc']; + bloodPressureCuffSizeDesc = json['BloodPressureCuffSizeDesc']; + bloodPressurePatientPositionDesc = json['BloodPressurePatientPositionDesc']; + clinicName = json['ClinicName']; + doctorImageURL = json['DoctorImageURL']; + doctorName = json['DoctorName']; + painScoreDesc = json['PainScoreDesc']; + pulseRhythmDesc = json['PulseRhythmDesc']; + respirationPatternDesc = json['RespirationPatternDesc']; + temperatureCelciusMethodDesc = json['TemperatureCelciusMethodDesc']; + time = json['Time']; + } + + Map toJson() { + final Map data = new Map(); + data['TransNo'] = this.transNo; + data['ProjectID'] = this.projectID; + data['WeightKg'] = this.weightKg; + data['HeightCm'] = this.heightCm; + data['TemperatureCelcius'] = this.temperatureCelcius; + data['PulseBeatPerMinute'] = this.pulseBeatPerMinute; + data['RespirationBeatPerMinute'] = this.respirationBeatPerMinute; + data['BloodPressureLower'] = this.bloodPressureLower; + data['BloodPressureHigher'] = this.bloodPressureHigher; + data['SAO2'] = this.sAO2; + data['FIO2'] = this.fIO2; + data['PainScore'] = this.painScore; + data['BodyMassIndex'] = this.bodyMassIndex; + data['HeadCircumCm'] = this.headCircumCm; + data['LeanBodyWeightLbs'] = this.leanBodyWeightLbs; + data['IdealBodyWeightLbs'] = this.idealBodyWeightLbs; + data['TemperatureCelciusMethod'] = this.temperatureCelciusMethod; + data['PulseRhythm'] = this.pulseRhythm; + data['RespirationPattern'] = this.respirationPattern; + data['BloodPressureCuffLocation'] = this.bloodPressureCuffLocation; + data['BloodPressureCuffSize'] = this.bloodPressureCuffSize; + data['BloodPressurePatientPosition'] = this.bloodPressurePatientPosition; + data['PainLocation'] = this.painLocation; + data['PainDuration'] = this.painDuration; + data['PainCharacter'] = this.painCharacter; + data['PainFrequency'] = this.painFrequency; + data['IsPainManagementDone'] = this.isPainManagementDone; + data['Status'] = this.status; + data['IsVitalsRequired'] = this.isVitalsRequired; + data['PatientID'] = this.patientID; + data['CreatedOn'] = this.createdOn; + data['DoctorID'] = this.doctorID; + data['ClinicID'] = this.clinicID; + data['TriageCategory'] = this.triageCategory; + data['GCScore'] = this.gCScore; + data['LineItemNo'] = this.lineItemNo; + data['VitalSignDate'] = this.vitalSignDate; + data['ActualTimeTaken'] = this.actualTimeTaken; + data['SugarLevel'] = this.sugarLevel; + data['FBS'] = this.fBS; + data['RBS'] = this.rBS; + data['ObservationType'] = this.observationType; + data['HeartRate'] = this.heartRate; + data['MuscleTone'] = this.muscleTone; + data['ReflexIrritability'] = this.reflexIrritability; + data['BodyColor'] = this.bodyColor; + data['IsFirstAssessment'] = this.isFirstAssessment; + data['DateofBirth'] = this.dateofBirth; + data['TimeOfBirth'] = this.timeOfBirth; + data['BloodPressure'] = this.bloodPressure; + data['BloodPressureCuffLocationDesc'] = this.bloodPressureCuffLocationDesc; + data['BloodPressureCuffSizeDesc'] = this.bloodPressureCuffSizeDesc; + data['BloodPressurePatientPositionDesc'] = + this.bloodPressurePatientPositionDesc; + data['ClinicName'] = this.clinicName; + data['DoctorImageURL'] = this.doctorImageURL; + data['DoctorName'] = this.doctorName; + data['PainScoreDesc'] = this.painScoreDesc; + data['PulseRhythmDesc'] = this.pulseRhythmDesc; + data['RespirationPatternDesc'] = this.respirationPatternDesc; + data['TemperatureCelciusMethodDesc'] = this.temperatureCelciusMethodDesc; + data['Time'] = this.time; + return data; + } +} diff --git a/lib/core/service/medical/labs_service.dart b/lib/core/service/medical/labs_service.dart index cad5696a..b1a57c89 100644 --- a/lib/core/service/medical/labs_service.dart +++ b/lib/core/service/medical/labs_service.dart @@ -1,10 +1,4 @@ import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/core/model/doctor/doctor_profile.dart'; -import 'package:diplomaticquarterapp/core/model/doctor/doctor_rating.dart'; -import 'package:diplomaticquarterapp/core/model/doctor/patient_doctor_appointment.dart'; -import 'package:diplomaticquarterapp/core/model/doctor/reques_patient_doctor_appointmentt.dart'; -import 'package:diplomaticquarterapp/core/model/doctor/request_doctor_profile.dart'; -import 'package:diplomaticquarterapp/core/model/doctor/request_doctor_rating.dart'; import 'package:diplomaticquarterapp/core/model/labs/patient_lab_orders.dart'; import 'package:diplomaticquarterapp/core/model/labs/patient_lab_special_result.dart'; import 'package:diplomaticquarterapp/core/model/labs/request_patient_lab_orders.dart'; diff --git a/lib/core/service/medical/radiology_service.dart b/lib/core/service/medical/radiology_service.dart index e14206d5..3c22eab7 100644 --- a/lib/core/service/medical/radiology_service.dart +++ b/lib/core/service/medical/radiology_service.dart @@ -1,19 +1,7 @@ import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/core/model/doctor/doctor_profile.dart'; -import 'package:diplomaticquarterapp/core/model/doctor/doctor_rating.dart'; -import 'package:diplomaticquarterapp/core/model/doctor/patient_doctor_appointment.dart'; -import 'package:diplomaticquarterapp/core/model/doctor/reques_patient_doctor_appointmentt.dart'; -import 'package:diplomaticquarterapp/core/model/doctor/request_doctor_profile.dart'; -import 'package:diplomaticquarterapp/core/model/doctor/request_doctor_rating.dart'; -import 'package:diplomaticquarterapp/core/model/labs/patient_lab_orders.dart'; -import 'package:diplomaticquarterapp/core/model/labs/patient_lab_special_result.dart'; -import 'package:diplomaticquarterapp/core/model/labs/request_patient_lab_orders.dart'; -import 'package:diplomaticquarterapp/core/model/labs/request_patient_lab_special_result.dart'; -import 'package:diplomaticquarterapp/core/model/labs/request_send_lab_report_email.dart'; import 'package:diplomaticquarterapp/core/model/radiology/final_radiology.dart'; import 'package:diplomaticquarterapp/core/model/radiology/request_send_rad_report_email.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart'; -import 'package:diplomaticquarterapp/uitl/app_toast.dart'; class RadiologyService extends BaseService { List finalRadiologyList = List(); diff --git a/lib/core/service/medical/vital_sign_service.dart b/lib/core/service/medical/vital_sign_service.dart new file mode 100644 index 00000000..813332cc --- /dev/null +++ b/lib/core/service/medical/vital_sign_service.dart @@ -0,0 +1,26 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/vital_sign/vital_sign_res_model.dart'; + +import '../base_service.dart'; + +class VitalSignService extends BaseService { + + List vitalSignResModelList = List(); + + Future getPatientRadOrders () async { + hasError = false; + await baseAppClient.post(GET_PATIENT_VITAL_SIGN, + onSuccess: (dynamic response, int statusCode) { + vitalSignResModelList.clear(); + response['List_DoctorPatientVitalSign'].forEach((vital) { + vitalSignResModelList.add(VitalSignResModel.fromJson(vital)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: Map()); + } + + + +} diff --git a/lib/core/viewModels/medical/vital_sign_view_model.dart b/lib/core/viewModels/medical/vital_sign_view_model.dart new file mode 100644 index 00000000..5a2d8514 --- /dev/null +++ b/lib/core/viewModels/medical/vital_sign_view_model.dart @@ -0,0 +1,23 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/vital_sign/vital_sign_res_model.dart'; +import 'package:diplomaticquarterapp/core/service/medical/vital_sign_service.dart'; +import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; + +import '../../../locator.dart'; + +class VitalSignViewModel extends BaseViewModel { + VitalSignService _vitalSignService = locator(); + + List get vitalSignResModelList => _vitalSignService.vitalSignResModelList; + + + getPatientRadOrders() async { + setState(ViewState.Busy); + await _vitalSignService.getPatientRadOrders(); + if (_vitalSignService.hasError) { + error = _vitalSignService.error; + setState(ViewState.Error); + } else + setState(ViewState.Idle); + } +} diff --git a/lib/locator.dart b/lib/locator.dart index 5806ca70..f884edcb 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -7,12 +7,14 @@ import 'core/service/medical/labs_service.dart'; import 'core/service/medical/my_doctor_service.dart'; import 'core/service/medical/prescriptions_service.dart'; import 'core/service/medical/radiology_service.dart'; +import 'core/service/medical/vital_sign_service.dart'; import 'core/viewModels/feedback/feedback_view_model.dart'; import 'core/viewModels/hospital_view_model.dart'; import 'core/viewModels/medical/labs_view_model.dart'; import 'core/viewModels/medical/my_doctor_view_model.dart'; import 'core/viewModels/medical/prescriptions_view_model.dart'; import 'core/viewModels/medical/radiology_view_model.dart'; +import 'core/viewModels/medical/vital_sign_view_model.dart'; import 'core/viewModels/pharmacies_view_model.dart'; import 'core/service/pharmacies_service.dart'; import 'core/service/insurance_service.dart'; @@ -31,6 +33,8 @@ void setupLocator() { locator.registerLazySingleton(() => RadiologyService()); locator.registerLazySingleton(() => FeedbackService()); locator.registerLazySingleton(() => InsuranceCardService()); + locator.registerLazySingleton(() => VitalSignService()); + /// View Model locator.registerFactory(() => HospitalViewModel()); @@ -40,6 +44,6 @@ void setupLocator() { locator.registerFactory(() => LabsViewModel()); locator.registerFactory(() => RadiologyViewModel()); locator.registerFactory(() => FeedbackViewModel()); - + locator.registerFactory(() => VitalSignViewModel()); locator.registerFactory(() => InsuranceViewModel()); } diff --git a/lib/pages/medical/medical_profile_page.dart b/lib/pages/medical/medical_profile_page.dart index 53c09727..e1eee935 100644 --- a/lib/pages/medical/medical_profile_page.dart +++ b/lib/pages/medical/medical_profile_page.dart @@ -2,6 +2,7 @@ import 'dart:math'; import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescriptions_home_page.dart'; import 'package:diplomaticquarterapp/pages/medical/radiology/radiology_home_page.dart'; +import 'package:diplomaticquarterapp/pages/medical/vital_sign/vital_sign_details_screen.dart'; import 'package:diplomaticquarterapp/widgets/data_display/medical/medical_profile_item.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/others/sliver_app_bar_delegate.dart'; @@ -148,10 +149,14 @@ class _MedicalProfilePageState extends State { ), Expanded( flex: 1, - child: MedicalProfileItem( - title: 'Vital Signs', - imagePath: 'medical_history_icon.png', - subTitle: 'Reports', + child: InkWell( + onTap: () => Navigator.push(context, + FadePage(page: VitalSignDetailsScreen())), + child: MedicalProfileItem( + title: 'Vital Signs', + imagePath: 'medical_history_icon.png', + subTitle: 'Reports', + ), ), ), ]), @@ -170,12 +175,11 @@ class _MedicalProfilePageState extends State { subTitle: 'Card', ), ), - ), Expanded( + ), + Expanded( flex: 1, child: InkWell( - onTap: () { - - }, + onTap: () {}, child: MedicalProfileItem( title: 'new', imagePath: 'insurance_card_icon.png', diff --git a/lib/pages/medical/vital_sign/vital_sign_details_screen.dart b/lib/pages/medical/vital_sign/vital_sign_details_screen.dart new file mode 100644 index 00000000..9a999c58 --- /dev/null +++ b/lib/pages/medical/vital_sign/vital_sign_details_screen.dart @@ -0,0 +1,184 @@ +import 'package:diplomaticquarterapp/core/enum/patient_lookup.dart'; +import 'package:diplomaticquarterapp/core/viewModels/medical/vital_sign_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/pages/medical/vital_sign/vital_sign_item.dart'; +import 'package:diplomaticquarterapp/pages/medical/vital_sign/vital_sign_item_details_screen.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; +import 'package:flutter/material.dart'; + +class VitalSignDetailsScreen extends StatelessWidget { + static const String url = "assets/images/"; + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.getPatientRadOrders(), + builder: (_, mode, widget) => AppScaffold( + isShowAppBar: true, + appBarTitle: 'Vital Sign', + baseViewModel: mode, + body: mode.vitalSignResModelList.length> 0? Container( + child: Column( + children: [ + Row( + children: [ + InkWell( + onTap: () => Navigator.push( + context, + FadePage( + page: VitalSignItemDetailsScreen( + pageKey: VitalSignDetails.BloodPressure, + pageTitle: 'bodyMeasurements', + vitalList: mode.vitalSignResModelList, + ), + ), + ), + child: Container( + child: VitalSignItem( + des: TranslationBase.of(context).bodyMeasurements, + url: url + 'heartbeat.png', + lastVal: + mode.vitalSignResModelList[1].heightCm.toString(), + unit: ' Cm', + ), + ), + ), + InkWell( + onTap: () => Navigator.push( + context, + FadePage( + page: VitalSignItemDetailsScreen( + pageKey: VitalSignDetails.Temperature, + pageTitle: 'Temperature', + vitalList: mode.vitalSignResModelList, + ), + ), + ), + child: Container( + child: VitalSignItem( + des: TranslationBase.of(context).temperature, + url: url + 'heartbeat.png', + lastVal: mode + .vitalSignResModelList[1].temperatureCelcius + .toString(), + unit: 'C', + ), + ), + ), + ], + ), + Row( + children: [ + InkWell( + onTap: () => Navigator.push( + context, + FadePage( + page: VitalSignItemDetailsScreen( + pageKey: VitalSignDetails.Pulse, + pageTitle: 'Pulse', + vitalList: mode.vitalSignResModelList, + ), + ), + ), + child: VitalSignItem( + des: TranslationBase.of(context).pulse, + url: url + 'heartbeat.png', + lastVal: mode.vitalSignResModelList[1].pulseBeatPerMinute + .toString(), + unit: 'M', + ), + ), + InkWell( + onTap: () => Navigator.push( + context, + FadePage( + page: VitalSignItemDetailsScreen( + pageKey: VitalSignDetails.Prescriptions, + pageTitle: 'Prescriptions', + vitalList: mode.vitalSignResModelList, + ), + ), + ), + child: VitalSignItem( + des: TranslationBase.of(context).respiration, + url: url + 'heartbeat.png', + lastVal: mode + .vitalSignResModelList[1].respirationBeatPerMinute + .toString(), + unit: 'M', + ), + ), + ], + ), + Row( + children: [ + InkWell( + onTap: () => Navigator.push( + context, + FadePage( + page: VitalSignItemDetailsScreen( + pageKey: VitalSignDetails.BloodPressure, + pageTitle: 'BloodPressure', + vitalList: mode.vitalSignResModelList, + ), + ), + ), + child: VitalSignItem( + des: TranslationBase.of(context).bloodPressure, + url: url + 'heartbeat.png', + lastVal: mode.vitalSignResModelList[1].bloodPressure + .toString(), + unit: '', + ), + ), + InkWell( + onTap: () => Navigator.push( + context, + FadePage( + page: VitalSignItemDetailsScreen( + pageKey: VitalSignDetails.Oxygenation, + pageTitle: 'Oxygenation', + vitalList: mode.vitalSignResModelList, + ), + ), + ), + child: VitalSignItem( + des: TranslationBase.of(context).oxygenation, + url: url + 'heartbeat.png', + lastVal: mode.vitalSignResModelList[1].fIO2.toString(), + unit: '', + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + InkWell( + onTap: () => Navigator.push( + context, + FadePage( + page: VitalSignItemDetailsScreen( + pageKey: VitalSignDetails.PainScale, + pageTitle: 'PainScale', + vitalList: mode.vitalSignResModelList, + ), + ), + ), + child: VitalSignItem( + des: TranslationBase.of(context).painScale, + url: url + 'heartbeat.png', + ), + ), + ], + ), + ], + ), + ) : Center(child: Texts('No Data'),), + ), + ); + } +} diff --git a/lib/pages/medical/vital_sign/vital_sign_details_wideget.dart b/lib/pages/medical/vital_sign/vital_sign_details_wideget.dart new file mode 100644 index 00000000..ad5c6ffb --- /dev/null +++ b/lib/pages/medical/vital_sign/vital_sign_details_wideget.dart @@ -0,0 +1,113 @@ +import 'package:diplomaticquarterapp/core/model/vital_sign/vital_sign_res_model.dart'; +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:hexcolor/hexcolor.dart'; + +class VitalSignDetailsWidget extends StatefulWidget { + final List vitalList; + final String title1; + final String title2; + final String viewKey; + + VitalSignDetailsWidget( + {Key key, this.vitalList, this.title1, this.title2, this.viewKey}); + + @override + _VitalSignDetailsWidgetState createState() => _VitalSignDetailsWidgetState(); +} + +class _VitalSignDetailsWidgetState extends State { + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + color: Colors.transparent, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(10.0), topRight: Radius.circular(10.0)), + border: Border.all(color: Colors.grey, width: 1), + ), + margin: EdgeInsets.all(20), + child: Container( + color: Colors.transparent, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Table( + border: TableBorder.symmetric( + inside: BorderSide(width: 2.0, color: Colors.grey[300]), + ), + children: fullData(), + ), + ], + ), + ), + ); + } + + List fullData() { + List tableRow = []; + tableRow.add(TableRow(children: [ + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(10.0), + ), + ), + child: Center( + child: Texts( + widget.title1, + color: Colors.white, + ), + ), + height: 60, + ), + ), + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + borderRadius: BorderRadius.only( + topRight: Radius.circular(10.0), + ), + ), + child: Center( + child: Texts(widget.title2, color: Colors.white), + ), + height: 60), + ) + ])); + widget.vitalList.forEach((vital) { + tableRow.add(TableRow(children: [ + Container( + child: Container( + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Texts( + '${DateUtil.getWeekDay(vital.vitalSignDate.weekday)}, ${vital.vitalSignDate.day} ${DateUtil.getMonth(vital.vitalSignDate.month)}, ${vital.vitalSignDate.year} ', + textAlign: TextAlign.center, + ), + ), + ), + ), + Container( + child: Container( + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Texts( + '${vital.toJson()[widget.viewKey]}', + textAlign: TextAlign.center, + ), + ), + ), + ), + ])); + }); + return tableRow; + } +} diff --git a/lib/pages/medical/vital_sign/vital_sign_item.dart b/lib/pages/medical/vital_sign/vital_sign_item.dart new file mode 100644 index 00000000..bf76bbfa --- /dev/null +++ b/lib/pages/medical/vital_sign/vital_sign_item.dart @@ -0,0 +1,81 @@ +import 'package:diplomaticquarterapp/config/size_config.dart'; +import 'package:diplomaticquarterapp/widgets/card/rounded_container.dart'; +import 'package:flutter/material.dart'; +import 'package:hexcolor/hexcolor.dart'; + + +class VitalSignItem extends StatelessWidget { + const VitalSignItem( + {Key key, + @required this.url, + @required this.des, + this.lastVal = 'N/A', + this.unit = '', + this.height, + this.width}) + : super(key: key); + + final String url; + final String des; + final String lastVal; + final String unit; + + final double height; + final double width; + + @override + Widget build(BuildContext context) { + return RoundedContainer( + margin: 0.025 * SizeConfig.realScreenWidth, + height: 0.14 * SizeConfig.realScreenHeight, + width: 0.45 * SizeConfig.realScreenWidth, + child: Container( + padding: EdgeInsets.all(5), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: 2, + child: Text( + des, + style: TextStyle( + fontSize: 1.7 * SizeConfig.textMultiplier, + color: Hexcolor('#B8382C'), + fontWeight: FontWeight.bold), + ), + ), + Expanded( + flex: 1, + child: Column( + children: [ + Expanded( + child: Image.asset( + url, + height: SizeConfig.heightMultiplier * 7, + ), + ), + Expanded( + child: RichText( + text: TextSpan( + style: TextStyle(color: Colors.black), + children: [ + new TextSpan(text: lastVal), + new TextSpan( + text: unit, + style: TextStyle( + color: Hexcolor('#B8382C'), + ), + ), + ], + ), + )) + ], + ), + ) + ], + ), + ), + ); + } +} diff --git a/lib/pages/medical/vital_sign/vital_sign_item_details_screen.dart b/lib/pages/medical/vital_sign/vital_sign_item_details_screen.dart new file mode 100644 index 00000000..1968fb34 --- /dev/null +++ b/lib/pages/medical/vital_sign/vital_sign_item_details_screen.dart @@ -0,0 +1,162 @@ +import 'package:diplomaticquarterapp/core/enum/patient_lookup.dart'; +import 'package:diplomaticquarterapp/core/model/vital_sign/vital_sign_res_model.dart'; +import 'package:diplomaticquarterapp/pages/medical/vital_sign/vital_sing_chart_and_detials.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; + +class VitalSignItemDetailsScreen extends StatelessWidget { + final VitalSignDetails pageKey; + final String pageTitle; + List VSchart; + + VitalSignItemDetailsScreen({this.vitalList, this.pageKey, this.pageTitle}); + + final List vitalList; + + @override + Widget build(BuildContext context) { + switch (pageKey) { + case VitalSignDetails.BodyMeasurements: + VSchart = [ + { + 'name': 'Height', + 'title1': 'Date', + 'title2': 'Cm', + 'viewKey': 'HeightCm', + }, + { + 'name': 'Weight Kg', + 'title1': 'Date', + 'title2': 'Kg', + 'viewKey': 'WeightKg', + }, + { + 'name': 'BodyMassIndex', + 'title1': 'Date', + 'title2': 'BodyMass', + 'viewKey': 'BodyMassIndex', + }, + { + 'name': 'HeadCircumCm', + 'title1': 'Date', + 'title2': 'Cm', + 'viewKey': 'HeadCircumCm', + }, + { + 'name': 'Ideal Body Weight (Lbs)', + 'title1': 'Date', + 'title2': 'Ideal Weight', + 'viewKey': 'IdealBodyWeightLbs', + }, + { + 'name': 'LeanBodyWeightLbs (Lbs)', + 'title1': 'Date', + 'title2': 'Lean Weight', + 'viewKey': 'LeanBodyWeightLbs', + } + ]; + + break; + + case VitalSignDetails.Temperature: + VSchart = [ + { + 'name': 'Temperature In Celcius', + 'title1': 'Date', + 'title2': 'C', + 'viewKey': 'TemperatureCelcius', + }, + ]; + + break; + case VitalSignDetails.Pulse: + VSchart = [ + { + 'name': 'Pulse Beat Per Minute', + 'title1': 'Date', + 'title2': 'Minute', + 'viewKey': 'PulseBeatPerMinute', + }, + ]; + + break; + case VitalSignDetails.Prescriptions: + VSchart = [ + { + 'name': 'Respiration Beat Per Minute', + 'title1': 'Date', + 'title2': 'Beat Per Minute', + 'viewKey': 'RespirationBeatPerMinute', + }, + ]; + + break; + case VitalSignDetails.BloodPressure: + VSchart = [ + { + 'name': 'Blood Pressure Higher', + 'title1': 'Date', + 'title2': 'Minute', + 'viewKey': 'BloodPressureHigher', + }, + { + 'name': 'Blood Pressure Lower', + 'title1': 'Date', + 'title2': 'Minute', + 'viewKey': 'BloodPressureLower', + } + ]; + + break; + case VitalSignDetails.Oxygenation: + VSchart = [ + { + 'name': 'FIO2', + 'title1': 'Date', + 'title2': 'Cm', + 'viewKey': 'FIO2', + }, + { + 'name': 'SAO2', + 'title1': 'Date', + 'title2': 'Cm', + 'viewKey': 'SAO2', + }, + ]; + + break; + case VitalSignDetails.PainScale: + VSchart = [ + { + 'name': 'PainScore', + 'title1': 'Date', + 'title2': 'Cm', + 'viewKey': 'PainScore', + }, + ]; + + break; + + default: + } + return AppScaffold( + appBarTitle: pageTitle, + isShowAppBar: true, + body: ListView( + children: VSchart.map((chartInfo) { + var vitalListTemp = vitalList.where( + (element) => element.toJson()[chartInfo['viewKey']] != null, + ); + return vitalListTemp.length != 0 + ? VitalSingChartAndDetials( + vitalList: vitalList, + name: chartInfo['name'], + title1: chartInfo['title1'], + title2: chartInfo['title2'], + viewKey: chartInfo['viewKey']) + : Container(); + }).toList(), + ), + ); + } +} diff --git a/lib/pages/medical/vital_sign/vital_sing_chart_and_detials.dart b/lib/pages/medical/vital_sign/vital_sing_chart_and_detials.dart new file mode 100644 index 00000000..9d395c15 --- /dev/null +++ b/lib/pages/medical/vital_sign/vital_sing_chart_and_detials.dart @@ -0,0 +1,82 @@ +import 'package:diplomaticquarterapp/core/model/vital_sign/vital_sign_res_model.dart'; +import 'package:diplomaticquarterapp/pages/medical/vital_sign/vital_sign_details_wideget.dart'; +import 'package:diplomaticquarterapp/widgets/charts/app_time_series_chart.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.dart'; +import 'package:flutter/material.dart'; + +import 'package:charts_flutter/flutter.dart' as charts; + +class VitalSingChartAndDetials extends StatelessWidget { + VitalSingChartAndDetials({ + Key key, + @required this.vitalList, + @required this.name, + @required this.viewKey, + @required this.title1, + @required this.title2, + }) : super(key: key); + + final List vitalList; + final String name; + final String viewKey; + final String title1; + final String title2; + List timeSeriesData = []; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + AppExpandableNotifier( + headerWidget: AppTimeSeriesChart( + seriesList: generateData(), + chartName: name, + startDate: DateTime( + vitalList[vitalList.length - 1] + .vitalSignDate + .year, + vitalList[vitalList.length - 1] + .vitalSignDate + .month + + 3, + vitalList[vitalList.length - 1] + .vitalSignDate + .day), + endDate: vitalList[0].vitalSignDate, + ), + bodyWidget: VitalSignDetailsWidget( + vitalList: vitalList.reversed.toList(), + title1: title1, + title2: title2, + viewKey: viewKey, + ), + ), + ], + ); + } + + generateData() { + if (vitalList.length > 0) { + vitalList.forEach( + (element) { + timeSeriesData.add( + TimeSeriesSales( + new DateTime(element.vitalSignDate.year, + element.vitalSignDate.month, element.vitalSignDate.day), + element.toJson()[viewKey].toInt(), + ), + ); + }, + ); + } + return [ + new charts.Series( + id: 'Sales', + colorFn: (_, __) => charts.MaterialPalette.red.shadeDefault, + domainFn: (TimeSeriesSales sales, _) => sales.time, + measureFn: (TimeSeriesSales sales, _) => sales.sales, + data: timeSeriesData, + ) + ]; + } +} diff --git a/lib/uitl/date_uitl.dart b/lib/uitl/date_uitl.dart index 950cb25c..38f79596 100644 --- a/lib/uitl/date_uitl.dart +++ b/lib/uitl/date_uitl.dart @@ -3,15 +3,18 @@ class DateUtil { /// convert String To Date function /// [date] String we want to convert static DateTime convertStringToDate(String date) { - const start = "/Date("; - const end = "+0300)"; - final startIndex = date.indexOf(start); - final endIndex = date.indexOf(end, startIndex + start.length); - return DateTime.fromMillisecondsSinceEpoch( - int.parse( - date.substring(startIndex + start.length, endIndex), - ), - ); + if(date!=null) { + const start = "/Date("; + const end = "+0300)"; + final startIndex = date.indexOf(start); + final endIndex = date.indexOf(end, startIndex + start.length); + return DateTime.fromMillisecondsSinceEpoch( + int.parse( + date.substring(startIndex + start.length, endIndex), + ), + ); + }else + return DateTime.now(); } /// check Date diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 71d1699f..a7c07d32 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -103,97 +103,173 @@ class TranslationBase { String get appoActions => localizedValues['appoActions'][locale.languageCode]; String get appointment => localizedValues['appointment'][locale.languageCode]; + String get login => localizedValues['login'][locale.languageCode]; + String get loginregister => localizedValues['loginregister'][locale.languageCode]; + String get welcome => localizedValues['welcome'][locale.languageCode]; + String get welcomeText => localizedValues['welcome_text'][locale.languageCode]; + String get welcomeText2 => localizedValues['welcome_text2'][locale.languageCode]; + String get yes => localizedValues['yes'][locale.languageCode]; + String get no => localizedValues['no'][locale.languageCode]; + String get logintypeRadio => localizedValues['logintyperadio'][locale.languageCode]; + String get registerNow => localizedValues['registernow'][locale.languageCode]; + String get nationalID => localizedValues['nationalID'][locale.languageCode]; + String get fileNo => localizedValues['fileNo'][locale.languageCode]; + String get forgotPassword => localizedValues['forgotFileNo'][locale.languageCode]; + String get enterNationalId => localizedValues['enter-national-id'][locale.languageCode]; + String get profileInfo => localizedValues['profile-info'][locale.languageCode]; + String get submit => localizedValues['submit'][locale.languageCode]; + String get forgotDesc => localizedValues['forgot-desc'][locale.languageCode]; + String get dob => localizedValues['dob'][locale.languageCode]; + String get hijriDate => localizedValues['hijri-date'][locale.languageCode]; + String get gregorianDate => localizedValues['gregorian-date'][locale.languageCode]; + String get verifyLoginWith => localizedValues['verify-login-with'][locale.languageCode]; + String get register => localizedValues['register-user'][locale.languageCode]; + String get verifyFingerprint => localizedValues['verify-with-fingerprint'][locale.languageCode]; + String get verifyFaceID => localizedValues['verify-with-faceid'][locale.languageCode]; + String get verifySMS => localizedValues['verify-with-sms'][locale.languageCode]; + String get verifyWhatsApp => localizedValues['verify-with-whatsapp'][locale.languageCode]; + String get lastLoginAt => localizedValues['last-login'][locale.languageCode]; + String get lastLoginWith => localizedValues['last-login-with'][locale.languageCode]; + String get verifyFingerprint2 => localizedValues['verify-fingerprint'][locale.languageCode]; + String get searchMedicine => localizedValues['searchMedicine'][locale.languageCode]; + String get searchMedicineHere => localizedValues['searchMedicineHere'][locale.languageCode]; + String get pharmaciesList => localizedValues['pharmaciesList'][locale.languageCode]; + String get description => localizedValues['description'][locale.languageCode]; + String get price => localizedValues['price'][locale.languageCode]; + String get youCanFindItIn => localizedValues['youCanFindItIn'][locale.languageCode]; + String get pleaseEnterMedicineName => localizedValues['pleaseEnterMedicineName'][locale.languageCode]; + String get verificationMessage => localizedValues['verification_message'][locale.languageCode]; + String get validationMessage => localizedValues['validation_message'][locale.languageCode]; + String get arabicChange => localizedValues['arabic-change'][locale.languageCode]; + String get notification => localizedValues['notification'][locale.languageCode]; + String get appsetting => localizedValues['app-settings'][locale.languageCode]; + String get rateApp => localizedValues['rate-app'][locale.languageCode]; + String get moreVerification => localizedValues['more-verify'][locale.languageCode]; + String get welcomeBack => localizedValues['welcome-back'][locale.languageCode]; + String get accountInfo => localizedValues['account-info'][locale.languageCode]; + String get useAnotherAccount => localizedValues['another-acc'][locale.languageCode]; + String get next => localizedValues['next'][locale.languageCode]; + String get firstName => localizedValues['first-name'][locale.languageCode]; + String get middleName => localizedValues['middle-name'][locale.languageCode]; + String get lastName => localizedValues['last-name'][locale.languageCode]; + String get male => localizedValues['male'][locale.languageCode]; + String get female => localizedValues['female'][locale.languageCode]; + String get prefferedLanguage => localizedValues['preferred-language'][locale.languageCode]; + String get english => localizedValues['english'][locale.languageCode]; + String get arabic => localizedValues['arabic'][locale.languageCode]; + String get registrLocation => localizedValues['locations-register'][locale.languageCode]; + String get ksa => localizedValues['ksa'][locale.languageCode]; + String get dubai => localizedValues['dubai'][locale.languageCode]; + String get enterEmail => localizedValues['enter-email'][locale.languageCode]; + String get family => localizedValues['family'][locale.languageCode]; + String get myFamilyFiles => localizedValues['family-title'][locale.languageCode]; + + String get oxygenation => localizedValues['oxygenation'][locale.languageCode]; + + String get bodyMeasurements => + localizedValues['bodyMeasurements'][locale.languageCode]; + + String get temperature => localizedValues['temperature'][locale.languageCode]; + + String get pulse => localizedValues['pulse'][locale.languageCode]; + + String get respiration => localizedValues['respiration'][locale.languageCode]; + + String get bloodPressure => + localizedValues['bloodPressure'][locale.languageCode]; + String get painScale => localizedValues['painScale'][locale.languageCode]; + } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/widgets/charts/app_time_series_chart.dart b/lib/widgets/charts/app_time_series_chart.dart index 413b03d9..857a7620 100644 --- a/lib/widgets/charts/app_time_series_chart.dart +++ b/lib/widgets/charts/app_time_series_chart.dart @@ -42,7 +42,7 @@ class AppTimeSeriesChart extends StatelessWidget { charts.RangeAnnotation( [ charts.RangeAnnotationSegment(startDate, endDate, - charts.RangeAnnotationAxisType.domain), + charts.RangeAnnotationAxisType.domain ), ], ), ], diff --git a/lib/widgets/data_display/list/flexible_container.dart b/lib/widgets/data_display/list/flexible_container.dart index 4bd0d03d..a35fa279 100644 --- a/lib/widgets/data_display/list/flexible_container.dart +++ b/lib/widgets/data_display/list/flexible_container.dart @@ -27,9 +27,9 @@ class FlexibleContainer extends StatelessWidget { @override Widget build(BuildContext context) { - return FractionallySizedBox( - widthFactor: widthFactor, - heightFactor: heightFactor, + return Container( +// widthFactor: widthFactor, +// heightFactor: heightFactor, child: ClipRRect( borderRadius: BorderRadius.circular(8.0), child: Material( diff --git a/lib/widgets/others/app_expandable_notifier.dart b/lib/widgets/others/app_expandable_notifier.dart index d582b77b..353846e1 100644 --- a/lib/widgets/others/app_expandable_notifier.dart +++ b/lib/widgets/others/app_expandable_notifier.dart @@ -38,7 +38,7 @@ class AppExpandableNotifier extends StatelessWidget { header: Padding( padding: EdgeInsets.all(10), child: Text( - title?? '', + title?? 'Details', style: TextStyle(fontWeight: FontWeight.bold,fontSize: 22,), ), ),