Merge branch 'refs/heads/design_3.0_sdk_upgrade' into design_3.0_waseem_dev

# Conflicts:
#	lib/service_request_latest/views/components/request_detail_view.dart
design_3.0_demo_module
muhammad.abbasi 2 years ago
commit acbf33e2a2

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

@ -393,7 +393,6 @@ class AllRequestsProvider extends ChangeNotifier {
}
response = await ApiManager.instance.post(URLs.getAllRequestsAndCount, body: body);
stateCode = response.statusCode;
print('state code is $stateCode');
if (response.statusCode >= 200 && response.statusCode < 300) {
if (inProgressRequests == null) {
inProgressRequests = AllRequestsAndCount.fromJson(json.decode(response.body)["data"][0]);

@ -39,6 +39,12 @@ class DashBoardProvider extends ChangeNotifier {
DD.DashboardDetail? get requestDetailList => _requestDetailList;
List<CategoryTabs> tabs = [];
void setTabs(UsersTypes userType, context) {
tabs = CategoryTabs.getTabs(userType: userType, context: context);
}
set requestDetailList(DD.DashboardDetail? value) {
_requestDetailList = value;
notifyListeners();
@ -52,16 +58,30 @@ class DashBoardProvider extends ChangeNotifier {
pageNum = 1;
nextPage = true;
stateCode = null;
_requestDetailList = null;
dashboardCount = null;
}
void resetRequestDataList() {
pageNum = 1;
nextPage = true;
stateCode = null;
_requestDetailList = null;
}
void getAllRequests(UsersTypes userTypes) {
getDashBoardCount(usersType: userTypes);
// getRequestDetail(usersType: userTypes);
}
Future<int> getDashBoardCount({required UsersTypes usersType}) async {
isAllCountLoading = true;
notifyListeners();
String url = '';
if (usersType == UsersTypes.engineer) {
url = URLs.engineerDashboardCountUrl;
}
if (usersType == UsersTypes.nurse) {
url = URLs.nurseDashboardCountUrl;
} else {
url = URLs.engineerDashboardCountUrl;
}
Response response;
try {
@ -70,6 +90,32 @@ class DashBoardProvider extends ChangeNotifier {
if (response.statusCode >= 200 && response.statusCode < 300) {
dashboardCount = DashboardCount.fromJson(json.decode(response.body));
}
isAllCountLoading = false;
notifyListeners();
return response.statusCode;
} catch (error) {
isAllCountLoading = false;
stateCode = -1;
notifyListeners();
return -1;
}
}
Future<int> getWorkOrderById(int id) async {
isLoading = true;
notifyListeners();
Response response;
try {
response = await ApiManager.instance.get(
URLs.getWorkOrderByIdUrl + "?workOrderId=$id",
);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
dashboardCount = DashboardCount.fromJson(json.decode(response.body));
}
isAllCountLoading = false;
notifyListeners();
return response.statusCode;
@ -81,49 +127,82 @@ class DashBoardProvider extends ChangeNotifier {
}
}
Future<int> getRequestDetail({bool showLoader = true, required UsersTypes usersType, required int status}) async {
void getHighPriorityRequests({bool showLoader = true, required UsersTypes usersType}) {
getRequestDetail(showLoader: showLoader, usersType: usersType, isHighPriority: true);
}
void getOverdueRequests({bool showLoader = true, required UsersTypes usersType}) {
getRequestDetail(showLoader: showLoader, usersType: usersType, isOverdue: true);
}
void getOpenRequests({bool showLoader = true, required UsersTypes usersType}) {
getRequestDetail(showLoader: showLoader, usersType: usersType, status: 1);
}
void getInProgressRequests({bool showLoader = true, required UsersTypes usersType}) {
getRequestDetail(showLoader: showLoader, usersType: usersType, status: 2);
}
void getCompletedRequests({bool showLoader = true, required UsersTypes usersType}) {
getRequestDetail(showLoader: showLoader, usersType: usersType, status: 3);
}
void getAcknowledgeRequests({bool showLoader = true, required UsersTypes usersType}) {
getRequestDetail(showLoader: showLoader, usersType: usersType, status: 3);
}
void getClosedRequests({bool showLoader = true, required UsersTypes usersType}) {
getRequestDetail(showLoader: showLoader, usersType: usersType, status: 4);
}
Future<int> getRequestDetail({bool showLoader = true, required UsersTypes usersType, int? status, bool isHighPriority = false, bool isOverdue = false}) async {
if (showLoader) {
isDetailLoading = showLoader;
notifyListeners();
}
Response response;
String url = '';
if (usersType == UsersTypes.engineer) {
url = URLs.engineerDashboardDetailsUrl;
}
if (usersType == UsersTypes.nurse) {
url = URLs.nurseDashboardDetailsUrl;
} else {
url = URLs.engineerDashboardDetailsUrl;
}
try {
Map<String, dynamic> body = {
"statusValue": status,
"pageNumber": pageNum,
"pageSize": pageItemNumber,
};
Map<String, dynamic> body = {"pageNumber": pageNum, "pageSize": pageItemNumber};
if (status != null) body["status"] = status;
if (isHighPriority) body["isHighPriority"] = true;
if (isOverdue) body["isOverdue"] = true;
response = await ApiManager.instance.post(url, body: body);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
if (requestDetailList == null) {
requestDetailList = DD.DashboardDetail.fromJson(json.decode(response.body));
isDetailLoading = false;
notifyListeners();
if (_requestDetailList == null) {
_requestDetailList = DD.DashboardDetail.fromJson(json.decode(response.body));
//notifyListeners();
} else {
requestDetailList!.data!.addAll(DD.DashboardDetail.fromJson(json.decode(response.body)["data"][0]).data??[]);
isDetailLoading = false;
notifyListeners();
_requestDetailList!.data!.addAll(DD.DashboardDetail.fromJson(json.decode(response.body)["data"][0]).data ?? []);
//notifyListeners();
}
if (requestDetailList!.data!.length >= pageItemNumber) {
if (_requestDetailList!.data!.length >= pageItemNumber) {
nextPage = true;
} else {
nextPage = false;
}
notifyListeners();
//notifyListeners();
} else {
requestDetailList = null;
}
if (showLoader) {
isDetailLoading = false;
}
notifyListeners();
return response.statusCode;
} catch (error) {
if (showLoader) {
isDetailLoading = false;
}
stateCode = -1;
notifyListeners();
return -1;
@ -137,3 +216,25 @@ class DashBoardProvider extends ChangeNotifier {
notifyListeners();
}
}
class CategoryTabs {
String label;
int tag;
CategoryTabs(this.label, this.tag);
static List<CategoryTabs> getTabs({required UsersTypes userType, required BuildContext context}) {
List<CategoryTabs> tabs = [];
if (userType == UsersTypes.engineer) {
tabs.add(CategoryTabs('New Request', 1));
tabs.add(CategoryTabs('In Progress', 2));
tabs.add(CategoryTabs('Completed', 3));
return tabs;
}
tabs.add(CategoryTabs('Open Request', 1));
tabs.add(CategoryTabs('In Progress', 2));
tabs.add(CategoryTabs('Acknowledged', 3));
tabs.add(CategoryTabs('Rejected', 4));
return tabs;
}
}

@ -1,6 +1,5 @@
import 'dart:async';
import 'dart:convert';
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
@ -15,10 +14,8 @@ import 'package:test_sa/dashboard_latest/widgets/app_bar_widget.dart';
import 'package:test_sa/dashboard_latest/widgets/progress_fragment.dart';
import 'package:test_sa/dashboard_latest/widgets/requests_fragment.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/user.dart';
import 'package:test_sa/service_request_latest/request_detail_provider.dart';
import 'package:test_sa/utilities/request_utils.dart';
import 'widgets/request_category_fragment.dart';
@ -42,6 +39,7 @@ class _DashboardViewState extends State<DashboardView> {
late DashBoardProvider dashBoardProvider;
late NotificationsProvider notificationsProvider;
late ScrollController _scrollController;
late DashBoardProvider _dashBoardProvider;
@override
void initState() {
@ -50,17 +48,25 @@ class _DashboardViewState extends State<DashboardView> {
getInitialData();
}
void getRequests() {
_dashBoardProvider.getDashBoardCount(usersType: userProvider.user!.type!);
_dashBoardProvider.getRequestDetail(usersType: userProvider.user!.type!, status: _dashBoardProvider.tabs[_dashBoardProvider.currentListIndex].tag);
}
void getInitialData() {
scheduleMicrotask(() async {
userProvider = Provider.of<UserProvider>(context, listen: false);
settingProvider = Provider.of<SettingProvider>(context, listen: false);
RequestDetailProvider requestDetailProvider = Provider.of<RequestDetailProvider>(context, listen: false);
allRequestsProvider = Provider.of<AllRequestsProvider>(context, listen: false);
dashBoardProvider = Provider.of<DashBoardProvider>(context, listen: false);
_dashBoardProvider = Provider.of<DashBoardProvider>(context, listen: false);
_dashBoardProvider.setTabs(userProvider.user!.type!, context);
notificationsProvider = Provider.of<NotificationsProvider>(context, listen: false);
user = userProvider.user!;
await dashBoardProvider.getDashBoardCount(usersType: user.type!);
await getAllRequests();
getRequests();
// await requestDetailProvider.engineerRejectWorkOrder(id: '3', feedBack: 'Abcdef');
// await dashBoardProvider.getDashBoardCount(usersType: user.type!);
// await getAllRequests();
if (isFCM) {
FirebaseNotificationManger.initialized(context);
NotificationManger.initialisation((notificationDetails) {
@ -72,23 +78,22 @@ class _DashboardViewState extends State<DashboardView> {
});
}
Future<void> getAllRequests() async {
allRequestsProvider.isAllLoading = true;
allRequestsProvider.isFilterRequestLoading = true;
allRequestsProvider.currentListIndex = 0;
allRequestsProvider.filterRequest = null;
var tabs = RequestUtils.getTabs(userType: userProvider.user!.type!, context: context);
allRequestsProvider.status = tabs[0]['status'];
allRequestsProvider.getRequests();
allRequestsProvider.pageNum = 1;
dashBoardProvider.getRequestDetail(usersType: userProvider.user!.type!, status: tabs[0]['status']);
allRequestsProvider.getFilterRequests(showLoader: true, status: tabs[0]['status']).whenComplete(() {
allRequestsProvider.requestDetailList = allRequestsProvider.filterRequest;
});
allRequestsProvider.isAllLoading = false;
notificationsProvider.getSystemNotifications(user: userProvider.user!, resetProvider: true);
}
// Future<void> getAllRequests() async {
// allRequestsProvider.isAllLoading = true;
// allRequestsProvider.isFilterRequestLoading = true;
// allRequestsProvider.currentListIndex = 0;
// allRequestsProvider.filterRequest = null;
// var tabs = RequestUtils.getTabs(userType: userProvider.user!.type!, context: context);
// allRequestsProvider.status = tabs[0]['status'];
// allRequestsProvider.getRequests();
// allRequestsProvider.pageNum = 1;
// dashBoardProvider.getRequestDetail(usersType: userProvider.user!.type!, status: tabs[0]['status']);
// allRequestsProvider.getFilterRequests(showLoader: true, status: tabs[0]['status']).whenComplete(() {
// allRequestsProvider.requestDetailList = allRequestsProvider.filterRequest;
// });
// allRequestsProvider.isAllLoading = false;
// notificationsProvider.getSystemNotifications(user: userProvider.user!, resetProvider: true);
// }
void handleScroll() async {
_scrollController = ScrollController();
@ -117,7 +122,7 @@ class _DashboardViewState extends State<DashboardView> {
)),
body: RefreshIndicator(
onRefresh: () async {
getInitialData();
getRequests();
return Future.delayed(const Duration(milliseconds: 250));
},
child: Scrollbar(
@ -128,8 +133,8 @@ class _DashboardViewState extends State<DashboardView> {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [14.height, ProgressFragment(), 25.height, SizedBox(height: 110.toScreenHeight, child: const RequestsFragment()), 16.height, const RequestCategoryFragment()],
).paddingOnly(start: 16, end: 16, top: 0, bottom: 8),
children: [16.height, ProgressFragment(), const RequestsFragment(), const RequestCategoryFragment()],
),
),
),
),

@ -153,8 +153,8 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:syncfusion_flutter_charts/charts.dart';
import 'package:test_sa/controllers/providers/api/all_requests_provider.dart';
import 'package:test_sa/dashboard_latest/dashboard_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/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
@ -171,21 +171,39 @@ class ProgressFragment extends StatelessWidget {
@override
Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context);
bool isCurrentUserNotEngineer = (_userProvider.user!.type != UsersTypes.engineer);
bool isCurrentUserIsNurse = (_userProvider.user!.type == UsersTypes.normal_user);
return Consumer<DashBoardProvider>(
builder: (context, snapshot, _) {
int total = ((snapshot.dashboardCount?.data?.countComplete ?? 0) + (snapshot.dashboardCount?.data?.countInprogress ?? 0) + (isCurrentUserNotEngineer ? (snapshot.dashboardCount?.data?.countOpen ?? 0) : 0));
final List<ChartData> chartData = [
ChartData('Completed', snapshot.dashboardCount?.data?.countComplete?.toDouble() ?? 0.0, AppColor.green50),
// snapshot.openRequests?.total?.count!=0? ChartData('Open', snapshot.openRequests?.total?.count?.toDouble() ?? 0.0, AppColor.blueStatus(context)),
int total = 0;
List<ChartData> chartData = [];
if (isCurrentUserIsNurse) {
total = (snapshot.dashboardCount?.data?.countComplete ?? 0) + (snapshot.dashboardCount?.data?.countInprogress ?? 0) + (snapshot.dashboardCount?.data?.countOpen ?? 0);
chartData = [
ChartData('Acknowledged', snapshot.dashboardCount?.data?.countComplete?.toDouble() ?? 0.0, AppColor.green70),
ChartData('Open', snapshot.dashboardCount?.data?.countOpen?.toDouble() ?? 0.0, AppColor.blueStatus(context)),
ChartData('In Progress', snapshot.dashboardCount?.data?.countInprogress?.toDouble() ?? 0.0, AppColor.orange70),
];
} else {
total = (snapshot.dashboardCount?.data?.countComplete ?? 0) + (snapshot.dashboardCount?.data?.countInprogress ?? 0) + (snapshot.dashboardCount?.data?.countOpen ?? 0);
chartData = [
ChartData('Completed', snapshot.dashboardCount?.data?.countComplete?.toDouble() ?? 0.0, AppColor.green70),
ChartData('Open', snapshot.dashboardCount?.data?.countOpen?.toDouble() ?? 0.0, AppColor.blueStatus(context)),
ChartData('In Progress', snapshot.dashboardCount?.data?.countInprogress?.toDouble() ?? 0.0, AppColor.orange70),
];
if (isCurrentUserNotEngineer) {
chartData.insert(1, ChartData('Open', snapshot.dashboardCount?.data?.countOpen?.toDouble() ?? 0.0, AppColor.blueStatus(context)));
}
//
// int total =
// (snapshot.dashboardCount?.data?.countComplete ?? 0) + (snapshot.inProgressRequests?.total?.count ?? 0) + (isCurrentUserNotEngineer ? (snapshot.openRequests?.total?.count ?? 0) : 0);
//
// final List<ChartData> chartData = [
// ChartData('Completed', snapshot.completedRequests?.total?.count?.toDouble() ?? 0.0, AppColor.green70),
// // 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.orange70),
// ];
//
// if (isCurrentUserIsNurse) {
// chartData.insert(1, ChartData('Open', snapshot.openRequests?.total?.count?.toDouble() ?? 0.0, AppColor.blueStatus(context)));
// }
return Column(
children: [
@ -207,20 +225,20 @@ class ProgressFragment extends StatelessWidget {
series: <CircularSeries>[
DoughnutSeries<ChartData, String>(
dataSource: chartData,
radius: "110%",
radius: "100%",
innerRadius: "60%",
pointColorMapper: (ChartData data, _) => data.color,
xValueMapper: (ChartData data, _) => data.x,
yValueMapper: (ChartData data, _) => data.y,
dataLabelMapper: (ChartData data, _) => data.x,
dataLabelSettings: DataLabelSettings(
margin: const EdgeInsets.all(8),
isVisible: true,
textStyle: TextStyle(color: context.isDark ? Colors.white : Colors.black87, fontSize: 12),
textStyle: TextStyle(color: context.isDark ? Colors.white : AppColor.neutral20, fontSize: 12, fontWeight: FontWeight.w500),
labelPosition: ChartDataLabelPosition.outside,
//useSeriesColor: true,
),
)
]).toShimmer(isShow: snapshot.isAllCountLoading, radius: 250).paddingAll(12).toShadowContainer(context),
]).toShimmer(isShow: snapshot.isAllCountLoading, radius: 250).paddingAll(0).toShadowContainer(context),
Column(
mainAxisSize: MainAxisSize.min,
children: [
@ -238,7 +256,7 @@ class ProgressFragment extends StatelessWidget {
),
),
],
);
).paddingOnly(start: 16, end: 16);
},
);
}

@ -1,229 +1,65 @@
//Older code
// import 'package:flutter/material.dart';
// import 'package:provider/provider.dart';
// import 'package:test_sa/controllers/notification/firebase_notification_manger.dart';
// import 'package:test_sa/controllers/providers/api/all_requests_provider.dart';
// import 'package:test_sa/controllers/providers/api/notifications_provider.dart';
// import 'package:test_sa/controllers/providers/api/user_provider.dart';
// import 'package:test_sa/extensions/context_extension.dart';
// import 'package:test_sa/extensions/text_extensions.dart';
// import 'package:test_sa/extensions/widget_extensions.dart';
// import 'package:test_sa/new_views/app_style/app_color.dart';
// import 'package:test_sa/views/widgets/notifications/notification_item.dart';
//
// class RequestCategoryFragment extends StatelessWidget {
// RequestCategoryFragment({Key? key}) : super(key: key);
//
// //NotificationsProvider _notificationsProvider;
//
// @override
// Widget build(BuildContext context) {
// //_notificationsProvider ??= Provider.of<NotificationsProvider>(context, listen: false);
// return Consumer<NotificationsProvider>(builder: (context, _notificationsProvider, _) {
// return RefreshIndicator(
// onRefresh: () {
// Provider.of<AllRequestsProvider>(context, listen: false).getRequests();
// _notificationsProvider.getSystemNotifications(user: Provider.of<UserProvider>(context, listen: false).user,resetProvider: true);
// return Future.delayed(const Duration(microseconds: 250));
// },
// child: SingleChildScrollView(
// padding: const EdgeInsets.all(16),
// child: Container(
// decoration: ShapeDecoration(
// color: AppColor.background(context),
// shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
// shadows: [boxShadowR14],
// ),
// child: Column(
// mainAxisSize: MainAxisSize.min,
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// context.translation.recentActivities
// .heading5(context)
// .toShimmer(
// isShow: _notificationsProvider.isLoading,
// )
// .paddingOnly(top: 16, start: 16, end: 16),
// ListView.separated(
// shrinkWrap: true,
// physics: const NeverScrollableScrollPhysics(),
// padding: const EdgeInsets.all(16),
// itemCount: _notificationsProvider.notifications.length,
// separatorBuilder: (context, itemIndex) => const Divider().defaultStyle(context).paddingOnly(top: 16, bottom: 16),
// itemBuilder: (context, itemIndex) {
// // todo add priority & progress tag to show chip
// return NotificationItem(
// isLoading: _notificationsProvider.isLoading,
// notification: _notificationsProvider.notifications[itemIndex],
// onPressed: (notification) {
// FirebaseNotificationManger.handleMessage(context, notification.toNotificationJson());
// },
// );
// },
// ),
// ],
// ),
// ),
// ),
// );
// });
// }
// }
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/controllers/providers/api/user_provider.dart';
import 'package:test_sa/dashboard_latest/dashboard_provider.dart';
import 'package:test_sa/dashboard_latest/widgets/request_category_list.dart';
import 'package:test_sa/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/models/new_models/dashboard_detail.dart';
import 'package:test_sa/new_views/common_widgets/tab_button.dart';
import 'package:test_sa/dashboard_latest/widgets/request_category_list.dart';
import 'package:test_sa/utilities/request_utils.dart';
class RequestCategoryFragment extends StatelessWidget {
const RequestCategoryFragment({
Key? key,
}) : super(key: key);
const RequestCategoryFragment({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Consumer<AllRequestsProvider>(builder: (context, allRequestProvider, child) {
return Consumer<DashBoardProvider>(builder: (context, dashboardProvider, child) {
return Column(mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[
context.translation.allRequests.heading4(context),
16.height,
context.translation.allRequests.heading4(context).paddingOnly(start: 16, end: 16),
getTabs(
requestsProvider: allRequestProvider,
requestsProvider: dashboardProvider,
context: context,
userType: Provider.of<UserProvider>(context, listen: false).user!.type!,
),
16.height,
allRequestProvider.isFilterRequestLoading || allRequestProvider.filterRequest == null
dashboardProvider.isDetailLoading || dashboardProvider.requestDetailList == null
? Column(
mainAxisSize: MainAxisSize.max,
children: List.generate(3, (index) {
return Padding(
padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight, horizontal: 0),
child: const SizedBox().toRequestShimmer(context, allRequestProvider.isFilterRequestLoading),
child: const SizedBox().toRequestShimmer(context, dashboardProvider.isDetailLoading),
);
}))
: RequestCategoryList(allRequestProvider.filterRequest?.requestsDetails ?? [], allRequestProvider.isFilterRequestLoading, allRequestProvider.filterRequest?.total?.count ?? 0),
})).paddingOnly(start: 16, end: 16, top: 16)
: RequestCategoryList(dashboardProvider.requestDetailList?.data ?? <Data>[], dashboardProvider.isDetailLoading, dashboardProvider.requestDetailList?.totalRows ?? 0),
]);
});
}
Widget getTabs({required BuildContext context, required AllRequestsProvider requestsProvider, required UsersTypes userType}) {
List<dynamic> tabs = [];
switch (userType) {
case UsersTypes.engineer:
tabs = RequestUtils.getTabs(userType: UsersTypes.engineer, context: context);
return Row(
children: tabs.map((item) {
return tabWidget(
label: item['label'],
status: item['status'],
selectedTab: tabs.indexOf(item),
requestsProvider: requestsProvider,
);
}).toList(),
);
case UsersTypes.normal_user:
tabs = RequestUtils.getTabs(userType: UsersTypes.normal_user, context: context);
return Row(
children: tabs.map((item) {
return tabWidget(
label: item['label'],
status: item['status'],
selectedTab: tabs.indexOf(item),
requestsProvider: requestsProvider,
);
}).toList(),
);
default:
return const SizedBox();
}
}
Widget tabWidget({required int selectedTab, required String label, required int status, required AllRequestsProvider requestsProvider}) {
return Padding(
padding: const EdgeInsets.only(right: 12),
child: TabButton(
label: label,
loading: requestsProvider.isFilterRequestLoading,
isSelected: requestsProvider.currentListIndex == selectedTab,
count: requestsProvider.filterRequest != null ? requestsProvider.filterRequest!.total!.count! : 0,
Widget getTabs({required BuildContext context, required DashBoardProvider requestsProvider, required UsersTypes userType}) {
List<CategoryTabs> tabs = CategoryTabs.getTabs(userType: UsersTypes.engineer, context: context);
return SizedBox(
height: 44 + 16,
child: ListView.separated(
scrollDirection: Axis.horizontal,
separatorBuilder: (cxt, index) => 12.width,
padding: const EdgeInsets.only(top: 6 + 16, left: 16, right: 16),
itemBuilder: (cxt, index) {
return TabButton(
label: tabs[index].label,
loading: requestsProvider.isDetailLoading,
isSelected: requestsProvider.currentListIndex == index,
count: requestsProvider.requestDetailList != null ? requestsProvider.requestDetailList!.totalRows ?? 0 : 0,
onPressed: () async {
requestsProvider.currentListIndex = selectedTab;
requestsProvider.filterRequest = null;
requestsProvider.pageNum = 1;
requestsProvider.status = status;
await requestsProvider.getFilterRequests(status: status);
requestsProvider.isInProgressLoading = false;
requestsProvider.pageNum = 1;
// requestsProvider.dashBoardFilterList = requestsProvider.openRequests.requestsDetails;
requestsProvider.currentListIndex = index;
requestsProvider.resetRequestDataList();
requestsProvider.getRequestDetail(usersType: userType, showLoader: true, status: tabs[index].tag);
},
));
);
},
itemCount: tabs.length),
);
}
}
//tabs code...
//
// List<TabButtonData> _getTabButtonData({required bool isEngineer, required AllRequestsProvider allRequestsProvider, required int totalCount}) {
// List<TabButtonData> tabList = [];
// List<Map<String, dynamic>> tabs = [];
// print('dashboard filter list data is ${allRequestsProvider.dashBoardFilterList}');
//
// if (!isEngineer && allRequestsProvider.dashBoardFilterList != null && allRequestsProvider.dashBoardFilterList.isNotEmpty) {
// tabList.add(TabButtonData(
// label: 'New Request',
// isSelected: allRequestsProvider.currentListIndex == 0,
// totalCount: totalCount,
// onPressed: () {
// allRequestsProvider.currentListIndex = 0;
// allRequestsProvider.dashBoardFilterList = allRequestsProvider.openRequests.requestsDetails;
// },
// ));
// }
// tabList.add(TabButtonData(
// label: 'In Progress',
// isSelected: allRequestsProvider.currentListIndex == (isEngineer ? 0 : 1),
// totalCount: totalCount,
// onPressed: () {
// allRequestsProvider.currentListIndex = isEngineer ? 0 : 1;
// allRequestsProvider.dashBoardFilterList = allRequestsProvider.inProgressRequests.requestsDetails;
// },
// ));
// tabList.add(
// TabButtonData(
// label: 'Completed',
// isSelected: allRequestsProvider.currentListIndex == (isEngineer ? 1 : 2),
// totalCount: totalCount,
// onPressed: () {
// allRequestsProvider.currentListIndex = isEngineer ? 1 : 2;
// allRequestsProvider.dashBoardFilterList = allRequestsProvider.completedRequests.requestsDetails;
// },
// ),
// );
// return tabList;
// }
//
// List<Widget> _buildTabButtons({required bool isEngineer, required AllRequestsProvider allRequestsProvider}) {
// int totalCount = 0;
// print('build tab button called');
// if (allRequestsProvider.dashBoardFilterList != null) {
// totalCount = allRequestsProvider.dashBoardFilterList.length;
// }
// return _getTabButtonData(isEngineer: isEngineer, allRequestsProvider: allRequestsProvider, totalCount: totalCount).map((tab) {
// return Padding(
// padding: const EdgeInsets.only(left: 10.0),
// child: TabButton(
// label: tab.label,
// isSelected: tab.isSelected,
// count: totalCount,
// onPressed: tab.onPressed,
// ),
// );
// }).toList();
// }

@ -1,16 +1,14 @@
import 'package:flutter/material.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/new_models/dashboard_detail.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 RequestCategoryList extends StatelessWidget {
final List<RequestsDetails> list;
final List<Data> list;
final int totalCount;
final bool isLoading;
const RequestCategoryList(this.list, this.isLoading, this.totalCount, {Key? key}) : super(key: key);
@override
@ -18,7 +16,8 @@ class RequestCategoryList extends StatelessWidget {
return ListView.builder(
itemCount: list.length < totalCount ? list.length + 1 : list.length,
shrinkWrap: true,
physics:const NeverScrollableScrollPhysics(),
padding: EdgeInsets.all(16),
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) {
if (index == list.length) {
return const ListTile(
@ -38,20 +37,20 @@ class RequestCategoryList extends StatelessWidget {
);
}
Widget _buildRequestItem(RequestsDetails request) {
bool isServiceRequest = request.nameOfType == "ServiceRequest";
bool isGasRefill = request.nameOfType == "GasRefill";
bool isAssetTransfer = request.nameOfType == "AssetTransfer";
bool isPPMs = request.nameOfType == "PPMs";
Widget _buildRequestItem(Data request) {
bool isServiceRequest = request.transactionNo == 1;
bool isGasRefill = request.transactionNo == 2;
bool isAssetTransfer = request.transactionNo == 3;
bool isPPMs = request.transactionNo == 4;
if (isServiceRequest) {
return ServiceRequestItemView(request);
} else if (isGasRefill) {
return GasRefillItemView(request);
} else if (isPPMs) {
return PpmItemView(request);
} else if (isAssetTransfer) {
return AssetItemView(request);
// } else if (isGasRefill) {
// return GasRefillItemView(request);
// } else if (isPPMs) {
// return PpmItemView(request);
// } else if (isAssetTransfer) {
// return AssetItemView(request);
} else {
return Container(
height: 100,
@ -61,16 +60,3 @@ 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]));
// // }
// }));

@ -2,7 +2,6 @@
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/dashboard_latest/dashboard_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
@ -12,7 +11,7 @@ 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/custom_badge.dart';
import 'package:test_sa/new_views/pages/land_page/requests_list_page.dart';
import 'package:test_sa/controllers/providers/api/all_requests_provider.dart';
class RequestsFragment extends StatelessWidget {
const RequestsFragment({Key? key}) : super(key: key);
@ -20,10 +19,10 @@ class RequestsFragment extends StatelessWidget {
Widget build(BuildContext context) {
return Consumer<DashBoardProvider>(
builder: (context, snapshot, _) => GridView(
// padding: const EdgeInsets.only( bottom: 16),
padding: const EdgeInsets.only(top: 16, left: 16, right: 16),
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4, childAspectRatio: 75 / 84, crossAxisSpacing: 2, mainAxisSpacing: 13),
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4, childAspectRatio: 72 / 84, crossAxisSpacing: 2, mainAxisSpacing: 12),
children: [
listItem(
snapshot.dashboardCount?.data?.countHighPriority ?? 0,
@ -32,58 +31,43 @@ class RequestsFragment extends StatelessWidget {
context,
snapshot.isAllCountLoading,
0,
context.isDark ? AppColor.redStatus(context) : AppColor.red50,
context.isDark ? AppColor.redStatus(context) : AppColor.red30,
),
listItem( snapshot.dashboardCount?.data?.countOverdue ?? 0, "overdue", context.translation.overdue, context, snapshot.isAllCountLoading, 1, AppColor.yellowIcon(context)),
listItem( snapshot.dashboardCount?.data?.countOpen ?? 0, "new_request", ApiManager.instance.user!.type == UsersTypes.engineer ? context.translation.inProgress : context.translation.newR, context,
snapshot.isAllCountLoading, 2, AppColor.primary40),
listItem( snapshot.dashboardCount?.data?.countComplete ?? 0, "complete_request", context.translation.completed, context, snapshot.isAllCountLoading, 3, AppColor.greenStatus(context)),
listItem(snapshot.dashboardCount?.data?.countOverdue ?? 0, "overdue", context.translation.overdue, context, snapshot.isAllCountLoading, 1, AppColor.yellowIcon(context)),
listItem(snapshot.dashboardCount?.data?.countOpen ?? 0, "new_request", ApiManager.instance.user!.type == UsersTypes.engineer ? context.translation.inProgress : context.translation.newR,
context, snapshot.isAllCountLoading, 2, AppColor.primary10),
listItem(snapshot.dashboardCount?.data?.countComplete ?? 0, "complete_request", context.translation.completed, context, snapshot.isAllCountLoading, 3, AppColor.greenStatus(context)),
],
),
);
}
Widget listItem(
int value,
String icon,
String title,
BuildContext context,
bool isLoading,
int index,
Color iconColor,
) {
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, title),
),
);
Navigator.push(context, MaterialPageRoute(builder: (context) => RequestsListPage(index, title)));
},
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: [
value > 0 && !isLoading
? CustomBadge(
value: value.toString(),
8.height,
CustomBadge(
value: isLoading ? 0 : value,
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),
).toShadowCircleContainer(context, padding: 17),
),
10.height,
Text(
title,
textAlign: TextAlign.center,
style: AppTextStyles.tinyFont.copyWith(
color: context.isDark ? AppColor.neutral30 : AppColor.neutral50,
),
color: context.isDark ? AppColor.neutral30 : AppColor.black20,
),
).toShimmer(isShow: isLoading),
],
),
);

@ -50,8 +50,9 @@ class Data {
String? assetNumber;
String? requestTypeName;
String? requestNo;
int? transactionNo;
Data({this.id, this.typeTransaction, this.transactionDate, this.statusName, this.priorityName, this.isHighPriority, this.assetName, this.assetNumber, this.requestTypeName, this.requestNo});
Data({this.id, this.typeTransaction, this.transactionDate, this.statusName, this.priorityName, this.isHighPriority, this.assetName, this.assetNumber, this.requestTypeName, this.requestNo,this.transactionNo});
Data.fromJson(Map<String, dynamic> json) {
id = json['id'];
@ -64,6 +65,7 @@ class Data {
assetNumber = json['assetNumber'];
requestTypeName = json['requestTypeName'];
requestNo = json['requestNo'];
transactionNo = json['transactionNo'];
}
Map<String, dynamic> toJson() {
@ -78,6 +80,7 @@ class Data {
data['assetNumber'] = assetNumber;
data['requestTypeName'] = requestTypeName;
data['requestNo'] = requestNo;
data['transactionNo'] = transactionNo;
return data;
}
}

@ -1,751 +0,0 @@
import 'package:test_sa/models/lookup.dart';
class WorkOrderDetail {
WorkOrder? data;
String? message;
String? title;
String? innerMessage;
int? responseCode;
bool? isSuccess;
WorkOrderDetail({this.data, this.message, this.title, this.innerMessage, this.responseCode, this.isSuccess});
factory WorkOrderDetail.fromJson(Map<String, dynamic> json) {
return WorkOrderDetail(
data: json['data'] == null ? null : WorkOrder.fromJson(json['data']),
message: json['message'],
title: json['title'],
innerMessage: json['innerMessage'],
responseCode: json['responseCode'],
isSuccess: json['isSuccess'],
);
}
Map<String, dynamic> toJson() {
return {
'data': data?.toJson(),
'message': message,
'title': title,
'innerMessage': innerMessage,
'responseCode': responseCode,
'isSuccess': isSuccess,
};
}
}
class WorkOrder {
String? workOrderNo;
WorkOrderCreatedBy? workOrderCreatedBy;
DateTime? requestedDate;
Asset? asset;
Lookup? assetGroup;
Lookup? manufacturer;
Lookup? model;
Lookup? assetNDModel;
Site? site;
Lookup? building;
Lookup? floor;
Lookup? department;
dynamic room;
Lookup? assetType;
AssignedEmployee? assignedEmployee;
dynamic lastActivityStatus;
Lookup? status;
Lookup? nextStep;
dynamic assetVerificationType;
List<WorkOrderContactPerson>? workOrderContactPerson;
EquipmentStatus? equipmentStatus;
Priority? priority;
RequestedThrough? requestedThrough;
TypeOfRequest? typeofRequest;
dynamic loanAvailablity;
dynamic assetLoan;
dynamic safety;
ProblemDescription? problemDescription;
String? comments;
String? voiceNote;
List<dynamic>? workOrderAttachments;
dynamic returnToService;
dynamic serviceType;
dynamic failureReasone;
dynamic solution;
dynamic totalWorkingHours;
List<WorkOrderHistory>? workOrderHistory;
List<dynamic>? activityMaintenances;
List<dynamic>? activitySpareParts;
List<dynamic>? activityAssetToBeRetireds;
WorkOrder({
this.workOrderNo,
this.workOrderCreatedBy,
this.requestedDate,
this.asset,
this.assetGroup,
this.manufacturer,
this.model,
this.assetNDModel,
this.site,
this.building,
this.floor,
this.department,
this.room,
this.assetType,
this.assignedEmployee,
this.lastActivityStatus,
this.status,
this.nextStep,
this.assetVerificationType,
this.workOrderContactPerson,
this.equipmentStatus,
this.priority,
this.requestedThrough,
this.typeofRequest,
this.loanAvailablity,
this.assetLoan,
this.safety,
this.problemDescription,
this.comments,
this.voiceNote,
this.workOrderAttachments,
this.returnToService,
this.serviceType,
this.failureReasone,
this.solution,
this.totalWorkingHours,
this.workOrderHistory,
this.activityMaintenances,
this.activitySpareParts,
this.activityAssetToBeRetireds,
});
factory WorkOrder.fromJson(Map<String, dynamic> json) {
return WorkOrder(
workOrderNo: json['workOrderNo'],
workOrderCreatedBy: WorkOrderCreatedBy.fromJson(json['workOrderCreatedBy']),
requestedDate: DateTime.parse(json['requestedDate']),
asset: Asset.fromJson(json['asset']),
assetGroup: json['assetGroup'] ?? Lookup.fromJson(json['assetGroup']),
manufacturer: json['manufacturer'] ?? Lookup.fromJson(json['manufacturer']),
model: json['model'] ?? Lookup.fromJson(json['model']),
assetNDModel: json['assetNDModel'] ?? Lookup.fromJson(json['assetNDModel']),
site: Site.fromJson(json['site']),
building: json['building'] ?? Lookup.fromJson(json['building']),
floor: json['floor'] ?? Lookup.fromJson(json['floor']),
department: json['department'] ?? Lookup.fromJson(json['department']),
room: json['room'],
assetType: json['assetType'] ?? Lookup.fromJson(json['assetType']),
assignedEmployee: AssignedEmployee.fromJson(json['assignedEmployee']),
lastActivityStatus: json['lastActivityStatus'],
status: json['status'] ?? Lookup.fromJson(json['status']),
nextStep: json['nextStep'] ?? Lookup.fromJson(json['nextStep']),
assetVerificationType: json['assetVerificationType'],
workOrderContactPerson: (json['workOrderContactPerson'] as List).map((i) => WorkOrderContactPerson.fromJson(i)).toList(),
equipmentStatus: EquipmentStatus.fromJson(json['equipmentStatus']),
priority: Priority.fromJson(json['priority']),
requestedThrough: RequestedThrough.fromJson(json['requestedThrough']),
typeofRequest: TypeOfRequest.fromJson(json['typeofRequest']),
loanAvailablity: json['loanAvailablity'],
assetLoan: json['assetLoan'],
safety: json['safety'],
problemDescription: ProblemDescription.fromJson(json['problemDescription']),
comments: json['comments'],
voiceNote: json['voiceNote'],
workOrderAttachments: json['workOrderAttachments'] as List,
returnToService: json['returnToService'],
serviceType: json['serviceType'],
failureReasone: json['failureReasone'],
solution: json['solution'],
totalWorkingHours: json['totalWorkingHours'],
workOrderHistory: (json['workOrderHistory'] as List).map((i) => WorkOrderHistory.fromJson(i)).toList(),
activityMaintenances: json['activityMaintenances'] as List,
activitySpareParts: json['activitySpareParts'] as List,
activityAssetToBeRetireds: json['activityAssetToBeRetireds'] as List,
);
}
Map<String, dynamic> toJson() {
return {
'workOrderNo': workOrderNo,
'workOrderCreatedBy': workOrderCreatedBy?.toJson(),
'requestedDate': requestedDate?.toIso8601String(),
'asset': asset?.toJson(),
'assetGroup': assetGroup?.toJson(),
'manufacturer': manufacturer?.toJson(),
'model': model?.toJson(),
'assetNDModel': assetNDModel?.toJson(),
'site': site?.toJson(),
'building': building?.toJson(),
'floor': floor?.toJson(),
'department': department?.toJson(),
'room': room,
'assetType': assetType?.toJson(),
'assignedEmployee': assignedEmployee?.toJson(),
'lastActivityStatus': lastActivityStatus,
'status': status?.toJson(),
'nextStep': nextStep?.toJson(),
'assetVerificationType': assetVerificationType,
'workOrderContactPerson': workOrderContactPerson?.map((i) => i.toJson()).toList(),
'equipmentStatus': equipmentStatus?.toJson(),
'priority': priority?.toJson(),
'requestedThrough': requestedThrough?.toJson(),
'typeofRequest': typeofRequest?.toJson(),
'loanAvailablity': loanAvailablity,
'assetLoan': assetLoan,
'safety': safety,
'problemDescription': problemDescription?.toJson(),
'comments': comments,
'voiceNote': voiceNote,
'workOrderAttachments': workOrderAttachments,
'returnToService': returnToService,
'serviceType': serviceType,
'failureReasone': failureReasone,
'solution': solution,
'totalWorkingHours': totalWorkingHours,
'workOrderHistory': workOrderHistory?.map((i) => i.toJson()).toList(),
'activityMaintenances': activityMaintenances,
'activitySpareParts': activitySpareParts,
'activityAssetToBeRetireds': activityAssetToBeRetireds,
};
}
}
class WorkOrderCreatedBy {
String? id;
String? userName;
WorkOrderCreatedBy({this.id, this.userName});
factory WorkOrderCreatedBy.fromJson(Map<String, dynamic> json) {
return WorkOrderCreatedBy(id: json['id'], userName: json['userName']);
}
Map<String, dynamic> toJson() {
return {'id': id, 'userName': userName};
}
}
class Asset {
int? id;
String? assetNumber;
Asset({this.id, this.assetNumber});
factory Asset.fromJson(Map<String, dynamic> json) {
return Asset(id: json['id'], assetNumber: json['assetNumber']);
}
Map<String, dynamic> toJson() {
return {'id': id, 'assetNumber': assetNumber};
}
}
class WorkOrderContactPerson {
int? id;
String? name;
String? employeeId;
String? position;
String? extension;
String? email;
String? mobilePhone;
ContactUser? contactUser;
WorkOrderContactPerson({this.id, this.name, this.employeeId, this.position, this.extension, this.email, this.mobilePhone, this.contactUser});
factory WorkOrderContactPerson.fromJson(Map<String, dynamic> json) {
return WorkOrderContactPerson(
id: json['id'],
name: json['name'],
employeeId: json['employeeId'],
position: json['position'],
extension: json['extension'],
email: json['email'],
mobilePhone: json['mobilePhone'],
contactUser: json['contactUser'] == null ? null : ContactUser.fromJson(json['contactUser']),
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
'employeeId': employeeId,
'position': position,
'extension': extension,
'email': email,
'mobilePhone': mobilePhone,
'contactUser': contactUser?.toJson(),
};
}
}
class ContactUser {
String? id;
String? userName;
ContactUser({this.id, this.userName});
factory ContactUser.fromJson(Map<String, dynamic> json) {
return ContactUser(id: json['id'], userName: json['userName']);
}
Map<String, dynamic> toJson() {
return {'id': id, 'userName': userName};
}
}
class AssignedEmployee {
String? id;
String? userName;
AssignedEmployee({this.id, this.userName});
factory AssignedEmployee.fromJson(Map<String, dynamic> json) {
return AssignedEmployee(id: json['id'], userName: json['userName']);
}
Map<String, dynamic> toJson() {
return {'id': id, 'userName': userName};
}
}
class Site {
int? id;
String? siteName;
Site({this.id, this.siteName});
factory Site.fromJson(Map<String, dynamic> json) {
return Site(id: json['id'], siteName: json['siteName']);
}
Map<String, dynamic> toJson() {
return {'id': id, 'siteName': siteName};
}
}
///
// class AssetGroup {
// int id;
// String name;
//
// AssetGroup({this.id, this.name});
//
// factory AssetGroup.fromJson(Map<String, dynamic> json) {
// return AssetGroup(
// id: json['id'],
// name: json['name'],
// );
// }
// Map<String, dynamic> toJson() {
// return {
// 'id': id,
// 'name': name,
// };
// }
//
// }
//
// class Manufacturer {
// int id;
// String name;
//
// Manufacturer({this.id, this.name});
//
// factory Manufacturer.fromJson(Map<String, dynamic> json) {
// return Manufacturer(
// id: json['id'],
// name: json['name'],
// );
// }
// Map<String, dynamic> toJson() {
// return {
// 'id': id,
// 'name': name,
// };
// }
// }
//
// class Model {
// int id;
// String name;
//
// Model({this.id, this.name});
//
// factory Model.fromJson(Map<String, dynamic> json) {
// return Model(
// id: json['id'],
// name: json['name'],
// );
// }
// Map<String, dynamic> toJson() {
// return {
// 'id': id,
// 'name': name,
// };
// }
// }
//
// class AssetNDModel {
// int id;
// String name;
//
// AssetNDModel({this.id, this.name});
//
// factory AssetNDModel.fromJson(Map<String, dynamic> json) {
// return AssetNDModel(
// id: json['id'],
// name: json['name'],
// );
// }
// Map<String, dynamic> toJson() {
// return {
// 'id': id,
// 'name': name,
// };
// }
// }
//
// class Building {
// int id;
// String name;
// int value;
//
// Building({this.id, this.name, this.value});
//
// factory Building.fromJson(Map<String, dynamic> json) {
// return Building(
// id: json['id'],
// name: json['name'],
// value: json['value'],
// );
// }
// Map<String, dynamic> toJson() {
// return {
// 'id': id,
// 'name': name,
// 'value': value,
// };
// }
// }
//
// class Floor {
// int id;
// String name;
// int value;
//
// Floor({this.id, this.name, this.value});
//
// factory Floor.fromJson(Map<String, dynamic> json) {
// return Floor(
// id: json['id'],
// name: json['name'],
// value: json['value'],
// );
// }
// Map<String, dynamic> toJson() {
// return {
// 'id': id,
// 'name': name,
// 'value': value,
// };
// }
// }
//
// class Department {
// int id;
// String name;
//
// Department({this.id, this.name});
//
// factory Department.fromJson(Map<String, dynamic> json) {
// return Department(
// id: json['id'],
// name: json['name'],
// );
// }
// Map<String, dynamic> toJson() {
// return {
// 'id': id,
// 'name': name,
// };
// }
// }
//
// class AssetType {
// int id;
// String name;
// int value;
//
// AssetType({this.id, this.name, this.value});
//
// factory AssetType.fromJson(Map<String, dynamic> json) {
// return AssetType(
// id: json['id'],
// name: json['name'],
// value: json['value'],
// );
// }
// Map<String, dynamic> toJson() {
// return {
// 'id': id,
// 'name': name,
// 'value': value,
// };
// }
// }
//
// class Status {
// int id;
// String name;
// int value;
//
// Status({this.id, this.name, this.value});
//
// factory Status.fromJson(Map<String, dynamic> json) {
// return Status(
// id: json['id'],
// name: json['name'],
// value: json['value'],
// );
// }
// Map<String, dynamic> toJson() {
// return {
// 'id': id,
// 'name': name,
// 'value': value,
// };
// }
// }
//
// class NextStep {
// int id;
// String name;
// int value;
//
// NextStep({this.id, this.name, this.value});
//
// factory NextStep.fromJson(Map<String, dynamic> json) {
// return NextStep(
// id: json['id'],
// name: json['name'],
// value: json['value'],
// );
// }
// Map<String, dynamic> toJson() {
// return {
// 'id': id,
// 'name': name,
// 'value': value,
// };
// }
// }
class EquipmentStatus {
int? id;
String? name;
int? value;
EquipmentStatus({this.id, this.name, this.value});
factory EquipmentStatus.fromJson(Map<String, dynamic> json) {
return EquipmentStatus(id: json['id'], name: json['name'], value: json['value']);
}
Map<String, dynamic> toJson() {
return {'id': id, 'name': name, 'value': value};
}
}
class Priority {
int? id;
String? name;
int? value;
Priority({this.id, this.name, this.value});
factory Priority.fromJson(Map<String, dynamic> json) {
return Priority(id: json['id'], name: json['name'], value: json['value']);
}
Map<String, dynamic> toJson() {
return {'id': id, 'name': name, 'value': value};
}
}
class RequestedThrough {
int? id;
String? name;
RequestedThrough({this.id, this.name});
factory RequestedThrough.fromJson(Map<String, dynamic> json) {
return RequestedThrough(id: json['id'], name: json['name']);
}
Map<String, dynamic> toJson() {
return {'id': id, 'name': name};
}
}
class TypeOfRequest {
int? id;
String? name;
TypeOfRequest({this.id, this.name});
factory TypeOfRequest.fromJson(Map<String, dynamic> json) {
return TypeOfRequest(id: json['id'], name: json['name']);
}
Map<String, dynamic> toJson() {
return {'id': id, 'name': name};
}
}
class ProblemDescription {
int? id;
String? name;
ProblemDescription({this.id, this.name});
factory ProblemDescription.fromJson(Map<String, dynamic> json) {
return ProblemDescription(id: json['id'], name: json['name']);
}
Map<String, dynamic> toJson() {
return {'id': id, 'name': name};
}
}
class WorkOrderHistory {
int? id;
Lookup? workOrderStatus;
dynamic activityStatus; // Since activityStatus is null, it's dynamic
String? date;
HistoryUser? user;
Lookup? step;
dynamic fixRemotelyStartTime; // Since it's null, it's dynamic
dynamic fixRemotelyEndTime; // Since it's null, it's dynamic
dynamic fixRemotelyWorkingHours; // Since it's null, it's dynamic
String? comments;
dynamic needAVisitDateTime; // Since it's null, it's dynamic
WorkOrderHistory(
{this.id,
this.workOrderStatus,
this.activityStatus,
this.date,
this.user,
this.step,
this.fixRemotelyStartTime,
this.fixRemotelyEndTime,
this.fixRemotelyWorkingHours,
this.comments,
this.needAVisitDateTime});
factory WorkOrderHistory.fromJson(Map<String, dynamic> json) {
return WorkOrderHistory(
id: json['id'],
//json['assetType'] != null ? Lookup.fromJson(json['assetType']) : null;
workOrderStatus: json['workorderStatus'] ?? Lookup.fromJson(json['workorderStatus']),
activityStatus: json['activityStatus'],
date: json['date'],
user: HistoryUser.fromJson(json['user']),
step: json['step'] ?? Lookup.fromJson(json['step']),
fixRemotelyStartTime: json['fixRemotlyStartTime'],
fixRemotelyEndTime: json['fixRemotlyEndTime'],
fixRemotelyWorkingHours: json['fixRemotlyWorkingHours'],
comments: json['comments'] ?? "",
needAVisitDateTime: json['needAVisitDateTime'],
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
// Lookup.fromJson(json['workorderStatus'])
'workorderStatus': workOrderStatus?.toJson(),
'activityStatus': activityStatus,
'date': date,
'user': user?.toJson(),
'step': step?.toJson(),
'fixRemotelyStartTime': fixRemotelyStartTime,
'fixRemotelyEndTime': fixRemotelyEndTime,
'fixRemotelyWorkingHours': fixRemotelyWorkingHours,
'comments': comments,
'needAVisitDateTime': needAVisitDateTime,
};
}
}
// class WorkOrderStatus {
// int id;
// String name;
// int value;
//
// WorkOrderStatus({
// this.id,
// this.name,
// this.value,
// });
//
// factory WorkOrderStatus.fromJson(Map<String, dynamic> json) {
// return WorkOrderStatus(
// id: json['id'],
// name: json['name'],
// value: json['value'],
// );
// }
//
// Map<String, dynamic> toJson() {
// return {
// 'id': id,
// 'name': name,
// 'value': value,
// };
// }
// }
class HistoryUser {
String? id;
String? userName;
HistoryUser({this.id, this.userName});
factory HistoryUser.fromJson(Map<String, dynamic> json) {
return HistoryUser(id: json['id'], userName: json['userName']);
}
Map<String, dynamic> toJson() {
return {'id': id, 'userName': userName};
}
}
// class Step {
// int id;
// String name;
// int value;
//
// Step({
// this.id,
// this.name,
// this.value,
// });
//
// factory Step.fromJson(Map<String, dynamic> json) {
// return Step(
// id: json['id'],
// name: json['name'],
// value: json['value'],
// );
// }
//
// Map<String, dynamic> toJson() {
// return {
// 'id': id,
// 'name': name,
// 'value': value,
// };
// }
// }

@ -0,0 +1,751 @@
// import 'package:test_sa/models/lookup.dart';
//
// class WorkOrderDetail {
// WorkOrder? data;
// String? message;
// String? title;
// String? innerMessage;
// int? responseCode;
// bool? isSuccess;
//
// WorkOrderDetail({this.data, this.message, this.title, this.innerMessage, this.responseCode, this.isSuccess});
//
// factory WorkOrderDetail.fromJson(Map<String, dynamic> json) {
// return WorkOrderDetail(
// data: json['data'] == null ? null : WorkOrder.fromJson(json['data']),
// message: json['message'],
// title: json['title'],
// innerMessage: json['innerMessage'],
// responseCode: json['responseCode'],
// isSuccess: json['isSuccess'],
// );
// }
//
// Map<String, dynamic> toJson() {
// return {
// 'data': data?.toJson(),
// 'message': message,
// 'title': title,
// 'innerMessage': innerMessage,
// 'responseCode': responseCode,
// 'isSuccess': isSuccess,
// };
// }
// }
//
// class WorkOrder {
// String? workOrderNo;
// WorkOrderCreatedBy? workOrderCreatedBy;
// DateTime? requestedDate;
// Asset? asset;
// Lookup? assetGroup;
// Lookup? manufacturer;
// Lookup? model;
// Lookup? assetNDModel;
// Site? site;
// Lookup? building;
// Lookup? floor;
// Lookup? department;
// dynamic room;
// Lookup? assetType;
// AssignedEmployee? assignedEmployee;
// dynamic lastActivityStatus;
// Lookup? status;
// Lookup? nextStep;
// dynamic assetVerificationType;
// List<WorkOrderContactPerson>? workOrderContactPerson;
// EquipmentStatus? equipmentStatus;
// Priority? priority;
// RequestedThrough? requestedThrough;
// TypeOfRequest? typeofRequest;
// dynamic loanAvailablity;
// dynamic assetLoan;
// dynamic safety;
// ProblemDescription? problemDescription;
// String? comments;
// String? voiceNote;
// List<dynamic>? workOrderAttachments;
// dynamic returnToService;
// dynamic serviceType;
// dynamic failureReasone;
// dynamic solution;
// dynamic totalWorkingHours;
// List<WorkOrderHistory>? workOrderHistory;
// List<dynamic>? activityMaintenances;
// List<dynamic>? activitySpareParts;
// List<dynamic>? activityAssetToBeRetireds;
//
// WorkOrder({
// this.workOrderNo,
// this.workOrderCreatedBy,
// this.requestedDate,
// this.asset,
// this.assetGroup,
// this.manufacturer,
// this.model,
// this.assetNDModel,
// this.site,
// this.building,
// this.floor,
// this.department,
// this.room,
// this.assetType,
// this.assignedEmployee,
// this.lastActivityStatus,
// this.status,
// this.nextStep,
// this.assetVerificationType,
// this.workOrderContactPerson,
// this.equipmentStatus,
// this.priority,
// this.requestedThrough,
// this.typeofRequest,
// this.loanAvailablity,
// this.assetLoan,
// this.safety,
// this.problemDescription,
// this.comments,
// this.voiceNote,
// this.workOrderAttachments,
// this.returnToService,
// this.serviceType,
// this.failureReasone,
// this.solution,
// this.totalWorkingHours,
// this.workOrderHistory,
// this.activityMaintenances,
// this.activitySpareParts,
// this.activityAssetToBeRetireds,
// });
//
// factory WorkOrder.fromJson(Map<String, dynamic> json) {
// return WorkOrder(
// workOrderNo: json['workOrderNo'],
// workOrderCreatedBy: WorkOrderCreatedBy.fromJson(json['workOrderCreatedBy']),
// requestedDate: DateTime.parse(json['requestedDate']),
// asset: Asset.fromJson(json['asset']),
// assetGroup: json['assetGroup'] ?? Lookup.fromJson(json['assetGroup']),
// manufacturer: json['manufacturer'] ?? Lookup.fromJson(json['manufacturer']),
// model: json['model'] ?? Lookup.fromJson(json['model']),
// assetNDModel: json['assetNDModel'] ?? Lookup.fromJson(json['assetNDModel']),
// site: Site.fromJson(json['site']),
// building: json['building'] ?? Lookup.fromJson(json['building']),
// floor: json['floor'] ?? Lookup.fromJson(json['floor']),
// department: json['department'] ?? Lookup.fromJson(json['department']),
// room: json['room'],
// assetType: json['assetType'] ?? Lookup.fromJson(json['assetType']),
// assignedEmployee: AssignedEmployee.fromJson(json['assignedEmployee']),
// lastActivityStatus: json['lastActivityStatus'],
// status: json['status'] ?? Lookup.fromJson(json['status']),
// nextStep: json['nextStep'] ?? Lookup.fromJson(json['nextStep']),
// assetVerificationType: json['assetVerificationType'],
// workOrderContactPerson: (json['workOrderContactPerson'] as List).map((i) => WorkOrderContactPerson.fromJson(i)).toList(),
// equipmentStatus: EquipmentStatus.fromJson(json['equipmentStatus']),
// priority: Priority.fromJson(json['priority']),
// requestedThrough: RequestedThrough.fromJson(json['requestedThrough']),
// typeofRequest: TypeOfRequest.fromJson(json['typeofRequest']),
// loanAvailablity: json['loanAvailablity'],
// assetLoan: json['assetLoan'],
// safety: json['safety'],
// problemDescription: ProblemDescription.fromJson(json['problemDescription']),
// comments: json['comments'],
// voiceNote: json['voiceNote'],
// workOrderAttachments: json['workOrderAttachments'] as List,
// returnToService: json['returnToService'],
// serviceType: json['serviceType'],
// failureReasone: json['failureReasone'],
// solution: json['solution'],
// totalWorkingHours: json['totalWorkingHours'],
// workOrderHistory: (json['workOrderHistory'] as List).map((i) => WorkOrderHistory.fromJson(i)).toList(),
// activityMaintenances: json['activityMaintenances'] as List,
// activitySpareParts: json['activitySpareParts'] as List,
// activityAssetToBeRetireds: json['activityAssetToBeRetireds'] as List,
// );
// }
//
// Map<String, dynamic> toJson() {
// return {
// 'workOrderNo': workOrderNo,
// 'workOrderCreatedBy': workOrderCreatedBy?.toJson(),
// 'requestedDate': requestedDate?.toIso8601String(),
// 'asset': asset?.toJson(),
// 'assetGroup': assetGroup?.toJson(),
// 'manufacturer': manufacturer?.toJson(),
// 'model': model?.toJson(),
// 'assetNDModel': assetNDModel?.toJson(),
// 'site': site?.toJson(),
// 'building': building?.toJson(),
// 'floor': floor?.toJson(),
// 'department': department?.toJson(),
// 'room': room,
// 'assetType': assetType?.toJson(),
// 'assignedEmployee': assignedEmployee?.toJson(),
// 'lastActivityStatus': lastActivityStatus,
// 'status': status?.toJson(),
// 'nextStep': nextStep?.toJson(),
// 'assetVerificationType': assetVerificationType,
// 'workOrderContactPerson': workOrderContactPerson?.map((i) => i.toJson()).toList(),
// 'equipmentStatus': equipmentStatus?.toJson(),
// 'priority': priority?.toJson(),
// 'requestedThrough': requestedThrough?.toJson(),
// 'typeofRequest': typeofRequest?.toJson(),
// 'loanAvailablity': loanAvailablity,
// 'assetLoan': assetLoan,
// 'safety': safety,
// 'problemDescription': problemDescription?.toJson(),
// 'comments': comments,
// 'voiceNote': voiceNote,
// 'workOrderAttachments': workOrderAttachments,
// 'returnToService': returnToService,
// 'serviceType': serviceType,
// 'failureReasone': failureReasone,
// 'solution': solution,
// 'totalWorkingHours': totalWorkingHours,
// 'workOrderHistory': workOrderHistory?.map((i) => i.toJson()).toList(),
// 'activityMaintenances': activityMaintenances,
// 'activitySpareParts': activitySpareParts,
// 'activityAssetToBeRetireds': activityAssetToBeRetireds,
// };
// }
// }
//
// class WorkOrderCreatedBy {
// String? id;
// String? userName;
//
// WorkOrderCreatedBy({this.id, this.userName});
//
// factory WorkOrderCreatedBy.fromJson(Map<String, dynamic> json) {
// return WorkOrderCreatedBy(id: json['id'], userName: json['userName']);
// }
//
// Map<String, dynamic> toJson() {
// return {'id': id, 'userName': userName};
// }
// }
//
// class Asset {
// int? id;
// String? assetNumber;
//
// Asset({this.id, this.assetNumber});
//
// factory Asset.fromJson(Map<String, dynamic> json) {
// return Asset(id: json['id'], assetNumber: json['assetNumber']);
// }
//
// Map<String, dynamic> toJson() {
// return {'id': id, 'assetNumber': assetNumber};
// }
// }
//
// class WorkOrderContactPerson {
// int? id;
// String? name;
// String? employeeId;
// String? position;
// String? extension;
// String? email;
// String? mobilePhone;
// ContactUser? contactUser;
//
// WorkOrderContactPerson({this.id, this.name, this.employeeId, this.position, this.extension, this.email, this.mobilePhone, this.contactUser});
//
// factory WorkOrderContactPerson.fromJson(Map<String, dynamic> json) {
// return WorkOrderContactPerson(
// id: json['id'],
// name: json['name'],
// employeeId: json['employeeId'],
// position: json['position'],
// extension: json['extension'],
// email: json['email'],
// mobilePhone: json['mobilePhone'],
// contactUser: json['contactUser'] == null ? null : ContactUser.fromJson(json['contactUser']),
// );
// }
//
// Map<String, dynamic> toJson() {
// return {
// 'id': id,
// 'name': name,
// 'employeeId': employeeId,
// 'position': position,
// 'extension': extension,
// 'email': email,
// 'mobilePhone': mobilePhone,
// 'contactUser': contactUser?.toJson(),
// };
// }
// }
//
// class ContactUser {
// String? id;
// String? userName;
//
// ContactUser({this.id, this.userName});
//
// factory ContactUser.fromJson(Map<String, dynamic> json) {
// return ContactUser(id: json['id'], userName: json['userName']);
// }
//
// Map<String, dynamic> toJson() {
// return {'id': id, 'userName': userName};
// }
// }
//
// class AssignedEmployee {
// String? id;
// String? userName;
//
// AssignedEmployee({this.id, this.userName});
//
// factory AssignedEmployee.fromJson(Map<String, dynamic> json) {
// return AssignedEmployee(id: json['id'], userName: json['userName']);
// }
//
// Map<String, dynamic> toJson() {
// return {'id': id, 'userName': userName};
// }
// }
//
// class Site {
// int? id;
// String? siteName;
//
// Site({this.id, this.siteName});
//
// factory Site.fromJson(Map<String, dynamic> json) {
// return Site(id: json['id'], siteName: json['siteName']);
// }
//
// Map<String, dynamic> toJson() {
// return {'id': id, 'siteName': siteName};
// }
// }
//
// ///
//
// // class AssetGroup {
// // int id;
// // String name;
// //
// // AssetGroup({this.id, this.name});
// //
// // factory AssetGroup.fromJson(Map<String, dynamic> json) {
// // return AssetGroup(
// // id: json['id'],
// // name: json['name'],
// // );
// // }
// // Map<String, dynamic> toJson() {
// // return {
// // 'id': id,
// // 'name': name,
// // };
// // }
// //
// // }
// //
// // class Manufacturer {
// // int id;
// // String name;
// //
// // Manufacturer({this.id, this.name});
// //
// // factory Manufacturer.fromJson(Map<String, dynamic> json) {
// // return Manufacturer(
// // id: json['id'],
// // name: json['name'],
// // );
// // }
// // Map<String, dynamic> toJson() {
// // return {
// // 'id': id,
// // 'name': name,
// // };
// // }
// // }
// //
// // class Model {
// // int id;
// // String name;
// //
// // Model({this.id, this.name});
// //
// // factory Model.fromJson(Map<String, dynamic> json) {
// // return Model(
// // id: json['id'],
// // name: json['name'],
// // );
// // }
// // Map<String, dynamic> toJson() {
// // return {
// // 'id': id,
// // 'name': name,
// // };
// // }
// // }
// //
// // class AssetNDModel {
// // int id;
// // String name;
// //
// // AssetNDModel({this.id, this.name});
// //
// // factory AssetNDModel.fromJson(Map<String, dynamic> json) {
// // return AssetNDModel(
// // id: json['id'],
// // name: json['name'],
// // );
// // }
// // Map<String, dynamic> toJson() {
// // return {
// // 'id': id,
// // 'name': name,
// // };
// // }
// // }
// //
// // class Building {
// // int id;
// // String name;
// // int value;
// //
// // Building({this.id, this.name, this.value});
// //
// // factory Building.fromJson(Map<String, dynamic> json) {
// // return Building(
// // id: json['id'],
// // name: json['name'],
// // value: json['value'],
// // );
// // }
// // Map<String, dynamic> toJson() {
// // return {
// // 'id': id,
// // 'name': name,
// // 'value': value,
// // };
// // }
// // }
// //
// // class Floor {
// // int id;
// // String name;
// // int value;
// //
// // Floor({this.id, this.name, this.value});
// //
// // factory Floor.fromJson(Map<String, dynamic> json) {
// // return Floor(
// // id: json['id'],
// // name: json['name'],
// // value: json['value'],
// // );
// // }
// // Map<String, dynamic> toJson() {
// // return {
// // 'id': id,
// // 'name': name,
// // 'value': value,
// // };
// // }
// // }
// //
// // class Department {
// // int id;
// // String name;
// //
// // Department({this.id, this.name});
// //
// // factory Department.fromJson(Map<String, dynamic> json) {
// // return Department(
// // id: json['id'],
// // name: json['name'],
// // );
// // }
// // Map<String, dynamic> toJson() {
// // return {
// // 'id': id,
// // 'name': name,
// // };
// // }
// // }
// //
// // class AssetType {
// // int id;
// // String name;
// // int value;
// //
// // AssetType({this.id, this.name, this.value});
// //
// // factory AssetType.fromJson(Map<String, dynamic> json) {
// // return AssetType(
// // id: json['id'],
// // name: json['name'],
// // value: json['value'],
// // );
// // }
// // Map<String, dynamic> toJson() {
// // return {
// // 'id': id,
// // 'name': name,
// // 'value': value,
// // };
// // }
// // }
// //
// // class Status {
// // int id;
// // String name;
// // int value;
// //
// // Status({this.id, this.name, this.value});
// //
// // factory Status.fromJson(Map<String, dynamic> json) {
// // return Status(
// // id: json['id'],
// // name: json['name'],
// // value: json['value'],
// // );
// // }
// // Map<String, dynamic> toJson() {
// // return {
// // 'id': id,
// // 'name': name,
// // 'value': value,
// // };
// // }
// // }
// //
// // class NextStep {
// // int id;
// // String name;
// // int value;
// //
// // NextStep({this.id, this.name, this.value});
// //
// // factory NextStep.fromJson(Map<String, dynamic> json) {
// // return NextStep(
// // id: json['id'],
// // name: json['name'],
// // value: json['value'],
// // );
// // }
// // Map<String, dynamic> toJson() {
// // return {
// // 'id': id,
// // 'name': name,
// // 'value': value,
// // };
// // }
// // }
//
// class EquipmentStatus {
// int? id;
// String? name;
// int? value;
//
// EquipmentStatus({this.id, this.name, this.value});
//
// factory EquipmentStatus.fromJson(Map<String, dynamic> json) {
// return EquipmentStatus(id: json['id'], name: json['name'], value: json['value']);
// }
//
// Map<String, dynamic> toJson() {
// return {'id': id, 'name': name, 'value': value};
// }
// }
//
// class Priority {
// int? id;
// String? name;
// int? value;
//
// Priority({this.id, this.name, this.value});
//
// factory Priority.fromJson(Map<String, dynamic> json) {
// return Priority(id: json['id'], name: json['name'], value: json['value']);
// }
//
// Map<String, dynamic> toJson() {
// return {'id': id, 'name': name, 'value': value};
// }
// }
//
// class RequestedThrough {
// int? id;
// String? name;
//
// RequestedThrough({this.id, this.name});
//
// factory RequestedThrough.fromJson(Map<String, dynamic> json) {
// return RequestedThrough(id: json['id'], name: json['name']);
// }
//
// Map<String, dynamic> toJson() {
// return {'id': id, 'name': name};
// }
// }
//
// class TypeOfRequest {
// int? id;
// String? name;
//
// TypeOfRequest({this.id, this.name});
//
// factory TypeOfRequest.fromJson(Map<String, dynamic> json) {
// return TypeOfRequest(id: json['id'], name: json['name']);
// }
//
// Map<String, dynamic> toJson() {
// return {'id': id, 'name': name};
// }
// }
//
// class ProblemDescription {
// int? id;
// String? name;
//
// ProblemDescription({this.id, this.name});
//
// factory ProblemDescription.fromJson(Map<String, dynamic> json) {
// return ProblemDescription(id: json['id'], name: json['name']);
// }
//
// Map<String, dynamic> toJson() {
// return {'id': id, 'name': name};
// }
// }
//
// class WorkOrderHistory {
// int? id;
// Lookup? workOrderStatus;
// dynamic activityStatus; // Since activityStatus is null, it's dynamic
// String? date;
// HistoryUser? user;
// Lookup? step;
// dynamic fixRemotelyStartTime; // Since it's null, it's dynamic
// dynamic fixRemotelyEndTime; // Since it's null, it's dynamic
// dynamic fixRemotelyWorkingHours; // Since it's null, it's dynamic
// String? comments;
// dynamic needAVisitDateTime; // Since it's null, it's dynamic
//
// WorkOrderHistory(
// {this.id,
// this.workOrderStatus,
// this.activityStatus,
// this.date,
// this.user,
// this.step,
// this.fixRemotelyStartTime,
// this.fixRemotelyEndTime,
// this.fixRemotelyWorkingHours,
// this.comments,
// this.needAVisitDateTime});
//
// factory WorkOrderHistory.fromJson(Map<String, dynamic> json) {
// return WorkOrderHistory(
// id: json['id'],
// //json['assetType'] != null ? Lookup.fromJson(json['assetType']) : null;
// workOrderStatus: json['workorderStatus'] ?? Lookup.fromJson(json['workorderStatus']),
// activityStatus: json['activityStatus'],
// date: json['date'],
// user: HistoryUser.fromJson(json['user']),
// step: json['step'] ?? Lookup.fromJson(json['step']),
// fixRemotelyStartTime: json['fixRemotlyStartTime'],
// fixRemotelyEndTime: json['fixRemotlyEndTime'],
// fixRemotelyWorkingHours: json['fixRemotlyWorkingHours'],
// comments: json['comments'] ?? "",
// needAVisitDateTime: json['needAVisitDateTime'],
// );
// }
//
// Map<String, dynamic> toJson() {
// return {
// 'id': id,
// // Lookup.fromJson(json['workorderStatus'])
// 'workorderStatus': workOrderStatus?.toJson(),
// 'activityStatus': activityStatus,
// 'date': date,
// 'user': user?.toJson(),
// 'step': step?.toJson(),
// 'fixRemotelyStartTime': fixRemotelyStartTime,
// 'fixRemotelyEndTime': fixRemotelyEndTime,
// 'fixRemotelyWorkingHours': fixRemotelyWorkingHours,
// 'comments': comments,
// 'needAVisitDateTime': needAVisitDateTime,
// };
// }
// }
//
// // class WorkOrderStatus {
// // int id;
// // String name;
// // int value;
// //
// // WorkOrderStatus({
// // this.id,
// // this.name,
// // this.value,
// // });
// //
// // factory WorkOrderStatus.fromJson(Map<String, dynamic> json) {
// // return WorkOrderStatus(
// // id: json['id'],
// // name: json['name'],
// // value: json['value'],
// // );
// // }
// //
// // Map<String, dynamic> toJson() {
// // return {
// // 'id': id,
// // 'name': name,
// // 'value': value,
// // };
// // }
// // }
//
// class HistoryUser {
// String? id;
// String? userName;
//
// HistoryUser({this.id, this.userName});
//
// factory HistoryUser.fromJson(Map<String, dynamic> json) {
// return HistoryUser(id: json['id'], userName: json['userName']);
// }
//
// Map<String, dynamic> toJson() {
// return {'id': id, 'userName': userName};
// }
// }
//
// // class Step {
// // int id;
// // String name;
// // int value;
// //
// // Step({
// // this.id,
// // this.name,
// // this.value,
// // });
// //
// // factory Step.fromJson(Map<String, dynamic> json) {
// // return Step(
// // id: json['id'],
// // name: json['name'],
// // value: json['value'],
// // );
// // }
// //
// // Map<String, dynamic> toJson() {
// // return {
// // 'id': id,
// // 'name': name,
// // 'value': value,
// // };
// // }
// // }

@ -0,0 +1,417 @@
import 'package:test_sa/models/lookup.dart';
class WorkOrderDetail {
WorkOrderDetail({
required this.data,
required this.message,
required this.title,
required this.innerMessage,
required this.responseCode,
required this.isSuccess,
});
final WorkOrderData? data;
final String? message;
final dynamic title;
final dynamic innerMessage;
final int? responseCode;
final bool? isSuccess;
factory WorkOrderDetail.fromJson(Map<String, dynamic> json) {
return WorkOrderDetail(
data: json["data"] == null ? null : WorkOrderData.fromJson(json["data"]),
message: json["message"],
title: json["title"],
innerMessage: json["innerMessage"],
responseCode: json["responseCode"],
isSuccess: json["isSuccess"],
);
}
Map<String, dynamic> toJson() =>
{
"data": data?.toJson(),
"message": message,
"title": title,
"innerMessage": innerMessage,
"responseCode": responseCode,
"isSuccess": isSuccess,
};
}
class WorkOrderData {
WorkOrderData({
required this.workOrderNo,
required this.workOrderCreatedBy,
required this.requestedDate,
required this.asset,
required this.assetGroup,
required this.manufacturer,
required this.model,
required this.assetNdModel,
required this.site,
required this.building,
required this.floor,
required this.department,
required this.room,
required this.assetType,
required this.assignedEmployee,
required this.lastActivityStatus,
required this.status,
required this.nextStep,
required this.assetVerificationType,
required this.workOrderContactPerson,
required this.equipmentStatus,
required this.priority,
required this.requestedThrough,
required this.typeofRequest,
required this.loanAvailablity,
required this.assetLoan,
required this.safety,
required this.problemDescription,
required this.comments,
required this.voiceNote,
required this.workOrderAttachments,
required this.returnToService,
required this.serviceType,
required this.failureReasone,
required this.solution,
required this.totalWorkingHours,
required this.workOrderHistory,
required this.activities,
required this.activityAssetToBeRetireds,
});
final String? workOrderNo;
final AssignedEmployee? workOrderCreatedBy;
final DateTime? requestedDate;
final Asset? asset;
final Lookup? assetGroup;
final Lookup? manufacturer;
final Lookup? model;
final Lookup? assetNdModel;
final Site? site;
final Lookup? building;
final Lookup? floor;
final AssetGroup? department;
final int? room;
final Lookup? assetType;
final AssignedEmployee? assignedEmployee;
final String? lastActivityStatus;
final Lookup? status;
final Lookup? nextStep;
final int? assetVerificationType;
final List<WorkOrderContactPerson> workOrderContactPerson;
final Lookup? equipmentStatus;
final Lookup? priority;
final Lookup? requestedThrough;
final Lookup? typeofRequest;
final Lookup? loanAvailablity;
final Lookup? assetLoan;
final Lookup? safety;
final Lookup? problemDescription;
final String? comments;
final String? voiceNote;
final List<String> workOrderAttachments;
final String? returnToService;
final Lookup? serviceType;
final Lookup? failureReasone;
final Lookup? solution;
final String? totalWorkingHours;
final List<WorkOrderHistory> workOrderHistory;
final List<dynamic> activities;
final List<dynamic> activityAssetToBeRetireds;
factory WorkOrderData.fromJson(Map<String, dynamic> json) {
return WorkOrderData(
workOrderNo: json["workOrderNo"],
workOrderCreatedBy: json["workOrderCreatedBy"] == null ? null : AssignedEmployee.fromJson(json["workOrderCreatedBy"]),
requestedDate: DateTime.tryParse(json["requestedDate"] ?? ""),
asset: json["asset"] == null ? null : Asset.fromJson(json["asset"]),
assetGroup: json["assetGroup"] == null ? null : Lookup.fromJson(json["assetGroup"]),
manufacturer: json["manufacturer"] == null ? null : Lookup.fromJson(json["manufacturer"]),
model: json["model"] == null ? null : Lookup.fromJson(json["model"]),
assetNdModel: json["assetNDModel"] == null ? null : Lookup.fromJson(json["assetNDModel"]),
site: json["site"] == null ? null : Site.fromJson(json["site"]),
building: json["building"] == null ? null : Lookup.fromJson(json["building"]),
floor: json["floor"] == null ? null : Lookup.fromJson(json["floor"]),
department: json["department"] == null ? null : AssetGroup.fromJson(json["department"]),
room: json["room"],
assetType: json["assetType"] == null ? null : Lookup.fromJson(json["assetType"]),
assignedEmployee: json["assignedEmployee"] == null ? null : AssignedEmployee.fromJson(json["assignedEmployee"]),
lastActivityStatus: json["lastActivityStatus"],
status: json["status"] == null ? null : Lookup.fromJson(json["status"]),
nextStep: json["nextStep"] == null ? null : Lookup.fromJson(json["nextStep"]),
assetVerificationType: json["assetVerificationType"],
workOrderContactPerson: json["workOrderContactPerson"] == null ? [] : List<WorkOrderContactPerson>.from(json["workOrderContactPerson"]!.map((x) => WorkOrderContactPerson.fromJson(x))),
equipmentStatus: json["equipmentStatus"] == null ? null : Lookup.fromJson(json["equipmentStatus"]),
priority: json["priority"] == null ? null : Lookup.fromJson(json["priority"]),
requestedThrough: json["requestedThrough"] == null ? null : Lookup.fromJson(json["requestedThrough"]),
typeofRequest: json["typeofRequest"] == null ? null : Lookup.fromJson(json["typeofRequest"]),
loanAvailablity: json["loanAvailablity"] == null ? null : Lookup.fromJson(json["loanAvailablity"]),
assetLoan: json["assetLoan"] == null ? null : Lookup.fromJson(json["assetLoan"]),
safety: json["safety"] == null ? null : Lookup.fromJson(json["safety"]),
problemDescription: json["problemDescription"] == null ? null : Lookup.fromJson(json["problemDescription"]),
comments: json["comments"],
voiceNote: json["voiceNote"],
workOrderAttachments: json["workOrderAttachments"] == null ? [] : List<String>.from(json["workOrderAttachments"]!.map((x) => x)),
returnToService: json["returnToService"],
serviceType: json["serviceType"] == null ? null : Lookup.fromJson(json["serviceType"]),
failureReasone: json["failureReasone"] == null ? null : Lookup.fromJson(json["failureReasone"]),
solution: json["solution"] == null ? null : Lookup.fromJson(json["solution"]),
totalWorkingHours: json["totalWorkingHours"],
workOrderHistory: json["workOrderHistory"] == null ? [] : List<WorkOrderHistory>.from(json["workOrderHistory"]!.map((x) => WorkOrderHistory.fromJson(x))),
activities: json["activities"] == null ? [] : List<dynamic>.from(json["activities"]!.map((x) => x)),
activityAssetToBeRetireds: json["activityAssetToBeRetireds"] == null ? [] : List<dynamic>.from(json["activityAssetToBeRetireds"]!.map((x) => x)),
);
}
Map<String, dynamic> toJson() =>
{
"workOrderNo": workOrderNo,
"workOrderCreatedBy": workOrderCreatedBy?.toJson(),
"requestedDate": requestedDate?.toIso8601String(),
"asset": asset?.toJson(),
"assetGroup": assetGroup?.toJson(),
"manufacturer": manufacturer?.toJson(),
"model": model?.toJson(),
"assetNDModel": assetNdModel?.toJson(),
"site": site?.toJson(),
"building": building?.toJson(),
"floor": floor?.toJson(),
"department": department?.toJson(),
"room": room,
"assetType": assetType?.toJson(),
"assignedEmployee": assignedEmployee?.toJson(),
"lastActivityStatus": lastActivityStatus,
"status": status?.toJson(),
"nextStep": nextStep?.toJson(),
"assetVerificationType": assetVerificationType,
"workOrderContactPerson": workOrderContactPerson.map((x) => x?.toJson()).toList(),
"equipmentStatus": equipmentStatus?.toJson(),
"priority": priority?.toJson(),
"requestedThrough": requestedThrough?.toJson(),
"typeofRequest": typeofRequest?.toJson(),
"loanAvailablity": loanAvailablity?.toJson(),
"assetLoan": assetLoan?.toJson(),
"safety": safety?.toJson(),
"problemDescription": problemDescription?.toJson(),
"comments": comments,
"voiceNote": voiceNote,
"workOrderAttachments": workOrderAttachments.map((x) => x).toList(),
"returnToService": returnToService,
"serviceType": serviceType?.toJson(),
"failureReasone": failureReasone?.toJson(),
"solution": solution?.toJson(),
"totalWorkingHours": totalWorkingHours,
"workOrderHistory": workOrderHistory.map((x) => x?.toJson()).toList(),
"activities": activities.map((x) => x).toList(),
"activityAssetToBeRetireds": activityAssetToBeRetireds.map((x) => x).toList(),
};
}
class Asset {
Asset({
required this.id,
required this.assetNumber,
});
final int? id;
final String? assetNumber;
factory Asset.fromJson(Map<String, dynamic> json) {
return Asset(
id: json["id"],
assetNumber: json["assetNumber"],
);
}
Map<String, dynamic> toJson() =>
{
"id": id,
"assetNumber": assetNumber,
};
}
class AssetGroup {
AssetGroup({
required this.id,
required this.name,
});
final int? id;
final String? name;
factory AssetGroup.fromJson(Map<String, dynamic> json) {
return AssetGroup(
id: json["id"],
name: json["name"],
);
}
Map<String, dynamic> toJson() =>
{
"id": id,
"name": name,
};
}
class AssignedEmployee {
AssignedEmployee({
required this.userId,
required this.userName,
required this.email,
required this.languageId,
});
final dynamic userId;
final String? userName;
final String? email;
final int? languageId;
factory AssignedEmployee.fromJson(Map<String, dynamic> json) {
return AssignedEmployee(
userId: json["userId"],
userName: json["userName"],
email: json["email"],
languageId: json["languageId"],
);
}
Map<String, dynamic> toJson() =>
{
"userId": userId,
"userName": userName,
"email": email,
"languageId": languageId,
};
}
class Site {
Site({
required this.id,
required this.siteName,
});
final int? id;
final String? siteName;
factory Site.fromJson(Map<String, dynamic> json) {
return Site(
id: json["id"],
siteName: json["siteName"],
);
}
Map<String, dynamic> toJson() =>
{
"id": id,
"siteName": siteName,
};
}
class WorkOrderContactPerson {
WorkOrderContactPerson({
required this.id,
required this.name,
required this.employeeId,
required this.position,
required this.extension,
required this.email,
required this.mobilePhone,
required this.contactUser,
});
final int? id;
final String? name;
final String? employeeId;
final String? position;
final dynamic extension;
final String? email;
final dynamic mobilePhone;
final AssignedEmployee? contactUser;
factory WorkOrderContactPerson.fromJson(Map<String, dynamic> json) {
return WorkOrderContactPerson(
id: json["id"],
name: json["name"],
employeeId: json["employeeId"],
position: json["position"],
extension: json["extension"],
email: json["email"],
mobilePhone: json["mobilePhone"],
contactUser: json["contactUser"] == null ? null : AssignedEmployee.fromJson(json["contactUser"]),
);
}
Map<String, dynamic> toJson() =>
{
"id": id,
"name": name,
"employeeId": employeeId,
"position": position,
"extension": extension,
"email": email,
"mobilePhone": mobilePhone,
"contactUser": contactUser?.toJson(),
};
}
class WorkOrderHistory {
WorkOrderHistory({
required this.id,
required this.workorderStatus,
required this.activityStatus,
required this.date,
required this.user,
required this.step,
required this.fixRemotlyStartTime,
required this.fixRemotlyEndTime,
required this.fixRemotlyWorkingHours,
required this.comments,
required this.needAVisitDateTime,
});
final int? id;
final Lookup? workorderStatus;
final dynamic activityStatus;
final DateTime? date;
final AssignedEmployee? user;
final Lookup? step;
final DateTime? fixRemotlyStartTime;
final DateTime? fixRemotlyEndTime;
final num? fixRemotlyWorkingHours;
final String? comments;
final DateTime? needAVisitDateTime;
factory WorkOrderHistory.fromJson(Map<String, dynamic> json) {
return WorkOrderHistory(
id: json["id"],
workorderStatus: json["workorderStatus"] == null ? null : Lookup.fromJson(json["workorderStatus"]),
activityStatus: json["activityStatus"],
date: DateTime.tryParse(json["date"] ?? ""),
user: json["user"] == null ? null : AssignedEmployee.fromJson(json["user"]),
step: json["step"] == null ? null : Lookup.fromJson(json["step"]),
fixRemotlyStartTime: DateTime.tryParse(json["fixRemotlyStartTime"] ?? ""),
fixRemotlyEndTime: DateTime.tryParse(json["fixRemotlyEndTime"] ?? ""),
fixRemotlyWorkingHours: json["fixRemotlyWorkingHours"],
comments: json["comments"],
needAVisitDateTime: DateTime.tryParse(json["needAVisitDateTime"] ?? ""),
);
}
Map<String, dynamic> toJson() =>
{
"id": id,
"workorderStatus": workorderStatus?.toJson(),
"activityStatus": activityStatus,
"date": date?.toIso8601String(),
"user": user?.toJson(),
"step": step?.toJson(),
"fixRemotlyStartTime": fixRemotlyStartTime?.toIso8601String(),
"fixRemotlyEndTime": fixRemotlyEndTime?.toIso8601String(),
"fixRemotlyWorkingHours": fixRemotlyWorkingHours,
"comments": comments,
"needAVisitDateTime": needAVisitDateTime?.toIso8601String(),
};
}

@ -42,10 +42,11 @@ class AppColor {
static const Color white50 = Color(0xffECECEC);
static const Color white60 = Color(0xffEFEFEF);
static const Color white70 = Color(0xffF1F1F1);
static const Color white936 = Color(0xff212936);
//black
static const Color black10 = Color(0xff3B3D4A);
static const Color black20 = Color(0xff212936);
static const Color black35 = Color(0xff222A36);
//red
static const Color red30 = Color(0xffF63939);
@ -60,6 +61,7 @@ class AppColor {
static const Color green60 = Color(0xff065E38);
static const Color green70 = Color(0xff54C166);
//orange
static const Color orange30 = Color(0xffFDE19B);
static const Color orange40 = Color(0xffFFEDBC);
@ -68,10 +70,10 @@ class AppColor {
static const Color orange70 = Color(0xffFFC945);
// static Color greenStatus(BuildContext context) => context.isDark ? const Color(0xff1FA269) : green50;
static Color greenStatus(BuildContext context) => context.isDark ? const Color(0xff54C166) : green50;
static Color greenStatus(BuildContext context) => context.isDark ? const Color(0xff54C166) : green70;
// 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 : primary90;
static Color redStatus(BuildContext context) => context.isDark ? const Color(0xffFFB6B8) : red30;

@ -3,14 +3,14 @@ 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 int 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
this.color = AppColor.red30, // Default color is red
}) : super(key: key);
@override
@ -19,23 +19,19 @@ class CustomBadge extends StatelessWidget {
clipBehavior: Clip.none, // Allows the badge to overflow its container.
children: [
child, // The main widget
if (value > 0)
Positioned(
right: -6,
top: -6,
child: Container(
padding: const EdgeInsets.all(6),
decoration: BoxDecoration(
color: color,
shape: BoxShape.circle, // Makes the badge circular
),
height: 23,
constraints: const BoxConstraints(minWidth: 23),
padding: const EdgeInsets.all(3),
alignment: Alignment.center,
decoration: BoxDecoration(color: color, borderRadius: BorderRadius.circular(30)),
child: Text(
value,
style: const TextStyle(
color: AppColor.white10,
fontFamily: 'Poppins',
fontSize: 10,
fontWeight: FontWeight.w700,
),
value.toString(),
style: const TextStyle(color: AppColor.white10, fontFamily: 'Poppins', fontSize: 10, fontWeight: FontWeight.w700),
),
),
),

@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/custom_badge.dart';
@ -10,66 +11,34 @@ class TabButton extends StatelessWidget {
final bool loading;
final VoidCallback onPressed;
const TabButton({
Key? key,
required this.label,
this.isSelected = false,
required this.count,
this.loading = false,
required this.onPressed,
}) : super(key: key);
const TabButton({Key? key, required this.label, this.isSelected = false, required this.count, this.loading = false, required this.onPressed}) : super(key: key);
@override
Widget build(BuildContext context) {
return InkWell(
onTap: onPressed,
child: count > 0 && isSelected && !loading
? CustomBadge(
value: count.toString(),
child: CustomBadge(
value: loading
? 0
: !isSelected
? 0
: count,
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(7),
color: isSelected ? AppColor.primary10 : AppColor.white30,
border: !isSelected ? Border.all(color: Colors.white54, width: 1) : null,
border: !isSelected ? Border.all(color: AppColor.white936.withOpacity(.03), width: 1) : null,
),
child: Center(
alignment: Alignment.center,
child: Text(
label,
style: AppTextStyles.bodyText.copyWith(
color: isSelected ? Colors.white : Colors.black,
style: AppTextStyles.bodyText2.copyWith(
color: isSelected ? Colors.white : AppColor.black35,
),
)),
))
: Container(
padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 8),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(7),
color: isSelected ? AppColor.primary10 : AppColor.white30,
border: !isSelected ? Border.all(color: AppColor.white30, width: 1) : null,
),
child: Center(
child: Text(
label,
style: AppTextStyles.bodyText.copyWith(
color: isSelected ? Colors.white : Colors.black,
),
)),
),
);
).toShimmer(isShow: loading && isSelected, radius: 7);
}
}
class TabButtonData {
final String label;
final bool isSelected;
final int totalCount;
final VoidCallback onPressed;
TabButtonData({
required this.label,
required this.isSelected,
required this.totalCount,
required this.onPressed,
});
}

@ -1,87 +1,87 @@
import 'package:flutter/material.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/pages/land_page/calender_fragments/daily_fragment.dart';
import 'package:test_sa/new_views/pages/land_page/calender_fragments/weekly_fragment.dart';
import 'calender_fragments/monthly_fragment.dart';
class CalendarPage extends StatefulWidget {
const CalendarPage({Key? key}) : super(key: key);
@override
State<CalendarPage> createState() => _CalendarPageState();
}
class _CalendarPageState extends State<CalendarPage> with SingleTickerProviderStateMixin {
late TabController _tabController;
@override
void initState() {
super.initState();
_tabController = TabController(length: 3, vsync: this)
..addListener(() {
setState(() {});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// todo @sikander, hiding My shift view, later when they add data, then will us it.
// SizedBox(
// width: double.infinity,
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// context.translation.myShift.heading5(context),
// 8.height,
// context.translation.sunToThurs.bodyText(context),
// "09:00 to 18:00".bodyText(context).custom(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50),
// ],
// ).toShadowContainer(context),
// ).paddingOnly(start: 16, end: 16),
16.height,
Container(
margin: const EdgeInsets.only(left: 16, right: 16),
decoration: BoxDecoration(color: context.isDark ? AppColor.neutral50 : AppColor.neutral30, borderRadius: BorderRadius.circular(16)),
child: TabBar(
controller: _tabController,
padding: EdgeInsets.zero,
labelColor: context.isDark ? AppColor.neutral30 : AppColor.neutral60,
unselectedLabelColor: context.isDark ? AppColor.neutral10 : AppColor.neutral20,
unselectedLabelStyle: AppTextStyles.bodyText,
labelStyle: AppTextStyles.bodyText,
indicatorPadding: const EdgeInsets.all(4),
indicator: BoxDecoration(color: context.isDark ? AppColor.neutral60 : Theme.of(context).cardColor, borderRadius: BorderRadius.circular(13)),
tabs: [
Tab(text: context.translation.monthly, height: 57.toScreenHeight),
Tab(text: context.translation.weekly, height: 57.toScreenHeight),
Tab(text: context.translation.daily, height: 57.toScreenHeight),
],
),
),
8.height,
TabBarView(
//physics: const NeverScrollableScrollPhysics(),
controller: _tabController,
children: const [
MonthlyFragment(),
WeeklyFragment(),
DailyFragment(),
],
).expanded,
],
),
),
);
}
}
// import 'package:flutter/material.dart';
// import 'package:test_sa/extensions/context_extension.dart';
// import 'package:test_sa/extensions/int_extensions.dart';
// import 'package:test_sa/extensions/text_extensions.dart';
// import 'package:test_sa/extensions/widget_extensions.dart';
// import 'package:test_sa/new_views/app_style/app_color.dart';
// import 'package:test_sa/new_views/pages/land_page/calender_fragments/daily_fragment.dart';
// import 'package:test_sa/new_views/pages/land_page/calender_fragments/weekly_fragment.dart';
//
// import 'calender_fragments/monthly_fragment.dart';
// todo delete
// class CalendarPage extends StatefulWidget {
// const CalendarPage({Key? key}) : super(key: key);
//
// @override
// State<CalendarPage> createState() => _CalendarPageState();
// }
//
// class _CalendarPageState extends State<CalendarPage> with SingleTickerProviderStateMixin {
// late TabController _tabController;
//
// @override
// void initState() {
// super.initState();
// _tabController = TabController(length: 3, vsync: this)
// ..addListener(() {
// setState(() {});
// });
// }
//
// @override
// Widget build(BuildContext context) {
// return Scaffold(
// body: SafeArea(
// child: Column(
// mainAxisSize: MainAxisSize.min,
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// // todo @sikander, hiding My shift view, later when they add data, then will us it.
// // SizedBox(
// // width: double.infinity,
// // child: Column(
// // crossAxisAlignment: CrossAxisAlignment.start,
// // children: [
// // context.translation.myShift.heading5(context),
// // 8.height,
// // context.translation.sunToThurs.bodyText(context),
// // "09:00 to 18:00".bodyText(context).custom(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50),
// // ],
// // ).toShadowContainer(context),
// // ).paddingOnly(start: 16, end: 16),
// 16.height,
// Container(
// margin: const EdgeInsets.only(left: 16, right: 16),
// decoration: BoxDecoration(color: context.isDark ? AppColor.neutral50 : AppColor.neutral30, borderRadius: BorderRadius.circular(16)),
// child: TabBar(
// controller: _tabController,
// padding: EdgeInsets.zero,
// labelColor: context.isDark ? AppColor.neutral30 : AppColor.neutral60,
// unselectedLabelColor: context.isDark ? AppColor.neutral10 : AppColor.neutral20,
// unselectedLabelStyle: AppTextStyles.bodyText,
// labelStyle: AppTextStyles.bodyText,
// indicatorPadding: const EdgeInsets.all(4),
// indicator: BoxDecoration(color: context.isDark ? AppColor.neutral60 : Theme.of(context).cardColor, borderRadius: BorderRadius.circular(13)),
// tabs: [
// Tab(text: context.translation.monthly, height: 57.toScreenHeight),
// Tab(text: context.translation.weekly, height: 57.toScreenHeight),
// Tab(text: context.translation.daily, height: 57.toScreenHeight),
// ],
// ),
// ),
// 8.height,
// TabBarView(
// //physics: const NeverScrollableScrollPhysics(),
// controller: _tabController,
// children: const [
// MonthlyFragment(),
// WeeklyFragment(),
// DailyFragment(),
// ],
// ).expanded,
// ],
// ),
// ),
// );
// }
// }

@ -1,82 +1,82 @@
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:provider/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 '../../../../controllers/providers/api/all_requests_provider.dart';
import '../../../app_style/app_color.dart';
import '../requests/asset_item_view.dart';
import '../requests/gas_refill_item_view.dart';
import '../requests/ppm_item_view.dart';
import '../requests/service_request_item_view.dart';
class DailyFragment extends StatefulWidget {
const DailyFragment({Key? key}) : super(key: key);
@override
_DailyFragmentState createState() {
return _DailyFragmentState();
}
}
class _DailyFragmentState extends State<DailyFragment> {
@override
void initState() {
super.initState();
Provider.of<AllRequestsProvider>(context, listen: false).getCalendarRequests(from: DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day));
}
@override
Widget build(BuildContext context) {
return SingleChildScrollView(
padding: const EdgeInsets.only(left: 16, right: 16),
child: Consumer<AllRequestsProvider>(builder: (context, snapshot, _) {
return Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
DateFormat("EEEE, d MMMM, yyyy", context.isAr ? "ar" : "en").format(DateTime.now()).heading5(context),
const Divider().defaultStyle(context),
if (snapshot.calendarRequests?.requestsDetails?.isEmpty ?? true)
Center(
child: context.translation.noDataFound.heading5(context).custom(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50),
).paddingOnly(top: 16, bottom: 16),
ListView.separated(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (cxt, index) {
final list = snapshot.calendarRequests!.requestsDetails!;
if (snapshot.isCalendarLoading) return const SizedBox().toRequestShimmer(cxt, snapshot.isCalendarLoading);
bool isServiceRequest = list[index].nameOfType == "ServiceRequest";
bool isGasRefill = list[index].nameOfType == "GasRefill";
bool isAssetTransfer = list[index].nameOfType == "AssetTransfer";
bool isPPMs = list[index].nameOfType == "PPMs";
return isServiceRequest
? ServiceRequestItemView(list[index])
: isGasRefill
? GasRefillItemView(list[index])
: isPPMs
? PpmItemView(list[index])
: isAssetTransfer
? AssetItemView(list[index])
: Container(
height: 100,
width: double.infinity,
color: Colors.grey,
);
},
separatorBuilder: (cxt, index) => 8.height,
itemCount: snapshot.isCalendarLoading ? 6 : snapshot.calendarRequests!.requestsDetails!.length,
),
],
).toShadowContainer(context);
}),
);
}
BoxDecoration cellDecoration({Color? color}) => BoxDecoration(color: color ?? Colors.transparent, shape: BoxShape.circle);
}
// import 'package:flutter/material.dart';
// import 'package:intl/intl.dart';
// import 'package:provider/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 '../../../../controllers/providers/api/all_requests_provider.dart';
// import '../../../app_style/app_color.dart';
// import '../requests/asset_item_view.dart';
// import '../requests/gas_refill_item_view.dart';
// import '../requests/ppm_item_view.dart';
// import '../requests/service_request_item_view.dart';
// todo delete
// class DailyFragment extends StatefulWidget {
// const DailyFragment({Key? key}) : super(key: key);
//
// @override
// _DailyFragmentState createState() {
// return _DailyFragmentState();
// }
// }
//
// class _DailyFragmentState extends State<DailyFragment> {
// @override
// void initState() {
// super.initState();
// Provider.of<AllRequestsProvider>(context, listen: false).getCalendarRequests(from: DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day));
// }
//
// @override
// Widget build(BuildContext context) {
// return SingleChildScrollView(
// padding: const EdgeInsets.only(left: 16, right: 16),
// child: Consumer<AllRequestsProvider>(builder: (context, snapshot, _) {
// return Column(
// mainAxisSize: MainAxisSize.min,
// crossAxisAlignment: CrossAxisAlignment.stretch,
// children: [
// DateFormat("EEEE, d MMMM, yyyy", context.isAr ? "ar" : "en").format(DateTime.now()).heading5(context),
// const Divider().defaultStyle(context),
// if (snapshot.calendarRequests?.requestsDetails?.isEmpty ?? true)
// Center(
// child: context.translation.noDataFound.heading5(context).custom(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50),
// ).paddingOnly(top: 16, bottom: 16),
// ListView.separated(
// shrinkWrap: true,
// physics: const NeverScrollableScrollPhysics(),
// itemBuilder: (cxt, index) {
// final list = snapshot.calendarRequests!.requestsDetails!;
// if (snapshot.isCalendarLoading) return const SizedBox().toRequestShimmer(cxt, snapshot.isCalendarLoading);
// bool isServiceRequest = list[index].nameOfType == "ServiceRequest";
// bool isGasRefill = list[index].nameOfType == "GasRefill";
// bool isAssetTransfer = list[index].nameOfType == "AssetTransfer";
// bool isPPMs = list[index].nameOfType == "PPMs";
//
// return isServiceRequest
// ? ServiceRequestItemView(list[index])
// : isGasRefill
// ? GasRefillItemView(list[index])
// : isPPMs
// ? PpmItemView(list[index])
// : isAssetTransfer
// ? AssetItemView(list[index])
// : Container(
// height: 100,
// width: double.infinity,
// color: Colors.grey,
// );
// },
// separatorBuilder: (cxt, index) => 8.height,
// itemCount: snapshot.isCalendarLoading ? 6 : snapshot.calendarRequests!.requestsDetails!.length,
// ),
// ],
// ).toShadowContainer(context);
// }),
// );
// }
//
// BoxDecoration cellDecoration({Color? color}) => BoxDecoration(color: color ?? Colors.transparent, shape: BoxShape.circle);
// }

@ -1,143 +1,143 @@
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
import 'package:table_calendar/table_calendar.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import '../../../../controllers/providers/api/all_requests_provider.dart';
import '../requests/asset_item_view.dart';
import '../requests/gas_refill_item_view.dart';
import '../requests/ppm_item_view.dart';
import '../requests/service_request_item_view.dart';
import 'calender_days_card.dart';
class WeeklyFragment extends StatefulWidget {
const WeeklyFragment({Key? key}) : super(key: key);
@override
_WeeklyFragmentState createState() {
return _WeeklyFragmentState();
}
}
class _WeeklyFragmentState extends State<WeeklyFragment> {
late DateTime _initialDate, _firstDate, _lastDate;
@override
void initState() {
super.initState();
_initialDate = DateTime.now();
_firstDate = DateTime.utc(2010, 10, 16);
_lastDate = DateTime.utc(2030, 3, 14);
Provider.of<AllRequestsProvider>(context, listen: false)
.getCalendarRequests(from: DateTime.now().subtract(Duration(days: DateTime.now().weekday)), to: DateTime.now().add(Duration(days: DateTime.daysPerWeek - DateTime.now().weekday - 1)));
}
@override
Widget build(BuildContext context) {
return SingleChildScrollView(
padding: const EdgeInsets.only(left: 16, right: 16),
child: Consumer<AllRequestsProvider>(builder: (context, snapshot, _) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
TableCalendar(
firstDay: _firstDate,
lastDay: _lastDate,
focusedDay: _initialDate,
calendarFormat: CalendarFormat.week,
weekendDays: const [],
onCalendarCreated: (controller) {},
onPageChanged: (date) {
if (!snapshot.isCalendarLoading) {
_initialDate = date;
Provider.of<AllRequestsProvider>(context, listen: false)
.getCalendarRequests(from: date.subtract(Duration(days: date.weekday)), to: date.add(Duration(days: DateTime.daysPerWeek - date.weekday - 1)));
}
},
calendarBuilders: CalendarBuilders(
headerTitleBuilder: (context, dateTime) => Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
DateFormat("EEEE, d MMMM, yyyy", context.isAr ? "ar" : "en").format(dateTime).heading5(context),
8.height,
const Divider().defaultStyle(context),
],
),
dowBuilder: (context, dateTime) {
final day = DateFormat("EE", context.isAr ? "ar" : "en").format(dateTime).toUpperCase();
return Align(alignment: Alignment.center, child: day.bodyText(context).custom(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50));
},
defaultBuilder: (context, dateTime, _) {
final day = DateFormat("d").format(dateTime);
return CalendarDaysCard(
day: day,
fill: snapshot.calendarRequests!.requestsDetails?.firstWhere(
(element) => (element.date != null) && (DateTime.tryParse(element.date!)?.day == (dateTime).day),
orElse: null,
) !=
null,
).toShimmer(isShow: snapshot.isCalendarLoading);
},
outsideBuilder: (context, dateTime, _) {
final day = DateFormat("d").format(dateTime);
return CalendarDaysCard(
day: day,
fill: snapshot.calendarRequests!.requestsDetails?.firstWhere(
(element) => (element.date != null) && (DateTime.tryParse(element.date!)?.day == (dateTime).day),
orElse: null,
) !=
null,
).toShimmer(isShow: snapshot.isCalendarLoading);
},
),
daysOfWeekHeight: 35.toScreenHeight,
headerStyle: const HeaderStyle(leftChevronVisible: false, rightChevronVisible: false, formatButtonVisible: false),
calendarStyle: CalendarStyle(
isTodayHighlighted: false,
defaultTextStyle: AppTextStyles.bodyText,
defaultDecoration: const BoxDecoration(shape: BoxShape.circle, color: AppColor.neutral30),
),
),
if (snapshot.calendarRequests?.requestsDetails?.isNotEmpty ?? false) const Divider().defaultStyle(context),
ListView.separated(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (cxt, index) {
final list = snapshot.calendarRequests!.requestsDetails!;
if (snapshot.isCalendarLoading) return const SizedBox().toRequestShimmer(cxt, snapshot.isCalendarLoading);
bool isServiceRequest = list[index].nameOfType == "ServiceRequest";
bool isGasRefill = list[index].nameOfType == "GasRefill";
bool isAssetTransfer = list[index].nameOfType == "AssetTransfer";
bool isPPMs = list[index].nameOfType == "PPMs";
return isServiceRequest
? ServiceRequestItemView(list[index], showShadow: false)
: isGasRefill
? GasRefillItemView(list[index], showShadow: false)
: isPPMs
? PpmItemView(list[index], showShadow: false)
: isAssetTransfer
? AssetItemView(list[index], showShadow: false)
: Container(
height: 100,
width: double.infinity,
color: Colors.grey,
);
},
separatorBuilder: (cxt, index) => const Divider().defaultStyle(context),
itemCount: snapshot.isCalendarLoading ? 6 : snapshot.calendarRequests!.requestsDetails!.length,
),
],
).toShadowContainer(context);
}),
);
}
BoxDecoration cellDecoration({Color? color}) => BoxDecoration(color: color ?? Colors.transparent, shape: BoxShape.circle);
}
// import 'package:flutter/material.dart';
// import 'package:intl/intl.dart';
// import 'package:provider/provider.dart';
// import 'package:table_calendar/table_calendar.dart';
// import 'package:test_sa/extensions/context_extension.dart';
// import 'package:test_sa/extensions/int_extensions.dart';
// import 'package:test_sa/extensions/text_extensions.dart';
// import 'package:test_sa/extensions/widget_extensions.dart';
// import 'package:test_sa/new_views/app_style/app_color.dart';
// todo delete
// import '../../../../controllers/providers/api/all_requests_provider.dart';
// import '../requests/asset_item_view.dart';
// import '../requests/gas_refill_item_view.dart';
// import '../requests/ppm_item_view.dart';
// import '../requests/service_request_item_view.dart';
// import 'calender_days_card.dart';
//
// class WeeklyFragment extends StatefulWidget {
// const WeeklyFragment({Key? key}) : super(key: key);
//
// @override
// _WeeklyFragmentState createState() {
// return _WeeklyFragmentState();
// }
// }
//
// class _WeeklyFragmentState extends State<WeeklyFragment> {
// late DateTime _initialDate, _firstDate, _lastDate;
//
// @override
// void initState() {
// super.initState();
// _initialDate = DateTime.now();
// _firstDate = DateTime.utc(2010, 10, 16);
// _lastDate = DateTime.utc(2030, 3, 14);
// Provider.of<AllRequestsProvider>(context, listen: false)
// .getCalendarRequests(from: DateTime.now().subtract(Duration(days: DateTime.now().weekday)), to: DateTime.now().add(Duration(days: DateTime.daysPerWeek - DateTime.now().weekday - 1)));
// }
//
// @override
// Widget build(BuildContext context) {
// return SingleChildScrollView(
// padding: const EdgeInsets.only(left: 16, right: 16),
// child: Consumer<AllRequestsProvider>(builder: (context, snapshot, _) {
// return Column(
// mainAxisSize: MainAxisSize.min,
// children: [
// TableCalendar(
// firstDay: _firstDate,
// lastDay: _lastDate,
// focusedDay: _initialDate,
// calendarFormat: CalendarFormat.week,
// weekendDays: const [],
// onCalendarCreated: (controller) {},
// onPageChanged: (date) {
// if (!snapshot.isCalendarLoading) {
// _initialDate = date;
//
// Provider.of<AllRequestsProvider>(context, listen: false)
// .getCalendarRequests(from: date.subtract(Duration(days: date.weekday)), to: date.add(Duration(days: DateTime.daysPerWeek - date.weekday - 1)));
// }
// },
// calendarBuilders: CalendarBuilders(
// headerTitleBuilder: (context, dateTime) => Column(
// crossAxisAlignment: CrossAxisAlignment.stretch,
// children: [
// DateFormat("EEEE, d MMMM, yyyy", context.isAr ? "ar" : "en").format(dateTime).heading5(context),
// 8.height,
// const Divider().defaultStyle(context),
// ],
// ),
// dowBuilder: (context, dateTime) {
// final day = DateFormat("EE", context.isAr ? "ar" : "en").format(dateTime).toUpperCase();
// return Align(alignment: Alignment.center, child: day.bodyText(context).custom(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50));
// },
// defaultBuilder: (context, dateTime, _) {
// final day = DateFormat("d").format(dateTime);
// return CalendarDaysCard(
// day: day,
// fill: snapshot.calendarRequests!.requestsDetails?.firstWhere(
// (element) => (element.date != null) && (DateTime.tryParse(element.date!)?.day == (dateTime).day),
// orElse: null,
// ) !=
// null,
// ).toShimmer(isShow: snapshot.isCalendarLoading);
// },
// outsideBuilder: (context, dateTime, _) {
// final day = DateFormat("d").format(dateTime);
// return CalendarDaysCard(
// day: day,
// fill: snapshot.calendarRequests!.requestsDetails?.firstWhere(
// (element) => (element.date != null) && (DateTime.tryParse(element.date!)?.day == (dateTime).day),
// orElse: null,
// ) !=
// null,
// ).toShimmer(isShow: snapshot.isCalendarLoading);
// },
// ),
// daysOfWeekHeight: 35.toScreenHeight,
// headerStyle: const HeaderStyle(leftChevronVisible: false, rightChevronVisible: false, formatButtonVisible: false),
// calendarStyle: CalendarStyle(
// isTodayHighlighted: false,
// defaultTextStyle: AppTextStyles.bodyText,
// defaultDecoration: const BoxDecoration(shape: BoxShape.circle, color: AppColor.neutral30),
// ),
// ),
// if (snapshot.calendarRequests?.requestsDetails?.isNotEmpty ?? false) const Divider().defaultStyle(context),
// ListView.separated(
// shrinkWrap: true,
// physics: const NeverScrollableScrollPhysics(),
// itemBuilder: (cxt, index) {
// final list = snapshot.calendarRequests!.requestsDetails!;
// if (snapshot.isCalendarLoading) return const SizedBox().toRequestShimmer(cxt, snapshot.isCalendarLoading);
// bool isServiceRequest = list[index].nameOfType == "ServiceRequest";
// bool isGasRefill = list[index].nameOfType == "GasRefill";
// bool isAssetTransfer = list[index].nameOfType == "AssetTransfer";
// bool isPPMs = list[index].nameOfType == "PPMs";
//
// return isServiceRequest
// ? ServiceRequestItemView(list[index], showShadow: false)
// : isGasRefill
// ? GasRefillItemView(list[index], showShadow: false)
// : isPPMs
// ? PpmItemView(list[index], showShadow: false)
// : isAssetTransfer
// ? AssetItemView(list[index], showShadow: false)
// : Container(
// height: 100,
// width: double.infinity,
// color: Colors.grey,
// );
// },
// separatorBuilder: (cxt, index) => const Divider().defaultStyle(context),
// itemCount: snapshot.isCalendarLoading ? 6 : snapshot.calendarRequests!.requestsDetails!.length,
// ),
// ],
// ).toShadowContainer(context);
// }),
// );
// }
//
// BoxDecoration cellDecoration({Color? color}) => BoxDecoration(color: color ?? Colors.transparent, shape: BoxShape.circle);
// }

@ -1,4 +1,3 @@
import 'dart:developer';
import 'dart:io';
import 'package:flutter/material.dart';
@ -24,7 +23,6 @@ import '../../../views/widgets/dialogs/dialog.dart';
import '../../common_widgets/app_bottom_nav_bar.dart';
import '../../common_widgets/app_drawer.dart';
import 'contact_us_bottom_sheet.dart';
import 'dashboard_page.dart';
class LandPage extends StatefulWidget {
static const String routeName = "/land-page";
@ -108,7 +106,7 @@ class _LandPageState extends State<LandPage> {
})),
// const old_page.LandPage(),
const MyRequestsPage(),
if (_userProvider!.user!.type != UsersTypes.engineer) const CalendarPage(),
// if (_userProvider!.user!.type != UsersTypes.engineer) const CalendarPage(),
const MyAssetsPage(fromBottomBar: true),
];
checkLocalAuth();

@ -6,13 +6,14 @@ import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/all_requests_and_count_model.dart';
import 'package:test_sa/models/device/asset_transfer.dart';
import 'package:test_sa/models/new_models/dashboard_detail.dart';
import 'package:test_sa/views/pages/device_transfer/device_transfer_details.dart';
import '../../../../views/widgets/requests/request_status.dart';
import '../../../app_style/app_color.dart';
class AssetItemView extends StatelessWidget {
final RequestsDetails request;
final Data request;
final bool showShadow;
const AssetItemView(this.request, {Key? key, this.showShadow = true}) : super(key: key);
@ -26,11 +27,11 @@ class AssetItemView extends StatelessWidget {
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (request.priority != null)
if (request.priorityName != null)
StatusLabel(
label: request.priority ?? "",
textColor: AppColor.getRequestStatusTextColorByName(context, request.priority!),
backgroundColor: AppColor.getRequestStatusColorByName(context, request.priority!),
label: request.priorityName ?? "",
textColor: AppColor.getRequestStatusTextColorByName(context, request.priorityName!),
backgroundColor: AppColor.getRequestStatusColorByName(context, request.priorityName!),
),
// 8.width,
// if (request.status != null)
@ -40,7 +41,7 @@ class AssetItemView extends StatelessWidget {
// backgroundColor: AppColor.getRequestStatusColorByName(context, request.status),
// ),
1.width.expanded,
Text(request.date?.toServiceRequestCardFormat ?? "", textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50)),
Text(request.transactionDate?.toServiceRequestCardFormat ?? "", textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50)),
],
),
8.height,
@ -49,9 +50,9 @@ class AssetItemView extends StatelessWidget {
mainAxisSize: MainAxisSize.min,
children: [
context.translation.deviceTransferRequest.heading5(context),
"${context.translation.from} : ${request.siteTransferFrom?.cleanupWhitespace.capitalizeFirstOfEach}".bodyText(context),
"${context.translation.to} : ${request.siteTransferTo?.cleanupWhitespace.capitalizeFirstOfEach}".bodyText(context),
request.status!.replaceAll("=", ":").bodyText(context),
// "${context.translation.from} : ${request.siteTransferFrom?.cleanupWhitespace.capitalizeFirstOfEach}".bodyText(context), // todo ask ahmed
// "${context.translation.to} : ${request.siteTransferTo?.cleanupWhitespace.capitalizeFirstOfEach}".bodyText(context),// todo ask ahmed
request.statusName!.replaceAll("=", ":").bodyText(context),
'${context.translation.requestNo}: ${request.requestNo}'.bodyText(context),
],
),

@ -5,6 +5,7 @@ import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/all_requests_and_count_model.dart';
import 'package:test_sa/models/new_models/dashboard_detail.dart';
import 'package:test_sa/models/new_models/gas_refill_model.dart';
import 'package:test_sa/views/pages/user/gas_refill/gas_refill_details.dart';
@ -12,7 +13,7 @@ import '../../../../views/widgets/requests/request_status.dart';
import '../../../app_style/app_color.dart';
class GasRefillItemView extends StatelessWidget {
final RequestsDetails request;
final Data request;
final bool showShadow;
const GasRefillItemView(this.request, {Key? key, this.showShadow = true}) : super(key: key);
@ -26,24 +27,24 @@ class GasRefillItemView extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
StatusLabel(
label: request.priority!,
textColor: AppColor.getRequestStatusTextColorByName(context, request.priority!),
backgroundColor: AppColor.getRequestStatusColorByName(context, request.priority!),
label: request.priorityName!,
textColor: AppColor.getRequestStatusTextColorByName(context, request.priorityName!),
backgroundColor: AppColor.getRequestStatusColorByName(context, request.priorityName!),
),
8.width,
StatusLabel(
label: request.status!,
textColor: AppColor.getRequestStatusTextColorByName(context, request.status!),
backgroundColor: AppColor.getRequestStatusColorByName(context, request.status!),
label: request.statusName!,
textColor: AppColor.getRequestStatusTextColorByName(context, request.statusName!),
backgroundColor: AppColor.getRequestStatusColorByName(context, request.statusName!),
),
1.width.expanded,
Text(request.date?.toServiceRequestCardFormat ?? "", textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50)),
Text(request.transactionDate?.toServiceRequestCardFormat ?? "", textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50)),
],
),
8.height,
context.translation.gasRefillRequest.heading5(context),
'${context.translation.gasType}: ${request.gasType}'.bodyText(context),
'${context.translation.site}: ${request.site?.cleanupWhitespace.capitalizeFirstOfEach}'.bodyText(context),
// '${context.translation.gasType}: ${request.gasType}'.bodyText(context), // todo ask ahmed
// '${context.translation.site}: ${request.site?.cleanupWhitespace.capitalizeFirstOfEach}'.bodyText(context),// todo ask ahmed
'${context.translation.requestNo}: ${request.requestNo}'.bodyText(context),
8.height,
Row(
@ -68,8 +69,8 @@ class GasRefillItemView extends StatelessWidget {
Navigator.of(context).push(
MaterialPageRoute(
builder: (_) => GasRefillDetailsPage(
priority: request.priority,
date: request.date!,
priority: request.priorityName,
date: request.transactionDate!,
model: GasRefillModel(id: request.id),
),
),

@ -5,13 +5,14 @@ import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/all_requests_and_count_model.dart';
import 'package:test_sa/models/new_models/dashboard_detail.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import '../../../../views/pages/user/ppm/ppm_details_page.dart';
import '../../../../views/widgets/requests/request_status.dart';
class PpmItemView extends StatelessWidget {
final RequestsDetails request;
final Data request;
final bool showShadow;
const PpmItemView(this.request, {Key? key, this.showShadow = true}) : super(key: key);
@ -25,19 +26,19 @@ class PpmItemView extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
StatusLabel(
label: request.priority!,
textColor: AppColor.getRequestStatusTextColorByName(context, request.priority!),
backgroundColor: AppColor.getRequestStatusColorByName(context, request.priority!),
label: request.priorityName!,
textColor: AppColor.getRequestStatusTextColorByName(context, request.priorityName!),
backgroundColor: AppColor.getRequestStatusColorByName(context, request.priorityName!),
),
8.width,
StatusLabel(
label: request.status!,
textColor: AppColor.getRequestStatusTextColorByName(context, request.status!),
backgroundColor: AppColor.getRequestStatusColorByName(context, request.status!),
label: request.statusName!,
textColor: AppColor.getRequestStatusTextColorByName(context, request.statusName!),
backgroundColor: AppColor.getRequestStatusColorByName(context, request.statusName!),
),
1.width.expanded,
Text(
request.date?.toServiceRequestCardFormat ?? "",
request.transactionDate?.toServiceRequestCardFormat ?? "",
textAlign: TextAlign.end,
style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50),
),
@ -46,8 +47,8 @@ class PpmItemView extends StatelessWidget {
8.height,
context.translation.ppmRequest.heading5(context),
8.height,
'${context.translation.assetNumber}: ${request.assetNo}'.bodyText(context),
'${context.translation.assetSN}: ${request.assetSN}'.bodyText(context),
'${context.translation.assetNumber}: ${request.assetNumber}'.bodyText(context),
// '${context.translation.assetSN}: ${request.assetSN}'.bodyText(context),//todo ask ahmed
// '${context.translation.code}: ${request.code}'.bodyText(context),
'${context.translation.requestNo}: ${request.requestNo}'.bodyText(context),
16.height,
@ -64,7 +65,7 @@ class PpmItemView extends StatelessWidget {
),
],
).toShadowContainer(context, showShadow: showShadow).onPress(() {
Navigator.of(context).push(MaterialPageRoute(builder: (_) => PpmDetailsPage(request: request)));
//Navigator.of(context).push(MaterialPageRoute(builder: (_) => PpmDetailsPage(request: request)));
});
}
}

