Merge branch 'development' of https://gitlab.com/Cloud_Solution/doctor_app_flutter into login_new

merge-requests/193/head
Elham Rababah 4 years ago
commit 7001940d0d

@ -3,11 +3,9 @@ import 'dart:convert';
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/config/shared_pref_kay.dart';
import 'package:doctor_app_flutter/models/doctor/doctor_profile_model.dart';
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
import 'package:doctor_app_flutter/util/dr_app_shared_pref.dart';
import 'package:doctor_app_flutter/util/helpers.dart';
import 'package:http/http.dart' as http;
import 'package:provider/provider.dart';
DrAppSharedPreferances sharedPref = new DrAppSharedPreferances();
Helpers helpers = new Helpers();
@ -50,7 +48,6 @@ class BaseAppClient {
body['ClinicID'] = doctorProfile?.clinicID;
}
body['TokenID'] = token ?? '';
String lang = await sharedPref.getString(APP_Language);
if (lang != null && lang == 'ar')
body['LanguageID'] = 1;
@ -64,6 +61,8 @@ class BaseAppClient {
body['SessionID'] = SESSION_ID;
body['IsLoginForDoctorApp'] = IS_LOGIN_FOR_DOCTOR_APP;
body['PatientOutSA'] = 0; // PATIENT_OUT_SA;
body['VidaAuthTokenID'] = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMDAyIiwianRpIjoiZjcwMTUyYzktMjAwNy00Y2FjLTkzMWUtOGI0MDlhMWFkNjc4IiwiZW1haWwiOiIiLCJpZCI6IjEwMDIiLCJOYW1lIjoiVEVNUCAtIERPQ1RPUiIsIkVtcGxveWVlSWQiOiI0NzA5IiwiRmFjaWxpdHlHcm91cElkIjoiMDEwMjY2IiwiRmFjaWxpdHlJZCI6IjE1IiwiUGhhcmFtY3lGYWNpbGl0eUlkIjoiNTUiLCJJU19QSEFSTUFDWV9DT05ORUNURUQiOiJUcnVlIiwiRG9jdG9ySWQiOiI0NzA5IiwiU0VTU0lPTklEIjoiMjE1ODU1MzAiLCJDbGluaWNJZCI6IjE3Iiwicm9sZSI6IkRPQ1RPUlMiLCJuYmYiOjE2MDg1NTMxMDAsImV4cCI6MTYwOTQxNzEwMCwiaWF0IjoxNjA4NTUzMTAwfQ.lydDI-nsHlmb4Z4vesnckCU1i3hnNayoWVacc3E5_XM";
print("URL : $url");
print("Body : ${json.encode(body)}");
@ -83,10 +82,26 @@ class BaseAppClient {
await helpers.logout();
helpers.showErrorToast('Your session expired Please login agian');
} else if (parsed['MessageStatus'] == 1) {
} else
if (parsed['MessageStatus'] == 1) {
onSuccess(parsed, statusCode);
} else {
onFailure(parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'],
String error =
parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'];
if (parsed["ValidationErrors"] != null) {
if (parsed["ValidationErrors"]["ValidationErrors"] != null &&
parsed["ValidationErrors"]["ValidationErrors"].length != 0) {
error ='';
for (var i = 0;
i < parsed["ValidationErrors"]["ValidationErrors"].length;
i++) {
error = error +parsed["ValidationErrors"]["ValidationErrors"][i]["Messages"][0] +"\n";
}
}
}
onFailure(error,
statusCode);
}
}

@ -1,3 +1,5 @@
import 'package:flutter/material.dart';
const MAX_SMALL_SCREEN = 660;
const ONLY_NUMBERS = "[0-9]";
const ONLY_LETTERS = "[a-zA-Z &'\"]";
@ -81,6 +83,13 @@ const TRANSFERT_TO_ADMIN = 'LiveCareApi/DoctorApp/TransferToAdmin';
const END_CALL = 'LiveCareApi/DoctorApp/EndCall';
const END_CALL_WITH_CHARGE = 'LiveCareApi/DoctorApp/CompleteCallWithCharge';
// SOAP
const GET_ALLERGIES = 'Services/DoctorApplication.svc/REST/GetAllergies';
const GET_MASTER_LOOKUP_LIST = 'Services/DoctorApplication.svc/REST/GetMasterLookUpList';
const POST_ALLERGY = 'Services/DoctorApplication.svc/REST/PostAllergies';
var selectedPatientType = 1;
//*********change value to decode json from Dropdown ************
@ -140,4 +149,5 @@ const TIMER_MIN = 10;
class AppGlobal {
static var CONTEX;
static Color appPrimaryColor =Color(0xFFB9382C);
}

@ -1,4 +1,4 @@
const Map<String, Map<String, String>> localizedValues = {
const Map<String, Map<String, String>> localizedValues = {
'dashboardScreenToolbarTitle': {'ar': 'الرئيسة', 'en': 'Home'},
'settings': {'en': 'Settings', 'ar': 'الاعدادات'},
'language': {'en': 'App Language', 'ar': 'لغة التطبيق'},
@ -201,6 +201,7 @@ const Map<String, Map<String, String>> localizedValues = {
'routine': {'en': 'Routine', 'ar': 'روتيني'},
'send': {'en': 'Send', 'ar': 'ارسال'},
'referralFrequency': {'en': 'Referral Frequency:', 'ar': 'تواتر الحالة:'},
'selectReferralFrequency': {'en': 'Select Referral Frequency:', 'ar': 'اختار تواتر الحالة:'},
'clinicalDetailsAndRemarks': {
'en': 'Clinical Details and Remarks',
'ar': 'التفاصيل السرسرية والملاحظات'
@ -229,6 +230,7 @@ const Map<String, Map<String, String>> localizedValues = {
'beingBad': {'en': 'being bad', 'ar': 'سيء'},
'beingGreat': {'en': 'being great', 'ar': 'رائع'},
'cancel': {'en': 'CANCEL', 'ar': 'الغاء'},
'ok': {'en': 'OK', 'ar': 'موافق'},
'done': {'en': 'DONE', 'ar': 'تأكيد'},
'resumecall': {'en': 'Resume call', 'ar': 'استئناف المكالمة'},
'endcallwithcharge': {'en': 'End with charge', 'ar': 'ينتهي مع الشحن'},
@ -273,4 +275,12 @@ const Map<String, Map<String, String>> localizedValues = {
'area': {'en': 'AREA:', 'ar': 'المنطقة'},
'room': {'en': 'ROOM:', 'ar': 'الغرفة'},
'bed': {'en': 'BED:', 'ar': 'السرير'},
'next': {'en': 'Next', 'ar': 'التالي'},
'healthRecordInformation': {'en': 'HEALTH RECORD INFORMATION', 'ar': 'معلومات السجل الصحي'},
'clinicSelect': {'en': "Select Clinic", 'ar': 'اختار عيادة'},
'doctorSelect': {'en': "Select Doctor", 'ar': 'اختار طبيب'},
"empty-message": {
"en": "Please enter message",
"ar": "يرجى ادخال الموضوع"
},
};

@ -0,0 +1,42 @@
enum MasterKeysService {
Allergies,
HistoryFamily,
HistoryMedical,
HistorySocial,
HistorySports,
HistorySurgical,
PhysicalExamination,
AllergySeverity
}
extension SelectedMasterKeysService on MasterKeysService {
// ignore: missing_return
int getMasterKeyService() {
switch (this) {
case MasterKeysService.Allergies:
return 11;
break;
case MasterKeysService.HistoryFamily:
return 36;
break;
case MasterKeysService.HistoryMedical:
return 37;
break;
case MasterKeysService.HistorySocial:
return 38;
break;
case MasterKeysService.HistorySports:
return 39;
break;
case MasterKeysService.HistorySurgical:
return 66;
break;
case MasterKeysService.PhysicalExamination:
return 59;
break;
case MasterKeysService.AllergySeverity:
return 55;
break;
}
}
}

@ -0,0 +1,39 @@
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/core/enum/master_lookup_key.dart';
import 'package:doctor_app_flutter/core/service/base/base_service.dart';
import 'package:doctor_app_flutter/models/SOAP/get_Allergies_request_model.dart';
import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart';
import 'package:doctor_app_flutter/models/SOAP/post_allergy_request_model.dart';
import 'base/lookup-service.dart';
class SOAPService extends LookupService {
Future getAllergies(GetAllergiesRequestModel getAllergiesRequestModel) async {
await baseAppClient.post(
GET_ALLERGIES,
onSuccess: (dynamic response, int statusCode) {
listOfAllergies.clear();
response['List_Allergies']['entityList'].forEach((v) {
listOfAllergies.add(MasterKeyModel.fromJson(v));
});
},
onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
},
body: getAllergiesRequestModel.toJson(),
);
}
Future postAllergy(PostAllergyRequestModel postAllergyRequestModel) async {
await baseAppClient.post(POST_ALLERGY,
onSuccess: (dynamic response, int statusCode) {
print("Success");
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: postAllergyRequestModel.toJson());
}
}

@ -0,0 +1,98 @@
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/core/enum/master_lookup_key.dart';
import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart';
import 'base_service.dart';
class LookupService extends BaseService {
List<MasterKeyModel> listOfAllergies = [];
List<MasterKeyModel> get allergySeverityList => _allergySeverityList;
List<MasterKeyModel> _allergySeverityList = [];
List<MasterKeyModel> get historyFamilyList => _historyFamilyList;
List<MasterKeyModel> _historyFamilyList = [];
List<MasterKeyModel> get historyMedicalList => _historyMedicalList;
List<MasterKeyModel> _historyMedicalList = [];
List<MasterKeyModel> get historySportList => _historySportList;
List<MasterKeyModel> _historySportList = [];
List<MasterKeyModel> get historySocialList => _historySocialList;
List<MasterKeyModel> _historySocialList = [];
List<MasterKeyModel> get historySurgicalList => _historySurgicalList;
List<MasterKeyModel> _historySurgicalList = [];
Future getMasterLookup(MasterKeysService masterKeys) async {
Map<String, dynamic> body = {
"MasterInput": masterKeys.getMasterKeyService()
};
await baseAppClient.post(GET_MASTER_LOOKUP_LIST,
onSuccess: (dynamic response, int statusCode) {
setMasterLookupInCorrectArray(
response['MasterLookUpList']['entityList'], masterKeys);
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: body);
}
setMasterLookupInCorrectArray(entryList, MasterKeysService masterKeys) {
switch (masterKeys) {
case MasterKeysService.Allergies:
listOfAllergies.clear();
entryList.forEach((v) {
listOfAllergies
.add(MasterKeyModel.fromJson(v));
});
break;
case MasterKeysService.HistoryFamily:
_historyFamilyList.clear();
entryList.forEach((v) {
_historyFamilyList
.add(MasterKeyModel.fromJson(v));
});
break;
case MasterKeysService.HistoryMedical:
_historyMedicalList.clear();
entryList.forEach((v) {
_historyMedicalList
.add(MasterKeyModel.fromJson(v));
});
break;
case MasterKeysService.HistorySocial:
historySocialList.clear();
entryList.forEach((v) {
historySocialList
.add(MasterKeyModel.fromJson(v));
});
break;
case MasterKeysService.HistorySports:
_historySportList.clear();
entryList.forEach((v) {
_historySportList
.add(MasterKeyModel.fromJson(v));
}); break;
case MasterKeysService.HistorySurgical:
_historySurgicalList.clear();
entryList.forEach((v) {
_historySurgicalList
.add(MasterKeyModel.fromJson(v));
});
break;
case MasterKeysService.PhysicalExamination:
return 59;
break;
case MasterKeysService.AllergySeverity:
_allergySeverityList.clear();
entryList.forEach((v) {
_allergySeverityList
.add(MasterKeyModel.fromJson(v));
});
break;
}
}
}

@ -0,0 +1,64 @@
import 'package:doctor_app_flutter/core/enum/master_lookup_key.dart';
import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/service/SOAP_service.dart';
import 'package:doctor_app_flutter/models/SOAP/Allergy_model.dart';
import 'package:doctor_app_flutter/models/SOAP/get_Allergies_request_model.dart';
import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart';
import 'package:doctor_app_flutter/models/SOAP/post_allergy_request_model.dart';
import '../../locator.dart';
import 'base_view_model.dart';
class SOAPViewModel extends BaseViewModel {
SOAPService _SOAPService = locator<SOAPService>();
List<MasterKeyModel> get listOfAllergies => _SOAPService.listOfAllergies;
List<MasterKeyModel> get allergySeverityList =>
_SOAPService.allergySeverityList;
List<MasterKeyModel> get historyFamilyList => _SOAPService.historyFamilyList;
List<MasterKeyModel> get historyMedicalList => _SOAPService.historyMedicalList;
List<MasterKeyModel> get historySportList => _SOAPService.historySportList;
List<MasterKeyModel> get historySocialList => _SOAPService.historySocialList;
List<MasterKeyModel> get historySurgicalList => _SOAPService.historySurgicalList;
List<MasterKeyModel> get mergeHistorySurgicalWithHistorySportList => [...historySurgicalList,...historySportList];
Future getAllergies(GetAllergiesRequestModel getAllergiesRequestModel) async {
setState(ViewState.Busy);
await _SOAPService.getAllergies(getAllergiesRequestModel);
if (_SOAPService.hasError) {
error = _SOAPService.error;
setState(ViewState.Error);
} else
setState(ViewState.Idle);
}
Future getMasterLookup(MasterKeysService masterKeys) async {
setState(ViewState.Busy);
await _SOAPService.getMasterLookup(masterKeys);
if (_SOAPService.hasError) {
error = _SOAPService.error;
setState(ViewState.Error);
} else
setState(ViewState.Idle);
}
Future postAllergy(PostAllergyRequestModel postAllergyRequestModel) async {
setState(ViewState.BusyLocal);
await _SOAPService.postAllergy(postAllergyRequestModel);
if (_SOAPService.hasError) {
error = _SOAPService.error;
setState(ViewState.ErrorLocal);
} else
setState(ViewState.Idle);
}
}

@ -42,10 +42,10 @@ class PatientViewModel extends BaseViewModel {
get patientProgressNoteList => _patientService.patientProgressNoteList;
get clinicsList => _patientService.clinicsList;
get doctorsList => _patientService.doctorsList;
List<dynamic> get clinicsList => _patientService.clinicsList;
List<dynamic> get doctorsList => _patientService.doctorsList;
List<dynamic> get referralFrequencyList => _patientService.referalFrequancyList;
get referalFrequancyList => _patientService.referalFrequancyList;
Future getPatientList(PatientModel patient, patientType,
{bool isBusyLocal = false}) async {
if(isBusyLocal) {
@ -167,6 +167,7 @@ class PatientViewModel extends BaseViewModel {
}
}
}
Future getDoctorsList(String clinicId) async {
setState(ViewState.BusyLocal);
await _patientService.getDoctorsList(clinicId);

@ -15,7 +15,7 @@ import 'package:provider/provider.dart';
Helpers helpers = Helpers();
class ProjectProvider with ChangeNotifier {
class ProjectViewModel with ChangeNotifier {
DrAppSharedPreferances sharedPref = DrAppSharedPreferances();
Locale _appLocale;
String currentLanguage = 'ar';
@ -31,7 +31,7 @@ class ProjectProvider with ChangeNotifier {
bool get isArabic => _isArabic;
StreamSubscription subscription;
ProjectProvider() {
ProjectViewModel() {
loadSharedPrefLanguage();
subscription = Connectivity()

@ -2,11 +2,13 @@ import 'package:doctor_app_flutter/core/service/patient_service.dart';
import 'package:doctor_app_flutter/core/viewModel/patient_view_model.dart';
import 'package:get_it/get_it.dart';
import 'core/service/SOAP_service.dart';
import 'core/service/doctor_reply_service.dart';
import 'core/service/medicine_service.dart';
import 'core/service/referral_patient_service.dart';
import 'core/service/referred_patient_service.dart';
import 'core/service/schedule_service.dart';
import 'core/viewModel/SOAP_view_model.dart';
import 'core/viewModel/doctor_replay_view_model.dart';
import 'core/viewModel/medicine_view_model.dart';
import 'core/viewModel/referral_view_model.dart';
@ -24,6 +26,7 @@ void setupLocator() {
locator.registerLazySingleton(() => ReferredPatientService());
locator.registerLazySingleton(() => MedicineService());
locator.registerLazySingleton(() => PatientService());
locator.registerLazySingleton(() => SOAPService());
/// View Model
locator.registerFactory(() => DoctorReplayViewModel());
@ -32,4 +35,5 @@ void setupLocator() {
locator.registerFactory(() => ReferredPatientViewModel());
locator.registerFactory(() => MedicineViewModel());
locator.registerFactory(() => PatientViewModel());
locator.registerFactory(() => SOAPViewModel());
}

@ -33,14 +33,14 @@ class MyApp extends StatelessWidget {
create: (context) => AuthViewModel()),
ChangeNotifierProvider<HospitalViewModel>(
create: (context) => HospitalViewModel()),
ChangeNotifierProvider<ProjectProvider>(
create: (context) => ProjectProvider(),
ChangeNotifierProvider<ProjectViewModel>(
create: (context) => ProjectViewModel(),
),
ChangeNotifierProvider<LiveCareViewModel>(
create: (context) => LiveCareViewModel(),
),
],
child: Consumer<ProjectProvider>(
child: Consumer<ProjectViewModel>(
builder: (context,projectProvider,child) => MaterialApp(
showSemanticsDebugger: false,
title: 'Flutter Demo',

@ -0,0 +1,60 @@
class AllergyModel {
int allergyDiseaseId;
String allergyDiseaseName;
int allergyDiseaseType;
int appointmentNo;
int createdBy;
String createdByName;
String createdOn;
int episodeID;
bool isChecked;
bool isUpdatedByNurse;
int severity;
String severityName;
AllergyModel(
{this.allergyDiseaseId,
this.allergyDiseaseName,
this.allergyDiseaseType,
this.appointmentNo,
this.createdBy,
this.createdByName,
this.createdOn,
this.episodeID,
this.isChecked,
this.isUpdatedByNurse,
this.severity,
this.severityName});
AllergyModel.fromJson(Map<String, dynamic> json) {
allergyDiseaseId = json['allergyDiseaseId'];
allergyDiseaseName = json['allergyDiseaseName'];
allergyDiseaseType = json['allergyDiseaseType'];
appointmentNo = json['appointmentNo'];
createdBy = json['createdBy'];
createdByName = json['createdByName'];
createdOn = json['createdOn'];
episodeID = json['episodeID'];
isChecked = json['isChecked'];
isUpdatedByNurse = json['isUpdatedByNurse'];
severity = json['severity'];
severityName = json['severityName'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['allergyDiseaseId'] = this.allergyDiseaseId;
data['allergyDiseaseName'] = this.allergyDiseaseName;
data['allergyDiseaseType'] = this.allergyDiseaseType;
data['appointmentNo'] = this.appointmentNo;
data['createdBy'] = this.createdBy;
data['createdByName'] = this.createdByName;
data['createdOn'] = this.createdOn;
data['episodeID'] = this.episodeID;
data['isChecked'] = this.isChecked;
data['isUpdatedByNurse'] = this.isUpdatedByNurse;
data['severity'] = this.severity;
data['severityName'] = this.severityName;
return data;
}
}

@ -0,0 +1,32 @@
class GetAllergiesRequestModel {
String vidaAuthTokenID;
int patientMRN;
int appointmentNo;
int episodeId;
String doctorID;
GetAllergiesRequestModel(
{this.vidaAuthTokenID,
this.patientMRN,
this.appointmentNo,
this.episodeId,
this.doctorID});
GetAllergiesRequestModel.fromJson(Map<String, dynamic> json) {
vidaAuthTokenID = json['VidaAuthTokenID'];
patientMRN = json['PatientMRN'];
appointmentNo = json['AppointmentNo'];
episodeId = json['EpisodeId'];
doctorID = json['DoctorID'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['VidaAuthTokenID'] = this.vidaAuthTokenID;
data['PatientMRN'] = this.patientMRN;
data['AppointmentNo'] = this.appointmentNo;
data['EpisodeId'] = this.episodeId;
data['DoctorID'] = this.doctorID;
return data;
}
}

@ -0,0 +1,76 @@
class MasterKeyModel {
String alias;
String aliasN;
int code;
Null description;
Null detail1;
Null detail2;
Null detail3;
Null detail4;
Null detail5;
int groupID;
int id;
String nameAr;
String nameEn;
Null remarks;
int typeId;
String valueList;
MasterKeyModel(
{this.alias,
this.aliasN,
this.code,
this.description,
this.detail1,
this.detail2,
this.detail3,
this.detail4,
this.detail5,
this.groupID,
this.id,
this.nameAr,
this.nameEn,
this.remarks,
this.typeId,
this.valueList});
MasterKeyModel.fromJson(Map<String, dynamic> json) {
alias = json['alias'];
aliasN = json['aliasN'];
code = json['code'];
description = json['description'];
detail1 = json['detail1'];
detail2 = json['detail2'];
detail3 = json['detail3'];
detail4 = json['detail4'];
detail5 = json['detail5'];
groupID = json['groupID'];
id = json['id'];
nameAr = json['nameAr'];
nameEn = json['nameEn'];
remarks = json['remarks'];
typeId = json['typeId'];
valueList = json['valueList'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['alias'] = this.alias;
data['aliasN'] = this.aliasN;
data['code'] = this.code;
data['description'] = this.description;
data['detail1'] = this.detail1;
data['detail2'] = this.detail2;
data['detail3'] = this.detail3;
data['detail4'] = this.detail4;
data['detail5'] = this.detail5;
data['groupID'] = this.groupID;
data['id'] = this.id;
data['nameAr'] = this.nameAr;
data['nameEn'] = this.nameEn;
data['remarks'] = this.remarks;
data['typeId'] = this.typeId;
data['valueList'] = this.valueList;
return data;
}
}

@ -0,0 +1,32 @@
import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart';
class MySelectedAllergy {
MasterKeyModel selectedAllergySeverity;
MasterKeyModel selectedAllergy;
String remark;
MySelectedAllergy(
{this.selectedAllergySeverity, this.selectedAllergy, this.remark});
MySelectedAllergy.fromJson(Map<String, dynamic> json) {
selectedAllergySeverity = json['selectedAllergySeverity'] != null
? new MasterKeyModel.fromJson(json['selectedAllergySeverity'])
: null;
selectedAllergy = json['selectedAllergy'] != null
? new MasterKeyModel.fromJson(json['selectedAllergy'])
: null;
remark = json['remark'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.selectedAllergySeverity != null) {
data['selectedAllergySeverity'] = this.selectedAllergySeverity.toJson();
}
if (this.selectedAllergy != null) {
data['selectedAllergy'] = this.selectedAllergy.toJson();
}
data['remark'] = this.remark;
return data;
}
}

@ -0,0 +1,93 @@
class PostAllergyRequestModel {
List<ListHisProgNotePatientAllergyDiseaseVM>
listHisProgNotePatientAllergyDiseaseVM;
PostAllergyRequestModel({this.listHisProgNotePatientAllergyDiseaseVM});
PostAllergyRequestModel.fromJson(Map<String, dynamic> json) {
if (json['listHisProgNotePatientAllergyDiseaseVM'] != null) {
listHisProgNotePatientAllergyDiseaseVM =
new List<ListHisProgNotePatientAllergyDiseaseVM>();
json['listHisProgNotePatientAllergyDiseaseVM'].forEach((v) {
listHisProgNotePatientAllergyDiseaseVM
.add(new ListHisProgNotePatientAllergyDiseaseVM.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.listHisProgNotePatientAllergyDiseaseVM != null) {
data['listHisProgNotePatientAllergyDiseaseVM'] = this
.listHisProgNotePatientAllergyDiseaseVM
.map((v) => v.toJson())
.toList();
}
return data;
}
}
class ListHisProgNotePatientAllergyDiseaseVM {
int patientMRN;
int allergyDiseaseType;
int allergyDiseaseId;
int episodeId;
int appointmentNo;
int severity;
bool isChecked;
bool isUpdatedByNurse;
String remarks;
int createdBy;
String createdOn;
int editedBy;
String editedOn;
ListHisProgNotePatientAllergyDiseaseVM(
{this.patientMRN,
this.allergyDiseaseType,
this.allergyDiseaseId,
this.episodeId,
this.appointmentNo,
this.severity,
this.isChecked,
this.isUpdatedByNurse,
this.remarks,
this.createdBy,
this.createdOn,
this.editedBy,
this.editedOn});
ListHisProgNotePatientAllergyDiseaseVM.fromJson(Map<String, dynamic> json) {
patientMRN = json['patientMRN'];
allergyDiseaseType = json['allergyDiseaseType'];
allergyDiseaseId = json['allergyDiseaseId'];
episodeId = json['episodeId'];
appointmentNo = json['appointmentNo'];
severity = json['severity'];
isChecked = json['isChecked'];
isUpdatedByNurse = json['isUpdatedByNurse'];
remarks = json['remarks'];
createdBy = json['createdBy'];
createdOn = json['createdOn'];
editedBy = json['editedBy'];
editedOn = json['editedOn'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['patientMRN'] = this.patientMRN;
data['allergyDiseaseType'] = this.allergyDiseaseType;
data['allergyDiseaseId'] = this.allergyDiseaseId;
data['episodeId'] = this.episodeId;
data['appointmentNo'] = this.appointmentNo;
data['severity'] = this.severity;
data['isChecked'] = this.isChecked;
data['isUpdatedByNurse'] = this.isUpdatedByNurse;
data['remarks'] = this.remarks;
data['createdBy'] = this.createdBy;
data['createdOn'] = this.createdOn;
data['editedBy'] = this.editedBy;
data['editedOn'] = this.editedOn;
return data;
}
}

@ -7,6 +7,7 @@ import 'package:doctor_app_flutter/screens/patients/profile/refer_patient_screen
import 'package:doctor_app_flutter/screens/patients/profile/prescriptions/in_patient_prescription_details_screen.dart';
import 'package:doctor_app_flutter/screens/live_care/video_call.dart';
import 'package:doctor_app_flutter/widgets/patients/profile/SOAP/add_SOAP_index.dart';
import './screens/QR_reader_screen.dart';
import './screens/auth/change_password_screen.dart';
@ -69,6 +70,8 @@ const String PATIENT_ORDERS = 'patients/patient_orders';
const String PATIENT_INSURANCE_APPROVALS =
'patients/patient_insurance_approvals';
const String VITAL_SIGN_DETAILS = 'patients/vital-sign-details';
const String CREATE_EPISODE = 'patients/create-episode';
const String BODY_MEASUREMENTS = 'patients/body-measurements';
const String IN_PATIENT_PRESCRIPTIONS_DETAILS = 'patients/prescription-details';
// const String VIDEO_CALL = 'video-call';
@ -105,6 +108,7 @@ var routes = {
PATIENT_ORDERS: (_) => PatientsOrdersScreen(),
PATIENT_INSURANCE_APPROVALS: (_) => InsuranceApprovalsScreen(),
VITAL_SIGN_DETAILS: (_) => VitalSignDetailsScreen(),
CREATE_EPISODE:(_)=>AddSOAPIndex(),
BODY_MEASUREMENTS: (_) => VitalSignItemDetailsScreen(),
IN_PATIENT_PRESCRIPTIONS_DETAILS: (_) => InpatientPrescriptionDetailsScreen(),
// VIDEO_CALL: (_) => VideoCallPage(patientData: null),

@ -41,14 +41,14 @@ class _DashboardScreenState extends State<DashboardScreen> {
HospitalViewModel hospitalProvider;
AuthViewModel authProvider;
bool isLoading = false;
ProjectProvider projectsProvider;
ProjectViewModel projectsProvider;
var _isInit = true;
DoctorProfileModel profile;
void didChangeDependencies() async {
super.didChangeDependencies();
if (_isInit) {
projectsProvider = Provider.of<ProjectProvider>(context);
projectsProvider = Provider.of<ProjectViewModel>(context);
projectsProvider.getDoctorClinicsList();
}
_isInit = false;

@ -34,7 +34,7 @@ class PharmaciesListScreen extends StatefulWidget {
class _PharmaciesListState extends State<PharmaciesListScreen> {
var _data;
Helpers helpers = new Helpers();
ProjectProvider projectsProvider;
ProjectViewModel projectsProvider;
bool _isInit = true;
//bool _isOutOfStuck = false;

@ -39,7 +39,7 @@ class _PatientSearchScreenState extends State<PatientSearchScreen> {
String _selectedType = '1';
String _selectedLocation = '1';
String error = '';
ProjectProvider projectsProvider;
ProjectViewModel projectsProvider;
String itemText = '';
String itemText2 = '';
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();

@ -46,6 +46,7 @@ class _PatientReferredScreenState extends State<PatientReferredScreen> {
List<String>list=List();
return AppScaffold(
//TODO : add Translation
appBarTitle: "My Referred Patients",//patientTypetitle,
body: Center(

@ -60,7 +60,7 @@ class _PatientsScreenState extends State<PatientsScreen> {
bool _isError = false;
String error = "";
ProjectProvider projectsProvider;
ProjectViewModel projectsProvider;
final _controller = TextEditingController();

@ -6,9 +6,11 @@ import 'package:doctor_app_flutter/util/dr_app_toast_msg.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_text_form_field.dart';
import 'package:doctor_app_flutter/widgets/shared/dialogs/dailog-list-select.dart';
import 'package:doctor_app_flutter/widgets/shared/errors/dr_app_embedded_error.dart';
import 'package:doctor_app_flutter/widgets/shared/rounded_container_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:hexcolor/hexcolor.dart';
import 'package:intl/intl.dart';
@ -34,26 +36,18 @@ class ReferPatientScreen extends StatefulWidget {
}
class _ReferPatientState extends State<ReferPatientScreen> {
var doctorsList;
final _remarksController = TextEditingController();
dynamic _selectedClinic;
dynamic _selectedDoctor;
final _extController = TextEditingController();
var _isInit = true;
bool isValid;
var clinicId;
var doctorId;
var freqId;
String _selectedClinic;
String _selectedDoctor;
String _selectedReferralFrequancy;
int _activePriority = 1;
FocusNode myFocusNode = FocusNode();
dynamic _selectedFrequency;
final _remarksController = TextEditingController();
bool isValid;
@override
Widget build(BuildContext context) {
final screenSize = MediaQuery.of(context).size;
return BaseView<PatientViewModel>(
onModelReady: (model) => model.getClinicsList(),
builder: (_, model, w) => AppScaffold(
@ -62,399 +56,255 @@ class _ReferPatientState extends State<ReferPatientScreen> {
body: model.clinicsList == null
? DrAppEmbeddedError(error: 'Something Wrong!')
: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
AppText(
TranslationBase.of(context).clinic,
fontSize: 18,
fontWeight: FontWeight.bold,
marginLeft: 15,
marginTop: 15,
),
RoundedContainer(
margin: 10,
showBorder: true,
raduis: 30,
borderColor: Color(0xff707070),
width: double.infinity,
child: Padding(
padding: EdgeInsets.only(
top: SizeConfig.widthMultiplier * 0.9,
bottom: SizeConfig.widthMultiplier * 0.9,
right: SizeConfig.widthMultiplier * 3,
left: SizeConfig.widthMultiplier * 3),
child: Row(
mainAxisSize: MainAxisSize.max,
children: <Widget>[
Expanded(
// add Expanded to have your dropdown button fill remaining space
child: DropdownButton(
isExpanded: true,
value: _selectedClinic,
iconSize: 40,
elevation: 16,
selectedItemBuilder:
(BuildContext context) {
return model
.getClinicNameList()
.map((item) {
return Row(
mainAxisSize: MainAxisSize.max,
children: <Widget>[
AppText(
item,
fontSize:
SizeConfig.textMultiplier *
2.1,
),
],
);
}).toList();
},
onChanged: (newValue) => {
setState(() {
_selectedDoctor = null;
_selectedClinic = newValue;
var clinicInfo = model
.clinicsList
.where((i) =>
i['ClinicDescription']
.toString()
.contains(
_selectedClinic))
.toList();
clinicId = clinicInfo[0]['ClinicID']
.toString();
model.getDoctorsList(clinicId);
})
},
items: model
.getClinicNameList()
.map((item) {
return DropdownMenuItem(
value: item.toString(),
child: Text(
item,
textAlign: TextAlign.end,
),
);
}).toList(),
),
),
],
),
),
),
//--------------------------------------------------------------------//
AppText(
TranslationBase.of(context).doctor,
fontSize: 18,
fontWeight: FontWeight.bold,
marginLeft: 15,
marginTop: 15,
),
RoundedContainer(
margin: 10,
showBorder: true,
raduis: 30,
borderColor: Color(0xff707070),
width: double.infinity,
child: Padding(
padding: EdgeInsets.only(
top: SizeConfig.widthMultiplier * 0.9,
bottom: SizeConfig.widthMultiplier * 0.9,
right: SizeConfig.widthMultiplier * 3,
left: SizeConfig.widthMultiplier * 3),
child: Row(
mainAxisSize: MainAxisSize.max,
children: <Widget>[
Expanded(
// add Expanded to have your dropdown button fill remaining space
child: DropdownButton(
isExpanded: true,
value: _selectedDoctor,
iconSize: 40,
elevation: 16,
selectedItemBuilder:
(BuildContext context) {
return model
.getDoctorNameList()
.map((item) {
return Row(
mainAxisSize: MainAxisSize.max,
children: <Widget>[
AppText(
item,
fontSize:
SizeConfig.textMultiplier *
2.1,
),
],
);
}).toList();
},
onChanged: (newValue) => {
setState(() {
_selectedDoctor = newValue;
doctorsList =
model.doctorsList;
var doctorInfo = doctorsList
.where((i) => i['DoctorName']
.toString()
.contains(_selectedDoctor))
.toList();
doctorId = doctorInfo[0]['DoctorID']
.toString();
})
},
items: model
.getDoctorNameList()
.map((item) {
return DropdownMenuItem(
value: item.toString(),
child: Text(
item,
textAlign: TextAlign.end,
),
);
}).toList(),
),
),
],
),
),
), //-----------------------------///
AppText(
TranslationBase.of(context).ext,
fontSize: 18,
fontWeight: FontWeight.bold,
marginLeft: 15,
marginTop: 15,
),
Padding(
padding: const EdgeInsets.all(10.0),
child: AppTextFormField(
hintText: TranslationBase.of(context).ext,
controller: _extController,
inputFormatter: ONLY_NUMBERS,
textInputType: TextInputType.number,
onChanged: (value) => {},
),
),
AppText(
TranslationBase.of(context).priority,
fontSize: 18,
fontWeight: FontWeight.bold,
marginLeft: 15,
marginTop: 15,
),
priorityBar(context),
AppText(
TranslationBase.of(context).referralFrequency +
getPriority(),
fontWeight: FontWeight.bold,
marginLeft: 15,
marginTop: 15,
child: Container(
margin: EdgeInsets.symmetric(vertical: 16, horizontal: 16),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Container(
height: screenSize.height * 0.070,
child: InkWell(
onTap: model.clinicsList != null &&
model.clinicsList.length > 0
? () {
ListSelectDialog dialog = ListSelectDialog(
list: model.clinicsList,
attributeName: 'ClinicDescription',
attributeValueId: 'ClinicID',
okText: TranslationBase.of(context).ok,
okFunction: (selectedValue) {
setState(() {
_selectedDoctor = null;
_selectedClinic = selectedValue;
model.getDoctorsList(
_selectedClinic['ClinicID']
.toString());
});
},
);
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
return dialog;
},
);
}
: null,
child: TextField(
decoration: textFieldSelectorDecoration(
TranslationBase.of(context).clinicSelect,
_selectedClinic != null
? _selectedClinic['ClinicDescription']
: null,
true),
enabled: false,
),
AppText(
TranslationBase.of(context).referralFrequency,
fontSize: 18,
fontWeight: FontWeight.bold,
marginLeft: 15,
marginTop: 15,
),
),
SizedBox(
height: 10,
),
Container(
height: screenSize.height * 0.070,
child: InkWell(
onTap: model.doctorsList != null &&
model.doctorsList.length > 0
? () {
ListSelectDialog dialog = ListSelectDialog(
list: model.doctorsList,
attributeName: 'DoctorName',
attributeValueId: 'DoctorID',
okText: TranslationBase.of(context).ok,
okFunction: (selectedValue) {
setState(() {
_selectedDoctor = selectedValue;
});
},
);
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
return dialog;
},
);
}
: null,
child: TextField(
decoration: textFieldSelectorDecoration(
TranslationBase.of(context).doctorSelect,
_selectedDoctor != null
? _selectedDoctor['DoctorName']
: null,
true),
enabled: false,
),
RoundedContainer(
margin: 10,
showBorder: true,
raduis: 30,
borderColor: Color(0xff707070),
width: double.infinity,
child: Padding(
padding: EdgeInsets.only(
top: SizeConfig.widthMultiplier * 0.9,
bottom: SizeConfig.widthMultiplier * 0.9,
right: SizeConfig.widthMultiplier * 3,
left: SizeConfig.widthMultiplier * 3),
child: Row(
mainAxisSize: MainAxisSize.max,
children: <Widget>[
Expanded(
// add Expanded to have your dropdown button fill remaining space
child: DropdownButton(
isExpanded: true,
value: _selectedReferralFrequancy,
iconSize: 40,
elevation: 16,
selectedItemBuilder:
(BuildContext context) {
return model
.getReferralNamesList()
.map((item) {
return Row(
mainAxisSize: MainAxisSize.max,
children: <Widget>[
AppText(
item,
fontSize:
SizeConfig.textMultiplier *
2.1,
),
],
);
}).toList();
},
onChanged: (newValue) => {
setState(() {
_selectedReferralFrequancy = newValue;
var freqInfo = model
.referalFrequancyList
.singleWhere((i) => i[
'Description']
.toString()
.contains(
_selectedReferralFrequancy));
freqId = freqInfo['ParameterCode']
.toString();
myFocusNode.requestFocus();
})
},
items: model
.getReferralNamesList()
.map((item) {
return DropdownMenuItem(
value: item.toString(),
child: Text(
item,
textAlign: TextAlign.end,
),
);
}).toList(),
),
),
],
),
),
),
),
SizedBox(
height: 10,
),
Container(
height: screenSize.height * 0.070,
child: TextField(
decoration: textFieldSelectorDecoration(
TranslationBase.of(context).ext, null, false),
enabled: true,
controller: _extController,
inputFormatters: [
FilteringTextInputFormatter.allow(
RegExp(ONLY_NUMBERS))
],
keyboardType: TextInputType.number,
)),
SizedBox(
height: 10,
),
priorityBar(context, screenSize),
SizedBox(
height: 20,
),
AppText(
"${TranslationBase.of(context).referralFrequency} ${getPriority()}",
fontWeight: FontWeight.bold,
fontSize: 16,
),
SizedBox(
height: 20,
),
Container(
height: screenSize.height * 0.070,
child: InkWell(
onTap: model.referralFrequencyList != null &&
model.referralFrequencyList.length > 0
? () {
ListSelectDialog dialog = ListSelectDialog(
list: model.referralFrequencyList,
attributeName: 'Description',
attributeValueId: 'ParameterCode',
okText: TranslationBase.of(context).ok,
okFunction: (selectedValue) {
setState(() {
_selectedFrequency = selectedValue;
});
},
);
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
return dialog;
},
);
}
: null,
child: TextField(
decoration: textFieldSelectorDecoration(
TranslationBase.of(context)
.selectReferralFrequency,
_selectedFrequency != null
? _selectedFrequency['Description']
: null,
true),
enabled: false,
),
AppText(
),
),
SizedBox(
height: 10,
),
Container(
child: TextField(
decoration: textFieldSelectorDecoration(
TranslationBase.of(context).clinicDetailsandRemarks,
fontSize: 18,
fontWeight: FontWeight.bold,
marginLeft: 15,
marginTop: 15,
),
Padding(
padding: const EdgeInsets.all(10.0),
child: AppTextFormField(
hintText: TranslationBase.of(context).remarks,
focusNode: myFocusNode,
controller: _remarksController,
inputFormatter: ONLY_LETTERS,
textInputType: TextInputType.text,
onChanged: (value) => {},
null,
false),
enabled: true,
controller: _remarksController,
inputFormatters: [
FilteringTextInputFormatter.allow(
RegExp(ONLY_LETTERS))
],
keyboardType: TextInputType.text,
minLines: 4,
maxLines: 6,
)),
SizedBox(
height: 10,
),
Container(
child: Column(
children: <Widget>[
AppText(
TranslationBase.of(context).pleaseFill,
color: HexColor("#B8382B"),
fontWeight: FontWeight.bold,
margin: 10,
visibility: isValid == null ? false : !isValid,
),
),
Padding(
padding: const EdgeInsets.all(20.0),
child: Column(
children: <Widget>[
AppText(
TranslationBase.of(context).pleaseFill,
color: Colors.red,
fontWeight: FontWeight.bold,
margin: 10,
visibility:
isValid == null ? false : !isValid,
),
// TODO replace AppButton with secondary button and add loading
AppButton(
title: TranslationBase
.of(context)
.send,
color: Color(PRIMARY_COLOR),
onPressed: () =>
{
referToDoctor(context, model)
},
)
],
))
],
// TODO replace AppButton with secondary button and add loading
AppButton(
title: TranslationBase.of(context).send,
color: HexColor("#B8382B"),
onPressed: () => {referToDoctor(context, model)},
)
],
),
),
],
),
),
),
),
),);
),
);
}
Widget priorityBar(BuildContext _context) {
Widget priorityBar(BuildContext _context, Size screenSize) {
List<String> _priorities = [
TranslationBase.of(context).veryUrgent,
TranslationBase.of(context).urgent,
TranslationBase.of(context).routine,
];
return Container(
height: MediaQuery.of(context).size.height * 0.065,
width: SizeConfig.screenWidth * 0.9,
margin: EdgeInsets.only(top: 10),
decoration: BoxDecoration(
color: Color(0Xffffffff), borderRadius: BorderRadius.circular(20)),
height: screenSize.height * 0.070,
decoration:
containerBorderDecoration(Color(0Xffffffff), Color(0xFFCCCCCC)),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.center,
children: _priorities.map((item) {
bool _isActive = _priorities[_activePriority] == item ? true : false;
return Column(mainAxisSize: MainAxisSize.min, children: <Widget>[
InkWell(
child: Center(
child: Container(
height: 40,
width: 90,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(50),
color: _isActive ? HexColor("#B8382B") : Colors.white,
),
child: Center(
child: Text(
item,
style: TextStyle(
fontSize: 12,
color: _isActive
? Colors.white
: Colors.black, //Colors.black,
// backgroundColor:_isActive
// ? Hexcolor("#B8382B")
// : Colors.white,//sideColor,
fontWeight: FontWeight.bold,
),
return Expanded(
child: InkWell(
child: Center(
child: Container(
height: screenSize.height * 0.070,
decoration: containerBorderDecoration(
_isActive ? HexColor("#B8382B") : Colors.white,
_isActive ? HexColor("#B8382B") : Colors.white),
child: Center(
child: Text(
item,
style: TextStyle(
fontSize: 12,
color: _isActive
? Colors.white
: Colors.black, //Colors.black,
fontWeight: FontWeight.bold,
),
)),
),
onTap: () {
print(_priorities.indexOf(item));
setState(() {
_activePriority = _priorities.indexOf(item);
});
}),
_isActive
? Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: Colors.white),
alignment: Alignment.center,
height: 3,
width: 90,
)
: Container()
]);
),
)),
),
onTap: () {
print(_priorities.indexOf(item));
setState(() {
_activePriority = _priorities.indexOf(item);
});
},
),
);
}).toList(),
),
);
@ -484,10 +334,7 @@ class _ReferPatientState extends State<ReferPatientScreen> {
return;
}
final routeArgs = ModalRoute
.of(context)
.settings
.arguments as Map;
final routeArgs = ModalRoute.of(context).settings.arguments as Map;
PatiantInformtion patient = routeArgs['patient'];
try {
@ -495,17 +342,16 @@ class _ReferPatientState extends State<ReferPatientScreen> {
extension: _extController.value.text,
admissionNo: int.parse(patient.admissionNo),
referringDoctorRemarks: _remarksController.value.text,
frequency: freqId,
frequency: _selectedFrequency['ParameterCode'].toString(),
patientID: patient.patientId,
patientTypeID: patient.patientType,
priority: (_activePriority + 1).toString(),
roomID: patient.roomId,
selectedClinicID: clinicId.toString(),
selectedDoctorID: doctorId.toString(),
selectedClinicID: _selectedClinic['ClinicID'].toString(),
selectedDoctorID: _selectedDoctor['DoctorID'].toString(),
projectID: patient.projectId);
// TODO: Add Translation
DrAppToastMsg.showSuccesToast(
'Reply Successfully');
DrAppToastMsg.showSuccesToast('Reply Successfully');
Navigator.pop(context);
} catch (e) {
DrAppToastMsg.showErrorToast(e);
@ -516,10 +362,47 @@ class _ReferPatientState extends State<ReferPatientScreen> {
setState(() {
isValid = !_extController.value.text.isNullOrEmpty() &&
!_remarksController.value.text.isNullOrEmpty() &&
freqId != null &&
clinicId != null &&
doctorId != null;
_selectedClinic != null &&
_selectedDoctor != null &&
_selectedFrequency != null;
});
return isValid;
}
InputDecoration textFieldSelectorDecoration(
String hintText, String selectedText, bool isDropDown) {
return InputDecoration(
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
borderRadius: BorderRadius.circular(8),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
borderRadius: BorderRadius.circular(8),
),
disabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
borderRadius: BorderRadius.circular(8),
),
hintText: selectedText != null ? selectedText : hintText,
suffixIcon: isDropDown ? Icon(Icons.arrow_drop_down) : null,
hintStyle: TextStyle(
fontSize: 14,
color: Colors.grey.shade600,
),
);
}
BoxDecoration containerBorderDecoration(
Color containerColor, Color borderColor) {
return BoxDecoration(
color: containerColor,
shape: BoxShape.rectangle,
borderRadius: BorderRadius.all(Radius.circular(6)),
border: Border.fromBorderSide(BorderSide(
color: borderColor,
width: 2.0,
)),
);
}
}

@ -8,7 +8,7 @@ import 'package:hexcolor/hexcolor.dart';
import 'package:provider/provider.dart';
class SettingsScreen extends StatelessWidget {
ProjectProvider projectsProvider;
ProjectViewModel projectsProvider;
@override
Widget build(BuildContext context) {
projectsProvider = Provider.of(context);

@ -106,6 +106,8 @@ class TranslationBase {
String get profile => localizedValues['profile'][locale.languageCode];
String get gender => localizedValues['gender'][locale.languageCode];
String get clinic => localizedValues['clinic'][locale.languageCode];
String get clinicSelect => localizedValues['clinicSelect'][locale.languageCode];
String get doctorSelect => localizedValues['doctorSelect'][locale.languageCode];
String get hospital => localizedValues['hospital'][locale.languageCode];
String get speciality => localizedValues['speciality'][locale.languageCode];
String get errorMessage =>
@ -220,8 +222,8 @@ class TranslationBase {
String get urgent => localizedValues['urgent'][locale.languageCode];
String get routine => localizedValues['routine'][locale.languageCode];
String get send => localizedValues['send'][locale.languageCode];
String get referralFrequency =>
localizedValues['referralFrequency'][locale.languageCode];
String get referralFrequency => localizedValues['referralFrequency'][locale.languageCode];
String get selectReferralFrequency => localizedValues['selectReferralFrequency'][locale.languageCode];
String get clinicalDetailsAndRemarks =>
localizedValues['clinicalDetailsAndRemarks'][locale.languageCode];
String get remarks => localizedValues['remarks'][locale.languageCode];
@ -252,6 +254,8 @@ class TranslationBase {
String get cancel => localizedValues['cancel'][locale.languageCode];
String get ok => localizedValues['ok'][locale.languageCode];
String get done => localizedValues['done'][locale.languageCode];
String get searchMedicineImageCaption =>
@ -293,6 +297,10 @@ class TranslationBase {
String get area => localizedValues['area'][locale.languageCode];
String get room => localizedValues['room'][locale.languageCode];
String get bed => localizedValues['bed'][locale.languageCode];
String get next => localizedValues['next'][locale.languageCode];
String get healthRecordInformation => localizedValues['healthRecordInformation'][locale.languageCode];
String get emptyMessage => localizedValues['empty-message'][locale.languageCode];
}
class TranslationBaseDelegate extends LocalizationsDelegate<TranslationBase> {

@ -26,7 +26,7 @@ class DashboardItemTexts extends StatefulWidget {
}
class _DashboardItemTextsState extends State<DashboardItemTexts> {
ProjectProvider projectsProvider;
ProjectViewModel projectsProvider;
@override
Widget build(BuildContext context) {
projectsProvider = Provider.of(context);

@ -0,0 +1,176 @@
import 'package:doctor_app_flutter/core/viewModel/doctor_replay_view_model.dart';
import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart';
import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart';
import 'package:doctor_app_flutter/models/SOAP/my_selected_allergy.dart';
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/patients/profile/SOAP/assessment_page.dart';
import 'package:doctor_app_flutter/widgets/patients/profile/SOAP/objective_page.dart';
import 'package:doctor_app_flutter/widgets/patients/profile/SOAP/plan_page.dart';
import 'package:doctor_app_flutter/widgets/patients/profile/SOAP/subjective/subjective_page.dart';
import 'package:doctor_app_flutter/widgets/shared/Text.dart';
import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import '../patient_profile_widget.dart';
import 'steps_widget.dart';
class AddSOAPIndex extends StatefulWidget {
@override
_AddSOAPIndexState createState() => _AddSOAPIndexState();
}
class _AddSOAPIndexState extends State<AddSOAPIndex>
with TickerProviderStateMixin {
PageController _controller;
int _currentIndex = 0;
List<MySelectedAllergy> myAllergiesList= List();
List<MasterKeyModel> myHistoryList = List();
changePageViewIndex(pageIndex) {
_controller.jumpToPage(pageIndex);
}
@override
void initState() {
// TODO: implement initState
_controller = new PageController();
super.initState();
}
@override
Widget build(BuildContext context) {
final routeArgs = ModalRoute.of(context).settings.arguments as Map;
PatiantInformtion patient = routeArgs['patient'];
return BaseView<DoctorReplayViewModel>(
builder: (_, model, w) => AppScaffold(
baseViewModel: model,
appBarTitle: TranslationBase.of(context).healthRecordInformation,
body: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
decoration:
BoxDecoration(boxShadow: <BoxShadow>[], color: Colors.white),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
AvatarWidget(
Icon(
patient.genderDescription == "Male"
? DoctorApp.male
: DoctorApp.female_icon,
size: 70,
color: Colors.white,
),
),
SizedBox(
width: 20,
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
SizedBox(
height: 5,
),
AppText(
patient.firstName + ' ' + patient.lastName,
color: Colors.black,
fontWeight: FontWeight.bold,
),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AppText(
TranslationBase.of(context).age,
color: Colors.black,
fontWeight: FontWeight.bold,
),
SizedBox(
width: 20,
),
AppText(
patient.age.toString(),
color: Colors.black,
fontWeight: FontWeight.normal,
),
],
),
AppText(
"ALLERGIC TO: FOOD, ASPIRIN, EGG WHITE",
color: Color(0xFFB9382C),
fontWeight: FontWeight.bold,
),
],
)
],
),
),
Container(
width: double.infinity,
height: 1,
color: Color(0xffCCCCCC),
),
SizedBox(
width: 20,
),
FractionallySizedBox(
child: SingleChildScrollView(
child: Container(
height: MediaQuery.of(context).size.height * 0.75,
child: Column(
children: [
Container(
margin: EdgeInsets.only(
left:
MediaQuery.of(context).size.width * 0.05,
right:
MediaQuery.of(context).size.width * 0.05),
child: StepsWidget(
index: _currentIndex,
changeCurrentTab: changePageViewIndex,
),
),
Expanded(
child: PageView(
physics: NeverScrollableScrollPhysics(),
controller: _controller,
onPageChanged: (index) {
setState(() {
_currentIndex = index;
});
},
scrollDirection: Axis.horizontal,
children: <Widget>[
SubjectivePage(changePageViewIndex: changePageViewIndex,myAllergiesList: myAllergiesList,myHistoryList: myHistoryList,),
ObjectivePage(changePageViewIndex: changePageViewIndex,),
AssessmentPage(changePageViewIndex: changePageViewIndex,),
PlanPage(changePageViewIndex: changePageViewIndex,)
],
),
),
],
),
),
),
)
],
),
),
],
),
),
),
);
}
}

@ -0,0 +1,494 @@
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/shared/Text.dart';
import 'package:doctor_app_flutter/widgets/shared/TextFields.dart';
import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/dialogs/dailog-list-select.dart';
import 'package:doctor_app_flutter/widgets/shared/divider_with_spaces_around.dart';
import 'package:doctor_app_flutter/widgets/shared/expandable-widget-header-body.dart';
import 'package:eva_icons_flutter/eva_icons_flutter.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
class AssessmentPage extends StatefulWidget {
final Function changePageViewIndex;
AssessmentPage({Key key, this.changePageViewIndex});
@override
_AssessmentPageState createState() => _AssessmentPageState();
}
class _AssessmentPageState extends State<AssessmentPage> {
bool isAssessmentExpand = false;
List<dynamic> assessmentList;
dynamic _referTo;
TextEditingController remarksController = TextEditingController();
@override
Widget build(BuildContext context) {
final screenSize = MediaQuery.of(context).size;
return AppScaffold(
isShowAppBar: false,
body: SingleChildScrollView(
physics: ScrollPhysics(),
child: Center(
child: FractionallySizedBox(
widthFactor: 0.9,
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
SizedBox(
height: 30,
),
HeaderBodyExpandableNotifier(
headerWidget: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
Texts('ASSESSMENT',
variant: isAssessmentExpand ? "bodyText" : '',
bold: isAssessmentExpand ? true : false,
color: Colors.black),
Icon(
FontAwesomeIcons.asterisk,
color: AppGlobal.appPrimaryColor,
size: 12,
)
],
),
InkWell(
onTap: () {
setState(() {
isAssessmentExpand = !isAssessmentExpand;
});
},
child: Icon(isAssessmentExpand
? EvaIcons.minus
: EvaIcons.plus))
],
),
bodyWidget: Column(children: [
SizedBox(
height: 20,
),
Column(
children: [
Container(
margin: EdgeInsets.only(left: 5, right: 5, top: 15),
child: TextFields(
hintText: "Add ASSESSMENT",
fontSize: 13.5,
onTapTextFields: () {
openAssessmentDialog(context);
},
readOnly: true,
// hintColor: Colors.black,
suffixIcon: EvaIcons.plusCircleOutline,
suffixIconColor: AppGlobal.appPrimaryColor,
fontWeight: FontWeight.w600,
// controller: messageController,
validator: (value) {
if (value == null)
return TranslationBase.of(context)
.emptyMessage;
else
return null;
}),
),
SizedBox(
height: 20,
),
Container(
margin: EdgeInsets.only(left: 5, right: 5, top: 15),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Column(
mainAxisAlignment:
MainAxisAlignment.start,
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
AppText(
"12".toUpperCase(),
fontWeight: FontWeight.bold,
fontSize: 16,
),
AppText(
"DEC".toUpperCase(),
fontSize: 10,
color: Colors.grey,
),
],
)
],
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment:
MainAxisAlignment.start,
children: [
AppText(
"Appointment #: ",
fontWeight: FontWeight.bold,
fontSize: 16,
),
AppText(
"2019054946",
fontSize: 10,
color: Colors.grey,
),
],
),
Row(
mainAxisAlignment:
MainAxisAlignment.start,
children: [
AppText(
"Typhoid Fever",
fontWeight: FontWeight.bold,
fontSize: 16,
),
],
),
Row(
mainAxisAlignment:
MainAxisAlignment.start,
children: [
AppText(
"Type : ",
fontWeight: FontWeight.bold,
fontSize: 16,
),
AppText(
"Possible Diagnosis",
fontSize: 10,
color: Colors.grey,
),
],
),
Row(
mainAxisAlignment:
MainAxisAlignment.start,
children: [
AppText(
"Doc : ",
fontWeight: FontWeight.bold,
fontSize: 16,
),
AppText(
"Anas Abdullah",
fontSize: 10,
color: Colors.grey,
),
],
),
SizedBox(
height: 6,
),
Row(
mainAxisAlignment:
MainAxisAlignment.start,
children: [
SizedBox(
height: 6,
),
AppText(
"Some short remark about the allergy",
fontSize: 10,
color: Colors.grey,
),
],
),
],
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
AppText(
"ICD: ".toUpperCase(),
fontWeight: FontWeight.bold,
fontSize: 16,
),
AppText(
"R07.1".toUpperCase(),
fontSize: 10,
color: Colors.grey,
),
],
)
],
),
Column(
children: [
InkWell(
onTap: () {},
child: Icon(EvaIcons.edit2Outline),
)
],
),
],
),
)
],
)
]),
isExpand: isAssessmentExpand,
),
DividerWithSpacesAround(
height: 30,
),
AppButton(
title: TranslationBase.of(context).next,
onPressed: () {
widget.changePageViewIndex(3);
},
),
SizedBox(
height: 30,
),
],
),
),
),
));
}
openAssessmentDialog(BuildContext context) {
final screenSize = MediaQuery.of(context).size;
InputDecoration textFieldSelectorDecoration(
String hintText, String selectedText, bool isDropDown) {
//TODO: make one Input InputDecoration for all
return InputDecoration(
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
borderRadius: BorderRadius.circular(8),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
borderRadius: BorderRadius.circular(8),
),
disabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
borderRadius: BorderRadius.circular(8),
),
hintText: selectedText != null ? selectedText : hintText,
suffixIcon: isDropDown ? Icon(Icons.arrow_drop_down) : null,
hintStyle: TextStyle(
fontSize: 14,
color: Colors.grey.shade600,
),
);
}
showModalBottomSheet(
backgroundColor: Colors.white,
isScrollControlled: true,
context: context,
builder: (context) {
return FractionallySizedBox(
heightFactor: 0.75,
widthFactor: 0.9,
child: Container(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
height: 16,
),
AppText(
"Add Assessment Details".toUpperCase(),
fontWeight: FontWeight.bold,
fontSize: 16,
),
SizedBox(
height: 16,
),
Container(
height: screenSize.height * 0.070,
child: InkWell(
onTap: assessmentList != null
? () {
ListSelectDialog dialog = ListSelectDialog(
list: assessmentList,
attributeName: 'name',
attributeValueId: 'id',
okText: TranslationBase.of(context).ok,
okFunction: (selectedValue) {
setState(() {
// model.getDoctorBranch().then((value) {
// _selectedBranch = value;
// if (_referTo['id'] == 1) {
// model.getClinics(
// _selectedBranch['ID']);
// }
// });
});
},
);
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
return dialog;
},
);
}
: null,
child: TextField(
decoration: textFieldSelectorDecoration(
"Appointment Number",
_referTo != null ? _referTo['name'] : null,
true),
enabled: false,
),
),
),
SizedBox(
height: 10,
),
Container(
height: screenSize.height * 0.070,
child: InkWell(
onTap: assessmentList != null
? () {
ListSelectDialog dialog = ListSelectDialog(
list: assessmentList,
attributeName: 'name',
attributeValueId: 'id',
okText: TranslationBase.of(context).ok,
okFunction: (selectedValue) {
setState(() {});
},
);
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
return dialog;
},
);
}
: null,
child: TextField(
decoration: textFieldSelectorDecoration("Name or ICD",
_referTo != null ? _referTo['name'] : null, true),
enabled: false,
),
),
),
SizedBox(
height: 10,
),
Container(
height: screenSize.height * 0.070,
child: InkWell(
onTap: assessmentList != null
? () {
ListSelectDialog dialog = ListSelectDialog(
list: assessmentList,
attributeName: 'name',
attributeValueId: 'id',
okText: TranslationBase.of(context).ok,
okFunction: (selectedValue) {
setState(() {});
},
);
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
return dialog;
},
);
}
: null,
child: TextField(
decoration: textFieldSelectorDecoration("Condition",
_referTo != null ? _referTo['name'] : null, true),
enabled: false,
),
),
),
SizedBox(
height: 10,
),
Container(
height: screenSize.height * 0.070,
child: InkWell(
onTap: assessmentList != null
? () {
ListSelectDialog dialog = ListSelectDialog(
list: assessmentList,
attributeName: 'name',
attributeValueId: 'id',
okText: TranslationBase.of(context).ok,
okFunction: (selectedValue) {
setState(() {});
},
);
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
return dialog;
},
);
}
: null,
child: TextField(
decoration: textFieldSelectorDecoration("Type",
_referTo != null ? _referTo['name'] : null, true),
enabled: false,
),
),
),
SizedBox(
height: 10,
),
Container(
margin: EdgeInsets.only(left: 0, right: 0, top: 15),
child: TextFields(
hintText: "Remarks",
fontSize: 13.5,
// hintColor: Colors.black,
fontWeight: FontWeight.w600,
maxLines: 18,
minLines: 8,
controller: remarksController,
validator: (value) {
if (value == null)
return TranslationBase.of(context).emptyMessage;
else
return null;
}),
),
SizedBox(
height: 10,
),
AppButton(
title: "Add".toUpperCase(),
onPressed: () {},
),
])),
);
});
}
}

