pagination added

design_3.0_latest
Muhammad Abbasi 1 year ago
parent ad1a01b7c6
commit 246bb1fb55

@ -1,4 +1,5 @@
import 'dart:convert';
import 'dart:developer';
import 'package:flutter/widgets.dart';
import 'package:http/http.dart';
@ -18,9 +19,18 @@ class AllRequestsProvider extends ChangeNotifier {
bool isHighPriorityLoading = false;
bool isCalendarLoading = false;
bool _isFilterRequestLoading = false;
bool _isRequestCategoryLoading = false;
int _status =0;
int get status => _status;
set status(int value) {
_status = value;
notifyListeners();
}
int _currentListIndex = 0;
int get currentListIndex => _currentListIndex;
@ -37,6 +47,23 @@ class AllRequestsProvider extends ChangeNotifier {
AllRequestsAndCount _inProgressRequests;
AllRequestsAndCount _completedRequests;
AllRequestsAndCount _filterRequest;
AllRequestsAndCount _requestDetailList;
AllRequestsAndCount get requestDetailList => _requestDetailList;
set requestDetailList(AllRequestsAndCount value) {
_requestDetailList = value;
notifyListeners();
}
AllRequestsAndCount _selectedRequestCategory;
bool get isRequestCategoryLoading => _isRequestCategoryLoading;
set isRequestCategoryLoading(bool value) {
_isRequestCategoryLoading = value;
notifyListeners();
} // overdue,high priority, new , completed
AllRequestsAndCount overdueRequests;
AllRequestsAndCount highPriorityRequests;
@ -73,13 +100,13 @@ class AllRequestsProvider extends ChangeNotifier {
stateCode = null;
}
Future<void> getRequests() async {
Future<void> getRequests() {
resetRequestsApiData();
await getHighPriorityRequests(pagination: true);
await getOverdueRequests(pagination: true);
await getOpenRequests(pagination: true);
await getInProgressRequests(pagination: true);
await getCompletedRequests(pagination: true);
getOpenRequests(pagination: true);
getInProgressRequests(pagination: true);
getCompletedRequests(pagination: true);
getHighPriorityRequests(pagination: true);
getOverdueRequests(pagination: true);
}
SearchAllRequestsModel searchedModel;
@ -184,7 +211,7 @@ class AllRequestsProvider extends ChangeNotifier {
if (highPriorityRequests == null || pagination) {
isHighPriorityLoading = true;
notifyListeners();
// notifyListeners();
}
Response response;
try {
@ -336,7 +363,7 @@ class AllRequestsProvider extends ChangeNotifier {
}
Future<int> getInProgressRequests({bool pagination = false, bool reset = false}) async {
print('get inprogress request called..');
if (isInProgressLoading == true) return -2;
if (reset) {
inProgressRequests = null;
@ -354,6 +381,7 @@ class AllRequestsProvider extends ChangeNotifier {
"priority": [],
"displayData": []
};
if (pagination) {
body["pageNumber"] = 0;
body["pageSize"] = 0;
@ -362,18 +390,14 @@ class AllRequestsProvider extends ChangeNotifier {
body["pageSize"] = pageItemNumber;
}
response = await ApiManager.instance.post(URLs.getAllRequestsAndCount, body: body);
print('response body of inprogress is ${response.body}');
stateCode = response.statusCode;
print('state code is $stateCode');
if (response.statusCode >= 200 && response.statusCode < 300) {
if (inProgressRequests == null) {
print('in in null check...');
inProgressRequests = AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]);
notifyListeners();
print('data in null check is ${inProgressRequests.requestsDetails.length}');
} else {
inProgressRequests.requestsDetails.addAll(AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]).requestsDetails);
print('data i have in provider is ${inProgressRequests.requestsDetails.length}');
notifyListeners();
}
if (inProgressRequests.requestsDetails.length >= pageItemNumber) {
@ -386,6 +410,7 @@ class AllRequestsProvider extends ChangeNotifier {
allRequestsAndCount = null;
}
isInProgressLoading = false;
print('value of inProgress loading in provider is $isInProgressLoading');
notifyListeners();
return response.statusCode;
} catch (error) {
@ -395,36 +420,30 @@ class AllRequestsProvider extends ChangeNotifier {
return -1;
}
}
Future<int> getFilterRequests({bool pagination = false, int status}) async {
Future<int> getFilterRequests({bool showLoader = true, int status}) async {
// if (filterRequest == null || pagination) {
// isFilterRequestLoading = true;
// notifyListeners();
// }
isFilterRequestLoading = true;
isFilterRequestLoading =showLoader;
Response response;
try {
Map<String, dynamic> body = {
"typeTransaction": [1, 2, 3, 4],
"statusTransaction": [status],
"priority": [],
"displayData": []
"displayData": [],
"pageNumber": pageNum,
"pageSize" : pageItemNumber,
};
if (pagination) {
body["pageNumber"] = 0;
body["pageSize"] = 0;
} else {
body["pageNumber"] = pageNum++;
body["pageSize"] = pageItemNumber;
}
response = await ApiManager.instance.post(URLs.getAllRequestsAndCount, body: body);
print('response body is ${response.body}');
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
if (filterRequest == null) {
filterRequest = AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]);
isFilterRequestLoading = false;
notifyListeners();
print('filter list data in provider is ${filterRequest.requestsDetails.length}');
} else {
filterRequest.requestsDetails.addAll(AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]).requestsDetails);
isFilterRequestLoading = false;
@ -449,6 +468,35 @@ class AllRequestsProvider extends ChangeNotifier {
return -1;
}
}
Future<int> getSelectedRequestCategory({RequestQueryModel requestQueryModel}) async {
isRequestCategoryLoading =requestQueryModel.showLoader;
Response response;
try {
response = await ApiManager.instance.post(URLs.getAllRequestsAndCount, body: requestQueryModel.toJson());
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
if (selectedRequestCategory == null) {
selectedRequestCategory = AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]);
isRequestCategoryLoading = false;
notifyListeners();
} else {
selectedRequestCategory.requestsDetails.addAll(AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]).requestsDetails);
isRequestCategoryLoading = false;
notifyListeners();
}
} else {
filterRequest = null;
}
isRequestCategoryLoading = false;
notifyListeners();
return response.statusCode;
} catch (error) {
isRequestCategoryLoading = false;
stateCode = -1;
notifyListeners();
return -1;
}
}
Future<int> getCompletedRequests({bool pagination = false, bool reset = false}) async {
if (isCompleteLoading == true) return -2;
@ -540,6 +588,13 @@ class AllRequestsProvider extends ChangeNotifier {
notifyListeners();
}
AllRequestsAndCount get selectedRequestCategory => _selectedRequestCategory;
set selectedRequestCategory(AllRequestsAndCount value) {
_selectedRequestCategory = value;
notifyListeners();
}
// Future<int> getCloseRequests() async {
// if (isCloseLoading == true) return -2;
// isCloseLoading = true;

@ -30,6 +30,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
// number of items call in each request
final pageItemNumber = 10;
//reset provider data
void reset() {
workOrders = [];

@ -42,10 +42,12 @@ class _DashboardViewState extends State<DashboardView> {
AllRequestsProvider allRequestsProvider;
NotificationsProvider notificationsProvider;
ScrollController _scrollController;
@override
void initState() {
super.initState();
handleScroll();
getInitialData();
}
@ -54,6 +56,7 @@ class _DashboardViewState extends State<DashboardView> {
userProvider = Provider.of<UserProvider>(context, listen: false);
settingProvider = Provider.of<SettingProvider>(context, listen: false);
allRequestsProvider = Provider.of<AllRequestsProvider>(context, listen: false);
notificationsProvider = Provider.of<NotificationsProvider>(context, listen: false);
user = userProvider.user;
await getAllRequests();
@ -74,20 +77,32 @@ class _DashboardViewState extends State<DashboardView> {
allRequestsProvider.currentListIndex = 0;
allRequestsProvider.filterRequest = null;
var tabs = RequestUtils.getTabs(userType: userProvider.user.type, context: context);
Future.wait([
allRequestsProvider.getRequests(),
allRequestsProvider.getFilterRequests(pagination: false, status: tabs[0]['status']),
]).whenComplete(() {
allRequestsProvider.status = tabs[0]['status'];
allRequestsProvider.getRequests();
allRequestsProvider.pageNum = 1;
allRequestsProvider.getFilterRequests(showLoader: true, status: tabs[0]['status']).whenComplete(() {
allRequestsProvider.requestDetailList = allRequestsProvider.filterRequest;
});
allRequestsProvider.isAllLoading = false;
});
notificationsProvider.getSystemNotifications(user: userProvider.user, resetProvider: true);
}
print('user provider user data is ${userProvider.user.type}');
await notificationsProvider.getSystemNotifications(user: userProvider.user, resetProvider: true);
void handleScroll() async{
_scrollController = ScrollController();
_scrollController.addListener(() async {
if (_scrollController?.position?.pixels ==
_scrollController?.position?.maxScrollExtent &&
!allRequestsProvider.isFilterRequestLoading) {
allRequestsProvider.pageNum = allRequestsProvider.pageNum + 1;
await allRequestsProvider.getFilterRequests(showLoader:false,status: allRequestsProvider.status);
}
});
}
@override
void dispose() {
_scrollController.dispose();
super.dispose();
}
@ -102,35 +117,27 @@ class _DashboardViewState extends State<DashboardView> {
)),
body: RefreshIndicator(
onRefresh: () async {
await getInitialData();
getInitialData();
return Future.delayed(const Duration(milliseconds: 250));
},
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Text(
context.translation.welcome,
style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
),
Text(
user == null ? "" : (user?.username ?? ""),
style: AppTextStyles.heading2.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, fontWeight: FontWeight.w600),
),
// 24.height,
ProgressFragment(),
35.height,
SizedBox(height: 105.toScreenHeight, child: const RequestsFragment()),
const RequestCategoryFragment()
],
).paddingOnly(start: 16, end: 16, top: 0, bottom: 8),
],
child: Scrollbar(
controller: _scrollController,
child: SingleChildScrollView(
// physics: AlwaysScrollableScrollPhysics(),
controller: _scrollController,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
14.height,
ProgressFragment(),
25.height,
SizedBox(
height: 110.toScreenHeight, child: const RequestsFragment()),
16.height,
const RequestCategoryFragment()
],
).paddingOnly(start: 16, end: 16, top: 0, bottom: 8),
),
),
),

