From e3a808383e72da02e142488fb62e87d3c15f48af Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Mon, 21 Jul 2025 09:16:13 +0330 Subject: [PATCH] feat : new segment logic --- .../pages/segmentation/logic.dart | 30 +++++++- .../presentation/pages/segmentation/view.dart | 75 ++++++++++++++++++- .../widget/overlay_dropdown_widget/view.dart | 11 ++- 3 files changed, 109 insertions(+), 7 deletions(-) diff --git a/packages/chicken/lib/presentation/pages/segmentation/logic.dart b/packages/chicken/lib/presentation/pages/segmentation/logic.dart index 9247a90..40dae1f 100644 --- a/packages/chicken/lib/presentation/pages/segmentation/logic.dart +++ b/packages/chicken/lib/presentation/pages/segmentation/logic.dart @@ -1,6 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:rasadyar_auth/data/utils/safe_call.dart'; +import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/segmentation_model/segmentation_model.dart'; import 'package:rasadyar_chicken/presentation/pages/root/logic.dart'; @@ -21,23 +22,27 @@ class SegmentationLogic extends GetxController { Rx fromDateFilter = Jalali.now().obs; Rx toDateFilter = Jalali.now().obs; RxnString searchedValue = RxnString(); - + RxInt saleType = 1.obs; GlobalKey formKey = GlobalKey(); TextEditingController weightController = TextEditingController(text: '0'); RxBool isSubmitButtonEnabled = false.obs; - + Rxn selectedGuildModel = Rxn(); Rxn selectedProduct = Rxn(); Rxn selectedSegment = Rxn(); Rx>> segmentationList = Resource>.loading().obs; + RxList guildsModel = [].obs; + + @override void onInit() { super.onInit(); routesName = ['قطعه‌بندی'].toList(); once(rootLogic.rolesProductsModel, (callback) => selectedProduct.value = callback.first); getAllSegmentation(); + getGuilds(); } @override @@ -187,4 +192,25 @@ class SegmentationLogic extends GetxController { ); return res; } + + + Future getGuilds() async { + safeCall( + call: () async => + await rootLogic.chickenRepository.getGuilds( + token: rootLogic.tokenService.accessToken.value!, + queryParameters: buildQueryParams( + queryParams: {'all': true}, + role: 'Steward', + ), + ), + onSuccess: (result) { + if (result != null) { + guildsModel.clear(); + guildsModel.addAll(result); + } + }, + onError: (error, stacktrace) {}, + ); + } } diff --git a/packages/chicken/lib/presentation/pages/segmentation/view.dart b/packages/chicken/lib/presentation/pages/segmentation/view.dart index 080ad23..361ec32 100644 --- a/packages/chicken/lib/presentation/pages/segmentation/view.dart +++ b/packages/chicken/lib/presentation/pages/segmentation/view.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:rasadyar_chicken/data/models/response/guild/guild_model.dart'; import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/segmentation_model/segmentation_model.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; @@ -228,7 +229,7 @@ class SegmentationPage extends GetView { Widget addOrEditBottomSheet([bool isOnEdit = false]) { return BaseBottomSheet( - height: 340.h, + height: 430.h, child: SingleChildScrollView( child: Form( key: controller.formKey, @@ -240,7 +241,53 @@ class SegmentationPage extends GetView { style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), ), _productDropDown(), + Container( + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight, width: 1), + ), + child: Column( + children: [ + const SizedBox(height: 8), + SizedBox( + height: 40, + child: ObxValue((data) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Radio( + value: 1, + groupValue: controller.saleType.value, + onChanged: (value) { + controller.saleType.value = value!; + + controller.selectedGuildModel.value = null; + controller.selectedGuildModel.refresh(); + }, + ), + Text('خودم', style: AppFonts.yekan14), + SizedBox(width: 12), + Radio( + value: 2, + groupValue: controller.saleType.value, + onChanged: (value) { + controller.saleType.value = value!; + }, + ), + Text('صنف/مباشر', style: AppFonts.yekan14), + ], + ); + }, controller.saleType), + ), + const SizedBox(height: 12), + + guildsDropDown(), + ], + ), + ), Container( padding: EdgeInsets.all(8), decoration: BoxDecoration( @@ -331,4 +378,30 @@ class SegmentationPage extends GetView { ); }); } + + Widget guildsDropDown() { + return Obx(() { + final item = controller.selectedGuildModel.value; + return OverlayDropdownWidget( + key: ValueKey(item?.user?.fullname ?? ''), + items: controller.guildsModel, + isDisabled: controller.saleType.value == 1, + onChanged: (value) { + controller.selectedGuildModel.value = value; + }, + selectedItem: item, + + itemBuilder: (item) => Text( + item.user != null + ? '${item.steward == true ? 'مباشر' : 'صنف'} ${item.user!.fullname} (${item.user!.mobile})' + : 'بدون نام', + ), + labelBuilder: (item) => Text( + item?.user != null + ? '${item?.steward == true ? 'مباشر' : 'صنف'} ${item?.user!.fullname} (${item?.user!.mobile})' + : 'انتخاب مباشر/صنف', + ), + ); + }); + } } diff --git a/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart b/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart index 345e21a..80394cc 100644 --- a/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart +++ b/packages/core/lib/presentation/widget/overlay_dropdown_widget/view.dart @@ -14,7 +14,7 @@ class OverlayDropdownWidget extends StatefulWidget { final Widget Function(T? selected) labelBuilder; final void Function(T selected)? onChanged; final EdgeInsets? contentPadding; - + final bool isDisabled; const OverlayDropdownWidget({ super.key, required this.items, @@ -27,6 +27,7 @@ class OverlayDropdownWidget extends StatefulWidget { this.height, this.background, this.hasDropIcon = true, + this.isDisabled = false, }); @override @@ -123,9 +124,11 @@ class _OverlayDropdownState extends State> { Widget build(BuildContext context) { return GestureDetector( key: _key, - onTap: () { - _isOpen.value ? _removeOverlay() : _showOverlay(); - }, + onTap: widget.isDisabled + ? null + : () { + _isOpen.value ? _removeOverlay() : _showOverlay(); + }, child: Container( height: widget.height?.toDouble() ?? 40, width: Get.width,