Merge branch 'development' of https://gitlab.com/Cloud_Solution/doctor_app_flutter into fix-issues
Conflicts: lib/widgets/patients/profile/soap_update/steps_widget.dartmerge-requests/451/head
commit
b83c7835b9
@ -0,0 +1,92 @@
|
|||||||
|
import 'package:doctor_app_flutter/config/size_config.dart';
|
||||||
|
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
|
||||||
|
import 'package:doctor_app_flutter/models/SOAP/my_selected_examination.dart';
|
||||||
|
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
|
||||||
|
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
class ExaminationIitemCard extends StatelessWidget {
|
||||||
|
final MySelectedExamination examination;
|
||||||
|
final Function removeExamination;
|
||||||
|
|
||||||
|
ExaminationIitemCard(this.examination, this.removeExamination);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
ProjectViewModel projectViewModel = Provider.of(context);
|
||||||
|
|
||||||
|
return Container(
|
||||||
|
color: Colors.white,
|
||||||
|
padding: EdgeInsets.all(8),
|
||||||
|
margin: EdgeInsets.only(bottom: 8),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Container(
|
||||||
|
child: AppText(
|
||||||
|
projectViewModel.isArabic
|
||||||
|
? examination.selectedExamination.nameAr != null &&
|
||||||
|
examination.selectedExamination.nameAr != ""
|
||||||
|
? examination.selectedExamination.nameAr
|
||||||
|
: examination.selectedExamination.nameEn
|
||||||
|
: examination.selectedExamination.nameEn,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
fontFamily: 'Poppins',
|
||||||
|
fontSize: SizeConfig.textMultiplier * 1.8,
|
||||||
|
),
|
||||||
|
)),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
AppText(
|
||||||
|
TranslationBase.of(context).remove,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
fontFamily: 'Poppins',
|
||||||
|
color: Colors.red.shade800,
|
||||||
|
fontSize: SizeConfig.textMultiplier * 1.8,
|
||||||
|
),
|
||||||
|
InkWell(
|
||||||
|
onTap: removeExamination,
|
||||||
|
child: Icon(
|
||||||
|
Icons.clear,
|
||||||
|
size: 20,
|
||||||
|
color: Colors.red.shade800,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
AppText(
|
||||||
|
!examination.isNormal
|
||||||
|
? examination.isAbnormal
|
||||||
|
? TranslationBase.of(context).abnormal
|
||||||
|
: TranslationBase.of(context).notExamined
|
||||||
|
: TranslationBase.of(context).normal,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
fontFamily: 'Poppins',
|
||||||
|
color: !examination.isNormal
|
||||||
|
? examination.isAbnormal
|
||||||
|
? Colors.red.shade800
|
||||||
|
: Colors.grey.shade800
|
||||||
|
: Colors.green.shade800,
|
||||||
|
fontSize: SizeConfig.textMultiplier * 1.8,
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 4,
|
||||||
|
),
|
||||||
|
AppText(
|
||||||
|
examination.remark,
|
||||||
|
fontWeight: FontWeight.normal,
|
||||||
|
fontFamily: 'Poppins',
|
||||||
|
color: Colors.grey.shade500,
|
||||||
|
fontSize: SizeConfig.textMultiplier * 1.8,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,506 @@
|
|||||||
|
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/viewModel/SOAP_view_model.dart';
|
||||||
|
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
|
||||||
|
import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart';
|
||||||
|
import 'package:doctor_app_flutter/models/SOAP/my_selected_examination.dart';
|
||||||
|
import 'package:doctor_app_flutter/screens/base/base_view.dart';
|
||||||
|
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
|
||||||
|
import 'package:doctor_app_flutter/widgets/shared/app-textfield-custom.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/borderedButton.dart';
|
||||||
|
import 'package:doctor_app_flutter/widgets/shared/divider_with_spaces_around.dart';
|
||||||
|
import 'package:doctor_app_flutter/widgets/shared/expandable-widget-header-body.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:hexcolor/hexcolor.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
// Author Mosa Abuzaid
|
||||||
|
|
||||||
|
class AddExaminationPage extends StatefulWidget {
|
||||||
|
final List<MySelectedExamination> mySelectedExamination;
|
||||||
|
final Function addSelectedExamination;
|
||||||
|
final Function(MasterKeyModel) removeExamination;
|
||||||
|
|
||||||
|
AddExaminationPage(
|
||||||
|
{this.mySelectedExamination,
|
||||||
|
this.addSelectedExamination,
|
||||||
|
this.removeExamination});
|
||||||
|
|
||||||
|
@override
|
||||||
|
_AddExaminationPageState createState() => _AddExaminationPageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _AddExaminationPageState extends State<AddExaminationPage> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return BaseView<SOAPViewModel>(
|
||||||
|
onModelReady: (model) async {
|
||||||
|
if (model.physicalExaminationList.length == 0) {
|
||||||
|
await model.getMasterLookup(MasterKeysService.PhysicalExamination);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
builder: (_, model, w) => AppScaffold(
|
||||||
|
baseViewModel: model,
|
||||||
|
isShowAppBar: false,
|
||||||
|
backgroundColor: Color.fromRGBO(248, 248, 248, 1),
|
||||||
|
body: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
padding:
|
||||||
|
EdgeInsets.only(left: 16, top: 70, right: 16, bottom: 16),
|
||||||
|
color: Colors.white,
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: AppText(
|
||||||
|
"${TranslationBase.of(context).addExamination}",
|
||||||
|
fontSize: SizeConfig.textMultiplier * 3.3,
|
||||||
|
color: Colors.black,
|
||||||
|
fontWeight: FontWeight.w700,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
InkWell(
|
||||||
|
onTap: () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
},
|
||||||
|
child: Icon(
|
||||||
|
Icons.clear,
|
||||||
|
size: 40,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: SingleChildScrollView(
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.all(16.0),
|
||||||
|
padding: EdgeInsets.all(0.0),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
shape: BoxShape.rectangle,
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
border: Border.fromBorderSide(BorderSide(
|
||||||
|
color: Colors.grey.shade400,
|
||||||
|
width: 0.4,
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
ExaminationsListSearchWidget(
|
||||||
|
masterList: model.physicalExaminationList,
|
||||||
|
isServiceSelected: (master) =>
|
||||||
|
isServiceSelected(master),
|
||||||
|
removeHistory: (history) {
|
||||||
|
setState(() {
|
||||||
|
widget.removeExamination(history);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
addHistory: (selectedExamination) {
|
||||||
|
setState(() {
|
||||||
|
widget.mySelectedExamination
|
||||||
|
.add(selectedExamination);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
padding: EdgeInsets.all(16),
|
||||||
|
color: Colors.white,
|
||||||
|
child: BorderedButton(
|
||||||
|
"${TranslationBase.of(context).addExamination}",
|
||||||
|
backgroundColor: HexColor("#359846"),
|
||||||
|
textColor: Colors.white,
|
||||||
|
vPadding: 12,
|
||||||
|
radius: 12,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
fontSize: SizeConfig.textMultiplier * 2.5,
|
||||||
|
fontFamily: 'Poppins',
|
||||||
|
handler: () {
|
||||||
|
widget.addSelectedExamination();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
isServiceSelected(MasterKeyModel masterKey) {
|
||||||
|
Iterable<MySelectedExamination> exam = widget.mySelectedExamination.where(
|
||||||
|
(element) =>
|
||||||
|
masterKey.id == element.selectedExamination.id &&
|
||||||
|
masterKey.typeId == element.selectedExamination.typeId);
|
||||||
|
if (exam.length > 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ExaminationsListSearchWidget extends StatefulWidget {
|
||||||
|
final Function(MasterKeyModel) removeHistory;
|
||||||
|
final Function(MySelectedExamination) addHistory;
|
||||||
|
final bool Function(MasterKeyModel) isServiceSelected;
|
||||||
|
final List<MasterKeyModel> masterList;
|
||||||
|
|
||||||
|
ExaminationsListSearchWidget(
|
||||||
|
{this.removeHistory,
|
||||||
|
this.addHistory,
|
||||||
|
this.isServiceSelected,
|
||||||
|
this.masterList});
|
||||||
|
|
||||||
|
@override
|
||||||
|
_ExaminationsListSearchWidgetState createState() =>
|
||||||
|
_ExaminationsListSearchWidgetState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _ExaminationsListSearchWidgetState
|
||||||
|
extends State<ExaminationsListSearchWidget> {
|
||||||
|
int expandedIndex = -1;
|
||||||
|
List<MasterKeyModel> items = List();
|
||||||
|
TextEditingController filteredSearchController = TextEditingController();
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
items.addAll(widget.masterList);
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Column(
|
||||||
|
children: [
|
||||||
|
AppTextFieldCustom(
|
||||||
|
height: MediaQuery.of(context).size.height * 0.080,
|
||||||
|
hintText: TranslationBase.of(context).searchExamination,
|
||||||
|
isDropDown: true,
|
||||||
|
hasBorder: false,
|
||||||
|
controller: filteredSearchController,
|
||||||
|
onChanged: (value) {
|
||||||
|
filterSearchResults(value);
|
||||||
|
},
|
||||||
|
suffixIcon: Icon(
|
||||||
|
Icons.search,
|
||||||
|
color: Colors.black,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
DividerWithSpacesAround(
|
||||||
|
height: 2,
|
||||||
|
),
|
||||||
|
...items.mapIndexed((index, item) {
|
||||||
|
return AddExaminationWidget(
|
||||||
|
item: item,
|
||||||
|
addHistory: widget.addHistory,
|
||||||
|
removeHistory: widget.removeHistory,
|
||||||
|
isServiceSelected: widget.isServiceSelected,
|
||||||
|
isExpand: index == expandedIndex,
|
||||||
|
expandClick: () {
|
||||||
|
setState(() {
|
||||||
|
if (expandedIndex == index) {
|
||||||
|
expandedIndex = -1;
|
||||||
|
} else {
|
||||||
|
expandedIndex = index;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}).toList(),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void filterSearchResults(String query) {
|
||||||
|
List<MasterKeyModel> dummySearchList = List();
|
||||||
|
dummySearchList.addAll(widget.masterList);
|
||||||
|
if (query.isNotEmpty) {
|
||||||
|
List<MasterKeyModel> dummyListData = List();
|
||||||
|
dummySearchList.forEach((item) {
|
||||||
|
if (item.nameAr.toLowerCase().contains(query.toLowerCase()) ||
|
||||||
|
item.nameEn.toLowerCase().contains(query.toLowerCase())) {
|
||||||
|
dummyListData.add(item);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
setState(() {
|
||||||
|
items.clear();
|
||||||
|
items.addAll(dummyListData);
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
setState(() {
|
||||||
|
items.clear();
|
||||||
|
items.addAll(widget.masterList);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class AddExaminationWidget extends StatefulWidget {
|
||||||
|
MasterKeyModel item;
|
||||||
|
final Function(MasterKeyModel) removeHistory;
|
||||||
|
final Function(MySelectedExamination) addHistory;
|
||||||
|
final bool Function(MasterKeyModel) isServiceSelected;
|
||||||
|
bool isExpand;
|
||||||
|
final Function expandClick;
|
||||||
|
|
||||||
|
AddExaminationWidget({
|
||||||
|
this.item,
|
||||||
|
this.removeHistory,
|
||||||
|
this.addHistory,
|
||||||
|
this.isServiceSelected,
|
||||||
|
this.isExpand,
|
||||||
|
this.expandClick,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
_AddExaminationWidgetState createState() => _AddExaminationWidgetState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _AddExaminationWidgetState extends State<AddExaminationWidget> {
|
||||||
|
int status = 3;
|
||||||
|
TextEditingController remarksController = TextEditingController();
|
||||||
|
MySelectedExamination examination = MySelectedExamination();
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
|
||||||
|
examination.selectedExamination = widget.item;
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
ProjectViewModel projectViewModel = Provider.of(context);
|
||||||
|
|
||||||
|
return Container(
|
||||||
|
child: HeaderBodyExpandableNotifier(
|
||||||
|
headerWidget: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: CheckboxListTile(
|
||||||
|
title: AppText(
|
||||||
|
projectViewModel.isArabic
|
||||||
|
? widget.item.nameAr != null && widget.item.nameAr != ""
|
||||||
|
? widget.item.nameAr
|
||||||
|
: widget.item.nameEn
|
||||||
|
: widget.item.nameEn,
|
||||||
|
fontWeight: FontWeight.normal,
|
||||||
|
fontFamily: 'Poppins',
|
||||||
|
fontSize: SizeConfig.textMultiplier * 2.0,
|
||||||
|
),
|
||||||
|
value: widget.isServiceSelected(widget.item),
|
||||||
|
activeColor: HexColor("#D02127"),
|
||||||
|
onChanged: (newValue) {
|
||||||
|
setState(() {
|
||||||
|
if (widget.isServiceSelected(widget.item)) {
|
||||||
|
widget.removeHistory(widget.item);
|
||||||
|
widget.expandClick();
|
||||||
|
} else {
|
||||||
|
examination.isNormal = status == 1;
|
||||||
|
examination.isAbnormal = status == 2;
|
||||||
|
examination.notExamined = status == 3;
|
||||||
|
examination.remark = remarksController.text;
|
||||||
|
widget.addHistory(examination);
|
||||||
|
widget.expandClick();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
controlAffinity: ListTileControlAffinity.leading,
|
||||||
|
contentPadding: EdgeInsets.all(0),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
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: Row(
|
||||||
|
children: [
|
||||||
|
InkWell(
|
||||||
|
onTap: () {
|
||||||
|
setState(() {
|
||||||
|
status = 1;
|
||||||
|
});
|
||||||
|
examination.isNormal = true;
|
||||||
|
examination.isAbnormal = false;
|
||||||
|
examination.notExamined = false;
|
||||||
|
},
|
||||||
|
child: 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: Row(
|
||||||
|
children: [
|
||||||
|
InkWell(
|
||||||
|
onTap: () {
|
||||||
|
setState(() {
|
||||||
|
status = 2;
|
||||||
|
});
|
||||||
|
examination.isNormal = false;
|
||||||
|
examination.isAbnormal = true;
|
||||||
|
examination.notExamined = false;
|
||||||
|
},
|
||||||
|
child: 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,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)),
|
||||||
|
Expanded(
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
InkWell(
|
||||||
|
onTap: () {
|
||||||
|
setState(() {
|
||||||
|
status = 3;
|
||||||
|
});
|
||||||
|
examination.isNormal = false;
|
||||||
|
examination.isAbnormal = false;
|
||||||
|
examination.notExamined = true;
|
||||||
|
},
|
||||||
|
child: 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;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
isExpand: widget.isExpand,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension FicListExtension<T> on List<T> {
|
||||||
|
/// Maps each element of the list.
|
||||||
|
/// The [map] function gets both the original [item] and its [index].
|
||||||
|
Iterable<E> mapIndexed<E>(E Function(int index, T item) map) sync* {
|
||||||
|
for (var index = 0; index < length; index++) {
|
||||||
|
yield map(index, this[index]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,493 @@
|
|||||||
|
import 'package:doctor_app_flutter/config/config.dart';
|
||||||
|
import 'package:doctor_app_flutter/config/shared_pref_kay.dart';
|
||||||
|
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/viewModel/SOAP_view_model.dart';
|
||||||
|
import 'package:doctor_app_flutter/core/viewModel/auth_view_model.dart';
|
||||||
|
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
|
||||||
|
import 'package:doctor_app_flutter/models/SOAP/GetPhysicalExamReqModel.dart';
|
||||||
|
import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart';
|
||||||
|
import 'package:doctor_app_flutter/models/SOAP/my_selected_examination.dart';
|
||||||
|
import 'package:doctor_app_flutter/models/SOAP/post_physical_exam_request_model.dart';
|
||||||
|
import 'package:doctor_app_flutter/models/doctor/doctor_profile_model.dart';
|
||||||
|
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
|
||||||
|
import 'package:doctor_app_flutter/screens/base/base_view.dart';
|
||||||
|
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
|
||||||
|
import 'package:doctor_app_flutter/widgets/shared/Text.dart';
|
||||||
|
import 'package:doctor_app_flutter/widgets/shared/TextFields.dart';
|
||||||
|
import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart';
|
||||||
|
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
|
||||||
|
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
|
||||||
|
import 'package:doctor_app_flutter/widgets/shared/expandable-widget-header-body.dart';
|
||||||
|
import 'package:doctor_app_flutter/widgets/transitions/fade_page.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
||||||
|
import 'package:hexcolor/hexcolor.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
import 'examination-item-card.dart';
|
||||||
|
import 'objective-add-examination-page.dart';
|
||||||
|
|
||||||
|
class UpdateObjectivePage extends StatefulWidget {
|
||||||
|
final Function changePageViewIndex;
|
||||||
|
final Function changeLoadingState;
|
||||||
|
|
||||||
|
final List<MySelectedExamination> mySelectedExamination;
|
||||||
|
final PatiantInformtion patientInfo;
|
||||||
|
|
||||||
|
UpdateObjectivePage(
|
||||||
|
{Key key,
|
||||||
|
this.changePageViewIndex,
|
||||||
|
this.mySelectedExamination,
|
||||||
|
this.patientInfo,
|
||||||
|
this.changeLoadingState});
|
||||||
|
|
||||||
|
@override
|
||||||
|
_UpdateObjectivePageState createState() => _UpdateObjectivePageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _UpdateObjectivePageState extends State<UpdateObjectivePage> {
|
||||||
|
bool isSysExaminationExpand = false;
|
||||||
|
|
||||||
|
BoxDecoration containerBorderDecoration(
|
||||||
|
Color containerColor, Color borderColor) {
|
||||||
|
return BoxDecoration(
|
||||||
|
color: containerColor,
|
||||||
|
shape: BoxShape.rectangle,
|
||||||
|
borderRadius: BorderRadius.all(Radius.circular(6)),
|
||||||
|
border: Border.fromBorderSide(BorderSide(
|
||||||
|
color: borderColor,
|
||||||
|
width: 0.5,
|
||||||
|
)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final screenSize = MediaQuery.of(context).size;
|
||||||
|
ProjectViewModel projectViewModel = Provider.of(context);
|
||||||
|
|
||||||
|
return BaseView<SOAPViewModel>(
|
||||||
|
onModelReady: (model) async {
|
||||||
|
widget.mySelectedExamination.clear();
|
||||||
|
GetPhysicalExamReqModel getPhysicalExamReqModel =
|
||||||
|
GetPhysicalExamReqModel(
|
||||||
|
patientMRN: widget.patientInfo.patientMRN,
|
||||||
|
episodeID: widget.patientInfo.episodeNo.toString(),
|
||||||
|
appointmentNo: widget.patientInfo.appointmentNo);
|
||||||
|
|
||||||
|
await model.getPatientPhysicalExam(getPhysicalExamReqModel);
|
||||||
|
if (model.patientPhysicalExamList.isNotEmpty) {
|
||||||
|
if (model.physicalExaminationList.length == 0) {
|
||||||
|
await model
|
||||||
|
.getMasterLookup(MasterKeysService.PhysicalExamination);
|
||||||
|
}
|
||||||
|
model.patientPhysicalExamList.forEach((element) {
|
||||||
|
MasterKeyModel examMaster = model.getOneMasterKey(
|
||||||
|
masterKeys: MasterKeysService.PhysicalExamination,
|
||||||
|
id: element.examId,
|
||||||
|
);
|
||||||
|
MySelectedExamination tempEam = MySelectedExamination(
|
||||||
|
selectedExamination: examMaster,
|
||||||
|
remark: element.remarks,
|
||||||
|
isNormal: element.isNormal,
|
||||||
|
createdBy: element.createdBy,
|
||||||
|
notExamined: element.notExamined,
|
||||||
|
isNew: element.isNew,
|
||||||
|
isAbnormal: element.isAbnormal);
|
||||||
|
widget.mySelectedExamination.add(tempEam);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
widget.changeLoadingState(false);
|
||||||
|
},
|
||||||
|
builder: (_, model, w) => AppScaffold(
|
||||||
|
isShowAppBar: false,
|
||||||
|
// baseViewModel: model,
|
||||||
|
body: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: SingleChildScrollView(
|
||||||
|
physics: ScrollPhysics(),
|
||||||
|
child: Container(
|
||||||
|
color: Color.fromRGBO(248, 248, 248, 1),
|
||||||
|
child: Center(
|
||||||
|
child: FractionallySizedBox(
|
||||||
|
widthFactor: 0.95,
|
||||||
|
child: Container(
|
||||||
|
margin: EdgeInsets.all(8.0),
|
||||||
|
padding: EdgeInsets.all(12.0),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
shape: BoxShape.rectangle,
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.circular(12),
|
||||||
|
border: Border.fromBorderSide(BorderSide(
|
||||||
|
color: Colors.grey.shade400,
|
||||||
|
width: 0.4,
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
HeaderBodyExpandableNotifier(
|
||||||
|
headerWidget: Row(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
AppText(
|
||||||
|
"${TranslationBase.of(context).physicalSystemExamination}",
|
||||||
|
fontFamily: 'Poppins',
|
||||||
|
fontSize:
|
||||||
|
SizeConfig.textMultiplier * 2.0,
|
||||||
|
fontWeight: isSysExaminationExpand
|
||||||
|
? FontWeight.w700
|
||||||
|
: FontWeight.normal,
|
||||||
|
),
|
||||||
|
Icon(
|
||||||
|
FontAwesomeIcons.asterisk,
|
||||||
|
color: AppGlobal.appPrimaryColor,
|
||||||
|
size: 12,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
InkWell(
|
||||||
|
onTap: () {
|
||||||
|
setState(() {
|
||||||
|
isSysExaminationExpand =
|
||||||
|
!isSysExaminationExpand;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
child: Icon(isSysExaminationExpand
|
||||||
|
? Icons.keyboard_arrow_up
|
||||||
|
: Icons.keyboard_arrow_down))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
bodyWidget: Column(
|
||||||
|
children: [
|
||||||
|
InkWell(
|
||||||
|
onTap: () {
|
||||||
|
openExaminationList(context);
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
padding: EdgeInsets.symmetric(
|
||||||
|
vertical: 8, horizontal: 8.0),
|
||||||
|
margin:
|
||||||
|
EdgeInsets.symmetric(vertical: 8),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
border: Border.all(
|
||||||
|
color: Colors.grey.shade400,
|
||||||
|
width: 0.5),
|
||||||
|
borderRadius: BorderRadius.all(
|
||||||
|
Radius.circular(8),
|
||||||
|
),
|
||||||
|
color: Colors.white,
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.spaceBetween,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
AppText(
|
||||||
|
"${TranslationBase.of(context).addExamination}",
|
||||||
|
fontSize: SizeConfig
|
||||||
|
.textMultiplier *
|
||||||
|
1.8,
|
||||||
|
color: Colors.black,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
AppText(
|
||||||
|
"${TranslationBase.of(context).searchHere}",
|
||||||
|
fontSize: SizeConfig
|
||||||
|
.textMultiplier *
|
||||||
|
1.8,
|
||||||
|
color: Colors.grey.shade700,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)),
|
||||||
|
Icon(
|
||||||
|
Icons.add_box_rounded,
|
||||||
|
size: 25,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
/* ...List.generate(
|
||||||
|
widget.mySelectedExamination.length,
|
||||||
|
(index) => Container(
|
||||||
|
child: ExaminationIitemCard(
|
||||||
|
widget.mySelectedExamination[
|
||||||
|
index], () {
|
||||||
|
removeExamination(widget
|
||||||
|
.mySelectedExamination[
|
||||||
|
index]
|
||||||
|
.selectedExamination);
|
||||||
|
}),
|
||||||
|
)),*/
|
||||||
|
Column(
|
||||||
|
children: widget.mySelectedExamination
|
||||||
|
.map((examination) {
|
||||||
|
return ExaminationIitemCard(
|
||||||
|
examination, () {
|
||||||
|
removeExamination(examination
|
||||||
|
.selectedExamination);
|
||||||
|
});
|
||||||
|
}).toList(),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
isExpand: isSysExaminationExpand,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: AppButton(
|
||||||
|
title: TranslationBase.of(context).previous,
|
||||||
|
color: HexColor("#EAEAEA"),
|
||||||
|
fontColor: Colors.black,
|
||||||
|
onPressed: () {
|
||||||
|
widget.changePageViewIndex(0);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
width: 10,
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: AppButton(
|
||||||
|
title: TranslationBase.of(context).next,
|
||||||
|
loading: model.state == ViewState.BusyLocal,
|
||||||
|
color: widget.mySelectedExamination != null &&
|
||||||
|
widget.mySelectedExamination.length > 0
|
||||||
|
? HexColor("#D02127")
|
||||||
|
: HexColor("#A5A5A5"),
|
||||||
|
fontColor: widget.mySelectedExamination != null &&
|
||||||
|
widget.mySelectedExamination.length > 0 ? Colors.white : HexColor("#5A5A5A"),
|
||||||
|
disabled: widget.mySelectedExamination != null &&
|
||||||
|
widget.mySelectedExamination.length > 0
|
||||||
|
? false
|
||||||
|
: true,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
onPressed: () async {
|
||||||
|
await submitUpdateObjectivePage(model);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
|
||||||
|
submitUpdateObjectivePage(SOAPViewModel model) async {
|
||||||
|
if (widget.mySelectedExamination.isNotEmpty) {
|
||||||
|
Map profile = await sharedPref.getObj(DOCTOR_PROFILE);
|
||||||
|
|
||||||
|
DoctorProfileModel doctorProfile = DoctorProfileModel.fromJson(profile);
|
||||||
|
PostPhysicalExamRequestModel postPhysicalExamRequestModel =
|
||||||
|
new PostPhysicalExamRequestModel();
|
||||||
|
widget.mySelectedExamination.forEach((exam) {
|
||||||
|
if (postPhysicalExamRequestModel.listHisProgNotePhysicalExaminationVM ==
|
||||||
|
null)
|
||||||
|
postPhysicalExamRequestModel.listHisProgNotePhysicalExaminationVM =
|
||||||
|
[];
|
||||||
|
|
||||||
|
postPhysicalExamRequestModel.listHisProgNotePhysicalExaminationVM
|
||||||
|
.add(ListHisProgNotePhysicalExaminationVM(
|
||||||
|
patientMRN: widget.patientInfo.patientMRN,
|
||||||
|
episodeId: widget.patientInfo.episodeNo,
|
||||||
|
appointmentNo: widget.patientInfo.appointmentNo,
|
||||||
|
remarks: exam.remark ?? '',
|
||||||
|
createdBy: exam.createdBy ?? doctorProfile.doctorID,
|
||||||
|
createdOn: DateTime.now().toIso8601String(),
|
||||||
|
editedBy: doctorProfile.doctorID,
|
||||||
|
editedOn: DateTime.now().toIso8601String(),
|
||||||
|
examId: exam.selectedExamination.id,
|
||||||
|
examType: exam.selectedExamination.typeId,
|
||||||
|
isAbnormal: exam.isAbnormal,
|
||||||
|
isNormal: exam.isNormal,
|
||||||
|
// masterDescription: exam.selectedExamination,
|
||||||
|
notExamined: exam.notExamined,
|
||||||
|
examinationType: exam.isNormal
|
||||||
|
? 1
|
||||||
|
: exam.isAbnormal
|
||||||
|
? 2
|
||||||
|
: 3,
|
||||||
|
examinationTypeName: exam.isNormal
|
||||||
|
? "Normal"
|
||||||
|
: exam.isAbnormal
|
||||||
|
? 'AbNormal'
|
||||||
|
: "Not Examined",
|
||||||
|
isNew: exam.isNew));
|
||||||
|
});
|
||||||
|
|
||||||
|
if (model.patientPhysicalExamList.isEmpty) {
|
||||||
|
await model.postPhysicalExam(postPhysicalExamRequestModel);
|
||||||
|
} else {
|
||||||
|
await model.patchPhysicalExam(postPhysicalExamRequestModel);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (model.state == ViewState.ErrorLocal) {
|
||||||
|
helpers.showErrorToast(model.error);
|
||||||
|
} else {
|
||||||
|
widget.changeLoadingState(true);
|
||||||
|
|
||||||
|
widget.changePageViewIndex(2);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// widget.changeLoadingState(true);
|
||||||
|
//
|
||||||
|
// widget.changePageViewIndex(2);
|
||||||
|
|
||||||
|
helpers.showErrorToast(TranslationBase.of(context).examinationErrorMsg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
removeExamination(MasterKeyModel masterKey) {
|
||||||
|
Iterable<MySelectedExamination> history = widget.mySelectedExamination
|
||||||
|
.where((element) =>
|
||||||
|
masterKey.id == element.selectedExamination.id &&
|
||||||
|
masterKey.typeId == element.selectedExamination.typeId);
|
||||||
|
|
||||||
|
if (history.length > 0)
|
||||||
|
setState(() {
|
||||||
|
widget.mySelectedExamination.remove(history.first);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
openExaminationList(BuildContext context) {
|
||||||
|
Navigator.push(
|
||||||
|
context,
|
||||||
|
FadePage(
|
||||||
|
page: AddExaminationPage(
|
||||||
|
mySelectedExamination: widget.mySelectedExamination,
|
||||||
|
addSelectedExamination: () {
|
||||||
|
setState(() {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
removeExamination: (masterKey) => removeExamination(masterKey)),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
/*showModalBottomSheet(
|
||||||
|
backgroundColor: Colors.white,
|
||||||
|
isScrollControlled: true,
|
||||||
|
context: context,
|
||||||
|
builder: (context) {
|
||||||
|
return AddExaminationDailog(
|
||||||
|
mySelectedExamination: widget.mySelectedExamination,
|
||||||
|
addSelectedExamination: () {
|
||||||
|
setState(() {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
removeExamination: (masterKey) => removeExamination(masterKey),
|
||||||
|
);
|
||||||
|
});*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class AddExaminationDailog extends StatefulWidget {
|
||||||
|
final List<MySelectedExamination> mySelectedExamination;
|
||||||
|
final Function addSelectedExamination;
|
||||||
|
final Function(MasterKeyModel) removeExamination;
|
||||||
|
|
||||||
|
const AddExaminationDailog(
|
||||||
|
{Key key,
|
||||||
|
this.mySelectedExamination,
|
||||||
|
this.addSelectedExamination,
|
||||||
|
this.removeExamination})
|
||||||
|
: super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_AddExaminationDailogState createState() => _AddExaminationDailogState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _AddExaminationDailogState extends State<AddExaminationDailog> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return FractionallySizedBox(
|
||||||
|
heightFactor: 0.7,
|
||||||
|
child: BaseView<SOAPViewModel>(
|
||||||
|
onModelReady: (model) async {
|
||||||
|
if (model.physicalExaminationList.length == 0) {
|
||||||
|
await model
|
||||||
|
.getMasterLookup(MasterKeysService.PhysicalExamination);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
builder: (_, model, w) => AppScaffold(
|
||||||
|
baseViewModel: model,
|
||||||
|
isShowAppBar: false,
|
||||||
|
body: Center(
|
||||||
|
child: Container(
|
||||||
|
child: FractionallySizedBox(
|
||||||
|
widthFactor: 0.9,
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
SizedBox(
|
||||||
|
height: 16,
|
||||||
|
),
|
||||||
|
AppText(
|
||||||
|
TranslationBase.of(context).physicalSystemExamination,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
fontSize: 16,
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 16,
|
||||||
|
),
|
||||||
|
/*MasterKeyCheckboxSearchWidget(
|
||||||
|
model: model,
|
||||||
|
hintSearchText:
|
||||||
|
TranslationBase.of(context).searchExamination,
|
||||||
|
buttonName:
|
||||||
|
TranslationBase.of(context).addExamination,
|
||||||
|
masterList: model.physicalExaminationList,
|
||||||
|
removeHistory: (history) {
|
||||||
|
setState(() {
|
||||||
|
widget.removeExamination(history);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
addHistory: (history) {
|
||||||
|
setState(() {
|
||||||
|
MySelectedExamination mySelectedExamination =
|
||||||
|
new MySelectedExamination(
|
||||||
|
selectedExamination: history);
|
||||||
|
widget.mySelectedExamination
|
||||||
|
.add(mySelectedExamination);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
addSelectedHistories: () {
|
||||||
|
widget.addSelectedExamination();
|
||||||
|
},
|
||||||
|
isServiceSelected: (master) =>
|
||||||
|
isServiceSelected(master),
|
||||||
|
),*/
|
||||||
|
]),
|
||||||
|
))),
|
||||||
|
)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,93 @@
|
|||||||
|
import 'package:doctor_app_flutter/config/config.dart';
|
||||||
|
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:hexcolor/hexcolor.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
class PriorityBar extends StatefulWidget {
|
||||||
|
final Function onTap;
|
||||||
|
|
||||||
|
const PriorityBar({Key key, this.onTap}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_PriorityBarState createState() => _PriorityBarState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _PriorityBarState extends State<PriorityBar> {
|
||||||
|
int _activePriority = 0;
|
||||||
|
int index = -1;
|
||||||
|
List<String> _priorities = [
|
||||||
|
"Family",
|
||||||
|
"Surgical/Sports",
|
||||||
|
"Medical",
|
||||||
|
];
|
||||||
|
List<String> _prioritiesAr = [
|
||||||
|
"أسرة",
|
||||||
|
"جراحي / رياضي",
|
||||||
|
"طبي",
|
||||||
|
];
|
||||||
|
|
||||||
|
BoxDecoration containerBorderDecoration(
|
||||||
|
Color containerColor, Color borderColor) {
|
||||||
|
return BoxDecoration();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final screenSize = MediaQuery.of(context).size;
|
||||||
|
ProjectViewModel projectViewModel = Provider.of(context);
|
||||||
|
|
||||||
|
return Container(
|
||||||
|
height: screenSize.height * 0.080,
|
||||||
|
child: Row(
|
||||||
|
mainAxisSize: MainAxisSize.max,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: _priorities.map((
|
||||||
|
item,
|
||||||
|
) {
|
||||||
|
bool _isActive = _priorities[_activePriority] == item ? true : false;
|
||||||
|
if (index < 2) {
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
return Expanded(
|
||||||
|
child: InkWell(
|
||||||
|
child: Center(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
height: screenSize.height * 0.070,
|
||||||
|
decoration: containerBorderDecoration(
|
||||||
|
_isActive ? HexColor("#B8382B") : Colors.white,
|
||||||
|
_isActive ? HexColor("#B8382B") : Colors.white),
|
||||||
|
child: Center(
|
||||||
|
child: Text(
|
||||||
|
(projectViewModel.isArabic)
|
||||||
|
? _prioritiesAr[index]
|
||||||
|
: item,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 15,
|
||||||
|
color: Colors.black, //Colors.black,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
if(_isActive)
|
||||||
|
Container(width: 120,height: 4,color: AppGlobal.appPrimaryColor,)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
onTap: () {
|
||||||
|
widget.onTap(_priorities.indexOf(item));
|
||||||
|
|
||||||
|
setState(() {
|
||||||
|
_activePriority = _priorities.indexOf(item);
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}).toList(),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -1,730 +0,0 @@
|
|||||||
import 'package:doctor_app_flutter/config/config.dart';
|
|
||||||
import 'package:doctor_app_flutter/config/shared_pref_kay.dart';
|
|
||||||
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/viewModel/SOAP_view_model.dart';
|
|
||||||
import 'package:doctor_app_flutter/core/viewModel/auth_view_model.dart';
|
|
||||||
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
|
|
||||||
import 'package:doctor_app_flutter/models/SOAP/GetPhysicalExamReqModel.dart';
|
|
||||||
import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart';
|
|
||||||
import 'package:doctor_app_flutter/models/SOAP/my_selected_examination.dart';
|
|
||||||
import 'package:doctor_app_flutter/models/SOAP/post_physical_exam_request_model.dart';
|
|
||||||
import 'package:doctor_app_flutter/models/doctor/doctor_profile_model.dart';
|
|
||||||
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
|
|
||||||
import 'package:doctor_app_flutter/screens/base/base_view.dart';
|
|
||||||
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
|
|
||||||
import 'package:doctor_app_flutter/widgets/patients/profile/soap_update/expandable_SOAP_widget.dart';
|
|
||||||
import 'package:doctor_app_flutter/widgets/shared/Text.dart';
|
|
||||||
import 'package:doctor_app_flutter/widgets/shared/TextFields.dart';
|
|
||||||
import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart';
|
|
||||||
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
|
|
||||||
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
|
|
||||||
import 'package:doctor_app_flutter/widgets/shared/divider_with_spaces_around.dart';
|
|
||||||
import 'package:doctor_app_flutter/widgets/shared/expandable-widget-header-body.dart';
|
|
||||||
import 'package:doctor_app_flutter/widgets/shared/master_key_checkbox_search_widget.dart';
|
|
||||||
import 'package:doctor_app_flutter/widgets/shared/network_base_view.dart';
|
|
||||||
import 'package:eva_icons_flutter/eva_icons_flutter.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
|
|
||||||
import 'package:hexcolor/hexcolor.dart';
|
|
||||||
import 'package:provider/provider.dart';
|
|
||||||
|
|
||||||
class UpdateObjectivePage extends StatefulWidget {
|
|
||||||
final Function changePageViewIndex;
|
|
||||||
final Function changeLoadingState;
|
|
||||||
|
|
||||||
final List<MySelectedExamination> mySelectedExamination;
|
|
||||||
final PatiantInformtion patientInfo;
|
|
||||||
|
|
||||||
UpdateObjectivePage(
|
|
||||||
{Key key,
|
|
||||||
this.changePageViewIndex,
|
|
||||||
this.mySelectedExamination,
|
|
||||||
this.patientInfo,
|
|
||||||
this.changeLoadingState});
|
|
||||||
|
|
||||||
@override
|
|
||||||
_UpdateObjectivePageState createState() => _UpdateObjectivePageState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _UpdateObjectivePageState extends State<UpdateObjectivePage> {
|
|
||||||
bool isSysExaminationExpand = false;
|
|
||||||
|
|
||||||
BoxDecoration containerBorderDecoration(
|
|
||||||
Color containerColor, Color borderColor) {
|
|
||||||
return BoxDecoration(
|
|
||||||
color: containerColor,
|
|
||||||
shape: BoxShape.rectangle,
|
|
||||||
borderRadius: BorderRadius.all(Radius.circular(6)),
|
|
||||||
border: Border.fromBorderSide(BorderSide(
|
|
||||||
color: borderColor,
|
|
||||||
width: 0.5,
|
|
||||||
)),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
final screenSize = MediaQuery.of(context).size;
|
|
||||||
ProjectViewModel projectViewModel = Provider.of(context);
|
|
||||||
|
|
||||||
return BaseView<SOAPViewModel>(
|
|
||||||
onModelReady: (model) async {
|
|
||||||
widget.mySelectedExamination.clear();
|
|
||||||
GetPhysicalExamReqModel getPhysicalExamReqModel =
|
|
||||||
GetPhysicalExamReqModel(
|
|
||||||
patientMRN: widget.patientInfo.patientMRN,
|
|
||||||
episodeID: widget.patientInfo.episodeNo.toString(),
|
|
||||||
appointmentNo: widget.patientInfo.appointmentNo);
|
|
||||||
|
|
||||||
await model.getPatientPhysicalExam(getPhysicalExamReqModel);
|
|
||||||
if (model.patientPhysicalExamList.isNotEmpty) {
|
|
||||||
if (model.physicalExaminationList.length == 0) {
|
|
||||||
await model
|
|
||||||
.getMasterLookup(MasterKeysService.PhysicalExamination);
|
|
||||||
}
|
|
||||||
model.patientPhysicalExamList.forEach((element) {
|
|
||||||
MasterKeyModel examMaster = model.getOneMasterKey(
|
|
||||||
masterKeys: MasterKeysService.PhysicalExamination,
|
|
||||||
id: element.examId,
|
|
||||||
);
|
|
||||||
MySelectedExamination tempEam = MySelectedExamination(
|
|
||||||
selectedExamination: examMaster,
|
|
||||||
remark: element.remarks,
|
|
||||||
isNormal: element.isNormal,
|
|
||||||
createdBy: element.createdBy,
|
|
||||||
notExamined: element.notExamined,
|
|
||||||
isNew: element.isNew,
|
|
||||||
isAbnormal: element.isAbnormal);
|
|
||||||
widget.mySelectedExamination.add(tempEam);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
widget.changeLoadingState(false);
|
|
||||||
},
|
|
||||||
builder: (_, model, w) => AppScaffold(
|
|
||||||
isShowAppBar: false,
|
|
||||||
// baseViewModel: model,
|
|
||||||
body: Column(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
child: SingleChildScrollView(
|
|
||||||
physics: ScrollPhysics(),
|
|
||||||
child: Container(
|
|
||||||
color: Color.fromRGBO(248, 248, 248, 1),
|
|
||||||
child: Center(
|
|
||||||
child: FractionallySizedBox(
|
|
||||||
widthFactor: 0.95,
|
|
||||||
child: Container(
|
|
||||||
margin: EdgeInsets.all(8.0),
|
|
||||||
padding: EdgeInsets.all(12.0),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
shape: BoxShape.rectangle,
|
|
||||||
color: Colors.white,
|
|
||||||
borderRadius: BorderRadius.circular(12),
|
|
||||||
border: Border.fromBorderSide(BorderSide(
|
|
||||||
color: Colors.grey.shade400,
|
|
||||||
width: 0.4,
|
|
||||||
)),
|
|
||||||
),
|
|
||||||
child: Column(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
HeaderBodyExpandableNotifier(
|
|
||||||
headerWidget: Row(
|
|
||||||
mainAxisAlignment:
|
|
||||||
MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
AppText(
|
|
||||||
"${TranslationBase.of(context).physicalSystemExamination}",
|
|
||||||
fontFamily: 'Poppins',
|
|
||||||
fontSize: SizeConfig.textMultiplier * 2.0,
|
|
||||||
fontWeight: isSysExaminationExpand ? FontWeight.w700 : FontWeight.normal,
|
|
||||||
),
|
|
||||||
/*Texts(
|
|
||||||
TranslationBase.of(context)
|
|
||||||
.physicalSystemExamination,
|
|
||||||
variant: isSysExaminationExpand
|
|
||||||
? "bodyText"
|
|
||||||
: '',
|
|
||||||
bold: isSysExaminationExpand
|
|
||||||
? true
|
|
||||||
: false,
|
|
||||||
color: Colors.black),*/
|
|
||||||
Icon(
|
|
||||||
FontAwesomeIcons.asterisk,
|
|
||||||
color: AppGlobal.appPrimaryColor,
|
|
||||||
size: 12,
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
InkWell(
|
|
||||||
onTap: () {
|
|
||||||
setState(() {
|
|
||||||
isSysExaminationExpand =
|
|
||||||
!isSysExaminationExpand;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
child: Icon(isSysExaminationExpand
|
|
||||||
? Icons.keyboard_arrow_up
|
|
||||||
: Icons.keyboard_arrow_down))
|
|
||||||
],
|
|
||||||
),
|
|
||||||
bodyWidget: Column(children: [
|
|
||||||
SizedBox(
|
|
||||||
height: 20,
|
|
||||||
),
|
|
||||||
Column(
|
|
||||||
children: [
|
|
||||||
Container(
|
|
||||||
margin: EdgeInsets.only(
|
|
||||||
left: 10, right: 10, top: 15),
|
|
||||||
child: TextFields(
|
|
||||||
hintText: TranslationBase.of(context)
|
|
||||||
.physicalSystemExamination,
|
|
||||||
fontSize: 13.5,
|
|
||||||
onTapTextFields: () {
|
|
||||||
openExaminationList(context);
|
|
||||||
},
|
|
||||||
readOnly: true,
|
|
||||||
// hintColor: Colors.black,
|
|
||||||
suffixIcon:
|
|
||||||
EvaIcons.plusCircleOutline,
|
|
||||||
suffixIconColor:
|
|
||||||
AppGlobal.appPrimaryColor,
|
|
||||||
fontWeight: FontWeight.w600,
|
|
||||||
// controller: messageController,
|
|
||||||
validator: (value) {
|
|
||||||
if (value == null)
|
|
||||||
return TranslationBase.of(context)
|
|
||||||
.emptyMessage;
|
|
||||||
else
|
|
||||||
return null;
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
SizedBox(
|
|
||||||
height: 20,
|
|
||||||
),
|
|
||||||
Column(
|
|
||||||
children: widget.mySelectedExamination
|
|
||||||
.map((examination) {
|
|
||||||
TextEditingController
|
|
||||||
remarksController =
|
|
||||||
TextEditingController(
|
|
||||||
text: examination.remark);
|
|
||||||
|
|
||||||
return Container(
|
|
||||||
margin: EdgeInsets.only(
|
|
||||||
left: 15, right: 15, top: 15),
|
|
||||||
child: Column(children: [
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment:
|
|
||||||
MainAxisAlignment
|
|
||||||
.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Texts(
|
|
||||||
(examination
|
|
||||||
.selectedExamination
|
|
||||||
.nameEn)
|
|
||||||
.toUpperCase(),
|
|
||||||
variant: "bodyText",
|
|
||||||
bold: true,
|
|
||||||
color: Colors.black)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
SizedBox(
|
|
||||||
height: 8,
|
|
||||||
),
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment:
|
|
||||||
MainAxisAlignment
|
|
||||||
.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
InkWell(
|
|
||||||
child: Center(
|
|
||||||
child: Container(
|
|
||||||
height: screenSize
|
|
||||||
.height *
|
|
||||||
0.070,
|
|
||||||
decoration: containerBorderDecoration(
|
|
||||||
examination
|
|
||||||
.isNormal
|
|
||||||
? Color(
|
|
||||||
0xFF515A5D)
|
|
||||||
: Colors
|
|
||||||
.white,
|
|
||||||
Colors
|
|
||||||
.grey),
|
|
||||||
child: Center(
|
|
||||||
child:
|
|
||||||
Padding(
|
|
||||||
padding:
|
|
||||||
const EdgeInsets.all(
|
|
||||||
8.0),
|
|
||||||
child: Text(
|
|
||||||
TranslationBase.of(
|
|
||||||
context)
|
|
||||||
.normal,
|
|
||||||
style:
|
|
||||||
TextStyle(
|
|
||||||
fontSize:
|
|
||||||
12,
|
|
||||||
color: examination.isNormal
|
|
||||||
? Colors.white
|
|
||||||
: Colors.black,
|
|
||||||
//Colors.black,
|
|
||||||
fontWeight:
|
|
||||||
FontWeight.bold,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)),
|
|
||||||
),
|
|
||||||
onTap: () {
|
|
||||||
setState(() {
|
|
||||||
examination
|
|
||||||
.isAbnormal =
|
|
||||||
false;
|
|
||||||
examination
|
|
||||||
.isNormal =
|
|
||||||
true;
|
|
||||||
examination
|
|
||||||
.notExamined =
|
|
||||||
false;
|
|
||||||
});
|
|
||||||
}),
|
|
||||||
SizedBox(
|
|
||||||
width: 12,
|
|
||||||
),
|
|
||||||
InkWell(
|
|
||||||
child: Center(
|
|
||||||
child: Container(
|
|
||||||
height: screenSize
|
|
||||||
.height *
|
|
||||||
0.070,
|
|
||||||
decoration: containerBorderDecoration(
|
|
||||||
examination
|
|
||||||
.isAbnormal
|
|
||||||
? Color(
|
|
||||||
0xFF515A5D)
|
|
||||||
: Colors
|
|
||||||
.white,
|
|
||||||
Colors
|
|
||||||
.black),
|
|
||||||
child: Center(
|
|
||||||
child:
|
|
||||||
Padding(
|
|
||||||
padding:
|
|
||||||
const EdgeInsets.all(
|
|
||||||
8.0),
|
|
||||||
child: Text(
|
|
||||||
TranslationBase.of(
|
|
||||||
context)
|
|
||||||
.abnormal,
|
|
||||||
style:
|
|
||||||
TextStyle(
|
|
||||||
fontSize:
|
|
||||||
12,
|
|
||||||
color: examination.isAbnormal
|
|
||||||
? Colors.white
|
|
||||||
: Colors.black,
|
|
||||||
//Colors.black,
|
|
||||||
fontWeight:
|
|
||||||
FontWeight.bold,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)),
|
|
||||||
),
|
|
||||||
onTap: () {
|
|
||||||
setState(() {
|
|
||||||
examination
|
|
||||||
.isNormal =
|
|
||||||
false;
|
|
||||||
examination
|
|
||||||
.isAbnormal =
|
|
||||||
true;
|
|
||||||
examination
|
|
||||||
.notExamined =
|
|
||||||
false;
|
|
||||||
});
|
|
||||||
}),
|
|
||||||
SizedBox(
|
|
||||||
width: 12,
|
|
||||||
),
|
|
||||||
InkWell(
|
|
||||||
child: Center(
|
|
||||||
child: Container(
|
|
||||||
height: screenSize
|
|
||||||
.height *
|
|
||||||
0.070,
|
|
||||||
decoration: containerBorderDecoration(
|
|
||||||
examination
|
|
||||||
.notExamined
|
|
||||||
? Color(
|
|
||||||
0xFF515A5D)
|
|
||||||
: Colors
|
|
||||||
.white,
|
|
||||||
Colors
|
|
||||||
.black),
|
|
||||||
child: Center(
|
|
||||||
child:
|
|
||||||
Padding(
|
|
||||||
padding:
|
|
||||||
const EdgeInsets.all(
|
|
||||||
8.0),
|
|
||||||
child: Text(
|
|
||||||
"Not Examined",
|
|
||||||
style:
|
|
||||||
TextStyle(
|
|
||||||
fontSize:
|
|
||||||
12,
|
|
||||||
color: examination.notExamined
|
|
||||||
? Colors.white
|
|
||||||
: Colors.black,
|
|
||||||
//Colors.black,
|
|
||||||
fontWeight:
|
|
||||||
FontWeight.bold,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)),
|
|
||||||
),
|
|
||||||
onTap: () {
|
|
||||||
setState(() {
|
|
||||||
examination
|
|
||||||
.isAbnormal =
|
|
||||||
false;
|
|
||||||
examination
|
|
||||||
.isNormal =
|
|
||||||
false;
|
|
||||||
examination
|
|
||||||
.notExamined =
|
|
||||||
true;
|
|
||||||
});
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
InkWell(
|
|
||||||
child: Icon(
|
|
||||||
FontAwesomeIcons.trash,
|
|
||||||
color: Colors.grey,
|
|
||||||
size: 20,
|
|
||||||
),
|
|
||||||
onTap: () => removeExamination(
|
|
||||||
examination
|
|
||||||
.selectedExamination),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
SizedBox(
|
|
||||||
height: 20,
|
|
||||||
),
|
|
||||||
Container(
|
|
||||||
margin: EdgeInsets.only(
|
|
||||||
left: 0, right: 0, top: 15),
|
|
||||||
child: TextFields(
|
|
||||||
hasLabelText:
|
|
||||||
remarksController
|
|
||||||
.text !=
|
|
||||||
''
|
|
||||||
? true
|
|
||||||
: false,
|
|
||||||
showLabelText: true,
|
|
||||||
hintText:
|
|
||||||
TranslationBase.of(
|
|
||||||
context)
|
|
||||||
.remarks,
|
|
||||||
fontSize: 13.5,
|
|
||||||
// hintColor: Colors.black,
|
|
||||||
fontWeight: FontWeight.w600,
|
|
||||||
maxLines: 25,
|
|
||||||
minLines: 4,
|
|
||||||
controller:
|
|
||||||
remarksController,
|
|
||||||
onChanged: (val) {
|
|
||||||
examination.remark = val;
|
|
||||||
},
|
|
||||||
validator: (value) {
|
|
||||||
if (value == null)
|
|
||||||
return TranslationBase
|
|
||||||
.of(context)
|
|
||||||
.emptyMessage;
|
|
||||||
else
|
|
||||||
return null;
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
SizedBox(
|
|
||||||
height: 20,
|
|
||||||
),
|
|
||||||
]));
|
|
||||||
}).toList(),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
)
|
|
||||||
]),
|
|
||||||
isExpand: isSysExaminationExpand,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Container(
|
|
||||||
margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
|
|
||||||
child: Row(
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
child: AppButton(
|
|
||||||
title: TranslationBase.of(context).previous,
|
|
||||||
color: HexColor("#EAEAEA"),
|
|
||||||
fontColor: Colors.black,
|
|
||||||
onPressed: () {
|
|
||||||
widget.changePageViewIndex(0);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
SizedBox(
|
|
||||||
width: 10,
|
|
||||||
),
|
|
||||||
Expanded(
|
|
||||||
child: AppButton(
|
|
||||||
title: TranslationBase.of(context).next,
|
|
||||||
loading: model.state == ViewState.BusyLocal,
|
|
||||||
color: HexColor("#A5A5A5"),
|
|
||||||
fontColor: HexColor("#5A5A5A"),
|
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
onPressed: () async {
|
|
||||||
await submitUpdateObjectivePage(model);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
)));
|
|
||||||
}
|
|
||||||
|
|
||||||
submitUpdateObjectivePage(SOAPViewModel model) async {
|
|
||||||
if (widget.mySelectedExamination.isNotEmpty) {
|
|
||||||
Map profile = await sharedPref.getObj(DOCTOR_PROFILE);
|
|
||||||
|
|
||||||
DoctorProfileModel doctorProfile = DoctorProfileModel.fromJson(profile);
|
|
||||||
PostPhysicalExamRequestModel postPhysicalExamRequestModel =
|
|
||||||
new PostPhysicalExamRequestModel();
|
|
||||||
widget.mySelectedExamination.forEach((exam) {
|
|
||||||
if (postPhysicalExamRequestModel.listHisProgNotePhysicalExaminationVM ==
|
|
||||||
null)
|
|
||||||
postPhysicalExamRequestModel.listHisProgNotePhysicalExaminationVM =
|
|
||||||
[];
|
|
||||||
|
|
||||||
postPhysicalExamRequestModel.listHisProgNotePhysicalExaminationVM
|
|
||||||
.add(ListHisProgNotePhysicalExaminationVM(
|
|
||||||
patientMRN: widget.patientInfo.patientMRN,
|
|
||||||
episodeId: widget.patientInfo.episodeNo,
|
|
||||||
appointmentNo: widget.patientInfo.appointmentNo,
|
|
||||||
remarks: exam.remark ?? '',
|
|
||||||
createdBy: exam.createdBy ?? doctorProfile.doctorID,
|
|
||||||
createdOn: DateTime.now().toIso8601String(),
|
|
||||||
editedBy: doctorProfile.doctorID,
|
|
||||||
editedOn: DateTime.now().toIso8601String(),
|
|
||||||
examId: exam.selectedExamination.id,
|
|
||||||
examType: exam.selectedExamination.typeId,
|
|
||||||
isAbnormal: exam.isAbnormal,
|
|
||||||
isNormal: exam.isNormal,
|
|
||||||
// masterDescription: exam.selectedExamination,
|
|
||||||
notExamined: exam.notExamined,
|
|
||||||
examinationType: exam.isNormal
|
|
||||||
? 1
|
|
||||||
: exam.isAbnormal
|
|
||||||
? 2
|
|
||||||
: 3,
|
|
||||||
examinationTypeName: exam.isNormal
|
|
||||||
? "Normal"
|
|
||||||
: exam.isAbnormal
|
|
||||||
? 'AbNormal'
|
|
||||||
: "Not Examined",
|
|
||||||
isNew: exam.isNew));
|
|
||||||
});
|
|
||||||
|
|
||||||
if (model.patientPhysicalExamList.isEmpty) {
|
|
||||||
await model.postPhysicalExam(postPhysicalExamRequestModel);
|
|
||||||
} else {
|
|
||||||
await model.patchPhysicalExam(postPhysicalExamRequestModel);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (model.state == ViewState.ErrorLocal) {
|
|
||||||
helpers.showErrorToast(model.error);
|
|
||||||
} else {
|
|
||||||
widget.changeLoadingState(true);
|
|
||||||
|
|
||||||
widget.changePageViewIndex(2);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// widget.changeLoadingState(true);
|
|
||||||
//
|
|
||||||
// widget.changePageViewIndex(2);
|
|
||||||
|
|
||||||
helpers.showErrorToast(TranslationBase.of(context).examinationErrorMsg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
removeExamination(MasterKeyModel masterKey) {
|
|
||||||
Iterable<MySelectedExamination> history = widget.mySelectedExamination
|
|
||||||
.where((element) =>
|
|
||||||
masterKey.id == element.selectedExamination.id &&
|
|
||||||
masterKey.typeId == element.selectedExamination.typeId);
|
|
||||||
|
|
||||||
if (history.length > 0)
|
|
||||||
setState(() {
|
|
||||||
widget.mySelectedExamination.remove(history.first);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
openExaminationList(BuildContext context) {
|
|
||||||
final screenSize = MediaQuery.of(context).size;
|
|
||||||
InputDecoration textFieldSelectorDecoration(
|
|
||||||
String hintText, String selectedText, bool isDropDown) {
|
|
||||||
return InputDecoration(
|
|
||||||
focusedBorder: OutlineInputBorder(
|
|
||||||
borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
|
|
||||||
borderRadius: BorderRadius.circular(8),
|
|
||||||
),
|
|
||||||
enabledBorder: OutlineInputBorder(
|
|
||||||
borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
|
|
||||||
borderRadius: BorderRadius.circular(8),
|
|
||||||
),
|
|
||||||
disabledBorder: OutlineInputBorder(
|
|
||||||
borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
|
|
||||||
borderRadius: BorderRadius.circular(8),
|
|
||||||
),
|
|
||||||
hintText: selectedText != null ? selectedText : hintText,
|
|
||||||
suffixIcon: isDropDown ? Icon(Icons.arrow_drop_down) : null,
|
|
||||||
hintStyle: TextStyle(
|
|
||||||
fontSize: 14,
|
|
||||||
color: Colors.grey.shade600,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
showModalBottomSheet(
|
|
||||||
backgroundColor: Colors.white,
|
|
||||||
isScrollControlled: true,
|
|
||||||
context: context,
|
|
||||||
builder: (context) {
|
|
||||||
return AddExaminationDailog(
|
|
||||||
mySelectedExamination: widget.mySelectedExamination,
|
|
||||||
addSelectedExamination: () {
|
|
||||||
setState(() {
|
|
||||||
Navigator.of(context).pop();
|
|
||||||
});
|
|
||||||
},
|
|
||||||
removeExamination: (masterKey) => removeExamination(masterKey),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class AddExaminationDailog extends StatefulWidget {
|
|
||||||
final List<MySelectedExamination> mySelectedExamination;
|
|
||||||
final Function addSelectedExamination;
|
|
||||||
final Function(MasterKeyModel) removeExamination;
|
|
||||||
|
|
||||||
const AddExaminationDailog(
|
|
||||||
{Key key,
|
|
||||||
this.mySelectedExamination,
|
|
||||||
this.addSelectedExamination,
|
|
||||||
this.removeExamination})
|
|
||||||
: super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
_AddExaminationDailogState createState() => _AddExaminationDailogState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _AddExaminationDailogState extends State<AddExaminationDailog> {
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return FractionallySizedBox(
|
|
||||||
heightFactor: 0.7,
|
|
||||||
child: BaseView<SOAPViewModel>(
|
|
||||||
onModelReady: (model) async {
|
|
||||||
if (model.physicalExaminationList.length == 0) {
|
|
||||||
await model
|
|
||||||
.getMasterLookup(MasterKeysService.PhysicalExamination);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
builder: (_, model, w) => AppScaffold(
|
|
||||||
baseViewModel: model,
|
|
||||||
isShowAppBar: false,
|
|
||||||
body: Center(
|
|
||||||
child: Container(
|
|
||||||
child: FractionallySizedBox(
|
|
||||||
widthFactor: 0.9,
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
SizedBox(
|
|
||||||
height: 16,
|
|
||||||
),
|
|
||||||
AppText(
|
|
||||||
TranslationBase.of(context).physicalSystemExamination,
|
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
fontSize: 16,
|
|
||||||
),
|
|
||||||
SizedBox(
|
|
||||||
height: 16,
|
|
||||||
),
|
|
||||||
MasterKeyCheckboxSearchWidget(
|
|
||||||
model: model,
|
|
||||||
hintSearchText:
|
|
||||||
TranslationBase.of(context).searchExamination,
|
|
||||||
buttonName:
|
|
||||||
TranslationBase.of(context).addExamination,
|
|
||||||
masterList: model.physicalExaminationList,
|
|
||||||
removeHistory: (history) {
|
|
||||||
setState(() {
|
|
||||||
widget.removeExamination(history);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
addHistory: (history) {
|
|
||||||
setState(() {
|
|
||||||
MySelectedExamination mySelectedExamination =
|
|
||||||
new MySelectedExamination(
|
|
||||||
selectedExamination: history);
|
|
||||||
widget.mySelectedExamination
|
|
||||||
.add(mySelectedExamination);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
addSelectedHistories: () {
|
|
||||||
widget.addSelectedExamination();
|
|
||||||
},
|
|
||||||
isServiceSelected: (master) =>
|
|
||||||
isServiceSelected(master),
|
|
||||||
),
|
|
||||||
]),
|
|
||||||
))),
|
|
||||||
)),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
isServiceSelected(MasterKeyModel masterKey) {
|
|
||||||
Iterable<MySelectedExamination> exam = widget.mySelectedExamination.where(
|
|
||||||
(element) =>
|
|
||||||
masterKey.id == element.selectedExamination.id &&
|
|
||||||
masterKey.typeId == element.selectedExamination.typeId);
|
|
||||||
if (exam.length > 0) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue