import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_inspection/presentation/routes/app_routes.dart'; import 'package:rasadyar_inspection/presentation/widget/base_page/view.dart'; import 'package:rasadyar_inspection/presentation/widget/custom_chips.dart'; import 'logic.dart'; import 'widget/map/view.dart'; class InspectionMapPage extends GetView { const InspectionMapPage({super.key}); @override Widget build(BuildContext context) { return BasePage( hasSearch: true, hasFilter: true, hasBack: false, defaultSearch: false, filteringWidget: filterWidget(showIndex: 3.obs, filterIndex: 5.obs), widgets: [ MapPage(), ObxValue((data) { if (data.value) { WidgetsBinding.instance.addPostFrameCallback((_) { Get.bottomSheet( searchWidget(), isScrollControlled: true, isDismissible: true, ignoreSafeArea: false, ); controller.baseLogic.isSearchSelected.value = false; }); } return const SizedBox.shrink(); }, controller.baseLogic.isSearchSelected), ], ); } BaseBottomSheet searchWidget() { return BaseBottomSheet( height: Get.height * 0.85, rootChild: Column( spacing: 8, children: [ Row( spacing: 12, children: [ Expanded( child: RTextField( height: 40, borderColor: AppColor.blackLight, suffixIcon: ObxValue( (data) => Padding( padding: const EdgeInsets.symmetric(vertical: 8), child: (data.value == null) ? Assets.vec.searchSvg.svg( width: 10, height: 10, colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), ) : IconButton( onPressed: () { controller.baseLogic.searchTextController.clear(); controller.baseLogic.searchValue.value = null; controller.baseLogic.isSearchSelected.value = false; controller.mapLogic.hasFilterOrSearch.value = false; controller.searchedPoultryLocation.value = Resource.initial(); }, enableFeedback: true, padding: EdgeInsets.zero, iconSize: 24, splashRadius: 50, icon: Assets.vec.closeCircleSvg.svg( width: 20, height: 20, colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), ), ), ), controller.baseLogic.searchValue, ), hintText: 'جستجو کنید ...', hintStyle: AppFonts.yekan16.copyWith(color: AppColor.blueNormal), filledColor: Colors.white, filled: true, controller: controller.baseLogic.searchTextController, onChanged: (val) => controller.baseLogic.searchValue.value = val, ), ), GestureDetector( onTap: () { Get.back(); }, child: Assets.vec.mapSvg.svg( width: 24.w, height: 24.h, colorFilter: ColorFilter.mode(AppColor.blueNormal, BlendMode.srcIn), ), ), ], ), Expanded( child: ObxValue((rxData) { final resource = rxData.value; final status = resource.status; final items = resource.data; final message = resource.message ?? 'خطا در بارگذاری'; if (status == ResourceStatus.initial) { return Center(child: Text('ابتدا جستجو کنید')); } if (status == ResourceStatus.loading) { return const Center(child: CircularProgressIndicator()); } if (status == ResourceStatus.error) { return Center(child: Text(message)); } if (items == null || items.isEmpty) { return Center(child: EmptyWidget()); } return ListView.separated( itemCount: items.length, separatorBuilder: (context, index) => SizedBox(height: 8), itemBuilder: (context, index) { final item = items[index]; // اگر item استفاده نمیشه، می‌تونه حذف بشه return ListItem2( index: index, labelColor: AppColor.blueLight, labelIcon: Assets.vec.cowSvg.path, child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( item.unitName ?? 'N/A', style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), ), Text( item.user?.fullname ?? '', style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover), ), ], ), Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( 'جوجه ریزی فعال', style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), ), Text( (item.hatching != null && item.hatching!.isNotEmpty) ? 'دارد' : 'ندراد', style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover), ), ], ), ], ), ); }, ); }, controller.searchedPoultryLocation), ), ], ), ); } /* Widget selectedLocationWidget2({ required bool showHint, required SlidableController sliderController, required VoidCallback trigger, required VoidCallback toggle, }) { return ObxValue((data) { return BaseBottomSheet( height: data.value ? 450.h : 150.h, child: ListItemWithOutCounter( secondChild: Column( spacing: 8, children: [ Padding( padding: EdgeInsets.symmetric(horizontal: 12.w), child: Column( spacing: 8, children: [ Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( 'داوود خرم پور', textAlign: TextAlign.center, style: AppFonts.yekan16.copyWith(color: AppColor.greenDark), ), ], ), Container( height: 32.h, padding: EdgeInsets.symmetric(horizontal: 8), decoration: ShapeDecoration( color: AppColor.blueLight, shape: RoundedRectangleBorder( side: BorderSide(width: 1.w, color: AppColor.blueLightHover), borderRadius: BorderRadius.circular(8), ), ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, spacing: 3, children: [ Text( 'تاریخ بازرسی', style: AppFonts.yekan14.copyWith(color: AppColor.textColor), ), Text( '1403/12/12', style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), ), ], ), ), buildRow( title: 'تلفن خریدار', value: '0326598653', valueStyle: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), ), buildRow(title: 'آخرین فعالیت', value: '1409/12/12'), buildRow(title: 'موجودی', value: '5KG'), buildRow(title: 'فروش رفته', value: '5KG'), ], ), ), Row( children: [ Expanded( child: Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, spacing: 7, children: [ RElevated( width: 40.h, height: 38.h, backgroundColor: AppColor.greenNormal, child: Assets.vec.messageAddSvg.svg( width: 24.w, height: 24.h, colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), ), onPressed: () {}, ), RElevated( width: 150.w, height: 40.h, backgroundColor: AppColor.blueNormal, onPressed: () { */ /*controller.setEditData(item); Get.bottomSheet( addOrEditBottomSheet(true), isScrollControlled: true, backgroundColor: Colors.transparent, ).whenComplete(() { });*/ /* }, child: Row( mainAxisAlignment: MainAxisAlignment.start, spacing: 8, children: [ Assets.vec.mapSvg.svg( width: 24.w, height: 24.h, colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), ), Text( 'مسیریابی', style: AppFonts.yekan14Bold.copyWith(color: Colors.white), ), ], ), ), ROutlinedElevated( width: 150.w, height: 40.h, onPressed: () { buildDeleteDialog(onConfirm: () async {}, onRefresh: () async {}); }, borderColor: AppColor.bgIcon, child: Row( mainAxisAlignment: MainAxisAlignment.center, spacing: 8, children: [ Assets.vec.securityTimeSvg.svg( width: 24.w, height: 24.h, colorFilter: ColorFilter.mode(AppColor.bgIcon, BlendMode.srcIn), ), Text( 'سوابق بازرسی', style: AppFonts.yekan14Bold.copyWith(color: AppColor.bgIcon), ), ], ), ), ], ), ), ], ), ], ), labelColor: AppColor.blueLight, labelIcon: Assets.vec.cowSvg.path, labelIconColor: AppColor.bgIcon, onTap: () => data.value = !data.value, selected: data.value, child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( 'داود خرم مهری پور', style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), ), Text( 'گوشت و مرغ', style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover), ), ], ), Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text('باقی مانده', style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal)), Text( '0 کیلوگرم', style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover), ), ], ), Assets.vec.scanBarcodeSvg.svg(), ], ), ), ); }, controller.isSelectedDetailsLocation); } */ } Widget filterWidget({required RxInt filterIndex, required RxInt showIndex}) { return BaseBottomSheet( height: Get.height * 0.5, child: Column( spacing: 16, children: [ SizedBox(height: 1), Row( mainAxisAlignment: MainAxisAlignment.spaceAround, spacing: 16, children: [ cardWithLabel( title: 'اصناف', count: 1234567, icon: Assets.vec.shopSvg.svg(width: 24.w, height: 24.h), backgroundColor: AppColor.greenLight, backgroundBadgeColor: AppColor.greenLightActive, ), cardWithLabel( title: 'دامداران', count: 1234567, icon: Assets.vec.peopleSvg.svg(width: 24.w, height: 24.h), backgroundColor: AppColor.blueLight, backgroundBadgeColor: AppColor.blueLightActive, ), cardWithLabel( title: 'مرغداران', count: 1234567, icon: Assets.vec.profile2Svg.svg(width: 24.w, height: 24.h), backgroundColor: AppColor.redLight, backgroundBadgeColor: AppColor.redLightActive, ), ], ), Column( crossAxisAlignment: CrossAxisAlignment.start, spacing: 12, children: [ Text( 'فیلتر نمایش', textAlign: TextAlign.center, style: AppFonts.yekan13.copyWith(color: AppColor.blueNormal), ), ObxValue((data) { return Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, spacing: 8, children: [ customChip( isSelected: data.value == 0, onTap: (data) { filterIndex.value = data; }, index: 0, title: 'دامداران', ), customChip( isSelected: data.value == 1, title: 'مرغداران', onTap: (data) { filterIndex.value = data; }, index: 1, ), customChip( isSelected: data.value == 2, title: 'اصناف', onTap: (data) { filterIndex.value = data; }, index: 2, ), ], ); }, filterIndex), ], ), Column( crossAxisAlignment: CrossAxisAlignment.start, spacing: 12, children: [ Text( 'نمایش', textAlign: TextAlign.center, style: AppFonts.yekan13.copyWith(color: AppColor.blueNormal), ), ObxValue((data) { return SingleChildScrollView( scrollDirection: Axis.horizontal, child: Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, spacing: 8, children: [ customChip( isSelected: data.value == 0, title: 'نمایش همه', onTap: (data) { showIndex.value = data; }, index: 0, ), customChip( isSelected: data.value == 1, title: 'دارای تراکنش', onTap: (data) { showIndex.value = data; }, index: 1, ), customChip( isSelected: data.value == 2, title: 'بازرسی شده ها', onTap: (data) { showIndex.value = data; }, index: 2, ), customChip( isSelected: data.value == 3, title: 'بازرسی نشده ها', onTap: (data) { showIndex.value = data; }, index: 3, ), customChip( isSelected: data.value == 4, title: 'متخلفین', onTap: (data) { showIndex.value = data; }, index: 4, ), ], ), ); }, showIndex), ], ), ], ), ); } Widget cardWithLabel({ required String title, required int count, String unit = 'عدد', required Widget icon, required Color backgroundColor, required Color backgroundBadgeColor, }) { return SizedBox( width: 114.w, height: 115.h, child: Stack( clipBehavior: Clip.antiAlias, alignment: Alignment.topCenter, children: [ Positioned( bottom: 0, right: 0, left: 0, child: Container( width: 114.w, height: 91.h, clipBehavior: Clip.antiAlias, decoration: BoxDecoration( color: backgroundColor, borderRadius: BorderRadius.circular(8), border: Border.all(width: 0.25, color: AppColor.blackLightHover), ), child: Column( mainAxisAlignment: MainAxisAlignment.center, spacing: 6, children: [ Text(title, style: AppFonts.yekan12.copyWith(color: AppColor.textColor)), Text( count.separatedByCommaFa, style: AppFonts.yekan16.copyWith(color: AppColor.textColor), ), Text(unit, style: AppFonts.yekan12.copyWith(color: AppColor.textColor)), ], ), ), ), Positioned( top: 5.h, child: Container( width: 32.w, height: 32.h, padding: EdgeInsets.all(4), decoration: BoxDecoration( color: backgroundBadgeColor, borderRadius: BorderRadius.circular(50), border: Border.all(color: AppColor.borderColor, width: 0.25), ), child: Center(child: icon), ), ), ], ), ); } Widget selectedLocationWidget({ required bool showHint, required SlidableController sliderController, required VoidCallback trigger, required VoidCallback toggle, }) { if (showHint) { trigger.call(); } return BaseBottomSheet( height: 150.h, child: Padding( padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 20), child: Slidable( key: Key('selectedLocationWidget'), controller: sliderController, endActionPane: ActionPane( motion: StretchMotion(), children: [ CustomSlidableAction( onPressed: (context) { Get.toNamed(InspectionRoutes.inspectionLocationDetails); }, backgroundColor: AppColor.blueNormal, foregroundColor: Colors.white, padding: EdgeInsets.all(16), borderRadius: BorderRadius.only( bottomRight: Radius.circular(8), topRight: Radius.circular(8), ), child: Assets.vec.mapSvg.svg(width: 24, height: 24), ), CustomSlidableAction( onPressed: (context) { Get.toNamed(InspectionRoutes.inspectionAddSupervision); }, backgroundColor: AppColor.greenNormal, padding: EdgeInsets.all(16), child: Assets.vec.messageAddSvg.svg(), ), CustomSlidableAction( onPressed: (context) {}, backgroundColor: AppColor.warning, padding: EdgeInsets.all(16), borderRadius: BorderRadius.only( bottomLeft: Radius.circular(8), topLeft: Radius.circular(8), ), child: Assets.vec.securityTimeSvg.svg(), ), ], ), child: GestureDetector( onTap: toggle, child: Container( height: 58, padding: EdgeInsets.symmetric(horizontal: 20, vertical: 15), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(8), border: Border.all(width: 1, color: AppColor.blackLightHover), ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Column( children: [ Text( 'داود خرم مهری پور', style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), ), Text( 'گوشت و مرغ', style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover), ), ], ), Column( children: [ Text( 'باقی مانده', style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal), ), Text( '0 کیلوگرم', style: AppFonts.yekan12.copyWith(color: AppColor.darkGreyDarkHover), ), ], ), Assets.vec.scanBarcodeSvg.svg(), ], ), ), ), ), ), ); }