@ -5,6 +5,7 @@ import 'package:test_sa/controllers/providers/api/notifications_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/views/pages/user/notifications/notifications_page.dart';
@ -14,20 +15,21 @@ import '../../models/user.dart';
class AppBarWidget extends StatelessWidget {
final VoidCallback onDrawerPress;
const AppBarWidget({Key key, this.onDrawerPress}) : super(key: key);
@override
Widget build(BuildContext context) {
return AppBar(
return AppBar(
automaticallyImplyLeading: false,
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
titleSpacing: 0,
title: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Consumer<UserProvider>(builder: (context, snapshot, _) {
return CircleAvatar(
title: Consumer<UserProvider>(builder: (context, snapshot, _) {
return Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
CircleAvatar(
radius: 24,
backgroundColor: context.isDark ? AppColor.neutral50 : AppColor.neutral40,
child: Padding(
@ -36,15 +38,27 @@ class AppBarWidget extends StatelessWidget {
child: snapshot.profileImage != null
? Image.file(snapshot.profileImage)
: (snapshot.user.profilePhotoName?.isNotEmpty ?? false)
? Image.network(snapshot.user.profilePhotoName)
: const Icon(Icons.person, size: 24, color: Colors.white),
? Image.network(snapshot.user.profilePhotoName)
: const Icon(Icons.person, size: 24, color: Colors.white),
),
),
);
}).onPress(onDrawerPress),
const Spacer(),
Consumer<SettingProvider>(
builder: (context, settingProvider,child) {
).onPress(onDrawerPress),
8.width,
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
snapshot.user == null ? "" : (snapshot.user?.username ?? ""),
style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, fontWeight: FontWeight.w600),
),
Text(
snapshot.user == null ? "" : snapshot.user?.type?.name?.toCamelCase ?? "",
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
),
],
),
const Spacer(),
Consumer<SettingProvider>(builder: (context, settingProvider, child) {
return Container(
padding: const EdgeInsets.fromLTRB(12, 6, 6, 6),
decoration: BoxDecoration(
@ -71,11 +85,11 @@ class AppBarWidget extends StatelessWidget {
underline: const SizedBox.shrink(),
onChanged: (newValue) {
if (settingProvider.assetGroup != newValue) {
settingProvider.setAssetGroup(newValue);
WidgetsBinding.instance.addPostFrameCallback((_) {
Provider.of<AllRequestsProvider>(context, listen: false).getRequests();
Provider.of<NotificationsProvider>(context, listen: false).getSystemNotifications(user: Provider.of<UserProvider>(context, listen: false).user, resetProvider: true);
});
settingProvider.setAssetGroup(newValue);
WidgetsBinding.instance.addPostFrameCallback((_) {
Provider.of<AllRequestsProvider>(context, listen: false).getRequests();
Provider.of<NotificationsProvider>(context, listen: false).getSystemNotifications(user: Provider.of<UserProvider>(context, listen: false).user, resetProvider: true);
});
}
},
items: Provider.of<UserProvider>(context, listen: false).user.assetGroups.map<DropdownMenuItem<AssetGroup>>((value) {
@ -89,32 +103,32 @@ class AppBarWidget extends StatelessWidget {
})?.toList(),
),
);
}
),
16.width,
Stack(
alignment: Alignment.topRight,
children: [
Icon(Icons.notifications, color: context.isDark ? AppColor.neutral30 : AppColor.neutral20, size: 30).paddingOnly(top: 6, end: 0),
// todo @sikander will add count for unread notifications
// Positioned(
// top: 0,
// right: 0,
// child: Container(
// padding: const EdgeInsets.all(4),
// decoration: const ShapeDecoration(
// color: Color(0xFFD02127),
// shape: CircleBorder(),
// ),
// child: Text("", style: AppTextStyles.bodyText),
// ),
// )
],
).onPress(() {
Navigator.of(context).pushNamed(NotificationsPage.id);
}),
],
).paddingOnly(start: 16, end: 16),
}),
16.width,
Stack(
alignment: Alignment.topRight,
children: [
Icon(Icons.notifications, color: context.isDark ? AppColor.neutral30 : AppColor.neutral20, size: 30).paddingOnly(top: 6, end: 0),
// todo @sikander will add count for unread notifications
// Positioned(
// top: 0,
// right: 0,
// child: Container(
// padding: const EdgeInsets.all(4),
// decoration: const ShapeDecoration(
// color: Color(0xFFD02127),
// shape: CircleBorder(),
// ),
// child: Text("", style: AppTextStyles.bodyText),
// ),
// )
],
).onPress(() {
Navigator.of(context).pushNamed(NotificationsPage.id);
}),
],
).paddingOnly(start: 16, end: 16);
}),
);
}
}

@ -12,7 +12,7 @@ extension WidgetExtensions on Widget {
Widget get center => Center(child: this);
BoxShadow get boxShadowR14 => BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 14, offset: const Offset(0, 0), spreadRadius: 0);
BoxShadow get boxShadowR14 => BoxShadow(color: Colors.black.withOpacity(0.03), blurRadius: 14, offset: const Offset(0, 0), spreadRadius: 0);
Widget circle(double value) => ClipRRect(borderRadius: BorderRadius.circular(value), child: this);
@ -56,7 +56,7 @@ extension WidgetExtensions on Widget {
width: double.infinity,
decoration: ShapeDecoration(
color: AppColor.background(context),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(14)),
shadows: [boxShadowR14],
),
child: this,

