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

 Conflicts:
	lib/core/viewModel/authentication_view_model.dart
episode_fixes
Elham Rababh 3 years ago
commit 1c45fcea22

@ -64,7 +64,7 @@ class BaseAppClient {
else
body['LanguageID'] = 2;
body['stamp'] = STAMP;
body['stamp'] = DateTime.now().toIso8601String();
// if(!body.containsKey("IPAdress"))
body['IPAdress'] = IP_ADDRESS;
body['VersionID'] = VERSION_ID;

@ -5,8 +5,8 @@ const ONLY_NUMBERS = "[0-9]";
const ONLY_LETTERS = "[a-zA-Z &'\"]";
const ONLY_DATE = "[0-9/]";
const BASE_URL_LIVE_CARE = 'https://livecare.hmg.com/';
const BASE_URL = 'https://hmgwebservices.com/';
// const BASE_URL = 'https://uat.hmgwebservices.com/';
// const BASE_URL = 'https://hmgwebservices.com/';
const BASE_URL = 'https://uat.hmgwebservices.com/';
const PHARMACY_ITEMS_URL = "Services/Lists.svc/REST/GetPharmcyItems_Region_enh";
const PHARMACY_LIST_URL = "Services/Patients.svc/REST/GetPharmcyList";
const PATIENT_PROGRESS_NOTE_URL = "Services/DoctorApplication.svc/REST/GetProgressNoteForInPatient";
@ -234,6 +234,7 @@ const UPDATE_MEDICAL_REPORT = "Services/Patients.svc/REST/DAPP_UpdateMedicalRepo
const GET_SICK_LEAVE_DOCTOR_APP = "Services/DoctorApplication.svc/REST/GetAllSickLeaves";
const ADD_PATIENT_TO_DOCTOR = "LiveCareApi/DoctorApp/AssignPatientToDoctor";
const REMOVE_PATIENT_FROM_DOCTOR = "LiveCareApi/DoctorApp/BackPatientToQueue";
const CREATE_DOCTOR_RESPONSE = "Services/DoctorApplication.svc/REST/CreateDoctorResponse";
var selectedPatientType = 1;
@ -279,14 +280,14 @@ var SERVICES_PATIANT_HEADER_AR = [
"المريض الواصل"
];
var DEVICE_TOKEN = "";
const PRIMARY_COLOR = 0xff515B5D;
const TRANSACTION_NO = 0;
const LANGUAGE_ID = 2;
const STAMP = '2020-04-27T12:17:17.721Z';
const IP_ADDRESS = '9.9.9.9';
const VERSION_ID = 6.2;
const VERSION_ID = 6.3;
const CHANNEL = 9;
const SESSION_ID = 'BlUSkYymTt';
const IS_LOGIN_FOR_DOCTOR_APP = true;

@ -12,5 +12,4 @@ final LOGGED_IN_USER = 'loggedUser';
final DASHBOARD_DATA = 'dashboard-data';
final OTP_TYPE = 'otp-type';
final LAST_LOGIN_USER = 'last-login-user';
final PASSWORD = 'password';
final CLINIC_NAME = 'clinic-name';

@ -1,34 +1,26 @@
class ActivationCodeModel {
String mobileNumber;
String zipCode;
int channel;
int languageID;
double versionID;
int memberID;
String password;
int facilityId;
String generalid;
String otpSendType;
ActivationCodeModel(
{this.mobileNumber,
this.zipCode,
this.channel,
{this.channel,
this.languageID,
this.versionID,
this.memberID,
this.password,
this.facilityId,
this.otpSendType,
this.generalid});
ActivationCodeModel.fromJson(Map<String, dynamic> json) {
mobileNumber = json['MobileNumber'];
zipCode = json['ZipCode'];
channel = json['Channel'];
languageID = json['LanguageID'];
versionID = json['VersionID'];
memberID = json['MemberID'];
password = json['Password'];
facilityId = json['facilityId'];
otpSendType = json['OTP_SendType'];
generalid = json['generalid'];
@ -36,13 +28,10 @@ class ActivationCodeModel {
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['MobileNumber'] = this.mobileNumber;
data['ZipCode'] = this.zipCode;
data['Channel'] = this.channel;
data['LanguageID'] = this.languageID;
data['VersionID'] = this.versionID;
data['MemberID'] = this.memberID;
data['Password'] = this.password;
data['facilityId'] = this.facilityId;
data['OTP_SendType'] = otpSendType;
data['generalid'] = this.generalid;

@ -55,8 +55,6 @@ class ActivationCodeForVerificationScreenModel {
data['facilityId'] = this.facilityId;
data['generalid'] = this.generalid;
data['IsMobileFingerPrint'] = this.isMobileFingerPrint;
data['VidaAuthTokenID'] = this.vidaAuthTokenID;
data['VidaRefreshTokenID'] = this.vidaRefreshTokenID;
data['IMEI'] = this.iMEI;
return data;
}

@ -5,11 +5,16 @@ class CheckActivationCodeForDoctorAppResponseModel {
List<ListDoctorsClinic> listDoctorsClinic;
List<DoctorProfileModel> listDoctorProfile;
MemberInformation memberInformation;
String vidaAuthTokenID;
String vidaRefreshTokenID;
CheckActivationCodeForDoctorAppResponseModel(
{this.authenticationTokenID,
this.listDoctorsClinic,
this.memberInformation});
this.memberInformation,
this.listDoctorProfile,
this.vidaAuthTokenID,
this.vidaRefreshTokenID});
CheckActivationCodeForDoctorAppResponseModel.fromJson(
Map<String, dynamic> json) {
@ -27,6 +32,8 @@ class CheckActivationCodeForDoctorAppResponseModel {
listDoctorProfile.add(new DoctorProfileModel.fromJson(v));
});
}
vidaAuthTokenID = json['VidaAuthTokenID'];
vidaRefreshTokenID = json['VidaRefreshTokenID'];
memberInformation = json['memberInformation'] != null
? new MemberInformation.fromJson(json['memberInformation'])
@ -60,12 +67,13 @@ class ListDoctorsClinic {
bool isActive;
String clinicName;
ListDoctorsClinic({this.setupID,
this.projectID,
this.doctorID,
this.clinicID,
this.isActive,
this.clinicName});
ListDoctorsClinic(
{this.setupID,
this.projectID,
this.doctorID,
this.clinicID,
this.isActive,
this.clinicName});
ListDoctorsClinic.fromJson(Map<String, dynamic> json) {
setupID = json['SetupID'];
@ -99,15 +107,16 @@ class MemberInformation {
String preferredLanguage;
List<Roles> roles;
MemberInformation({this.clinics,
this.doctorId,
this.email,
this.employeeId,
this.memberId,
this.memberName,
this.memberNameArabic,
this.preferredLanguage,
this.roles});
MemberInformation(
{this.clinics,
this.doctorId,
this.email,
this.employeeId,
this.memberId,
this.memberName,
this.memberNameArabic,
this.preferredLanguage,
this.roles});
MemberInformation.fromJson(Map<String, dynamic> json) {
if (json['clinics'] != null) {

@ -2,6 +2,9 @@ class CheckActivationCodeRequestModel {
String mobileNumber;
String zipCode;
int doctorID;
int memberID;
String password;
String facilityId;
String iPAdress;
int channel;
int languageID;
@ -12,6 +15,8 @@ class CheckActivationCodeRequestModel {
String activationCode;
String vidaAuthTokenID;
String vidaRefreshTokenID;
String iMEI;
bool isForSilentLogin;
int oTPSendType;
CheckActivationCodeRequestModel(
{this.mobileNumber,
@ -27,7 +32,7 @@ class CheckActivationCodeRequestModel {
this.activationCode,
this.vidaAuthTokenID,
this.vidaRefreshTokenID,
this.oTPSendType});
this.oTPSendType,this.password,this.facilityId,this.memberID,this.isForSilentLogin=false,this.iMEI});
CheckActivationCodeRequestModel.fromJson(Map<String, dynamic> json) {
mobileNumber = json['MobileNumber'];
@ -62,6 +67,11 @@ class CheckActivationCodeRequestModel {
data['VidaAuthTokenID'] = this.vidaAuthTokenID;
data['VidaRefreshTokenID'] = this.vidaRefreshTokenID;
data['OTP_SendType'] = this.oTPSendType;
data['facilityId'] = this.facilityId;
data['MemberID'] = this.memberID;
data['Password'] = this.password;
data['IMEI'] = this.iMEI;
data['IsForSilentLogin'] = this.isForSilentLogin;
return data;
}
}

@ -1,22 +1,16 @@
import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:firebase_analytics/observer.dart';
import 'package:flutter/cupertino.dart';
class AnalyticsService {
final FirebaseAnalytics _analytics = FirebaseAnalytics();
FirebaseAnalyticsObserver getAnalyticsObserver() =>
FirebaseAnalyticsObserver(analytics: _analytics);
FirebaseAnalyticsObserver getAnalyticsObserver() => FirebaseAnalyticsObserver(analytics: _analytics);
Future logEvent(
{String eventCategory,
String eventLabel,
String eventAction,
String eventValue}) async {
Future logEvent({@required String eventCategory, @required String eventAction}) async {
await _analytics.logEvent(name: 'event', parameters: {
"eventCategory": eventCategory,
"eventLabel": eventLabel,
"eventAction": eventAction,
"eventValue": eventValue
});
}
}

@ -1,8 +1,9 @@
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/core/service/base/base_service.dart';
import 'package:doctor_app_flutter/models/doctor/list_gt_my_patients_question_model.dart';
import 'package:doctor_app_flutter/models/doctor/replay/request_create_doctor_response.dart';
import 'package:doctor_app_flutter/models/doctor/request_add_referred_doctor_remarks.dart';
import 'package:doctor_app_flutter/models/doctor/request_doctor_reply.dart';
import 'package:doctor_app_flutter/models/doctor/replay/request_doctor_reply.dart';
import 'package:doctor_app_flutter/models/patient/my_referral/my_referral_patient_model.dart';
import 'package:doctor_app_flutter/models/patient/request_my_referral_patient_model.dart';
@ -59,4 +60,19 @@ class DoctorReplyService extends BaseService {
},
);
}
Future createDoctorResponse(
CreateDoctorResponseModel createDoctorResponseModel) async {
hasError = false;
await baseAppClient.post(
CREATE_DOCTOR_RESPONSE,
body: createDoctorResponseModel.toJson(),
onSuccess: (dynamic body, int statusCode) {
print("succsss");
},
onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
},
);
}
}

@ -70,35 +70,25 @@ class AuthenticationViewModel extends BaseViewModel {
bool isLogin = false;
bool unverified = false;
bool isFromLogin = false;
APP_STATUS app_status = APP_STATUS.LOADING;
APP_STATUS appStatus = APP_STATUS.LOADING;
String localToken ="";
AuthenticationViewModel({bool checkDeviceInfo = false}) {
getDeviceInfoFromFirebase();
getDoctorProfile();
}
/// select Device IMEI
Future selectDeviceImei(imei) async {
setState(ViewState.Busy);
await _authService.selectDeviceImei(imei);
if (_authService.hasError) {
error = _authService.error;
setState(ViewState.Error);
} else
setState(ViewState.Idle);
}
/// Insert Device IMEI
Future insertDeviceImei() async {
Future insertDeviceImei(token) async {
var loggedIn = await sharedPref.getObj(LOGGED_IN_USER);
var user = await sharedPref.getObj(LAST_LOGIN_USER);
if (user != null) {
user = GetIMEIDetailsModel.fromJson(user);
var data = await sharedPref.getObj(LAST_LOGIN_USER);
if (data != null) {
user = GetIMEIDetailsModel.fromJson(data);
}
var profileInfo = await sharedPref.getObj(DOCTOR_PROFILE);
profileInfo['IMEI'] = DEVICE_TOKEN;
profileInfo['IMEI'] = token;
profileInfo['LogInTypeID'] = await sharedPref.getInt(OTP_TYPE);
profileInfo['BioMetricEnabled'] = true;
profileInfo['MobileNo'] =
@ -115,9 +105,8 @@ class AuthenticationViewModel extends BaseViewModel {
: user.doctorID;
insertIMEIDetailsModel.outSA = loggedIn != null ? loggedIn['PatientOutSA'] : user.outSA;
insertIMEIDetailsModel.vidaAuthTokenID = await sharedPref.getString(VIDA_AUTH_TOKEN_ID);
insertIMEIDetailsModel.vidaRefreshTokenID =
await sharedPref.getString(VIDA_REFRESH_TOKEN_ID);
insertIMEIDetailsModel.password = await sharedPref.getString(PASSWORD);
insertIMEIDetailsModel.vidaRefreshTokenID =await sharedPref.getString(VIDA_REFRESH_TOKEN_ID);
insertIMEIDetailsModel.password = userInfo.password;
await _authService.insertDeviceImei(insertIMEIDetailsModel);
if (_authService.hasError) {
@ -174,21 +163,22 @@ class AuthenticationViewModel extends BaseViewModel {
ActivationCodeModel activationCodeModel = ActivationCodeModel(
facilityId: projectID,
memberID: loggedUser.listMemberInformation[0].memberID,
zipCode: loggedUser.zipCode,
mobileNumber: loggedUser.mobileNumber,
otpSendType: authMethodType.getTypeIdService().toString(),
password: password);
);
await _authService.sendActivationCodeForDoctorApp(activationCodeModel);
if (_authService.hasError) {
error = _authService.error;
setState(ViewState.ErrorLocal);
} else
} else {
await sharedPref.setString(LOGIN_TOKEN_ID,
_authService.activationCodeForDoctorAppRes.logInTokenID);
setState(ViewState.Idle);
}
}
/// check activation code for sms and whats app
Future checkActivationCodeForDoctorApp({String activationCode}) async {
Future checkActivationCodeForDoctorApp({String activationCode,bool isSilentLogin = false}) async {
setState(ViewState.BusyLocal);
CheckActivationCodeRequestModel checkActivationCodeForDoctorApp =
new CheckActivationCodeRequestModel(
@ -201,13 +191,19 @@ class AuthenticationViewModel extends BaseViewModel {
: user.projectID,
logInTokenID: await sharedPref.getString(LOGIN_TOKEN_ID),
activationCode: activationCode ?? '0000',
memberID:userInfo.userID!=null? int.parse(userInfo.userID):user.doctorID ,
password: userInfo.password,
facilityId:userInfo.projectID!=null? userInfo.projectID.toString():user.projectID.toString(),
oTPSendType: await sharedPref.getInt(OTP_TYPE),
iMEI: localToken,
isForSilentLogin:isSilentLogin,
generalid: "Cs2020@2016\$2958");
await _authService.checkActivationCodeForDoctorApp(checkActivationCodeForDoctorApp);
if (_authService.hasError) {
error = _authService.error;
setState(ViewState.ErrorLocal);
} else {
await setDataAfterSendActivationSuccess(checkActivationCodeForDoctorAppRes);
setState(ViewState.Idle);
}
}
@ -253,15 +249,14 @@ class AuthenticationViewModel extends BaseViewModel {
}
/// add  token to shared preferences in case of send activation code is success
setDataAfterSendActivationSuccess(SendActivationCodeForDoctorAppResponseModel sendActivationCodeForDoctorAppResponseModel) {
setDataAfterSendActivationSuccess(CheckActivationCodeForDoctorAppResponseModel sendActivationCodeForDoctorAppResponseModel)async {
// print("VerificationCode : " + sendActivationCodeForDoctorAppResponseModel.verificationCode);
// DrAppToastMsg.showSuccesToast("_VerificationCode_ : " + sendActivationCodeForDoctorAppResponseModel.verificationCode);
sharedPref.setString(VIDA_AUTH_TOKEN_ID,
await sharedPref.setString(VIDA_AUTH_TOKEN_ID,
sendActivationCodeForDoctorAppResponseModel.vidaAuthTokenID);
sharedPref.setString(VIDA_REFRESH_TOKEN_ID,
await sharedPref.setString(VIDA_REFRESH_TOKEN_ID,
sendActivationCodeForDoctorAppResponseModel.vidaRefreshTokenID);
sharedPref.setString(LOGIN_TOKEN_ID,
sendActivationCodeForDoctorAppResponseModel.logInTokenID);
await sharedPref.setString(LOGIN_TOKEN_ID,
sendActivationCodeForDoctorAppResponseModel.authenticationTokenID);
}
saveObjToString(String key, value) async {
@ -311,7 +306,7 @@ class AuthenticationViewModel extends BaseViewModel {
}
/// add some logic in case of check activation code is success
onCheckActivationCodeSuccess() async {
onCheckActivationCodeSuccess({bool isSilentLogin = false}) async {
sharedPref.setString(
TOKEN,
checkActivationCodeForDoctorAppRes.authenticationTokenID);
@ -358,17 +353,12 @@ class AuthenticationViewModel extends BaseViewModel {
if (Platform.isIOS) {
_firebaseMessaging.requestNotificationPermissions();
}
try {
setState(ViewState.Busy);
} catch (e) {
Helpers.showErrorToast("fdfdfdfdf"+e.toString());
}
var token = await _firebaseMessaging.getToken();
if (DEVICE_TOKEN == "") {
DEVICE_TOKEN = token;
if (localToken == "") {
localToken = token;
await _authService.selectDeviceImei(DEVICE_TOKEN);
await _authService.selectDeviceImei(localToken);
if (_authService.hasError) {
error = _authService.error;
setState(ViewState.ErrorLocal);
@ -377,6 +367,10 @@ class AuthenticationViewModel extends BaseViewModel {
user =_authService.dashboardItemsList[0];
sharedPref.setObj(
LAST_LOGIN_USER, _authService.dashboardItemsList[0]);
await sharedPref.setString(VIDA_REFRESH_TOKEN_ID,
user.vidaRefreshTokenID);
await sharedPref.setString(VIDA_AUTH_TOKEN_ID,
user.vidaAuthTokenID);
this.unverified = true;
}
setState(ViewState.Idle);
@ -389,22 +383,22 @@ class AuthenticationViewModel extends BaseViewModel {
/// determine the status of the app
APP_STATUS get status {
if (state == ViewState.Busy) {
app_status = APP_STATUS.LOADING;
appStatus = APP_STATUS.LOADING;
} else {
if(this.doctorProfile !=null)
app_status = APP_STATUS.AUTHENTICATED;
appStatus = APP_STATUS.AUTHENTICATED;
else if (this.unverified) {
app_status = APP_STATUS.UNVERIFIED;
appStatus = APP_STATUS.UNVERIFIED;
} else if (this.isLogin) {
app_status = APP_STATUS.AUTHENTICATED;
appStatus = APP_STATUS.AUTHENTICATED;
} else {
app_status = APP_STATUS.UNAUTHENTICATED;
appStatus = APP_STATUS.UNAUTHENTICATED;
}
}
return app_status;
return appStatus;
}
setAppStatus(APP_STATUS status){
this.app_status = status;
this.appStatus = status;
notifyListeners();
}
@ -418,7 +412,7 @@ class AuthenticationViewModel extends BaseViewModel {
logout({bool isFromLogin = false}) async {
DEVICE_TOKEN = "";
localToken = "";
String lang = await sharedPref.getString(APP_Language);
await Helpers.clearSharedPref();
doctorProfile = null;
@ -426,7 +420,7 @@ class AuthenticationViewModel extends BaseViewModel {
deleteUser();
await getDeviceInfoFromFirebase();
this.isFromLogin = isFromLogin;
app_status = APP_STATUS.UNAUTHENTICATED;
appStatus = APP_STATUS.UNAUTHENTICATED;
setState(ViewState.Idle);
}

@ -44,8 +44,8 @@ class DashboardViewModel extends BaseViewModel {
_firebaseMessaging.getToken().then((String token) async {
if (token != '') {
DEVICE_TOKEN = token;
authProvider.insertDeviceImei();
// DEVICE_TOKEN = token;
authProvider.insertDeviceImei(token);
}
});
}

@ -1,6 +1,7 @@
import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/service/home/doctor_reply_service.dart';
import 'package:doctor_app_flutter/models/doctor/list_gt_my_patients_question_model.dart';
import 'package:doctor_app_flutter/models/doctor/replay/request_create_doctor_response.dart';
import '../../locator.dart';
import 'base_view_model.dart';
@ -31,4 +32,25 @@ class DoctorReplayViewModel extends BaseViewModel {
} else
setState(ViewState.Idle);
}
Future createDoctorResponse(
String response, ListGtMyPatientsQuestions model) async {
await getDoctorProfile();
CreateDoctorResponseModel createDoctorResponseModel =
CreateDoctorResponseModel(
transactionNo: model.transactionNo.toString(),
doctorResponse: response,
infoStatus: 6,
createdBy:this.doctorProfile.doctorID,
infoEnteredBy: this.doctorProfile.doctorID,
setupID:"010266"
);
setState(ViewState.BusyLocal);
await _doctorReplyService.createDoctorResponse(createDoctorResponseModel);
if (_doctorReplyService.hasError) {
error = _doctorReplyService.error;
setState(ViewState.ErrorLocal);
} else
setState(ViewState.Idle);
}
}

@ -35,8 +35,7 @@ class MyApp extends StatelessWidget {
SizeConfig().init(constraints, orientation);
return MultiProvider(
providers: [
ChangeNotifierProvider<AuthenticationViewModel>(
create: (context) => AuthenticationViewModel()),
ChangeNotifierProvider<AuthenticationViewModel>(create: (context) => AuthenticationViewModel()),
ChangeNotifierProvider<ProjectViewModel>(
create: (context) => ProjectViewModel(),
),
@ -71,7 +70,7 @@ class MyApp extends StatelessWidget {
backgroundColor: Color.fromRGBO(255, 255, 255, 1),
),
navigatorKey: locator<NavigationService>().navigatorKey,
navigatorObservers:[
navigatorObservers: [
locator<AnalyticsService>().getAnalyticsObserver(),
],
initialRoute: INIT_ROUTE,

@ -0,0 +1,48 @@
class CreateDoctorResponseModel {
String setupID;
int projectID;
String transactionNo;
int infoEnteredBy;
int infoStatus;
int createdBy;
int editedBy;
String doctorResponse;
int doctorID;
CreateDoctorResponseModel(
{this.setupID,
this.projectID,
this.transactionNo,
this.infoEnteredBy,
this.infoStatus,
this.createdBy,
this.editedBy,
this.doctorResponse,
this.doctorID});
CreateDoctorResponseModel.fromJson(Map<String, dynamic> json) {
setupID = json['SetupID'];
projectID = json['ProjectID'];
transactionNo = json['TransactionNo'];
infoEnteredBy = json['InfoEnteredBy'];
infoStatus = json['InfoStatus'];
createdBy = json['CreatedBy'];
editedBy = json['EditedBy'];
doctorResponse = json['DoctorResponse'];
doctorID = json['DoctorID'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['SetupID'] = this.setupID;
data['ProjectID'] = this.projectID;
data['TransactionNo'] = this.transactionNo;
data['InfoEnteredBy'] = this.infoEnteredBy;
data['InfoStatus'] = this.infoStatus;
data['CreatedBy'] = this.createdBy;
data['EditedBy'] = this.editedBy;
data['DoctorResponse'] = this.doctorResponse;
data['DoctorID'] = this.doctorID;
return data;
}
}

@ -434,8 +434,7 @@ class _VerificationMethodsScreenState extends State<VerificationMethodsScreen> {
Helpers.showErrorToast(authenticationViewModel.error);
GifLoaderDialogUtils.hideDialog(context);
} else {
authenticationViewModel.setDataAfterSendActivationSuccess(authenticationViewModel.activationCodeForDoctorAppRes);
sharedPref.setString(PASSWORD, authenticationViewModel.userInfo.password);
GifLoaderDialogUtils.hideDialog(context);
this.startSMSService(authMethodType);
}
@ -456,13 +455,14 @@ class _VerificationMethodsScreenState extends State<VerificationMethodsScreen> {
GifLoaderDialogUtils.hideDialog(context);
Helpers.showErrorToast(authenticationViewModel.error);
} else {
authenticationViewModel.setDataAfterSendActivationSuccess(authenticationViewModel.activationCodeVerificationScreenRes);
await sharedPref.setString(LOGIN_TOKEN_ID,
authenticationViewModel.activationCodeVerificationScreenRes.logInTokenID);
if (authMethodType == AuthMethodTypes.SMS ||
authMethodType == AuthMethodTypes.WhatsApp) {
GifLoaderDialogUtils.hideDialog(context);
this.startSMSService(authMethodType);
} else {
checkActivationCode();
checkActivationCode(isSilentLogin: true);
}
}
}
@ -543,8 +543,8 @@ class _VerificationMethodsScreenState extends State<VerificationMethodsScreen> {
}
}
checkActivationCode({String value}) async {
await authenticationViewModel.checkActivationCodeForDoctorApp(activationCode: value);
checkActivationCode({String value,bool isSilentLogin = false}) async {
await authenticationViewModel.checkActivationCodeForDoctorApp(activationCode: value,isSilentLogin: isSilentLogin);
if (authenticationViewModel.state == ViewState.ErrorLocal) {
Navigator.pop(context);
Helpers.showErrorToast(authenticationViewModel.error);

@ -1,10 +1,16 @@
import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/viewModel/doctor_replay_view_model.dart';
import 'package:doctor_app_flutter/models/doctor/list_gt_my_patients_question_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/util/date-utils.dart';
import 'package:doctor_app_flutter/util/dr_app_toast_msg.dart';
import 'package:doctor_app_flutter/util/helpers.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/shared/TextFields.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/loader/gif_loader_dialog_utils.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
@ -220,61 +226,61 @@ class DoctorReplayChat extends StatelessWidget {
),
),
// Positioned(
// bottom: 0,
// child: Container(
// width:MediaQuery.of(context).size.width * 1,
// // height: MediaQuery.of(context).size.height * 0.12,
// child: Column(
// mainAxisSize: MainAxisSize.min,
// children: <Widget>[
// FractionallySizedBox(
// child: Container(
//
// child: TextFields(
// borderRadius: 0,
// hintText: TranslationBase
// .of(context)
// .typeHereToReply,
// fontSize: 13.5,
//
// suffixIcon: FontAwesomeIcons.arrowRight,
// suffixIconColor: Colors.green,
// onSuffixTap: ()async {
// GifLoaderDialogUtils.showMyDialog(context);
// await model.replay(msgController.text, reply);
// if(model.state == ViewState.ErrorLocal) {
// Helpers.showErrorToast("An error happened while you are replaying");
// } else {
// DrAppToastMsg.showSuccesToast("Thank you for your replay ");
// await previousModel.getDoctorReply();
// Navigator.pop(context);
// }
// GifLoaderDialogUtils.hideDialog(context);
//
//
//
//
// },
// // hintColor: Colors.black,
// fontWeight: FontWeight.w600,
// maxLines: 50,
// minLines: 3,
// controller: msgController,
// validator: (value) {
// if (value == null || value == "")
// return TranslationBase.of(context)
// .emptyMessage;
// else
// return null;
// }),
//
// ),
// ),
// ],
// ),
// ),
// )
Positioned(
bottom: 0,
child: Container(
width:MediaQuery.of(context).size.width * 1,
height: MediaQuery.of(context).size.height * 0.12,
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
FractionallySizedBox(
child: Container(
child: TextFields(
borderRadius: 0,
hintText: TranslationBase
.of(context)
.typeHereToReply,
fontSize: 13.5,
suffixIcon: FontAwesomeIcons.arrowRight,
suffixIconColor: Colors.green,
onSuffixTap: ()async {
GifLoaderDialogUtils.showMyDialog(context);
await model.createDoctorResponse(msgController.text, reply);
if(model.state == ViewState.ErrorLocal) {
Helpers.showErrorToast(model.error);
} else {
DrAppToastMsg.showSuccesToast("Thank you for your replay ");
await previousModel.getDoctorReply();
Navigator.pop(context);
}
GifLoaderDialogUtils.hideDialog(context);
},
// hintColor: Colors.black,
fontWeight: FontWeight.w600,
maxLines: 50,
minLines: 3,
controller: msgController,
validator: (value) {
if (value == null || value == "")
return TranslationBase.of(context)
.emptyMessage;
else
return null;
}),
),
),
],
),
),
)
],

@ -1,4 +1,6 @@
import 'package:doctor_app_flutter/core/service/AnalyticsService.dart';
import 'package:doctor_app_flutter/core/viewModel/medical_file_view_model.dart';
import 'package:doctor_app_flutter/locator.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/screens/medical-file/medical_file_details.dart';
@ -27,9 +29,7 @@ class _HealthSummaryPageState extends State<HealthSummaryPage> {
bool isInpatient = routeArgs['isInpatient'];
return BaseView<MedicalFileViewModel>(
onModelReady: (model) => model.getMedicalFile(mrn: patient.patientId),
builder:
(BuildContext context, MedicalFileViewModel model, Widget child) =>
AppScaffold(
builder: (BuildContext context, MedicalFileViewModel model, Widget child) => AppScaffold(
appBar: PatientProfileAppBar(
patient,
isInpatient: isInpatient,
@ -43,8 +43,7 @@ class _HealthSummaryPageState extends State<HealthSummaryPage> {
child: Column(
children: [
Padding(
padding:
EdgeInsets.symmetric(horizontal: 12.0, vertical: 8.0),
padding: EdgeInsets.symmetric(horizontal: 12.0, vertical: 8.0),
child: Container(
child: Padding(
padding: const EdgeInsets.all(8.0),
@ -74,113 +73,68 @@ class _HealthSummaryPageState extends State<HealthSummaryPage> {
),
),
),
(model.medicalFileList != null &&
model.medicalFileList.length != 0)
(model.medicalFileList != null && model.medicalFileList.length != 0)
? ListView.builder(
//physics: ,
physics: NeverScrollableScrollPhysics(),
scrollDirection: Axis.vertical,
shrinkWrap: true,
itemCount: model.medicalFileList[0].entityList[0]
.timelines.length,
itemCount: model.medicalFileList[0].entityList[0].timelines.length,
itemBuilder: (BuildContext ctxt, int index) {
return InkWell(
onTap: () {
if (model
.medicalFileList[0]
.entityList[0]
.timelines[index]
.timeLineEvents[0]
.consulations
.length !=
onTap: () async {
if (model.medicalFileList[0].entityList[0].timelines[index].timeLineEvents[0]
.consulations.length !=
0)
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => MedicalFileDetails(
age: patient.age is String
? patient.age ?? ""
: "${patient.age}",
firstName: patient.firstName,
lastName: patient.lastName,
gender: patient.genderDescription,
encounterNumber: index,
pp: patient.patientId,
patient: patient,
doctorName: model
.medicalFileList[0]
.entityList[0]
.timelines[index]
.timeLineEvents[0]
.consulations
.isNotEmpty
? model
.medicalFileList[0]
.entityList[0]
.timelines[index]
.doctorName
: "",
clinicName: model
.medicalFileList[0]
.entityList[0]
.timelines[index]
.timeLineEvents[0]
.consulations
.isNotEmpty
? model
.medicalFileList[0]
.entityList[0]
.timelines[index]
.clinicName
: "",
doctorImage: model
.medicalFileList[0]
.entityList[0]
.timelines[index]
.timeLineEvents[0]
.consulations
.isNotEmpty
? model
.medicalFileList[0]
.entityList[0]
.timelines[index]
.doctorImage
: "",
episode: model.medicalFileList[0].entityList[0].timelines[index].timeLineEvents[0].consulations.isNotEmpty
? model.medicalFileList[0].entityList[0].timelines[index].timeLineEvents[0].consulations[0].episodeID.toString()
: "",
vistDate: model.medicalFileList[0].entityList[0].timelines[index].date.toString()),
settings: RouteSettings(name: 'MedicalFileDetails'),),
await locator<AnalyticsService>().logEvent(
eventCategory: "Health Summary Page",
eventAction: "Health Summary Details",
);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => MedicalFileDetails(
age: patient.age is String ? patient.age ?? "" : "${patient.age}",
firstName: patient.firstName,
lastName: patient.lastName,
gender: patient.genderDescription,
encounterNumber: index,
pp: patient.patientId,
patient: patient,
doctorName: model.medicalFileList[0].entityList[0].timelines[index]
.timeLineEvents[0].consulations.isNotEmpty
? model.medicalFileList[0].entityList[0].timelines[index].doctorName
: "",
clinicName: model.medicalFileList[0].entityList[0].timelines[index]
.timeLineEvents[0].consulations.isNotEmpty
? model.medicalFileList[0].entityList[0].timelines[index].clinicName
: "",
doctorImage: model.medicalFileList[0].entityList[0].timelines[index]
.timeLineEvents[0].consulations.isNotEmpty
? model.medicalFileList[0].entityList[0].timelines[index].doctorImage
: "",
episode: model.medicalFileList[0].entityList[0].timelines[index]
.timeLineEvents[0].consulations.isNotEmpty
? model.medicalFileList[0].entityList[0].timelines[index].timeLineEvents[0]
.consulations[0].episodeID
.toString()
: "",
vistDate: model.medicalFileList[0].entityList[0].timelines[index].date.toString()),
settings: RouteSettings(name: 'MedicalFileDetails'),
),
);
},
child: DoctorCard(
doctorName: model
.medicalFileList[0]
.entityList[0]
.timelines[index]
.doctorName,
clinic: model.medicalFileList[0].entityList[0]
.timelines[index].clinicName,
branch: model.medicalFileList[0].entityList[0]
.timelines[index].projectName,
profileUrl: model
.medicalFileList[0]
.entityList[0]
.timelines[index]
.doctorImage,
appointmentDate:
AppDateUtils.getDateTimeFromServerFormat(
model.medicalFileList[0].entityList[0]
.timelines[index].date,
doctorName: model.medicalFileList[0].entityList[0].timelines[index].doctorName,
clinic: model.medicalFileList[0].entityList[0].timelines[index].clinicName,
branch: model.medicalFileList[0].entityList[0].timelines[index].projectName,
profileUrl: model.medicalFileList[0].entityList[0].timelines[index].doctorImage,
appointmentDate: AppDateUtils.getDateTimeFromServerFormat(
model.medicalFileList[0].entityList[0].timelines[index].date,
),
isPrescriptions: true,
isShowEye: model
.medicalFileList[0]
.entityList[0]
.timelines[index]
.timeLineEvents[0]
.consulations
.length !=
isShowEye: model.medicalFileList[0].entityList[0].timelines[index].timeLineEvents[0]
.consulations.length !=
0
? true
: false),
@ -196,8 +150,7 @@ class _HealthSummaryPageState extends State<HealthSummaryPage> {
Image.asset('assets/images/no-data.png'),
Padding(
padding: const EdgeInsets.all(8.0),
child: AppText(TranslationBase.of(context)
.noMedicalFileFound),
child: AppText(TranslationBase.of(context).noMedicalFileFound),
)
],
),

@ -1,6 +1,8 @@
import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/core/service/AnalyticsService.dart';
import 'package:doctor_app_flutter/core/viewModel/InsuranceViewModel.dart';
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
import 'package:doctor_app_flutter/locator.dart';
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/screens/patients/insurance_approvals_details.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
@ -92,11 +94,13 @@ class _InsuranceApprovalScreenNewState extends State<InsuranceApprovalScreenNew>
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => InsuranceApprovalsDetails(
patient: patient,
indexInsurance: index,
patientType: patientType,
),settings: RouteSettings(name: 'InsuranceApprovalsDetails'),),
builder: (context) => InsuranceApprovalsDetails(
patient: patient,
indexInsurance: index,
patientType: patientType,
),
settings: RouteSettings(name: 'InsuranceApprovalsDetails'),
),
);
},
child: DoctorCardInsurance(
@ -175,15 +179,21 @@ class _InsuranceApprovalScreenNewState extends State<InsuranceApprovalScreenNew>
model.insuranceApproval.length,
(index) => Container(
child: InkWell(
onTap: () {
onTap: () async {
await locator<AnalyticsService>().logEvent(
eventCategory: "Insurance Approval Screen New",
eventAction: "Insurance Approval Details",
);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => InsuranceApprovalsDetails(
patient: patient,
indexInsurance: index,
patientType: patientType,
),settings: RouteSettings(name: 'InsuranceApprovalsDetails'),),
builder: (context) => InsuranceApprovalsDetails(
patient: patient,
indexInsurance: index,
patientType: patientType,
),
settings: RouteSettings(name: 'InsuranceApprovalsDetails'),
),
);
},
child: DoctorCardInsurance(

@ -1,8 +1,10 @@
import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/model/admissionRequest/admission-request.dart';
import 'package:doctor_app_flutter/core/service/AnalyticsService.dart';
import 'package:doctor_app_flutter/core/viewModel/patient-admission-request-viewmodel.dart';
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
import 'package:doctor_app_flutter/locator.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/dr_app_toast_msg.dart';
@ -23,12 +25,10 @@ import '../../../../routes.dart';
class AdmissionRequestFirstScreen extends StatefulWidget {
@override
_AdmissionRequestThirdScreenState createState() =>
_AdmissionRequestThirdScreenState();
_AdmissionRequestThirdScreenState createState() => _AdmissionRequestThirdScreenState();
}
class _AdmissionRequestThirdScreenState
extends State<AdmissionRequestFirstScreen> {
class _AdmissionRequestThirdScreenState extends State<AdmissionRequestFirstScreen> {
final _dietTypeRemarksController = TextEditingController();
final _sickLeaveCommentsController = TextEditingController();
final _postMedicalHistoryController = TextEditingController();
@ -61,8 +61,7 @@ class _AdmissionRequestThirdScreenState
builder: (_, model, w) => AppScaffold(
baseViewModel: model,
isShowAppBar: true,
appBar: PatientProfileAppBar(
patient),
appBar: PatientProfileAppBar(patient),
appBarTitle: TranslationBase.of(context).admissionRequest,
body: GestureDetector(
onTap: () {
@ -100,14 +99,12 @@ class _AdmissionRequestThirdScreenState
),
),
Container(
margin:
EdgeInsets.symmetric(vertical: 0, horizontal: 16),
margin: EdgeInsets.symmetric(vertical: 0, horizontal: 16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AppText(
TranslationBase.of(context)
.specialityAndDoctorDetail,
TranslationBase.of(context).specialityAndDoctorDetail,
color: Color(0xFF2E303A),
fontSize: SizeConfig.textMultiplier * 1.8,
fontWeight: FontWeight.w700,
@ -121,14 +118,15 @@ class _AdmissionRequestThirdScreenState
isTextFieldHasSuffix: true,
validationError: clinicError,
dropDownText: _selectedClinic != null
? projectViewModel.isArabic? _selectedClinic['clinicNameArabic'] : _selectedClinic['clinicNameEnglish']
? projectViewModel.isArabic
? _selectedClinic['clinicNameArabic']
: _selectedClinic['clinicNameEnglish']
: null,
enabled: false,
onClick: model.clinicList != null &&
model.clinicList.length > 0
onClick: model.clinicList != null && model.clinicList.length > 0
? () {
openListDialogField(
projectViewModel.isArabic? 'clinicNameArabic' : 'clinicNameEnglish',
projectViewModel.isArabic ? 'clinicNameArabic' : 'clinicNameEnglish',
'clinicID',
model.clinicList, (selectedValue) {
setState(() {
@ -137,28 +135,21 @@ class _AdmissionRequestThirdScreenState
});
}
: () async {
GifLoaderDialogUtils.showMyDialog(
context);
await model.getClinics().then((_) =>
GifLoaderDialogUtils.hideDialog(
context));
if (model.state == ViewState.Idle &&
model.clinicList.length > 0) {
GifLoaderDialogUtils.showMyDialog(context);
await model.getClinics().then((_) => GifLoaderDialogUtils.hideDialog(context));
if (model.state == ViewState.Idle && model.clinicList.length > 0) {
openListDialogField(
projectViewModel.isArabic? 'clinicNameArabic' : 'clinicNameEnglish',
projectViewModel.isArabic ? 'clinicNameArabic' : 'clinicNameEnglish',
'clinicID',
model.clinicList, (selectedValue) {
setState(() {
_selectedClinic = selectedValue;
});
});
} else if (model.state ==
ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(
model.error);
} else if (model.state == ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(model.error);
} else {
DrAppToastMsg.showErrorToast(
"Empty List");
DrAppToastMsg.showErrorToast("Empty List");
}
},
),
@ -169,17 +160,13 @@ class _AdmissionRequestThirdScreenState
height: screenSize.height * 0.075,
hintText: TranslationBase.of(context).doctor,
isTextFieldHasSuffix: true,
dropDownText: _selectedDoctor != null
? _selectedDoctor['DoctorName']
: null,
dropDownText: _selectedDoctor != null ? _selectedDoctor['DoctorName'] : null,
enabled: false,
validationError: doctorError,
onClick: _selectedClinic != null
? model.doctorsList != null &&
model.doctorsList.length > 0
? model.doctorsList != null && model.doctorsList.length > 0
? () {
openListDialogField('DoctorName',
'DoctorID', model.doctorsList,
openListDialogField('DoctorName', 'DoctorID', model.doctorsList,
(selectedValue) {
setState(() {
_selectedDoctor = selectedValue;
@ -187,29 +174,21 @@ class _AdmissionRequestThirdScreenState
});
}
: () async {
GifLoaderDialogUtils.showMyDialog(
context);
GifLoaderDialogUtils.showMyDialog(context);
await model
.getClinicDoctors(
_selectedClinic['clinicID'])
.then((_) => GifLoaderDialogUtils
.hideDialog(context));
if (model.state == ViewState.Idle &&
model.doctorsList.length > 0) {
openListDialogField('DoctorName',
'DoctorID', model.doctorsList,
.getClinicDoctors(_selectedClinic['clinicID'])
.then((_) => GifLoaderDialogUtils.hideDialog(context));
if (model.state == ViewState.Idle && model.doctorsList.length > 0) {
openListDialogField('DoctorName', 'DoctorID', model.doctorsList,
(selectedValue) {
setState(() {
_selectedDoctor = selectedValue;
});
});
} else if (model.state ==
ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(
model.error);
} else if (model.state == ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(model.error);
} else {
DrAppToastMsg.showErrorToast(
"Empty List");
DrAppToastMsg.showErrorToast("Empty List");
}
}
: null,
@ -226,7 +205,7 @@ class _AdmissionRequestThirdScreenState
SizedBox(
height: 10,
),
if(patient.gender != 1)
if (patient.gender != 1)
CheckboxListTile(
title: AppText(
TranslationBase.of(context).patientPregnant,
@ -262,8 +241,7 @@ class _AdmissionRequestThirdScreenState
contentPadding: EdgeInsets.all(0),
),
AppTextFieldCustom(
hintText:
TranslationBase.of(context).sickLeaveComments,
hintText: TranslationBase.of(context).sickLeaveComments,
controller: _sickLeaveCommentsController,
minLines: 2,
maxLines: 4,
@ -278,43 +256,31 @@ class _AdmissionRequestThirdScreenState
hintText: TranslationBase.of(context).dietType,
isTextFieldHasSuffix: true,
validationError: dietTypeError,
dropDownText: _selectedDietType != null
? _selectedDietType['nameEn']
: null,
dropDownText: _selectedDietType != null ? _selectedDietType['nameEn'] : null,
enabled: false,
onClick: model.dietTypesList != null &&
model.dietTypesList.length > 0
onClick: model.dietTypesList != null && model.dietTypesList.length > 0
? () {
openListDialogField(
'nameEn', 'id', model.dietTypesList,
(selectedValue) {
openListDialogField('nameEn', 'id', model.dietTypesList, (selectedValue) {
setState(() {
_selectedDietType = selectedValue;
});
});
}
: () async {
GifLoaderDialogUtils.showMyDialog(
context);
await model.getDietTypes(patient.patientId).then((_) =>
GifLoaderDialogUtils.hideDialog(
context));
if (model.state == ViewState.Idle &&
model.dietTypesList.length > 0) {
openListDialogField(
'nameEn', 'id', model.dietTypesList,
(selectedValue) {
GifLoaderDialogUtils.showMyDialog(context);
await model
.getDietTypes(patient.patientId)
.then((_) => GifLoaderDialogUtils.hideDialog(context));
if (model.state == ViewState.Idle && model.dietTypesList.length > 0) {
openListDialogField('nameEn', 'id', model.dietTypesList, (selectedValue) {
setState(() {
_selectedDietType = selectedValue;
});
});
} else if (model.state ==
ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(
model.error);
} else if (model.state == ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(model.error);
} else {
DrAppToastMsg.showErrorToast(
"Empty List");
DrAppToastMsg.showErrorToast("Empty List");
}
},
),
@ -322,8 +288,7 @@ class _AdmissionRequestThirdScreenState
height: 10,
),
AppTextFieldCustom(
hintText:
TranslationBase.of(context).dietTypeRemarks,
hintText: TranslationBase.of(context).dietTypeRemarks,
controller: _dietTypeRemarksController,
minLines: 4,
maxLines: 6,
@ -363,82 +328,71 @@ class _AdmissionRequestThirdScreenState
child: AppButton(
title: TranslationBase.of(context).next,
color: HexColor("#D02127"),
onPressed: () {
onPressed: () async {
await locator<AnalyticsService>().logEvent(
eventCategory: "Admission Request First Screen",
eventAction: "Go To Admission Request Two",
);
model.admissionRequestData = AdmissionRequest();
if (_selectedClinic != null &&
_selectedDoctor != null &&
_sickLeaveCommentsController.text != "" &&
_postMedicalHistoryController.text != "" &&
_postSurgicalHistoryController.text != "") {
model.admissionRequestData.patientMRN =
patient.patientMRN;
model.admissionRequestData.appointmentNo =
patient.appointmentNo;
model.admissionRequestData.patientMRN = patient.patientMRN;
model.admissionRequestData.appointmentNo = patient.appointmentNo;
model.admissionRequestData.episodeID = patient.episodeNo;
model.admissionRequestData.admissionRequestNo = 0;
model.admissionRequestData.admitToClinic =
_selectedClinic['clinicID'];
model.admissionRequestData.mrpDoctorID =
_selectedDoctor['DoctorID'];
model.admissionRequestData.admitToClinic = _selectedClinic['clinicID'];
model.admissionRequestData.mrpDoctorID = _selectedDoctor['DoctorID'];
model.admissionRequestData.isPregnant = _patientPregnant;
model.admissionRequestData.isSickLeaveRequired =
_isSickLeaveRequired;
model.admissionRequestData.sickLeaveComments =
_sickLeaveCommentsController.text;
model.admissionRequestData.isDietType =
_selectedDietType != null ? true : false;
model.admissionRequestData.dietType =
_selectedDietType != null
? _selectedDietType['id']
: 0;
model.admissionRequestData.dietRemarks =
_dietTypeRemarksController.text;
model.admissionRequestData.pastMedicalHistory =
_postMedicalHistoryController.text;
model.admissionRequestData.pastSurgicalHistory =
_postSurgicalHistoryController.text;
Navigator.of(context)
.pushNamed(PATIENT_ADMISSION_REQUEST_2, arguments: {
model.admissionRequestData.isSickLeaveRequired = _isSickLeaveRequired;
model.admissionRequestData.sickLeaveComments = _sickLeaveCommentsController.text;
model.admissionRequestData.isDietType = _selectedDietType != null ? true : false;
model.admissionRequestData.dietType = _selectedDietType != null ? _selectedDietType['id'] : 0;
model.admissionRequestData.dietRemarks = _dietTypeRemarksController.text;
model.admissionRequestData.pastMedicalHistory = _postMedicalHistoryController.text;
model.admissionRequestData.pastSurgicalHistory = _postSurgicalHistoryController.text;
Navigator.of(context).pushNamed(PATIENT_ADMISSION_REQUEST_2, arguments: {
'patient': patient,
'patientType': patientType,
'arrivalType': arrivalType,
'admission-data': model.admissionRequestData
});
} else {
DrAppToastMsg.showErrorToast(
TranslationBase.of(context).pleaseFill);
DrAppToastMsg.showErrorToast(TranslationBase.of(context).pleaseFill);
setState(() {
if(_selectedClinic == null){
if (_selectedClinic == null) {
clinicError = TranslationBase.of(context).fieldRequired;
}else {
} else {
clinicError = null;
}
if(_selectedDoctor == null){
if (_selectedDoctor == null) {
doctorError = TranslationBase.of(context).fieldRequired;
}else {
} else {
doctorError = null;
}
if(_sickLeaveCommentsController.text == ""){
if (_sickLeaveCommentsController.text == "") {
sickLeaveCommentError = TranslationBase.of(context).fieldRequired;
}else {
} else {
sickLeaveCommentError = null;
}
if(_selectedDietType == null){
if (_selectedDietType == null) {
dietTypeError = TranslationBase.of(context).fieldRequired;
}else {
} else {
dietTypeError = null;
}
if(_postMedicalHistoryController.text == ""){
if (_postMedicalHistoryController.text == "") {
medicalHistoryError = TranslationBase.of(context).fieldRequired;
}else {
} else {
medicalHistoryError = null;
}
if(_postSurgicalHistoryController.text == ""){
if (_postSurgicalHistoryController.text == "") {
surgicalHistoryError = TranslationBase.of(context).fieldRequired;
}else {
} else {
surgicalHistoryError = null;
}
});
@ -453,8 +407,8 @@ class _AdmissionRequestThirdScreenState
);
}
void openListDialogField(String attributeName, String attributeValueId,
List<dynamic> list, Function(dynamic selectedValue) okFunction) {
void openListDialogField(
String attributeName, String attributeValueId, List<dynamic> list, Function(dynamic selectedValue) okFunction) {
ListSelectDialog dialog = ListSelectDialog(
list: list,
attributeName: attributeName,

@ -2,8 +2,10 @@ import 'package:doctor_app_flutter/config/size_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/model/admissionRequest/admission-request.dart';
import 'package:doctor_app_flutter/core/service/AnalyticsService.dart';
import 'package:doctor_app_flutter/core/viewModel/patient-admission-request-viewmodel.dart';
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
import 'package:doctor_app_flutter/locator.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/dr_app_toast_msg.dart';
@ -23,12 +25,10 @@ import '../../../../routes.dart';
class AdmissionRequestThirdScreen extends StatefulWidget {
@override
_AdmissionRequestThirdScreenState createState() =>
_AdmissionRequestThirdScreenState();
_AdmissionRequestThirdScreenState createState() => _AdmissionRequestThirdScreenState();
}
class _AdmissionRequestThirdScreenState
extends State<AdmissionRequestThirdScreen> {
class _AdmissionRequestThirdScreenState extends State<AdmissionRequestThirdScreen> {
dynamic _selectedDiagnosis;
dynamic _selectedIcd;
dynamic _selectedDiagnosisType;
@ -52,8 +52,7 @@ class _AdmissionRequestThirdScreenState
builder: (_, model, w) => AppScaffold(
baseViewModel: model,
isShowAppBar: true,
appBar: PatientProfileAppBar(
patient),
appBar: PatientProfileAppBar(patient),
appBarTitle: TranslationBase.of(context).admissionRequest,
body: GestureDetector(
onTap: () {
@ -106,18 +105,13 @@ class _AdmissionRequestThirdScreenState
AppTextFieldCustom(
height: screenSize.height * 0.075,
hintText: TranslationBase.of(context).diagnosis,
dropDownText: _selectedDiagnosis != null
? _selectedDiagnosis['nameEn']
: null,
dropDownText: _selectedDiagnosis != null ? _selectedDiagnosis['nameEn'] : null,
enabled: false,
isTextFieldHasSuffix: true,
validationError: diagnosisError,
onClick: model.diagnosisTypesList != null &&
model.diagnosisTypesList.length > 0
onClick: model.diagnosisTypesList != null && model.diagnosisTypesList.length > 0
? () {
openListDialogField('nameEn', 'id',
model.diagnosisTypesList,
(selectedValue) {
openListDialogField('nameEn', 'id', model.diagnosisTypesList, (selectedValue) {
setState(() {
_selectedDiagnosis = selectedValue;
});
@ -125,24 +119,17 @@ class _AdmissionRequestThirdScreenState
}
: () async {
GifLoaderDialogUtils.showMyDialog(context);
await model.getDiagnosis().then((_) =>
GifLoaderDialogUtils.hideDialog(
context));
if (model.state == ViewState.Idle &&
model.diagnosisTypesList.length > 0) {
openListDialogField('nameEn', 'id',
model.diagnosisTypesList,
(selectedValue) {
await model.getDiagnosis().then((_) => GifLoaderDialogUtils.hideDialog(context));
if (model.state == ViewState.Idle && model.diagnosisTypesList.length > 0) {
openListDialogField('nameEn', 'id', model.diagnosisTypesList, (selectedValue) {
setState(() {
_selectedDiagnosis = selectedValue;
});
});
} else if (model.state ==
ViewState.ErrorLocal) {
} else if (model.state == ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(model.error);
} else {
DrAppToastMsg.showErrorToast(
"Empty List");
DrAppToastMsg.showErrorToast("Empty List");
}
},
),
@ -152,18 +139,13 @@ class _AdmissionRequestThirdScreenState
AppTextFieldCustom(
height: screenSize.height * 0.075,
hintText: TranslationBase.of(context).icd,
dropDownText: _selectedIcd != null
? _selectedIcd['description']
: null,
dropDownText: _selectedIcd != null ? _selectedIcd['description'] : null,
enabled: false,
isTextFieldHasSuffix: true,
validationError: icdError,
onClick: model.icdCodes != null &&
model.icdCodes.length > 0
onClick: model.icdCodes != null && model.icdCodes.length > 0
? () {
openListDialogField(
'description', 'code', model.icdCodes,
(selectedValue) {
openListDialogField('description', 'code', model.icdCodes, (selectedValue) {
setState(() {
_selectedIcd = selectedValue;
});
@ -173,24 +155,17 @@ class _AdmissionRequestThirdScreenState
GifLoaderDialogUtils.showMyDialog(context);
await model
.getICDCodes(patient.patientMRN)
.then((_) =>
GifLoaderDialogUtils.hideDialog(
context));
if (model.state == ViewState.Idle &&
model.icdCodes.length > 0) {
openListDialogField(
'description', 'code', model.icdCodes,
(selectedValue) {
.then((_) => GifLoaderDialogUtils.hideDialog(context));
if (model.state == ViewState.Idle && model.icdCodes.length > 0) {
openListDialogField('description', 'code', model.icdCodes, (selectedValue) {
setState(() {
_selectedIcd = selectedValue;
});
});
} else if (model.state ==
ViewState.ErrorLocal) {
} else if (model.state == ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(model.error);
} else {
DrAppToastMsg.showErrorToast(
"Empty List");
DrAppToastMsg.showErrorToast("Empty List");
}
},
),
@ -200,19 +175,14 @@ class _AdmissionRequestThirdScreenState
AppTextFieldCustom(
height: screenSize.height * 0.075,
hintText: TranslationBase.of(context).diagnoseType,
dropDownText: _selectedDiagnosisType != null
? _selectedDiagnosisType['description']
: null,
dropDownText: _selectedDiagnosisType != null ? _selectedDiagnosisType['description'] : null,
enabled: false,
isTextFieldHasSuffix: true,
validationError: diagnosisTypeError,
onClick: model.listOfDiagnosisSelectionTypes !=
null &&
model.listOfDiagnosisSelectionTypes.length >
0
onClick: model.listOfDiagnosisSelectionTypes != null &&
model.listOfDiagnosisSelectionTypes.length > 0
? () {
openListDialogField('description', 'code',
model.listOfDiagnosisSelectionTypes,
openListDialogField('description', 'code', model.listOfDiagnosisSelectionTypes,
(selectedValue) {
setState(() {
_selectedDiagnosisType = selectedValue;
@ -222,29 +192,20 @@ class _AdmissionRequestThirdScreenState
: () async {
GifLoaderDialogUtils.showMyDialog(context);
await model
.getMasterLookup(MasterKeysService
.DiagnosisSelectionType)
.then((_) =>
GifLoaderDialogUtils.hideDialog(
context));
.getMasterLookup(MasterKeysService.DiagnosisSelectionType)
.then((_) => GifLoaderDialogUtils.hideDialog(context));
if (model.state == ViewState.Idle &&
model.listOfDiagnosisSelectionTypes
.length >
0) {
openListDialogField('description', 'code',
model.listOfDiagnosisSelectionTypes,
model.listOfDiagnosisSelectionTypes.length > 0) {
openListDialogField('description', 'code', model.listOfDiagnosisSelectionTypes,
(selectedValue) {
setState(() {
_selectedDiagnosisType =
selectedValue;
_selectedDiagnosisType = selectedValue;
});
});
} else if (model.state ==
ViewState.ErrorLocal) {
} else if (model.state == ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(model.error);
} else {
DrAppToastMsg.showErrorToast(
"Empty List");
DrAppToastMsg.showErrorToast("Empty List");
}
},
),
@ -279,58 +240,52 @@ class _AdmissionRequestThirdScreenState
title: TranslationBase.of(context).submit,
color: HexColor("#359846"),
onPressed: () async {
if (_selectedDiagnosis != null &&
_selectedIcd != null &&
_selectedDiagnosisType != null) {
await locator<AnalyticsService>().logEvent(
eventCategory: "Admission Request Third Screen",
eventAction: "Submit Admission Request",
);
if (_selectedDiagnosis != null && _selectedIcd != null && _selectedDiagnosisType != null) {
model.admissionRequestData = admissionRequest;
dynamic admissionRequestDiagnoses = [
{
'diagnosisDescription':
_selectedDiagnosis['nameEn'],
'diagnosisDescription': _selectedDiagnosis['nameEn'],
'diagnosisType': _selectedDiagnosis['id'],
'icdCode': _selectedIcd['code'],
'icdCodeDescription':
_selectedIcd['description'],
'icdCodeDescription': _selectedIcd['description'],
'type': _selectedDiagnosisType['code'],
'remarks': "",
'isActive': true,
}
];
model.admissionRequestData
.admissionRequestDiagnoses =
admissionRequestDiagnoses;
model.admissionRequestData.admissionRequestDiagnoses = admissionRequestDiagnoses;
await model.makeAdmissionRequest();
if (model.state == ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(model.error);
} else {
DrAppToastMsg.showSuccesToast(
TranslationBase.of(context)
.admissionRequestSuccessMsg);
Navigator.popUntil(context,
ModalRoute.withName(PATIENTS_PROFILE));
DrAppToastMsg.showSuccesToast(TranslationBase.of(context).admissionRequestSuccessMsg);
Navigator.popUntil(context, ModalRoute.withName(PATIENTS_PROFILE));
}
} else {
DrAppToastMsg.showErrorToast(
TranslationBase.of(context).pleaseFill);
DrAppToastMsg.showErrorToast(TranslationBase.of(context).pleaseFill);
setState(() {
if(_selectedDiagnosis == null){
if (_selectedDiagnosis == null) {
diagnosisError = TranslationBase.of(context).fieldRequired;
}else {
} else {
diagnosisError = null;
}
if(_selectedIcd == null){
if (_selectedIcd == null) {
icdError = TranslationBase.of(context).fieldRequired;
}else {
} else {
icdError = null;
}
if(_selectedDiagnosisType == null){
if (_selectedDiagnosisType == null) {
diagnosisTypeError = TranslationBase.of(context).fieldRequired;
}else {
} else {
diagnosisTypeError = null;
}
});
@ -348,8 +303,8 @@ class _AdmissionRequestThirdScreenState
);
}
void openListDialogField(String attributeName, String attributeValueId,
List<dynamic> list, Function(dynamic selectedValue) okFunction) {
void openListDialogField(
String attributeName, String attributeValueId, List<dynamic> list, Function(dynamic selectedValue) okFunction) {
ListSelectDialog dialog = ListSelectDialog(
list: list,
attributeName: attributeName,

@ -3,8 +3,10 @@ import 'package:doctor_app_flutter/config/size_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/model/admissionRequest/admission-request.dart';
import 'package:doctor_app_flutter/core/service/AnalyticsService.dart';
import 'package:doctor_app_flutter/core/viewModel/patient-admission-request-viewmodel.dart';
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
import 'package:doctor_app_flutter/locator.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/date-utils.dart';
@ -26,12 +28,10 @@ import '../../../../routes.dart';
class AdmissionRequestSecondScreen extends StatefulWidget {
@override
_AdmissionRequestSecondScreenState createState() =>
_AdmissionRequestSecondScreenState();
_AdmissionRequestSecondScreenState createState() => _AdmissionRequestSecondScreenState();
}
class _AdmissionRequestSecondScreenState
extends State<AdmissionRequestSecondScreen> {
class _AdmissionRequestSecondScreenState extends State<AdmissionRequestSecondScreen> {
final _postPlansEstimatedCostController = TextEditingController();
final _estimatedCostController = TextEditingController();
final _expectedDaysController = TextEditingController();
@ -74,8 +74,7 @@ class _AdmissionRequestSecondScreenState
builder: (_, model, w) => AppScaffold(
baseViewModel: model,
isShowAppBar: true,
appBar: PatientProfileAppBar(
patient),
appBar: PatientProfileAppBar(patient),
appBarTitle: TranslationBase.of(context).admissionRequest,
body: GestureDetector(
onTap: () {
@ -112,14 +111,12 @@ class _AdmissionRequestSecondScreenState
),
),
Container(
margin:
EdgeInsets.symmetric(vertical: 0, horizontal: 16),
margin: EdgeInsets.symmetric(vertical: 0, horizontal: 16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AppText(
TranslationBase.of(context)
.postPlansEstimatedCost,
TranslationBase.of(context).postPlansEstimatedCost,
color: Color(0xFF2E303A),
fontSize: SizeConfig.textMultiplier * 1.8,
fontWeight: FontWeight.w700,
@ -129,15 +126,11 @@ class _AdmissionRequestSecondScreenState
),
AppTextFieldCustom(
height: screenSize.height * 0.075,
hintText:
TranslationBase.of(context).estimatedCost,
hintText: TranslationBase.of(context).estimatedCost,
controller: _estimatedCostController,
validationError: costError,
inputType: TextInputType.number,
inputFormatters: [
FilteringTextInputFormatter.allow(
RegExp(ONLY_NUMBERS))
],
inputFormatters: [FilteringTextInputFormatter.allow(RegExp(ONLY_NUMBERS))],
),
SizedBox(
height: 10,
@ -154,10 +147,8 @@ class _AdmissionRequestSecondScreenState
height: 10,
),
AppTextFieldCustom(
hintText: TranslationBase.of(context)
.otherDepartmentsInterventions,
controller:
_otherDepartmentsInterventionsController,
hintText: TranslationBase.of(context).otherDepartmentsInterventions,
controller: _otherDepartmentsInterventionsController,
inputType: TextInputType.multiline,
validationError: otherInterventionsError,
minLines: 2,
@ -177,23 +168,18 @@ class _AdmissionRequestSecondScreenState
),
AppTextFieldCustom(
height: screenSize.height * 0.075,
hintText:
TranslationBase.of(context).expectedDays,
hintText: TranslationBase.of(context).expectedDays,
controller: _expectedDaysController,
validationError: expectedDaysError,
inputType: TextInputType.number,
inputFormatters: [
FilteringTextInputFormatter.allow(
RegExp(ONLY_NUMBERS))
],
inputFormatters: [FilteringTextInputFormatter.allow(RegExp(ONLY_NUMBERS))],
),
SizedBox(
height: 10,
),
AppTextFieldCustom(
height: screenSize.height * 0.075,
hintText: TranslationBase.of(context)
.expectedAdmissionDate,
hintText: TranslationBase.of(context).expectedAdmissionDate,
dropDownText: _expectedAdmissionDate != null
? "${AppDateUtils.convertStringToDateFormat(_expectedAdmissionDate.toString(), "yyyy-MM-dd")}"
: null,
@ -209,8 +195,7 @@ class _AdmissionRequestSecondScreenState
if (_expectedAdmissionDate == null) {
_expectedAdmissionDate = DateTime.now();
}
_selectDate(context, _expectedAdmissionDate,
(picked) {
_selectDate(context, _expectedAdmissionDate, (picked) {
setState(() {
_expectedAdmissionDate = picked;
});
@ -223,47 +208,32 @@ class _AdmissionRequestSecondScreenState
AppTextFieldCustom(
height: screenSize.height * 0.075,
hintText: TranslationBase.of(context).floor,
dropDownText: _selectedFloor != null
? _selectedFloor['description']
: null,
dropDownText: _selectedFloor != null ? _selectedFloor['description'] : null,
enabled: false,
isTextFieldHasSuffix: true,
validationError: floorError,
onClick: model.floorList != null &&
model.floorList.length > 0
onClick: model.floorList != null && model.floorList.length > 0
? () {
openListDialogField(
'description',
'floorID',
model.floorList, (selectedValue) {
openListDialogField('description', 'floorID', model.floorList, (selectedValue) {
setState(() {
_selectedFloor = selectedValue;
});
});
}
: () async {
GifLoaderDialogUtils.showMyDialog(
context);
await model.getFloors().then((_) =>
GifLoaderDialogUtils.hideDialog(
context));
if (model.state == ViewState.Idle &&
model.floorList.length > 0) {
openListDialogField(
'description',
'floorID',
model.floorList, (selectedValue) {
GifLoaderDialogUtils.showMyDialog(context);
await model.getFloors().then((_) => GifLoaderDialogUtils.hideDialog(context));
if (model.state == ViewState.Idle && model.floorList.length > 0) {
openListDialogField('description', 'floorID', model.floorList,
(selectedValue) {
setState(() {
_selectedFloor = selectedValue;
});
});
} else if (model.state ==
ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(
model.error);
} else if (model.state == ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(model.error);
} else {
DrAppToastMsg.showErrorToast(
"Empty List");
DrAppToastMsg.showErrorToast("Empty List");
}
},
),
@ -273,46 +243,32 @@ class _AdmissionRequestSecondScreenState
AppTextFieldCustom(
height: screenSize.height * 0.075,
hintText: TranslationBase.of(context).ward,
dropDownText: _selectedWard != null
? _selectedWard['description']
: null,
dropDownText: _selectedWard != null ? _selectedWard['description'] : null,
enabled: false,
isTextFieldHasSuffix: true,
onClick: model.wardList != null &&
model.wardList.length > 0
onClick: model.wardList != null && model.wardList.length > 0
? () {
openListDialogField(
'description',
'nursingStationID',
model.wardList, (selectedValue) {
openListDialogField('description', 'nursingStationID', model.wardList,
(selectedValue) {
setState(() {
_selectedWard = selectedValue;
});
});
}
: () async {
GifLoaderDialogUtils.showMyDialog(
context);
await model.getWards().then((_) =>
GifLoaderDialogUtils.hideDialog(
context));
if (model.state == ViewState.Idle &&
model.wardList.length > 0) {
openListDialogField(
'description',
'nursingStationID',
model.wardList, (selectedValue) {
GifLoaderDialogUtils.showMyDialog(context);
await model.getWards().then((_) => GifLoaderDialogUtils.hideDialog(context));
if (model.state == ViewState.Idle && model.wardList.length > 0) {
openListDialogField('description', 'nursingStationID', model.wardList,
(selectedValue) {
setState(() {
_selectedWard = selectedValue;
});
});
} else if (model.state ==
ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(
model.error);
} else if (model.state == ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(model.error);
} else {
DrAppToastMsg.showErrorToast(
"Empty List");
DrAppToastMsg.showErrorToast("Empty List");
}
},
),
@ -321,54 +277,37 @@ class _AdmissionRequestSecondScreenState
),
AppTextFieldCustom(
height: screenSize.height * 0.075,
hintText:
TranslationBase.of(context).roomCategory,
dropDownText: _selectedRoomCategory != null
? _selectedRoomCategory['description']
: null,
hintText: TranslationBase.of(context).roomCategory,
dropDownText:
_selectedRoomCategory != null ? _selectedRoomCategory['description'] : null,
enabled: false,
isTextFieldHasSuffix: true,
validationError: roomError,
onClick: model.roomCategoryList != null &&
model.roomCategoryList.length > 0
onClick: model.roomCategoryList != null && model.roomCategoryList.length > 0
? () {
openListDialogField(
'description',
'categoryID',
model.roomCategoryList,
openListDialogField('description', 'categoryID', model.roomCategoryList,
(selectedValue) {
setState(() {
_selectedRoomCategory =
selectedValue;
_selectedRoomCategory = selectedValue;
});
});
}
: () async {
GifLoaderDialogUtils.showMyDialog(
context);
await model.getRoomCategories().then(
(_) =>
GifLoaderDialogUtils.hideDialog(
context));
if (model.state == ViewState.Idle &&
model.roomCategoryList.length > 0) {
openListDialogField(
'description',
'categoryID',
model.roomCategoryList,
GifLoaderDialogUtils.showMyDialog(context);
await model
.getRoomCategories()
.then((_) => GifLoaderDialogUtils.hideDialog(context));
if (model.state == ViewState.Idle && model.roomCategoryList.length > 0) {
openListDialogField('description', 'categoryID', model.roomCategoryList,
(selectedValue) {
setState(() {
_selectedRoomCategory =
selectedValue;
_selectedRoomCategory = selectedValue;
});
});
} else if (model.state ==
ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(
model.error);
} else if (model.state == ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(model.error);
} else {
DrAppToastMsg.showErrorToast(
"Empty List");
DrAppToastMsg.showErrorToast("Empty List");
}
},
),
@ -376,8 +315,7 @@ class _AdmissionRequestSecondScreenState
height: 10,
),
AppTextFieldCustom(
hintText:
TranslationBase.of(context).treatmentLine,
hintText: TranslationBase.of(context).treatmentLine,
controller: _treatmentLineController,
inputType: TextInputType.multiline,
validationError: treatmentsError,
@ -388,8 +326,7 @@ class _AdmissionRequestSecondScreenState
height: 10,
),
AppTextFieldCustom(
hintText:
TranslationBase.of(context).complications,
hintText: TranslationBase.of(context).complications,
controller: _complicationsController,
inputType: TextInputType.multiline,
validationError: complicationsError,
@ -400,8 +337,7 @@ class _AdmissionRequestSecondScreenState
height: 10,
),
AppTextFieldCustom(
hintText:
TranslationBase.of(context).otherProcedure,
hintText: TranslationBase.of(context).otherProcedure,
controller: _otherProceduresController,
inputType: TextInputType.multiline,
validationError: proceduresError,
@ -413,53 +349,34 @@ class _AdmissionRequestSecondScreenState
),
AppTextFieldCustom(
height: screenSize.height * 0.075,
hintText:
TranslationBase.of(context).admissionType,
dropDownText: _selectedAdmissionType != null
? _selectedAdmissionType['nameEn']
: null,
hintText: TranslationBase.of(context).admissionType,
dropDownText: _selectedAdmissionType != null ? _selectedAdmissionType['nameEn'] : null,
enabled: false,
isTextFieldHasSuffix: true,
validationError: admissionTypeError,
onClick: model.admissionTypeList != null &&
model.admissionTypeList.length > 0
onClick: model.admissionTypeList != null && model.admissionTypeList.length > 0
? () {
openListDialogField('nameEn', 'id',
model.admissionTypeList,
(selectedValue) {
openListDialogField('nameEn', 'id', model.admissionTypeList, (selectedValue) {
setState(() {
_selectedAdmissionType =
selectedValue;
_selectedAdmissionType = selectedValue;
});
});
}
: () async {
GifLoaderDialogUtils.showMyDialog(
context);
GifLoaderDialogUtils.showMyDialog(context);
await model
.getMasterLookup(MasterKeysService
.AdmissionRequestType)
.then((_) =>
GifLoaderDialogUtils.hideDialog(
context));
if (model.state == ViewState.Idle &&
model.admissionTypeList.length >
0) {
openListDialogField('nameEn', 'id',
model.admissionTypeList,
(selectedValue) {
.getMasterLookup(MasterKeysService.AdmissionRequestType)
.then((_) => GifLoaderDialogUtils.hideDialog(context));
if (model.state == ViewState.Idle && model.admissionTypeList.length > 0) {
openListDialogField('nameEn', 'id', model.admissionTypeList, (selectedValue) {
setState(() {
_selectedAdmissionType =
selectedValue;
_selectedAdmissionType = selectedValue;
});
});
} else if (model.state ==
ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(
model.error);
} else if (model.state == ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(model.error);
} else {
DrAppToastMsg.showErrorToast(
"Empty List");
DrAppToastMsg.showErrorToast("Empty List");
}
},
),
@ -492,144 +409,115 @@ class _AdmissionRequestSecondScreenState
title: TranslationBase.of(context).next,
color: HexColor("#D02127"),
onPressed: () async {
await locator<AnalyticsService>().logEvent(
eventCategory: "Admission Request Second Screen",
eventAction: "Go To Admission Request Three",
);
if (_estimatedCostController.text != "" &&
_postPlansEstimatedCostController.text != "" &&
_expectedDaysController.text != "" &&
_expectedAdmissionDate != null &&
_otherDepartmentsInterventionsController.text !=
"" &&
_otherDepartmentsInterventionsController.text != "" &&
_selectedFloor != null &&
_selectedRoomCategory !=
null /*_selectedWard is not required*/ &&
_selectedRoomCategory != null /*_selectedWard is not required*/ &&
_treatmentLineController.text != "" &&
_complicationsController.text != "" &&
_otherProceduresController.text != "" &&
_selectedAdmissionType != null) {
model.admissionRequestData = admissionRequest;
model.admissionRequestData.estimatedCost =
int.parse(_estimatedCostController.text);
model.admissionRequestData
.elementsForImprovement =
model.admissionRequestData.estimatedCost = int.parse(_estimatedCostController.text);
model.admissionRequestData.elementsForImprovement =
_postPlansEstimatedCostController.text;
model.admissionRequestData.expectedDays =
int.parse(_expectedDaysController.text);
model.admissionRequestData.admissionDate =
_expectedAdmissionDate.toIso8601String();
model.admissionRequestData
.otherDepartmentInterventions =
model.admissionRequestData.expectedDays = int.parse(_expectedDaysController.text);
model.admissionRequestData.admissionDate = _expectedAdmissionDate.toIso8601String();
model.admissionRequestData.otherDepartmentInterventions =
_otherDepartmentsInterventionsController.text;
model.admissionRequestData.admissionLocationID =
_selectedFloor['floorID'];
model.admissionRequestData.admissionLocationID = _selectedFloor['floorID'];
model.admissionRequestData.wardID =
_selectedWard != null
? _selectedWard['nursingStationID']
: 0;
model.admissionRequestData.roomCategoryID =
_selectedRoomCategory['categoryID'];
_selectedWard != null ? _selectedWard['nursingStationID'] : 0;
model.admissionRequestData.roomCategoryID = _selectedRoomCategory['categoryID'];
model.admissionRequestData
.admissionRequestProcedures = [];
model.admissionRequestData.admissionRequestProcedures = [];
model.admissionRequestData.mainLineOfTreatment =
_treatmentLineController.text;
model.admissionRequestData.complications =
_complicationsController.text;
model.admissionRequestData.otherProcedures =
_otherProceduresController.text;
model.admissionRequestData.admissionType =
_selectedAdmissionType['id'];
model.admissionRequestData.mainLineOfTreatment = _treatmentLineController.text;
model.admissionRequestData.complications = _complicationsController.text;
model.admissionRequestData.otherProcedures = _otherProceduresController.text;
model.admissionRequestData.admissionType = _selectedAdmissionType['id'];
Navigator.of(context).pushNamed(
PATIENT_ADMISSION_REQUEST_3,
arguments: {
'patient': patient,
'patientType': patientType,
'arrivalType': arrivalType,
'admission-data': model.admissionRequestData
});
Navigator.of(context).pushNamed(PATIENT_ADMISSION_REQUEST_3, arguments: {
'patient': patient,
'patientType': patientType,
'arrivalType': arrivalType,
'admission-data': model.admissionRequestData
});
} else {
DrAppToastMsg.showErrorToast(
TranslationBase.of(context).pleaseFill);
DrAppToastMsg.showErrorToast(TranslationBase.of(context).pleaseFill);
setState(() {
if (_estimatedCostController.text == "") {
costError =
TranslationBase.of(context).fieldRequired;
costError = TranslationBase.of(context).fieldRequired;
} else {
costError = null;
}
if (_postPlansEstimatedCostController.text ==
"") {
plansError =
TranslationBase.of(context).fieldRequired;
if (_postPlansEstimatedCostController.text == "") {
plansError = TranslationBase.of(context).fieldRequired;
} else {
plansError = null;
}
if (_expectedDaysController.text == "") {
expectedDaysError =
TranslationBase.of(context).fieldRequired;
expectedDaysError = TranslationBase.of(context).fieldRequired;
} else {
expectedDaysError = null;
}
if (_expectedAdmissionDate == null) {
expectedDatesError =
TranslationBase.of(context).fieldRequired;
expectedDatesError = TranslationBase.of(context).fieldRequired;
} else {
expectedDatesError = null;
}
if (_otherDepartmentsInterventionsController
.text ==
"") {
otherInterventionsError =
TranslationBase.of(context).fieldRequired;
if (_otherDepartmentsInterventionsController.text == "") {
otherInterventionsError = TranslationBase.of(context).fieldRequired;
} else {
otherInterventionsError = null;
}
if (_selectedFloor == null) {
floorError =
TranslationBase.of(context).fieldRequired;
floorError = TranslationBase.of(context).fieldRequired;
} else {
floorError = null;
}
if (_selectedRoomCategory == null) {
roomError =
TranslationBase.of(context).fieldRequired;
roomError = TranslationBase.of(context).fieldRequired;
} else {
roomError = null;
}
if (_treatmentLineController.text == "") {
treatmentsError =
TranslationBase.of(context).fieldRequired;
treatmentsError = TranslationBase.of(context).fieldRequired;
} else {
treatmentsError = null;
}
if (_complicationsController.text == "") {
complicationsError =
TranslationBase.of(context).fieldRequired;
complicationsError = TranslationBase.of(context).fieldRequired;
} else {
complicationsError = null;
}
if (_otherProceduresController.text == "") {
proceduresError =
TranslationBase.of(context).fieldRequired;
proceduresError = TranslationBase.of(context).fieldRequired;
} else {
proceduresError = null;
}
if (_selectedAdmissionType == null) {
admissionTypeError =
TranslationBase.of(context).fieldRequired;
admissionTypeError = TranslationBase.of(context).fieldRequired;
} else {
admissionTypeError = null;
}
@ -647,8 +535,7 @@ class _AdmissionRequestSecondScreenState
);
}
Future _selectDate(BuildContext context, DateTime dateTime,
Function(DateTime picked) updateDate) async {
Future _selectDate(BuildContext context, DateTime dateTime, Function(DateTime picked) updateDate) async {
final DateTime picked = await showDatePicker(
context: context,
initialDate: dateTime,
@ -661,8 +548,8 @@ class _AdmissionRequestSecondScreenState
}
}
void openListDialogField(String attributeName, String attributeValueId,
List<dynamic> list, Function(dynamic selectedValue) okFunction) {
void openListDialogField(
String attributeName, String attributeValueId, List<dynamic> list, Function(dynamic selectedValue) okFunction) {
ListSelectDialog dialog = ListSelectDialog(
list: list,
attributeName: attributeName,

@ -1,8 +1,10 @@
import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/service/AnalyticsService.dart';
import 'package:doctor_app_flutter/core/viewModel/PatientMedicalReportViewModel.dart';
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart';
import 'package:doctor_app_flutter/locator.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/date-utils.dart';
@ -75,166 +77,168 @@ class _MedicalReportPageState extends State<MedicalReportPage> {
),
),
AddNewOrder(
onTap: () {
onTap: () async {
// if (model.hasOnHold()) {
// Helpers.showErrorToast("Please Verified the on hold report to be able to add new one");
// } else
await locator<AnalyticsService>().logEvent(
eventCategory: "Medical Report Page",
eventAction: "Add New Medical Report",
);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => AddVerifyMedicalReport(
patient: patient,
patientType: patientType,
arrivalType: arrivalType,
model: model,
status: MedicalReportStatus.ADD,
),
builder: (context) => AddVerifyMedicalReport(
patient: patient,
patientType: patientType,
arrivalType: arrivalType,
model: model,
status: MedicalReportStatus.ADD,
),
settings: RouteSettings(name: 'AddVerifyMedicalReport'),
),
);
},
label: TranslationBase.of(context).createNewMedicalReport,
),
// if (model.state != ViewState.ErrorLocal)ß
...List.generate(
model.medicalReportList.length,
(index) => InkWell(
onTap: () {
if (model.medicalReportList[index].status == 1) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => AddVerifyMedicalReport(
patient: patient,
patientType: patientType,
arrivalType: arrivalType,
medicalReport: model.medicalReportList[index],
model: model,
medicalNote: model.medicalReportList[index].reportDataHtml,
),
settings: RouteSettings(name: 'AddVerifyMedicalReport')),
);
} else {
Navigator.of(context).pushNamed(PATIENT_MEDICAL_REPORT_DETAIL, arguments: {
'patient': patient,
'patientType': patientType,
'arrivalType': arrivalType,
'type': MedicalReportStatus.ADD,
'medicalReport': model.medicalReportList[index],
'model': model,
});
}
},
child: Container(
margin: EdgeInsets.symmetric(horizontal: 8),
child: CardWithBgWidget(
hasBorder: false,
bgColor: model.medicalReportList[index].status == 1 ? Color(0xFFCC9B14) : Colors.green[700],
widget: Column(
children: [
Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AppText(
model.medicalReportList[index].status == 1
? TranslationBase.of(context).onHold
: TranslationBase.of(context).verified,
color: model.medicalReportList[index].status == 1
? Color(0xFFCC9B14)
: Colors.green[700],
fontSize: 1.4 * SizeConfig.textMultiplier,
bold: true,
),
AppText(
projectViewModel.isArabic
? model.medicalReportList[index].doctorNameN ?? ""
: model.medicalReportList[index].doctorName ?? "",
fontSize: 1.9 * SizeConfig.textMultiplier,
fontWeight: FontWeight.w700,
color: Color(0xFF2E303A),
),
],
)),
Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
AppText(
'${AppDateUtils.convertDateFromServerFormat(model.medicalReportList[index].editedOn ?? model.medicalReportList[index].createdOn, "dd MMM yyyy")}',
color: Color(0xFF2E303A),
fontWeight: FontWeight.w600,
fontSize: 1.6 * SizeConfig.textMultiplier,
),
AppText(
'${AppDateUtils.convertDateFromServerFormat(model.medicalReportList[index].editedOn ?? model.medicalReportList[index].createdOn, "hh:mm a")}',
color: Color(0xFF2E303A),
fontWeight: FontWeight.w600,
fontSize: 1.5 * SizeConfig.textMultiplier,
),
],
// if (model.state != ViewState.ErrorLocal)ß
...List.generate(
model.medicalReportList.length,
(index) => InkWell(
onTap: () {
if (model.medicalReportList[index].status == 1) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => AddVerifyMedicalReport(
patient: patient,
patientType: patientType,
arrivalType: arrivalType,
medicalReport: model.medicalReportList[index],
model: model,
medicalNote: model.medicalReportList[index].reportDataHtml,
),
],
),
Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
margin: EdgeInsets.only(left: 0, top: 4, right: 8, bottom: 0),
child: LargeAvatar(
name: projectViewModel.isArabic
? model.medicalReportList[index].doctorNameN
: model.medicalReportList[index].doctorName,
url: model.medicalReportList[index].doctorImageURL,
settings: RouteSettings(name: 'AddVerifyMedicalReport')),
);
} else {
Navigator.of(context).pushNamed(PATIENT_MEDICAL_REPORT_DETAIL, arguments: {
'patient': patient,
'patientType': patientType,
'arrivalType': arrivalType,
'type': MedicalReportStatus.ADD,
'medicalReport': model.medicalReportList[index],
'model': model,
});
}
},
child: Container(
margin: EdgeInsets.symmetric(horizontal: 8),
child: CardWithBgWidget(
hasBorder: false,
bgColor: model.medicalReportList[index].status == 1 ? Color(0xFFCC9B14) : Colors.green[700],
widget: Column(
children: [
Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AppText(
model.medicalReportList[index].status == 1
? TranslationBase.of(context).onHold
: TranslationBase.of(context).verified,
color: model.medicalReportList[index].status == 1
? Color(0xFFCC9B14)
: Colors.green[700],
fontSize: 1.4 * SizeConfig.textMultiplier,
bold: true,
),
width: 50,
height: 50,
),
Expanded(
child: Container(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AppText(
projectViewModel.isArabic
? model.medicalReportList[index].projectNameN
: model.medicalReportList[index].projectName,
fontSize: 1.6 * SizeConfig.textMultiplier,
color: Color(0xFF2E303A),
),
AppText(
projectViewModel.isArabic
? model.medicalReportList[index].clinicNameN
: model.medicalReportList[index].clinicName,
fontSize: 1.6 * SizeConfig.textMultiplier,
color: Color(0xFF2E303A),
),
],
),
AppText(
projectViewModel.isArabic
? model.medicalReportList[index].doctorNameN ?? ""
: model.medicalReportList[index].doctorName ?? "",
fontSize: 1.9 * SizeConfig.textMultiplier,
fontWeight: FontWeight.w700,
color: Color(0xFF2E303A),
),
],
)),
Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
AppText(
'${AppDateUtils.convertDateFromServerFormat(model.medicalReportList[index].editedOn ?? model.medicalReportList[index].createdOn, "dd MMM yyyy")}',
color: Color(0xFF2E303A),
fontWeight: FontWeight.w600,
fontSize: 1.6 * SizeConfig.textMultiplier,
),
AppText(
'${AppDateUtils.convertDateFromServerFormat(model.medicalReportList[index].editedOn ?? model.medicalReportList[index].createdOn, "hh:mm a")}',
color: Color(0xFF2E303A),
fontWeight: FontWeight.w600,
fontSize: 1.5 * SizeConfig.textMultiplier,
),
],
),
],
),
Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
margin: EdgeInsets.only(left: 0, top: 4, right: 8, bottom: 0),
child: LargeAvatar(
name: projectViewModel.isArabic
? model.medicalReportList[index].doctorNameN
: model.medicalReportList[index].doctorName,
url: model.medicalReportList[index].doctorImageURL,
),
Container(
height: 50,
width: 50,
height: 50,
),
Expanded(
child: Container(
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Icon(
model.medicalReportList[index].status == 1 ? DoctorApp.edit_1 : EvaIcons.eye,
AppText(
projectViewModel.isArabic
? model.medicalReportList[index].projectNameN
: model.medicalReportList[index].projectName,
fontSize: 1.6 * SizeConfig.textMultiplier,
color: Color(0xFF2E303A),
),
AppText(
projectViewModel.isArabic
? model.medicalReportList[index].clinicNameN
: model.medicalReportList[index].clinicName,
fontSize: 1.6 * SizeConfig.textMultiplier,
color: Color(0xFF2E303A),
),
],
),
)
],
),
],
),
),
),
Container(
height: 50,
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Icon(
model.medicalReportList[index].status == 1 ? DoctorApp.edit_1 : EvaIcons.eye,
),
],
),
)
],
),
],
),
),
),
),
),
SizedBox(
height: 15,
)

@ -1,9 +1,11 @@
import 'package:doctor_app_flutter/core/model/note/note_model.dart';
import 'package:doctor_app_flutter/core/model/note/update_note_model.dart';
import 'package:doctor_app_flutter/core/service/AnalyticsService.dart';
import 'package:doctor_app_flutter/core/viewModel/authentication_view_model.dart';
import 'package:doctor_app_flutter/core/viewModel/patient_view_model.dart';
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart';
import 'package:doctor_app_flutter/locator.dart';
import 'package:doctor_app_flutter/models/patient/progress_note_request.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/screens/patients/profile/note/update_note.dart';
@ -43,8 +45,7 @@ class _ProgressNoteState extends State<ProgressNoteScreen> {
AuthenticationViewModel authenticationViewModel;
ProjectViewModel projectViewModel;
getProgressNoteList(BuildContext context, PatientViewModel model,
{bool isLocalBusy = false}) async {
getProgressNoteList(BuildContext context, PatientViewModel model, {bool isLocalBusy = false}) async {
final routeArgs = ModalRoute.of(context).settings.arguments as Map;
PatiantInformtion patient = routeArgs['patient'];
String token = await sharedPref.getString(TOKEN);
@ -59,10 +60,7 @@ class _ProgressNoteState extends State<ProgressNoteScreen> {
tokenID: token,
patientTypeID: patient.patientType,
languageID: 2);
model
.getPatientProgressNote(progressNoteRequest.toJson(),
isLocalBusy: isLocalBusy)
.then((c) {
model.getPatientProgressNote(progressNoteRequest.toJson(), isLocalBusy: isLocalBusy).then((c) {
notesList = model.patientProgressNoteList;
});
}
@ -71,180 +69,121 @@ class _ProgressNoteState extends State<ProgressNoteScreen> {
Widget build(BuildContext context) {
authenticationViewModel = Provider.of(context);
projectViewModel = Provider.of(context);
final routeArgs = ModalRoute
.of(context)
.settings
.arguments as Map;
final routeArgs = ModalRoute.of(context).settings.arguments as Map;
PatiantInformtion patient = routeArgs['patient'];
String arrivalType = routeArgs['arrivalType'];
if (routeArgs.containsKey('isDischargedPatient'))
isDischargedPatient = routeArgs['isDischargedPatient'];
if (routeArgs.containsKey('isDischargedPatient')) isDischargedPatient = routeArgs['isDischargedPatient'];
return BaseView<PatientViewModel>(
onModelReady: (model) => getProgressNoteList(context, model),
builder: (_, model, w) =>
AppScaffold(
baseViewModel: model,
backgroundColor: Theme
.of(context)
.scaffoldBackgroundColor,
// appBarTitle: TranslationBase.of(context).progressNote,
appBar: PatientProfileAppBar(
patient,
isInpatient: true,
),
body: model.patientProgressNoteList == null ||
model.patientProgressNoteList.length == 0
? DrAppEmbeddedError(
error: TranslationBase
.of(context)
.errorNoProgressNote)
: Container(
color: Colors.grey[200],
child: Column(
children: <Widget>[
if (!isDischargedPatient)
AddNewOrder(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
UpdateNoteOrder(
patientModel: model,
patient: patient,
visitType: widget.visitType,
isUpdate: false,
),settings: RouteSettings(name: 'UpdateNoteOrder'),),
);
},
label: widget.visitType == 3
? TranslationBase
.of(context)
.addNewOrderSheet
: TranslationBase
.of(context)
.addProgressNote,
),
Expanded(
child: Container(
child: ListView.builder(
itemCount: model.patientProgressNoteList.length,
itemBuilder: (BuildContext ctxt, int index) {
return FractionallySizedBox(
widthFactor: 0.95,
child: CardWithBgWidget(
hasBorder: false,
bgColor: model.patientProgressNoteList[index]
.status ==
1 &&
authenticationViewModel.doctorProfile.doctorID !=
model
.patientProgressNoteList[
index]
.createdBy
? Color(0xFFCC9B14)
: model.patientProgressNoteList[index]
.status ==
4
? Colors.red.shade700
: model.patientProgressNoteList[index]
.status ==
2
? Colors.green[600]
: Color(0xFFCC9B14),
widget: Column(
children: [
Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
if (model
.patientProgressNoteList[
index]
.status ==
1 &&
authenticationViewModel
.doctorProfile.doctorID !=
model
.patientProgressNoteList[
index]
.createdBy)
AppText(
TranslationBase
.of(context)
.notePending,
fontWeight: FontWeight.bold,
color: Color(0xFFCC9B14),
fontSize: 12,
),
if (model
.patientProgressNoteList[
index]
.status ==
4)
builder: (_, model, w) => AppScaffold(
baseViewModel: model,
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
// appBarTitle: TranslationBase.of(context).progressNote,
appBar: PatientProfileAppBar(
patient,
isInpatient: true,
),
body: model.patientProgressNoteList == null || model.patientProgressNoteList.length == 0
? DrAppEmbeddedError(error: TranslationBase.of(context).errorNoProgressNote)
: Container(
color: Colors.grey[200],
child: Column(
children: <Widget>[
if (!isDischargedPatient)
AddNewOrder(
onTap: () async {
await locator<AnalyticsService>().logEvent(
eventCategory: "Progress Note Screen",
eventAction: "Update Progress Note",
);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => UpdateNoteOrder(
patientModel: model,
patient: patient,
visitType: widget.visitType,
isUpdate: false,
),
settings: RouteSettings(name: 'UpdateNoteOrder'),
),
);
},
label: widget.visitType == 3
? TranslationBase.of(context).addNewOrderSheet
: TranslationBase.of(context).addProgressNote,
),
Expanded(
child: Container(
child: ListView.builder(
itemCount: model.patientProgressNoteList.length,
itemBuilder: (BuildContext ctxt, int index) {
return FractionallySizedBox(
widthFactor: 0.95,
child: CardWithBgWidget(
hasBorder: false,
bgColor: model.patientProgressNoteList[index].status == 1 &&
authenticationViewModel.doctorProfile.doctorID !=
model.patientProgressNoteList[index].createdBy
? Color(0xFFCC9B14)
: model.patientProgressNoteList[index].status == 4
? Colors.red.shade700
: model.patientProgressNoteList[index].status == 2
? Colors.green[600]
: Color(0xFFCC9B14),
widget: Column(
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (model.patientProgressNoteList[index].status == 1 &&
authenticationViewModel.doctorProfile.doctorID !=
model.patientProgressNoteList[index].createdBy)
AppText(
TranslationBase.of(context).notePending,
fontWeight: FontWeight.bold,
color: Color(0xFFCC9B14),
fontSize: 12,
),
if (model.patientProgressNoteList[index].status == 4)
AppText(
TranslationBase
.of(context)
.noteCanceled,
TranslationBase.of(context).noteCanceled,
fontWeight: FontWeight.bold,
color: Colors.red.shade700,
fontSize: 12,
),
if (model
.patientProgressNoteList[
index]
.status ==
2)
if (model.patientProgressNoteList[index].status == 2)
AppText(
TranslationBase
.of(context)
.noteVerified,
TranslationBase.of(context).noteVerified,
fontWeight: FontWeight.bold,
color: Colors.green[600],
fontSize: 12,
),
if (model.patientProgressNoteList[index].status != 2 &&
model
.patientProgressNoteList[
index]
.status !=
4 &&
authenticationViewModel
.doctorProfile.doctorID ==
model
.patientProgressNoteList[
index]
.createdBy)
model.patientProgressNoteList[index].status != 4 &&
authenticationViewModel.doctorProfile.doctorID ==
model.patientProgressNoteList[index].createdBy)
Row(
crossAxisAlignment:
CrossAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
UpdateNoteOrder(
note: model
.patientProgressNoteList[
index],
patientModel:
model,
patient:
patient,
visitType: widget
.visitType,
builder: (context) => UpdateNoteOrder(
note: model.patientProgressNoteList[index],
patientModel: model,
patient: patient,
visitType: widget.visitType,
isUpdate: true,
),settings: RouteSettings(name: 'UpdateNoteOrder'),),
)),
);
},
child: Container(
decoration: BoxDecoration(
color: Colors.grey[600],
borderRadius:
BorderRadius.circular(
10),
borderRadius: BorderRadius.circular(10),
),
// color:Colors.red[600],
@ -259,10 +198,7 @@ class _ProgressNoteState extends State<ProgressNoteScreen> {
width: 2,
),
AppText(
TranslationBase
.of(
context)
.update,
TranslationBase.of(context).update,
fontSize: 10,
color: Colors.white,
),
@ -280,61 +216,33 @@ class _ProgressNoteState extends State<ProgressNoteScreen> {
context: context,
actionName: "verify",
confirmFun: () async {
GifLoaderDialogUtils
.showMyDialog(
context);
UpdateNoteReqModel
reqModel =
UpdateNoteReqModel(
admissionNo: int
.parse(patient
.admissionNo),
cancelledNote:
false,
lineItemNo: model
.patientProgressNoteList[
index]
.lineItemNo,
createdBy: model
.patientProgressNoteList[
index]
.createdBy,
notes: model
.patientProgressNoteList[
index]
.notes,
GifLoaderDialogUtils.showMyDialog(context);
UpdateNoteReqModel reqModel = UpdateNoteReqModel(
admissionNo: int.parse(patient.admissionNo),
cancelledNote: false,
lineItemNo: model.patientProgressNoteList[index].lineItemNo,
createdBy: model.patientProgressNoteList[index].createdBy,
notes: model.patientProgressNoteList[index].notes,
verifiedNote: true,
patientTypeID:
patient
.patientType,
patientTypeID: patient.patientType,
patientOutSA: false,
);
await model
.updatePatientProgressNote(
reqModel);
await getProgressNoteList(
context, model,
isLocalBusy:
true);
GifLoaderDialogUtils
.hideDialog(
context);
await model.updatePatientProgressNote(reqModel);
await getProgressNoteList(context, model, isLocalBusy: true);
GifLoaderDialogUtils.hideDialog(context);
});
},
child: Container(
decoration: BoxDecoration(
color: Colors.green[600],
borderRadius:
BorderRadius.circular(
10),
borderRadius: BorderRadius.circular(10),
),
// color:Colors.red[600],
child: Row(
children: [
Icon(
FontAwesomeIcons
.check,
FontAwesomeIcons.check,
size: 12,
color: Colors.white,
),
@ -342,10 +250,7 @@ class _ProgressNoteState extends State<ProgressNoteScreen> {
width: 2,
),
AppText(
TranslationBase
.of(
context)
.noteVerify,
TranslationBase.of(context).noteVerify,
fontSize: 10,
color: Colors.white,
),
@ -361,67 +266,37 @@ class _ProgressNoteState extends State<ProgressNoteScreen> {
onTap: () async {
showMyDialog(
context: context,
actionName:
TranslationBase
.of(
context)
.cancel,
actionName: TranslationBase.of(context).cancel,
confirmFun: () async {
GifLoaderDialogUtils
.showMyDialog(
GifLoaderDialogUtils.showMyDialog(
context,
);
UpdateNoteReqModel
reqModel =
UpdateNoteReqModel(
admissionNo: int
.parse(patient
.admissionNo),
UpdateNoteReqModel reqModel = UpdateNoteReqModel(
admissionNo: int.parse(patient.admissionNo),
cancelledNote: true,
lineItemNo: model
.patientProgressNoteList[
index]
.lineItemNo,
createdBy: model
.patientProgressNoteList[
index]
.createdBy,
notes: model
.patientProgressNoteList[
index]
.notes,
lineItemNo: model.patientProgressNoteList[index].lineItemNo,
createdBy: model.patientProgressNoteList[index].createdBy,
notes: model.patientProgressNoteList[index].notes,
verifiedNote: false,
patientTypeID:
patient
.patientType,
patientTypeID: patient.patientType,
patientOutSA: false,
);
await model
.updatePatientProgressNote(
reqModel);
await getProgressNoteList(
context, model,
isLocalBusy:
true);
GifLoaderDialogUtils
.hideDialog(
context);
await model.updatePatientProgressNote(reqModel);
await getProgressNoteList(context, model, isLocalBusy: true);
GifLoaderDialogUtils.hideDialog(context);
});
},
child: Container(
decoration: BoxDecoration(
color: Colors.red[600],
borderRadius:
BorderRadius.circular(
10),
borderRadius: BorderRadius.circular(10),
),
// color:Colors.red[600],
child: Row(
children: [
Icon(
FontAwesomeIcons
.trash,
FontAwesomeIcons.trash,
size: 12,
color: Colors.white,
),
@ -447,41 +322,25 @@ class _ProgressNoteState extends State<ProgressNoteScreen> {
height: 10,
),
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
crossAxisAlignment:
CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: MediaQuery.of(context)
.size
.width *
0.60,
width: MediaQuery.of(context).size.width * 0.60,
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
crossAxisAlignment:
CrossAxisAlignment
.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AppText(
TranslationBase
.of(
context)
.createdBy,
TranslationBase.of(context).createdBy,
fontSize: 10,
),
Expanded(
child: AppText(
model
.patientProgressNoteList[
index]
.doctorName ??
'',
fontWeight:
FontWeight.w600,
model.patientProgressNoteList[index].doctorName ?? '',
fontWeight: FontWeight.w600,
fontSize: 12,
),
),
@ -493,85 +352,55 @@ class _ProgressNoteState extends State<ProgressNoteScreen> {
Column(
children: [
AppText(
model
.patientProgressNoteList[
index]
.createdOn !=
null
model.patientProgressNoteList[index].createdOn != null
? AppDateUtils.getDayMonthYearDateFormatted(
AppDateUtils
.getDateTimeFromServerFormat(
model
.patientProgressNoteList[
index]
.createdOn),
isArabic:
projectViewModel
.isArabic)
: AppDateUtils
.getDayMonthYearDateFormatted(
DateTime.now(),
isArabic:
projectViewModel
.isArabic),
AppDateUtils.getDateTimeFromServerFormat(
model.patientProgressNoteList[index].createdOn),
isArabic: projectViewModel.isArabic)
: AppDateUtils.getDayMonthYearDateFormatted(DateTime.now(),
isArabic: projectViewModel.isArabic),
fontWeight: FontWeight.w600,
fontSize: 14,
),
AppText(
model
.patientProgressNoteList[
index]
.createdOn !=
null
? AppDateUtils.getHour(AppDateUtils
.getDateTimeFromServerFormat(
model
.patientProgressNoteList[
index]
.createdOn))
: AppDateUtils.getHour(
DateTime.now()),
model.patientProgressNoteList[index].createdOn != null
? AppDateUtils.getHour(AppDateUtils.getDateTimeFromServerFormat(
model.patientProgressNoteList[index].createdOn))
: AppDateUtils.getHour(DateTime.now()),
fontWeight: FontWeight.w600,
fontSize: 14,
),
],
crossAxisAlignment:
CrossAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.end,
)
],
),
SizedBox(
height: 8,
),
Row(
mainAxisAlignment:
MainAxisAlignment.start,
children: [
Expanded(
child: AppText(
model
.patientProgressNoteList[
index]
.notes,
fontSize: 10,
),
),
])
],
),
SizedBox(
height: 20,
),
],
Row(mainAxisAlignment: MainAxisAlignment.start, children: [
Expanded(
child: AppText(
model.patientProgressNoteList[index].notes,
fontSize: 10,
),
),
])
],
),
SizedBox(
height: 20,
),
],
),
),
),
);
}),
);
}),
),
),
),
],
],
),
),
),
),
);
}
@ -580,100 +409,92 @@ class _ProgressNoteState extends State<ProgressNoteScreen> {
showDialog(
context: context,
builder: (ctx) => Center(
child: Container(
width: MediaQuery
.of(context)
.size
.width * 0.8,
height: 200,
child: AppScaffold(
isShowAppBar: false,
body: Container(
color: Colors.white,
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
// SizedBox(height: 20,),
SizedBox(
height: 10,
),
Row(
child: Container(
width: MediaQuery.of(context).size.width * 0.8,
height: 200,
child: AppScaffold(
isShowAppBar: false,
body: Container(
color: Colors.white,
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
AppText(
TranslationBase
.of(context)
.noteConfirm,
fontWeight: FontWeight.w600,
color: Colors.black,
fontSize: 16,
// SizedBox(height: 20,),
SizedBox(
height: 10,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
AppText(
TranslationBase.of(context).noteConfirm,
fontWeight: FontWeight.w600,
color: Colors.black,
fontSize: 16,
),
],
),
SizedBox(
height: 10,
),
DividerWithSpacesAround(),
SizedBox(
height: 12,
),
],
),
SizedBox(
height: 10,
),
DividerWithSpacesAround(),
SizedBox(
height: 12,
),
Container(
padding: EdgeInsets.all(20),
color: Colors.white,
child: AppText(
projectViewModel.isArabic?"هل أنت متأكد أنك تريد تنفيذ $actionName هذا الأمر؟":'Are you sure you want $actionName this order?',
fontSize: 15,
textAlign: TextAlign.center,
),
),
Container(
padding: EdgeInsets.all(20),
color: Colors.white,
child: AppText(
projectViewModel.isArabic
? "هل أنت متأكد أنك تريد تنفيذ $actionName هذا الأمر؟"
: 'Are you sure you want $actionName this order?',
fontSize: 15,
textAlign: TextAlign.center,
),
),
SizedBox(
height: 8,
SizedBox(
height: 8,
),
DividerWithSpacesAround(),
FractionallySizedBox(
widthFactor: 0.75,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
FlatButton(
child: AppText(
TranslationBase.of(context).cancel,
fontWeight: FontWeight.w600,
color: Colors.black,
fontSize: 16,
), //Text("Cancel"),
onPressed: () {
Navigator.of(context).pop();
}),
FlatButton(
child: AppText(
TranslationBase.of(context).noteConfirm,
fontWeight: FontWeight.w600,
color: Colors.red.shade700,
fontSize: 16,
), //Text("Confirm", ),
onPressed: () async {
await confirmFun();
Navigator.of(context).pop();
})
],
),
)
],
),
DividerWithSpacesAround(),
FractionallySizedBox(
widthFactor: 0.75,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
FlatButton(
child: AppText(
TranslationBase
.of(context)
.cancel,
fontWeight: FontWeight.w600,
color: Colors.black,
fontSize: 16,
), //Text("Cancel"),
onPressed: () {
Navigator.of(context).pop();
}),
FlatButton(
child: AppText(
TranslationBase
.of(context)
.noteConfirm,
fontWeight: FontWeight.w600,
color: Colors.red.shade700,
fontSize: 16,
), //Text("Confirm", ),
onPressed: () async {
await confirmFun();
Navigator.of(context).pop();
})
],
),
)
],
),
),
),
),
),
),
)
);
));
}
}

@ -1,6 +1,7 @@
import 'dart:async';
import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/service/AnalyticsService.dart';
import 'package:doctor_app_flutter/core/service/VideoCallService.dart';
import 'package:doctor_app_flutter/core/viewModel/LiveCarePatientViewModel.dart';
import 'package:doctor_app_flutter/core/viewModel/SOAP_view_model.dart';
@ -232,6 +233,10 @@ class _PatientProfileScreenState extends State<PatientProfileScreen> with Single
onPressed: () async {
if ((isFromLiveCare && patient.appointmentNo != null) ||
patient.patientStatusType == 43) {
await locator<AnalyticsService>().logEvent(
eventCategory: "Patient Profile",
eventAction: "Create Episode",
);
PostEpisodeReqModel postEpisodeReqModel = PostEpisodeReqModel(
appointmentNo: int.parse(patient.appointmentNo.toString()),
patientMRN: patient.patientMRN);
@ -264,7 +269,11 @@ class _PatientProfileScreenState extends State<PatientProfileScreen> with Single
color: Colors.white,
height: 30,
),
onPressed: () {
onPressed: () async {
await locator<AnalyticsService>().logEvent(
eventCategory: "Patient Profile ",
eventAction: "Update Episode",
);
if ((isFromLiveCare &&
patient.appointmentNo != null &&
patient.appointmentNo != 0) ||

@ -1,4 +1,5 @@
import 'package:doctor_app_flutter/core/model/radiology/final_radiology.dart';
import 'package:doctor_app_flutter/core/service/AnalyticsService.dart';
import 'package:doctor_app_flutter/core/viewModel/radiology_view_model.dart';
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
@ -11,6 +12,8 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';
import '../../../../locator.dart';
class RadiologyDetailsPage extends StatelessWidget {
final FinalRadiology finalRadiology;
final PatiantInformtion patient;
@ -19,12 +22,7 @@ class RadiologyDetailsPage extends StatelessWidget {
final bool isInpatient;
RadiologyDetailsPage(
{Key key,
this.finalRadiology,
this.patient,
this.patientType,
this.arrivalType,
this.isInpatient = false});
{Key key, this.finalRadiology, this.patient, this.patientType, this.arrivalType, this.isInpatient = false});
@override
Widget build(BuildContext context) {
@ -36,7 +34,7 @@ class RadiologyDetailsPage extends StatelessWidget {
invoiceNo: finalRadiology.invoiceNo),
builder: (_, model, widget) => AppScaffold(
appBar: PatientProfileAppBar(
patient,
patient,
appointmentDate: finalRadiology.orderDate,
doctorName: finalRadiology.doctorName,
clinic: finalRadiology.clinicDescription,
@ -44,7 +42,6 @@ class RadiologyDetailsPage extends StatelessWidget {
profileUrl: finalRadiology.doctorImageURL,
invoiceNO: finalRadiology.invoiceNo.toString(),
isAppointmentHeader: true,
),
isShowAppBar: true,
baseViewModel: model,
@ -68,9 +65,11 @@ class RadiologyDetailsPage extends StatelessWidget {
),
Padding(
padding: const EdgeInsets.all(8.0),
child: AppText(TranslationBase.of(context).generalResult,color: Color(0xff2E303A),),
child: AppText(
TranslationBase.of(context).generalResult,
color: Color(0xff2E303A),
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: AppText(
@ -94,13 +93,16 @@ class RadiologyDetailsPage extends StatelessWidget {
height: 80,
width: double.maxFinite,
child: Container(
margin:
EdgeInsets.only(left: 35, right: 35, top: 12, bottom: 12),
margin: EdgeInsets.only(left: 35, right: 35, top: 12, bottom: 12),
child: SecondaryButton(
color: Color(0xffD02127),
disabled: finalRadiology.dIAPACSURL == "",
textColor: Color(0xffFFFFFF),
onTap: () {
onTap: () async {
await locator<AnalyticsService>().logEvent(
eventCategory: "RadiologyDetailsPage",
eventAction: "Open Radiology Image",
);
launch(model.radImageURL);
},
label: TranslationBase.of(context).openRad,

@ -3,8 +3,10 @@ import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/model/referral/MyReferralPatientModel.dart';
import 'package:doctor_app_flutter/core/model/referral/add_referred_remarks_request.dart';
import 'package:doctor_app_flutter/core/provider/robot_provider.dart';
import 'package:doctor_app_flutter/core/service/AnalyticsService.dart';
import 'package:doctor_app_flutter/core/viewModel/patient-referral-viewmodel.dart';
import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart';
import 'package:doctor_app_flutter/locator.dart';
import 'package:doctor_app_flutter/screens/patients/profile/soap_update/shared_soap_widgets/bottom_sheet_title.dart';
import 'package:doctor_app_flutter/util/dr_app_toast_msg.dart';
import 'package:doctor_app_flutter/util/helpers.dart';
@ -138,6 +140,10 @@ class _AddReplayOnReferralPatientState extends State<AddReplayOnReferralPatient>
Expanded(
child: AppButton(
onPressed: () async {
await locator<AnalyticsService>().logEvent(
eventCategory: "Add Replay On Referral Patient",
eventAction: "Add Replay on Referral",
);
if (replayOnReferralController.text.isNotEmpty) {
GifLoaderDialogUtils.showMyDialog(context);
await widget.patientReferralViewModel.replayReferred(

@ -18,8 +18,7 @@ import 'package:flutter/material.dart';
class MyReferralDetailScreen extends StatelessWidget {
final MyReferralPatientModel referralPatient;
const MyReferralDetailScreen({Key key, this.referralPatient})
: super(key: key);
const MyReferralDetailScreen({Key key, this.referralPatient}) : super(key: key);
@override
Widget build(BuildContext context) {
@ -54,8 +53,7 @@ class MyReferralDetailScreen extends StatelessWidget {
),
Expanded(
child: AppText(
(Helpers.capitalize(referralPatient.firstName + " "+
referralPatient.lastName)),
(Helpers.capitalize(referralPatient.firstName + " " + referralPatient.lastName)),
fontSize: SizeConfig.textMultiplier * 2.5,
fontWeight: FontWeight.bold,
fontFamily: 'Poppins',
@ -95,62 +93,48 @@ class MyReferralDetailScreen extends StatelessWidget {
child: Column(
children: [
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
AppText(
referralPatient.referralStatus != null
? model.getReferralStatusNameByCode(
referralPatient.referralStatus,
context)
? model.getReferralStatusNameByCode(referralPatient.referralStatus, context)
: "",
fontFamily: 'Poppins',
fontSize: 1.9 * SizeConfig.textMultiplier,
fontWeight: FontWeight.w700,
color: referralPatient.referralStatus == 1
? Color(0xffc4aa54)
: referralPatient.referralStatus ==
46 ||
referralPatient
.referralStatus ==
2
: referralPatient.referralStatus == 46 || referralPatient.referralStatus == 2
? Colors.green[700]
: Colors.red[700],
),
AppText(
AppDateUtils.getDayMonthYearDateFormatted(
referralPatient.referralDate),
AppDateUtils.getDayMonthYearDateFormatted(referralPatient.referralDate),
fontFamily: 'Poppins',
fontWeight: FontWeight.w600,
fontSize:
2.0 * SizeConfig.textMultiplier,
fontSize: 2.0 * SizeConfig.textMultiplier,
color: Color(0XFF28353E),
)
],
),
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
mainAxisAlignment:
MainAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
AppText(
TranslationBase.of(context)
.fileNumber,
TranslationBase.of(context).fileNumber,
fontFamily: 'Poppins',
fontWeight: FontWeight.w600,
fontSize:
1.7 * SizeConfig.textMultiplier,
fontSize: 1.7 * SizeConfig.textMultiplier,
color: Color(0XFF575757),
),
AppText(
"${referralPatient.patientID}",
fontFamily: 'Poppins',
fontWeight: FontWeight.w700,
fontSize:
1.8 * SizeConfig.textMultiplier,
fontSize: 1.8 * SizeConfig.textMultiplier,
color: Color(0XFF2E303A),
),
],
@ -159,75 +143,56 @@ class MyReferralDetailScreen extends StatelessWidget {
AppDateUtils.getTimeHHMMA(referralPatient.referralDate),
fontFamily: 'Poppins',
fontWeight: FontWeight.w600,
fontSize:
1.8 * SizeConfig.textMultiplier,
fontSize: 1.8 * SizeConfig.textMultiplier,
color: Color(0XFF575757),
)
],
),
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
child: Column(
children: [
Row(
mainAxisAlignment:
MainAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
AppText(
TranslationBase.of(context)
.referredFrom,
TranslationBase.of(context).referredFrom,
fontFamily: 'Poppins',
fontWeight: FontWeight.w600,
fontSize: 1.7 *
SizeConfig.textMultiplier,
fontSize: 1.7 * SizeConfig.textMultiplier,
color: Color(0XFF575757),
),
AppText(
referralPatient.targetProjectId ==referralPatient.sourceProjectId
? TranslationBase.of(
context)
.sameBranch
: TranslationBase.of(
context)
.otherBranch,
referralPatient.targetProjectId == referralPatient.sourceProjectId
? TranslationBase.of(context).sameBranch
: TranslationBase.of(context).otherBranch,
fontFamily: 'Poppins',
fontWeight: FontWeight.w700,
fontSize: 1.8 *
SizeConfig
.textMultiplier,
fontSize: 1.8 * SizeConfig.textMultiplier,
color: Color(0XFF2E303A),
),
],
),
Row(
mainAxisAlignment:
MainAxisAlignment.start,
crossAxisAlignment:
CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AppText(
TranslationBase.of(context)
.remarks +
" : ",
TranslationBase.of(context).remarks + " : ",
fontFamily: 'Poppins',
fontWeight: FontWeight.w600,
fontSize: 1.7 *
SizeConfig.textMultiplier,
fontSize: 1.7 * SizeConfig.textMultiplier,
color: Color(0XFF575757),
),
Expanded(
child: AppText(
referralPatient.referringDoctorRemarks??
'',
referralPatient.referringDoctorRemarks ?? '',
fontFamily: 'Poppins',
fontWeight: FontWeight.w700,
fontSize: 1.8 *
SizeConfig.textMultiplier,
fontSize: 1.8 * SizeConfig.textMultiplier,
color: Color(0XFF2E303A),
),
),
@ -239,29 +204,22 @@ class MyReferralDetailScreen extends StatelessWidget {
Row(
children: [
AppText(
referralPatient.nationalityName !=
null
referralPatient.nationalityName != null
? referralPatient.nationalityName
: "",
fontWeight: FontWeight.bold,
color: Color(0xFF2E303A),
fontSize:
1.4 * SizeConfig.textMultiplier,
fontSize: 1.4 * SizeConfig.textMultiplier,
),
referralPatient.nationalityFlagURL !=
null
referralPatient.nationalityFlagURL != null
? ClipRRect(
borderRadius:
BorderRadius.circular(20.0),
borderRadius: BorderRadius.circular(20.0),
child: Image.network(
referralPatient
.nationalityFlagURL,
referralPatient.nationalityFlagURL,
height: 25,
width: 30,
errorBuilder: (BuildContext
context,
Object exception,
StackTrace stackTrace) {
errorBuilder:
(BuildContext context, Object exception, StackTrace stackTrace) {
return Text('No Image');
},
))
@ -274,8 +232,7 @@ class MyReferralDetailScreen extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
margin:
EdgeInsets.only(left: 10, right: 0),
margin: EdgeInsets.only(left: 10, right: 0),
child: Image.asset(
'assets/images/patient/ic_ref_arrow_up.png',
height: 50,
@ -283,20 +240,14 @@ class MyReferralDetailScreen extends StatelessWidget {
),
),
Container(
margin: EdgeInsets.only(
left: 0,
top: 25,
right: 0,
bottom: 0),
padding: EdgeInsets.only(
left: 4.0, right: 4.0),
margin: EdgeInsets.only(left: 0, top: 25, right: 0, bottom: 0),
padding: EdgeInsets.only(left: 4.0, right: 4.0),
child: Container(
width: 40,
height: 40,
child: CircleAvatar(
radius: 25.0,
backgroundImage: NetworkImage(
referralPatient.doctorImageURL),
backgroundImage: NetworkImage(referralPatient.doctorImageURL),
backgroundColor: Colors.transparent,
),
),
@ -304,19 +255,14 @@ class MyReferralDetailScreen extends StatelessWidget {
Expanded(
flex: 4,
child: Container(
margin: EdgeInsets.only(
left: 10,
top: 25,
right: 10,
bottom: 0),
margin: EdgeInsets.only(left: 10, top: 25, right: 10, bottom: 0),
child: Column(
children: [
AppText(
referralPatient.doctorName,
fontFamily: 'Poppins',
fontWeight: FontWeight.w700,
fontSize: 1.7 *
SizeConfig.textMultiplier,
fontSize: 1.7 * SizeConfig.textMultiplier,
color: Color(0XFF2E303A),
),
],
@ -347,8 +293,7 @@ class MyReferralDetailScreen extends StatelessWidget {
padding: const EdgeInsets.symmetric(horizontal: 16),
child: SizedBox(
child: ProfileMedicalInfoWidgetSearch(
patient: model
.getPatientFromReferralO(referralPatient),
patient: model.getPatientFromReferralO(referralPatient),
patientType: "7",
isInpatient: false,
from: null,
@ -380,9 +325,7 @@ class MyReferralDetailScreen extends StatelessWidget {
if (model.state == ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(model.error);
} else {
DrAppToastMsg.showSuccesToast(
TranslationBase.of(context)
.referralSuccessMsgAccept);
DrAppToastMsg.showSuccesToast(TranslationBase.of(context).referralSuccessMsgAccept);
model.getMyReferralOutPatientService();
Navigator.pop(context);
Navigator.pop(context);
@ -407,9 +350,7 @@ class MyReferralDetailScreen extends StatelessWidget {
if (model.state == ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(model.error);
} else {
DrAppToastMsg.showSuccesToast(
TranslationBase.of(context)
.referralSuccessMsgReject);
DrAppToastMsg.showSuccesToast(TranslationBase.of(context).referralSuccessMsgReject);
model.getMyReferralOutPatientService();
Navigator.pop(context);
Navigator.pop(context);

@ -1,6 +1,8 @@
import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/service/AnalyticsService.dart';
import 'package:doctor_app_flutter/core/viewModel/patient-referral-viewmodel.dart';
import 'package:doctor_app_flutter/locator.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/date-utils.dart';
@ -21,8 +23,7 @@ import 'package:hexcolor/hexcolor.dart';
class PatientMakeReferralScreen extends StatefulWidget {
// previous design page is: ReferPatientScreen
@override
_PatientMakeReferralScreenState createState() =>
_PatientMakeReferralScreenState();
_PatientMakeReferralScreenState createState() => _PatientMakeReferralScreenState();
}
class _PatientMakeReferralScreenState extends State<PatientMakeReferralScreen> {
@ -55,14 +56,8 @@ class _PatientMakeReferralScreenState extends State<PatientMakeReferralScreen> {
String arrivalType = routeArgs['arrivalType'];
referToList = List();
dynamic sameBranch = {
"id": 1,
"name": TranslationBase.of(context).sameBranch
};
dynamic otherBranch = {
"id": 2,
"name": TranslationBase.of(context).otherBranch
};
dynamic sameBranch = {"id": 1, "name": TranslationBase.of(context).sameBranch};
dynamic otherBranch = {"id": 2, "name": TranslationBase.of(context).otherBranch};
referToList.add(sameBranch);
referToList.add(otherBranch);
@ -74,8 +69,7 @@ class _PatientMakeReferralScreenState extends State<PatientMakeReferralScreen> {
baseViewModel: model,
appBarTitle: TranslationBase.of(context).referPatient,
isShowAppBar: true,
appBar: PatientProfileAppBar(
patient),
appBar: PatientProfileAppBar(patient),
body: SingleChildScrollView(
child: Container(
child: Column(
@ -109,57 +103,25 @@ class _PatientMakeReferralScreenState extends State<PatientMakeReferralScreen> {
model.patientReferral.length == 0
? referralForm(model, screenSize)
: PatientReferralItemWidget(
referralStatus: model
.patientReferral[
model.patientReferral.length - 1]
.referralStatus,
patientName: model
.patientReferral[
model.patientReferral.length - 1]
.patientName,
patientGender: model
.patientReferral[
model.patientReferral.length - 1]
.patientDetails
.gender,
referredDate: model
.patientReferral[
model.patientReferral.length - 1]
.referredOn
.split(" ")[0],
referredTime: model
.patientReferral[
model.patientReferral.length - 1]
.referredOn
.split(" ")[1],
patientID:
"${model.patientReferral[model.patientReferral.length - 1].patientID}",
isSameBranch: model
.patientReferral[
model.patientReferral.length - 1]
.isReferralDoctorSameBranch,
referralStatus: model.patientReferral[model.patientReferral.length - 1].referralStatus,
patientName: model.patientReferral[model.patientReferral.length - 1].patientName,
patientGender:
model.patientReferral[model.patientReferral.length - 1].patientDetails.gender,
referredDate:
model.patientReferral[model.patientReferral.length - 1].referredOn.split(" ")[0],
referredTime:
model.patientReferral[model.patientReferral.length - 1].referredOn.split(" ")[1],
patientID: "${model.patientReferral[model.patientReferral.length - 1].patientID}",
isSameBranch:
model.patientReferral[model.patientReferral.length - 1].isReferralDoctorSameBranch,
isReferral: true,
remark: model
.patientReferral[
model.patientReferral.length - 1]
.remarksFromSource,
nationality: model
.patientReferral[
model.patientReferral.length - 1]
.patientDetails
.nationalityName,
nationalityFlag: model
.patientReferral[
model.patientReferral.length - 1]
.nationalityFlagUrl,
doctorAvatar: model
.patientReferral[
model.patientReferral.length - 1]
.doctorImageUrl,
referralDoctorName: model
.patientReferral[
model.patientReferral.length - 1]
.referredByDoctorInfo,
remark: model.patientReferral[model.patientReferral.length - 1].remarksFromSource,
nationality:
model.patientReferral[model.patientReferral.length - 1].patientDetails.nationalityName,
nationalityFlag: model.patientReferral[model.patientReferral.length - 1].nationalityFlagUrl,
doctorAvatar: model.patientReferral[model.patientReferral.length - 1].doctorImageUrl,
referralDoctorName:
model.patientReferral[model.patientReferral.length - 1].referredByDoctorInfo,
clinicDescription: null,
),
],
@ -171,29 +133,29 @@ class _PatientMakeReferralScreenState extends State<PatientMakeReferralScreen> {
title: TranslationBase.of(context).refer,
fontWeight: FontWeight.w700,
color: HexColor("#359846"),
onPressed: () {
setState(() {
onPressed: () async {
setState(() async {
await locator<AnalyticsService>().logEvent(
eventCategory: "Refer Patient",
eventAction: "Submit Refer",
);
if (_referTo == null) {
branchError =
TranslationBase.of(context).fieldRequired;
branchError = TranslationBase.of(context).fieldRequired;
} else {
branchError = null;
}
if (_selectedBranch == null) {
hospitalError =
TranslationBase.of(context).fieldRequired;
hospitalError = TranslationBase.of(context).fieldRequired;
} else {
hospitalError = null;
}
if (_selectedClinic == null) {
clinicError =
TranslationBase.of(context).fieldRequired;
clinicError = TranslationBase.of(context).fieldRequired;
} else {
clinicError = null;
}
if (_selectedDoctor == null) {
doctorError =
TranslationBase.of(context).fieldRequired;
doctorError = TranslationBase.of(context).fieldRequired;
} else {
doctorError = null;
}
@ -204,16 +166,10 @@ class _PatientMakeReferralScreenState extends State<PatientMakeReferralScreen> {
_selectedDoctor == null ||
_remarksController.text == null) return;
model
.makeReferral(
patient,
appointmentDate.toIso8601String(),
_selectedBranch['facilityId'],
_selectedClinic['ClinicID'],
_selectedDoctor['DoctorID'],
_remarksController.text)
.makeReferral(patient, appointmentDate.toIso8601String(), _selectedBranch['facilityId'],
_selectedClinic['ClinicID'], _selectedDoctor['DoctorID'], _remarksController.text)
.then((_) {
DrAppToastMsg.showSuccesToast(
TranslationBase.of(context).referralSuccessMsg);
DrAppToastMsg.showSuccesToast(TranslationBase.of(context).referralSuccessMsg);
Navigator.pop(context);
});
},
@ -259,8 +215,7 @@ class _PatientMakeReferralScreenState extends State<PatientMakeReferralScreen> {
GifLoaderDialogUtils.showMyDialog(context);
await model
.getClinics(_selectedBranch['facilityId'])
.then((_) =>
GifLoaderDialogUtils.hideDialog(context));
.then((_) => GifLoaderDialogUtils.hideDialog(context));
if (model.state == ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(model.error);
}
@ -287,47 +242,42 @@ class _PatientMakeReferralScreenState extends State<PatientMakeReferralScreen> {
AppTextFieldCustom(
height: screenSize.height * 0.075,
hintText: TranslationBase.of(context).hospital,
dropDownText: _selectedBranch != null
? _selectedBranch['facilityName']
: null,
dropDownText: _selectedBranch != null ? _selectedBranch['facilityName'] : null,
enabled: false,
isTextFieldHasSuffix: true,
validationError: hospitalError,
onClick: model.branchesList != null &&
model.branchesList.length > 0 &&
_referTo != null &&
_referTo['id'] == 2
? () {
ListSelectDialog dialog = ListSelectDialog(
list: model.branchesList,
attributeName: 'facilityName',
attributeValueId: 'facilityId',
okText: TranslationBase.of(context).ok,
okFunction: (selectedValue) {
setState(() async {
_selectedBranch = selectedValue;
_selectedClinic = null;
_selectedDoctor = null;
GifLoaderDialogUtils.showMyDialog(context);
await model
.getClinics(_selectedBranch['facilityId'])
.then((_) =>
GifLoaderDialogUtils.hideDialog(context));
if (model.state == ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(model.error);
}
});
},
);
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
return dialog;
},
);
}
: null,
onClick:
model.branchesList != null && model.branchesList.length > 0 && _referTo != null && _referTo['id'] == 2
? () {
ListSelectDialog dialog = ListSelectDialog(
list: model.branchesList,
attributeName: 'facilityName',
attributeValueId: 'facilityId',
okText: TranslationBase.of(context).ok,
okFunction: (selectedValue) {
setState(() async {
_selectedBranch = selectedValue;
_selectedClinic = null;
_selectedDoctor = null;
GifLoaderDialogUtils.showMyDialog(context);
await model
.getClinics(_selectedBranch['facilityId'])
.then((_) => GifLoaderDialogUtils.hideDialog(context));
if (model.state == ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(model.error);
}
});
},
);
showDialog(
barrierDismissible: false,
context: context,
builder: (BuildContext context) {
return dialog;
},
);
}
: null,
),
SizedBox(
height: 10,
@ -335,15 +285,11 @@ class _PatientMakeReferralScreenState extends State<PatientMakeReferralScreen> {
AppTextFieldCustom(
height: screenSize.height * 0.075,
hintText: TranslationBase.of(context).clinic,
dropDownText: _selectedClinic != null
? _selectedClinic['ClinicDescription']
: null,
dropDownText: _selectedClinic != null ? _selectedClinic['ClinicDescription'] : null,
enabled: false,
isTextFieldHasSuffix: true,
validationError: clinicError,
onClick: _selectedBranch != null &&
model.clinicsList != null &&
model.clinicsList.length > 0
onClick: _selectedBranch != null && model.clinicsList != null && model.clinicsList.length > 0
? () {
ListSelectDialog dialog = ListSelectDialog(
list: model.clinicsList,
@ -358,12 +304,8 @@ class _PatientMakeReferralScreenState extends State<PatientMakeReferralScreen> {
_selectedClinic = selectedValue;
GifLoaderDialogUtils.showMyDialog(context);
await model
.getClinicDoctors(
patient,
_selectedClinic['ClinicID'],
_selectedBranch['facilityId'])
.then((_) =>
GifLoaderDialogUtils.hideDialog(context));
.getClinicDoctors(patient, _selectedClinic['ClinicID'], _selectedBranch['facilityId'])
.then((_) => GifLoaderDialogUtils.hideDialog(context));
if (model.state == ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(model.error);
}
@ -386,14 +328,11 @@ class _PatientMakeReferralScreenState extends State<PatientMakeReferralScreen> {
AppTextFieldCustom(
height: screenSize.height * 0.075,
hintText: TranslationBase.of(context).doctor,
dropDownText:
_selectedDoctor != null ? _selectedDoctor['Name'] : null,
dropDownText: _selectedDoctor != null ? _selectedDoctor['Name'] : null,
enabled: false,
isTextFieldHasSuffix: true,
validationError: doctorError,
onClick: _selectedClinic != null &&
model.doctorsList != null &&
model.doctorsList.length > 0
onClick: _selectedClinic != null && model.doctorsList != null && model.doctorsList.length > 0
? () {
ListSelectDialog dialog = ListSelectDialog(
list: model.doctorsList,
@ -418,12 +357,9 @@ class _PatientMakeReferralScreenState extends State<PatientMakeReferralScreen> {
}
: () {
if (_selectedClinic == null) {
DrAppToastMsg.showErrorToast(
"You need to select a clinic first");
} else if (model.doctorsList == null ||
model.doctorsList.length == 0) {
DrAppToastMsg.showErrorToast(
"There is no doctors for this clinic");
DrAppToastMsg.showErrorToast("You need to select a clinic first");
} else if (model.doctorsList == null || model.doctorsList.length == 0) {
DrAppToastMsg.showErrorToast("There is no doctors for this clinic");
}
},
),
@ -433,9 +369,8 @@ class _PatientMakeReferralScreenState extends State<PatientMakeReferralScreen> {
AppTextFieldCustom(
height: screenSize.height * 0.075,
hintText: TranslationBase.of(context).date,
dropDownText: appointmentDate != null
? "${AppDateUtils.convertDateToFormat(appointmentDate, "yyyy-MM-dd")}"
: null,
dropDownText:
appointmentDate != null ? "${AppDateUtils.convertDateToFormat(appointmentDate, "yyyy-MM-dd")}" : null,
enabled: false,
isTextFieldHasSuffix: true,
suffixIcon: IconButton(

@ -1,7 +1,9 @@
import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/core/model/referral/MyReferralPatientModel.dart';
import 'package:doctor_app_flutter/core/service/AnalyticsService.dart';
import 'package:doctor_app_flutter/core/viewModel/patient-referral-viewmodel.dart';
import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart';
import 'package:doctor_app_flutter/locator.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/date-utils.dart';
@ -433,7 +435,8 @@ class ReferralPatientDetailScreen extends StatelessWidget {
],
),
),
if (referredPatient.referredDoctorRemarks!= null && referredPatient.referredDoctorRemarks.isNotEmpty)
if (referredPatient.referredDoctorRemarks != null &&
referredPatient.referredDoctorRemarks.isNotEmpty)
Container(
width: double.infinity,
margin: EdgeInsets.symmetric(horizontal: 16, vertical: 0),
@ -486,13 +489,18 @@ class ReferralPatientDetailScreen extends StatelessWidget {
hPadding: 8,
vPadding: 12,
onPressed: () async {
await locator<AnalyticsService>().logEvent(
eventCategory: "Referral Patient Detail",
eventAction: "Replay To Patient",
);
Navigator.push(
context,
SlideUpPageRoute(
widget: AddReplayOnReferralPatient(
patientReferralViewModel: patientReferralViewModel,
myReferralInPatientModel: referredPatient,
isEdited: referredPatient.referredDoctorRemarks!=null && referredPatient.referredDoctorRemarks.isNotEmpty,
isEdited: referredPatient.referredDoctorRemarks != null &&
referredPatient.referredDoctorRemarks.isNotEmpty,
),
),
);

@ -1,5 +1,7 @@
import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/core/service/AnalyticsService.dart';
import 'package:doctor_app_flutter/core/viewModel/patient-vital-sign-viewmodel.dart';
import 'package:doctor_app_flutter/locator.dart';
import 'package:doctor_app_flutter/lookups/patient_lookup.dart';
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
@ -18,8 +20,7 @@ class VitalSignDetailsScreen extends StatelessWidget {
int projectID;
bool isNotOneAppointment;
VitalSignDetailsScreen(
{this.appointmentNo, this.projectID, this.isNotOneAppointment = true});
VitalSignDetailsScreen({this.appointmentNo, this.projectID, this.isNotOneAppointment = true});
@override
Widget build(BuildContext context) {
@ -34,14 +35,12 @@ class VitalSignDetailsScreen extends StatelessWidget {
String assetBasePath = "${imageBasePath}patient/vital_signs/";
return BaseView<VitalSignsViewModel>(
onModelReady: (model) =>
model.getPatientVitalSignHistory(patient, from, to, isInpatient),
onModelReady: (model) => model.getPatientVitalSignHistory(patient, from, to, isInpatient),
builder: (_, mode, widget) => AppScaffold(
baseViewModel: mode,
isShowAppBar: true,
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
appBar: PatientProfileAppBar(
patient),
appBar: PatientProfileAppBar(patient),
appBarTitle: TranslationBase.of(context).vitalSign,
body: mode.patientVitalSignsHistory.length > 0
? Column(
@ -57,7 +56,7 @@ class VitalSignDetailsScreen extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AppText(
"${patient.firstName ?? patient?.patientDetails?.firstName?? patient.fullName?? ''}'s",
"${patient.firstName ?? patient?.patientDetails?.firstName ?? patient.fullName ?? ''}'s",
fontSize: SizeConfig.textMultiplier * 1.6,
fontWeight: FontWeight.w700,
color: Color(0xFF2E303A),
@ -75,8 +74,7 @@ class VitalSignDetailsScreen extends StatelessWidget {
height: MediaQuery.of(context).size.height * 0.23,
width: double.infinity,
padding: EdgeInsets.all(12.0),
margin: EdgeInsets.symmetric(
horizontal: 16.0, vertical: 8.0),
margin: EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
decoration: BoxDecoration(
shape: BoxShape.rectangle,
color: Colors.white,
@ -100,17 +98,13 @@ class VitalSignDetailsScreen extends StatelessWidget {
children: [
Expanded(
child: Column(
crossAxisAlignment:
CrossAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Image.asset(
mode.getBMIStatus() != 1
? '${assetBasePath}underweight_BMI.png'
: '${assetBasePath}underweight_BMI-r.png',
height: MediaQuery.of(context)
.size
.height *
0.10,
height: MediaQuery.of(context).size.height * 0.10,
),
const SizedBox(
height: 4,
@ -118,38 +112,28 @@ class VitalSignDetailsScreen extends StatelessWidget {
AppText(
"${TranslationBase.of(context).bmiUnderWeight}",
fontFamily: 'Poppins',
fontSize:
SizeConfig.textMultiplier * 1.15,
color: mode.getBMIStatus() == 1
? Color(0XFFD02127)
: null,
fontSize: SizeConfig.textMultiplier * 1.15,
color: mode.getBMIStatus() == 1 ? Color(0XFFD02127) : null,
fontWeight: FontWeight.w700,
),
AppText(
"(<18.5)",
fontFamily: 'Poppins',
fontSize:
SizeConfig.textMultiplier * 1.15,
color: mode.getBMIStatus() == 1
? Color(0XFFD02127)
: null,
fontSize: SizeConfig.textMultiplier * 1.15,
color: mode.getBMIStatus() == 1 ? Color(0XFFD02127) : null,
fontWeight: FontWeight.w700,
),
],
)),
Expanded(
child: Column(
crossAxisAlignment:
CrossAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Image.asset(
mode.getBMIStatus() != 2
? '${assetBasePath}health_BMI.png'
: '${assetBasePath}health_BMI-r.png',
height: MediaQuery.of(context)
.size
.height *
0.10,
height: MediaQuery.of(context).size.height * 0.10,
),
const SizedBox(
height: 4,
@ -158,40 +142,29 @@ class VitalSignDetailsScreen extends StatelessWidget {
child: AppText(
"${TranslationBase.of(context).normal}",
fontFamily: 'Poppins',
fontSize:
SizeConfig.textMultiplier *
1.15,
fontSize: SizeConfig.textMultiplier * 1.15,
fontWeight: FontWeight.w700,
color: mode.getBMIStatus() == 2
? Color(0XFFD02127)
: null,
color: mode.getBMIStatus() == 2 ? Color(0XFFD02127) : null,
),
),
AppText(
"(18.5-24.9)",
fontFamily: 'Poppins',
fontSize:
SizeConfig.textMultiplier * 1.15,
fontSize: SizeConfig.textMultiplier * 1.15,
fontWeight: FontWeight.w700,
color: mode.getBMIStatus() == 2
? Color(0XFFD02127)
: null,
color: mode.getBMIStatus() == 2 ? Color(0XFFD02127) : null,
),
],
)),
Expanded(
child: Column(
crossAxisAlignment:
CrossAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Image.asset(
mode.getBMIStatus() != 3
? '${assetBasePath}ovrweight_BMI.png'
: '${assetBasePath}ovrweight_BMI-r.png',
height: MediaQuery.of(context)
.size
.height *
0.10,
height: MediaQuery.of(context).size.height * 0.10,
),
const SizedBox(
height: 4,
@ -199,38 +172,28 @@ class VitalSignDetailsScreen extends StatelessWidget {
AppText(
"${TranslationBase.of(context).bmiOverWeight}",
fontFamily: 'Poppins',
fontSize:
SizeConfig.textMultiplier * 1.155,
fontSize: SizeConfig.textMultiplier * 1.155,
fontWeight: FontWeight.w700,
color: mode.getBMIStatus() == 3
? Color(0XFFD02127)
: null,
color: mode.getBMIStatus() == 3 ? Color(0XFFD02127) : null,
),
AppText(
"(25-29.9)",
fontFamily: 'Poppins',
fontSize:
SizeConfig.textMultiplier * 1.155,
fontSize: SizeConfig.textMultiplier * 1.155,
fontWeight: FontWeight.w700,
color: mode.getBMIStatus() == 3
? Color(0XFFD02127)
: null,
color: mode.getBMIStatus() == 3 ? Color(0XFFD02127) : null,
),
],
)),
Expanded(
child: Column(
crossAxisAlignment:
CrossAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Image.asset(
mode.getBMIStatus() != 4
? '${assetBasePath}Obese_BMI.png'
: '${assetBasePath}Obese_BMI-r.png',
height: MediaQuery.of(context)
.size
.height *
0.10,
height: MediaQuery.of(context).size.height * 0.10,
),
const SizedBox(
height: 4,
@ -238,38 +201,28 @@ class VitalSignDetailsScreen extends StatelessWidget {
AppText(
"${TranslationBase.of(context).bmiObese}",
fontFamily: 'Poppins',
fontSize:
SizeConfig.textMultiplier * 1.15,
fontSize: SizeConfig.textMultiplier * 1.15,
fontWeight: FontWeight.w700,
color: mode.getBMIStatus() == 4
? Color(0XFFD02127)
: null,
color: mode.getBMIStatus() == 4 ? Color(0XFFD02127) : null,
),
AppText(
"(30-34.9)",
fontFamily: 'Poppins',
fontSize:
SizeConfig.textMultiplier * 1.15,
fontSize: SizeConfig.textMultiplier * 1.15,
fontWeight: FontWeight.w700,
color: mode.getBMIStatus() == 4
? Color(0XFFD02127)
: null,
color: mode.getBMIStatus() == 4 ? Color(0XFFD02127) : null,
),
],
)),
Expanded(
child: Column(
crossAxisAlignment:
CrossAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Image.asset(
mode.getBMIStatus() != 5
? '${assetBasePath}Obese_BMI.png'
: '${assetBasePath}Obese_BMI-r.png',
height: MediaQuery.of(context)
.size
.height *
0.10,
height: MediaQuery.of(context).size.height * 0.10,
),
const SizedBox(
height: 4,
@ -279,24 +232,17 @@ class VitalSignDetailsScreen extends StatelessWidget {
child: AppText(
"${TranslationBase.of(context).bmiObeseExtreme}",
fontFamily: 'Poppins',
fontSize:
SizeConfig.textMultiplier *
1.15,
fontSize: SizeConfig.textMultiplier * 1.15,
fontWeight: FontWeight.w700,
color: mode.getBMIStatus() == 5
? Color(0XFFD02127)
: null,
color: mode.getBMIStatus() == 5 ? Color(0XFFD02127) : null,
),
),
AppText(
"(35<)",
fontFamily: 'Poppins',
fontSize:
SizeConfig.textMultiplier * 1.15,
fontSize: SizeConfig.textMultiplier * 1.15,
fontWeight: FontWeight.w700,
color: mode.getBMIStatus() == 5
? Color(0XFFD02127)
: null,
color: mode.getBMIStatus() == 5 ? Color(0XFFD02127) : null,
),
],
)),
@ -308,11 +254,9 @@ class VitalSignDetailsScreen extends StatelessWidget {
Expanded(
child: SingleChildScrollView(
child: Container(
margin: EdgeInsets.symmetric(
horizontal: 16.0, vertical: 16),
margin: EdgeInsets.symmetric(horizontal: 16.0, vertical: 16),
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
GridView.count(
shrinkWrap: true,
@ -326,16 +270,10 @@ class VitalSignDetailsScreen extends StatelessWidget {
? Navigator.push(
context,
FadePage(
page:
VitalSignItemDetailsScreen(
pageKey: vitalSignDetails
.Height,
pageTitle:
TranslationBase.of(
context)
.height,
vitalList: mode
.patientVitalSignsHistory,
page: VitalSignItemDetailsScreen(
pageKey: vitalSignDetails.Height,
pageTitle: TranslationBase.of(context).height,
vitalList: mode.patientVitalSignsHistory,
patient: patient,
patientType: patientType,
arrivalType: arrivalType,
@ -345,63 +283,51 @@ class VitalSignDetailsScreen extends StatelessWidget {
: null,
child: Container(
child: VitalSignItem(
des: TranslationBase.of(context)
.height,
imagePath:
"${assetBasePath}height.png",
des: TranslationBase.of(context).height,
imagePath: "${assetBasePath}height.png",
lastVal: mode.heightCm,
unit: TranslationBase.of(context)
.cm,
unit: TranslationBase.of(context).cm,
),
),
),
InkWell(
onTap: () => isNotOneAppointment
? Navigator.push(
context,
FadePage(
page:
VitalSignItemDetailsScreen(
pageKey: vitalSignDetails
.Weight,
pageTitle:
TranslationBase.of(
context)
.weight,
vitalList: mode
.patientVitalSignsHistory,
patient: patient,
patientType: patientType,
arrivalType: arrivalType,
),
if (isNotOneAppointment)
InkWell(
onTap: () async {
await locator<AnalyticsService>().logEvent(
eventCategory: "Vital Sign Details Screen",
eventAction: "Vital Sign Details",
);
Navigator.push(
context,
FadePage(
page: VitalSignItemDetailsScreen(
pageKey: vitalSignDetails.Weight,
pageTitle: TranslationBase.of(context).weight,
vitalList: mode.patientVitalSignsHistory,
patient: patient,
patientType: patientType,
arrivalType: arrivalType,
),
)
: null,
child: VitalSignItem(
des: TranslationBase.of(context)
.weight,
imagePath:
"${assetBasePath}weight.png",
unit:
TranslationBase.of(context).kg,
lastVal: mode.weightKg,
),
);
},
child: VitalSignItem(
des: TranslationBase.of(context).weight,
imagePath: "${assetBasePath}weight.png",
unit: TranslationBase.of(context).kg,
lastVal: mode.weightKg,
),
),
),
InkWell(
onTap: () => isNotOneAppointment
? Navigator.push(
context,
FadePage(
page:
VitalSignItemDetailsScreen(
pageKey: vitalSignDetails
.Temperature,
pageTitle:
TranslationBase.of(
context)
.temperature,
vitalList: mode
.patientVitalSignsHistory,
page: VitalSignItemDetailsScreen(
pageKey: vitalSignDetails.Temperature,
pageTitle: TranslationBase.of(context).temperature,
vitalList: mode.patientVitalSignsHistory,
patient: patient,
patientType: patientType,
arrivalType: arrivalType,
@ -411,13 +337,10 @@ class VitalSignDetailsScreen extends StatelessWidget {
: null,
child: Container(
child: VitalSignItem(
des: TranslationBase.of(context)
.temperature,
imagePath:
"${assetBasePath}temperature.png",
des: TranslationBase.of(context).temperature,
imagePath: "${assetBasePath}temperature.png",
lastVal: mode.temperatureCelcius,
unit: TranslationBase.of(context)
.tempC,
unit: TranslationBase.of(context).tempC,
),
),
),
@ -426,16 +349,10 @@ class VitalSignDetailsScreen extends StatelessWidget {
? Navigator.push(
context,
FadePage(
page:
VitalSignItemDetailsScreen(
pageKey: vitalSignDetails
.heart,
pageTitle:
TranslationBase.of(
context)
.heart,
vitalList: mode
.patientVitalSignsHistory,
page: VitalSignItemDetailsScreen(
pageKey: vitalSignDetails.heart,
pageTitle: TranslationBase.of(context).heart,
vitalList: mode.patientVitalSignsHistory,
patient: patient,
patientType: patientType,
arrivalType: arrivalType,
@ -444,13 +361,10 @@ class VitalSignDetailsScreen extends StatelessWidget {
)
: null,
child: VitalSignItem(
des: TranslationBase.of(context)
.heart,
imagePath:
"${assetBasePath}heart_rate.png",
des: TranslationBase.of(context).heart,
imagePath: "${assetBasePath}heart_rate.png",
lastVal: mode.hartRat,
unit:
TranslationBase.of(context).bpm,
unit: TranslationBase.of(context).bpm,
),
),
InkWell(
@ -458,16 +372,10 @@ class VitalSignDetailsScreen extends StatelessWidget {
? Navigator.push(
context,
FadePage(
page:
VitalSignItemDetailsScreen(
pageKey: vitalSignDetails
.Respiration,
pageTitle:
TranslationBase.of(
context)
.respirationRate,
vitalList: mode
.patientVitalSignsHistory,
page: VitalSignItemDetailsScreen(
pageKey: vitalSignDetails.Respiration,
pageTitle: TranslationBase.of(context).respirationRate,
vitalList: mode.patientVitalSignsHistory,
patient: patient,
patientType: patientType,
arrivalType: arrivalType,
@ -476,14 +384,10 @@ class VitalSignDetailsScreen extends StatelessWidget {
)
: null,
child: VitalSignItem(
des: TranslationBase.of(context)
.respirationRate,
imagePath:
"${assetBasePath}respiration_rate.png",
lastVal:
mode.respirationBeatPerMinute,
unit: TranslationBase.of(context)
.respirationSigns,
des: TranslationBase.of(context).respirationRate,
imagePath: "${assetBasePath}respiration_rate.png",
lastVal: mode.respirationBeatPerMinute,
unit: TranslationBase.of(context).respirationSigns,
),
),
InkWell(
@ -491,16 +395,10 @@ class VitalSignDetailsScreen extends StatelessWidget {
? Navigator.push(
context,
FadePage(
page:
VitalSignItemDetailsScreen(
pageKey: vitalSignDetails
.BloodPressure,
pageTitle:
TranslationBase.of(
context)
.bloodPressure,
vitalList: mode
.patientVitalSignsHistory,
page: VitalSignItemDetailsScreen(
pageKey: vitalSignDetails.BloodPressure,
pageTitle: TranslationBase.of(context).bloodPressure,
vitalList: mode.patientVitalSignsHistory,
patient: patient,
patientType: patientType,
arrivalType: arrivalType,
@ -509,13 +407,10 @@ class VitalSignDetailsScreen extends StatelessWidget {
)
: null,
child: VitalSignItem(
des: TranslationBase.of(context)
.bloodPressure,
imagePath:
"${assetBasePath}blood_pressure.png",
des: TranslationBase.of(context).bloodPressure,
imagePath: "${assetBasePath}blood_pressure.png",
lastVal: mode.bloodPressure,
unit: TranslationBase.of(context)
.sysDias,
unit: TranslationBase.of(context).sysDias,
),
),
InkWell(
@ -523,16 +418,10 @@ class VitalSignDetailsScreen extends StatelessWidget {
? Navigator.push(
context,
FadePage(
page:
VitalSignItemDetailsScreen(
pageKey: vitalSignDetails
.Oxygenation,
pageTitle:
TranslationBase.of(
context)
.oxygenation,
vitalList: mode
.patientVitalSignsHistory,
page: VitalSignItemDetailsScreen(
pageKey: vitalSignDetails.Oxygenation,
pageTitle: TranslationBase.of(context).oxygenation,
vitalList: mode.patientVitalSignsHistory,
patient: patient,
patientType: patientType,
arrivalType: arrivalType,
@ -541,10 +430,8 @@ class VitalSignDetailsScreen extends StatelessWidget {
)
: null,
child: VitalSignItem(
des: TranslationBase.of(context)
.oxygenation,
imagePath:
"${assetBasePath}oxg.png",
des: TranslationBase.of(context).oxygenation,
imagePath: "${assetBasePath}oxg.png",
lastVal: "${mode.oxygenation}%",
unit: "",
),
@ -554,16 +441,10 @@ class VitalSignDetailsScreen extends StatelessWidget {
? Navigator.push(
context,
FadePage(
page:
VitalSignItemDetailsScreen(
pageKey: vitalSignDetails
.PainScale,
pageTitle:
TranslationBase.of(
context)
.painScale,
vitalList: mode
.patientVitalSignsHistory,
page: VitalSignItemDetailsScreen(
pageKey: vitalSignDetails.PainScale,
pageTitle: TranslationBase.of(context).painScale,
vitalList: mode.patientVitalSignsHistory,
patient: patient,
patientType: patientType,
arrivalType: arrivalType,
@ -572,10 +453,8 @@ class VitalSignDetailsScreen extends StatelessWidget {
)
: null,
child: VitalSignItem(
des: TranslationBase.of(context)
.painScale,
imagePath:
"${assetBasePath}painScale.png",
des: TranslationBase.of(context).painScale,
imagePath: "${assetBasePath}painScale.png",
lastVal: mode.painScore,
unit: TranslationBase.of(context).severe,
),
@ -588,19 +467,17 @@ class VitalSignDetailsScreen extends StatelessWidget {
),
),
],
),
),
),
],
)
),
),
),
],
)
: Container(
color: Theme
.of(context)
.scaffoldBackgroundColor,
child: ErrorMessage(error: TranslationBase
.of(context)
.vitalSignEmptyMsg,)),
color: Theme.of(context).scaffoldBackgroundColor,
child: ErrorMessage(
error: TranslationBase.of(context).vitalSignEmptyMsg,
)),
),
);
}
}
}

@ -6,10 +6,12 @@ import 'package:doctor_app_flutter/core/model/Prescriptions/post_prescrition_req
import 'package:doctor_app_flutter/core/model/Prescriptions/prescription_model.dart';
import 'package:doctor_app_flutter/core/model/search_drug/get_medication_response_model.dart';
import 'package:doctor_app_flutter/core/provider/robot_provider.dart';
import 'package:doctor_app_flutter/core/service/AnalyticsService.dart';
import 'package:doctor_app_flutter/core/viewModel/medicine_view_model.dart';
import 'package:doctor_app_flutter/core/viewModel/prescription_view_model.dart';
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart';
import 'package:doctor_app_flutter/locator.dart';
import 'package:doctor_app_flutter/models/SOAP/GetAssessmentReqModel.dart';
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
@ -638,6 +640,10 @@ class _PrescriptionFormWidgetState extends State<PrescriptionFormWidget> {
title: TranslationBase.of(context).addMedication,
fontWeight: FontWeight.w600,
onPressed: () async {
await locator<AnalyticsService>().logEvent(
eventCategory: "Add Prescription Form",
eventAction: "Add Prescription",
);
if (route != null &&
duration != null &&
doseTime != null &&

@ -1,7 +1,9 @@
import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/core/model/procedure/categories_procedure.dart';
import 'package:doctor_app_flutter/core/model/procedure/procedure_template_details_model.dart';
import 'package:doctor_app_flutter/core/service/AnalyticsService.dart';
import 'package:doctor_app_flutter/core/viewModel/procedure_View_model.dart';
import 'package:doctor_app_flutter/locator.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/screens/procedures/add-procedure-page.dart';
@ -21,11 +23,10 @@ class ProcedureCheckOutScreen extends StatefulWidget {
final String toolbarTitle;
ProcedureCheckOutScreen(
{this.items, this.model, this.patient,@required this.addButtonTitle,@required this.toolbarTitle});
{this.items, this.model, this.patient, @required this.addButtonTitle, @required this.toolbarTitle});
@override
_ProcedureCheckOutScreenState createState() =>
_ProcedureCheckOutScreenState();
_ProcedureCheckOutScreenState createState() => _ProcedureCheckOutScreenState();
}
class _ProcedureCheckOutScreenState extends State<ProcedureCheckOutScreen> {
@ -36,8 +37,7 @@ class _ProcedureCheckOutScreenState extends State<ProcedureCheckOutScreen> {
@override
Widget build(BuildContext context) {
return BaseView<ProcedureViewModel>(
builder: (BuildContext context, ProcedureViewModel model, Widget child) =>
AppScaffold(
builder: (BuildContext context, ProcedureViewModel model, Widget child) => AppScaffold(
backgroundColor: Color(0xffF8F8F8).withOpacity(0.9),
isShowAppBar: false,
body: SingleChildScrollView(
@ -82,10 +82,8 @@ class _ProcedureCheckOutScreenState extends State<ProcedureCheckOutScreen> {
widget.items.length,
(index) => Container(
margin: EdgeInsets.only(bottom: 15.0),
decoration: BoxDecoration(
color: Colors.white,
borderRadius:
BorderRadius.all(Radius.circular(10.0))),
decoration:
BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(10.0))),
child: ExpansionTile(
initiallyExpanded: true,
title: Row(
@ -98,9 +96,7 @@ class _ProcedureCheckOutScreenState extends State<ProcedureCheckOutScreen> {
SizedBox(
width: 6.0,
),
Expanded(
child: AppText(
widget.items[index].procedureName)),
Expanded(child: AppText(widget.items[index].procedureName)),
],
),
children: [
@ -113,11 +109,9 @@ class _ProcedureCheckOutScreenState extends State<ProcedureCheckOutScreen> {
Row(
children: [
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 11),
padding: const EdgeInsets.symmetric(horizontal: 11),
child: AppText(
TranslationBase.of(context)
.orderType,
TranslationBase.of(context).orderType,
fontWeight: FontWeight.w700,
color: Color(0xff2B353E),
),
@ -129,14 +123,11 @@ class _ProcedureCheckOutScreenState extends State<ProcedureCheckOutScreen> {
Radio(
activeColor: Color(0xFFD02127),
value: 0,
groupValue:
widget.items[index].selectedType,
groupValue: widget.items[index].selectedType,
onChanged: (value) {
widget.items[index].selectedType =
0;
widget.items[index].selectedType = 0;
setState(() {
widget.items[index].type =
value.toString();
widget.items[index].type = value.toString();
});
},
),
@ -147,15 +138,12 @@ class _ProcedureCheckOutScreenState extends State<ProcedureCheckOutScreen> {
),
Radio(
activeColor: Color(0xFFD02127),
groupValue:
widget.items[index].selectedType,
groupValue: widget.items[index].selectedType,
value: 1,
onChanged: (value) {
widget.items[index].selectedType =
1;
widget.items[index].selectedType = 1;
setState(() {
widget.items[index].type =
value.toString();
widget.items[index].type = value.toString();
});
},
),
@ -174,8 +162,7 @@ class _ProcedureCheckOutScreenState extends State<ProcedureCheckOutScreen> {
height: 2.0,
),
Padding(
padding: EdgeInsets.symmetric(
horizontal: 12, vertical: 15.0),
padding: EdgeInsets.symmetric(horizontal: 12, vertical: 15.0),
child: TextFields(
hintText: TranslationBase.of(context).remarks,
controller: remarksController,
@ -222,11 +209,13 @@ class _ProcedureCheckOutScreenState extends State<ProcedureCheckOutScreen> {
),
);
});
await locator<AnalyticsService>().logEvent(
eventCategory: "Procedure Checkout Screen",
eventAction: "Add New Procedure",
);
Navigator.pop(context);
await model.preparePostProcedure(
entityList: entityList,
patient: widget.patient,
remarks: remarksController.text);
entityList: entityList, patient: widget.patient, remarks: remarksController.text);
Navigator.pop(context);
Navigator.pop(context);
},

@ -2,8 +2,10 @@ import 'package:barcode_scan_fix/barcode_scan.dart';
import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/model/patient_muse/PatientSearchRequestModel.dart';
import 'package:doctor_app_flutter/core/service/AnalyticsService.dart';
import 'package:doctor_app_flutter/core/viewModel/patient_view_model.dart';
import 'package:doctor_app_flutter/core/viewModel/scan_qr_view_model.dart';
import 'package:doctor_app_flutter/locator.dart';
import 'package:doctor_app_flutter/util/dr_app_toast_msg.dart';
import 'package:doctor_app_flutter/util/helpers.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
@ -61,7 +63,11 @@ class _QrReaderScreenState extends State<QrReaderScreen> {
),
AppButton(
title: TranslationBase.of(context).scanQr,
onPressed: () {
onPressed: () async {
await locator<AnalyticsService>().logEvent(
eventCategory: "QrReaderScreen",
eventAction: "Scan QR",
);
_scanQrAndGetPatient(context, model);
},
icon: Image.asset('assets/images/qr_code_white.png'),
@ -82,10 +88,7 @@ class _QrReaderScreenState extends State<QrReaderScreen> {
int patientID = 0;
if (listOfParams[1].length != 0) patientID = int.parse(listOfParams[1]);
PatientSearchRequestModel patientSearchRequestModel = PatientSearchRequestModel(
patientID: patientID,clinicID: 0,
doctorID: 0,
projectID: int.parse(listOfParams[0])
);
patientID: patientID, clinicID: 0, doctorID: 0, projectID: int.parse(listOfParams[0]));
await model.getInPatientList(patientSearchRequestModel, isMyInpatient: false).then((d) {
if (model.state != ViewState.ErrorLocal) {

@ -1,6 +1,8 @@
import 'package:doctor_app_flutter/core/service/AnalyticsService.dart';
import 'package:doctor_app_flutter/core/viewModel/leave_rechdule_response.dart';
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
import 'package:doctor_app_flutter/core/viewModel/sick_leave_view_model.dart';
import 'package:doctor_app_flutter/locator.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/screens/reschedule-leaves/reschedule_leave.dart';
import 'package:doctor_app_flutter/util/date-utils.dart';
@ -20,23 +22,29 @@ class AddRescheduleLeavScreen extends StatelessWidget {
Widget build(BuildContext context) {
projectsProvider = Provider.of(context);
return BaseView<SickLeaveViewModel>(
onModelReady: (model) =>
{model.getRescheduleLeave(), model.getCoveringDoctors()},
onModelReady: (model) => {model.getRescheduleLeave(), model.getCoveringDoctors()},
builder: (_, model, w) => AppScaffold(
baseViewModel: model,
isShowAppBar: true,
appBarTitle: TranslationBase.of(context).rescheduleLeaves,
body: SingleChildScrollView(
child: Column(children: [
AddNewOrder( onTap: () {
openLeave(
context,
false,
);
},label: TranslationBase.of(context).applyForReschedule,),
AddNewOrder(
onTap: () async {
await locator<AnalyticsService>().logEvent(
eventCategory: "Add Reschedule"
"Leave Screen",
eventAction: "apply For Reschedule",
);
openLeave(
context,
false,
);
},
label: TranslationBase.of(context).applyForReschedule,
),
Column(
children: model.getReschduleLeave
.map<Widget>((GetRescheduleLeavesResponse item) {
children: model.getReschduleLeave.map<Widget>((GetRescheduleLeavesResponse item) {
return RoundedContainer(
child: Column(
children: [
@ -62,71 +70,55 @@ class AddRescheduleLeavScreen extends StatelessWidget {
child: Wrap(
children: <Widget>[
Column(
crossAxisAlignment:
CrossAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Container(
padding: EdgeInsets.all(3),
margin:
EdgeInsets.only(top: 10),
child: AppText(
item.statusDescription,
fontWeight: FontWeight.bold,
color: item.status == 10
? Colors.red[800]
: item.status == 2
? HexColor('#CC9B14')
: item.status == 9
? Colors.green
: Colors.red,
fontSize: 14,
),
),
Padding(
padding:
EdgeInsets.only(top: 10),
child: AppText(
AppDateUtils
.convertStringToDateFormat(
item.createdOn,
'yyyy-MM-dd HH:mm'),
fontWeight: FontWeight.bold,
))
]),
Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
Container(
padding: EdgeInsets.all(3),
margin: EdgeInsets.only(top: 10),
child: AppText(
item.statusDescription,
fontWeight: FontWeight.bold,
color: item.status == 10
? Colors.red[800]
: item.status == 2
? HexColor('#CC9B14')
: item.status == 9
? Colors.green
: Colors.red,
fontSize: 14,
),
),
Padding(
padding: EdgeInsets.only(top: 10),
child: AppText(
AppDateUtils.convertStringToDateFormat(
item.createdOn, 'yyyy-MM-dd HH:mm'),
fontWeight: FontWeight.bold,
))
]),
SizedBox(
height: 5,
),
Container(
child: AppText(
item.requisitionType == 1
? TranslationBase.of(context)
.offTime
? TranslationBase.of(context).offTime
: item.requisitionType == 2
? TranslationBase.of(context)
.holiday
? TranslationBase.of(context).holiday
: item.requisitionType == 3
? TranslationBase.of(
context)
.changeOfSchedule
: TranslationBase.of(
context)
.newSchedule,
? TranslationBase.of(context).changeOfSchedule
: TranslationBase.of(context).newSchedule,
fontWeight: FontWeight.bold,
)),
SizedBox(
height: 5,
),
Row(children: [
AppText(TranslationBase.of(context)
.startDate),
AppText(TranslationBase.of(context).startDate),
AppText(
AppDateUtils.convertStringToDateFormat(
item.dateTimeFrom,
'yyyy-MM-dd HH:mm'),
item.dateTimeFrom, 'yyyy-MM-dd HH:mm'),
fontWeight: FontWeight.bold,
)
@ -142,13 +134,10 @@ class AddRescheduleLeavScreen extends StatelessWidget {
),
Row(
children: [
AppText(TranslationBase.of(context)
.endDate),
AppText(TranslationBase.of(context).endDate),
AppText(
AppDateUtils
.convertStringToDateFormat(
item.dateTimeTo,
'yyyy-MM-dd HH:mm'),
AppDateUtils.convertStringToDateFormat(
item.dateTimeTo, 'yyyy-MM-dd HH:mm'),
fontWeight: FontWeight.bold,
)
],
@ -160,13 +149,10 @@ class AddRescheduleLeavScreen extends StatelessWidget {
model.coveringDoctors.length > 0
? Row(children: [
AppText(
TranslationBase.of(context)
.coveringDoctor,
TranslationBase.of(context).coveringDoctor,
),
AppText(
getDoctor(
model.coveringDoctors,
item.coveringDoctorId),
getDoctor(model.coveringDoctors, item.coveringDoctorId),
fontWeight: FontWeight.bold,
)
])
@ -176,28 +162,18 @@ class AddRescheduleLeavScreen extends StatelessWidget {
// .reasons,
// fontWeight: FontWeight.bold,
// ),
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Padding(
padding: EdgeInsets.only(
bottom: 5),
child: AppText(getReasons(
model.allReasons,
item.reasonId))),
(item.status == 2)
? IconButton(
icon: Image.asset(
'assets/images/edit.png'),
// color: Colors.green, //Colors.black,
onPressed: () => {
openLeave(context, true,
extendedData: item)
},
)
: SizedBox(),
]),
Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
Padding(
padding: EdgeInsets.only(bottom: 5),
child: AppText(getReasons(model.allReasons, item.reasonId))),
(item.status == 2)
? IconButton(
icon: Image.asset('assets/images/edit.png'),
// color: Colors.green, //Colors.black,
onPressed: () => {openLeave(context, true, extendedData: item)},
)
: SizedBox(),
]),
],
),
SizedBox(

@ -1,8 +1,10 @@
import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/core/model/sick_leave/sick_leave_patient_model.dart';
import 'package:doctor_app_flutter/core/service/AnalyticsService.dart';
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
import 'package:doctor_app_flutter/core/viewModel/sick_leave_view_model.dart';
import 'package:doctor_app_flutter/locator.dart';
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/models/sickleave/get_all_sickleave_response.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
@ -64,7 +66,12 @@ class AddSickLeavScreen extends StatelessWidget {
],
)),
InkWell(
onTap: () {
onTap: () async {
await locator<AnalyticsService>().logEvent(
eventCategory: "Add Sick Leave Screen"
"Leave Screen",
eventAction: "apply For Sick Leave",
);
openSickLeave(
context,
false,

@ -1,6 +1,8 @@
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/core/service/AnalyticsService.dart';
import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart';
import 'package:doctor_app_flutter/locator.dart';
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/util/date-utils.dart';
import 'package:doctor_app_flutter/util/helpers.dart';
@ -11,8 +13,7 @@ import 'package:hexcolor/hexcolor.dart';
import 'package:intl/intl.dart';
import 'package:url_launcher/url_launcher.dart';
class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
with PreferredSizeWidget {
class PatientProfileHeaderNewDesignAppBar extends StatelessWidget with PreferredSizeWidget {
final PatiantInformtion patient;
final String patientType;
final String arrivalType;
@ -23,8 +24,12 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
final Stream<String> videoCallDurationStream;
PatientProfileHeaderNewDesignAppBar(
this.patient, this.patientType, this.arrivalType, {this.height = 0.0, this.isInpatient=false, this.isDischargedPatient=false, this.isFromLiveCare = false, this.videoCallDurationStream});
PatientProfileHeaderNewDesignAppBar(this.patient, this.patientType, this.arrivalType,
{this.height = 0.0,
this.isInpatient = false,
this.isDischargedPatient = false,
this.isFromLiveCare = false,
this.videoCallDurationStream});
@override
Widget build(BuildContext context) {
@ -43,7 +48,11 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
decoration: BoxDecoration(
color: Colors.white,
),
height: height == 0 ? isInpatient? 215:200 : height,
height: height == 0
? isInpatient
? 215
: 200
: height,
child: Container(
padding: EdgeInsets.only(left: 10, right: 10, bottom: 10),
margin: EdgeInsets.only(top: 50),
@ -60,10 +69,8 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
Expanded(
child: AppText(
patient.firstName != null
? (Helpers.capitalize(patient.firstName) +
" " +
Helpers.capitalize(patient.lastName))
: Helpers.capitalize(patient.fullName??patient.patientDetails.fullName),
? (Helpers.capitalize(patient.firstName) + " " + Helpers.capitalize(patient.lastName))
: Helpers.capitalize(patient.fullName ?? patient.patientDetails.fullName),
fontSize: SizeConfig.textMultiplier * 1.8,
fontWeight: FontWeight.bold,
fontFamily: 'Poppins',
@ -81,7 +88,11 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
Container(
margin: EdgeInsets.symmetric(horizontal: 4),
child: InkWell(
onTap: () {
onTap: () async {
await locator<AnalyticsService>().logEvent(
eventCategory: "Patient Profile Header",
eventAction: "Call Patient",
);
launch("tel://" + patient.mobileNumber);
},
child: Icon(
@ -93,14 +104,16 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
StreamBuilder(
stream: videoCallDurationStream,
builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
if(snapshot.hasData && snapshot.data != null)
if (snapshot.hasData && snapshot.data != null)
return InkWell(
onTap: (){
},
onTap: () {},
child: Container(
decoration: BoxDecoration(color: Colors.red, borderRadius: BorderRadius.circular(20)),
padding: EdgeInsets.symmetric(vertical: 2, horizontal: 10),
child: Text(snapshot.data, style: TextStyle(color: Colors.white),),
child: Text(
snapshot.data,
style: TextStyle(color: Colors.white),
),
),
);
else
@ -116,9 +129,7 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
width: 60,
height: 60,
child: Image.asset(
gender == 1
? 'assets/images/male_avatar.png'
: 'assets/images/female_avatar.png',
gender == 1 ? 'assets/images/male_avatar.png' : 'assets/images/female_avatar.png',
fit: BoxFit.cover,
),
),
@ -130,8 +141,7 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SERVICES_PATIANT2[int.parse(patientType)] ==
"patientArrivalList"
SERVICES_PATIANT2[int.parse(patientType)] == "patientArrivalList"
? Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
@ -151,19 +161,16 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
fontFamily: 'Poppins',
fontSize: 12,
),
arrivalType == '1'|| patient.arrivedOn == null
arrivalType == '1' || patient.arrivedOn == null
? AppText(
patient.startTime != null
? patient.startTime
: '',
patient.startTime != null ? patient.startTime : '',
fontFamily: 'Poppins',
fontWeight: FontWeight.w600,
)
: AppText(
patient.arrivedOn != null
? AppDateUtils.convertStringToDateFormat(
patient.arrivedOn,
'MM-dd-yyyy HH:mm')
patient.arrivedOn, 'MM-dd-yyyy HH:mm')
: '',
fontFamily: 'Poppins',
fontWeight: FontWeight.w600,
@ -171,15 +178,13 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
],
))
: SizedBox(),
if (SERVICES_PATIANT2[int.parse(patientType)] ==
"List_MyOutPatient" && !isFromLiveCare)
if (SERVICES_PATIANT2[int.parse(patientType)] == "List_MyOutPatient" && !isFromLiveCare)
Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
AppText(
TranslationBase.of(context).appointmentDate +
" : ",
TranslationBase.of(context).appointmentDate + " : ",
fontSize: 14,
),
patient.startTime != null
@ -191,7 +196,7 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
color: HexColor("#20A169"),
),
child: AppText(
patient.startTime??"",
patient.startTime ?? "",
color: Colors.white,
fontSize: 1.5 * SizeConfig.textMultiplier,
textAlign: TextAlign.center,
@ -202,14 +207,13 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
SizedBox(
width: 3.5,
),
Container(
child: AppText(
convertDateFormat2(
patient.appointmentDate ?? ''),
fontSize: 1.5 * SizeConfig.textMultiplier,
fontWeight: FontWeight.bold,
),
Container(
child: AppText(
convertDateFormat2(patient.appointmentDate ?? ''),
fontSize: 1.5 * SizeConfig.textMultiplier,
fontWeight: FontWeight.bold,
),
),
SizedBox(
height: 0.5,
)
@ -224,27 +228,21 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
children: [
RichText(
text: TextSpan(
style: TextStyle(
fontSize: 1.6 * SizeConfig.textMultiplier,
color: Colors.black),
style: TextStyle(fontSize: 1.6 * SizeConfig.textMultiplier, color: Colors.black),
children: <TextSpan>[
new TextSpan(
text: TranslationBase.of(context).fileNumber,
style: TextStyle(
fontSize: 12, fontFamily: 'Poppins')),
style: TextStyle(fontSize: 12, fontFamily: 'Poppins')),
new TextSpan(
text: patient.patientId.toString(),
style: TextStyle(
fontWeight: FontWeight.w700,
fontFamily: 'Poppins',
fontSize: 14)),
style: TextStyle(fontWeight: FontWeight.w700, fontFamily: 'Poppins', fontSize: 14)),
],
),
),
Row(
children: [
AppText(
patient.nationalityName ?? patient.nationality?? patient.nationalityId ?? '',
patient.nationalityName ?? patient.nationality ?? patient.nationalityId ?? '',
fontWeight: FontWeight.bold,
fontSize: 12,
),
@ -255,9 +253,7 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
patient.nationalityFlagURL,
height: 25,
width: 30,
errorBuilder: (BuildContext context,
Object exception,
StackTrace stackTrace) {
errorBuilder: (BuildContext context, Object exception, StackTrace stackTrace) {
return Text('No Image');
},
))
@ -275,19 +271,16 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
fontFamily: 'Poppins',
),
children: <TextSpan>[
new TextSpan(
text: TranslationBase.of(context).age+ " : ",
style: TextStyle(fontSize: 14)),
new TextSpan(text: TranslationBase.of(context).age + " : ", style: TextStyle(fontSize: 14)),
new TextSpan(
text:
"${AppDateUtils.getAgeByBirthday(patient.patientDetails != null ? patient.patientDetails.dateofBirth??"" : patient.dateofBirth??"", context,isServerFormat: !isFromLiveCare)}",
style: TextStyle(
fontWeight: FontWeight.w700, fontSize: 14)),
"${AppDateUtils.getAgeByBirthday(patient.patientDetails != null ? patient.patientDetails.dateofBirth ?? "" : patient.dateofBirth ?? "", context, isServerFormat: !isFromLiveCare)}",
style: TextStyle(fontWeight: FontWeight.w700, fontSize: 14)),
],
),
),
),
if(isInpatient)
if (isInpatient)
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@ -295,27 +288,22 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
child: RichText(
text: new TextSpan(
style: new TextStyle(
fontSize:
2.0 * SizeConfig.textMultiplier,
fontSize: 2.0 * SizeConfig.textMultiplier,
color: Colors.black,
fontFamily: 'Poppins',
),
children: <TextSpan>[
new TextSpan(
text: patient.admissionDate == null
? ""
: TranslationBase.of(context)
.admissionDate +
" : ",
style: TextStyle(fontSize: 14)),
new TextSpan(
text: patient.admissionDate == null
? ""
: "${AppDateUtils.convertDateFromServerFormat(patient.admissionDate.toString(), 'yyyy-MM-dd')}",
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 15)),
]))),
new TextSpan(
text: patient.admissionDate == null
? ""
: TranslationBase.of(context).admissionDate + " : ",
style: TextStyle(fontSize: 14)),
new TextSpan(
text: patient.admissionDate == null
? ""
: "${AppDateUtils.convertDateFromServerFormat(patient.admissionDate.toString(), 'yyyy-MM-dd')}",
style: TextStyle(fontWeight: FontWeight.w700, fontSize: 15)),
]))),
if (patient.admissionDate != null)
Row(
children: [
@ -323,11 +311,11 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
"${TranslationBase.of(context).numOfDays}: ",
fontSize: 15,
),
if(isDischargedPatient && patient.dischargeDate!=null)
AppText(
"${AppDateUtils.getDateTimeFromServerFormat(patient.dischargeDate).difference(AppDateUtils.getDateTimeFromServerFormat(patient.admissionDate)).inDays + 1}",
fontSize: 15,
fontWeight: FontWeight.w700)
if (isDischargedPatient && patient.dischargeDate != null)
AppText(
"${AppDateUtils.getDateTimeFromServerFormat(patient.dischargeDate).difference(AppDateUtils.getDateTimeFromServerFormat(patient.admissionDate)).inDays + 1}",
fontSize: 15,
fontWeight: FontWeight.w700)
else
AppText(
"${DateTime.now().difference(AppDateUtils.getDateTimeFromServerFormat(patient.admissionDate)).inDays + 1}",
@ -356,8 +344,7 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
final startIndex = str.indexOf(start);
final endIndex = str.indexOf(end, startIndex + start.length);
var date = new DateTime.fromMillisecondsSinceEpoch(
int.parse(str.substring(startIndex + start.length, endIndex)));
var date = new DateTime.fromMillisecondsSinceEpoch(int.parse(str.substring(startIndex + start.length, endIndex)));
newDate = date.year.toString() +
"/" +
date.month.toString().padLeft(2, '0') +
@ -365,13 +352,12 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
date.day.toString().padLeft(2, '0');
}
return newDate??'';
return newDate ?? '';
}
isToday(date) {
DateTime tempDate = new DateFormat("yyyy-MM-dd").parse(date);
return DateFormat("yyyy-MM-dd").format(tempDate) ==
DateFormat("yyyy-MM-dd").format(DateTime.now());
return DateFormat("yyyy-MM-dd").format(tempDate) == DateFormat("yyyy-MM-dd").format(DateTime.now());
}
myBoxDecoration() {

@ -1,51 +0,0 @@
import 'package:flutter/material.dart';
import 'package:hexcolor/hexcolor.dart';
import '../../../config/size_config.dart';
import '../../shared/app_texts_widget.dart';
import '../../shared/rounded_container_widget.dart';
/*
*@author: Elham Rababah
*@Date:13/4/2020
*@param:
*@return: ProfileStatusInfoWidget
*@desc: Profile Status Info Widget
*/
class ProfileStatusInfoWidget extends StatelessWidget {
const ProfileStatusInfoWidget({
Key key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return RoundedContainer(
child: ListView(
children: <Widget>[
Padding(
padding: const EdgeInsets.symmetric(horizontal: 14),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
AppText(
'Insurance approval',
fontSize: SizeConfig.textMultiplier * 3,
fontWeight: FontWeight.w700,
color: HexColor('#58434F'),
),
AppText(
'Approved',
color: HexColor('#707070'),
fontSize: SizeConfig.textMultiplier * 2.5,
)
],
),
),
],
),
width: SizeConfig.screenWidth * 0.70,
height: SizeConfig.screenHeight * 0.12,
);
}
}
Loading…
Cancel
Save