diff --git a/lib/models/advertisment_models/ads_duration_model.dart b/lib/models/advertisment_models/ads_duration_model.dart index 68d0703..aaf3b5c 100644 --- a/lib/models/advertisment_models/ads_duration_model.dart +++ b/lib/models/advertisment_models/ads_duration_model.dart @@ -6,15 +6,9 @@ class AdsDurationModel { int? countryID; bool? isActive; String? countryName; + bool? isSelected; - AdsDurationModel( - {this.id, - this.name, - this.days, - this.price, - this.countryID, - this.isActive, - this.countryName}); + AdsDurationModel({this.id, this.name, this.days, this.price, this.countryID, this.isActive, this.countryName, this.isSelected}); AdsDurationModel.fromJson(Map json) { id = json['id']; @@ -24,6 +18,7 @@ class AdsDurationModel { countryID = json['countryID']; isActive = json['isActive']; countryName = json['countryName']; + isSelected = false; } Map toJson() { diff --git a/lib/models/advertisment_models/vehicle_details_models.dart b/lib/models/advertisment_models/vehicle_details_models.dart index 10779c7..bcbd8ba 100644 --- a/lib/models/advertisment_models/vehicle_details_models.dart +++ b/lib/models/advertisment_models/vehicle_details_models.dart @@ -60,6 +60,7 @@ class VehicleTypeModel { String? vehicleTypeNameN; bool? isActive; VehicleType? vehicleTypeEnum; + bool? isSelected; VehicleTypeModel({ this.id, @@ -67,6 +68,8 @@ class VehicleTypeModel { this.vehicleTypeNameN, this.isActive, this.vehicleTypeEnum = VehicleType.car, + this.isSelected, + }); VehicleTypeModel.fromJson(Map json) { @@ -75,6 +78,7 @@ class VehicleTypeModel { vehicleTypeNameN = json['vehicleTypeNameN']; isActive = json['isActive']; vehicleTypeEnum = (json['id'] as int).toVehicleTypeEnum(); + isSelected = false; } Map toJson() { @@ -450,8 +454,9 @@ class VehicleBrandsModel { String? vehicleBrandDescription; String? vehicleBrandDescriptionN; bool? isActive; + bool? isSelected; - VehicleBrandsModel({this.id, this.vehicleType, this.vehicleTypeVal, this.vehicleBrandDescription, this.vehicleBrandDescriptionN, this.isActive}); + VehicleBrandsModel({this.id, this.vehicleType, this.vehicleTypeVal, this.vehicleBrandDescription, this.vehicleBrandDescriptionN, this.isActive, this.isSelected}); VehicleBrandsModel.fromJson(Map json) { id = json['id']; @@ -460,6 +465,7 @@ class VehicleBrandsModel { vehicleBrandDescription = json['vehicleBrand_Description']; vehicleBrandDescriptionN = json['vehicleBrand_DescriptionN']; isActive = json['isActive']; + isSelected = false; } Map toJson() { diff --git a/lib/view_models/ad_view_model.dart b/lib/view_models/ad_view_model.dart index 0f5e3c2..7973bad 100644 --- a/lib/view_models/ad_view_model.dart +++ b/lib/view_models/ad_view_model.dart @@ -6,6 +6,7 @@ import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/config/dependencies.dart'; import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; +import 'package:mc_common_app/main.dart'; import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart'; import 'package:mc_common_app/models/advertisment_models/ads_bank_details_model.dart'; import 'package:mc_common_app/models/advertisment_models/ads_duration_model.dart'; @@ -69,6 +70,9 @@ class AdVM extends BaseVM { String adReservePriceError = ""; String adPhoneNumberError = ""; + // Edit Variables Amir + bool isAdEdit = false; + List exploreAds = []; List exploreAdsFilteredList = []; List myAdsFilteredList = []; @@ -1593,8 +1597,83 @@ class AdVM extends BaseVM { applyFilterOnExploreAds(createdByRoleFilter: CreatedByRoleEnum.allAds); setState(ViewState.idle); } + +///// Edit Work Amir + + void editUpdateAd(BuildContext context, AdDetailsModel previousDetails) { + isAdEdit = true; + navigateWithName(context, AppRoutes.selectAdTypeView, arguments: AppState().currentAppType == AppType.provider ? true : false); + checkVehicleStep1(previousDetails); + checkVehicleStep2(previousDetails); + + } + + void clearEditValues() { + isAdEdit = false; + if (vehicleTypes.isNotEmpty) vehicleTypes.unselectAll(); + if (vehicleAdsDurations.isNotEmpty) vehicleAdsDurations.unselectAll(); + } + + checkVehicleStep1(AdDetailsModel previousDetails) { + logger.d("Step 1"); + if (vehicleTypes.isNotEmpty) { + for (var vehicle in vehicleTypes) { + if (vehicle.id == previousDetails.vehicle?.vehicleType) { + vehicle.isSelected = true; + break; + } + } + } + notifyListeners(); + } + + checkVehicleStep2(AdDetailsModel previousDetails) { + logger.d("Step 2"); + if (vehicleAdsDurations.isNotEmpty) { + for (var adsDuration in vehicleAdsDurations) { + if (adsDuration.price == previousDetails.adsDurationPrice) { + adsDuration.isSelected = true; + break; + } + } + } + notifyListeners(); + } + checkVehicleStep3(AdDetailsModel previousDetails) { + logger.d("Step 3"); + if (vehicleBrands.isNotEmpty) { + for (var vBrands in vehicleBrands) { + if (vBrands.id == previousDetails.vehicle.) { + // BrandsId need to be matched here. + vBrands.isSelected = true; + break; + } + } + } + notifyListeners(); + } + + updateValues() { + if (isAdEdit) { + if (vehicleTypes.isNotEmpty) vehicleTypes.unselectAll(); + if (vehicleAdsDurations.isNotEmpty) vehicleAdsDurations.unselectAll(); + notifyListeners(); + } + } +} + +extension ToggleSelected on List { + void unselectAll() { + for (var element in this) { + if (element.isSelected!) { + element.isSelected = false; + } + } + } } +// Edit Work End Amir + class VehicleDamageCard { List? partImages; SelectionModel? partSelectedId; diff --git a/lib/views/advertisement/ad_duration_selection_sheet_content.dart b/lib/views/advertisement/ad_duration_selection_sheet_content.dart index c0758f6..01af7e8 100644 --- a/lib/views/advertisement/ad_duration_selection_sheet_content.dart +++ b/lib/views/advertisement/ad_duration_selection_sheet_content.dart @@ -70,7 +70,14 @@ class AdDurationSelectionSheetContent extends StatelessWidget { ), ), ], - ).toWhiteContainer(width: double.infinity, allPading: 12, isBorderRequired: adDuration.id == adVM.vehicleAdDurationId.selectedId ? true : false), + ).toWhiteContainer( + width: double.infinity, + allPading: 12, + isBorderRequired: adDuration.isSelected! + ? true + : adDuration.id == adVM.vehicleAdDurationId.selectedId + ? true + : false), ).onPress(() { if (isFromExtendAd) { adVM.updateVehicleExtendAdDurationId( @@ -89,6 +96,7 @@ class AdDurationSelectionSheetContent extends StatelessWidget { itemPrice: adDuration.price!.toInt().toString(), ), ); + adVM.updateValues(); }); }, separatorBuilder: (BuildContext context, int index) { diff --git a/lib/views/advertisement/ads_detail_view.dart b/lib/views/advertisement/ads_detail_view.dart index 5e0e3db..d4f4bd5 100644 --- a/lib/views/advertisement/ads_detail_view.dart +++ b/lib/views/advertisement/ads_detail_view.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:convert'; import 'dart:developer'; import 'package:flutter/material.dart'; @@ -6,6 +7,7 @@ import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; +import 'package:mc_common_app/main.dart'; import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart'; import 'package:mc_common_app/models/advertisment_models/ads_bank_details_model.dart'; import 'package:mc_common_app/models/advertisment_models/special_service_model.dart'; @@ -31,6 +33,7 @@ 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:provider/provider.dart'; +import 'package:sizer/sizer.dart'; class AdsDetailView extends StatefulWidget { final AdDetailsModel adDetails; @@ -90,9 +93,14 @@ class _AdsDetailViewState extends State { ); } + void editAd() { + AdVM adVM = context.read(); + adVM.editUpdateAd(context, widget.adDetails); + } + @override Widget build(BuildContext context) { - log("ad: ${widget.adDetails.id}"); + log("ad: ${widget.adDetails.vehicle!.image!.first.imageUrl}"); return Scaffold( appBar: CustomAppBar( title: "Ads", @@ -130,6 +138,7 @@ class _AdsDetailViewState extends State { children: [ Expanded( child: ListView( + shrinkWrap: true, children: [ Column( mainAxisSize: MainAxisSize.min, @@ -259,7 +268,26 @@ class _AdsDetailViewState extends State { mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - "Rejection Comments".toText(fontSize: 18, isBold: true), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "Rejection Comments".toText(fontSize: 18, isBold: true, color: MyColors.lightTextColor), + Row( + children: [ + Icon( + Icons.edit, + size: 15, + ), + 2.width, + "Edit Add".toText(fontSize: 10, isBold: true), + ], + ).onPress(() { + logger.i(widget.adDetails); + editAd(); + }), + ], + ).paddingOnly(bottom: 5), Row( children: [ (widget.adDetails.comment ?? "").toText( diff --git a/lib/views/advertisement/create_ad_view.dart b/lib/views/advertisement/create_ad_view.dart index 195d438..d0ca883 100644 --- a/lib/views/advertisement/create_ad_view.dart +++ b/lib/views/advertisement/create_ad_view.dart @@ -34,7 +34,7 @@ class _CreateAdViewState extends State { Widget build(BuildContext context) { return Scaffold( appBar: CustomAppBar( - title: "Create Ad", + title: adVM.isAdEdit ? "Update Ad": "Create Ad", isRemoveBackButton: false, isDrawerEnabled: false, onBackButtonTapped: () => adVM.onBackButtonPressed(context), diff --git a/lib/views/advertisement/select_ad_type_view.dart b/lib/views/advertisement/select_ad_type_view.dart index d8acbf9..651f19d 100644 --- a/lib/views/advertisement/select_ad_type_view.dart +++ b/lib/views/advertisement/select_ad_type_view.dart @@ -3,6 +3,7 @@ import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; +import 'package:mc_common_app/main.dart'; import 'package:mc_common_app/models/advertisment_models/vehicle_details_models.dart'; import 'package:mc_common_app/models/general_models/widgets_models.dart'; import 'package:mc_common_app/theme/colors.dart'; @@ -38,128 +39,154 @@ class SelectAdTypeView extends StatelessWidget { } } + // bool checkSelection(VehicleTypeModel vtype, AdVM adVM) { + // bool value = false; + // if (adVM.vehicleTypes.isNotEmpty) { + // for (var vehicle in adVM.vehicleTypes) { + // if (vtype.id == adVM.previousADDetails?.vehicle?.vehicleType) { + // value = true; + // break; + // } + // } + // } + // return value; + // } + // + // clearAll(BuildContext context) { + // AdVM adVM = context.read(); + // adVM.clearEditValues(); + // } + @override Widget build(BuildContext context) { - return Scaffold( - appBar: CustomAppBar( - title: "Select Ad Type", - profileImageUrl: MyAssets.bnCar, - isRemoveBackButton: false, - isDrawerEnabled: false, - ), - body: Column( - children: [ - Expanded( - child: Consumer(builder: (BuildContext context, AdVM adVM, Widget? child) { - return ListView.separated( - itemCount: adVM.vehicleTypes.length, - itemBuilder: (BuildContext context, int index) { - VehicleTypeModel vehicleTypeModel = adVM.vehicleTypes[index]; - return InkWell( - onTap: () { - adVM.updateSelectionVehicleTypeId( - SelectionModel(selectedId: vehicleTypeModel.id!, selectedOption: vehicleTypeModel.vehicleTypeName ?? "", errorValue: ""), - ); - - showMyBottomSheet(context, child: const AdDurationSelectionSheetContent(isUpdateAdSelected: false, isFromExtendAd: false)); - }, - child: SizedBox( - width: double.infinity, - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - vehicleTypeModel.vehicleTypeName.toString().toText(fontSize: 18, isBold: true), - getVehicleAdTypeIcon(vehicleTypeModel.vehicleTypeEnum!), - ], - ), - if (isProvider) ...[ - Row( - children: [ - "Duration: ".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true), - "Valid Until Subscription Expiration".toText(fontSize: 13, isBold: true), - ], - ).paddingOnly(top: 5, bottom: 5), - ] else ...[ + return WillPopScope( + onWillPop: () async { + logger.d("Clead All Values"); + // clearAll(context); + AdVM adVM = context.read(); + adVM.clearEditValues(); + return true; + }, + child: Scaffold( + appBar: CustomAppBar( + title: "Select Ad Type", + profileImageUrl: MyAssets.bnCar, + isRemoveBackButton: false, + isDrawerEnabled: false, + ), + body: Column( + children: [ + Expanded( + child: Consumer(builder: (BuildContext context, AdVM adVM, Widget? child) { + return ListView.separated( + itemCount: adVM.vehicleTypes.length, + itemBuilder: (BuildContext context, int index) { + VehicleTypeModel vehicleTypeModel = adVM.vehicleTypes[index]; + return InkWell( + onTap: () { + adVM.updateSelectionVehicleTypeId( + SelectionModel(selectedId: vehicleTypeModel.id!, selectedOption: vehicleTypeModel.vehicleTypeName ?? "", errorValue: ""), + ); + showMyBottomSheet(context, child: const AdDurationSelectionSheetContent(isUpdateAdSelected: false, isFromExtendAd: false)); + }, + child: SizedBox( + width: double.infinity, + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - "Duration: ".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true), - adVM.vehicleAdDurationId.selectedOption.toText(fontSize: 13, isBold: true), - const Icon(Icons.keyboard_arrow_down_sharp, color: MyColors.darkPrimaryColor, size: 20), - ], - ).paddingOnly(top: 5, bottom: 5), - ], - if (!isProvider) ...[ - Row( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - adVM.vehicleAdDurationId.itemPrice.toText(fontSize: 22, isBold: true), - 2.width, - Padding( - padding: const EdgeInsets.only(bottom: 4), - child: "SAR".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true), - ), + vehicleTypeModel.vehicleTypeName.toString().toText(fontSize: 18, isBold: true), + getVehicleAdTypeIcon(vehicleTypeModel.vehicleTypeEnum!), ], ), + if (isProvider) ...[ + Row( + children: [ + "Duration: ".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true), + "Valid Until Subscription Expiration".toText(fontSize: 13, isBold: true), + ], + ).paddingOnly(top: 5, bottom: 5), + ] else ...[ + Row( + children: [ + "Duration: ".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true), + adVM.vehicleAdDurationId.selectedOption.toText(fontSize: 13, isBold: true), + const Icon(Icons.keyboard_arrow_down_sharp, color: MyColors.darkPrimaryColor, size: 20), + ], + ).paddingOnly(top: 5, bottom: 5), + ], + if (!isProvider) ...[ + Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + adVM.vehicleAdDurationId.itemPrice.toText(fontSize: 22, isBold: true), + 2.width, + Padding( + padding: const EdgeInsets.only(bottom: 4), + child: "SAR".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true), + ), + ], + ), + ], ], - ], + ), ), - ), - ], - ), - ).toWhiteContainer(width: double.infinity, pading: const EdgeInsets.symmetric(horizontal: 20, vertical: 10)), - ); - }, - separatorBuilder: (BuildContext context, int index) { - return 9.height; - }, - padding: const EdgeInsets.all(20), - ); - }), - ), - if (isProvider) ...[ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - "5 of 10 ".toText(fontSize: 29, isBold: true, letterSpacing: 0, height: 1), - "Ads Remaining ".toText(fontSize: 17, color: MyColors.lightTextColor, isBold: true), - ], - ), - const Text.rich( - TextSpan( + ], + ), + ).toWhiteContainer(width: double.infinity, isBorderRequired: vehicleTypeModel.isSelected! ? true : false, pading: const EdgeInsets.symmetric(horizontal: 20, vertical: 10)), + ); + }, + separatorBuilder: (BuildContext context, int index) { + return 9.height; + }, + padding: const EdgeInsets.all(20), + ); + }), + ), + if (isProvider) ...[ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( children: [ - TextSpan( - text: "You have left with 05 out of 50 ads given in the subscription. ", - style: TextStyle( - fontSize: 14, - color: MyColors.lightTextColor, - )), - TextSpan( - text: "Update Subscription", - style: TextStyle( - decoration: TextDecoration.underline, - fontSize: 14, - fontWeight: FontWeight.w600, - color: MyColors.darkPrimaryColor, - )) + "5 of 10 ".toText(fontSize: 29, isBold: true, letterSpacing: 0, height: 1), + "Ads Remaining ".toText(fontSize: 17, color: MyColors.lightTextColor, isBold: true), ], ), - ), - 10.height, - ], - ).toContainer(paddingAll: 20, backgroundColor: Colors.white), - ] - ], + const Text.rich( + TextSpan( + children: [ + TextSpan( + text: "You have left with 05 out of 50 ads given in the subscription. ", + style: TextStyle( + fontSize: 14, + color: MyColors.lightTextColor, + )), + TextSpan( + text: "Update Subscription", + style: TextStyle( + decoration: TextDecoration.underline, + fontSize: 14, + fontWeight: FontWeight.w600, + color: MyColors.darkPrimaryColor, + )) + ], + ), + ), + 10.height, + ], + ).toContainer(paddingAll: 20, backgroundColor: Colors.white), + ] + ], + ), ), ); }