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

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

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

@ -1,19 +1,19 @@
import 'dart:convert';
import 'package:flutter/widgets.dart';
import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.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_detail.dart';
import 'package:test_sa/models/new_models/dashboard_count.dart';
import 'package:test_sa/models/new_models/dashboard_detail.dart' as DD;
class DashBoardProvider extends ChangeNotifier {
bool isAllCountLoading = false;
bool isLoading = false;
bool _isDetailLoading = false;
int _status =0;
int _status = 0;
int get status => _status;
@ -31,15 +31,15 @@ class DashBoardProvider extends ChangeNotifier {
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;
notifyListeners();
}
@ -54,24 +54,23 @@ class DashBoardProvider extends ChangeNotifier {
stateCode = null;
}
Future<int> getDashBoardCount({@required UsersTypes usersType}) async {
Future<int> getDashBoardCount({required UsersTypes usersType}) async {
isAllCountLoading = true;
String url='';
if(usersType==UsersTypes.engineer){
String url = '';
if (usersType == UsersTypes.engineer) {
url = URLs.engineerDashboardCountUrl;
}
if(usersType==UsersTypes.nurse){
url=URLs.nurseDashboardCountUrl;
if (usersType == UsersTypes.nurse) {
url = URLs.nurseDashboardCountUrl;
}
Response response;
try {
response = await ApiManager.instance.postWithOutBody(url);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
dashboardCount = DashboardCount.fromJson(json.decode(response.body));
}
notifyListeners();
dashboardCount = DashboardCount.fromJson(json.decode(response.body));
}
notifyListeners();
isAllCountLoading = false;
notifyListeners();
return response.statusCode;
@ -83,36 +82,35 @@ class DashBoardProvider extends ChangeNotifier {
}
}
Future<int> getRequestDetail({bool showLoader = true,UsersTypes usersType, int status}) async {
isDetailLoading =showLoader;
Future<int> getRequestDetail({bool showLoader = true, required UsersTypes usersType, required int status}) async {
isDetailLoading = showLoader;
Response response;
String url='';
if(usersType==UsersTypes.engineer){
String url = '';
if (usersType == UsersTypes.engineer) {
url = URLs.engineerDashboardDetailsUrl;
}
if(usersType==UsersTypes.nurse){
url=URLs.nurseDashboardDetailsUrl;
if (usersType == UsersTypes.nurse) {
url = URLs.nurseDashboardDetailsUrl;
}
try {
Map<String, dynamic> body = {
"statusValue": status,
"pageNumber": pageNum,
"pageSize" : pageItemNumber,
"pageSize": pageItemNumber,
};
response = await ApiManager.instance.post(url, body: body);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
if (requestDetailList == null) {
requestDetailList = DashboardDetail.fromJson(json.decode(response.body));
requestDetailList = DD.DashboardDetail.fromJson(json.decode(response.body));
isDetailLoading = false;
notifyListeners();
} 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;
notifyListeners();
}
if (requestDetailList.data.length >= pageItemNumber) {
if (requestDetailList!.data!.length >= pageItemNumber) {
nextPage = true;
} else {
nextPage = false;
@ -138,5 +136,4 @@ class DashBoardProvider extends ChangeNotifier {
_isDetailLoading = value;
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/user_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/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/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.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/utilities/request_utils.dart';
@ -28,7 +24,7 @@ import 'widgets/request_category_fragment.dart';
class DashboardView extends StatefulWidget {
final VoidCallback onDrawerPress;
const DashboardView({Key key, this.onDrawerPress}) : super(key: key);
const DashboardView({Key? key, required this.onDrawerPress}) : super(key: key);
@override
State<DashboardView> createState() => _DashboardViewState();
@ -37,15 +33,13 @@ class DashboardView extends StatefulWidget {
class _DashboardViewState extends State<DashboardView> {
int _currentPage = 0;
bool isFCM = true;
User user;
late User user;
SettingProvider settingProvider;
UserProvider userProvider;
AllRequestsProvider allRequestsProvider;
NotificationsProvider notificationsProvider;
ScrollController _scrollController;
late SettingProvider settingProvider;
late UserProvider userProvider;
late AllRequestsProvider allRequestsProvider;
late NotificationsProvider notificationsProvider;
late ScrollController _scrollController;
@override
void initState() {
@ -61,16 +55,16 @@ class _DashboardViewState extends State<DashboardView> {
RequestDetailProvider requestDetailProvider = Provider.of<RequestDetailProvider>(context, listen: false);
allRequestsProvider = Provider.of<AllRequestsProvider>(context, listen: false);
notificationsProvider = Provider.of<NotificationsProvider>(context, listen: false);
user = userProvider.user;
user = userProvider.user!;
log('user token i got is ${user.token}');
await getAllRequests();
await requestDetailProvider.engineerRejectWorkOrder(id: '3',feedBack: 'Abcdef');
await requestDetailProvider.engineerRejectWorkOrder(id: '3', feedBack: 'Abcdef');
if (isFCM) {
FirebaseNotificationManger.initialized(context);
NotificationManger.initialisation((notificationDetails) {
FirebaseNotificationManger.handleMessage(context, json.decode(notificationDetails.payload));
FirebaseNotificationManger.handleMessage(context, json.decode(notificationDetails.payload!));
}, (id, title, body, payload) async {});
isFCM = false;
@ -83,30 +77,27 @@ class _DashboardViewState extends State<DashboardView> {
allRequestsProvider.isFilterRequestLoading = true;
allRequestsProvider.currentListIndex = 0;
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.getRequests();
allRequestsProvider.pageNum = 1;
allRequestsProvider.getFilterRequests(showLoader: true, status: tabs[0]['status']).whenComplete(() {
allRequestsProvider.requestDetailList = allRequestsProvider.filterRequest;
});
allRequestsProvider.isAllLoading = false;
notificationsProvider.getSystemNotifications(user: userProvider.user, resetProvider: true);
allRequestsProvider.getRequests();
allRequestsProvider.pageNum = 1;
allRequestsProvider.getFilterRequests(showLoader: true, status: tabs[0]['status']).whenComplete(() {
allRequestsProvider.requestDetailList = allRequestsProvider.filterRequest;
});
allRequestsProvider.isAllLoading = false;
notificationsProvider.getSystemNotifications(user: userProvider.user!, resetProvider: true);
}
void handleScroll() async{
void handleScroll() async {
_scrollController = ScrollController();
_scrollController.addListener(() async {
if (_scrollController?.position?.pixels ==
_scrollController?.position?.maxScrollExtent &&
!allRequestsProvider.isFilterRequestLoading) {
if (_scrollController?.position?.pixels == _scrollController?.position?.maxScrollExtent && !allRequestsProvider.isFilterRequestLoading) {
allRequestsProvider.pageNum = allRequestsProvider.pageNum + 1;
await allRequestsProvider.getFilterRequests(showLoader:false,status: allRequestsProvider.status);
await allRequestsProvider.getFilterRequests(showLoader: false, status: allRequestsProvider.status);
}
});
}
@override
void dispose() {
_scrollController.dispose();
@ -124,26 +115,18 @@ class _DashboardViewState extends State<DashboardView> {
)),
body: RefreshIndicator(
onRefresh: () async {
getInitialData();
getInitialData();
return Future.delayed(const Duration(milliseconds: 250));
},
child: Scrollbar(
controller: _scrollController,
child: SingleChildScrollView(
// physics: AlwaysScrollableScrollPhysics(),
controller: _scrollController,
// physics: AlwaysScrollableScrollPhysics(),
controller: _scrollController,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
14.height,
ProgressFragment(),
25.height,
SizedBox(
height: 110.toScreenHeight, child: const RequestsFragment()),
16.height,
const RequestCategoryFragment()
],
children: [14.height, ProgressFragment(), 25.height, SizedBox(height: 110.toScreenHeight, child: const RequestsFragment()), 16.height, const RequestCategoryFragment()],
).paddingOnly(start: 16, end: 16, top: 0, bottom: 8),
),
),

@ -163,16 +163,14 @@ import '../../controllers/providers/api/user_provider.dart';
import '../../models/enums/user_types.dart';
class ProgressFragment extends StatelessWidget {
ProgressFragment({Key key}) : super(key: key);
ProgressFragment({Key? key}) : super(key: key);
UserProvider _userProvider;
AllRequestsProvider _provider;
late UserProvider _userProvider;
@override
Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context);
bool isCurrentUserNotEngineer = (_userProvider.user.type != UsersTypes.engineer);
bool isCurrentUserNotEngineer = (_userProvider.user!.type != UsersTypes.engineer);
return Consumer<AllRequestsProvider>(
builder: (context, snapshot, _) {
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);
return "${DateFormat('dd MMM, yyyy').format(dateTime)}\n${DateFormat('hh:mm a').format(dateTime)}";
}
String get toDragAbleTimerFormat {
DateTime dateTime = DateTime.tryParse(this);
DateTime dateTime = DateTime.parse(this);
return DateFormat('HH:mm:ss').format(dateTime);
}
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)}";
}

@ -16,7 +16,9 @@ extension TextStyles on String {
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 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 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 {
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(
data,
data!,
textAlign: align,
style: style.copyWith(
style: style?.copyWith(
color: color,
height: lineHeight,
letterSpacing: letterSpacing,
@ -93,12 +95,16 @@ abstract class AppTextStyles {
decoration: TextDecoration.none,
);
static const TextStyle customHeadingText = TextStyle(
fontFamily: 'Poppins',
fontSize: 27, // Font size in logical pixels
fontWeight: FontWeight.w500, // Equivalent to font-weight: 500
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
fontFamily: 'Poppins',
fontSize: 27,
// Font size in logical pixels
fontWeight: FontWeight.w500,
// Equivalent to font-weight: 500
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(
@ -161,27 +167,12 @@ extension CapExtension on String {
}
extension FilesExtension on String {
SvgPicture toSvgAsset({
int width,
int height,
Color color,
BoxFit fit = BoxFit.contain,
}) =>
SvgPicture toSvgAsset({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);
Image toPngAsset({
int width,
int height,
Color color,
BoxFit fit = BoxFit.contain,
}) =>
Image toPngAsset({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);
LottieBuilder toLottieAsset({
int width,
int height,
BoxFit fit = BoxFit.contain,
bool repeat = true,
}) =>
LottieBuilder toLottieAsset({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);
}

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

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

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

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

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

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

@ -1,21 +1,25 @@
import 'base.dart';
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
bool operator ==(Object other) => identical(this, other) || other is Lookup && ((value != null && value == other.value) || (id != null && id == other.id));
@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};
}
factory Lookup.fromStatus(Lookup old) {
static Lookup? fromStatus(Lookup? old) {
// Now accepts nullable Lookup and returns nullable Lookup
if (old == null) return null;
return Lookup(
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(
name: parsedJson["name"],
id: parsedJson["id"],

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

@ -1,26 +1,19 @@
class DashboardDetail {
List<Data> data;
int totalRows;
String message;
String title;
String innerMessage;
int responseCode;
bool isSuccess;
List<Data>? data;
int? totalRows;
String? message;
String? title;
String? innerMessage;
int? responseCode;
bool? isSuccess;
DashboardDetail(
{this.data,
this.totalRows,
this.message,
this.title,
this.innerMessage,
this.responseCode,
this.isSuccess});
DashboardDetail({this.data, this.totalRows, this.message, this.title, this.innerMessage, this.responseCode, this.isSuccess});
DashboardDetail.fromJson(Map<String, dynamic> json) {
if (json['data'] != null) {
data = <Data>[];
json['data'].forEach((v) {
data.add(Data.fromJson(v));
data!.add(Data.fromJson(v));
});
}
totalRows = json['totalRows'];
@ -34,7 +27,7 @@ class DashboardDetail {
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
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['message'] = message;
@ -47,28 +40,18 @@ class DashboardDetail {
}
class Data {
int id;
String typeTransaction;
String transactionDate;
String statusName;
String priorityName;
bool isHighPriority;
String assetName;
String assetNumber;
String requestTypeName;
String requestNo;
int? id;
String? typeTransaction;
String? transactionDate;
String? statusName;
String? priorityName;
bool? isHighPriority;
String? assetName;
String? assetNumber;
String? requestTypeName;
String? requestNo;
Data(
{this.id,
this.typeTransaction,
this.transactionDate,
this.statusName,
this.priorityName,
this.isHighPriority,
this.assetName,
this.assetNumber,
this.requestTypeName,
this.requestNo});
Data({this.id, this.typeTransaction, this.transactionDate, this.statusName, this.priorityName, this.isHighPriority, this.assetName, this.assetNumber, this.requestTypeName, this.requestNo});
Data.fromJson(Map<String, dynamic> json) {
id = json['id'];
@ -98,22 +81,16 @@ class Data {
return data;
}
}
class CommonResponseModel{
bool data;
String message;
String title;
String innerMessage;
int responseCode;
bool isSuccess;
CommonResponseModel({
this.data,
this.message,
this.title,
this.innerMessage,
this.responseCode,
this.isSuccess,
});
class CommonResponseModel {
bool? data;
String? message;
String? title;
String? innerMessage;
int? responseCode;
bool? isSuccess;
CommonResponseModel({this.data, this.message, this.title, this.innerMessage, this.responseCode, this.isSuccess});
factory CommonResponseModel.fromJson(Map<String, dynamic> json) {
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';
class GasRefillModel {
GasRefillModel({
this.id,
this.gazRefillNo,
this.expectedDate,
this.expectedTime,
this.startDate,
this.startTime,
this.endDate,
this.endTime,
this.engSignature,
this.nurseSignature,
this.workingHours,
this.site,
this.building,
this.floor,
this.department,
this.assignedEmployee,
this.status,
this.comment,
this.gazRefillDetails,
this.localEngineerSignature,
this.localNurseSignature,
this.timer,
});
GasRefillModel(
{this.id,
this.gazRefillNo,
this.expectedDate,
this.expectedTime,
this.startDate,
this.startTime,
this.endDate,
this.endTime,
this.engSignature,
this.nurseSignature,
this.workingHours,
this.site,
this.building,
this.floor,
this.department,
this.assignedEmployee,
this.status,
this.comment,
this.gazRefillDetails,
this.localEngineerSignature,
this.localNurseSignature,
this.timer});
GasRefillModel.fromJson(dynamic json) {
id = json['id'];

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

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

@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/user_types.dart';
@ -12,11 +11,11 @@ class AppBottomNavigationBar extends StatelessWidget {
final Function(int index) onPressed;
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
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(
// height: 86.toScreenHeight,
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(
icon: iconName
?.toSvgAsset(
.toSvgAsset(
width: showLabel ? 28 : 38,
height: showLabel ? 26 : 40,
color: showLabel||(showLabel && selectedIndex != 2)
color: showLabel || (showLabel && selectedIndex != 2)
? selectedIndex == index
? Theme.of(context).bottomNavigationBarTheme.selectedItemColor
: Theme.of(context).bottomNavigationBarTheme.unselectedItemColor
: null,
)
?.paddingOnly(top: 21, bottom: showLabel ? 4 : 0),
.paddingOnly(top: 21, bottom: showLabel ? 4 : 0),
label: showLabel ? label : '',
);
}

@ -10,11 +10,11 @@ import '../app_style/app_color.dart';
class AppDashedButton extends StatelessWidget {
final String title;
final VoidCallback onPressed;
double height;
Color buttonColor;
Widget icon;
double? height;
Color? buttonColor;
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
Widget build(BuildContext context) {
@ -26,20 +26,20 @@ class AppDashedButton extends StatelessWidget {
child: DottedBorder(
strokeWidth: 1,
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],
radius: const Radius.circular(10),
borderType: BorderType.RRect,
child:icon!=null?
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
icon,
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.primary10).center,
child: icon != null
? Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
icon!,
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.primary10).center,
),
).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';
class AppFilledButton extends StatelessWidget {
final VoidCallback onPressed;
final VoidCallback? onPressed;
final String label;
final bool maxWidth, loading;
final Color buttonColor;
final Color textColor;
final Color? buttonColor;
final Color? textColor;
final bool showBorder;
final bool showIcon;
final Widget icon;
const AppFilledButton({
@required this.onPressed,
@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);
const AppFilledButton({ this.onPressed, required this.label, this.maxWidth = false, this.loading = false, this.showBorder = false, this.buttonColor, this.textColor, Key? key})
: super(key: key);
@override
Widget build(BuildContext context) {
@ -40,25 +28,14 @@ class AppFilledButton extends StatelessWidget {
),
child: loading
? SizedBox(
width: 24,
height: 24,
child: CircularProgressIndicator(
color: textColor ?? AppColor.background(context),
strokeWidth: 2,
),
)
: showIcon&&icon!=null?
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)),
width: 24,
height: 24,
child: CircularProgressIndicator(
color: textColor ?? AppColor.background(context),
strokeWidth: 2,
),
)
: label.heading6(context).custom(color: textColor ?? AppColor.background(context)),
).onPress(onPressed);
}
}

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

@ -1,6 +1,5 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/providers/api/all_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
@ -8,27 +7,23 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/all_requests_and_count_model.dart';
import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/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/widgets/request_item_view_list.dart';
import 'package:test_sa/views/widgets/loaders/lazy_loading.dart';
class RequestsListPage extends StatefulWidget {
static const String routeName = "/requests-list-page";
final int index;
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
State<RequestsListPage> createState() => _RequestsListPageState();
}
class _RequestsListPageState extends State<RequestsListPage> {
AllRequestsProvider _provider;
ScrollController _scrollController;
late AllRequestsProvider _provider;
late ScrollController _scrollController;
@override
void initState() {
@ -51,12 +46,11 @@ class _RequestsListPageState extends State<RequestsListPage> {
void handleScroll() async {
_scrollController = ScrollController();
int pageNo =1;
int pageNo = 1;
_scrollController.addListener(() async {
if (_scrollController?.position?.pixels == _scrollController?.position?.maxScrollExtent && !_provider.isRequestCategoryLoading) {
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((_) {
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
? snapshot.isHighPriorityLoading
@ -109,7 +104,7 @@ class _RequestsListPageState extends State<RequestsListPage> {
int pageNo = 1,
int pageSize = 10,
}) 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}');
if (widget.index == 0) {

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

@ -9,7 +9,7 @@ import 'package:test_sa/service_request_latest/views/components/bottom_sheets/se
class FooterActionButton {
static Widget footerContainer({@required Widget child}){
static Widget footerContainer({required Widget child}){
return Align(
alignment: Alignment.bottomCenter,
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){
//accept reject...
case 1:
@ -119,8 +119,8 @@ class FooterActionButton {
child:
AppFilledButton(
label: context.translation.iHaveArrived,
showIcon: true,
icon: 'arrived_icon'.toSvgAsset(),
//showIcon: true,
// icon: 'arrived_icon'.toSvgAsset(),
buttonColor: AppColor.green70,
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';
class InitialVisitCard extends StatelessWidget {
const InitialVisitCard({Key key}) : super(key: key);
const InitialVisitCard({Key? key}) : super(key: key);
@override
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/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/bottom_sheets/service_request_bottomsheet.dart';
import 'package:test_sa/service_request_latest/views/components/initial_visit_card.dart';
import 'package:test_sa/service_request_latest/views/components/timer_widget.dart';
import 'package:test_sa/service_request_latest/views/forms/asset_retired/asset_retired.dart';
import 'package:test_sa/service_request_latest/views/nurse/create_new_request_view.dart';
import 'package:test_sa/views/pages/user/requests/comments_bottom_sheet.dart';
import 'package:test_sa/views/pages/user/requests/update_service_request_page.dart';
import 'package:test_sa/views/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/loaders/app_loading.dart';
import 'package:test_sa/views/widgets/requests/request_status.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 {
static const String id = "/call-details";
ServiceRequest serviceRequest;
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
State<RequestDetailView> createState() => _RequestDetailViewState();
@ -58,16 +52,14 @@ class _RequestDetailViewState extends State<RequestDetailView> {
// setState(() {});
});
}
final GlobalKey _detailsCardKey = GlobalKey();
void createBreakPoint(){
final GlobalKey _detailsCardKey = GlobalKey();
final RenderBox detailContainerBox =
_detailsCardKey.currentContext?.findRenderObject() as RenderBox;
void createBreakPoint() {
final RenderBox detailContainerBox = _detailsCardKey.currentContext?.findRenderObject() as RenderBox;
final detailContainerHeight = detailContainerBox?.size?.height;
}
@override
Widget build(BuildContext context) {
UserProvider _userProvider = Provider.of<UserProvider>(context, listen: false);
@ -87,10 +79,10 @@ class _RequestDetailViewState extends State<RequestDetailView> {
});
}
Widget requestDetailCard({ServiceRequestsProvider serviceRequestsProvider, UserProvider userProvider}) {
if(!serviceRequestsProvider.isDetialLoading){
createBreakPoint();
}
Widget requestDetailCard({required ServiceRequestsProvider serviceRequestsProvider, required UserProvider userProvider}) {
if (!serviceRequestsProvider.isDetialLoading) {
createBreakPoint();
}
return SafeArea(
key: _detailsCardKey,
child: serviceRequestsProvider.isDetialLoading
@ -108,18 +100,18 @@ class _RequestDetailViewState extends State<RequestDetailView> {
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
informationCard(serviceRequestsProvider.currentSelectedRequest, userProvider),
informationCard(serviceRequestsProvider.currentSelectedRequest!, userProvider),
40.height,
// skipForLater(serviceRequestsProvider.currentSelectedRequest),
// 20.height,
// skipForLater(serviceRequestsProvider.currentSelectedRequest),
// 20.height,
const InitialVisitCard(),
20.height,
],
),
),
FooterActionButton.footerWidget(status: 1, context: context),
const TimerWidget(),
TimerWidget(),
],
),
);
@ -143,30 +135,30 @@ class _RequestDetailViewState extends State<RequestDetailView> {
mainAxisSize: MainAxisSize.min,
children: [
StatusLabel(
label: serviceRequest.priority.name,
id: serviceRequest.priority.id,
label: serviceRequest.priority?.name,
id: serviceRequest.priority!.id!,
radius: 4,
textColor: AppColor.getPriorityStatusTextColor(context, serviceRequest.priority.id),
backgroundColor: AppColor.getPriorityStatusColor(context, serviceRequest.priority.id),
textColor: AppColor.getPriorityStatusTextColor(context, serviceRequest.priority!.id!),
backgroundColor: AppColor.getPriorityStatusColor(context, serviceRequest.priority!.id!),
),
8.width,
StatusLabel(
radius: 4,
label: serviceRequest.statusLabel,
textColor: AppColor.getRequestStatusTextColor(context, serviceRequest.statusValue),
backgroundColor: AppColor.getRequestStatusColor(context, serviceRequest.statusValue),
textColor: AppColor.getRequestStatusTextColor(context, serviceRequest.statusValue!),
backgroundColor: AppColor.getRequestStatusColor(context, serviceRequest.statusValue!),
),
1.width.expanded,
Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
if (userProvider.user.type == UsersTypes.normal_user)
if (userProvider.user!.type == UsersTypes.normal_user)
context.translation.code.toSvgAsset(width: 48).onPress(() {
Navigator.push(context, MaterialPageRoute(builder: (context) => UpdateServiceRequestPage(serviceRequest: serviceRequest)));
}),
if (userProvider.user.type == UsersTypes.engineer) 16.height,
if (userProvider.user!.type == UsersTypes.engineer) 16.height,
Text(
serviceRequest.date.toServiceRequestCardFormat,
serviceRequest.date!.toServiceRequestCardFormat,
textAlign: TextAlign.end,
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),
),
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),
),
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),
),
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),
),
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),
),
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),
),
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),
),
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),
),
],
@ -232,7 +224,7 @@ class _RequestDetailViewState extends State<RequestDetailView> {
),
8.height,
Text(
'${context.translation.requestType}: ${serviceRequest.type.name}',
'${context.translation.requestType}: ${serviceRequest.type?.name}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
),
Text(
@ -249,24 +241,24 @@ class _RequestDetailViewState extends State<RequestDetailView> {
const Divider().defaultStyle(context),
8.height,
Text(
serviceRequest.callComments,
serviceRequest.callComments!,
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
),
],
if (serviceRequest.devicePhotos.isNotEmpty) ...[
if (serviceRequest.devicePhotos?.isNotEmpty ?? false) ...[
8.height,
const Divider().defaultStyle(context),
FilesList(images: serviceRequest.devicePhotos),
FilesList(images: serviceRequest.devicePhotos!),
],
if (serviceRequest.audio?.isNotEmpty ?? false) ...[
const Divider().defaultStyle(context),
16.height,
ASoundPlayer(audio: serviceRequest.audio),
ASoundPlayer(audio: serviceRequest.audio!),
8.height,
],
],
).paddingOnly(start: 16, end: 16, top: 16, bottom: 8),
(userProvider.user.type == UsersTypes.normal_user
(userProvider.user!.type == UsersTypes.normal_user
? Container(
height: 50,
padding: const EdgeInsets.only(left: 16, right: 16),
@ -319,49 +311,43 @@ class _RequestDetailViewState extends State<RequestDetailView> {
isScrollControlled: true,
useRootNavigator: true,
backgroundColor: Colors.transparent,
builder: (context) => CommentsBottomSheet(requestId: serviceRequest.id),
builder: (context) => CommentsBottomSheet(requestId: serviceRequest.id!),
);
}),
//set condition for show asset detail button...
if(true)...[
if (true) ...[
assetRetiredButton(serviceRequest: serviceRequest),
]
],
).toShadowContainer(context, padding: 0);
}
Widget assetRetiredButton({ServiceRequest serviceRequest}){
Widget assetRetiredButton({required ServiceRequest serviceRequest}) {
return Padding(
padding: EdgeInsets.symmetric(horizontal: 16.toScreenHeight,vertical: 12.toScreenWidth),
padding: EdgeInsets.symmetric(horizontal: 16.toScreenHeight, vertical: 12.toScreenWidth),
child: AppFilledButton(
label: context.translation.assetToBeRetired,
maxWidth: true,
buttonColor: Colors.white54,
textColor: AppColor.red30,
showBorder: true,
onPressed: () async {
// ServiceRequestBottomSheet.nurseTakeActionBottomSheet(context: context);
Navigator.push(context, MaterialPageRoute(builder: (context)=>const AssetRetired()));
}
),
label: context.translation.assetToBeRetired,
maxWidth: true,
buttonColor: Colors.white54,
textColor: AppColor.red30,
showBorder: true,
onPressed: () async {
// ServiceRequestBottomSheet.nurseTakeActionBottomSheet(context: context);
Navigator.push(context, MaterialPageRoute(builder: (context) => AssetRetired()));
}),
);
}
Widget skipForLater (ServiceRequest serviceRequest){
return Center(
Widget skipForLater(ServiceRequest serviceRequest) {
return Center(
child: InkWell(
onTap: () async {
try {
//use a common list
AllRequestsProvider allRequestProvider = Provider.of<AllRequestsProvider>(context, listen: false);
int index = allRequestProvider.requestDetailList.requestsDetails.indexWhere((element) => element.id.toString() == serviceRequest.id);
if (index != -1 && index != allRequestProvider.requestDetailList.requestsDetails.length) {
getServiceRequest(requestId: allRequestProvider.requestDetailList.requestsDetails[index + 1].id.toString());
int index = allRequestProvider.requestDetailList!.requestsDetails!.indexWhere((element) => element.id.toString() == serviceRequest.id);
if (index != -1 && index != allRequestProvider.requestDetailList!.requestsDetails!.length) {
getServiceRequest(requestId: allRequestProvider.requestDetailList!.requestsDetails![index + 1].id.toString());
}
} catch (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';
class TimerWidget extends StatefulWidget {
const TimerWidget({Key key}) : super(key: key);
const TimerWidget({Key? key}) : super(key: key);
@override
_TimerWidgetState createState() => _TimerWidgetState();
@ -19,7 +19,7 @@ class TimerWidget extends StatefulWidget {
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
void initState() {
// TODO: implement initState

@ -15,7 +15,7 @@ import 'package:test_sa/views/widgets/qr/scan_qr.dart';
import 'activities_list_view.dart';
class VerifyArrivalView extends StatelessWidget {
VerifyArrivalView({Key key}) : super(key: key);
VerifyArrivalView({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
@ -37,13 +37,12 @@ class VerifyArrivalView extends StatelessWidget {
itemBuilder: (context, index) {
final item = items[index];
return listItem(
icon: item['icon'],
heading: item['heading'],
subHeading: item['subHeading'],
icon: item['icon']!,
heading: item['heading']!,
subHeading: item['subHeading']!,
context: context,
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(
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){
case 0:
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/views/widgets/images/multi_image_picker.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_types_provider.dart';
import '../../../../../models/lookup.dart';
@ -31,19 +32,19 @@ import '../../../controllers/validator/validator.dart';
class SparePartRequest extends StatefulWidget {
static const String id = "/verify-assets-detail";
const SparePartRequest({Key key}) : super(key: key);
const SparePartRequest({Key? key}) : super(key: key);
@override
_SparePartRequestState createState() => _SparePartRequestState();
}
class _SparePartRequestState extends State<SparePartRequest> with TickerProviderStateMixin {
UserProvider _userProvider;
SettingProvider _settingProvider;
ServiceRequestsProvider _serviceRequestsProvider;
ServiceStatusProvider _assetTypeProvider;
PartsProvider _partsProvider;
ServiceReport _serviceReport;
late UserProvider _userProvider;
late SettingProvider _settingProvider;
late ServiceRequestsProvider _serviceRequestsProvider;
late ServiceStatusProvider _assetTypeProvider;
late PartsProvider _partsProvider;
late ServiceReport _serviceReport;
bool _isLoading = false;
List<SparePart> _spareParts = [];
@ -68,12 +69,11 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
ServiceRequestsProvider serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
Provider.of<ServiceReportLastCallsProvider>(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;
}
Asset loanAvailabilityAsset;
@override
void dispose() {
@ -87,12 +87,12 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
_isLoading = true;
setState(() {});
ServiceRequestsProvider serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
_serviceReport.callRequest = await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: serviceRequestsProvider.currentSelectedRequest.id);
await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host);
_serviceReport.callRequest = await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: serviceRequestsProvider.currentSelectedRequest!.id!);
await _assetTypeProvider.getTypes();
_serviceReport.assignedEmployee = _serviceReport.callRequest?.assignedEmployee;
_serviceReport.equipmentStatus = _serviceReport.callRequest?.defectType;
_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;
setState(() {});
}
@ -109,7 +109,7 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
}
_serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere(
(element) => element.value == _serviceReport.callRequest?.assetType,
orElse: () => null,
orElse: null,
);
return Scaffold(

@ -21,7 +21,7 @@ class WorkOrderCardView extends StatelessWidget {
final ServiceRequest serviceRequest;
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
Widget build(BuildContext context) {
@ -34,18 +34,18 @@ class WorkOrderCardView extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
StatusLabel(
label: workOrder.currentSituation.name,
textColor: AppColor.getRequestStatusTextColorByName(context, workOrder.currentSituation.name),
backgroundColor: AppColor.getRequestStatusColorByName(context, workOrder.currentSituation.name),
label: workOrder.currentSituation!.name,
textColor: AppColor.getRequestStatusTextColorByName(context, workOrder.currentSituation?.name),
backgroundColor: AppColor.getRequestStatusColorByName(context, workOrder.currentSituation?.name),
),
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(
'${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),
),
Text(
'${context.translation.currentSituation}: ${workOrder.currentSituation.name}',
'${context.translation.currentSituation}: ${workOrder.currentSituation?.name}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
),
16.height,
@ -71,13 +71,13 @@ class WorkOrderCardView extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.start,
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(() {
Navigator.of(context).push(
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 ?? "",
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) {
Provider.of<ServiceReportLastCallsProvider>(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;
}

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

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

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

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

Loading…
Cancel
Save