@ -0,0 +1,502 @@
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/shared/Text.dart';
import 'package:doctor_app_flutter/widgets/shared/TextFields.dart';
import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/divider_with_spaces_around.dart';
import 'package:doctor_app_flutter/widgets/shared/expandable-widget-header-body.dart';
import 'package:eva_icons_flutter/eva_icons_flutter.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:hexcolor/hexcolor.dart';
class ObjectivePage extends StatefulWidget {
final Function changePageViewIndex;
ObjectivePage({Key key, this.changePageViewIndex});
@override
_ObjectivePageState createState() => _ObjectivePageState();
}
class _ObjectivePageState extends State<ObjectivePage> {
bool isSysExaminationExpand = false;
List<dynamic> examinationsList;
TextEditingController remarksController = TextEditingController();
BoxDecoration containerBorderDecoration(
Color containerColor, Color borderColor) {
return BoxDecoration(
color: containerColor,
shape: BoxShape.rectangle,
borderRadius: BorderRadius.all(Radius.circular(6)),
border: Border.fromBorderSide(BorderSide(
color: borderColor,
width: 0.5,
)),
);
}
@override
Widget build(BuildContext context) {
final screenSize = MediaQuery.of(context).size;
return AppScaffold(
isShowAppBar: false,
body: SingleChildScrollView(
physics: ScrollPhysics(),
child: Center(
child: FractionallySizedBox(
widthFactor: 0.9,
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
SizedBox(
height: 30,
),
HeaderBodyExpandableNotifier(
headerWidget: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
Texts('Physical/System Examination',
variant:
isSysExaminationExpand ? "bodyText" : '',
bold: isSysExaminationExpand ? true : false,
color: Colors.black),
Icon(
FontAwesomeIcons.asterisk,
color: AppGlobal.appPrimaryColor,
size: 12,
)
],
),
InkWell(
onTap: () {
setState(() {
isSysExaminationExpand =
!isSysExaminationExpand;
});
},
child: Icon(isSysExaminationExpand
? EvaIcons.minus
: EvaIcons.plus))
],
),
bodyWidget: Column(children: [
SizedBox(
height: 20,
),
Column(
children: [
Container(
margin:
EdgeInsets.only(left: 10, right: 10, top: 15),
child: TextFields(
hintText: "Add Examination",
fontSize: 13.5,
onTapTextFields: () {
openExaminationList(context);
},
readOnly: true,
// hintColor: Colors.black,
suffixIcon: EvaIcons.plusCircleOutline,
suffixIconColor: AppGlobal.appPrimaryColor,
fontWeight: FontWeight.w600,
// controller: messageController,
validator: (value) {
if (value == null)
return TranslationBase.of(context)
.emptyMessage;
else
return null;
}),
),
SizedBox(
height: 20,
),
Container(
margin:
EdgeInsets.only(left: 15, right: 15, top: 15),
child: Column(
children: [
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Texts('Abdomen'.toUpperCase(),
variant: "bodyText",
bold: true,
color: Colors.black)
],
),
SizedBox(
height: 8,
),
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
InkWell(
child: Center(
child: Container(
height: screenSize.height * 0.070,
decoration: containerBorderDecoration(
Colors.white,Colors.grey
),
child: Center(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
"Normal",
style: TextStyle(
fontSize: 12,
color:
Colors.black, //Colors.black,
fontWeight: FontWeight.bold,
),
),
),
)),
),
onTap: () {
}),
SizedBox(width: 12,),
InkWell(
child: Center(
child: Container(
height: screenSize.height * 0.070,
decoration: containerBorderDecoration(
Color(0xFF515A5D), Colors.black
),
child: Center(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
"Abnormal",
style: TextStyle(
fontSize: 12,
color:
Colors.white, //Colors.black,
fontWeight: FontWeight.bold,
),
),
),
)),
),
onTap: () {
}),
],
),
Icon(
FontAwesomeIcons.trash,
color: Colors.grey,
size: 20,
)
],
),
SizedBox(
height: 20,
),
Container(
margin: EdgeInsets.only(left: 10, right: 10, top: 15),
child: TextFields(
hintText: "Remarks",
fontSize: 13.5,
// hintColor: Colors.black,
fontWeight: FontWeight.w600,
maxLines: 25,
minLines: 13,
controller: remarksController,
validator: (value) {
if (value == null)
return TranslationBase.of(context).emptyMessage;
else
return null;
}),
),
SizedBox(
height: 20,
),
],
),
)
],
)
]),
isExpand: isSysExaminationExpand,
),
DividerWithSpacesAround(height: 30,),
AppButton(
title: TranslationBase.of(context).next,
onPressed: () {
widget.changePageViewIndex(2);
},
),
SizedBox(
height: 30,
),
],
),
),
),
));
}
openExaminationList(BuildContext context) {
final screenSize = MediaQuery.of(context).size;
InputDecoration textFieldSelectorDecoration(
String hintText, String selectedText, bool isDropDown) {
return InputDecoration(
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
borderRadius: BorderRadius.circular(8),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
borderRadius: BorderRadius.circular(8),
),
disabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
borderRadius: BorderRadius.circular(8),
),
hintText: selectedText != null ? selectedText : hintText,
suffixIcon: isDropDown ? Icon(Icons.arrow_drop_down) : null,
hintStyle: TextStyle(
fontSize: 14,
color: Colors.grey.shade600,
),
);
}
;
showModalBottomSheet(
backgroundColor: Colors.white,
isScrollControlled: true,
context: context,
builder: (context) {
return FractionallySizedBox(
heightFactor: 0.7,
child: Container(
child: FractionallySizedBox(
widthFactor: 0.9,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
height: 16,
),
AppText(
"Examinations",
fontWeight: FontWeight.bold,
fontSize: 16,
),
SizedBox(
height: 16,
),
Container(
height: MediaQuery.of(context).size.height * 0.5,
child: Center(
child: Container(
margin: EdgeInsets.only(top: 15),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
color: Colors.white),
child: ListView(
children: [
Column(
children: [
Row(
children: [
Checkbox(
value: true,
activeColor: Colors.red[800],
onChanged: (bool newValue) {
setState(() {});
}),
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 10, vertical: 0),
child: Texts('Examinations',
variant: "bodyText",
bold: true,
color: Colors.black),
),
),
],
),
DividerWithSpacesAround(),
Row(
children: [
Checkbox(
value: true,
activeColor: Colors.red[800],
onChanged: (bool newValue) {
setState(() {});
}),
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 10, vertical: 0),
child: Texts('Examinations',
variant: "bodyText",
bold: true,
color: Colors.black),
),
),
],
),
DividerWithSpacesAround(),
Row(
children: [
Checkbox(
value: true,
activeColor: Colors.red[800],
onChanged: (bool newValue) {
setState(() {});
}),
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 10, vertical: 0),
child: Texts('Examinations',
variant: "bodyText",
bold: true,
color: Colors.black),
),
),
],
),
DividerWithSpacesAround(),
Row(
children: [
Checkbox(
value: true,
activeColor: Colors.red[800],
onChanged: (bool newValue) {
setState(() {});
}),
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 10, vertical: 0),
child: Texts('Examinations',
variant: "bodyText",
bold: true,
color: Colors.black),
),
),
],
),
DividerWithSpacesAround(),
Row(
children: [
Checkbox(
value: true,
activeColor: Colors.red[800],
onChanged: (bool newValue) {
setState(() {});
}),
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 10, vertical: 0),
child: Texts('Examinations',
variant: "bodyText",
bold: true,
color: Colors.black),
),
),
],
),
DividerWithSpacesAround(),
Row(
children: [
Checkbox(
value: true,
activeColor: Colors.red[800],
onChanged: (bool newValue) {
setState(() {});
}),
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 10, vertical: 0),
child: Texts('Examinations',
variant: "bodyText",
bold: true,
color: Colors.black),
),
),
],
),
DividerWithSpacesAround(),
Row(
children: [
Checkbox(
value: true,
activeColor: Colors.red[800],
onChanged: (bool newValue) {
setState(() {});
}),
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 10, vertical: 0),
child: Texts('Examinations',
variant: "bodyText",
bold: true,
color: Colors.black),
),
),
],
),
DividerWithSpacesAround(),
Row(
children: [
Checkbox(
value: true,
activeColor: Colors.red[800],
onChanged: (bool newValue) {
setState(() {});
}),
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 10, vertical: 0),
child: Texts('Examinations',
variant: "bodyText",
bold: true,
color: Colors.black),
),
),
],
),
DividerWithSpacesAround(),
],
),
],
),
)),
),
SizedBox(
height: 10,
),
AppButton(
title: "Add SELECTED Examinations".toUpperCase(),
onPressed: () {},
),
]),
)),
);
});
}
}

