From 53c5240377d113264848151288e25efaf016b615 Mon Sep 17 00:00:00 2001 From: "muhammad.abbasi" Date: Wed, 18 Sep 2024 14:19:02 +0300 Subject: [PATCH] ui fixes --- assets/images/quotation_icon.svg | 3 + lib/controllers/api_routes/urls.dart | 7 +- lib/extensions/text_extensions.dart | 7 + .../workorder/nurse_action_model.dart | 4 - .../workorder/work_order_model.dart | 116 ++++++++ lib/new_views/app_style/app_color.dart | 1 + .../common_widgets/app_text_form_field.dart | 1 + .../request_detail_provider.dart | 268 +++++++++++------- .../action_button/footer_action_button.dart | 4 +- .../service_request_bottomsheet.dart | 101 ++++--- .../views/components/request_detail_view.dart | 11 +- .../components/verify_assets_details.dart | 27 +- .../forms/asset_retired/asset_retired.dart | 9 +- .../asset_retired/verify_asset_detail.dart | 21 +- .../components/external_request.dart | 48 +--- .../components/internal_request.dart | 33 ++- .../maintenance_request_main.dart | 4 +- .../forms/spare_part/spare_part_request.dart | 34 ++- .../views/nurse/create_new_request_view.dart | 69 +++-- .../views/request_detail_main_view.dart | 5 +- 20 files changed, 513 insertions(+), 260 deletions(-) create mode 100644 assets/images/quotation_icon.svg create mode 100644 lib/models/helper_data_models/workorder/work_order_model.dart diff --git a/assets/images/quotation_icon.svg b/assets/images/quotation_icon.svg new file mode 100644 index 00000000..3e38ecb2 --- /dev/null +++ b/assets/images/quotation_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index 69afab47..b9127a43 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -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 diff --git a/lib/extensions/text_extensions.dart b/lib/extensions/text_extensions.dart index 6d1fadfc..e58043ea 100644 --- a/lib/extensions/text_extensions.dart +++ b/lib/extensions/text_extensions.dart @@ -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, diff --git a/lib/models/helper_data_models/workorder/nurse_action_model.dart b/lib/models/helper_data_models/workorder/nurse_action_model.dart index 9af3c560..b9a2c231 100644 --- a/lib/models/helper_data_models/workorder/nurse_action_model.dart +++ b/lib/models/helper_data_models/workorder/nurse_action_model.dart @@ -5,10 +5,6 @@ class NurseActionModel { NurseActionModel({this.workOrderId, this.feedback, this.signatureNurse}); - factory NurseActionModel.fromJson(Map json) { - return NurseActionModel(workOrderId: json['workOrderId'], feedback: json['feedback'], signatureNurse: json['signatureNurse']); - } - Map toJson() { return {'workOrderId': workOrderId, 'feedback': feedback, 'signatureNurse': signatureNurse}; } diff --git a/lib/models/helper_data_models/workorder/work_order_model.dart b/lib/models/helper_data_models/workorder/work_order_model.dart new file mode 100644 index 00000000..cb665d35 --- /dev/null +++ b/lib/models/helper_data_models/workorder/work_order_model.dart @@ -0,0 +1,116 @@ +class WorkOrderHModel { + int? assetId; + int? equipmentStatusId; + int? priorityId; + int? problemDescriptionId; + String? comments; + String? voiceNote; + List? workOrderAttachments; + + WorkOrderHModel( + {this.assetId, + this.equipmentStatusId, + this.priorityId, + this.problemDescriptionId, + this.comments, + this.voiceNote, + this.workOrderAttachments}); + + WorkOrderHModel.fromJson(Map json) { + assetId = json['assetId']; + equipmentStatusId = json['equipmentStatusId']; + priorityId = json['priorityId']; + problemDescriptionId = json['problemDescriptionId']; + comments = json['comments']; + voiceNote = json['voiceNote']; + if (json['workOrderAttachments'] != null) { + workOrderAttachments = []; + json['workOrderAttachments'].forEach((v) { + workOrderAttachments!.add( WorkOrderAttachments.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = {}; + 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 json) { + id = json['id']; + name = json['name']; + } + + Map toJson() { + final Map data = {}; + 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 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 toJson() { + final Map data = {}; + 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; + } +} + diff --git a/lib/new_views/app_style/app_color.dart b/lib/new_views/app_style/app_color.dart index ddc78079..f181debd 100644 --- a/lib/new_views/app_style/app_color.dart +++ b/lib/new_views/app_style/app_color.dart @@ -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 diff --git a/lib/new_views/common_widgets/app_text_form_field.dart b/lib/new_views/common_widgets/app_text_form_field.dart index 45158219..65440d6c 100644 --- a/lib/new_views/common_widgets/app_text_form_field.dart +++ b/lib/new_views/common_widgets/app_text_form_field.dart @@ -110,6 +110,7 @@ class _AppTextFormFieldState extends State { 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), diff --git a/lib/service_request_latest/request_detail_provider.dart b/lib/service_request_latest/request_detail_provider.dart index 53149f62..74335463 100644 --- a/lib/service_request_latest/request_detail_provider.dart +++ b/lib/service_request_latest/request_detail_provider.dart @@ -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 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 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 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 engineerRejectWorkOrder({required String id,String? feedBack}) async { + Future 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 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 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 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 engineerConfirmArrive({required int workOrderId, required int verificationTypeId, required String photoInfo, required String otp}) async { + try { + Map 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 assignEngineerWorkOrder({required String workOrderId,required String engineerId}) async { + Future 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 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 nurseReopen() async { + Future 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 nurseClose() async { + Future 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 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 deleteActivitySparePart({required int id,required int workOrderId}) async { + + Future 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 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 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(), ); diff --git a/lib/service_request_latest/views/components/action_button/footer_action_button.dart b/lib/service_request_latest/views/components/action_button/footer_action_button.dart index 6629b79f..0df361f6 100644 --- a/lib/service_request_latest/views/components/action_button/footer_action_button.dart +++ b/lib/service_request_latest/views/components/action_button/footer_action_button.dart @@ -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); }, ) ); diff --git a/lib/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart b/lib/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart index dc78b181..e15a7df0 100644 --- a/lib/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart +++ b/lib/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart @@ -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( 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 _formKey = GlobalKey(); + 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(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(context,listen: false).nurseConfirm(model: NurseActionModel( + workOrderId: int.parse(serviceRequestProvider.currentSelectedRequest!.id!), + signatureNurse: nurseSignature, + )); + Navigator.pop(context); + } + }, ).expanded, ], ) diff --git a/lib/service_request_latest/views/components/request_detail_view.dart b/lib/service_request_latest/views/components/request_detail_view.dart index 0414fa81..2b2d06c0 100644 --- a/lib/service_request_latest/views/components/request_detail_view.dart +++ b/lib/service_request_latest/views/components/request_detail_view.dart @@ -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 { ], ), ), - FooterActionButton.footerWidget(status: 1, context: context), + FooterActionButton.requestDetailsFooterWidget(status: 7, context: context), TimerWidget(), ], ), @@ -325,8 +330,8 @@ class _RequestDetailViewState extends State { 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())); }), ); } diff --git a/lib/service_request_latest/views/components/verify_assets_details.dart b/lib/service_request_latest/views/components/verify_assets_details.dart index b59a08bf..dca67b81 100644 --- a/lib/service_request_latest/views/components/verify_assets_details.dart +++ b/lib/service_request_latest/views/components/verify_assets_details.dart @@ -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 with TickerProviderStateMixin { +class _VerifyAssetDetailState extends State with TickerProviderStateMixin { late UserProvider _userProvider; late SettingProvider _settingProvider; late ServiceRequestsProvider _serviceRequestsProvider; @@ -114,7 +115,7 @@ class _SparePartRequestState extends State with TickerProvider return Scaffold( key: _scaffoldKey, - appBar: DefaultAppBar(title: context.translation.sparePartRequest), + appBar: DefaultAppBar(title: context.translation.verify_asset_details), body: Consumer(builder: (context, serviceRequestProvider, child) { return SafeArea( child: LoadingManager( @@ -171,10 +172,9 @@ class _SparePartRequestState extends State 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 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 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 with TickerProvider // final user = Provider.of(context, listen: false).user; // await _serviceRequestsProvider.createServiceReport(context, report: _serviceReport, request: serviceRequestProvider.serviceRequest, user: user); }, - ), + )), ], - ).paddingAll(16), + ), ), ), ); diff --git a/lib/service_request_latest/views/forms/asset_retired/asset_retired.dart b/lib/service_request_latest/views/forms/asset_retired/asset_retired.dart index 26d6e0bb..302bc3af 100644 --- a/lib/service_request_latest/views/forms/asset_retired/asset_retired.dart +++ b/lib/service_request_latest/views/forms/asset_retired/asset_retired.dart @@ -109,7 +109,7 @@ class _AssetRetiredState extends State 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 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 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( diff --git a/lib/service_request_latest/views/forms/asset_retired/verify_asset_detail.dart b/lib/service_request_latest/views/forms/asset_retired/verify_asset_detail.dart index 656b8a65..d2c053e0 100644 --- a/lib/service_request_latest/views/forms/asset_retired/verify_asset_detail.dart +++ b/lib/service_request_latest/views/forms/asset_retired/verify_asset_detail.dart @@ -113,7 +113,6 @@ class _VerifyAssetDetailsState extends State 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 with TickerProv SingleItemDropDownMenu( 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 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 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 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 with TickerProv width: 20.toScreenWidth, height: 40.toScreenHeight, //TODO use the type required according data.. - child: Radio( - activeColor: AppColor.primary10, + child:Radio( 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 with TickerProv 8.width, Text( label, - style: AppTextStyles.tinyFont, + style: AppTextStyles.tinyFont.copyWith(color: AppColor.neutral120), ), 13.width, ], diff --git a/lib/service_request_latest/views/forms/maintenance_request/components/external_request.dart b/lib/service_request_latest/views/forms/maintenance_request/components/external_request.dart index 67569da8..eab0f519 100644 --- a/lib/service_request_latest/views/forms/maintenance_request/components/external_request.dart +++ b/lib/service_request_latest/views/forms/maintenance_request/components/external_request.dart @@ -116,10 +116,9 @@ class _ExternalMaintenanceRequestState extends State child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - 8.height, SingleItemDropDownMenu( 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 _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 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 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 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, diff --git a/lib/service_request_latest/views/forms/maintenance_request/components/internal_request.dart b/lib/service_request_latest/views/forms/maintenance_request/components/internal_request.dart index 103114f9..fedce3ed 100644 --- a/lib/service_request_latest/views/forms/maintenance_request/components/internal_request.dart +++ b/lib/service_request_latest/views/forms/maintenance_request/components/internal_request.dart @@ -115,10 +115,9 @@ class _InternalMaintenanceRequestState extends State child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - 8.height, SingleItemDropDownMenu( 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 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 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 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 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 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 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 ], ), ), - ).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 height: 40.toScreenHeight, //TODO use the type required according data.. child: Radio( - 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) { diff --git a/lib/service_request_latest/views/forms/maintenance_request/maintenance_request_main.dart b/lib/service_request_latest/views/forms/maintenance_request/maintenance_request_main.dart index a4b37723..0fb38fc0 100644 --- a/lib/service_request_latest/views/forms/maintenance_request/maintenance_request_main.dart +++ b/lib/service_request_latest/views/forms/maintenance_request/maintenance_request_main.dart @@ -27,7 +27,7 @@ class _MaintenanceRequestFormState extends State 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 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), diff --git a/lib/service_request_latest/views/forms/spare_part/spare_part_request.dart b/lib/service_request_latest/views/forms/spare_part/spare_part_request.dart index de8465ee..ae2a4918 100644 --- a/lib/service_request_latest/views/forms/spare_part/spare_part_request.dart +++ b/lib/service_request_latest/views/forms/spare_part/spare_part_request.dart @@ -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 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 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 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 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 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 with TickerProvider // final user = Provider.of(context, listen: false).user; // await _serviceRequestsProvider.createServiceReport(context, report: _serviceReport, request: serviceRequestProvider.serviceRequest, user: user); }, - ), + )), ], - ).paddingAll(16), + ), ), ), ); diff --git a/lib/service_request_latest/views/nurse/create_new_request_view.dart b/lib/service_request_latest/views/nurse/create_new_request_view.dart index 6ef846ab..de594a53 100644 --- a/lib/service_request_latest/views/nurse/create_new_request_view.dart +++ b/lib/service_request_latest/views/nurse/create_new_request_view.dart @@ -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 with TickerProviderStateMixin { AssetProvider? _devicesProvider; @@ -48,6 +47,7 @@ class _CreateNewRequestState extends State with TickerProvider late UserProvider _userProvider; late SettingProvider _settingProvider; late ServiceRequestsProvider _serviceRequestsProvider; + late RequestDetailProvider _requestDetailProvider; late ServiceRequest _serviceRequest; final List _deviceImages = []; final bool _isLoading = false; @@ -63,10 +63,10 @@ class _CreateNewRequestState extends State with TickerProvider void initState() { super.initState(); _commentController = TextEditingController(); - _serviceRequestsProvider = Provider.of(context, listen: false); _userProvider = Provider.of(context, listen: false); _serviceRequestsProvider = Provider.of(context, listen: false); - + _requestDetailProvider = Provider.of(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 with TickerProvider isFirstActionSubmitted = _serviceRequest.firstAction != null; // _isLoading = true; } + Future getInitialData() async { + WidgetsBinding.instance.addPostFrameCallback((_) async{ + await Provider.of(context,listen: false).getDate(); + await Provider.of(context,listen: false).getDate(); + await Provider.of(context,listen: false).getDate(); + await Provider.of(context,listen: false).getDate(); + + }); + + } @override void dispose() { @@ -140,14 +150,14 @@ class _CreateNewRequestState extends State 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 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 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 with TickerProvider _serviceRequest.requestedThrough = Provider.of(context, listen: false).items.firstWhere((element) => element.value == 3, orElse: null); _serviceRequest.type = Provider.of(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 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 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, + // ); } } } diff --git a/lib/service_request_latest/views/request_detail_main_view.dart b/lib/service_request_latest/views/request_detail_main_view.dart index 6939287f..3c2e39c6 100644 --- a/lib/service_request_latest/views/request_detail_main_view.dart +++ b/lib/service_request_latest/views/request_detail_main_view.dart @@ -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(() {});