pagination added

design_3.0_latest
Muhammad Abbasi 2 years ago
parent ad1a01b7c6
commit 246bb1fb55

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

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

@ -42,10 +42,12 @@ class _DashboardViewState extends State<DashboardView> {
AllRequestsProvider allRequestsProvider; AllRequestsProvider allRequestsProvider;
NotificationsProvider notificationsProvider; NotificationsProvider notificationsProvider;
ScrollController _scrollController;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
handleScroll();
getInitialData(); getInitialData();
} }
@ -54,6 +56,7 @@ class _DashboardViewState extends State<DashboardView> {
userProvider = Provider.of<UserProvider>(context, listen: false); userProvider = Provider.of<UserProvider>(context, listen: false);
settingProvider = Provider.of<SettingProvider>(context, listen: false); settingProvider = Provider.of<SettingProvider>(context, listen: false);
allRequestsProvider = Provider.of<AllRequestsProvider>(context, listen: false); allRequestsProvider = Provider.of<AllRequestsProvider>(context, listen: false);
notificationsProvider = Provider.of<NotificationsProvider>(context, listen: false);
user = userProvider.user; user = userProvider.user;
await getAllRequests(); await getAllRequests();
@ -74,20 +77,32 @@ class _DashboardViewState extends State<DashboardView> {
allRequestsProvider.currentListIndex = 0; allRequestsProvider.currentListIndex = 0;
allRequestsProvider.filterRequest = null; allRequestsProvider.filterRequest = null;
var tabs = RequestUtils.getTabs(userType: userProvider.user.type, context: context); var tabs = RequestUtils.getTabs(userType: userProvider.user.type, context: context);
Future.wait([ allRequestsProvider.status = tabs[0]['status'];
allRequestsProvider.getRequests(), allRequestsProvider.getRequests();
allRequestsProvider.getFilterRequests(pagination: false, status: tabs[0]['status']), allRequestsProvider.pageNum = 1;
]).whenComplete(() { allRequestsProvider.getFilterRequests(showLoader: true, status: tabs[0]['status']).whenComplete(() {
allRequestsProvider.requestDetailList = allRequestsProvider.filterRequest;
});
allRequestsProvider.isAllLoading = false; allRequestsProvider.isAllLoading = false;
}); notificationsProvider.getSystemNotifications(user: userProvider.user, resetProvider: true);
}
print('user provider user data is ${userProvider.user.type}'); void handleScroll() async{
await notificationsProvider.getSystemNotifications(user: userProvider.user, resetProvider: true); _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 @override
void dispose() { void dispose() {
_scrollController.dispose();
super.dispose(); super.dispose();
} }
@ -102,35 +117,27 @@ class _DashboardViewState extends State<DashboardView> {
)), )),
body: RefreshIndicator( body: RefreshIndicator(
onRefresh: () async { onRefresh: () async {
await getInitialData(); getInitialData();
return Future.delayed(const Duration(milliseconds: 250)); return Future.delayed(const Duration(milliseconds: 250));
}, },
child: SingleChildScrollView( child: Scrollbar(
child: Column( controller: _scrollController,
crossAxisAlignment: CrossAxisAlignment.start, child: SingleChildScrollView(
mainAxisSize: MainAxisSize.min, // physics: AlwaysScrollableScrollPhysics(),
children: [ controller: _scrollController,
Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
Text( 14.height,
context.translation.welcome, ProgressFragment(),
style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), 25.height,
), SizedBox(
Text( height: 110.toScreenHeight, child: const RequestsFragment()),
user == null ? "" : (user?.username ?? ""), 16.height,
style: AppTextStyles.heading2.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, fontWeight: FontWeight.w600), const RequestCategoryFragment()
), ],
// 24.height, ).paddingOnly(start: 16, end: 16, top: 0, bottom: 8),
ProgressFragment(),
35.height,
SizedBox(height: 105.toScreenHeight, child: const RequestsFragment()),
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/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.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/extensions/widget_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/views/pages/user/notifications/notifications_page.dart'; import 'package:test_sa/views/pages/user/notifications/notifications_page.dart';
@ -14,20 +15,21 @@ import '../../models/user.dart';
class AppBarWidget extends StatelessWidget { class AppBarWidget extends StatelessWidget {
final VoidCallback onDrawerPress; final VoidCallback onDrawerPress;
const AppBarWidget({Key key, this.onDrawerPress}) : super(key: key); const AppBarWidget({Key key, this.onDrawerPress}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return AppBar( return AppBar(
automaticallyImplyLeading: false, automaticallyImplyLeading: false,
backgroundColor: Theme.of(context).scaffoldBackgroundColor, backgroundColor: Theme.of(context).scaffoldBackgroundColor,
titleSpacing: 0, titleSpacing: 0,
title: Row( title: Consumer<UserProvider>(builder: (context, snapshot, _) {
mainAxisAlignment: MainAxisAlignment.spaceBetween, return Row(
crossAxisAlignment: CrossAxisAlignment.center, // mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ crossAxisAlignment: CrossAxisAlignment.center,
Consumer<UserProvider>(builder: (context, snapshot, _) { children: [
return CircleAvatar( CircleAvatar(
radius: 24, radius: 24,
backgroundColor: context.isDark ? AppColor.neutral50 : AppColor.neutral40, backgroundColor: context.isDark ? AppColor.neutral50 : AppColor.neutral40,
child: Padding( child: Padding(
@ -36,15 +38,27 @@ class AppBarWidget extends StatelessWidget {
child: snapshot.profileImage != null child: snapshot.profileImage != null
? Image.file(snapshot.profileImage) ? Image.file(snapshot.profileImage)
: (snapshot.user.profilePhotoName?.isNotEmpty ?? false) : (snapshot.user.profilePhotoName?.isNotEmpty ?? false)
? Image.network(snapshot.user.profilePhotoName) ? Image.network(snapshot.user.profilePhotoName)
: const Icon(Icons.person, size: 24, color: Colors.white), : const Icon(Icons.person, size: 24, color: Colors.white),
), ),
), ),
); ).onPress(onDrawerPress),
}).onPress(onDrawerPress), 8.width,
const Spacer(), Column(
Consumer<SettingProvider>( crossAxisAlignment: CrossAxisAlignment.start,
builder: (context, settingProvider,child) { 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( return Container(
padding: const EdgeInsets.fromLTRB(12, 6, 6, 6), padding: const EdgeInsets.fromLTRB(12, 6, 6, 6),
decoration: BoxDecoration( decoration: BoxDecoration(
@ -71,11 +85,11 @@ class AppBarWidget extends StatelessWidget {
underline: const SizedBox.shrink(), underline: const SizedBox.shrink(),
onChanged: (newValue) { onChanged: (newValue) {
if (settingProvider.assetGroup != newValue) { if (settingProvider.assetGroup != newValue) {
settingProvider.setAssetGroup(newValue); settingProvider.setAssetGroup(newValue);
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
Provider.of<AllRequestsProvider>(context, listen: false).getRequests(); Provider.of<AllRequestsProvider>(context, listen: false).getRequests();
Provider.of<NotificationsProvider>(context, listen: false).getSystemNotifications(user: Provider.of<UserProvider>(context, listen: false).user, resetProvider: true); 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) { items: Provider.of<UserProvider>(context, listen: false).user.assetGroups.map<DropdownMenuItem<AssetGroup>>((value) {
@ -89,32 +103,32 @@ class AppBarWidget extends StatelessWidget {
})?.toList(), })?.toList(),
), ),
); );
} }),
), 16.width,
16.width, Stack(
Stack( alignment: Alignment.topRight,
alignment: Alignment.topRight, children: [
children: [ Icon(Icons.notifications, color: context.isDark ? AppColor.neutral30 : AppColor.neutral20, size: 30).paddingOnly(top: 6, end: 0),
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
// todo @sikander will add count for unread notifications // Positioned(
// Positioned( // top: 0,
// top: 0, // right: 0,
// right: 0, // child: Container(
// child: Container( // padding: const EdgeInsets.all(4),
// padding: const EdgeInsets.all(4), // decoration: const ShapeDecoration(
// decoration: const ShapeDecoration( // color: Color(0xFFD02127),
// color: Color(0xFFD02127), // shape: CircleBorder(),
// shape: CircleBorder(), // ),
// ), // child: Text("", style: AppTextStyles.bodyText),
// child: Text("", style: AppTextStyles.bodyText), // ),
// ), // )
// ) ],
], ).onPress(() {
).onPress(() { Navigator.of(context).pushNamed(NotificationsPage.id);
Navigator.of(context).pushNamed(NotificationsPage.id); }),
}), ],
], ).paddingOnly(start: 16, end: 16);
).paddingOnly(start: 16, end: 16), }),
); );
} }
} }

@ -12,7 +12,7 @@ extension WidgetExtensions on Widget {
Widget get center => Center(child: this); 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); Widget circle(double value) => ClipRRect(borderRadius: BorderRadius.circular(value), child: this);
@ -56,7 +56,7 @@ extension WidgetExtensions on Widget {
width: double.infinity, width: double.infinity,
decoration: ShapeDecoration( decoration: ShapeDecoration(
color: AppColor.background(context), color: AppColor.background(context),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(14)),
shadows: [boxShadowR14], shadows: [boxShadowR14],
), ),
child: this, child: this,

@ -1,3 +1,5 @@
import 'dart:convert';
class AllRequestsAndCount { class AllRequestsAndCount {
CountServiceRequest countServiceRequest; CountServiceRequest countServiceRequest;
CountServiceRequest countGasRefill; CountServiceRequest countGasRefill;
@ -187,3 +189,56 @@ class RequestsDetails {
return data; 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 neutral90 = Color(0xffF7F9FB);
static const Color neutral100 = Color(0xffF4F6FC); static const Color neutral100 = Color(0xffF4F6FC);
//background //background
static const Color backgroundLight = Color(0xfff7f9fb); static const Color backgroundLight = Color(0xfff7f9fb);
static const Color backgroundDark = Color(0xff111427); static const Color backgroundDark = Color(0xff111427);
//white //white
static const Color white10 = Color(0xffFFFFFF);
static const Color white20 = Color(0xffF7F9FB); static const Color white20 = Color(0xffF7F9FB);
static const Color white30 = Color(0xffE7EBF2); static const Color white30 = Color(0xffE7EBF2);
static const Color white40 = Color(0xffE4EBEE);
//black //black
static const Color balck10 = Color(0xff3B3D4A); static const Color balck10 = Color(0xff3B3D4A);
//red //red
static const Color red30 = Color(0xffF63939);
static const Color red40 = Color(0xffFFDBDC); static const Color red40 = Color(0xffFFDBDC);
static const Color red50 = Color(0xffD02127); static const Color red50 = Color(0xffD02127);
static const Color red60 = Color(0xff8C050A); static const Color red60 = Color(0xff8C050A);
@ -49,9 +52,11 @@ class AppColor {
static const Color green70 = Color(0xff54C166); static const Color green70 = Color(0xff54C166);
//orange //orange
static const Color orange30 = Color(0xffFDE19B);
static const Color orange40 = Color(0xffFFEDBC); static const Color orange40 = Color(0xffFFEDBC);
static const Color orange50 = Color(0xffCC9B14); static const Color orange50 = Color(0xffCC9B14);
static const Color orange60 = Color(0xff886400); 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(0xff1FA269) : green50;
static Color greenStatus(BuildContext context) => context.isDark ? const Color(0xff54C166) : 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 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(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; static Color background(BuildContext context) => context.isDark ? neutral60 : Colors.white;
@ -77,7 +83,7 @@ class AppColor {
case "in progress": case "in progress":
return orange60; return orange60;
case "high priority": case "high priority":
return red60; return white10;
default: default:
return Colors.white; return Colors.white;
} }
@ -142,10 +148,12 @@ class AppColor {
static Color getPriorityStatusTextColor(BuildContext context, int id) { static Color getPriorityStatusTextColor(BuildContext context, int id) {
switch (id) { switch (id) {
//low priority
case 81: case 81:
return Colors.white; return Colors.white;
case 82: case 82:
return red60; //high priority
return white10;
default: default:
return blueStatus(context); return blueStatus(context);
} }
@ -153,8 +161,10 @@ class AppColor {
static Color getPriorityStatusColor(BuildContext context, int id) { static Color getPriorityStatusColor(BuildContext context, int id) {
switch (id) { switch (id) {
//low priority
case 81: case 81:
return greenStatus(context); return greenStatus(context);
//high priority
case 82: case 82:
return redStatus(context); return redStatus(context);
default: 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/text_extensions.dart';
import 'package:test_sa/extensions/widget_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/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/custom_badge.dart';
class TabButton extends StatelessWidget { class TabButton extends StatelessWidget {
final String label; final String label;
@ -25,15 +26,8 @@ class TabButton extends StatelessWidget {
return InkWell( return InkWell(
onTap: onPressed, onTap: onPressed,
child: count != null && count > 0 && isSelected && !loading child: count != null && count > 0 && isSelected && !loading
? badges.Badge( ? CustomBadge(
badgeContent: Text( value: count.toString(),
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),
child: Container( child: Container(
padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8), padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8),
decoration: BoxDecoration( decoration: BoxDecoration(
@ -48,8 +42,7 @@ class TabButton extends StatelessWidget {
color: isSelected ? Colors.white : Colors.black, color: isSelected ? Colors.white : Colors.black,
), ),
)), )),
).toShimmer(isShow: loading, radius: 7), ))
)
: Container( : Container(
padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8), padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8),
decoration: BoxDecoration( decoration: BoxDecoration(
@ -64,7 +57,7 @@ class TabButton extends StatelessWidget {
color: isSelected ? Colors.white : Colors.black, 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); bool isCurrentUserNotEngineer = (_userProvider.user.type != UsersTypes.engineer);
return Consumer<AllRequestsProvider>( return Consumer<AllRequestsProvider>(
builder: (context, snapshot, _) { 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); int total = (snapshot.completedRequests?.total?.count ?? 0) + (snapshot.inProgressRequests?.total?.count ?? 0) + (isCurrentUserNotEngineer ? (snapshot.openRequests?.total?.count ?? 0) : 0);
final List<ChartData> chartData = [ 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)), // 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) { if (isCurrentUserNotEngineer) {
chartData.insert(1, ChartData('Open', snapshot.openRequests?.total?.count?.toDouble() ?? 0.0, AppColor.blueStatus(context))); 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( return Column(
children: [ children: [
@ -214,8 +209,8 @@ class ProgressFragment extends StatelessWidget {
textStyle: context.isDark ? null : const TextStyle(color: Colors.black87, fontSize: 12), textStyle: context.isDark ? null : const TextStyle(color: Colors.black87, fontSize: 12),
), ),
legend: Legend( legend: Legend(
//isVisible: true, //isVisible: true,
), ),
series: <CircularSeries>[ series: <CircularSeries>[
DoughnutSeries<ChartData, String>( DoughnutSeries<ChartData, String>(
dataSource: chartData, dataSource: chartData,
@ -232,7 +227,7 @@ class ProgressFragment extends StatelessWidget {
//useSeriesColor: true, //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( Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
@ -263,4 +258,3 @@ class ChartData {
final double y; final double y;
final Color color; 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/utilities/request_utils.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
class RequestCategoryFragment extends StatefulWidget { class RequestCategoryFragment extends StatelessWidget {
// final AllRequestsAndCount allRequestsAndCount;
// const RequestCategoryFragment({Key key, this.allRequestsAndCount}) : super(key: key);
const RequestCategoryFragment({ const RequestCategoryFragment({
Key key, Key key,
}) : super(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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Consumer<AllRequestsProvider>(builder: (context, allRequestProvider, child) { return Consumer<AllRequestsProvider>(builder: (context, allRequestProvider, child) {
return Column(mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[ 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( getTabs(
requestsProvider: allRequestProvider, requestsProvider: allRequestProvider,
context: context, context: context,
userType: Provider.of<UserProvider>(context, listen: false).user.type, userType: Provider.of<UserProvider>(context, listen: false).user.type,
), ),
// Row( 16.height,
// children: _buildTabButtons(isEngineer: Provider.of<UserProvider>(context, listen: false).user.type == UsersTypes.engineer, allRequestsProvider: allRequestProvider), allRequestProvider.isFilterRequestLoading || allRequestProvider.filterRequest == null
// ), ? Column(
10.height, mainAxisSize: MainAxisSize.max,
allRequestProvider.isFilterRequestLoading||allRequestProvider.filterRequest==null?Column( children: List.generate(3, (index) {
mainAxisSize: MainAxisSize.max, return Padding(
children: List.generate( 3 , (index) { padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight, horizontal: 0),
return Padding( child: const SizedBox().toRequestShimmer(context, allRequestProvider.isFilterRequestLoading),
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),
})): RequestCategoryList(allRequestProvider.filterRequest.requestsDetails ?? [], allRequestProvider.isFilterRequestLoading),
// if (allRequestProvider.isLoadingList) ...[
// const Center(child: CircularProgressIndicator()),
// ] else ...[
// RequestCategoryList(allRequestProvider.dashBoardFilterList?.requestsDetails ?? [], allRequestProvider.dashBoardFilterListLoading),
// ]
]); ]);
}); });
} }
@ -194,7 +160,9 @@ class _RequestCategoryFragmentState extends State<RequestCategoryFragment> {
count: requestsProvider.filterRequest != null ? requestsProvider.filterRequest.total.count : 0, count: requestsProvider.filterRequest != null ? requestsProvider.filterRequest.total.count : 0,
onPressed: () async { onPressed: () async {
requestsProvider.currentListIndex = selectedTab; requestsProvider.currentListIndex = selectedTab;
requestsProvider.filterRequest = null; requestsProvider.filterRequest = null;
requestsProvider.pageNum = 1;
requestsProvider.status = status;
await requestsProvider.getFilterRequests(status: status); await requestsProvider.getFilterRequests(status: status);
requestsProvider.isInProgressLoading = false; requestsProvider.isInProgressLoading = false;
requestsProvider.pageNum = 1; requestsProvider.pageNum = 1;

@ -1,6 +1,9 @@
import 'package:flutter/material.dart'; 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/extensions/int_extensions.dart';
import 'package:test_sa/models/all_requests_and_count_model.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/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/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/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 { class RequestCategoryList extends StatelessWidget {
final List<RequestsDetails> list; final List<RequestsDetails> list;
final int totalCount;
final bool isLoading; final bool isLoading;
const RequestCategoryList(this.list, this.isLoading, this.totalCount, {Key key}) : super(key: key);
const RequestCategoryList(this.list, this.isLoading, {Key key})
: super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Column( return ListView.builder(
mainAxisSize: MainAxisSize.min, itemCount: list.length < totalCount ? list.length + 1 : list.length,
children: List.generate(isLoading ? 6 : list.length, (index) { shrinkWrap: true,
// if (isLoading) { physics:const NeverScrollableScrollPhysics(),
// return const SizedBox().toRequestShimmer(context, isLoading); itemBuilder: (context, index) {
// } if (index == list.length) {
// else { return ListTile(
return Padding( title: Row(
padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight), mainAxisAlignment: MainAxisAlignment.center,
child: _buildRequestItem(list[index])); 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) { 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.... // 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();
// });
// }
// }
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/api_routes/api_manager.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/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/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_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/models/enums/user_types.dart';
import 'package:test_sa/new_views/app_style/app_color.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'; import 'package:test_sa/new_views/pages/land_page/requests_list_page.dart';
class RequestsFragment extends StatelessWidget { class RequestsFragment extends StatelessWidget {
@ -124,123 +18,68 @@ class RequestsFragment extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Consumer<AllRequestsProvider>( return Consumer<AllRequestsProvider>(
builder: (context, snapshot, _) => RefreshIndicator( builder: (context, snapshot, _) => GridView(
onRefresh: () async { // padding: const EdgeInsets.only( bottom: 16),
snapshot.getRequests(); physics: const NeverScrollableScrollPhysics(),
await Provider.of<NotificationsProvider>(context, listen: false) shrinkWrap: true,
.getSystemNotifications( gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4, childAspectRatio: 75 / 84, crossAxisSpacing: 2, mainAxisSpacing: 13),
user: Provider.of<UserProvider>(context, listen: false).user, children: [
resetProvider: true, listItem(
); snapshot.highPriorityRequests?.total?.count,
return Future.delayed(const Duration(milliseconds: 250)); "high_priority",
}, context.translation.highPriority,
child: Row( context,
mainAxisAlignment: MainAxisAlignment.spaceBetween, snapshot.isHighPriorityLoading,
children: _buildListItems(context, snapshot), 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( Widget listItem(
int value, int value,
String icon, String icon,
String title, String title,
BuildContext context, BuildContext context,
bool isLoading, bool isLoading,
int index, int index,
Color iconColor, Color iconColor,
) { ) {
return GestureDetector( return GestureDetector(
onTap: isLoading onTap: isLoading
? null ? null
: () async { : () {
await Navigator.push( Navigator.push(
context, context,
MaterialPageRoute( MaterialPageRoute(
builder: (context) => RequestsListPage(index), builder: (context) => RequestsListPage(index,title),
), ),
); );
Provider.of<AllRequestsProvider>(context, listen: false) },
.getRequests();
},
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
value != null && value > 0&&!isLoading value != null && value > 0 && !isLoading
? badges.Badge( ? CustomBadge(
badgeContent: Text( value: value.toString(),
value.toString(), child: Container(
style: const TextStyle( child: (icon ?? "").toSvgAsset(height: 26, width: 26, color: iconColor)?.toShimmer(isShow: isLoading),
color: AppColor.white20, ).toShadowCircleContainer(context, padding: 18),
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),
)
: Container( : Container(
child: (icon ?? "") child: (icon ?? "").toSvgAsset(height: 26, width: 26, color: iconColor)?.toShimmer(isShow: isLoading),
.toSvgAsset(height: 26, width: 26, color: iconColor) ).toShadowCircleContainer(context, padding: 18),
?.toShimmer(isShow: isLoading),
).toShadowCircleContainer(context,padding: 18),
10.height, 10.height,
Text( Text(
title, title,
style: AppTextStyles.bodyText.copyWith( style: AppTextStyles.tinyFont.copyWith(
color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, 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:flutter/material.dart';
// import 'package:provider/provider.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/new_views/pages/land_page/widgets/request_item_view_list.dart';
import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; import 'package:test_sa/views/widgets/loaders/lazy_loading.dart';
class MyRequestsPage extends StatefulWidget { class MyRequestsPage extends StatefulWidget {
const MyRequestsPage({Key key}) : super(key: key); const MyRequestsPage({Key key}) : super(key: key);
@ -31,7 +30,6 @@ class _MyRequestsPageState extends State<MyRequestsPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (_provider == null) { if (_provider == null) {
requestsList = [ requestsList = [
context.translation.allRequests, context.translation.allRequests,
@ -143,7 +141,7 @@ class _MyRequestsPageState extends State<MyRequestsPage> {
child: RequestItemViewList(snapshot.allRequestsAndCount?.requestsDetails ?? [], snapshot.isAllLoading), child: RequestItemViewList(snapshot.allRequestsAndCount?.requestsDetails ?? [], snapshot.isAllLoading),
nextPage: snapshot.nextPage, nextPage: snapshot.nextPage,
onLazyLoad: () { onLazyLoad: () {
snapshot.getAllRequests(context, typeTransaction: selectedRequest == 0 ? null : selectedRequest,search: _search); snapshot.getAllRequests(context, typeTransaction: selectedRequest == 0 ? null : selectedRequest, search: _search);
}, },
).expanded, ).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/extensions/widget_extensions.dart';
import 'package:test_sa/models/all_requests_and_count_model.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/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/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 '../../../../views/widgets/requests/request_status.dart';
import '../../../app_style/app_color.dart'; import '../../../app_style/app_color.dart';
@ -18,10 +16,11 @@ class ServiceRequestItemView extends StatelessWidget {
final RequestsDetails request; final RequestsDetails request;
final bool showShadow; 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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Column( return Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@ -52,7 +51,8 @@ class ServiceRequestItemView extends StatelessWidget {
'${context.translation.requestNo}: ${request.requestNo}'.bodyText(context), '${context.translation.requestNo}: ${request.requestNo}'.bodyText(context),
8.height, 8.height,
Row( Row(
mainAxisSize: MainAxisSize.min, // mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
context.translation.viewDetails, context.translation.viewDetails,
@ -74,6 +74,8 @@ class ServiceRequestItemView extends StatelessWidget {
builder: (_) => ServiceRequestDetailView( builder: (_) => ServiceRequestDetailView(
serviceRequest: ServiceRequest(id: request.id.toString()), 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: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/providers/api/all_requests_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/extensions/context_extension.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/all_requests_and_count_model.dart';
import 'package:test_sa/models/enums/user_types.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/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/new_views/pages/land_page/widgets/request_item_view_list.dart';
import 'package:test_sa/views/widgets/loaders/lazy_loading.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"; static const String routeName = "/requests-list-page";
final int index; 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; AllRequestsProvider _provider;
ScrollController _scrollController;
@override @override
Widget build(BuildContext context) { void initState() {
bool isEngineer = ApiManager.instance.user.type == UsersTypes.engineer; // TODO: implement initState
if (_provider == null) { _provider = Provider.of<AllRequestsProvider>(context, listen: false);
_provider = Provider.of<AllRequestsProvider>(context, listen: false); _provider.pageNum = 1;
_provider.resetRequestsApiData(); _provider.selectedRequestCategory = null;
callRequestApis(); _provider.isRequestCategoryLoading = true;
} callRequestApis();
String title = index == 0 handleScroll();
? context.translation.highPriority super.initState();
: index == 1 }
? context.translation.overdue
: index == 2 @override
? (isEngineer ? context.translation.inProgress : context.translation.newR) void dispose() {
: index == 3 // TODO: implement dispose
? context.translation.completed _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( return Scaffold(
appBar: DefaultAppBar(title: "$title ${context.translation.requests}"), appBar: DefaultAppBar(title: "${widget.title} ${context.translation.requests}"),
body: Consumer<AllRequestsProvider>(builder: (context, snapshot, _) { 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 ? snapshot.isHighPriorityLoading
: index == 1 : widget.index == 1
? snapshot.isOverdueLoading ? snapshot.isOverdueLoading
: index == 2 : widget.index == 2
? snapshot.isOpenLoading ? snapshot.isOpenLoading
: index == 3 : widget.index == 3
? snapshot.isCompleteLoading ? snapshot.isCompleteLoading
: false; : false;
List<RequestsDetails> list = index == 0 List<RequestsDetails> list = widget.index == 0
? snapshot.highPriorityRequests?.requestsDetails ?? [] ? snapshot.highPriorityRequests?.requestsDetails ?? []
: index == 1 : widget.index == 1
? snapshot.overdueRequests?.requestsDetails?? [] ? snapshot.overdueRequests?.requestsDetails ?? []
: index == 2 : widget.index == 2
? snapshot.openRequests?.requestsDetails?? [] ? snapshot.openRequests?.requestsDetails ?? []
: index == 3 : widget.index == 3
? snapshot.completedRequests?.requestsDetails?? [] ? snapshot.completedRequests?.requestsDetails ?? []
: []; : [];
return LazyLoading(
child: RequestItemViewList(list, isLoading),
nextPage: snapshot.nextPage,
onLazyLoad: () {
callRequestApis();
},
);
RequestItemViewList(list, isLoading);
})); }));
} }
void callRequestApis() { Future<void> callRequestApis({
if (index == 0) { bool showLoader = true,
_provider.getHighPriorityRequests(); int pageNo = 1,
} else if (index == 1) { int pageSize = 10,
_provider.getOverdueRequests(); }) async {
} else if (index == 2) { UsersTypes usersTypes = Provider.of<UserProvider>(context, listen: false).user.type;
_provider.getOpenRequests(); print('i am here at ${widget.index}');
} else {
_provider.getCompletedRequests(); 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 //request tab page
import 'package:flutter/material.dart'; 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/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/widget_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 isGasRefill = list[index].nameOfType == "GasRefill";
bool isAssetTransfer = list[index].nameOfType == "AssetTransfer"; bool isAssetTransfer = list[index].nameOfType == "AssetTransfer";
bool isPPMs = list[index].nameOfType == "PPMs"; bool isPPMs = list[index].nameOfType == "PPMs";
return isServiceRequest return isServiceRequest
? ServiceRequestItemView(list[index]) ? ServiceRequestItemView(list[index])
: isGasRefill : 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/extensions/widget_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.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/common_widgets/default_app_bar.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart';
class HistoryLogView extends StatelessWidget { class HistoryLogView extends StatelessWidget {
const HistoryLogView({Key key}) : super(key: key); const HistoryLogView({Key key}) : super(key: key);
@override @override
Widget build(BuildContext context) { 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( return Scaffold(
backgroundColor: AppColor.neutral100, backgroundColor: AppColor.neutral100,
body: Padding( body: Padding(
padding: EdgeInsets.symmetric(vertical: 50.toScreenHeight), padding: EdgeInsets.only(top: 50.toScreenHeight, bottom: 20.toScreenHeight),
child: Column( child: Stack(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
historyLogCard(context: context,date: DateTime.now()), Padding(
historyLogCard(context: context,date: DateTime.now()), padding: EdgeInsets.only(left: 122.toScreenWidth),
historyLogCard(context: context,date: DateTime.now()), child: const VerticalDivider(
historyLogCard(context: context,date: DateTime.now()), 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}) { Widget historyLogCard({@required BuildContext context, @required HistoryLogModel historyLogModel}) {
return SizedBox( return Column(
width: double.infinity, crossAxisAlignment: CrossAxisAlignment.end,
child: Padding( children: [
padding: EdgeInsets.only(left: 16.toScreenWidth, bottom: 16.toScreenHeight, top: 12.toScreenHeight), historyLogModel.status != null
child: Row( ? Padding(
crossAxisAlignment: CrossAxisAlignment.start, padding: EdgeInsets.only(top: 16.toScreenHeight, bottom: 16.toScreenHeight, right: 89.toScreenWidth),
mainAxisAlignment: MainAxisAlignment.spaceBetween, child: StatusLabel(
children: [ radius: 4,
Column( label: historyLogModel.status,
children: [ textColor: AppColor.getRequestStatusTextColorByName(context, historyLogModel.status),
Text( backgroundColor: AppColor.getRequestStatusColorByName(context, historyLogModel.status),
date.toString().toServiceRequestCardFormat,
textAlign: TextAlign.end,
style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral20),
), ),
], )
), : 12.height,
50.width, Container(
Expanded( width: double.infinity,
child: 'Requester acknowledged adc dld a'.heading6(context), padding: EdgeInsets.only(left: 12.toScreenWidth, bottom: 16.toScreenHeight, top: 12.toScreenHeight),
), child: Column(
], children: [
), Row(
), crossAxisAlignment: CrossAxisAlignment.center,
).toShadowContainer(context).paddingOnly(start: 16, end: 16); 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( StatusLabel(
label: serviceRequest.priority.name, label: serviceRequest.priority.name,
id: serviceRequest.priority.id, id: serviceRequest.priority.id,
radius: 4,
textColor: AppColor.getPriorityStatusTextColor(context, serviceRequest.priority.id), textColor: AppColor.getPriorityStatusTextColor(context, serviceRequest.priority.id),
backgroundColor: AppColor.getPriorityStatusColor(context, serviceRequest.priority.id), backgroundColor: AppColor.getPriorityStatusColor(context, serviceRequest.priority.id),
), ),
8.width, 8.width,
StatusLabel( StatusLabel(
radius: 4,
label: serviceRequest.statusLabel, label: serviceRequest.statusLabel,
textColor: AppColor.getRequestStatusTextColor(context, serviceRequest.statusValue), textColor: AppColor.getRequestStatusTextColor(context, serviceRequest.statusValue),
backgroundColor: AppColor.getRequestStatusColor(context, serviceRequest.statusValue), backgroundColor: AppColor.getRequestStatusColor(context, serviceRequest.statusValue),
@ -286,13 +288,15 @@ class _ServiceRequestDetailViewState extends State<ServiceRequestDetailView> {
Center( Center(
child: InkWell( child: InkWell(
onTap: () async { onTap: () async {
AllRequestsProvider allRequestProvider = Provider.of<AllRequestsProvider>(context, listen: false); try{
int index = allRequestProvider.filterRequest.requestsDetails.indexWhere((element) => element.id.toString() == serviceRequestsProvider.currentSelectedRequest.id); //use a common list
print('index i got is $index'); AllRequestsProvider allRequestProvider = Provider.of<AllRequestsProvider>(context, listen: false);
if (index != -1 && index != allRequestProvider.filterRequest.requestsDetails.length) { int index = allRequestProvider.requestDetailList.requestsDetails.indexWhere((element) => element.id.toString() == serviceRequestsProvider.currentSelectedRequest.id);
print('loading value is $loading'); if (index != -1 && index != allRequestProvider.requestDetailList.requestsDetails.length) {
getServiceRequest(requestId: allRequestProvider.filterRequest.requestsDetails[index + 1].id.toString()); getServiceRequest(requestId: allRequestProvider.requestDetailList.requestsDetails[index + 1].id.toString());
print('call the api with next id ...${allRequestProvider.filterRequest.requestsDetails[index + 1].id.toString()}'); }
}catch(e){
print(e);
} }
}, },
child: Text( child: Text(
@ -316,7 +320,6 @@ class _ServiceRequestDetailViewState extends State<ServiceRequestDetailView> {
textColor: AppColor.red50, textColor: AppColor.red50,
showBorder: true, showBorder: true,
onPressed: () async { onPressed: () async {
print('service request value is ${serviceRequestsProvider.currentSelectedRequest.type}');
ServiceRequestBottomSheet.rejectRequestBottomSheet(context: context); ServiceRequestBottomSheet.rejectRequestBottomSheet(context: context);
// bool shouldReloadData = (await showModalBottomSheet( // bool shouldReloadData = (await showModalBottomSheet(
// context: context, // context: context,

@ -8,8 +8,9 @@ class StatusLabel extends StatelessWidget {
final Color backgroundColor; final Color backgroundColor;
final Color textColor; final Color textColor;
final bool isPriority; 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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -26,7 +27,7 @@ class StatusLabel extends StatelessWidget {
decoration: ShapeDecoration( decoration: ShapeDecoration(
color: backgroundColor, color: backgroundColor,
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(50), borderRadius: BorderRadius.circular(radius),
), ),
), ),
child: Text(label ?? "", style: AppTextStyles.overline.copyWith(color: textColor)), child: Text(label ?? "", style: AppTextStyles.overline.copyWith(color: textColor)),

Loading…
Cancel
Save