@ -0,0 +1,320 @@
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/shared/Text.dart';
import 'package:doctor_app_flutter/widgets/shared/TextFields.dart';
import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/divider_with_spaces_around.dart';
import 'package:doctor_app_flutter/widgets/shared/expandable-widget-header-body.dart';
import 'package:eva_icons_flutter/eva_icons_flutter.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
class PlanPage extends StatefulWidget {
final Function changePageViewIndex;
PlanPage({Key key, this.changePageViewIndex});
@override
_PlanPageState createState() => _PlanPageState();
}
class _PlanPageState extends State<PlanPage> {
bool isProgressNoteExpand = false;
List<dynamic> progressNoteList;
TextEditingController progressNoteController = TextEditingController();
BoxDecoration containerBorderDecoration(
Color containerColor, Color borderColor) {
return BoxDecoration(
color: containerColor,
shape: BoxShape.rectangle,
borderRadius: BorderRadius.all(Radius.circular(6)),
border: Border.fromBorderSide(BorderSide(
color: borderColor,
width: 0.5,
)),
);
}
@override
Widget build(BuildContext context) {
final screenSize = MediaQuery.of(context).size;
return AppScaffold(
isShowAppBar: false,
body: SingleChildScrollView(
physics: ScrollPhysics(),
child: Center(
child: FractionallySizedBox(
widthFactor: 0.9,
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
SizedBox(
height: 30,
),
HeaderBodyExpandableNotifier(
headerWidget: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
Texts('Progress Note',
variant:
isProgressNoteExpand ? "bodyText" : '',
bold: isProgressNoteExpand ? true : false,
color: Colors.black),
Icon(
FontAwesomeIcons.asterisk,
color: AppGlobal.appPrimaryColor,
size: 12,
)
],
),
InkWell(
onTap: () {
setState(() {
isProgressNoteExpand =
!isProgressNoteExpand;
});
},
child: Icon(isProgressNoteExpand
? EvaIcons.minus
: EvaIcons.plus))
],
),
bodyWidget: Column(children: [
SizedBox(
height: 20,
),
Column(
children: [
Container(
margin:
EdgeInsets.only(left: 10, right: 10, top: 15),
child: TextFields(
hintText: "Add Progress Note",
fontSize: 13.5,
onTapTextFields: () {
openExaminationList(context);
},
readOnly: true,
// hintColor: Colors.black,
suffixIcon: EvaIcons.plusCircleOutline,
suffixIconColor: AppGlobal.appPrimaryColor,
fontWeight: FontWeight.w600,
// controller: messageController,
validator: (value) {
if (value == null)
return TranslationBase.of(context)
.emptyMessage;
else
return null;
}),
),
SizedBox(
height: 20,
),
Container(
margin: EdgeInsets.only(left: 5, right: 5, top: 15),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Column(
mainAxisAlignment:
MainAxisAlignment.start,
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
AppText(
"12".toUpperCase(),
fontWeight: FontWeight.bold,
fontSize: 16,
),
AppText(
"DEC".toUpperCase(),
fontSize: 10,
color: Colors.grey,
),
],
)
],
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment:
MainAxisAlignment.start,
children: [
SizedBox(
height: 6,
),
Padding(
padding: const EdgeInsets.all(0.0),
child: AppText(
"Some progress note about",
fontSize: 10,
color: Colors.grey,
),
),
],
),SizedBox(
height: 8,
),
Row(
mainAxisAlignment:
MainAxisAlignment.start,
children: [
AppText(
"Created By : ",
fontWeight: FontWeight.bold,
fontSize: 16,
),
AppText(
"Anas Abdullah on 12 De",
fontSize: 10,
color: Colors.grey,
),
],
),
Row(
mainAxisAlignment:
MainAxisAlignment.start,
children: [
AppText(
"Edited By : ",
fontWeight: FontWeight.bold,
fontSize: 16,
),
AppText(
"Rahim on 13 Dec",
fontSize: 10,
color: Colors.grey,
),
],
),
],
),
Column(
children: [
InkWell(
onTap: () {},
child: Icon(EvaIcons.edit2Outline),
)
],
),
],
),
)
],
)
]),
isExpand: isProgressNoteExpand,
),
DividerWithSpacesAround(height: 30,),
AppButton(
title: TranslationBase.of(context).next,
onPressed: () {
widget.changePageViewIndex(2);
},
),
SizedBox(
height: 30,
),
],
),
),
),
));
}
openExaminationList(BuildContext context) {
final screenSize = MediaQuery.of(context).size;
InputDecoration textFieldSelectorDecoration(
String hintText, String selectedText, bool isDropDown) {
return InputDecoration(
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
borderRadius: BorderRadius.circular(8),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
borderRadius: BorderRadius.circular(8),
),
disabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
borderRadius: BorderRadius.circular(8),
),
hintText: selectedText != null ? selectedText : hintText,
suffixIcon: isDropDown ? Icon(Icons.arrow_drop_down) : null,
hintStyle: TextStyle(
fontSize: 14,
color: Colors.grey.shade600,
),
);
}
;
showModalBottomSheet(
backgroundColor: Colors.white,
isScrollControlled: true,
context: context,
builder: (context) {
return FractionallySizedBox(
heightFactor: 0.5,
child: Container(
child: FractionallySizedBox(
widthFactor: 0.9,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
height: 16,
),
AppText(
"Add Progress Note",
fontWeight: FontWeight.bold,
fontSize: 16,
),
SizedBox(
height: 10,
),
Container(
margin: EdgeInsets.only(left: 0, right: 0, top: 15),
child: TextFields(
hintText: "Remarks",
fontSize: 13.5,
// hintColor: Colors.black,
fontWeight: FontWeight.w600,
maxLines: 16,
minLines: 8,
controller: progressNoteController,
validator: (value) {
if (value == null)
return TranslationBase.of(context).emptyMessage;
else
return null;
}),
),SizedBox(
height: 10,
),
AppButton(
title: "Add".toUpperCase(),
onPressed: () {
},
),
]),
)),
);
});
}
}

@ -0,0 +1,447 @@
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
import 'package:doctor_app_flutter/widgets/shared/Text.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class StepsWidget extends StatelessWidget {
final int index;
final Function changeCurrentTab;
StepsWidget({Key key, this.index, this.changeCurrentTab});
// TODO : Add translation to name
@override
Widget build(BuildContext context) {
ProjectViewModel projectViewModel = Provider.of(context);
return !projectViewModel.isArabic
? Stack(
children: [
Container(
height: 120,
width: MediaQuery.of(context).size.width,
color: Colors.transparent,
child: Center(
child: Divider(
color: Colors.grey,
height: 0.75,
thickness: 0.75,
),
),
),
Positioned(
top: index == 0 ? 15 : 30,
left: 0,
child: InkWell(
onTap: () => changeCurrentTab(0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: index == 0 ? 70 : 50,
height: index == 0 ? 70 : 50,
decoration: BoxDecoration(
border: index == 0
? Border.all(color: Color(0xFFB9382C), width: 2)
: index > 0
? null
: Border.all(
color: Colors.black, width: 0.75),
shape: BoxShape.circle,
color: index == 0
? Colors.white
: index > 0
? Color(0xFFB9382C)
: Color(0xFFCCCCCC),
),
child: Center(
child: Texts(
'1',
variant: index == 0 ? "heading2" : "",
bold: true,
color: index == 0
? Colors.black
: index > 0
? Colors.white
: Colors.grey,
),
),
),
SizedBox(
height: index == 0 ? 5 : 10,
),
Texts('SUBJECTIVE',
variant: "bodyText",
bold: true,
color: Colors.black),
],
),
),
),
Positioned(
top: index == 1 ? 15 : 30,
left: MediaQuery.of(context).size.width * 0.28,
child: InkWell(
onTap: () => index >= 2 ? changeCurrentTab(1) : null,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: index == 1 ? 70 : 50,
height: index == 1 ? 70 : 50,
decoration: BoxDecoration(
border: index == 1
? Border.all(color: Color(0xFFB9382C), width: 2)
: index > 2
? null
: Border.all(
color: Color(0xFFCCCCCC), width: 0.75),
shape: BoxShape.circle,
color: index == 1
? Colors.white
: index > 1
? Color(0xFFB9382C)
: Color(0xFFCCCCCC),
),
child: Center(
child: Texts(
'2',
variant: index == 1 ? "heading2" : '',
bold: true,
color: index == 1
? Colors.black
: index > 1
? Colors.white
: Colors.grey,
),
),
),
SizedBox(
height: index == 1 ? 5 : 10,
),
Texts('OBJECTIVE',
variant: "bodyText",
bold: true,
color: Colors.black),
],
),
),
),
Positioned(
top: index == 2 ? 15 : 30,
left: MediaQuery.of(context).size.width * 0.52,
child: InkWell(
onTap: () => index >= 2 ? changeCurrentTab(3) : null,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: index == 2 ? 70 : 50,
height: index == 2 ? 70 : 50,
decoration: BoxDecoration(
border: index == 2
? Border.all(color: Color(0xFFB9382C), width: 2)
: index > 2
? null
: Border.all(
color: Color(0xFFCCCCCC), width: 0.75),
shape: BoxShape.circle,
color: index == 2
? Colors.white
: index > 2
? Color(0xFFB9382C)
: Color(0xFFCCCCCC),
),
child: Center(
child: Texts(
'3',
variant: index == 2 ? "heading2" : '',
bold: true,
color: index == 2
? Colors.black
: index > 2
? Colors.white
: Colors.grey,
),
),
),
SizedBox(
height: index == 2 ? 5 : 10,
),
Texts('ASSESSMENT',
variant: "bodyText",
bold: true,
color: Colors.black),
],
),
),
),
Positioned(
top: index == 3 ? 15 : 30,
right: 0,
child: InkWell(
onTap: () => index >= 3 ? changeCurrentTab(4) : null,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: index == 3 ? 70 : 50,
height: index == 3 ? 70 : 50,
decoration: BoxDecoration(
border: index == 3
? Border.all(color: Color(0xFFB9382C), width: 2)
: index > 3
? null
: Border.all(
color: Color(0xFFCCCCCC), width: 0.75),
shape: BoxShape.circle,
color: index == 3
? Colors.white
: index > 3
? Color(0xFFB9382C)
: Color(0xFFCCCCCC),
),
child: Center(
child: Texts(
'4',
variant: index == 3 ? "heading2" : '',
bold: true,
color: index == 3
? Colors.black
: index > 3
? Colors.white
: Colors.grey,
),
),
),
SizedBox(
height: index == 3 ? 5 : 10,
),
Texts('PLAN',
variant: "bodyText",
bold: true,
color: Colors.black),
],
),
),
),
],
)
: Stack(
children: [
Container(
height: 120,
width: MediaQuery.of(context).size.width,
color: Colors.transparent,
child: Center(
child: Divider(
color: Colors.grey,
height: 0.75,
thickness: 0.75,
),
),
),
Positioned(
top: index == 0 ? 15 : 30,
right: 0,
child: InkWell(
onTap: () => changeCurrentTab(0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: index == 0 ? 70 : 50,
height: index == 0 ? 70 : 50,
decoration: BoxDecoration(
border: index == 0
? Border.all(color: Color(0xFFB9382C), width: 2)
: index > 0
? null
: Border.all(
color: Colors.black, width: 0.75),
shape: BoxShape.circle,
color: index == 0
? Colors.white
: index > 0
? Color(0xFFB9382C)
: Color(0xFFCCCCCC),
),
child: Center(
child: Texts(
'1',
variant: index == 0 ? "heading2" : "",
bold: true,
color: index == 0
? Colors.black
: index > 0
? Colors.white
: Colors.grey,
),
),
),
SizedBox(
height: index == 0 ? 5 : 10,
),
Texts('SUBJECTIVE',
variant: "bodyText",
bold: true,
color: Colors.black),
],
),
),
),
Positioned(
top: index == 1 ? 15 : 30,
right: MediaQuery.of(context).size.width * 0.28,
child: InkWell(
onTap: () => index >= 2 ? changeCurrentTab(1) : null,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: index == 1 ? 70 : 50,
height: index == 1 ? 70 : 50,
decoration: BoxDecoration(
border: index == 1
? Border.all(color: Color(0xFFB9382C), width: 2)
: index > 2
? null
: Border.all(
color: Color(0xFFCCCCCC), width: 0.75),
shape: BoxShape.circle,
color: index == 1
? Colors.white
: index > 1
? Color(0xFFB9382C)
: Color(0xFFCCCCCC),
),
child: Center(
child: Texts(
'2',
variant: index == 1 ? "heading2" : '',
bold: true,
color: index == 1
? Colors.black
: index > 1
? Colors.white
: Colors.grey,
),
),
),
SizedBox(
height: index == 1 ? 5 : 10,
),
Texts('OBJECTIVE',
variant: "bodyText",
bold: true,
color: Colors.black),
],
),
),
),
Positioned(
top: index == 2 ? 15 : 30,
right: MediaQuery.of(context).size.width * 0.52,
child: InkWell(
onTap: () => index >= 2 ? changeCurrentTab(3) : null,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: index == 2 ? 70 : 50,
height: index == 2 ? 70 : 50,
decoration: BoxDecoration(
border: index == 2
? Border.all(color: Color(0xFFB9382C), width: 2)
: index > 2
? null
: Border.all(
color: Color(0xFFCCCCCC), width: 0.75),
shape: BoxShape.circle,
color: index == 2
? Colors.white
: index > 2
? Color(0xFFB9382C)
: Color(0xFFCCCCCC),
),
child: Center(
child: Texts(
'3',
variant: index == 2 ? "heading2" : '',
bold: true,
color: index == 2
? Colors.black
: index > 2
? Colors.white
: Colors.grey,
),
),
),
SizedBox(
height: index == 2 ? 5 : 10,
),
Padding(
padding: const EdgeInsets.only(right: 2),
child: Texts('ASSESSMENT',
variant: "bodyText",
bold: true,
color: Colors.black),
),
],
),
),
),
Positioned(
top: index == 3 ? 15 : 30,
left: 0,
child: InkWell(
onTap: () => index >= 3 ? changeCurrentTab(4) : null,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: index == 3 ? 70 : 50,
height: index == 3 ? 70 : 50,
decoration: BoxDecoration(
border: index == 3
? Border.all(color: Color(0xFFB9382C), width: 2)
: index > 3
? null
: Border.all(
color: Color(0xFFCCCCCC), width: 0.75),
shape: BoxShape.circle,
color: index == 3
? Colors.white
: index > 3
? Color(0xFFB9382C)
: Color(0xFFCCCCCC),
),
child: Center(
child: Texts(
'4',
variant: index == 3 ? "heading2" : '',
bold: true,
color: index == 3
? Colors.black
: index > 3
? Colors.white
: Colors.grey,
),
),
),
SizedBox(
height: index == 3 ? 5 : 10,
),
Texts('PLAN',
variant: "bodyText",
bold: true,
color: Colors.black),
],
),
),
),
],
);
}
}

