From ed7ed902d26ee5daaee4eee0e24361c347c79221 Mon Sep 17 00:00:00 2001 From: Faiz Hashmi Date: Mon, 2 Dec 2024 18:01:49 +0300 Subject: [PATCH 1/3] Duration Dis --- lib/main.dart | 2 -- .../fragments/branch_appointment_fragment.dart | 10 ++++------ 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index d017a79..b686918 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -190,5 +190,3 @@ class MyApp extends StatelessWidget { ); } } - - diff --git a/lib/views/dashboard/fragments/branch_appointment_fragment.dart b/lib/views/dashboard/fragments/branch_appointment_fragment.dart index 2ec84bd..4af787d 100644 --- a/lib/views/dashboard/fragments/branch_appointment_fragment.dart +++ b/lib/views/dashboard/fragments/branch_appointment_fragment.dart @@ -1,4 +1,3 @@ - import 'package:flutter/material.dart'; import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/config/routes.dart'; @@ -16,9 +15,7 @@ import 'package:provider/provider.dart'; import 'package:easy_localization/easy_localization.dart'; class BranchAppointmentFragment extends StatelessWidget { - const BranchAppointmentFragment({ - Key? key, - }) : super(key: key); + const BranchAppointmentFragment({super.key}); @override Widget build(BuildContext context) { @@ -45,7 +42,9 @@ class BranchAppointmentFragment extends StatelessWidget { return RefreshIndicator( onRefresh: () async => serviceVM.getBranchAndServices(), child: branches.isEmpty - ? Center(child: LocaleKeys.noBranchFound.tr().toText(fontSize: 16, color: MyColors.lightTextColor, fontWeight: MyFonts.Medium),) + ? Center( + child: LocaleKeys.noBranchFound.tr().toText(fontSize: 16, color: MyColors.lightTextColor, fontWeight: MyFonts.Medium), + ) : ListView.separated( itemBuilder: (context, index) { return Row( @@ -71,7 +70,6 @@ class BranchAppointmentFragment extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ - // Row( // children: [ // const Icon( From 0215abbff825477482d43adf70f49da55137dbdb Mon Sep 17 00:00:00 2001 From: Faiz Hashmi Date: Tue, 3 Dec 2024 17:21:27 +0300 Subject: [PATCH 2/3] Duration Dis --- .../services/create_services_page3.dart | 110 +++++++++++++----- .../services/services_list_page.dart | 7 +- 2 files changed, 86 insertions(+), 31 deletions(-) diff --git a/lib/views/branch_management/services/create_services_page3.dart b/lib/views/branch_management/services/create_services_page3.dart index d3dca90..48cf0d7 100644 --- a/lib/views/branch_management/services/create_services_page3.dart +++ b/lib/views/branch_management/services/create_services_page3.dart @@ -3,6 +3,7 @@ import 'dart:developer'; import 'package:car_provider_app/main.dart'; import 'package:flutter/cupertino.dart'; import 'package:mc_common_app/generated/locale_keys.g.dart'; +import 'package:mc_common_app/models/appointments_models/appointment_basic_detail_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/view_models/service_view_model.dart'; @@ -49,14 +50,13 @@ class _CreateServicesPage3State extends State { DropValue? service; bool isEditDisabled = false; - bool isServiceActive = true; + bool isServiceActive = false; @override void initState() { super.initState(); scheduleMicrotask(() async { ServiceVM serviceVM = context.read(); - log("widget.branchModel!.categoryId: ${widget.branchModel!.categoryId}"); if (widget.branchModel!.categoryId != null) { await serviceVM.fetchServicesByCategoryId(int.parse(widget.branchModel!.categoryId ?? "0")); category = DropValue(int.parse(widget.branchModel!.categoryId ?? "0"), widget.branchModel!.categoryName ?? "", ""); @@ -64,7 +64,7 @@ class _CreateServicesPage3State extends State { isAppointmentAvailable = widget.branchModel?.serviceProviderService?.isAllowAppointment ?? false; serviceRage = widget.branchModel?.serviceProviderService?.customerLocationRange ?? 0; serviceStatusEnum = widget.branchModel?.serviceProviderService?.serviceStatusEnum ?? ServiceStatusEnum.pending; - isServiceActive = widget.branchModel?.serviceProviderService?.isActive ?? true; + isServiceActive = widget.branchModel?.serviceProviderService?.serviceStatusEnum != ServiceStatusEnum.deactivated; isEditDisabled = serviceStatusEnum == ServiceStatusEnum.blocked; if (serviceRage > 0) { isHomeAppointmentAvailable = true; @@ -86,7 +86,7 @@ class _CreateServicesPage3State extends State { width: double.infinity, height: double.infinity, child: Consumer( - builder: (context, model, _) { + builder: (context, serviceVM, _) { return Column( children: [ Expanded( @@ -104,10 +104,10 @@ class _CreateServicesPage3State extends State { serviceId = -1; isAppointmentAvailable = false; isHomeAppointmentAvailable = false; - model.fetchServicesByCategoryId(value.id); + serviceVM.fetchServicesByCategoryId(value.id); }, dropdownValue: category, - list: model.categoryDropList, + list: serviceVM.categoryDropList, hint: category != null ? category!.value : LocaleKeys.selectServiceCategory.tr(), ), if (widget.branchModel!.isForEdit) ...[ @@ -133,9 +133,10 @@ class _CreateServicesPage3State extends State { trackColor: MyColors.white, thumbColor: MyColors.greyACColor, value: isServiceActive, - onChanged: (value) { + onChanged: (value) async { if (isEditDisabled) return; - isServiceActive = value; + + isServiceActive = await updateServiceStatus(context, value); setState(() {}); }, ), @@ -147,23 +148,23 @@ class _CreateServicesPage3State extends State { ] else ...[ 12.height, ], - (model.state == ViewState.idle) - ? categoryId != -1 && model.servicesDropList.isNotEmpty + (serviceVM.state == ViewState.idle) + ? categoryId != -1 && serviceVM.servicesDropList.isNotEmpty ? DropdownField( (DropValue value) { service = value; serviceId = value.id; isAppointmentAvailable = false; isHomeAppointmentAvailable = false; - model.setState(ViewState.idle); + serviceVM.setState(ViewState.idle); }, dropdownValue: service, - list: model.servicesDropList, + list: serviceVM.servicesDropList, hint: LocaleKeys.defineServices.tr(), ) : categoryId == -1 ? const SizedBox() - : model.state == ViewState.idle + : serviceVM.state == ViewState.idle ? EmptyWidget(text: LocaleKeys.noServicesAvailable.tr()) : const SizedBox() : const CircularProgressIndicator(), @@ -182,7 +183,7 @@ class _CreateServicesPage3State extends State { if (!isAppointmentAvailable) { isHomeAppointmentAvailable = false; } - model.setState(ViewState.idle); + serviceVM.setState(ViewState.idle); }, ), 20.height, @@ -197,7 +198,7 @@ class _CreateServicesPage3State extends State { if (isHomeAppointmentAvailable && !isAppointmentAvailable) { isAppointmentAvailable = true; } - model.setState(ViewState.idle); + serviceVM.setState(ViewState.idle); }, ), 20.height, @@ -265,10 +266,10 @@ class _CreateServicesPage3State extends State { margin: const EdgeInsets.all(20), onPressed: () { if (widget.branchModel!.serviceProviderService != null) { - updateService(context, model); + updateService(context, serviceVM); } else { - if (model.services != null) { - createService(context, model); + if (serviceVM.services != null) { + createService(context, serviceVM); } } }, @@ -338,7 +339,7 @@ class _CreateServicesPage3State extends State { { "id": widget.branchModel!.serviceProviderService!.serviceProviderServiceId.toString(), "isAllowAppointment": isAppointmentAvailable, - "isActive": isServiceActive, + "isActive": true, "customerLocationRange": serviceRage, "rangePricePerKm": chargersPerKm.isEmpty ? "0.0" : chargersPerKm, } @@ -348,21 +349,70 @@ class _CreateServicesPage3State extends State { { "id": widget.branchModel!.serviceProviderService!.serviceProviderServiceId.toString(), "isAllowAppointment": isAppointmentAvailable, - "isActive": isServiceActive, + "isActive": true, } ]; } + try { + // print(map); + Utils.showLoading(context); + GenericRespModel mResponse = await model.updateServices(map); + model.getBranchAndServices(); + Utils.hideLoading(context); + Utils.showToast(mResponse.message ?? ""); + if (mResponse.messageStatus == 1) { + context.read().filterUserBranchCategories(); + context.read().isNeedRefreshServicesList = true; + pop(context); + } + } catch (e) { + Utils.hideLoading(context); + log(e.toString()); + Utils.showToast(e.toString() ?? ""); + } + } - // print(map); - Utils.showLoading(context); - GenericRespModel mResponse = await model.updateServices(map); - model.getBranchAndServices(); - Utils.hideLoading(context); - Utils.showToast(mResponse.message ?? ""); - if (mResponse.messageStatus == 1) { - context.read().filterUserBranchCategories(); - context.read().isNeedRefreshServicesList = true; - pop(context); + Future updateServiceStatus(BuildContext context, bool value) async { + List> map = [ + { + "id": widget.branchModel!.serviceProviderService!.serviceProviderServiceId.toString(), + "isActive": true, + + //TODO: ZAHOOR WILL ADD SERVICE STATUS HERE TO UPDATE + } + ]; + try { + final serviceVM = context.read(); + List list = await serviceVM.getAppointmentsByServiceID( + context: context, + branchId: int.parse(widget.branchModel!.branchId), + serviceId: widget.branchModel!.serviceProviderService!.serviceProviderServiceId!, + ); + + List providerServiceIds = []; + providerServiceIds.add(widget.branchModel!.serviceProviderService!.serviceProviderServiceId!); + if (list.isEmpty) { + bool status = await serviceVM.updateServiceStatus( + context: context, + serviceStatusEnum: ServiceStatusEnum.deactivated, + branchId: int.parse(widget.branchModel!.branchId), + providerServiceIds: providerServiceIds, + ); + + return !status; + } else { + serviceVM.buildDealNotCompletedBottomSheetOptions( + mainContext: context, + appointments: list, + branchName: widget.branchModel!.branchName, + ); + } + return value; + } catch (e) { + Utils.hideLoading(context); + log(e.toString()); + Utils.showToast(e.toString() ?? ""); + return value; } } } diff --git a/lib/views/branch_management/services/services_list_page.dart b/lib/views/branch_management/services/services_list_page.dart index f414ee1..f49dfc7 100644 --- a/lib/views/branch_management/services/services_list_page.dart +++ b/lib/views/branch_management/services/services_list_page.dart @@ -231,7 +231,7 @@ class _ServicesListPageState extends State { ], ), ), - if (filteredServices[index].serviceStatusEnum != ServiceStatusEnum.blocked) ...[ + if (filteredServices[index].serviceStatusEnum != ServiceStatusEnum.blocked && filteredServices[index].serviceStatusEnum != ServiceStatusEnum.deactivated) ...[ const Icon(Icons.arrow_forward_rounded, size: 20), ], ], @@ -243,6 +243,11 @@ class _ServicesListPageState extends State { Utils.showToast(LocaleKeys.blockedByAdmin.tr()); return; } + + if (filteredServices[index].serviceStatusEnum == ServiceStatusEnum.deactivated) { + Utils.showToast(LocaleKeys.serviceDeactivated.tr()); + return; + } navigateWithName(context, AppRoutes.itemsList, arguments: filteredServices[index]); }); }, From e4bfc045411243cfffb7eb8a8b67bfa330f4b478 Mon Sep 17 00:00:00 2001 From: Faiz Hashmi Date: Wed, 4 Dec 2024 17:47:56 +0300 Subject: [PATCH 3/3] addnew service fix --- .../add_new_service_appointment_page.dart | 78 +++++------ .../widget/select_items_sheet.dart | 18 ++- .../services/services_list_page.dart | 122 +++++++++++++----- 3 files changed, 137 insertions(+), 81 deletions(-) diff --git a/lib/views/appoinments/add_new_service_appointment_page.dart b/lib/views/appoinments/add_new_service_appointment_page.dart index 112d6a8..2c44a04 100644 --- a/lib/views/appoinments/add_new_service_appointment_page.dart +++ b/lib/views/appoinments/add_new_service_appointment_page.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:developer'; import 'package:car_provider_app/views/dashboard/widget/general_appointment_widget.dart'; import 'package:car_provider_app/views/branch_management/schedule/widgets/chips_picker_item.dart'; import 'package:flutter/cupertino.dart'; @@ -23,6 +24,7 @@ import 'package:mc_common_app/widgets/bottom_sheet.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/empty_widget.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:provider/provider.dart'; import 'package:easy_localization/easy_localization.dart'; @@ -43,6 +45,8 @@ class _AddNewServiceAppointmentPageState extends State selectedList = []; + double totalPrice = 0.0; + List? pickedItems; ServiceVM? serviceVM; @@ -56,6 +60,29 @@ class _AddNewServiceAppointmentPageState extends State list) { + selectedList.clear(); + selectedList.addAll(list); + pickedItems = []; + totalPrice = 0.0; + for (var element in list) { + totalPrice = totalPrice + double.parse(element.price ?? "0"); + pickedItems!.add( + PickerItem(id: element.id ?? 0, title: element.name ?? ""), + ); + } + setState(() {}); + }, + ), + ); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -116,23 +143,7 @@ class _AddNewServiceAppointmentPageState extends State selectedList) { - this.selectedList.clear(); - this.selectedList = selectedList; - pickedItems = []; - for (var element in selectedList) { - pickedItems!.add( - PickerItem(id: element.id ?? 0, title: element.name ?? ""), - ); - } - serviceVm.notifyListeners(); - }, - ), - ); + openItemsSelectionBottomSheet(); }, dropdownValue: service, list: serviceVm.servicesDropList, @@ -141,7 +152,7 @@ class _AddNewServiceAppointmentPageState extends State selectedList) { - pickedItems = []; - for (var element in selectedList) { - pickedItems!.add( - PickerItem(id: element.id ?? 0, title: element.name ?? ""), - ); - } - serviceVm.notifyListeners(); - }, - ), - ); + openItemsSelectionBottomSheet(); }, ) : service != null - ? Text(LocaleKeys.noItemSelectedYet.tr()) + ? EmptyWidget(text: LocaleKeys.noItemSelectedYet.tr()) : const SizedBox(), if ((service != null && pickedItems != null && pickedItems!.isNotEmpty)) Column( @@ -183,7 +179,7 @@ class _AddNewServiceAppointmentPageState extends State) onSelectItems; - List? list; + final int serviceId; + final Function(List) onSelectItems; + final List? list; - SelectItemsSheet({Key? key, required this.serviceId, required this.onSelectItems, this.list}) : super(key: key); + const SelectItemsSheet({super.key, required this.serviceId, required this.onSelectItems, this.list}); @override Widget build(BuildContext context) { @@ -72,10 +74,11 @@ class SelectItemsSheet extends StatelessWidget { controlAffinity: ListTileControlAffinity.leading, title: itemsVM.serviceItems!.data![index].name!.toText(fontSize: 16), subtitle: itemsVM.serviceItems!.data![index].price.toString().toText(fontSize: 14, color: MyColors.lightTextColor), - value: itemsVM.serviceItems!.data![index].isUpdateOrSelected, onChanged: (bool? v) { itemsVM.serviceItems!.data![index].isUpdateOrSelected = v; + + log("itemsVM.serviceItems!.data![index].isUpdateOrSelected: ${itemsVM.serviceItems!.data![index].isUpdateOrSelected}"); itemsVM.notifyListeners(); }, ); @@ -97,9 +100,10 @@ class SelectItemsSheet extends StatelessWidget { maxWidth: double.infinity, margin: const EdgeInsets.all(20), onPressed: () { - if (context.read().serviceItems != null) { + final itemsVM = context.read(); + if (itemsVM.serviceItems != null) { List list = []; - for (var element in context.read().serviceItems!.data!) { + for (var element in itemsVM.serviceItems!.data!) { if (element.isUpdateOrSelected ?? false) { list.add(element); } diff --git a/lib/views/branch_management/services/services_list_page.dart b/lib/views/branch_management/services/services_list_page.dart index f49dfc7..5e2b47e 100644 --- a/lib/views/branch_management/services/services_list_page.dart +++ b/lib/views/branch_management/services/services_list_page.dart @@ -3,6 +3,7 @@ import 'dart:developer'; import 'package:car_provider_app/views/branch_management/services/duplication/sheet/approved_branches_list_sheet.dart'; import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:mc_common_app/classes/consts.dart'; @@ -80,6 +81,96 @@ class _ServicesListPageState extends State { setState(() {}); } + bool isCategoryActive = true; + bool isEditDisabled = false; + + Widget buildCategoryTileWidget() { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + flex: 1, + child: Padding( + padding: const EdgeInsets.only(top: 5), + child: SvgPicture.asset( + MyAssets.maintenanceIcon, + width: 14, + height: 14, + ), + ), + ), + 8.width, + Expanded( + flex: 20, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + categoryData.categoryName.toString().toText(fontSize: 16), + ], + ), + // 5.height, + if (categoryData.services != null) ...[ + Container( + child: ("${LocaleKeys.totalNumberOfServices.tr()}: ${categoryData.services!.length}").toText( + fontSize: 12, + color: MyColors.lightTextColor, + ), + ), + ], + Container( + child: ("${LocaleKeys.branchName.tr()}: ${categoryData.branchName}").toText( + fontSize: 12, + color: MyColors.lightTextColor, + ), + ), + ], + ), + ), + + // TODO: NEED TO CONFIRM CATEGORY DEACTIVATION FROM ZAHOOR + const Expanded( + flex: 4, + child: Column( + children: [ + // LocaleKeys.active.tr().toText(fontSize: 16), + // 8.width, + // Container( + // width: 50, + // height: 30, + // decoration: BoxDecoration( + // color: isCategoryActive ? MyColors.darkPrimaryColor : MyColors.white, + // borderRadius: BorderRadius.circular(25.0), + // border: Border.all(color: MyColors.lightTextColor, width: 1), + // ), + // child: Transform.scale( + // scale: 0.8, + // child: CupertinoSwitch( + // activeColor: MyColors.darkPrimaryColor, + // trackColor: MyColors.white, + // thumbColor: MyColors.greyACColor, + // value: isCategoryActive, + // onChanged: (value) async { + // if (isEditDisabled) return; + // isCategoryActive = value; + // // isCategoryActive = await updateServiceStatus(context, value); + // setState(() {}); + // }, + // ), + // ), + // ), + ], + ), + ), + ], + ).toWhiteContainer(width: double.infinity, allPading: 12); + } + @override Widget build(BuildContext context) { categoryData = ModalRoute.of(context)!.settings.arguments as CategoryData; @@ -116,6 +207,7 @@ class _ServicesListPageState extends State { width: double.infinity, child: Column( children: [ + buildCategoryTileWidget().paddingOnly(left: 20, right: 20, top: 10), 20.height, Consumer( builder: (BuildContext context, ServiceVM serviceVM, Widget? child) { @@ -130,36 +222,6 @@ class _ServicesListPageState extends State { ); }, ), - - // Padding( - // padding: const EdgeInsets.only(left: 20, right: 20, top: 20), - // child: RoleTypeTab( - // selectedTab, - // [ - // DropValue(0, 'Active', ''), - // DropValue(1, 'Requested', ''), - // DropValue(2, 'Deactivated', ''), - // ], - // width: (MediaQuery.of(context).size.width / 3) - 26, - // onSelect: (DropValue value) { - // setState(() { - // selectedTab = value.id; - // - // if (selectedTab == 0) { - // selectedService = ServiceStatusEnum.approvedOrActive; - // filteredServices = categoryData.services!.where((i) => i.serviceStatusEnum == ServiceStatusEnum.approvedOrActive).toList(); - // } else if (selectedTab == 2) { - // selectedService = ServiceStatusEnum.deactivated; - // filteredServices = categoryData.services!.where((i) => i.serviceStatusEnum == ServiceStatusEnum.deactivated).toList(); - // } else { - // selectedService = value.id.toServiceStatusEnum(); - // filteredServices = - // categoryData.services!.where((i) => (i.serviceStatusEnum != ServiceStatusEnum.approvedOrActive && i.serviceStatusEnum != ServiceStatusEnum.deactivated)).toList(); - // } - // }); - // }, - // ), - // ), const SizedBox(height: 10), Expanded( child: RefreshIndicator(