WD: general speciality

update_flutter_3.24_vida_plus_episode_v2
taha.alam 1 year ago
parent 6392620df7
commit 5e31c9cf98

@ -328,6 +328,10 @@ const ADD_TO_FAVORITE_DIAGNOSIS = 'Services/DoctorApplication.svc/REST/Diagnosis
const MAKE_PREVIOUS_AS_CURRENT_DIAGNOSIS = 'Services/DoctorApplication.svc/REST/ContinuePreviousEpisode'; const MAKE_PREVIOUS_AS_CURRENT_DIAGNOSIS = 'Services/DoctorApplication.svc/REST/ContinuePreviousEpisode';
const SEARCH_PHYSICAL_EXAMINATION = 'Services/DoctorApplication.svc/REST/SearchPhysicalExam';
const GET_GENERAL_SPECIALITY = 'Services/DoctorApplication.svc/REST/GetGeneralSpeciality';
var selectedPatientType = 1; var selectedPatientType = 1;

@ -0,0 +1,24 @@
class GeneralSpeciality {
int? id;
bool? isActive;
String? name;
int? rowVersion;
bool isSelected = false;
GeneralSpeciality();
GeneralSpeciality.fromJson(Map<String, dynamic> json) {
id = json['id'];
isActive = json['isActive'];
name = json['name'];
rowVersion = json['rowVersion'];
}
Map<String, dynamic> toJson() {
return {
'id': id,
'isActive': isActive,
'name': name,
'rowVersion': rowVersion,
};
}
}