@ -1,18 +1,20 @@
import 'package:flutter/material.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/new_models/dashboard_detail.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;
class RequestPaginatedListview extends StatelessWidget {
final List<Data> list;
final int totalCount;
final bool isLoading;
ScrollController scrollController;
RequestPaginatedList(this.list, this.isLoading, this.totalCount,this.scrollController, {Key? key}) : super(key: key);
RequestPaginatedListview(this.list, this.isLoading, this.totalCount, this.scrollController, {Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
@ -41,11 +43,11 @@ class RequestPaginatedList extends StatelessWidget {
);
}
Widget _buildRequestItem(RequestsDetails request) {
bool isServiceRequest = request.nameOfType == "ServiceRequest";
bool isGasRefill = request.nameOfType == "GasRefill";
bool isAssetTransfer = request.nameOfType == "AssetTransfer";
bool isPPMs = request.nameOfType == "PPMs";
Widget _buildRequestItem(Data request) {
bool isServiceRequest = request.transactionNo == 1;
bool isGasRefill = request.transactionNo == 2;
bool isAssetTransfer = request.transactionNo == 3;
bool isPPMs = request.transactionNo == 4;
if (isServiceRequest) {
return ServiceRequestItemView(request);

@ -5,14 +5,14 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/all_requests_and_count_model.dart';
import 'package:test_sa/models/new_models/dashboard_detail.dart';
import 'package:test_sa/service_request_latest/views/request_detail_main_view.dart';
import '../../../../views/widgets/requests/request_status.dart';
import '../../../app_style/app_color.dart';
class ServiceRequestItemView extends StatelessWidget {
final RequestsDetails request;
final Data request;
final bool showShadow;
const ServiceRequestItemView(this.request, {Key? key, this.showShadow = true}) : super(key: key);
@ -27,25 +27,26 @@ class ServiceRequestItemView extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
StatusLabel(
label: request.priority!,
textColor: AppColor.getRequestStatusTextColorByName(context, request.priority!),
backgroundColor: AppColor.getRequestStatusColorByName(context, request.priority!),
label: request.priorityName!,
textColor: AppColor.getRequestStatusTextColorByName(context, request.priorityName!),
backgroundColor: AppColor.getRequestStatusColorByName(context, request.priorityName!),
),
8.width,
StatusLabel(
label: request.status!,
textColor: AppColor.getRequestStatusTextColorByName(context, request.status!),
backgroundColor: AppColor.getRequestStatusColorByName(context, request.status!),
label: request.statusName!,
textColor: AppColor.getRequestStatusTextColorByName(context, request.statusName!),
backgroundColor: AppColor.getRequestStatusColorByName(context, request.statusName!),
),
1.width.expanded,
Text(request.date!.toServiceRequestCardFormat, textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50)),
Text(request.transactionDate!.toServiceRequestCardFormat,
textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50)),
],
),
8.height,
context.translation.serviceRequest.heading5(context),
'${context.translation.assetName}: ${request.assetName?.cleanupWhitespace.capitalizeFirstOfEach}'.bodyText(context),
'${context.translation.assetNumber}: ${request.assetNo}'.bodyText(context),
'${context.translation.requestType}: ${request.requestType}'.bodyText(context),
// '${context.translation.assetNumber}: ${request.assetNo}'.bodyText(context),
'${context.translation.requestType}: ${request.requestTypeName}'.bodyText(context),
'${context.translation.requestNo}: ${request.requestNo}'.bodyText(context),
8.height,
Row(
@ -68,10 +69,7 @@ class ServiceRequestItemView extends StatelessWidget {
).toShadowContainer(context, showShadow: showShadow).onPress(() {
//Older code...
Navigator.of(context).push(MaterialPageRoute(
builder: (_) => RequestDetailMain(
requestId: request.id!,
)));
Navigator.of(context).push(MaterialPageRoute(builder: (_) => RequestDetailMain(requestId: request.id!)));
// Navigator.of(context).push(MaterialPageRoute(
// builder: (_) => const HistoryLogView()));
});

@ -1,12 +1,12 @@
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/controllers/providers/api/user_provider.dart';
import 'package:test_sa/dashboard_latest/dashboard_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/all_requests_and_count_model.dart';
import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/new_models/dashboard_detail.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/new_views/pages/land_page/requests/request_paginated_listview.dart';
@ -22,24 +22,21 @@ class RequestsListPage extends StatefulWidget {
}
class _RequestsListPageState extends State<RequestsListPage> {
late AllRequestsProvider _provider;
// late AllRequestsProvider _provider;
late DashBoardProvider _dashBoardProvider;
late ScrollController _scrollController;
@override
void initState() {
// TODO: implement initState
_provider = Provider.of<AllRequestsProvider>(context, listen: false);
_provider.pageNum = 1;
_provider.selectedRequestCategory = null;
_provider.isRequestCategoryLoading = true;
super.initState();
_dashBoardProvider = Provider.of<DashBoardProvider>(context, listen: false);
_dashBoardProvider.resetRequestDataList();
callRequestApis();
handleScroll();
super.initState();
}
@override
void dispose() {
// TODO: implement dispose
_scrollController.dispose();
super.dispose();
}
@ -48,7 +45,7 @@ class _RequestsListPageState extends State<RequestsListPage> {
_scrollController = ScrollController();
int pageNo = 1;
_scrollController.addListener(() async {
if (_scrollController?.position?.pixels == _scrollController?.position?.maxScrollExtent && !_provider.isRequestCategoryLoading) {
if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent && !_dashBoardProvider.isDetailLoading) {
pageNo = pageNo + 1;
callRequestApis(showLoader: false, pageNo: pageNo);
}
@ -59,111 +56,56 @@ class _RequestsListPageState extends State<RequestsListPage> {
Widget build(BuildContext context) {
return Scaffold(
appBar: DefaultAppBar(title: "${widget.title} ${context.translation.requests}"),
body: Consumer<AllRequestsProvider>(builder: (context, snapshot, _) {
if (snapshot.isRequestCategoryLoading || snapshot.selectedRequestCategory == null) {
body: Consumer<DashBoardProvider>(builder: (context, snapshot, _) {
if (snapshot.isDetailLoading || snapshot.requestDetailList == 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),
child: const SizedBox().toRequestShimmer(context, snapshot.isDetailLoading),
);
},
);
} else {
WidgetsBinding.instance.addPostFrameCallback((_) {
snapshot.requestDetailList = snapshot.selectedRequestCategory;
});
return RequestPaginatedList(
snapshot.selectedRequestCategory!.requestsDetails ?? [], snapshot.isRequestCategoryLoading, snapshot.selectedRequestCategory?.total?.count ?? 0, _scrollController);
return RequestPaginatedListview(snapshot.requestDetailList?.data ?? <Data>[], snapshot.isDetailLoading, snapshot.requestDetailList?.totalRows ?? 0, _scrollController);
}
bool isLoading = widget.index == 0
? snapshot.isHighPriorityLoading
: widget.index == 1
? snapshot.isOverdueLoading
: widget.index == 2
? snapshot.isOpenLoading
: widget.index == 3
? snapshot.isCompleteLoading
: false;
List<RequestsDetails> list = widget.index == 0
? snapshot.highPriorityRequests?.requestsDetails ?? []
: widget.index == 1
? snapshot.overdueRequests?.requestsDetails ?? []
: widget.index == 2
? snapshot.openRequests?.requestsDetails ?? []
: widget.index == 3
? snapshot.completedRequests?.requestsDetails ?? []
: [];
// bool isLoading = widget.index == 0
// ? snapshot.isHighPriorityLoading
// : widget.index == 1
// ? snapshot.isOverdueLoading
// : widget.index == 2
// ? snapshot.isOpenLoading
// : widget.index == 3
// ? snapshot.isCompleteLoading
// : false;
//
// List<RequestsDetails> list = widget.index == 0
// ? snapshot.highPriorityRequests?.requestsDetails ?? []
// : widget.index == 1
// ? snapshot.overdueRequests?.requestsDetails ?? []
// : widget.index == 2
// ? snapshot.openRequests?.requestsDetails ?? []
// : widget.index == 3
// ? snapshot.completedRequests?.requestsDetails ?? []
// : [];
}));
}
Future<void> callRequestApis({
bool showLoader = true,
int pageNo = 1,
int pageSize = 10,
}) async {
Future<void> callRequestApis({bool showLoader = true, int pageNo = 1, int pageSize = 12}) async {
UsersTypes usersTypes = Provider.of<UserProvider>(context, listen: false).user!.type!;
print('i am here at ${widget.index}');
if (widget.index == 0) {
await _provider.getSelectedRequestCategory(
requestQueryModel: RequestQueryModel(
typeTransaction: [1],
statusTransaction: [1, 2, 4],
priority: [1],
displayData: [],
pageNumber: pageNo,
pageSize: pageSize,
showLoader: showLoader,
));
return;
}
if (widget.index == 1) {
await _provider.getSelectedRequestCategory(
requestQueryModel: RequestQueryModel(
typeTransaction: [1, 2, 3, 4],
statusTransaction: [1, 2, 4],
displayData: [1],
pageNumber: pageNo,
pageSize: pageSize,
priority: [],
showLoader: showLoader,
));
return;
// _provider.overdueRequests = null;
// _provider.getOverdueRequests();
}
if (widget.index == 2) {
await _provider.getSelectedRequestCategory(
requestQueryModel: RequestQueryModel(
typeTransaction: [1, 2, 3, 4],
statusTransaction: [usersTypes == UsersTypes.engineer ? 2 : 1],
displayData: [],
pageNumber: pageNo,
pageSize: pageSize,
priority: [],
showLoader: showLoader,
));
return;
// _provider.openRequests = null;
// _provider.getOpenRequests();
}
if (widget.index == 3) {
await _provider.getSelectedRequestCategory(
requestQueryModel: RequestQueryModel(
typeTransaction: [1, 2, 3, 4],
statusTransaction: [4],
displayData: [],
pageNumber: pageNo,
pageSize: pageSize,
priority: [],
showLoader: showLoader,
));
return;
// _provider.completedRequests = null;
// _provider.getCompletedRequests();
// high priority
_dashBoardProvider.getHighPriorityRequests(usersType: usersTypes, showLoader: showLoader);
} else if (widget.index == 1) {
// overdue
_dashBoardProvider.getOverdueRequests(usersType: usersTypes, showLoader: showLoader);
} else if (widget.index == 2) {
//in progress
_dashBoardProvider.getInProgressRequests(usersType: usersTypes, showLoader: showLoader);
} else {
// completed
_dashBoardProvider.getCompletedRequests(usersType: usersTypes, showLoader: showLoader);
}
}
}

@ -4,11 +4,7 @@ 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/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';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
class RequestItemViewList extends StatelessWidget {
List<RequestsDetails> list;
@ -19,7 +15,7 @@ class RequestItemViewList extends StatelessWidget {
@override
Widget build(BuildContext context) {
return (list.isEmpty && !isLoading)
? NoItemFound(message: context.translation.noDataFound)
? NoDataFound(message: context.translation.noDataFound)
: ListView.separated(
padding: const EdgeInsets.all(16),
shrinkWrap: true,
@ -29,19 +25,25 @@ class RequestItemViewList extends StatelessWidget {
bool isGasRefill = list[index].nameOfType == "GasRefill";
bool isAssetTransfer = list[index].nameOfType == "AssetTransfer";
bool isPPMs = list[index].nameOfType == "PPMs";
return isServiceRequest
? ServiceRequestItemView(list[index])
: isGasRefill
? GasRefillItemView(list[index])
: isPPMs
? PpmItemView(list[index])
: isAssetTransfer
? AssetItemView(list[index])
: Container(
return Container(
height: 100,
width: double.infinity,
color: Colors.grey,
);
// return isServiceRequest
// ? ServiceRequestItemView(list[index])
// : isGasRefill
// ? GasRefillItemView(list[index])
// : isPPMs
// ? PpmItemView(list[index])
// : isAssetTransfer
// ? AssetItemView(list[index])
// : Container(
// height: 100,
// width: double.infinity,
// color: Colors.grey,
// );
},
separatorBuilder: (cxt, index) => 8.height,
itemCount: isLoading ? 6 : list.length);

@ -219,18 +219,10 @@ class _LoginPageState extends State<LoginPage> {
// },
// backgroundColor: context.isDark ? AppColor.primary80 : AppColor.primary80),
context.translation.signInToYour.customHeadingText(context).custom(
color: AppColor.white20,
),
context.translation.account.customHeadingText(context).custom(
color: AppColor.white20,
),
context.translation.signInToYour.customHeadingText(context).custom(color: Colors.white, fontSize: 27, fontWeight: FontWeight.w500),
context.translation.account.customHeadingText(context).custom(color: Colors.white, fontSize: 27, fontWeight: FontWeight.w500),
25.height,
context.translation.letSignInToAccount.customHeadingText(context).custom(
color: AppColor.white20,
fontWeight: FontWeight.w500,
fontSize: 12,
),
context.translation.letSignInToAccount.customHeadingText(context).custom(color: Colors.white, fontWeight: FontWeight.w500, fontSize: 12),
],
),
),
@ -248,9 +240,11 @@ class _LoginPageState extends State<LoginPage> {
backgroundColor: AppColor.white20,
validator: (value) => Validator.hasValue(value!) ? null : context.translation.requiredField,
labelText: context.translation.username,
style: TextStyle(fontWeight: FontWeight.w500, fontSize: 12, color: Color(0xff3B3D4A)),
labelStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 11, color: Color(0xff767676)),
textInputType: TextInputType.text,
showWithoutDecoration: true,
contentPadding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 20.toScreenHeight),
contentPadding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 12.toScreenHeight),
onSaved: (value) {
_user.userName = value;
},
@ -261,7 +255,9 @@ class _LoginPageState extends State<LoginPage> {
showWithoutDecoration: true,
labelText: context.translation.password,
backgroundColor: AppColor.white20,
contentPadding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 20.toScreenHeight),
style: TextStyle(fontWeight: FontWeight.w500, fontSize: 12, color: Color(0xff3B3D4A)),
labelStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 11, color: Color(0xff767676)),
contentPadding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 12.toScreenHeight),
obscureText: true,
validator: (value) => Validator.isValidPassword(value!)
? null
@ -272,21 +268,22 @@ class _LoginPageState extends State<LoginPage> {
_user.password = value;
},
),
16.height,
Align(
alignment: AlignmentDirectional.centerEnd,
child: InkWell(
onTap: () {
/// TODO [zaid] : push to another screen
},
child: context.translation.forgotPassword.bodyText(context).custom(color: AppColor.primary10, fontWeight: FontWeight.w500),
),
),
8.height,
// Align(
// alignment: AlignmentDirectional.centerEnd,
// child: InkWell(
// onTap: () {
// /// TODO [zaid] : push to another screen
// },
// child: context.translation.forgotPassword.bodyText(context).custom(color: AppColor.primary10, fontWeight: FontWeight.w500),
// ),
// ),
Row(
children: [
Checkbox(
value: rememberMe,
activeColor: AppColor.blueStatus(context),
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
onChanged: (value) {
setState(() {
rememberMe = value!;

@ -1,6 +1,7 @@
import 'dart:async';
import 'dart:convert';
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
@ -12,7 +13,7 @@ import 'package:test_sa/models/helper_data_models/workorder/mark_as_fixed_model.
import 'package:test_sa/models/helper_data_models/workorder/need_visit_model.dart';
import 'package:test_sa/models/helper_data_models/workorder/nurse_action_model.dart';
import 'package:test_sa/models/new_models/dashboard_detail.dart';
import 'package:test_sa/models/new_models/workOrderDetail.dart';
import 'package:test_sa/models/new_models/work_order_detail_model.dart';
class RequestDetailProvider extends ChangeNotifier {
final pageItemNumber = 10;
@ -64,6 +65,7 @@ class RequestDetailProvider extends ChangeNotifier {
NeedVisit? _needVisitModel = NeedVisit();
MarkAsFixed? _markAsFixed = MarkAsFixed();
ActivitySparePartModel? _activitySparePartModel = ActivitySparePartModel();
ActivityAssetRetiredModel? _activityAssetRetiredModel = ActivityAssetRetiredModel();
WorkOrderHModel _workOrderHModel = WorkOrderHModel();
@ -95,6 +97,14 @@ class RequestDetailProvider extends ChangeNotifier {
notifyListeners();
}
NurseActionModel? _nurseActionModel;
NurseActionModel? get nurseActionModel => _nurseActionModel;
set nurseActionModel(NurseActionModel? value) {
_nurseActionModel = value;
notifyListeners();
}
NeedVisit? get needVisitModel => _needVisitModel;
@ -163,20 +173,17 @@ class RequestDetailProvider extends ChangeNotifier {
}
//getWorkOrderById......
Future<WorkOrderDetail?> getWorkOrderById({required String id}) async {
Future getWorkOrderById({required int id}) async {
try {
isLoading = true;
notifyListeners();
final response = await ApiManager.instance.get(URLs.getWorkOrderByIdUrl + "?workOrderId=$id");
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body));
notifyListeners();
isLoading = false;
return currentWorkOrder;
_currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body));
}
isLoading = false;
notifyListeners();
return null;
} catch (e) {
log("getSubWorkOrderDetails [error] : $e");
isLoading = false;
@ -248,6 +255,7 @@ class RequestDetailProvider extends ChangeNotifier {
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
print('response of Engineer fixremotely workorder ${commonResponseModel.toJson()}');
notifyListeners();
isLoading = false;
return commonResponseModel;
@ -335,6 +343,7 @@ class RequestDetailProvider extends ChangeNotifier {
return CommonResponseModel();
}
}
//assignEngineerToWorkOrder......
Future<CommonResponseModel> assignEngineerWorkOrder({required String workOrderId, required String engineerId}) async {
try {

@ -1,32 +1,29 @@
import 'package:flutter/material.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart';
class FooterActionButton {
static Widget footerContainer({required Widget child}){
static Widget footerContainer({required Widget child}) {
return Align(
alignment: Alignment.bottomCenter,
child: Container(
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth,vertical: 16.toScreenHeight),
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 16.toScreenHeight),
color: AppColor.white10,
child: child,
),
);
}
static Widget requestDetailsFooterWidget({required int status,required BuildContext context}){
switch(status){
static Widget requestDetailsFooterWidget({required int status, required BuildContext context}) {
switch (status) {
//accept reject...
case 1:
return footerContainer(
child:
Row(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisSize: MainAxisSize.min,
children: [
@ -47,18 +44,15 @@ class FooterActionButton {
label: context.translation.accept,
maxWidth: true,
buttonColor: AppColor.green70,
onPressed: () async {
},
onPressed: () async {},
).expanded,
],
)
);
));
break;
//need visit fixed remotely
case 2:
return footerContainer(
child:
Row(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisSize: MainAxisSize.min,
children: [
@ -82,84 +76,66 @@ class FooterActionButton {
},
).expanded,
],
)
);
));
break;
//verify Asset Details
case 3:
return footerContainer(
child:
AppFilledButton(
child: AppFilledButton(
label: context.translation.verify_asset_details,
// maxWidth: true,
buttonColor: AppColor.primary10,
onPressed: () async {
},
)
);
onPressed: () async {},
));
break;
//Activities
case 4:
return footerContainer(
child:
AppFilledButton(
child: AppFilledButton(
label: context.translation.activities,
// maxWidth: true,
buttonColor: AppColor.neutral50,
onPressed: () async {
ServiceRequestBottomSheet.activityTypeBottomSheet(context: context);
},
)
);
));
break;
//I have arrived...
case 5:
return footerContainer(
child:
AppFilledButton(
child: AppFilledButton(
label: context.translation.iHaveArrived,
//showIcon: true,
// icon: 'arrived_icon'.toSvgAsset(),
buttonColor: AppColor.green70,
onPressed: () async {
},
)
);
onPressed: () async {},
));
break;
//Close..
case 6:
return footerContainer(
child:
AppFilledButton(
child: AppFilledButton(
label: context.translation.close,
// maxWidth: true,
buttonColor: AppColor.primary10,
onPressed: () async {
},
)
);
onPressed: () async {},
));
break;
//for nurse to take action...
case 7:
return footerContainer(
child:
AppFilledButton(
child: AppFilledButton(
label: context.translation.takeAction,
// maxWidth: true,
buttonColor: AppColor.primary10,
onPressed: () async {
ServiceRequestBottomSheet.nurseTakeActionBottomSheet(context: context);
},
)
);
));
break;
default:
return const SizedBox();
}
}
}

@ -15,7 +15,7 @@ import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart';
import 'package:test_sa/views/pages/user/requests/work_order/update_service_report.dart';
import 'package:test_sa/views/pages/user/requests/work_order/work_order_details_page.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart';
class ActivitiesListView extends StatelessWidget {
@ -42,7 +42,7 @@ class ActivitiesListView extends StatelessWidget {
return Column(
children: [
(workOrders.isEmpty)
? NoItemFound(message: context.translation.noDataFound).expanded
? NoDataFound(message: context.translation.noDataFound).expanded
: ListView.separated(
padding: const EdgeInsets.all(16),
itemCount: workOrders.length,

@ -1,10 +1,13 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/service_request_latest/request_detail_provider.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart';
class HistoryLogView extends StatelessWidget {
@ -23,15 +26,13 @@ class HistoryLogView extends StatelessWidget {
HistoryLogModel(message: 'Requester acknowledged adc dld a', date: DateTime.now(), status: null),
HistoryLogModel(message: 'Requester acknowledged adc dld a', date: DateTime.now(), status: null),
];
return Scaffold(
backgroundColor: AppColor.neutral100,
body: Padding(
padding: EdgeInsets.only(
left: 16.toScreenWidth,
right: 16.toScreenWidth,
bottom: 12.toScreenHeight,
),
child: Stack(
return Consumer<RequestDetailProvider>(builder: (context, requestProvider, _) {
return requestProvider.isLoading
? const CircularProgressIndicator(color: AppColor.primary10).center
: (requestProvider.currentWorkOrder == null || (requestProvider.currentWorkOrder?.data?.workOrderHistory.isEmpty ?? true)
? const NoDataFound()
: Stack(
children: [
Padding(
padding: EdgeInsets.only(left: 122.toScreenWidth),
@ -43,10 +44,6 @@ class HistoryLogView extends StatelessWidget {
endIndent: 10,
),
),
// Container(
// color: Colors.red,
// ),
ListView.builder(
itemCount: dummyList.length,
padding: EdgeInsets.zero,
@ -55,9 +52,8 @@ class HistoryLogView extends StatelessWidget {
},
),
],
),
),
);
));
});
}
Widget historyLogCard({required BuildContext context, required HistoryLogModel historyLogModel}) {

@ -10,34 +10,284 @@ import 'package:test_sa/extensions/string_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/models/new_models/work_order_detail_model.dart';
import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/service_request_latest/request_detail_provider.dart';
import 'package:test_sa/service_request_latest/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart';
import 'package:test_sa/service_request_latest/views/components/initial_visit_card.dart';
import 'package:test_sa/service_request_latest/views/components/timer_widget.dart';
import 'package:test_sa/service_request_latest/views/forms/asset_retired/asset_retired.dart';
import 'package:test_sa/service_request_latest/views/forms/asset_retired/verify_asset_detail.dart';
import 'package:test_sa/service_request_latest/views/forms/maintenance_request/maintenance_request_main.dart';
import 'package:test_sa/service_request_latest/views/nurse/create_new_request_view.dart';
import 'package:test_sa/views/pages/user/requests/comments_bottom_sheet.dart';
import 'package:test_sa/views/pages/user/requests/update_service_request_page.dart';
import 'package:test_sa/views/widgets/images/files_list.dart';
import 'package:test_sa/views/widgets/loaders/app_loading.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart';
import 'package:test_sa/views/widgets/sound/sound_player.dart';
import '../forms/spare_part/spare_part_request.dart';
class WorkOrderDetailView extends StatelessWidget {
WorkOrderDetailView({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
UserProvider _userProvider = Provider.of<UserProvider>(context, listen: false);
return Consumer<RequestDetailProvider>(builder: (pContext, requestProvider, _) {
print(requestProvider?.currentWorkOrder?.toJson());
return requestProvider.isLoading
? const CircularProgressIndicator(color: AppColor.primary10).center
: requestProvider.currentWorkOrder == null
? NoDataFound()
: Stack(
children: [
Column(
children: [
SingleChildScrollView(
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
WorkOrderDetailCard(context, requestProvider.currentWorkOrder!.data!, _userProvider),
40.height,
// skipForLater(serviceRequestsProvider.currentSelectedRequest),
// 20.height,
const InitialVisitCard(),
20.height,
],
),
).expanded,
FooterActionButton.requestDetailsFooterWidget(status: 1, context: context),
],
),
const TimerWidget(),
],
);
});
}
Widget WorkOrderDetailCard(BuildContext context, WorkOrderData workOrder, UserProvider userProvider) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisSize: MainAxisSize.min,
children: [
StatusLabel(
label: workOrder.priority?.name,
id: workOrder.priority!.id!,
radius: 4,
textColor: AppColor.getPriorityStatusTextColor(context, workOrder.priority!.id!),
backgroundColor: AppColor.getPriorityStatusColor(context, workOrder.priority!.id!),
),
8.width,
StatusLabel(
radius: 4,
label: workOrder.status!.name,
textColor: AppColor.getRequestStatusTextColor(context, workOrder.status!.id!),
backgroundColor: AppColor.getRequestStatusColor(context, workOrder.status!.id!),
),
1.width.expanded,
Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
if (userProvider.user!.type == UsersTypes.normal_user)
context.translation.code.toSvgAsset(width: 48).onPress(() {
// Navigator.push(context, MaterialPageRoute(builder: (context) => UpdateServiceRequestPage(serviceRequest: serviceRequest)));
}),
if (userProvider.user!.type == UsersTypes.engineer) 16.height,
Text(
workOrder.requestedDate!.toString().toServiceRequestCardFormat,
textAlign: TextAlign.end,
style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
),
],
)
],
),
Text(
context.translation.assetDetails,
style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
),
8.height,
Text(
'${context.translation.assetName}: ${workOrder.assetNdModel!.name?.cleanupWhitespace?.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
),
// 8.height,
Text(
'${context.translation.assetNumber}: ${workOrder.asset!.assetNumber}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
),
// Text(
// '${context.translation.equipmentStatus}: ${workOrder.defectType?.name}', // todo ask ahmed
// style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
// ),
Text(
'${context.translation.manufacture}: ${workOrder.manufacturer?.name?.cleanupWhitespace?.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
),
Text(
'${context.translation.model}: ${workOrder.model?.name!.cleanupWhitespace?.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
),
Text(
'${context.translation.site}: ${workOrder.site?.siteName?.cleanupWhitespace?.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
),
Text(
'${context.translation.building}: ${workOrder.building?.name?.cleanupWhitespace?.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
),
Text(
'${context.translation.floor}: ${workOrder.floor?.name?.cleanupWhitespace?.capitalizeFirstOfEach ?? ""}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
),
Text(
'${context.translation.department}: ${workOrder.department?.name?.cleanupWhitespace?.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
),
Text(
'${context.translation.room}: ${(workOrder.room?.toString() ?? "").cleanupWhitespace?.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
),
],
).expanded,
],
),
8.height,
const Divider().defaultStyle(context),
//... request details starts here....
Text(
context.translation.requestDetail,
style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
),
8.height,
Text(
'${context.translation.requestType}: ${workOrder.typeofRequest?.name}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
),
// Text(
// '${context.translation.requestNo}: ${workOrder.requestCode}', // todo ask ahmed
// style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
// ),
Text(
'${context.translation.requesterName}: ${workOrder.workOrderCreatedBy?.userName ?? "-"}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
),
Text(
'${context.translation.requesterName}: ${workOrder.requestedDate!.toString().toServiceRequestDetailsFormat}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral120),
),
8.height,
if ((workOrder.comments ?? "").isNotEmpty) ...[
const Divider().defaultStyle(context),
8.height,
Text(
workOrder.comments!,
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
),
],
if (workOrder.workOrderAttachments.isNotEmpty ?? false) ...[
8.height,
const Divider().defaultStyle(context),
FilesList(images: workOrder.workOrderAttachments),
],
if (workOrder.voiceNote?.isNotEmpty ?? false) ...[
const Divider().defaultStyle(context),
16.height,
ASoundPlayer(audio: workOrder.voiceNote!),
8.height,
],
],
).paddingOnly(start: 16, end: 16, top: 16, bottom: 8),
(userProvider.user!.type == UsersTypes.normal_user
? Container(
height: 50,
padding: const EdgeInsets.only(left: 16, right: 16),
alignment: Alignment.center,
width: double.infinity,
decoration: ShapeDecoration(
color: context.isDark ? AppColor.neutral50 : AppColor.neutral30,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(20),
bottomRight: Radius.circular(20),
),
),
),
child: Row(
children: [
Text(
'${context.translation.commentHere}...',
style: AppTextStyles.heading6.copyWith(
color: (context.isDark ? AppColor.neutral30 : AppColor.neutral50).withOpacity(.6),
),
).expanded,
"comment_send".toSvgAsset(width: 24, color: context.isDark ? AppColor.primary50 : AppColor.primary70),
],
),
)
: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Divider().defaultStyle(context),
16.height,
Row(
mainAxisSize: MainAxisSize.min,
children: [
Text(
context.translation.viewComments,
style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context)),
),
4.width,
Icon(Icons.arrow_forward, color: AppColor.blueStatus(context), size: 14)
],
),
],
).paddingOnly(bottom: 16, start: 16, end: 16))
.onPress(() {
// showModalBottomSheet(
// context: context,
// useSafeArea: true,
// isScrollControlled: true,
// useRootNavigator: true,
// backgroundColor: Colors.transparent,
// builder: (context) => CommentsBottomSheet(requestId: serviceRequest.id!),
// );
}),
//set condition for show asset detail button...
if (true) ...[
//assetRetiredButton(serviceRequest: serviceRequest),
]
],
).toShadowContainer(context, padding: 0);
}
}
class RequestDetailView extends StatefulWidget {
static const String id = "/call-details";
ServiceRequest serviceRequest;
bool fromTabView = false;
RequestDetailView({Key? key,required this.serviceRequest, this.fromTabView = false}) : super(key: key);
RequestDetailView({Key? key, required this.serviceRequest, this.fromTabView = false}) : super(key: key);
@override
State<RequestDetailView> createState() => _RequestDetailViewState();
@ -47,7 +297,6 @@ class _RequestDetailViewState extends State<RequestDetailView> {
@override
void initState() {
super.initState();
getServiceRequest(requestId: widget.serviceRequest.id);
}
void getServiceRequest({@required dynamic requestId}) {
@ -60,8 +309,6 @@ class _RequestDetailViewState extends State<RequestDetailView> {
});
}
@override
Widget build(BuildContext context) {
UserProvider _userProvider = Provider.of<UserProvider>(context, listen: false);
@ -82,7 +329,6 @@ class _RequestDetailViewState extends State<RequestDetailView> {
}
Widget requestDetailCard({required ServiceRequestsProvider serviceRequestsProvider, required UserProvider userProvider}) {
return SafeArea(
child: serviceRequestsProvider.isDetialLoading
? const ALoading().center
@ -110,7 +356,7 @@ class _RequestDetailViewState extends State<RequestDetailView> {
),
),
FooterActionButton.requestDetailsFooterWidget(status: 7, context: context),
const TimerWidget(),
TimerWidget(),
],
),
);
@ -332,7 +578,7 @@ class _RequestDetailViewState extends State<RequestDetailView> {
showBorder: true,
onPressed: () async {
// Navigator.push(context, MaterialPageRoute(builder: (context) => AssetRetired()));
ServiceRequestBottomSheet.initialVisitBottomSheet(context: context);
Navigator.push(context, MaterialPageRoute(builder: (context) => CreateNewRequest()));
}),
);
}

