|
|
|
|
@ -2,6 +2,8 @@ import 'dart:async';
|
|
|
|
|
|
|
|
|
|
import 'package:car_provider_app/views/dashboard/widget/general_appointment_widget.dart';
|
|
|
|
|
import 'package:car_provider_app/views/settings/schedule/widgets/chips_picker_item.dart';
|
|
|
|
|
import 'package:flutter/cupertino.dart';
|
|
|
|
|
import 'package:flutter/widgets.dart';
|
|
|
|
|
import 'package:mc_common_app/generated/locale_keys.g.dart';
|
|
|
|
|
import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
|
|
|
|
|
import 'package:mc_common_app/view_models/service_view_model.dart';
|
|
|
|
|
@ -58,199 +60,211 @@ class _AddNewServiceAppointmentPageState extends State<AddNewServiceAppointmentP
|
|
|
|
|
@override
|
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
|
return Scaffold(
|
|
|
|
|
backgroundColor: MyColors.white,
|
|
|
|
|
appBar: CustomAppBar(
|
|
|
|
|
title: LocaleKeys.addService.tr(),
|
|
|
|
|
),
|
|
|
|
|
body: Padding(
|
|
|
|
|
padding: const EdgeInsets.all(21.0),
|
|
|
|
|
child: Column(
|
|
|
|
|
child: Stack(
|
|
|
|
|
fit: StackFit.expand,
|
|
|
|
|
children: [
|
|
|
|
|
GeneralAppointmentWidget(
|
|
|
|
|
appointmentListModel: widget.appointmentListModel,
|
|
|
|
|
isNeedTotalPayment: true,
|
|
|
|
|
isNeedToShowItems: true,
|
|
|
|
|
isNeedToShowToMoreText: false,
|
|
|
|
|
onTap: () {},
|
|
|
|
|
),
|
|
|
|
|
12.height,
|
|
|
|
|
Expanded(
|
|
|
|
|
child: Consumer<ServiceVM>(
|
|
|
|
|
builder: (context, model, _) {
|
|
|
|
|
return Column(
|
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
|
|
|
children: [
|
|
|
|
|
Column(
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
|
SingleChildScrollView(
|
|
|
|
|
child: Column(
|
|
|
|
|
children: [
|
|
|
|
|
GeneralAppointmentWidget(
|
|
|
|
|
appointmentListModel: widget.appointmentListModel,
|
|
|
|
|
isNeedTotalPayment: true,
|
|
|
|
|
isNeedToShowItems: true,
|
|
|
|
|
isNeedToShowToMoreText: false,
|
|
|
|
|
onTap: () {},
|
|
|
|
|
),
|
|
|
|
|
12.height,
|
|
|
|
|
Consumer<ServiceVM>(
|
|
|
|
|
builder: (context, model, _) {
|
|
|
|
|
return Column(
|
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
|
|
|
children: [
|
|
|
|
|
LocaleKeys.selectServicestoAdd.tr().toText(
|
|
|
|
|
fontSize: 18,
|
|
|
|
|
isBold: true,
|
|
|
|
|
),
|
|
|
|
|
12.height,
|
|
|
|
|
Column(
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
|
children: [
|
|
|
|
|
model.categoryDropList.isNotEmpty
|
|
|
|
|
? DropdownField(
|
|
|
|
|
(DropValue value) async {
|
|
|
|
|
category = value;
|
|
|
|
|
service = null;
|
|
|
|
|
model.fetchProviderServices(widget.appointmentListModel.branchId.toString(), value.id.toString());
|
|
|
|
|
},
|
|
|
|
|
dropdownValue: category,
|
|
|
|
|
list: model.categoryDropList,
|
|
|
|
|
hint: LocaleKeys.selectServiceCategory.tr(),
|
|
|
|
|
)
|
|
|
|
|
: const Center(
|
|
|
|
|
child: CircularProgressIndicator(),
|
|
|
|
|
),
|
|
|
|
|
LocaleKeys.selectServicestoAdd.tr().toText(
|
|
|
|
|
fontSize: 18,
|
|
|
|
|
isBold: true,
|
|
|
|
|
),
|
|
|
|
|
12.height,
|
|
|
|
|
model.servicesDropList.isNotEmpty
|
|
|
|
|
? DropdownField(
|
|
|
|
|
(DropValue value) {
|
|
|
|
|
service = value;
|
|
|
|
|
pickedItems = null;
|
|
|
|
|
model.setState(ViewState.idle);
|
|
|
|
|
showMyBottomSheet(
|
|
|
|
|
context,
|
|
|
|
|
child: SelectItemsSheet(
|
|
|
|
|
serviceId: service?.id ?? 0,
|
|
|
|
|
onSelectItems: (List<ItemData> selectedList) {
|
|
|
|
|
this.selectedList.clear();
|
|
|
|
|
this.selectedList = selectedList;
|
|
|
|
|
pickedItems = [];
|
|
|
|
|
for (var element in selectedList) {
|
|
|
|
|
pickedItems!.add(
|
|
|
|
|
PickerItem(id: element.id ?? 0, title: element.name ?? ""),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
model.notifyListeners();
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
},
|
|
|
|
|
dropdownValue: service,
|
|
|
|
|
list: model.servicesDropList,
|
|
|
|
|
hint: LocaleKeys.defineServices.tr(),
|
|
|
|
|
)
|
|
|
|
|
: category == null
|
|
|
|
|
? Container()
|
|
|
|
|
: model.services != null && model.servicesDropList.isEmpty
|
|
|
|
|
? Text(LocaleKeys.noServiceFound.tr())
|
|
|
|
|
: const CircularProgressIndicator(),
|
|
|
|
|
12.height,
|
|
|
|
|
(service != null && pickedItems != null && pickedItems!.length > 0)
|
|
|
|
|
? ChipsPickerItem(
|
|
|
|
|
hint: LocaleKeys.selectItems.tr(),
|
|
|
|
|
itemsList: [...pickedItems ?? []],
|
|
|
|
|
onClick: () {
|
|
|
|
|
showMyBottomSheet(
|
|
|
|
|
context,
|
|
|
|
|
child: SelectItemsSheet(
|
|
|
|
|
serviceId: service?.id ?? 0,
|
|
|
|
|
list: pickedItems,
|
|
|
|
|
onSelectItems: (List<ItemData> selectedList) {
|
|
|
|
|
pickedItems = [];
|
|
|
|
|
for (var element in selectedList) {
|
|
|
|
|
pickedItems!.add(
|
|
|
|
|
PickerItem(id: element.id ?? 0, title: element.name ?? ""),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
model.notifyListeners();
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
},
|
|
|
|
|
)
|
|
|
|
|
: service != null
|
|
|
|
|
? Text(LocaleKeys.noItemSelectedYet.tr())
|
|
|
|
|
: const SizedBox(),
|
|
|
|
|
if ((service != null && pickedItems != null && pickedItems!.length > 0))
|
|
|
|
|
Column(
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
|
children: [
|
|
|
|
|
16.height,
|
|
|
|
|
LocaleKeys.totalAdditionalAmount.tr().toText(
|
|
|
|
|
fontSize: 14,
|
|
|
|
|
isBold: true,
|
|
|
|
|
color: MyColors.lightTextColor,
|
|
|
|
|
Column(
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
|
|
|
children: [
|
|
|
|
|
model.categoryDropList.isNotEmpty
|
|
|
|
|
? DropdownField(
|
|
|
|
|
(DropValue value) async {
|
|
|
|
|
category = value;
|
|
|
|
|
service = null;
|
|
|
|
|
model.fetchProviderServices(widget.appointmentListModel.branchId.toString(), value.id.toString());
|
|
|
|
|
},
|
|
|
|
|
dropdownValue: category,
|
|
|
|
|
list: model.categoryDropList,
|
|
|
|
|
hint: LocaleKeys.selectServiceCategory.tr(),
|
|
|
|
|
)
|
|
|
|
|
: const Center(
|
|
|
|
|
child: CircularProgressIndicator(),
|
|
|
|
|
),
|
|
|
|
|
Row(
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.end,
|
|
|
|
|
12.height,
|
|
|
|
|
model.servicesDropList.isNotEmpty
|
|
|
|
|
? DropdownField(
|
|
|
|
|
(DropValue value) {
|
|
|
|
|
service = value;
|
|
|
|
|
pickedItems = null;
|
|
|
|
|
model.setState(ViewState.idle);
|
|
|
|
|
showMyBottomSheet(
|
|
|
|
|
context,
|
|
|
|
|
child: SelectItemsSheet(
|
|
|
|
|
serviceId: service?.id ?? 0,
|
|
|
|
|
onSelectItems: (List<ItemData> selectedList) {
|
|
|
|
|
this.selectedList.clear();
|
|
|
|
|
this.selectedList = selectedList;
|
|
|
|
|
pickedItems = [];
|
|
|
|
|
for (var element in selectedList) {
|
|
|
|
|
pickedItems!.add(
|
|
|
|
|
PickerItem(id: element.id ?? 0, title: element.name ?? ""),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
model.notifyListeners();
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
},
|
|
|
|
|
dropdownValue: service,
|
|
|
|
|
list: model.servicesDropList,
|
|
|
|
|
hint: LocaleKeys.defineServices.tr(),
|
|
|
|
|
)
|
|
|
|
|
: category == null
|
|
|
|
|
? Container()
|
|
|
|
|
: model.services != null && model.servicesDropList.isEmpty
|
|
|
|
|
? Text(LocaleKeys.noServiceFound.tr())
|
|
|
|
|
: const CircularProgressIndicator(),
|
|
|
|
|
12.height,
|
|
|
|
|
(service != null && pickedItems != null && pickedItems!.isNotEmpty)
|
|
|
|
|
? ChipsPickerItem(
|
|
|
|
|
hint: LocaleKeys.selectItems.tr(),
|
|
|
|
|
itemsList: [...pickedItems ?? []],
|
|
|
|
|
onClick: () {
|
|
|
|
|
showMyBottomSheet(
|
|
|
|
|
context,
|
|
|
|
|
child: SelectItemsSheet(
|
|
|
|
|
serviceId: service?.id ?? 0,
|
|
|
|
|
list: pickedItems,
|
|
|
|
|
onSelectItems: (List<ItemData> selectedList) {
|
|
|
|
|
pickedItems = [];
|
|
|
|
|
for (var element in selectedList) {
|
|
|
|
|
pickedItems!.add(
|
|
|
|
|
PickerItem(id: element.id ?? 0, title: element.name ?? ""),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
model.notifyListeners();
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
},
|
|
|
|
|
)
|
|
|
|
|
: service != null
|
|
|
|
|
? Text(LocaleKeys.noItemSelectedYet.tr())
|
|
|
|
|
: const SizedBox(),
|
|
|
|
|
if ((service != null && pickedItems != null && pickedItems!.isNotEmpty))
|
|
|
|
|
Column(
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
|
children: [
|
|
|
|
|
calculatePrice().toString().toText(
|
|
|
|
|
fontSize: 29,
|
|
|
|
|
isBold: true,
|
|
|
|
|
),
|
|
|
|
|
2.width,
|
|
|
|
|
LocaleKeys.sar
|
|
|
|
|
.tr()
|
|
|
|
|
.toText(
|
|
|
|
|
fontSize: 16,
|
|
|
|
|
16.height,
|
|
|
|
|
LocaleKeys.totalAdditionalAmount.tr().toText(
|
|
|
|
|
fontSize: 14,
|
|
|
|
|
isBold: true,
|
|
|
|
|
color: MyColors.lightTextColor,
|
|
|
|
|
)
|
|
|
|
|
.paddingOnly(bottom: 5),
|
|
|
|
|
),
|
|
|
|
|
Row(
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.end,
|
|
|
|
|
children: [
|
|
|
|
|
calculatePrice().toString().toText(
|
|
|
|
|
fontSize: 29,
|
|
|
|
|
isBold: true,
|
|
|
|
|
),
|
|
|
|
|
2.width,
|
|
|
|
|
LocaleKeys.sar
|
|
|
|
|
.tr()
|
|
|
|
|
.toText(
|
|
|
|
|
fontSize: 16,
|
|
|
|
|
isBold: true,
|
|
|
|
|
color: MyColors.lightTextColor,
|
|
|
|
|
)
|
|
|
|
|
.paddingOnly(bottom: 5),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
).toWhiteContainer(width: double.infinity, allPading: 12),
|
|
|
|
|
],
|
|
|
|
|
).toWhiteContainer(width: double.infinity, allPading: 12),
|
|
|
|
|
Row(
|
|
|
|
|
children: [
|
|
|
|
|
Expanded(
|
|
|
|
|
child: ShowFillButton(
|
|
|
|
|
title: LocaleKeys.cancel.tr(),
|
|
|
|
|
maxWidth: double.infinity,
|
|
|
|
|
isFilled: false,
|
|
|
|
|
txtColor: MyColors.redColor,
|
|
|
|
|
borderColor: MyColors.redColor,
|
|
|
|
|
onPressed: () {
|
|
|
|
|
if (pickedItems != null && pickedItems!.isNotEmpty) {
|
|
|
|
|
pickedItems!.clear();
|
|
|
|
|
}
|
|
|
|
|
pop(context);
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
12.width,
|
|
|
|
|
Expanded(
|
|
|
|
|
child: ShowFillButton(
|
|
|
|
|
title: LocaleKeys.add.tr(),
|
|
|
|
|
maxWidth: double.infinity,
|
|
|
|
|
onPressed: () async {
|
|
|
|
|
if (pickedItems != null && pickedItems!.isNotEmpty) {
|
|
|
|
|
List<int> items = [];
|
|
|
|
|
pickedItems?.forEach((element) {
|
|
|
|
|
items.add(element.id);
|
|
|
|
|
});
|
|
|
|
|
Utils.showLoading(context);
|
|
|
|
|
var postParams = {"providerBranchID": widget.appointmentListModel.branchId, "appointmentID": widget.appointmentListModel.id, "serviceItemID": items};
|
|
|
|
|
GenericRespModel res = await serviceVM!.addNewServiceInAppointment(postParams);
|
|
|
|
|
_updateAppointment(context, widget.appointmentListModel.branchId ?? 0);
|
|
|
|
|
Utils.hideLoading(context);
|
|
|
|
|
if (res.messageStatus == 1) {
|
|
|
|
|
Utils.showToast(LocaleKeys.itemsAddedSuccessfully.tr());
|
|
|
|
|
pop(context);
|
|
|
|
|
} else {
|
|
|
|
|
Utils.showToast(res.message.toString());
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
Utils.showToast(LocaleKeys.pleaseSelectItems.tr());
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
Positioned(
|
|
|
|
|
bottom: 0,
|
|
|
|
|
left: 0,
|
|
|
|
|
right: 0,
|
|
|
|
|
child: Row(
|
|
|
|
|
children: [
|
|
|
|
|
Expanded(
|
|
|
|
|
child: ShowFillButton(
|
|
|
|
|
title: LocaleKeys.cancel.tr(),
|
|
|
|
|
maxWidth: double.infinity,
|
|
|
|
|
isFilled: false,
|
|
|
|
|
txtColor: MyColors.redColor,
|
|
|
|
|
borderColor: MyColors.redColor,
|
|
|
|
|
onPressed: () {
|
|
|
|
|
if (pickedItems != null && pickedItems!.isNotEmpty) {
|
|
|
|
|
pickedItems!.clear();
|
|
|
|
|
}
|
|
|
|
|
pop(context);
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
12.width,
|
|
|
|
|
Expanded(
|
|
|
|
|
child: ShowFillButton(
|
|
|
|
|
title: LocaleKeys.add.tr(),
|
|
|
|
|
maxWidth: double.infinity,
|
|
|
|
|
onPressed: () async {
|
|
|
|
|
if (pickedItems != null && pickedItems!.isNotEmpty) {
|
|
|
|
|
List<int> items = [];
|
|
|
|
|
pickedItems?.forEach((element) {
|
|
|
|
|
items.add(element.id);
|
|
|
|
|
});
|
|
|
|
|
Utils.showLoading(context);
|
|
|
|
|
var postParams = {"providerBranchID": widget.appointmentListModel.branchId, "appointmentID": widget.appointmentListModel.id, "serviceItemID": items};
|
|
|
|
|
GenericRespModel res = await serviceVM!.addNewServiceInAppointment(postParams);
|
|
|
|
|
_updateAppointment(context, widget.appointmentListModel.branchId ?? 0);
|
|
|
|
|
Utils.hideLoading(context);
|
|
|
|
|
if (res.messageStatus == 1) {
|
|
|
|
|
Utils.showToast(LocaleKeys.itemsAddedSuccessfully.tr());
|
|
|
|
|
pop(context);
|
|
|
|
|
pop(context);
|
|
|
|
|
} else {
|
|
|
|
|
Utils.showToast(res.message.toString());
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
Utils.showToast(LocaleKeys.pleaseSelectItems.tr());
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
).toWhiteContainer(width: double.infinity),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
|