From 0b493024340c9ec5c3d4bce27e142e04f449cba0 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sat, 27 Dec 2025 16:35:37 +0330 Subject: [PATCH] chore: remove unused assets and data source files related to the kill house module, and update import paths for better organization --- assets/icons/bg_auth_dam.svg | 57 -- assets/icons/dam_pattern.svg | 68 -- assets/icons/pattern_dam.svg | 1 + assets/vec/bg_auth_dam.svg.vec | Bin 640 -> 0 bytes assets/vec/dam_pattern.svg.vec | Bin 632 -> 0 bytes assets/vec/pattern_dam.svg.vec | Bin 0 -> 80886 bytes packages/chicken/lib/data/di/chicken_di.dart | 13 +- .../lib/features/common/auth/logic.dart | 244 ----- .../lib/features/common/auth/view.dart | 394 -------- .../lib/features/common/profile/logic.dart | 257 ----- .../lib/features/common/profile/view.dart | 902 ------------------ .../lib/features/common/role/logic.dart | 18 - .../lib/features/common/role/view.dart | 79 -- .../remote/kill_house/kill_house_remote.dart | 10 +- .../kill_house/kill_house_remote_impl.dart | 12 +- .../request/kill_request_response.dart | 0 .../kill_request_response.freezed.dart | 0 .../request/kill_request_response.g.dart | 0 .../chicken_commission_prices.dart | 0 .../chicken_commission_prices.freezed.dart | 0 .../chicken_commission_prices.g.dart | 0 .../kill_house/kill_house_response.dart | 0 .../kill_house_response.freezed.dart | 0 .../kill_house/kill_house_response.g.dart | 0 .../kill_request_list/kill_request_list.dart | 0 .../kill_request_list.freezed.dart | 0 .../kill_request_list.g.dart | 0 .../kill_house_bars_response.dart | 0 .../kill_house_bars_response.freezed.dart | 0 .../kill_house_bars_response.g.dart | 0 .../kill_house_sales_info_dashboard.dart | 0 ...ll_house_sales_info_dashboard.freezed.dart | 0 .../kill_house_sales_info_dashboard.g.dart | 0 .../repository}/kill_house_repository.dart | 12 +- .../kill_house_repository_impl.dart | 14 +- .../lib/features/kill_house/root/logic.dart | 2 +- .../kill_house/submit_request/logic.dart | 8 +- .../kill_house/submit_request/view.dart | 2 +- .../buy_in_province_entered/logic.dart | 2 +- .../buy_in_province_entered/view.dart | 2 +- .../buy_in_province_waiting/logic.dart | 2 +- .../buy_in_province_waiting/view.dart | 2 +- .../root/logic.dart | 6 +- .../submit_inspection_response_schema.json | 1 - .../card_info.dart | 2 +- .../step1_page.dart | 1 - .../remote/vet_farm_remote_data_source.dart | 2 + .../vet_farm_remote_data_source_impl.dart | 16 + .../repositories/vet_farm_repository.dart | 3 + .../vet_farm_repository_impl.dart | 4 + .../presentation/pages/home/logic.dart | 5 + .../presentation/pages/new_page/logic.dart | 46 + .../presentation/pages/new_page/view.dart | 44 + .../vet_farm/presentation/routes/pages.dart | 15 + .../vet_farm/presentation/routes/routes.dart | 1 + .../widget/sdui/form/sdui_form_widget.dart | 0 .../form/sdui_form_widget_controller.dart | 0 .../lib/presentation/widget/sdui/sdui.json | 13 + .../card_label_item/card_label_item_sdui.dart | 60 ++ .../model/card_label_item_sdui_model.dart | 29 + .../card_label_item_sdui_model.freezed.dart | 587 ++++++++++++ .../model/card_label_item_sdui_model.g.dart | 39 + .../sdui/widgets/card_label_item/sdui.json | 13 + .../model/text_form_field_sdui_model.dart | 29 + .../text_form_field_sdui_model.freezed.dart | 322 +++++++ .../model/text_form_field_sdui_model.g.dart | 49 + .../sdui/widgets/text_form_filed/sdui.txt | 28 + .../text_form_filed/text_form_filed_sdui.dart | 39 + .../lib/presentation/common/assets.gen.dart | 24 +- .../auth/presentation/pages/view.dart | 2 +- 70 files changed, 1393 insertions(+), 2088 deletions(-) delete mode 100644 assets/icons/bg_auth_dam.svg delete mode 100644 assets/icons/dam_pattern.svg create mode 100644 assets/icons/pattern_dam.svg delete mode 100644 assets/vec/bg_auth_dam.svg.vec delete mode 100644 assets/vec/dam_pattern.svg.vec create mode 100644 assets/vec/pattern_dam.svg.vec delete mode 100644 packages/chicken/lib/features/common/auth/logic.dart delete mode 100644 packages/chicken/lib/features/common/auth/view.dart delete mode 100644 packages/chicken/lib/features/common/profile/logic.dart delete mode 100644 packages/chicken/lib/features/common/profile/view.dart delete mode 100644 packages/chicken/lib/features/common/role/logic.dart delete mode 100644 packages/chicken/lib/features/common/role/view.dart rename packages/chicken/lib/{ => features/kill_house}/data/data_source/remote/kill_house/kill_house_remote.dart (60%) rename packages/chicken/lib/{ => features/kill_house}/data/data_source/remote/kill_house/kill_house_remote_impl.dart (79%) rename packages/chicken/lib/{data/models/kill_house_module => features/kill_house/data/model}/register_request/request/kill_request_response.dart (100%) rename packages/chicken/lib/{data/models/kill_house_module => features/kill_house/data/model}/register_request/request/kill_request_response.freezed.dart (100%) rename packages/chicken/lib/{data/models/kill_house_module => features/kill_house/data/model}/register_request/request/kill_request_response.g.dart (100%) rename packages/chicken/lib/{data/models/kill_house_module => features/kill_house/data/model}/register_request/response/chicken_commission_prices/chicken_commission_prices.dart (100%) rename packages/chicken/lib/{data/models/kill_house_module => features/kill_house/data/model}/register_request/response/chicken_commission_prices/chicken_commission_prices.freezed.dart (100%) rename packages/chicken/lib/{data/models/kill_house_module => features/kill_house/data/model}/register_request/response/chicken_commission_prices/chicken_commission_prices.g.dart (100%) rename packages/chicken/lib/{data/models/kill_house_module => features/kill_house/data/model}/register_request/response/kill_house/kill_house_response.dart (100%) rename packages/chicken/lib/{data/models/kill_house_module => features/kill_house/data/model}/register_request/response/kill_house/kill_house_response.freezed.dart (100%) rename packages/chicken/lib/{data/models/kill_house_module => features/kill_house/data/model}/register_request/response/kill_house/kill_house_response.g.dart (100%) rename packages/chicken/lib/{data/models/kill_house_module => features/kill_house/data/model}/register_request/response/kill_request_list/kill_request_list.dart (100%) rename packages/chicken/lib/{data/models/kill_house_module => features/kill_house/data/model}/register_request/response/kill_request_list/kill_request_list.freezed.dart (100%) rename packages/chicken/lib/{data/models/kill_house_module => features/kill_house/data/model}/register_request/response/kill_request_list/kill_request_list.g.dart (100%) rename packages/chicken/lib/{data/models/kill_house_module => features/kill_house/data/model}/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.dart (100%) rename packages/chicken/lib/{data/models/kill_house_module => features/kill_house/data/model}/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.freezed.dart (100%) rename packages/chicken/lib/{data/models/kill_house_module => features/kill_house/data/model}/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.g.dart (100%) rename packages/chicken/lib/{data/models/kill_house_module => features/kill_house/data/model}/warehouse_and_distribution/response/kill_house_sales_info_dashboard/kill_house_sales_info_dashboard.dart (100%) rename packages/chicken/lib/{data/models/kill_house_module => features/kill_house/data/model}/warehouse_and_distribution/response/kill_house_sales_info_dashboard/kill_house_sales_info_dashboard.freezed.dart (100%) rename packages/chicken/lib/{data/models/kill_house_module => features/kill_house/data/model}/warehouse_and_distribution/response/kill_house_sales_info_dashboard/kill_house_sales_info_dashboard.g.dart (100%) rename packages/chicken/lib/{data/repositories/kill_house => features/kill_house/data/repository}/kill_house_repository.dart (57%) rename packages/chicken/lib/{data/repositories/kill_house => features/kill_house/data/repository}/kill_house_repository_impl.dart (70%) create mode 100644 packages/chicken/lib/features/vet_farm/presentation/pages/new_page/logic.dart create mode 100644 packages/chicken/lib/features/vet_farm/presentation/pages/new_page/view.dart create mode 100644 packages/chicken/lib/presentation/widget/sdui/form/sdui_form_widget.dart create mode 100644 packages/chicken/lib/presentation/widget/sdui/form/sdui_form_widget_controller.dart create mode 100644 packages/chicken/lib/presentation/widget/sdui/sdui.json create mode 100644 packages/chicken/lib/presentation/widget/sdui/widgets/card_label_item/card_label_item_sdui.dart create mode 100644 packages/chicken/lib/presentation/widget/sdui/widgets/card_label_item/model/card_label_item_sdui_model.dart create mode 100644 packages/chicken/lib/presentation/widget/sdui/widgets/card_label_item/model/card_label_item_sdui_model.freezed.dart create mode 100644 packages/chicken/lib/presentation/widget/sdui/widgets/card_label_item/model/card_label_item_sdui_model.g.dart create mode 100644 packages/chicken/lib/presentation/widget/sdui/widgets/card_label_item/sdui.json create mode 100644 packages/chicken/lib/presentation/widget/sdui/widgets/text_form_filed/model/text_form_field_sdui_model.dart create mode 100644 packages/chicken/lib/presentation/widget/sdui/widgets/text_form_filed/model/text_form_field_sdui_model.freezed.dart create mode 100644 packages/chicken/lib/presentation/widget/sdui/widgets/text_form_filed/model/text_form_field_sdui_model.g.dart create mode 100644 packages/chicken/lib/presentation/widget/sdui/widgets/text_form_filed/sdui.txt create mode 100644 packages/chicken/lib/presentation/widget/sdui/widgets/text_form_filed/text_form_filed_sdui.dart diff --git a/assets/icons/bg_auth_dam.svg b/assets/icons/bg_auth_dam.svg deleted file mode 100644 index 8e609c2..0000000 --- a/assets/icons/bg_auth_dam.svg +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/icons/dam_pattern.svg b/assets/icons/dam_pattern.svg deleted file mode 100644 index 8f7ca71..0000000 --- a/assets/icons/dam_pattern.svg +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/icons/pattern_dam.svg b/assets/icons/pattern_dam.svg new file mode 100644 index 0000000..6e273a6 --- /dev/null +++ b/assets/icons/pattern_dam.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/vec/bg_auth_dam.svg.vec b/assets/vec/bg_auth_dam.svg.vec deleted file mode 100644 index fcfe36bc36b20258b560212e5f9de7bf11eff162..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 640 zcmYe&?Okcn*%AT~*nTdg+r>EyX2mqN-&|uG? z&d9(XeaNv?@&Cc3e_NfIzgf6|s;lr&bh(%q4T<_ zGo3w`-gJID+r{~G%u(mKs%cKub8mp%2(nk2k%@sFWI50)Kv#)?m>@GvH}itcgzyoh zBDUEN#x`Qd)f9 zd0BKW(7m&qn;EVg*FX-$|NkFGF#;nH P$YTP=9*|;YUkcn*%AT~*nTdg+r>EyX2mqN-&|uG? z&d9(XeaNv?@&Cc3e_NfIzgf6|{k0Teos z?nl9))Z=@?`Tl`qm%V1EokR4KfcnlkOZFsy={%ml&J92JJE!%&b*}PQ=iFfX(0Sd| zna-X|Z#uu7?c#ho=BRUA)ikH-xi`RW1lcRi$i%=7vK;6YpsPecOpuwTn|Z-zLih+$ zkzLMZ-nMBDleWsa*jY+Au8xs+*)cWEQR|Pqi-QfH^FuoWmrblwo#*UP2kQr!BhARn zzy>k`Xaf_o7~HTsOPzsg7#PlmH#^x#A9Z?~804h9-_7~y@A*zK`#YR#?~6KLG&<)T zaJSp}VAfgZUwwa_n;F`jiwjg-va6k)x#KKc{+v4K#PH4uY!1jg138e1|Np}%MqtDN Pc}&1q15(Tk%s>hNoCUh% diff --git a/assets/vec/pattern_dam.svg.vec b/assets/vec/pattern_dam.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..b8e15ee2114f83b73fa3ad71c7a7fdecf96f5f7f GIT binary patch literal 80886 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 z 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 literal 0 HcmV?d00001 diff --git a/packages/chicken/lib/data/di/chicken_di.dart b/packages/chicken/lib/data/di/chicken_di.dart index 483852e..7877e69 100644 --- a/packages/chicken/lib/data/di/chicken_di.dart +++ b/packages/chicken/lib/data/di/chicken_di.dart @@ -1,10 +1,6 @@ import 'package:rasadyar_chicken/data/common/dio_error_handler.dart'; import 'package:rasadyar_chicken/features/common/presentation/routes/routes.dart'; import 'package:rasadyar_chicken/features/common/data/di/common_di.dart'; -import 'package:rasadyar_chicken/data/data_source/remote/kill_house/kill_house_remote.dart'; -import 'package:rasadyar_chicken/data/data_source/remote/kill_house/kill_house_remote_impl.dart'; -import 'package:rasadyar_chicken/data/repositories/kill_house/kill_house_repository.dart'; -import 'package:rasadyar_chicken/data/repositories/kill_house/kill_house_repository_impl.dart'; import 'package:rasadyar_chicken/features/poultry_science/data/di/poultry_science_di.dart'; import 'package:rasadyar_chicken/features/steward/data/di/steward_di.dart'; import 'package:rasadyar_chicken/features/province_operator/data/di/province_operator_di.dart'; @@ -86,14 +82,7 @@ Future setupChickenDI() async { // Setup jahad feature DI await setupJahadDI(diChicken, dioRemote); - //region kill house module DI - diChicken.registerLazySingleton( - () => KillHouseRemoteDataSourceImpl(diChicken.get()), - ); - diChicken.registerLazySingleton( - () => KillHouseRepositoryImpl(diChicken.get()), - ); - //endregion + } Future newSetupAuthDI(String newUrl) async { diff --git a/packages/chicken/lib/features/common/auth/logic.dart b/packages/chicken/lib/features/common/auth/logic.dart deleted file mode 100644 index fa74d23..0000000 --- a/packages/chicken/lib/features/common/auth/logic.dart +++ /dev/null @@ -1,244 +0,0 @@ -import 'dart:async'; -import 'dart:io'; - -import 'package:flutter/material.dart'; -import 'package:rasadyar_chicken/data/common/dio_error_handler.dart'; -import 'package:rasadyar_chicken/data/di/chicken_di.dart'; -import 'package:rasadyar_chicken/features/common/data/model/response/user_info/user_info_model.dart'; -import 'package:rasadyar_chicken/features/common/data/model/response/user_profile_model/user_profile_model.dart'; -import 'package:rasadyar_chicken/features/common/data/repositories/auth/auth_repository.dart'; -import 'package:rasadyar_chicken/features/common/presentation/routes/routes.dart'; -import 'package:rasadyar_chicken/features/steward/presentation/routes/routes.dart'; -import 'package:rasadyar_chicken/presentation/widget/captcha/logic.dart'; -import 'package:rasadyar_core/core.dart'; - -enum AuthType { useAndPass, otp } - -enum AuthStatus { init } - -enum OtpStatus { init, sent, verified, reSend } - -class AuthLogic extends GetxController with GetTickerProviderStateMixin { - GlobalKey formKey = GlobalKey(); - late AnimationController _textAnimationController; - late Animation textAnimation; - RxBool showCard = false.obs; - RxBool rememberMe = false.obs; - - Rx> formKeyOtp = GlobalKey().obs; - Rx> formKeySentOtp = GlobalKey().obs; - Rx usernameController = TextEditingController().obs; - Rx passwordController = TextEditingController().obs; - Rx phoneOtpNumberController = - TextEditingController().obs; - Rx otpCodeController = TextEditingController().obs; - - var captchaController = Get.find(); - - RxnString phoneNumber = RxnString(null); - RxBool isLoading = false.obs; - RxBool isDisabled = true.obs; - - GService gService = Get.find(); - TokenStorageService tokenStorageService = Get.find(); - - Rx authType = AuthType.useAndPass.obs; - Rx authStatus = AuthStatus.init.obs; - Rx otpStatus = OtpStatus.init.obs; - RxnString deviceName = RxnString(null); - - RxInt secondsRemaining = 120.obs; - Timer? _timer; - - AuthRepository authRepository = diChicken.get(); - - final Module _module = Get.arguments; - - @override - void onInit() { - super.onInit(); - _textAnimationController = - AnimationController( - vsync: this, - duration: const Duration(milliseconds: 1200), - ) - ..repeat(reverse: true, count: 2).whenComplete(() { - showCard.value = true; - }); - - textAnimation = CurvedAnimation( - parent: _textAnimationController, - curve: Curves.easeInOut, - ); - - initUserPassData(); - getDeviceModel(); - } - - @override - void onClose() { - _textAnimationController.dispose(); - _timer?.cancel(); - super.onClose(); - } - - void startTimer() { - _timer?.cancel(); - secondsRemaining.value = 120; - - _timer = Timer.periodic(const Duration(seconds: 1), (timer) { - if (secondsRemaining.value > 0) { - secondsRemaining.value--; - } else { - timer.cancel(); - } - }); - } - - void stopTimer() { - _timer?.cancel(); - } - - String get timeFormatted { - final minutes = secondsRemaining.value ~/ 60; - final seconds = secondsRemaining.value % 60; - return '${minutes.toString().padLeft(2, '0')}:${seconds.toString().padLeft(2, '0')}'; - } - - bool _isFormValid() { - final isCaptchaValid = - captchaController.formKey.currentState?.validate() ?? false; - final isFormValid = formKey.currentState?.validate() ?? false; - return isCaptchaValid && isFormValid; - } - - Future submitLoginForm() async { - if (!_isFormValid()) return; - AuthRepository authTmp = diChicken.get(); - isLoading.value = true; - await safeCall( - call: () => authTmp.login( - authRequest: { - "username": usernameController.value.text, - "password": passwordController.value.text, - }, - ), - onSuccess: (result) async { - await gService.saveSelectedModule(_module); - await tokenStorageService.saveModule(_module); - await tokenStorageService.saveAccessToken( - _module, - result?.accessToken ?? '', - ); - await tokenStorageService.saveRefreshToken( - _module, - result?.accessToken ?? '', - ); - var tmpRoles = result?.role?.where((element) { - final allowedRoles = { - 'poultryscience', - 'steward', - 'killhouse', - 'provinceinspector', - 'cityjahad', - 'jahad', - 'vetfarm', - 'provincesupervisor', - 'superadmin', - }; - - final lowerElement = element.toString().toLowerCase().trim(); - return allowedRoles.contains(lowerElement); - }).toList(); - if (tmpRoles?.length==1) { - await tokenStorageService.saveRoles(_module, tmpRoles ?? []); - } - - await tokenStorageService.saveRoles(_module, tmpRoles ?? []); - if (rememberMe.value) { - await tokenStorageService.saveUserPass( - _module, - usernameController.value.text, - passwordController.value.text, - ); - } - - authTmp.stewardAppLogin( - token: result?.accessToken ?? '', - queryParameters: { - "mobile": usernameController.value.text, - "device_name": deviceName.value, - }, - ); - - - Get.offAndToNamed(CommonRoutes.role); - - -/* if (tmpRoles!.length > 1) { - Get.offAndToNamed(CommonRoutes.role); - } else { - Get.offAllNamed(StewardRoutes.initSteward); - } */ - }, - onError: (error, stackTrace) { - if (error is DioException) { - diChicken.get().handle(error); - if ((error.type == DioExceptionType.unknown) || - (error.type == DioExceptionType.connectionError)) { - getUserInfo(usernameController.value.text); - } - } - captchaController.getCaptcha(); - }, - ); - isLoading.value = false; - } - - Future getUserInfo(String value) async { - isLoading.value = true; - await safeCall( - call: () async => await authRepository.getUserInfo(value), - onSuccess: (result) async { - if (result != null) { - await newSetupAuthDI(result.backend ?? ''); - await diChicken.allReady(); - } - }, - onError: (error, stackTrace) { - if (error is DioException) { - diChicken.get().handle(error); - } - captchaController.getCaptcha(); - }, - ); - isLoading.value = false; - } - - void initUserPassData() { - UserLocalModel? userLocalModel = tokenStorageService.getUserLocal( - Module.chicken, - ); - if (userLocalModel?.username != null && userLocalModel?.password != null) { - usernameController.value.text = userLocalModel?.username ?? ''; - passwordController.value.text = userLocalModel?.password ?? ''; - rememberMe.value = true; - } - } - - Future getDeviceModel() async { - final deviceInfo = DeviceInfoPlugin(); - - if (Platform.isAndroid) { - final info = await deviceInfo.androidInfo; - - deviceName.value = - 'Device:${info.manufacturer} Model:${info.model} version ${info.version.release}'; - } else if (Platform.isIOS) { - final info = await deviceInfo.iosInfo; - - deviceName.value = - 'Device:${info.utsname.machine} Model:${info.model} version ${info.systemVersion}'; - } else {} - } -} diff --git a/packages/chicken/lib/features/common/auth/view.dart b/packages/chicken/lib/features/common/auth/view.dart deleted file mode 100644 index 8e52e08..0000000 --- a/packages/chicken/lib/features/common/auth/view.dart +++ /dev/null @@ -1,394 +0,0 @@ -import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart'; -import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; -import 'package:rasadyar_chicken/presentation/widget/captcha/view.dart'; -import 'package:rasadyar_core/core.dart'; - -import 'logic.dart'; - -class AuthPage extends GetView { - const AuthPage({super.key}); - - @override - Widget build(BuildContext context) { - return ChickenBasePage( - isFullScreen: true, - backGroundWidget: backGroundDecoration( - gradient: LinearGradient( - begin: Alignment.topRight, - end: Alignment.bottomLeft, - colors: [ - const Color(0xFFB2C9FF).withValues(alpha: 1.0), // 0% - const Color(0xFF40BB93).withValues(alpha: 0.11), // 50% - const Color(0xFF93B6D3).withValues(alpha: 1.0), // 100% - ], - stops: const [0.0, 0.5, 1.0], - ), - backgroundPath: Assets.images.patternChicken.path, - ), - onPopScopTaped: () => Get.back(result: -1), - child: Stack( - children: [ - Center( - child: Padding( - padding: EdgeInsets.symmetric(horizontal: 10.r), - child: FadeTransition( - opacity: controller.textAnimation, - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - spacing: 12, - children: [ - Text( - 'به سامانه رصدطیور خوش آمدید!', - textAlign: TextAlign.right, - style: AppFonts.yekan25Bold.copyWith( - color: AppColor.darkGreyDarkActive, - ), - ), - Text( - 'سامانه رصد و پایش زنجیره تامین، تولید و توزیع کالا های اساسی', - textAlign: TextAlign.center, - style: AppFonts.yekan16.copyWith( - color: AppColor.darkGreyDarkActive, - ), - ), - ], - ), - ), - ), - ), - - Obx(() { - final screenHeight = MediaQuery.of(context).size.height; - final targetTop = (screenHeight - 676) / 2; - - return AnimatedPositioned( - duration: const Duration(milliseconds: 1200), - curve: Curves.linear, - top: controller.showCard.value ? targetTop : screenHeight, - left: 10.r, - right: 10.r, - child: Container( - width: 381.w, - height: 676.h, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(40), - ), - child: Column( - children: [ - SizedBox(height: 50.h), - LogoWidget( - vecPath: Assets.vec.rasadToyorSvg.path, - width: 85.w, - height: 85.h, - titleStyle: AppFonts.yekan20Bold.copyWith( - color: Color(0xFF4665AF), - ), - title: 'رصدطیور', - ), - SizedBox(height: 20.h), - useAndPassFrom(), - SizedBox(height: 24.h), - RichText( - text: TextSpan( - children: [ - TextSpan( - text: 'مطالعه بیانیه ', - style: AppFonts.yekan16.copyWith( - color: AppColor.darkGreyDark, - ), - ), - TextSpan( - recognizer: TapGestureRecognizer() - ..onTap = () { - Get.bottomSheet( - privacyPolicyWidget(), - isScrollControlled: true, - enableDrag: true, - ignoreSafeArea: false, - ); - }, - text: 'حریم خصوصی', - style: AppFonts.yekan16.copyWith( - color: AppColor.blueNormal, - ), - ), - ], - ), - ), - ], - ), - ), - ); - }), - ], - ), - ); - } - - Widget useAndPassFrom() { - return Padding( - padding: EdgeInsets.symmetric(horizontal: 30.r), - child: Form( - key: controller.formKey, - child: AutofillGroup( - child: Column( - children: [ - RTextField( - height: 40.h, - label: 'نام کاربری', - maxLength: 11, - maxLines: 1, - controller: controller.usernameController.value, - keyboardType: TextInputType.number, - inputFormatters: [PersianFormatter()], - initText: controller.usernameController.value.text, - autofillHints: [AutofillHints.username], - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide(color: AppColor.textColor, width: 1), - ), - onChanged: (value) async { - controller.usernameController.value.text = value; - if (value.length == 11) { - await controller.getUserInfo(value); - } - }, - prefixIcon: Padding( - padding: const EdgeInsets.fromLTRB(0, 8, 6, 8), - child: Assets.vec.callSvg.svg(width: 12, height: 12), - ), - suffixIcon: - controller.usernameController.value.text.trim().isNotEmpty - ? clearButton(() { - controller.usernameController.value.clear(); - controller.usernameController.refresh(); - }) - : null, - validator: (value) { - if (value == null || value.isEmpty) { - return '⚠️ شماره موبایل را وارد کنید'; - } else if (value.length < 10) { - return '⚠️ شماره موبایل باید 11 رقم باشد'; - } - return null; - }, - style: AppFonts.yekan13, - errorStyle: AppFonts.yekan13.copyWith( - color: AppColor.redNormal, - ), - labelStyle: AppFonts.yekan13, - boxConstraints: const BoxConstraints( - maxHeight: 40, - minHeight: 40, - maxWidth: 40, - minWidth: 40, - ), - ), - const SizedBox(height: 26), - ObxValue( - (passwordController) => RTextField( - height: 40.h, - label: 'رمز عبور', - filled: false, - obscure: true, - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide(color: AppColor.textColor, width: 1), - ), - controller: passwordController.value, - autofillHints: [AutofillHints.password], - variant: RTextFieldVariant.password, - initText: passwordController.value.text, - inputFormatters: [PersianFormatter()], - onChanged: (value) { - passwordController.refresh(); - }, - validator: (value) { - if (value == null || value.isEmpty) { - return '⚠️ رمز عبور را وارد کنید'; - } - return null; - }, - style: AppFonts.yekan13, - errorStyle: AppFonts.yekan13.copyWith( - color: AppColor.redNormal, - ), - labelStyle: AppFonts.yekan13, - prefixIcon: Padding( - padding: const EdgeInsets.fromLTRB(0, 8, 8, 8), - child: Assets.vec.keySvg.svg(width: 12, height: 12), - ), - boxConstraints: const BoxConstraints( - maxHeight: 34, - minHeight: 34, - maxWidth: 34, - minWidth: 34, - ), - ), - controller.passwordController, - ), - SizedBox(height: 26), - CaptchaWidget(), - - GestureDetector( - onTap: () { - controller.rememberMe.value = !controller.rememberMe.value; - }, - child: Row( - children: [ - ObxValue((data) { - return Checkbox( - materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - visualDensity: VisualDensity( - horizontal: -4, - vertical: 4, - ), - tristate: true, - value: data.value, - onChanged: (value) { - data.value = value ?? false; - }, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(4), - ), - activeColor: AppColor.blueNormal, - ); - }, controller.rememberMe), - Text( - 'مرا به خاطر بسپار', - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDark, - ), - ), - ], - ), - ), - - Obx(() { - return RElevated( - text: 'ورود', - isLoading: controller.isLoading.value, - onPressed: controller.isDisabled.value - ? null - : () async { - await controller.submitLoginForm(); - }, - width: Get.width, - height: 48, - ); - }), - ], - ), - ), - ), - ); - } - - Widget privacyPolicyWidget() { - return BaseBottomSheet( - child: Column( - spacing: 5, - children: [ - Container( - padding: EdgeInsets.all(8.w), - - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.darkGreyLight, width: 1), - ), - child: Column( - spacing: 3, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'بيانيه حريم خصوصی', - style: AppFonts.yekan16Bold.copyWith( - color: AppColor.blueNormal, - ), - ), - Text( - 'اطلاعات مربوط به هر شخص، حریم خصوصی وی محسوب می‌شود. حفاظت و حراست از اطلاعات شخصی در سامانه رصد یار، نه تنها موجب حفظ امنیت کاربران می‌شود، بلکه باعث اعتماد بیشتر و مشارکت آنها در فعالیت‌های جاری می‌گردد. هدف از این بیانیه، آگاه ساختن شما درباره ی نوع و نحوه ی استفاده از اطلاعاتی است که در هنگام استفاده از سامانه رصد یار ، از جانب شما دریافت می‌گردد. شرکت هوشمند سازان خود را ملزم به رعایت حریم خصوصی همه شهروندان و کاربران سامانه دانسته و آن دسته از اطلاعات کاربران را که فقط به منظور ارائه خدمات کفایت می‌کند، دریافت کرده و از انتشار آن یا در اختیار قرار دادن آن به دیگران خودداری مینماید.', - style: AppFonts.yekan14.copyWith( - color: AppColor.bgDark, - height: 1.8, - ), - ), - ], - ), - ), - Container( - padding: EdgeInsets.all(8.w), - - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.darkGreyLight, width: 1), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - spacing: 4, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - 'چگونگی جمع آوری و استفاده از اطلاعات کاربران', - style: AppFonts.yekan16Bold.copyWith( - color: AppColor.blueNormal, - ), - ), - Text( - '''الف: اطلاعاتی که شما خود در اختيار این سامانه قرار می‌دهيد، شامل موارد زيرهستند: -اقلام اطلاعاتی شامل شماره تلفن همراه، تاریخ تولد، کد پستی و کد ملی کاربران را دریافت مینماییم که از این اقلام، صرفا جهت احراز هویت کاربران استفاده خواهد شد. -ب: برخی اطلاعات ديگر که به صورت خودکار از شما دريافت میشود شامل موارد زير می‌باشد: -⦁ دستگاهی که از طریق آن سامانه رصد یار را مشاهده می‌نمایید( تلفن همراه، تبلت، رایانه). -⦁ نام و نسخه سیستم عامل و browser کامپیوتر شما. -⦁ اطلاعات صفحات بازدید شده. -⦁ تعداد بازدیدهای روزانه در درگاه. -⦁ هدف ما از دریافت این اطلاعات استفاده از آنها در تحلیل عملکرد کاربران درگاه می باشد تا بتوانیم در خدمت رسانی بهتر عمل کنیم. -''', - style: AppFonts.yekan14.copyWith( - color: AppColor.bgDark, - height: 1.8, - ), - ), - ], - ), - ), - Container( - padding: EdgeInsets.all(8.w), - - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.darkGreyLight, width: 1), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - spacing: 4, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - 'امنیت اطلاعات', - style: AppFonts.yekan16Bold.copyWith( - color: AppColor.blueNormal, - ), - ), - Text( - 'متعهدیم که امنیت اطلاعات شما را تضمین نماییم و برای جلوگیری از هر نوع دسترسی غیرمجاز و افشای اطلاعات شما از همه شیوه‌‌های لازم استفاده می‌کنیم تا امنیت اطلاعاتی را که به صورت آنلاین گردآوری می‌کنیم، حفظ شود. لازم به ذکر است در سامانه ما، ممکن است به سایت های دیگری لینک شوید، وقتی که شما از طریق این لینک‌ها از سامانه ما خارج می‌شوید، توجه داشته باشید که ما بر دیگر سایت ها کنترل نداریم و سازمان تعهدی بر حفظ حریم شخصی آنان در سایت مقصد نخواهد داشت و مراجعه کنندگان میبایست به بیانیه حریم شخصی آن سایت ها مراجعه نمایند.', - style: AppFonts.yekan14.copyWith( - color: AppColor.bgDark, - height: 1.8, - ), - ), - ], - ), - ), - ], - ), - ); - } -} diff --git a/packages/chicken/lib/features/common/profile/logic.dart b/packages/chicken/lib/features/common/profile/logic.dart deleted file mode 100644 index 9622ecf..0000000 --- a/packages/chicken/lib/features/common/profile/logic.dart +++ /dev/null @@ -1,257 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:rasadyar_chicken/data/di/chicken_di.dart'; -import 'package:rasadyar_chicken/features/common/data/model/request/change_password/change_password_request_model.dart'; -import 'package:rasadyar_chicken/features/common/data/model/response/iran_province_city/iran_province_city_model.dart'; -import 'package:rasadyar_chicken/features/common/data/model/response/user_profile/user_profile.dart'; -import 'package:rasadyar_chicken/features/common/data/repositories/common/common_repository.dart'; -import 'package:rasadyar_core/core.dart'; - -class ProfileLogic extends GetxController { - CommonRepository commonRepository = diChicken.get(); - GService gService = Get.find(); - TokenStorageService tokenService = Get.find(); - RxInt selectedInformationType = 0.obs; - Rxn birthDate = Rxn(); - - Rx> userProfile = Rx>( - Resource.loading(), - ); - Rx> userLocal = Rx>( - Resource.loading(), - ); - - TextEditingController nameController = TextEditingController(); - TextEditingController lastNameController = TextEditingController(); - TextEditingController nationalCodeController = TextEditingController(); - TextEditingController nationalIdController = TextEditingController(); - TextEditingController birthdayController = TextEditingController(); - - TextEditingController oldPasswordController = TextEditingController(); - TextEditingController newPasswordController = TextEditingController(); - TextEditingController retryNewPasswordController = TextEditingController(); - - RxList cites = [].obs; - Rxn selectedProvince = Rxn(); - Rxn selectedCity = Rxn(); - - GlobalKey formKey = GlobalKey(); - ImagePicker imagePicker = ImagePicker(); - Rxn selectedImage = Rxn(); - final RxnString _base64Image = RxnString(); - RxBool isOnLoading = false.obs; - - RxBool isUserInformationOpen = true.obs; - RxBool isUnitInformationOpen = false.obs; - - ScrollController scrollController = ScrollController(); - - @override - void onInit() { - super.onInit(); - ever(selectedImage, (data) async { - if (data?.path != null) { - _base64Image.value = await convertImageToBase64(data!.path); - } - }); - } - - @override - void onReady() { - super.onReady(); - getUserProfile(); - getUserRole(); - selectedProvince.listen((p0) => getCites()); - userProfile.listen((data) { - nameController.text = data.data?.firstName ?? ''; - lastNameController.text = data.data?.lastName ?? ''; - nationalCodeController.text = data.data?.nationalCode ?? ''; - nationalIdController.text = data.data?.nationalId ?? ''; - birthdayController.text = - data.data?.birthday?.toJalali.formatCompactDate() ?? ''; - birthDate.value = data.data?.birthday?.toJalali; - selectedProvince.value = IranProvinceCityModel( - name: data.data?.province ?? '', - id: data.data?.provinceNumber ?? 0, - ); - - selectedCity.value = IranProvinceCityModel( - name: data.data?.city ?? '', - id: data.data?.cityNumber ?? 0, - ); - }); - } - - Future getUserProfile() async { - userProfile.value = Resource.loading(); - await safeCall( - call: () async => await commonRepository.getUserProfile( - token: tokenService.accessToken.value!, - ), - onSuccess: (result) { - if (result != null) { - userProfile.value = Resource.success(result); - } - }, - onError: (error, stackTrace) {}, - ); - } - - Future getCites() async { - await safeCall( - call: () => commonRepository.getCity( - provinceName: selectedProvince.value?.name ?? '', - ), - onSuccess: (result) { - if (result != null && result.isNotEmpty) { - cites.value = result; - } - }, - ); - } - - Future updateUserProfile() async { - UserProfile userProfile = UserProfile( - firstName: nameController.text, - lastName: lastNameController.text, - nationalCode: nationalCodeController.text, - nationalId: nationalIdController.text, - birthday: birthDate.value - ?.toDateTime() - .formattedDashedGregorian - .toString(), - image: _base64Image.value, - personType: 'self', - type: 'self_profile', - ); - isOnLoading.value = true; - await safeCall( - call: () async => await commonRepository.updateUserProfile( - token: tokenService.accessToken.value!, - userProfile: userProfile, - ), - onSuccess: (result) { - isOnLoading.value = false; - }, - onError: (error, stackTrace) { - isOnLoading.value = false; - }, - ); - } - - Future updatePassword() async { - if (formKey.currentState?.validate() ?? false) { - ChangePasswordRequestModel model = ChangePasswordRequestModel( - username: userProfile.value.data?.mobile, - password: newPasswordController.text, - ); - - await safeCall( - call: () async => await commonRepository.updatePassword( - token: tokenService.accessToken.value!, - model: model, - ), - ); - } - } - - Future getUserRole() async { - userLocal.value = Resource.loading(); - await safeCall( - call: () async => tokenService.getUserLocal(Module.chicken), - onSuccess: (result) { - if (result != null) { - userLocal.value = Resource.success(result); - } - }, - onError: (error, stackTrace) {}, - ); - } - - void clearPasswordForm() { - oldPasswordController.clear(); - newPasswordController.clear(); - retryNewPasswordController.clear(); - } - - Future changeUserRole(String newRole) async { - dLog(newRole); - await gService.saveRoute(Module.chicken, newRole); - - Get.offAllNamed(newRole); - } - - void scrollToSelectedItem( - int index, { - double chipWidth = 100, - double spacing = 8, - GlobalKey? itemKey, - }) { - if (!scrollController.hasClients) { - WidgetsBinding.instance.addPostFrameCallback((_) { - _performScroll(index, chipWidth, spacing, itemKey); - }); - } else { - _performScroll(index, chipWidth, spacing, itemKey); - } - } - - void _performScroll( - int index, - double chipWidth, - double spacing, - GlobalKey? itemKey, - ) { - if (!scrollController.hasClients) return; - - double targetOffset; - - // If we have a GlobalKey, use it for precise positioning - if (itemKey?.currentContext != null) { - final RenderBox? renderBox = - itemKey!.currentContext?.findRenderObject() as RenderBox?; - if (renderBox != null) { - final position = renderBox.localToGlobal(Offset.zero); - final scrollPosition = scrollController.position; - final viewportWidth = scrollPosition.viewportDimension; - final chipWidth = renderBox.size.width; - - // Get the scroll position of the item - final itemScrollPosition = position.dx - scrollPosition.pixels; - // Center the item - targetOffset = - scrollPosition.pixels + - itemScrollPosition - - (viewportWidth / 2) + - (chipWidth / 2); - } else { - // Fallback to estimated position - targetOffset = _calculateEstimatedPosition(index, chipWidth, spacing); - } - } else { - // Use estimated position - targetOffset = _calculateEstimatedPosition(index, chipWidth, spacing); - } - - scrollController.animateTo( - targetOffset.clamp(0.0, scrollController.position.maxScrollExtent), - duration: const Duration(milliseconds: 300), - curve: Curves.easeInOut, - ); - } - - double _calculateEstimatedPosition( - int index, - double chipWidth, - double spacing, - ) { - final double itemPosition = (chipWidth + spacing) * index; - final double viewportWidth = scrollController.position.viewportDimension; - return itemPosition - (viewportWidth / 2) + (chipWidth / 2); - } - - @override - void onClose() { - scrollController.dispose(); - super.onClose(); - } -} diff --git a/packages/chicken/lib/features/common/profile/view.dart b/packages/chicken/lib/features/common/profile/view.dart deleted file mode 100644 index 3b3f635..0000000 --- a/packages/chicken/lib/features/common/profile/view.dart +++ /dev/null @@ -1,902 +0,0 @@ -import 'dart:io'; - -import 'package:flutter/cupertino.dart' hide Image; -import 'package:flutter/material.dart'; -import 'package:rasadyar_chicken/data/common/fa_user_role.dart'; -import 'package:rasadyar_chicken/data/di/chicken_di.dart'; -import 'package:rasadyar_chicken/features/common/data/model/response/user_profile/user_profile.dart'; -import 'package:rasadyar_core/core.dart'; - -import 'logic.dart'; - -class ProfilePage extends GetView { - const ProfilePage({super.key}); - - @override - Widget build(BuildContext context) { - return Column( - spacing: 30, - children: [ - Expanded( - child: Container( - color: AppColor.blueNormal, - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Row(), - ObxValue((data) { - final status = data.value.status; - - if (status == ResourceStatus.loading) { - return Container( - width: 128.w, - height: 128.h, - child: Center(child: CupertinoActivityIndicator(color: AppColor.greenNormal)), - ); - } - - if (status == ResourceStatus.error) { - return Container( - width: 128.w, - height: 128.h, - child: Center(child: Text('خطا در دریافت اطلاعات')), - ); - } - - // Default UI - - return Container( - width: 128.w, - height: 128.h, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: AppColor.blueLightActive, - ), - child: Center( - child: data.value.data?.image != null - ? CircleAvatar( - radius: 64.w, - backgroundImage: NetworkImage(data.value.data!.image!), - ) - : Icon(Icons.person, size: 64.w), - ), - ); - }, controller.userProfile), - ], - ), - ), - ), - Expanded( - flex: 3, - child: SingleChildScrollView( - physics: BouncingScrollPhysics(), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - rolesWidget(), - SizedBox(height: 12.h), - - ObxValue((data) { - if (data.value.status == ResourceStatus.loading) { - return LoadingWidget(); - } else if (data.value.status == ResourceStatus.error) { - return ErrorWidget('خطا در دریافت اطلاعات کاربر'); - } else if (data.value.status == ResourceStatus.success) { - return Column( - spacing: 6, - children: [ - ObxValue((isOpen) { - return GestureDetector( - onTap: () => isOpen.toggle(), - child: AnimatedContainer( - height: isOpen.value ? 320.h : 47.h, - duration: Duration(milliseconds: 500), - curve: Curves.linear, - child: userProfileInformation(data.value), - ), - ); - }, controller.isUserInformationOpen), - - Visibility( - visible: - data.value.data?.unitName != null || - data.value.data?.unitAddress != null || - data.value.data?.unitPostalCode != null || - data.value.data?.unitRegistrationNumber != null || - data.value.data?.unitEconomicalNumber != null || - data.value.data?.unitCity != null || - data.value.data?.unitProvince != null || - data.value.data?.unitNationalId != null, - - child: ObxValue((isOpen) { - return GestureDetector( - onTap: () => isOpen.toggle(), - child: AnimatedContainer( - height: isOpen.value ? 320.h : 47.h, - duration: Duration(milliseconds: 500), - curve: Curves.linear, - child: unitInformation(data.value), - ), - ); - }, controller.isUnitInformationOpen), - ), - ], - ); - } else { - return SizedBox.shrink(); - } - }, controller.userProfile), - GestureDetector( - onTap: () { - Get.bottomSheet(changePasswordBottomSheet(), isScrollControlled: true); - }, - child: Container( - height: 47.h, - margin: EdgeInsets.symmetric(horizontal: 8, vertical: 8.h), - padding: EdgeInsets.symmetric(horizontal: 11.h, vertical: 8.h), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: const Color(0xFFD6D6D6)), - ), - child: Row( - spacing: 6, - children: [ - Assets.vec.lockSvg.svg( - width: 24.w, - height: 24.h, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), - ), - Text( - 'تغییر رمز عبور', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), - ), - ], - ), - ), - ), - GestureDetector( - onTap: () { - Get.bottomSheet(exitBottomSheet(), isScrollControlled: true); - }, - child: Container( - height: 47.h, - margin: EdgeInsets.symmetric(horizontal: 8), - padding: EdgeInsets.symmetric(horizontal: 11.h, vertical: 8.h), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: const Color(0xFFD6D6D6)), - ), - child: Row( - spacing: 6, - children: [ - Assets.vec.logoutSvg.svg( - width: 24.w, - height: 24.h, - colorFilter: ColorFilter.mode(AppColor.redNormal, BlendMode.srcIn), - ), - Text( - 'خروج', - textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith(color: AppColor.redNormal), - ), - ], - ), - ), - ), - - SizedBox(height: 100), - ], - ), - ), - ), - ], - ); - } - - Container invoiceIssuanceInformation() => Container(); - - Widget bankInformationWidget() => Column( - spacing: 16, - children: [ - itemList(title: 'نام بانک', content: 'سامان'), - itemList(title: 'نام صاحب حساب', content: 'رضا رضایی'), - itemList(title: 'شماره کارت ', content: '54154545415'), - itemList(title: 'شماره حساب', content: '62565263263652'), - itemList(title: 'شماره شبا', content: '62565263263652'), - ], - ); - - Widget userProfileInformation(Resource value) { - UserProfile item = value.data!; - return Stack( - clipBehavior: Clip.none, - children: [ - Positioned.fill( - child: ObxValue( - (val) => Container( - height: val.value ? 320.h : 47.h, - margin: EdgeInsets.symmetric(horizontal: 8, vertical: val.value ? 8 : 0), - padding: EdgeInsets.symmetric(horizontal: 11.h, vertical: 8.h), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 0.5, color: AppColor.darkGreyLight), - ), - child: val.value - ? Column( - spacing: 6, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - GestureDetector( - onTap: () { - Get.bottomSheet( - userInformationBottomSheet(), - isScrollControlled: true, - ignoreSafeArea: false, - ); - }, - child: Assets.vec.editSvg.svg( - width: 24.w, - height: 24.h, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), - ), - ), - ], - ), - - Padding( - padding: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 8.0), - child: Column( - children: [ - itemList( - title: 'نام و نام خانوادگی', - content: item.fullname ?? 'نامشخص', - icon: Assets.vec.userSvg.path, - hasColoredBox: true, - ), - itemList( - title: 'کدملی', - content: item.nationalId ?? 'نامشخص', - icon: Assets.vec.tagUserSvg.path, - ), - itemList( - title: 'موبایل', - content: item.mobile ?? 'نامشخص', - icon: Assets.vec.callSvg.path, - ), - - itemList( - title: 'شماره شناسنامه', - content: item.nationalCode ?? 'نامشخص', - icon: Assets.vec.userSquareSvg.path, - ), - itemList( - title: 'تاریخ تولد', - content: item.birthday?.toJalali.formatCompactDate() ?? 'نامشخص', - icon: Assets.vec.calendarSvg.path, - ), - //todo - itemList( - title: 'استان', - content: item.province ?? 'نامشخص', - icon: Assets.vec.pictureFrameSvg.path, - ), - itemList( - title: 'شهر', - content: item.city ?? 'نامشخص', - icon: Assets.vec.mapSvg.path, - ), - ], - ), - ), - ], - ) - : Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [Icon(CupertinoIcons.chevron_down, color: AppColor.iconColor)], - ), - ), - controller.isUserInformationOpen, - ), - ), - ObxValue( - (isOpen) => AnimatedPositioned( - right: 16, - top: isOpen.value ? -7 : 11, - duration: Duration(milliseconds: 500), - child: Container( - padding: EdgeInsets.symmetric(horizontal: 8, vertical: 4), - decoration: isOpen.value - ? BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 0.5, color: Color(0xFFA9A9A9)), - ) - : null, - child: Text( - 'اطلاعات هویتی', - style: AppFonts.yekan16.copyWith(color: AppColor.iconColor), - ), - ), - ), - controller.isUserInformationOpen, - ), - ], - ); - } - - Widget unitInformation(Resource value) { - UserProfile item = value.data!; - return Stack( - clipBehavior: Clip.none, - children: [ - Positioned.fill( - child: ObxValue( - (val) => Container( - height: val.value ? 320.h : 47.h, - margin: EdgeInsets.symmetric(horizontal: 8, vertical: val.value ? 12 : 0), - padding: EdgeInsets.symmetric(horizontal: 11.h), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 0.5, color: AppColor.darkGreyLight), - ), - child: val.value - ? Column( - children: [ - SizedBox(height: 5.h), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - GestureDetector( - onTap: () { - Get.bottomSheet( - userInformationBottomSheet(), - isScrollControlled: true, - ignoreSafeArea: false, - ); - }, - child: Assets.vec.editSvg.svg( - width: 24.w, - height: 24.h, - colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), - ), - ), - ], - ), - - Padding( - padding: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 8.0), - child: Column( - spacing: 2, - children: [ - itemList( - title: 'نام صنفی', - content: item.unitName ?? 'نامشخص', - hasColoredBox: true, - visible: item.unitName != null, - ), - itemList( - title: 'شناسنامه ملی', - content: item.unitNationalId ?? 'نامشخص', - visible: item.unitName != null, - ), - itemList( - title: 'شماره ثبت', - content: item.unitRegistrationNumber ?? 'نامشخص', - visible: item.unitName != null, - ), - - itemList( - title: 'کد اقتصادی', - content: item.unitEconomicalNumber ?? 'نامشخص', - visible: item.unitName != null, - ), - itemList( - title: 'کد پستی', - content: item.unitPostalCode ?? 'نامشخص', - visible: item.unitName != null, - ), - - itemList( - title: 'استان', - content: item.province ?? 'نامشخص', - visible: item.unitName != null, - ), - itemList( - title: 'شهر', - content: item.city ?? 'نامشخص', - visible: item.unitName != null, - ), - itemList(title: 'آدرس', content: item.unitAddress ?? 'نامشخص'), - ], - ), - ), - ], - ) - : Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [Icon(CupertinoIcons.chevron_down, color: AppColor.iconColor)], - ), - ), - controller.isUnitInformationOpen, - ), - ), - ObxValue( - (isOpen) => AnimatedPositioned( - right: 16, - top: isOpen.value ? -2 : 11, - duration: Duration(milliseconds: 500), - child: Container( - padding: EdgeInsets.symmetric(horizontal: 8, vertical: 4), - decoration: isOpen.value - ? BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 0.5, color: Color(0xFFA9A9A9)), - ) - : null, - child: Text( - 'اطلاعات صنفی', - style: AppFonts.yekan16.copyWith(color: AppColor.iconColor), - ), - ), - ), - controller.isUnitInformationOpen, - ), - ], - ); - } - - Widget itemList({ - required String title, - required String content, - String? icon, - bool hasColoredBox = false, - bool? visible, - }) => Visibility( - visible: visible ?? true, - child: Container( - padding: EdgeInsets.symmetric(horizontal: 12.h, vertical: 6.h), - decoration: BoxDecoration( - color: hasColoredBox ? AppColor.greenLight : Colors.transparent, - borderRadius: BorderRadius.circular(8), - border: hasColoredBox - ? Border.all(width: 0.25, color: AppColor.bgDark) - : Border.all(width: 0, color: Colors.transparent), - ), - child: Row( - spacing: 4, - children: [ - if (icon != null) - Padding( - padding: const EdgeInsets.only(left: 8.0), - child: SvgGenImage.vec(icon).svg( - width: 20.w, - height: 20.h, - colorFilter: ColorFilter.mode(AppColor.textColor, BlendMode.srcIn), - ), - ), - Text(title, style: AppFonts.yekan14.copyWith(color: AppColor.textColor)), - Spacer(), - Text(content, style: AppFonts.yekan14.copyWith(color: AppColor.textColor)), - ], - ), - ), - ); - - Widget cardActionWidget({ - required String title, - required VoidCallback onPressed, - required String icon, - bool selected = false, - ColorFilter? color, - Color? cardColor, - Color? cardIconColor, - Color? textColor, - }) { - return GestureDetector( - onTap: onPressed, - child: Column( - spacing: 4, - children: [ - Container( - width: 52.w, - height: 52.h, - padding: EdgeInsets.all(6), - decoration: ShapeDecoration( - color: cardColor ?? AppColor.blueLight, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), - ), - child: Container( - padding: EdgeInsets.all(4), - decoration: BoxDecoration( - color: cardIconColor, - borderRadius: BorderRadius.circular(8), - ), - child: SvgGenImage.vec(icon).svg( - width: 40.w, - height: 40.h, - colorFilter: color ?? ColorFilter.mode(Colors.white, BlendMode.srcIn), - ), - ), - ), - SizedBox(height: 2), - Text( - title, - style: AppFonts.yekan10.copyWith(color: AppColor.textColor), - textAlign: TextAlign.center, - ), - ], - ), - ); - } - - Widget userInformationBottomSheet() { - return BaseBottomSheet( - height: 750.h, - child: SingleChildScrollView( - child: Column( - spacing: 8, - children: [ - Text( - 'ویرایش اطلاعات هویتی', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), - ), - - Container( - padding: EdgeInsets.all(8), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.darkGreyLight, width: 1), - ), - child: Column( - spacing: 12, - children: [ - RTextField( - controller: controller.nameController, - label: 'نام', - borderColor: AppColor.darkGreyLight, - filledColor: AppColor.bgLight, - filled: true, - ), - RTextField( - controller: controller.lastNameController, - label: 'نام خانوادگی', - borderColor: AppColor.darkGreyLight, - filledColor: AppColor.bgLight, - filled: true, - ), - RTextField( - controller: controller.nationalCodeController, - label: 'شماره شناسنامه', - borderColor: AppColor.darkGreyLight, - filledColor: AppColor.bgLight, - filled: true, - ), - RTextField( - controller: controller.nationalIdController, - label: 'کد ملی', - borderColor: AppColor.darkGreyLight, - filledColor: AppColor.bgLight, - filled: true, - ), - - ObxValue((data) { - return RTextField( - controller: controller.birthdayController, - label: 'تاریخ تولد', - initText: data.value?.formatCompactDate() ?? '', - borderColor: AppColor.darkGreyLight, - filledColor: AppColor.bgLight, - filled: true, - onTap: () {}, - ); - }, controller.birthDate), - - SizedBox(), - ], - ), - ), - SizedBox(), - - Container( - padding: EdgeInsets.all(8), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: AppColor.darkGreyLight, width: 1), - ), - child: Column( - spacing: 8, - children: [ - Text( - 'عکس پروفایل', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), - ), - ObxValue((data) { - return Container( - width: Get.width, - height: 270, - decoration: BoxDecoration( - color: AppColor.lightGreyNormal, - borderRadius: BorderRadius.circular(8), - border: Border.all(width: 1, color: AppColor.blackLight), - ), - child: Center( - child: data.value == null - ? Padding( - padding: const EdgeInsets.fromLTRB(30, 10, 10, 30), - child: Image.network( - controller.userProfile.value.data?.image ?? '', - ), - ) - : Image.file(File(data.value!.path), fit: BoxFit.cover), - ), - ); - }, controller.selectedImage), - - Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - RElevated( - text: 'گالری', - width: 150.w, - height: 40.h, - textStyle: AppFonts.yekan20.copyWith(color: Colors.white), - onPressed: () async { - controller.selectedImage.value = await controller.imagePicker.pickImage( - source: ImageSource.gallery, - imageQuality: 60, - maxWidth: 1080, - maxHeight: 720, - ); - }, - ), - SizedBox(width: 16), - ROutlinedElevated( - text: 'دوربین', - width: 150.w, - height: 40.h, - textStyle: AppFonts.yekan20.copyWith(color: AppColor.blueNormal), - onPressed: () async { - controller.selectedImage.value = await controller.imagePicker.pickImage( - source: ImageSource.camera, - imageQuality: 60, - maxWidth: 1080, - maxHeight: 720, - ); - }, - ), - ], - ), - ], - ), - ), - Row( - spacing: 16, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - ObxValue((data) { - return RElevated( - height: 40.h, - text: 'ویرایش', - isLoading: data.value, - onPressed: () async { - await controller.updateUserProfile(); - controller.getUserProfile(); - Get.back(); - }, - ); - }, controller.isOnLoading), - ROutlinedElevated( - height: 40.h, - text: 'انصراف', - borderColor: AppColor.blueNormal, - onPressed: () { - Get.back(); - }, - ), - ], - ), - ], - ), - ), - ); - } - - Widget changePasswordBottomSheet() { - return BaseBottomSheet( - height: 400.h, - child: SingleChildScrollView( - child: Form( - key: controller.formKey, - child: Column( - spacing: 8, - children: [ - Text( - 'تغییر رمز عبور', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.darkGreyDarkHover), - ), - SizedBox(), - RTextField( - controller: controller.oldPasswordController, - hintText: 'رمز عبور قبلی', - borderColor: AppColor.darkGreyLight, - filledColor: AppColor.bgLight, - filled: true, - validator: (value) { - if (value == null || value.isEmpty) { - return 'رمز عبور را وارد کنید'; - } else if (controller.userProfile.value.data?.password != value) { - return 'رمز عبور صحیح نیست'; - } - return null; - }, - ), - RTextField( - controller: controller.newPasswordController, - hintText: 'رمز عبور جدید', - borderColor: AppColor.darkGreyLight, - filledColor: AppColor.bgLight, - filled: true, - validator: (value) { - if (value == null || value.isEmpty) { - return 'رمز عبور را وارد کنید'; - } else if (value.length < 6) { - return 'رمز عبور باید بیش از 6 کارکتر باشد.'; - } - return null; - }, - ), - RTextField( - controller: controller.retryNewPasswordController, - hintText: 'تکرار رمز عبور جدید', - borderColor: AppColor.darkGreyLight, - filledColor: AppColor.bgLight, - filled: true, - validator: (value) { - if (value == null || value.isEmpty) { - return 'رمز عبور را وارد کنید'; - } else if (value.length < 6) { - return 'رمز عبور باید بیش از 6 کارکتر باشد.'; - } else if (controller.newPasswordController.text != value) { - return 'رمز عبور جدید یکسان نیست'; - } - return null; - }, - ), - - SizedBox(), - - Row( - spacing: 16, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - RElevated( - height: 40.h, - text: 'ویرایش', - onPressed: () async { - if (controller.formKey.currentState?.validate() != true) { - return; - } - await controller.updatePassword(); - controller.getUserProfile(); - controller.clearPasswordForm(); - Get.back(); - }, - ), - ROutlinedElevated( - height: 40.h, - text: 'انصراف', - borderColor: AppColor.blueNormal, - onPressed: () { - Get.back(); - }, - ), - ], - ), - ], - ), - ), - ), - ); - } - - Widget exitBottomSheet() { - return BaseBottomSheet( - height: 220.h, - child: SingleChildScrollView( - child: Form( - key: controller.formKey, - child: Column( - spacing: 8, - children: [ - Text('خروج', style: AppFonts.yekan16Bold.copyWith(color: AppColor.error)), - SizedBox(), - Text( - 'آیا مطمئن هستید که می‌خواهید از حساب کاربری خود خارج شوید؟', - textAlign: TextAlign.center, - style: AppFonts.yekan16Bold.copyWith(color: AppColor.textColor), - ), - - SizedBox(), - - Row( - spacing: 16, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - RElevated( - height: 40.h, - text: 'خروج', - backgroundColor: AppColor.error, - onPressed: () async { - await Future.wait([ - controller.tokenService.deleteModuleTokens(Module.chicken), - controller.gService.clearSelectedModule(), - ]).then((value) async { - await removeChickenDI(); - Get.offAllNamed("/moduleList"); - }); - }, - ), - ROutlinedElevated( - height: 40.h, - text: 'انصراف', - borderColor: AppColor.blueNormal, - onPressed: () { - Get.back(); - }, - ), - ], - ), - ], - ), - ), - ), - ); - } - - Widget rolesWidget() { - return ObxValue((data) { - if (data.value.status == ResourceStatus.loading) { - return CupertinoActivityIndicator(); - } else if (data.value.status == ResourceStatus.error) { - return ErrorWidget('خطا در دریافت اطلاعات کاربر'); - } else if (data.value.status == ResourceStatus.success) { - List? item = data.value.data?.roles; - return SingleChildScrollView( - scrollDirection: Axis.horizontal, - padding: EdgeInsets.symmetric(horizontal: 8.w), - physics: BouncingScrollPhysics(), - - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - spacing: 8.w, - children: List.generate(item?.length ?? 0, (index) { - Map tmpRole = getFaUserRoleWithOnTap(item?[index]); - return CustomChip( - isSelected: controller.gService.getRoute(Module.chicken) == tmpRole.values.first, - title: tmpRole.keys.first, - index: index, - onTap: (int p1) { - controller.changeUserRole(tmpRole.values.first); - }, - ); - }), - ), - ); - } else { - return SizedBox.shrink(); - } - }, controller.userLocal); - } -} diff --git a/packages/chicken/lib/features/common/role/logic.dart b/packages/chicken/lib/features/common/role/logic.dart deleted file mode 100644 index 3253738..0000000 --- a/packages/chicken/lib/features/common/role/logic.dart +++ /dev/null @@ -1,18 +0,0 @@ -import 'package:rasadyar_core/core.dart'; - -class RoleLogic extends GetxController { - TokenStorageService tokenService = Get.find(); - GService gService = Get.find(); - RxList roles = [].obs; - - @override - void onInit() { - super.onInit(); - List items = tokenService.getUserLocal(Module.chicken)!.roles ?? []; - if (items.isNotEmpty) { - roles.assignAll(items); - } - } - - -} diff --git a/packages/chicken/lib/features/common/role/view.dart b/packages/chicken/lib/features/common/role/view.dart deleted file mode 100644 index 0f36180..0000000 --- a/packages/chicken/lib/features/common/role/view.dart +++ /dev/null @@ -1,79 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:rasadyar_chicken/data/common/fa_user_role.dart'; -import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; -import 'package:rasadyar_core/core.dart'; - -import 'logic.dart'; - -class RolePage extends GetView { - const RolePage({super.key}); - - @override - Widget build(BuildContext context) { - return ChickenBasePage( - isBase: true, - child: Column( - children: [ - Assets.images.selectRole.image(height: 212.h, width: Get.width.w, fit: BoxFit.cover), - ObxValue((data) { - return Expanded( - child: GridView.builder( - physics: BouncingScrollPhysics(), - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 3, - mainAxisSpacing: 12.h, - crossAxisSpacing: 12.w, - childAspectRatio: 2, - ), - itemCount: data.length, - hitTestBehavior: HitTestBehavior.opaque, - itemBuilder: (BuildContext context, int index) { - Map role = getFaUserRoleWithOnTap(data[index]); - return roleCard( - title: role.keys.first, - onTap: () async { - try { - String route = role.values.first; - await controller.gService.saveRoute(Module.chicken, route); - - await controller.gService.saveRole(Module.chicken, data[index]); - Get.offAllNamed(route); - } catch (e) { - eLog( - "احتمالا در\n ``getFaUserRoleWithOnTap`` \nروت اش را تعریف نکردی 👻👻 ==>$e ", - ); - } - }, - ); - }, - ), - ); - }, controller.roles), - ], - ), - ); - } -} - -Widget roleCard({required String title, Function()? onTap, int? width, int? height}) { - return Container( - width: width?.w ?? 128.w, - height: height?.h ?? 48.h, - margin: EdgeInsets.all(8.w), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8.r), - border: Border.all(color: AppColor.blueNormal, width: 1.w), - ), - child: InkWell( - onTap: onTap, - child: Center( - child: Text( - title, - style: AppFonts.yekan12Bold.copyWith(color: AppColor.blueNormal), - textAlign: TextAlign.center, - ), - ), - ), - ); -} diff --git a/packages/chicken/lib/data/data_source/remote/kill_house/kill_house_remote.dart b/packages/chicken/lib/features/kill_house/data/data_source/remote/kill_house/kill_house_remote.dart similarity index 60% rename from packages/chicken/lib/data/data_source/remote/kill_house/kill_house_remote.dart rename to packages/chicken/lib/features/kill_house/data/data_source/remote/kill_house/kill_house_remote.dart index b84f17b..8b1c867 100644 --- a/packages/chicken/lib/data/data_source/remote/kill_house/kill_house_remote.dart +++ b/packages/chicken/lib/features/kill_house/data/data_source/remote/kill_house/kill_house_remote.dart @@ -1,9 +1,9 @@ -import 'package:rasadyar_chicken/data/models/kill_house_module/register_request/response/chicken_commission_prices/chicken_commission_prices.dart'; -import 'package:rasadyar_chicken/data/models/kill_house_module/register_request/response/kill_house/kill_house_response.dart'; -import 'package:rasadyar_chicken/data/models/kill_house_module/register_request/response/kill_request_list/kill_request_list.dart' +import 'package:rasadyar_chicken/features/kill_house/data/model/register_request/response/chicken_commission_prices/chicken_commission_prices.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/register_request/response/kill_house/kill_house_response.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/register_request/response/kill_request_list/kill_request_list.dart' as listModel; -import 'package:rasadyar_chicken/data/models/kill_house_module/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.dart'; -import 'package:rasadyar_chicken/data/models/kill_house_module/warehouse_and_distribution/response/kill_house_sales_info_dashboard/kill_house_sales_info_dashboard.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/warehouse_and_distribution/response/kill_house_sales_info_dashboard/kill_house_sales_info_dashboard.dart'; import 'package:rasadyar_core/core.dart'; abstract class KillHouseRemoteDataSource { diff --git a/packages/chicken/lib/data/data_source/remote/kill_house/kill_house_remote_impl.dart b/packages/chicken/lib/features/kill_house/data/data_source/remote/kill_house/kill_house_remote_impl.dart similarity index 79% rename from packages/chicken/lib/data/data_source/remote/kill_house/kill_house_remote_impl.dart rename to packages/chicken/lib/features/kill_house/data/data_source/remote/kill_house/kill_house_remote_impl.dart index a1282f6..7d50659 100644 --- a/packages/chicken/lib/data/data_source/remote/kill_house/kill_house_remote_impl.dart +++ b/packages/chicken/lib/features/kill_house/data/data_source/remote/kill_house/kill_house_remote_impl.dart @@ -1,10 +1,10 @@ -import 'package:rasadyar_chicken/data/data_source/remote/kill_house/kill_house_remote.dart'; -import 'package:rasadyar_chicken/data/models/kill_house_module/register_request/response/chicken_commission_prices/chicken_commission_prices.dart'; -import 'package:rasadyar_chicken/data/models/kill_house_module/register_request/response/kill_house/kill_house_response.dart'; -import 'package:rasadyar_chicken/data/models/kill_house_module/register_request/response/kill_request_list/kill_request_list.dart' +import 'package:rasadyar_chicken/features/kill_house/data/data_source/remote/kill_house/kill_house_remote.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/register_request/response/chicken_commission_prices/chicken_commission_prices.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/register_request/response/kill_house/kill_house_response.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/register_request/response/kill_request_list/kill_request_list.dart' as listModel; -import 'package:rasadyar_chicken/data/models/kill_house_module/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.dart'; -import 'package:rasadyar_chicken/data/models/kill_house_module/warehouse_and_distribution/response/kill_house_sales_info_dashboard/kill_house_sales_info_dashboard.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/warehouse_and_distribution/response/kill_house_sales_info_dashboard/kill_house_sales_info_dashboard.dart'; import 'package:rasadyar_core/core.dart'; class KillHouseRemoteDataSourceImpl extends KillHouseRemoteDataSource { diff --git a/packages/chicken/lib/data/models/kill_house_module/register_request/request/kill_request_response.dart b/packages/chicken/lib/features/kill_house/data/model/register_request/request/kill_request_response.dart similarity index 100% rename from packages/chicken/lib/data/models/kill_house_module/register_request/request/kill_request_response.dart rename to packages/chicken/lib/features/kill_house/data/model/register_request/request/kill_request_response.dart diff --git a/packages/chicken/lib/data/models/kill_house_module/register_request/request/kill_request_response.freezed.dart b/packages/chicken/lib/features/kill_house/data/model/register_request/request/kill_request_response.freezed.dart similarity index 100% rename from packages/chicken/lib/data/models/kill_house_module/register_request/request/kill_request_response.freezed.dart rename to packages/chicken/lib/features/kill_house/data/model/register_request/request/kill_request_response.freezed.dart diff --git a/packages/chicken/lib/data/models/kill_house_module/register_request/request/kill_request_response.g.dart b/packages/chicken/lib/features/kill_house/data/model/register_request/request/kill_request_response.g.dart similarity index 100% rename from packages/chicken/lib/data/models/kill_house_module/register_request/request/kill_request_response.g.dart rename to packages/chicken/lib/features/kill_house/data/model/register_request/request/kill_request_response.g.dart diff --git a/packages/chicken/lib/data/models/kill_house_module/register_request/response/chicken_commission_prices/chicken_commission_prices.dart b/packages/chicken/lib/features/kill_house/data/model/register_request/response/chicken_commission_prices/chicken_commission_prices.dart similarity index 100% rename from packages/chicken/lib/data/models/kill_house_module/register_request/response/chicken_commission_prices/chicken_commission_prices.dart rename to packages/chicken/lib/features/kill_house/data/model/register_request/response/chicken_commission_prices/chicken_commission_prices.dart diff --git a/packages/chicken/lib/data/models/kill_house_module/register_request/response/chicken_commission_prices/chicken_commission_prices.freezed.dart b/packages/chicken/lib/features/kill_house/data/model/register_request/response/chicken_commission_prices/chicken_commission_prices.freezed.dart similarity index 100% rename from packages/chicken/lib/data/models/kill_house_module/register_request/response/chicken_commission_prices/chicken_commission_prices.freezed.dart rename to packages/chicken/lib/features/kill_house/data/model/register_request/response/chicken_commission_prices/chicken_commission_prices.freezed.dart diff --git a/packages/chicken/lib/data/models/kill_house_module/register_request/response/chicken_commission_prices/chicken_commission_prices.g.dart b/packages/chicken/lib/features/kill_house/data/model/register_request/response/chicken_commission_prices/chicken_commission_prices.g.dart similarity index 100% rename from packages/chicken/lib/data/models/kill_house_module/register_request/response/chicken_commission_prices/chicken_commission_prices.g.dart rename to packages/chicken/lib/features/kill_house/data/model/register_request/response/chicken_commission_prices/chicken_commission_prices.g.dart diff --git a/packages/chicken/lib/data/models/kill_house_module/register_request/response/kill_house/kill_house_response.dart b/packages/chicken/lib/features/kill_house/data/model/register_request/response/kill_house/kill_house_response.dart similarity index 100% rename from packages/chicken/lib/data/models/kill_house_module/register_request/response/kill_house/kill_house_response.dart rename to packages/chicken/lib/features/kill_house/data/model/register_request/response/kill_house/kill_house_response.dart diff --git a/packages/chicken/lib/data/models/kill_house_module/register_request/response/kill_house/kill_house_response.freezed.dart b/packages/chicken/lib/features/kill_house/data/model/register_request/response/kill_house/kill_house_response.freezed.dart similarity index 100% rename from packages/chicken/lib/data/models/kill_house_module/register_request/response/kill_house/kill_house_response.freezed.dart rename to packages/chicken/lib/features/kill_house/data/model/register_request/response/kill_house/kill_house_response.freezed.dart diff --git a/packages/chicken/lib/data/models/kill_house_module/register_request/response/kill_house/kill_house_response.g.dart b/packages/chicken/lib/features/kill_house/data/model/register_request/response/kill_house/kill_house_response.g.dart similarity index 100% rename from packages/chicken/lib/data/models/kill_house_module/register_request/response/kill_house/kill_house_response.g.dart rename to packages/chicken/lib/features/kill_house/data/model/register_request/response/kill_house/kill_house_response.g.dart diff --git a/packages/chicken/lib/data/models/kill_house_module/register_request/response/kill_request_list/kill_request_list.dart b/packages/chicken/lib/features/kill_house/data/model/register_request/response/kill_request_list/kill_request_list.dart similarity index 100% rename from packages/chicken/lib/data/models/kill_house_module/register_request/response/kill_request_list/kill_request_list.dart rename to packages/chicken/lib/features/kill_house/data/model/register_request/response/kill_request_list/kill_request_list.dart diff --git a/packages/chicken/lib/data/models/kill_house_module/register_request/response/kill_request_list/kill_request_list.freezed.dart b/packages/chicken/lib/features/kill_house/data/model/register_request/response/kill_request_list/kill_request_list.freezed.dart similarity index 100% rename from packages/chicken/lib/data/models/kill_house_module/register_request/response/kill_request_list/kill_request_list.freezed.dart rename to packages/chicken/lib/features/kill_house/data/model/register_request/response/kill_request_list/kill_request_list.freezed.dart diff --git a/packages/chicken/lib/data/models/kill_house_module/register_request/response/kill_request_list/kill_request_list.g.dart b/packages/chicken/lib/features/kill_house/data/model/register_request/response/kill_request_list/kill_request_list.g.dart similarity index 100% rename from packages/chicken/lib/data/models/kill_house_module/register_request/response/kill_request_list/kill_request_list.g.dart rename to packages/chicken/lib/features/kill_house/data/model/register_request/response/kill_request_list/kill_request_list.g.dart diff --git a/packages/chicken/lib/data/models/kill_house_module/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.dart b/packages/chicken/lib/features/kill_house/data/model/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.dart similarity index 100% rename from packages/chicken/lib/data/models/kill_house_module/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.dart rename to packages/chicken/lib/features/kill_house/data/model/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.dart diff --git a/packages/chicken/lib/data/models/kill_house_module/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.freezed.dart b/packages/chicken/lib/features/kill_house/data/model/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.freezed.dart similarity index 100% rename from packages/chicken/lib/data/models/kill_house_module/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.freezed.dart rename to packages/chicken/lib/features/kill_house/data/model/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.freezed.dart diff --git a/packages/chicken/lib/data/models/kill_house_module/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.g.dart b/packages/chicken/lib/features/kill_house/data/model/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.g.dart similarity index 100% rename from packages/chicken/lib/data/models/kill_house_module/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.g.dart rename to packages/chicken/lib/features/kill_house/data/model/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.g.dart diff --git a/packages/chicken/lib/data/models/kill_house_module/warehouse_and_distribution/response/kill_house_sales_info_dashboard/kill_house_sales_info_dashboard.dart b/packages/chicken/lib/features/kill_house/data/model/warehouse_and_distribution/response/kill_house_sales_info_dashboard/kill_house_sales_info_dashboard.dart similarity index 100% rename from packages/chicken/lib/data/models/kill_house_module/warehouse_and_distribution/response/kill_house_sales_info_dashboard/kill_house_sales_info_dashboard.dart rename to packages/chicken/lib/features/kill_house/data/model/warehouse_and_distribution/response/kill_house_sales_info_dashboard/kill_house_sales_info_dashboard.dart diff --git a/packages/chicken/lib/data/models/kill_house_module/warehouse_and_distribution/response/kill_house_sales_info_dashboard/kill_house_sales_info_dashboard.freezed.dart b/packages/chicken/lib/features/kill_house/data/model/warehouse_and_distribution/response/kill_house_sales_info_dashboard/kill_house_sales_info_dashboard.freezed.dart similarity index 100% rename from packages/chicken/lib/data/models/kill_house_module/warehouse_and_distribution/response/kill_house_sales_info_dashboard/kill_house_sales_info_dashboard.freezed.dart rename to packages/chicken/lib/features/kill_house/data/model/warehouse_and_distribution/response/kill_house_sales_info_dashboard/kill_house_sales_info_dashboard.freezed.dart diff --git a/packages/chicken/lib/data/models/kill_house_module/warehouse_and_distribution/response/kill_house_sales_info_dashboard/kill_house_sales_info_dashboard.g.dart b/packages/chicken/lib/features/kill_house/data/model/warehouse_and_distribution/response/kill_house_sales_info_dashboard/kill_house_sales_info_dashboard.g.dart similarity index 100% rename from packages/chicken/lib/data/models/kill_house_module/warehouse_and_distribution/response/kill_house_sales_info_dashboard/kill_house_sales_info_dashboard.g.dart rename to packages/chicken/lib/features/kill_house/data/model/warehouse_and_distribution/response/kill_house_sales_info_dashboard/kill_house_sales_info_dashboard.g.dart diff --git a/packages/chicken/lib/data/repositories/kill_house/kill_house_repository.dart b/packages/chicken/lib/features/kill_house/data/repository/kill_house_repository.dart similarity index 57% rename from packages/chicken/lib/data/repositories/kill_house/kill_house_repository.dart rename to packages/chicken/lib/features/kill_house/data/repository/kill_house_repository.dart index 95ded99..50d1b10 100644 --- a/packages/chicken/lib/data/repositories/kill_house/kill_house_repository.dart +++ b/packages/chicken/lib/features/kill_house/data/repository/kill_house_repository.dart @@ -1,11 +1,11 @@ -import 'package:rasadyar_chicken/data/models/kill_house_module/register_request/request/kill_request_response.dart'; -import 'package:rasadyar_chicken/data/models/kill_house_module/register_request/response/chicken_commission_prices/chicken_commission_prices.dart'; -import 'package:rasadyar_chicken/data/models/kill_house_module/register_request/response/kill_house/kill_house_response.dart'; -import 'package:rasadyar_chicken/data/models/kill_house_module/register_request/response/kill_request_list/kill_request_list.dart' +import 'package:rasadyar_chicken/features/kill_house/data/model/register_request/request/kill_request_response.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/register_request/response/chicken_commission_prices/chicken_commission_prices.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/register_request/response/kill_house/kill_house_response.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/register_request/response/kill_request_list/kill_request_list.dart' as listModel show KillRequestList; -import 'package:rasadyar_chicken/data/models/kill_house_module/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.dart'; -import 'package:rasadyar_chicken/data/models/kill_house_module/warehouse_and_distribution/response/kill_house_sales_info_dashboard/kill_house_sales_info_dashboard.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/warehouse_and_distribution/response/kill_house_sales_info_dashboard/kill_house_sales_info_dashboard.dart'; import 'package:rasadyar_core/data/model/pagination_model/pagination_model.dart'; diff --git a/packages/chicken/lib/data/repositories/kill_house/kill_house_repository_impl.dart b/packages/chicken/lib/features/kill_house/data/repository/kill_house_repository_impl.dart similarity index 70% rename from packages/chicken/lib/data/repositories/kill_house/kill_house_repository_impl.dart rename to packages/chicken/lib/features/kill_house/data/repository/kill_house_repository_impl.dart index d6dfc35..ca61f1d 100644 --- a/packages/chicken/lib/data/repositories/kill_house/kill_house_repository_impl.dart +++ b/packages/chicken/lib/features/kill_house/data/repository/kill_house_repository_impl.dart @@ -1,11 +1,11 @@ -import 'package:rasadyar_chicken/data/data_source/remote/kill_house/kill_house_remote.dart'; -import 'package:rasadyar_chicken/data/models/kill_house_module/register_request/request/kill_request_response.dart'; -import 'package:rasadyar_chicken/data/models/kill_house_module/register_request/response/chicken_commission_prices/chicken_commission_prices.dart'; -import 'package:rasadyar_chicken/data/models/kill_house_module/register_request/response/kill_house/kill_house_response.dart'; -import 'package:rasadyar_chicken/data/models/kill_house_module/register_request/response/kill_request_list/kill_request_list.dart' +import 'package:rasadyar_chicken/features/kill_house/data/data_source/remote/kill_house/kill_house_remote.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/register_request/request/kill_request_response.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/register_request/response/chicken_commission_prices/chicken_commission_prices.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/register_request/response/kill_house/kill_house_response.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/register_request/response/kill_request_list/kill_request_list.dart' as ListModel; -import 'package:rasadyar_chicken/data/models/kill_house_module/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.dart'; -import 'package:rasadyar_chicken/data/models/kill_house_module/warehouse_and_distribution/response/kill_house_sales_info_dashboard/kill_house_sales_info_dashboard.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/warehouse_and_distribution/response/kill_house_sales_info_dashboard/kill_house_sales_info_dashboard.dart'; import 'package:rasadyar_core/core.dart'; import 'kill_house_repository.dart'; diff --git a/packages/chicken/lib/features/kill_house/root/logic.dart b/packages/chicken/lib/features/kill_house/root/logic.dart index bd778a0..1afd1aa 100644 --- a/packages/chicken/lib/features/kill_house/root/logic.dart +++ b/packages/chicken/lib/features/kill_house/root/logic.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_chicken/data/di/chicken_di.dart'; -import 'package:rasadyar_chicken/data/repositories/kill_house/kill_house_repository.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/repository/kill_house_repository.dart'; import 'package:rasadyar_chicken/features/common/presentation/page/profile/view.dart'; import 'package:rasadyar_chicken/presentation/routes/pages.dart'; import 'package:rasadyar_chicken/presentation/routes/routes.dart'; diff --git a/packages/chicken/lib/features/kill_house/submit_request/logic.dart b/packages/chicken/lib/features/kill_house/submit_request/logic.dart index ed600b6..7bffb42 100644 --- a/packages/chicken/lib/features/kill_house/submit_request/logic.dart +++ b/packages/chicken/lib/features/kill_house/submit_request/logic.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:rasadyar_chicken/data/models/kill_house_module/register_request/request/kill_request_response.dart'; -import 'package:rasadyar_chicken/data/models/kill_house_module/register_request/response/chicken_commission_prices/chicken_commission_prices.dart'; -import 'package:rasadyar_chicken/data/models/kill_house_module/register_request/response/kill_house/kill_house_response.dart'; -import 'package:rasadyar_chicken/data/models/kill_house_module/register_request/response/kill_request_list/kill_request_list.dart' +import 'package:rasadyar_chicken/features/kill_house/data/model/register_request/request/kill_request_response.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/register_request/response/chicken_commission_prices/chicken_commission_prices.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/register_request/response/kill_house/kill_house_response.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/register_request/response/kill_request_list/kill_request_list.dart' as listModel; import 'package:rasadyar_chicken/features/kill_house/root/logic.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/logic.dart'; diff --git a/packages/chicken/lib/features/kill_house/submit_request/view.dart b/packages/chicken/lib/features/kill_house/submit_request/view.dart index 18bc36f..52a0de3 100644 --- a/packages/chicken/lib/features/kill_house/submit_request/view.dart +++ b/packages/chicken/lib/features/kill_house/submit_request/view.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:rasadyar_chicken/data/models/kill_house_module/register_request/response/kill_request_list/kill_request_list.dart' +import 'package:rasadyar_chicken/features/kill_house/data/model/register_request/response/kill_request_list/kill_request_list.dart' as listModel show KillRequestList; import 'package:rasadyar_chicken/presentation/utils/nested_keys_utils.dart'; diff --git a/packages/chicken/lib/features/kill_house/warehouse_and_distribution/buy_in_province_entered/logic.dart b/packages/chicken/lib/features/kill_house/warehouse_and_distribution/buy_in_province_entered/logic.dart index 0e07c55..7a80a51 100644 --- a/packages/chicken/lib/features/kill_house/warehouse_and_distribution/buy_in_province_entered/logic.dart +++ b/packages/chicken/lib/features/kill_house/warehouse_and_distribution/buy_in_province_entered/logic.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:rasadyar_chicken/data/models/kill_house_module/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.dart'; import 'package:rasadyar_chicken/features/kill_house/warehouse_and_distribution/root/logic.dart'; import 'package:rasadyar_core/core.dart'; diff --git a/packages/chicken/lib/features/kill_house/warehouse_and_distribution/buy_in_province_entered/view.dart b/packages/chicken/lib/features/kill_house/warehouse_and_distribution/buy_in_province_entered/view.dart index 7096209..71d2dd7 100644 --- a/packages/chicken/lib/features/kill_house/warehouse_and_distribution/buy_in_province_entered/view.dart +++ b/packages/chicken/lib/features/kill_house/warehouse_and_distribution/buy_in_province_entered/view.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:rasadyar_chicken/data/models/kill_house_module/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.dart'; import 'package:rasadyar_core/core.dart'; diff --git a/packages/chicken/lib/features/kill_house/warehouse_and_distribution/buy_in_province_waiting/logic.dart b/packages/chicken/lib/features/kill_house/warehouse_and_distribution/buy_in_province_waiting/logic.dart index b13b26c..d1ad64d 100644 --- a/packages/chicken/lib/features/kill_house/warehouse_and_distribution/buy_in_province_waiting/logic.dart +++ b/packages/chicken/lib/features/kill_house/warehouse_and_distribution/buy_in_province_waiting/logic.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:rasadyar_chicken/data/models/kill_house_module/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.dart'; import 'package:rasadyar_chicken/features/kill_house/warehouse_and_distribution/root/logic.dart'; import 'package:rasadyar_chicken/presentation/utils/utils.dart'; import 'package:rasadyar_core/core.dart'; diff --git a/packages/chicken/lib/features/kill_house/warehouse_and_distribution/buy_in_province_waiting/view.dart b/packages/chicken/lib/features/kill_house/warehouse_and_distribution/buy_in_province_waiting/view.dart index f7271ad..78def48 100644 --- a/packages/chicken/lib/features/kill_house/warehouse_and_distribution/buy_in_province_waiting/view.dart +++ b/packages/chicken/lib/features/kill_house/warehouse_and_distribution/buy_in_province_waiting/view.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:rasadyar_chicken/data/models/kill_house_module/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/warehouse_and_distribution/response/kill_house_bars/kill_house_bars_response.dart'; import 'package:rasadyar_core/core.dart'; import 'logic.dart'; diff --git a/packages/chicken/lib/features/kill_house/warehouse_and_distribution/root/logic.dart b/packages/chicken/lib/features/kill_house/warehouse_and_distribution/root/logic.dart index 752eec8..1f675c1 100644 --- a/packages/chicken/lib/features/kill_house/warehouse_and_distribution/root/logic.dart +++ b/packages/chicken/lib/features/kill_house/warehouse_and_distribution/root/logic.dart @@ -3,9 +3,9 @@ import 'dart:async'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:rasadyar_chicken/data/di/chicken_di.dart'; -import 'package:rasadyar_chicken/data/models/kill_house_module/warehouse_and_distribution/response/kill_house_sales_info_dashboard/kill_house_sales_info_dashboard.dart'; -import 'package:rasadyar_chicken/data/repositories/kill_house/kill_house_repository.dart'; -import 'package:rasadyar_chicken/features/common/profile/view.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/model/warehouse_and_distribution/response/kill_house_sales_info_dashboard/kill_house_sales_info_dashboard.dart'; +import 'package:rasadyar_chicken/features/kill_house/data/repository/kill_house_repository.dart'; +import 'package:rasadyar_chicken/features/common/presentation/page/profile/view.dart'; import 'package:rasadyar_chicken/features/kill_house/warehouse_and_distribution/buy/view.dart'; import 'package:rasadyar_chicken/features/kill_house/warehouse_and_distribution/home/view.dart'; import 'package:rasadyar_chicken/features/kill_house/warehouse_and_distribution/sale/view.dart'; diff --git a/packages/chicken/lib/features/poultry_science/data/model/request/submit_inspection/submit_inspection_response_schema.json b/packages/chicken/lib/features/poultry_science/data/model/request/submit_inspection/submit_inspection_response_schema.json index 22034ac..4bccc33 100644 --- a/packages/chicken/lib/features/poultry_science/data/model/request/submit_inspection/submit_inspection_response_schema.json +++ b/packages/chicken/lib/features/poultry_science/data/model/request/submit_inspection/submit_inspection_response_schema.json @@ -434,4 +434,3 @@ - diff --git a/packages/chicken/lib/features/poultry_science/presentation/widgets/submit_inspection_bottom_sheet/card_info.dart b/packages/chicken/lib/features/poultry_science/presentation/widgets/submit_inspection_bottom_sheet/card_info.dart index 0ccdc56..3c9dc3b 100644 --- a/packages/chicken/lib/features/poultry_science/presentation/widgets/submit_inspection_bottom_sheet/card_info.dart +++ b/packages/chicken/lib/features/poultry_science/presentation/widgets/submit_inspection_bottom_sheet/card_info.dart @@ -4,7 +4,7 @@ import 'package:rasadyar_chicken/features/poultry_science/presentation/widgets/s import 'package:rasadyar_core/core.dart'; Widget farmInfoWidget({ - required CreateInspectionBottomSheetLogic controller, + CreateInspectionBottomSheetLogic? controller, required String title, required Widget child, EdgeInsets? padding, diff --git a/packages/chicken/lib/features/poultry_science/presentation/widgets/submit_inspection_bottom_sheet/step1_page.dart b/packages/chicken/lib/features/poultry_science/presentation/widgets/submit_inspection_bottom_sheet/step1_page.dart index c8883a2..2dfc2ea 100644 --- a/packages/chicken/lib/features/poultry_science/presentation/widgets/submit_inspection_bottom_sheet/step1_page.dart +++ b/packages/chicken/lib/features/poultry_science/presentation/widgets/submit_inspection_bottom_sheet/step1_page.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:rasadyar_chicken/features/poultry_science/presentation/widgets/submit_inspection_bottom_sheet/card_info.dart'; diff --git a/packages/chicken/lib/features/vet_farm/data/datasources/remote/vet_farm_remote_data_source.dart b/packages/chicken/lib/features/vet_farm/data/datasources/remote/vet_farm_remote_data_source.dart index 19da44e..059c884 100644 --- a/packages/chicken/lib/features/vet_farm/data/datasources/remote/vet_farm_remote_data_source.dart +++ b/packages/chicken/lib/features/vet_farm/data/datasources/remote/vet_farm_remote_data_source.dart @@ -12,4 +12,6 @@ abstract class VetFarmRemoteDataSource { required String token, required SubmitInspectionResponse request, }); + + Future>> getSDUIForm({String? token}); } diff --git a/packages/chicken/lib/features/vet_farm/data/datasources/remote/vet_farm_remote_data_source_impl.dart b/packages/chicken/lib/features/vet_farm/data/datasources/remote/vet_farm_remote_data_source_impl.dart index 038718d..36596af 100644 --- a/packages/chicken/lib/features/vet_farm/data/datasources/remote/vet_farm_remote_data_source_impl.dart +++ b/packages/chicken/lib/features/vet_farm/data/datasources/remote/vet_farm_remote_data_source_impl.dart @@ -36,4 +36,20 @@ class VetFarmRemoteDataSourceImpl implements VetFarmRemoteDataSource { data: request.toJson(), ); } + + @override + Future>> getSDUIForm({String? token}) async { + DioRemote dio = DioRemote(baseUrl: "http://testbackend.rasadyaar.ir/"); + await dio.init(); + + + var res = await dio.get( + 'inspection_form_sd_ui/', + + fromJson: (json) { + return json; + }, + ); + return res; + } } diff --git a/packages/chicken/lib/features/vet_farm/data/repositories/vet_farm_repository.dart b/packages/chicken/lib/features/vet_farm/data/repositories/vet_farm_repository.dart index 5d55bb7..4048948 100644 --- a/packages/chicken/lib/features/vet_farm/data/repositories/vet_farm_repository.dart +++ b/packages/chicken/lib/features/vet_farm/data/repositories/vet_farm_repository.dart @@ -12,4 +12,7 @@ abstract class VetFarmRepository { required String token, required SubmitInspectionResponse request, }); + + + Future>> getSDUIForm({String? token}); } diff --git a/packages/chicken/lib/features/vet_farm/data/repositories/vet_farm_repository_impl.dart b/packages/chicken/lib/features/vet_farm/data/repositories/vet_farm_repository_impl.dart index cfed199..8fcb38e 100644 --- a/packages/chicken/lib/features/vet_farm/data/repositories/vet_farm_repository_impl.dart +++ b/packages/chicken/lib/features/vet_farm/data/repositories/vet_farm_repository_impl.dart @@ -27,4 +27,8 @@ class VetFarmRepositoryImpl implements VetFarmRepository { }) async { return await _remote.submitInspection(token: token, request: request); } + @override + Future>> getSDUIForm({String? token}) async { + return await _remote.getSDUIForm(token: token); + } } diff --git a/packages/chicken/lib/features/vet_farm/presentation/pages/home/logic.dart b/packages/chicken/lib/features/vet_farm/presentation/pages/home/logic.dart index 25da47a..68311e3 100644 --- a/packages/chicken/lib/features/vet_farm/presentation/pages/home/logic.dart +++ b/packages/chicken/lib/features/vet_farm/presentation/pages/home/logic.dart @@ -21,5 +21,10 @@ class VetFarmHomeLogic extends GetxController { route: VetFarmRoutes.newInspectionVetFarm, icon: Assets.vec.activeFramSvg.path, ), + VetFarmHomeItem( + title: "صفحه جدید", + route: VetFarmRoutes.newPageVetFarm, + icon: Assets.vec.activeFramSvg.path, + ), ].obs; } diff --git a/packages/chicken/lib/features/vet_farm/presentation/pages/new_page/logic.dart b/packages/chicken/lib/features/vet_farm/presentation/pages/new_page/logic.dart new file mode 100644 index 0000000..dc85dae --- /dev/null +++ b/packages/chicken/lib/features/vet_farm/presentation/pages/new_page/logic.dart @@ -0,0 +1,46 @@ +import 'package:rasadyar_chicken/features/vet_farm/data/repositories/vet_farm_repository.dart'; +import 'package:rasadyar_chicken/features/vet_farm/presentation/pages/root/logic.dart'; +import 'package:rasadyar_chicken/presentation/widget/sdui/widgets/text_form_filed/model/text_form_field_sdui_model.dart'; +import 'package:rasadyar_core/core.dart'; + +class NewPageLogic extends GetxController { + VetFarmRootLogic rootLogic = Get.find(); + + Rxn textFormFieldSDUIModel = + Rxn(); + + @override + void onInit() { + super.onInit(); + + getSDUIForm(); + } + + @override + void onReady() { + super.onReady(); + // Ready logic here + } + + @override + void onClose() { + super.onClose(); + // Cleanup logic here + } + + Future getSDUIForm() async { + await safeCall( + call: () async => await rootLogic.vetFarmRepository.getSDUIForm(), + onSuccess: (result) { + textFormFieldSDUIModel.value = TextFormFieldSDUIModel.fromJson( + result.data ?? {}, + ); + }, + onError: (error, stackTrace) { + print(error); + }, + ); + } + + void onButtonPressed() {} +} diff --git a/packages/chicken/lib/features/vet_farm/presentation/pages/new_page/view.dart b/packages/chicken/lib/features/vet_farm/presentation/pages/new_page/view.dart new file mode 100644 index 0000000..4efea5e --- /dev/null +++ b/packages/chicken/lib/features/vet_farm/presentation/pages/new_page/view.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/presentation/utils/nested_keys_utils.dart'; +import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; +import 'package:rasadyar_chicken/presentation/widget/sdui/widgets/text_form_filed/text_form_filed_sdui.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'logic.dart'; + +class NewPage extends GetView { + const NewPage({super.key}); + + @override + Widget build(BuildContext context) { + return ChickenBasePage( + hasBack: true, + backId: vetFarmActionKey, + child: contentWidget(), + ); + } + + Widget contentWidget() { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ObxValue((data) { + if (data.value == null) { + return const SizedBox.shrink(); + } + return textFormFiledSDUI(model: data.value!); + }, controller.textFormFieldSDUIModel), + + SizedBox(height: 24.h), + RElevated( + text: 'دکمه نمونه', + onPressed: () { + controller.onButtonPressed(); + }, + ), + ], + ), + ); + } +} diff --git a/packages/chicken/lib/features/vet_farm/presentation/routes/pages.dart b/packages/chicken/lib/features/vet_farm/presentation/routes/pages.dart index 2e889a7..36ea705 100644 --- a/packages/chicken/lib/features/vet_farm/presentation/routes/pages.dart +++ b/packages/chicken/lib/features/vet_farm/presentation/routes/pages.dart @@ -7,6 +7,8 @@ import 'package:rasadyar_chicken/features/vet_farm/presentation/pages/active_hat import 'package:rasadyar_chicken/features/vet_farm/presentation/pages/active_hatching/view.dart'; import 'package:rasadyar_chicken/features/vet_farm/presentation/pages/new_inspection/logic.dart'; import 'package:rasadyar_chicken/features/vet_farm/presentation/pages/new_inspection/view.dart'; +import 'package:rasadyar_chicken/features/vet_farm/presentation/pages/new_page/logic.dart'; +import 'package:rasadyar_chicken/features/vet_farm/presentation/pages/new_page/view.dart'; import 'package:rasadyar_chicken/features/vet_farm/presentation/routes/routes.dart'; import 'package:rasadyar_chicken/presentation/routes/global_binding.dart'; import 'package:rasadyar_chicken/presentation/widget/base_page/logic.dart'; @@ -72,5 +74,18 @@ class VetFarmPages { }), ], ), + GetPage( + name: VetFarmRoutes.newPageVetFarm, + page: () => NewPage(), + middlewares: [AuthMiddleware()], + bindings: [ + GlobalBinding(), + + BindingsBuilder(() { + Get.lazyPut(() => NewPageLogic()); + }), + + ], + ), ]; } diff --git a/packages/chicken/lib/features/vet_farm/presentation/routes/routes.dart b/packages/chicken/lib/features/vet_farm/presentation/routes/routes.dart index 8021045..eae3e06 100644 --- a/packages/chicken/lib/features/vet_farm/presentation/routes/routes.dart +++ b/packages/chicken/lib/features/vet_farm/presentation/routes/routes.dart @@ -7,4 +7,5 @@ sealed class VetFarmRoutes { static const actionVetFarm = '$_base/action'; static const activeHatchingVetFarm = '$_base/activeHatching'; static const newInspectionVetFarm = '$_base/newInspection'; + static const newPageVetFarm = '$_base/newPage'; } diff --git a/packages/chicken/lib/presentation/widget/sdui/form/sdui_form_widget.dart b/packages/chicken/lib/presentation/widget/sdui/form/sdui_form_widget.dart new file mode 100644 index 0000000..e69de29 diff --git a/packages/chicken/lib/presentation/widget/sdui/form/sdui_form_widget_controller.dart b/packages/chicken/lib/presentation/widget/sdui/form/sdui_form_widget_controller.dart new file mode 100644 index 0000000..e69de29 diff --git a/packages/chicken/lib/presentation/widget/sdui/sdui.json b/packages/chicken/lib/presentation/widget/sdui/sdui.json new file mode 100644 index 0000000..a053d9d --- /dev/null +++ b/packages/chicken/lib/presentation/widget/sdui/sdui.json @@ -0,0 +1,13 @@ +{ + "type": "card_label_item", + "visible": true, + "data": { + "title": "اطلاعات مزرعه", + "padding_horizontal": 12.0, + "padding_vertical": 11.0 + }, + "child": { + + } +} + diff --git a/packages/chicken/lib/presentation/widget/sdui/widgets/card_label_item/card_label_item_sdui.dart b/packages/chicken/lib/presentation/widget/sdui/widgets/card_label_item/card_label_item_sdui.dart new file mode 100644 index 0000000..7c13098 --- /dev/null +++ b/packages/chicken/lib/presentation/widget/sdui/widgets/card_label_item/card_label_item_sdui.dart @@ -0,0 +1,60 @@ +import 'package:rasadyar_core/core.dart'; + +import 'model/card_label_item_sdui_model.dart'; +import 'package:flutter/material.dart'; + +Widget cardLabelItemSDUI({required CardLabelItemSDUI model}) { + return farmInfoWidget( + title: model.data?.title ?? '', + child: Container(), + padding: + model.data?.paddingHorizontal != null && + model.data?.paddingVertical != null + ? EdgeInsets.symmetric( + horizontal: model.data?.paddingHorizontal ?? 0, + vertical: model.data?.paddingVertical ?? 0, + ) + : null, + ); +} + +Widget farmInfoWidget({ + required String title, + required Widget child, + EdgeInsets? padding, +}) { + return Stack( + clipBehavior: Clip.none, + children: [ + Positioned.fill( + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 0.50, color: AppColor.mediumGrey), + ), + + padding: + padding ?? EdgeInsets.symmetric(horizontal: 12.w, vertical: 11.h), + child: child, + ), + ), + Positioned( + top: -17, + right: 7, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 10.w, vertical: 5.h), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 0.50, color: AppColor.mediumGrey), + ), + child: Text( + title, + style: AppFonts.yekan14.copyWith(color: AppColor.iconColor), + ), + ), + ), + ], + ); +} diff --git a/packages/chicken/lib/presentation/widget/sdui/widgets/card_label_item/model/card_label_item_sdui_model.dart b/packages/chicken/lib/presentation/widget/sdui/widgets/card_label_item/model/card_label_item_sdui_model.dart new file mode 100644 index 0000000..708af85 --- /dev/null +++ b/packages/chicken/lib/presentation/widget/sdui/widgets/card_label_item/model/card_label_item_sdui_model.dart @@ -0,0 +1,29 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'card_label_item_sdui_model.freezed.dart'; +part 'card_label_item_sdui_model.g.dart'; + +@freezed +abstract class CardLabelItemSDUI with _$CardLabelItemSDUI { + const factory CardLabelItemSDUI({ + String? type, + bool? visible, + CardLabelItemData? data, + Map? child, + }) = _CardLabelItemSDUI; + + factory CardLabelItemSDUI.fromJson(Map json) => + _$CardLabelItemSDUIFromJson(json); +} + +@freezed +abstract class CardLabelItemData with _$CardLabelItemData { + const factory CardLabelItemData({ + String? title, + double? paddingHorizontal, + double? paddingVertical, + }) = _CardLabelItemData; + + factory CardLabelItemData.fromJson(Map json) => + _$CardLabelItemDataFromJson(json); +} diff --git a/packages/chicken/lib/presentation/widget/sdui/widgets/card_label_item/model/card_label_item_sdui_model.freezed.dart b/packages/chicken/lib/presentation/widget/sdui/widgets/card_label_item/model/card_label_item_sdui_model.freezed.dart new file mode 100644 index 0000000..d543d51 --- /dev/null +++ b/packages/chicken/lib/presentation/widget/sdui/widgets/card_label_item/model/card_label_item_sdui_model.freezed.dart @@ -0,0 +1,587 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'card_label_item_sdui_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$CardLabelItemSDUI { + + String? get type; bool? get visible; CardLabelItemData? get data; Map? get child; +/// Create a copy of CardLabelItemSDUI +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$CardLabelItemSDUICopyWith get copyWith => _$CardLabelItemSDUICopyWithImpl(this as CardLabelItemSDUI, _$identity); + + /// Serializes this CardLabelItemSDUI to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is CardLabelItemSDUI&&(identical(other.type, type) || other.type == type)&&(identical(other.visible, visible) || other.visible == visible)&&(identical(other.data, data) || other.data == data)&&const DeepCollectionEquality().equals(other.child, child)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,type,visible,data,const DeepCollectionEquality().hash(child)); + +@override +String toString() { + return 'CardLabelItemSDUI(type: $type, visible: $visible, data: $data, child: $child)'; +} + + +} + +/// @nodoc +abstract mixin class $CardLabelItemSDUICopyWith<$Res> { + factory $CardLabelItemSDUICopyWith(CardLabelItemSDUI value, $Res Function(CardLabelItemSDUI) _then) = _$CardLabelItemSDUICopyWithImpl; +@useResult +$Res call({ + String? type, bool? visible, CardLabelItemData? data, Map? child +}); + + +$CardLabelItemDataCopyWith<$Res>? get data; + +} +/// @nodoc +class _$CardLabelItemSDUICopyWithImpl<$Res> + implements $CardLabelItemSDUICopyWith<$Res> { + _$CardLabelItemSDUICopyWithImpl(this._self, this._then); + + final CardLabelItemSDUI _self; + final $Res Function(CardLabelItemSDUI) _then; + +/// Create a copy of CardLabelItemSDUI +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? type = freezed,Object? visible = freezed,Object? data = freezed,Object? child = freezed,}) { + return _then(_self.copyWith( +type: freezed == type ? _self.type : type // ignore: cast_nullable_to_non_nullable +as String?,visible: freezed == visible ? _self.visible : visible // ignore: cast_nullable_to_non_nullable +as bool?,data: freezed == data ? _self.data : data // ignore: cast_nullable_to_non_nullable +as CardLabelItemData?,child: freezed == child ? _self.child : child // ignore: cast_nullable_to_non_nullable +as Map?, + )); +} +/// Create a copy of CardLabelItemSDUI +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$CardLabelItemDataCopyWith<$Res>? get data { + if (_self.data == null) { + return null; + } + + return $CardLabelItemDataCopyWith<$Res>(_self.data!, (value) { + return _then(_self.copyWith(data: value)); + }); +} +} + + +/// Adds pattern-matching-related methods to [CardLabelItemSDUI]. +extension CardLabelItemSDUIPatterns on CardLabelItemSDUI { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _CardLabelItemSDUI value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _CardLabelItemSDUI() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _CardLabelItemSDUI value) $default,){ +final _that = this; +switch (_that) { +case _CardLabelItemSDUI(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _CardLabelItemSDUI value)? $default,){ +final _that = this; +switch (_that) { +case _CardLabelItemSDUI() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? type, bool? visible, CardLabelItemData? data, Map? child)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _CardLabelItemSDUI() when $default != null: +return $default(_that.type,_that.visible,_that.data,_that.child);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? type, bool? visible, CardLabelItemData? data, Map? child) $default,) {final _that = this; +switch (_that) { +case _CardLabelItemSDUI(): +return $default(_that.type,_that.visible,_that.data,_that.child);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? type, bool? visible, CardLabelItemData? data, Map? child)? $default,) {final _that = this; +switch (_that) { +case _CardLabelItemSDUI() when $default != null: +return $default(_that.type,_that.visible,_that.data,_that.child);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _CardLabelItemSDUI implements CardLabelItemSDUI { + const _CardLabelItemSDUI({this.type, this.visible, this.data, final Map? child}): _child = child; + factory _CardLabelItemSDUI.fromJson(Map json) => _$CardLabelItemSDUIFromJson(json); + +@override final String? type; +@override final bool? visible; +@override final CardLabelItemData? data; + final Map? _child; +@override Map? get child { + final value = _child; + if (value == null) return null; + if (_child is EqualUnmodifiableMapView) return _child; + // ignore: implicit_dynamic_type + return EqualUnmodifiableMapView(value); +} + + +/// Create a copy of CardLabelItemSDUI +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$CardLabelItemSDUICopyWith<_CardLabelItemSDUI> get copyWith => __$CardLabelItemSDUICopyWithImpl<_CardLabelItemSDUI>(this, _$identity); + +@override +Map toJson() { + return _$CardLabelItemSDUIToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _CardLabelItemSDUI&&(identical(other.type, type) || other.type == type)&&(identical(other.visible, visible) || other.visible == visible)&&(identical(other.data, data) || other.data == data)&&const DeepCollectionEquality().equals(other._child, _child)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,type,visible,data,const DeepCollectionEquality().hash(_child)); + +@override +String toString() { + return 'CardLabelItemSDUI(type: $type, visible: $visible, data: $data, child: $child)'; +} + + +} + +/// @nodoc +abstract mixin class _$CardLabelItemSDUICopyWith<$Res> implements $CardLabelItemSDUICopyWith<$Res> { + factory _$CardLabelItemSDUICopyWith(_CardLabelItemSDUI value, $Res Function(_CardLabelItemSDUI) _then) = __$CardLabelItemSDUICopyWithImpl; +@override @useResult +$Res call({ + String? type, bool? visible, CardLabelItemData? data, Map? child +}); + + +@override $CardLabelItemDataCopyWith<$Res>? get data; + +} +/// @nodoc +class __$CardLabelItemSDUICopyWithImpl<$Res> + implements _$CardLabelItemSDUICopyWith<$Res> { + __$CardLabelItemSDUICopyWithImpl(this._self, this._then); + + final _CardLabelItemSDUI _self; + final $Res Function(_CardLabelItemSDUI) _then; + +/// Create a copy of CardLabelItemSDUI +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? type = freezed,Object? visible = freezed,Object? data = freezed,Object? child = freezed,}) { + return _then(_CardLabelItemSDUI( +type: freezed == type ? _self.type : type // ignore: cast_nullable_to_non_nullable +as String?,visible: freezed == visible ? _self.visible : visible // ignore: cast_nullable_to_non_nullable +as bool?,data: freezed == data ? _self.data : data // ignore: cast_nullable_to_non_nullable +as CardLabelItemData?,child: freezed == child ? _self._child : child // ignore: cast_nullable_to_non_nullable +as Map?, + )); +} + +/// Create a copy of CardLabelItemSDUI +/// with the given fields replaced by the non-null parameter values. +@override +@pragma('vm:prefer-inline') +$CardLabelItemDataCopyWith<$Res>? get data { + if (_self.data == null) { + return null; + } + + return $CardLabelItemDataCopyWith<$Res>(_self.data!, (value) { + return _then(_self.copyWith(data: value)); + }); +} +} + + +/// @nodoc +mixin _$CardLabelItemData { + + String? get title; double? get paddingHorizontal; double? get paddingVertical; +/// Create a copy of CardLabelItemData +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$CardLabelItemDataCopyWith get copyWith => _$CardLabelItemDataCopyWithImpl(this as CardLabelItemData, _$identity); + + /// Serializes this CardLabelItemData to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is CardLabelItemData&&(identical(other.title, title) || other.title == title)&&(identical(other.paddingHorizontal, paddingHorizontal) || other.paddingHorizontal == paddingHorizontal)&&(identical(other.paddingVertical, paddingVertical) || other.paddingVertical == paddingVertical)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,title,paddingHorizontal,paddingVertical); + +@override +String toString() { + return 'CardLabelItemData(title: $title, paddingHorizontal: $paddingHorizontal, paddingVertical: $paddingVertical)'; +} + + +} + +/// @nodoc +abstract mixin class $CardLabelItemDataCopyWith<$Res> { + factory $CardLabelItemDataCopyWith(CardLabelItemData value, $Res Function(CardLabelItemData) _then) = _$CardLabelItemDataCopyWithImpl; +@useResult +$Res call({ + String? title, double? paddingHorizontal, double? paddingVertical +}); + + + + +} +/// @nodoc +class _$CardLabelItemDataCopyWithImpl<$Res> + implements $CardLabelItemDataCopyWith<$Res> { + _$CardLabelItemDataCopyWithImpl(this._self, this._then); + + final CardLabelItemData _self; + final $Res Function(CardLabelItemData) _then; + +/// Create a copy of CardLabelItemData +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? title = freezed,Object? paddingHorizontal = freezed,Object? paddingVertical = freezed,}) { + return _then(_self.copyWith( +title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable +as String?,paddingHorizontal: freezed == paddingHorizontal ? _self.paddingHorizontal : paddingHorizontal // ignore: cast_nullable_to_non_nullable +as double?,paddingVertical: freezed == paddingVertical ? _self.paddingVertical : paddingVertical // ignore: cast_nullable_to_non_nullable +as double?, + )); +} + +} + + +/// Adds pattern-matching-related methods to [CardLabelItemData]. +extension CardLabelItemDataPatterns on CardLabelItemData { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _CardLabelItemData value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _CardLabelItemData() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _CardLabelItemData value) $default,){ +final _that = this; +switch (_that) { +case _CardLabelItemData(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _CardLabelItemData value)? $default,){ +final _that = this; +switch (_that) { +case _CardLabelItemData() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? title, double? paddingHorizontal, double? paddingVertical)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _CardLabelItemData() when $default != null: +return $default(_that.title,_that.paddingHorizontal,_that.paddingVertical);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? title, double? paddingHorizontal, double? paddingVertical) $default,) {final _that = this; +switch (_that) { +case _CardLabelItemData(): +return $default(_that.title,_that.paddingHorizontal,_that.paddingVertical);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? title, double? paddingHorizontal, double? paddingVertical)? $default,) {final _that = this; +switch (_that) { +case _CardLabelItemData() when $default != null: +return $default(_that.title,_that.paddingHorizontal,_that.paddingVertical);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _CardLabelItemData implements CardLabelItemData { + const _CardLabelItemData({this.title, this.paddingHorizontal, this.paddingVertical}); + factory _CardLabelItemData.fromJson(Map json) => _$CardLabelItemDataFromJson(json); + +@override final String? title; +@override final double? paddingHorizontal; +@override final double? paddingVertical; + +/// Create a copy of CardLabelItemData +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$CardLabelItemDataCopyWith<_CardLabelItemData> get copyWith => __$CardLabelItemDataCopyWithImpl<_CardLabelItemData>(this, _$identity); + +@override +Map toJson() { + return _$CardLabelItemDataToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _CardLabelItemData&&(identical(other.title, title) || other.title == title)&&(identical(other.paddingHorizontal, paddingHorizontal) || other.paddingHorizontal == paddingHorizontal)&&(identical(other.paddingVertical, paddingVertical) || other.paddingVertical == paddingVertical)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,title,paddingHorizontal,paddingVertical); + +@override +String toString() { + return 'CardLabelItemData(title: $title, paddingHorizontal: $paddingHorizontal, paddingVertical: $paddingVertical)'; +} + + +} + +/// @nodoc +abstract mixin class _$CardLabelItemDataCopyWith<$Res> implements $CardLabelItemDataCopyWith<$Res> { + factory _$CardLabelItemDataCopyWith(_CardLabelItemData value, $Res Function(_CardLabelItemData) _then) = __$CardLabelItemDataCopyWithImpl; +@override @useResult +$Res call({ + String? title, double? paddingHorizontal, double? paddingVertical +}); + + + + +} +/// @nodoc +class __$CardLabelItemDataCopyWithImpl<$Res> + implements _$CardLabelItemDataCopyWith<$Res> { + __$CardLabelItemDataCopyWithImpl(this._self, this._then); + + final _CardLabelItemData _self; + final $Res Function(_CardLabelItemData) _then; + +/// Create a copy of CardLabelItemData +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? title = freezed,Object? paddingHorizontal = freezed,Object? paddingVertical = freezed,}) { + return _then(_CardLabelItemData( +title: freezed == title ? _self.title : title // ignore: cast_nullable_to_non_nullable +as String?,paddingHorizontal: freezed == paddingHorizontal ? _self.paddingHorizontal : paddingHorizontal // ignore: cast_nullable_to_non_nullable +as double?,paddingVertical: freezed == paddingVertical ? _self.paddingVertical : paddingVertical // ignore: cast_nullable_to_non_nullable +as double?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/presentation/widget/sdui/widgets/card_label_item/model/card_label_item_sdui_model.g.dart b/packages/chicken/lib/presentation/widget/sdui/widgets/card_label_item/model/card_label_item_sdui_model.g.dart new file mode 100644 index 0000000..c3d8878 --- /dev/null +++ b/packages/chicken/lib/presentation/widget/sdui/widgets/card_label_item/model/card_label_item_sdui_model.g.dart @@ -0,0 +1,39 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'card_label_item_sdui_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_CardLabelItemSDUI _$CardLabelItemSDUIFromJson(Map json) => + _CardLabelItemSDUI( + type: json['type'] as String?, + visible: json['visible'] as bool?, + data: json['data'] == null + ? null + : CardLabelItemData.fromJson(json['data'] as Map), + child: json['child'] as Map?, + ); + +Map _$CardLabelItemSDUIToJson(_CardLabelItemSDUI instance) => + { + 'type': instance.type, + 'visible': instance.visible, + 'data': instance.data, + 'child': instance.child, + }; + +_CardLabelItemData _$CardLabelItemDataFromJson(Map json) => + _CardLabelItemData( + title: json['title'] as String?, + paddingHorizontal: (json['padding_horizontal'] as num?)?.toDouble(), + paddingVertical: (json['padding_vertical'] as num?)?.toDouble(), + ); + +Map _$CardLabelItemDataToJson(_CardLabelItemData instance) => + { + 'title': instance.title, + 'padding_horizontal': instance.paddingHorizontal, + 'padding_vertical': instance.paddingVertical, + }; diff --git a/packages/chicken/lib/presentation/widget/sdui/widgets/card_label_item/sdui.json b/packages/chicken/lib/presentation/widget/sdui/widgets/card_label_item/sdui.json new file mode 100644 index 0000000..a053d9d --- /dev/null +++ b/packages/chicken/lib/presentation/widget/sdui/widgets/card_label_item/sdui.json @@ -0,0 +1,13 @@ +{ + "type": "card_label_item", + "visible": true, + "data": { + "title": "اطلاعات مزرعه", + "padding_horizontal": 12.0, + "padding_vertical": 11.0 + }, + "child": { + + } +} + diff --git a/packages/chicken/lib/presentation/widget/sdui/widgets/text_form_filed/model/text_form_field_sdui_model.dart b/packages/chicken/lib/presentation/widget/sdui/widgets/text_form_filed/model/text_form_field_sdui_model.dart new file mode 100644 index 0000000..4d90416 --- /dev/null +++ b/packages/chicken/lib/presentation/widget/sdui/widgets/text_form_filed/model/text_form_field_sdui_model.dart @@ -0,0 +1,29 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'text_form_field_sdui_model.freezed.dart'; +part 'text_form_field_sdui_model.g.dart'; + +@freezed +abstract class TextFormFieldSDUIModel with _$TextFormFieldSDUIModel { + const factory TextFormFieldSDUIModel({ + String? key, + String? label, + String? hintText, + String? variant, + String? keyboardType, + String? value, + int? maxLength, + int? minLine, + int? maxLine, + bool? required, + bool? enabled, + bool? readonly, + bool? commaSperator, + bool? decimal, + int? decimalPlaces, + String? type, + }) = _TextFormFieldSDUIModel; + + factory TextFormFieldSDUIModel.fromJson(Map json) => + _$TextFormFieldSDUIModelFromJson(json); +} diff --git a/packages/chicken/lib/presentation/widget/sdui/widgets/text_form_filed/model/text_form_field_sdui_model.freezed.dart b/packages/chicken/lib/presentation/widget/sdui/widgets/text_form_filed/model/text_form_field_sdui_model.freezed.dart new file mode 100644 index 0000000..5129a0f --- /dev/null +++ b/packages/chicken/lib/presentation/widget/sdui/widgets/text_form_filed/model/text_form_field_sdui_model.freezed.dart @@ -0,0 +1,322 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'text_form_field_sdui_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$TextFormFieldSDUIModel { + + String? get key; String? get label; String? get hintText; String? get variant; String? get keyboardType; String? get value; int? get maxLength; int? get minLine; int? get maxLine; bool? get required; bool? get enabled; bool? get readonly; bool? get commaSperator; bool? get decimal; int? get decimalPlaces; String? get type; +/// Create a copy of TextFormFieldSDUIModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$TextFormFieldSDUIModelCopyWith get copyWith => _$TextFormFieldSDUIModelCopyWithImpl(this as TextFormFieldSDUIModel, _$identity); + + /// Serializes this TextFormFieldSDUIModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is TextFormFieldSDUIModel&&(identical(other.key, key) || other.key == key)&&(identical(other.label, label) || other.label == label)&&(identical(other.hintText, hintText) || other.hintText == hintText)&&(identical(other.variant, variant) || other.variant == variant)&&(identical(other.keyboardType, keyboardType) || other.keyboardType == keyboardType)&&(identical(other.value, value) || other.value == value)&&(identical(other.maxLength, maxLength) || other.maxLength == maxLength)&&(identical(other.minLine, minLine) || other.minLine == minLine)&&(identical(other.maxLine, maxLine) || other.maxLine == maxLine)&&(identical(other.required, required) || other.required == required)&&(identical(other.enabled, enabled) || other.enabled == enabled)&&(identical(other.readonly, readonly) || other.readonly == readonly)&&(identical(other.commaSperator, commaSperator) || other.commaSperator == commaSperator)&&(identical(other.decimal, decimal) || other.decimal == decimal)&&(identical(other.decimalPlaces, decimalPlaces) || other.decimalPlaces == decimalPlaces)&&(identical(other.type, type) || other.type == type)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,label,hintText,variant,keyboardType,value,maxLength,minLine,maxLine,required,enabled,readonly,commaSperator,decimal,decimalPlaces,type); + +@override +String toString() { + return 'TextFormFieldSDUIModel(key: $key, label: $label, hintText: $hintText, variant: $variant, keyboardType: $keyboardType, value: $value, maxLength: $maxLength, minLine: $minLine, maxLine: $maxLine, required: $required, enabled: $enabled, readonly: $readonly, commaSperator: $commaSperator, decimal: $decimal, decimalPlaces: $decimalPlaces, type: $type)'; +} + + +} + +/// @nodoc +abstract mixin class $TextFormFieldSDUIModelCopyWith<$Res> { + factory $TextFormFieldSDUIModelCopyWith(TextFormFieldSDUIModel value, $Res Function(TextFormFieldSDUIModel) _then) = _$TextFormFieldSDUIModelCopyWithImpl; +@useResult +$Res call({ + String? key, String? label, String? hintText, String? variant, String? keyboardType, String? value, int? maxLength, int? minLine, int? maxLine, bool? required, bool? enabled, bool? readonly, bool? commaSperator, bool? decimal, int? decimalPlaces, String? type +}); + + + + +} +/// @nodoc +class _$TextFormFieldSDUIModelCopyWithImpl<$Res> + implements $TextFormFieldSDUIModelCopyWith<$Res> { + _$TextFormFieldSDUIModelCopyWithImpl(this._self, this._then); + + final TextFormFieldSDUIModel _self; + final $Res Function(TextFormFieldSDUIModel) _then; + +/// Create a copy of TextFormFieldSDUIModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? key = freezed,Object? label = freezed,Object? hintText = freezed,Object? variant = freezed,Object? keyboardType = freezed,Object? value = freezed,Object? maxLength = freezed,Object? minLine = freezed,Object? maxLine = freezed,Object? required = freezed,Object? enabled = freezed,Object? readonly = freezed,Object? commaSperator = freezed,Object? decimal = freezed,Object? decimalPlaces = freezed,Object? type = freezed,}) { + return _then(_self.copyWith( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,label: freezed == label ? _self.label : label // ignore: cast_nullable_to_non_nullable +as String?,hintText: freezed == hintText ? _self.hintText : hintText // ignore: cast_nullable_to_non_nullable +as String?,variant: freezed == variant ? _self.variant : variant // ignore: cast_nullable_to_non_nullable +as String?,keyboardType: freezed == keyboardType ? _self.keyboardType : keyboardType // ignore: cast_nullable_to_non_nullable +as String?,value: freezed == value ? _self.value : value // ignore: cast_nullable_to_non_nullable +as String?,maxLength: freezed == maxLength ? _self.maxLength : maxLength // ignore: cast_nullable_to_non_nullable +as int?,minLine: freezed == minLine ? _self.minLine : minLine // ignore: cast_nullable_to_non_nullable +as int?,maxLine: freezed == maxLine ? _self.maxLine : maxLine // ignore: cast_nullable_to_non_nullable +as int?,required: freezed == required ? _self.required : required // ignore: cast_nullable_to_non_nullable +as bool?,enabled: freezed == enabled ? _self.enabled : enabled // ignore: cast_nullable_to_non_nullable +as bool?,readonly: freezed == readonly ? _self.readonly : readonly // ignore: cast_nullable_to_non_nullable +as bool?,commaSperator: freezed == commaSperator ? _self.commaSperator : commaSperator // ignore: cast_nullable_to_non_nullable +as bool?,decimal: freezed == decimal ? _self.decimal : decimal // ignore: cast_nullable_to_non_nullable +as bool?,decimalPlaces: freezed == decimalPlaces ? _self.decimalPlaces : decimalPlaces // ignore: cast_nullable_to_non_nullable +as int?,type: freezed == type ? _self.type : type // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + +} + + +/// Adds pattern-matching-related methods to [TextFormFieldSDUIModel]. +extension TextFormFieldSDUIModelPatterns on TextFormFieldSDUIModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _TextFormFieldSDUIModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _TextFormFieldSDUIModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _TextFormFieldSDUIModel value) $default,){ +final _that = this; +switch (_that) { +case _TextFormFieldSDUIModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _TextFormFieldSDUIModel value)? $default,){ +final _that = this; +switch (_that) { +case _TextFormFieldSDUIModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( String? key, String? label, String? hintText, String? variant, String? keyboardType, String? value, int? maxLength, int? minLine, int? maxLine, bool? required, bool? enabled, bool? readonly, bool? commaSperator, bool? decimal, int? decimalPlaces, String? type)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _TextFormFieldSDUIModel() when $default != null: +return $default(_that.key,_that.label,_that.hintText,_that.variant,_that.keyboardType,_that.value,_that.maxLength,_that.minLine,_that.maxLine,_that.required,_that.enabled,_that.readonly,_that.commaSperator,_that.decimal,_that.decimalPlaces,_that.type);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( String? key, String? label, String? hintText, String? variant, String? keyboardType, String? value, int? maxLength, int? minLine, int? maxLine, bool? required, bool? enabled, bool? readonly, bool? commaSperator, bool? decimal, int? decimalPlaces, String? type) $default,) {final _that = this; +switch (_that) { +case _TextFormFieldSDUIModel(): +return $default(_that.key,_that.label,_that.hintText,_that.variant,_that.keyboardType,_that.value,_that.maxLength,_that.minLine,_that.maxLine,_that.required,_that.enabled,_that.readonly,_that.commaSperator,_that.decimal,_that.decimalPlaces,_that.type);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String? key, String? label, String? hintText, String? variant, String? keyboardType, String? value, int? maxLength, int? minLine, int? maxLine, bool? required, bool? enabled, bool? readonly, bool? commaSperator, bool? decimal, int? decimalPlaces, String? type)? $default,) {final _that = this; +switch (_that) { +case _TextFormFieldSDUIModel() when $default != null: +return $default(_that.key,_that.label,_that.hintText,_that.variant,_that.keyboardType,_that.value,_that.maxLength,_that.minLine,_that.maxLine,_that.required,_that.enabled,_that.readonly,_that.commaSperator,_that.decimal,_that.decimalPlaces,_that.type);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _TextFormFieldSDUIModel implements TextFormFieldSDUIModel { + const _TextFormFieldSDUIModel({this.key, this.label, this.hintText, this.variant, this.keyboardType, this.value, this.maxLength, this.minLine, this.maxLine, this.required, this.enabled, this.readonly, this.commaSperator, this.decimal, this.decimalPlaces, this.type}); + factory _TextFormFieldSDUIModel.fromJson(Map json) => _$TextFormFieldSDUIModelFromJson(json); + +@override final String? key; +@override final String? label; +@override final String? hintText; +@override final String? variant; +@override final String? keyboardType; +@override final String? value; +@override final int? maxLength; +@override final int? minLine; +@override final int? maxLine; +@override final bool? required; +@override final bool? enabled; +@override final bool? readonly; +@override final bool? commaSperator; +@override final bool? decimal; +@override final int? decimalPlaces; +@override final String? type; + +/// Create a copy of TextFormFieldSDUIModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$TextFormFieldSDUIModelCopyWith<_TextFormFieldSDUIModel> get copyWith => __$TextFormFieldSDUIModelCopyWithImpl<_TextFormFieldSDUIModel>(this, _$identity); + +@override +Map toJson() { + return _$TextFormFieldSDUIModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _TextFormFieldSDUIModel&&(identical(other.key, key) || other.key == key)&&(identical(other.label, label) || other.label == label)&&(identical(other.hintText, hintText) || other.hintText == hintText)&&(identical(other.variant, variant) || other.variant == variant)&&(identical(other.keyboardType, keyboardType) || other.keyboardType == keyboardType)&&(identical(other.value, value) || other.value == value)&&(identical(other.maxLength, maxLength) || other.maxLength == maxLength)&&(identical(other.minLine, minLine) || other.minLine == minLine)&&(identical(other.maxLine, maxLine) || other.maxLine == maxLine)&&(identical(other.required, required) || other.required == required)&&(identical(other.enabled, enabled) || other.enabled == enabled)&&(identical(other.readonly, readonly) || other.readonly == readonly)&&(identical(other.commaSperator, commaSperator) || other.commaSperator == commaSperator)&&(identical(other.decimal, decimal) || other.decimal == decimal)&&(identical(other.decimalPlaces, decimalPlaces) || other.decimalPlaces == decimalPlaces)&&(identical(other.type, type) || other.type == type)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,key,label,hintText,variant,keyboardType,value,maxLength,minLine,maxLine,required,enabled,readonly,commaSperator,decimal,decimalPlaces,type); + +@override +String toString() { + return 'TextFormFieldSDUIModel(key: $key, label: $label, hintText: $hintText, variant: $variant, keyboardType: $keyboardType, value: $value, maxLength: $maxLength, minLine: $minLine, maxLine: $maxLine, required: $required, enabled: $enabled, readonly: $readonly, commaSperator: $commaSperator, decimal: $decimal, decimalPlaces: $decimalPlaces, type: $type)'; +} + + +} + +/// @nodoc +abstract mixin class _$TextFormFieldSDUIModelCopyWith<$Res> implements $TextFormFieldSDUIModelCopyWith<$Res> { + factory _$TextFormFieldSDUIModelCopyWith(_TextFormFieldSDUIModel value, $Res Function(_TextFormFieldSDUIModel) _then) = __$TextFormFieldSDUIModelCopyWithImpl; +@override @useResult +$Res call({ + String? key, String? label, String? hintText, String? variant, String? keyboardType, String? value, int? maxLength, int? minLine, int? maxLine, bool? required, bool? enabled, bool? readonly, bool? commaSperator, bool? decimal, int? decimalPlaces, String? type +}); + + + + +} +/// @nodoc +class __$TextFormFieldSDUIModelCopyWithImpl<$Res> + implements _$TextFormFieldSDUIModelCopyWith<$Res> { + __$TextFormFieldSDUIModelCopyWithImpl(this._self, this._then); + + final _TextFormFieldSDUIModel _self; + final $Res Function(_TextFormFieldSDUIModel) _then; + +/// Create a copy of TextFormFieldSDUIModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? key = freezed,Object? label = freezed,Object? hintText = freezed,Object? variant = freezed,Object? keyboardType = freezed,Object? value = freezed,Object? maxLength = freezed,Object? minLine = freezed,Object? maxLine = freezed,Object? required = freezed,Object? enabled = freezed,Object? readonly = freezed,Object? commaSperator = freezed,Object? decimal = freezed,Object? decimalPlaces = freezed,Object? type = freezed,}) { + return _then(_TextFormFieldSDUIModel( +key: freezed == key ? _self.key : key // ignore: cast_nullable_to_non_nullable +as String?,label: freezed == label ? _self.label : label // ignore: cast_nullable_to_non_nullable +as String?,hintText: freezed == hintText ? _self.hintText : hintText // ignore: cast_nullable_to_non_nullable +as String?,variant: freezed == variant ? _self.variant : variant // ignore: cast_nullable_to_non_nullable +as String?,keyboardType: freezed == keyboardType ? _self.keyboardType : keyboardType // ignore: cast_nullable_to_non_nullable +as String?,value: freezed == value ? _self.value : value // ignore: cast_nullable_to_non_nullable +as String?,maxLength: freezed == maxLength ? _self.maxLength : maxLength // ignore: cast_nullable_to_non_nullable +as int?,minLine: freezed == minLine ? _self.minLine : minLine // ignore: cast_nullable_to_non_nullable +as int?,maxLine: freezed == maxLine ? _self.maxLine : maxLine // ignore: cast_nullable_to_non_nullable +as int?,required: freezed == required ? _self.required : required // ignore: cast_nullable_to_non_nullable +as bool?,enabled: freezed == enabled ? _self.enabled : enabled // ignore: cast_nullable_to_non_nullable +as bool?,readonly: freezed == readonly ? _self.readonly : readonly // ignore: cast_nullable_to_non_nullable +as bool?,commaSperator: freezed == commaSperator ? _self.commaSperator : commaSperator // ignore: cast_nullable_to_non_nullable +as bool?,decimal: freezed == decimal ? _self.decimal : decimal // ignore: cast_nullable_to_non_nullable +as bool?,decimalPlaces: freezed == decimalPlaces ? _self.decimalPlaces : decimalPlaces // ignore: cast_nullable_to_non_nullable +as int?,type: freezed == type ? _self.type : type // ignore: cast_nullable_to_non_nullable +as String?, + )); +} + + +} + +// dart format on diff --git a/packages/chicken/lib/presentation/widget/sdui/widgets/text_form_filed/model/text_form_field_sdui_model.g.dart b/packages/chicken/lib/presentation/widget/sdui/widgets/text_form_filed/model/text_form_field_sdui_model.g.dart new file mode 100644 index 0000000..4f7e44e --- /dev/null +++ b/packages/chicken/lib/presentation/widget/sdui/widgets/text_form_filed/model/text_form_field_sdui_model.g.dart @@ -0,0 +1,49 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'text_form_field_sdui_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_TextFormFieldSDUIModel _$TextFormFieldSDUIModelFromJson( + Map json, +) => _TextFormFieldSDUIModel( + key: json['key'] as String?, + label: json['label'] as String?, + hintText: json['hint_text'] as String?, + variant: json['variant'] as String?, + keyboardType: json['keyboard_type'] as String?, + value: json['value'] as String?, + maxLength: (json['max_length'] as num?)?.toInt(), + minLine: (json['min_line'] as num?)?.toInt(), + maxLine: (json['max_line'] as num?)?.toInt(), + required: json['required'] as bool?, + enabled: json['enabled'] as bool?, + readonly: json['readonly'] as bool?, + commaSperator: json['comma_sperator'] as bool?, + decimal: json['decimal'] as bool?, + decimalPlaces: (json['decimal_places'] as num?)?.toInt(), + type: json['type'] as String?, +); + +Map _$TextFormFieldSDUIModelToJson( + _TextFormFieldSDUIModel instance, +) => { + 'key': instance.key, + 'label': instance.label, + 'hint_text': instance.hintText, + 'variant': instance.variant, + 'keyboard_type': instance.keyboardType, + 'value': instance.value, + 'max_length': instance.maxLength, + 'min_line': instance.minLine, + 'max_line': instance.maxLine, + 'required': instance.required, + 'enabled': instance.enabled, + 'readonly': instance.readonly, + 'comma_sperator': instance.commaSperator, + 'decimal': instance.decimal, + 'decimal_places': instance.decimalPlaces, + 'type': instance.type, +}; diff --git a/packages/chicken/lib/presentation/widget/sdui/widgets/text_form_filed/sdui.txt b/packages/chicken/lib/presentation/widget/sdui/widgets/text_form_filed/sdui.txt new file mode 100644 index 0000000..7447b6f --- /dev/null +++ b/packages/chicken/lib/presentation/widget/sdui/widgets/text_form_filed/sdui.txt @@ -0,0 +1,28 @@ +{ + "type": "text_form_field", + + "data": { + + "key": "user_full_name", + "label": "نام و نام خانوادگی", + "hintText": "لطفاً نام خود را وارد کنید", + "variant": "normal", + "keyboardType": "text", + "maxLength": 100, + "minLine":1, + "maxLine":1, + "required": true, + "enabled": true, + "readonly": true, + "commaSperator":true, + "decimal":true, + "decimalPlaces":2, + "type": "normal" + + } +} + + +// type => normal / date_picker / +// keyboardType => text / number + diff --git a/packages/chicken/lib/presentation/widget/sdui/widgets/text_form_filed/text_form_filed_sdui.dart b/packages/chicken/lib/presentation/widget/sdui/widgets/text_form_filed/text_form_filed_sdui.dart new file mode 100644 index 0000000..5c7bc3c --- /dev/null +++ b/packages/chicken/lib/presentation/widget/sdui/widgets/text_form_filed/text_form_filed_sdui.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:rasadyar_core/core.dart'; + +import 'model/text_form_field_sdui_model.dart'; + +Widget textFormFiledSDUI({required TextFormFieldSDUIModel model}) { + List? inputFormatters = []; + TextInputType? keyboardType; + + if (model.keyboardType == 'text') { + keyboardType = TextInputType.text; + } else if (model.keyboardType == 'number') { + keyboardType = TextInputType.numberWithOptions( + decimal: model.decimal ?? false, + ); + + inputFormatters.add(FilteringTextInputFormatter.digitsOnly); + } + + if (model.commaSperator ?? false) { + inputFormatters.add(SeparatorInputFormatter()); + } + + return RTextField( + controller: TextEditingController(text: model.value), + label: model.label, + filled: true, + filledColor: AppColor.bgLight, + hintText: model.hintText, + keyboardType: keyboardType, + maxLength: model.maxLength, + minLines: model.minLine, + maxLines: model.maxLine, + enabled: model.enabled ?? false, + inputFormatters: inputFormatters, + readonly: model.readonly ?? false, + ); +} diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index abe9e58..c0cdd1a 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -49,9 +49,6 @@ class $AssetsIconsGen { /// File path: assets/icons/bg_auth.svg SvgGenImage get bgAuth => const SvgGenImage('assets/icons/bg_auth.svg'); - /// File path: assets/icons/bg_auth_dam.svg - SvgGenImage get bgAuthDam => const SvgGenImage('assets/icons/bg_auth_dam.svg'); - /// File path: assets/icons/bg_header_user_profile.svg SvgGenImage get bgHeaderUserProfile => const SvgGenImage('assets/icons/bg_header_user_profile.svg'); @@ -166,9 +163,6 @@ class $AssetsIconsGen { /// File path: assets/icons/cube_watting.svg SvgGenImage get cubeWatting => const SvgGenImage('assets/icons/cube_watting.svg'); - /// File path: assets/icons/dam_pattern.svg - SvgGenImage get damPattern => const SvgGenImage('assets/icons/dam_pattern.svg'); - /// File path: assets/icons/diagram.svg SvgGenImage get diagram => const SvgGenImage('assets/icons/diagram.svg'); @@ -274,6 +268,9 @@ class $AssetsIconsGen { /// File path: assets/icons/outside.svg SvgGenImage get outside => const SvgGenImage('assets/icons/outside.svg'); + /// File path: assets/icons/pattern_dam.svg + SvgGenImage get patternDam => const SvgGenImage('assets/icons/pattern_dam.svg'); + /// File path: assets/icons/pdf_download.svg SvgGenImage get pdfDownload => const SvgGenImage('assets/icons/pdf_download.svg'); @@ -402,7 +399,6 @@ class $AssetsIconsGen { arrowLeft, arrowRight, bgAuth, - bgAuthDam, bgHeaderUserProfile, boxRemove, boxTick, @@ -441,7 +437,6 @@ class $AssetsIconsGen { cubeSearch, cubeTopRotation, cubeWatting, - damPattern, diagram, directPurchase, download, @@ -477,6 +472,7 @@ class $AssetsIconsGen { noteRemove, ordersReceived, outside, + patternDam, pdfDownload, people, pictureFrame, @@ -576,9 +572,6 @@ class $AssetsVecGen { /// File path: assets/vec/bg_auth.svg.vec SvgGenImage get bgAuthSvg => const SvgGenImage.vec('assets/vec/bg_auth.svg.vec'); - /// File path: assets/vec/bg_auth_dam.svg.vec - SvgGenImage get bgAuthDamSvg => const SvgGenImage.vec('assets/vec/bg_auth_dam.svg.vec'); - /// File path: assets/vec/bg_header_user_profile.svg.vec SvgGenImage get bgHeaderUserProfileSvg => const SvgGenImage.vec('assets/vec/bg_header_user_profile.svg.vec'); @@ -693,9 +686,6 @@ class $AssetsVecGen { /// File path: assets/vec/cube_watting.svg.vec SvgGenImage get cubeWattingSvg => const SvgGenImage.vec('assets/vec/cube_watting.svg.vec'); - /// File path: assets/vec/dam_pattern.svg.vec - SvgGenImage get damPatternSvg => const SvgGenImage.vec('assets/vec/dam_pattern.svg.vec'); - /// File path: assets/vec/diagram.svg.vec SvgGenImage get diagramSvg => const SvgGenImage.vec('assets/vec/diagram.svg.vec'); @@ -801,6 +791,9 @@ class $AssetsVecGen { /// File path: assets/vec/outside.svg.vec SvgGenImage get outsideSvg => const SvgGenImage.vec('assets/vec/outside.svg.vec'); + /// File path: assets/vec/pattern_dam.svg.vec + SvgGenImage get patternDamSvg => const SvgGenImage.vec('assets/vec/pattern_dam.svg.vec'); + /// File path: assets/vec/pdf_download.svg.vec SvgGenImage get pdfDownloadSvg => const SvgGenImage.vec('assets/vec/pdf_download.svg.vec'); @@ -929,7 +922,6 @@ class $AssetsVecGen { arrowLeftSvg, arrowRightSvg, bgAuthSvg, - bgAuthDamSvg, bgHeaderUserProfileSvg, boxRemoveSvg, boxTickSvg, @@ -968,7 +960,6 @@ class $AssetsVecGen { cubeSearchSvg, cubeTopRotationSvg, cubeWattingSvg, - damPatternSvg, diagramSvg, directPurchaseSvg, downloadSvg, @@ -1004,6 +995,7 @@ class $AssetsVecGen { noteRemoveSvg, ordersReceivedSvg, outsideSvg, + patternDamSvg, pdfDownloadSvg, peopleSvg, pictureFrameSvg, diff --git a/packages/livestock/lib/features/auth/presentation/pages/view.dart b/packages/livestock/lib/features/auth/presentation/pages/view.dart index 636a3da..1d117b9 100644 --- a/packages/livestock/lib/features/auth/presentation/pages/view.dart +++ b/packages/livestock/lib/features/auth/presentation/pages/view.dart @@ -20,7 +20,7 @@ class AuthPage extends GetView { alignment: Alignment.center, fit: StackFit.expand, children: [ - Assets.icons.bgAuthDam.svg(fit: BoxFit.fill), + // Assets.icons.bgAuthDam.svg(fit: BoxFit.fill), Center( child: Padding(