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.isAllLoading = false; allRequestsProvider.requestDetailList = allRequestsProvider.filterRequest;
}); });
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: Scrollbar(
controller: _scrollController,
child: SingleChildScrollView( child: SingleChildScrollView(
// physics: AlwaysScrollableScrollPhysics(),
controller: _scrollController,
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
Column( 14.height,
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(), ProgressFragment(),
35.height, 25.height,
SizedBox(height: 105.toScreenHeight, child: const RequestsFragment()), SizedBox(
height: 110.toScreenHeight, child: const RequestsFragment()),
16.height,
const RequestCategoryFragment() const RequestCategoryFragment()
], ],
).paddingOnly(start: 16, end: 16, top: 0, bottom: 8), ).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,6 +15,7 @@ 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
@ -22,12 +24,12 @@ class AppBarWidget extends StatelessWidget {
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(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Consumer<UserProvider>(builder: (context, snapshot, _) { CircleAvatar(
return CircleAvatar(
radius: 24, radius: 24,
backgroundColor: context.isDark ? AppColor.neutral50 : AppColor.neutral40, backgroundColor: context.isDark ? AppColor.neutral50 : AppColor.neutral40,
child: Padding( child: Padding(
@ -40,11 +42,23 @@ class AppBarWidget extends StatelessWidget {
: const Icon(Icons.person, size: 24, color: Colors.white), : const Icon(Icons.person, size: 24, color: Colors.white),
), ),
), ),
); ).onPress(onDrawerPress),
}).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(), const Spacer(),
Consumer<SettingProvider>( Consumer<SettingProvider>(builder: (context, settingProvider, child) {
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(
@ -89,8 +103,7 @@ class AppBarWidget extends StatelessWidget {
})?.toList(), })?.toList(),
), ),
); );
} }),
),
16.width, 16.width,
Stack( Stack(
alignment: Alignment.topRight, alignment: Alignment.topRight,
@ -114,7 +127,8 @@ class AppBarWidget extends StatelessWidget {
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: [
@ -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,
allRequestProvider.isFilterRequestLoading||allRequestProvider.filterRequest==null?Column(
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
children: List.generate( 3 , (index) { children: List.generate(3, (index) {
return Padding( return Padding(
padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight,horizontal: 0), padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight, horizontal: 0),
child: const SizedBox().toRequestShimmer(context, allRequestProvider.isFilterRequestLoading), child: const SizedBox().toRequestShimmer(context, allRequestProvider.isFilterRequestLoading),
); );
})): RequestCategoryList(allRequestProvider.filterRequest.requestsDetails ?? [], allRequestProvider.isFilterRequestLoading), }))
// if (allRequestProvider.isLoadingList) ...[ : RequestCategoryList(allRequestProvider.filterRequest.requestsDetails ?? [], allRequestProvider.isFilterRequestLoading, allRequestProvider.filterRequest.total.count),
// const Center(child: CircularProgressIndicator()),
// ] else ...[
// RequestCategoryList(allRequestProvider.dashBoardFilterList?.requestsDetails ?? [], allRequestProvider.dashBoardFilterListLoading),
// ]
]); ]);
}); });
} }
@ -195,6 +161,8 @@ class _RequestCategoryFragmentState extends State<RequestCategoryFragment> {
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,70 +18,30 @@ 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,
@ -200,47 +54,32 @@ class RequestsFragment extends StatelessWidget {
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(),
style: const TextStyle(
color: AppColor.white20,
fontWeight: FontWeight.normal,
),
),
badgeStyle: const badges.BadgeStyle(
padding: EdgeInsets.all(4),
badgeColor: AppColor.red50
),
child: Container( child: 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),
) )
: 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.resetRequestsApiData(); _provider.pageNum = 1;
_provider.selectedRequestCategory = null;
_provider.isRequestCategoryLoading = true;
callRequestApis(); callRequestApis();
handleScroll();
super.initState();
}
@override
void dispose() {
// TODO: implement dispose
_scrollController.dispose();
super.dispose();
} }
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 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(
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),
),
)
: 12.height,
Container(
width: double.infinity, width: double.infinity,
child: Padding( padding: EdgeInsets.only(left: 12.toScreenWidth, bottom: 16.toScreenHeight, top: 12.toScreenHeight),
padding: EdgeInsets.only(left: 16.toScreenWidth, bottom: 16.toScreenHeight, top: 12.toScreenHeight), child: Column(
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Column( Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
date.toString().toServiceRequestCardFormat, historyLogModel.date.toString().toServiceRequestCardFormat,
textAlign: TextAlign.end, textAlign: TextAlign.end,
style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral20), style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral20),
), ),
],
),
50.width, 50.width,
Expanded( Expanded(
child: 'Requester acknowledged adc dld a'.heading6(context), child: historyLogModel.message.heading6(context),
), ),
], ],
), ),
],
), ),
).toShadowContainer(context).paddingOnly(start: 16, end: 16); ).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 {
try{
//use a common list
AllRequestsProvider allRequestProvider = Provider.of<AllRequestsProvider>(context, listen: false); AllRequestsProvider allRequestProvider = Provider.of<AllRequestsProvider>(context, listen: false);
int index = allRequestProvider.filterRequest.requestsDetails.indexWhere((element) => element.id.toString() == serviceRequestsProvider.currentSelectedRequest.id); int index = allRequestProvider.requestDetailList.requestsDetails.indexWhere((element) => element.id.toString() == serviceRequestsProvider.currentSelectedRequest.id);
print('index i got is $index'); if (index != -1 && index != allRequestProvider.requestDetailList.requestsDetails.length) {
if (index != -1 && index != allRequestProvider.filterRequest.requestsDetails.length) { getServiceRequest(requestId: allRequestProvider.requestDetailList.requestsDetails[index + 1].id.toString());
print('loading value is $loading'); }
getServiceRequest(requestId: allRequestProvider.filterRequest.requestsDetails[index + 1].id.toString()); }catch(e){
print('call the api with next id ...${allRequestProvider.filterRequest.requestsDetails[index + 1].id.toString()}'); 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