@ -1,18 +1,43 @@
import 'package:flutter/material.dart';
import 'package:provider/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/service_request/service_request.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/service_request_latest/request_detail_provider.dart';
import 'package:test_sa/service_request_latest/views/components/history_log_view.dart';
import 'components/request_detail_view.dart';
class RequestDetailMain extends StatelessWidget {
class RequestDetailMain extends StatefulWidget {
final int requestId;
const RequestDetailMain({Key? key, required this.requestId}) : super(key: key);
RequestDetailMain({Key? key, required this.requestId}) : super(key: key);
@override
_RequestDetailMainState createState() {
return _RequestDetailMainState();
}
}
class _RequestDetailMainState extends State<RequestDetailMain> {
late RequestDetailProvider _requestProvider;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
_requestProvider = Provider.of<RequestDetailProvider>(context, listen: false);
_requestProvider.getWorkOrderById(id: widget.requestId);
});
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
@ -25,14 +50,16 @@ class RequestDetailMain extends StatelessWidget {
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Container(
margin: EdgeInsets.only(left: 16.toScreenWidth, right: 16.toScreenWidth,top: 12.toScreenHeight),
margin: EdgeInsets.only(left: 16.toScreenWidth, right: 16.toScreenWidth, top: 12.toScreenHeight),
decoration: BoxDecoration(color: context.isDark ? AppColor.neutral50 : AppColor.white10, borderRadius: BorderRadius.circular(10)),
child: TabBar(
padding: EdgeInsets.symmetric(vertical: 4.toScreenHeight,horizontal: 4.toScreenWidth),
//controller: _tabController,
padding: EdgeInsets.symmetric(vertical: 4.toScreenHeight, horizontal: 4.toScreenWidth),
labelColor: context.isDark ? AppColor.neutral30 : AppColor.black20,
unselectedLabelColor: context.isDark ? AppColor.neutral30 : AppColor.black20,
unselectedLabelStyle: AppTextStyles.bodyText,
labelStyle: AppTextStyles.bodyText,
indicatorPadding: EdgeInsets.zero,
indicatorSize: TabBarIndicatorSize.tab,
dividerColor: Colors.transparent,
indicator: BoxDecoration(color: context.isDark ? AppColor.neutral60 : AppColor.neutral110, borderRadius: BorderRadius.circular(7)),
@ -48,10 +75,11 @@ class RequestDetailMain extends StatelessWidget {
12.height,
TabBarView(
children: [
RequestDetailView(
serviceRequest: ServiceRequest(id: requestId.toString()),
fromTabView: true,
),
WorkOrderDetailView(),
// RequestDetailView(
// serviceRequest: ServiceRequest(id: requestId.toString()),
// fromTabView: true,
// ),
const HistoryLogView(),
],
).expanded,

@ -1,18 +0,0 @@
import 'package:flutter/material.dart';
import 'package:test_sa/models/enums/user_types.dart';
class RequestUtils{
static List<Map<String, dynamic>> getTabs({required UsersTypes userType,required BuildContext context}) {
List<Map<String, dynamic>> tabs = [];
if(userType==UsersTypes.engineer){
tabs.add({'label':'In Progress','status':2});
tabs.add({'label':'Completed','status':4});
return tabs;
}
tabs.add({'label':'New Request','status':1});
tabs.add({'label':'In Progress','status':2});
tabs.add({'label':'Completed','status':4});
return tabs;
}
}

@ -15,7 +15,7 @@ import '../../../new_views/common_widgets/custom_app_bar.dart';
import '../../widgets/equipment/asset_item_listview.dart';
import '../../widgets/horizontal_list_widget.dart';
import '../../widgets/loaders/lazy_loading.dart';
import '../../widgets/loaders/no_item_found.dart';
import '../../widgets/loaders/no_data_found.dart';
class SearchAssetPage extends StatefulWidget {
/// add on route
@ -123,7 +123,7 @@ class _SearchAssetPageState extends State<SearchAssetPage> {
child: _searchableList.isEmpty
? _isFirst
? const SizedBox()
: NoItemFound(message: context.translation.noDeviceFound)
: NoDataFound(message: context.translation.noDeviceFound)
: LazyLoading(
nextPage: _deviceProvider.nextPage,
onLazyLoad: () async {

@ -8,7 +8,7 @@
// import '../../../models/service_request/search_work_order.dart';
// import '../../widgets/buttons/app_back_button.dart';
// import '../../widgets/loaders/lazy_loading.dart';
// import '../../widgets/loaders/no_item_found.dart';
// import '../../widgets/loaders/no_data_found.dart';
// import 'create_sub_workorder_page.dart';
//// todo remove this class after work
// class WorkOrderList extends StatefulWidget {

@ -11,7 +11,7 @@ import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart';
import 'package:test_sa/views/widgets/loaders/lazy_loading.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
import '../../../../new_views/app_style/app_color.dart';
import '../../../widgets/loaders/loading_manager.dart';
@ -79,7 +79,7 @@ class _GasRefillCommentsBottomSheetState extends State<GasRefillCommentsBottomSh
child: commentsProvider.comments.isEmpty
? SizedBox(
height: MediaQuery.of(context).size.height * 0.25,
child: NoItemFound(message: context.translation.noDataFound),
child: NoDataFound(message: context.translation.noDataFound),
)
: LazyLoading(
nextPage: commentsProvider.nextPage,

@ -9,7 +9,7 @@ import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart';
import 'package:test_sa/views/widgets/loaders/app_loading.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
import '../../../../extensions/text_extensions.dart';
import '../../../../models/enums/user_types.dart';
@ -70,7 +70,7 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
],
);
}
return NoItemFound(message: context.translation.noDataFound);
return NoDataFound(message: context.translation.noDataFound);
},
),
),

@ -4,7 +4,7 @@ import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/system_notification_model.dart';
import 'package:test_sa/views/widgets/loaders/lazy_loading.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
import 'package:test_sa/views/widgets/notifications/notification_item.dart';
class NotificationsList extends StatelessWidget {
@ -17,7 +17,7 @@ class NotificationsList extends StatelessWidget {
@override
Widget build(BuildContext context) {
if (notifications.isEmpty) {
return NoItemFound(message: context.translation.notificationsNotFound);
return NoDataFound(message: context.translation.notificationsNotFound);
}
return LazyLoading(
nextPage: nextPage,

@ -10,7 +10,7 @@ import 'package:test_sa/models/all_requests_and_count_model.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/views/pages/user/ppm/update_ppm/edit_ppm.dart';
import 'package:test_sa/views/widgets/loaders/app_loading.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
import '../../../../controllers/providers/api/user_provider.dart';
import '../../../../models/enums/user_types.dart';
@ -115,7 +115,7 @@ class _PpmDetailsPageState extends State<PpmDetailsPage> {
).paddingAll(16)
]);
}
return NoItemFound(message: context.translation.noDataFound);
return NoDataFound(message: context.translation.noDataFound);
}),
),
);