@ -0,0 +1,343 @@
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/core/enum/master_lookup_key.dart';
import 'package:doctor_app_flutter/core/viewModel/SOAP_view_model.dart';
import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart';
import 'package:doctor_app_flutter/models/SOAP/my_selected_allergy.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/shared/Text.dart';
import 'package:doctor_app_flutter/widgets/shared/TextFields.dart';
import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/dialogs/master_key_dailog.dart';
import 'package:eva_icons_flutter/eva_icons_flutter.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
class AddAllergiesWidget extends StatefulWidget {
final List<MySelectedAllergy> myAllergiesList;
AddAllergiesWidget({Key key, this.myAllergiesList});
@override
_AddAllergiesWidgetState createState() => _AddAllergiesWidgetState();
}
class _AddAllergiesWidgetState extends State<AddAllergiesWidget> {
TextEditingController remarkController = TextEditingController();
@override
Widget build(BuildContext context) {
final screenSize = MediaQuery.of(context).size;
return Column(
children: [
Container(
margin: EdgeInsets.only(left: 10, right: 10, top: 15),
child: TextFields(
hintText: "Add Allergies",
fontSize: 13.5,
onTapTextFields: () {
openAllergiesList(context);
},
readOnly: true,
// hintColor: Colors.black,
suffixIcon: EvaIcons.plusCircleOutline,
suffixIconColor: AppGlobal.appPrimaryColor,
fontWeight: FontWeight.w600,
// controller: messageController,
validator: (value) {
if (value == null)
return TranslationBase
.of(context)
.emptyMessage;
else
return null;
}),
),
SizedBox(
height: 20,
),
Container(
margin:
EdgeInsets.only(left: 15, right: 15, top: 15),
child: Column(
children: widget.myAllergiesList.map((selectedAllergy) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Texts(selectedAllergy.selectedAllergy.nameEn.toUpperCase(),
variant: "bodyText", bold: true, color: Colors.black),
Texts(
selectedAllergy.selectedAllergySeverity.nameEn
.toUpperCase(),
variant: "bodyText",
bold: true,
color: AppGlobal.appPrimaryColor),
InkWell(
child: Icon(
FontAwesomeIcons.trash,
color: Colors.grey,
size: 20,
),
onTap: () => removeAllergy(selectedAllergy),
)
],
),
SizedBox(
height: 10,
),
],
);
}).toList()),
)
],
);
}
removeAllergy(MySelectedAllergy mySelectedAllergy) {
Iterable<MySelectedAllergy> allergy =
widget.myAllergiesList.where((element) => mySelectedAllergy == element);
if (allergy.length > 0)
setState(() {
widget.myAllergiesList.remove(allergy.first);
});
}
openAllergiesList(BuildContext context) {
showModalBottomSheet(
backgroundColor: Colors.white,
isScrollControlled: true,
context: context,
builder: (context) {
return AddAllergies(
addAllergiesFun: (MySelectedAllergy mySelectedAllergy) {
setState(() {
widget.myAllergiesList.add(mySelectedAllergy);
Navigator.of(context).pop();
});
},);
});
}
}
class AddAllergies extends StatefulWidget {
final Function addAllergiesFun;
const AddAllergies({Key key, this.addAllergiesFun}) : super(key: key);
@override
_AddAllergiesState createState() => _AddAllergiesState();
}
class _AddAllergiesState extends State<AddAllergies> {
List<MasterKeyModel> allergiesList;
List<MasterKeyModel> allergySeverityList;
MasterKeyModel _selectedAllergySeverity;
MasterKeyModel _selectedAllergy;
TextEditingController remarkController = TextEditingController();
InputDecoration textFieldSelectorDecoration(String hintText,
String selectedText, bool isDropDown) {
return InputDecoration(
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
borderRadius: BorderRadius.circular(8),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
borderRadius: BorderRadius.circular(8),
),
disabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
borderRadius: BorderRadius.circular(8),
),
hintText: selectedText != null ? selectedText : hintText,
suffixIcon: isDropDown ? Icon(Icons.arrow_drop_down) : null,
hintStyle: TextStyle(
fontSize: 14,
color: Colors.grey.shade600,
),
);
}
@override
Widget build(BuildContext context) {
final screenSize = MediaQuery
.of(context)
.size;
return FractionallySizedBox(
heightFactor: 0.7,
child: BaseView<SOAPViewModel>(
onModelReady: (model) async {
if (model.listOfAllergies.length == 0) {
await model.getMasterLookup(MasterKeysService.Allergies);
}
if (model.allergySeverityList.length == 0) {
await model.getMasterLookup(MasterKeysService.AllergySeverity);
}
},
builder: (_, model, w) =>
AppScaffold(
baseViewModel: model,
isShowAppBar: false,
body: SingleChildScrollView(
child: Center(
child: FractionallySizedBox(
widthFactor: 0.9,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
height: 16,
),
AppText(
"Add Allergy",
fontWeight: FontWeight.bold,
fontSize: 16,
),
SizedBox(
height: 16,
),
Container(
height: screenSize.height * 0.070,
child: InkWell(
onTap: model.listOfAllergies != null
? () {
MasterKeyDailog dialog = MasterKeyDailog(
list: model.listOfAllergies,
okText: TranslationBase
.of(context)
.ok,
okFunction: (MasterKeyModel selectedValue) {
setState(() {
_selectedAllergy = selectedValue;
});
},
);
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
return dialog;
},
);
}
: null,
child: TextField(
decoration: textFieldSelectorDecoration(
"Select Allergy",
_selectedAllergy != null
? _selectedAllergy.nameEn
: null,
true),
enabled: false,
),
),
),
SizedBox(
height: 10,
), Container(
height: screenSize.height * 0.070,
child: InkWell(
onTap: model.allergySeverityList != null
? () {
MasterKeyDailog dialog = MasterKeyDailog(
list: model.allergySeverityList,
okText: TranslationBase
.of(context)
.ok,
okFunction: (selectedValue) {
setState(() {
_selectedAllergySeverity =
selectedValue;
// model.getDoctorBranch().then((value) {
// _selectedBranch = value;
// if (_referTo['id'] == 1) {
// model.getClinics(
// _selectedBranch['ID']);
// }
// });
});
},
);
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
return dialog;
},
);
}
: null,
child: TextField(
decoration: textFieldSelectorDecoration(
"Select Severity",
_selectedAllergySeverity != null
? _selectedAllergySeverity.nameEn
: null,
true),
enabled: false,
),
),
),
SizedBox(
height: 10,
),
Container(
margin: EdgeInsets.only(
left: 0, right: 0, top: 15),
child: TextFields(
hintText: "Remarks",
fontSize: 13.5,
// hintColor: Colors.black,
fontWeight: FontWeight.w600,
maxLines: 25,
minLines: 13,
controller: remarkController,
validator: (value) {
if (value == null)
return TranslationBase
.of(context)
.emptyMessage;
else
return null;
}),
), SizedBox(
height: 10,
),
AppButton(
title: "Add".toUpperCase(),
onPressed: () {
MySelectedAllergy mySelectedAllergy = new MySelectedAllergy(
remark: remarkController.text,
selectedAllergy: _selectedAllergy,
selectedAllergySeverity: _selectedAllergySeverity);
widget.addAllergiesFun(mySelectedAllergy);
},
),
]
),
),
),
)),
),
);
}
}

