fixed Things before QA

aamir_dev
Faiz Hashmi 1 year ago
parent aad7b199da
commit e7c6c044e0

@ -308,12 +308,15 @@ class BranchDetailPage extends StatelessWidget {
], ],
) )
.toContainer( .toContainer(
borderRadius: 0, borderRadius: 0,
backgroundColor: MyColors.darkWhiteColor, backgroundColor: MyColors.darkWhiteColor,
width: double.infinity, width: double.infinity,
paddingAll: 25, paddingAll: 25,
margin: const EdgeInsets.only(left: 20, right: 20, top: 20), margin: const EdgeInsets.only(
) left: 20,
right: 20,
top: 20,
))
.onPress(() { .onPress(() {
if (branchData.branchStatus == BranchStatusEnum.pending || branchData.branchStatus == BranchStatusEnum.rejected) { if (branchData.branchStatus == BranchStatusEnum.pending || branchData.branchStatus == BranchStatusEnum.rejected) {
Utils.showToast("Please wait for the branch verification."); Utils.showToast("Please wait for the branch verification.");

@ -13,6 +13,7 @@ import 'package:mc_common_app/models/appointments_models/schedule_model.dart';
import 'package:mc_common_app/models/general_models/generic_resp_model.dart'; import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/date_helper.dart'; import 'package:mc_common_app/utils/date_helper.dart';
import 'package:mc_common_app/utils/dialogs_and_bottomsheets.dart';
import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/utils/utils.dart'; import 'package:mc_common_app/utils/utils.dart';
import 'package:mc_common_app/widgets/button/show_fill_button.dart'; import 'package:mc_common_app/widgets/button/show_fill_button.dart';
@ -246,7 +247,7 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
ShowFillButton( ShowFillButton(
title: LocaleKeys.create.tr(), title: LocaleKeys.create.tr(),
maxWidth: double.infinity, maxWidth: double.infinity,
margin: const EdgeInsets.symmetric(horizontal: 20), margin: const EdgeInsets.all(20),
onPressed: () { onPressed: () {
if (validation(model)) { if (validation(model)) {
if (scheduleData.id != null) { if (scheduleData.id != null) {
@ -341,8 +342,8 @@ class _AddSchedulesPageState extends State<AddSchedulesPage> {
pop(context); pop(context);
} else { } else {
Utils.showToast(servicesResponse.message ?? ""); Utils.showToast(servicesResponse.message ?? "");
context.read<ScheduleVM>().getSchedules(scheduleData.branchId ?? ""); // context.read<ScheduleVM>().getSchedules(scheduleData.branchId ?? "");
pop(context); // pop(context);
} }
} else { } else {
Utils.hideLoading(context); Utils.hideLoading(context);

@ -9,10 +9,12 @@ import 'package:mc_common_app/models/appointments_models/schedule_model.dart';
import 'package:mc_common_app/models/general_models/generic_resp_model.dart'; import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/date_helper.dart'; import 'package:mc_common_app/utils/date_helper.dart';
import 'package:mc_common_app/utils/dialogs_and_bottomsheets.dart';
import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/utils/utils.dart'; import 'package:mc_common_app/utils/utils.dart';
import 'package:mc_common_app/widgets/button/show_fill_button.dart'; import 'package:mc_common_app/widgets/button/show_fill_button.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:mc_common_app/widgets/empty_widget.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
@ -34,25 +36,64 @@ class _SchedulesListPageState extends State<SchedulesListPage> {
context.read<ScheduleVM>().getSchedules(widget.branchId ?? ""); context.read<ScheduleVM>().getSchedules(widget.branchId ?? "");
} }
void deleteScheduleConfirmationSheet(int index, ScheduleVM serviceVM, BuildContext context) {
return actionConfirmationBottomSheet(
context: context,
title: LocaleKeys.deleteScheduleConfirmation.tr().toText(fontSize: 28, isBold: true, letterSpacing: -1.44),
subtitle: LocaleKeys.deleteScheduleAdConfirmationMessage.tr(),
actionButtonYes: Expanded(
child: ShowFillButton(
maxHeight: 55,
title: LocaleKeys.yes.tr(),
fontSize: 15,
onPressed: () async {
Navigator.pop(context);
Utils.showLoading(context);
GenericRespModel res = await serviceVM.setScheduleInactive(serviceVM.schedule!.data![index].id!, serviceVM.schedule!.data![index].serviceProviderBranchId!);
Utils.hideLoading(context);
if (res.messageStatus == 1) {
Utils.showToast(LocaleKeys.branch_deleted.tr());
} else {
Utils.showToast(res.message ?? "");
}
},
),
),
actionButtonNo: Expanded(
child: ShowFillButton(
maxHeight: 55,
isFilled: false,
borderColor: MyColors.darkPrimaryColor,
title: LocaleKeys.no.tr(),
txtColor: MyColors.darkPrimaryColor,
fontSize: 15,
onPressed: () {
Navigator.pop(context);
},
),
),
);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: const CustomAppBar( appBar: CustomAppBar(title: LocaleKeys.branchSchedules.tr()),
title: "Schedules",
),
body: SizedBox( body: SizedBox(
width: double.infinity, width: double.infinity,
child: Column( child: Column(
children: [ children: [
Expanded( Expanded(
child: Consumer<ScheduleVM>( child: Consumer<ScheduleVM>(
builder: (BuildContext context, value, Widget? child) { builder: (BuildContext context, scheduleVM, Widget? child) {
return value.schedule == null return scheduleVM.schedule == null
? const Center( ? const Center(
child: CircularProgressIndicator(), child: CircularProgressIndicator(),
) )
: value.schedule!.data!.isEmpty : scheduleVM.schedule!.data!.isEmpty
? "No Schedule Found".toText() ? EmptyWidget(
text: LocaleKeys.noSchedulesFound.tr(),
)
: ListView.separated( : ListView.separated(
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return Column( return Column(
@ -61,21 +102,10 @@ class _SchedulesListPageState extends State<SchedulesListPage> {
Row( Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Expanded( Expanded(child: scheduleVM.schedule!.data![index].scheduleName.toString().toText(fontSize: 16)),
child: value.schedule!.data![index].scheduleName.toString().toText(
fontSize: 16,
),
),
IconButton( IconButton(
onPressed: () async { onPressed: () async {
Utils.showLoading(context); return deleteScheduleConfirmationSheet(index, scheduleVM, context);
GenericRespModel res = await value.setScheduleInactive(value.schedule!.data![index].id!, value.schedule!.data![index].serviceProviderBranchId!);
Utils.hideLoading(context);
if (res.messageStatus == 1) {
Utils.showToast(LocaleKeys.branch_deleted.tr());
} else {
Utils.showToast(res.message ?? "");
}
}, },
icon: const Icon(Icons.delete), icon: const Icon(Icons.delete),
color: Colors.red, color: Colors.red,
@ -88,24 +118,24 @@ class _SchedulesListPageState extends State<SchedulesListPage> {
height: 16, height: 16,
), ),
).onPress(() { ).onPress(() {
value.schedule!.data![index].branchId = widget.branchId ?? ""; scheduleVM.schedule!.data![index].branchId = widget.branchId ?? "";
navigateWithName(context, ProviderAppRoutes.addSchedule, arguments: value.schedule!.data![index]); navigateWithName(context, ProviderAppRoutes.addSchedule, arguments: scheduleVM.schedule!.data![index]);
}), }),
], ],
), ),
8.height, 8.height,
showItem("${LocaleKeys.startDate.tr()}:", DateHelper.formatAsDayMonthYear(value.schedule!.data![index].fromDate)), showItem("${LocaleKeys.startDate.tr()}:", DateHelper.formatAsDayMonthYear(scheduleVM.schedule!.data![index].fromDate)),
showItem("${LocaleKeys.endDate.tr()}:", DateHelper.formatAsDayMonthYear(value.schedule!.data![index].toDate)), showItem("${LocaleKeys.endDate.tr()}:", DateHelper.formatAsDayMonthYear(scheduleVM.schedule!.data![index].toDate)),
showItem("${LocaleKeys.shiftStartTime.tr()}:", value.schedule!.data![index].startTime ?? ""), showItem("${LocaleKeys.shiftStartTime.tr()}:", scheduleVM.schedule!.data![index].startTime ?? ""),
showItem("${LocaleKeys.shiftEndTime.tr()}:", value.schedule!.data![index].endTime ?? ""), showItem("${LocaleKeys.shiftEndTime.tr()}:", scheduleVM.schedule!.data![index].endTime ?? ""),
showItem("${LocaleKeys.slotsTime.tr()}:", "${value.schedule!.data![index].slotDurationMinute} Mins"), showItem("${LocaleKeys.slotsTime.tr()}:", "${scheduleVM.schedule!.data![index].slotDurationMinute} Mins"),
showItem("${LocaleKeys.appointmentPerSlot.tr()}:", value.schedule!.data![index].perSlotAppointment.toString()), showItem("${LocaleKeys.appointmentPerSlot.tr()}:", scheduleVM.schedule!.data![index].perSlotAppointment.toString()),
showItem("${LocaleKeys.offDays.tr()}:", offDays(value.schedule!.data![index])), showItem("${LocaleKeys.offDays.tr()}:", offDays(scheduleVM.schedule!.data![index])),
12.height, 12.height,
"${LocaleKeys.services.tr()}:".toText(fontSize: 12, color: MyColors.lightTextColor), "${LocaleKeys.services.tr()}:".toText(fontSize: 12, color: MyColors.lightTextColor),
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: value.schedule!.data![index].scheduleServices! children: scheduleVM.schedule!.data![index].scheduleServices!
.map( .map(
(element) => Container( (element) => Container(
child: element.serviceDescription.toString().toText(fontSize: 12), child: element.serviceDescription.toString().toText(fontSize: 12),
@ -120,7 +150,7 @@ class _SchedulesListPageState extends State<SchedulesListPage> {
return 12.height; return 12.height;
}, },
padding: const EdgeInsets.all(20), padding: const EdgeInsets.all(20),
itemCount: value.schedule!.data!.length, itemCount: scheduleVM.schedule!.data!.length,
); );
}, },
), ),

@ -25,7 +25,7 @@ class ChipsPickerItem extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Row( return Row(
children: [ children: [
if (itemsList.isEmpty) Expanded(child: hint.toText(fontSize: 14, color: borderColor)), if (itemsList.isEmpty) Expanded(child: hint.toText(fontSize: 15, fontWeight: MyFonts.Medium, color: borderColor)),
if (itemsList.isNotEmpty) if (itemsList.isNotEmpty)
Expanded( Expanded(
child: ListView( child: ListView(

@ -60,20 +60,15 @@ class _SelectDaysSheetState extends State<SelectDaysSheet> {
Expanded( Expanded(
child: ListView.separated( child: ListView.separated(
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return Row( return CheckboxListTile(
children: [ contentPadding: EdgeInsets.zero,
Checkbox( controlAffinity: ListTileControlAffinity.leading,
value: list[index].isSelected, title: list[index].title.toText(fontSize: 16),
onChanged: (bool? v) { value: list[index].isSelected,
list[index].isSelected = v; onChanged: (bool? v) {
setState(() {}); list[index].isSelected = v;
}, setState(() {});
), },
12.width,
Expanded(
child: list[index].title.toText(fontSize: 16),
),
],
); );
}, },
separatorBuilder: (BuildContext context, int index) { separatorBuilder: (BuildContext context, int index) {

@ -61,20 +61,15 @@ class SelectServicesSheet extends StatelessWidget {
? const Center(child: CircularProgressIndicator()) ? const Center(child: CircularProgressIndicator())
: ListView.separated( : ListView.separated(
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return Row( return CheckboxListTile(
children: [ contentPadding: EdgeInsets.zero,
Checkbox( controlAffinity: ListTileControlAffinity.leading,
value: model.servicesList![index].isSelected, title: model.servicesList![index].description!.toText(fontSize: 16),
onChanged: (bool? v) { value: model.servicesList![index].isSelected,
model.servicesList![index].isSelected = v; onChanged: (bool? v) {
model.notifyListeners(); model.servicesList![index].isSelected = v;
}, model.notifyListeners();
), },
12.width,
Expanded(
child: model.servicesList![index].description!.toText(fontSize: 16),
),
],
); );
}, },
separatorBuilder: (BuildContext context, int index) { separatorBuilder: (BuildContext context, int index) {
@ -99,7 +94,7 @@ class SelectServicesSheet extends StatelessWidget {
onSelectServices(); onSelectServices();
Navigator.pop(context); Navigator.pop(context);
}, },
).paddingOnly(bottom: 20) )
], ],
), ),
); );

@ -123,6 +123,7 @@ class _CreateItemPageState extends State<CreateItemPage> {
isPdf: false, isPdf: false,
isReview: false, isReview: false,
isFromNetwork: false, isFromNetwork: false,
allowAdButton: false,
onAddFilePressed: () async { onAddFilePressed: () async {
file = await itemsVM!.pickSingleFile(context); file = await itemsVM!.pickSingleFile(context);
setState(() {}); setState(() {});
@ -131,12 +132,13 @@ class _CreateItemPageState extends State<CreateItemPage> {
] else ...[ ] else ...[
10.height, 10.height,
DottedRectContainer( DottedRectContainer(
onTap: () async { onTap: () async {
file = await itemsVM!.pickSingleFile(context); file = await itemsVM!.pickSingleFile(context);
setState(() {}); setState(() {});
}, },
text: LocaleKeys.attachImage.tr(), text: LocaleKeys.attachImage.tr(),
icon: MyAssets.attachmentIcon.buildSvg()) icon: MyAssets.attachmentIcon.buildSvg(),
)
], ],
20.height, 20.height,
CheckBoxWithTitleDescription( CheckBoxWithTitleDescription(
@ -204,9 +206,9 @@ class _CreateItemPageState extends State<CreateItemPage> {
Utils.hideLoading(context); Utils.hideLoading(context);
if (mResponse.messageStatus == 1) { if (mResponse.messageStatus == 1) {
itemsVM!.getServiceItems(itemData!.serviceProviderServiceId ?? 0); itemsVM!.getServiceItems(itemData!.serviceProviderServiceId ?? 0);
pop(context);
} }
Utils.showToast(mResponse.message ?? ""); Utils.showToast(mResponse.message ?? "");
pop(context);
} else { } else {
Map map = { Map map = {
"id": itemData!.id, "id": itemData!.id,
@ -227,6 +229,7 @@ class _CreateItemPageState extends State<CreateItemPage> {
Utils.hideLoading(context); Utils.hideLoading(context);
if (mResponse.messageStatus == 1) { if (mResponse.messageStatus == 1) {
itemsVM!.getServiceItems(itemData!.serviceProviderServiceId ?? 0); itemsVM!.getServiceItems(itemData!.serviceProviderServiceId ?? 0);
pop(context);
} }
Utils.showToast(mResponse.message ?? ""); Utils.showToast(mResponse.message ?? "");
pop(context); pop(context);
@ -242,6 +245,10 @@ class _CreateItemPageState extends State<CreateItemPage> {
bool validation() { bool validation() {
bool valid = true; bool valid = true;
if (file == null) {
Utils.showToast("Please add al least one item image.");
valid = false;
}
if (name == null || name!.length < 3) { if (name == null || name!.length < 3) {
Utils.showToast("Please add valid item name"); Utils.showToast("Please add valid item name");
valid = false; valid = false;

@ -1,4 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'dart:developer';
import 'package:mc_common_app/generated/locale_keys.g.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/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/utils/navigator.dart';
@ -15,10 +16,15 @@ import 'package:mc_common_app/widgets/checkbox_with_title_desc.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart'; import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:mc_common_app/widgets/txt_field.dart'; import 'package:mc_common_app/widgets/txt_field.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
// [log] 1035 -> branch ID
// [log] HMG Branch QA II -> branchName
// [log] 8 -> category ID
// [log] Sell Car -> categegory name
// [log] New Car -> service name
class CreateServicesPage3 extends StatefulWidget { class CreateServicesPage3 extends StatefulWidget {
final CreateBranchModel? branchModel; final CreateBranchModel? branchModel;
@ -41,19 +47,23 @@ class _CreateServicesPage3State extends State<CreateServicesPage3> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
scheduleMicrotask(() { scheduleMicrotask(() async {
ServiceVM serviceVM = context.read<ServiceVM>(); ServiceVM serviceVM = context.read<ServiceVM>();
if (widget.branchModel!.categoryId == null) { if (widget.branchModel!.categoryId != null) {
serviceVM.fetchBranchCategory(EasyLocalization.of(context)?.currentLocale?.countryCode ?? "SA"); await serviceVM.fetchServicesByCategoryId(int.parse(widget.branchModel!.categoryId ?? "0"));
} else {
category = DropValue(int.parse(widget.branchModel!.categoryId ?? "0"), widget.branchModel!.categoryName ?? "", "");
service = serviceVM.servicesDropList.firstWhere((element) => element.id == widget.branchModel!.serviceProviderService!.serviceId);
isAppointmentAvailable = widget.branchModel?.serviceProviderService?.isAllowAppointment ?? false; isAppointmentAvailable = widget.branchModel?.serviceProviderService?.isAllowAppointment ?? false;
// isHomeAppointmentAvailable=branchModel.serviceProviderService.
serviceRage = widget.branchModel?.serviceProviderService?.customerLocationRange ?? 0; serviceRage = widget.branchModel?.serviceProviderService?.customerLocationRange ?? 0;
if (serviceRage > 0) { if (serviceRage > 0) {
isHomeAppointmentAvailable = true; isHomeAppointmentAvailable = true;
} }
chargersPerKm = widget.branchModel?.serviceProviderService?.rangePricePerKm ?? ""; chargersPerKm = widget.branchModel?.serviceProviderService?.rangePricePerKm ?? "";
serviceId = widget.branchModel?.serviceProviderService?.serviceId ?? -1; serviceId = widget.branchModel?.serviceProviderService?.serviceProviderServiceId ?? -1;
setState(() {});
} }
}); });
} }
@ -61,7 +71,7 @@ class _CreateServicesPage3State extends State<CreateServicesPage3> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: CustomAppBar(title: LocaleKeys.addServices.tr()), appBar: CustomAppBar(title: LocaleKeys.editServices.tr()),
body: SizedBox( body: SizedBox(
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
@ -75,87 +85,46 @@ class _CreateServicesPage3State extends State<CreateServicesPage3> {
padding: const EdgeInsets.all(20.0), padding: const EdgeInsets.all(20.0),
child: Column( child: Column(
children: [ children: [
// Text(
// widget.branchModel!.branchName ?? "N/A",
// style: const TextStyle(
// fontSize: 12,
// fontWeight: FontWeight.bold,
// ),
// ).toContainer(
// padding: const EdgeInsets.only(left: 8, right: 8, bottom: 12, top: 12),
// backgroundColor: MyColors.textFieldColor,
// borderRadius: 0,
// width: double.infinity,
// ),
// 12.height,
(widget.branchModel!.categoryId != null) (widget.branchModel!.categoryId != null)
? Text( ? DropdownField(
widget.branchModel!.categoryName ?? "N/A", isSelectAble: false,
style: const TextStyle( (DropValue value) async {
fontSize: 12, // categoryId = value.id;
fontWeight: FontWeight.bold, // category = value;
), // service = null;
).toContainer( // serviceId = -1;
padding: const EdgeInsets.only(left: 8, right: 8, bottom: 12, top: 12), // isAppointmentAvailable = false;
backgroundColor: MyColors.textFieldColor, // isHomeAppointmentAvailable = false;
borderRadius: 0, // model.fetchServicesByCategoryId(value.id);
width: double.infinity, },
dropdownValue: category,
list: model.categoryDropList,
hint: category != null ? category!.value : LocaleKeys.selectServiceCategory.tr(),
) )
: (widget.branchModel!.categoryId == null && model.categoryDropList.isNotEmpty) : const CircularProgressIndicator(),
? DropdownField(
(DropValue value) async {
categoryId = value.id;
category = value;
service = null;
serviceId = -1;
isAppointmentAvailable = false;
isHomeAppointmentAvailable = false;
model.fetchServicesByCategoryId(value.id);
},
dropdownValue: category,
list: model.categoryDropList,
hint: LocaleKeys.selectServiceCategory.tr(),
)
: const CircularProgressIndicator(),
12.height, 12.height,
widget.branchModel!.serviceProviderService != null model.servicesDropList.isNotEmpty
? Text( ? DropdownField(
widget.branchModel!.serviceProviderService!.serviceDescription ?? "N/A", (DropValue value) {
style: const TextStyle( service = value;
fontSize: 12, isAppointmentAvailable = false;
fontWeight: FontWeight.bold, isHomeAppointmentAvailable = false;
), model.setState(ViewState.idle);
).toContainer( },
padding: const EdgeInsets.only(left: 8, right: 8, bottom: 12, top: 12), dropdownValue: service,
backgroundColor: MyColors.textFieldColor, list: model.servicesDropList,
borderRadius: 0, hint: LocaleKeys.defineServices.tr(),
width: double.infinity,
) )
: model.servicesDropList.isNotEmpty : Container(),
? DropdownField(
(DropValue value) {
serviceId = value.id;
service = value;
isAppointmentAvailable = false;
isHomeAppointmentAvailable = false;
model.setState(ViewState.idle);
},
dropdownValue: service,
list: model.servicesDropList,
hint: LocaleKeys.defineServices.tr(),
)
: categoryId == null
? Container()
: const CircularProgressIndicator(),
12.height, 12.height,
if (serviceId != -1) if (serviceId != -1) ...[
Column( Column(
children: [ children: [
20.height, 20.height,
CheckBoxWithTitleDescription( CheckBoxWithTitleDescription(
isSelected: isAppointmentAvailable, isSelected: isAppointmentAvailable,
title: 'Available for appointment', title: LocaleKeys.availableforAppointment.tr(),
description: 'This option will allow customer to book appointment for these services', description: LocaleKeys.bookAppointmentForServices.tr(),
onSelection: (bool v) { onSelection: (bool v) {
isAppointmentAvailable = v; isAppointmentAvailable = v;
model.setState(ViewState.idle); model.setState(ViewState.idle);
@ -164,8 +133,8 @@ class _CreateServicesPage3State extends State<CreateServicesPage3> {
20.height, 20.height,
CheckBoxWithTitleDescription( CheckBoxWithTitleDescription(
isSelected: isHomeAppointmentAvailable, isSelected: isHomeAppointmentAvailable,
title: 'Allow home services', title: LocaleKeys.allowingHomeService.tr(),
description: 'This option will allow customer to book appointment at their desired location', description: LocaleKeys.bookAppointmentAtLocation.tr(),
onSelection: (bool v) { onSelection: (bool v) {
isHomeAppointmentAvailable = v; isHomeAppointmentAvailable = v;
model.setState(ViewState.idle); model.setState(ViewState.idle);
@ -176,7 +145,7 @@ class _CreateServicesPage3State extends State<CreateServicesPage3> {
Column( Column(
children: [ children: [
TxtField( TxtField(
hint: "Home Services Range", hint: LocaleKeys.homeServiceRange.tr(),
keyboardType: TextInputType.number, keyboardType: TextInputType.number,
value: serviceRage == 0 ? null : serviceRage.toString(), value: serviceRage == 0 ? null : serviceRage.toString(),
postfixWidget: Row( postfixWidget: Row(
@ -197,7 +166,7 @@ class _CreateServicesPage3State extends State<CreateServicesPage3> {
), ),
12.height, 12.height,
TxtField( TxtField(
hint: "Charges per Kilometer", hint: LocaleKeys.chargesPerKM.tr(),
keyboardType: TextInputType.number, keyboardType: TextInputType.number,
value: chargersPerKm == "" ? null : chargersPerKm, value: chargersPerKm == "" ? null : chargersPerKm,
onChanged: (v) { onChanged: (v) {
@ -220,6 +189,7 @@ class _CreateServicesPage3State extends State<CreateServicesPage3> {
), ),
], ],
), ),
]
], ],
), ),
), ),
@ -229,7 +199,7 @@ class _CreateServicesPage3State extends State<CreateServicesPage3> {
ShowFillButton( ShowFillButton(
title: LocaleKeys.save.tr(), title: LocaleKeys.save.tr(),
maxWidth: double.infinity, maxWidth: double.infinity,
margin: const EdgeInsets.symmetric(horizontal: 20), margin: const EdgeInsets.all(20),
onPressed: () { onPressed: () {
if (widget.branchModel!.serviceProviderService != null) { if (widget.branchModel!.serviceProviderService != null) {
updateService(context, model); updateService(context, model);
@ -267,7 +237,7 @@ class _CreateServicesPage3State extends State<CreateServicesPage3> {
"isAllowAppointment": isAppointmentAvailable, "isAllowAppointment": isAppointmentAvailable,
"isActive": true, "isActive": true,
"customerLocationRange": serviceRage, "customerLocationRange": serviceRage,
"rangePricePerKm": chargersPerKm "rangePricePerKm": chargersPerKm.isEmpty ? "0.0" : chargersPerKm,
}; };
map.add(postParams); map.add(postParams);
} }
@ -278,13 +248,33 @@ class _CreateServicesPage3State extends State<CreateServicesPage3> {
await model.getBranchAndServices(); await model.getBranchAndServices();
Utils.hideLoading(context); Utils.hideLoading(context);
Utils.showToast(mResponse.message ?? ""); Utils.showToast(mResponse.message ?? "");
pop(context); if (mResponse.messageStatus == 1) {
context.read<ServiceVM>().filterUserBranchCategories();
pop(context);
}
} }
updateService(BuildContext context, ServiceVM model) async { updateService(BuildContext context, ServiceVM model) async {
List<Map<String, dynamic>> map = [ List<Map<String, dynamic>> map = [];
{"id": widget.branchModel!.serviceProviderService!.serviceId.toString(), "isAllowAppointment": isAppointmentAvailable, "isActive": true, "customerLocationRange": serviceRage, "rangePricePerKm": chargersPerKm} if (isHomeAppointmentAvailable) {
]; map = [
{
"id": widget.branchModel!.serviceProviderService!.serviceProviderServiceId.toString(),
"isAllowAppointment": isAppointmentAvailable,
"isActive": true,
"customerLocationRange": serviceRage,
"rangePricePerKm": chargersPerKm.isEmpty ? "0.0" : chargersPerKm,
}
];
} else {
map = [
{
"id": widget.branchModel!.serviceProviderService!.serviceProviderServiceId.toString(),
"isAllowAppointment": isAppointmentAvailable,
"isActive": true,
}
];
}
// print(map); // print(map);
Utils.showLoading(context); Utils.showLoading(context);
@ -293,6 +283,9 @@ class _CreateServicesPage3State extends State<CreateServicesPage3> {
model.filterUserBranchCategories(); model.filterUserBranchCategories();
Utils.hideLoading(context); Utils.hideLoading(context);
Utils.showToast(mResponse.message ?? ""); Utils.showToast(mResponse.message ?? "");
pop(context); if (mResponse.messageStatus == 1) {
context.read<ServiceVM>().filterUserBranchCategories();
pop(context);
}
} }
} }

@ -1,10 +1,10 @@
import 'package:car_provider_app/config/provider_routes.dart'; import 'package:car_provider_app/config/provider_routes.dart';
import 'package:car_provider_app/view_models/items_view_model.dart'; import 'package:car_provider_app/view_models/items_view_model.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/services_models/item_model.dart'; import 'package:mc_common_app/models/services_models/item_model.dart';
import 'package:mc_common_app/models/services_models/service_model.dart'; import 'package:mc_common_app/models/services_models/service_model.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
@ -16,6 +16,7 @@ import 'package:mc_common_app/widgets/empty_widget.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:easy_localization/easy_localization.dart';
class ItemsListPage extends StatelessWidget { class ItemsListPage extends StatelessWidget {
ServiceModel? serviceProviderService; ServiceModel? serviceProviderService;
@ -41,7 +42,7 @@ class ItemsListPage extends StatelessWidget {
return model.state == ViewState.busy return model.state == ViewState.busy
? const Center(child: CircularProgressIndicator()) ? const Center(child: CircularProgressIndicator())
: model.serviceItems!.data!.isEmpty : model.serviceItems!.data!.isEmpty
? const EmptyWidget(text: "No Service Items found", isWrappedColumn: false) ? EmptyWidget(text: LocaleKeys.noItemstoShow.tr(), isWrappedColumn: false)
: ListView.separated( : ListView.separated(
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return SizedBox( return SizedBox(
@ -57,11 +58,11 @@ class ItemsListPage extends StatelessWidget {
children: [ children: [
model.serviceItems!.data![index].name.toString().toText(fontSize: 16, isBold: true), model.serviceItems!.data![index].name.toString().toText(fontSize: 16, isBold: true),
4.height, 4.height,
showItem("Available for appointment:", (model.serviceItems!.data![index].isAllowAppointment ?? false) ? "Yes" : "No", valueColor: Colors.green), showItem("${LocaleKeys.availableforAppointment.tr()}:", (model.serviceItems!.data![index].isAllowAppointment ?? false) ? "Yes" : "No", valueColor: Colors.green),
showItem("Allowing Workshop service:", (model.serviceItems!.data![index].isAppointmentCompanyLoc ?? false) ? "Yes" : "No", valueColor: Colors.green), showItem("${LocaleKeys.allowingWorkshopService.tr()}:", (model.serviceItems!.data![index].isAppointmentCompanyLoc ?? false) ? "Yes" : "No", valueColor: Colors.green),
showItem("Allowing home service:", (model.serviceItems!.data![index].isAppointmentCustomerLoc ?? false) ? "Yes" : "No", valueColor: Colors.green), showItem("${LocaleKeys.allowingHomeService.tr()}:", (model.serviceItems!.data![index].isAppointmentCustomerLoc ?? false) ? "Yes" : "No", valueColor: Colors.green),
12.height, 12.height,
"Service Amount".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true), LocaleKeys.serviceAmount.tr().toText(fontSize: 13, color: MyColors.lightTextColor),
Row( Row(
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
@ -69,7 +70,7 @@ class ItemsListPage extends StatelessWidget {
2.width, 2.width,
Padding( Padding(
padding: const EdgeInsets.only(bottom: 4), padding: const EdgeInsets.only(bottom: 4),
child: "SAR".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true), child: LocaleKeys.sar.tr().toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true),
), ),
], ],
), ),
@ -104,7 +105,7 @@ class ItemsListPage extends StatelessWidget {
), ),
), ),
ShowFillButton( ShowFillButton(
title: "Add Item", title: LocaleKeys.addItems.tr(),
maxWidth: double.infinity, maxWidth: double.infinity,
margin: const EdgeInsets.all(20), margin: const EdgeInsets.all(20),
onPressed: () { onPressed: () {
@ -126,11 +127,10 @@ class ItemsListPage extends StatelessWidget {
Widget showItem(String item, String value, {Color valueColor = Colors.black}) { Widget showItem(String item, String value, {Color valueColor = Colors.black}) {
return Row( return Row(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
item.toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true), item.toText(color: MyColors.lightTextColor),
4.width, const SizedBox(width: 2),
value.toText(fontSize: 12, color: valueColor, isBold: true), value.toText(color: MyColors.greenColor),
], ],
); );
} }

@ -1,8 +1,11 @@
import 'dart:developer';
import 'package:car_provider_app/config/provider_routes.dart'; import 'package:car_provider_app/config/provider_routes.dart';
import 'package:car_provider_app/views/settings/services/duplication/sheet/approved_branches_list_sheet.dart'; import 'package:car_provider_app/views/settings/services/duplication/sheet/approved_branches_list_sheet.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart'; import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/provider_branches_models/profile/categroy.dart'; import 'package:mc_common_app/models/provider_branches_models/profile/categroy.dart';
@ -10,6 +13,7 @@ import 'package:mc_common_app/models/services_models/service_model.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/utils/utils.dart';
import 'package:mc_common_app/widgets/bottom_sheet.dart'; import 'package:mc_common_app/widgets/bottom_sheet.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart'; import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart';
@ -56,7 +60,7 @@ class _ServicesListPageState extends State<ServicesListPage> {
return Scaffold( return Scaffold(
appBar: CustomAppBar( appBar: CustomAppBar(
title: 'Services', title: LocaleKeys.services.tr(),
actions: [ actions: [
IconButton( IconButton(
icon: const Icon(Icons.copy), icon: const Icon(Icons.copy),
@ -110,13 +114,14 @@ class _ServicesListPageState extends State<ServicesListPage> {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
if (services[index].serviceStatus == 1) ...[
Utils.statusContainerChip(text: "Pending", chipColor: MyColors.adPendingStatusColor),
5.height,
],
Row( Row(
children: [ children: [
Expanded( Expanded(
child: Text( child: (services[index].serviceDescription ?? "").toText(fontSize: 16),
services[index].serviceDescription.toString(),
style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
),
), ),
Padding( Padding(
padding: const EdgeInsets.all(4.0), padding: const EdgeInsets.all(4.0),
@ -126,6 +131,11 @@ class _ServicesListPageState extends State<ServicesListPage> {
height: 16, height: 16,
), ),
).onPress(() { ).onPress(() {
// log("${categoryData.branchId}");
// log("${categoryData.branchName}");
// log("${categoryData.id}");
// log("${categoryData.categoryName}");
// log("${services[index].serviceDescription}");
navigateWithName( navigateWithName(
context, context,
ProviderAppRoutes.createServices3, ProviderAppRoutes.createServices3,
@ -150,31 +160,23 @@ class _ServicesListPageState extends State<ServicesListPage> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
const SizedBox(height: 4), const SizedBox(height: 4),
showItem('Available for appointment:', 'Yes', valueColor: Colors.green), showItem('${LocaleKeys.availableforAppointment.tr()}:', (services[index].isAllowAppointment ?? false) ? LocaleKeys.yes.tr() : LocaleKeys.no.tr(), valueColor: Colors.green),
showItem('Allowing home service:', (services[index].isAllowAppointment ?? false) ? 'Yes' : 'No', valueColor: Colors.green), showItem('${LocaleKeys.allowingHomeService.tr()}:', (services[index].isAllowAppointmentHome ?? false) ? LocaleKeys.yes.tr() : LocaleKeys.no.tr(), valueColor: Colors.green),
showItem('Home service range:', services[index].customerLocationRange.toString()), if ((services[index].isAllowAppointmentHome ?? false)) ...[
showItem('Charges per KM:', services[index].rangePricePerKm.toString()), showItem('${LocaleKeys.homeServiceRange.tr()}:', services[index].customerLocationRange.toString()),
showItem('${LocaleKeys.chargesPerKM.tr()}:', services[index].rangePricePerKm.toString()),
],
], ],
), ),
), ),
const Icon( const Icon(Icons.arrow_forward_rounded, size: 20),
Icons.arrow_forward_rounded,
size: 16,
),
], ],
), ),
], ],
), ),
) ).toWhiteContainer(width: double.infinity, allPading: 12).onPress(
.toWhiteContainer( () => navigateWithName(context, ProviderAppRoutes.itemsList, arguments: services[index]),
width: double.infinity, );
allPading: 12,
)
.onPress(
() {
navigateWithName(context, ProviderAppRoutes.itemsList, arguments: services[index]);
},
);
}, },
separatorBuilder: (context, index) { separatorBuilder: (context, index) {
return const SizedBox(height: 12); return const SizedBox(height: 12);
@ -193,9 +195,9 @@ class _ServicesListPageState extends State<ServicesListPage> {
return Row( return Row(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text(item, style: const TextStyle(fontSize: 12, color: MyColors.lightTextColor, fontWeight: FontWeight.bold)), item.toText(color: MyColors.lightTextColor),
const SizedBox(width: 4), const SizedBox(width: 2),
Text(value, style: TextStyle(fontSize: 12, color: valueColor, fontWeight: FontWeight.bold)), value.toText(color: MyColors.greenColor),
], ],
); );
} }

@ -68,9 +68,14 @@ class MySubscriptionsCard extends StatelessWidget {
], ],
), ),
6.height, 6.height,
showItem("Ads:", "${pvm.adsRemaining.toString()} of ${pvm.totalAds.toString()} remaining"), // showItem("Ads:", "${pvm.adsRemaining.toString()} of ${pvm.totalAds.toString()} remaining"),
showItem("Users:", "${pvm.subUsersRemaining.toString()} of ${pvm.totalSubUsers.toString()} remaining"), // showItem("Users:", "${pvm.subUsersRemaining.toString()} of ${pvm.totalSubUsers.toString()} remaining"),
showItem("Branches:", "${pvm.branchesRemaining.toString()} of ${pvm.totalBranches.toString()} remaining"), // showItem("Branches:", "${pvm.branchesRemaining.toString()} of ${pvm.totalBranches.toString()} remaining"),
showItem("Ads: ", "${pvm.adsRemaining.toString()} remaining"),
showItem("Users: ", "${pvm.subUsersRemaining.toString()} remaining"),
showItem("Branches: ", "${pvm.branchesRemaining.toString()} remaining"),
14.height, 14.height,
Row( Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,

Loading…
Cancel
Save