feat : request and request tagging

This commit is contained in:
2025-05-25 16:54:43 +03:30
parent 276c8dd1fe
commit 45778a9866
23 changed files with 655 additions and 145 deletions

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@@ -0,0 +1,80 @@
///This file is automatically generated. DO NOT EDIT, all your changes would be lost.
class Assets {
Assets._();
static const String iconsAdd = 'assets/icons/add.svg';
static const String iconsArrowLeft = 'assets/icons/arrow_left.svg';
static const String iconsArrowRight = 'assets/icons/arrow_right.svg';
static const String iconsBgHeaderUserProfile = 'assets/icons/bg_header_user_profile.svg';
static const String iconsCalendar = 'assets/icons/calendar.svg';
static const String iconsCalendarSearch = 'assets/icons/calendar_search.svg';
static const String iconsCall = 'assets/icons/call.svg';
static const String iconsDiagram = 'assets/icons/diagram.svg';
static const String iconsDownload = 'assets/icons/download.svg';
static const String iconsEdit = 'assets/icons/edit.svg';
static const String iconsExcelDownload = 'assets/icons/excel_download.svg';
static const String iconsFilter = 'assets/icons/filter.svg';
static const String iconsGps = 'assets/icons/gps.svg';
static const String iconsInformation = 'assets/icons/information.svg';
static const String iconsInspection = 'assets/icons/inspection.svg';
static const String iconsKey = 'assets/icons/key.svg';
static const String iconsLiveStock = 'assets/icons/liveStock.svg';
static const String iconsLogout = 'assets/icons/logout.svg';
static const String iconsMap = 'assets/icons/map.svg';
static const String iconsMapMarker = 'assets/icons/map_marker.svg';
static const String iconsMessageAdd = 'assets/icons/message_add.svg';
static const String iconsPdfDownload = 'assets/icons/pdf_download.svg';
static const String iconsPictureFrame = 'assets/icons/picture_frame.svg';
static const String iconsPlaceHolder = 'assets/icons/place_holder.svg';
static const String iconsProfileCircle = 'assets/icons/profile_circle.svg';
static const String iconsProfileUser = 'assets/icons/profile_user.svg';
static const String iconsReceiptDiscount = 'assets/icons/receipt_discount.svg';
static const String iconsScan = 'assets/icons/scan.svg';
static const String iconsScanBarcode = 'assets/icons/scan_barcode.svg';
static const String iconsSearch = 'assets/icons/search.svg';
static const String iconsSecurityTime = 'assets/icons/security_time.svg';
static const String iconsSetting = 'assets/icons/setting.svg';
static const String iconsTagUser = 'assets/icons/tag_user.svg';
static const String iconsTrash = 'assets/icons/trash.svg';
static const String iconsUser = 'assets/icons/user.svg';
static const String iconsUserSquare = 'assets/icons/user_square.svg';
static const String imagesInnerSplash = 'assets/images/inner_splash.webp';
static const String imagesOutterSplash = 'assets/images/outter_splash.webp';
static const String imagesPlaceHolder = 'assets/images/place_holder.png';
static const String vecAddSvg = 'assets/vec/add.svg.vec';
static const String vecArrowLeftSvg = 'assets/vec/arrow_left.svg.vec';
static const String vecArrowRightSvg = 'assets/vec/arrow_right.svg.vec';
static const String vecBgHeaderUserProfileSvg = 'assets/vec/bg_header_user_profile.svg.vec';
static const String vecCalendarSearchSvg = 'assets/vec/calendar_search.svg.vec';
static const String vecCalendarSvg = 'assets/vec/calendar.svg.vec';
static const String vecCallSvg = 'assets/vec/call.svg.vec';
static const String vecDiagramSvg = 'assets/vec/diagram.svg.vec';
static const String vecDownloadSvg = 'assets/vec/download.svg.vec';
static const String vecEditSvg = 'assets/vec/edit.svg.vec';
static const String vecExcelDownloadSvg = 'assets/vec/excel_download.svg.vec';
static const String vecFilterSvg = 'assets/vec/filter.svg.vec';
static const String vecGpsSvg = 'assets/vec/gps.svg.vec';
static const String vecInformationSvg = 'assets/vec/information.svg.vec';
static const String vecInspectionSvg = 'assets/vec/inspection.svg.vec';
static const String vecKeySvg = 'assets/vec/key.svg.vec';
static const String vecLiveStockSvg = 'assets/vec/liveStock.svg.vec';
static const String vecLogoutSvg = 'assets/vec/logout.svg.vec';
static const String vecMapMarkerSvg = 'assets/vec/map_marker.svg.vec';
static const String vecMapSvg = 'assets/vec/map.svg.vec';
static const String vecMessageAddSvg = 'assets/vec/message_add.svg.vec';
static const String vecPdfDownloadSvg = 'assets/vec/pdf_download.svg.vec';
static const String vecPictureFrameSvg = 'assets/vec/picture_frame.svg.vec';
static const String vecProfileCircleSvg = 'assets/vec/profile_circle.svg.vec';
static const String vecProfileUserSvg = 'assets/vec/profile_user.svg.vec';
static const String vecReceiptDiscountSvg = 'assets/vec/receipt_discount.svg.vec';
static const String vecScanBarcodeSvg = 'assets/vec/scan_barcode.svg.vec';
static const String vecScanSvg = 'assets/vec/scan.svg.vec';
static const String vecSearchSvg = 'assets/vec/search.svg.vec';
static const String vecSecurityTimeSvg = 'assets/vec/security_time.svg.vec';
static const String vecSettingSvg = 'assets/vec/setting.svg.vec';
static const String vecTagUserSvg = 'assets/vec/tag_user.svg.vec';
static const String vecTrashSvg = 'assets/vec/trash.svg.vec';
static const String vecUserSquareSvg = 'assets/vec/user_square.svg.vec';
static const String vecUserSvg = 'assets/vec/user.svg.vec';
}