@ -1,3 +1,5 @@
import 'dart:convert';
class AllRequestsAndCount {
CountServiceRequest countServiceRequest;
CountServiceRequest countGasRefill;
@ -187,3 +189,56 @@ class RequestsDetails {
return data;
}
}
class RequestQueryModel {
List<int> typeTransaction;
List<int> statusTransaction;
List<int> priority;
List<int> displayData;
int pageNumber;
int pageSize;
bool showLoader;
RequestQueryModel({
this.typeTransaction,
this.statusTransaction,
this.priority,
this.displayData,
this.pageNumber=1,
this.pageSize=10,
this.showLoader = true,
});
// Factory method to create an instance from a JSON map
factory RequestQueryModel.fromJson(Map<String, dynamic> json) {
return RequestQueryModel(
typeTransaction: List<int>.from(json['typeTransaction']),
statusTransaction: List<int>.from(json['statusTransaction']),
priority: List<int>.from(json['priority']),
displayData: List<int>.from(json['displayData']),
pageNumber: json['pageNumber'],
pageSize: json['pageSize'],
);
}
// Method to convert an instance to a JSON map
Map<String, dynamic> toJson() {
return {
'typeTransaction': typeTransaction,
'statusTransaction': statusTransaction,
'priority': priority,
'displayData': displayData,
'pageNumber': pageNumber,
'pageSize': pageSize,
};
}
// Method to encode the model to a JSON string
String encodeToJson() => json.encode(toJson());
// Method to decode the model from a JSON string
static RequestQueryModel decodeFromJson(String jsonString) =>
RequestQueryModel.fromJson(json.decode(jsonString));
}

