null safety conversion after merge.

design_3.0_latest
Sikander Saleem 1 year ago
parent 0d876a41fc
commit f694252828

@ -25,7 +25,7 @@ class CustomStepper extends StatefulWidget {
final double stepRadius; final double stepRadius;
final int activeStep; final int activeStep;
final int maxReachedStep; final int maxReachedStep;
final Set<int> reachedSteps; final Set<int>? reachedSteps;
final AlignmentGeometry alignment; final AlignmentGeometry alignment;
final double internalPadding; final double internalPadding;
final EdgeInsetsGeometry padding; final EdgeInsetsGeometry padding;
@ -41,9 +41,9 @@ class CustomStepper extends StatefulWidget {
final LineStyle lineStyle; final LineStyle lineStyle;
const CustomStepper({ const CustomStepper({
Key key, Key? key,
@required this.activeStep, required this.activeStep,
@required this.steps, required this.steps,
this.reachedSteps, this.reachedSteps,
this.maxReachedStep, this.maxReachedStep,
this.onStepReached, this.onStepReached,
@ -84,7 +84,7 @@ class CustomStepper extends StatefulWidget {
} }
class _CustomStepperState extends State<CustomStepper> { class _CustomStepperState extends State<CustomStepper> {
ScrollController _scrollController; late ScrollController _scrollController;
int _selectedIndex; int _selectedIndex;
LineStyle lineStyle; LineStyle lineStyle;
EdgeInsetsGeometry _padding; EdgeInsetsGeometry _padding;

@ -83,10 +83,8 @@ class ApiManager {
return response; return response;
} }
Future<http.Response> postWithOutBody(
String url, { Future<http.Response> postWithOutBody(String url, {Map<String, String>? headers}) async {
Map<String, String> headers,
}) async {
headers ??= {}; headers ??= {};
headers.addAll(_headers); headers.addAll(_headers);
@ -118,7 +116,6 @@ class ApiManager {
return response; return response;
} }
Future<http.Response> put(String url, {Map<String, String>? headers, required Map<String, dynamic> body}) async { Future<http.Response> put(String url, {Map<String, String>? headers, required Map<String, dynamic> body}) async {
headers ??= {}; headers ??= {};

@ -1,16 +1,12 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:developer';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/http_status_manger.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/models/issue.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/service_request/pending_service_request_model.dart'; import 'package:test_sa/models/service_request/pending_service_request_model.dart';
import 'package:test_sa/models/service_request/service_report.dart'; import 'package:test_sa/models/service_request/service_report.dart';
@ -30,7 +26,6 @@ class ServiceRequestsProvider extends ChangeNotifier {
// number of items call in each request // number of items call in each request
final pageItemNumber = 10; final pageItemNumber = 10;
//reset provider data //reset provider data
void reset() { void reset() {
workOrders = []; workOrders = [];
@ -42,16 +37,8 @@ class ServiceRequestsProvider extends ChangeNotifier {
// state code of current request to defied error message // state code of current request to defied error message
// like 400 customer request failed // like 400 customer request failed
// 500 service not available // 500 service not available
int stateCode; int? stateCode;
bool _isDetialLoading=false; bool _isDetialLoading = false;
bool _ackhnowledge = false;
bool get ackhnowledge => _ackhnowledge;
set ackhnowledge(bool value) {
_ackhnowledge = value;
notifyListeners();
}
bool get isDetialLoading => _isDetialLoading; bool get isDetialLoading => _isDetialLoading;
@ -59,32 +46,23 @@ class ServiceRequestsProvider extends ChangeNotifier {
_isDetialLoading = value; _isDetialLoading = value;
notifyListeners(); notifyListeners();
} // true if there is next page in product list and false if not } // true if there is next page in product list and false if not
bool nextPage = true; bool nextPage = true;
TimeOfDay _selectedTime ; TimeOfDay? _selectedTime;
TimeOfDay get selectedTime => _selectedTime; TimeOfDay? get selectedTime => _selectedTime;
set selectedTime(TimeOfDay value) { set selectedTime(TimeOfDay? value) {
_selectedTime = value; _selectedTime = value;
notifyListeners(); notifyListeners();
} // list of user requests } // list of user requests
List<ServiceRequest> serviceRequests;
List<SearchWorkOrder> workOrders = [];
SearchWorkOrder _formWorkOrder=SearchWorkOrder();
SearchWorkOrder get formWorkOrder => _formWorkOrder;
set formWorkOrder(SearchWorkOrder value) {
_formWorkOrder = value;
notifyListeners();
}
List<ServiceRequest>? serviceRequests;
List<SearchWorkOrder> workOrders = [];
List<SparePartsWorkOrders> _sparePartList = []; List<SparePartsWorkOrders> _sparePartList = [];
SparePartsWorkOrders _initialSelectedSparePart = SparePartsWorkOrders(); SparePartsWorkOrders _initialSelectedSparePart = SparePartsWorkOrders();
ServiceRequest _currentSelectedRequest; ServiceRequest? _currentSelectedRequest;
int _selectedListIndex = 0; int _selectedListIndex = 0;
int get selectedListIndex => _selectedListIndex; int get selectedListIndex => _selectedListIndex;
@ -94,19 +72,17 @@ class ServiceRequestsProvider extends ChangeNotifier {
notifyListeners(); notifyListeners();
} }
ServiceRequest get currentSelectedRequest => _currentSelectedRequest; ServiceRequest? get currentSelectedRequest => _currentSelectedRequest;
set currentSelectedRequest(ServiceRequest value) { set currentSelectedRequest(ServiceRequest? value) {
_currentSelectedRequest = value; _currentSelectedRequest = value;
print('notify listner for current selected request Called...');
notifyListeners(); notifyListeners();
} }
// when requests in-process _loading = true // when requests in-process _loading = true
// done _loading = true // done _loading = true
// failed _loading = false // failed _loading = false
bool isLoading; bool isLoading = false;
ServiceRequestSearch search = ServiceRequestSearch(); ServiceRequestSearch search = ServiceRequestSearch();
@ -115,7 +91,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
/// return state code if request complete may be 200, 404 or 403 /// return state code if request complete may be 200, 404 or 403
/// for more details check http state manager /// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart /// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getRequests({@required int hospitalId}) async { Future<int> getRequests({required int hospitalId}) async {
if (isLoading == true) return -2; if (isLoading == true) return -2;
isLoading = true; isLoading = true;
if (serviceRequests?.isEmpty ?? false) notifyListeners(); if (serviceRequests?.isEmpty ?? false) notifyListeners();
@ -137,7 +113,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
List requestsListJson = json.decode(response.body)["data"]; List requestsListJson = json.decode(response.body)["data"];
List<ServiceRequest> serviceRequestsPage = requestsListJson.map((request) => ServiceRequest.fromJson(request)).toList(); List<ServiceRequest> serviceRequestsPage = requestsListJson.map((request) => ServiceRequest.fromJson(request)).toList();
serviceRequests ??= []; serviceRequests ??= [];
serviceRequests.addAll(serviceRequestsPage); serviceRequests!.addAll(serviceRequestsPage);
notifyListeners(); notifyListeners();
if (serviceRequestsPage.length == pageItemNumber) { if (serviceRequestsPage.length == pageItemNumber) {
nextPage = true; nextPage = true;
@ -156,46 +132,46 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
Future<ServiceRequest> getSingleServiceRequest({ // Future<ServiceRequest> getSingleServiceRequest({
@required String requestId, // required String requestId,
@required String host, // required String host,
@required User user, // required User user,
@required AppLocalizations subtitle, // required AppLocalizations subtitle,
}) async { // }) async {
String userData = ''; // String userData = '';
if (user != null) { // if (user != null) {
userData += "&uid=" + user.id; // userData += "&uid=" + user!.id!;
userData += "&token=" + user.token; // userData += "&token=" + user!.token!;
} // }
//
Response response; // Response response;
try { // try {
response = await get(Uri.parse( // response = await get(Uri.parse(
host + // host +
URLs.getSingleServiceRequest + // URLs.getSingleServiceRequest +
'?call_nid=$requestId' // '?call_nid=$requestId'
'$userData', // '$userData',
)); // ));
} catch (error) { // } catch (error) {
throw (HttpStatusManger.getStatusMessage(status: -1, subtitle: subtitle)); // throw (HttpStatusManger.getStatusMessage(status: -1, subtitle: subtitle));
} // }
//
// If the call to the server was successful, parse the JSON. // // If the call to the server was successful, parse the JSON.
if (response.statusCode >= 200 && response.statusCode < 300) { // if (response.statusCode >= 200 && response.statusCode < 300) {
// If the call to the server was successful, parse the JSON. // // If the call to the server was successful, parse the JSON.
List jsonList = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); // List jsonList = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", ""));
List<ServiceRequest> _requests = jsonList.map((i) => ServiceRequest.fromJson(i)).toList(); // List<ServiceRequest> _requests = jsonList.map((i) => ServiceRequest.fromJson(i)).toList();
return _requests[0]; // return _requests[0];
} else { // } else {
throw (HttpStatusManger.getStatusMessage(status: response.statusCode, subtitle: subtitle)); // throw (HttpStatusManger.getStatusMessage(status: response.statusCode, subtitle: subtitle));
} // }
} // }
Future<void> createRequest({ Future<void> createRequest({
@required BuildContext context, required BuildContext context,
@required String host, required String host,
@required User user, required User user,
@required ServiceRequest serviceRequest, required ServiceRequest serviceRequest,
}) async { }) async {
var body = { var body = {
"id": 0, "id": 0,
@ -206,7 +182,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
"requestedTime": DateTime.now().toIso8601String(), "requestedTime": DateTime.now().toIso8601String(),
"client": user.clientId, "client": user.clientId,
"callComments": serviceRequest.callComments, "callComments": serviceRequest.callComments,
if (serviceRequest.devicePhotos.isNotEmpty) "attachmentsCallRequest": serviceRequest.devicePhotos.map((e) => {"name": e}).toList(), if (serviceRequest.devicePhotos?.isNotEmpty ?? false) "attachmentsCallRequest": serviceRequest.devicePhotos!.map((e) => {"name": e}).toList(),
"priority": serviceRequest.priority?.toJson(), "priority": serviceRequest.priority?.toJson(),
"defectType": serviceRequest.defectType?.toJson(), "defectType": serviceRequest.defectType?.toJson(),
"typeofRequest": serviceRequest.type?.toJson(), "typeofRequest": serviceRequest.type?.toJson(),
@ -247,7 +223,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
if (serviceRequests != null) { if (serviceRequests != null) {
var data = json.decode(utf8.decode(response.bodyBytes)); var data = json.decode(utf8.decode(response.bodyBytes));
if (data is List) { if (data is List) {
serviceRequests.insert(0, ServiceRequest.fromJson(data[0])); serviceRequests!.insert(0, ServiceRequest.fromJson(data[0]));
} else { } else {
if (data["data"] != null && data["data"] == true) { if (data["data"] != null && data["data"] == true) {
// serviceRequests.insert(0, ServiceRequest.fromJson(data[0])); // serviceRequests.insert(0, ServiceRequest.fromJson(data[0]));
@ -267,33 +243,33 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
Future<int> createIssueReport({ // Future<int> createIssueReport({
@required String host, // required String host,
@required User user, // required User user,
@required Issue issue, // required Issue issue,
}) async { // }) async {
Response response; // Response response;
Map<String, String> body = issue.toMap(); // Map<String, String> body = issue.toMap();
body["uid"] = user.id; // body["uid"] = user.id;
body["token"] = user.token; // body["token"] = user.token;
try { // try {
response = await post( // response = await post(
Uri.parse(host + URLs.createReport), // Uri.parse(host + URLs.createReport),
body: body, // body: body,
); // );
//
stateCode = response.statusCode; // stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {} // if (response.statusCode >= 200 && response.statusCode < 300) {}
return response.statusCode; // return response.statusCode;
} catch (error) { // } catch (error) {
return -1; // return -1;
} // }
} // }
Future<PendingAssetServiceRequest> checkAssetPendingRequest(int assetId) async { Future<PendingAssetServiceRequest?> checkAssetPendingRequest(int assetId) async {
Response response; Response response;
try { try {
response = await await ApiManager.instance.get(URLs.CheckIfAssetHasAnotherServiceRequest + "?assetId=$assetId"); response = await ApiManager.instance.get(URLs.CheckIfAssetHasAnotherServiceRequest + "?assetId=$assetId");
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {} if (response.statusCode >= 200 && response.statusCode < 300) {}
return PendingAssetServiceRequest.fromJson(json.decode(response.body)["data"]); return PendingAssetServiceRequest.fromJson(json.decode(response.body)["data"]);
@ -303,16 +279,16 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
Future<int> updateRequest({@required User user, @required ServiceRequest request}) async { Future<int> updateRequest({required User user, required ServiceRequest request}) async {
isLoading = true; isLoading = true;
notifyListeners(); notifyListeners();
Map<String, dynamic> serviceRequest = await getServiceRequestById(requestId: request.id) ?? ""; Map<String, dynamic> serviceRequest = await getServiceRequestById(requestId: request.id!);
final List callSiteContacts = (serviceRequest['callSiteContactPerson'] as List); final List callSiteContacts = (serviceRequest['callSiteContactPerson'] as List);
final Map<String, dynamic> callSiteContactPerson = callSiteContacts.isEmpty ? {} : callSiteContacts[0]; final Map<String, dynamic> callSiteContactPerson = callSiteContacts.isEmpty ? {} : callSiteContacts[0];
Response response; Response response;
try { try {
if ((request.audio ?? "").isNotEmpty) { if ((request.audio ?? "").isNotEmpty) {
request.audio = request.audio.substring(request.audio.indexOf("=") + 1, request.audio.length); request.audio = request.audio!.substring(request.audio!.indexOf("=") + 1, request.audio!.length);
} }
} catch (ex) {} } catch (ex) {}
@ -328,7 +304,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
"requestedThrough": request.requestedThrough?.toJson(), "requestedThrough": request.requestedThrough?.toJson(),
"voiceNote": request.audio, "voiceNote": request.audio,
"assets": request.deviceId == null ? [] : [request.deviceId], "assets": request.deviceId == null ? [] : [request.deviceId],
"attachmentsCallRequest": (request.devicePhotos?.isNotEmpty ?? false) ? request.devicePhotos?.map((e) => {"name": e.getFileName})?.toList() : [], "attachmentsCallRequest": (request.devicePhotos?.isNotEmpty ?? false) ? request.devicePhotos?.map((e) => {"name": e.getFileName}).toList() : [],
"assignedEmployee": { "assignedEmployee": {
"id": request.engineerId, "id": request.engineerId,
"name": request.engineerName, "name": request.engineerName,
@ -350,10 +326,10 @@ class ServiceRequestsProvider extends ChangeNotifier {
"status": request.statusId == null "status": request.statusId == null
? null ? null
: { : {
"id": request.statusId, "id": request.statusId,
"name": request.statusLabel, "name": request.statusLabel,
"value": request.statusValue, "value": request.statusValue,
}, },
"callLastSituation": null, "callLastSituation": null,
"firstAction": request.firstAction?.toJson(), "firstAction": request.firstAction?.toJson(),
"loanAvailablity": request.loanAvailability?.toJson(), "loanAvailablity": request.loanAvailability?.toJson(),
@ -387,12 +363,12 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
Future<int> createServiceReport(BuildContext context, {@required ServiceReport report, @required User user, @required ServiceRequest request}) async { Future<int> createServiceReport(BuildContext context, {required ServiceReport report, required User user, required ServiceRequest request}) async {
Response response; Response response;
try { try {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
final body = report.toJson(); final body = report.toJson();
final callRequest = CallRequest(id: num.tryParse(request?.id ?? "")).toJson(); final callRequest = CallRequest(id: num.tryParse(request.id ?? "")).toJson();
final contactPerson = [ final contactPerson = [
{ {
"id": 0, "id": 0,
@ -426,7 +402,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
Future<int> createSubWorkOrder({@required SearchWorkOrder workOrder, bool makeSuppPersonsEmpty = false}) async { Future<int> createSubWorkOrder({required SearchWorkOrder workOrder, bool makeSuppPersonsEmpty = false}) async {
Response response; Response response;
try { try {
if (makeSuppPersonsEmpty) workOrder.supplier?.suppPersons = []; if (makeSuppPersonsEmpty) workOrder.supplier?.suppPersons = [];
@ -444,19 +420,17 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
CallRequest callRequestForWorkOrder; CallRequest? callRequestForWorkOrder;
Future<CallRequest> getCallRequestForWorkOrder({String callId}) async { Future<CallRequest?> getCallRequestForWorkOrder({required String callId}) async {
Response response; Response response;
try { try {
response = await ApiManager.instance.get( response = await ApiManager.instance.get(URLs.getCallRequestForWorkOrder + "?callId=$callId");
URLs.getCallRequestForWorkOrder + "?callId=$callId",
);
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
Map<String, dynamic> listJson = json.decode(response.body)["data"]; Map<String, dynamic> listJson = json.decode(response.body)["data"];
log(listJson?.toString()); // log(listJson?.toString());
callRequestForWorkOrder = CallRequest.fromJson(listJson); callRequestForWorkOrder = CallRequest.fromJson(listJson);
} }
@ -468,13 +442,13 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
Future<List<SearchWorkOrder>> searchWorkOrders({@required String callId}) async { Future<List<SearchWorkOrder>> searchWorkOrders({required String callId}) async {
Response response; Response response;
try { try {
var body = { var body = {
"pageSize": pageItemNumber, "pageSize": pageItemNumber,
"pageNumber": ((workOrders?.length ?? 0) ~/ pageItemNumber) + 1, "pageNumber": ((workOrders.length ?? 0) ~/ pageItemNumber) + 1,
"callId": callId, "callId": callId,
}; };
response = await ApiManager.instance.post(URLs.searchWorkOrders, body: body); response = await ApiManager.instance.post(URLs.searchWorkOrders, body: body);
@ -495,7 +469,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
Future<ServiceReport> getSubWorkOrderDetails({@required String parentId}) async { Future<ServiceReport?> getSubWorkOrderDetails({required String parentId}) async {
Response response; Response response;
try { try {
response = await ApiManager.instance.get(URLs.getSubWorkerInfoAccordingToPreviousStep + "?parentId=$parentId"); response = await ApiManager.instance.get(URLs.getSubWorkerInfoAccordingToPreviousStep + "?parentId=$parentId");
@ -512,38 +486,38 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
Future<int> createDuplicatedReport({ // Future<int> createDuplicatedReport({
@required String host, // required String host,
@required User user, // required User user,
@required ServiceRequest request, // required ServiceRequest request,
}) async { // }) async {
// Response response;
// String userData = '';
// if (user != null) {
// userData += "&uid=" + user.id;
// userData += "&token=" + user.token;
// }
//
// try {
// response = await get(
// Uri.parse(host + URLs.createDuplicatedReport + "?nid=${request.id}" + userData),
// );
//
// stateCode = response.statusCode;
//
// if (response.statusCode >= 200 && response.statusCode < 300) {
// reset();
// notifyListeners();
// }
// return response.statusCode;
// } catch (error) {
// return -1;
// }
// }
Future<int> updateServiceReport(BuildContext context, {required ServiceReport report}) async {
Response response; Response response;
String userData = ''; report.callRequest = CallRequest(id: report.callRequest!.id!);
if (user != null) {
userData += "&uid=" + user.id;
userData += "&token=" + user.token;
}
try {
response = await get(
Uri.parse(host + URLs.createDuplicatedReport + "?nid=${request.id}" + userData),
);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
reset();
notifyListeners();
}
return response.statusCode;
} catch (error) {
return -1;
}
}
Future<int> updateServiceReport(BuildContext context, {@required ServiceReport report}) async {
Response response;
report.callRequest = CallRequest(id: report.callRequest.id);
Map<String, dynamic> body = report.toJson(); Map<String, dynamic> body = report.toJson();
try { try {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
@ -554,7 +528,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
Fluttertoast.showToast(msg: context.translation.successfulRequestMessage); Fluttertoast.showToast(msg: context.translation.successfulRequestMessage);
Navigator.of(context).pop(); Navigator.of(context).pop();
} else { } else {
Fluttertoast.showToast(msg: "${context.translation.failedToCompleteRequest}"); Fluttertoast.showToast(msg: context.translation.failedToCompleteRequest);
} }
Navigator.of(context).pop(); Navigator.of(context).pop();
return response.statusCode; return response.statusCode;
@ -565,7 +539,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
Future<int> updateWorkOrderDetails({@required SearchWorkOrder workOrder}) async { Future<int> updateWorkOrderDetails({required SearchWorkOrder workOrder}) async {
Response response; Response response;
//Map<String,dynamic> body = report.toMap(request); //Map<String,dynamic> body = report.toMap(request);
// body["uid"] = user.id; // body["uid"] = user.id;
@ -594,20 +568,15 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
Future<int> updateServiceReportTimer({ Future<int> updateServiceReportTimer({required String host, required User user, required TimerModel timer, required ServiceRequest request}) async {
@required String host,
@required User user,
@required TimerModel timer,
@required ServiceRequest request,
}) async {
Response response; Response response;
Map<String, dynamic> body = {}; Map<String, dynamic> body = {};
body["uid"] = user.id; body["uid"] = user.id;
body["token"] = user.token; body["token"] = user.token;
body["job_id"] = request.id; body["job_id"] = request.id;
body["start_time"] = (timer.startAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0); body["start_time"] = (timer.startAt!.millisecondsSinceEpoch / 1000).toStringAsFixed(0);
body["end_time"] = (timer.endAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0); body["end_time"] = (timer.endAt!.millisecondsSinceEpoch / 1000).toStringAsFixed(0);
body["working_hours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5); body["working_hours"] = (timer.durationInSecond! / 60 / 60).toStringAsFixed(5);
body["report_id"] = request.reportID; body["report_id"] = request.reportID;
try { try {
response = await post( response = await post(
@ -626,7 +595,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
Future<ServiceReport> getSingleServiceReport(BuildContext context, {@required int reportId}) async { Future<ServiceReport> getSingleServiceReport(BuildContext context, {required int reportId}) async {
Response response; Response response;
try { try {
response = await ApiManager.instance.get(URLs.getServiceReport + "?workOrderId=$reportId"); response = await ApiManager.instance.get(URLs.getServiceReport + "?workOrderId=$reportId");
@ -643,29 +612,27 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
Future<ServiceRequest> getServiceRequestObjectById({@required String requestId}) async { Future<ServiceRequest?> getServiceRequestObjectById({required String requestId}) async {
try { try {
isDetialLoading = true; isDetialLoading = true;
Response response = await ApiManager.instance.get(URLs.getServiceRequestById + "?callRequestId=$requestId"); Response response = await ApiManager.instance.get(URLs.getServiceRequestById + "?callRequestId=$requestId");
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
isDetialLoading=false; isDetialLoading = false;
return ServiceRequest.fromJson(json.decode(response.body)["data"]); return ServiceRequest.fromJson(json.decode(response.body)["data"]);
} else { } else {
isDetialLoading=false; isDetialLoading = false;
return null; return null;
} }
} catch (error) { } catch (error) {
isDetialLoading=false; isDetialLoading = false;
return null; return null;
} }
} }
Future<Map<String, dynamic>> getServiceRequestById({@required String requestId}) async { Future<Map<String, dynamic>> getServiceRequestById({required String requestId}) async {
Response response; Response response;
try { try {
response = await ApiManager.instance.get( response = await ApiManager.instance.get(URLs.getServiceRequestById + "?callRequestId=$requestId");
URLs.getServiceRequestById + "?callRequestId=$requestId",
);
} catch (error) { } catch (error) {
print(error); print(error);
return {}; return {};
@ -686,29 +653,26 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
Future<List<SearchWorkOrder>> searchForWorkOrders( Future<List<SearchWorkOrder>> searchForWorkOrders(
SearchWorkOrder search, SearchWorkOrder search,
String callerId, String callerId,
Lookup dateOperator, Lookup dateOperator,
String site, String site,
) async { ) async {
Response response; Response response;
try { try {
var body = { var body = {
"pageSize": pageItemNumber, "pageSize": pageItemNumber,
"pageNumber": ((workOrders?.length ?? 0) ~/ pageItemNumber) + 1, "pageNumber": ((workOrders.length ?? 0) ~/ pageItemNumber) + 1,
if (callerId?.isNotEmpty ?? false) "callId": callerId, if (callerId.isNotEmpty ?? false) "callId": callerId,
if (search.assetType != null) "assetSerialNo": search.assetType?.name, if (search.assetType != null) "assetSerialNo": search.assetType?.name,
if (search.workOrderNo != null) "workOrderNo": search.workOrderNo, if (search.workOrderNo != null) "workOrderNo": search.workOrderNo,
if (search.id != null) "workOrderNo": search.id?.toString(), if (search.id != null) "workOrderNo": search.id.toString(),
if (search.calllastSituation != null) "callslastSituationWO": search.calllastSituation.toJson(), if (search.calllastSituation != null) "callslastSituationWO": search.calllastSituation!.toJson(),
if (search.assignedEmployee != null) if (search.assignedEmployee != null) "assignedEmployees": [search.assignedEmployee!.id],
"assignedEmployees": [
search.assignedEmployee.id,
],
// "statusWO": [], // "statusWO": [],
if (site?.isNotEmpty ?? false) "site": site, if (site.isNotEmpty ?? false) "site": site,
if (search.visitDate != null && dateOperator != null) "visitDateSymbol": dateOperator?.toJson(), if (search.visitDate != null) "visitDateSymbol": dateOperator.toJson(),
if (search.visitDate != null && dateOperator != null) "visitDateFrom": search.visitDate, if (search.visitDate != null) "visitDateFrom": search.visitDate,
}; };
print(body); print(body);
response = await ApiManager.instance.post(URLs.searchWorkOrders, body: body); response = await ApiManager.instance.post(URLs.searchWorkOrders, body: body);
@ -731,11 +695,11 @@ class ServiceRequestsProvider extends ChangeNotifier {
} }
} }
Future<SuppEngineerWorkOrders> addSupplierEngineer(SupplierEngineer supplierEngineer) async { Future<SuppEngineerWorkOrders?> addSupplierEngineer(SupplierEngineer supplierEngineer) async {
isLoading = true; isLoading = true;
notifyListeners(); notifyListeners();
Response response; Response response;
SuppEngineerWorkOrders res; SuppEngineerWorkOrders? res;
try { try {
response = await ApiManager.instance.post(URLs.addSupplierEngineer, body: supplierEngineer.toJson()); response = await ApiManager.instance.post(URLs.addSupplierEngineer, body: supplierEngineer.toJson());
stateCode = response.statusCode; stateCode = response.statusCode;
@ -758,6 +722,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
_initialSelectedSparePart = value; _initialSelectedSparePart = value;
notifyListeners(); notifyListeners();
} }
List<SparePartsWorkOrders> get sparePartList => _sparePartList; List<SparePartsWorkOrders> get sparePartList => _sparePartList;
set sparePartList(List<SparePartsWorkOrders> value) { set sparePartList(List<SparePartsWorkOrders> value) {

@ -1,19 +1,19 @@
import 'dart:convert'; import 'dart:convert';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/new_models/dashboardCount.dart'; import 'package:test_sa/models/new_models/dashboard_count.dart';
import 'package:test_sa/models/new_models/dashboard_detail.dart'; import 'package:test_sa/models/new_models/dashboard_detail.dart' as DD;
class DashBoardProvider extends ChangeNotifier { class DashBoardProvider extends ChangeNotifier {
bool isAllCountLoading = false; bool isAllCountLoading = false;
bool isLoading = false; bool isLoading = false;
bool _isDetailLoading = false; bool _isDetailLoading = false;
int _status =0; int _status = 0;
int get status => _status; int get status => _status;
@ -31,15 +31,15 @@ class DashBoardProvider extends ChangeNotifier {
notifyListeners(); notifyListeners();
} }
int stateCode; int? stateCode;
DashboardCount dashboardCount; DashboardCount? dashboardCount;
DashboardDetail _requestDetailList; DD.DashboardDetail? _requestDetailList;
DashboardDetail get requestDetailList => _requestDetailList; DD.DashboardDetail? get requestDetailList => _requestDetailList;
set requestDetailList(DashboardDetail value) { set requestDetailList(DD.DashboardDetail? value) {
_requestDetailList = value; _requestDetailList = value;
notifyListeners(); notifyListeners();
} }
@ -54,24 +54,23 @@ class DashBoardProvider extends ChangeNotifier {
stateCode = null; stateCode = null;
} }
Future<int> getDashBoardCount({required UsersTypes usersType}) async {
Future<int> getDashBoardCount({@required UsersTypes usersType}) async {
isAllCountLoading = true; isAllCountLoading = true;
String url=''; String url = '';
if(usersType==UsersTypes.engineer){ if (usersType == UsersTypes.engineer) {
url = URLs.engineerDashboardCountUrl; url = URLs.engineerDashboardCountUrl;
} }
if(usersType==UsersTypes.nurse){ if (usersType == UsersTypes.nurse) {
url=URLs.nurseDashboardCountUrl; url = URLs.nurseDashboardCountUrl;
} }
Response response; Response response;
try { try {
response = await ApiManager.instance.postWithOutBody(url); response = await ApiManager.instance.postWithOutBody(url);
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
dashboardCount = DashboardCount.fromJson(json.decode(response.body)); dashboardCount = DashboardCount.fromJson(json.decode(response.body));
} }
notifyListeners(); notifyListeners();
isAllCountLoading = false; isAllCountLoading = false;
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
@ -83,36 +82,35 @@ class DashBoardProvider extends ChangeNotifier {
} }
} }
Future<int> getRequestDetail({bool showLoader = true, required UsersTypes usersType, required int status}) async {
Future<int> getRequestDetail({bool showLoader = true,UsersTypes usersType, int status}) async { isDetailLoading = showLoader;
isDetailLoading =showLoader;
Response response; Response response;
String url=''; String url = '';
if(usersType==UsersTypes.engineer){ if (usersType == UsersTypes.engineer) {
url = URLs.engineerDashboardDetailsUrl; url = URLs.engineerDashboardDetailsUrl;
} }
if(usersType==UsersTypes.nurse){ if (usersType == UsersTypes.nurse) {
url=URLs.nurseDashboardDetailsUrl; url = URLs.nurseDashboardDetailsUrl;
} }
try { try {
Map<String, dynamic> body = { Map<String, dynamic> body = {
"statusValue": status, "statusValue": status,
"pageNumber": pageNum, "pageNumber": pageNum,
"pageSize" : pageItemNumber, "pageSize": pageItemNumber,
}; };
response = await ApiManager.instance.post(url, body: body); response = await ApiManager.instance.post(url, body: body);
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
if (requestDetailList == null) { if (requestDetailList == null) {
requestDetailList = DashboardDetail.fromJson(json.decode(response.body)); requestDetailList = DD.DashboardDetail.fromJson(json.decode(response.body));
isDetailLoading = false; isDetailLoading = false;
notifyListeners(); notifyListeners();
} else { } else {
requestDetailList.data.addAll(DashboardDetail.fromJson(json.decode(response.body)["data"][0]).data); requestDetailList!.data!.addAll(DD.Data.fromJson(json.decode(response.body)["data"][0]).data);
isDetailLoading = false; isDetailLoading = false;
notifyListeners(); notifyListeners();
} }
if (requestDetailList.data.length >= pageItemNumber) { if (requestDetailList!.data!.length >= pageItemNumber) {
nextPage = true; nextPage = true;
} else { } else {
nextPage = false; nextPage = false;
@ -138,5 +136,4 @@ class DashBoardProvider extends ChangeNotifier {
_isDetailLoading = value; _isDetailLoading = value;
notifyListeners(); notifyListeners();
} }
} }

@ -10,16 +10,12 @@ import 'package:test_sa/controllers/providers/api/all_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/notifications_provider.dart'; import 'package:test_sa/controllers/providers/api/notifications_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/dashboard_latest/dashboard_provider.dart';
import 'package:test_sa/dashboard_latest/widgets/app_bar_widget.dart'; import 'package:test_sa/dashboard_latest/widgets/app_bar_widget.dart';
import 'package:test_sa/extensions/context_extension.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/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
import 'package:test_sa/new_views/app_style/app_color.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/service_request_latest/request_detail_provider.dart'; import 'package:test_sa/service_request_latest/request_detail_provider.dart';
import 'package:test_sa/utilities/request_utils.dart'; import 'package:test_sa/utilities/request_utils.dart';
@ -28,7 +24,7 @@ import 'widgets/request_category_fragment.dart';
class DashboardView extends StatefulWidget { class DashboardView extends StatefulWidget {
final VoidCallback onDrawerPress; final VoidCallback onDrawerPress;
const DashboardView({Key key, this.onDrawerPress}) : super(key: key); const DashboardView({Key? key, required this.onDrawerPress}) : super(key: key);
@override @override
State<DashboardView> createState() => _DashboardViewState(); State<DashboardView> createState() => _DashboardViewState();
@ -37,15 +33,13 @@ class DashboardView extends StatefulWidget {
class _DashboardViewState extends State<DashboardView> { class _DashboardViewState extends State<DashboardView> {
int _currentPage = 0; int _currentPage = 0;
bool isFCM = true; bool isFCM = true;
User user; late User user;
SettingProvider settingProvider; late SettingProvider settingProvider;
UserProvider userProvider; late UserProvider userProvider;
late AllRequestsProvider allRequestsProvider;
AllRequestsProvider allRequestsProvider; late NotificationsProvider notificationsProvider;
late ScrollController _scrollController;
NotificationsProvider notificationsProvider;
ScrollController _scrollController;
@override @override
void initState() { void initState() {
@ -61,16 +55,16 @@ class _DashboardViewState extends State<DashboardView> {
RequestDetailProvider requestDetailProvider = Provider.of<RequestDetailProvider>(context, listen: false); RequestDetailProvider requestDetailProvider = Provider.of<RequestDetailProvider>(context, listen: false);
allRequestsProvider = Provider.of<AllRequestsProvider>(context, listen: false); allRequestsProvider = Provider.of<AllRequestsProvider>(context, listen: false);
notificationsProvider = Provider.of<NotificationsProvider>(context, listen: false); notificationsProvider = Provider.of<NotificationsProvider>(context, listen: false);
user = userProvider.user; user = userProvider.user!;
log('user token i got is ${user.token}'); log('user token i got is ${user.token}');
await getAllRequests(); await getAllRequests();
await requestDetailProvider.engineerRejectWorkOrder(id: '3',feedBack: 'Abcdef'); await requestDetailProvider.engineerRejectWorkOrder(id: '3', feedBack: 'Abcdef');
if (isFCM) { if (isFCM) {
FirebaseNotificationManger.initialized(context); FirebaseNotificationManger.initialized(context);
NotificationManger.initialisation((notificationDetails) { NotificationManger.initialisation((notificationDetails) {
FirebaseNotificationManger.handleMessage(context, json.decode(notificationDetails.payload)); FirebaseNotificationManger.handleMessage(context, json.decode(notificationDetails.payload!));
}, (id, title, body, payload) async {}); }, (id, title, body, payload) async {});
isFCM = false; isFCM = false;
@ -83,30 +77,27 @@ class _DashboardViewState extends State<DashboardView> {
allRequestsProvider.isFilterRequestLoading = true; allRequestsProvider.isFilterRequestLoading = true;
allRequestsProvider.currentListIndex = 0; allRequestsProvider.currentListIndex = 0;
allRequestsProvider.filterRequest = null; allRequestsProvider.filterRequest = null;
var tabs = RequestUtils.getTabs(userType: userProvider.user.type, context: context); var tabs = RequestUtils.getTabs(userType: userProvider.user!.type!, context: context);
allRequestsProvider.status = tabs[0]['status']; allRequestsProvider.status = tabs[0]['status'];
allRequestsProvider.getRequests(); allRequestsProvider.getRequests();
allRequestsProvider.pageNum = 1; allRequestsProvider.pageNum = 1;
allRequestsProvider.getFilterRequests(showLoader: true, status: tabs[0]['status']).whenComplete(() { allRequestsProvider.getFilterRequests(showLoader: true, status: tabs[0]['status']).whenComplete(() {
allRequestsProvider.requestDetailList = allRequestsProvider.filterRequest; allRequestsProvider.requestDetailList = allRequestsProvider.filterRequest;
}); });
allRequestsProvider.isAllLoading = false; allRequestsProvider.isAllLoading = false;
notificationsProvider.getSystemNotifications(user: userProvider.user, resetProvider: true); notificationsProvider.getSystemNotifications(user: userProvider.user!, resetProvider: true);
} }
void handleScroll() async{ void handleScroll() async {
_scrollController = ScrollController(); _scrollController = ScrollController();
_scrollController.addListener(() async { _scrollController.addListener(() async {
if (_scrollController?.position?.pixels == if (_scrollController?.position?.pixels == _scrollController?.position?.maxScrollExtent && !allRequestsProvider.isFilterRequestLoading) {
_scrollController?.position?.maxScrollExtent &&
!allRequestsProvider.isFilterRequestLoading) {
allRequestsProvider.pageNum = allRequestsProvider.pageNum + 1; allRequestsProvider.pageNum = allRequestsProvider.pageNum + 1;
await allRequestsProvider.getFilterRequests(showLoader:false,status: allRequestsProvider.status); await allRequestsProvider.getFilterRequests(showLoader: false, status: allRequestsProvider.status);
} }
}); });
} }
@override @override
void dispose() { void dispose() {
_scrollController.dispose(); _scrollController.dispose();
@ -124,26 +115,18 @@ class _DashboardViewState extends State<DashboardView> {
)), )),
body: RefreshIndicator( body: RefreshIndicator(
onRefresh: () async { onRefresh: () async {
getInitialData(); getInitialData();
return Future.delayed(const Duration(milliseconds: 250)); return Future.delayed(const Duration(milliseconds: 250));
}, },
child: Scrollbar( child: Scrollbar(
controller: _scrollController, controller: _scrollController,
child: SingleChildScrollView( child: SingleChildScrollView(
// physics: AlwaysScrollableScrollPhysics(), // physics: AlwaysScrollableScrollPhysics(),
controller: _scrollController, controller: _scrollController,
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [14.height, ProgressFragment(), 25.height, SizedBox(height: 110.toScreenHeight, child: const RequestsFragment()), 16.height, const RequestCategoryFragment()],
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), ).paddingOnly(start: 16, end: 16, top: 0, bottom: 8),
), ),
), ),

@ -163,16 +163,14 @@ import '../../controllers/providers/api/user_provider.dart';
import '../../models/enums/user_types.dart'; import '../../models/enums/user_types.dart';
class ProgressFragment extends StatelessWidget { class ProgressFragment extends StatelessWidget {
ProgressFragment({Key key}) : super(key: key); ProgressFragment({Key? key}) : super(key: key);
UserProvider _userProvider; late UserProvider _userProvider;
AllRequestsProvider _provider;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
bool isCurrentUserNotEngineer = (_userProvider.user.type != UsersTypes.engineer); bool isCurrentUserNotEngineer = (_userProvider.user!.type != UsersTypes.engineer);
return Consumer<AllRequestsProvider>( return Consumer<AllRequestsProvider>(
builder: (context, snapshot, _) { builder: (context, snapshot, _) {
int total = (snapshot.completedRequests?.total?.count ?? 0) + (snapshot.inProgressRequests?.total?.count ?? 0) + (isCurrentUserNotEngineer ? (snapshot.openRequests?.total?.count ?? 0) : 0); int total = (snapshot.completedRequests?.total?.count ?? 0) + (snapshot.inProgressRequests?.total?.count ?? 0) + (isCurrentUserNotEngineer ? (snapshot.openRequests?.total?.count ?? 0) : 0);

@ -10,12 +10,14 @@ extension StringExtensions on String {
DateTime dateTime = DateTime.parse(this); DateTime dateTime = DateTime.parse(this);
return "${DateFormat('dd MMM, yyyy').format(dateTime)}\n${DateFormat('hh:mm a').format(dateTime)}"; return "${DateFormat('dd MMM, yyyy').format(dateTime)}\n${DateFormat('hh:mm a').format(dateTime)}";
} }
String get toDragAbleTimerFormat { String get toDragAbleTimerFormat {
DateTime dateTime = DateTime.tryParse(this); DateTime dateTime = DateTime.parse(this);
return DateFormat('HH:mm:ss').format(dateTime); return DateFormat('HH:mm:ss').format(dateTime);
} }
String get toInitialVisitCardFormat { String get toInitialVisitCardFormat {
DateTime dateTime = DateTime.tryParse(this); DateTime dateTime = DateTime.parse(this);
return "${DateFormat('dd MMM, yyyy').format(dateTime)} at ${DateFormat('hh:mm a').format(dateTime)}"; return "${DateFormat('dd MMM, yyyy').format(dateTime)} at ${DateFormat('hh:mm a').format(dateTime)}";
} }

@ -16,7 +16,9 @@ extension TextStyles on String {
Text heading4(BuildContext context) => getTextWithStyle(this, AppTextStyles.heading4, context.isDark ? AppColor.neutral30 : AppColor.neutral50); Text heading4(BuildContext context) => getTextWithStyle(this, AppTextStyles.heading4, context.isDark ? AppColor.neutral30 : AppColor.neutral50);
Text heading5(BuildContext context) => getTextWithStyle(this, AppTextStyles.heading5, context.isDark ? AppColor.neutral30 : AppColor.neutral50); Text heading5(BuildContext context) => getTextWithStyle(this, AppTextStyles.heading5, context.isDark ? AppColor.neutral30 : AppColor.neutral50);
Text bottomSheetHeadingTextStyle(BuildContext context) => getTextWithStyle(this, AppTextStyles.bottomSheetHeadingTextStyle, context.isDark ? AppColor.neutral30 : AppColor.black20); Text bottomSheetHeadingTextStyle(BuildContext context) => getTextWithStyle(this, AppTextStyles.bottomSheetHeadingTextStyle, context.isDark ? AppColor.neutral30 : AppColor.black20);
Text customHeadingText(BuildContext context) => getTextWithStyle(this, AppTextStyles.customHeadingText, context.isDark ? AppColor.neutral30 : AppColor.neutral50); Text customHeadingText(BuildContext context) => getTextWithStyle(this, AppTextStyles.customHeadingText, context.isDark ? AppColor.neutral30 : AppColor.neutral50);
Text heading6(BuildContext context) => getTextWithStyle(this, AppTextStyles.heading6, context.isDark ? AppColor.neutral30 : AppColor.neutral50); Text heading6(BuildContext context) => getTextWithStyle(this, AppTextStyles.heading6, context.isDark ? AppColor.neutral30 : AppColor.neutral50);
@ -33,11 +35,11 @@ extension TextStyles on String {
} }
extension CustomText on Text { extension CustomText on Text {
Text custom({Color color, FontWeight fontWeight, TextAlign align,double fontSize,double lineHeight,double letterSpacing}) { Text custom({Color? color, FontWeight? fontWeight, TextAlign? align, double? fontSize, double? lineHeight, double? letterSpacing}) {
return Text( return Text(
data, data!,
textAlign: align, textAlign: align,
style: style.copyWith( style: style?.copyWith(
color: color, color: color,
height: lineHeight, height: lineHeight,
letterSpacing: letterSpacing, letterSpacing: letterSpacing,
@ -93,12 +95,16 @@ abstract class AppTextStyles {
decoration: TextDecoration.none, decoration: TextDecoration.none,
); );
static const TextStyle customHeadingText = TextStyle( static const TextStyle customHeadingText = TextStyle(
fontFamily: 'Poppins', fontFamily: 'Poppins',
fontSize: 27, // Font size in logical pixels fontSize: 27,
fontWeight: FontWeight.w500, // Equivalent to font-weight: 500 // Font size in logical pixels
height: 31 / 27, // Line height (in Flutter, it's a multiplier of font size) fontWeight: FontWeight.w500,
letterSpacing: -0.04 * 27, // Letter spacing, converted to logical pixels // Equivalent to font-weight: 500
color: Colors.black, // Set your desired text color height: 31 / 27,
// Line height (in Flutter, it's a multiplier of font size)
letterSpacing: -0.04 * 27,
// Letter spacing, converted to logical pixels
color: Colors.black, // Set your desired text color
); );
static final TextStyle heading6 = TextStyle( static final TextStyle heading6 = TextStyle(
@ -161,27 +167,12 @@ extension CapExtension on String {
} }
extension FilesExtension on String { extension FilesExtension on String {
SvgPicture toSvgAsset({ SvgPicture toSvgAsset({int? width, int? height, Color? color, BoxFit fit = BoxFit.contain}) =>
int width,
int height,
Color color,
BoxFit fit = BoxFit.contain,
}) =>
SvgPicture.asset("assets/images/$this.svg", width: width?.toScreenWidth, height: height?.toScreenHeight, color: color, fit: fit); SvgPicture.asset("assets/images/$this.svg", width: width?.toScreenWidth, height: height?.toScreenHeight, color: color, fit: fit);
Image toPngAsset({ Image toPngAsset({int? width, int? height, Color? color, BoxFit fit = BoxFit.contain}) =>
int width,
int height,
Color color,
BoxFit fit = BoxFit.contain,
}) =>
Image.asset("assets/images/$this.png", width: width?.toScreenWidth, height: height?.toScreenHeight, color: color, fit: fit); Image.asset("assets/images/$this.png", width: width?.toScreenWidth, height: height?.toScreenHeight, color: color, fit: fit);
LottieBuilder toLottieAsset({ LottieBuilder toLottieAsset({int? width, int? height, BoxFit fit = BoxFit.contain, bool repeat = true}) =>
int width,
int height,
BoxFit fit = BoxFit.contain,
bool repeat = true,
}) =>
Lottie.asset("assets/lottie/$this.json", width: width?.toScreenWidth, height: height?.toScreenHeight, fit: fit, repeat: repeat); Lottie.asset("assets/lottie/$this.json", width: width?.toScreenWidth, height: height?.toScreenHeight, fit: fit, repeat: repeat);
} }

@ -18,30 +18,32 @@ extension WidgetExtensions on Widget {
Widget circle(double value) => ClipRRect(borderRadius: BorderRadius.circular(value), child: this); Widget circle(double value) => ClipRRect(borderRadius: BorderRadius.circular(value), child: this);
Widget paddingAll(double value) => Padding(padding: EdgeInsets.all(value), child: this); Widget paddingAll(double value) => Padding(padding: EdgeInsets.all(value), child: this);
Widget indicatorWidget({double height,double width,Color color})=> Container(
width: height??40.toScreenWidth, Widget indicatorWidget({double? height, double? width, Color? color}) => Container(
height: width??5.toScreenHeight, width: height ?? 40.toScreenWidth,
decoration: BoxDecoration(color:color?? AppColor.white50, borderRadius: BorderRadius.circular(30)), height: width ?? 5.toScreenHeight,
child: this, decoration: BoxDecoration(color: color ?? AppColor.white50, borderRadius: BorderRadius.circular(30)),
); child: this,
Widget flushBar({@required BuildContext context,String title,String message,double duration,Color backgroundColor})=>Flushbar( );
flushbarPosition: FlushbarPosition.TOP,
backgroundColor:backgroundColor?? AppColor.green70, Widget flushBar({required BuildContext context, required String title, required String message, int? duration, Color? backgroundColor}) => Flushbar(
title: title ?? "Hey Ninja", flushbarPosition: FlushbarPosition.TOP,
message: message ?? "Lorem Ipsum is simply dummy text of the printing and typesetting industry", backgroundColor: backgroundColor ?? AppColor.green70,
duration: Duration(seconds: duration ?? 3), title: title,
flushbarStyle: FlushbarStyle.GROUNDED, message: message,
reverseAnimationCurve: Curves.easeInOut, duration: Duration(seconds: duration ?? 3),
mainButton: IconButton( flushbarStyle: FlushbarStyle.GROUNDED,
onPressed: () { reverseAnimationCurve: Curves.easeInOut,
Navigator.pop(context); mainButton: IconButton(
}, onPressed: () {
icon: const Icon( Navigator.pop(context);
Icons.close, },
color: AppColor.white20, icon: const Icon(
), Icons.close,
), color: AppColor.white20,
)..show(context); ),
),
)..show(context);
Widget paddingOnly({int start = 0, int end = 0, int top = 0, int bottom = 0}) => Widget paddingOnly({int start = 0, int end = 0, int top = 0, int bottom = 0}) =>
Padding(padding: EdgeInsetsDirectional.only(start: start.toScreenWidth, end: end.toScreenWidth, top: top.toScreenHeight, bottom: bottom.toScreenHeight), child: this); Padding(padding: EdgeInsetsDirectional.only(start: start.toScreenWidth, end: end.toScreenWidth, top: top.toScreenHeight, bottom: bottom.toScreenHeight), child: this);
@ -87,15 +89,17 @@ extension WidgetExtensions on Widget {
child: this, child: this,
) )
: this; : this;
Widget bottomSheetContainer(BuildContext context, { EdgeInsets padding}) => Container(
clipBehavior: Clip.antiAlias, Widget bottomSheetContainer(BuildContext context, {EdgeInsets? padding}) => Container(
margin: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), clipBehavior: Clip.antiAlias,
decoration: BoxDecoration( margin: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
color:AppColor.background(context), decoration: BoxDecoration(
borderRadius: const BorderRadius.only(topRight: Radius.circular(20), topLeft: Radius.circular(20)), color: AppColor.background(context),
), borderRadius: const BorderRadius.only(topRight: Radius.circular(20), topLeft: Radius.circular(20)),
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), ),
child: this,); padding: padding ?? EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight),
child: this,
);
Widget toShadowCircleContainer(BuildContext context, {bool showShadow = true, double padding = 16}) => showShadow Widget toShadowCircleContainer(BuildContext context, {bool showShadow = true, double padding = 16}) => showShadow
? Container( ? Container(

@ -1,18 +1,17 @@
class ActivitySparePartModel { class ActivitySparePartModel {
int id; int? id;
int workOrderId; int? workOrderId;
int partCatalogItemId; int? partCatalogItemId;int? quantity;
int quantity; String? comment;
String comment; List<SparePartAttachments>? sparePartAttachments;
List<SparePartAttachments> sparePartAttachments;
ActivitySparePartModel( ActivitySparePartModel({
{this.id, this.id,
this.workOrderId, this.workOrderId,
this.partCatalogItemId, this.partCatalogItemId,
this.quantity, this.quantity,
this.comment, this.comment,this.sparePartAttachments,
this.sparePartAttachments}); });
ActivitySparePartModel.fromJson(Map<String, dynamic> json) { ActivitySparePartModel.fromJson(Map<String, dynamic> json) {
id = json['id']; id = json['id'];
@ -23,8 +22,7 @@ class ActivitySparePartModel {
if (json['acitiySparePartAttachments'] != null) { if (json['acitiySparePartAttachments'] != null) {
sparePartAttachments = <SparePartAttachments>[]; sparePartAttachments = <SparePartAttachments>[];
json['acitiySparePartAttachments'].forEach((v) { json['acitiySparePartAttachments'].forEach((v) {
sparePartAttachments sparePartAttachments!.add(SparePartAttachments.fromJson(v));
.add(SparePartAttachments.fromJson(v));
}); });
} }
} }
@ -38,15 +36,15 @@ class ActivitySparePartModel {
data['comment'] = comment; data['comment'] = comment;
if (sparePartAttachments != null) { if (sparePartAttachments != null) {
data['acitiySparePartAttachments'] = data['acitiySparePartAttachments'] =
sparePartAttachments.map((v) => v.toJson()).toList(); sparePartAttachments!.map((v) => v.toJson()).toList();
} }
return data; return data;
} }
} }
class SparePartAttachments { class SparePartAttachments {
int id; int? id;
String name; String? name;
SparePartAttachments({this.id, this.name}); SparePartAttachments({this.id, this.name});
@ -61,4 +59,4 @@ class SparePartAttachments {
data['name'] = name; data['name'] = name;
return data; return data;
} }
} }

@ -1,35 +1,18 @@
class FixRemotely { class FixRemotely {
int workOrderId; int? workOrderId;
DateTime startDate; DateTime? startDate;
DateTime endDate; DateTime? endDate;
int workingHour; int? workingHour;
String comment; String? comment;
FixRemotely({ FixRemotely({this.workOrderId, this.startDate, this.endDate, this.workingHour, this.comment});
this.workOrderId,
this.startDate,
this.endDate,
this.workingHour,
this.comment,
});
factory FixRemotely.fromJson(Map<String, dynamic> json) { factory FixRemotely.fromJson(Map<String, dynamic> json) {
return FixRemotely( return FixRemotely(
workOrderId: json['workOrderId'], workOrderId: json['workOrderId'], startDate: DateTime.tryParse(json['startDate']), endDate: DateTime.tryParse(json['endDate']), workingHour: json['workingHour'], comment: json['comment']);
startDate: DateTime.parse(json['startDate']),
endDate: DateTime.parse(json['endDate']),
workingHour: json['workingHour'],
comment: json['comment'],
);
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return { return {'workOrderId': workOrderId, 'startDate': startDate?.toIso8601String(), 'endDate': endDate?.toIso8601String(), 'workingHour': workingHour, 'comment': comment};
'workOrderId': workOrderId,
'startDate': startDate.toIso8601String(),
'endDate': endDate.toIso8601String(),
'workingHour': workingHour,
'comment': comment,
};
} }
} }

@ -1,23 +1,14 @@
class MarkAsFixed { class MarkAsFixed {
int workOrderId; int? workOrderId;
String feedback; String? feedback;
MarkAsFixed({ MarkAsFixed({this.workOrderId, this.feedback});
this.workOrderId,
this.feedback,
});
factory MarkAsFixed.fromJson(Map<String, dynamic> json) { factory MarkAsFixed.fromJson(Map<String, dynamic> json) {
return MarkAsFixed( return MarkAsFixed(workOrderId: json['workOrderId'], feedback: json['feedback']);
workOrderId: json['workOrderId'],
feedback: json['feedback'],
);
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return { return {'workOrderId': workOrderId, 'feedback': feedback};
'workOrderId': workOrderId,
'feedback': feedback,
};
} }
} }

@ -1,27 +1,15 @@
class NeedVisit { class NeedVisit {
int workOrderId; int? workOrderId;
DateTime visitDate; DateTime? visitDate;
String comment; String? comment;
NeedVisit({ NeedVisit({this.workOrderId, this.visitDate, this.comment});
this.workOrderId,
this.visitDate,
this.comment,
});
factory NeedVisit.fromJson(Map<String, dynamic> json) { factory NeedVisit.fromJson(Map<String, dynamic> json) {
return NeedVisit( return NeedVisit(workOrderId: json['workOrderId'], visitDate: DateTime.tryParse(json['visitDate']), comment: json['comment']);
workOrderId: json['workOrderId'],
visitDate: DateTime.parse(json['visitDate']),
comment: json['comment'],
);
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return { return {'workOrderId': workOrderId, 'visitDate': visitDate?.toIso8601String(), 'comment': comment};
'workOrderId': workOrderId,
'visitDate': visitDate.toIso8601String(),
'comment': comment,
};
} }
} }

@ -1,27 +1,15 @@
class NurseActionModel { class NurseActionModel {
int workOrderId; int? workOrderId;
String feedback; String? feedback;
String signatureNurse; String? signatureNurse;
NurseActionModel({ NurseActionModel({this.workOrderId, this.feedback, this.signatureNurse});
this.workOrderId,
this.feedback,
this.signatureNurse,
});
factory NurseActionModel.fromJson(Map<String, dynamic> json) { factory NurseActionModel.fromJson(Map<String, dynamic> json) {
return NurseActionModel( return NurseActionModel(workOrderId: json['workOrderId'], feedback: json['feedback'], signatureNurse: json['signatureNurse']);
workOrderId: json['workOrderId'],
feedback: json['feedback'],
signatureNurse: json['signatureNurse'],
);
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return { return {'workOrderId': workOrderId, 'feedback': feedback, 'signatureNurse': signatureNurse};
'workOrderId': workOrderId,
'feedback': feedback,
'signatureNurse': signatureNurse,
};
} }
} }

@ -1,21 +1,25 @@
import 'base.dart'; import 'base.dart';
class Lookup extends Base { class Lookup extends Base {
final int id, value; int? id; // Now nullable
int? value; // Now nullable
String? name; // Now nullable
Lookup({this.id, this.value, String name}) : super(identifier: id?.toString(), name: name); Lookup({this.id, this.value, this.name}) : super(identifier: id?.toString(), name: name);
@override @override
bool operator ==(Object other) => identical(this, other) || other is Lookup && ((value != null && value == other.value) || (id != null && id == other.id)); bool operator ==(Object other) => identical(this, other) || other is Lookup && ((value != null && value == other.value) || (id != null && id == other.id));
@override @override
int get hashCode => id?.hashCode ?? value?.hashCode; int get hashCode => id.hashCode ^ value.hashCode; // Use XOR for hash code combination
toJson() { Map<String, dynamic> toJson() {
// Return a Map instead of calling a function
return {"id": id, "name": name, "value": value}; return {"id": id, "name": name, "value": value};
} }
factory Lookup.fromStatus(Lookup old) { static Lookup? fromStatus(Lookup? old) {
// Now accepts nullable Lookup and returns nullable Lookup
if (old == null) return null; if (old == null) return null;
return Lookup( return Lookup(
name: old.name, name: old.name,
@ -24,9 +28,12 @@ class Lookup extends Base {
); );
} }
factory Lookup.fromJson(Map<String, dynamic> parsedJson) { // CreatedBy.fromJson(dynamic json) {
// userId = json['userId'] ?? '';
// userName = json['userName'] ?? '';
// }
if (parsedJson == null) return null; factory Lookup.fromJson(Map<String, dynamic> parsedJson) {
return Lookup( return Lookup(
name: parsedJson["name"], name: parsedJson["name"],
id: parsedJson["id"], id: parsedJson["id"],

@ -1,21 +1,15 @@
class DashboardCount { class DashboardCount {
Data data; Data? data;
String message; String? message;
String title; String? title;
String innerMessage; String? innerMessage;
int responseCode; int? responseCode;
bool isSuccess; bool? isSuccess;
DashboardCount( DashboardCount({this.data, this.message, this.title, this.innerMessage, this.responseCode, this.isSuccess});
{this.data,
this.message,
this.title,
this.innerMessage,
this.responseCode,
this.isSuccess});
DashboardCount.fromJson(Map<String, dynamic> json) { DashboardCount.fromJson(Map<String, dynamic> json) {
data = json['data'] != null ? Data.fromJson(json['data']) : null; data = json['data'] != null ? Data.fromJson(json['data']) : null;
message = json['message']; message = json['message'];
title = json['title']; title = json['title'];
innerMessage = json['innerMessage']; innerMessage = json['innerMessage'];
@ -26,7 +20,7 @@ class DashboardCount {
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{}; final Map<String, dynamic> data = <String, dynamic>{};
if (this.data != null) { if (this.data != null) {
data['data'] = this.data.toJson(); data['data'] = this.data!.toJson();
} }
data['message'] = message; data['message'] = message;
data['title'] = title; data['title'] = title;
@ -38,28 +32,22 @@ class DashboardCount {
} }
class Data { class Data {
int countOpen; int? countOpen;
int countInprogress; int? countInprogress;
int countComplete; int? countComplete;
int countAcknowledge; int? countAcknowledge;
int countHighPriority; int? countHighPriority;
int countOverdue; int? countOverdue;
Data( Data({this.countOpen, this.countInprogress, this.countComplete, this.countAcknowledge, this.countHighPriority, this.countOverdue});
{this.countOpen,
this.countInprogress,
this.countComplete,
this.countAcknowledge,
this.countHighPriority,
this.countOverdue});
Data.fromJson(Map<String, dynamic> json) { Data.fromJson(Map<String, dynamic> json) {
countOpen = json['countOpen']??0; countOpen = json['countOpen'] ?? 0;
countInprogress = json['countInprogress']??0; countInprogress = json['countInprogress'] ?? 0;
countComplete = json['countComplete']??0; countComplete = json['countComplete'] ?? 0;
countAcknowledge = json['countAcknowledge']??0; countAcknowledge = json['countAcknowledge'] ?? 0;
countHighPriority = json['countHighPriority']??0; countHighPriority = json['countHighPriority'] ?? 0;
countOverdue = json['countOverdue']??0; countOverdue = json['countOverdue'] ?? 0;
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@ -72,4 +60,4 @@ class Data {
data['countOverdue'] = countOverdue; data['countOverdue'] = countOverdue;
return data; return data;
} }
} }

@ -1,26 +1,19 @@
class DashboardDetail { class DashboardDetail {
List<Data> data; List<Data>? data;
int totalRows; int? totalRows;
String message; String? message;
String title; String? title;
String innerMessage; String? innerMessage;
int responseCode; int? responseCode;
bool isSuccess; bool? isSuccess;
DashboardDetail( DashboardDetail({this.data, this.totalRows, this.message, this.title, this.innerMessage, this.responseCode, this.isSuccess});
{this.data,
this.totalRows,
this.message,
this.title,
this.innerMessage,
this.responseCode,
this.isSuccess});
DashboardDetail.fromJson(Map<String, dynamic> json) { DashboardDetail.fromJson(Map<String, dynamic> json) {
if (json['data'] != null) { if (json['data'] != null) {
data = <Data>[]; data = <Data>[];
json['data'].forEach((v) { json['data'].forEach((v) {
data.add(Data.fromJson(v)); data!.add(Data.fromJson(v));
}); });
} }
totalRows = json['totalRows']; totalRows = json['totalRows'];
@ -34,7 +27,7 @@ class DashboardDetail {
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{}; final Map<String, dynamic> data = <String, dynamic>{};
if (this.data != null) { if (this.data != null) {
data['data'] = this.data.map((v) => v.toJson()).toList(); data['data'] = this.data!.map((v) => v.toJson()).toList();
} }
data['totalRows'] = totalRows; data['totalRows'] = totalRows;
data['message'] = message; data['message'] = message;
@ -47,28 +40,18 @@ class DashboardDetail {
} }
class Data { class Data {
int id; int? id;
String typeTransaction; String? typeTransaction;
String transactionDate; String? transactionDate;
String statusName; String? statusName;
String priorityName; String? priorityName;
bool isHighPriority; bool? isHighPriority;
String assetName; String? assetName;
String assetNumber; String? assetNumber;
String requestTypeName; String? requestTypeName;
String requestNo; String? requestNo;
Data( Data({this.id, this.typeTransaction, this.transactionDate, this.statusName, this.priorityName, this.isHighPriority, this.assetName, this.assetNumber, this.requestTypeName, this.requestNo});
{this.id,
this.typeTransaction,
this.transactionDate,
this.statusName,
this.priorityName,
this.isHighPriority,
this.assetName,
this.assetNumber,
this.requestTypeName,
this.requestNo});
Data.fromJson(Map<String, dynamic> json) { Data.fromJson(Map<String, dynamic> json) {
id = json['id']; id = json['id'];
@ -98,22 +81,16 @@ class Data {
return data; return data;
} }
} }
class CommonResponseModel{
bool data;
String message;
String title;
String innerMessage;
int responseCode;
bool isSuccess;
CommonResponseModel({ class CommonResponseModel {
this.data, bool? data;
this.message, String? message;
this.title, String? title;
this.innerMessage, String? innerMessage;
this.responseCode, int? responseCode;
this.isSuccess, bool? isSuccess;
});
CommonResponseModel({this.data, this.message, this.title, this.innerMessage, this.responseCode, this.isSuccess});
factory CommonResponseModel.fromJson(Map<String, dynamic> json) { factory CommonResponseModel.fromJson(Map<String, dynamic> json) {
return CommonResponseModel( return CommonResponseModel(
@ -137,4 +114,3 @@ class CommonResponseModel{
}; };
} }
} }

@ -12,30 +12,29 @@ import 'package:test_sa/models/new_models/site.dart';
import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/timer_model.dart';
class GasRefillModel { class GasRefillModel {
GasRefillModel({ GasRefillModel(
this.id, {this.id,
this.gazRefillNo, this.gazRefillNo,
this.expectedDate, this.expectedDate,
this.expectedTime, this.expectedTime,
this.startDate, this.startDate,
this.startTime, this.startTime,
this.endDate, this.endDate,
this.endTime, this.endTime,
this.engSignature, this.engSignature,
this.nurseSignature, this.nurseSignature,
this.workingHours, this.workingHours,
this.site, this.site,
this.building, this.building,
this.floor, this.floor,
this.department, this.department,
this.assignedEmployee, this.assignedEmployee,
this.status, this.status,
this.comment, this.comment,
this.gazRefillDetails, this.gazRefillDetails,
this.localEngineerSignature, this.localEngineerSignature,
this.localNurseSignature, this.localNurseSignature,
this.timer, this.timer});
});
GasRefillModel.fromJson(dynamic json) { GasRefillModel.fromJson(dynamic json) {
id = json['id']; id = json['id'];

@ -1,25 +1,18 @@
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
class WorkOrderDetail { class WorkOrderDetail {
WorkOrder data; WorkOrder? data;
String message; String? message;
String title; String? title;
String innerMessage; String? innerMessage;
int responseCode; int? responseCode;
bool isSuccess; bool? isSuccess;
WorkOrderDetail({ WorkOrderDetail({this.data, this.message, this.title, this.innerMessage, this.responseCode, this.isSuccess});
this.data,
this.message,
this.title,
this.innerMessage,
this.responseCode,
this.isSuccess,
});
factory WorkOrderDetail.fromJson(Map<String, dynamic> json) { factory WorkOrderDetail.fromJson(Map<String, dynamic> json) {
return WorkOrderDetail( return WorkOrderDetail(
data: WorkOrder.fromJson(json['data']), data: json['data'] == null ? null : WorkOrder.fromJson(json['data']),
message: json['message'], message: json['message'],
title: json['title'], title: json['title'],
innerMessage: json['innerMessage'], innerMessage: json['innerMessage'],
@ -27,6 +20,7 @@ class WorkOrderDetail {
isSuccess: json['isSuccess'], isSuccess: json['isSuccess'],
); );
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return { return {
'data': data?.toJson(), 'data': data?.toJson(),
@ -40,46 +34,46 @@ class WorkOrderDetail {
} }
class WorkOrder { class WorkOrder {
String workOrderNo; String? workOrderNo;
WorkOrderCreatedBy workOrderCreatedBy; WorkOrderCreatedBy? workOrderCreatedBy;
DateTime requestedDate; DateTime? requestedDate;
Asset asset; Asset? asset;
Lookup assetGroup; Lookup? assetGroup;
Lookup manufacturer; Lookup? manufacturer;
Lookup model; Lookup? model;
Lookup assetNDModel; Lookup? assetNDModel;
Site site; Site? site;
Lookup building; Lookup? building;
Lookup floor; Lookup? floor;
Lookup department; Lookup? department;
dynamic room; dynamic room;
Lookup assetType; Lookup? assetType;
AssignedEmployee assignedEmployee; AssignedEmployee? assignedEmployee;
dynamic lastActivityStatus; dynamic lastActivityStatus;
Lookup status; Lookup? status;
Lookup nextStep; Lookup? nextStep;
dynamic assetVerificationType; dynamic assetVerificationType;
List<WorkOrderContactPerson> workOrderContactPerson; List<WorkOrderContactPerson>? workOrderContactPerson;
EquipmentStatus equipmentStatus; EquipmentStatus? equipmentStatus;
Priority priority; Priority? priority;
RequestedThrough requestedThrough; RequestedThrough? requestedThrough;
TypeOfRequest typeofRequest; TypeOfRequest? typeofRequest;
dynamic loanAvailablity; dynamic loanAvailablity;
dynamic assetLoan; dynamic assetLoan;
dynamic safety; dynamic safety;
ProblemDescription problemDescription; ProblemDescription? problemDescription;
String comments; String? comments;
String voiceNote; String? voiceNote;
List<dynamic> workOrderAttachments; List<dynamic>? workOrderAttachments;
dynamic returnToService; dynamic returnToService;
dynamic serviceType; dynamic serviceType;
dynamic failureReasone; dynamic failureReasone;
dynamic solution; dynamic solution;
dynamic totalWorkingHours; dynamic totalWorkingHours;
List<WorkOrderHistory> workOrderHistory; List<WorkOrderHistory>? workOrderHistory;
List<dynamic> activityMaintenances; List<dynamic>? activityMaintenances;
List<dynamic> activitySpareParts; List<dynamic>? activitySpareParts;
List<dynamic> activityAssetToBeRetireds; List<dynamic>? activityAssetToBeRetireds;
WorkOrder({ WorkOrder({
this.workOrderNo, this.workOrderNo,
@ -130,24 +124,22 @@ class WorkOrder {
workOrderCreatedBy: WorkOrderCreatedBy.fromJson(json['workOrderCreatedBy']), workOrderCreatedBy: WorkOrderCreatedBy.fromJson(json['workOrderCreatedBy']),
requestedDate: DateTime.parse(json['requestedDate']), requestedDate: DateTime.parse(json['requestedDate']),
asset: Asset.fromJson(json['asset']), asset: Asset.fromJson(json['asset']),
assetGroup: json['assetGroup']??Lookup.fromJson(json['assetGroup']), assetGroup: json['assetGroup'] ?? Lookup.fromJson(json['assetGroup']),
manufacturer:json['manufacturer']?? Lookup.fromJson(json['manufacturer']), manufacturer: json['manufacturer'] ?? Lookup.fromJson(json['manufacturer']),
model: json['model']?? Lookup.fromJson(json['model']), model: json['model'] ?? Lookup.fromJson(json['model']),
assetNDModel:json['assetNDModel']?? Lookup.fromJson(json['assetNDModel']), assetNDModel: json['assetNDModel'] ?? Lookup.fromJson(json['assetNDModel']),
site: Site.fromJson(json['site']), site: Site.fromJson(json['site']),
building: json['building']??Lookup.fromJson(json['building']), building: json['building'] ?? Lookup.fromJson(json['building']),
floor: json['floor']??Lookup.fromJson(json['floor']), floor: json['floor'] ?? Lookup.fromJson(json['floor']),
department:json['department']?? Lookup.fromJson(json['department']), department: json['department'] ?? Lookup.fromJson(json['department']),
room: json['room'], room: json['room'],
assetType: json['assetType']??Lookup.fromJson(json['assetType']), assetType: json['assetType'] ?? Lookup.fromJson(json['assetType']),
assignedEmployee: AssignedEmployee.fromJson(json['assignedEmployee']), assignedEmployee: AssignedEmployee.fromJson(json['assignedEmployee']),
lastActivityStatus: json['lastActivityStatus'], lastActivityStatus: json['lastActivityStatus'],
status: json['status']??Lookup.fromJson(json['status']), status: json['status'] ?? Lookup.fromJson(json['status']),
nextStep: json['nextStep']??Lookup.fromJson(json['nextStep']), nextStep: json['nextStep'] ?? Lookup.fromJson(json['nextStep']),
assetVerificationType: json['assetVerificationType'], assetVerificationType: json['assetVerificationType'],
workOrderContactPerson: (json['workOrderContactPerson'] as List) workOrderContactPerson: (json['workOrderContactPerson'] as List).map((i) => WorkOrderContactPerson.fromJson(i)).toList(),
.map((i) => WorkOrderContactPerson.fromJson(i))
.toList(),
equipmentStatus: EquipmentStatus.fromJson(json['equipmentStatus']), equipmentStatus: EquipmentStatus.fromJson(json['equipmentStatus']),
priority: Priority.fromJson(json['priority']), priority: Priority.fromJson(json['priority']),
requestedThrough: RequestedThrough.fromJson(json['requestedThrough']), requestedThrough: RequestedThrough.fromJson(json['requestedThrough']),
@ -164,44 +156,43 @@ class WorkOrder {
failureReasone: json['failureReasone'], failureReasone: json['failureReasone'],
solution: json['solution'], solution: json['solution'],
totalWorkingHours: json['totalWorkingHours'], totalWorkingHours: json['totalWorkingHours'],
workOrderHistory: (json['workOrderHistory'] as List) workOrderHistory: (json['workOrderHistory'] as List).map((i) => WorkOrderHistory.fromJson(i)).toList(),
.map((i) => WorkOrderHistory.fromJson(i))
.toList(),
activityMaintenances: json['activityMaintenances'] as List, activityMaintenances: json['activityMaintenances'] as List,
activitySpareParts: json['activitySpareParts'] as List, activitySpareParts: json['activitySpareParts'] as List,
activityAssetToBeRetireds: json['activityAssetToBeRetireds'] as List, activityAssetToBeRetireds: json['activityAssetToBeRetireds'] as List,
); );
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return { return {
'workOrderNo': workOrderNo, 'workOrderNo': workOrderNo,
'workOrderCreatedBy': workOrderCreatedBy.toJson(), 'workOrderCreatedBy': workOrderCreatedBy?.toJson(),
'requestedDate': requestedDate.toIso8601String(), 'requestedDate': requestedDate?.toIso8601String(),
'asset': asset.toJson(), 'asset': asset?.toJson(),
'assetGroup': assetGroup.toJson(), 'assetGroup': assetGroup?.toJson(),
'manufacturer': manufacturer.toJson(), 'manufacturer': manufacturer?.toJson(),
'model': model.toJson(), 'model': model?.toJson(),
'assetNDModel': assetNDModel.toJson(), 'assetNDModel': assetNDModel?.toJson(),
'site': site.toJson(), 'site': site?.toJson(),
'building': building.toJson(), 'building': building?.toJson(),
'floor': floor.toJson(), 'floor': floor?.toJson(),
'department': department.toJson(), 'department': department?.toJson(),
'room': room, 'room': room,
'assetType': assetType.toJson(), 'assetType': assetType?.toJson(),
'assignedEmployee': assignedEmployee.toJson(), 'assignedEmployee': assignedEmployee?.toJson(),
'lastActivityStatus': lastActivityStatus, 'lastActivityStatus': lastActivityStatus,
'status': status.toJson(), 'status': status?.toJson(),
'nextStep': nextStep.toJson(), 'nextStep': nextStep?.toJson(),
'assetVerificationType': assetVerificationType, 'assetVerificationType': assetVerificationType,
'workOrderContactPerson': workOrderContactPerson.map((i) => i.toJson()).toList(), 'workOrderContactPerson': workOrderContactPerson?.map((i) => i.toJson()).toList(),
'equipmentStatus': equipmentStatus.toJson(), 'equipmentStatus': equipmentStatus?.toJson(),
'priority': priority.toJson(), 'priority': priority?.toJson(),
'requestedThrough': requestedThrough.toJson(), 'requestedThrough': requestedThrough?.toJson(),
'typeofRequest': typeofRequest.toJson(), 'typeofRequest': typeofRequest?.toJson(),
'loanAvailablity': loanAvailablity, 'loanAvailablity': loanAvailablity,
'assetLoan': assetLoan, 'assetLoan': assetLoan,
'safety': safety, 'safety': safety,
'problemDescription': problemDescription.toJson(), 'problemDescription': problemDescription?.toJson(),
'comments': comments, 'comments': comments,
'voiceNote': voiceNote, 'voiceNote': voiceNote,
'workOrderAttachments': workOrderAttachments, 'workOrderAttachments': workOrderAttachments,
@ -210,75 +201,55 @@ class WorkOrder {
'failureReasone': failureReasone, 'failureReasone': failureReasone,
'solution': solution, 'solution': solution,
'totalWorkingHours': totalWorkingHours, 'totalWorkingHours': totalWorkingHours,
'workOrderHistory': workOrderHistory.map((i) => i.toJson()).toList(), 'workOrderHistory': workOrderHistory?.map((i) => i.toJson()).toList(),
'activityMaintenances': activityMaintenances, 'activityMaintenances': activityMaintenances,
'activitySpareParts': activitySpareParts, 'activitySpareParts': activitySpareParts,
'activityAssetToBeRetireds': activityAssetToBeRetireds, 'activityAssetToBeRetireds': activityAssetToBeRetireds,
}; };
} }
} }
class WorkOrderCreatedBy { class WorkOrderCreatedBy {
String id; String? id;
String userName; String? userName;
WorkOrderCreatedBy({this.id, this.userName}); WorkOrderCreatedBy({this.id, this.userName});
factory WorkOrderCreatedBy.fromJson(Map<String, dynamic> json) { factory WorkOrderCreatedBy.fromJson(Map<String, dynamic> json) {
return WorkOrderCreatedBy( return WorkOrderCreatedBy(id: json['id'], userName: json['userName']);
id: json['id'],
userName: json['userName'],
);
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return { return {'id': id, 'userName': userName};
'id': id,
'userName': userName,
};
} }
} }
class Asset { class Asset {
int id; int? id;
String assetNumber; String? assetNumber;
Asset({this.id, this.assetNumber}); Asset({this.id, this.assetNumber});
factory Asset.fromJson(Map<String, dynamic> json) { factory Asset.fromJson(Map<String, dynamic> json) {
return Asset( return Asset(id: json['id'], assetNumber: json['assetNumber']);
id: json['id'],
assetNumber: json['assetNumber'],
);
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return { return {'id': id, 'assetNumber': assetNumber};
'id': id,
'assetNumber': assetNumber,
};
} }
} }
class WorkOrderContactPerson { class WorkOrderContactPerson {
int id; int? id;
String name; String? name;
String employeeId; String? employeeId;
String position; String? position;
String extension; String? extension;
String email; String? email;
String mobilePhone; String? mobilePhone;
ContactUser contactUser; ContactUser? contactUser;
WorkOrderContactPerson({ WorkOrderContactPerson({this.id, this.name, this.employeeId, this.position, this.extension, this.email, this.mobilePhone, this.contactUser});
this.id,
this.name,
this.employeeId,
this.position,
this.extension,
this.email,
this.mobilePhone,
this.contactUser,
});
factory WorkOrderContactPerson.fromJson(Map<String, dynamic> json) { factory WorkOrderContactPerson.fromJson(Map<String, dynamic> json) {
return WorkOrderContactPerson( return WorkOrderContactPerson(
@ -289,7 +260,7 @@ class WorkOrderContactPerson {
extension: json['extension'], extension: json['extension'],
email: json['email'], email: json['email'],
mobilePhone: json['mobilePhone'], mobilePhone: json['mobilePhone'],
contactUser: ContactUser.fromJson(json['contactUser']), contactUser: json['contactUser'] == null ? null : ContactUser.fromJson(json['contactUser']),
); );
} }
@ -302,72 +273,53 @@ class WorkOrderContactPerson {
'extension': extension, 'extension': extension,
'email': email, 'email': email,
'mobilePhone': mobilePhone, 'mobilePhone': mobilePhone,
'contactUser': contactUser.toJson(), 'contactUser': contactUser?.toJson(),
}; };
} }
} }
class ContactUser { class ContactUser {
String id; String? id;
String userName; String? userName;
ContactUser({ ContactUser({this.id, this.userName});
this.id,
this.userName,
});
factory ContactUser.fromJson(Map<String, dynamic> json) { factory ContactUser.fromJson(Map<String, dynamic> json) {
return ContactUser( return ContactUser(id: json['id'], userName: json['userName']);
id: json['id'],
userName: json['userName'],
);
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return { return {'id': id, 'userName': userName};
'id': id,
'userName': userName,
};
} }
} }
class AssignedEmployee { class AssignedEmployee {
String id; String? id;
String userName; String? userName;
AssignedEmployee({this.id, this.userName}); AssignedEmployee({this.id, this.userName});
factory AssignedEmployee.fromJson(Map<String, dynamic> json) { factory AssignedEmployee.fromJson(Map<String, dynamic> json) {
return AssignedEmployee( return AssignedEmployee(id: json['id'], userName: json['userName']);
id: json['id'],
userName: json['userName'],
);
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return { return {'id': id, 'userName': userName};
'id': id,
'userName': userName,
};
} }
} }
class Site { class Site {
int id; int? id;
String siteName; String? siteName;
Site({this.id, this.siteName}); Site({this.id, this.siteName});
factory Site.fromJson(Map<String, dynamic> json) { factory Site.fromJson(Map<String, dynamic> json) {
return Site( return Site(id: json['id'], siteName: json['siteName']);
id: json['id'],
siteName: json['siteName'],
);
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return { return {'id': id, 'siteName': siteName};
'id': id,
'siteName': siteName,
};
} }
} }
@ -589,151 +541,118 @@ class Site {
// } // }
// } // }
class EquipmentStatus { class EquipmentStatus {
int id; int? id;
String name; String? name;
int value; int? value;
EquipmentStatus({this.id, this.name, this.value}); EquipmentStatus({this.id, this.name, this.value});
factory EquipmentStatus.fromJson(Map<String, dynamic> json) { factory EquipmentStatus.fromJson(Map<String, dynamic> json) {
return EquipmentStatus( return EquipmentStatus(id: json['id'], name: json['name'], value: json['value']);
id: json['id'],
name: json['name'],
value: json['value'],
);
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return { return {'id': id, 'name': name, 'value': value};
'id': id,
'name': name,
'value': value,
};
} }
} }
class Priority { class Priority {
int id; int? id;
String name; String? name;
int value; int? value;
Priority({this.id, this.name, this.value}); Priority({this.id, this.name, this.value});
factory Priority.fromJson(Map<String, dynamic> json) { factory Priority.fromJson(Map<String, dynamic> json) {
return Priority( return Priority(id: json['id'], name: json['name'], value: json['value']);
id: json['id'],
name: json['name'],
value: json['value'],
);
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return { return {'id': id, 'name': name, 'value': value};
'id': id,
'name': name,
'value': value,
};
} }
} }
class RequestedThrough { class RequestedThrough {
int id; int? id;
String name; String? name;
RequestedThrough({this.id, this.name}); RequestedThrough({this.id, this.name});
factory RequestedThrough.fromJson(Map<String, dynamic> json) { factory RequestedThrough.fromJson(Map<String, dynamic> json) {
return RequestedThrough( return RequestedThrough(id: json['id'], name: json['name']);
id: json['id'],
name: json['name'],
);
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return { return {'id': id, 'name': name};
'id': id,
'name': name,
};
} }
} }
class TypeOfRequest { class TypeOfRequest {
int id; int? id;
String name; String? name;
TypeOfRequest({this.id, this.name}); TypeOfRequest({this.id, this.name});
factory TypeOfRequest.fromJson(Map<String, dynamic> json) { factory TypeOfRequest.fromJson(Map<String, dynamic> json) {
return TypeOfRequest( return TypeOfRequest(id: json['id'], name: json['name']);
id: json['id'],
name: json['name'],
);
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return { return {'id': id, 'name': name};
'id': id,
'name': name,
};
} }
} }
class ProblemDescription { class ProblemDescription {
int id; int? id;
String name; String? name;
ProblemDescription({this.id, this.name}); ProblemDescription({this.id, this.name});
factory ProblemDescription.fromJson(Map<String, dynamic> json) { factory ProblemDescription.fromJson(Map<String, dynamic> json) {
return ProblemDescription( return ProblemDescription(id: json['id'], name: json['name']);
id: json['id'],
name: json['name'],
);
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return { return {'id': id, 'name': name};
'id': id,
'name': name,
};
} }
} }
class WorkOrderHistory { class WorkOrderHistory {
int id; int? id;
Lookup workOrderStatus; Lookup? workOrderStatus;
dynamic activityStatus; // Since activityStatus is null, it's dynamic dynamic activityStatus; // Since activityStatus is null, it's dynamic
String date; String? date;
HistoryUser user; HistoryUser? user;
Lookup step; Lookup? step;
dynamic fixRemotelyStartTime; // Since it's null, it's dynamic dynamic fixRemotelyStartTime; // Since it's null, it's dynamic
dynamic fixRemotelyEndTime; // 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 dynamic fixRemotelyWorkingHours; // Since it's null, it's dynamic
String comments; String? comments;
dynamic needAVisitDateTime; // Since it's null, it's dynamic dynamic needAVisitDateTime; // Since it's null, it's dynamic
WorkOrderHistory({ WorkOrderHistory(
this.id, {this.id,
this.workOrderStatus, this.workOrderStatus,
this.activityStatus, this.activityStatus,
this.date, this.date,
this.user, this.user,
this.step, this.step,
this.fixRemotelyStartTime, this.fixRemotelyStartTime,
this.fixRemotelyEndTime, this.fixRemotelyEndTime,
this.fixRemotelyWorkingHours, this.fixRemotelyWorkingHours,
this.comments, this.comments,
this.needAVisitDateTime, this.needAVisitDateTime});
});
factory WorkOrderHistory.fromJson(Map<String, dynamic> json) { factory WorkOrderHistory.fromJson(Map<String, dynamic> json) {
return WorkOrderHistory( return WorkOrderHistory(
id: json['id'], id: json['id'],
//json['assetType'] != null ? Lookup.fromJson(json['assetType']) : null; //json['assetType'] != null ? Lookup.fromJson(json['assetType']) : null;
workOrderStatus:json['workorderStatus']??Lookup.fromJson(json['workorderStatus']), workOrderStatus: json['workorderStatus'] ?? Lookup.fromJson(json['workorderStatus']),
activityStatus: json['activityStatus'], activityStatus: json['activityStatus'],
date: json['date'], date: json['date'],
user: HistoryUser.fromJson(json['user']), user: HistoryUser.fromJson(json['user']),
step: json['step']??Lookup.fromJson(json['step']), step: json['step'] ?? Lookup.fromJson(json['step']),
fixRemotelyStartTime: json['fixRemotlyStartTime'], fixRemotelyStartTime: json['fixRemotlyStartTime'],
fixRemotelyEndTime: json['fixRemotlyEndTime'], fixRemotelyEndTime: json['fixRemotlyEndTime'],
fixRemotelyWorkingHours: json['fixRemotlyWorkingHours'], fixRemotelyWorkingHours: json['fixRemotlyWorkingHours'],
@ -746,11 +665,11 @@ class WorkOrderHistory {
return { return {
'id': id, 'id': id,
// Lookup.fromJson(json['workorderStatus']) // Lookup.fromJson(json['workorderStatus'])
'workorderStatus': workOrderStatus.toJson(), 'workorderStatus': workOrderStatus?.toJson(),
'activityStatus': activityStatus, 'activityStatus': activityStatus,
'date': date, 'date': date,
'user': user.toJson(), 'user': user?.toJson(),
'step': step.toJson(), 'step': step?.toJson(),
'fixRemotelyStartTime': fixRemotelyStartTime, 'fixRemotelyStartTime': fixRemotelyStartTime,
'fixRemotelyEndTime': fixRemotelyEndTime, 'fixRemotelyEndTime': fixRemotelyEndTime,
'fixRemotelyWorkingHours': fixRemotelyWorkingHours, 'fixRemotelyWorkingHours': fixRemotelyWorkingHours,
@ -789,26 +708,17 @@ class WorkOrderHistory {
// } // }
class HistoryUser { class HistoryUser {
String id; String? id;
String userName; String? userName;
HistoryUser({ HistoryUser({this.id, this.userName});
this.id,
this.userName,
});
factory HistoryUser.fromJson(Map<String, dynamic> json) { factory HistoryUser.fromJson(Map<String, dynamic> json) {
return HistoryUser( return HistoryUser(id: json['id'], userName: json['userName']);
id: json['id'],
userName: json['userName'],
);
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return { return {'id': id, 'userName': userName};
'id': id,
'userName': userName,
};
} }
} }
@ -839,4 +749,3 @@ class HistoryUser {
// }; // };
// } // }
// } // }

@ -19,8 +19,8 @@ class AppThemes {
), ),
bottomNavigationBarTheme: BottomNavigationBarThemeData( bottomNavigationBarTheme: BottomNavigationBarThemeData(
type: BottomNavigationBarType.fixed, type: BottomNavigationBarType.fixed,
unselectedLabelStyle: ThemeData.light().textTheme.bodySmall.copyWith(fontWeight: FontWeight.w500), unselectedLabelStyle: ThemeData.light().textTheme.bodySmall?.copyWith(fontWeight: FontWeight.w500),
selectedLabelStyle: ThemeData.light().textTheme.bodySmall.copyWith(fontWeight: FontWeight.w500), selectedLabelStyle: ThemeData.light().textTheme.bodySmall?.copyWith(fontWeight: FontWeight.w500),
selectedItemColor: AppColor.primary90, selectedItemColor: AppColor.primary90,
unselectedItemColor: AppColor.neutral120, unselectedItemColor: AppColor.neutral120,
backgroundColor: Colors.white, backgroundColor: Colors.white,
@ -47,8 +47,8 @@ class AppThemes {
), ),
bottomNavigationBarTheme: BottomNavigationBarThemeData( bottomNavigationBarTheme: BottomNavigationBarThemeData(
type: BottomNavigationBarType.fixed, type: BottomNavigationBarType.fixed,
unselectedLabelStyle: ThemeData.dark().textTheme.bodySmall.copyWith(fontWeight: FontWeight.w500), unselectedLabelStyle: ThemeData.dark().textTheme.bodySmall?.copyWith(fontWeight: FontWeight.w500),
selectedLabelStyle: ThemeData.dark().textTheme.bodySmall.copyWith(fontWeight: FontWeight.w500), selectedLabelStyle: ThemeData.dark().textTheme.bodySmall?.copyWith(fontWeight: FontWeight.w500),
selectedItemColor: AppColor.primary40, selectedItemColor: AppColor.primary40,
unselectedItemColor: AppColor.neutral10, unselectedItemColor: AppColor.neutral10,
backgroundColor: AppColor.neutral60, backgroundColor: AppColor.neutral60,

@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
@ -12,11 +11,11 @@ class AppBottomNavigationBar extends StatelessWidget {
final Function(int index) onPressed; final Function(int index) onPressed;
final int selectedIndex; final int selectedIndex;
const AppBottomNavigationBar({Key key, @required this.onPressed, @required this.selectedIndex}) : super(key: key); const AppBottomNavigationBar({Key? key, required this.onPressed, required this.selectedIndex}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
bool isEngineer = (Provider.of<UserProvider>(context, listen: false).user.type) == UsersTypes.engineer; bool isEngineer = (Provider.of<UserProvider>(context, listen: false).user!.type) == UsersTypes.engineer;
return Container( return Container(
// height: 86.toScreenHeight, // height: 86.toScreenHeight,
decoration: BoxDecoration( decoration: BoxDecoration(
@ -41,19 +40,19 @@ class AppBottomNavigationBar extends StatelessWidget {
); );
} }
BottomNavigationBarItem navBarItem(BuildContext context, {@required int index, @required String iconName, @required String label, bool showLabel = true}) { BottomNavigationBarItem navBarItem(BuildContext context, {required int index, required String iconName, required String label, bool showLabel = true}) {
return BottomNavigationBarItem( return BottomNavigationBarItem(
icon: iconName icon: iconName
?.toSvgAsset( .toSvgAsset(
width: showLabel ? 28 : 38, width: showLabel ? 28 : 38,
height: showLabel ? 26 : 40, height: showLabel ? 26 : 40,
color: showLabel||(showLabel && selectedIndex != 2) color: showLabel || (showLabel && selectedIndex != 2)
? selectedIndex == index ? selectedIndex == index
? Theme.of(context).bottomNavigationBarTheme.selectedItemColor ? Theme.of(context).bottomNavigationBarTheme.selectedItemColor
: Theme.of(context).bottomNavigationBarTheme.unselectedItemColor : Theme.of(context).bottomNavigationBarTheme.unselectedItemColor
: null, : null,
) )
?.paddingOnly(top: 21, bottom: showLabel ? 4 : 0), .paddingOnly(top: 21, bottom: showLabel ? 4 : 0),
label: showLabel ? label : '', label: showLabel ? label : '',
); );
} }

@ -10,11 +10,11 @@ import '../app_style/app_color.dart';
class AppDashedButton extends StatelessWidget { class AppDashedButton extends StatelessWidget {
final String title; final String title;
final VoidCallback onPressed; final VoidCallback onPressed;
double height; double? height;
Color buttonColor; Color? buttonColor;
Widget icon; Widget? icon;
AppDashedButton({@required this.title, @required this.onPressed, Key key,this.height,this.icon,this.buttonColor}) : super(key: key); AppDashedButton({required this.title, required this.onPressed, Key? key, this.height, this.icon, this.buttonColor}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -26,20 +26,20 @@ class AppDashedButton extends StatelessWidget {
child: DottedBorder( child: DottedBorder(
strokeWidth: 1, strokeWidth: 1,
padding: EdgeInsets.symmetric(vertical: 16.toScreenHeight, horizontal: 16.toScreenWidth), padding: EdgeInsets.symmetric(vertical: 16.toScreenHeight, horizontal: 16.toScreenWidth),
color: context.isDark ? AppColor.primary40 : buttonColor?? AppColor.black20, color: context.isDark ? AppColor.primary40 : buttonColor ?? AppColor.black20,
dashPattern: const [4, 3], dashPattern: const [4, 3],
radius: const Radius.circular(10), radius: const Radius.circular(10),
borderType: BorderType.RRect, borderType: BorderType.RRect,
child:icon!=null? child: icon != null
Row( ? Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
icon, icon!,
7.width, 7.width,
title.heading6(context).custom(color: context.isDark ? AppColor.primary40 : buttonColor??AppColor.black10).center, title.heading6(context).custom(color: context.isDark ? AppColor.primary40 : buttonColor ?? AppColor.black10).center,
], ],
): )
title.heading6(context).custom(color: context.isDark ? AppColor.primary40 : buttonColor?? AppColor.primary10).center, : title.heading6(context).custom(color: context.isDark ? AppColor.primary40 : buttonColor ?? AppColor.primary10).center,
), ),
).onPress(onPressed); ).onPress(onPressed);
} }

@ -5,27 +5,15 @@ import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
class AppFilledButton extends StatelessWidget { class AppFilledButton extends StatelessWidget {
final VoidCallback onPressed; final VoidCallback? onPressed;
final String label; final String label;
final bool maxWidth, loading; final bool maxWidth, loading;
final Color buttonColor; final Color? buttonColor;
final Color textColor; final Color? textColor;
final bool showBorder; final bool showBorder;
final bool showIcon;
final Widget icon;
const AppFilledButton({ const AppFilledButton({ this.onPressed, required this.label, this.maxWidth = false, this.loading = false, this.showBorder = false, this.buttonColor, this.textColor, Key? key})
@required this.onPressed, : super(key: key);
@required this.label,
this.maxWidth = false,
this.icon,
this.loading = false,
this.showBorder = false,
this.showIcon = false,
this.buttonColor,
this.textColor,
Key key,
}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -40,25 +28,14 @@ class AppFilledButton extends StatelessWidget {
), ),
child: loading child: loading
? SizedBox( ? SizedBox(
width: 24, width: 24,
height: 24, height: 24,
child: CircularProgressIndicator( child: CircularProgressIndicator(
color: textColor ?? AppColor.background(context), color: textColor ?? AppColor.background(context),
strokeWidth: 2, strokeWidth: 2,
), ),
) )
: showIcon&&icon!=null? : label.heading6(context).custom(color: textColor ?? AppColor.background(context)),
Center(
child: Row(
mainAxisSize:MainAxisSize.min,
children: [
icon,
8.width,
label.heading6(context).custom(color: textColor ?? AppColor.background(context))
],
),
):
label.heading6(context).custom(color: textColor ?? AppColor.background(context)),
).onPress(onPressed); ).onPress(onPressed);
} }
} }

@ -29,7 +29,7 @@ import 'dashboard_page.dart';
class LandPage extends StatefulWidget { class LandPage extends StatefulWidget {
static const String routeName = "/land-page"; static const String routeName = "/land-page";
const LandPage({Key key}) : super(key: key); const LandPage({Key? key}) : super(key: key);
@override @override
State<LandPage> createState() => _LandPageState(); State<LandPage> createState() => _LandPageState();
@ -39,8 +39,8 @@ class _LandPageState extends State<LandPage> {
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
int currentPageIndex = 0; int currentPageIndex = 0;
bool showAppbar = true; bool showAppbar = true;
List<Widget> _pages; late List<Widget> _pages;
UserProvider _userProvider; UserProvider? _userProvider;
@override @override
void initState() { void initState() {
@ -104,11 +104,11 @@ class _LandPageState extends State<LandPage> {
_userProvider = Provider.of<UserProvider>(context, listen: false); _userProvider = Provider.of<UserProvider>(context, listen: false);
_pages = <Widget>[ _pages = <Widget>[
DashboardView(onDrawerPress: (() { DashboardView(onDrawerPress: (() {
_scaffoldKey.currentState.isDrawerOpen ? _scaffoldKey.currentState.closeDrawer() : _scaffoldKey.currentState.openDrawer(); _scaffoldKey.currentState!.isDrawerOpen ? _scaffoldKey.currentState!.closeDrawer() : _scaffoldKey.currentState!.openDrawer();
})), })),
// const old_page.LandPage(), // const old_page.LandPage(),
const MyRequestsPage(), const MyRequestsPage(),
if (_userProvider.user.type != UsersTypes.engineer) const CalendarPage(), if (_userProvider!.user!.type != UsersTypes.engineer) const CalendarPage(),
const MyAssetsPage(fromBottomBar: true), const MyAssetsPage(fromBottomBar: true),
]; ];
checkLocalAuth(); checkLocalAuth();
@ -135,7 +135,7 @@ class _LandPageState extends State<LandPage> {
bottomNavigationBar: AppBottomNavigationBar( bottomNavigationBar: AppBottomNavigationBar(
selectedIndex: currentPageIndex, selectedIndex: currentPageIndex,
onPressed: (index) { onPressed: (index) {
bool isEngineer = _userProvider.user.type == UsersTypes.engineer; bool isEngineer = _userProvider!.user!.type == UsersTypes.engineer;
if (index == (!isEngineer ? 4 : 3)) { if (index == (!isEngineer ? 4 : 3)) {
showModalBottomSheet( showModalBottomSheet(
context: context, context: context,

@ -1,6 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/providers/api/all_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/all_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
@ -8,27 +7,23 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/all_requests_and_count_model.dart'; import 'package:test_sa/models/all_requests_and_count_model.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/dashboard_latest/widgets/request_category_list.dart';
import 'package:test_sa/new_views/pages/land_page/requests/request_paginated_listview.dart'; import 'package:test_sa/new_views/pages/land_page/requests/request_paginated_listview.dart';
import 'package:test_sa/new_views/pages/land_page/widgets/request_item_view_list.dart';
import 'package:test_sa/views/widgets/loaders/lazy_loading.dart';
class RequestsListPage extends StatefulWidget { class RequestsListPage extends StatefulWidget {
static const String routeName = "/requests-list-page"; static const String routeName = "/requests-list-page";
final int index; final int index;
final String title; final String title;
const RequestsListPage(this.index, this.title, {Key key}) : super(key: key); const RequestsListPage(this.index, this.title, {Key? key}) : super(key: key);
@override @override
State<RequestsListPage> createState() => _RequestsListPageState(); State<RequestsListPage> createState() => _RequestsListPageState();
} }
class _RequestsListPageState extends State<RequestsListPage> { class _RequestsListPageState extends State<RequestsListPage> {
AllRequestsProvider _provider; late AllRequestsProvider _provider;
ScrollController _scrollController; late ScrollController _scrollController;
@override @override
void initState() { void initState() {
@ -51,12 +46,11 @@ class _RequestsListPageState extends State<RequestsListPage> {
void handleScroll() async { void handleScroll() async {
_scrollController = ScrollController(); _scrollController = ScrollController();
int pageNo =1; int pageNo = 1;
_scrollController.addListener(() async { _scrollController.addListener(() async {
if (_scrollController?.position?.pixels == _scrollController?.position?.maxScrollExtent && !_provider.isRequestCategoryLoading) { if (_scrollController?.position?.pixels == _scrollController?.position?.maxScrollExtent && !_provider.isRequestCategoryLoading) {
pageNo = pageNo + 1; pageNo = pageNo + 1;
callRequestApis(showLoader: false,pageNo: pageNo); callRequestApis(showLoader: false, pageNo: pageNo);
} }
}); });
} }
@ -80,7 +74,8 @@ class _RequestsListPageState extends State<RequestsListPage> {
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
snapshot.requestDetailList = snapshot.selectedRequestCategory; snapshot.requestDetailList = snapshot.selectedRequestCategory;
}); });
return RequestPaginatedList(snapshot.selectedRequestCategory.requestsDetails ?? [], snapshot.isRequestCategoryLoading, snapshot.selectedRequestCategory.total.count, _scrollController); return RequestPaginatedList(
snapshot.selectedRequestCategory!.requestsDetails ?? [], snapshot.isRequestCategoryLoading, snapshot.selectedRequestCategory?.total?.count ?? 0, _scrollController);
} }
bool isLoading = widget.index == 0 bool isLoading = widget.index == 0
? snapshot.isHighPriorityLoading ? snapshot.isHighPriorityLoading
@ -109,7 +104,7 @@ class _RequestsListPageState extends State<RequestsListPage> {
int pageNo = 1, int pageNo = 1,
int pageSize = 10, int pageSize = 10,
}) async { }) async {
UsersTypes usersTypes = Provider.of<UserProvider>(context, listen: false).user.type; UsersTypes usersTypes = Provider.of<UserProvider>(context, listen: false).user!.type!;
print('i am here at ${widget.index}'); print('i am here at ${widget.index}');
if (widget.index == 0) { if (widget.index == 0) {

@ -9,7 +9,8 @@ import '../../models/lookup.dart';
class ReasonProvider extends LoadingListNotifier<Lookup> { class ReasonProvider extends LoadingListNotifier<Lookup> {
String serviceRequestId; String? serviceRequestId;
@override @override
Future getDate() async { Future getDate() async {
if (loading == true) return -2; if (loading == true) return -2;

@ -9,7 +9,7 @@ import 'package:test_sa/service_request_latest/views/components/bottom_sheets/se
class FooterActionButton { class FooterActionButton {
static Widget footerContainer({@required Widget child}){ static Widget footerContainer({required Widget child}){
return Align( return Align(
alignment: Alignment.bottomCenter, alignment: Alignment.bottomCenter,
child: Container( child: Container(
@ -20,7 +20,7 @@ class FooterActionButton {
); );
} }
static Widget footerWidget({@required int status,@required BuildContext context}){ static Widget footerWidget({required int status,required BuildContext context}){
switch(status){ switch(status){
//accept reject... //accept reject...
case 1: case 1:
@ -119,8 +119,8 @@ class FooterActionButton {
child: child:
AppFilledButton( AppFilledButton(
label: context.translation.iHaveArrived, label: context.translation.iHaveArrived,
showIcon: true, //showIcon: true,
icon: 'arrived_icon'.toSvgAsset(), // icon: 'arrived_icon'.toSvgAsset(),
buttonColor: AppColor.green70, buttonColor: AppColor.green70,
onPressed: () async { onPressed: () async {

@ -7,7 +7,7 @@ import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
class InitialVisitCard extends StatelessWidget { class InitialVisitCard extends StatelessWidget {
const InitialVisitCard({Key key}) : super(key: key); const InitialVisitCard({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

@ -15,28 +15,22 @@ 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/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/service_request_latest/views/components/action_button/footer_action_button.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/initial_visit_card.dart';
import 'package:test_sa/service_request_latest/views/components/timer_widget.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/asset_retired.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/comments_bottom_sheet.dart';
import 'package:test_sa/views/pages/user/requests/update_service_request_page.dart'; import 'package:test_sa/views/pages/user/requests/update_service_request_page.dart';
import 'package:test_sa/views/pages/user/requests/work_order/work_orders_list_page.dart';
import 'package:test_sa/views/widgets/images/files_list.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/app_loading.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart';
import 'package:test_sa/views/widgets/sound/sound_player.dart'; import 'package:test_sa/views/widgets/sound/sound_player.dart';
import '../../../models/lookup.dart';
import '../forms/maintenance_request/maintenance_request_main.dart';
class RequestDetailView extends StatefulWidget { class RequestDetailView extends StatefulWidget {
static const String id = "/call-details"; static const String id = "/call-details";
ServiceRequest serviceRequest; ServiceRequest serviceRequest;
bool fromTabView = false; bool fromTabView = false;
RequestDetailView({Key key, this.serviceRequest, this.fromTabView = false}) : super(key: key); RequestDetailView({Key? key,required this.serviceRequest, this.fromTabView = false}) : super(key: key);
@override @override
State<RequestDetailView> createState() => _RequestDetailViewState(); State<RequestDetailView> createState() => _RequestDetailViewState();
@ -58,16 +52,14 @@ class _RequestDetailViewState extends State<RequestDetailView> {
// setState(() {}); // setState(() {});
}); });
} }
final GlobalKey _detailsCardKey = GlobalKey();
void createBreakPoint(){ final GlobalKey _detailsCardKey = GlobalKey();
final RenderBox detailContainerBox = void createBreakPoint() {
_detailsCardKey.currentContext?.findRenderObject() as RenderBox; final RenderBox detailContainerBox = _detailsCardKey.currentContext?.findRenderObject() as RenderBox;
final detailContainerHeight = detailContainerBox?.size?.height; final detailContainerHeight = detailContainerBox?.size?.height;
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
UserProvider _userProvider = Provider.of<UserProvider>(context, listen: false); UserProvider _userProvider = Provider.of<UserProvider>(context, listen: false);
@ -87,10 +79,10 @@ class _RequestDetailViewState extends State<RequestDetailView> {
}); });
} }
Widget requestDetailCard({ServiceRequestsProvider serviceRequestsProvider, UserProvider userProvider}) { Widget requestDetailCard({required ServiceRequestsProvider serviceRequestsProvider, required UserProvider userProvider}) {
if(!serviceRequestsProvider.isDetialLoading){ if (!serviceRequestsProvider.isDetialLoading) {
createBreakPoint(); createBreakPoint();
} }
return SafeArea( return SafeArea(
key: _detailsCardKey, key: _detailsCardKey,
child: serviceRequestsProvider.isDetialLoading child: serviceRequestsProvider.isDetialLoading
@ -108,18 +100,18 @@ class _RequestDetailViewState extends State<RequestDetailView> {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
informationCard(serviceRequestsProvider.currentSelectedRequest, userProvider), informationCard(serviceRequestsProvider.currentSelectedRequest!, userProvider),
40.height, 40.height,
// skipForLater(serviceRequestsProvider.currentSelectedRequest), // skipForLater(serviceRequestsProvider.currentSelectedRequest),
// 20.height, // 20.height,
const InitialVisitCard(), const InitialVisitCard(),
20.height, 20.height,
], ],
), ),
), ),
FooterActionButton.footerWidget(status: 1, context: context), FooterActionButton.footerWidget(status: 1, context: context),
const TimerWidget(), TimerWidget(),
], ],
), ),
); );
@ -143,30 +135,30 @@ class _RequestDetailViewState extends State<RequestDetailView> {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
StatusLabel( StatusLabel(
label: serviceRequest.priority.name, label: serviceRequest.priority?.name,
id: serviceRequest.priority.id, id: serviceRequest.priority!.id!,
radius: 4, radius: 4,
textColor: AppColor.getPriorityStatusTextColor(context, serviceRequest.priority.id), textColor: AppColor.getPriorityStatusTextColor(context, serviceRequest.priority!.id!),
backgroundColor: AppColor.getPriorityStatusColor(context, serviceRequest.priority.id), backgroundColor: AppColor.getPriorityStatusColor(context, serviceRequest.priority!.id!),
), ),
8.width, 8.width,
StatusLabel( StatusLabel(
radius: 4, radius: 4,
label: serviceRequest.statusLabel, label: serviceRequest.statusLabel,
textColor: AppColor.getRequestStatusTextColor(context, serviceRequest.statusValue), textColor: AppColor.getRequestStatusTextColor(context, serviceRequest.statusValue!),
backgroundColor: AppColor.getRequestStatusColor(context, serviceRequest.statusValue), backgroundColor: AppColor.getRequestStatusColor(context, serviceRequest.statusValue!),
), ),
1.width.expanded, 1.width.expanded,
Column( Column(
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
if (userProvider.user.type == UsersTypes.normal_user) if (userProvider.user!.type == UsersTypes.normal_user)
context.translation.code.toSvgAsset(width: 48).onPress(() { context.translation.code.toSvgAsset(width: 48).onPress(() {
Navigator.push(context, MaterialPageRoute(builder: (context) => UpdateServiceRequestPage(serviceRequest: serviceRequest))); Navigator.push(context, MaterialPageRoute(builder: (context) => UpdateServiceRequestPage(serviceRequest: serviceRequest)));
}), }),
if (userProvider.user.type == UsersTypes.engineer) 16.height, if (userProvider.user!.type == UsersTypes.engineer) 16.height,
Text( Text(
serviceRequest.date.toServiceRequestCardFormat, serviceRequest.date!.toServiceRequestCardFormat,
textAlign: TextAlign.end, textAlign: TextAlign.end,
style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
), ),
@ -191,31 +183,31 @@ class _RequestDetailViewState extends State<RequestDetailView> {
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(
'${context.translation.manufacture}: ${serviceRequest.device.modelDefinition.manufacturerName?.cleanupWhitespace?.capitalizeFirstOfEach}', '${context.translation.manufacture}: ${serviceRequest.device?.modelDefinition?.manufacturerName?.cleanupWhitespace?.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(
'${context.translation.model}: ${serviceRequest.device.modelDefinition.modelName?.cleanupWhitespace?.capitalizeFirstOfEach}', '${context.translation.model}: ${serviceRequest.device?.modelDefinition?.modelName?.cleanupWhitespace?.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(
'${context.translation.site}: ${serviceRequest.device.site?.custName?.cleanupWhitespace?.capitalizeFirstOfEach}', '${context.translation.site}: ${serviceRequest.device?.site?.custName?.cleanupWhitespace?.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(
'${context.translation.building}: ${serviceRequest.device.building?.name?.cleanupWhitespace?.capitalizeFirstOfEach}', '${context.translation.building}: ${serviceRequest.device?.building?.name?.cleanupWhitespace?.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(
'${context.translation.floor}: ${serviceRequest.device.floor?.name?.cleanupWhitespace?.capitalizeFirstOfEach ?? ""}', '${context.translation.floor}: ${serviceRequest.device?.floor?.name?.cleanupWhitespace?.capitalizeFirstOfEach ?? ""}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(
'${context.translation.department}: ${serviceRequest.device.department?.departmentName?.cleanupWhitespace?.capitalizeFirstOfEach}', '${context.translation.department}: ${serviceRequest.device?.department?.departmentName?.cleanupWhitespace?.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(
'${context.translation.room}: ${(serviceRequest.device.room?.name ?? "").cleanupWhitespace?.capitalizeFirstOfEach}', '${context.translation.room}: ${(serviceRequest.device?.room?.name ?? "").cleanupWhitespace?.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
], ],
@ -232,7 +224,7 @@ class _RequestDetailViewState extends State<RequestDetailView> {
), ),
8.height, 8.height,
Text( Text(
'${context.translation.requestType}: ${serviceRequest.type.name}', '${context.translation.requestType}: ${serviceRequest.type?.name}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(
@ -249,24 +241,24 @@ class _RequestDetailViewState extends State<RequestDetailView> {
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
8.height, 8.height,
Text( Text(
serviceRequest.callComments, serviceRequest.callComments!,
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
], ],
if (serviceRequest.devicePhotos.isNotEmpty) ...[ if (serviceRequest.devicePhotos?.isNotEmpty ?? false) ...[
8.height, 8.height,
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
FilesList(images: serviceRequest.devicePhotos), FilesList(images: serviceRequest.devicePhotos!),
], ],
if (serviceRequest.audio?.isNotEmpty ?? false) ...[ if (serviceRequest.audio?.isNotEmpty ?? false) ...[
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
16.height, 16.height,
ASoundPlayer(audio: serviceRequest.audio), ASoundPlayer(audio: serviceRequest.audio!),
8.height, 8.height,
], ],
], ],
).paddingOnly(start: 16, end: 16, top: 16, bottom: 8), ).paddingOnly(start: 16, end: 16, top: 16, bottom: 8),
(userProvider.user.type == UsersTypes.normal_user (userProvider.user!.type == UsersTypes.normal_user
? Container( ? Container(
height: 50, height: 50,
padding: const EdgeInsets.only(left: 16, right: 16), padding: const EdgeInsets.only(left: 16, right: 16),
@ -319,49 +311,43 @@ class _RequestDetailViewState extends State<RequestDetailView> {
isScrollControlled: true, isScrollControlled: true,
useRootNavigator: true, useRootNavigator: true,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
builder: (context) => CommentsBottomSheet(requestId: serviceRequest.id), builder: (context) => CommentsBottomSheet(requestId: serviceRequest.id!),
); );
}), }),
//set condition for show asset detail button... //set condition for show asset detail button...
if(true)...[ if (true) ...[
assetRetiredButton(serviceRequest: serviceRequest), assetRetiredButton(serviceRequest: serviceRequest),
] ]
], ],
).toShadowContainer(context, padding: 0); ).toShadowContainer(context, padding: 0);
} }
Widget assetRetiredButton({ServiceRequest serviceRequest}){ Widget assetRetiredButton({required ServiceRequest serviceRequest}) {
return Padding( return Padding(
padding: EdgeInsets.symmetric(horizontal: 16.toScreenHeight,vertical: 12.toScreenWidth), padding: EdgeInsets.symmetric(horizontal: 16.toScreenHeight, vertical: 12.toScreenWidth),
child: AppFilledButton( child: AppFilledButton(
label: context.translation.assetToBeRetired, label: context.translation.assetToBeRetired,
maxWidth: true, maxWidth: true,
buttonColor: Colors.white54, buttonColor: Colors.white54,
textColor: AppColor.red30, textColor: AppColor.red30,
showBorder: true, showBorder: true,
onPressed: () async { onPressed: () async {
// ServiceRequestBottomSheet.nurseTakeActionBottomSheet(context: context); // ServiceRequestBottomSheet.nurseTakeActionBottomSheet(context: context);
Navigator.push(context, MaterialPageRoute(builder: (context)=>const AssetRetired())); Navigator.push(context, MaterialPageRoute(builder: (context) => AssetRetired()));
}),
}
),
); );
} }
Widget skipForLater (ServiceRequest serviceRequest){ Widget skipForLater(ServiceRequest serviceRequest) {
return Center( return Center(
child: InkWell( child: InkWell(
onTap: () async { onTap: () async {
try { try {
//use a common list //use a common list
AllRequestsProvider allRequestProvider = Provider.of<AllRequestsProvider>(context, listen: false); AllRequestsProvider allRequestProvider = Provider.of<AllRequestsProvider>(context, listen: false);
int index = allRequestProvider.requestDetailList.requestsDetails.indexWhere((element) => element.id.toString() == serviceRequest.id); int index = allRequestProvider.requestDetailList!.requestsDetails!.indexWhere((element) => element.id.toString() == serviceRequest.id);
if (index != -1 && index != allRequestProvider.requestDetailList.requestsDetails.length) { if (index != -1 && index != allRequestProvider.requestDetailList!.requestsDetails!.length) {
getServiceRequest(requestId: allRequestProvider.requestDetailList.requestsDetails[index + 1].id.toString()); getServiceRequest(requestId: allRequestProvider.requestDetailList!.requestsDetails![index + 1].id.toString());
} }
} catch (e) { } catch (e) {
print(e); print(e);

@ -11,7 +11,7 @@ import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/service_request_latest/request_detail_provider.dart'; import 'package:test_sa/service_request_latest/request_detail_provider.dart';
class TimerWidget extends StatefulWidget { class TimerWidget extends StatefulWidget {
const TimerWidget({Key key}) : super(key: key); const TimerWidget({Key? key}) : super(key: key);
@override @override
_TimerWidgetState createState() => _TimerWidgetState(); _TimerWidgetState createState() => _TimerWidgetState();
@ -19,7 +19,7 @@ class TimerWidget extends StatefulWidget {
class _TimerWidgetState extends State<TimerWidget> { class _TimerWidgetState extends State<TimerWidget> {
Offset position = Offset(SizeConfig.screenWidth - 100, SizeConfig.screenHeight / 2 - 50); Offset position = Offset(SizeConfig.screenWidth! - 100, SizeConfig.screenHeight! / 2 - 50);
@override @override
void initState() { void initState() {
// TODO: implement initState // TODO: implement initState

@ -15,7 +15,7 @@ import 'package:test_sa/views/widgets/qr/scan_qr.dart';
import 'activities_list_view.dart'; import 'activities_list_view.dart';
class VerifyArrivalView extends StatelessWidget { class VerifyArrivalView extends StatelessWidget {
VerifyArrivalView({Key key}) : super(key: key); VerifyArrivalView({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -37,13 +37,12 @@ class VerifyArrivalView extends StatelessWidget {
itemBuilder: (context, index) { itemBuilder: (context, index) {
final item = items[index]; final item = items[index];
return listItem( return listItem(
icon: item['icon'], icon: item['icon']!,
heading: item['heading'], heading: item['heading']!,
subHeading: item['subHeading'], subHeading: item['subHeading']!,
context: context, context: context,
onTap: () { onTap: () {
onItemTap(serviceRequest: serviceRequestsProvider.currentSelectedRequest!, index: index,context: context);
onItemTap(serviceRequest: serviceRequestsProvider.currentSelectedRequest, index: index,context: context);
}); });
}, },
), ),
@ -52,7 +51,7 @@ class VerifyArrivalView extends StatelessWidget {
); );
} }
Widget listItem({@required BuildContext context, @required String icon, @required String heading, @required String subHeading, @required VoidCallback onTap}) { Widget listItem({required BuildContext context, required String icon, required String heading, required String subHeading, required VoidCallback onTap}) {
return Padding( return Padding(
padding: EdgeInsets.only(left: 16.toScreenWidth,right: 16.toScreenWidth,bottom: 12.toScreenHeight), padding: EdgeInsets.only(left: 16.toScreenWidth,right: 16.toScreenWidth,bottom: 12.toScreenHeight),
@ -81,7 +80,7 @@ class VerifyArrivalView extends StatelessWidget {
); );
} }
void onItemTap({@required int index, @required ServiceRequest serviceRequest,@required BuildContext context}) { void onItemTap({required int index, required ServiceRequest serviceRequest,required BuildContext context}) {
switch(index){ switch(index){
case 0: case 0:
Navigator.push( Navigator.push(

@ -20,6 +20,7 @@ import 'package:test_sa/providers/work_order/reason_provider.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/bottom_sheets/service_request_bottomsheet.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import '../../../../../controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; import '../../../../../controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart';
import '../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart'; import '../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart';
import '../../../../../models/lookup.dart'; import '../../../../../models/lookup.dart';
@ -31,19 +32,19 @@ import '../../../controllers/validator/validator.dart';
class SparePartRequest extends StatefulWidget { class SparePartRequest extends StatefulWidget {
static const String id = "/verify-assets-detail"; static const String id = "/verify-assets-detail";
const SparePartRequest({Key key}) : super(key: key); const SparePartRequest({Key? key}) : super(key: key);
@override @override
_SparePartRequestState createState() => _SparePartRequestState(); _SparePartRequestState createState() => _SparePartRequestState();
} }
class _SparePartRequestState extends State<SparePartRequest> with TickerProviderStateMixin { class _SparePartRequestState extends State<SparePartRequest> with TickerProviderStateMixin {
UserProvider _userProvider; late UserProvider _userProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
ServiceRequestsProvider _serviceRequestsProvider; late ServiceRequestsProvider _serviceRequestsProvider;
ServiceStatusProvider _assetTypeProvider; late ServiceStatusProvider _assetTypeProvider;
PartsProvider _partsProvider; late PartsProvider _partsProvider;
ServiceReport _serviceReport; late ServiceReport _serviceReport;
bool _isLoading = false; bool _isLoading = false;
List<SparePart> _spareParts = []; List<SparePart> _spareParts = [];
@ -68,12 +69,11 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
ServiceRequestsProvider serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false); ServiceRequestsProvider serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
Provider.of<ServiceReportLastCallsProvider>(context, listen: false).reset(); Provider.of<ServiceReportLastCallsProvider>(context, listen: false).reset();
Provider.of<ReasonProvider>(context, listen: false).reset(); Provider.of<ReasonProvider>(context, listen: false).reset();
Provider.of<ReasonProvider>(context, listen: false).serviceRequestId = serviceRequestsProvider.currentSelectedRequest.id; Provider.of<ReasonProvider>(context, listen: false).serviceRequestId = serviceRequestsProvider.currentSelectedRequest!.id;
} }
// _isLoading = true; // _isLoading = true;
} }
Asset loanAvailabilityAsset;
@override @override
void dispose() { void dispose() {
@ -87,12 +87,12 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
_isLoading = true; _isLoading = true;
setState(() {}); setState(() {});
ServiceRequestsProvider serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false); ServiceRequestsProvider serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
_serviceReport.callRequest = await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: serviceRequestsProvider.currentSelectedRequest.id); _serviceReport.callRequest = await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: serviceRequestsProvider.currentSelectedRequest!.id!);
await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host); await _assetTypeProvider.getTypes();
_serviceReport.assignedEmployee = _serviceReport.callRequest?.assignedEmployee; _serviceReport.assignedEmployee = _serviceReport.callRequest?.assignedEmployee;
_serviceReport.equipmentStatus = _serviceReport.callRequest?.defectType; _serviceReport.equipmentStatus = _serviceReport.callRequest?.defectType;
_serviceReport.serviceType = Lookup(id: 65, name: "Interval", value: 1); // default value in service type as in web _serviceReport.serviceType = Lookup(id: 65, name: "Interval", value: 1); // default value in service type as in web
_spareParts = await _partsProvider.getPartsList(assetId: serviceRequestsProvider.currentSelectedRequest.deviceId); _spareParts = await _partsProvider.getPartsList(assetId: serviceRequestsProvider.currentSelectedRequest!.deviceId!);
_isLoading = false; _isLoading = false;
setState(() {}); setState(() {});
} }
@ -109,7 +109,7 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
} }
_serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere( _serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere(
(element) => element.value == _serviceReport.callRequest?.assetType, (element) => element.value == _serviceReport.callRequest?.assetType,
orElse: () => null, orElse: null,
); );
return Scaffold( return Scaffold(

@ -21,7 +21,7 @@ class WorkOrderCardView extends StatelessWidget {
final ServiceRequest serviceRequest; final ServiceRequest serviceRequest;
final bool showShadow; final bool showShadow;
WorkOrderCardView(this.workOrder, this.serviceRequest, {Key key, this.showShadow = true}) : super(key: key); WorkOrderCardView(this.workOrder, this.serviceRequest, {Key? key, this.showShadow = true}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -34,18 +34,18 @@ class WorkOrderCardView extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
StatusLabel( StatusLabel(
label: workOrder.currentSituation.name, label: workOrder.currentSituation!.name,
textColor: AppColor.getRequestStatusTextColorByName(context, workOrder.currentSituation.name), textColor: AppColor.getRequestStatusTextColorByName(context, workOrder.currentSituation?.name),
backgroundColor: AppColor.getRequestStatusColorByName(context, workOrder.currentSituation.name), backgroundColor: AppColor.getRequestStatusColorByName(context, workOrder.currentSituation?.name),
), ),
8.height, 8.height,
Text(serviceRequest.requestCode, style: AppTextStyles.heading5.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)), Text(serviceRequest.requestCode!, style: AppTextStyles.heading5.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)),
Text( Text(
'${context.translation.assetName}: ${workOrder.callRequest.asset.modelDefinition.assetName?.cleanupWhitespace?.capitalizeFirstOfEach}', '${context.translation.assetName}: ${workOrder.callRequest?.asset?.modelDefinition?.assetName?.cleanupWhitespace?.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
Text( Text(
'${context.translation.currentSituation}: ${workOrder.currentSituation.name}', '${context.translation.currentSituation}: ${workOrder.currentSituation?.name}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
), ),
16.height, 16.height,
@ -71,13 +71,13 @@ class WorkOrderCardView extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
if (_userProvider.user.type == UsersTypes.engineer && serviceRequest.statusValue != 5 && serviceRequest.statusValue != 3) if (_userProvider.user!.type == UsersTypes.engineer && serviceRequest.statusValue != 5 && serviceRequest.statusValue != 3)
"edit_icon".toSvgAsset(height: 21, width: 21).onPress(() { "edit_icon".toSvgAsset(height: 21, width: 21).onPress(() {
Navigator.of(context).push( Navigator.of(context).push(
MaterialPageRoute(builder: (_) => UpdateServiceReport(request: serviceRequest, workOrder: workOrder)), MaterialPageRoute(builder: (_) => UpdateServiceReport(request: serviceRequest, workOrder: workOrder)),
); );
}), }),
if (_userProvider.user.type == UsersTypes.engineer && serviceRequest.statusValue != 5 && serviceRequest.statusValue != 3) 8.height, if (_userProvider.user!.type == UsersTypes.engineer && serviceRequest.statusValue != 5 && serviceRequest.statusValue != 3) 8.height,
Text(workOrder.visitDate?.toServiceRequestCardFormat ?? "", Text(workOrder.visitDate?.toServiceRequestCardFormat ?? "",
textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : const Color(0xFF3B3D4A))), textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : const Color(0xFF3B3D4A))),
], ],

@ -80,7 +80,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
if (context.mounted) { if (context.mounted) {
Provider.of<ServiceReportLastCallsProvider>(context, listen: false).reset(); Provider.of<ServiceReportLastCallsProvider>(context, listen: false).reset();
Provider.of<ReasonProvider>(context, listen: false).reset(); Provider.of<ReasonProvider>(context, listen: false).reset();
Provider.of<ReasonProvider>(context, listen: false).serviceRequestId = widget.request.id; Provider.of<ReasonProvider>(context, listen: false).serviceRequestId = widget.request.id!;
} }
// _isLoading = true; // _isLoading = true;
} }

@ -7,26 +7,26 @@ import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
class ADatePicker extends StatelessWidget { class ADatePicker extends StatelessWidget {
final DateTime date; final DateTime? date; // Nullable
final DateTime from; final DateTime? from; // Nullable
final DateTime to; final DateTime? to; // Nullable
final String label; final String label;
final bool hideShadow; final bool hideShadow;
final String hint; final String? hint; // Nullable
final Function(DateTime) onDatePicker; final Function(DateTime)? onDatePicker; // Nullable
final bool enable, withBorder, withIcon; final bool enable;
final Color backgroundColor; final bool withBorder;
final Color? backgroundColor; // Nullable
final bool formatDateWithTime; final bool formatDateWithTime;
final double height; final double? height; // Nullable
const ADatePicker({ const ADatePicker({
Key key, Key? key,
@required this.label, required this.label,
this.withBorder = true, this.withBorder = true,
this.height, this.height,
this.backgroundColor, this.backgroundColor,
this.hideShadow = false, this.hideShadow = false,
this.withIcon = true,
this.hint, this.hint,
this.date, this.date,
this.formatDateWithTime = false, this.formatDateWithTime = false,
@ -42,11 +42,11 @@ class ADatePicker extends StatelessWidget {
height: height, height: height,
decoration: BoxDecoration( decoration: BoxDecoration(
color: backgroundColor ?? color: backgroundColor ??
(context.isDark && (enable == false) (context.isDark && !enable
? AppColor.neutral50 ? AppColor.neutral50
: (enable == false) : !enable
? AppColor.neutral40 ? AppColor.neutral40
: AppColor.background(context)), : AppColor.background(context)),
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
border: withBorder ? Border.all(width: 1, color: Theme.of(context).scaffoldBackgroundColor) : const Border(), border: withBorder ? Border.all(width: 1, color: Theme.of(context).scaffoldBackgroundColor) : const Border(),
boxShadow: hideShadow ? null : [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)], boxShadow: hideShadow ? null : [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)],
@ -54,35 +54,37 @@ class ADatePicker extends StatelessWidget {
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight),
child: Row( child: Row(
children: [ children: [
// enable
// ?
Column( Column(
crossAxisAlignment: CrossAxisAlignment.stretch, crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
label.tinyFont(context), label.tinyFont(context),
(date?.toIso8601String == null (date == null
? hint ?? context.translation.pickADate ? hint ?? context.translation.pickADate
: (formatDateWithTime ? date?.toIso8601String()?.toFirstActionFormat : (date?.toIso8601String()?.split("T")?.first ?? context.translation.pickADate))) : (formatDateWithTime
? date?.toIso8601String()?.toFirstActionFormat // Use null-aware operator
: (date?.toIso8601String()?.split("T")?.first ?? context.translation.pickADate)))!
.bodyText(context) .bodyText(context)
.custom(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), .custom(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
], ],
).expanded, ).expanded,
//: label.bodyText(context).paddingOnly(top: 8, bottom: 8),
enable ? 16.width : const Spacer(), enable ? 16.width : const Spacer(),
withIcon ? "calender".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null) : const SizedBox(), "calender".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null),
], ],
), ),
).onPress(enable ).onPress(enable
? () async { ? () async {
DateTime picked = await showDatePicker( final DateTime? picked = await showDatePicker(
context: context, // Nullable DateTime
initialDate: DateTime.now(), context: context,
firstDate: from ?? DateTime.now(), initialDate: DateTime.now(),
lastDate: to ?? DateTime.now().add(const Duration(days: 365)), firstDate: from ?? DateTime.now(),
); lastDate: to ?? DateTime.now().add(const Duration(days: 365)),
if (onDatePicker != null) onDatePicker(picked); );
} if (picked != null && onDatePicker != null) {
onDatePicker!(picked); // Use null-aware operator
}
}
: null); : null);
} }
} }

@ -1,24 +1,23 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
class ATimePicker extends StatelessWidget { class ATimePicker extends StatelessWidget {
final TimeOfDay time; final TimeOfDay? time;
final String label; final String label;
final String icon; final String? icon;
final String hint; final String? hint;
final Function(TimeOfDay) onTimePicker; final Function(TimeOfDay)? onTimePicker;
final bool enable, withBorder, withIcon; final bool enable, withBorder, withIcon;
final Color backgroundColor; final Color? backgroundColor;
final double height; final double? height;
const ATimePicker({ const ATimePicker({
Key key, Key? key,
@required this.label, required this.label,
this.withBorder = true, this.withBorder = true,
this.icon, this.icon,
this.withIcon = true, this.withIcon = true,
@ -55,7 +54,7 @@ class ATimePicker extends StatelessWidget {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
label.tinyFont(context), label.tinyFont(context),
(time == null ? hint ?? context.translation.pickTime : (time.format(context) ?? context.translation.pickADate)) (time == null ? hint ?? context.translation.pickTime : (time?.format(context) ?? context.translation.pickADate))
.bodyText(context) .bodyText(context)
.custom(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), .custom(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
], ],
@ -64,26 +63,21 @@ class ATimePicker extends StatelessWidget {
enable ? 16.width : const Spacer(), enable ? 16.width : const Spacer(),
withIcon withIcon
? icon != null ? icon != null
? icon.toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null) ? icon!.toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null)
: "calender".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null) : "calender".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null)
: const SizedBox(), : const SizedBox(),
], ],
), ),
).onPress(enable ).onPress(enable
? () async { ? () async {
// Define the initial time
TimeOfDay initialTime = TimeOfDay.now(); TimeOfDay initialTime = TimeOfDay.now();
TimeOfDay? pickedTime = await showTimePicker(
// Show the time picker with the initial time set
TimeOfDay pickedTime = await showTimePicker(
context: context, context: context,
initialTime: initialTime, initialTime: initialTime,
); );
// Handle the selected time (if user didn't cancel)
if (pickedTime != null) { if (pickedTime != null) {
if (onTimePicker != null) onTimePicker(pickedTime); if (onTimePicker != null) onTimePicker!(pickedTime);
print("Selected time: ${pickedTime.format(context)}");
} }
} }
: null); : null);

@ -11,15 +11,13 @@ import 'package:test_sa/new_views/app_style/app_color.dart';
import '../loaders/image_loader.dart'; import '../loaders/image_loader.dart';
class ESignature extends StatefulWidget { class ESignature extends StatefulWidget {
final String oldSignature; final String? oldSignature;
final Uint8List newSignature; final Uint8List? newSignature;
Color backgroundColor; final Function(Uint8List?)? onSaved;
bool showShadow=true; final Function(Uint8List)? onChange;
final Function(Uint8List) onSaved;
final Function(Uint8List) onChange;
final String title; final String title;
ESignature({Key key, this.title, this.oldSignature, this.onSaved, this.onChange, this.newSignature,this.backgroundColor,this.showShadow=true}) : super(key: key); const ESignature({Key? key, required this.title, required this.oldSignature, this.onSaved, this.onChange, required this.newSignature}) : super(key: key);
@override @override
State<ESignature> createState() => _ESignatureState(); State<ESignature> createState() => _ESignatureState();
@ -27,9 +25,9 @@ class ESignature extends StatefulWidget {
class _ESignatureState extends State<ESignature> { class _ESignatureState extends State<ESignature> {
// Initialise a controller. It will contains signature points, stroke width and pen color. // Initialise a controller. It will contains signature points, stroke width and pen color.
SignatureController _controller; SignatureController? _controller;
Uint8List signature; Uint8List? signature;
bool _editable = false; bool _editable = false;
@ -44,7 +42,7 @@ class _ESignatureState extends State<ESignature> {
@override @override
void dispose() { void dispose() {
_controller.dispose(); _controller?.dispose();
super.dispose(); super.dispose();
} }
@ -57,7 +55,7 @@ class _ESignatureState extends State<ESignature> {
); );
print(widget.oldSignature); print(widget.oldSignature);
return FormField<String>(onSaved: (_) async { return FormField<String>(onSaved: (_) async {
widget.onSaved(signature); if (widget.onSaved != null) widget.onSaved!(signature);
}, builder: (FormFieldState<String> state) { }, builder: (FormFieldState<String> state) {
return Column( return Column(
children: [ children: [
@ -65,9 +63,9 @@ class _ESignatureState extends State<ESignature> {
width: MediaQuery.of(context).size.width, width: MediaQuery.of(context).size.width,
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight),
decoration: BoxDecoration( decoration: BoxDecoration(
color:widget.backgroundColor ?? (context.isDark ? AppColor.background(context) : Colors.white), color: context.isDark ? AppColor.background(context) : Colors.white,
borderRadius: _editable ? const BorderRadius.only(topLeft: Radius.circular(10), topRight: Radius.circular(10)) : BorderRadius.circular(10), borderRadius: _editable ? const BorderRadius.only(topLeft: Radius.circular(10), topRight: Radius.circular(10)) : BorderRadius.circular(10),
boxShadow:widget.showShadow? [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)]:[], boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)],
), ),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
@ -78,20 +76,20 @@ class _ESignatureState extends State<ESignature> {
children: [ children: [
widget.title.tinyFont(context).paddingOnly(top: 8), widget.title.tinyFont(context).paddingOnly(top: 8),
(!_editable (!_editable
? "edit".toSvgAsset(width: 48).paddingOnly(top: 8) ? "edit".toSvgAsset(width: 48).paddingOnly(top: 8)
: Container( : Container(
width: 48.toScreenWidth, width: 48.toScreenWidth,
height: 48.toScreenWidth, height: 48.toScreenWidth,
decoration: BoxDecoration(borderRadius: BorderRadius.circular(100), border: Border.all(color: AppColor.neutral30)), decoration: BoxDecoration(borderRadius: BorderRadius.circular(100), border: Border.all(color: AppColor.neutral30)),
padding: const EdgeInsets.all(11), padding: const EdgeInsets.all(11),
margin: const EdgeInsets.only(top: 8), margin: const EdgeInsets.only(top: 8),
child: "done".toSvgAsset(width: 26), child: "done".toSvgAsset(width: 26),
)) ))
.onPress(() async { .onPress(() async {
if (_editable) { if (_editable) {
signature = await _controller.toPngBytes(); signature = await _controller!.toPngBytes();
if (widget.onChange != null) { if (widget.onChange != null) {
widget.onChange(signature); widget.onChange!(signature!);
} }
} }
_editable = !_editable; _editable = !_editable;
@ -101,20 +99,20 @@ class _ESignatureState extends State<ESignature> {
), ),
((widget.oldSignature != null || signature != null) && !_editable) ((widget.oldSignature != null || signature != null) && !_editable)
? Container( ? Container(
height: 135.toScreenHeight, height: 135.toScreenHeight,
width: MediaQuery.of(context).size.width, width: MediaQuery.of(context).size.width,
padding: const EdgeInsets.only(bottom: 8), padding: const EdgeInsets.only(bottom: 8),
child: signature != null ? Image.memory(signature) : ImageLoader(boxFit: BoxFit.contain, url: URLs.getFileUrl(widget.oldSignature)), child: signature != null ? Image.memory(signature!) : ImageLoader(boxFit: BoxFit.contain, url: URLs.getFileUrl(widget.oldSignature)!),
) )
: AbsorbPointer( : AbsorbPointer(
absorbing: !_editable, absorbing: !_editable,
child: Signature( child: Signature(
controller: _controller, controller: _controller!,
height: 135.toScreenHeight, height: 135.toScreenHeight,
width: MediaQuery.of(context).size.width - 64.toScreenWidth, width: MediaQuery.of(context).size.width - 64.toScreenWidth,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
), ),
), ),
], ],
), ),
), ),
@ -127,15 +125,15 @@ class _ESignatureState extends State<ESignature> {
child: Row( child: Row(
children: [ children: [
"clear".toSvgAsset(width: 14).paddingOnly(start: 16).onPress(() { "clear".toSvgAsset(width: 14).paddingOnly(start: 16).onPress(() {
_controller.clear(); _controller!.clear();
}), }),
35.width, 35.width,
"back".toSvgAsset(width: 17).onPress(() { "back".toSvgAsset(width: 17).onPress(() {
_controller.undo(); _controller!.undo();
}), }),
27.width, 27.width,
"redo".toSvgAsset(width: 17).onPress(() { "redo".toSvgAsset(width: 17).onPress(() {
_controller.redo(); _controller!.redo();
}), }),
// IconButton( // IconButton(
// onPressed: () { // onPressed: () {

@ -18,13 +18,24 @@ class MultiFilesPicker extends StatefulWidget {
final bool error; final bool error;
final List<File> files; final List<File> files;
final bool enabled, onlyImages; final bool enabled, onlyImages;
double buttonHeight; double? buttonHeight;
Widget buttonIcon; Widget? buttonIcon;
Color buttonColor; Color? buttonColor;
final Function(List<File>) onChange; final Function(List<File>)? onChange;
final bool showAsGrid; final bool showAsGrid;
MultiFilesPicker({Key key, this.files, this.label, this.error = false, this.buttonHeight, this.buttonIcon, this.enabled = true, this.onlyImages = false, this.onChange, this.showAsGrid = false,this.buttonColor}) MultiFilesPicker(
{Key? key,
this.files = const <File>[],
required this.label,
this.error = false,
this.buttonHeight,
this.buttonIcon,
this.enabled = true,
this.onlyImages = false,
this.onChange,
this.showAsGrid = false,
this.buttonColor})
: super(key: key); : super(key: key);
@override @override
@ -48,13 +59,13 @@ class _MultiFilesPickerState extends State<MultiFilesPicker> {
? showFileSourceSheet ? showFileSourceSheet
: onFilePicker), : onFilePicker),
16.height, 16.height,
if (widget.files?.isNotEmpty ?? false) if (widget.files.isNotEmpty)
Wrap( Wrap(
spacing: 8.toScreenWidth, spacing: 8.toScreenWidth,
children: List.generate( children: List.generate(
widget.files.length, widget.files!.length,
(index) { (index) {
File image = widget.files[index]; File image = widget.files![index];
return MultiFilesPickerItem( return MultiFilesPickerItem(
file: image, file: image,
enabled: widget.enabled, enabled: widget.enabled,
@ -64,7 +75,7 @@ class _MultiFilesPickerState extends State<MultiFilesPicker> {
} }
widget.files.remove(image); widget.files.remove(image);
if (widget.onChange != null) { if (widget.onChange != null) {
widget.onChange(widget.files); widget.onChange!(widget.files);
} }
setState(() {}); setState(() {});
}, },
@ -77,14 +88,14 @@ class _MultiFilesPickerState extends State<MultiFilesPicker> {
} }
fromFilePicker() async { fromFilePicker() async {
FilePickerResult result = await FilePicker.platform.pickFiles( FilePickerResult? result = await FilePicker.platform.pickFiles(
type: FileType.custom, type: FileType.custom,
allowMultiple: true, allowMultiple: true,
allowedExtensions: widget.onlyImages ? ['jpg', 'jpeg', 'png'] : ['jpg', 'jpeg', 'png', 'pdf', 'doc', 'docx', 'xlsx', 'pptx'], allowedExtensions: widget.onlyImages ? ['jpg', 'jpeg', 'png'] : ['jpg', 'jpeg', 'png', 'pdf', 'doc', 'docx', 'xlsx', 'pptx'],
); );
if (result != null) { if (result != null) {
for (var path in result.paths) { for (var path in result.paths) {
widget.files.add(File(path)); widget.files.add(File(path!));
} }
setState(() {}); setState(() {});
} }
@ -138,7 +149,7 @@ class _MultiFilesPickerState extends State<MultiFilesPicker> {
if (fileImage != null) { if (fileImage != null) {
widget.files.add(fileImage); widget.files.add(fileImage);
if (widget.onChange != null) { if (widget.onChange != null) {
widget.onChange(widget.files); widget.onChange!(widget.files);
} }
setState(() {}); setState(() {});
} }
@ -207,7 +218,7 @@ class _MultiFilesPickerState extends State<MultiFilesPicker> {
if (fileImage != null) { if (fileImage != null) {
widget.files.add(fileImage); widget.files.add(fileImage);
if (widget.onChange != null) { if (widget.onChange != null) {
widget.onChange(widget.files); widget.onChange!(widget.files);
} }
setState(() {}); setState(() {});
} }

Loading…
Cancel
Save