View File

@@ -84,6 +84,9 @@ class $AssetsIconsGen {
/// File path: assets/icons/picture_frame.svg
SvgGenImage get pictureFrame => const SvgGenImage('assets/icons/picture_frame.svg');
/// File path: assets/icons/place_holder.svg
SvgGenImage get placeHolder => const SvgGenImage('assets/icons/place_holder.svg');
/// File path: assets/icons/profile_circle.svg
SvgGenImage get profileCircle => const SvgGenImage('assets/icons/profile_circle.svg');
@@ -145,6 +148,7 @@ class $AssetsIconsGen {
messageAdd,
pdfDownload,
pictureFrame,
placeHolder,
profileCircle,
profileUser,
receiptDiscount,
@@ -169,8 +173,11 @@ class $AssetsImagesGen {
/// File path: assets/images/outter_splash.webp
AssetGenImage get outterSplash => const AssetGenImage('assets/images/outter_splash.webp');
/// File path: assets/images/place_holder.png
AssetGenImage get placeHolder => const AssetGenImage('assets/images/place_holder.png');
/// List of all assets
List<AssetGenImage> get values => [innerSplash, outterSplash];
List<AssetGenImage> get values => [innerSplash, outterSplash, placeHolder];
}
class $AssetsVecGen {

View File

@@ -13,6 +13,7 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget {
final TextStyle? titleTextStyle;
final VoidCallback? onBackPressed;
final List<Widget>? additionalActions;
final int? leadingWidth;
final Widget? leading;
const RAppBar({
@@ -24,8 +25,9 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget {
this.onBackPressed,
this.additionalActions,
this.leading,
this.hasBack = false,
this.hasBack = true,
this.centerTitle = false,
this.leadingWidth
});
@override
@@ -41,11 +43,13 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget {
titleTextStyle ??
AppFonts.yekan16.copyWith(color:Colors.white),
title: Text(title),
leadingWidth: leadingWidth?.toDouble(),
leading:leading!=null ? Padding(
padding: const EdgeInsets.only(right: 16),
child: leading,
) : null,
titleSpacing: 8,
actions: [
if (additionalActions != null) ...additionalActions!,
if(hasBack)...{

View File

@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:rasadyar_core/presentation/common/app_color.dart';
import 'package:rasadyar_core/presentation/utils/color_utils.dart';
import '../../common/assets.gen.dart';
class RFab extends StatefulWidget {
@@ -21,10 +22,7 @@ class RFab extends StatefulWidget {
RFab.smallAdd({required VoidCallback? onPressed, Key? key})
: this.small(
onPressed: onPressed,
icon: Assets.vec.addSvg.svg(
width: 20,
height: 20,
),
icon: Assets.vec.addSvg.svg(width: 20, height: 20),
backgroundColor: AppColor.greenNormal,
key: key,
);
@@ -32,10 +30,7 @@ class RFab extends StatefulWidget {
RFab.add({required VoidCallback? onPressed, Key? key})
: this(
onPressed: onPressed,
icon: Assets.vec.addSvg.svg(
width: 20,
height: 20,
),
icon: Assets.vec.addSvg.svg(width: 40, height: 40),
backgroundColor: AppColor.greenNormal,
key: key,
);
@@ -46,10 +41,7 @@ class RFab extends StatefulWidget {
RFab.smallEdit({required VoidCallback? onPressed, Key? key})
: this.small(
onPressed: onPressed,
icon: Assets.vec.addSvg.svg(
width: 20,
height: 20,
),
icon: Assets.vec.addSvg.svg(width: 20, height: 20),
backgroundColor: AppColor.blueNormal,
key: key,
);
@@ -57,10 +49,7 @@ class RFab extends StatefulWidget {
RFab.edit({required VoidCallback? onPressed, Key? key})
: this(
onPressed: onPressed,
icon: Assets.vec.addSvg.svg(
width: 20,
height: 20,
),
icon: Assets.vec.addSvg.svg(width: 20, height: 20),
backgroundColor: AppColor.blueNormal,
key: key,
);
@@ -71,10 +60,7 @@ class RFab extends StatefulWidget {
RFab.smallDelete({required VoidCallback? onPressed, Key? key})
: this.small(
onPressed: onPressed,
icon: Assets.vec.trashSvg.svg(
width: 20,
height: 20,
),
icon: Assets.vec.trashSvg.svg(width: 20, height: 20),
backgroundColor: AppColor.redNormal,
key: key,
);
@@ -82,10 +68,7 @@ class RFab extends StatefulWidget {
RFab.delete({required VoidCallback? onPressed, Key? key})
: this(
onPressed: onPressed,
icon: Assets.vec.trashSvg.svg(
width: 20,
height: 20,
),
icon: Assets.vec.trashSvg.svg(width: 20, height: 20),
backgroundColor: AppColor.redNormal,
key: key,
);
@@ -96,10 +79,7 @@ class RFab extends StatefulWidget {
RFab.smallAction({required VoidCallback? onPressed, Key? key})
: this.small(
onPressed: onPressed,
icon: Assets.vec.scanSvg.svg(
width: 20,
height: 20,
),
icon: Assets.vec.scanSvg.svg(width: 20, height: 20),
backgroundColor: AppColor.blueNormal,
key: key,
);
@@ -107,10 +87,7 @@ class RFab extends StatefulWidget {
RFab.action({required VoidCallback? onPressed, Key? key})
: this(
onPressed: onPressed,
icon: Assets.vec.scanSvg.svg(
width: 20,
height: 20,
),
icon: Assets.vec.scanSvg.svg(width: 20, height: 20),
backgroundColor: AppColor.blueNormal,
key: key,
);
@@ -121,10 +98,7 @@ class RFab extends StatefulWidget {
RFab.smallFilter({required VoidCallback? onPressed, Key? key})
: this.small(
onPressed: onPressed,
icon: Assets.vec.scanSvg.svg(
width: 20,
height: 20,
),
icon: Assets.vec.scanSvg.svg(width: 20, height: 20),
backgroundColor: AppColor.blueNormal,
key: key,
);
@@ -132,10 +106,7 @@ class RFab extends StatefulWidget {
RFab.filter({required VoidCallback? onPressed, Key? key})
: this(
onPressed: onPressed,
icon: Assets.vec.scanSvg.svg(
width: 20,
height: 20,
),
icon: Assets.vec.scanSvg.svg(width: 20, height: 20),
backgroundColor: AppColor.blueNormal,
key: key,
);
@@ -146,10 +117,7 @@ class RFab extends StatefulWidget {
RFab.smallDownload({required VoidCallback? onPressed, Key? key})
: this.small(
onPressed: onPressed,
icon: Assets.vec.downloadSvg.svg(
width: 20,
height: 20,
),
icon: Assets.vec.downloadSvg.svg(width: 20, height: 20),
backgroundColor: AppColor.blueNormal,
key: key,
);
@@ -157,10 +125,7 @@ class RFab extends StatefulWidget {
RFab.download({required VoidCallback? onPressed, Key? key})
: this(
onPressed: onPressed,
icon: Assets.vec.downloadSvg.svg(
width: 20,
height: 20,
),
icon: Assets.vec.downloadSvg.svg(width: 20, height: 20),
backgroundColor: AppColor.blueNormal,
key: key,
);
@@ -171,10 +136,7 @@ class RFab extends StatefulWidget {
RFab.smallExcel({required VoidCallback? onPressed, Key? key})
: this.small(
onPressed: onPressed,
icon: Assets.vec.excelDownloadSvg.svg(
width: 20,
height: 20,
),
icon: Assets.vec.excelDownloadSvg.svg(width: 20, height: 20),
backgroundColor: AppColor.greenDark,
key: key,
);
@@ -182,10 +144,7 @@ class RFab extends StatefulWidget {
RFab.excel({required VoidCallback? onPressed, Key? key})
: this(
onPressed: onPressed,
icon: Assets.vec.excelDownloadSvg.svg(
width: 20,
height: 20,
),
icon: Assets.vec.excelDownloadSvg.svg(width: 20, height: 20),
backgroundColor: AppColor.greenDark,
key: key,
);
@@ -196,10 +155,7 @@ class RFab extends StatefulWidget {
RFab.smallBack({required VoidCallback? onPressed, Key? key})
: this.small(
onPressed: onPressed,
icon: Assets.vec.arrowLeftSvg.svg(
width: 20,
height: 20,
),
icon: Assets.vec.arrowLeftSvg.svg(width: 20, height: 20),
backgroundColor: AppColor.blueNormal,
key: key,
);
@@ -207,10 +163,7 @@ class RFab extends StatefulWidget {
RFab.back({required VoidCallback? onPressed, Key? key})
: this(
onPressed: onPressed,
icon: Assets.vec.arrowLeftSvg.svg(
width: 20,
height: 20,
),
icon: Assets.vec.arrowLeftSvg.svg(width: 20, height: 20),
backgroundColor: AppColor.blueNormal,
key: key,
);

View File

@@ -32,10 +32,10 @@ class ROutlinedElevatedIcon extends StatefulWidget {
Widget? icon;
@override
State<ROutlinedElevatedIcon> createState() => _ROutlinedElevatedStateIcon();
State<ROutlinedElevatedIcon> createState() => _ROutlinedElevatedIconState();
}
class _ROutlinedElevatedStateIcon extends State<ROutlinedElevatedIcon> {
class _ROutlinedElevatedIconState extends State<ROutlinedElevatedIcon> {
@override
Widget build(BuildContext context) {
return OutlinedButton.icon(

View File

@@ -0,0 +1,74 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'draggable_bottom_sheet_controller.dart';
class DraggableBottomSheet2 extends GetView<DraggableBottomSheetController> {
final Color? backgroundColor;
const DraggableBottomSheet2({super.key, this.backgroundColor = Colors.white});
@override
Widget build(BuildContext context) {
WidgetsBinding.instance.addPostFrameCallback((_) {
if (controller.isVisible.value && !controller.isVisible.value) {
controller.show();
}
});
return ObxValue((data) {
return Stack(
children: [
// پس‌زمینه تیره
Positioned.fill(
child: GestureDetector(
onTap: () {},
child: Container(color: Colors.black54),
),
),
// محتوای BottomSheet
AnimatedPositioned(
duration: Duration(milliseconds: 300),
curve: Curves.easeOut,
left: 0,
right: 0,
bottom: 0,
child: GestureDetector(
onVerticalDragUpdate: (details) {
controller.updateHeight(details.primaryDelta);
},
child: Container(
height: 350,
decoration: BoxDecoration(
color: backgroundColor,
borderRadius: BorderRadius.vertical(top: Radius.circular(20)),
boxShadow: [
BoxShadow(
color: Colors.black.withValues(alpha: 0.1),
blurRadius: 10,
),
],
),
child: Column(
children: [
GestureDetector(
onTap: () {},
child: Container(
padding: EdgeInsets.all(10),
child: Icon(Icons.drag_handle),
),
),
Expanded(
child: controller.items[data.value],
),
],
),
),
),
),
],
);
}, controller.currentIndex);
}
}

View File

@@ -129,7 +129,8 @@ import 'draggable_bottom_sheet.dart';
class DraggableBottomSheetController extends GetxController {
final RxBool isVisible = false.obs;
final RxDouble currentHeight = 200.0.obs;
RxList<Widget> items = <Widget>[].obs;
RxInt currentIndex = 0.obs;
late double initialHeight;
late double minHeight;
late double maxHeight;
@@ -158,9 +159,5 @@ class DraggableBottomSheetController extends GetxController {
}
}
@override
void onInit() {
super.onInit();
}
}

View File

@@ -0,0 +1,10 @@
import 'package:flutter/material.dart';
import 'package:latlong2/latlong.dart';
class CustomMarker {
final LatLng point;
final VoidCallback? onTap;
final int? id;
CustomMarker({ this.id, required this.point, this.onTap});
}

View File

@@ -1,6 +1,6 @@
import 'dart:async';
import 'package:flutter/animation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:flutter_map_animations/flutter_map_animations.dart';
import 'package:geolocator/geolocator.dart';
@@ -8,13 +8,16 @@ import 'package:get/get.dart';
import 'package:latlong2/latlong.dart';
import 'package:rasadyar_core/utils/logger_utils.dart';
import 'custom_marker.dart';
enum ErrorLocationType { serviceDisabled, permissionDenied, none }
class MapWidgetLogic extends GetxController with GetTickerProviderStateMixin {
Rx<LatLng> currentLocation = LatLng(35.824891, 50.948025).obs;
String tileType = 'https://tile.openstreetmap.org/{z}/{x}/{y}.png';
RxList<LatLng> markers = <LatLng>[].obs;
RxList<CustomMarker> markers = <CustomMarker>[].obs;
RxList<LatLng> allMarkers = <LatLng>[].obs;
Rx<MapController> mapController = MapController().obs;
RxList<ErrorLocationType> errorLocationType = RxList();
@@ -61,6 +64,7 @@ class MapWidgetLogic extends GetxController with GetTickerProviderStateMixin {
@override
void onClose() {
super.onClose();
_debounceTimer?.cancel();
animatedMapController.dispose();
mapController.close();
}
@@ -113,7 +117,9 @@ class MapWidgetLogic extends GetxController with GetTickerProviderStateMixin {
final latLng = LatLng(position.latitude, position.longitude);
currentLocation.value = latLng;
markers.add(latLng);
markers.add(
CustomMarker(id: -1, point: latLng, ),
);
animatedMapController.animateTo(
dest: latLng,
zoom: 18,
@@ -132,7 +138,7 @@ class MapWidgetLogic extends GetxController with GetTickerProviderStateMixin {
'radius': 1000.0,
});
markers.addAll(filtered);
// markers.addAll(filtered);
});
}
@@ -148,4 +154,17 @@ class MapWidgetLogic extends GetxController with GetTickerProviderStateMixin {
.where((marker) => distance(center, marker) <= radiusInMeters)
.toList();
}
void addMarker(CustomMarker marker) {
markers.add(marker);
}
void setMarkers(List<CustomMarker> newMarkers) {
markers.value = newMarkers;
}
void clearMarkers() {
markers.clear();
}
}

View File

@@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:geolocator/geolocator.dart';
import 'package:get/get.dart';
import 'package:latlong2/latlong.dart';
import 'package:rasadyar_core/presentation/common/app_color.dart';
import 'package:rasadyar_core/presentation/common/app_fonts.dart';
import 'package:rasadyar_core/presentation/common/assets.gen.dart';
@@ -13,7 +12,16 @@ import 'package:rasadyar_core/presentation/widget/buttons/outline_elevated.dart'
import 'logic.dart';
class MapWidget extends GetView<MapWidgetLogic> {
const MapWidget({super.key});
final VoidCallback? initOnTap;
final Widget? initMarkerWidget;
final Widget markerWidget;
const MapWidget({
this.initOnTap,
this.initMarkerWidget,
required this.markerWidget,
super.key,
});
@override
Widget build(BuildContext context) {
@@ -48,8 +56,7 @@ class MapWidget extends GetView<MapWidgetLogic> {
onPressed: () async {
var res = await Geolocator.openLocationSettings();
if (res) {
var service =
await controller.locationServiceEnabled();
var service = await controller.locationServiceEnabled();
if (service) {
controller.errorLocationType.remove(
ErrorLocationType.serviceDisabled,
@@ -59,7 +66,6 @@ class MapWidget extends GetView<MapWidgetLogic> {
}
},
),
contentPadding: EdgeInsets.all(8),
onWillPop: () async {
return controller.errorLocationType.isEmpty;
@@ -71,9 +77,7 @@ class MapWidget extends GetView<MapWidgetLogic> {
Future.microtask(() {
Get.defaultDialog(
title: 'خطا',
content: const Text(
' دسترسی به سرویس مکان‌یابی غیرفعال است',
),
content: const Text(' دسترسی به سرویس مکان‌یابی غیرفعال است'),
cancel: ROutlinedElevated(
text: 'بررسی مجدد',
width: 120,
@@ -87,9 +91,7 @@ class MapWidget extends GetView<MapWidgetLogic> {
textStyle: AppFonts.yekan16,
width: 120,
onPressed: () async {
var res = await controller.checkPermission(
request: true,
);
var res = await controller.checkPermission(request: true);
if (res) {
controller.errorLocationType.remove(
ErrorLocationType.permissionDenied,
@@ -110,7 +112,10 @@ class MapWidget extends GetView<MapWidgetLogic> {
}
return const SizedBox.shrink();
}, controller.errorLocationType),
_buildMap(), _buildGpsButton(), _buildFilterButton()],
_buildMap(),
_buildGpsButton(),
_buildFilterButton(),
],
);
}
@@ -122,16 +127,30 @@ class MapWidget extends GetView<MapWidgetLogic> {
initialCenter: currentLocation.value,
initialZoom: 18,
onPositionChanged: (camera, hasGesture) {
controller.debouncedUpdateVisibleMarkers(center: camera.center);
if (hasGesture) {
controller.debouncedUpdateVisibleMarkers(center: camera.center);
}
//controller.debouncedUpdateVisibleMarkers(center: camera.center);
},
),
children: [
TileLayer(urlTemplate: controller.tileType),
ObxValue((markers) {
ObxValue((markers) {
return MarkerLayer(
markers:
markers
.map((e) => markerWidget(marker: e, onTap: () {}))
.map(
(e) => Marker(
point: e.point,
child: GestureDetector(
onTap: e.id != -1 ? e.onTap : initOnTap,
child:
e.id != -1
? markerWidget
: initMarkerWidget ?? SizedBox.shrink(),
),
),
)
.toList(),
);
}, controller.markers),
@@ -171,21 +190,18 @@ class MapWidget extends GetView<MapWidgetLogic> {
);
}
Marker markerWidget({required LatLng marker, required VoidCallback onTap}) {
/*Marker markerWidget({required LatLng marker, required VoidCallback onTap}) {
return Marker(
point: marker,
child: GestureDetector(
onTap: onTap,
behavior: HitTestBehavior.opaque,
child: SizedBox(
width: 36,
height: 36,
child:Assets.vec.mapMarkerSvg.svg(
width: 30,
height: 30,
)
width: 36,
height: 36,
child: Assets.vec.mapMarkerSvg.svg(width: 30, height: 30),
),
),
);
}
}*/
}

View File

@@ -6,6 +6,7 @@ export 'buttons/outline_elevated.dart';
export 'buttons/outline_elevated_icon.dart';
export 'buttons/text_button.dart';
export 'draggable_bottom_sheet/draggable_bottom_sheet.dart';
export 'draggable_bottom_sheet/draggable_bottom_sheet2.dart';
export 'draggable_bottom_sheet/draggable_bottom_sheet_controller.dart';
export 'draggable_bottom_sheet/bottom_sheet_manger.dart';
export 'inputs/r_input.dart';

View File

@@ -2,7 +2,7 @@ import 'package:rasadyar_core/core.dart';
class MapLogic extends GetxController {
var ss = Get.find<DraggableBottomSheetController>();
}

View File

@@ -1,9 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter/material.dart' as mt;
import 'package:rasadyar_core/core.dart';
import 'package:rasadyar_core/presentation/widget/map/view.dart';
import 'logic.dart';
class MapPage extends GetView<MapLogic> {
@@ -14,9 +11,20 @@ class MapPage extends GetView<MapLogic> {
return Scaffold(
body: Stack(
children: [
MapWidget(),
MapWidget(
markerWidget: Icon(Icons.pin_drop_rounded),
initOnTap: () {
},
initMarkerWidget: Assets.vec.mapMarkerSvg.svg(
width: 30,
height: 30,
),
),
],
),
);
}
}
}

View File

@@ -1,9 +1,10 @@
import 'package:flutter/material.dart';
import 'package:rasadyar_core/core.dart';
import 'package:rasadyar_livestock/presentation/page/root/logic.dart';
class RequestTaggingLogic extends GetxController {
final TextEditingController phoneController = TextEditingController();
@override
void onReady() {
super.onReady();

View File

@@ -1,5 +1,7 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:rasadyar_core/core.dart';
import 'package:rasadyar_livestock/presentation/routes/app_pages.dart';
import 'logic.dart';
@@ -9,37 +11,98 @@ class RequestTaggingPage extends GetView<RequestTaggingLogic> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Request Tagging'),
centerTitle: true,
actions: [
IconButton(
icon: const Icon(Icons.search),
onPressed: () {
// Implement search functionality
},
),
],
backgroundColor: Colors.white,
appBar: RAppBar(
title: 'درخواست پلاک کوبی',
leadingWidth: 40,
leading: Assets.vec.messageAddSvg.svg(width: 12, height: 12),
),
body: Column(
children: [
const SizedBox(height: 16),
const SizedBox(height: 16),
Expanded(
child: ListView.builder(
itemCount: 10, // Replace with your data length
itemBuilder: (context, index) {
return ListTile(
title: Text('Request Item $index'),
onTap: () {
// Handle item tap
},
);
},
body: Padding(
padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 15),
child: Column(
children: [
RTextField(
controller: controller.phoneController,
label: 'تلفن دامدار',
),
),
],
SizedBox(
width: Get.width,
height: 356,
child: Card(
color: Colors.white,
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
Expanded(
child: Container(
width: Get.width,
decoration: BoxDecoration(
color: AppColor.lightGreyNormal,
borderRadius: BorderRadius.circular(8),
),
child: Center(
child: Assets.images.placeHolder.image(
height: 150,
width: 200,
),
),
),
),
SizedBox(height: 15),
Container(
width: Get.width,
height: 40,
clipBehavior: Clip.antiAlias,
decoration: ShapeDecoration(
color: AppColor.blueNormal,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
),
child: Padding(
padding: const EdgeInsets.all(10.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
' تصویر گله',
style: AppFonts.yekan14.copyWith(
color: Colors.white,
),
),
Icon(
CupertinoIcons.arrow_up_doc,
color: Colors.white,
),
],
),
),
),
],
),
),
),
),
Spacer(),
RElevated(
text: 'ارسال تصویر گله',
onPressed: () {
Get.toNamed(LiveStockRoutes.tagging);
},
height: 40,
isFullWidth: true,
backgroundColor: AppColor.greenNormal,
textStyle: AppFonts.yekan16.copyWith(color: Colors.white),
),
],
),
),
);
}

View File

@@ -93,7 +93,7 @@ class RequestsPage extends GetView<RequestsLogic> {
itemBuilder: (context, index) {
return GestureDetector(
onTap: () {
Get.toNamed(LiveStockRoutes.requestTagging,id: 0);
Get.toNamed(LiveStockRoutes.requestTagging);
},
child: Container(
width: Get.width,

View File

@@ -9,6 +9,7 @@ class RootPage extends GetView<RootLogic> {
@override
Widget build(BuildContext context) {
return ObxValue((currentIndex) {
return PopScope(
canPop: false,
onPopInvokedWithResult: (didPop, result) {
@@ -16,7 +17,6 @@ class RootPage extends GetView<RootLogic> {
eLog('Pop invoked with result: $result, didPop: $didPop');
navigatorKey?.currentState?.pop();
/*eLog('Pop invoked with result: $result, didPop: $didPop');
iLog(Get.currentRoute);
iLog(Get.previousRoute);
@@ -39,11 +39,11 @@ class RootPage extends GetView<RootLogic> {
child: Scaffold(
body: IndexedStack(
children: controller.pages,
children: [...controller.pages],
index: currentIndex.value,
sizing: StackFit.expand,
),
extendBody: true,
bottomNavigationBar: BottomNavigation1(
items: [
BottomNavigation1Item(

View File

@@ -0,0 +1,15 @@
import 'package:get/get.dart';
class TaggingLogic extends GetxController {
@override
void onReady() {
// TODO: implement onReady
super.onReady();
}
@override
void onClose() {
// TODO: implement onClose
super.onClose();
}
}

View File

@@ -0,0 +1,239 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:rasadyar_core/core.dart';
import 'package:rasadyar_core/presentation/widget/buttons/fab.dart';
import 'logic.dart';
class TaggingPage extends GetView<TaggingLogic> {
const TaggingPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
appBar: RAppBar(
title: 'پلاک کوبی',
leadingWidth: 40,
leading: Assets.vec.messageAddSvg.svg(width: 12, height: 12),
),
body: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 15),
child: Column(
children: [
Row(
children: [
Expanded(
child: Container(
height: 40,
decoration: BoxDecoration(
color: AppColor.greenLightHover,
borderRadius: BorderRadius.circular(8),
border: Border.all(color: AppColor.darkGreyLight),
),
alignment: Alignment.center,
child: Text('آمار ثبت شده : سبک 5 و سنگین 8 راس'),
),
),
SizedBox(width: 4),
IconButton(
onPressed: () {},
style: IconButton.styleFrom(
backgroundColor: AppColor.blueNormal,
fixedSize: Size(40, 40),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
),
icon: Assets.vec.editSvg.svg(),
),
],
),
Expanded(
child: Card(
clipBehavior: Clip.hardEdge,
color: Colors.white,
child: Stack(
fit: StackFit.expand,
children: [
GridView.builder(
padding: EdgeInsets.symmetric(
horizontal: 20,
vertical: 10,
),
itemCount: 20,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
crossAxisSpacing: 12,
mainAxisSpacing: 8,
),
itemBuilder: (context, index) {
return Container(
decoration: ShapeDecoration(
color: AppColor.lightGreyLightHover,
shape: RoundedRectangleBorder(
side: BorderSide(
width: 1,
color: AppColor.blackLightHover,
),
borderRadius: BorderRadius.circular(8),
),
),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Assets.vec.editSvg.svg(
width: 16,
height: 16,
colorFilter: ColorFilter.mode(
AppColor.blueNormal,
BlendMode.srcIn,
),
),
Assets.vec.trashSvg.svg(
width: 16,
height: 16,
colorFilter: ColorFilter.mode(
AppColor.error,
BlendMode.srcIn,
),
),
],
),
Text(
'گوسفند ماده',
textAlign: TextAlign.center,
style: AppFonts.yekan14.copyWith(
color: AppColor.blueNormal,
),
),
SizedBox(height: 10),
Text(
'سن : 18 ماه',
textAlign: TextAlign.center,
style: AppFonts.yekan12.copyWith(
color: AppColor.darkGreyNormal,
),
),
Text(
'نوع نژاد',
textAlign: TextAlign.center,
style: AppFonts.yekan14.copyWith(
color: AppColor.bgDark,
),
),
Text(
'1212115112512',
textAlign: TextAlign.center,
style: AppFonts.yekan14.copyWith(
color: AppColor.blueNormal,
),
),
Text(
'نوع پلاک',
textAlign: TextAlign.center,
style: AppFonts.yekan14.copyWith(
color: AppColor.bgDark,
),
),
],
),
),
);
},
),
Positioned(
bottom: 10,
right: 3,
child: RFab.add(
onPressed: () {
Get.bottomSheet(
Container(
padding: EdgeInsets.all(20),
color: Colors.white,
height: 300,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
height: 40,
width: Get.width,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
border: Border.all(
width: 1,
color: AppColor.darkGreyLight,
),
),
child: GestureDetector(
onTap: () {
},
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(
'گونه دام',
style: AppFonts.yekan14,
),
Icon(CupertinoIcons.chevron_up),
],
),
),
),
/* DropdownMenu(
width: Get.width,
dropdownMenuEntries: [
DropdownMenuEntry(
value: 'گوسفند',
label: 'گوسفند',
),
DropdownMenuEntry(
value: 'بز',
label: 'بز',
),
DropdownMenuEntry(
value: 'گوساله',
label: 'گوساله',
),
],
),*/
],
),
),
isScrollControlled: true,
);
},
),
),
],
),
),
),
SizedBox(height: 10),
RElevated(
text: 'ثبت نهایی و ارسال به اتحادیه',
textStyle: AppFonts.yekan18,
height: 40,
backgroundColor: AppColor.greenNormal,
onPressed: () {},
isFullWidth: true,
),
],
),
),
);
}
}

View File

@@ -8,6 +8,8 @@ import 'package:rasadyar_livestock/presentation/page/request_tagging/view.dart';
import 'package:rasadyar_livestock/presentation/page/requests/logic.dart';
import 'package:rasadyar_livestock/presentation/page/root/logic.dart';
import 'package:rasadyar_livestock/presentation/page/root/view.dart';
import 'package:rasadyar_livestock/presentation/page/tagging/logic.dart';
import 'package:rasadyar_livestock/presentation/page/tagging/view.dart';
part 'app_routes.dart';
@@ -26,18 +28,35 @@ sealed class LiveStockPages {
Get.lazyPut(() => ProfileLogic());
Get.lazyPut(() => ProfileLogic());
Get.lazyPut(() => MapWidgetLogic());
Get.lazyPut(() => DraggableBottomSheetController());
}),
children: [
GetPage(
/*GetPage(
name: LiveStockRoutes.requestTagging,
page: () => RequestTaggingPage(),
middlewares: [AuthMiddleware()],
binding: BindingsBuilder(() {
Get.lazyPut(() => RequestTaggingLogic());
}),
),
]
),*/
],
),
GetPage(
name: LiveStockRoutes.requestTagging,
page: () => RequestTaggingPage(),
middlewares: [AuthMiddleware()],
binding: BindingsBuilder(() {
Get.lazyPut(() => RequestTaggingLogic());
}),
),
GetPage(
name: LiveStockRoutes.tagging,
page: () => TaggingPage(),
middlewares: [AuthMiddleware()],
binding: BindingsBuilder(() {
Get.lazyPut(() => TaggingLogic());
}),
),
];
}

View File

@@ -6,5 +6,8 @@ sealed class LiveStockRoutes {
static const init = '/liveStock';
static const requests = '/requests';
static const profile = '/profile';
static const requestTagging = '$init/tagging';
//static const requestTagging = '$init/tagging';
static const requestTagging = '$requests/tagging';
static const tagging = '/tagging';
}