@ -0,0 +1,574 @@
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/core/enum/master_lookup_key.dart';
import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/viewModel/SOAP_view_model.dart';
import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/shared/Text.dart';
import 'package:doctor_app_flutter/widgets/shared/TextFields.dart';
import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/divider_with_spaces_around.dart';
import 'package:doctor_app_flutter/widgets/shared/network_base_view.dart';
import 'package:eva_icons_flutter/eva_icons_flutter.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:hexcolor/hexcolor.dart';
class AddHistoryWidget extends StatefulWidget {
final List<MasterKeyModel> myHistoryList;
const AddHistoryWidget({Key key, this.myHistoryList}) : super(key: key);
@override
_AddHistoryWidgetState createState() => _AddHistoryWidgetState();
}
class _AddHistoryWidgetState extends State<AddHistoryWidget>
with TickerProviderStateMixin {
PageController _controller;
int _currentIndex = 0;
changePageViewIndex(pageIndex) {
_controller.jumpToPage(pageIndex);
}
@override
void initState() {
_controller = new PageController();
super.initState();
}
@override
Widget build(BuildContext context) {
return Column(
children: [
Container(
margin: EdgeInsets.only(left: 10, right: 10, top: 15),
child: TextFields(
hintText: "Add History",
fontSize: 13.5,
onTapTextFields: () {
openHistoryList(context);
},
readOnly: true,
// hintColor: Colors.black,
suffixIcon: EvaIcons.plusCircleOutline,
suffixIconColor: AppGlobal.appPrimaryColor,
fontWeight: FontWeight.w600,
// controller: messageController,
validator: (value) {
if (value == null)
return TranslationBase.of(context)
.emptyMessage;
else
return null;
}),
),
SizedBox(
height: 20,
),
Container(
margin:
EdgeInsets.only(left: 15, right: 15, top: 15),
child: Column(
children: widget.myHistoryList.map((myHistory) {
return Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Texts(myHistory.nameEn,
variant: "bodyText", bold: true, color: Colors.black),
InkWell(
child: Icon(
FontAwesomeIcons.trash,
color: Colors.grey,
size: 20,
),
onTap: () => removeHistory(myHistory),
)
],
),
SizedBox(
height: 20,
),
],
);
}).toList(),
),
)
],
);
}
removeHistory(MasterKeyModel masterKey) {
Iterable<MasterKeyModel> history = widget.myHistoryList.where((element) =>
masterKey.id == element.id && masterKey.typeId == element.typeId);
if (history.length > 0)
setState(() {
widget.myHistoryList.remove(history.first);
});
}
openHistoryList(BuildContext context) {
showModalBottomSheet(
backgroundColor: Colors.white,
isScrollControlled: true,
context: context,
builder: (context) {
return AddHistoryDialog(
changePageViewIndex: changePageViewIndex,
controller: _controller,
myHistoryList: widget.myHistoryList,
addSelectedHistories: () {
setState(() {
Navigator.of(context).pop();
});
},
removeHistory: (masterKey) => removeHistory(masterKey),
);
});
}
}
class PriorityBar extends StatefulWidget {
final Function onTap;
const PriorityBar({Key key, this.onTap}) : super(key: key);
@override
_PriorityBarState createState() => _PriorityBarState();
}
class _PriorityBarState extends State<PriorityBar> {
int _activePriority = 0;
List<String> _priorities = [
"Family",
"Surgical/Sports",
"Medical",
];
BoxDecoration containerBorderDecoration(
Color containerColor, Color borderColor) {
return BoxDecoration(
color: containerColor,
shape: BoxShape.rectangle,
borderRadius: BorderRadius.all(Radius.circular(6)),
border: Border.fromBorderSide(BorderSide(
color: borderColor,
width: 2.0,
)),
);
}
@override
Widget build(BuildContext context) {
final screenSize = MediaQuery.of(context).size;
return Container(
height: screenSize.height * 0.070,
decoration:
containerBorderDecoration(Color(0Xffffffff), Color(0xFFCCCCCC)),
child: Row(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.center,
children: _priorities.map((item) {
bool _isActive = _priorities[_activePriority] == item ? true : false;
return Expanded(
child: InkWell(
child: Center(
child: Container(
height: screenSize.height * 0.070,
decoration: containerBorderDecoration(
_isActive ? HexColor("#B8382B") : Colors.white,
_isActive ? HexColor("#B8382B") : Colors.white),
child: Center(
child: Text(
item,
style: TextStyle(
fontSize: 12,
color: _isActive
? Colors.white
: Colors.black, //Colors.black,
fontWeight: FontWeight.bold,
),
),
)),
),
onTap: () {
widget.onTap(_priorities.indexOf(item));
setState(() {
_activePriority = _priorities.indexOf(item);
});
}),
);
}).toList(),
),
);
}
}
class AddHistoryDialog extends StatefulWidget {
final Function changePageViewIndex;
final PageController controller;
final List<MasterKeyModel> myHistoryList;
final Function addSelectedHistories;
final Function (MasterKeyModel) removeHistory;
const AddHistoryDialog(
{Key key, this.changePageViewIndex, this.controller, this.myHistoryList, this.addSelectedHistories, this.removeHistory})
: super(key: key);
@override
_AddHistoryDialogState createState() => _AddHistoryDialogState();
}
class _AddHistoryDialogState extends State<AddHistoryDialog> {
@override
Widget build(BuildContext context) {
return FractionallySizedBox(
heightFactor: 0.7,
child: BaseView<SOAPViewModel>(
onModelReady: (model) async {
if (model.historyFamilyList.length == 0) {
await model.getMasterLookup(MasterKeysService.HistoryFamily);
}
},
builder: (_, model, w) => AppScaffold(
// baseViewModel: model,
isShowAppBar: false,
body: Center(
child: Container(
child: FractionallySizedBox(
widthFactor: 0.9,
child: Column(
children: [
SizedBox(
height: 10,
),
PriorityBar(onTap: (activePriority) async {
widget.changePageViewIndex(activePriority);
if(activePriority ==1) {
if (model.historySurgicalList.length == 0) {
await model.getMasterLookup(MasterKeysService.HistorySurgical);
await model.getMasterLookup(MasterKeysService.HistorySports);
}
}
if(activePriority ==2) {
if (model.historyMedicalList.length == 0) {
await model.getMasterLookup(MasterKeysService.HistoryMedical);
}
}
}),
SizedBox(
height: 20,
),
Expanded(
child: PageView(
physics: NeverScrollableScrollPhysics(),
controller: widget.controller,
onPageChanged: (index) {
setState(() {
// currentIndex = index;
});
},
scrollDirection: Axis.horizontal,
children: <Widget>[
Container(
child: Column(
children: [
NetworkBaseView(
baseViewModel: model,
child: Container(
height:
MediaQuery.of(context).size.height * 0.5,
child: Center(
child: Container(
margin: EdgeInsets.only(top: 15),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
color: Colors.white),
child: ListView(
children: [
Column(
children: model.historyFamilyList
.map((historyInfo) {
return Column(
children: [
Row(
children: [
Checkbox(
value: isServiceSelected(
historyInfo),
activeColor:
Colors.red[800],
onChanged:
(bool newValue) {
setState(() {
if (isServiceSelected(
historyInfo
)) {
widget
.removeHistory(
historyInfo
);
}
else {
widget
.myHistoryList
.add(
historyInfo);
}
});
}),
Expanded(
child: Padding(
padding:
const EdgeInsets
.symmetric(
horizontal: 10,
vertical: 0),
child: Texts(
historyInfo.nameEn,
variant: "bodyText",
bold: true,
color:
Colors.black),
),
),
],
),
DividerWithSpacesAround(),
],
);
}).toList(),
),
],
),
)),
),
),
SizedBox(
height: 10,
),
if (model.state == ViewState.Idle)
AppButton(
title: "Add SELECTED HISTORIES"
.toUpperCase(),
onPressed: () {
widget.addSelectedHistories();
},
),
],
),
),
Container(
child: Column(
children: [
NetworkBaseView(
baseViewModel: model,
child: Container(
height:
MediaQuery.of(context).size.height * 0.5,
child: Center(
child: Container(
margin: EdgeInsets.only(top: 15),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
color: Colors.white),
child: ListView(
children: [
Column(
children: model.mergeHistorySurgicalWithHistorySportList
.map((historyInfo) {
return Column(
children: [
Row(
children: [
Checkbox(
value: isServiceSelected(
historyInfo),
activeColor:
Colors.red[800],
onChanged:
(
bool newValue) {
setState(() {
if (isServiceSelected(
historyInfo
)) {
widget
.removeHistory(
historyInfo
);
}
else {
widget
.myHistoryList
.add(
historyInfo);
}
});
}),
Expanded(
child: Padding(
padding:
const EdgeInsets
.symmetric(
horizontal: 10,
vertical: 0),
child: Texts(
historyInfo.nameEn,
variant: "bodyText",
bold: true,
color:
Colors.black),
),
),
],
),
DividerWithSpacesAround(),
],
);
}).toList(),
),
],
),
)),
),
),
SizedBox(
height: 10,
),
if (model.state == ViewState.Idle)
AppButton(
title: "Add SELECTED HISTORIES"
.toUpperCase(),
onPressed: () {
widget.addSelectedHistories();
},
),
],
),
),
Container(
child: Column(
children: [
NetworkBaseView(
baseViewModel: model,
child: Container(
height:
MediaQuery.of(context).size.height * 0.5,
child: Center(
child: Container(
margin: EdgeInsets.only(top: 15),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
color: Colors.white),
child: ListView(
children: [
Column(
children: model.historyMedicalList
.map((historyInfo) {
return Column(
children: [
Row(
children: [
Checkbox(
value: isServiceSelected(
historyInfo),
activeColor:
Colors.red[800],
onChanged:
(
bool newValue) {
setState(() {
if (isServiceSelected(
historyInfo
)) {
widget
.removeHistory(
historyInfo
);
}
else {
widget
.myHistoryList
.add(
historyInfo);
}
});
}),
Expanded(
child: Padding(
padding:
const EdgeInsets
.symmetric(
horizontal: 10,
vertical: 0),
child: Texts(
historyInfo.nameEn,
variant: "bodyText",
bold: true,
color:
Colors.black),
),
),
],
),
DividerWithSpacesAround(),
],
);
}).toList(),
),
],
),
)),
),
),
SizedBox(
height: 10,
),
if (model.state == ViewState.Idle)
AppButton(
title: "Add SELECTED HISTORIES"
.toUpperCase(),
onPressed: () {
setState(() {
widget.addSelectedHistories();
});
},
),
],
),
),
],
),
),
],
),
)),
),
),
));
}
isServiceSelected(MasterKeyModel masterKey) {
Iterable<MasterKeyModel> history =
widget
.myHistoryList
.where((element) =>
masterKey.id == element.id && masterKey.typeId == element.typeId);
if (history.length > 0) {
return true;
}
return false;
}
}

