You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
PatientApp-KKUMC/lib/pages/InPatientServices/meal_plan.dart

642 lines
36 KiB
Dart

import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/models/InPatientServices/get_admitted_patient_response_model.dart';
import 'package:diplomaticquarterapp/models/InPatientServices/get_meal_items_schedule_response_model.dart';
import 'package:diplomaticquarterapp/models/InPatientServices/get_meals_schedule_response_model.dart';
import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/uitl/utils_new.dart';
import 'package:diplomaticquarterapp/widgets/avatar/large_avatar.dart';
import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart';
import 'package:diplomaticquarterapp/widgets/my_rich_text.dart';
import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class MealPlanPage extends StatefulWidget {
const MealPlanPage({Key? key}) : super(key: key);
@override
State<MealPlanPage> createState() => _MealPlanPageState();
}
class _MealPlanPageState extends State<MealPlanPage> {
late ProjectViewModel projectViewModel;
GetAdmittedPatientsResponseModel getAdmittedPatientsResponseModel = GetAdmittedPatientsResponseModel();
List<GetMealsScheduleResponseModel> getMealsScheduleResponseModelList = [];
List<GetMealItemsScheduleResponseModel> getMealItemsScheduleResponseModelBreakfast = [];
List<GetMealItemsScheduleResponseModel> getMealItemsScheduleResponseModelLunch = [];
List<GetMealItemsScheduleResponseModel> getMealItemsScheduleResponseModelDinner = [];
List<GetMealItemsScheduleResponseModelList> _getMealItemsScheduleResponseModelBreakfast = [];
List<GetMealItemsScheduleResponseModelList> _getMealItemsScheduleResponseModelLunch = [];
List<GetMealItemsScheduleResponseModelList> _getMealItemsScheduleResponseModelDinner = [];
int currentDay = 0;
int currentWeek = 0;
int selectedMealScheduleID = 0;
final ValueNotifier<bool> isFasting = ValueNotifier(false);
bool isFastingVal = false;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
getAdmittedPatientDetails();
});
}
@override
Widget build(BuildContext context) {
projectViewModel = Provider.of(context);
return AppScaffold(
isShowAppBar: true,
isShowDecPage: false,
showNewAppBarTitle: true,
showNewAppBar: true,
appBarTitle: TranslationBase.of(context).mealPlanTitle,
body: SingleChildScrollView(
child: Padding(
padding: EdgeInsets.all(21.0),
child: getMealsScheduleResponseModelList.length != 0
? Column(
children: [
Container(
decoration: containerRadius((getMealsScheduleResponseModelList[0].isShow)! ? Colors.white : Colors.grey[300]!, 12),
child: AppExpandableNotifier(
title: "Breakfast TAT: " + DateUtil.convertTime(getMealsScheduleResponseModelList[0].tATTime!),
isTitleSingleLine: false,
widgetColor: Colors.transparent,
isExpand: getMealsScheduleResponseModelList[0].isShow!,
isDisabled: !getMealsScheduleResponseModelList[0].isShow!,
bodyWidget: Column(
children: [
getDivider(),
ListView.separated(
physics: BouncingScrollPhysics(),
shrinkWrap: true,
itemBuilder: (context, index) {
return Container(
padding: EdgeInsets.all(21.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(_getMealItemsScheduleResponseModelBreakfast[index].filterName!,
style: TextStyle(fontWeight: FontWeight.w600, fontSize: 18.0, letterSpacing: -0.64, color: CustomColors.darkGrey)),
SizedBox(
height: 12.0,
),
ListView.separated(
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (context, index2) {
return Container(
child: Row(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
ValueListenableBuilder<int>(
valueListenable: _getMealItemsScheduleResponseModelBreakfast[index].selectedItemID,
builder: (context, val, child) {
return Radio(
value: _getMealItemsScheduleResponseModelBreakfast[index].getMealItemsScheduleResponseModelList[index2].itemID,
groupValue: _getMealItemsScheduleResponseModelBreakfast[index].selectedItemID.value,
activeColor: Colors.red[800],
onChanged: (value) {
_getMealItemsScheduleResponseModelBreakfast[index].selectedItemID.value = value!;
},
);
}),
LargeAvatar(
name: _getMealItemsScheduleResponseModelBreakfast[index].getMealItemsScheduleResponseModelList[index2].description,
url: "https://www.pumpkinnspice.com/wp-content/uploads/2016/03/easy-breakfast-quesadillas-11-683x1024.jpg",
width: 60,
height: 60,
radius: 5,
disableProfileView: true,
),
SizedBox(width: 11),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
MyRichText(
"",
projectViewModel.isArabic
? _getMealItemsScheduleResponseModelBreakfast[index].getMealItemsScheduleResponseModelList[index2].descriptionN!
: _getMealItemsScheduleResponseModelBreakfast[index].getMealItemsScheduleResponseModelList[index2].description!,
projectViewModel.isArabic),
],
),
),
],
),
);
},
separatorBuilder: (context, index) {
return Padding(
padding: EdgeInsets.all(16.0),
child: Divider(
height: 1.5,
thickness: 1.0,
color: Colors.grey.shade200,
),
);
},
itemCount: _getMealItemsScheduleResponseModelBreakfast[index].getMealItemsScheduleResponseModelList.length),
],
),
);
},
separatorBuilder: (context, index) {
return Padding(
padding: EdgeInsets.only(left: 15, right: 15),
child: Divider(
height: 1.5,
thickness: 1.0,
color: Colors.grey.shade200,
),
);
},
itemCount: _getMealItemsScheduleResponseModelBreakfast.length),
],
),
),
),
mHeight(21),
Container(
decoration: containerRadius(getMealsScheduleResponseModelList[1].isShow! ? Colors.white : Colors.grey[300]!, 12),
child: AppExpandableNotifier(
title: "Lunch TAT: " + DateUtil.convertTime(getMealsScheduleResponseModelList[1].tATTime!),
isTitleSingleLine: false,
widgetColor: Colors.transparent,
isExpand: getMealsScheduleResponseModelList[1].isShow!,
isDisabled: !getMealsScheduleResponseModelList[1].isShow!,
bodyWidget: Column(
children: [
getDivider(),
ListView.separated(
physics: BouncingScrollPhysics(),
shrinkWrap: true,
itemBuilder: (context, index) {
return Container(
padding: EdgeInsets.all(21.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(_getMealItemsScheduleResponseModelLunch[index].filterName!,
style: TextStyle(fontWeight: FontWeight.w600, fontSize: 18.0, letterSpacing: -0.64, color: CustomColors.darkGrey)),
SizedBox(
height: 12.0,
),
ListView.separated(
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (context, index2) {
return Container(
child: Row(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
ValueListenableBuilder<int>(
valueListenable: _getMealItemsScheduleResponseModelLunch[index].selectedItemID,
builder: (context, val, child) {
return Radio(
value: _getMealItemsScheduleResponseModelLunch[index].getMealItemsScheduleResponseModelList[index2].itemID,
groupValue: _getMealItemsScheduleResponseModelLunch[index].selectedItemID.value,
activeColor: Colors.red[800],
onChanged: (value) {
_getMealItemsScheduleResponseModelLunch[index].selectedItemID.value = value!;
},
);
}),
LargeAvatar(
name: _getMealItemsScheduleResponseModelLunch[index].getMealItemsScheduleResponseModelList[index2].description,
url: "https://www.pumpkinnspice.com/wp-content/uploads/2016/03/easy-breakfast-quesadillas-11-683x1024.jpg",
width: 60,
height: 60,
radius: 5,
disableProfileView: true,
),
SizedBox(width: 11),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
MyRichText(
"",
projectViewModel.isArabic
? _getMealItemsScheduleResponseModelLunch[index].getMealItemsScheduleResponseModelList[index2].descriptionN!
: _getMealItemsScheduleResponseModelLunch[index].getMealItemsScheduleResponseModelList[index2].description!,
projectViewModel.isArabic),
],
),
),
],
),
);
},
separatorBuilder: (context, index) {
return Padding(
padding: EdgeInsets.all(16.0),
child: Divider(
height: 1.5,
thickness: 1.0,
color: Colors.grey.shade200,
),
);
},
itemCount: _getMealItemsScheduleResponseModelLunch[index].getMealItemsScheduleResponseModelList.length),
],
),
);
},
separatorBuilder: (context, index) {
return Padding(
padding: EdgeInsets.only(left: 15, right: 15),
child: Divider(
height: 1.5,
thickness: 1.0,
color: Colors.grey.shade200,
),
);
},
itemCount: _getMealItemsScheduleResponseModelLunch.length),
],
),
),
),
mHeight(21),
Container(
decoration: containerRadius(getMealsScheduleResponseModelList[2].isShow! ? Colors.white : Colors.grey[300]!, 12),
child: AppExpandableNotifier(
title: "Dinner TAT: " + DateUtil.convertTime(getMealsScheduleResponseModelList[2].tATTime!),
isTitleSingleLine: false,
widgetColor: Colors.transparent,
isExpand: getMealsScheduleResponseModelList[2].isShow!,
isDisabled: !getMealsScheduleResponseModelList[2].isShow!,
bodyWidget: Column(
children: [
getDivider(),
ListView.separated(
physics: BouncingScrollPhysics(),
shrinkWrap: true,
itemBuilder: (context, index) {
return Container(
padding: EdgeInsets.all(21.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(_getMealItemsScheduleResponseModelDinner[index].filterName!,
style: TextStyle(fontWeight: FontWeight.w600, fontSize: 18.0, letterSpacing: -0.64, color: CustomColors.darkGrey)),
SizedBox(
height: 12.0,
),
ListView.separated(
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (context, index2) {
return Container(
child: Row(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
ValueListenableBuilder<int>(
valueListenable: _getMealItemsScheduleResponseModelDinner[index].selectedItemID,
builder: (context, val, child) {
return Radio(
value: _getMealItemsScheduleResponseModelDinner[index].getMealItemsScheduleResponseModelList[index2].itemID,
groupValue: _getMealItemsScheduleResponseModelDinner[index].selectedItemID.value,
activeColor: Colors.red[800],
onChanged: (value) {
_getMealItemsScheduleResponseModelDinner[index].selectedItemID.value = value!;
},
);
}),
LargeAvatar(
name: _getMealItemsScheduleResponseModelDinner[index].getMealItemsScheduleResponseModelList[index2].description,
url: "https://www.pumpkinnspice.com/wp-content/uploads/2016/03/easy-breakfast-quesadillas-11-683x1024.jpg",
width: 60,
height: 60,
radius: 5,
disableProfileView: true,
),
SizedBox(width: 11),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
MyRichText(
"",
projectViewModel.isArabic
? _getMealItemsScheduleResponseModelDinner[index].getMealItemsScheduleResponseModelList[index2].descriptionN!
: _getMealItemsScheduleResponseModelDinner[index].getMealItemsScheduleResponseModelList[index2].description!,
projectViewModel.isArabic),
],
),
),
],
),
);
},
separatorBuilder: (context, index) {
return Padding(
padding: EdgeInsets.all(16.0),
child: Divider(
height: 1.5,
thickness: 1.0,
color: Colors.grey.shade200,
),
);
},
itemCount: _getMealItemsScheduleResponseModelDinner[index].getMealItemsScheduleResponseModelList.length),
],
),
);
},
separatorBuilder: (context, index) {
return Padding(
padding: EdgeInsets.only(left: 15, right: 15),
child: Divider(
height: 1.5,
thickness: 1.0,
color: Colors.grey.shade200,
),
);
},
itemCount: _getMealItemsScheduleResponseModelDinner.length),
],
),
),
),
],
)
: Container(),
),
),
bottomSheet: Container(
color: Colors.white,
width: double.infinity,
padding: EdgeInsets.all(20),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
ValueListenableBuilder<bool>(
valueListenable: isFasting,
builder: (context, val, child) {
return Checkbox(
onChanged: (bool? value) {
isFasting.value = value!;
isFastingVal = value;
},
value: isFastingVal,
activeColor: Color(0xFFc5272d),
);
}),
Text(
TranslationBase.of(context).isFasting,
style: TextStyle(
fontSize: 14,
letterSpacing: -0.48,
),
),
],
),
mHeight(12),
DefaultButton(
TranslationBase.of(context).placeOrder,
() {
placeOrder();
},
color: Color(0xff359846),
disabledColor: Colors.grey,
),
],
),
),
);
}
void placeOrder() {
List<String> selectedItemIDs = [];
if (_getMealItemsScheduleResponseModelBreakfast.isNotEmpty) {
_getMealItemsScheduleResponseModelBreakfast.forEach((element) {
selectedItemIDs.add(element.selectedItemID.value.toString());
});
}
if (_getMealItemsScheduleResponseModelLunch.isNotEmpty) {
_getMealItemsScheduleResponseModelLunch.forEach((element) {
selectedItemIDs.add(element.selectedItemID.value.toString());
});
}
if (_getMealItemsScheduleResponseModelDinner.isNotEmpty) {
_getMealItemsScheduleResponseModelDinner.forEach((element) {
selectedItemIDs.add(element.selectedItemID.value.toString());
});
}
ClinicListService service = new ClinicListService();
GifLoaderDialogUtils.showMyDialog(context);
service
.placeMealPlanOrder(getAdmittedPatientsResponseModel.projectID!, selectedMealScheduleID, selectedItemIDs.join(","), projectViewModel.user.patientID!,
getAdmittedPatientsResponseModel.admissionNo!, getAdmittedPatientsResponseModel.isHasCompanion!, isFastingVal, context)
.then((res) {
GifLoaderDialogUtils.hideDialog(context);
AppToast.showSuccessToast(message: "Your meal order has been received successfully");
Navigator.pop(context);
}).catchError((err) {
GifLoaderDialogUtils.hideDialog(context);
print(err);
});
}
Widget getDivider() {
return Padding(
padding: EdgeInsets.only(left: 15, right: 15),
child: Divider(
height: 1.5,
thickness: 2.0,
color: Colors.black,
),
);
}
void getAdmittedPatientDetails() {
ClinicListService service = new ClinicListService();
GifLoaderDialogUtils.showMyDialog(context);
service.getAdmittedPatientDetails(projectViewModel.user.patientID!, projectViewModel.inPatientProjectID, projectViewModel.getAdmissionInfoResponseModel.admissionNo!, 0, 0, 0, context).then((res) {
GifLoaderDialogUtils.hideDialog(context);
if (res["List_MOP_AdmittedPatients"] != null && res["List_MOP_AdmittedPatients"].length != 0) {
print(res["List_MOP_AdmittedPatients"]);
getAdmittedPatientsResponseModel = new GetAdmittedPatientsResponseModel.fromJson(res["List_MOP_AdmittedPatients"][0]);
print(getAdmittedPatientsResponseModel.dietType);
getCurrentWeekIDAndDay(getAdmittedPatientsResponseModel.dietType!);
} else {
AppToast.showErrorToast(message: "No data found for admitted patient");
getCurrentWeekIDAndDay(1);
}
}).catchError((err) {
GifLoaderDialogUtils.hideDialog(context);
print(err);
});
}
void getCurrentWeekIDAndDay(int dietType) {
ClinicListService service = new ClinicListService();
GifLoaderDialogUtils.showMyDialog(context);
service.getCurrentWeekIDAndDay(context).then((res) {
GifLoaderDialogUtils.hideDialog(context);
currentDay = res["CurrentDay"];
currentWeek = res["CurrentWeek"];
getMealsOfScheduleID(dietType);
}).catchError((err) {
GifLoaderDialogUtils.hideDialog(context);
print(err);
});
}
void getMealsOfScheduleID(int dietType) {
ClinicListService service = new ClinicListService();
GifLoaderDialogUtils.showMyDialog(context);
service.getMealsOfScheduleID(projectViewModel.inPatientProjectID, projectViewModel.getAdmissionInfoResponseModel.admissionNo!, dietType, currentWeek, currentDay, context).then((res) {
GifLoaderDialogUtils.hideDialog(context);
if (res["List_MOP_MealsOfScheduleID_Mobile"] != null && res["List_MOP_MealsOfScheduleID_Mobile"].length != 0) {
res['List_MOP_MealsOfScheduleID_Mobile'].forEach((scheduleItem) {
getMealsScheduleResponseModelList.add(GetMealsScheduleResponseModel.fromJson(scheduleItem));
});
if (getMealsScheduleResponseModelList[0].isShow!) {
selectedMealScheduleID = getMealsScheduleResponseModelList[0].scheduleID!;
getDefaultItemsOfScheduleID(getMealsScheduleResponseModelList[0].scheduleID!, 1);
}
if (getMealsScheduleResponseModelList[1].isShow!) {
selectedMealScheduleID = getMealsScheduleResponseModelList[1].scheduleID!;
getDefaultItemsOfScheduleID(getMealsScheduleResponseModelList[1].scheduleID!, 2);
}
if (getMealsScheduleResponseModelList[2].isShow!) {
selectedMealScheduleID = getMealsScheduleResponseModelList[2].scheduleID!;
getDefaultItemsOfScheduleID(getMealsScheduleResponseModelList[2].scheduleID!, 3);
}
} else {
AppToast.showErrorToast(message: "No meal schedule found for admitted patient");
}
}).catchError((err) {
GifLoaderDialogUtils.hideDialog(context);
print(err);
});
}
void getDefaultItemsOfScheduleID(int scheduleID, int mealType) {
ClinicListService service = new ClinicListService();
GifLoaderDialogUtils.showMyDialog(context);
service.getDefaultItemsOfScheduleID(projectViewModel.inPatientProjectID, scheduleID, context).then((res) {
GifLoaderDialogUtils.hideDialog(context);
if (res["List_MOP_DefaultItemsOfMealModel"] != null && res["List_MOP_DefaultItemsOfMealModel"].length != 0) {
if (mealType == 1) {
res['List_MOP_DefaultItemsOfMealModel'].forEach((scheduleItem) {
getMealItemsScheduleResponseModelBreakfast.add(GetMealItemsScheduleResponseModel.fromJson(scheduleItem));
});
sortMealsByCategoryBreakfast();
}
if (mealType == 2) {
res['List_MOP_DefaultItemsOfMealModel'].forEach((scheduleItem) {
getMealItemsScheduleResponseModelLunch.add(GetMealItemsScheduleResponseModel.fromJson(scheduleItem));
});
sortMealsByCategoryLunch();
}
if (mealType == 3) {
res['List_MOP_DefaultItemsOfMealModel'].forEach((scheduleItem) {
getMealItemsScheduleResponseModelDinner.add(GetMealItemsScheduleResponseModel.fromJson(scheduleItem));
});
sortMealsByCategoryDinner();
}
} else {
AppToast.showErrorToast(message: "No meal items found for admitted patient");
}
setState(() {});
}).catchError((err) {
GifLoaderDialogUtils.hideDialog(context);
print(err);
});
}
void sortMealsByCategoryBreakfast() {
getMealItemsScheduleResponseModelBreakfast.forEach((element) {
List<GetMealItemsScheduleResponseModelList> breakfastMealItems = _getMealItemsScheduleResponseModelBreakfast
.where((elementClinic) => elementClinic.filterName == (projectViewModel.isArabic ? element.categoryDescriptionN : element.categoryDescription))
.toList();
if (breakfastMealItems.length != 0) {
_getMealItemsScheduleResponseModelBreakfast[_getMealItemsScheduleResponseModelBreakfast.indexOf(breakfastMealItems[0])].getMealItemsScheduleResponseModelList.add(element);
} else {
_getMealItemsScheduleResponseModelBreakfast
.add(GetMealItemsScheduleResponseModelList(filterName: projectViewModel.isArabic ? element.categoryDescriptionN : element.categoryDescription, getMealItemsScheduleResponseModel: element));
}
});
_getMealItemsScheduleResponseModelBreakfast.forEach((element) {
element.getMealItemsScheduleResponseModelList.forEach((elementInner) {
if (elementInner.isDefault!) {
element.selectedItemID.value = elementInner.itemID!;
}
});
});
}
void sortMealsByCategoryLunch() {
getMealItemsScheduleResponseModelLunch.forEach((element) {
List<GetMealItemsScheduleResponseModelList> breakfastMealItems = _getMealItemsScheduleResponseModelLunch
.where((elementClinic) => elementClinic.filterName == (projectViewModel.isArabic ? element.categoryDescriptionN : element.categoryDescription))
.toList();
if (breakfastMealItems.length != 0) {
_getMealItemsScheduleResponseModelLunch[_getMealItemsScheduleResponseModelLunch.indexOf(breakfastMealItems[0])].getMealItemsScheduleResponseModelList.add(element);
} else {
_getMealItemsScheduleResponseModelLunch
.add(GetMealItemsScheduleResponseModelList(filterName: projectViewModel.isArabic ? element.categoryDescriptionN : element.categoryDescription, getMealItemsScheduleResponseModel: element));
}
});
_getMealItemsScheduleResponseModelLunch.forEach((element) {
element.getMealItemsScheduleResponseModelList.forEach((elementInner) {
if (elementInner.isDefault!) {
element.selectedItemID.value = elementInner.itemID!;
}
});
});
}
void sortMealsByCategoryDinner() {
getMealItemsScheduleResponseModelDinner.forEach((element) {
List<GetMealItemsScheduleResponseModelList> breakfastMealItems = _getMealItemsScheduleResponseModelDinner
.where((elementClinic) => elementClinic.filterName == (projectViewModel.isArabic ? element.categoryDescriptionN : element.categoryDescription))
.toList();
if (breakfastMealItems.length != 0) {
_getMealItemsScheduleResponseModelDinner[_getMealItemsScheduleResponseModelDinner.indexOf(breakfastMealItems[0])].getMealItemsScheduleResponseModelList.add(element);
} else {
_getMealItemsScheduleResponseModelDinner
.add(GetMealItemsScheduleResponseModelList(filterName: projectViewModel.isArabic ? element.categoryDescriptionN : element.categoryDescription, getMealItemsScheduleResponseModel: element));
}
});
_getMealItemsScheduleResponseModelDinner.forEach((element) {
element.getMealItemsScheduleResponseModelList.forEach((elementInner) {
if (elementInner.isDefault!) {
element.selectedItemID.value = elementInner.itemID!;
}
});
});
}
}