Compare commits

..

No commits in common. '164daa7d58d073ca5af9cc7027e74dae95603234' and '9c7c178f710c971e1449ed9ac4170b6a50cf4063' have entirely different histories.

@ -3,10 +3,8 @@ import 'dart:developer';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/controllers/providers/api/all_requests_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/enum_extensions.dart'; import 'package:test_sa/extensions/enum_extensions.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
@ -47,22 +45,12 @@ class DashBoardProvider extends ChangeNotifier {
notifyListeners(); notifyListeners();
} }
List<int> listIndex = []; int _currentListIndex = 0;
int? _currentListIndex; int get currentListIndex => _currentListIndex;
int? get currentListIndex => _currentListIndex; set currentListIndex(int value) {
set currentListIndex(int? value) {
_currentListIndex = value; _currentListIndex = value;
if (value == null) {
listIndex.clear();
}
else if (listIndex.contains(value)) {
listIndex.remove(value);
} else {
listIndex.add(value);
}
notifyListeners(); notifyListeners();
} }
@ -126,13 +114,7 @@ class DashBoardProvider extends ChangeNotifier {
setTabs(userType: userType, context: context); setTabs(userType: userType, context: context);
getDashBoardCount(usersType: userType); getDashBoardCount(usersType: userType);
resetRequestDataList(); resetRequestDataList();
if (listIndex.isEmpty) { getRequestDetail(usersType: userType, status: tabs[currentListIndex].tag, tabId: tabs[currentListIndex].id);
Provider.of<AllRequestsProvider>(context, listen: false)
..reset()
..getAllRequests(context);
} else {
getRequestDetail(usersType: userType, status: tabs[currentListIndex!].tag, tabId: tabs[currentListIndex!].id);
}
// notifyListeners(); // notifyListeners();
} }
@ -456,13 +438,12 @@ class CategoryTabs {
static List<CategoryTabs> getTabs({required UsersTypes userType, required BuildContext context}) { static List<CategoryTabs> getTabs({required UsersTypes userType, required BuildContext context}) {
List<CategoryTabs> tabs = []; List<CategoryTabs> tabs = [];
if (userType == UsersTypes.engineer) { if (userType == UsersTypes.engineer) {
// Order: 1-UnAssigned, 2-HighPriority, 3-Overdue, 4-Open, 5-InProgress, 6-Completed
tabs.add(CategoryTabs(label: 'UnAssigned', tag: 1, id: 1, requestType: RequestTypeEnum.unassigned, icon: "dashboard/unassigned", iconColor: AppColor.unassignedStatus(context))); tabs.add(CategoryTabs(label: 'UnAssigned', tag: 1, id: 1, requestType: RequestTypeEnum.unassigned, icon: "dashboard/unassigned", iconColor: AppColor.unassignedStatus(context)));
tabs.add(CategoryTabs(label: context.translation.highPriority, tag: 3, id: 4, requestType: RequestTypeEnum.highPriority, icon: "high_priority", iconColor: AppColor.red30, isHighPriority: true));
tabs.add(CategoryTabs(label: context.translation.overdue, tag: 3, id: 4, requestType: RequestTypeEnum.overdue, icon: "overdue", iconColor: AppColor.yellowIcon(context), isOverDue: true));
tabs.add(CategoryTabs(label: 'Open', tag: 1, id: 2, requestType: RequestTypeEnum.open, icon: "dashboard/open_icon", iconColor: AppColor.openColor)); tabs.add(CategoryTabs(label: 'Open', tag: 1, id: 2, requestType: RequestTypeEnum.open, icon: "dashboard/open_icon", iconColor: AppColor.openColor));
tabs.add(CategoryTabs(label: 'In Progress', tag: 2, id: 3, requestType: RequestTypeEnum.inProgress, icon: "dashboard/inprogress_icon", iconColor: AppColor.primary10)); tabs.add(CategoryTabs(label: 'In Progress', tag: 2, id: 3, requestType: RequestTypeEnum.inProgress, icon: "dashboard/inprogress_icon", iconColor: AppColor.primary10));
tabs.add(CategoryTabs(label: 'Completed', tag: 3, id: 4, requestType: RequestTypeEnum.completed, icon: "complete_request", iconColor: AppColor.completedColor)); tabs.add(CategoryTabs(label: 'Completed', tag: 3, id: 4, requestType: RequestTypeEnum.completed, icon: "complete_request", iconColor: AppColor.completedColor));
tabs.add(CategoryTabs(label: context.translation.overdue, tag: 3, id: 4, requestType: RequestTypeEnum.overdue, icon: "overdue", iconColor: AppColor.yellowIcon(context), isOverDue: true));
tabs.add(CategoryTabs(label: context.translation.highPriority, tag: 3, id: 4, requestType: RequestTypeEnum.highPriority, icon: "high_priority", iconColor: AppColor.red30, isHighPriority: true));
return tabs; return tabs;
} }

@ -6,7 +6,6 @@ import 'package:nfc_manager/nfc_manager.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/notification/firebase_notification_manger.dart'; import 'package:test_sa/controllers/notification/firebase_notification_manger.dart';
import 'package:test_sa/controllers/notification/notification_manger.dart'; import 'package:test_sa/controllers/notification/notification_manger.dart';
import 'package:test_sa/controllers/providers/api/all_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/notifications_provider.dart'; import 'package:test_sa/controllers/providers/api/notifications_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
@ -58,17 +57,13 @@ class _DashboardViewState extends State<DashboardView> {
_dashBoardProvider.setTabs(userType: userProvider.user!.type!, context: context); _dashBoardProvider.setTabs(userType: userProvider.user!.type!, context: context);
_dashBoardProvider.getDashBoardCount(usersType: userProvider.user!.type!); _dashBoardProvider.getDashBoardCount(usersType: userProvider.user!.type!);
_dashBoardProvider.resetRequestDataList(); _dashBoardProvider.resetRequestDataList();
_dashBoardProvider.currentListIndex = null; _dashBoardProvider.currentListIndex = 0;
Provider.of<AllRequestsProvider>(context, listen: false) _dashBoardProvider.getRequestDetail(
..reset() usersType: userProvider.user!.type!,
..getAllRequests(context); status: _dashBoardProvider.tabs[_dashBoardProvider.currentListIndex].tag,
tabId: _dashBoardProvider.tabs[_dashBoardProvider.currentListIndex].id,
// _dashBoardProvider.getRequestDetail( isHighPriority: _dashBoardProvider.tabs[_dashBoardProvider.currentListIndex].isHighPriority,
// usersType: userProvider.user!.type!, isOverdue: _dashBoardProvider.tabs[_dashBoardProvider.currentListIndex].isOverDue);
// status: _dashBoardProvider.tabs[_dashBoardProvider.currentListIndex].tag,
// tabId: _dashBoardProvider.tabs[_dashBoardProvider.currentListIndex].id,
// isHighPriority: _dashBoardProvider.tabs[_dashBoardProvider.currentListIndex].isHighPriority,
// isOverdue: _dashBoardProvider.tabs[_dashBoardProvider.currentListIndex].isOverDue);
} }
void getInitialData() { void getInitialData() {
@ -99,14 +94,8 @@ class _DashboardViewState extends State<DashboardView> {
_scrollController.addListener(() async { _scrollController.addListener(() async {
if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent && !_dashBoardProvider.isDetailLoading) { if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent && !_dashBoardProvider.isDetailLoading) {
_dashBoardProvider.pageNum = _dashBoardProvider.pageNum + 1; _dashBoardProvider.pageNum = _dashBoardProvider.pageNum + 1;
if (_dashBoardProvider.currentListIndex == null) { _dashBoardProvider.getRequestDetail(
} else { usersType: user.type!, showLoader: false, status: _dashBoardProvider.tabs[_dashBoardProvider.currentListIndex].tag, tabId: _dashBoardProvider.tabs[_dashBoardProvider.currentListIndex].id);
_dashBoardProvider.getRequestDetail(
usersType: user.type!,
showLoader: false,
status: _dashBoardProvider.tabs[_dashBoardProvider.currentListIndex!].tag,
tabId: _dashBoardProvider.tabs[_dashBoardProvider.currentListIndex!].id);
}
} }
}); });
} }

@ -157,87 +157,84 @@ class _AppBarWidgetState extends State<AppBarWidget> with TickerProviderStateMix
child: FadeTransition( child: FadeTransition(
opacity: _rightFadeAnimation, opacity: _rightFadeAnimation,
child: Consumer<SettingProvider>(builder: (context, settingProvider, child) { child: Consumer<SettingProvider>(builder: (context, settingProvider, child) {
return MenuAnchor( return MenuAnchor(
style: MenuStyle( style: MenuStyle(
backgroundColor: WidgetStateProperty.all(AppColor.background(context)), backgroundColor: WidgetStateProperty.all(AppColor.background(context)),
shape: WidgetStateProperty.all( shape: WidgetStateProperty.all(
RoundedRectangleBorder( RoundedRectangleBorder(
borderRadius: const BorderRadius.all(Radius.circular(20.0)), borderRadius: const BorderRadius.all(Radius.circular(20.0)),
side: BorderSide(color: AppColor.borderColor(context), width: 1), side: BorderSide(color: AppColor.borderColor(context), width: 1),
), ),
), ),
padding: WidgetStateProperty.all( padding: WidgetStateProperty.all(
EdgeInsets.symmetric( EdgeInsets.symmetric(
horizontal: 0.toScreenWidth, horizontal: 0.toScreenWidth,
vertical: 8.toScreenHeight, vertical: 8.toScreenHeight,
),
),
elevation: WidgetStateProperty.all(0),
), ),
menuChildren: Provider.of<UserProvider>(context, listen: false).user?.assetGroups?.map<MenuItemButton>((value) { ),
return MenuItemButton( elevation: WidgetStateProperty.all(0),
onPressed: () async { ),
if (settingProvider.assetGroup != value) { menuChildren: Provider.of<UserProvider>(context, listen: false).user?.assetGroups?.map<MenuItemButton>((value) {
AssetGroup? tempGroup = ApiManager.instance.assetGroup; return MenuItemButton(
ApiManager.instance.assetGroup = value; onPressed: () async {
if (settingProvider.assetGroup != value) {
AssetGroup? tempGroup = ApiManager.instance.assetGroup;
ApiManager.instance.assetGroup = value;
Utils.showLoading(context); Utils.showLoading(context);
bool isSuccess = await context.userProvider.userChangeAssetGroup(); bool isSuccess = await context.userProvider.userChangeAssetGroup();
Utils.hideLoading(context); Utils.hideLoading(context);
if (isSuccess) { if (isSuccess) {
await context.userProvider.getMobilePermissionByUser(); await context.userProvider.getMobilePermissionByUser();
settingProvider.setAssetGroup(value); settingProvider.setAssetGroup(value);
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
context.settingProvider.setUser(ApiManager.instance.user!); context.settingProvider.setUser(ApiManager.instance.user!);
context.userProvider.setUser(ApiManager.instance.user!); context.userProvider.setUser(ApiManager.instance.user!);
DashBoardProvider dashBoardProvider = Provider.of<DashBoardProvider>(context, listen: false); DashBoardProvider dashBoardProvider = Provider.of<DashBoardProvider>(context, listen: false);
dashBoardProvider.setTabs(userType: settingProvider.user!.type!, context: context); dashBoardProvider.setTabs(userType: settingProvider.user!.type!, context: context);
dashBoardProvider.getDashBoardCount(usersType: settingProvider.user!.type!); dashBoardProvider.getDashBoardCount(usersType: settingProvider.user!.type!);
dashBoardProvider.resetRequestDataList(); dashBoardProvider.resetRequestDataList();
if (dashBoardProvider.currentListIndex == null) { dashBoardProvider.getRequestDetail(usersType: settingProvider.user!.type!, status: dashBoardProvider.tabs[dashBoardProvider.currentListIndex].tag);
} else { });
dashBoardProvider.getRequestDetail(usersType: settingProvider.user!.type!, status: dashBoardProvider.tabs[dashBoardProvider.currentListIndex!].tag); } else {
} ApiManager.instance.assetGroup = tempGroup;
}); context.showConfirmDialog("Failed, Please Try again");
} else { }
ApiManager.instance.assetGroup = tempGroup; }
context.showConfirmDialog("Failed, Please Try again"); },
} child: Text(value.name ?? "", style: AppTextStyles.bodyText2.copyWith(color: AppColor.headingTextColor(context))),
} );
}, }).toList() ??
child: Text(value.name ?? "", style: AppTextStyles.bodyText2.copyWith(color: AppColor.headingTextColor(context))), [],
); builder: (_, MenuController controller, Widget? child) {
}).toList() ?? return Container(
[], padding: const EdgeInsets.all(10),
builder: (_, MenuController controller, Widget? child) { decoration: BoxDecoration(
return Container( borderRadius: BorderRadius.circular(8),
padding: const EdgeInsets.all(10), color: AppColor.assetGroupBackground(context),
decoration: BoxDecoration( border: Border.all(color: AppColor.white936.withValues(alpha: .03), width: 1),
borderRadius: BorderRadius.circular(8), boxShadow: [
color: AppColor.assetGroupBackground(context), BoxShadow(color: Colors.black.withValues(alpha: 0.03), blurRadius: 4, offset: const Offset(0, 0), spreadRadius: 0),
border: Border.all(color: AppColor.white936.withValues(alpha: .03), width: 1), ],
boxShadow: [ ),
BoxShadow(color: Colors.black.withValues(alpha: 0.03), blurRadius: 4, offset: const Offset(0, 0), spreadRadius: 0), child: Row(
], mainAxisSize: MainAxisSize.min,
), spacing: 16,
child: Row( children: [
mainAxisSize: MainAxisSize.min, Text(settingProvider.assetGroup?.name ?? "", style: AppTextStyles.bodyText2.copyWith(color: AppColor.headingTextColor(context))),
spacing: 16, Icon(Icons.keyboard_arrow_down, color: AppColor.headingTextColor(context)),
children: [ ],
Text(settingProvider.assetGroup?.name ?? "", style: AppTextStyles.bodyText2.copyWith(color: AppColor.headingTextColor(context))), ),
Icon(Icons.keyboard_arrow_down, color: AppColor.headingTextColor(context)), ).onPress(() {
], if (controller.isOpen) {
), controller.close();
).onPress(() { } else {
if (controller.isOpen) { controller.open();
controller.close(); }
} else { });
controller.open(); },
} );
}); }),
},
);
}),
), ),
), ),
16.width, 16.width,

