diff --git a/assets/icons/killogram.svg b/assets/icons/killogram.svg deleted file mode 100644 index 695689c..0000000 --- a/assets/icons/killogram.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/vec/killogram.svg.vec b/assets/vec/killogram.svg.vec deleted file mode 100644 index 72a627f..0000000 Binary files a/assets/vec/killogram.svg.vec and /dev/null differ diff --git a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart index 6efce7b..86122c3 100644 --- a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart +++ b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.dart @@ -6,7 +6,7 @@ part 'segmentation_model.g.dart'; @freezed abstract class SegmentationModel with _$SegmentationModel { - const factory SegmentationModel({String? key, Buyer? buyer, DateTime? date, int? weight}) = + const factory SegmentationModel({String? key, Buyer? buyer, DateTime? date, int? weight,String? result}) = _SegmentationModel; factory SegmentationModel.fromJson(Map json) => diff --git a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart index 74e1a86..2f106c3 100644 --- a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart +++ b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.freezed.dart @@ -16,7 +16,7 @@ T _$identity(T value) => value; /// @nodoc mixin _$SegmentationModel { - String? get key; Buyer? get buyer; DateTime? get date; int? get weight; + String? get key; Buyer? get buyer; DateTime? get date; int? get weight; String? get result; /// Create a copy of SegmentationModel /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -29,16 +29,16 @@ $SegmentationModelCopyWith get copyWith => _$SegmentationMode @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is SegmentationModel&&(identical(other.key, key) || other.key == key)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.date, date) || other.date == date)&&(identical(other.weight, weight) || other.weight == weight)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is SegmentationModel&&(identical(other.key, key) || other.key == key)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.date, date) || other.date == date)&&(identical(other.weight, weight) || other.weight == weight)&&(identical(other.result, result) || other.result == result)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,key,buyer,date,weight); +int get hashCode => Object.hash(runtimeType,key,buyer,date,weight,result); @override String toString() { - return 'SegmentationModel(key: $key, buyer: $buyer, date: $date, weight: $weight)'; + return 'SegmentationModel(key: $key, buyer: $buyer, date: $date, weight: $weight, result: $result)'; } @@ -49,7 +49,7 @@ abstract mixin class $SegmentationModelCopyWith<$Res> { factory $SegmentationModelCopyWith(SegmentationModel value, $Res Function(SegmentationModel) _then) = _$SegmentationModelCopyWithImpl; @useResult $Res call({ - String? key, Buyer? buyer, DateTime? date, int? weight + String? key, Buyer? buyer, DateTime? date, int? weight, String? result }); @@ -66,13 +66,14 @@ class _$SegmentationModelCopyWithImpl<$Res> /// Create a copy of SegmentationModel /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? buyer = freezed,Object? date = freezed,Object? weight = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? buyer = freezed,Object? date = freezed,Object? weight = freezed,Object? result = freezed,}) { return _then(_self.copyWith( key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable as String?,buyer: freezed == buyer ? _self.buyer : buyer // ignore: cast_nullable_to_non_nullable as Buyer?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable as DateTime?,weight: freezed == weight ? _self.weight : weight // ignore: cast_nullable_to_non_nullable -as int?, +as int?,result: freezed == result ? _self.result : result // ignore: cast_nullable_to_non_nullable +as String?, )); } /// Create a copy of SegmentationModel @@ -95,13 +96,14 @@ $BuyerCopyWith<$Res>? get buyer { @JsonSerializable() class _SegmentationModel implements SegmentationModel { - const _SegmentationModel({this.key, this.buyer, this.date, this.weight}); + const _SegmentationModel({this.key, this.buyer, this.date, this.weight, this.result}); factory _SegmentationModel.fromJson(Map json) => _$SegmentationModelFromJson(json); @override final String? key; @override final Buyer? buyer; @override final DateTime? date; @override final int? weight; +@override final String? result; /// Create a copy of SegmentationModel /// with the given fields replaced by the non-null parameter values. @@ -116,16 +118,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _SegmentationModel&&(identical(other.key, key) || other.key == key)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.date, date) || other.date == date)&&(identical(other.weight, weight) || other.weight == weight)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _SegmentationModel&&(identical(other.key, key) || other.key == key)&&(identical(other.buyer, buyer) || other.buyer == buyer)&&(identical(other.date, date) || other.date == date)&&(identical(other.weight, weight) || other.weight == weight)&&(identical(other.result, result) || other.result == result)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,key,buyer,date,weight); +int get hashCode => Object.hash(runtimeType,key,buyer,date,weight,result); @override String toString() { - return 'SegmentationModel(key: $key, buyer: $buyer, date: $date, weight: $weight)'; + return 'SegmentationModel(key: $key, buyer: $buyer, date: $date, weight: $weight, result: $result)'; } @@ -136,7 +138,7 @@ abstract mixin class _$SegmentationModelCopyWith<$Res> implements $SegmentationM factory _$SegmentationModelCopyWith(_SegmentationModel value, $Res Function(_SegmentationModel) _then) = __$SegmentationModelCopyWithImpl; @override @useResult $Res call({ - String? key, Buyer? buyer, DateTime? date, int? weight + String? key, Buyer? buyer, DateTime? date, int? weight, String? result }); @@ -153,13 +155,14 @@ class __$SegmentationModelCopyWithImpl<$Res> /// Create a copy of SegmentationModel /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? buyer = freezed,Object? date = freezed,Object? weight = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? buyer = freezed,Object? date = freezed,Object? weight = freezed,Object? result = freezed,}) { return _then(_SegmentationModel( key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable as String?,buyer: freezed == buyer ? _self.buyer : buyer // ignore: cast_nullable_to_non_nullable as Buyer?,date: freezed == date ? _self.date : date // ignore: cast_nullable_to_non_nullable as DateTime?,weight: freezed == weight ? _self.weight : weight // ignore: cast_nullable_to_non_nullable -as int?, +as int?,result: freezed == result ? _self.result : result // ignore: cast_nullable_to_non_nullable +as String?, )); } diff --git a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart index 82835b2..d10cb35 100644 --- a/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart +++ b/packages/chicken/lib/data/models/response/segmentation_model/segmentation_model.g.dart @@ -16,6 +16,7 @@ _SegmentationModel _$SegmentationModelFromJson(Map json) => ? null : DateTime.parse(json['date'] as String), weight: (json['weight'] as num?)?.toInt(), + result: json['result'] as String?, ); Map _$SegmentationModelToJson(_SegmentationModel instance) => @@ -24,6 +25,7 @@ Map _$SegmentationModelToJson(_SegmentationModel instance) => 'buyer': instance.buyer, 'date': instance.date?.toIso8601String(), 'weight': instance.weight, + 'result': instance.result, }; _Buyer _$BuyerFromJson(Map json) => _Buyer( diff --git a/packages/chicken/lib/data/repositories/chicken_repository.dart b/packages/chicken/lib/data/repositories/chicken_repository.dart index 35697da..fe9d23d 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository.dart @@ -152,5 +152,5 @@ abstract class ChickenRepository { Future editSegmentation({required String token, required SegmentationModel model}); - Future deleteSegmentation({required String token, required String key}); + Future deleteSegmentation({required String token, required String key}); } diff --git a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart index 42d6c75..a0c19c9 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart @@ -469,11 +469,14 @@ class ChickenRepositoryImpl implements ChickenRepository { } @override - Future deleteSegmentation({required String token, required String key}) async { - await _httpClient.delete( + Future deleteSegmentation({required String token, required String key}) async { + var res = await _httpClient.delete( '/app-segmentation/0/', queryParameters: {'key': key}, headers: {'Authorization': 'Bearer $token'}, + fromJson: (json) => SegmentationModel.fromJson(json), ); + + return res.data; } } diff --git a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart index d7a2881..41f7b84 100644 --- a/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart +++ b/packages/chicken/lib/presentation/pages/buy_out_of_province/view.dart @@ -31,7 +31,7 @@ class BuyOutOfProvincePage extends GetView { return RPaginatedListView( listType: ListType.separated, resource: data.value, - hasMore:data.value.data?.next!=null , + hasMore: data.value.data?.next != null, padding: EdgeInsets.fromLTRB(8, 8, 8, 80), itemBuilder: (context, index) { var item = data.value.data!.results![index]; @@ -356,17 +356,10 @@ class BuyOutOfProvincePage extends GetView { }, ), - RTextField( + UnitTextField( controller: controller.carcassWeightController, - label: 'وزن', - filled: true, - suffixIcon: Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: Assets.vec.killogramSvg.svg(), - ), - filledColor: AppColor.bgLight, - keyboardType: TextInputType.number, - borderColor: AppColor.darkGreyLight, + hint: 'وزن', + unit: 'کیلوگرم', inputFormatters: [ FilteringTextInputFormatter.digitsOnly, SeparatorInputFormatter(), @@ -589,10 +582,8 @@ class BuyOutOfProvincePage extends GetView { }, height: 40, ), - ], ), ); } - } diff --git a/packages/chicken/lib/presentation/pages/segmentation/logic.dart b/packages/chicken/lib/presentation/pages/segmentation/logic.dart index 250bfae..5d11df4 100644 --- a/packages/chicken/lib/presentation/pages/segmentation/logic.dart +++ b/packages/chicken/lib/presentation/pages/segmentation/logic.dart @@ -1,4 +1,5 @@ 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/roles_products/roles_products.dart'; import 'package:rasadyar_chicken/data/models/response/segmentation_model/segmentation_model.dart'; @@ -75,10 +76,8 @@ class SegmentationLogic extends GetxController { void clearForm() { weightController.text = '0'; - isSubmitButtonEnabled.value = false; - selectedProduct.value = null; selectedSegment.value = null; - formKey.currentState?.reset(); + } void validateForm() { @@ -142,6 +141,7 @@ class SegmentationLogic extends GetxController { Future deleteSegmentation(String key) async { await safeCall( + showError: true, call: () => rootLogic.chickenRepository.deleteSegmentation( token: rootLogic.tokenService.accessToken.value!, key: key, @@ -152,6 +152,7 @@ class SegmentationLogic extends GetxController { Future editSegment() async { var res = true; safeCall( + showError: true, call: () async => await rootLogic.chickenRepository.editSegmentation( token: rootLogic.tokenService.accessToken.value!, model: SegmentationModel( diff --git a/packages/chicken/lib/presentation/pages/segmentation/view.dart b/packages/chicken/lib/presentation/pages/segmentation/view.dart index 2cf5101..c0cf686 100644 --- a/packages/chicken/lib/presentation/pages/segmentation/view.dart +++ b/packages/chicken/lib/presentation/pages/segmentation/view.dart @@ -17,7 +17,7 @@ class SegmentationPage extends GetView { routes: controller.routesName, onSearchChanged: (data) => controller.setSearchValue(data), filteringWidget: filterBottomSheet(), - isBase: true, + hasBack: false, widgets: [ Expanded( child: ObxValue((data) { @@ -41,7 +41,8 @@ class SegmentationPage extends GetView { child: itemListWidget(item), secondChild: itemListExpandedWidget(item, index), labelColor: AppColor.blueLight, - labelIcon: Assets.vec.timerSvg.path, + labelIconColor: AppColor.customGrey, + labelIcon: Assets.vec.convertCubeSvg.path, ); }, controller.isExpandedList); }, @@ -51,11 +52,10 @@ class SegmentationPage extends GetView { }, controller.segmentationList), ), ], - + floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, floatingActionButton: RFab.add( onPressed: () { - //TODO - //Get.bottomSheet(addOrEditSaleBottomSheet(), isScrollControlled: true); + Get.bottomSheet(addOrEditBottomSheet(), isScrollControlled: true); }, ), ); @@ -221,7 +221,7 @@ class SegmentationPage extends GetView { Widget addOrEditBottomSheet([bool isOnEdit = false]) { return BaseBottomSheet( - height: 500.h, + height: 300.h, child: SingleChildScrollView( child: Form( key: controller.formKey, @@ -244,18 +244,14 @@ class SegmentationPage extends GetView { child: Column( spacing: 12, children: [ - RTextField( + UnitTextField( + hint: 'وزن', + unit: 'کیلوگرم', controller: controller.weightController, - label: 'وزن', - keyboardType: TextInputType.number, - borderColor: AppColor.darkGreyLight, - filledColor: AppColor.bgLight, - filled: true, inputFormatters: [ FilteringTextInputFormatter.digitsOnly, SeparatorInputFormatter(), ], - validator: (value) { if (value == null) { return 'لطفاً وزن لاشه را وارد کنید'; @@ -295,13 +291,13 @@ class SegmentationPage extends GetView { : null, height: 40, ); - }, controller.isSaleSubmitButtonEnabled); + }, controller.isSubmitButtonEnabled); } Widget _productDropDown() { return Obx(() { return OverlayDropdownWidget( - items: controller.rolesProductsModel, + items: controller.rootLogic.rolesProductsModel, height: 56, hasDropIcon: false, background: Colors.white, @@ -321,7 +317,7 @@ class SegmentationPage extends GetView { Text(item?.name ?? 'انتخاب محصول'), Spacer(), Text( - 'موجودی:${controller.rootLogic.inventoryModel.value?.totalRemainWeight.separatedByComma ?? 0}', + 'موجودی: ${controller.rootLogic.inventoryModel.value?.totalRemainWeight.separatedByComma ?? 0} کیلوگرم', ), ], ), diff --git a/packages/chicken/lib/presentation/widget/list_item/list_item.dart b/packages/chicken/lib/presentation/widget/list_item/list_item.dart index 9b54657..fd65df6 100644 --- a/packages/chicken/lib/presentation/widget/list_item/list_item.dart +++ b/packages/chicken/lib/presentation/widget/list_item/list_item.dart @@ -193,7 +193,10 @@ class ListItem2 extends StatelessWidget { width: 16.w, height: 16.h, //TODO - colorFilter: ColorFilter.mode(labelIconColor ?? AppColor.mediumGreyDarkActive, BlendMode.srcIn), + colorFilter: ColorFilter.mode( + labelIconColor ?? AppColor.mediumGreyDarkActive, + BlendMode.srcIn, + ), ), ), ), diff --git a/packages/core/lib/infrastructure/remote/dio_remote.dart b/packages/core/lib/infrastructure/remote/dio_remote.dart index 96ba77a..c5160ab 100644 --- a/packages/core/lib/infrastructure/remote/dio_remote.dart +++ b/packages/core/lib/infrastructure/remote/dio_remote.dart @@ -6,7 +6,6 @@ class DioRemote implements IHttpClient { late Dio dio; final AppInterceptor interceptors; - DioRemote({this.baseUrl, required this.interceptors}); @override @@ -90,6 +89,7 @@ class DioRemote implements IHttpClient { Map? headers, ProgressCallback? onSendProgress, ProgressCallback? onReceiveProgress, + T Function(Map json)? fromJson, }) async { final response = await dio.put( path, @@ -100,6 +100,11 @@ class DioRemote implements IHttpClient { onReceiveProgress: onReceiveProgress, cancelToken: ApiHandler.globalCancelToken, ); + + if (fromJson != null && response.data is Map) { + response.data = fromJson(response.data); + return DioResponse(response); + } return DioResponse(response); } @@ -109,6 +114,7 @@ class DioRemote implements IHttpClient { dynamic data, Map? queryParameters, Map? headers, + T Function(Map json)? fromJson, }) async { final response = await dio.delete( path, diff --git a/packages/core/lib/presentation/common/app_color.dart b/packages/core/lib/presentation/common/app_color.dart index c309e7e..0b589f9 100644 --- a/packages/core/lib/presentation/common/app_color.dart +++ b/packages/core/lib/presentation/common/app_color.dart @@ -149,6 +149,7 @@ class AppColor { static const Color mediumGreyDarker = Color( 0xFF323232, ); // #323232 rgb(50, 50, 50) + static const Color customGrey = Color(0xFF808081); // #808081 rgb(128, 128, 129) //endregion //region ---Light Grey Colors --- diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index 07d012e..59e9001 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -143,9 +143,6 @@ class $AssetsIconsGen { /// File path: assets/icons/key.svg SvgGenImage get key => const SvgGenImage('assets/icons/key.svg'); - /// File path: assets/icons/killogram.svg - SvgGenImage get killogram => const SvgGenImage('assets/icons/killogram.svg'); - /// File path: assets/icons/liveStock.svg SvgGenImage get liveStock => const SvgGenImage('assets/icons/liveStock.svg'); @@ -285,7 +282,6 @@ class $AssetsIconsGen { inside, inspection, key, - killogram, liveStock, lock, logout, @@ -468,9 +464,6 @@ class $AssetsVecGen { /// File path: assets/vec/key.svg.vec SvgGenImage get keySvg => const SvgGenImage.vec('assets/vec/key.svg.vec'); - /// File path: assets/vec/killogram.svg.vec - SvgGenImage get killogramSvg => const SvgGenImage.vec('assets/vec/killogram.svg.vec'); - /// File path: assets/vec/liveStock.svg.vec SvgGenImage get liveStockSvg => const SvgGenImage.vec('assets/vec/liveStock.svg.vec'); @@ -610,7 +603,6 @@ class $AssetsVecGen { insideSvg, inspectionSvg, keySvg, - killogramSvg, liveStockSvg, lockSvg, logoutSvg, diff --git a/packages/core/lib/utils/network/safe_call_utils.dart b/packages/core/lib/utils/network/safe_call_utils.dart index 19e354a..c0005a3 100644 --- a/packages/core/lib/utils/network/safe_call_utils.dart +++ b/packages/core/lib/utils/network/safe_call_utils.dart @@ -110,6 +110,11 @@ bool _isRetryableError(dynamic error) { String _getErrorMessage(dynamic error) { if (error is DioException) { + final responseData = error.response?.data; + if (responseData is Map && responseData['result'] != null) { + return responseData['result'].toString(); + } + switch (error.type) { case DioExceptionType.connectionTimeout: return 'خطا در اتصال - زمان اتصال تمام شد';