@ -29,6 +29,7 @@ import 'package:doctor_app_flutter/core/model/SOAP/physical_exam/get_physical_ex
import 'package:doctor_app_flutter/core/model/SOAP/physical_exam/get_physical_exam_req_model.dart'; import 'package:doctor_app_flutter/core/model/SOAP/physical_exam/get_physical_exam_req_model.dart';
import 'package:doctor_app_flutter/core/model/SOAP/physical_exam/patient_physical_examination.dart'; import 'package:doctor_app_flutter/core/model/SOAP/physical_exam/patient_physical_examination.dart';
import 'package:doctor_app_flutter/core/model/SOAP/physical_exam/post_physical_exam_request_model.dart'; import 'package:doctor_app_flutter/core/model/SOAP/physical_exam/post_physical_exam_request_model.dart';
import 'package:doctor_app_flutter/core/model/SOAP/physical_exam/post_physical_examination_model.dart';
import 'package:doctor_app_flutter/core/model/SOAP/post_episode_req_model.dart'; import 'package:doctor_app_flutter/core/model/SOAP/post_episode_req_model.dart';
import 'package:doctor_app_flutter/core/model/SOAP/progress_note/GetGetProgressNoteResModel.dart'; import 'package:doctor_app_flutter/core/model/SOAP/progress_note/GetGetProgressNoteResModel.dart';
import 'package:doctor_app_flutter/core/model/SOAP/progress_note/get_progress_note_req_model.dart'; import 'package:doctor_app_flutter/core/model/SOAP/progress_note/get_progress_note_req_model.dart';
@ -48,6 +49,7 @@ import 'package:doctor_app_flutter/screens/patients/profile/soap_update/subjecti
import '../../locator.dart'; import '../../locator.dart';
import '../model/SOAP/allergy/get_patient_allergies_list_vida_plus.dart'; import '../model/SOAP/allergy/get_patient_allergies_list_vida_plus.dart';
import '../model/SOAP/assessment/patch_assessment_req_model.dart'; import '../model/SOAP/assessment/patch_assessment_req_model.dart';
import '../model/SOAP/physical_exam/GeneralSpeciality.dart';
import 'base_view_model.dart'; import 'base_view_model.dart';
class SOAPViewModel extends BaseViewModel { class SOAPViewModel extends BaseViewModel {
@ -142,8 +144,13 @@ class SOAPViewModel extends BaseViewModel {
List<AuditDiagnosis> get auditDiagnosislist => List<AuditDiagnosis> get auditDiagnosislist =>
_SOAPService.auditDiagnosislist; _SOAPService.auditDiagnosislist;
List<GeneralSpeciality> get speciality =>
_SOAPService.generalSpeciality;
int? get episodeID => _SOAPService.episodeID; int? get episodeID => _SOAPService.episodeID;
bool get isFavorite => _SOAPService.addedToFavorite; bool get isFavorite => _SOAPService.addedToFavorite;
bool get showAudit => _SOAPService.showAuditBottomSheet; bool get showAudit => _SOAPService.showAuditBottomSheet;
bool get isPrescriptionOrder => _SOAPService.isPrescriptionOrder; bool get isPrescriptionOrder => _SOAPService.isPrescriptionOrder;
@ -1128,24 +1135,27 @@ class SOAPViewModel extends BaseViewModel {
setState(ViewState.Idle); setState(ViewState.Idle);
} }
void addToFavoriteDiagnosis( void addToFavoriteDiagnosis(PatiantInformtion patientInfo,
PatiantInformtion patientInfo, { {SearchDiagnosis? diagnosis}) async {
SearchDiagnosis? diagnosis
}) async {
setState(ViewState.BusyLocal); setState(ViewState.BusyLocal);
Map<String, dynamic>? profile = await sharedPref.getObj(DOCTOR_PROFILE); Map<String, dynamic>? profile = await sharedPref.getObj(DOCTOR_PROFILE);
Map<String, dynamic>? user = await sharedPref.getObj(LOGGED_IN_USER); Map<String, dynamic>? user = await sharedPref.getObj(LOGGED_IN_USER);
await _SOAPService.addToFavoriteDiagnosis(patientInfo,profile?['DoctorName'] ??'',diagnosis?.diseasesBCode ?? '',user?['List_MemberInformation'][0]['MemberID'] ??''); await _SOAPService.addToFavoriteDiagnosis(
patientInfo,
profile?['DoctorName'] ?? '',
diagnosis?.diseasesBCode ?? '',
user?['List_MemberInformation'][0]['MemberID'] ?? '');
if (_SOAPService.hasError) { if (_SOAPService.hasError) {
error = _SOAPService.error; error = _SOAPService.error;
setState(ViewState.ErrorLocal); setState(ViewState.ErrorLocal);
} else } else
setState(ViewState.Idle); setState(ViewState.Idle);
} }
void convertPreviousDiagnosisCurrent(
PatiantInformtion paitientInfo, PatientPreviousDiagnosis diagnosis) async { void convertPreviousDiagnosisCurrent(PatiantInformtion paitientInfo,
PatientPreviousDiagnosis diagnosis) async {
setState(ViewState.BusyLocal); setState(ViewState.BusyLocal);
await _SOAPService.convertPreviousDiagnosisCurrent(paitientInfo,diagnosis); await _SOAPService.convertPreviousDiagnosisCurrent(paitientInfo, diagnosis);
if (_SOAPService.hasError) { if (_SOAPService.hasError) {
error = _SOAPService.error; error = _SOAPService.error;
setState(ViewState.ErrorLocal); setState(ViewState.ErrorLocal);
@ -1153,8 +1163,7 @@ class SOAPViewModel extends BaseViewModel {
setState(ViewState.Idle); setState(ViewState.Idle);
} }
void getPhysicalExamination( void getPhysicalExamination(PatiantInformtion paitientInfo) async {
PatiantInformtion paitientInfo) async {
setState(ViewState.BusyLocal); setState(ViewState.BusyLocal);
await _SOAPService.getPhysicalExamination(paitientInfo); await _SOAPService.getPhysicalExamination(paitientInfo);
if (_SOAPService.hasError) { if (_SOAPService.hasError) {
@ -1164,14 +1173,33 @@ class SOAPViewModel extends BaseViewModel {
setState(ViewState.Idle); setState(ViewState.Idle);
} }
void toggleFavorite(bool status ){ void postPhysicalExamination(PatiantInformtion patientInfo,
_SOAPService.addedToFavorite List<PostPhysicalExaminationModel> physicalExamination) async {
= status; setState(ViewState.BusyLocal);
await _SOAPService.postPhysicalExamination(
patientInfo, physicalExamination);
if (_SOAPService.hasError) {
error = _SOAPService.error;
setState(ViewState.ErrorLocal);
} else
setState(ViewState.Idle);
}
void getGeneralSpeciality(PatiantInformtion patientInfo) async {
setState(ViewState.BusyLocal);
await _SOAPService.getGeneralSpeciality(
patientInfo);
if (_SOAPService.hasError) {
error = _SOAPService.error;
setState(ViewState.ErrorLocal);
} else
setState(ViewState.Idle);
} }
void toggleShowBottomSheetValue(bool status){ void toggleFavorite(bool status) {
_SOAPService.showAuditBottomSheet _SOAPService.addedToFavorite = status;
= status;
} }
void toggleShowBottomSheetValue(bool status) {
_SOAPService.showAuditBottomSheet = status;
}
} }

@ -1,4 +1,5 @@
import 'package:doctor_app_flutter/core/enum/master_lookup_key.dart'; import 'package:doctor_app_flutter/core/enum/master_lookup_key.dart';
import 'package:doctor_app_flutter/core/model/SOAP/physical_exam/GeneralSpeciality.dart';
import 'package:doctor_app_flutter/core/model/SOAP/selected_items/my_selected_examination.dart'; import 'package:doctor_app_flutter/core/model/SOAP/selected_items/my_selected_examination.dart';
import 'package:doctor_app_flutter/core/viewModel/SOAP_view_model.dart'; import 'package:doctor_app_flutter/core/viewModel/SOAP_view_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart'; import 'package:doctor_app_flutter/screens/base/base_view.dart';
@ -15,7 +16,7 @@ import 'package:provider/provider.dart';
import '../../../../../core/viewModel/project_view_model.dart'; import '../../../../../core/viewModel/project_view_model.dart';
class AddDetailsToExaminationVidaPlus extends StatefulWidget { class AddDetailsToExaminationVidaPlus extends StatefulWidget {
final List<MySelectedExamination>? mySelectedExamination; final List<GeneralSpeciality>? mySelectedExamination;
const AddDetailsToExaminationVidaPlus({super.key, this.mySelectedExamination}); const AddDetailsToExaminationVidaPlus({super.key, this.mySelectedExamination});
@ -43,31 +44,26 @@ class _AddDetailsToExaminationVidaPlusState extends State<AddDetailsToExaminatio
padding: const EdgeInsets.all(20.0), padding: const EdgeInsets.all(20.0),
child: Column( child: Column(
children: [ children: [
Expanded( // Expanded(
child: ListView.separated( // child: ListView.separated(
itemBuilder: (context, index) { // itemBuilder: (context, index) {
return ExpandableSOAPWidget( // return ExpandableSOAPWidget(
headerTitle: // headerTitle:,
projectViewModel.isArabic // onTap: () {
? widget.mySelectedExamination![index].selectedExamination!.nameAr != null && widget.mySelectedExamination![index].selectedExamination!.nameAr != "" // setState(() {
? widget.mySelectedExamination![index].selectedExamination!.nameAr! // isSysExaminationExpand = !isSysExaminationExpand;
: widget.mySelectedExamination![index].selectedExamination!.nameEn! // });
: widget.mySelectedExamination![index].selectedExamination!.nameEn!, // },
onTap: () { // child: ExaminationItems(examination:widget.mySelectedExamination![index]),
setState(() { // isExpanded: isSysExaminationExpand,
isSysExaminationExpand = !isSysExaminationExpand; // );
}); //
}, // },
child: ExaminationItems(examination:widget.mySelectedExamination![index]), // separatorBuilder: (context, index) {
isExpanded: isSysExaminationExpand, // return SizedBox(height: 8,);
); // },
// itemCount: widget?.mySelectedExamination?.length ?? 0),
}, // ),
separatorBuilder: (context, index) {
return SizedBox(height: 8,);
},
itemCount: widget?.mySelectedExamination?.length ?? 0),
),
], ],
), ),
))); )));

@ -1,25 +1,31 @@
import 'package:doctor_app_flutter/core/enum/master_lookup_key.dart'; import 'package:doctor_app_flutter/core/enum/master_lookup_key.dart';
import 'package:doctor_app_flutter/core/enum/view_state.dart';
import 'package:doctor_app_flutter/core/model/SOAP/master_key_model.dart'; import 'package:doctor_app_flutter/core/model/SOAP/master_key_model.dart';
import 'package:doctor_app_flutter/core/model/SOAP/physical_exam/GeneralSpeciality.dart';
import 'package:doctor_app_flutter/core/model/SOAP/physical_exam/patient_physical_examination.dart';
import 'package:doctor_app_flutter/core/model/SOAP/selected_items/my_selected_examination.dart'; import 'package:doctor_app_flutter/core/model/SOAP/selected_items/my_selected_examination.dart';
import 'package:doctor_app_flutter/core/model/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/core/viewModel/SOAP_view_model.dart'; import 'package:doctor_app_flutter/core/viewModel/SOAP_view_model.dart';
import 'package:doctor_app_flutter/core/viewModel/authentication_view_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart'; import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/screens/patients/patient_search/patient_search_header.dart'; import 'package:doctor_app_flutter/screens/patients/patient_search/patient_search_header.dart';
import 'package:doctor_app_flutter/screens/patients/profile/soap_update_vida_plus/objective/add_details_to_examination_vida_plus.dart';
import 'package:doctor_app_flutter/utils/dr_app_toast_msg.dart';
import 'package:doctor_app_flutter/utils/translations_delegate_base_utils.dart'; import 'package:doctor_app_flutter/utils/translations_delegate_base_utils.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/buttons/app_buttons_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/buttons/app_buttons_widget.dart';
import 'package:doctor_app_flutter/widgets/transitions/fade_page.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import 'examinations_list_search_vida_plus_widget.dart'; import 'examinations_list_search_vida_plus_widget.dart';
class AddExaminationPageVidaPlus extends StatefulWidget { class AddExaminationPageVidaPlus extends StatefulWidget {
final List<MySelectedExamination>? mySelectedExamination; final PatiantInformtion patientInfo;
final Function(List<MySelectedExamination>) addSelectedExamination; final List<PatientPhysicalExamination>? examination;
final Function(MasterKeyModel) removeExamination;
AddExaminationPageVidaPlus( ///todo handle the data if edit is added
{this.mySelectedExamination, AddExaminationPageVidaPlus({required this.patientInfo, this.examination});
required this.addSelectedExamination,
required this.removeExamination});
@override @override
_AddExaminationPageVidaPlusState createState() => _AddExaminationPageVidaPlusState createState() =>
@ -28,12 +34,11 @@ class AddExaminationPageVidaPlus extends StatefulWidget {
class _AddExaminationPageVidaPlusState class _AddExaminationPageVidaPlusState
extends State<AddExaminationPageVidaPlus> { extends State<AddExaminationPageVidaPlus> {
List<MySelectedExamination> mySelectedExaminationLocal = []; List<GeneralSpeciality> mySelectedExaminationLocal = [];
@override @override
initState() { initState() {
super.initState(); super.initState();
mySelectedExaminationLocal = widget.mySelectedExamination!;
} }
@override @override
@ -42,15 +47,16 @@ class _AddExaminationPageVidaPlusState
onModelReady: (model) async { onModelReady: (model) async {
if (model.physicalExaminationList.length == 0) { if (model.physicalExaminationList.length == 0) {
WidgetsBinding.instance.addPostFrameCallback((_) async { WidgetsBinding.instance.addPostFrameCallback((_) async {
await model.getMasterLookup( if (model.speciality.isEmpty) {
MasterKeysService.PostPhysicalExaminationModel, await model.getGeneralSpeciality(widget.patientInfo);
); }
}); });
} }
}, },
builder: (_, model, w) => AppScaffold( builder: (_, model, w) => AppScaffold(
baseViewModel: model, baseViewModel: model,
isShowAppBar: true, isShowAppBar: true,
isLoading: model.state == ViewState.Busy,
appBar: PatientSearchHeader( appBar: PatientSearchHeader(
title: TranslationBase.of(context).examinationPart), title: TranslationBase.of(context).examinationPart),
backgroundColor: Colors.white, backgroundColor: Colors.white,
@ -76,19 +82,42 @@ class _AddExaminationPageVidaPlusState
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
children: [ children: [
ExaminationsListSearchVidaPlusWidget( ExaminationsListSearchVidaPlusWidget(
mySelectedExamination: widget.mySelectedExamination, masterList: model.speciality,
masterList: model.patientPhysicalExaminationList,
isServiceSelected: (master) =>
isServiceSelected(master),
removeExamination: (selectedExamination) { removeExamination: (selectedExamination) {
if(selectedExamination == null ) return;
setState(() { setState(() {
mySelectedExaminationLocal mySelectedExaminationLocal
.remove(selectedExamination); .remove(selectedExamination);
// Find the object by its ID
try {
final speciality =
model.speciality.firstWhere(
(speciality) =>
speciality.id == selectedExamination.id,
orElse: () => throw Exception(
'Speciality with ID ${selectedExamination.id} not found!'),
);
speciality.isSelected = false;
} catch (e) {}
}); });
}, },
addExamination: (selectedExamination) { addExamination: (selectedExamination) {
if(selectedExamination == null ) return;
mySelectedExaminationLocal.insert( mySelectedExaminationLocal.insert(
0, selectedExamination); 0, selectedExamination);
try {
final speciality = model.speciality.firstWhere(
(speciality) =>
speciality.id == selectedExamination.id,
orElse: () => throw Exception(
'Speciality with ID ${selectedExamination.id} not found!'),
);
speciality.isSelected = true;
} catch (e) {}
//setState(() {}); //setState(() {});
}, },
), ),
@ -128,10 +157,7 @@ class _AddExaminationPageVidaPlusState
fontColor: Colors.white, fontColor: Colors.white,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
onPressed: () async { onPressed: () async {
Navigator.pop(context); pushAddExamination(mySelectedExaminationLocal);
widget.addSelectedExamination(mySelectedExaminationLocal);
}, },
), ),
), ),
@ -141,14 +167,15 @@ class _AddExaminationPageVidaPlusState
); );
} }
isServiceSelected(MasterKeyModel masterKey) { void pushAddExamination(
Iterable<MySelectedExamination> exam = mySelectedExaminationLocal.where( List<GeneralSpeciality> mySelectedExaminationLocal) {
(element) => Navigator.push(
masterKey.id == element.selectedExamination!.id && context,
masterKey.typeId == element.selectedExamination!.typeId); FadePage(
if (exam.length > 0) { page: AddDetailsToExaminationVidaPlus(
return true; mySelectedExamination: mySelectedExaminationLocal,
} ),
return false; ),
);
} }
} }

@ -1,6 +1,7 @@
// ignore: must_be_immutable // ignore: must_be_immutable
import 'package:doctor_app_flutter/config/size_config.dart'; import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/core/model/SOAP/master_key_model.dart'; import 'package:doctor_app_flutter/core/model/SOAP/master_key_model.dart';
import 'package:doctor_app_flutter/core/model/SOAP/physical_exam/GeneralSpeciality.dart';
import 'package:doctor_app_flutter/core/model/SOAP/selected_items/my_selected_examination.dart'; import 'package:doctor_app_flutter/core/model/SOAP/selected_items/my_selected_examination.dart';
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart'; import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
import 'package:doctor_app_flutter/utils/translations_delegate_base_utils.dart'; import 'package:doctor_app_flutter/utils/translations_delegate_base_utils.dart';
@ -13,22 +14,16 @@ import 'package:provider/provider.dart';
// ignore: must_be_immutable // ignore: must_be_immutable
class AddExaminationVidaPlusWidget extends StatefulWidget { class AddExaminationVidaPlusWidget extends StatefulWidget {
MasterKeyModel? item; GeneralSpeciality? item;
final Function(MySelectedExamination) removeExamination; final Function(GeneralSpeciality?) removeExamination;
final Function(MySelectedExamination) addExamination; final Function(GeneralSpeciality?) addExamination;
final bool Function(MasterKeyModel) isServiceSelected;
bool isExpand;
final Function() expandClick; final List<GeneralSpeciality>? mySelectedExamination;
final List<MySelectedExamination>? mySelectedExamination;
AddExaminationVidaPlusWidget({ AddExaminationVidaPlusWidget({
this.item, this.item,
required this.removeExamination, required this.removeExamination,
required this.addExamination, required this.addExamination,
required this.isServiceSelected,
this.isExpand = false,
required this.expandClick,
this.mySelectedExamination, this.mySelectedExamination,
}); });
@ -43,17 +38,7 @@ class _AddExaminationVidaPlusWidgetState extends State<AddExaminationVidaPlusWid
@override @override
void initState() { void initState() {
if (getSelectedExam(widget.item!) != null) {
examination = getSelectedExam(widget.item!)!;
status = examination.isNormal
? 1
: examination.isAbnormal
? 2
: 3;
remarksController.text = examination.remark!;
} else {
examination.selectedExamination = widget.item;
}
super.initState(); super.initState();
} }
@ -71,18 +56,14 @@ class _AddExaminationVidaPlusWidgetState extends State<AddExaminationVidaPlusWid
child: Row( child: Row(
children: [ children: [
Checkbox( Checkbox(
value: widget.isServiceSelected(widget.item!), value:widget.item?.isSelected ?? false,
activeColor: Colors.red[800], activeColor: Colors.red[800],
onChanged: (bool? newValue) { onChanged: (bool? newValue) {
onExamTap(); onExamTap();
}), }),
Container( Container(
child: AppText( child: AppText(
projectViewModel.isArabic widget.item?.name ?? '',
? widget.item!.nameAr != null && widget.item!.nameAr != ""
? widget.item!.nameAr!
: widget.item!.nameEn!
: widget.item!.nameEn!,
color: Color(0xFF575757), color: Color(0xFF575757),
fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * (SizeConfig.isWidthLarge ? 3 : 3.8), fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * (SizeConfig.isWidthLarge ? 3 : 3.8),
letterSpacing: -0.56, letterSpacing: -0.56,
@ -93,226 +74,17 @@ class _AddExaminationVidaPlusWidgetState extends State<AddExaminationVidaPlusWid
), ),
], ],
); );
// return Container(
// child: HeaderBodyExpandableNotifier(
// headerWidget: Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
// children: [
// InkWell(
// onTap: () {
// onExamTap();
// },
// child: Row(
// children: [
// Checkbox(
// value: widget.isServiceSelected(widget.item!),
// activeColor: Colors.red[800],
// onChanged: (bool? newValue) {
// onExamTap();
// }),
// Container(
// child: AppText(
// projectViewModel.isArabic
// ? widget.item!.nameAr != null && widget.item!.nameAr != ""
// ? widget.item!.nameAr!
// : widget.item!.nameEn!
// : widget.item!.nameEn!,
// color: Color(0xFF575757),
// fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * (SizeConfig.isWidthLarge ? 3 : 3.8),
// letterSpacing: -0.56,
// ),
// ),
// ],
// ),
// ),
// Container(
// margin: EdgeInsets.symmetric(horizontal: 8),
// child: InkWell(
// onTap: widget.expandClick,
// child: Icon(widget.isExpand ? Icons.keyboard_arrow_up : Icons.keyboard_arrow_down),
// ),
// ),
// ],
// ),
// bodyWidget: Container(
// padding: EdgeInsets.symmetric(horizontal: 12),
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// Container(
// margin: EdgeInsets.only(bottom: 8),
// child: AppText(
// TranslationBase.of(context).status,
// fontWeight: FontWeight.bold,
// fontFamily: 'Poppins',
// fontSize: SizeConfig.textMultiplier! * 1.6,
// ),
// ),
// Row(
// children: [
// Expanded(
// child: InkWell(
// onTap: () {
// setState(() {
// status = 1;
// });
// examination.isNormal = true;
// examination.isAbnormal = false;
// examination.notExamined = false;
// },
// child: Row(
// children: [
// Container(
// padding: EdgeInsets.all(2.0),
// margin: EdgeInsets.symmetric(horizontal: 6),
// width: 20,
// height: 20,
// decoration: BoxDecoration(
// color: Colors.white,
// shape: BoxShape.circle,
// border: Border.all(color: Colors.grey, width: 1),
// ),
// child: Container(
// decoration: BoxDecoration(
// color: status == 1 ? HexColor("#D02127") : Colors.white,
// shape: BoxShape.circle,
// ),
// ),
// ),
// AppText(
// TranslationBase.of(context).normal,
// fontWeight: FontWeight.normal,
// fontFamily: 'Poppins',
// fontSize: SizeConfig.textMultiplier! * 1.6,
// ),
// ],
// ),
// )),
// Expanded(
// child: InkWell(
// onTap: () {
// setState(() {
// status = 2;
// });
// examination.isNormal = false;
// examination.isAbnormal = true;
// examination.notExamined = false;
// },
// child: Row(
// children: [
// Container(
// padding: EdgeInsets.all(2.0),
// margin: EdgeInsets.symmetric(horizontal: 6),
// width: 20,
// height: 20,
// decoration: BoxDecoration(
// color: Colors.white,
// shape: BoxShape.circle,
// border: Border.all(color: Colors.grey, width: 1),
// ),
// child: Container(
// decoration: BoxDecoration(
// color: status == 2 ? HexColor("#D02127") : Colors.white,
// shape: BoxShape.circle,
// ),
// ),
// ),
// AppText(
// TranslationBase.of(context).abnormal,
// fontWeight: FontWeight.normal,
// fontFamily: 'Poppins',
// fontSize: SizeConfig.textMultiplier! * 1.6,
// ),
// ],
// ),
// )),
// if (!examination.isLocal)
// Expanded(
// child: InkWell(
// onTap: () {
// setState(() {
// status = 3;
// });
// examination.isNormal = false;
// examination.isAbnormal = false;
// examination.notExamined = true;
// },
// child: Row(
// children: [
// Container(
// padding: EdgeInsets.all(2.0),
// margin: EdgeInsets.symmetric(horizontal: 6),
// width: 20,
// height: 20,
// decoration: BoxDecoration(
// color: Colors.white,
// shape: BoxShape.circle,
// border: Border.all(color: Colors.grey, width: 1),
// ),
// child: Container(
// decoration: BoxDecoration(
// color: status == 3 ? HexColor("#D02127") : Colors.white,
// shape: BoxShape.circle,
// ),
// ),
// ),
// Expanded(
// child: AppText(
// TranslationBase.of(context).notExamined,
// fontWeight: FontWeight.normal,
// fontFamily: 'Poppins',
// fontSize: SizeConfig.textMultiplier! * 1.6,
// ),
// ),
// ],
// ),
// )),
// ],
// ),
// Container(
// margin: EdgeInsets.only(top: 8),
// child: AppTextFieldCustom(
// hintText: TranslationBase.of(context).remarks,
// controller: remarksController,
// minLines: 2,
// maxLines: 4,
// inputType: TextInputType.multiline,
// onChanged: (value) {
// examination.remark = value;
// },
// onClick: () {},
// onFieldSubmitted: () {},
// ),
// ),
// ],
// ),
// ),
// isExpand: widget.isExpand,
// ),
// );
} }
onExamTap() { onExamTap() {
setState(() { if(widget.item == null ){
if (widget.isServiceSelected(widget.item!)) { if(widget.item?.isSelected == true){
if (examination.isLocal) widget.removeExamination(examination); widget.removeExamination(widget.item);
widget.expandClick(); }else{
} else { widget.addExamination(widget.item);
examination.isNormal = status == 1;
examination.isAbnormal = status == 2;
examination.notExamined = status == 3;
examination.remark = remarksController.text;
widget.addExamination(examination);
widget.expandClick();
}
});
}
MySelectedExamination? getSelectedExam(MasterKeyModel masterKey) { }
Iterable<MySelectedExamination> exam = widget.mySelectedExamination!.where((element) => masterKey.id == element.selectedExamination!.id && masterKey.typeId == element.selectedExamination!.typeId);
if (exam.length > 0) {
return exam.first;
} }
return null;
} }
} }

@ -1,4 +1,5 @@
import 'package:doctor_app_flutter/core/model/SOAP/master_key_model.dart'; import 'package:doctor_app_flutter/core/model/SOAP/master_key_model.dart';
import 'package:doctor_app_flutter/core/model/SOAP/physical_exam/GeneralSpeciality.dart';
import 'package:doctor_app_flutter/core/model/SOAP/physical_exam/patient_physical_examination.dart'; import 'package:doctor_app_flutter/core/model/SOAP/physical_exam/patient_physical_examination.dart';
import 'package:doctor_app_flutter/core/model/SOAP/selected_items/my_selected_examination.dart'; import 'package:doctor_app_flutter/core/model/SOAP/selected_items/my_selected_examination.dart';
import 'package:doctor_app_flutter/screens/patients/profile/soap_update_vida_plus/objective/add_examination_vida_plus_widget.dart'; import 'package:doctor_app_flutter/screens/patients/profile/soap_update_vida_plus/objective/add_examination_vida_plus_widget.dart';
@ -8,23 +9,25 @@ import 'package:doctor_app_flutter/widgets/shared/divider_with_spaces_around.dar
import 'package:doctor_app_flutter/widgets/shared/text_fields/app-textfield-custom.dart'; import 'package:doctor_app_flutter/widgets/shared/text_fields/app-textfield-custom.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class ExaminationsListSearchVidaPlusWidget extends StatefulWidget { class ExaminationsListSearchVidaPlusWidget extends StatefulWidget {
final Function(MySelectedExamination) removeExamination; final Function(GeneralSpeciality?) removeExamination;
final Function(MySelectedExamination) addExamination; final Function(GeneralSpeciality?) addExamination;
final bool Function(MasterKeyModel) isServiceSelected; final List<GeneralSpeciality>? masterList;
final List<PatientPhysicalExamination>? masterList;
final List<MySelectedExamination>? mySelectedExamination;
ExaminationsListSearchVidaPlusWidget({required this.removeExamination, required this.addExamination, required this.isServiceSelected, this.masterList, this.mySelectedExamination}); ExaminationsListSearchVidaPlusWidget(
{required this.removeExamination,
required this.addExamination,
this.masterList});
@override @override
_ExaminationsListSearchVidaPlusWidgetState createState() => _ExaminationsListSearchVidaPlusWidgetState(); _ExaminationsListSearchVidaPlusWidgetState createState() =>
_ExaminationsListSearchVidaPlusWidgetState();
} }
class _ExaminationsListSearchVidaPlusWidgetState extends State<ExaminationsListSearchVidaPlusWidget> { class _ExaminationsListSearchVidaPlusWidgetState
extends State<ExaminationsListSearchVidaPlusWidget> {
int expandedIndex = -1; int expandedIndex = -1;
List<PatientPhysicalExamination>? items = []; List<GeneralSpeciality>? items = [];
TextEditingController filteredSearchController = TextEditingController(); TextEditingController filteredSearchController = TextEditingController();
@override @override
@ -44,7 +47,8 @@ class _ExaminationsListSearchVidaPlusWidgetState extends State<ExaminationsListS
width: 1, width: 1,
color: Color(0xFFEFEFEF), color: Color(0xFFEFEFEF),
)), )),
color: Colors.white,child: Padding( color: Colors.white,
child: Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: AppTextFieldCustom( child: AppTextFieldCustom(
height: Utils.getTextFieldHeight(), height: Utils.getTextFieldHeight(),
@ -67,6 +71,16 @@ class _ExaminationsListSearchVidaPlusWidgetState extends State<ExaminationsListS
), ),
), ),
), ),
ListView.separated(
itemCount: items?.length ?? 0,
itemBuilder: (_, index) => AddExaminationVidaPlusWidget(
item: items![index],
addExamination: widget.addExamination,
removeExamination: widget.removeExamination,
),
separatorBuilder: (_, __) => Divider(),
)
// ...items!.mapIndexed((index, item) { // ...items!.mapIndexed((index, item) {
// return Column( // return Column(
// children: [ // children: [