@ -25,20 +25,23 @@ class AppColor {
static const Color neutral90 = Color(0xffF7F9FB);
static const Color neutral100 = Color(0xffF4F6FC);
//background
static const Color backgroundLight = Color(0xfff7f9fb);
static const Color backgroundDark = Color(0xff111427);
//white
static const Color white10 = Color(0xffFFFFFF);
static const Color white20 = Color(0xffF7F9FB);
static const Color white30 = Color(0xffE7EBF2);
static const Color white40 = Color(0xffE4EBEE);
//black
static const Color balck10 = Color(0xff3B3D4A);
//red
static const Color red30 = Color(0xffF63939);
static const Color red40 = Color(0xffFFDBDC);
static const Color red50 = Color(0xffD02127);
static const Color red60 = Color(0xff8C050A);
@ -49,9 +52,11 @@ class AppColor {
static const Color green70 = Color(0xff54C166);
//orange
static const Color orange30 = Color(0xffFDE19B);
static const Color orange40 = Color(0xffFFEDBC);
static const Color orange50 = Color(0xffCC9B14);
static const Color orange60 = Color(0xff886400);
static const Color orange70 = Color(0xffFFC945);
// static Color greenStatus(BuildContext context) => context.isDark ? const Color(0xff1FA269) : green50;
static Color greenStatus(BuildContext context) => context.isDark ? const Color(0xff54C166) : green50;
@ -59,10 +64,11 @@ class AppColor {
// static Color blueStatus(BuildContext context) => context.isDark ? primary40 : primary50;
static Color blueStatus(BuildContext context) => context.isDark ? primary40 : primary50;
static Color redStatus(BuildContext context) => context.isDark ? const Color(0xffFFB6B8) : red40;
static Color redStatus(BuildContext context) => context.isDark ? const Color(0xffFFB6B8) : red30;
// static Color yellowStatus(BuildContext context) => context.isDark ? const Color(0xffFFDA76) : orange40;
static Color yellowStatus(BuildContext context) => context.isDark ? const Color(0xffFFC945) : orange40;
static Color yellowStatus(BuildContext context) => context.isDark ? const Color(0xffFFC945) : orange30;
static Color yellowIcon(BuildContext context) => context.isDark ? const Color(0xffFFC945) : orange70;
static Color background(BuildContext context) => context.isDark ? neutral60 : Colors.white;
@ -77,7 +83,7 @@ class AppColor {
case "in progress":
return orange60;
case "high priority":
return red60;
return white10;
default:
return Colors.white;
}
@ -142,10 +148,12 @@ class AppColor {
static Color getPriorityStatusTextColor(BuildContext context, int id) {
switch (id) {
//low priority
case 81:
return Colors.white;
case 82:
return red60;
//high priority
return white10;
default:
return blueStatus(context);
}
@ -153,8 +161,10 @@ class AppColor {
static Color getPriorityStatusColor(BuildContext context, int id) {
switch (id) {
//low priority
case 81:
return greenStatus(context);
//high priority
case 82:
return redStatus(context);
default:

@ -0,0 +1,45 @@
import 'package:flutter/material.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
class CustomBadge extends StatelessWidget {
final Widget child; // The widget that the badge will be overlaid on.
final String value; // The value or text to be displayed in the badge.
final Color color; // The background color of the badge.
const CustomBadge({
Key key,
@required this.child,
@required this.value,
this.color =AppColor.red30, // Default color is red
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Stack(
clipBehavior: Clip.none, // Allows the badge to overflow its container.
children: [
child, // The main widget
Positioned(
right: -6,
top: -6,
child: Container(
padding: const EdgeInsets.all(6),
decoration: BoxDecoration(
color: color,
shape: BoxShape.circle, // Makes the badge circular
),
child: Text(
value,
style: const TextStyle(
color: AppColor.white10,
fontFamily: 'Poppins',
fontSize: 10,
fontWeight: FontWeight.w700,
),
),
),
),
],
);
}
}

@ -3,6 +3,7 @@ import 'package:badges/badges.dart' as badges;
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/custom_badge.dart';
class TabButton extends StatelessWidget {
final String label;
@ -25,15 +26,8 @@ class TabButton extends StatelessWidget {
return InkWell(
onTap: onPressed,
child: count != null && count > 0 && isSelected && !loading
? badges.Badge(
badgeContent: Text(
count.toString(),
style: const TextStyle(
color: AppColor.white20,
fontWeight: FontWeight.normal,
),
),
badgeStyle: const badges.BadgeStyle(padding: EdgeInsets.symmetric(horizontal: 5, vertical: 3), badgeColor: AppColor.red50),
? CustomBadge(
value: count.toString(),
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8),
decoration: BoxDecoration(
@ -48,8 +42,7 @@ class TabButton extends StatelessWidget {
color: isSelected ? Colors.white : Colors.black,
),
)),
).toShimmer(isShow: loading, radius: 7),
)
))
: Container(
padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8),
decoration: BoxDecoration(
@ -64,7 +57,7 @@ class TabButton extends StatelessWidget {
color: isSelected ? Colors.white : Colors.black,
),
)),
).toShimmer(isShow: loading, radius: 7),
),
);
}
}

@ -175,29 +175,24 @@ class ProgressFragment extends StatelessWidget {
bool isCurrentUserNotEngineer = (_userProvider.user.type != UsersTypes.engineer);
return Consumer<AllRequestsProvider>(
builder: (context, snapshot, _) {
// WidgetsBinding.instance.addPostFrameCallback((_) {
// if (_provider == null) {
// _provider = snapshot;
// if (isCurrentUserNotEngineer) {
// _provider.getOpenRequests(reset: true);
// }
// _provider.getInProgressRequests(reset:true);
// _provider.getCompletedRequests(reset:true);
// }
//
// });
int total = (snapshot.completedRequests?.total?.count ?? 0) + (snapshot.inProgressRequests?.total?.count ?? 0) + (isCurrentUserNotEngineer ? (snapshot.openRequests?.total?.count ?? 0) : 0);
final List<ChartData> chartData = [
ChartData('Completed', snapshot.completedRequests?.total?.count?.toDouble() ?? 0.0, AppColor.greenStatus(context)),
ChartData('Completed', snapshot.completedRequests?.total?.count?.toDouble() ?? 0.0, AppColor.green50),
// snapshot.openRequests?.total?.count!=0? ChartData('Open', snapshot.openRequests?.total?.count?.toDouble() ?? 0.0, AppColor.blueStatus(context)),
ChartData('In Progress', snapshot.inProgressRequests?.total?.count?.toDouble() ?? 0.0, AppColor.yellowStatus(context)),
ChartData('In Progress', snapshot.inProgressRequests?.total?.count?.toDouble() ?? 0.0, AppColor.orange70),
];
if (isCurrentUserNotEngineer) {
chartData.insert(1, ChartData('Open', snapshot.openRequests?.total?.count?.toDouble() ?? 0.0, AppColor.blueStatus(context)));
}
print('conditon value is ${
snapshot.isInProgressLoading
}');print('conditon value is ${
snapshot.isCompleteLoading
}');print('conditon value is ${
snapshot.isOpenLoading
}');
return Column(
children: [
@ -214,8 +209,8 @@ class ProgressFragment extends StatelessWidget {
textStyle: context.isDark ? null : const TextStyle(color: Colors.black87, fontSize: 12),
),
legend: Legend(
//isVisible: true,
),
//isVisible: true,
),
series: <CircularSeries>[
DoughnutSeries<ChartData, String>(
dataSource: chartData,
@ -232,7 +227,7 @@ class ProgressFragment extends StatelessWidget {
//useSeriesColor: true,
),
)
]).toShimmer(isShow: snapshot.isAllLoading, radius: 300).paddingAll(12).toShadowContainer(context),
]).toShimmer(isShow: snapshot.isInProgressLoading || snapshot.isCompleteLoading || snapshot.isOpenLoading, radius: 250).paddingAll(12).toShadowContainer(context),
Column(
mainAxisSize: MainAxisSize.min,
children: [
@ -263,4 +258,3 @@ class ChartData {
final double y;
final Color color;
}

@ -87,67 +87,33 @@ import 'package:test_sa/new_views/pages/land_page/dashboard_fragments/request_ca
import 'package:test_sa/utilities/request_utils.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
class RequestCategoryFragment extends StatefulWidget {
// final AllRequestsAndCount allRequestsAndCount;
// const RequestCategoryFragment({Key key, this.allRequestsAndCount}) : super(key: key);
class RequestCategoryFragment extends StatelessWidget {
const RequestCategoryFragment({
Key key,
}) : super(key: key);
@override
State<RequestCategoryFragment> createState() => _RequestCategoryFragmentState();
}
class _RequestCategoryFragmentState extends State<RequestCategoryFragment> {
@override
void initState() {
// TODO: implement initState
// getInitialList();
print('init state called...');
super.initState();
}
// Future<void> getInitialList() async {
// UserProvider userProvider = Provider.of<UserProvider>(context, listen: false);
//
// AllRequestsProvider allRequestsProvider = Provider.of<AllRequestsProvider>(context, listen: false);
// UsersTypes usersType = userProvider.user.type;
// var tabs = RequestUtils.getTabs(userType: usersType, context: context);
// allRequestsProvider.currentListIndex = 0;
// allRequestsProvider.filterRequest = null;
// await allRequestsProvider.getFilterRequests(pagination: false, status: tabs[0]['status']);
//
// print('tabs lenght is ${tabs.length}');
// }
@override
Widget build(BuildContext context) {
return Consumer<AllRequestsProvider>(builder: (context, allRequestProvider, child) {
return Column(mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[
context.translation.allRequests.heading4(context).paddingOnly(top: 16, bottom: 16),
context.translation.allRequests.heading4(context),
16.height,
getTabs(
requestsProvider: allRequestProvider,
context: context,
userType: Provider.of<UserProvider>(context, listen: false).user.type,
),
// Row(
// children: _buildTabButtons(isEngineer: Provider.of<UserProvider>(context, listen: false).user.type == UsersTypes.engineer, allRequestsProvider: allRequestProvider),
// ),
10.height,
allRequestProvider.isFilterRequestLoading||allRequestProvider.filterRequest==null?Column(
mainAxisSize: MainAxisSize.max,
children: List.generate( 3 , (index) {
return Padding(
padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight,horizontal: 0),
child: const SizedBox().toRequestShimmer(context, allRequestProvider.isFilterRequestLoading),
);
})): RequestCategoryList(allRequestProvider.filterRequest.requestsDetails ?? [], allRequestProvider.isFilterRequestLoading),
// if (allRequestProvider.isLoadingList) ...[
// const Center(child: CircularProgressIndicator()),
// ] else ...[
// RequestCategoryList(allRequestProvider.dashBoardFilterList?.requestsDetails ?? [], allRequestProvider.dashBoardFilterListLoading),
// ]
16.height,
allRequestProvider.isFilterRequestLoading || allRequestProvider.filterRequest == null
? Column(
mainAxisSize: MainAxisSize.max,
children: List.generate(3, (index) {
return Padding(
padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight, horizontal: 0),
child: const SizedBox().toRequestShimmer(context, allRequestProvider.isFilterRequestLoading),
);
}))
: RequestCategoryList(allRequestProvider.filterRequest.requestsDetails ?? [], allRequestProvider.isFilterRequestLoading, allRequestProvider.filterRequest.total.count),
]);
});
}
@ -194,7 +160,9 @@ class _RequestCategoryFragmentState extends State<RequestCategoryFragment> {
count: requestsProvider.filterRequest != null ? requestsProvider.filterRequest.total.count : 0,
onPressed: () async {
requestsProvider.currentListIndex = selectedTab;
requestsProvider.filterRequest = null;
requestsProvider.filterRequest = null;
requestsProvider.pageNum = 1;
requestsProvider.status = status;
await requestsProvider.getFilterRequests(status: status);
requestsProvider.isInProgressLoading = false;
requestsProvider.pageNum = 1;

@ -1,6 +1,9 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/all_requests_provider.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/models/all_requests_and_count_model.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/pages/land_page/requests/asset_item_view.dart';
import 'package:test_sa/new_views/pages/land_page/requests/gas_refill_item_view.dart';
import 'package:test_sa/new_views/pages/land_page/requests/ppm_item_view.dart';
@ -8,25 +11,33 @@ import 'package:test_sa/new_views/pages/land_page/requests/service_request_item_
class RequestCategoryList extends StatelessWidget {
final List<RequestsDetails> list;
final int totalCount;
final bool isLoading;
const RequestCategoryList(this.list, this.isLoading, {Key key})
: super(key: key);
const RequestCategoryList(this.list, this.isLoading, this.totalCount, {Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: List.generate(isLoading ? 6 : list.length, (index) {
// if (isLoading) {
// return const SizedBox().toRequestShimmer(context, isLoading);
// }
// else {
return Padding(
padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight),
child: _buildRequestItem(list[index]));
// }
}));
return ListView.builder(
itemCount: list.length < totalCount ? list.length + 1 : list.length,
shrinkWrap: true,
physics:const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) {
if (index == list.length) {
return ListTile(
title: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: const <Widget>[
CircularProgressIndicator(
color: AppColor.primary10,
strokeWidth: 1,
),
],
),
);
}
return Padding(padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight), child: _buildRequestItem(list[index]));
},
);
}
Widget _buildRequestItem(RequestsDetails request) {
@ -52,3 +63,16 @@ class RequestCategoryList extends StatelessWidget {
}
}
}
// return Column(
// mainAxisSize: MainAxisSize.min,
// children: List.generate(isLoading ? 6 : list.length, (index) {
// // if (isLoading) {
// // return const SizedBox().toRequestShimmer(context, isLoading);
// // }
// // else {
// return Padding(
// padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight),
// child: _buildRequestItem(list[index]));
// // }
// }));

@ -1,121 +1,15 @@
//older code....
// import 'package:flutter/material.dart';
// import 'package:provider/provider.dart';
// import 'package:test_sa/controllers/api_routes/api_manager.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/user_provider.dart';
// import 'package:test_sa/extensions/context_extension.dart';
// import 'package:test_sa/extensions/int_extensions.dart';
// import 'package:test_sa/extensions/text_extensions.dart';
// import 'package:test_sa/extensions/widget_extensions.dart';
// import 'package:test_sa/models/enums/user_types.dart';
// import 'package:test_sa/new_views/app_style/app_color.dart';
// import 'package:test_sa/new_views/common_widgets/app_floating_action_button.dart';
// import 'package:test_sa/new_views/pages/land_page/requests_list_page.dart';
//
// class RequestsFragment extends StatelessWidget {
// const RequestsFragment({Key key}) : super(key: key);
//
// @override
// Widget build(BuildContext context) {
// return Scaffold(
// // todo check here, nurse can add request not engineer
// floatingActionButton: const AppFloatingActionButton(),
// body: Consumer<AllRequestsProvider>(
// builder: (context, snapshot, _) => RefreshIndicator(
// onRefresh: () {
// snapshot.getRequests();
// Provider.of<NotificationsProvider>(context, listen: false).getSystemNotifications(user: Provider.of<UserProvider>(context, listen: false).user, resetProvider: true);
// return Future.delayed(const Duration(microseconds: 250));
// },
// child: GridView(
// padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16),
// gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, childAspectRatio: 191 / 237, crossAxisSpacing: 16, mainAxisSpacing: 16),
// children: [
// listItem(
// snapshot.highPriorityRequests?.total?.count,
// "high_priority",
// context.translation.highPriority,
// context,
// snapshot.isHighPriorityLoading,
// 0,
// context.isDark ? AppColor.redStatus(context) : AppColor.red50,
// ),
// listItem(snapshot.overdueRequests?.total?.count, "overdue", context.translation.overdue, context, snapshot.isOverdueLoading, 1, AppColor.yellowStatus(context)),
// listItem(snapshot.openRequests?.total?.count, "new_request", ApiManager.instance.user.type == UsersTypes.engineer ? context.translation.inProgress : context.translation.newR, context,
// snapshot.isOpenLoading, 2, AppColor.primary40),
// listItem(snapshot.completedRequests?.total?.count, "complete_request", context.translation.completed, context, snapshot.isCompleteLoading, 3, AppColor.greenStatus(context)),
// ],
// ),
// ),
// ),
// );
// }
//
// Widget listItem(int value, String icon, String title, BuildContext context, bool isLoading, int index, Color iconColor) {
// return Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// Row(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// Text(
// value?.toString() ?? "-",
// style: AppTextStyles.heading1.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, height: 1),
// ).toShimmer(isShow: isLoading).expanded,
// 8.width,
// (icon ?? "").toSvgAsset(height: 48, width: 48, color: iconColor)?.toShimmer(isShow: isLoading),
// ],
// ).expanded,
// Text(
// "$title\n${context.translation.requests}",
// style: AppTextStyles.heading5.copyWith(
// color: context.isDark ? AppColor.neutral30 : AppColor.neutral50,
// ),
// ).toShimmer(isShow: isLoading),
// 8.height,
// Row(
// mainAxisSize: MainAxisSize.min,
// children: [
// Text(
// context.translation.viewDetails,
// style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.primary40 : AppColor.primary50),
// ),
// 4.width,
// Icon(
// Icons.arrow_forward,
// color: context.isDark ? AppColor.primary40 : AppColor.primary50,
// size: 14,
// )
// ],
// ).toShimmer(isShow: isLoading),
// ],
// ).toShadowContainer(context).onPress(isLoading
// ? null
// : () async {
// await Navigator.push(context, MaterialPageRoute(builder: (context) => RequestsListPage(index)));
// Provider.of<AllRequestsProvider>(context, listen: false).getRequests();
// });
// }
// }
// older code....
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/api_routes/api_manager.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/user_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:badges/badges.dart' as badges;
import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_floating_action_button.dart';
import 'package:test_sa/new_views/common_widgets/custom_badge.dart';
import 'package:test_sa/new_views/pages/land_page/requests_list_page.dart';
class RequestsFragment extends StatelessWidget {
@ -124,123 +18,68 @@ class RequestsFragment extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Consumer<AllRequestsProvider>(
builder: (context, snapshot, _) => RefreshIndicator(
onRefresh: () async {
snapshot.getRequests();
await Provider.of<NotificationsProvider>(context, listen: false)
.getSystemNotifications(
user: Provider.of<UserProvider>(context, listen: false).user,
resetProvider: true,
);
return Future.delayed(const Duration(milliseconds: 250));
},
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: _buildListItems(context, snapshot),
),
builder: (context, snapshot, _) => GridView(
// padding: const EdgeInsets.only( bottom: 16),
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4, childAspectRatio: 75 / 84, crossAxisSpacing: 2, mainAxisSpacing: 13),
children: [
listItem(
snapshot.highPriorityRequests?.total?.count,
"high_priority",
context.translation.highPriority,
context,
snapshot.isHighPriorityLoading,
0,
context.isDark ? AppColor.redStatus(context) : AppColor.red50,
),
listItem(snapshot.overdueRequests?.total?.count, "overdue", context.translation.overdue, context, snapshot.isOverdueLoading, 1, AppColor.yellowIcon(context)),
listItem(snapshot.openRequests?.total?.count, "new_request", ApiManager.instance.user.type == UsersTypes.engineer ? context.translation.inProgress : context.translation.newR, context,
snapshot.isOpenLoading, 2, AppColor.primary40),
listItem(snapshot.completedRequests?.total?.count, "complete_request", context.translation.completed, context, snapshot.isCompleteLoading, 3, AppColor.greenStatus(context)),
],
),
);
}
List<Widget> _buildListItems(BuildContext context, AllRequestsProvider snapshot) {
final Map<String, dynamic> requestItems = {
'high_priority': {
'count': snapshot.highPriorityRequests?.total?.count,
'translation': context.translation.highPriority,
'isLoading': snapshot.isAllLoading,
'color': context.isDark ? AppColor.redStatus(context) : AppColor.red50,
},
'overdue': {
'count': snapshot.overdueRequests?.total?.count,
'translation': context.translation.overdue,
'isLoading': snapshot.isAllLoading,
'color': AppColor.yellowStatus(context),
},
'new_request': {
'count': snapshot.openRequests?.total?.count,
'translation': ApiManager.instance.user.type == UsersTypes.engineer
? context.translation.inProgress
: context.translation.newR,
'isLoading': snapshot.isAllLoading,
'color': AppColor.primary40,
},
'complete_request': {
'count': snapshot.completedRequests?.total?.count,
'translation': context.translation.completed,
'isLoading': snapshot.isAllLoading,
'color': AppColor.greenStatus(context),
},
};
return requestItems.entries.map((entry) {
final key = entry.key;
final value = entry.value;
return listItem(
value['count'],
key,
value['translation'],
context,
value['isLoading'],
requestItems.keys.toList().indexOf(key),
value['color'],
);
}).toList();
}
Widget listItem(
int value,
String icon,
String title,
BuildContext context,
bool isLoading,
int index,
Color iconColor,
) {
int value,
String icon,
String title,
BuildContext context,
bool isLoading,
int index,
Color iconColor,
) {
return GestureDetector(
onTap: isLoading
? null
: () async {
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => RequestsListPage(index),
),
);
Provider.of<AllRequestsProvider>(context, listen: false)
.getRequests();
},
: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => RequestsListPage(index,title),
),
);
},
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
value != null && value > 0&&!isLoading
? badges.Badge(
badgeContent: Text(
value.toString(),
style: const TextStyle(
color: AppColor.white20,
fontWeight: FontWeight.normal,
),
),
badgeStyle: const badges.BadgeStyle(
padding: EdgeInsets.all(4),
badgeColor: AppColor.red50
),
child: Container(
child: (icon ?? "")
.toSvgAsset(height: 26, width: 26, color: iconColor)
?.toShimmer(isShow: isLoading),
).toShadowCircleContainer(context,padding: 18),
)
value != null && value > 0 && !isLoading
? CustomBadge(
value: value.toString(),
child: Container(
child: (icon ?? "").toSvgAsset(height: 26, width: 26, color: iconColor)?.toShimmer(isShow: isLoading),
).toShadowCircleContainer(context, padding: 18),
)
: Container(
child: (icon ?? "")
.toSvgAsset(height: 26, width: 26, color: iconColor)
?.toShimmer(isShow: isLoading),
).toShadowCircleContainer(context,padding: 18),
child: (icon ?? "").toSvgAsset(height: 26, width: 26, color: iconColor)?.toShimmer(isShow: isLoading),
).toShadowCircleContainer(context, padding: 18),
10.height,
Text(
title,
style: AppTextStyles.bodyText.copyWith(
style: AppTextStyles.tinyFont.copyWith(
color: context.isDark ? AppColor.neutral30 : AppColor.neutral50,
),
),
@ -250,6 +89,145 @@ class RequestsFragment extends StatelessWidget {
}
}
//
// import 'package:flutter/material.dart';
// import 'package:provider/provider.dart';
// import 'package:test_sa/controllers/api_routes/api_manager.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/user_provider.dart';
// import 'package:test_sa/extensions/context_extension.dart';
// import 'package:test_sa/extensions/int_extensions.dart';
// import 'package:test_sa/extensions/text_extensions.dart';
// import 'package:test_sa/extensions/widget_extensions.dart';
// import 'package:badges/badges.dart' as badges;
// import 'package:test_sa/models/enums/user_types.dart';
// import 'package:test_sa/new_views/app_style/app_color.dart';
// import 'package:test_sa/new_views/common_widgets/app_floating_action_button.dart';
// import 'package:test_sa/new_views/pages/land_page/requests_list_page.dart';
//
// class RequestsFragment extends StatelessWidget {
// const RequestsFragment({Key key}) : super(key: key);
//
// @override
// Widget build(BuildContext context) {
// return Consumer<AllRequestsProvider>(
// builder: (context, snapshot, _) => RefreshIndicator(
// onRefresh: () async {
// snapshot.getRequests();
// await Provider.of<NotificationsProvider>(context, listen: false).getSystemNotifications(
// user: Provider.of<UserProvider>(context, listen: false).user,
// resetProvider: true,
// );
// return Future.delayed(const Duration(milliseconds: 250));
// },
// child: Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
// children: _buildListItems(context, snapshot),
// ),
// ),
// );
// }
//
// List<Widget> _buildListItems(BuildContext context, AllRequestsProvider snapshot) {
// final Map<String, dynamic> requestItems = {
// 'high_priority': {
// 'count': snapshot.highPriorityRequests?.total?.count,
// 'translation': context.translation.highPriority,
// 'isLoading': snapshot.isAllLoading,
// 'color': context.isDark ? AppColor.redStatus(context) : AppColor.red50,
// },
// 'overdue': {
// 'count': snapshot.overdueRequests?.total?.count,
// 'translation': context.translation.overdue,
// 'isLoading': snapshot.isAllLoading,
// 'color': AppColor.yellowStatus(context),
// },
// 'new_request': {
// 'count': snapshot.openRequests?.total?.count,
// 'translation': ApiManager.instance.user.type == UsersTypes.engineer ? context.translation.inProgress : context.translation.newR,
// 'isLoading': snapshot.isAllLoading,
// 'color': AppColor.primary40,
// },
// 'complete_request': {
// 'count': snapshot.completedRequests?.total?.count,
// 'translation': context.translation.completed,
// 'isLoading': snapshot.isAllLoading,
// 'color': AppColor.greenStatus(context),
// },
// };
//
// return requestItems.entries.map((entry) {
// final key = entry.key;
// final value = entry.value;
//
// return listItem(
// value['count'],
// key,
// value['translation'],
// context,
// value['isLoading'],
// requestItems.keys.toList().indexOf(key),
// value['color'],
// );
// }).toList();
// }
//
// Widget listItem(
// int value,
// String icon,
// String title,
// BuildContext context,
// bool isLoading,
// int index,
// Color iconColor,
// ) {
// return GestureDetector(
// onTap: isLoading
// ? null
// : () {
// Navigator.push(
// context,
// MaterialPageRoute(
// builder: (context) => RequestsListPage(index),
// ),
// );
// // Provider.of<AllRequestsProvider>(context, listen: false).isAllLoading = true;
// // Provider.of<AllRequestsProvider>(context, listen: false)
// // .getRequests();
// },
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// value != null && value > 0 && !isLoading
// ? badges.Badge(
// badgeContent: Text(
// value.toString(),
// style: const TextStyle(
// color: AppColor.white20,
// fontWeight: FontWeight.normal,
// ),
// ),
// badgeStyle: const badges.BadgeStyle(padding: EdgeInsets.all(4), badgeColor: AppColor.red30),
// child: Container(
// child: (icon ?? "").toSvgAsset(height: 26, width: 26, color: iconColor)?.toShimmer(isShow: isLoading),
// ).toShadowCircleContainer(context, padding: 18),
// )
// : Container(
// child: (icon ?? "").toSvgAsset(height: 26, width: 26, color: iconColor)?.toShimmer(isShow: isLoading),
// ).toShadowCircleContainer(context, padding: 18),
// 10.height,
// Text(
// title,
// style: AppTextStyles.bodyText.copyWith(
// color: context.isDark ? AppColor.neutral30 : AppColor.neutral50,
// ),
// ),
// ],
// ),
// );
// }
// }
// import 'package:flutter/material.dart';
// import 'package:provider/provider.dart';
@ -500,3 +478,48 @@ class RequestsFragment extends StatelessWidget {
// // });
// // }
// }
// Widget listItem(int value, String icon, String title, BuildContext context, bool isLoading, int index, Color iconColor) {
// return Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// Row(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// Text(
// value?.toString() ?? "-",
// style: AppTextStyles.bodyText2.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, height: 1),
// ).toShimmer(isShow: isLoading).expanded,
// 8.width,
// (icon ?? "").toSvgAsset(height: 48, width: 48, color: iconColor)?.toShimmer(isShow: isLoading),
// ],
// ).expanded,
// Text(
// "$title\n${context.translation.requests}",
// style: AppTextStyles.bodyText2.copyWith(
// color: context.isDark ? AppColor.neutral30 : AppColor.neutral50,
// ),
// ).toShimmer(isShow: isLoading),
// // 8.height,
// // Row(
// // mainAxisSize: MainAxisSize.min,
// // children: [
// // Text(
// // context.translation.viewDetails,
// // style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.primary40 : AppColor.primary50),
// // ),
// // 4.width,
// // Icon(
// // Icons.arrow_forward,
// // color: context.isDark ? AppColor.primary40 : AppColor.primary50,
// // size: 14,
// // )
// // ],
// // ).toShimmer(isShow: isLoading),
// ],
// ).toShadowContainer(context, padding: 0).onPress(isLoading
// ? null
// : () async {
// await Navigator.push(context, MaterialPageRoute(builder: (context) => RequestsListPage(index)));
// Provider.of<AllRequestsProvider>(context, listen: false).getRequests();
// });
// }

@ -14,7 +14,6 @@ import 'package:test_sa/new_views/pages/land_page/my_request/all_requests_search
import 'package:test_sa/new_views/pages/land_page/widgets/request_item_view_list.dart';
import 'package:test_sa/views/widgets/loaders/lazy_loading.dart';
class MyRequestsPage extends StatefulWidget {
const MyRequestsPage({Key key}) : super(key: key);
@ -31,7 +30,6 @@ class _MyRequestsPageState extends State<MyRequestsPage> {
@override
Widget build(BuildContext context) {
if (_provider == null) {
requestsList = [
context.translation.allRequests,
@ -143,7 +141,7 @@ class _MyRequestsPageState extends State<MyRequestsPage> {
child: RequestItemViewList(snapshot.allRequestsAndCount?.requestsDetails ?? [], snapshot.isAllLoading),
nextPage: snapshot.nextPage,
onLazyLoad: () {
snapshot.getAllRequests(context, typeTransaction: selectedRequest == 0 ? null : selectedRequest,search: _search);
snapshot.getAllRequests(context, typeTransaction: selectedRequest == 0 ? null : selectedRequest, search: _search);
},
).expanded,
],

@ -0,0 +1,80 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/all_requests_provider.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/models/all_requests_and_count_model.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/pages/land_page/requests/asset_item_view.dart';
import 'package:test_sa/new_views/pages/land_page/requests/gas_refill_item_view.dart';
import 'package:test_sa/new_views/pages/land_page/requests/ppm_item_view.dart';
import 'package:test_sa/new_views/pages/land_page/requests/service_request_item_view.dart';
class RequestPaginatedList extends StatelessWidget {
final List<RequestsDetails> list;
final int totalCount;
final bool isLoading;
ScrollController scrollController;
RequestPaginatedList(this.list, this.isLoading, this.totalCount,this.scrollController, {Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
print('count i got is $totalCount');
return ListView.builder(
itemCount: list.length < totalCount ? list.length + 1 : list.length,
controller: scrollController,
shrinkWrap: true,
itemBuilder: (context, index) {
if (index == list.length) {
return ListTile(
title: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: const <Widget>[
CircularProgressIndicator(
color: AppColor.primary10,
strokeWidth: 1,
),
],
),
);
}
return Padding(padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight), child: _buildRequestItem(list[index]));
},
);
}
Widget _buildRequestItem(RequestsDetails request) {
bool isServiceRequest = request.nameOfType == "ServiceRequest";
bool isGasRefill = request.nameOfType == "GasRefill";
bool isAssetTransfer = request.nameOfType == "AssetTransfer";
bool isPPMs = request.nameOfType == "PPMs";
if (isServiceRequest) {
return ServiceRequestItemView(request);
} else if (isGasRefill) {
return GasRefillItemView(request);
} else if (isPPMs) {
return PpmItemView(request);
} else if (isAssetTransfer) {
return AssetItemView(request);
} else {
return Container(
height: 100,
width: double.infinity,
color: Colors.grey,
);
}
}
}
// return Column(
// mainAxisSize: MainAxisSize.min,
// children: List.generate(isLoading ? 6 : list.length, (index) {
// // if (isLoading) {
// // return const SizedBox().toRequestShimmer(context, isLoading);
// // }
// // else {
// return Padding(
// padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight),
// child: _buildRequestItem(list[index]));
// // }
// }));

@ -7,9 +7,7 @@ import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/all_requests_and_count_model.dart';
import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/service_request_latest/views/components/history_log_view.dart';
import 'package:test_sa/service_request_latest/views/request_detail_view.dart';
import 'package:test_sa/views/pages/user/requests/service_request_details.dart';
import '../../../../views/widgets/requests/request_status.dart';
import '../../../app_style/app_color.dart';
@ -18,10 +16,11 @@ class ServiceRequestItemView extends StatelessWidget {
final RequestsDetails request;
final bool showShadow;
ServiceRequestItemView(this.request, {Key key, this.showShadow = true}) : super(key: key);
const ServiceRequestItemView(this.request, {Key key, this.showShadow = true}) : super(key: key);
@override
Widget build(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
@ -52,7 +51,8 @@ class ServiceRequestItemView extends StatelessWidget {
'${context.translation.requestNo}: ${request.requestNo}'.bodyText(context),
8.height,
Row(
mainAxisSize: MainAxisSize.min,
// mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
context.translation.viewDetails,
@ -74,6 +74,8 @@ class ServiceRequestItemView extends StatelessWidget {
builder: (_) => ServiceRequestDetailView(
serviceRequest: ServiceRequest(id: request.id.toString()),
)));
// Navigator.of(context).push(MaterialPageRoute(
// builder: (_) => const HistoryLogView()));
});
}
}

@ -2,82 +2,171 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/api_routes/api_manager.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/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/all_requests_and_count_model.dart';
import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/new_views/pages/land_page/dashboard_fragments/request_category_list.dart';
import 'package:test_sa/new_views/pages/land_page/requests/request_paginated_listview.dart';
import 'package:test_sa/new_views/pages/land_page/widgets/request_item_view_list.dart';
import 'package:test_sa/views/widgets/loaders/lazy_loading.dart';
class RequestsListPage extends StatelessWidget {
class RequestsListPage extends StatefulWidget {
static const String routeName = "/requests-list-page";
final int index;
final String title;
RequestsListPage(this.index, {Key key}) : super(key: key);
const RequestsListPage(this.index, this.title, {Key key}) : super(key: key);
@override
State<RequestsListPage> createState() => _RequestsListPageState();
}
class _RequestsListPageState extends State<RequestsListPage> {
AllRequestsProvider _provider;
ScrollController _scrollController;
@override
Widget build(BuildContext context) {
bool isEngineer = ApiManager.instance.user.type == UsersTypes.engineer;
if (_provider == null) {
_provider = Provider.of<AllRequestsProvider>(context, listen: false);
_provider.resetRequestsApiData();
callRequestApis();
}
String title = index == 0
? context.translation.highPriority
: index == 1
? context.translation.overdue
: index == 2
? (isEngineer ? context.translation.inProgress : context.translation.newR)
: index == 3
? context.translation.completed
: "";
void initState() {
// TODO: implement initState
_provider = Provider.of<AllRequestsProvider>(context, listen: false);
_provider.pageNum = 1;
_provider.selectedRequestCategory = null;
_provider.isRequestCategoryLoading = true;
callRequestApis();
handleScroll();
super.initState();
}
@override
void dispose() {
// TODO: implement dispose
_scrollController.dispose();
super.dispose();
}
void handleScroll() async {
_scrollController = ScrollController();
int pageNo =1;
_scrollController.addListener(() async {
if (_scrollController?.position?.pixels == _scrollController?.position?.maxScrollExtent && !_provider.isRequestCategoryLoading) {
pageNo = pageNo + 1;
callRequestApis(showLoader: false,pageNo: pageNo);
}
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: DefaultAppBar(title: "$title ${context.translation.requests}"),
appBar: DefaultAppBar(title: "${widget.title} ${context.translation.requests}"),
body: Consumer<AllRequestsProvider>(builder: (context, snapshot, _) {
bool isLoading = index == 0
if (snapshot.isRequestCategoryLoading || snapshot.selectedRequestCategory == null) {
return ListView.builder(
itemCount: 6,
itemBuilder: (context, index) {
return Padding(
padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight, horizontal: 0),
child: const SizedBox().toRequestShimmer(context, snapshot.isRequestCategoryLoading),
);
},
);
} else {
snapshot.requestDetailList = snapshot.selectedRequestCategory;
return RequestPaginatedList(snapshot.selectedRequestCategory.requestsDetails ?? [], snapshot.isRequestCategoryLoading, snapshot.selectedRequestCategory.total.count, _scrollController);
}
bool isLoading = widget.index == 0
? snapshot.isHighPriorityLoading
: index == 1
: widget.index == 1
? snapshot.isOverdueLoading
: index == 2
: widget.index == 2
? snapshot.isOpenLoading
: index == 3
: widget.index == 3
? snapshot.isCompleteLoading
: false;
List<RequestsDetails> list = index == 0
List<RequestsDetails> list = widget.index == 0
? snapshot.highPriorityRequests?.requestsDetails ?? []
: index == 1
? snapshot.overdueRequests?.requestsDetails?? []
: index == 2
? snapshot.openRequests?.requestsDetails?? []
: index == 3
? snapshot.completedRequests?.requestsDetails?? []
: widget.index == 1
? snapshot.overdueRequests?.requestsDetails ?? []
: widget.index == 2
? snapshot.openRequests?.requestsDetails ?? []
: widget.index == 3
? snapshot.completedRequests?.requestsDetails ?? []
: [];
return LazyLoading(
child: RequestItemViewList(list, isLoading),
nextPage: snapshot.nextPage,
onLazyLoad: () {
callRequestApis();
},
);
RequestItemViewList(list, isLoading);
}));
}
void callRequestApis() {
if (index == 0) {
_provider.getHighPriorityRequests();
} else if (index == 1) {
_provider.getOverdueRequests();
} else if (index == 2) {
_provider.getOpenRequests();
} else {
_provider.getCompletedRequests();
Future<void> callRequestApis({
bool showLoader = true,
int pageNo = 1,
int pageSize = 10,
}) async {
UsersTypes usersTypes = Provider.of<UserProvider>(context, listen: false).user.type;
print('i am here at ${widget.index}');
if (widget.index == 0) {
await _provider.getSelectedRequestCategory(
requestQueryModel: RequestQueryModel(
typeTransaction: [1],
statusTransaction: [1, 2, 4],
priority: [1],
displayData: [],
pageNumber: pageNo,
pageSize: pageSize,
showLoader: showLoader,
));
return;
}
if (widget.index == 1) {
await _provider.getSelectedRequestCategory(
requestQueryModel: RequestQueryModel(
typeTransaction: [1, 2, 3, 4],
statusTransaction: [1, 2, 4],
displayData: [1],
pageNumber: pageNo,
pageSize: pageSize,
priority: [],
showLoader: showLoader,
));
return;
// _provider.overdueRequests = null;
// _provider.getOverdueRequests();
}
if (widget.index == 2) {
await _provider.getSelectedRequestCategory(
requestQueryModel: RequestQueryModel(
typeTransaction: [1, 2, 3, 4],
statusTransaction: [usersTypes == UsersTypes.engineer ? 2 : 1],
displayData: [],
pageNumber: pageNo,
pageSize: pageSize,
priority: [],
showLoader: showLoader,
));
return;
// _provider.openRequests = null;
// _provider.getOpenRequests();
}
if (widget.index == 3) {
await _provider.getSelectedRequestCategory(
requestQueryModel: RequestQueryModel(
typeTransaction: [1, 2, 3, 4],
statusTransaction: [4],
displayData: [],
pageNumber: pageNo,
pageSize: pageSize,
priority: [],
showLoader: showLoader,
));
return;
// _provider.completedRequests = null;
// _provider.getCompletedRequests();
}
}
}

@ -1,5 +1,7 @@
//request tab page
import 'package:flutter/material.dart';
import 'package:provider/provider.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/int_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
@ -29,7 +31,6 @@ class RequestItemViewList extends StatelessWidget {
bool isGasRefill = list[index].nameOfType == "GasRefill";
bool isAssetTransfer = list[index].nameOfType == "AssetTransfer";
bool isPPMs = list[index].nameOfType == "PPMs";
return isServiceRequest
? ServiceRequestItemView(list[index])
: isGasRefill

@ -6,55 +6,105 @@ import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart';
class HistoryLogView extends StatelessWidget {
const HistoryLogView({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
List<HistoryLogModel> dummyList = [
HistoryLogModel(message: 'Requester acknowledged adc dld a', date: DateTime.now(), status: null),
HistoryLogModel(message: 'Requester acknowledged adc dld a', date: DateTime.now(), status: null),
HistoryLogModel(message: 'Requester acknowledged adc dld a', date: DateTime.now(), status: 'Status update to In Progress'),
HistoryLogModel(message: 'Requester acknowledged adc dld a', date: DateTime.now(), status: null),
HistoryLogModel(message: 'Requester acknowledged adc dld a', date: DateTime.now(), status: 'Status updated to Closed'),
HistoryLogModel(message: 'Requester acknowledged adc dld a', date: DateTime.now(), status: null),
HistoryLogModel(message: 'Requester acknowledged adc dld a', date: DateTime.now(), status: null),
HistoryLogModel(message: 'Requester acknowledged adc dld a', date: DateTime.now(), status: null),
HistoryLogModel(message: 'Requester acknowledged adc dld a', date: DateTime.now(), status: null),
];
return Scaffold(
backgroundColor: AppColor.neutral100,
body: Padding(
padding: EdgeInsets.symmetric(vertical: 50.toScreenHeight),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
padding: EdgeInsets.only(top: 50.toScreenHeight, bottom: 20.toScreenHeight),
child: Stack(
children: [
historyLogCard(context: context,date: DateTime.now()),
historyLogCard(context: context,date: DateTime.now()),
historyLogCard(context: context,date: DateTime.now()),
historyLogCard(context: context,date: DateTime.now()),
Padding(
padding: EdgeInsets.only(left: 122.toScreenWidth),
child: const VerticalDivider(
color: AppColor.white40,
thickness: 2,
width: 20,
indent: 10,
endIndent: 10,
),
),
// Container(
// color: Colors.red,
// ),
ListView.builder(
itemCount: dummyList.length,
padding: EdgeInsets.all(16),
itemBuilder: (context, index) {
return historyLogCard(context: context, historyLogModel: dummyList[index]);
},
),
],
),
),
);
}
Widget historyLogCard({@required BuildContext context, @required DateTime date}) {
return SizedBox(
width: double.infinity,
child: Padding(
padding: EdgeInsets.only(left: 16.toScreenWidth, bottom: 16.toScreenHeight, top: 12.toScreenHeight),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
children: [
Text(
date.toString().toServiceRequestCardFormat,
textAlign: TextAlign.end,
style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral20),
Widget historyLogCard({@required BuildContext context, @required HistoryLogModel historyLogModel}) {
return Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
historyLogModel.status != null
? Padding(
padding: EdgeInsets.only(top: 16.toScreenHeight, bottom: 16.toScreenHeight, right: 89.toScreenWidth),
child: StatusLabel(
radius: 4,
label: historyLogModel.status,
textColor: AppColor.getRequestStatusTextColorByName(context, historyLogModel.status),
backgroundColor: AppColor.getRequestStatusColorByName(context, historyLogModel.status),
),
],
),
50.width,
Expanded(
child: 'Requester acknowledged adc dld a'.heading6(context),
),
],
),
),
).toShadowContainer(context).paddingOnly(start: 16, end: 16);
)
: 12.height,
Container(
width: double.infinity,
padding: EdgeInsets.only(left: 12.toScreenWidth, bottom: 16.toScreenHeight, top: 12.toScreenHeight),
child: Column(
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
historyLogModel.date.toString().toServiceRequestCardFormat,
textAlign: TextAlign.end,
style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral20),
),
50.width,
Expanded(
child: historyLogModel.message.heading6(context),
),
],
),
],
),
).toShadowContainer(context),
],
);
}
}
class HistoryLogModel {
String message;
DateTime date;
String status;
Color statusColor;
HistoryLogModel({@required this.message, @required this.date, this.status, this.statusColor});
}

