feat : action page

This commit is contained in:
2025-09-06 22:08:27 +03:30
parent 1bc449c9be
commit 5281bcbea6
12 changed files with 181 additions and 190 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

View File

@@ -0,0 +1,5 @@
import 'package:rasadyar_core/core.dart';
class PoultryActionLogic extends GetxController {
RxList<String> actions = ['a'].obs;
}

View File

@@ -0,0 +1,56 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:rasadyar_chicken/presentation/pages/role/view.dart';
import 'package:rasadyar_core/core.dart';
import 'package:rasadyar_core/presentation/common/assets.gen.dart';
import '../../../widget/app_bar.dart';
import 'logic.dart';
class PoultryActionPage extends GetView<PoultryActionLogic> {
PoultryActionPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: chickenAppBar(
hasBack: false,
hasFilter: false,
hasSearch: false,
isBase: false,
),
body: Column(
children: [
Assets.images.poultryAction.image(
height: 212.h,
width: Get.width.w,
fit: BoxFit.cover,
),
ObxValue((data) {
return Expanded(
child: GridView.builder(
physics: BouncingScrollPhysics(),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 4,
mainAxisSpacing: 12.h,
crossAxisSpacing: 12.w,
childAspectRatio: 2,
),
itemCount: 4,
hitTestBehavior: HitTestBehavior.opaque,
itemBuilder: (BuildContext context, int index) {
return roleCard(
title: data[index],
onTap: () async {
},
);
},
),
);
}, controller.actions),
],
),
);
}
}

View File