@ -1,6 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/all_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/dashboard_latest/dashboard_provider.dart'; import 'package:test_sa/dashboard_latest/dashboard_provider.dart';
import 'package:test_sa/dashboard_latest/widgets/request_category_list.dart'; import 'package:test_sa/dashboard_latest/widgets/request_category_list.dart';
@ -16,8 +15,6 @@ import 'package:test_sa/new_views/common_widgets/tab_button.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import '../../new_views/pages/land_page/widgets/request_item_view_list.dart';
class RequestCategoryFragment extends StatefulWidget { class RequestCategoryFragment extends StatefulWidget {
const RequestCategoryFragment({Key? key}) : super(key: key); const RequestCategoryFragment({Key? key}) : super(key: key);
@ -30,7 +27,6 @@ class _RequestCategoryFragmentState extends State<RequestCategoryFragment> with
late AnimationController _animationController; late AnimationController _animationController;
late Animation<double> _headerFadeAnimation; late Animation<double> _headerFadeAnimation;
late Animation<Offset> _headerSlideAnimation; late Animation<Offset> _headerSlideAnimation;
final ScrollController _scrollController = ScrollController();
@override @override
void initState() { void initState() {
@ -64,7 +60,6 @@ class _RequestCategoryFragmentState extends State<RequestCategoryFragment> with
@override @override
void dispose() { void dispose() {
_animationController.dispose(); _animationController.dispose();
_scrollController.dispose();
super.dispose(); super.dispose();
} }
@ -78,16 +73,13 @@ class _RequestCategoryFragmentState extends State<RequestCategoryFragment> with
// Reload data with new sort order // Reload data with new sort order
dashboardProvider.resetRequestDataList(); dashboardProvider.resetRequestDataList();
if (dashboardProvider.currentListIndex == null) { dashboardProvider.getRequestDetail(
} else { usersType: userType ?? UsersTypes.normal_user,
dashboardProvider.getRequestDetail( showLoader: true,
usersType: userType ?? UsersTypes.normal_user, status: tabs[dashboardProvider.currentListIndex].tag,
showLoader: true, tabId: tabs[dashboardProvider.currentListIndex].id,
status: tabs[dashboardProvider.currentListIndex!].tag, isAscending: isAscending,
tabId: tabs[dashboardProvider.currentListIndex!].id, );
isAscending: isAscending,
);
}
} }
@override @override
@ -110,62 +102,47 @@ class _RequestCategoryFragmentState extends State<RequestCategoryFragment> with
opacity: _headerFadeAnimation, opacity: _headerFadeAnimation,
child: SlideTransition( child: SlideTransition(
position: _headerSlideAnimation, position: _headerSlideAnimation,
child: child: !isNurse && dashboardProvider.tabs.isNotEmpty && dashboardProvider.tabs[dashboardProvider.currentListIndex].tag == 0
// !isNurse && dashboardProvider.tabs.isNotEmpty ? Column(
// //&& dashboardProvider.tabs[dashboardProvider.currentListIndex].tag == 0 crossAxisAlignment: CrossAxisAlignment.start,
// ? Column( children: [
// crossAxisAlignment: CrossAxisAlignment.start, Text(context.translation.allWorkOrder, style: AppTextStyles.heading4.copyWith(color: AppColor.headingTextColor(context))),
// children: [ // Row(
// Text(context.translation.allWorkOrder, style: AppTextStyles.heading4.copyWith(color: AppColor.headingTextColor(context))), // mainAxisAlignment: MainAxisAlignment.spaceBetween,
// // Row( // children: [
// // mainAxisAlignment: MainAxisAlignment.spaceBetween, // context.translation.allWorkOrder.heading4(context),
// // children: [ // GestureDetector(
// // context.translation.allWorkOrder.heading4(context), // onTap: () {
// // GestureDetector( // dashboardProvider.isShowDashBoardCalendar = !dashboardProvider.isShowDashBoardCalendar;
// // onTap: () { // },
// // dashboardProvider.isShowDashBoardCalendar = !dashboardProvider.isShowDashBoardCalendar; // child: dashboardProvider.isShowDashBoardCalendar ? AppAsset.listIcon.toSvgAsset() : AppAsset.calendarIcon.toSvgAsset())
// // }, // ],
// // child: dashboardProvider.isShowDashBoardCalendar ? AppAsset.listIcon.toSvgAsset() : AppAsset.calendarIcon.toSvgAsset()) // ),
// // ], dashboardProvider.isShowDashBoardCalendar
// // ), ? Padding(
// dashboardProvider.isShowDashBoardCalendar padding: EdgeInsets.only(top: 12.toScreenHeight),
// ? Padding( child: const WeeklyCalendarFragment(),
// padding: EdgeInsets.only(top: 12.toScreenHeight), )
// child: const WeeklyCalendarFragment(), : const SizedBox(),
// ) ],
// : const SizedBox(), ).paddingOnly(start: 14, end: 12)
// ], : Row(
// ).paddingOnly(start: 14, end: 12) spacing: 16,
// : children: [
Row( Text(context.translation.allWorkOrder, style: AppTextStyles.heading4.copyWith(color: AppColor.headingTextColor(context))).expanded,
spacing: 16, // todo commenting this code, for FM
children: [ // if (!isFMSEngineer)
Text(context.translation.allWorkOrder, style: AppTextStyles.heading4.copyWith(color: AppColor.headingTextColor(context))).expanded, // 'search'.toSvgAsset(width: 24, height: 24, color: AppColor.headingTextColor(context)).onPress(() {
// todo commenting this code, for FM // Navigator.of(context).pushNamed('/cleaner_search');
// if (!isFMSEngineer) // }),
// 'search'.toSvgAsset(width: 24, height: 24, color: AppColor.headingTextColor(context)).onPress(() { Transform.flip(
// Navigator.of(context).pushNamed('/cleaner_search'); flipY: isAscending,
// }), child: 'dashboard/sort_descending'.toSvgAsset(width: 24, height: 24, color: AppColor.headingTextColor(context)).onPress(() {
_toggleSort(dashboardProvider, user?.type);
if (dashboardProvider.listIndex.isNotEmpty) }),
Text( )
'Clear Filters', ],
style: AppTextStyles.bodyText2.copyWith(color: AppColor.red30), ).paddingOnly(start: 16, end: 16),
).onPress(() {
dashboardProvider.resetRequestDataList();
dashboardProvider.currentListIndex = null;
Provider.of<AllRequestsProvider>(context, listen: false)
..reset()
..getAllRequests(context);
}),
Transform.flip(
flipY: isAscending,
child: 'dashboard/sort_descending'.toSvgAsset(width: 24, height: 24, color: AppColor.headingTextColor(context)).onPress(() {
_toggleSort(dashboardProvider, user?.type);
}),
)
],
).paddingOnly(start: 16, end: 16),
), ),
), ),
@ -180,67 +157,55 @@ class _RequestCategoryFragmentState extends State<RequestCategoryFragment> with
// ], // ],
// ).paddingOnly(start: 16, end: 16) // ).paddingOnly(start: 16, end: 16)
// : context.translation.allWorkOrder.heading4(context).paddingOnly(start: 16, end: 16), // : context.translation.allWorkOrder.heading4(context).paddingOnly(start: 16, end: 16),
(dashboardProvider.currentListIndex == null)
? Consumer<AllRequestsProvider>(builder: (context, snapshot, _) { dashboardProvider.isDetailLoading
return RequestItemViewList( ? Column(
snapshot.allRequestsAndCount?.requestsDetails ?? [], mainAxisSize: MainAxisSize.max,
snapshot.isAllLoading, children: List.generate(3, (index) {
key: ValueKey('request_list_'), // Key changes on every tab click return Padding(
); padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight, horizontal: 0),
}) child: const SizedBox().toRequestShimmer(context, dashboardProvider.isDetailLoading),
: dashboardProvider.isDetailLoading );
? Column( })).paddingOnly(start: 16, end: 16, top: 16)
mainAxisSize: MainAxisSize.max, : (dashboardProvider.requestDetailList == null || dashboardProvider.requestDetailList?.data?.isEmpty == true)
children: List.generate(3, (index) { ? const NoDataFound().paddingOnly(top: 80).center
return Padding( : RequestCategoryList(dashboardProvider.requestDetailList?.data ?? <Data>[], dashboardProvider.isDetailLoading, dashboardProvider.requestDetailList?.totalRows ?? 0),
padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight, horizontal: 0),
child: const SizedBox().toRequestShimmer(context, dashboardProvider.isDetailLoading),
);
})).paddingOnly(start: 16, end: 16, top: 16)
: (dashboardProvider.requestDetailList == null || dashboardProvider.requestDetailList?.data?.isEmpty == true)
? const NoDataFound().paddingOnly(top: 80).center
: RequestCategoryList(dashboardProvider.requestDetailList?.data ?? <Data>[], dashboardProvider.isDetailLoading, dashboardProvider.requestDetailList?.totalRows ?? 0),
]); ]);
}); });
} }
Widget getTabs({required BuildContext context, required DashBoardProvider requestsProvider, required UsersTypes? userType}) { Widget getTabs({required BuildContext context, required DashBoardProvider requestsProvider, required UsersTypes? userType}) {
List<CategoryTabs> tabs = CategoryTabs.getTabs(userType: userType ?? UsersTypes.normal_user, context: context); List<CategoryTabs> tabs = CategoryTabs.getTabs(userType: userType ?? UsersTypes.normal_user, context: context);
// SizedBox(
// height: 44 + (context.isTablet() ? 36 : 16).toScreenHeight,
// child: ListView.separated(
// scrollDirection: Axis.horizontal,
// separatorBuilder: (cxt, index) => 12.width,
// padding: const EdgeInsets.only(top: 6 + 16, left: 16, right: 16),
// itemBuilder: (cxt, index) {
// return TabButton(
// label: tabs[index].label,
// loading: requestsProvider.isDetailLoading,
// isSelected: requestsProvider.currentListIndex == index,
// count: requestsProvider.requestDetailList != null ? requestsProvider.requestDetailList!.count ?? 0 : 0,
// onPressed: () async {
// setState(() {
// isAscending = false;
// });
// requestsProvider.currentListIndex = index;
// requestsProvider.resetRequestDataList();
// requestsProvider.getRequestDetail(usersType: userType ?? UsersTypes.normal_user, showLoader: true, status: tabs[index].tag, tabId: tabs[index].id);
// },
// );
// },
// itemCount: tabs.length),
// );
// Calculate item width to show X.5 items (last visible item is exactly 50% visible) return GridView.builder(
final screenWidth = MediaQuery.of(context).size.width; padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16),
final isTablet = context.isTablet(); physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
// Show 3.5 items on phone, 4.5 on tablet (perfect 50% peek) gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: context.isTablet() ? 5 : 4, childAspectRatio: 85 / 85, crossAxisSpacing: 8, mainAxisSpacing: 8),
final visibleItemsWithPeek = isTablet ? 4.5 : 3.5;
const spacing = 4.0;
const horizontalPadding = 16.0;
// Calculate item width: divide available space by visible items including the half item
final availableWidth = screenWidth - (horizontalPadding * 2);
final fullItems = visibleItemsWithPeek.floor(); // 3 or 4
final totalSpacing = (fullItems - 1) * spacing + (spacing * 0.5); // Full gaps + half gap for peek
final itemWidth = (availableWidth - totalSpacing) / visibleItemsWithPeek;
// Check if scrolling is needed
final needsScrolling = tabs.length > fullItems;
return SizedBox(
height: itemWidth + 16, // Height matches item width + bottom padding
child: _buildHorizontalScrollableList(tabs, requestsProvider, userType, itemWidth, needsScrolling),
);
}
// Horizontal scrollable list
Widget _buildHorizontalScrollableList(List<CategoryTabs> tabs, DashBoardProvider requestsProvider, UsersTypes? userType, double itemWidth, bool needsScrolling) {
const leftPadding = 16.0;
const rightPadding = 16.0; // Equal padding - peek is created by item sizing
return ListView.separated(
controller: _scrollController,
scrollDirection: Axis.horizontal,
separatorBuilder: (cxt, index) => const SizedBox(width: 4),
padding: const EdgeInsets.only(bottom: 16, left: leftPadding, right: rightPadding),
itemBuilder: (cxt, index) { itemBuilder: (cxt, index) {
// Calculate staggered animation delay // Calculate staggered animation delay
final delay = index * 0.08; final delay = index * 0.08;
@ -256,7 +221,7 @@ class _RequestCategoryFragmentState extends State<RequestCategoryFragment> with
); );
final slideAnimation = Tween<Offset>( final slideAnimation = Tween<Offset>(
begin: const Offset(-0.3, 0.0), begin: const Offset(0.0, 0.3),
end: Offset.zero, end: Offset.zero,
).animate( ).animate(
CurvedAnimation( CurvedAnimation(
@ -273,31 +238,28 @@ class _RequestCategoryFragmentState extends State<RequestCategoryFragment> with
opacity: animation, opacity: animation,
child: SlideTransition( child: SlideTransition(
position: slideAnimation, position: slideAnimation,
child: SizedBox( child: RequestTypeButton(
width: itemWidth, // Use responsive width label: tabs[index].label,
child: RequestTypeButton( loading: requestsProvider.isDetailLoading && requestsProvider.currentListIndex == index,
label: tabs[index].label, isSelected: requestsProvider.currentListIndex == index,
loading: requestsProvider.isDetailLoading && requestsProvider.currentListIndex == index, count: requestsProvider.getStatusCount(tabs[index].requestType),
isSelected: requestsProvider.currentListIndex == index, onPressed: () async {
count: requestsProvider.getStatusCount(tabs[index].requestType), setState(() {
onPressed: () async { isAscending = false;
setState(() { });
isAscending = false; requestsProvider.currentListIndex = index;
}); requestsProvider.resetRequestDataList();
requestsProvider.currentListIndex = index; requestsProvider.getRequestDetail(
requestsProvider.resetRequestDataList(); usersType: userType ?? UsersTypes.normal_user,
requestsProvider.getRequestDetail( showLoader: true,
usersType: userType ?? UsersTypes.normal_user, status: tabs[index].tag,
showLoader: true, tabId: tabs[index].id,
status: tabs[index].tag, isHighPriority: tabs[index].isHighPriority,
tabId: tabs[index].id, isOverdue: tabs[index].isOverDue,
isHighPriority: tabs[index].isHighPriority, );
isOverdue: tabs[index].isOverDue, },
); icon: tabs[index].icon,
}, iconColor: tabs[index].iconColor,
icon: tabs[index].icon,
iconColor: tabs[index].iconColor,
),
), ),
), ),
); );

Loading…
Cancel
Save