@ -0,0 +1,107 @@
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/shared/Text.dart';
import 'package:doctor_app_flutter/widgets/shared/TextFields.dart';
import 'package:eva_icons_flutter/eva_icons_flutter.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
class AddMedication extends StatefulWidget {
@override
_AddMedicationState createState() => _AddMedicationState();
}
class _AddMedicationState extends State<AddMedication> {
@override
Widget build(BuildContext context) {
return Column(
children: [
Container(
margin:
EdgeInsets.only(left: 10, right: 10, top: 15),
child: TextFields(
hintText: "Current Medications",
fontSize: 13.5,
onTapTextFields: () {
openMedicationsList(context);
},
readOnly: true,
// hintColor: Colors.black,
suffixIcon: EvaIcons.plusCircleOutline,
suffixIconColor: AppGlobal.appPrimaryColor,
fontWeight: FontWeight.w600,
// controller: messageController,
validator: (value) {
if (value == null)
return TranslationBase.of(context)
.emptyMessage;
else
return null;
}),
),
SizedBox(
height: 20,
),
Container(
margin:
EdgeInsets.only(left: 15, right: 15, top: 15),
child: Column(
children: [
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Texts('Abdomen Pain',
variant: "bodyText",
bold: true,
color: Colors.black),
Icon(
FontAwesomeIcons.trash,
color: Colors.grey,
size: 20,
)
],
),
SizedBox(
height: 20,
),
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Texts('Back Pain',
variant: "bodyText",
bold: true,
color: Colors.black),
Icon(
FontAwesomeIcons.trash,
color: Colors.grey,
size: 20,
)
],
),
],
),
)
],
);
}
openMedicationsList(BuildContext context) {
showModalBottomSheet(
backgroundColor: Colors.white,
isScrollControlled: true,
context: context,
builder: (context) {
return FractionallySizedBox(
heightFactor: 0.7,
child: Container(
child: Center(
child: Texts("dfdfd"),
)),
);
});
}
}

@ -0,0 +1,300 @@
import 'package:doctor_app_flutter/client/base_app_client.dart';
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/viewModel/SOAP_view_model.dart';
import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart';
import 'package:doctor_app_flutter/models/SOAP/my_selected_allergy.dart';
import 'package:doctor_app_flutter/models/SOAP/post_allergy_request_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/patients/profile/SOAP/subjective/add_allergies_widget.dart';
import 'package:doctor_app_flutter/widgets/patients/profile/SOAP/subjective/add_history_widget.dart';
import 'package:doctor_app_flutter/widgets/patients/profile/SOAP/subjective/add_medication_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/Text.dart';
import 'package:doctor_app_flutter/widgets/shared/TextFields.dart';
import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/expandable-widget-header-body.dart';
import 'package:eva_icons_flutter/eva_icons_flutter.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
class SubjectivePage extends StatefulWidget {
final Function changePageViewIndex;
final List<MySelectedAllergy> myAllergiesList;
final List<MasterKeyModel> myHistoryList ;
SubjectivePage({Key key, this.changePageViewIndex, this.myAllergiesList, this.myHistoryList});
@override
_SubjectivePageState createState() => _SubjectivePageState();
}
class _SubjectivePageState extends State<SubjectivePage> {
bool isChiefExpand = false;
bool isHistoryExpand = false;
bool isAllergiesExpand = false;
List<MasterKeyModel> myHistoryList = List();
TextEditingController illnessController = TextEditingController();
TextEditingController complaintsController = TextEditingController();
@override
Widget build(BuildContext context) {
return BaseView<SOAPViewModel>(
// onModelReady: (model) => model.getMasterLookup(MasterKeysService.Allergies),
builder: (_, model, w) => AppScaffold(
isShowAppBar: false,
baseViewModel: model,
body: SingleChildScrollView(
physics: ScrollPhysics(),
child: Center(
child: FractionallySizedBox(
widthFactor: 0.9,
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
SizedBox(
height: 30,
),
HeaderBodyExpandableNotifier(
headerWidget: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
Texts('CHIEF COMPLAINTS',
variant: isChiefExpand ? "bodyText" : '',
bold: isChiefExpand ? true : false,
color: Colors.black),
Icon(
FontAwesomeIcons.asterisk,
color: AppGlobal.appPrimaryColor,
size: 12,
)
],
),
InkWell(
onTap: () {
setState(() {
isChiefExpand = !isChiefExpand;
});
},
child: Icon(
isChiefExpand ? EvaIcons.minus : EvaIcons.plus))
],
),
bodyWidget: Column(children: [
SizedBox(
height: 20,
),
Container(
margin: EdgeInsets.only(left: 10, right: 10, top: 15),
child: TextFields(
hintText: "Add Chief Complaints",
fontSize: 13.5,
// hintColor: Colors.black,
fontWeight: FontWeight.w600,
maxLines: 25,
minLines: 13,
controller: complaintsController,
validator: (value) {
if (value == null)
return TranslationBase
.of(context)
.emptyMessage;
else
return null;
}),
),
SizedBox(
height: 20,
),
Container(
margin: EdgeInsets.only(left: 10, right: 10, top: 15),
child: TextFields(
hintText: "History of Present Illness",
fontSize: 13.5,
// hintColor: Colors.black,
fontWeight: FontWeight.w600,
maxLines: 25,
minLines: 13,
controller: illnessController,
validator: (value) {
if (value == null)
return TranslationBase
.of(context)
.emptyMessage;
else
return null;
}),
),
SizedBox(
height: 20,
),
AddMedication(),
]),
isExpand: isChiefExpand,
),
SizedBox(
height: 30,
),
Container(
width: double.infinity,
height: 1,
color: Color(0xffCCCCCC),
),
SizedBox(
height: 30,
),
HeaderBodyExpandableNotifier(
headerWidget: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
Texts('History'.toUpperCase(),
variant: isHistoryExpand ? "bodyText" : '',
bold: isHistoryExpand ? true : false,
color: Colors.black),
Icon(
FontAwesomeIcons.asterisk,
color: AppGlobal.appPrimaryColor,
size: 12,
)
],
),
InkWell(
onTap: () {
setState(() {
isHistoryExpand = !isHistoryExpand;
});
},
child: Icon(isHistoryExpand
? EvaIcons.minus
: EvaIcons.plus))
],
),
bodyWidget: Column(
children: [
AddHistoryWidget(myHistoryList: myHistoryList)
],
),
isExpand: isHistoryExpand,
),
SizedBox(
height: 30,
),
Container(
width: double.infinity,
height: 1,
color: Color(0xffCCCCCC),
),
SizedBox(
height: 30,
),
HeaderBodyExpandableNotifier(
headerWidget: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
Texts('Allergies'.toUpperCase(),
variant: isAllergiesExpand ? "bodyText" : '',
bold: isAllergiesExpand ? true : false,
color: Colors.black),
Icon(
FontAwesomeIcons.asterisk,
color: AppGlobal.appPrimaryColor,
size: 12,
)
],
),
InkWell(
onTap: () {
setState(() {
isAllergiesExpand = !isAllergiesExpand;
});
},
child: Icon(isAllergiesExpand
? EvaIcons.minus
: EvaIcons.plus))
],
),
bodyWidget:Column(
children: [
AddAllergiesWidget(myAllergiesList: widget.myAllergiesList,),
SizedBox(
height: 30,
),
],
)
,
isExpand: isAllergiesExpand,
),
SizedBox(
height: 30,
),
Container(
width: double.infinity,
height: 1,
color: Color(0xffCCCCCC),
),
SizedBox(
height: 30,
),
AppButton(
title: TranslationBase
.of(context)
.next,
onPressed: () async {
addSubjectiveInfo(model: model,
myAllergiesList: widget.myAllergiesList,
myHistoryList: myHistoryList);
},
),
],
),
),
),
),),);
}
addSubjectiveInfo(
{SOAPViewModel model, List<MySelectedAllergy> myAllergiesList, List<
MasterKeyModel> myHistoryList }) async {
PostAllergyRequestModel postAllergyRequestModel = new PostAllergyRequestModel();
widget.myAllergiesList.forEach((allergy) {
if(postAllergyRequestModel.listHisProgNotePatientAllergyDiseaseVM ==null)
postAllergyRequestModel.listHisProgNotePatientAllergyDiseaseVM = [];
postAllergyRequestModel.listHisProgNotePatientAllergyDiseaseVM.add(
ListHisProgNotePatientAllergyDiseaseVM(
allergyDiseaseId: allergy.selectedAllergy.id,
allergyDiseaseType: allergy.selectedAllergy.typeId,
patientMRN: 2500477,
episodeId: 200011502,
appointmentNo: 2016053271,
severity: allergy.selectedAllergySeverity.id,
remarks: allergy.remark,
createdBy: 1485,
createdOn: "2020-08-14T20:37:22.780Z",
editedBy: 1485,
editedOn: "2020-08-14T20:37:22.780Z",
isChecked: false,
isUpdatedByNurse: false
));
});
await model.postAllergy(postAllergyRequestModel);
if(model.state == ViewState.ErrorLocal) {
helpers.showErrorToast(model.error);
}
widget.changePageViewIndex(1);
print(postAllergyRequestModel);
}
}

