diff --git a/.vscode/launch.json b/.vscode/launch.json index 56a0452..ef3b4ee 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,23 +4,25 @@ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ - { "name": "rasadyar_app", "request": "launch", - "type": "dart" + "type": "dart", + "program": "lib/main.dart", }, { "name": "rasadyar_app (profile mode)", "request": "launch", "type": "dart", - "flutterMode": "profile" + "flutterMode": "profile", + "program": "lib/main.dart", }, { "name": "rasadyar_app (release mode)", "request": "launch", "type": "dart", - "flutterMode": "release" + "flutterMode": "release", + "program": "lib/main.dart", } ] } \ No newline at end of file diff --git a/assets/icons/gallery_add.svg b/assets/icons/gallery_add.svg new file mode 100644 index 0000000..adb97ee --- /dev/null +++ b/assets/icons/gallery_add.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/vec/gallery_add.svg.vec b/assets/vec/gallery_add.svg.vec new file mode 100644 index 0000000..cf57447 Binary files /dev/null and b/assets/vec/gallery_add.svg.vec differ diff --git a/packages/chicken/lib/data/data_source/remote/auth/auth_remote_imp.dart b/packages/chicken/lib/data/data_source/remote/auth/auth_remote_imp.dart index 6454fed..a0b85f8 100644 --- a/packages/chicken/lib/data/data_source/remote/auth/auth_remote_imp.dart +++ b/packages/chicken/lib/data/data_source/remote/auth/auth_remote_imp.dart @@ -11,7 +11,9 @@ class AuthRemoteDataSourceImp extends AuthRemoteDataSource { AuthRemoteDataSourceImp(this._httpClient); @override - Future login({required Map authRequest}) async { + Future login({ + required Map authRequest, + }) async { var res = await _httpClient.post( '/api/login/', data: authRequest, @@ -40,7 +42,7 @@ class AuthRemoteDataSourceImp extends AuthRemoteDataSource { @override Future getUserInfo(String phoneNumber) async { var res = await _httpClient.post( - 'https://userbackend.rasadyaar.ir/api/send_otp/', + 'https://userbackend.rasadyar.com/api/send_otp/', data: {"mobile": phoneNumber, "state": ""}, fromJson: UserInfoModel.fromJson, headers: {'Content-Type': 'application/json'}, @@ -56,7 +58,10 @@ class AuthRemoteDataSourceImp extends AuthRemoteDataSource { await _httpClient.post( '/steward-app-login/', data: queryParameters, - headers: {'Content-Type': 'application/json', 'Authorization': 'Bearer $token'}, + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer $token', + }, ); } } diff --git a/packages/chicken/lib/presentation/pages/poultry_farm_inspection/home/logic.dart b/packages/chicken/lib/presentation/pages/poultry_farm_inspection/home/logic.dart index 4ae4728..7a82560 100644 --- a/packages/chicken/lib/presentation/pages/poultry_farm_inspection/home/logic.dart +++ b/packages/chicken/lib/presentation/pages/poultry_farm_inspection/home/logic.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; +import '../widgets/step1_page.dart'; + class PoultryFarmInspectionHomeLogic extends GetxController with GetTickerProviderStateMixin { RxInt selectedSegmentIndex = 0.obs; @@ -21,16 +23,39 @@ class PoultryFarmInspectionHomeLogic extends GetxController RxInt selectedTabIndex = 0.obs; - @override - void onInit() { - super.onInit(); - tabController = TabController(length: 4, vsync: this); - } + RxInt activeStepperIndex = 0.obs; + + PageController pageController = PageController(initialPage: 0); + + //step1 + + TextEditingController nameOfThePoultryFarmUnit = TextEditingController(); + + //step2 + RxInt sanitaryConditionOfTheHallIndex = (-1).obs; + RxInt ventilationStatusIndex = (-1).obs; + RxInt beddingStatusIndex = (-1).obs; + RxInt waterQualityIndex = (-1).obs; + RxInt fuelTypeIndex = (-1).obs; + RxInt sampleTypeIndex = (-1).obs; + + //step3 + RxInt grainQualityInputIndex = (-1).obs; + RxInt generatorOperatingStatusIndex = (-1).obs; + RxInt workerContractStatusIndex = (-1).obs; + RxInt newBeneficiaryRequestIndex = (-1).obs; @override void onReady() { - // TODO: implement onReady super.onReady(); + + activeStepperIndex.listen((value) { + pageController.animateToPage( + value, + duration: Duration(milliseconds: 300), + curve: Curves.linear, + ); + }); } @override @@ -56,5 +81,58 @@ class PoultryFarmInspectionHomeLogic extends GetxController return; } selectedTabIndex.value = index; - } + } + + void clearForm() { + nameOfThePoultryFarmUnit.clear(); + activeStepperIndex.value = 0; + } + + void setSanitaryConditionOfTheHallIndex(int index) { + sanitaryConditionOfTheHallIndex.value = + index == sanitaryConditionOfTheHallIndex.value ? -1 : index; + } + + void setFuelTypeIndex(int index) { + fuelTypeIndex.value = index == fuelTypeIndex.value ? -1 : index; + } + + void setVentilationStatusIndex(int index) { + ventilationStatusIndex.value = index == ventilationStatusIndex.value + ? -1 + : index; + } + + void setBeddingStatusIndex(int index) { + beddingStatusIndex.value = index == beddingStatusIndex.value ? -1 : index; + } + + void setWaterQualityIndex(int index) { + waterQualityIndex.value = index == waterQualityIndex.value ? -1 : index; + } + + void setSampleTypeIndex(int index) { + sampleTypeIndex.value = index == sampleTypeIndex.value ? -1 : index; + } + + void setGrainQualityInputIndex(int index) { + grainQualityInputIndex.value = index == grainQualityInputIndex.value + ? -1 + : index; + } + + void setGeneratorOperatingStatusIndex(int index) { + generatorOperatingStatusIndex.value = + index == generatorOperatingStatusIndex.value ? -1 : index; + } + + + void setWorkerContractStatusIndex(int index) { + workerContractStatusIndex.value = index == workerContractStatusIndex.value ? -1 : index; + } + + + void setNewBeneficiaryRequestIndex(int index) { + newBeneficiaryRequestIndex.value = index == newBeneficiaryRequestIndex.value ? -1 : index; + } } diff --git a/packages/chicken/lib/presentation/pages/poultry_farm_inspection/home/view.dart b/packages/chicken/lib/presentation/pages/poultry_farm_inspection/home/view.dart index 9487553..f190789 100644 --- a/packages/chicken/lib/presentation/pages/poultry_farm_inspection/home/view.dart +++ b/packages/chicken/lib/presentation/pages/poultry_farm_inspection/home/view.dart @@ -4,6 +4,7 @@ import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; import 'package:rasadyar_chicken/presentation/widget/info_card/info_card.dart'; import 'package:rasadyar_core/core.dart'; +import '../widgets/cu_bottom_sheet.dart'; import 'logic.dart'; class PoultryFarmInspectionHomePage @@ -25,17 +26,39 @@ class PoultryFarmInspectionHomePage //TODO }, backId: poultryFirstKey, - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, + + child: Stack( + fit: StackFit.expand, children: [ - infoCards(), - segmentWidget(), - ObxValue((data) { - return data.value == 0 - ? activeInspectionWidget() - : inactiveInspectionWidget(); - }, controller.selectedSegmentIndex), + Positioned.fill( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + infoCards(), + segmentWidget(), + ObxValue((data) { + return data.value == 0 + ? activeInspectionWidget() + : inactiveInspectionWidget(); + }, controller.selectedSegmentIndex), + ], + ), + ), + + Positioned( + right: 10, + bottom: 90.h, + child: RFab.add( + onPressed: () { + Get.bottomSheet( + addOrEditBottomSheet(controller), + isScrollControlled: true, + ignoreSafeArea: false, + ).then((value) => controller.clearForm(),); + }, + ), + ), ], ), ); @@ -1067,5 +1090,5 @@ class PoultryFarmInspectionHomePage ], ), ); - } + } } diff --git a/packages/chicken/lib/presentation/pages/poultry_farm_inspection/root/logic.dart b/packages/chicken/lib/presentation/pages/poultry_farm_inspection/root/logic.dart deleted file mode 100644 index 82090e1..0000000 --- a/packages/chicken/lib/presentation/pages/poultry_farm_inspection/root/logic.dart +++ /dev/null @@ -1,44 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:get/get.dart'; -import 'package:rasadyar_core/presentation/common/app_color.dart'; - -class PoultryFarmInspectionRootLogic extends GetxController { - DateTime? _lastBackPressed; - final pages = [ - Container(color: Colors.amber), - Container(color: Colors.blue), - Container(color: Colors.red), - ]; - - RxInt currentPage = 0.obs; - - @override - void onReady() { - // TODO: implement onReady - super.onReady(); - } - - @override - void onClose() { - // TODO: implement onClose - super.onClose(); - } - - void changePage(int index) { - currentPage.value = index; - } - - void popBackTaped() async { - final now = DateTime.now(); - if (_lastBackPressed == null || now.difference(_lastBackPressed!) > Duration(seconds: 2)) { - _lastBackPressed = now; - Get.snackbar( - 'خروج از برنامه', - 'برای خروج دوباره بازگشت را بزنید', - snackPosition: SnackPosition.TOP, - duration: Duration(seconds: 2), - backgroundColor: AppColor.warning, - ); - } - } -} diff --git a/packages/chicken/lib/presentation/pages/poultry_farm_inspection/root/view.dart b/packages/chicken/lib/presentation/pages/poultry_farm_inspection/root/view.dart deleted file mode 100644 index 5fe1189..0000000 --- a/packages/chicken/lib/presentation/pages/poultry_farm_inspection/root/view.dart +++ /dev/null @@ -1,58 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart'; -import 'package:rasadyar_core/core.dart'; - -import 'logic.dart'; - -class PoultryFarmInspectionRootPage extends GetView { - const PoultryFarmInspectionRootPage({super.key}); - - @override - Widget build(BuildContext context) { - return ChickenBasePage( - isFullScreen: true, - onPopScopTaped: controller.popBackTaped, - child: ObxValue((data) { - return Stack( - children: [ - IndexedStack(children: controller.pages, index: data.value), - Positioned( - right: 0, - left: 0, - bottom: 0, - child: RBottomNavigation( - mainAxisAlignment: MainAxisAlignment.spaceAround, - items: [ - RBottomNavigationItem( - label: 'بازرسی فعال', - icon: Assets.vec.settingSvg.path, - isSelected: controller.currentPage.value == 0, - onTap: () { - controller.changePage(0); - }, - ), - RBottomNavigationItem( - label: 'خانه', - icon: Assets.vec.homeSvg.path, - isSelected: controller.currentPage.value == 1, - onTap: () { - controller.changePage(1); - }, - ), - RBottomNavigationItem( - label: 'پروفایل', - icon: Assets.vec.profileCircleSvg.path, - isSelected: controller.currentPage.value == 2, - onTap: () { - controller.changePage(3); - }, - ), - ], - ), - ), - ], - ); - }, controller.currentPage), - ); - } -} diff --git a/packages/chicken/lib/presentation/pages/poultry_farm_inspection/widgets/card_info.dart b/packages/chicken/lib/presentation/pages/poultry_farm_inspection/widgets/card_info.dart new file mode 100644 index 0000000..3f55e48 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/poultry_farm_inspection/widgets/card_info.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/presentation/pages/poultry_farm_inspection/home/logic.dart'; +import 'package:rasadyar_core/core.dart'; + +Widget farmInfoWidget({ + required PoultryFarmInspectionHomeLogic controller, + 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), + ), + ), + ), + ], + ); +} + +Widget cardInfo({required Widget child, EdgeInsets? padding}) { + return Container( + width: Get.width, + padding: padding ?? EdgeInsets.symmetric(horizontal: 12.w, vertical: 14.h), + decoration: BoxDecoration( + color: AppColor.bgLight, + + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 1, color: AppColor.blackLight), + ), + child: child, + ); +} diff --git a/packages/chicken/lib/presentation/pages/poultry_farm_inspection/widgets/cu_bottom_sheet.dart b/packages/chicken/lib/presentation/pages/poultry_farm_inspection/widgets/cu_bottom_sheet.dart new file mode 100644 index 0000000..0a31f0f --- /dev/null +++ b/packages/chicken/lib/presentation/pages/poultry_farm_inspection/widgets/cu_bottom_sheet.dart @@ -0,0 +1,195 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/presentation/pages/poultry_farm_inspection/widgets/step2_page.dart'; +import 'package:rasadyar_core/core.dart'; +import '../home/logic.dart'; +import 'step1_page.dart'; +import 'step3_page.dart'; + +Widget addOrEditBottomSheet(PoultryFarmInspectionHomeLogic controller) { + List pages = [ + step1Page(controller), + step2Page(controller), + step3Page(controller), + Container(color: Colors.green), + ]; + + return BaseBottomSheet( + height: Get.height, + rootChild: Column( + children: [ + ObxValue((data) { + return stepper(activeStep: data.value); + }, controller.activeStepperIndex), + Expanded( + child: PageView.builder( + physics: const NeverScrollableScrollPhysics(), + reverse: true, + controller: controller.pageController, + itemBuilder: (context, index) => pages[index], + ), + ), + + ObxValue((data) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Row( + spacing: 16, + children: [ + Expanded( + child: RElevated( + height: 40.h, + backgroundColor: AppColor.greenNormal, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + + children: [ + Icon(Icons.arrow_back_ios, color: Colors.white), + + Text('ادامه'), + ], + ), + onPressed: () { + if (controller.activeStepperIndex.value < 3) { + controller.activeStepperIndex.value++; + } + }, + ), + ), + Expanded( + child: ROutlinedElevated( + borderColor: AppColor.error, + height: 40.h, + child: Text('انصراف'), + enabled: controller.activeStepperIndex.value > 0, + onPressed: () { + if (controller.activeStepperIndex.value > 0) { + controller.activeStepperIndex.value--; + } + }, + ), + ), + ], + ), + ); + }, controller.activeStepperIndex), + ], + ), + ); +} + +class stepper extends StatelessWidget { + const stepper({super.key, required this.activeStep}); + final int activeStep; + + @override + Widget build(BuildContext context) { + return Directionality( + textDirection: TextDirection.ltr, + child: SizedBox( + height: 24, + width: Get.width, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + alignment: Alignment.center, + decoration: BoxDecoration( + color: activeStep >= 0 + ? AppColor.greenNormalHover + : AppColor.whiteNormalActive, + shape: BoxShape.circle, + ), + width: 24.w, + height: 24.h, + child: Text( + '1', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith( + color: activeStep >= 0 ? Colors.white : AppColor.iconColor, + ), + ), + ), + Expanded( + child: Divider( + color: activeStep >= 1 + ? AppColor.greenNormalHover + : AppColor.whiteNormalActive, + thickness: 8, + ), + ), + Container( + alignment: Alignment.center, + decoration: BoxDecoration( + color: activeStep >= 1 + ? AppColor.greenNormalHover + : AppColor.whiteNormalActive, + shape: BoxShape.circle, + ), + width: 24.w, + height: 24.h, + child: Text( + '2', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith( + color: activeStep >= 1 ? Colors.white : AppColor.iconColor, + ), + ), + ), + Expanded( + child: Divider( + color: activeStep >= 2 + ? AppColor.greenNormalHover + : AppColor.whiteNormalActive, + thickness: 8, + ), + ), + Container( + alignment: Alignment.center, + decoration: BoxDecoration( + color: activeStep >= 2 + ? AppColor.greenNormalHover + : AppColor.whiteNormalActive, + shape: BoxShape.circle, + ), + width: 24.w, + height: 24.h, + child: Text( + '3', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith( + color: activeStep >= 2 ? Colors.white : AppColor.iconColor, + ), + ), + ), + Expanded( + child: Divider( + color: activeStep >= 3 + ? AppColor.greenNormalHover + : AppColor.whiteNormalActive, + thickness: 8, + ), + ), + Container( + alignment: Alignment.center, + decoration: BoxDecoration( + color: activeStep >= 3 + ? AppColor.greenNormalHover + : AppColor.whiteNormalActive, + shape: BoxShape.circle, + ), + width: 24.w, + height: 24.h, + child: Text( + '4', + textAlign: TextAlign.center, + style: AppFonts.yekan16.copyWith( + color: activeStep >= 3 ? Colors.white : AppColor.iconColor, + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/packages/chicken/lib/presentation/pages/poultry_farm_inspection/widgets/step1_page.dart b/packages/chicken/lib/presentation/pages/poultry_farm_inspection/widgets/step1_page.dart new file mode 100644 index 0000000..b2be02b --- /dev/null +++ b/packages/chicken/lib/presentation/pages/poultry_farm_inspection/widgets/step1_page.dart @@ -0,0 +1,169 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/presentation/pages/poultry_farm_inspection/widgets/card_info.dart'; +import 'package:rasadyar_core/core.dart'; + +import '../home/logic.dart'; + +Widget step1Page(PoultryFarmInspectionHomeLogic controller) { + return SingleChildScrollView( + physics: BouncingScrollPhysics(), + child: Column( + children: [ + SizedBox(height: 25.h), + + Container( + height: 500.h, + clipBehavior: Clip.none, + width: Get.width, + child: farmInfoWidget( + controller: controller, + title: 'اطلاعات پایه واحد', + child: basicUnitInformation(controller), + ), + ), + + SizedBox(height: 30.h), + + Container( + height: 340.h, + clipBehavior: Clip.none, + width: Get.width, + child: farmInfoWidget( + controller: controller, + title: 'اطلاعات جوجه ریزی', + child: hatchingInformation(controller), + ), + ), + SizedBox(height: 16.h), + ], + ), + ); +} + +Column basicUnitInformation(PoultryFarmInspectionHomeLogic controller) { + return Column( + spacing: 10, + children: [ + SizedBox(height: 1.h), + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'نام واحد مرغداری', + filled: true, + filledColor: AppColor.bgLight, + ), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'کد یکتا / شناسه واحد', + filled: true, + filledColor: AppColor.bgLight, + ), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'نام مالک / بهره‌بردار', + filled: true, + filledColor: AppColor.bgLight, + ), + + ResourceOverlayDropdown( + items: Resource.success(['مالک', 'بهره‌بردار', 'مشاور', 'دیگر']), + + itemBuilder: (item) => Text(item), + labelBuilder: (selected) => Text(selected ?? 'نوع مالکیت'), + ), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'کد ملی بهره‌بردار', + filled: true, + filledColor: AppColor.bgLight, + ), + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'شماره تماس بهره‌بردار', + filled: true, + filledColor: AppColor.bgLight, + ), + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'ظرفیت اسمی سالن‌ها', + filled: true, + filledColor: AppColor.bgLight, + ), + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'نوع سیستم پرورش', + filled: true, + filledColor: AppColor.bgLight, + ), + + RElevated( + isFullWidth: true, + height: 40.h, + backgroundColor: AppColor.greenNormal, + onPressed: () {}, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Icon(Icons.my_location_rounded, color: Colors.white, size: 24), + Text( + 'دریافت موقعیت جغرافیایی', + style: AppFonts.yekan14.copyWith(color: Colors.white), + ), + ], + ), + ), + ], + ); +} + +Column hatchingInformation(PoultryFarmInspectionHomeLogic controller) { + return Column( + spacing: 10, + children: [ + SizedBox(height: 1.h), + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'تاریخ جوجه ریزی', + filled: true, + filledColor: AppColor.bgLight, + ), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'تعداد جوجه‌ریزی اولیه', + filled: true, + filledColor: AppColor.bgLight, + ), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'منبع تهیه جوجه', + filled: true, + filledColor: AppColor.bgLight, + ), + + ResourceOverlayDropdown( + items: Resource.success(['سرابی', 'پژدر', 'روتوایلر', 'دیگر']), + + itemBuilder: (item) => Text(item), + labelBuilder: (selected) => Text(selected ?? 'نوع نژاد'), + ), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'گرید جوجه', + filled: true, + filledColor: AppColor.bgLight, + ), + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'میانگین وزن جوجه در ورود', + filled: true, + filledColor: AppColor.bgLight, + ), + ], + ); +} diff --git a/packages/chicken/lib/presentation/pages/poultry_farm_inspection/widgets/step2_page.dart b/packages/chicken/lib/presentation/pages/poultry_farm_inspection/widgets/step2_page.dart new file mode 100644 index 0000000..1bb4c36 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/poultry_farm_inspection/widgets/step2_page.dart @@ -0,0 +1,530 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/presentation/pages/poultry_farm_inspection/widgets/card_info.dart'; +import 'package:rasadyar_core/core.dart'; + +import '../home/logic.dart'; + +Widget step2Page(PoultryFarmInspectionHomeLogic controller) { + return SingleChildScrollView( + physics: BouncingScrollPhysics(), + child: Column( + children: [ + SizedBox(height: 35.h), + + Container( + height: 645.h, + clipBehavior: Clip.none, + width: Get.width, + child: farmInfoWidget( + controller: controller, + title: 'وضعیت عمومی سالن', + child: generalConditionOfTheHall(controller), + ), + ), + + SizedBox(height: 30.h), + + Container( + height: 410.h, + clipBehavior: Clip.none, + width: Get.width, + child: farmInfoWidget( + controller: controller, + title: 'تلفات', + child: casualtiesInformation(controller), + ), + ), + SizedBox(height: 24.h), + + Container( + height: 380.h, + clipBehavior: Clip.none, + width: Get.width, + child: farmInfoWidget( + controller: controller, + title: 'بیماری‌ها و وضعیت سلامت', + child: diseasesAndHealthInformation(controller), + ), + ), + ], + ), + ); +} + +Column generalConditionOfTheHall(PoultryFarmInspectionHomeLogic controller) { + return Column( + spacing: 10, + children: [ + cardInfo( + padding: EdgeInsets.fromLTRB(0, 12, 12, 6), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 9, + children: [ + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Container( + height: 80.h, + width: 80.w, + padding: EdgeInsets.all(22), + decoration: BoxDecoration( + color: Color(0xFFE9E9E9), + border: Border.all( + width: 1, + color: AppColor.blackLightHover, + ), + borderRadius: BorderRadius.circular(8), + ), + child: Assets.vec.galleryAddSvg.svg(width: 36, height: 36), + ), + ], + ), + ), + + Text( + 'تعداد موجود فعلی', + style: AppFonts.yekan14.copyWith(color: AppColor.textColorLight), + ), + ], + ), + ), + + cardInfo( + padding: EdgeInsets.fromLTRB(12, 12, 12, 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 9, + children: [ + Text( + 'وضعیت بهداشتی سالن', + style: AppFonts.yekan14Bold.copyWith(color: AppColor.textColor2), + ), + + ObxValue((data) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + formChips( + selectedIndex: data.value, + index: 0, + label: 'عالی', + onTap: (index) => + controller.setSanitaryConditionOfTheHallIndex(index), + ), + formChips( + selectedIndex: data.value, + index: 1, + label: 'خوب', + onTap: (index) => + controller.setSanitaryConditionOfTheHallIndex(index), + ), + formChips( + selectedIndex: data.value, + index: 2, + label: 'متوسط', + onTap: (index) => + controller.setSanitaryConditionOfTheHallIndex(index), + ), + formChips( + selectedIndex: data.value, + index: 3, + label: 'ضعیف', + onTap: (index) => + controller.setSanitaryConditionOfTheHallIndex(index), + ), + ], + ); + }, controller.sanitaryConditionOfTheHallIndex), + ], + ), + ), + + cardInfo( + padding: EdgeInsets.fromLTRB(12, 12, 12, 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 9, + children: [ + Text( + 'وضعیت تهویه', + style: AppFonts.yekan14Bold.copyWith(color: AppColor.textColor2), + ), + + ObxValue((data) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 10, + children: [ + formChips( + onTap: (index) => + controller.setVentilationStatusIndex(index), + selectedIndex: data.value, + index: 0, + label: 'خشک', + ), + formChips( + onTap: (index) => + controller.setVentilationStatusIndex(index), + selectedIndex: data.value, + index: 1, + label: 'نیمه‌مرطوب', + ), + formChips( + onTap: (index) => + controller.setVentilationStatusIndex(index), + selectedIndex: data.value, + index: 2, + label: 'مرطوب', + ), + ], + ); + }, controller.ventilationStatusIndex), + ], + ), + ), + + cardInfo( + padding: EdgeInsets.fromLTRB(12, 12, 12, 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 9, + children: [ + Text( + 'وضعیت بستر', + style: AppFonts.yekan14Bold.copyWith(color: AppColor.textColor2), + ), + + ObxValue((data) { + return SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + spacing: 8, + children: [ + formChips( + onTap: (index) => controller.setBeddingStatusIndex(index), + selectedIndex: data.value, + index: 0, + label: 'خشک', + ), + formChips( + onTap: (index) => controller.setBeddingStatusIndex(index), + selectedIndex: data.value, + index: 1, + label: 'نیمه‌مرطوب', + ), + formChips( + onTap: (index) => controller.setBeddingStatusIndex(index), + selectedIndex: data.value, + index: 2, + label: 'مرطوب', + ), + formChips( + onTap: (index) => controller.setBeddingStatusIndex(index), + selectedIndex: data.value, + index: 2, + label: 'نیازمند اصلاح', + ), + ], + ), + ); + }, controller.beddingStatusIndex), + ], + ), + ), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'دمای سالن', + filled: true, + filledColor: AppColor.bgLight, + maxLines: 1, + minLines: 1, + keyboardType: TextInputType.number, + ), + + cardInfo( + padding: EdgeInsets.fromLTRB(12, 12, 12, 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 9, + children: [ + Text( + 'کیفیت آب مصرفی', + style: AppFonts.yekan14Bold.copyWith(color: AppColor.textColor2), + ), + + ObxValue((data) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 10, + children: [ + formChips( + onTap: (index) => controller.setWaterQualityIndex(index), + selectedIndex: data.value, + index: 0, + label: 'چاه', + ), + formChips( + onTap: (index) => controller.setWaterQualityIndex(index), + selectedIndex: data.value, + index: 1, + label: 'شهری', + ), + formChips( + onTap: (index) => controller.setWaterQualityIndex(index), + selectedIndex: data.value, + index: 2, + label: 'تصفیه‌شده', + ), + ], + ); + }, controller.waterQualityIndex), + ], + ), + ), + + cardInfo( + padding: EdgeInsets.fromLTRB(12, 12, 12, 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 9, + children: [ + Text( + 'کیفیت آب مصرفی', + style: AppFonts.yekan14Bold.copyWith(color: AppColor.textColor2), + ), + + ObxValue((data) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + formChips( + onTap: (index) => controller.setFuelTypeIndex(index), + selectedIndex: data.value, + index: 0, + label: 'گازوییل', + ), + formChips( + onTap: (index) => controller.setFuelTypeIndex(index), + selectedIndex: data.value, + index: 1, + label: 'بنزین', + ), + formChips( + onTap: (index) => controller.setFuelTypeIndex(index), + selectedIndex: data.value, + index: 2, + label: 'گاز', + ), + formChips( + selectedIndex: data.value, + index: 3, + label: 'نفت', + onTap: (index) => controller.setFuelTypeIndex(index), + ), + ], + ); + }, controller.fuelTypeIndex), + ], + ), + ), + ], + ); +} + +ChoiceChip formChips({ + required int selectedIndex, + required int index, + required String label, + required Function(int) onTap, +}) { + return ChoiceChip( + selectedColor: AppColor.green1Normal, + labelStyle: index == selectedIndex + ? AppFonts.yekan14Bold.copyWith(color: Colors.white) + : AppFonts.yekan14.copyWith(color: AppColor.textColor), + surfaceTintColor: Colors.white, + checkmarkColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: index == selectedIndex + ? BorderSide.none + : BorderSide(width: 1, color: AppColor.blackLightHover), + ), + padding: EdgeInsets.symmetric(horizontal: 12, vertical: 6), + + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + label: Text(label), + selected: index == selectedIndex, + onSelected: (value) => onTap(index), + ); +} + +Column casualtiesInformation(PoultryFarmInspectionHomeLogic controller) { + return Column( + spacing: 10, + children: [ + SizedBox(height: 1.h), + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'تعداد تلفات عادی دوره', + filled: true, + filledColor: AppColor.bgLight, + ), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'تلفات غیرعادی', + filled: true, + filledColor: AppColor.bgLight, + ), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'منبع تهیه جوجه', + filled: true, + filledColor: AppColor.bgLight, + ), + + ResourceOverlayDropdown( + items: Resource.success([ + 'بیماری', + 'قطعی برق', + 'استرس گرمایی', + 'مشکلات دانه', + ]), + + itemBuilder: (item) => Text(item), + labelBuilder: (selected) => + Text(selected ?? 'علت احتمالی تلفات غیرعادی'), + ), + + ResourceOverlayDropdown( + items: Resource.success(['انجام نشد', 'انجام شد']), + + itemBuilder: (item) => Text(item), + labelBuilder: (selected) => Text(selected ?? 'نمونه‌برداری انجام‌شده'), + ), + + cardInfo( + padding: EdgeInsets.fromLTRB(12, 12, 12, 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 9, + children: [ + Text( + 'نوع نمونه', + style: AppFonts.yekan14Bold.copyWith(color: AppColor.textColor2), + ), + + ObxValue((data) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 10, + children: [ + formChips( + onTap: (index) => controller.setSampleTypeIndex(index), + selectedIndex: data.value, + index: 0, + label: 'رنده', + ), + formChips( + onTap: (index) => controller.setSampleTypeIndex(index), + selectedIndex: data.value, + index: 1, + label: 'لاشه', + ), + formChips( + onTap: (index) => controller.setSampleTypeIndex(index), + selectedIndex: data.value, + index: 2, + label: 'ترکیبی', + ), + ], + ); + }, controller.sampleTypeIndex), + ], + ), + ), + ], + ); +} + +Column diseasesAndHealthInformation(PoultryFarmInspectionHomeLogic controller) { + return Column( + spacing: 10, + children: [ + SizedBox(height: 1.h), + + ResourceOverlayDropdown( + items: Resource.success([ + 'بیماری', + 'قطعی برق', + 'استرس گرمایی', + 'مشکلات دانه', + ]), + + itemBuilder: (item) => Text(item), + labelBuilder: (selected) => + Text(selected ?? 'وجود علائم بیماری در گله'), + ), + + ResourceOverlayDropdown( + items: Resource.success(['انجام نشد', 'انجام شد']), + + itemBuilder: (item) => Text(item), + labelBuilder: (selected) => + Text(selected ?? 'نوع بیماری تشخیص داده‌شده / مشکوک'), + ), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'تاریخ واکسیناسیون‌های انجام‌شده', + filled: true, + filledColor: AppColor.bgLight, + ), + + ResourceOverlayDropdown( + items: Resource.success([ + 'واکسن 1', + 'واکسن 2', + 'واکسن 3', + 'واکسن 4', + 'واکسن 5', + 'واکسن 6', + 'واکسن 7', + 'واکسن 8', + 'واکسن 9', + 'واکسن 10', + ]), + + itemBuilder: (item) => Text(item), + labelBuilder: (selected) => Text(selected ?? 'نوع واکسن'), + ), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'شرکت تولیدکننده', + filled: true, + filledColor: AppColor.bgLight, + ), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'نام مسئول فنی بهداشتی', + filled: true, + filledColor: AppColor.bgLight, + ), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'نام مسئول فنی نظام مهندسی', + filled: true, + filledColor: AppColor.bgLight, + ), + ], + ); +} diff --git a/packages/chicken/lib/presentation/pages/poultry_farm_inspection/widgets/step3_page.dart b/packages/chicken/lib/presentation/pages/poultry_farm_inspection/widgets/step3_page.dart new file mode 100644 index 0000000..1ef8c99 --- /dev/null +++ b/packages/chicken/lib/presentation/pages/poultry_farm_inspection/widgets/step3_page.dart @@ -0,0 +1,755 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_chicken/presentation/pages/poultry_farm_inspection/widgets/card_info.dart'; +import 'package:rasadyar_core/core.dart'; + +import '../home/logic.dart'; + +Widget step3Page(PoultryFarmInspectionHomeLogic controller) { + return SingleChildScrollView( + physics: BouncingScrollPhysics(), + child: Column( + children: [ + SizedBox(height: 35.h), + + Container( + height: 350.h, + clipBehavior: Clip.none, + width: Get.width, + child: farmInfoWidget( + controller: controller, + title: 'نهاده و خوراک', + child: agriculturalInput(controller), + ), + ), + + SizedBox(height: 30.h), + + Container( + height: 410.h, + clipBehavior: Clip.none, + width: Get.width, + child: farmInfoWidget( + controller: controller, + title: 'زیرساخت و انرژی', + child: infrastructureAndEnergy(controller), + ), + ), + SizedBox(height: 24.h), + + Container( + height: 380.h, + clipBehavior: Clip.none, + width: Get.width, + child: farmInfoWidget( + controller: controller, + title: 'نیروی انسانی', + child: humanResources(controller), + ), + ), + SizedBox(height: 24.h), + + Container( + height: 380.h, + clipBehavior: Clip.none, + width: Get.width, + child: farmInfoWidget( + controller: controller, + title: 'تسهیلات و حمایت‌ها', + child: facilitiesAndSupport(controller), + ), + ), + ], + ), + ); +} + +Column agriculturalInput2(PoultryFarmInspectionHomeLogic controller) { + return Column( + spacing: 10, + children: [ + cardInfo( + padding: EdgeInsets.fromLTRB(0, 12, 12, 6), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 9, + children: [ + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Container( + height: 80.h, + width: 80.w, + padding: EdgeInsets.all(22), + decoration: BoxDecoration( + color: Color(0xFFE9E9E9), + border: Border.all( + width: 1, + color: AppColor.blackLightHover, + ), + borderRadius: BorderRadius.circular(8), + ), + child: Assets.vec.galleryAddSvg.svg(width: 36, height: 36), + ), + ], + ), + ), + + Text( + 'تعداد موجود فعلی', + style: AppFonts.yekan14.copyWith(color: AppColor.textColorLight), + ), + ], + ), + ), + + cardInfo( + padding: EdgeInsets.fromLTRB(12, 12, 12, 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 9, + children: [ + Text( + 'وضعیت بهداشتی سالن', + style: AppFonts.yekan14Bold.copyWith(color: AppColor.textColor2), + ), + + ObxValue((data) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + formChips( + selectedIndex: data.value, + index: 0, + label: 'عالی', + onTap: (index) => + controller.setSanitaryConditionOfTheHallIndex(index), + ), + formChips( + selectedIndex: data.value, + index: 1, + label: 'خوب', + onTap: (index) => + controller.setSanitaryConditionOfTheHallIndex(index), + ), + formChips( + selectedIndex: data.value, + index: 2, + label: 'متوسط', + onTap: (index) => + controller.setSanitaryConditionOfTheHallIndex(index), + ), + formChips( + selectedIndex: data.value, + index: 3, + label: 'ضعیف', + onTap: (index) => + controller.setSanitaryConditionOfTheHallIndex(index), + ), + ], + ); + }, controller.sanitaryConditionOfTheHallIndex), + ], + ), + ), + + cardInfo( + padding: EdgeInsets.fromLTRB(12, 12, 12, 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 9, + children: [ + Text( + 'وضعیت تهویه', + style: AppFonts.yekan14Bold.copyWith(color: AppColor.textColor2), + ), + + ObxValue((data) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 10, + children: [ + formChips( + onTap: (index) => + controller.setVentilationStatusIndex(index), + selectedIndex: data.value, + index: 0, + label: 'خشک', + ), + formChips( + onTap: (index) => + controller.setVentilationStatusIndex(index), + selectedIndex: data.value, + index: 1, + label: 'نیمه‌مرطوب', + ), + formChips( + onTap: (index) => + controller.setVentilationStatusIndex(index), + selectedIndex: data.value, + index: 2, + label: 'مرطوب', + ), + ], + ); + }, controller.ventilationStatusIndex), + ], + ), + ), + + cardInfo( + padding: EdgeInsets.fromLTRB(12, 12, 12, 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 9, + children: [ + Text( + 'وضعیت بستر', + style: AppFonts.yekan14Bold.copyWith(color: AppColor.textColor2), + ), + + ObxValue((data) { + return SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + spacing: 8, + children: [ + formChips( + onTap: (index) => controller.setBeddingStatusIndex(index), + selectedIndex: data.value, + index: 0, + label: 'خشک', + ), + formChips( + onTap: (index) => controller.setBeddingStatusIndex(index), + selectedIndex: data.value, + index: 1, + label: 'نیمه‌مرطوب', + ), + formChips( + onTap: (index) => controller.setBeddingStatusIndex(index), + selectedIndex: data.value, + index: 2, + label: 'مرطوب', + ), + formChips( + onTap: (index) => controller.setBeddingStatusIndex(index), + selectedIndex: data.value, + index: 2, + label: 'نیازمند اصلاح', + ), + ], + ), + ); + }, controller.beddingStatusIndex), + ], + ), + ), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'دمای سالن', + filled: true, + filledColor: AppColor.bgLight, + maxLines: 1, + minLines: 1, + keyboardType: TextInputType.number, + ), + + cardInfo( + padding: EdgeInsets.fromLTRB(12, 12, 12, 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 9, + children: [ + Text( + 'کیفیت آب مصرفی', + style: AppFonts.yekan14Bold.copyWith(color: AppColor.textColor2), + ), + + ObxValue((data) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 10, + children: [ + formChips( + onTap: (index) => controller.setWaterQualityIndex(index), + selectedIndex: data.value, + index: 0, + label: 'چاه', + ), + formChips( + onTap: (index) => controller.setWaterQualityIndex(index), + selectedIndex: data.value, + index: 1, + label: 'شهری', + ), + formChips( + onTap: (index) => controller.setWaterQualityIndex(index), + selectedIndex: data.value, + index: 2, + label: 'تصفیه‌شده', + ), + ], + ); + }, controller.waterQualityIndex), + ], + ), + ), + + cardInfo( + padding: EdgeInsets.fromLTRB(12, 12, 12, 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 9, + children: [ + Text( + 'کیفیت آب مصرفی', + style: AppFonts.yekan14Bold.copyWith(color: AppColor.textColor2), + ), + + ObxValue((data) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + formChips( + onTap: (index) => controller.setFuelTypeIndex(index), + selectedIndex: data.value, + index: 0, + label: 'گازوییل', + ), + formChips( + onTap: (index) => controller.setFuelTypeIndex(index), + selectedIndex: data.value, + index: 1, + label: 'بنزین', + ), + formChips( + onTap: (index) => controller.setFuelTypeIndex(index), + selectedIndex: data.value, + index: 2, + label: 'گاز', + ), + formChips( + selectedIndex: data.value, + index: 3, + label: 'نفت', + onTap: (index) => controller.setFuelTypeIndex(index), + ), + ], + ); + }, controller.fuelTypeIndex), + ], + ), + ), + ], + ); +} + +ChoiceChip formChips({ + required int selectedIndex, + required int index, + required String label, + required Function(int) onTap, +}) { + return ChoiceChip( + selectedColor: AppColor.green1Normal, + labelStyle: index == selectedIndex + ? AppFonts.yekan14Bold.copyWith(color: Colors.white) + : AppFonts.yekan14.copyWith(color: AppColor.textColor), + surfaceTintColor: Colors.white, + checkmarkColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: index == selectedIndex + ? BorderSide.none + : BorderSide(width: 1, color: AppColor.blackLightHover), + ), + padding: EdgeInsets.symmetric(horizontal: 12, vertical: 6), + + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + label: Text(label), + selected: index == selectedIndex, + onSelected: (value) => onTap(index), + ); +} + +Column infrastructureAndEnergy(PoultryFarmInspectionHomeLogic controller) { + return Column( + spacing: 10, + children: [ + SizedBox(height: 1.h), + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'نوع ژنراتور', + filled: true, + filledColor: AppColor.bgLight, + ), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'ظرفیت (KVA)', + filled: true, + filledColor: AppColor.bgLight, + ), + + cardInfo( + padding: EdgeInsets.fromLTRB(12, 12, 12, 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 9, + children: [ + Text( + 'وضعیت عملکرد ژنراتور', + style: AppFonts.yekan14Bold.copyWith(color: AppColor.textColor2), + ), + + ObxValue((data) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 10, + children: [ + formChips( + onTap: (index) => + controller.setGeneratorOperatingStatusIndex(index), + selectedIndex: data.value, + index: 0, + label: 'سالم', + ), + formChips( + onTap: (index) => + controller.setGeneratorOperatingStatusIndex(index), + selectedIndex: data.value, + index: 1, + label: 'نیمه‌سالم', + ), + formChips( + onTap: (index) => + controller.setGeneratorOperatingStatusIndex(index), + selectedIndex: data.value, + index: 2, + label: 'معیوب', + ), + ], + ); + }, controller.generatorOperatingStatusIndex), + ], + ), + ), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'میزان موجودی سوخت اضطراری (لیتر)', + filled: true, + filledColor: AppColor.bgLight, + ), + + ResourceOverlayDropdown( + items: Resource.success([ + 'بیماری', + 'قطعی برق', + 'استرس گرمایی', + 'مشکلات دانه', + ]), + + itemBuilder: (item) => Text(item), + labelBuilder: (selected) => + Text(selected ?? 'علت احتمالی تلفات غیرعادی'), + ), + + ResourceOverlayDropdown( + items: Resource.success(['ندارد', 'دارد']), + + itemBuilder: (item) => Text(item), + labelBuilder: (selected) => + Text(selected ?? 'سابقه قطعی برق دوره جاری'), + ), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'تعداد تلفات', + filled: true, + filledColor: AppColor.bgLight, + ), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'مدت قطعی', + filled: true, + filledColor: AppColor.bgLight, + ), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'توضیحات تکمیلی', + filled: true, + maxLines: 3, + minLines: 3, + filledColor: AppColor.bgLight, + ), + ], + ); +} + +Column agriculturalInput(PoultryFarmInspectionHomeLogic controller) { + return Column( + spacing: 10, + children: [ + SizedBox(height: 1.h), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'میزان نهاده مصرفی تا روز بازدید (کیلوگرم)', + filled: true, + filledColor: AppColor.bgLight, + ), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'میزان نهاده موجود در انبار', + filled: true, + filledColor: AppColor.bgLight, + ), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'میزان نهاده خریداری‌شده و حمل‌نشده از بازارگاه', + filled: true, + filledColor: AppColor.bgLight, + ), + + cardInfo( + padding: EdgeInsets.fromLTRB(12, 12, 12, 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 9, + children: [ + Text( + 'کیفیت دانه', + style: AppFonts.yekan14Bold.copyWith(color: AppColor.textColor2), + ), + + ObxValue((data) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 10, + children: [ + formChips( + onTap: (index) => controller.setSampleTypeIndex(index), + selectedIndex: data.value, + index: 0, + label: 'خوب', + ), + formChips( + onTap: (index) => controller.setSampleTypeIndex(index), + selectedIndex: data.value, + index: 1, + label: 'متوسط', + ), + formChips( + onTap: (index) => + controller.setGrainQualityInputIndex(index), + selectedIndex: data.value, + index: 2, + label: 'ضعیف', + ), + ], + ); + }, controller.grainQualityInputIndex), + ], + ), + ), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'فرمول دانه (در صورت ارائه)', + filled: true, + minLines: 3, + maxLines: 3, + filledColor: AppColor.bgLight, + ), + ], + ); +} + +Column humanResources(PoultryFarmInspectionHomeLogic controller) { + return Column( + spacing: 10, + children: [ + SizedBox(height: 1.h), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'تعداد افراد شاغل', + filled: true, + filledColor: AppColor.bgLight, + ), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'تعداد افراد بومی', + filled: true, + filledColor: AppColor.bgLight, + ), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'تعداد افراد غیر بومی', + filled: true, + maxLines: 3, + minLines: 3, + filledColor: AppColor.bgLight, + ), + + cardInfo( + padding: EdgeInsets.fromLTRB(12, 12, 12, 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 9, + children: [ + Text( + 'وضعیت قرارداد کارگران', + style: AppFonts.yekan14Bold.copyWith(color: AppColor.textColor2), + ), + + ObxValue((data) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 10, + children: [ + formChips( + onTap: (index) => + controller.setWorkerContractStatusIndex(index), + selectedIndex: data.value, + index: 0, + label: 'دائم', + ), + formChips( + onTap: (index) => + controller.setWorkerContractStatusIndex(index), + selectedIndex: data.value, + index: 1, + label: 'موقت', + ), + formChips( + onTap: (index) => + controller.setWorkerContractStatusIndex(index), + selectedIndex: data.value, + index: 2, + label: 'روزمزدی', + ), + ], + ); + }, controller.workerContractStatusIndex), + ], + ), + ), + + ResourceOverlayDropdown( + items: Resource.success(['آموزش‌ ندیده است', 'آموزش‌ دیده است']), + + itemBuilder: (item) => Text(item), + labelBuilder: (selected) => + Text(selected ?? 'آموزش‌دیده در حوزه بهداشت و امنیت زیستی'), + ), + ], + ); +} + +Column facilitiesAndSupport(PoultryFarmInspectionHomeLogic controller) { + return Column( + spacing: 10, + children: [ + SizedBox(height: 1.h), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'تسهیلات دریافتی فعال', + filled: true, + filledColor: AppColor.bgLight, + ), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'نوع تسهیلات', + filled: true, + filledColor: AppColor.bgLight, + ), + + RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'مبلغ', + filled: true, + + filledColor: AppColor.bgLight, + ), RTextField( + controller: controller.nameOfThePoultryFarmUnit, + label: 'سال دریافت', + filled: true, + + filledColor: AppColor.bgLight, + ), + + ResourceOverlayDropdown( + items: Resource.success(['دریافت نشده', 'دریافت شده']), + + itemBuilder: (item) => Text(item), + labelBuilder: (selected) => + Text(selected ?? 'وضعیت بازپرداخت'), + ), + + + cardInfo( + padding: EdgeInsets.fromLTRB(12, 12, 12, 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + spacing: 9, + children: [ + Text( + 'درخواست جدید بهره‌بردار', + style: AppFonts.yekan14Bold.copyWith(color: AppColor.textColor2), + ), + + ObxValue((data) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 10, + children: [ + formChips( + onTap: (index) => + controller.setNewBeneficiaryRequestIndex(index), + selectedIndex: data.value, + index: 0, + label: 'نهاده', + ), + formChips( + onTap: (index) => + controller.setNewBeneficiaryRequestIndex(index), + selectedIndex: data.value, + index: 1, + label: 'تسهیلات', + ), + formChips( + onTap: (index) => + controller.setNewBeneficiaryRequestIndex(index), + selectedIndex: data.value, + index: 2, + label: 'واکسن', + ), formChips( + onTap: (index) => + controller.setNewBeneficiaryRequestIndex(index), + selectedIndex: data.value, + index: 3, + label: 'تجهیزات', + ), + ], + ); + }, controller.newBeneficiaryRequestIndex), + ], + ), + ), + + ], + ); +} diff --git a/packages/chicken/test/data/data_source/remote/auth/auth_remote_imp_test.dart b/packages/chicken/test/data/data_source/remote/auth/auth_remote_imp_test.dart index e616636..bb1fa65 100644 --- a/packages/chicken/test/data/data_source/remote/auth/auth_remote_imp_test.dart +++ b/packages/chicken/test/data/data_source/remote/auth/auth_remote_imp_test.dart @@ -229,14 +229,14 @@ void main() { data: expectedUserInfo, statusCode: 200, requestOptions: RequestOptions( - path: 'https://userbackend.rasadyaar.ir/api/send_otp/', + path: 'https://userbackend.rasadyar.com/api/send_otp/', ), ), ); when( () => mockDioRemote.post( - 'https://userbackend.rasadyaar.ir/api/send_otp/', + 'https://userbackend.rasadyar.com/api/send_otp/', data: {"mobile": phoneNumber, "state": ""}, fromJson: any(named: 'fromJson'), headers: any(named: 'headers'), @@ -250,7 +250,7 @@ void main() { expect(result, equals(expectedUserInfo)); verify( () => mockDioRemote.post( - 'https://userbackend.rasadyaar.ir/api/send_otp/', + 'https://userbackend.rasadyar.com/api/send_otp/', data: {"mobile": phoneNumber, "state": ""}, fromJson: UserInfoModel.fromJson, headers: {'Content-Type': 'application/json'}, @@ -267,14 +267,14 @@ void main() { data: null, statusCode: 404, requestOptions: RequestOptions( - path: 'https://userbackend.rasadyaar.ir/api/send_otp/', + path: 'https://userbackend.rasadyar.com/api/send_otp/', ), ), ); when( () => mockDioRemote.post( - 'https://userbackend.rasadyaar.ir/api/send_otp/', + 'https://userbackend.rasadyar.com/api/send_otp/', data: {"mobile": phoneNumber, "state": ""}, fromJson: any(named: 'fromJson'), headers: any(named: 'headers'), @@ -288,7 +288,7 @@ void main() { expect(result, isNull); verify( () => mockDioRemote.post( - 'https://userbackend.rasadyaar.ir/api/send_otp/', + 'https://userbackend.rasadyar.com/api/send_otp/', data: {"mobile": phoneNumber, "state": ""}, fromJson: UserInfoModel.fromJson, headers: {'Content-Type': 'application/json'}, diff --git a/packages/core/lib/presentation/common/app_color.dart b/packages/core/lib/presentation/common/app_color.dart index 53a4c9e..6e61427 100644 --- a/packages/core/lib/presentation/common/app_color.dart +++ b/packages/core/lib/presentation/common/app_color.dart @@ -389,6 +389,7 @@ class AppColor { static const Color bgIcon = Color(0xFF797979); // #797979 static const Color bgDark = Color(0xFF979797); // #083940 rgb(8, 57, 64) static const Color textColor = Color(0xFF5B5B5B); // #083940 rgb(8, 57, 64) + static const Color textColor2 = Color(0xFF636363); // #636363 rgb(99, 99, 99) static const Color labelTextColor = Color(0xFF808080); static const Color textColorLight = Color(0xFFB2B2B2); static const Color iconColor = Color(0xFF444444); // #444444 rgb(68, 68, 68) diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index cb5f975..5a43f44 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -187,6 +187,9 @@ class $AssetsIconsGen { /// File path: assets/icons/filter_outline.svg SvgGenImage get filterOutline => const SvgGenImage('assets/icons/filter_outline.svg'); + /// File path: assets/icons/gallery_add.svg + SvgGenImage get galleryAdd => const SvgGenImage('assets/icons/gallery_add.svg'); + /// File path: assets/icons/gps.svg SvgGenImage get gps => const SvgGenImage('assets/icons/gps.svg'); @@ -418,6 +421,7 @@ class $AssetsIconsGen { farms, filter, filterOutline, + galleryAdd, gps, hashtag, home, @@ -674,6 +678,9 @@ class $AssetsVecGen { /// File path: assets/vec/filter_outline.svg.vec SvgGenImage get filterOutlineSvg => const SvgGenImage.vec('assets/vec/filter_outline.svg.vec'); + /// File path: assets/vec/gallery_add.svg.vec + SvgGenImage get galleryAddSvg => const SvgGenImage.vec('assets/vec/gallery_add.svg.vec'); + /// File path: assets/vec/gps.svg.vec SvgGenImage get gpsSvg => const SvgGenImage.vec('assets/vec/gps.svg.vec'); @@ -905,6 +912,7 @@ class $AssetsVecGen { farmsSvg, filterSvg, filterOutlineSvg, + galleryAddSvg, gpsSvg, hashtagSvg, homeSvg, diff --git a/packages/core/lib/presentation/widget/stepper/r_stepper.dart b/packages/core/lib/presentation/widget/stepper/r_stepper.dart new file mode 100644 index 0000000..a7ae4a7 --- /dev/null +++ b/packages/core/lib/presentation/widget/stepper/r_stepper.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +class RStepper extends StatelessWidget { + const RStepper({ + super.key, + required this.activeStepColor, + this.deactiveStepColor, + this.dividerColor, + required this.stepsCount, + required this.activeStep, + }); + + final Color activeStepColor; + final Color? deactiveStepColor; + final Color? dividerColor; + final int stepsCount; + final int activeStep; + + @override + Widget build(BuildContext context) { + + + return SizedBox( + height: 24.h, + width: Get.width, + child: Row( + children: List.generate(stepsCount, (index) { + final isFirst = index == 0; + return SizedBox( + width: (Get.width) / (stepsCount - 1), + child: Container( + alignment: Alignment.center, + decoration: BoxDecoration( + color: index == activeStep + ? activeStepColor + : deactiveStepColor ?? AppColor.whiteNormalActive, + shape: BoxShape.circle, + ), + width: 24.w, + height: 24.h, + child: Center( + child: Text( + (index + 1).toString(), + style: AppFonts.yekan14.copyWith(color: AppColor.textColor), + textAlign: TextAlign.center, + ), + ), + ), + ); + }), + ), + ); + } +} diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index fd91299..e2d6bc3 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -45,6 +45,7 @@ export 'overlay_dropdown_widget/resource_overlay_dropdown.dart'; export 'pagination/pagination_from_until.dart'; export 'pagination/show_more.dart'; export 'slider/slider.dart'; +export 'stepper/r_stepper.dart'; export 'tabs/new_tab.dart'; export 'tabs/r_segment.dart'; export 'tabs/tab.dart';