design_3.0_latest
muhammad.abbasi 1 year ago
parent 68a8dc250f
commit 53c5240377

@ -0,0 +1,3 @@
<svg width="16" height="15" viewBox="0 0 16 15" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13.688 1.4117C11.8058 -0.470567 8.74304 -0.470567 6.86053 1.4117L1.00825 7.26395C-0.336157 8.60851 -0.336069 10.7962 1.00843 12.1407C1.68073 12.813 2.56355 13.1491 3.44673 13.149C4.32967 13.1489 5.21296 12.8129 5.88515 12.1407L11.2496 6.77612C11.6404 6.38535 11.8557 5.86578 11.8557 5.31313C11.8557 4.76046 11.6405 4.24092 11.2497 3.85004C10.4429 3.04334 9.13017 3.04337 8.32357 3.85018L4.81544 7.35822C4.54611 7.62752 4.54611 8.06421 4.81538 8.33357C5.08468 8.60296 5.52137 8.60287 5.79073 8.33357L9.29889 4.8255C9.56781 4.55659 10.0053 4.55653 10.2742 4.82544C10.4045 4.9557 10.4763 5.1289 10.4763 5.31311C10.4763 5.49731 10.4045 5.67045 10.2742 5.80077L4.9098 11.1653C4.10305 11.972 2.79047 11.9721 1.98378 11.1654C1.17709 10.3586 1.17703 9.04597 1.98363 8.23922L7.83588 2.38705C9.1805 1.0425 11.3682 1.0425 12.7126 2.38705C13.364 3.03833 13.7227 3.90431 13.7227 4.82539C13.7227 5.74646 13.3639 6.61244 12.7126 7.26378L6.86044 13.1161C6.59114 13.3854 6.59114 13.8221 6.8605 14.0915C6.99518 14.2262 7.17169 14.2935 7.34816 14.2935C7.52467 14.2935 7.70117 14.2261 7.83585 14.0915L13.6879 8.23916C14.5998 7.32734 15.102 6.11499 15.102 4.82542C15.102 3.53587 14.5998 2.32352 13.688 1.4117Z" fill="#3DA5E5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@ -27,8 +27,8 @@ class URLs {
static get getSiteAutoCompleteWithoutConditionSites => "$_baseUrl/Customer/GetCustomersAutoCompleteWithoutConditionSites"; // get
static get nurseDashboardCountUrl=> '$_baseUrl/ServiceRequest/GetDashboardNurseCount';
static get nurseDashboardDetailsUrl=> '$_baseUrl/ServiceRequest/GetDashboardNurseDetails';
static get nurseConfirmReopenUrl=> '$_baseUrl/ServiceRequest/NurseConfirmReopen';
static get nurseConfirmCloseUrl=> '$_baseUrl/ServiceRequest/NurseConfirmClose';
static get nurseRejectUrl=> '$_baseUrl/ServiceRequest/NurseReject';
static get nurseConfirmUrl=> '$_baseUrl/ServiceRequest/NurseConfirm';
static get engineerDashboardCountUrl=> '$_baseUrl/ServiceRequest/GetDashboardEngineerCount';
static get engineerDashboardDetailsUrl=> '$_baseUrl/ServiceRequest/GetDashboardEngineerDetails';
static get engineerAcceptUrl=> '$_baseUrl/ServiceRequest/EngineerAccept';
@ -36,10 +36,13 @@ class URLs {
static get engineerFixRemotlyUrl=> '$_baseUrl/ServiceRequest/EngineerFixRemotly';
static get engineerNeedVisitUrl=> '$_baseUrl/ServiceRequest/EngineerNeedVisit';
static get engineerMarkAsFixUrl=> '$_baseUrl/ServiceRequest/EngineerMarkAsFix';
static get engineerConfirmArriveUrl=> '$_baseUrl/ServiceRequest/EngineerConfirmArrive';
static get engineerUpdateWorkOrderUrl=> '$_baseUrl/ServiceRequest/EngineerUpdateWorkOrder';
static get getWorkOrderByIdUrl=> '$_baseUrl/ServiceRequest/GetWorkOrderById';
static get deleteActivitySparePartUrl=> '$_baseUrl/ServiceRequest/DeleteActivitySparePart';
static get createActivitySparePartUrl=> '$_baseUrl/ServiceRequest/CreateActivitySparePart';
static get createActivityAssetToBeRetiredUrl=> '$_baseUrl/ServiceRequest/CreateActivityAssetToBeRetired';
static get createWorkOrderUrl=> '$_baseUrl/ServiceRequest/CreateWorkOrder';
static get updateActivitySparePartUrl=> '$_baseUrl/ServiceRequest/UpdateActivitySparePart';
static get assignEngineerToWorkOrderUrl=> '$_baseUrl/ServiceRequest/AssignEngineerToWorkOrder';
static get getDepartments => "$_baseUrl/Customer/GetDepartmentLookup"; // get

@ -134,6 +134,13 @@ abstract class AppTextStyles {
fontStyle: FontStyle.normal,
decoration: TextDecoration.none,
);
static final TextStyle textFieldLabelStyle= TextStyle(
fontSize: 11.toScreenWidth,
fontWeight: FontWeight.w500,
color: AppColor.neutral20,
fontStyle: FontStyle.normal,
decoration: TextDecoration.none,
);
static final TextStyle tinyFont2 = TextStyle(
fontSize: 10.toScreenWidth,
fontWeight: FontWeight.w500,

@ -5,10 +5,6 @@ class NurseActionModel {
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']);
}
Map<String, dynamic> toJson() {
return {'workOrderId': workOrderId, 'feedback': feedback, 'signatureNurse': signatureNurse};
}

@ -0,0 +1,116 @@
class WorkOrderHModel {
int? assetId;
int? equipmentStatusId;
int? priorityId;
int? problemDescriptionId;
String? comments;
String? voiceNote;
List<WorkOrderAttachments>? workOrderAttachments;
WorkOrderHModel(
{this.assetId,
this.equipmentStatusId,
this.priorityId,
this.problemDescriptionId,
this.comments,
this.voiceNote,
this.workOrderAttachments});
WorkOrderHModel.fromJson(Map<String, dynamic> json) {
assetId = json['assetId'];
equipmentStatusId = json['equipmentStatusId'];
priorityId = json['priorityId'];
problemDescriptionId = json['problemDescriptionId'];
comments = json['comments'];
voiceNote = json['voiceNote'];
if (json['workOrderAttachments'] != null) {
workOrderAttachments = <WorkOrderAttachments>[];
json['workOrderAttachments'].forEach((v) {
workOrderAttachments!.add( WorkOrderAttachments.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['assetId'] = assetId;
data['equipmentStatusId'] = equipmentStatusId;
data['priorityId'] = priorityId;
data['problemDescriptionId'] = problemDescriptionId;
data['comments'] = comments;
data['voiceNote'] = voiceNote;
if (workOrderAttachments != null) {
data['workOrderAttachments'] =
workOrderAttachments!.map((v) => v.toJson()).toList();
}
return data;
}
}
class WorkOrderAttachments {
int? id;
String? name;
WorkOrderAttachments({this.id, this.name});
WorkOrderAttachments.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['name'] = name;
return data;
}
}
class EngineerUpdateWorkOrderHModel {
int? workOrderId;
int? equipmentStatusId;
String? returnToService;
int? serviceTypeId;
int? loanAvailabilityId;
int? loanAssetId;
int? failureReasonId;
int? faultDescriptionId;
String? solution;
EngineerUpdateWorkOrderHModel(
{this.workOrderId,
this.equipmentStatusId,
this.returnToService,
this.serviceTypeId,
this.loanAvailabilityId,
this.loanAssetId,
this.failureReasonId,
this.faultDescriptionId,
this.solution});
EngineerUpdateWorkOrderHModel.fromJson(Map<String, dynamic> json) {
workOrderId = json['workOrderId'];
equipmentStatusId = json['equipmentStatusId'];
returnToService = json['returnToService'];
serviceTypeId = json['serviceTypeId'];
loanAvailabilityId = json['loanAvailabilityId'];
loanAssetId = json['loanAssetId'];
failureReasonId = json['failureReasonId'];
faultDescriptionId = json['faultDescriptionId'];
solution = json['solution'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['workOrderId'] = workOrderId;
data['equipmentStatusId'] = equipmentStatusId;
data['returnToService'] = returnToService;
data['serviceTypeId'] = serviceTypeId;
data['loanAvailabilityId'] = loanAvailabilityId;
data['loanAssetId'] = loanAssetId;
data['failureReasonId'] = failureReasonId;
data['faultDescriptionId'] = faultDescriptionId;
data['solution'] = solution;
return data;
}
}

@ -27,6 +27,7 @@ class AppColor {
static const Color neutral100 = Color(0xffF4F6FC);
static const Color neutral110 = Color(0xffF3F5FB);
static const Color neutral120 = Color(0xff7D859A);
static const Color neutral130 = Color(0xffE0E0E0);
//background

@ -110,6 +110,7 @@ class _AppTextFormFieldState extends State<AppTextFormField> {
focusedBorder: border,
enabledBorder: border,
errorBorder: border,
contentPadding: widget.contentPadding ?? EdgeInsets.symmetric(vertical: 12.toScreenHeight, horizontal: 16.toScreenWidth),
constraints: const BoxConstraints(),
suffixIconConstraints: const BoxConstraints(minWidth: 0),

@ -6,6 +6,7 @@ import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/helper_data_models/asset_retired/asset_retired_model.dart';
import 'package:test_sa/models/helper_data_models/spare_part/activity_spare_part_model.dart';
import 'package:test_sa/models/helper_data_models/workorder/work_order_model.dart';
import 'package:test_sa/models/helper_data_models/workorder/fix_remotely_model.dart';
import 'package:test_sa/models/helper_data_models/workorder/mark_as_fixed_model.dart';
import 'package:test_sa/models/helper_data_models/workorder/need_visit_model.dart';
@ -15,6 +16,7 @@ import 'package:test_sa/models/new_models/workOrderDetail.dart';
class RequestDetailProvider extends ChangeNotifier {
final pageItemNumber = 10;
void reset() {
nextPage = true;
stateCode = null;
@ -57,69 +59,69 @@ class RequestDetailProvider extends ChangeNotifier {
notifyListeners();
}
WorkOrderDetail ?_currentWorkOrder;
FixRemotely ?_fixRemotelyModel=FixRemotely();
NeedVisit ?_needVisitModel=NeedVisit();
MarkAsFixed ?_markAsFixed=MarkAsFixed();
ActivitySparePartModel ?_activitySparePartModel= ActivitySparePartModel();
ActivityAssetRetiredModel ?_activityAssetRetiredModel = ActivityAssetRetiredModel();
WorkOrderDetail? _currentWorkOrder;
FixRemotely? _fixRemotelyModel = FixRemotely();
NeedVisit? _needVisitModel = NeedVisit();
MarkAsFixed? _markAsFixed = MarkAsFixed();
ActivitySparePartModel? _activitySparePartModel = ActivitySparePartModel();
ActivityAssetRetiredModel? _activityAssetRetiredModel = ActivityAssetRetiredModel();
WorkOrderHModel _workOrderHModel = WorkOrderHModel();
WorkOrderHModel get workOrderHModel => _workOrderHModel;
set workOrderHModel(WorkOrderHModel value) {
_workOrderHModel = value;
notifyListeners();
}
ActivityAssetRetiredModel? get activityAssetRetiredModel => _activityAssetRetiredModel;
set activityAssetRetiredModel(ActivityAssetRetiredModel ?value) {
set activityAssetRetiredModel(ActivityAssetRetiredModel? value) {
_activityAssetRetiredModel = value;
notifyListeners();
}
ActivitySparePartModel ?get activitySparePartModel => _activitySparePartModel;
ActivitySparePartModel? get activitySparePartModel => _activitySparePartModel;
set activitySparePartModel(ActivitySparePartModel ? value) {
set activitySparePartModel(ActivitySparePartModel? value) {
_activitySparePartModel = value;
notifyListeners();
}
MarkAsFixed ? get markAsFixed => _markAsFixed;
MarkAsFixed? get markAsFixed => _markAsFixed;
set markAsFixed(MarkAsFixed ? value) {
set markAsFixed(MarkAsFixed? value) {
_markAsFixed = value;
notifyListeners();
}
NurseActionModel ?_nurseActionModel;
NurseActionModel? get nurseActionModel => _nurseActionModel;
set nurseActionModel(NurseActionModel? value) {
_nurseActionModel = value;
notifyListeners();
}
NeedVisit ?get needVisitModel => _needVisitModel;
NeedVisit? get needVisitModel => _needVisitModel;
set needVisitModel(NeedVisit? value) {
_needVisitModel = value;
notifyListeners();
}
FixRemotely ?get fixRemotelyModel => _fixRemotelyModel;
FixRemotely? get fixRemotelyModel => _fixRemotelyModel;
set fixRemotelyModel(FixRemotely? value) {
_fixRemotelyModel = value;
notifyListeners();
}
WorkOrderDetail ?get currentWorkOrder => _currentWorkOrder;
WorkOrderDetail? get currentWorkOrder => _currentWorkOrder;
set currentWorkOrder(WorkOrderDetail? value) {
_currentWorkOrder = value;
notifyListeners();
}
int ?stateCode;
int? stateCode;
// true if there is next page in product list and false if not
bool nextPage = true;
TimeOfDay? _selectedTime ;
TimeOfDay? _selectedTime;
TimeOfDay? get selectedTime => _selectedTime;
@ -127,6 +129,7 @@ class RequestDetailProvider extends ChangeNotifier {
_selectedTime = value;
notifyListeners();
} // list of user requests
int _selectedListIndex = 0;
int get selectedListIndex => _selectedListIndex;
@ -135,149 +138,197 @@ class RequestDetailProvider extends ChangeNotifier {
_selectedListIndex = value;
notifyListeners();
}
//create workOrder nurse .....
Future<int> createWorkOrder({required WorkOrderHModel workOrderHModel}) async {
isLoading = true;
try {
final response = await ApiManager.instance.post(
URLs.createWorkOrderUrl,
body: workOrderHModel.toJson(),
);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
// request.engineerName = employee.name;
notifyListeners();
}
isLoading = false;
notifyListeners();
return response.statusCode;
} catch (error) {
isLoading = false;
notifyListeners();
return -1;
}
}
//getWorkOrderById......
Future<WorkOrderDetail?> getWorkOrderById({required String id}) async {
try {
isLoading = true;
final response = await ApiManager.instance.get(URLs.getWorkOrderByIdUrl+"?workOrderId=$id");
isLoading = true;
final response = await ApiManager.instance.get(URLs.getWorkOrderByIdUrl + "?workOrderId=$id");
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body));
currentWorkOrder = WorkOrderDetail.fromJson(json.decode(response.body));
notifyListeners();
isLoading = false;
return currentWorkOrder;
return currentWorkOrder;
}
isLoading= false;
notifyListeners();
isLoading = false;
notifyListeners();
return null;
}
catch (e) {
} catch (e) {
log("getSubWorkOrderDetails [error] : $e");
isLoading = false;
notifyListeners();
return null;
}
}
//engineerAcceptWorkOrder......
Future<CommonResponseModel> engineerAcceptWorkOrder({required String id}) async {
try {
final body = {
"workOrderId": id,
};
isLoading = true;
final response = await ApiManager.instance.post(URLs.engineerAcceptUrl,body: body);
isLoading = true;
final response = await ApiManager.instance.post(URLs.engineerAcceptUrl, body: body);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
print('response of Engineer accept workorder ${commonResponseModel.toJson()}');
notifyListeners();
isLoading = false;
return commonResponseModel;
return commonResponseModel;
}
isLoading= false;
notifyListeners();
isLoading = false;
notifyListeners();
return CommonResponseModel();
}
catch (e) {
} catch (e) {
log("engineer accept [error] : $e");
isLoading = false;
notifyListeners();
return CommonResponseModel();
}
}
//engineerRejectWorkOrder......
Future<CommonResponseModel> engineerRejectWorkOrder({required String id,String? feedBack}) async {
Future<CommonResponseModel> engineerRejectWorkOrder({required String id, String? feedBack}) async {
try {
final body = {
"workOrderId": id,
"feedback": feedBack??'',
"feedback": feedBack ?? '',
};
isLoading = true;
final response = await ApiManager.instance.post(URLs.engineerRejectUrl,body: body);
isLoading = true;
final response = await ApiManager.instance.post(URLs.engineerRejectUrl, body: body);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
print('response of Engineer reject workorder ${commonResponseModel.toJson()}');
notifyListeners();
isLoading = false;
return commonResponseModel;
return commonResponseModel;
}
isLoading= false;
notifyListeners();
isLoading = false;
notifyListeners();
return CommonResponseModel();
}
catch (e) {
} catch (e) {
log("engineer accept [error] : $e");
isLoading = false;
notifyListeners();
return CommonResponseModel();
}
}
//engineerFixRemotelyWorkOrder......
Future<CommonResponseModel> engineerFixRemotely() async {
try {
isLoading = true;
final response = await ApiManager.instance.post(URLs.engineerFixRemotlyUrl,body: fixRemotelyModel!.toJson());
final response = await ApiManager.instance.post(URLs.engineerFixRemotlyUrl, body: fixRemotelyModel!.toJson());
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
notifyListeners();
isLoading = false;
return commonResponseModel;
return commonResponseModel;
}
isLoading= false;
isLoading = false;
notifyListeners();
return CommonResponseModel();
}
catch (e) {
} catch (e) {
log("engineer accept [error] : $e");
isLoading = false;
notifyListeners();
return CommonResponseModel();
}
}
//engineerNeedAVisitWorkOrder......
Future<CommonResponseModel> engineerNeedVisit() async {
try {
isLoading = true;
final response = await ApiManager.instance.post(URLs.engineerNeedVisitUrl,body: needVisitModel!.toJson());
final response = await ApiManager.instance.post(URLs.engineerNeedVisitUrl, body: needVisitModel!.toJson());
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
print('response of Engineer fixremotely workorder ${commonResponseModel.toJson()}');
notifyListeners();
isLoading = false;
return commonResponseModel;
return commonResponseModel;
}
isLoading= false;
isLoading = false;
notifyListeners();
return CommonResponseModel();
}
catch (e) {
} catch (e) {
log("engineer accept [error] : $e");
isLoading = false;
notifyListeners();
return CommonResponseModel();
}
}
//engineerMarkAsFixed......
Future<CommonResponseModel> engineerMarkAsFixed() async {
try {
isLoading = true;
final response = await ApiManager.instance.post(URLs.engineerMarkAsFixUrl,body: markAsFixed!.toJson());
final response = await ApiManager.instance.post(URLs.engineerMarkAsFixUrl, body: markAsFixed!.toJson());
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
print('response of Engineer mark as fixed ${commonResponseModel.toJson()}');
notifyListeners();
isLoading = false;
return commonResponseModel;
return commonResponseModel;
}
isLoading= false;
isLoading = false;
notifyListeners();
return CommonResponseModel();
} catch (e) {
log("engineer accept [error] : $e");
isLoading = false;
notifyListeners();
return CommonResponseModel();
}
catch (e) {
}
//engineer Confirm Arrive......
Future<CommonResponseModel> engineerConfirmArrive({required int workOrderId, required int verificationTypeId, required String photoInfo, required String otp}) async {
try {
Map<String, dynamic> body = {"workOrderId": workOrderId, "verificationTypeId": verificationTypeId, "photoInfo": photoInfo, "otp": otp};
isLoading = true;
final response = await ApiManager.instance.post(URLs.engineerConfirmArriveUrl, body: body);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
print('response of Engineer mark as fixed ${commonResponseModel.toJson()}');
notifyListeners();
isLoading = false;
return commonResponseModel;
}
isLoading = false;
notifyListeners();
return CommonResponseModel();
} catch (e) {
log("engineer accept [error] : $e");
isLoading = false;
notifyListeners();
@ -285,83 +336,107 @@ class RequestDetailProvider extends ChangeNotifier {
}
}
//assignEngineerToWorkOrder......
Future<CommonResponseModel> assignEngineerWorkOrder({required String workOrderId,required String engineerId}) async {
Future<CommonResponseModel> assignEngineerWorkOrder({required String workOrderId, required String engineerId}) async {
try {
final body = {
"workOrderId": workOrderId,
"assignedEngineerId": engineerId,
};
isLoading = true;
final response = await ApiManager.instance.post(URLs.assignEngineerToWorkOrderUrl,body: body);
final response = await ApiManager.instance.post(URLs.assignEngineerToWorkOrderUrl, body: body);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
notifyListeners();
isLoading = false;
return commonResponseModel;
return commonResponseModel;
}
isLoading= false;
isLoading = false;
notifyListeners();
return CommonResponseModel();
} catch (e) {
log("engineer accept [error] : $e");
isLoading = false;
notifyListeners();
return CommonResponseModel();
}
catch (e) {
}
//engineerUpdateWorkOrder......
Future<CommonResponseModel> engineerUpdateWorkOrder({required EngineerUpdateWorkOrderHModel model}) async {
try {
isLoading = true;
final response = await ApiManager.instance.post(URLs.engineerUpdateWorkOrderUrl, body: model.toJson());
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
notifyListeners();
isLoading = false;
return commonResponseModel;
}
isLoading = false;
notifyListeners();
return CommonResponseModel();
} catch (e) {
log("engineer accept [error] : $e");
isLoading = false;
notifyListeners();
return CommonResponseModel();
}
}
//Nurse confirm reopen
Future<CommonResponseModel> nurseReopen() async {
Future<CommonResponseModel> nurseReject({required NurseActionModel model}) async {
try {
isLoading = true;
final response = await ApiManager.instance.post(URLs.nurseConfirmReopenUrl,body: nurseActionModel!.toJson());
final response = await ApiManager.instance.post(URLs.nurseRejectUrl, body: model.toJson());
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
notifyListeners();
isLoading = false;
return commonResponseModel;
return commonResponseModel;
}
isLoading= false;
isLoading = false;
notifyListeners();
return CommonResponseModel();
}
catch (e) {
} catch (e) {
log("engineer accept [error] : $e");
isLoading = false;
notifyListeners();
return CommonResponseModel();
}
}
//Nurse confirm close
Future<CommonResponseModel> nurseClose() async {
Future<CommonResponseModel> nurseConfirm({required NurseActionModel model}) async {
try {
isLoading = true;
final response = await ApiManager.instance.post(URLs.nurseConfirmCloseUrl,body: nurseActionModel!.toJson());
final response = await ApiManager.instance.post(URLs.nurseConfirmUrl, body: model.toJson());
print('response i got is ${response.body}');
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
print('response of nurse confirmreopen workorder ${commonResponseModel.toJson()}');
CommonResponseModel commonResponseModel = CommonResponseModel.fromJson(json.decode(response.body));
notifyListeners();
isLoading = false;
return commonResponseModel;
return commonResponseModel;
}
isLoading= false;
isLoading = false;
notifyListeners();
return CommonResponseModel();
}
catch (e) {
} catch (e) {
log("engineer accept [error] : $e");
isLoading = false;
notifyListeners();
return CommonResponseModel();
}
}
Future<int> updateActivitySparePart({required ActivitySparePartModel activitySparePartModel}) async {
isLoading = true;
try {
final response = await ApiManager.instance.put(
final response = await ApiManager.instance.post(
URLs.updateActivitySparePartUrl,
body: activitySparePartModel.toJson(),
);
@ -379,11 +454,12 @@ class RequestDetailProvider extends ChangeNotifier {
return -1;
}
}
Future<int> deleteActivitySparePart({required int id,required int workOrderId}) async {
Future<int> deleteActivitySparePart({required int id, required int workOrderId}) async {
isLoading = true;
var body = {
'id':id,
'workOrderId':workOrderId,
'id': id,
'workOrderId': workOrderId,
};
try {
final response = await ApiManager.instance.post(
@ -404,10 +480,11 @@ class RequestDetailProvider extends ChangeNotifier {
return -1;
}
}
Future<int> createActivitySparePart({required ActivitySparePartModel activitySparePartModel}) async {
isLoading = true;
try {
final response = await ApiManager.instance.put(
final response = await ApiManager.instance.post(
URLs.createActivitySparePartUrl,
body: activitySparePartModel.toJson(),
);
@ -425,10 +502,11 @@ class RequestDetailProvider extends ChangeNotifier {
return -1;
}
}
Future<int> createActivityAssetToBeRetired({required ActivityAssetRetiredModel activityAssetRetiredModel}) async {
isLoading = true;
try {
final response = await ApiManager.instance.put(
final response = await ApiManager.instance.post(
URLs.createActivityAssetToBeRetiredUrl,
body: activityAssetRetiredModel.toJson(),
);

@ -20,7 +20,7 @@ class FooterActionButton {
);
}
static Widget footerWidget({required int status,required BuildContext context}){
static Widget requestDetailsFooterWidget({required int status,required BuildContext context}){
switch(status){
//accept reject...
case 1:
@ -151,7 +151,7 @@ class FooterActionButton {
// maxWidth: true,
buttonColor: AppColor.primary10,
onPressed: () async {
ServiceRequestBottomSheet.nurseTakeActionBottomSheet(context: context);
},
)
);

@ -1,3 +1,5 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_svg/flutter_svg.dart';
@ -9,11 +11,13 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/helper_data_models/workorder/nurse_action_model.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/models/timer_model.dart';
import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart';
import 'package:test_sa/providers/service_request_providers/first_action_provider.dart';
import 'package:test_sa/service_request_latest/request_detail_provider.dart';
import 'package:test_sa/service_request_latest/views/forms/spare_part/spare_part_request.dart';
import 'package:test_sa/service_request_latest/views/components/verify_arrival_view.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
@ -58,7 +62,7 @@ class ServiceRequestBottomSheet {
ADatePicker(
label: context.translation.date,
hideShadow: true,
height: 80.toScreenHeight,
// height: 60.toScreenHeight,
backgroundColor: AppColor.neutral100,
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.startDate ?? ""),
formatDateWithTime: true,
@ -95,7 +99,7 @@ class ServiceRequestBottomSheet {
8.height,
SizedBox(
width: double.infinity,
height: 80.toScreenHeight,
height: 56.toScreenHeight,
// padding: EdgeInsets.symmetric(horizontal: 20.toScreenWidth, vertical: 10.toScreenHeight),
child: AppTimer(
label: context.translation.workingHours,
@ -117,6 +121,7 @@ class ServiceRequestBottomSheet {
AppTextFormField(
labelText: context.translation.comments,
textInputType: TextInputType.multiline,
labelStyle: AppTextStyles.textFieldLabelStyle,
showWithoutDecoration: true,
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral100,
alignLabelWithHint: true,
@ -191,7 +196,6 @@ class ServiceRequestBottomSheet {
label: context.translation.visitDate,
hideShadow: true,
backgroundColor: AppColor.neutral100,
height: 70.toScreenHeight,
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.visitDate ?? ""),
formatDateWithTime: true,
onDatePicker: (selectedDate) {
@ -256,34 +260,30 @@ class ServiceRequestBottomSheet {
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.endDate ?? ""),
formatDateWithTime: true,
onDatePicker: (selectedDate) {
if (selectedDate != null) {
showTimePicker(
context: context,
initialTime: TimeOfDay.now(),
).then((selectedTime) {
// Handle the selected date and time here.
if (selectedTime != null) {
DateTime selectedDateTime = DateTime(
selectedDate.year,
selectedDate.month,
selectedDate.day,
selectedTime.hour,
selectedTime.minute,
);
if (selectedDateTime != null) {
serviceRequestProvider.currentSelectedRequest?.endDate = selectedDateTime?.toIso8601String();
serviceRequestProvider.currentSelectedRequest?.workingHours = (((DateTime.parse(serviceRequestProvider.currentSelectedRequest!.endDate!)
.difference(DateTime.parse(serviceRequestProvider.currentSelectedRequest!.startDate!))
.inSeconds ??
0) /
60) /
60)
.toStringAsFixed(2);
}
}
});
}
},
showTimePicker(
context: context,
initialTime: TimeOfDay.now(),
).then((selectedTime) {
// Handle the selected date and time here.
if (selectedTime != null) {
DateTime selectedDateTime = DateTime(
selectedDate.year,
selectedDate.month,
selectedDate.day,
selectedTime.hour,
selectedTime.minute,
);
serviceRequestProvider.currentSelectedRequest?.endDate = selectedDateTime?.toIso8601String();
serviceRequestProvider.currentSelectedRequest?.workingHours = (((DateTime.parse(serviceRequestProvider.currentSelectedRequest!.endDate!)
.difference(DateTime.parse(serviceRequestProvider.currentSelectedRequest!.startDate!))
.inSeconds ??
0) /
60) /
60)
.toStringAsFixed(2);
}
});
},
).expanded,
],
)
@ -292,6 +292,7 @@ class ServiceRequestBottomSheet {
AppTextFormField(
labelText: context.translation.comments,
backgroundColor: AppColor.neutral100,
labelStyle: AppTextStyles.textFieldLabelStyle,
showShadow: false,
textInputType: TextInputType.multiline,
alignLabelWithHint: true,
@ -345,8 +346,8 @@ class ServiceRequestBottomSheet {
SingleItemDropDownMenu<Lookup, FirstActionStatusProvider>(
context: context,
backgroundColor: AppColor.neutral100,
height: 70.toScreenHeight,
title: context.translation.rejectionReason,
height: 56.toScreenHeight,
title: context.translation.reason,
initialValue: serviceRequestProvider.currentSelectedRequest?.firstAction,
//_serviceRequest.firstAction,
onSelect: (value) {
@ -362,6 +363,7 @@ class ServiceRequestBottomSheet {
labelText: context.translation.comments,
textInputType: TextInputType.multiline,
alignLabelWithHint: true,
labelStyle: AppTextStyles.textFieldLabelStyle,
onChange: (text) {
serviceRequestProvider.currentSelectedRequest?.comments = text;
},
@ -591,6 +593,7 @@ class ServiceRequestBottomSheet {
AppTextFormField(
labelText: context.translation.comments,
textInputType: TextInputType.multiline,
labelStyle: AppTextStyles.textFieldLabelStyle,
showWithoutDecoration: true,
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral100,
alignLabelWithHint: true,
@ -620,6 +623,8 @@ class ServiceRequestBottomSheet {
static Future nurseTakeActionBottomSheet({required BuildContext context}) {
bool acknowledge = false;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
Uint8List? newSignature;
String ?nurseSignature;
return showModalBottomSheet(
context: context,
useSafeArea: true,
@ -630,7 +635,7 @@ class ServiceRequestBottomSheet {
key: _formKey,
child: SingleChildScrollView(
child: StatefulBuilder(builder: (context, setState) {
Uint8List? newSignature;
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
@ -671,13 +676,9 @@ class ServiceRequestBottomSheet {
backgroundColor: AppColor.neutral100,
showShadow: false,
onSaved: (signature) {
// if (signature == null || signature.isEmpty) {
// setState(() {});
// return;
// }
if (signature == null || signature.isEmpty) return;
newSignature = signature;
// _subWorkOrders.nurseSignature = signature != null ? "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}" : null;
nurseSignature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
},
),
36.height,
@ -692,6 +693,16 @@ class ServiceRequestBottomSheet {
textColor: AppColor.red30,
showBorder: true,
onPressed: () async {
_formKey.currentState?.save();
if(newSignature!=null&&acknowledge){
//TODO replace provider with new provider and also check workorder id is not correct.
Provider.of<RequestDetailProvider>(context,listen: false).nurseReject(model: NurseActionModel(
workOrderId: int.parse(serviceRequestProvider.currentSelectedRequest!.id!),
signatureNurse: nurseSignature,
));
Navigator.pop(context);
}
},
).expanded,
@ -702,7 +713,17 @@ class ServiceRequestBottomSheet {
label: context.translation.confirm,
maxWidth: true,
buttonColor: AppColor.green70,
onPressed: () async {},
onPressed: () async {
_formKey.currentState?.save();
if(newSignature!=null&&acknowledge){
//TODO replace provider with new provider and also check workorder id is not correct.
Provider.of<RequestDetailProvider>(context,listen: false).nurseConfirm(model: NurseActionModel(
workOrderId: int.parse(serviceRequestProvider.currentSelectedRequest!.id!),
signatureNurse: nurseSignature,
));
Navigator.pop(context);
}
},
).expanded,
],
)

@ -18,6 +18,9 @@ import 'package:test_sa/service_request_latest/views/components/action_button/fo
import 'package:test_sa/service_request_latest/views/components/initial_visit_card.dart';
import 'package:test_sa/service_request_latest/views/components/timer_widget.dart';
import 'package:test_sa/service_request_latest/views/forms/asset_retired/asset_retired.dart';
import 'package:test_sa/service_request_latest/views/forms/asset_retired/verify_asset_detail.dart';
import 'package:test_sa/service_request_latest/views/forms/maintenance_request/maintenance_request_main.dart';
import 'package:test_sa/service_request_latest/views/nurse/create_new_request_view.dart';
import 'package:test_sa/views/pages/user/requests/comments_bottom_sheet.dart';
import 'package:test_sa/views/pages/user/requests/update_service_request_page.dart';
import 'package:test_sa/views/widgets/images/files_list.dart';
@ -25,6 +28,8 @@ 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 '../forms/spare_part/spare_part_request.dart';
class RequestDetailView extends StatefulWidget {
static const String id = "/call-details";
@ -103,7 +108,7 @@ class _RequestDetailViewState extends State<RequestDetailView> {
],
),
),
FooterActionButton.footerWidget(status: 1, context: context),
FooterActionButton.requestDetailsFooterWidget(status: 7, context: context),
TimerWidget(),
],
),
@ -325,8 +330,8 @@ class _RequestDetailViewState extends State<RequestDetailView> {
textColor: AppColor.red30,
showBorder: true,
onPressed: () async {
Navigator.push(context, MaterialPageRoute(builder: (context) => AssetRetired()));
// Navigator.push(context, MaterialPageRoute(builder: (context) => CreateNewRequest()));
// Navigator.push(context, MaterialPageRoute(builder: (context) => AssetRetired()));
Navigator.push(context, MaterialPageRoute(builder: (context) => const CreateNewRequest()));
}),
);
}

@ -17,6 +17,7 @@ import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart';
import 'package:test_sa/providers/loading_list_notifier.dart';
import 'package:test_sa/providers/work_order/reason_provider.dart';
import 'package:test_sa/service_request_latest/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
@ -29,16 +30,16 @@ import '../../../../../new_views/common_widgets/app_text_form_field.dart';
import '../../../../../new_views/common_widgets/default_app_bar.dart';
import '../../../controllers/validator/validator.dart';
class SparePartRequest extends StatefulWidget {
class VerifyAssetDetail extends StatefulWidget {
static const String id = "/verify-assets-detail";
const SparePartRequest({Key? key}) : super(key: key);
const VerifyAssetDetail({Key? key}) : super(key: key);
@override
_SparePartRequestState createState() => _SparePartRequestState();
_VerifyAssetDetailState createState() => _VerifyAssetDetailState();
}
class _SparePartRequestState extends State<SparePartRequest> with TickerProviderStateMixin {
class _VerifyAssetDetailState extends State<VerifyAssetDetail> with TickerProviderStateMixin {
late UserProvider _userProvider;
late SettingProvider _settingProvider;
late ServiceRequestsProvider _serviceRequestsProvider;
@ -114,7 +115,7 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
return Scaffold(
key: _scaffoldKey,
appBar: DefaultAppBar(title: context.translation.sparePartRequest),
appBar: DefaultAppBar(title: context.translation.verify_asset_details),
body: Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestProvider, child) {
return SafeArea(
child: LoadingManager(
@ -171,10 +172,9 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
controller: _oracleNoController,
labelText: context.translation.oracleNo,
textInputType: TextInputType.number,
contentPadding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 20.toScreenHeight),
showWithoutDecoration: true,
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
enable: serviceRequestProvider.initialSelectedSparePart != null && serviceRequestProvider.initialSelectedSparePart.sparePart?.id != null,
enable: serviceRequestProvider.initialSelectedSparePart.sparePart?.id != null,
validator: (value) => value == null || value.isEmpty
? context.translation.requiredField
: Validator.isNumeric(value)
@ -187,10 +187,11 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
),
15.height,
AppTextFormField(
initialValue: _serviceReport?.comment,
initialValue: _serviceReport.comment,
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
labelText: context.translation.description,
alignLabelWithHint: true,
labelStyle: AppTextStyles.tinyFont.copyWith(color: AppColor.black10),
showWithoutDecoration: true,
textInputType: TextInputType.multiline,
onSaved: (value) {
@ -200,13 +201,13 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
15.height,
MultiFilesPicker(label: context.translation.attachQuotation, files: _files),
],
).paddingAll(16),
).paddingAll(12),
),
8.height,
],
),
).expanded,
AppFilledButton(
).paddingAll(16).expanded,
FooterActionButton.footerContainer(child: AppFilledButton(
label: context.translation.addSparePartActivity,
buttonColor: AppColor.green70,
onPressed: () async {
@ -234,9 +235,9 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
// final user = Provider.of<UserProvider>(context, listen: false).user;
// await _serviceRequestsProvider.createServiceReport(context, report: _serviceReport, request: serviceRequestProvider.serviceRequest, user: user);
},
),
)),
],
).paddingAll(16),
),
),
),
);

@ -109,7 +109,7 @@ class _AssetRetiredState extends State<AssetRetired> with TickerProviderStateMix
context: context,
title: context.translation.failureReason,
backgroundColor: AppColor.neutral100,
height: 70.toScreenHeight,
height: 56.toScreenHeight,
showShadow: false,
// initialValue: _subWorkOrders.reason,
onSelect: (value) {
@ -123,6 +123,7 @@ class _AssetRetiredState extends State<AssetRetired> with TickerProviderStateMix
labelText: context.translation.comments,
textInputType: TextInputType.multiline,
showWithoutDecoration: true,
labelStyle: AppTextStyles.textFieldLabelStyle,
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral100,
alignLabelWithHint: true,
onChange: (text) {
@ -135,12 +136,10 @@ class _AssetRetiredState extends State<AssetRetired> with TickerProviderStateMix
23.height,
MultiFilesPicker(label: context.translation.attachFiles,
files: _files,
buttonIcon: 'image-plus'?.toSvgAsset(),
buttonIcon: 'image-plus'.toSvgAsset(),
),
],
).paddingOnly(start:13,end: 13,top: 16,bottom: 16),
).paddingOnly(start:13,end: 13,top: 14,bottom: 16),
).paddingAll(16),
).expanded,
FooterActionButton.footerContainer(

@ -113,7 +113,6 @@ class _VerifyAssetDetailsState extends State<VerifyAssetDetails> with TickerProv
ADatePicker(
label: context.translation.returnToService,
hideShadow: true,
height: 70.toScreenHeight,
backgroundColor: AppColor.neutral100,
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.startDate ?? ""),
formatDateWithTime: true,
@ -152,6 +151,7 @@ class _VerifyAssetDetailsState extends State<VerifyAssetDetails> with TickerProv
SingleItemDropDownMenu<Lookup, LoanAvailabilityProvider>(
context: context,
title: context.translation.loanAvailability,
height: 56.toScreenHeight,
initialValue: _serviceReport?.loanAvailablity,
onSelect: (status) {
if (status != null) {
@ -183,7 +183,7 @@ class _VerifyAssetDetailsState extends State<VerifyAssetDetails> with TickerProv
context: context,
title: context.translation.failureReason,
backgroundColor: AppColor.neutral100,
height: 70.toScreenHeight,
height: 56.toScreenHeight,
showShadow: false,
// initialValue: _subWorkOrders.reason,
onSelect: (value) {
@ -197,7 +197,7 @@ class _VerifyAssetDetailsState extends State<VerifyAssetDetails> with TickerProv
context: context,
title: context.translation.faultDescription,
backgroundColor: AppColor.neutral100,
height: 70.toScreenHeight,
height: 56.toScreenHeight,
showShadow: false,
// initialValue: _subWorkOrders.reason,
onSelect: (value) {
@ -214,7 +214,7 @@ class _VerifyAssetDetailsState extends State<VerifyAssetDetails> with TickerProv
],
).paddingOnly(start:13,end: 13,top: 16,bottom: 16),
).paddingAll(16),
).paddingOnly(top: 17,start: 14,end: 14),
).expanded,
Container(
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth,vertical: 16.toScreenHeight),
@ -254,10 +254,17 @@ class _VerifyAssetDetailsState extends State<VerifyAssetDetails> with TickerProv
width: 20.toScreenWidth,
height: 40.toScreenHeight,
//TODO use the type required according data..
child: Radio<int>(
activeColor: AppColor.primary10,
child:Radio<int>(
value: value,
groupValue: _selectedValue,
fillColor: WidgetStateProperty.resolveWith((states) {
// active
if (states.contains(WidgetState.selected)) {
return AppColor.primary10;
}
// inactive
return AppColor.neutral130;
}),
onChanged: (int ?value) {
setState(() {
_selectedValue = value!;
@ -268,7 +275,7 @@ class _VerifyAssetDetailsState extends State<VerifyAssetDetails> with TickerProv
8.width,
Text(
label,
style: AppTextStyles.tinyFont,
style: AppTextStyles.tinyFont.copyWith(color: AppColor.neutral120),
),
13.width,
],

@ -116,10 +116,9 @@ class _ExternalMaintenanceRequestState extends State<ExternalMaintenanceRequest>
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
8.height,
SingleItemDropDownMenu<Lookup, NullableLoadingProvider>(
context: context,
height: 70.toScreenHeight,
height: 56.toScreenHeight,
title: context.translation.supplier,
showShadow: false,
backgroundColor: AppColor.neutral100,
@ -129,35 +128,16 @@ class _ExternalMaintenanceRequestState extends State<ExternalMaintenanceRequest>
_serviceReport?.calllastSituation = status;
},
),
// Container(
// height: 60.toScreenHeight,
// width: 60.toScreenWidth,
// decoration: BoxDecoration(
// color: _subWorkOrders.supplier?.suppliername == null ? AppColor.neutral40 : AppColor.background(context),
// borderRadius: BorderRadius.circular(10),
// boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)],
// ),
// child: Icon(
// Icons.add,
// color: context.isDark ? null : AppColor.neutral60,
// ),
// ).onPress(_subWorkOrders.supplier?.suppliername == null
// ? null
// : () async {
// SuppEngineerWorkOrders suppEngineer = (await showModalBottomSheet(
// context: context,
// useSafeArea: true,
// isScrollControlled: true,
// backgroundColor: Colors.transparent,
// builder: (context) => AddSupplierEngineerBottomSheet(_subWorkOrders.supplier.id),
// )) as SuppEngineerWorkOrders;
// if (suppEngineer != null) {
// _subWorkOrders?.supplier?.suppPersons ??= [];
// _subWorkOrders?.supplier?.suppPersons?.add(SuppPersons.fromJson(suppEngineer.toJson()));
// engineer = suppEngineer;
// setState(() {});
// }
// }),
8.height,
AppTextFormField(
labelText: context.translation.engineerName,
backgroundColor: AppColor.neutral100,
initialValue: _serviceReport?.assignedEmployee?.name.toString(),
textAlign: TextAlign.center,
labelStyle: AppTextStyles.textFieldLabelStyle,
showShadow: false,
style: Theme.of(context).textTheme.titleMedium,
),
8.height,
Row(
mainAxisSize: MainAxisSize.min,
@ -169,7 +149,7 @@ class _ExternalMaintenanceRequestState extends State<ExternalMaintenanceRequest>
icon: 'clock',
withIcon: true,
backgroundColor: AppColor.neutral100,
height: 70.toScreenHeight,
height: 56.toScreenHeight,
time: _startTime,
onTimePicker: (selectedTime) {
if (selectedTime != null) {
@ -188,7 +168,7 @@ class _ExternalMaintenanceRequestState extends State<ExternalMaintenanceRequest>
withIcon: true,
backgroundColor: AppColor.neutral100,
withBorder: false,
height: 70.toScreenHeight,
height: 56.toScreenHeight,
time: _endTime,
onTimePicker: (selectedTime) {
if (selectedTime != null) {
@ -204,8 +184,8 @@ class _ExternalMaintenanceRequestState extends State<ExternalMaintenanceRequest>
AppTextFormField(
labelText: context.translation.workingHours,
backgroundColor: AppColor.neutral80,
labelStyle: AppTextStyles.textFieldLabelStyle,
suffixIcon: "clock".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null).paddingOnly(end: 16),
contentPadding: EdgeInsets.symmetric(vertical: 18.toScreenHeight, horizontal: 16.toScreenWidth),
initialValue: _serviceReport?.workingHours.toString(),
textAlign: TextAlign.center,
showShadow: false,

@ -115,10 +115,9 @@ class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest>
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
8.height,
SingleItemDropDownMenu<Lookup, NullableLoadingProvider>(
context: context,
height: 70.toScreenHeight,
height: 56.toScreenHeight,
title: context.translation.activityStatus,
showShadow: false,
backgroundColor: AppColor.neutral100,
@ -139,7 +138,7 @@ class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest>
icon: 'clock',
withIcon: true,
backgroundColor: AppColor.neutral100,
height: 70.toScreenHeight,
height: 56.toScreenHeight,
time: _startTime,
onTimePicker: (selectedTime) {
if (selectedTime != null) {
@ -158,7 +157,7 @@ class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest>
withIcon: true,
backgroundColor: AppColor.neutral100,
withBorder: false,
height: 70.toScreenHeight,
height: 56.toScreenHeight,
time: _endTime,
onTimePicker: (selectedTime) {
if (selectedTime != null) {
@ -175,11 +174,12 @@ class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest>
labelText: context.translation.workingHours,
backgroundColor: AppColor.neutral80,
suffixIcon: "clock".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null).paddingOnly(end: 16),
contentPadding: EdgeInsets.symmetric(vertical: 18.toScreenHeight, horizontal: 16.toScreenWidth),
// contentPadding: EdgeInsets.symmetric(vertical: 18.toScreenHeight, horizontal: 16.toScreenWidth),
initialValue: _serviceReport?.workingHours.toString(),
textAlign: TextAlign.center,
showShadow: false,
labelStyle: AppTextStyles.textFieldLabelStyle,
enable: false,
showShadow: false,
style: Theme.of(context).textTheme.titleMedium,
),
8.height,
@ -199,11 +199,12 @@ class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest>
AppTextFormField(
labelText: context.translation.travelingHours,
backgroundColor: AppColor.neutral100,
showShadow: false,
labelStyle: AppTextStyles.textFieldLabelStyle,
suffixIcon: "clock".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null).paddingOnly(end: 16),
initialValue: _serviceReport?.travelingHours?.toString(),
textInputType: TextInputType.number,
contentPadding: EdgeInsets.symmetric(vertical: 18.toScreenHeight, horizontal: 16.toScreenWidth),
showShadow: false,
// contentPadding: EdgeInsets.symmetric(vertical: 18.toScreenHeight, horizontal: 16.toScreenWidth),
onSaved: (value) {
_serviceReport?.travelingHours = double.tryParse(value) ?? 0.0;
},
@ -216,9 +217,9 @@ class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest>
AppTextFormField(
labelText: context.translation.assignedEmployee,
backgroundColor: AppColor.neutral80,
contentPadding: EdgeInsets.symmetric(vertical: 18.toScreenHeight, horizontal: 16.toScreenWidth),
initialValue: _serviceReport?.workingHours.toString(),
initialValue: _serviceReport?.assignedEmployee?.name.toString(),
textAlign: TextAlign.center,
labelStyle: AppTextStyles.textFieldLabelStyle,
showShadow: false,
enable: false,
style: Theme.of(context).textTheme.titleMedium,
@ -229,6 +230,7 @@ class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest>
labelText: context.translation.technicalComment,
backgroundColor: AppColor.neutral100,
showShadow: false,
labelStyle: AppTextStyles.textFieldLabelStyle,
alignLabelWithHint: true,
textInputType: TextInputType.multiline,
onSaved: (value) {
@ -238,7 +240,7 @@ class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest>
],
),
),
).toShadowContainer(context).paddingOnly(start: 16, end: 16, top: 12),
).toShadowContainer(context).paddingOnly(start: 13, end: 14, top: 12),
FooterActionButton.footerContainer(
child: AppFilledButton(
@ -274,7 +276,14 @@ class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest>
height: 40.toScreenHeight,
//TODO use the type required according data..
child: Radio<int>(
activeColor: AppColor.primary10,
fillColor: WidgetStateProperty.resolveWith((states) {
// active
if (states.contains(WidgetState.selected)) {
return AppColor.primary10;
}
// inactive
return AppColor.neutral130;
}),
value: value,
groupValue: _selectedValue,
onChanged: (int ?value) {

@ -27,7 +27,7 @@ class _MaintenanceRequestFormState extends State<MaintenanceRequestForm> with Si
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColor.neutral100,
backgroundColor: AppColor.neutral110,
appBar: DefaultAppBar(title: context.translation.maintenanceRequest),
body: DefaultTabController(
length: 2,
@ -47,6 +47,8 @@ class _MaintenanceRequestFormState extends State<MaintenanceRequestForm> with Si
unselectedLabelStyle: AppTextStyles.bodyText,
labelStyle: AppTextStyles.bodyText,
indicatorPadding: EdgeInsets.zero,
indicatorSize: TabBarIndicatorSize.tab,
dividerColor: Colors.transparent,
indicator: BoxDecoration(
color: context.isDark ? AppColor.neutral60 : AppColor.neutral110,
borderRadius: BorderRadius.circular(7),

@ -10,13 +10,13 @@ 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/device/asset.dart';
import 'package:test_sa/models/service_request/service_report.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart';
import 'package:test_sa/providers/loading_list_notifier.dart';
import 'package:test_sa/providers/work_order/reason_provider.dart';
import 'package:test_sa/service_request_latest/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
@ -136,7 +136,6 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
context: context,
title: context.translation.partNo,
staticData: _spareParts,
height: 80.toScreenHeight,
showShadow: false,
initialValue: serviceRequestProvider.initialSelectedSparePart.sparePart,
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
@ -144,15 +143,15 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
serviceRequestProvider.initialSelectedSparePart = SparePartsWorkOrders(id: 0, sparePart: part, qty: 0);
},
),
15.height,
12.height,
AppTextFormField(
controller: _partQtyController,
labelText: context.translation.quantity,
textInputType: TextInputType.number,
contentPadding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 20.toScreenHeight),
labelStyle: AppTextStyles.textFieldLabelStyle,
showWithoutDecoration: true,
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
enable: serviceRequestProvider.initialSelectedSparePart != null && serviceRequestProvider.initialSelectedSparePart.sparePart?.id != null,
enable: serviceRequestProvider.initialSelectedSparePart.sparePart?.id != null,
validator: (value) => value == null || value.isEmpty
? context.translation.requiredField
: Validator.isNumeric(value)
@ -162,15 +161,15 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
serviceRequestProvider.initialSelectedSparePart.qty = num.tryParse(text ?? "");
},
),
15.height,
12.height,
AppTextFormField(
controller: _oracleNoController,
labelStyle: AppTextStyles.textFieldLabelStyle,
labelText: context.translation.oracleNo,
textInputType: TextInputType.number,
contentPadding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 20.toScreenHeight),
showWithoutDecoration: true,
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
enable: serviceRequestProvider.initialSelectedSparePart != null && serviceRequestProvider.initialSelectedSparePart.sparePart?.id != null,
enable: serviceRequestProvider.initialSelectedSparePart.sparePart?.id != null,
validator: (value) => value == null || value.isEmpty
? context.translation.requiredField
: Validator.isNumeric(value)
@ -181,9 +180,10 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
// serviceRequestProvider.initialSelectedSparePart. = num.tryParse(text ?? "");
},
),
15.height,
12.height,
AppTextFormField(
initialValue: _serviceReport?.comment,
labelStyle: AppTextStyles.textFieldLabelStyle,
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
labelText: context.translation.description,
alignLabelWithHint: true,
@ -193,16 +193,20 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
_serviceReport?.comment = value;
},
),
15.height,
MultiFilesPicker(label: context.translation.attachQuotation, files: _files),
12.height,
MultiFilesPicker(label: context.translation.attachQuotation, files: _files,
buttonIcon: 'quotation_icon'.toSvgAsset(),
buttonColor: AppColor.primary10,
),
],
).paddingAll(16),
),
8.height,
],
),
).expanded,
AppFilledButton(
).paddingAll(12).expanded,
FooterActionButton.footerContainer(child: AppFilledButton(
label: context.translation.addSparePartActivity,
buttonColor: AppColor.green70,
onPressed: () async {
@ -230,9 +234,9 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
// final user = Provider.of<UserProvider>(context, listen: false).user;
// await _serviceRequestsProvider.createServiceReport(context, report: _serviceReport, request: serviceRequestProvider.serviceRequest, user: user);
},
),
)),
],
).paddingAll(16),
),
),
),
);

@ -12,7 +12,7 @@ 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/device/asset_search.dart';
import 'package:test_sa/models/helper_data_models/workorder/work_order_model.dart';
import 'package:test_sa/models/service_request/pending_service_request_model.dart';
import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
@ -21,16 +21,14 @@ import 'package:test_sa/providers/service_request_providers/equipment_status_pro
import 'package:test_sa/providers/service_request_providers/priority_provider.dart';
import 'package:test_sa/providers/service_request_providers/requested_through_provider.dart';
import 'package:test_sa/providers/service_request_providers/type_of_request_provider.dart';
import 'package:test_sa/providers/work_order/reason_provider.dart';
import 'package:test_sa/service_request_latest/request_detail_provider.dart';
import 'package:test_sa/service_request_latest/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/views/pages/user/requests/pending_requests_screen.dart';
import 'package:test_sa/views/widgets/bottom_sheets/pending_request_bottom_sheet.dart';
import 'package:test_sa/views/widgets/equipment/asset_picker.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/qr/scan_qr.dart';
import 'package:test_sa/views/widgets/sound/TextSpeechRecordWidget.dart';
import '../../../../../../controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart';
import '../../../../../../new_views/common_widgets/default_app_bar.dart';
class CreateNewRequest extends StatefulWidget {
@ -41,6 +39,7 @@ class CreateNewRequest extends StatefulWidget {
@override
_CreateNewRequestState createState() => _CreateNewRequestState();
}
//TODO remove unnecessary code
class _CreateNewRequestState extends State<CreateNewRequest> with TickerProviderStateMixin {
AssetProvider? _devicesProvider;
@ -48,6 +47,7 @@ class _CreateNewRequestState extends State<CreateNewRequest> with TickerProvider
late UserProvider _userProvider;
late SettingProvider _settingProvider;
late ServiceRequestsProvider _serviceRequestsProvider;
late RequestDetailProvider _requestDetailProvider;
late ServiceRequest _serviceRequest;
final List<File> _deviceImages = [];
final bool _isLoading = false;
@ -63,10 +63,10 @@ class _CreateNewRequestState extends State<CreateNewRequest> with TickerProvider
void initState() {
super.initState();
_commentController = TextEditingController();
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
_userProvider = Provider.of<UserProvider>(context, listen: false);
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
_requestDetailProvider = Provider.of<RequestDetailProvider>(context, listen: false);
getInitialData();
if (_serviceRequestsProvider.currentSelectedRequest != null) {
_serviceRequest = _serviceRequestsProvider.currentSelectedRequest!;
_deviceImages.addAll(_serviceRequest.devicePhotos!.map((e) => File(e)).toList());
@ -80,6 +80,16 @@ class _CreateNewRequestState extends State<CreateNewRequest> with TickerProvider
isFirstActionSubmitted = _serviceRequest.firstAction != null;
// _isLoading = true;
}
Future<void> getInitialData() async {
WidgetsBinding.instance.addPostFrameCallback((_) async{
await Provider.of<PriorityProvider>(context,listen: false).getDate();
await Provider.of<EquipmentStatusProvider>(context,listen: false).getDate();
await Provider.of<RequestedThroughProvider>(context,listen: false).getDate();
await Provider.of<TypeOfRequestProvider>(context,listen: false).getDate();
});
}
@override
void dispose() {
@ -140,14 +150,14 @@ class _CreateNewRequestState extends State<CreateNewRequest> with TickerProvider
MultiFilesPicker(
label: context.translation.attachImage,
files: _deviceImages,
buttonColor: AppColor.primary10,
buttonColor: AppColor.black10,
onlyImages: true,
buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10),
buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120),
),
],
).paddingOnly(start: 13, end: 13, top: 15, bottom: 16),
).paddingAll(16),
commentWidget(serviceRequest: ServiceRequest()),
commentWidget(serviceRequest: _serviceRequest),
],
),
).expanded,
@ -200,8 +210,8 @@ class _CreateNewRequestState extends State<CreateNewRequest> with TickerProvider
value: element,
activeColor: Colors.red,
fillColor: WidgetStateColor.resolveWith((states) {
if (states.contains(WidgetState.selected)) return const Color(0xff3DA5E5);
return const Color(0xffE0E0E0);
if (states.contains(WidgetState.selected)) return AppColor.primary10;
return AppColor.neutral130;
}),
groupValue: _serviceRequest.defectType,
onChanged: (state) {
@ -211,7 +221,7 @@ class _CreateNewRequestState extends State<CreateNewRequest> with TickerProvider
}),
),
8.width,
Text(element.name!, style: Theme.of(context).textTheme.bodySmall),
Text(element.name??'', style: AppTextStyles.tinyFont.copyWith(color:AppColor.neutral120)),
],
)
],
@ -327,12 +337,9 @@ class _CreateNewRequestState extends State<CreateNewRequest> with TickerProvider
_serviceRequest.requestedThrough = Provider.of<RequestedThroughProvider>(context, listen: false).items.firstWhere((element) => element.value == 3, orElse: null);
_serviceRequest.type = Provider.of<TypeOfRequestProvider>(context, listen: false).items.firstWhere((element) => element.value == 1, orElse: null);
// print("_serviceRequest?.requestedThrough:${_serviceRequest?.requestedThrough.toJson()}");
// print("_serviceRequest?.type:${_serviceRequest?.type.toJson()}");
// print("_serviceRequest?.priority:${_serviceRequest?.priority.toJson()}");
// return;
if (_formKey.currentState!.validate() && await _serviceRequest.validateNewRequest(context)) {
print('comments value is ${_serviceRequest.callComments}');
if (_formKey.currentState!.validate() && await _serviceRequest.validateNewRequest(context)) {
_formKey.currentState!.save();
// bool canSubmitRequest = await checkAssetForPendingServiceRequest(_serviceRequest.device.id);
@ -340,19 +347,33 @@ class _CreateNewRequestState extends State<CreateNewRequest> with TickerProvider
// return;
// }
_serviceRequest.devicePhotos = _deviceImages.map((e) => _isLocalUrl(e.path) ? "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}" : e.path).toList();
_serviceRequest.devicePhotos = _deviceImages.map((e) => _isLocalUrl(e.path) ? "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}" : e.path).toList();
if (_serviceRequest.audio != null) {
if (_isLocalUrl(_serviceRequest.audio!)) {
final File file = File(_serviceRequest.audio!);
_serviceRequest.audio = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}";
}
}
await _serviceRequestsProvider.createRequest(
context: context,
user: _userProvider.user!,
host: _settingProvider.host!,
serviceRequest: _serviceRequest,
);
List<WorkOrderAttachments> attachement = [];
for (var url in _deviceImages) {
}
await _requestDetailProvider.createWorkOrder(workOrderHModel: WorkOrderHModel(
assetId: _serviceRequest.deviceId,
priorityId: _serviceRequest.priority?.id,
equipmentStatusId: _serviceRequest.defectType?.id,
voiceNote: _serviceRequest.audio,
comments: _serviceRequest.callComments,
//add attachments also...
));
// await _serviceRequestsProvider.createRequest(
// context: context,
// user: _userProvider.user!,
// host: _settingProvider.host!,
// serviceRequest: _serviceRequest,
// );
}
}
}

@ -7,7 +7,6 @@ import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/service_request_latest/views/components/history_log_view.dart';
import 'package:test_sa/service_request_latest/views/components/initial_visit_card.dart';
import 'components/request_detail_view.dart';
@ -29,13 +28,13 @@ class RequestDetailMain extends StatelessWidget {
margin: EdgeInsets.only(left: 16.toScreenWidth, right: 16.toScreenWidth,top: 12.toScreenHeight),
decoration: BoxDecoration(color: context.isDark ? AppColor.neutral50 : AppColor.white10, borderRadius: BorderRadius.circular(10)),
child: TabBar(
//controller: _tabController,
padding: EdgeInsets.symmetric(vertical: 4.toScreenHeight,horizontal: 4.toScreenWidth),
labelColor: context.isDark ? AppColor.neutral30 : AppColor.black20,
unselectedLabelColor: context.isDark ? AppColor.neutral30 : AppColor.black20,
unselectedLabelStyle: AppTextStyles.bodyText,
labelStyle: AppTextStyles.bodyText,
indicatorPadding: EdgeInsets.zero,
indicatorSize: TabBarIndicatorSize.tab,
dividerColor: Colors.transparent,
indicator: BoxDecoration(color: context.isDark ? AppColor.neutral60 : AppColor.neutral110, borderRadius: BorderRadius.circular(7)),
onTap: (index) {
// setState(() {});

Loading…
Cancel
Save