@ -85,11 +85,13 @@ class _ServiceRequestDetailViewState extends State<ServiceRequestDetailView> {
StatusLabel(
label: serviceRequest.priority.name,
id: serviceRequest.priority.id,
radius: 4,
textColor: AppColor.getPriorityStatusTextColor(context, serviceRequest.priority.id),
backgroundColor: AppColor.getPriorityStatusColor(context, serviceRequest.priority.id),
),
8.width,
StatusLabel(
radius: 4,
label: serviceRequest.statusLabel,
textColor: AppColor.getRequestStatusTextColor(context, serviceRequest.statusValue),
backgroundColor: AppColor.getRequestStatusColor(context, serviceRequest.statusValue),
@ -286,13 +288,15 @@ class _ServiceRequestDetailViewState extends State<ServiceRequestDetailView> {
Center(
child: InkWell(
onTap: () async {
AllRequestsProvider allRequestProvider = Provider.of<AllRequestsProvider>(context, listen: false);
int index = allRequestProvider.filterRequest.requestsDetails.indexWhere((element) => element.id.toString() == serviceRequestsProvider.currentSelectedRequest.id);
print('index i got is $index');
if (index != -1 && index != allRequestProvider.filterRequest.requestsDetails.length) {
print('loading value is $loading');
getServiceRequest(requestId: allRequestProvider.filterRequest.requestsDetails[index + 1].id.toString());
print('call the api with next id ...${allRequestProvider.filterRequest.requestsDetails[index + 1].id.toString()}');
try{
//use a common list
AllRequestsProvider allRequestProvider = Provider.of<AllRequestsProvider>(context, listen: false);
int index = allRequestProvider.requestDetailList.requestsDetails.indexWhere((element) => element.id.toString() == serviceRequestsProvider.currentSelectedRequest.id);
if (index != -1 && index != allRequestProvider.requestDetailList.requestsDetails.length) {
getServiceRequest(requestId: allRequestProvider.requestDetailList.requestsDetails[index + 1].id.toString());
}
}catch(e){
print(e);
}
},
child: Text(
@ -316,7 +320,6 @@ class _ServiceRequestDetailViewState extends State<ServiceRequestDetailView> {
textColor: AppColor.red50,
showBorder: true,
onPressed: () async {
print('service request value is ${serviceRequestsProvider.currentSelectedRequest.type}');
ServiceRequestBottomSheet.rejectRequestBottomSheet(context: context);
// bool shouldReloadData = (await showModalBottomSheet(
// context: context,

@ -8,8 +8,9 @@ class StatusLabel extends StatelessWidget {
final Color backgroundColor;
final Color textColor;
final bool isPriority;
final double radius;
StatusLabel({Key key, this.id = 0, this.label, this.backgroundColor, this.textColor, this.isPriority = false}) : super(key: key);
StatusLabel({Key key, this.id = 0, this.label, this.backgroundColor, this.textColor, this.isPriority = false, this.radius = 4}) : super(key: key);
@override
Widget build(BuildContext context) {
@ -26,7 +27,7 @@ class StatusLabel extends StatelessWidget {
decoration: ShapeDecoration(
color: backgroundColor,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(50),
borderRadius: BorderRadius.circular(radius),
),
),
child: Text(label ?? "", style: AppTextStyles.overline.copyWith(color: textColor)),

Loading…
Cancel
Save