From 7ba4a191bb64518254c49d05a1439872e1460789 Mon Sep 17 00:00:00 2001 From: Faiz Hashmi Date: Wed, 30 Oct 2024 18:05:38 +0300 Subject: [PATCH] Issues Fixed --- lib/main.dart | 5 +- lib/view_models/schedule_view_model.dart | 2 + .../appoinments/update_appointment_page.dart | 2 +- .../widget/select_items_sheet.dart | 2 +- .../branch/branch_detail_page.dart | 2 + .../widget/assign_dealer_user_sheet.dart | 9 +- .../schedule/add_schedules_page.dart | 158 ++++++++++++------ .../schedule/schedules_list_page.dart | 1 + .../schedule/widgets/chips_picker_item.dart | 7 +- .../services/create_services_page3.dart | 2 +- .../duplication/matched_services_page.dart | 2 +- .../services/items_list_page.dart | 2 +- .../services/services_list_page.dart | 2 +- .../dashboard/fragments/home_fragment.dart | 2 +- 14 files changed, 135 insertions(+), 63 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 0d4f8b0..77cb1f7 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -7,6 +7,7 @@ import 'package:car_provider_app/view_models/schedule_view_model.dart'; import 'package:mc_common_app/repositories/setting_options_repo.dart'; import 'package:mc_common_app/repositories/shipping_repo.dart'; import 'package:mc_common_app/services/firebase_service.dart'; +import 'package:mc_common_app/utils/location/Location.dart'; import 'package:mc_common_app/view_models/dashboard_view_model_provider.dart'; import 'package:mc_common_app/view_models/service_view_model.dart'; import 'package:easy_localization/easy_localization.dart'; @@ -60,7 +61,9 @@ Future main() async { await Firebase.initializeApp(); } ProviderAppDependencies.addDependencies(); - injector.get().initializeNotifications(); + injector.get().initializeNotifications().whenComplete(() { + injector.get().handleLocationPermission(); + }); ProviderAppRoutes.routes.addAll(AppRoutes.routes); runApp(MultiProvider( providers: [ diff --git a/lib/view_models/schedule_view_model.dart b/lib/view_models/schedule_view_model.dart index a7a7757..2a2996e 100644 --- a/lib/view_models/schedule_view_model.dart +++ b/lib/view_models/schedule_view_model.dart @@ -31,6 +31,8 @@ class ScheduleVM extends BaseVM { setState(ViewState.idle); } + String currentSelectedBranchName = ""; + Future setScheduleInactive(int scheduleId, int branchId) async { GenericRespModel val = await scheduleRepo.setScheduleInActive(scheduleId, branchId); if (val.messageStatus == 1) { diff --git a/lib/views/appoinments/update_appointment_page.dart b/lib/views/appoinments/update_appointment_page.dart index 8f40bb9..73efa06 100644 --- a/lib/views/appoinments/update_appointment_page.dart +++ b/lib/views/appoinments/update_appointment_page.dart @@ -73,7 +73,7 @@ class UpdateAppointmentPage extends StatelessWidget { ), ), if (appointmentListModel.appointmentStatusEnum == AppointmentStatusEnum.cancelled) ...[ - Utils.buildStatusContainer("Appointment Cancelled").paddingAll(10), + Utils.buildStatusContainer(LocaleKeys.appointmentCancelled.tr()).paddingAll(10), ], if (appointmentListModel.appointmentStatusEnum == AppointmentStatusEnum.booked) Row( diff --git a/lib/views/appoinments/widget/select_items_sheet.dart b/lib/views/appoinments/widget/select_items_sheet.dart index 71a6ada..7c2baf4 100644 --- a/lib/views/appoinments/widget/select_items_sheet.dart +++ b/lib/views/appoinments/widget/select_items_sheet.dart @@ -64,7 +64,7 @@ class SelectItemsSheet extends StatelessWidget { child: itemsVM.serviceItems?.data == null ? const Center(child: CircularProgressIndicator()) : itemsVM.serviceItems?.data!.length == 0 - ? Center(child: EmptyWidget(text: LocaleKeys.noItemstoShow.tr())) + ? Center(child: EmptyWidget(text: LocaleKeys.noItemsToShow.tr())) : ListView.separated( itemBuilder: (BuildContext context, int index) { return CheckboxListTile( diff --git a/lib/views/branch_management/branch/branch_detail_page.dart b/lib/views/branch_management/branch/branch_detail_page.dart index 34e8e8f..2073a43 100644 --- a/lib/views/branch_management/branch/branch_detail_page.dart +++ b/lib/views/branch_management/branch/branch_detail_page.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'package:car_provider_app/config/provider_routes.dart'; +import 'package:car_provider_app/view_models/schedule_view_model.dart'; import 'package:car_provider_app/views/branch_management/branch/dealer/widget/assign_dealer_user_sheet.dart'; import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/generated/locale_keys.g.dart'; @@ -305,6 +306,7 @@ class _BranchDetailPageState extends State { Utils.showToast("Please wait for the branch verification."); return; } + context.read().currentSelectedBranchName = widget.branchData.branchName.toString(); navigateWithName(context, AppRoutes.schedulesList, arguments: widget.branchData.id.toString()); }), Row( diff --git a/lib/views/branch_management/branch/dealer/widget/assign_dealer_user_sheet.dart b/lib/views/branch_management/branch/dealer/widget/assign_dealer_user_sheet.dart index 3341a20..a9fa77d 100644 --- a/lib/views/branch_management/branch/dealer/widget/assign_dealer_user_sheet.dart +++ b/lib/views/branch_management/branch/dealer/widget/assign_dealer_user_sheet.dart @@ -41,7 +41,10 @@ class _AssignDealerUserSheetState extends State { } getBranchUsers() { - provider.getAllProviderDealers({"ServiceProviderBranchID": widget.branchId, "ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""}); + provider.getAllProviderDealers({ + "ServiceProviderBranchID": widget.branchId, + "ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? "", + }); } @override @@ -86,7 +89,6 @@ class _AssignDealerUserSheetState extends State { maxWidth: double.infinity, maxHeight: 55, fontSize: 15, - onPressed: () async { if (validation()) { Utils.showLoading(context); @@ -143,6 +145,9 @@ class _AssignDealerUserSheetState extends State { Checkbox( value: model.allProviderDealersList[index].isBranchUser, onChanged: (v) { + for (var element in model.allProviderDealersList) { + element.isBranchUser = false; + } model.allProviderDealersList[index].isBranchUser = v ?? false; model.notifyListeners(); }, diff --git a/lib/views/branch_management/schedule/add_schedules_page.dart b/lib/views/branch_management/schedule/add_schedules_page.dart index 3ab7ab7..33012e8 100644 --- a/lib/views/branch_management/schedule/add_schedules_page.dart +++ b/lib/views/branch_management/schedule/add_schedules_page.dart @@ -1,5 +1,4 @@ import 'dart:async'; - import 'package:car_provider_app/view_models/schedule_view_model.dart'; import 'package:car_provider_app/views/branch_management/schedule/widgets/chips_picker_item.dart'; import 'package:car_provider_app/views/branch_management/schedule/widgets/select_days_sheet.dart'; @@ -8,7 +7,6 @@ import 'package:flutter/material.dart'; import 'package:mc_common_app/extensions/int_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/main.dart'; 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/theme/colors.dart'; @@ -17,6 +15,7 @@ import 'package:mc_common_app/utils/navigator.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/common_widgets/app_bar.dart'; +import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart'; import 'package:mc_common_app/widgets/txt_field.dart'; import 'package:provider/provider.dart'; import 'package:mc_common_app/widgets/bottom_sheet.dart'; @@ -30,7 +29,7 @@ class AddSchedulesPage extends StatefulWidget { } class _AddSchedulesPageState extends State { - late ScheduleVM mModel; + late ScheduleVM schedulevm; String name = "", startDate = "", endDate = "", startTime = "", endTime = "", slotsTime = "", appointmentPerSlot = "", servicesGroupID = ""; @@ -42,36 +41,71 @@ class _AddSchedulesPageState extends State { endDate = DateHelper.formatAsYearMonthDay(scheduleData.toDate ?? DateTime.now()); startTime = scheduleData.startTime ?? ""; endTime = scheduleData.endTime ?? ""; - slotsTime = scheduleData.slotDurationMinute.toString(); + if (scheduleData.slotDurationMinute != null) { + int temp = scheduleData.slotDurationMinute!; + int index = minutesDrop.indexWhere((element) => element.id == temp); + + if (index != -1) { + slotTimeId = temp; + slotsTime = "$temp Minutes"; + } else { + temp = 20; + slotTimeId = temp; + slotsTime = "$temp Minutes"; + } + } appointmentPerSlot = scheduleData.perSlotAppointment.toString(); // mModel.selectedServicesItems.clear(); scheduleData.scheduleServices?.forEach((element) { - print("Services Elements"); - print(element); - mModel.selectedServicesItems.add(PickerItem(id: element.serviceProviderServiceId ?? 0, title: element.serviceDescription ?? "")); + schedulevm.selectedServicesItems.add(PickerItem(id: element.serviceProviderServiceId ?? 0, title: element.serviceDescription ?? "")); }); - logger.d(mModel.selectedServicesItems.first.id); - mModel.selectedDaysItems.clear(); + schedulevm.selectedDaysItems.clear(); scheduleData.weeklyOffDays?.forEach((element) { for (var daysElement in initDaysList) { if (element.dayNumber == daysElement.id) { daysElement.isSelected = true; - mModel.selectedDaysItems.add(daysElement); + schedulevm.selectedDaysItems.add(daysElement); } } }); + + if (scheduleData.appointmentType != null) { + if (scheduleData.appointmentType == 1) { + selectedScheduleLocationDrop = DropValue(1, 'Company Location', ''); + } else { + selectedScheduleLocationDrop = DropValue(1, 'Company Location', ''); + } + } } + int slotTimeId = 10; + + List minutesDrop = [ + DropValue(10, '10 Minutes', ''), + DropValue(15, '15 Minutes', ''), + DropValue(20, '20 Minutes', ''), + DropValue(25, '25 Minutes', ''), + DropValue(30, '30 Minutes', ''), + DropValue(50, '50 Minutes', ''), + DropValue(60, '60 Minutes', ''), + ]; + DropValue selectedScheduleLocationDrop = DropValue(-1, '', ''); + + List scheduleLocationIdDrop = [ + DropValue(1, 'Company Location', ''), + DropValue(2, 'Customer Location', ''), + ]; + @override void initState() { super.initState(); scheduleMicrotask(() { - mModel = context.read(); + schedulevm = context.read(); scheduleData = ModalRoute.of(context)!.settings.arguments as ScheduleData; - mModel.getAllServices(scheduleData.branchId, scheduleData); - mModel.selectedServicesItems = []; - mModel.selectedDaysItems = []; + schedulevm.getAllServices(scheduleData.branchId, scheduleData); + schedulevm.selectedServicesItems = []; + schedulevm.selectedDaysItems = []; if (scheduleData.id != null) { setEditData(); } @@ -81,13 +115,11 @@ class _AddSchedulesPageState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: const CustomAppBar( - title: "Create Schedules", - ), + appBar: CustomAppBar(title: LocaleKeys.createGroupServices.tr()), body: SizedBox( width: double.infinity, child: Consumer( - builder: (_, ScheduleVM model, child) { + builder: (_, ScheduleVM scheduleVM, child) { return Column( children: [ Expanded( @@ -95,6 +127,16 @@ class _AddSchedulesPageState extends State { padding: const EdgeInsets.all(20), child: Column( children: [ + if (scheduleVM.currentSelectedBranchName.isNotEmpty) ...[ + TxtField( + isBackgroundEnabled: true, + isNeedClickAll: true, + hint: '', + value: scheduleVM.currentSelectedBranchName, + onTap: () {}, + ), + 8.height, + ], TxtField( hint: LocaleKeys.nameofSchedule.tr(), value: name, @@ -105,13 +147,13 @@ class _AddSchedulesPageState extends State { 8.height, ChipsPickerItem( hint: LocaleKeys.select_Services.tr(), - itemsList: [...model.selectedServicesItems], + itemsList: [...scheduleVM.selectedServicesItems], onClick: () { showMyBottomSheet( context, child: SelectServicesSheet( onSelectServices: () { - model.filterSelectedServices(); + scheduleVM.filterSelectedServices(); FocusManager.instance.primaryFocus?.unfocus(); }, ), @@ -133,7 +175,7 @@ class _AddSchedulesPageState extends State { firstDate: DateTime.now(), ); FocusManager.instance.primaryFocus?.unfocus(); - model.refresh(); + scheduleVM.refresh(); }, ), 8.height, @@ -151,19 +193,19 @@ class _AddSchedulesPageState extends State { firstDate: DateTime.now(), ); FocusManager.instance.primaryFocus?.unfocus(); - model.refresh(); + scheduleVM.refresh(); }, ), 8.height, ChipsPickerItem( hint: LocaleKeys.offDays.tr(), - itemsList: [...model.selectedDaysItems], + itemsList: [...scheduleVM.selectedDaysItems], onClick: () { showMyBottomSheet( context, child: SelectDaysSheet( onSelected: (List picked) { - model.filterDays(picked); + scheduleVM.filterDays(picked); FocusManager.instance.primaryFocus?.unfocus(); }, ), @@ -185,7 +227,7 @@ class _AddSchedulesPageState extends State { onTap: () async { startTime = await Utils.pickTime(context); FocusManager.instance.primaryFocus?.unfocus(); - model.refresh(); + scheduleVM.refresh(); }, ), ), @@ -207,27 +249,25 @@ class _AddSchedulesPageState extends State { initialTime: _startTime, ); FocusManager.instance.primaryFocus?.unfocus(); - model.refresh(); + scheduleVM.refresh(); }, ), ), ], ), 8.height, - TxtField( - hint: LocaleKeys.slotsTime.tr(), - postfixWidget: Row( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - "Min".toText(color: MyColors.lightTextColor), - ], - ), - keyboardType: TextInputType.number, - value: slotsTime, - onChanged: (v) { - slotsTime = v; + Builder( + builder: (context) { + return DropdownField( + (DropValue value) { + slotsTime = value.value; + slotTimeId = value.id; + }, + list: minutesDrop, + dropdownValue: slotsTime.isNotEmpty ? DropValue(slotTimeId, slotsTime, "") : null, + hint: LocaleKeys.slotsTime.tr(), + errorValue: '', + ); }, ), 8.height, @@ -239,6 +279,20 @@ class _AddSchedulesPageState extends State { appointmentPerSlot = v; }, ), + 8.height, + Builder( + builder: (context) { + return DropdownField( + (DropValue value) { + selectedScheduleLocationDrop = value; + }, + list: scheduleLocationIdDrop, + dropdownValue: selectedScheduleLocationDrop.id != -1 ? selectedScheduleLocationDrop : null, + hint: LocaleKeys.selectServiceLocation.tr(), + errorValue: '', + ); + }, + ), ], ), ), @@ -248,11 +302,11 @@ class _AddSchedulesPageState extends State { maxWidth: double.infinity, margin: const EdgeInsets.all(20), onPressed: () { - if (validation(model)) { + if (validation(scheduleVM)) { if (scheduleData.id != null) { - updateSchedule(context, model); + updateSchedule(context, scheduleVM); } else { - createSchedule(context, model); + createSchedule(context, scheduleVM); } } }, @@ -298,9 +352,9 @@ class _AddSchedulesPageState extends State { return valid; } - createSchedule(BuildContext context, ScheduleVM model) async { + createSchedule(BuildContext context, ScheduleVM scheduleVM) async { List days = []; - for (var element in model.selectedDaysItems) { + for (var element in scheduleVM.selectedDaysItems) { days.add(element.id); } @@ -312,19 +366,19 @@ class _AddSchedulesPageState extends State { "toDate": endDate, "startTime": startTime, "endTime": endTime, - "slotDurationMinute": slotsTime, + "slotDurationMinute": slotsTime.replaceFirst(' Minutes', ''), "perSlotAppointment": appointmentPerSlot, "deliveryServiceType": 1, - "appointmentType": 1, + "appointmentType": selectedScheduleLocationDrop.id, "weeklyOffDays": days }; Utils.showLoading(context); - GenericRespModel scheduleResponse = await model.createSchedule(map); + GenericRespModel scheduleResponse = await scheduleVM.createSchedule(map); if (scheduleResponse.messageStatus == 1) { List services = []; - for (var element in model.selectedServicesItems) { + for (var element in scheduleVM.selectedServicesItems) { services.add(element.id); } var map1 = { @@ -333,7 +387,7 @@ class _AddSchedulesPageState extends State { "serviceGroupDescription": "string", }; - GenericRespModel servicesResponse = await model.addServicesInSchedule(map1); + GenericRespModel servicesResponse = await scheduleVM.addServicesInSchedule(map1); Utils.hideLoading(context); if (servicesResponse.messageStatus == 1) { Utils.showToast("Successfully schedule created"); @@ -363,11 +417,11 @@ class _AddSchedulesPageState extends State { "toDate": endDate, "startTime": startTime, "endTime": endTime, - "slotDurationMinute": slotsTime, + "slotDurationMinute": slotsTime.replaceFirst(' Minutes', ''), "perSlotAppointment": appointmentPerSlot, "deliveryServiceType": 1, "weeklyOffDays": days, - "appointmentType": scheduleData.appointmentType + "appointmentType": selectedScheduleLocationDrop.id, }; Utils.showLoading(context); diff --git a/lib/views/branch_management/schedule/schedules_list_page.dart b/lib/views/branch_management/schedule/schedules_list_page.dart index 349be55..e6a3e3c 100644 --- a/lib/views/branch_management/schedule/schedules_list_page.dart +++ b/lib/views/branch_management/schedule/schedules_list_page.dart @@ -130,6 +130,7 @@ class _SchedulesListPageState extends State { showItem("${LocaleKeys.shiftEndTime.tr()}:", scheduleVM.schedule!.data![index].endTime ?? ""), showItem("${LocaleKeys.slotsTime.tr()}:", "${scheduleVM.schedule!.data![index].slotDurationMinute} Mins"), showItem("${LocaleKeys.appointmentPerSlot.tr()}:", scheduleVM.schedule!.data![index].perSlotAppointment.toString()), + showItem(LocaleKeys.serviceLocation.tr(), scheduleVM.schedule!.data![index].appointmentType ==1 ? "Company Location" : "Home Location"), showItem("${LocaleKeys.offDays.tr()}:", offDays(scheduleVM.schedule!.data![index])), 12.height, "${LocaleKeys.services.tr()}:".toText(fontSize: 12, color: MyColors.lightTextColor), diff --git a/lib/views/branch_management/schedule/widgets/chips_picker_item.dart b/lib/views/branch_management/schedule/widgets/chips_picker_item.dart index f927443..e9b68c0 100644 --- a/lib/views/branch_management/schedule/widgets/chips_picker_item.dart +++ b/lib/views/branch_management/schedule/widgets/chips_picker_item.dart @@ -25,7 +25,12 @@ class ChipsPickerItem extends StatelessWidget { Widget build(BuildContext context) { return Row( children: [ - if (itemsList.isEmpty) Expanded(child: hint.toText(fontSize: 15, fontWeight: MyFonts.Medium, color: borderColor)), + if (itemsList.isEmpty) + Expanded( + child: Text( + hint, + style: const TextStyle(color: borderColor, fontSize: 15, fontWeight: MyFonts.Medium), + )), if (itemsList.isNotEmpty) Expanded( child: ListView( diff --git a/lib/views/branch_management/services/create_services_page3.dart b/lib/views/branch_management/services/create_services_page3.dart index baf272e..ce1216f 100644 --- a/lib/views/branch_management/services/create_services_page3.dart +++ b/lib/views/branch_management/services/create_services_page3.dart @@ -104,7 +104,7 @@ class _CreateServicesPage3State extends State { ) : const CircularProgressIndicator(), 12.height, - model.servicesDropList.isNotEmpty + categoryId != -1 && model.servicesDropList.isNotEmpty ? DropdownField( (DropValue value) { service = value; diff --git a/lib/views/branch_management/services/duplication/matched_services_page.dart b/lib/views/branch_management/services/duplication/matched_services_page.dart index c073f20..541c404 100644 --- a/lib/views/branch_management/services/duplication/matched_services_page.dart +++ b/lib/views/branch_management/services/duplication/matched_services_page.dart @@ -106,7 +106,7 @@ class _MatchedServicesPageState extends State { value: model.matchedServices![index].isExpandedOrSelected, onChanged: (v) { if (model.matchedServices![index].serviceItems!.isEmpty) { - Utils.showToast(LocaleKeys.noItemstoShow.tr()); + Utils.showToast(LocaleKeys.noItemsToShow.tr()); } else { model.matchedServices![index].isExpandedOrSelected = v ?? false; model.updateServiceItem(index, model.matchedServices![index].isExpandedOrSelected); diff --git a/lib/views/branch_management/services/items_list_page.dart b/lib/views/branch_management/services/items_list_page.dart index cb19bcf..8abfa70 100644 --- a/lib/views/branch_management/services/items_list_page.dart +++ b/lib/views/branch_management/services/items_list_page.dart @@ -42,7 +42,7 @@ class ItemsListPage extends StatelessWidget { return model.state == ViewState.busy ? const Center(child: CircularProgressIndicator()) : model.serviceItems!.data!.isEmpty - ? EmptyWidget(text: LocaleKeys.noItemstoShow.tr(), isWrappedColumn: false) + ? EmptyWidget(text: LocaleKeys.noItemsToShow.tr(), isWrappedColumn: false) : ListView.separated( itemBuilder: (BuildContext context, int index) { return SizedBox( diff --git a/lib/views/branch_management/services/services_list_page.dart b/lib/views/branch_management/services/services_list_page.dart index 6038048..1f33298 100644 --- a/lib/views/branch_management/services/services_list_page.dart +++ b/lib/views/branch_management/services/services_list_page.dart @@ -108,7 +108,7 @@ class _ServicesListPageState extends State { Expanded( child: services.isEmpty ? Center( - child: LocaleKeys.noItemstoShow.tr().toText(fontSize: 16, color: MyColors.lightTextColor), + child: LocaleKeys.noItemsToShow.tr().toText(fontSize: 16, color: MyColors.lightTextColor), ) : ListView.separated( itemBuilder: (context, index) { diff --git a/lib/views/dashboard/fragments/home_fragment.dart b/lib/views/dashboard/fragments/home_fragment.dart index 45c78f3..dfa2d8c 100644 --- a/lib/views/dashboard/fragments/home_fragment.dart +++ b/lib/views/dashboard/fragments/home_fragment.dart @@ -33,7 +33,7 @@ class HomeFragment extends StatelessWidget { leadingWidth: 100, toolbarHeight: 59, onTap: () => navigateWithName(context, AppRoutes.settingOptionsMore), - actions: [ + actions: const [ // IconButton( // onPressed: () => context.read().onGeneralChatMessagesButtonPressed(context: context), // icon: b.Badge(