@@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:rasadyar_chicken/data/models/request/change_password/change_password_request_model.dart';
import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart';
import 'package:rasadyar_chicken/data/models/response/user_profile/user_profile.dart';
import 'package:rasadyar_chicken/presentation/pages/poultry_science/root/logic.dart';
@@ -10,7 +9,9 @@ class PoultryScienceProfileLogic extends GetxController {
RxInt selectedInformationType = 0.obs;
Rxn<Jalali> birthDate = Rxn<Jalali>();
Rx<Resource<UserProfile>> userProfile = Rx<Resource<UserProfile>>(Resource.loading());
Rx<Resource<UserProfile>> userProfile = Rx<Resource<UserProfile>>(
Resource.loading(),
);
TextEditingController nameController = TextEditingController();
TextEditingController lastNameController = TextEditingController();
@@ -52,7 +53,8 @@ class PoultryScienceProfileLogic extends GetxController {
lastNameController.text = data.data?.lastName ?? '';
nationalCodeController.text = data.data?.nationalCode ?? '';
nationalIdController.text = data.data?.nationalId ?? '';
birthdayController.text = data.data?.birthday?.toJalali.formatCompactDate() ?? '';
birthdayController.text =
data.data?.birthday?.toJalali.formatCompactDate() ?? '';
birthDate.value = data.data?.birthday?.toJalali;
selectedProvince.value = IranProvinceCityModel(
name: data.data?.province ?? '',
@@ -72,9 +74,9 @@ class PoultryScienceProfileLogic extends GetxController {
}
Future<void> getUserProfile() async {
userProfile.value = Resource.loading();
/* userProfile.value = Resource.loading();
await safeCall<UserProfile?>(
call: () async => await rootLogic.chickenRepository.getUserProfile(
call: () async => await rootLogic.poultryRepository.getUserProfile(
token: rootLogic.tokenService.accessToken.value!,
),
onSuccess: (result) {
@@ -83,11 +85,11 @@ class PoultryScienceProfileLogic extends GetxController {
}
},
onError: (error, stackTrace) {},
);
);*/
}
Future<void> getCites() async {
await safeCall(
/* await safeCall(
call: () =>
rootLogic.chickenRepository.getCity(provinceName: selectedProvince.value?.name ?? ''),
onSuccess: (result) {
@@ -95,11 +97,11 @@ class PoultryScienceProfileLogic extends GetxController {
cites.value = result;
}
},
);
);*/
}
Future<void> updateUserProfile() async {
UserProfile userProfile = UserProfile(
/* UserProfile userProfile = UserProfile(
firstName: nameController.text,
lastName: lastNameController.text,
nationalCode: nationalCodeController.text,
@@ -121,11 +123,11 @@ class PoultryScienceProfileLogic extends GetxController {
onError: (error, stackTrace) {
isOnLoading.value = false;
},
);
);*/
}
Future<void> updatePassword() async {
if (formKey.currentState?.validate() ?? false) {
/*if (formKey.currentState?.validate() ?? false) {
ChangePasswordRequestModel model = ChangePasswordRequestModel(
username: userProfile.value.data?.mobile,
password: newPasswordController.text,
@@ -137,7 +139,7 @@ class PoultryScienceProfileLogic extends GetxController {
model: model,
),
);
}
}*/
}
void clearPasswordForm() {

View File

@@ -458,34 +458,6 @@ class PoultryScienceProfilePage extends GetView<PoultryScienceProfileLogic> {
);
}
Widget _provinceWidget() {
return Obx(() {
return OverlayDropdownWidget<IranProvinceCityModel>(
items: controller.rootLogic.provinces,
onChanged: (value) {
controller.selectedProvince.value = value;
},
selectedItem: controller.selectedProvince.value,
itemBuilder: (item) => Text(item.name ?? 'بدون نام'),
labelBuilder: (item) => Text(item?.name ?? 'انتخاب استان'),
);
});
}
Widget _cityWidget() {
return ObxValue((data) {
return OverlayDropdownWidget<IranProvinceCityModel>(
items: data,
onChanged: (value) {
controller.selectedCity.value = value;
},
selectedItem: controller.selectedCity.value,
itemBuilder: (item) => Text(item.name ?? 'بدون نام'),
labelBuilder: (item) => Text(item?.name ?? 'انتخاب شهر'),
);
}, controller.cites);
}
Widget changePasswordBottomSheet() {
return BaseBottomSheet(
height: 400.h,

View File

@@ -1,51 +1,33 @@
import 'package:flutter/widgets.dart';
import 'package:rasadyar_chicken/data/data_source/local/chicken_local.dart';
import 'package:flutter/material.dart';
import 'package:rasadyar_chicken/data/di/chicken_di.dart';
import 'package:rasadyar_chicken/data/models/local/widely_used_local_model.dart';
import 'package:rasadyar_chicken/data/models/response/inventory/inventory_model.dart';
import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart';
import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart';
import 'package:rasadyar_chicken/data/repositories/poultry_science/poultry_science_repository.dart';
import 'package:rasadyar_chicken/presentation/pages/poultry_science/home/view.dart';
import 'package:rasadyar_chicken/presentation/pages/steward/buy/view.dart';
import 'package:rasadyar_chicken/presentation/pages/steward/home/view.dart';
import 'package:rasadyar_chicken/presentation/pages/poultry_science/poultry_action/view.dart';
import 'package:rasadyar_chicken/presentation/pages/steward/profile/view.dart';
import 'package:rasadyar_chicken/presentation/pages/steward/sale/view.dart';
import 'package:rasadyar_chicken/presentation/pages/steward/segmentation/view.dart';
import 'package:rasadyar_chicken/presentation/routes/routes.dart';
import 'package:rasadyar_chicken/presentation/utils/utils.dart';
import 'package:rasadyar_core/core.dart';
enum ErrorLocationType { serviceDisabled, permissionDenied, none }
class PoultryScienceRootLogic extends GetxController {
RxInt currentPage = 2.obs;
List<Widget> pages = [BuyPage(), SalePage(), PoultryScienceHomePage(), SegmentationPage(), ProfilePage()];
RxInt currentPage = 1.obs;
List<Widget> pages = [
PoultryActionPage(),
PoultryScienceHomePage(),
ProfilePage(),
];
late DioRemote dioRemote;
var tokenService = Get.find<TokenStorageService>();
late PoultryScienceRepository poultryRepository;
RxList<ErrorLocationType> errorLocationType = RxList();
RxMap<int, dynamic> homeExpandedList = RxMap();
Rxn<InventoryModel> inventoryModel = Rxn<InventoryModel>();
RxList<IranProvinceCityModel> provinces = <IranProvinceCityModel>[].obs;
// Cancel tokens for API calls
CancelToken? _inventoryCancelToken;
CancelToken? _provincesCancelToken;
@override
void onInit() {
super.onInit();
poultryRepository = diChicken.get<PoultryScienceRepository>();
}
@override
void onReady() {
super.onReady();
}
@override
void onClose() {
super.onClose();

View File

@@ -1,7 +1,5 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:rasadyar_chicken/chicken.dart';
import 'package:rasadyar_chicken/data/models/response/kill_house_distribution_info/kill_house_distribution_info.dart';
import 'package:rasadyar_core/core.dart';
import 'logic.dart';
@@ -43,7 +41,7 @@ class PoultryScienceRootPage extends GetView<PoultryScienceRootLogic> {
backgroundColor: AppColor.bgLight,
body: IndexedStack(
children: [
Navigator(
/* Navigator(
key: Get.nestedKey(0),
onGenerateRoute: (settings) {
final page = ChickenPages.pages.firstWhere(
@@ -66,18 +64,21 @@ class PoultryScienceRootPage extends GetView<PoultryScienceRootLogic> {
return buildRouteFromGetPage(page);
},
),*/
Navigator(
key: Get.nestedKey(0),
onGenerateRoute: (settings) =>
GetPageRoute(page: () => controller.pages[0]),
),
Navigator(
key: Get.nestedKey(1),
onGenerateRoute: (settings) =>
GetPageRoute(page: () => controller.pages[1]),
),
Navigator(
key: Get.nestedKey(2),
onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[2]),
),
Navigator(
key: Get.nestedKey(3),
onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[3]),
),
Navigator(
key: Get.nestedKey(4),
onGenerateRoute: (settings) => GetPageRoute(page: () => controller.pages[4]),
onGenerateRoute: (settings) =>
GetPageRoute(page: () => controller.pages[1]),
),
],
index: data.value,
@@ -101,7 +102,7 @@ class PoultryScienceRootPage extends GetView<PoultryScienceRootLogic> {
icon: Assets.vec.homeSvg.path,
isSelected: controller.currentPage.value == 1,
onTap: () {
/* Get.nestedKey(1)?.currentState?.popUntil((route) => route.isFirst);
/* Get.nestedKey(1)?.currentState?.popUntil((route) => route.isFirst);
Get.nestedKey(0)?.currentState?.popUntil((route) => route.isFirst);*/
controller.changePage(1);
},
@@ -111,7 +112,7 @@ class PoultryScienceRootPage extends GetView<PoultryScienceRootLogic> {
icon: Assets.vec.profileCircleSvg.path,
isSelected: controller.currentPage.value == 2,
onTap: () {
/* Get.nestedKey(1)?.currentState?.popUntil((route) => route.isFirst);
/* Get.nestedKey(1)?.currentState?.popUntil((route) => route.isFirst);
Get.nestedKey(0)?.currentState?.popUntil((route) => route.isFirst);
*/
controller.changePage(2);
@@ -123,6 +124,4 @@ class PoultryScienceRootPage extends GetView<PoultryScienceRootLogic> {
);
}, controller.currentPage);
}
}

View File

@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:rasadyar_chicken/data/common/fa_user_role.dart';
import 'package:rasadyar_chicken/presentation/widget/base_page/view.dart';
import 'package:rasadyar_chicken/presentation/widget/app_bar.dart';
import 'package:rasadyar_core/core.dart';
import 'logic.dart';
@@ -10,111 +10,80 @@ class RolePage extends GetView<RoleLogic> {
@override
Widget build(BuildContext context) {
return BasePage(
hasSearch: true,
hasBack: false,
isBase: true,
routes: ['انتخاب نقش'],
widgets: [
ObxValue((data) {
return Expanded(
child: GridView.builder(
physics: BouncingScrollPhysics(),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
mainAxisSpacing: 12.h,
crossAxisSpacing: 12.w,
childAspectRatio: 2,
),
itemCount: data.length,
hitTestBehavior: HitTestBehavior.opaque,
itemBuilder: (BuildContext context, int index) {
Map role = getFaUserRoleWithOnTap(data[index]);
return roleCard(
title: role.keys.first,
onTap: () async {
String route = role.values.first;
await controller.gService.saveSelectedRole(
Module.chicken,
route,
);
Get.offAllNamed(route);
},
);
},
),
);
}, controller.roles),
],
);
/* return Scaffold(
body: Stack(
alignment: Alignment.center,
return Scaffold(
appBar: chickenAppBar(
hasBack: false,
hasFilter: false,
hasSearch: false,
isBase: false,
),
body: Column(
children: [
Assets.rive.shapes.rive(fit: BoxFit.cover),
Positioned.fill(
child: BackdropFilter(
filter: ImageFilter.blur(sigmaX: 20, sigmaY: 20),
child: Container(color: Colors.white.withValues(alpha: 0.2)),
),
Assets.images.selectRole.image(
height: 212.h,
width: Get.width.w,
fit: BoxFit.cover,
),
Container(
height: 400.h,
padding: EdgeInsets.symmetric(horizontal: 16.w),
child: Card(
child: Column(
children: [
SizedBox(height: 12.h),
Text(
'انتخاب نقش',
style: AppFonts.yekan20Bold.copyWith(color: AppColor.textColor),
),
ObxValue((data) {
return Expanded(
child: GridView.builder(
physics: BouncingScrollPhysics(),
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: 250,
mainAxisSpacing: 12,
crossAxisSpacing: 12,
childAspectRatio: 1.5,
),
itemCount: data.length,
hitTestBehavior: HitTestBehavior.opaque,
itemBuilder: (BuildContext context, int index) {
return roleCard(title: getFaUserRole(data[index]), onTap: () {});
},
),
);
}, controller.roles),
],
ObxValue((data) {
return Expanded(
child: GridView.builder(
physics: BouncingScrollPhysics(),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
mainAxisSpacing: 12.h,
crossAxisSpacing: 12.w,
childAspectRatio: 2,
),
itemCount: data.length,
hitTestBehavior: HitTestBehavior.opaque,
itemBuilder: (BuildContext context, int index) {
Map role = getFaUserRoleWithOnTap(data[index]);
return roleCard(
title: role.keys.first,
onTap: () async {
String route = role.values.first;
await controller.gService.saveSelectedRole(
Module.chicken,
route,
);
Get.offAllNamed(route);
},
);
},
),
),
),
);
}, controller.roles),
],
),
);*/
}
Widget roleCard({required String title, Function()? onTap}) {
return Container(
width: 128.w,
height: 48.h,
margin: EdgeInsets.all(8.w),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.r),
border: Border.all(color: AppColor.blueNormal, width: 1.w),
),
child: InkWell(
onTap: onTap,
child: Center(
child: Text(
title,
style: AppFonts.yekan12Bold.copyWith(color: AppColor.blueNormal),
),
),
),
);
}
}
Widget roleCard({
required String title,
Function()? onTap,
int? width,
int? height,
}) {
return Container(
width: width?.w ?? 128.w,
height: height?.h ?? 48.h,
margin: EdgeInsets.all(8.w),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.r),
border: Border.all(color: AppColor.blueNormal, width: 1.w),
),
child: InkWell(
onTap: onTap,
child: Center(
child: Text(
title,
style: AppFonts.yekan12Bold.copyWith(color: AppColor.blueNormal),
),
),
),
);
}

View File

@@ -1,6 +1,8 @@
import 'package:rasadyar_chicken/presentation/pages/auth/logic.dart';
import 'package:rasadyar_chicken/presentation/pages/auth/view.dart';
import 'package:rasadyar_chicken/presentation/pages/poultry_science/home/logic.dart';
import 'package:rasadyar_chicken/presentation/pages/poultry_science/poultry_action/logic.dart';
import 'package:rasadyar_chicken/presentation/pages/poultry_science/profile/logic.dart';
import 'package:rasadyar_chicken/presentation/pages/poultry_science/root/logic.dart';
import 'package:rasadyar_chicken/presentation/pages/poultry_science/root/view.dart';
import 'package:rasadyar_chicken/presentation/pages/role/logic.dart';
@@ -147,13 +149,11 @@ sealed class ChickenPages {
middlewares: [AuthMiddleware()],
binding: BindingsBuilder(() {
Get.lazyPut(() => BaseLogic());
Get.lazyPut(() => SearchLogic());
Get.lazyPut(() => PoultryScienceRootLogic());
Get.lazyPut(() => PoultryScienceHomeLogic());
Get.lazyPut(() => BuyLogic());
Get.lazyPut(() => SaleLogic());
Get.lazyPut(() => ProfileLogic());
Get.lazyPut(() => SegmentationLogic());
Get.lazyPut(() => SearchLogic());
Get.lazyPut(() => PoultryScienceProfileLogic());
Get.lazyPut(() => PoultryActionLogic());
}),
),

View File

@@ -6,7 +6,7 @@ import 'package:rasadyar_chicken/presentation/widget/search/logic.dart';
import 'package:rasadyar_chicken/presentation/widget/search/view.dart';
import 'package:rasadyar_core/core.dart';
class BasePage extends StatefulWidget {
class BasePage extends StatefulWidget {
const BasePage({
super.key,
this.routes,

View File

@@ -404,8 +404,14 @@ class $AssetsImagesGen {
/// File path: assets/images/place_holder.png
AssetGenImage get placeHolder => const AssetGenImage('assets/images/place_holder.png');
/// File path: assets/images/poultry_action.webp
AssetGenImage get poultryAction => const AssetGenImage('assets/images/poultry_action.webp');
/// File path: assets/images/select_role.webp
AssetGenImage get selectRole => const AssetGenImage('assets/images/select_role.webp');
/// List of all assets
List<AssetGenImage> get values => [chicken, innerSplash, outterSplash, placeHolder];
List<AssetGenImage> get values => [chicken, innerSplash, outterSplash, placeHolder, poultryAction, selectRole];
}
class $AssetsLogosGen {