@ -33,17 +33,13 @@ class PatientProfileWidget extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
decoration: BoxDecoration(
boxShadow: <BoxShadow>[
BoxShadow(
color: Colors.grey.shade300,
blurRadius: 10.0,
spreadRadius: 0,
offset: Offset(0, 10)
),
],
color: Colors.white
),
decoration: BoxDecoration(boxShadow: <BoxShadow>[
BoxShadow(
color: Colors.grey.shade300,
blurRadius: 10.0,
spreadRadius: 0,
offset: Offset(0, 10)),
], color: Colors.white),
child: Column(children: <Widget>[
Padding(
padding: const EdgeInsets.all(8.0),
@ -102,7 +98,8 @@ class PatientProfileWidget extends StatelessWidget {
children: [
Expanded(
child: Padding(
padding: const EdgeInsets.fromLTRB(16.0, 8.0, 8.0, 8.0),
padding: const EdgeInsets.fromLTRB(
16.0, 8.0, 8.0, 8.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@ -129,7 +126,8 @@ class PatientProfileWidget extends StatelessWidget {
),
Expanded(
child: Padding(
padding: const EdgeInsets.fromLTRB(16.0, 8.0, 8.0, 8.0),
padding: const EdgeInsets.fromLTRB(
16.0, 8.0, 8.0, 8.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@ -156,7 +154,8 @@ class PatientProfileWidget extends StatelessWidget {
),
Expanded(
child: Padding(
padding: const EdgeInsets.fromLTRB(16.0, 8.0, 8.0, 8.0),
padding: const EdgeInsets.fromLTRB(
16.0, 8.0, 8.0, 8.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@ -221,25 +220,25 @@ class PatientProfileWidget extends StatelessWidget {
Row(
children: [
Container(
width: 14 * SizeConfig.textMultiplier,
width:
14 * SizeConfig.textMultiplier,
child: AppText(
TranslationBase.of(context).dateTime,
TranslationBase.of(context)
.dateTime,
color: Colors.black,
fontWeight: FontWeight.bold,
fontSize: 1.6 * SizeConfig.textMultiplier,
fontSize: 1.6 *
SizeConfig.textMultiplier,
),
),
AppText(
patient.admissionDate != null
? "${DateUtils
.convertDateFromServerFormat(
patient.admissionDate,
'EEEE dd, MMMM yyyy hh:mm a')}"
? "${DateUtils.convertDateFromServerFormat(patient.admissionDate, 'EEEE dd, MMMM yyyy hh:mm a')}"
: "",
color: Colors.black,
fontWeight: FontWeight.normal,
fontSize:
1.6 * SizeConfig.textMultiplier,
1.6 * SizeConfig.textMultiplier,
),
],
),
@ -249,12 +248,15 @@ class PatientProfileWidget extends StatelessWidget {
Row(
children: [
Container(
width: 14 * SizeConfig.textMultiplier,
width:
14 * SizeConfig.textMultiplier,
child: AppText(
TranslationBase.of(context).admissionNo,
TranslationBase.of(context)
.admissionNo,
color: Colors.black,
fontWeight: FontWeight.bold,
fontSize: 1.6 * SizeConfig.textMultiplier,
fontSize: 1.6 *
SizeConfig.textMultiplier,
),
),
AppText(
@ -263,8 +265,8 @@ class PatientProfileWidget extends StatelessWidget {
: '',
color: Colors.black,
fontWeight: FontWeight.normal,
fontSize: 1.6 *
SizeConfig.textMultiplier,
fontSize:
1.6 * SizeConfig.textMultiplier,
),
],
),
@ -274,24 +276,26 @@ class PatientProfileWidget extends StatelessWidget {
Row(
children: [
Container(
width: 14 * SizeConfig.textMultiplier,
width:
14 * SizeConfig.textMultiplier,
child: AppText(
TranslationBase.of(context).losNo,
color: Colors.black,
fontWeight: FontWeight.bold,
fontSize: 1.6 * SizeConfig.textMultiplier,
fontSize: 1.6 *
SizeConfig.textMultiplier,
),
),
AppText(
patient.admissionDate != null
? DateUtils
.differenceBetweenServerDateAndCurrent(
patient.admissionDate)
.differenceBetweenServerDateAndCurrent(
patient.admissionDate)
: "",
color: Colors.black,
fontWeight: FontWeight.normal,
fontSize: 1.6 *
SizeConfig.textMultiplier,
fontSize:
1.6 * SizeConfig.textMultiplier,
),
],
),
@ -311,14 +315,18 @@ class PatientProfileWidget extends StatelessWidget {
children: [
Expanded(
child: Padding(
padding: const EdgeInsets.fromLTRB(16.0, 8.0, 8.0, 8.0),
padding: const EdgeInsets.fromLTRB(
16.0, 8.0, 8.0, 8.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
AppText(
TranslationBase.of(context).area,
TranslationBase.of(context)
.area,
fontWeight: FontWeight.bold,
fontSize: 1.6 * SizeConfig.textMultiplier,
fontSize: 1.6 *
SizeConfig.textMultiplier,
),
SizedBox(
height: 4,
@ -326,7 +334,8 @@ class PatientProfileWidget extends StatelessWidget {
AppText(
patient.clinicDescription,
fontWeight: FontWeight.normal,
fontSize: 1.6 * SizeConfig.textMultiplier,
fontSize: 1.6 *
SizeConfig.textMultiplier,
),
],
),
@ -338,27 +347,39 @@ class PatientProfileWidget extends StatelessWidget {
),
Expanded(
child: Padding(
padding: const EdgeInsets.fromLTRB(16.0, 8.0, 8.0, 8.0),
padding: const EdgeInsets.fromLTRB(
16.0, 8.0, 8.0, 8.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment:
CrossAxisAlignment.start,
mainAxisAlignment:
MainAxisAlignment.spaceEvenly,
children: [
Expanded(
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
AppText(
TranslationBase.of(context).room,
fontWeight: FontWeight.bold,
fontSize: 1.6 * SizeConfig.textMultiplier,
TranslationBase.of(
context)
.room,
fontWeight:
FontWeight.bold,
fontSize: 1.6 *
SizeConfig
.textMultiplier,
),
SizedBox(
width: 4,
),
AppText(
"${patient.nursingStationName}\n${patient.roomId}",
fontWeight: FontWeight.normal,
fontSize: 1.4 * SizeConfig.textMultiplier,
fontWeight:
FontWeight.normal,
fontSize: 1.4 *
SizeConfig
.textMultiplier,
),
],
),
@ -368,20 +389,29 @@ class PatientProfileWidget extends StatelessWidget {
),
Expanded(
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
AppText(
TranslationBase.of(context).bed,
fontWeight: FontWeight.bold,
fontSize: 1.6 * SizeConfig.textMultiplier,
TranslationBase.of(
context)
.bed,
fontWeight:
FontWeight.bold,
fontSize: 1.6 *
SizeConfig
.textMultiplier,
),
SizedBox(
width: 4,
),
AppText(
"${patient.bedId}",
fontWeight: FontWeight.normal,
fontSize: 1.6 * SizeConfig.textMultiplier,
fontWeight:
FontWeight.normal,
fontSize: 1.6 *
SizeConfig
.textMultiplier,
),
],
),

@ -26,7 +26,13 @@ class ProfileMedicalInfoWidget extends StatelessWidget {
mainAxisSpacing: 20,
crossAxisCount: 2,
childAspectRatio: 1.5,
children: [
children: [ PatientProfileButton(
key: key,
patient: patient,
nameLine1: "Create New",
nameLine2: "Episode",
route: CREATE_EPISODE,
icon: 'heartbeat.png'),
PatientProfileButton(
key: key,
patient: patient,

@ -8,7 +8,7 @@ class TextFields extends StatefulWidget {
TextFields({Key key, this.type, this.hintText, this.suffixIcon, this.autoFocus, this.onChanged, this.initialValue, this.minLines, this.maxLines, this.inputFormatters, this.padding, this.focus=false, this.maxLengthEnforced=true,
this.suffixIconColor, this.inputAction, this.onSubmit, this.keepPadding=true, this.textCapitalization = TextCapitalization.none, this.onTap, this.controller, this.keyboardType, this.validator, this.borderOnlyError=false,
this.onSaved, this.onSuffixTap, this.readOnly: false, this.maxLength, this.prefixIcon, this.bare=false, this.fontSize=16.0, this.fontWeight=FontWeight.w700, this.autoValidate=false}) : super(key: key);
this.onSaved, this.onSuffixTap, this.readOnly: false, this.maxLength, this.prefixIcon, this.bare=false, this.fontSize=16.0, this.fontWeight=FontWeight.w700, this.autoValidate=false, this.onTapTextFields}) : super(key: key);
final String hintText;
final String initialValue;
@ -18,6 +18,7 @@ class TextFields extends StatefulWidget {
final Color suffixIconColor;
final IconData prefixIcon;
final VoidCallback onTap;
final Function onTapTextFields;
final TextEditingController controller;
final TextInputType keyboardType;
final FormFieldValidator validator;
@ -112,6 +113,7 @@ class _TextFieldsState extends State<TextFields> {
boxShadow: [BoxShadow(color: Color.fromRGBO(70, 68, 167, focus ? 0.20 : 0), offset: Offset(0.0, 13.0), blurRadius: focus ? 34.0 : 12.0)]
),
child: TextFormField(
onTap: widget.onTapTextFields,
keyboardAppearance: Theme.of(context).brightness,
scrollPhysics: BouncingScrollPhysics(),
autovalidate: widget.autoValidate,

@ -27,7 +27,7 @@ class AppScaffold extends StatelessWidget {
@override
Widget build(BuildContext context) {
AppGlobal.CONTEX = context;
ProjectProvider projectProvider = Provider.of(context);
ProjectViewModel projectProvider = Provider.of(context);
return Scaffold(
backgroundColor: Colors.white,
appBar: isShowAppBar

@ -37,7 +37,7 @@ class AppTextFormField extends FormField<String> {
child: TextFormField(
focusNode: focusNode,
keyboardType: textInputType,
inputFormatters: [WhitelistingTextInputFormatter(RegExp(inputFormatter)),
inputFormatters: [FilteringTextInputFormatter.allow(RegExp(inputFormatter)),
],onChanged: onChanged?? (value){
state.didChange(value);
},

@ -18,7 +18,7 @@ class CardWithBgWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
ProjectProvider projectProvider = Provider.of(context);
ProjectViewModel projectProvider = Provider.of(context);
return Container(
margin: EdgeInsets.symmetric(vertical: 10.0),
width: double.infinity,

@ -0,0 +1,89 @@
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:flutter/material.dart';
class ListSelectDialog extends StatefulWidget {
final List<dynamic> list;
final String attributeName;
final String attributeValueId;
final okText;
final Function(dynamic) okFunction;
dynamic selectedValue;
ListSelectDialog(
{@required this.list,
@required this.attributeName,
@required this.attributeValueId,
@required this.okText,
@required this.okFunction});
@override
_ListSelectDialogState createState() => _ListSelectDialogState();
}
class _ListSelectDialogState extends State<ListSelectDialog> {
@override
void initState() {
super.initState();
widget.selectedValue = widget.selectedValue ?? widget.list[0];
}
@override
Widget build(BuildContext context) {
return showAlertDialog(context);
}
showAlertDialog(BuildContext context) {
// set up the buttons
Widget cancelButton = FlatButton(
child: Text(TranslationBase.of(context).cancel),
onPressed: () {
Navigator.of(context).pop();
});
Widget continueButton = FlatButton(
child: Text(this.widget.okText),
onPressed: () {
this.widget.okFunction(widget.selectedValue);
Navigator.of(context).pop();
});
// set up the AlertDialog
AlertDialog alert = AlertDialog(
// title: Text(widget.title),
content: createDialogList(),
actions: [
cancelButton,
continueButton,
],
);
return alert;
}
Widget createDialogList() {
return Container(
height: MediaQuery.of(context).size.height * 0.5,
child: SingleChildScrollView(
child: Column(
children: [
...widget.list
.map((item) => RadioListTile(
title: Text("${item[widget.attributeName].toString()}"),
groupValue: widget.selectedValue[widget.attributeValueId].toString(),
value: item[widget.attributeValueId].toString(),
activeColor: Colors.blue.shade700,
selected: item[widget.attributeValueId].toString() == widget.selectedValue[widget.attributeValueId].toString(),
onChanged: (val) {
setState(() {
widget.selectedValue = item;
});
},
))
.toList()
],
),
),
);
}
static closeAlertDialog(BuildContext context) {
Navigator.of(context).pop();
}
}

@ -0,0 +1,86 @@
import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:flutter/material.dart';
class MasterKeyDailog extends StatefulWidget {
final List<MasterKeyModel> list;
final okText;
final Function(MasterKeyModel) okFunction;
MasterKeyModel selectedValue;
MasterKeyDailog(
{@required this.list,
@required this.okText,
@required this.okFunction});
@override
_MasterKeyDailogState createState() => _MasterKeyDailogState();
}
class _MasterKeyDailogState extends State<MasterKeyDailog> {
@override
void initState() {
super.initState();
widget.selectedValue = widget.selectedValue ?? widget.list[0];
}
@override
Widget build(BuildContext context) {
return showAlertDialog(context);
}
showAlertDialog(BuildContext context) {
// set up the buttons
Widget cancelButton = FlatButton(
child: Text(TranslationBase.of(context).cancel),
onPressed: () {
Navigator.of(context).pop();
});
Widget continueButton = FlatButton(
child: Text(this.widget.okText),
onPressed: () {
this.widget.okFunction(widget.selectedValue);
Navigator.of(context).pop();
});
// set up the AlertDialog
AlertDialog alert = AlertDialog(
// title: Text(widget.title),
content: createDialogList(),
actions: [
cancelButton,
continueButton,
],
);
return alert;
}
Widget createDialogList() {
return Container(
height: MediaQuery.of(context).size.height * 0.5,
child: SingleChildScrollView(
child: Column(
children: [
...widget.list
.map((item) => RadioListTile(
title: Text(item.nameEn.toString()),
groupValue: widget.selectedValue.id.toString(),
value: item.id.toString(),
activeColor: Colors.blue.shade700,
selected: item.id.toString() == widget.selectedValue.id.toString(),
onChanged: (val) {
setState(() {
widget.selectedValue = item;
});
},
))
.toList()
],
),
),
);
}
static closeAlertDialog(BuildContext context) {
Navigator.of(context).pop();
}
}

@ -0,0 +1,27 @@
import 'package:flutter/material.dart';
class DividerWithSpacesAround extends StatelessWidget {
DividerWithSpacesAround({
Key key, this.height = 0,
});
final double height ;
@override
Widget build(BuildContext context) {
return Column(
children: [
SizedBox(
height: height,
),
Container(
width: double.infinity,
height: 1,
color: Color(0xffCCCCCC),
),
SizedBox(
height: height,
),
],
);
}
}

@ -343,6 +343,13 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
font_awesome_flutter:
dependency: "direct main"
description:
name: font_awesome_flutter
url: "https://pub.dartlang.org"
source: hosted
version: "8.11.0"
get_it:
dependency: "direct main"
description:

@ -36,7 +36,11 @@ dependencies:
maps_launcher: ^1.2.0
url_launcher: ^5.4.5
charts_flutter: ^0.9.0
#Icons
eva_icons_flutter: ^2.0.0
font_awesome_flutter: ^8.11.0
expandable: ^4.1.4
# Qr code Scanner
@ -56,6 +60,8 @@ dependencies:
get_it: ^4.0.2
#speech to text
speech_to_text:
path: speech_to_text

Loading…
Cancel
Save