@ -1,3 +1,4 @@
import 'package:doctor_app_flutter/core/model/SOAP/physical_exam/patient_physical_examination.dart';
import 'package:doctor_app_flutter/core/model/SOAP/selected_items/my_selected_examination.dart'; import 'package:doctor_app_flutter/core/model/SOAP/selected_items/my_selected_examination.dart';
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart'; import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
import 'package:doctor_app_flutter/screens/patients/profile/soap_update_vida_plus/widgets/SoapDetailItem.dart'; import 'package:doctor_app_flutter/screens/patients/profile/soap_update_vida_plus/widgets/SoapDetailItem.dart';
@ -8,7 +9,7 @@ import 'package:provider/provider.dart';
import '../../../../../utils/translations_delegate_base_utils.dart'; import '../../../../../utils/translations_delegate_base_utils.dart';
class ListOfExamination extends StatelessWidget { class ListOfExamination extends StatelessWidget {
final List<MySelectedExamination> listOfSelection; final List<PatientPhysicalExamination> listOfSelection;
const ListOfExamination({super.key, required this.listOfSelection}); const ListOfExamination({super.key, required this.listOfSelection});
@ -20,25 +21,8 @@ class ListOfExamination extends StatelessWidget {
physics: NeverScrollableScrollPhysics(), physics: NeverScrollableScrollPhysics(),
shrinkWrap: true, shrinkWrap: true,
itemBuilder: (_, index) => SoapDetailItem( itemBuilder: (_, index) => SoapDetailItem(
title: projectViewModel.isArabic title: "${listOfSelection[index].physicalExaminationDescription}",
? listOfSelection[index] condition: getCondition(listOfSelection[index].physicalExaminationCondition ?? 3, context)??TranslationBase.of(context).notExamined,
.selectedExamination!
.nameAr !=
null &&
listOfSelection[index]
.selectedExamination!
.nameAr !=
""
? listOfSelection[index]
.selectedExamination!
.nameAr!
: listOfSelection[index]
.selectedExamination!
.nameEn!
: listOfSelection[index]
.selectedExamination!
.nameEn!,
condition: getCondition(listOfSelection[index], context)??TranslationBase.of(context).notExamined,
remarks: listOfSelection[index].remark??'', remarks: listOfSelection[index].remark??'',
onSoapDetailActionClicked: (action) { onSoapDetailActionClicked: (action) {
///todo handle the event as per the actiion ///todo handle the event as per the actiion
@ -51,9 +35,9 @@ class ListOfExamination extends StatelessWidget {
); );
} }
String? getCondition(MySelectedExamination examination, BuildContext context) => examination.isNormal String? getCondition(int condition, BuildContext context) => condition ==0
? TranslationBase.of(context).normal ? TranslationBase.of(context).normal
: examination.isAbnormal : condition == 1
? TranslationBase.of(context).abnormal ? TranslationBase.of(context).abnormal
: TranslationBase.of(context).notExamined; : TranslationBase.of(context).notExamined;
} }

@ -4,6 +4,7 @@ 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/master_lookup_key.dart';
import 'package:doctor_app_flutter/core/enum/view_state.dart'; import 'package:doctor_app_flutter/core/enum/view_state.dart';
import 'package:doctor_app_flutter/core/model/SOAP/master_key_model.dart'; import 'package:doctor_app_flutter/core/model/SOAP/master_key_model.dart';
import 'package:doctor_app_flutter/core/model/SOAP/physical_exam/patient_physical_examination.dart';
import 'package:doctor_app_flutter/core/model/SOAP/physical_exam/post_physical_exam_request_model.dart'; import 'package:doctor_app_flutter/core/model/SOAP/physical_exam/post_physical_exam_request_model.dart';
import 'package:doctor_app_flutter/core/model/SOAP/selected_items/my_selected_examination.dart'; import 'package:doctor_app_flutter/core/model/SOAP/selected_items/my_selected_examination.dart';
import 'package:doctor_app_flutter/core/model/doctor/doctor_profile_model.dart'; import 'package:doctor_app_flutter/core/model/doctor/doctor_profile_model.dart';
@ -51,7 +52,7 @@ class UpdateObjectivePageVidaPlus extends StatefulWidget {
class _UpdateObjectivePageVidaPlusState class _UpdateObjectivePageVidaPlusState
extends State<UpdateObjectivePageVidaPlus> implements ObjectiveCallBack { extends State<UpdateObjectivePageVidaPlus> implements ObjectiveCallBack {
bool isSysExaminationExpand = false; bool isSysExaminationExpand = false;
List<MySelectedExamination> mySelectedExamination = []; List<PatientPhysicalExamination> mySelectedExamination = [];
BoxDecoration containerBorderDecoration( BoxDecoration containerBorderDecoration(
Color containerColor, Color borderColor) { Color containerColor, Color borderColor) {
@ -74,37 +75,6 @@ class _UpdateObjectivePageVidaPlusState
if (model.patientPhysicalExaminationList == 0) { if (model.patientPhysicalExaminationList == 0) {
model.getPhysicalExamination(widget.patientInfo); model.getPhysicalExamination(widget.patientInfo);
} }
// model.getPatientPhysicalExam(widget.patientInfo);
model.setObjectiveCallBack(this);
mySelectedExamination.clear();
model.isAddExamInProgress = true;
await model.getPatientPhysicalExam(widget.patientInfo);
if (model.patientPhysicalExamList.isNotEmpty) {
if (model.physicalExaminationList.length == 0) {
await model
.getMasterLookup(MasterKeysService.PostPhysicalExaminationModel);
}
model.patientPhysicalExamList.forEach((element) {
MasterKeyModel? examMaster = model.getOneMasterKey(
masterKeys: MasterKeysService.PostPhysicalExaminationModel,
id: element.examId,
);
MySelectedExamination tempEam =
SoapUtils.generateMySelectedExamination(
examination: examMaster,
remark: element.remarks,
isNormal: element.isNormal,
createdBy: element.createdBy,
createdOn: element.createdOn,
editedOn: element.editedOn,
notExamined: element.notExamined,
isNew: element.isNew,
isLocal: false,
isAbnormal: element.isAbnormal,
);
mySelectedExamination.add(tempEam);
});
}
widget.changeLoadingState(false); widget.changeLoadingState(false);
}); });
}, },
@ -220,177 +190,143 @@ class _UpdateObjectivePageVidaPlusState
); );
} }
submitUpdateObjectivePage(SOAPViewModel model) async { // submitUpdateObjectivePage(SOAPViewModel model) async {
if (mySelectedExamination.isNotEmpty) { // if (mySelectedExamination.isNotEmpty) {
if (!model.isAddExamInProgress && // if (!model.isAddExamInProgress &&
widget.patientInfo.admissionNo != null && // widget.patientInfo.admissionNo != null &&
widget.patientInfo.admissionNo!.isNotEmpty) { // widget.patientInfo.admissionNo!.isNotEmpty) {
Navigator.of(context).pop(); // Navigator.of(context).pop();
} else { // } else {
widget.changeLoadingState(true); // widget.changeLoadingState(true);
Map<String, dynamic> profile = await sharedPref.getObj(DOCTOR_PROFILE); // Map<String, dynamic> profile = await sharedPref.getObj(DOCTOR_PROFILE);
//
DoctorProfileModel doctorProfile = DoctorProfileModel.fromJson(profile); // DoctorProfileModel doctorProfile = DoctorProfileModel.fromJson(profile);
PostPhysicalExamRequestModel postPhysicalExamRequestModel = // PostPhysicalExamRequestModel postPhysicalExamRequestModel =
new PostPhysicalExamRequestModel(); // new PostPhysicalExamRequestModel();
mySelectedExamination.forEach((exam) { // mySelectedExamination.forEach((exam) {
if (postPhysicalExamRequestModel // if (postPhysicalExamRequestModel
.listHisProgNotePhysicalExaminationVM == // .listHisProgNotePhysicalExaminationVM ==
null) // null)
postPhysicalExamRequestModel.listHisProgNotePhysicalExaminationVM = // postPhysicalExamRequestModel.listHisProgNotePhysicalExaminationVM =
[]; // [];
ListHisProgNotePhysicalExaminationVM // ListHisProgNotePhysicalExaminationVM
listHisProgNotePhysicalExaminationVM = // listHisProgNotePhysicalExaminationVM =
ListHisProgNotePhysicalExaminationVM( // ListHisProgNotePhysicalExaminationVM(
patientMRN: widget.patientInfo.patientMRN, // patientMRN: widget.patientInfo.patientMRN,
episodeId: widget.patientInfo.episodeNo == null // episodeId: widget.patientInfo.episodeNo == null
? 0 // ? 0
: widget.patientInfo.episodeNo, // : widget.patientInfo.episodeNo,
appointmentNo: widget.patientInfo.appointmentNo == null // appointmentNo: widget.patientInfo.appointmentNo == null
? 0 // ? 0
: widget.patientInfo.appointmentNo, // : widget.patientInfo.appointmentNo,
remarks: exam.remark ?? '', // remarks: exam.remark ?? '',
createdBy: exam.createdBy ?? doctorProfile.doctorID, // createdBy: exam.createdBy ?? doctorProfile.doctorID,
createdOn: exam.createdOn ?? DateTime.now().toIso8601String(), // createdOn: exam.createdOn ?? DateTime.now().toIso8601String(),
editedBy: doctorProfile.doctorID, // editedBy: doctorProfile.doctorID,
editedOn: DateTime.now().toIso8601String(), // editedOn: DateTime.now().toIso8601String(),
examId: exam.selectedExamination!.id, // examId: exam.selectedExamination!.id,
examType: exam.selectedExamination!.typeId, // examType: exam.selectedExamination!.typeId,
isAbnormal: exam.isAbnormal, // isAbnormal: exam.isAbnormal,
isNormal: exam.isNormal, // isNormal: exam.isNormal,
notExamined: exam.notExamined, // notExamined: exam.notExamined,
examinationType: exam.isNormal // examinationType: exam.isNormal
? 1 // ? 1
: exam.isAbnormal // : exam.isAbnormal
? 2 // ? 2
: 3, // : 3,
examinationTypeName: exam.isNormal // examinationTypeName: exam.isNormal
? "Normal" // ? "Normal"
: exam.isAbnormal // : exam.isAbnormal
? 'AbNormal' // ? 'AbNormal'
: "Not Examined", // : "Not Examined",
isNew: exam.isNew, // isNew: exam.isNew,
); // );
if (widget.patientInfo.admissionNo != null && // if (widget.patientInfo.admissionNo != null &&
widget.patientInfo.admissionNo!.isNotEmpty) { // widget.patientInfo.admissionNo!.isNotEmpty) {
listHisProgNotePhysicalExaminationVM.admissionNo = // listHisProgNotePhysicalExaminationVM.admissionNo =
int.parse(widget.patientInfo.admissionNo!); // int.parse(widget.patientInfo.admissionNo!);
} else { // } else {
listHisProgNotePhysicalExaminationVM.admissionNo = 0; // listHisProgNotePhysicalExaminationVM.admissionNo = 0;
} // }
postPhysicalExamRequestModel.listHisProgNotePhysicalExaminationVM! // postPhysicalExamRequestModel.listHisProgNotePhysicalExaminationVM!
.add(listHisProgNotePhysicalExaminationVM); // .add(listHisProgNotePhysicalExaminationVM);
}); // });
//
if (model.patientPhysicalExamList.isEmpty) { // if (model.patientPhysicalExamList.isEmpty) {
await model.postPhysicalExam(postPhysicalExamRequestModel); // await model.postPhysicalExam(postPhysicalExamRequestModel);
} else { // } else {
await model.patchPhysicalExam(postPhysicalExamRequestModel); // await model.patchPhysicalExam(postPhysicalExamRequestModel);
} // }
//
if (model.state == ViewState.ErrorLocal) { // if (model.state == ViewState.ErrorLocal) {
widget.changeLoadingState(false); // widget.changeLoadingState(false);
Utils.showErrorToast(model.error); // Utils.showErrorToast(model.error);
if (widget.patientInfo.admissionNo != null && // if (widget.patientInfo.admissionNo != null &&
widget.patientInfo.admissionNo!.isNotEmpty) { // widget.patientInfo.admissionNo!.isNotEmpty) {
// Navigator.of(context).pop(); // // Navigator.of(context).pop();
model.isAddExamInProgress = false; // model.isAddExamInProgress = false;
} // }
} else { // } else {
if (widget.patientInfo.admissionNo != null && // if (widget.patientInfo.admissionNo != null &&
widget.patientInfo.admissionNo!.isNotEmpty) { // widget.patientInfo.admissionNo!.isNotEmpty) {
// Navigator.of(context).pop(); // // Navigator.of(context).pop();
widget.changeLoadingState(false); // widget.changeLoadingState(false);
model.isAddExamInProgress = false; // model.isAddExamInProgress = false;
} else { // } else {
widget.changeLoadingState(true); // widget.changeLoadingState(true);
widget.changePageViewIndex(2); // widget.changePageViewIndex(2);
} // }
} // }
} // }
} else { // } else {
Utils.showErrorToast(TranslationBase.of(context).examinationErrorMsg); // Utils.showErrorToast(TranslationBase.of(context).examinationErrorMsg);
} // }
} // }
removeExamination(MasterKeyModel masterKey) {
Iterable<MySelectedExamination> history = mySelectedExamination.where(
(element) =>
masterKey.id == element.selectedExamination!.id &&
masterKey.typeId == element.selectedExamination!.typeId);
if (history.length > 0) { // removeExamination(MasterKeyModel masterKey) {
setState(() { // Iterable<MySelectedExamination> history = mySelectedExamination.where(
if (history.first.isLocal) { // (element) =>
mySelectedExamination.remove(history.first); // masterKey.id == element.selectedExamination!.id &&
} else { // masterKey.typeId == element.selectedExamination!.typeId);
history.first.notExamined = true; //
history.first.isNormal = false; // if (history.length > 0) {
history.first.isAbnormal = false; // setState(() {
} // if (history.first.isLocal) {
}); // mySelectedExamination.remove(history.first);
} // } else {
} // history.first.notExamined = true;
// history.first.isNormal = false;
// history.first.isAbnormal = false;
// }
// });
// }
// }
openExaminationList(BuildContext context) { openExaminationList(BuildContext context) {
Navigator.push( Navigator.push(
context, context,
FadePage( FadePage(
page: AddExaminationPageVidaPlus( page: AddExaminationPageVidaPlus(
mySelectedExamination: mySelectedExamination, patientInfo: widget.patientInfo,
addSelectedExamination: ),
(List<MySelectedExamination> mySelectedExaminationLocal) {
pushAddExamination(mySelectedExaminationLocal);
// mySelectedExaminationLocal.forEach((element) {
// if (mySelectedExamination.singleWhere(
// (it) =>
// it.selectedExamination!.id ==
// element.selectedExamination!.id,
// orElse: () => MySelectedExamination()) ==
// MySelectedExamination()) {
// mySelectedExamination.insert(0, element);
// }
// });
/// remove items.
// List<MySelectedExamination> removedList = [];
// mySelectedExamination.forEach((element) {
// if (mySelectedExaminationLocal.singleWhere(
// (it) =>
// it.selectedExamination!.id ==
// element.selectedExamination!.id,
// orElse: () => MySelectedExamination()) ==
// MySelectedExamination()) {
// removedList.add(element);
// }
// });
// removedList.forEach((element) {
// removeExamination(element.selectedExamination!);
// });
// Navigator.of(context).pop();
// setState(() {});
},
removeExamination: (masterKey) => removeExamination(masterKey)),
), ),
); );
} }
@override @override
nextFunction(model) async { nextFunction(model) async {
await submitUpdateObjectivePage(model); // await submitUpdateObjectivePage(model);
} }
void pushAddExamination( // void pushAddExamination(
List<MySelectedExamination> mySelectedExaminationLocal) { // List<MySelectedExamination> mySelectedExaminationLocal) {
Navigator.push( // Navigator.push(
context, // context,
FadePage( // FadePage(
page: AddDetailsToExaminationVidaPlus( // page: AddDetailsToExaminationVidaPlus(
mySelectedExamination: mySelectedExamination, // mySelectedExamination: mySelectedExamination,
), // ),
), // ),
); // );
} // }
} }

Loading…
Cancel
Save