@ -9,7 +9,7 @@ import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import '../../../../models/ppm/ppm.dart';
import '../../../widgets/loaders/lazy_loading.dart';
import '../../../widgets/loaders/no_item_found.dart';
import '../../../widgets/loaders/no_data_found.dart';
import '../../../widgets/ppm/ppm_item.dart';
class PpmPage extends StatefulWidget {
@ -44,7 +44,7 @@ class _PpmPageState extends State<PpmPage> with TickerProviderStateMixin {
await _visitsProvider.getVisits(user: _userProvider.user!, host: _settingProvider.host!);
},
child: _visitsProvider.ppms?.isEmpty ?? true
? NoItemFound(message: context.translation.noVisitsFound)
? NoDataFound(message: context.translation.noVisitsFound)
: LazyLoading(
nextPage: _visitsProvider.nextPage,
onLazyLoad: () async {

@ -12,7 +12,7 @@ import 'package:test_sa/models/comment.dart';
import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart';
import 'package:test_sa/views/widgets/loaders/lazy_loading.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
import '../../../../new_views/app_style/app_color.dart';
import '../../../widgets/loaders/loading_manager.dart';
@ -78,7 +78,7 @@ class _CommentsBottomSheetState extends State<CommentsBottomSheet> {
commentsProvider.comments.isEmpty
? SizedBox(
height: MediaQuery.of(context).size.height * 0.25,
child: NoItemFound(message: context.translation.noDataFound),
child: NoDataFound(message: context.translation.noDataFound),
)
: LazyLoading(
nextPage: commentsProvider.nextPage,

@ -12,7 +12,7 @@ import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/service_request_latest/views/components/activity_card_view.dart';
import 'package:test_sa/views/pages/user/requests/work_order/create_service_report.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
class WorkOrderListPage extends StatelessWidget {
static const String id = "/work-order-list";
@ -40,7 +40,7 @@ class WorkOrderListPage extends StatelessWidget {
return Column(
children: [
(workOrders.isEmpty)
? NoItemFound(message: context.translation.noDataFound).expanded
? NoDataFound(message: context.translation.noDataFound).expanded
: ListView.separated(
padding: const EdgeInsets.all(16),
itemCount: workOrders.length,

@ -6,7 +6,7 @@ import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/department.dart';
import 'package:test_sa/views/widgets/departments/department_item.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
import '../app_text_form_field.dart';
@ -62,7 +62,7 @@ class _SingleDepartmentPickerState extends State<SingleDepartmentPicker> {
),
Expanded(
child: _searchableList.isEmpty
? NoItemFound(
? NoDataFound(
message: context.translation.noUniteFound,
)
: ListView.builder(

@ -4,7 +4,7 @@ import 'package:test_sa/models/device/asset_transfer.dart';
import 'package:test_sa/views/pages/device_transfer/device_transfer_details.dart';
import 'package:test_sa/views/widgets/device_trancfer/device_transfer_item.dart';
import 'package:test_sa/views/widgets/loaders/lazy_loading.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
class DeviceTransferList extends StatelessWidget {
final List<AssetTransfer> items;
@ -16,7 +16,7 @@ class DeviceTransferList extends StatelessWidget {
@override
Widget build(BuildContext context) {
if (items.isEmpty) {
return NoItemFound(
return NoDataFound(
message: context.translation.noServiceRequestFound,
);
}

@ -13,7 +13,7 @@ import 'package:test_sa/views/widgets/equipment/asset_item_gridview.dart';
import 'package:test_sa/views/widgets/equipment/asset_item_listview.dart';
import 'package:test_sa/views/widgets/loaders/lazy_loading.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
import 'package:test_sa/views/widgets/qr/scan_qr.dart';
import '../../../models/device/asset.dart';
@ -155,7 +155,7 @@ class _MyAssetsPageState extends State<MyAssetsPage> {
children: [
Expanded(
child: _searchableList.isEmpty
? NoItemFound(message: context.translation.noDeviceFound)
? NoDataFound(message: context.translation.noDeviceFound)
: LazyLoading(
nextPage: _devicesProvider.nextPage,
onLazyLoad: () async {

@ -3,7 +3,7 @@ import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/views/pages/user/gas_refill/gas_refill_details.dart';
import 'package:test_sa/views/widgets/gas_refill/gas_refill_item.dart';
import 'package:test_sa/views/widgets/loaders/lazy_loading.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
import '../../../models/new_models/gas_refill_model.dart';
@ -22,7 +22,7 @@ class _GasRefillListState extends State<GasRefillList> {
@override
Widget build(BuildContext context) {
if (widget.items.isEmpty) {
return NoItemFound(
return NoDataFound(
message: context.translation.noServiceRequestFound,
);
}

@ -6,7 +6,7 @@
// import 'package:test_sa/models/hospital.dart';
// import 'package:test_sa/views/widgets/hospitals/hospital_item.dart';
// import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
// import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
// import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
//
// import '../app_text_form_field.dart';
//

@ -0,0 +1,24 @@
import 'package:flutter/material.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/new_views/app_style/app_color.dart';
class NoDataFound extends StatelessWidget {
final String? message;
const NoDataFound({Key? key, this.message}) : super(key: key);
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset("assets/images/no_data_found.png", height: 64, width: 64),
16.height,
Text(message ?? "no Data found", style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20)),
],
);
}
}

@ -1,21 +0,0 @@
import 'package:flutter/material.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
class NoItemFound extends StatelessWidget {
final String? message;
const NoItemFound({Key? key, this.message}) : super(key: key);
@override
Widget build(BuildContext context) {
return Stack(
children: [
Center(
child: Text(message ?? "no item found", style: AppTextStyles.heading5.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50)),
),
ListView(),
],
);
}
}

@ -17,9 +17,11 @@ class StatusLabel extends StatelessWidget {
if (id == 82) label = context.translation.highPriority;
if (id == 81) label = context.translation.lowPriority;
if (label?.toLowerCase() == 'In progress'.toLowerCase()) label = context.translation.inProgress;
if (label?.toLowerCase() == 'Complete'.toLowerCase()) label = context.translation.completed;
if (label?.toLowerCase() == 'Completed'.toLowerCase()) label = context.translation.completed;
if (label?.toLowerCase() == 'Open'.toLowerCase()) label = context.translation.open;
if (label?.toLowerCase() == 'Closed'.toLowerCase()) label = context.translation.closed;
if (label?.toLowerCase() == 'Low'.toLowerCase()) label = context.translation.lowPriority;
if (label?.toLowerCase() == 'High'.toLowerCase()) label = context.translation.highPriority;
if (label?.toLowerCase() == 'Waiting for quotation'.toLowerCase()) label = context.translation.waitingForQuotation;
return Container(

@ -5,7 +5,7 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/views/pages/user/requests/service_request_details.dart';
import 'package:test_sa/views/widgets/loaders/lazy_loading.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
import 'package:test_sa/views/widgets/requests/service_request_item.dart';
class ServiceRequestsList extends StatelessWidget {
@ -19,7 +19,7 @@ class ServiceRequestsList extends StatelessWidget {
Widget build(BuildContext context) {
print('servies request page');
if (requests.isEmpty) {
return NoItemFound(
return NoDataFound(
message: context.translation.noServiceRequestFound,
);
}

Loading…
Cancel
Save