From 3959068858738362e0b82cbdfbc8642f21f5924a Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Mon, 23 Oct 2023 12:55:00 +0300 Subject: [PATCH 1/2] Asset Transfer Done + Multiple Image Picker + Enhancements --- assets/images/remove.svg | 3 + .../api/asset_transfer_provider.dart | 62 +-- .../providers/api/gas_refill_provider.dart | 48 +-- .../api/service_requests_provider.dart | 50 ++- .../providers/api/user_provider.dart | 7 +- lib/l10n/app_ar.arb | 6 +- lib/l10n/app_en.arb | 6 +- lib/main.dart | 6 +- lib/models/device/asset_transfer.dart | 66 +++ lib/models/new_models/gas_refill_model.dart | 7 +- .../service_request/service_request.dart | 6 + .../common_widgets/default_app_bar.dart | 5 +- .../single_item_drop_down_menu.dart | 7 +- lib/new_views/pages/login_page.dart | 6 +- .../pages/new_gas_refill_request_page.dart | 22 +- .../requested_through_provider.dart | 36 ++ .../type_of_request_provider.dart | 36 ++ .../request_device_transfer.dart | 381 ++++++------------ .../create_sub_workorder_page.dart | 1 - lib/views/pages/user/land_page.dart | 13 +- .../pages/user/requests/create_request.dart | 98 ++--- .../work_order/create_service_report.dart | 4 +- .../work_order/edit_service_report.dart | 4 +- .../device_transfer_info_section.dart | 1 - .../widgets/images/multi_image_picker.dart | 180 ++------- .../images/multi_image_picker_item.dart | 128 +++--- .../widgets/pentry/pentry_info_form.dart | 3 +- 27 files changed, 516 insertions(+), 676 deletions(-) create mode 100644 assets/images/remove.svg create mode 100644 lib/providers/service_request_providers/requested_through_provider.dart create mode 100644 lib/providers/service_request_providers/type_of_request_provider.dart diff --git a/assets/images/remove.svg b/assets/images/remove.svg new file mode 100644 index 00000000..98b3d434 --- /dev/null +++ b/assets/images/remove.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/controllers/providers/api/asset_transfer_provider.dart b/lib/controllers/providers/api/asset_transfer_provider.dart index 7ae55334..ac894452 100644 --- a/lib/controllers/providers/api/asset_transfer_provider.dart +++ b/lib/controllers/providers/api/asset_transfer_provider.dart @@ -1,14 +1,18 @@ import 'dart:convert'; import 'dart:developer'; -import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/models/device/asset_transfer.dart'; +import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/user.dart'; import '../../../models/hospital.dart'; +import '../../../new_views/common_widgets/app_lazy_loading.dart'; class AssetTransferProvider extends ChangeNotifier { // number of items call in each request @@ -117,51 +121,15 @@ class AssetTransferProvider extends ChangeNotifier { } } - Future createRequest({ - @required String host, - @required User user, - @required AssetTransfer model, + Future createRequest({ + @required BuildContext context, + @required AssetTransfer assetDestination, + @required Device asset, }) async { - Map body = { - "id": 0, - // "assetId": model.device.id ?? "", - "destSiteId": hospital.id ?? "", - "destDepartmentId": department.id ?? "", - // "senderSiteId": model.sender.client.id ?? "", - // "transferNo": 0, - // "transferCode": "string", - "destBuildingId": building?.id, - "destFloorId": floor.id, - "destRoom": room, - ///// - // "senderBuildingId": model.device.destBuildingId, - // "senderFloorId": model.device.destFloorId, - // "senderDepartmentId": model.device.destDepartmentId, - // "senderRoom": model.device.destRoom, - // if (model?.sender?.attachments?.isNotEmpty ?? false) - // "senderAttachments": - // model?.sender?.attachments?.map((file) => {"attachmentName": _isLocalUrl(file.path) ? ("${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}") : file.path})?.toList(), - // "senderAssignedEmployeeId": "string", - // "senderMachineStatusId": 0, - // "senderComment": "string", - // "senderStartDate": "2023-06-11T09:21:56.453Z", - // "senderEndDate": "2023-06-11T09:21:56.453Z", - // "senderWorkingHours": "string", - // "senderTravelingHours": "string", - // "senderAttachmentName": "string", - // "receiverAssignedEmployeeId": "string", - // "receiverMachineStatusId": 0, - // "receiverComment": "string", - // "receiverStartDate": "2023-06-11T09:21:56.453Z", - // "receiverEndDate": "2023-06-11T09:21:56.453Z", - // "receiverWorkingHours": "string", - // "receiverTravelingHours": "string", - // "receiverAttachmentName": "string" - }; - Response response; try { - response = await ApiManager.instance.post(URLs.requestDeviceTransfer, body: body); + showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); + response = await ApiManager.instance.post(URLs.requestDeviceTransfer, body: assetDestination.transferBody(asset: asset)); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { if (items != null) { @@ -169,10 +137,14 @@ class AssetTransferProvider extends ChangeNotifier { reset(); notifyListeners(); } + Fluttertoast.showToast(msg: context.translation.createdSuccessfully); + } else { + Fluttertoast.showToast(msg: "${context.translation.failedToCompleteRequest} :${json.decode(response.body)['message']}"); } - return response.statusCode; + Navigator.pop(context); } catch (error) { - return -1; + Navigator.pop(context); + print(error); } } diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index f85e5cd6..7b5a4a23 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -1,16 +1,20 @@ import 'dart:convert'; import 'dart:developer'; -import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/new_models/gas_refill_model.dart' as gasModel; import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/user.dart'; +import '../../../new_views/common_widgets/app_lazy_loading.dart'; + class GasRefillProvider extends ChangeNotifier { // number of items call in each request final pageItemNumber = 12; @@ -89,37 +93,19 @@ class GasRefillProvider extends ChangeNotifier { } } - Future createModel({ + Future createModel({ + @required BuildContext context, @required User user, @required gasModel.GasRefillModel model, }) async { - Map body = { - "uid": user.id.toString(), - "token": user.token ?? "", - "site": model.site?.toJson(), - "building": model.building != null ? {"id": model.building?.id, "name": model.building?.name, "value": model.building?.value} : null, - "floor": model.floor != null ? {"id": model.floor?.id, "name": model.floor?.name, "value": model.floor?.value} : null, - //if (expectedDateTime != null) "expectedDate": expectedDateTime?.toIso8601String(), - if (expectedDateTime != null) "expectedTime": expectedDateTime?.toIso8601String(), - if (timer?.startAt != null) "startDate": timer.startAt.toIso8601String(), - if (timer?.startAt != null) "startTime": timer.startAt.toIso8601String(), - if (timer?.endAt != null) "endDate": timer.endAt.toIso8601String(), - if (timer?.endAt != null) "endTime": timer.endAt.toIso8601String(), - "department": model.department?.toJson(), - "GazRefillNo": "GR-${DateTime.now().toString().split(" ").first}", - "status": model.status?.toJson(), - }; - body["gazRefillDetails"] = model.gazRefillDetails - .map((model) => { - "gasType": model.gasType.toJson(), - "cylinderSize": model.cylinderSize.toJson(), - "cylinderType": model.cylinderType.toJson(), - "requestedQty": model.requestedQty, - }) - .toList(); - Response response; try { + showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); + final body = model.toJson() + ..addAll({ + "uid": user.id.toString(), + "token": user.token ?? "", + }); response = await ApiManager.instance.post(URLs.requestGasRefill, body: body); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { @@ -127,11 +113,15 @@ class GasRefillProvider extends ChangeNotifier { reset(); notifyListeners(); } + Fluttertoast.showToast(msg: context.translation.createdSuccessfully); + Navigator.pop(context); + } else { + Fluttertoast.showToast(msg: "${context.translation.failedToCompleteRequest} :${json.decode(response.body)['message']}"); } - return response.statusCode; + Navigator.pop(context); } catch (error) { + Navigator.pop(context); print(error); - return -1; } } diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 54e26ffa..847337ae 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -1,23 +1,26 @@ import 'dart:convert'; import 'dart:developer'; -import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:fluttertoast/fluttertoast.dart'; import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/models/call_request_for_work_order_model.dart'; import 'package:test_sa/models/issue.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/service_request/service_request_search.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:test_sa/models/timer_model.dart'; import '../../../models/service_request/search_work_order.dart'; import '../../../models/service_request/sub_work_order_details.dart'; import '../../../models/user.dart'; +import '../../../new_views/common_widgets/app_lazy_loading.dart'; class ServiceRequestsProvider extends ChangeNotifier { // number of items call in each request @@ -131,7 +134,8 @@ class ServiceRequestsProvider extends ChangeNotifier { } } - Future createRequest({ + Future createRequest({ + @required BuildContext context, @required String host, @required User user, @required ServiceRequest serviceRequest, @@ -140,7 +144,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "id": 0, "calNo": "", "callCreatedBy": {"id": user.userID, "name": user.userName ?? ""}, - "assets": serviceRequest.deviceId == null ? [] : [serviceRequest.deviceId], + "assets": serviceRequest.device?.id == null ? [] : [serviceRequest.device?.id], "requestedDate": DateTime.now().toIso8601String(), "requestedTime": DateTime.now().toIso8601String(), "client": user.clientId, @@ -177,27 +181,33 @@ class ServiceRequestsProvider extends ChangeNotifier { if (serviceRequest.audio != null) { body["voiceNote"] = serviceRequest.audio; } + showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); Response response; - //try { - response = await ApiManager.instance.post(URLs.createRequest, body: body); - stateCode = response.statusCode; - if (response.statusCode >= 200 && response.statusCode < 300) { - if (serviceRequests != null) { - var data = json.decode(utf8.decode(response.bodyBytes)); - if (data is List) { - serviceRequests.insert(0, ServiceRequest.fromJson(data[0])); - } else { - if (data["data"] != null && data["data"] == true) { - // serviceRequests.insert(0, ServiceRequest.fromJson(data[0])); + try { + response = await ApiManager.instance.post(URLs.createRequest, body: body); + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + if (serviceRequests != null) { + var data = json.decode(utf8.decode(response.bodyBytes)); + if (data is List) { + serviceRequests.insert(0, ServiceRequest.fromJson(data[0])); + } else { + if (data["data"] != null && data["data"] == true) { + // serviceRequests.insert(0, ServiceRequest.fromJson(data[0])); + } } } + notifyListeners(); + Fluttertoast.showToast(msg: context.translation.successfulRequestMessage); + Navigator.pop(context); + } else { + Fluttertoast.showToast(msg: "${context.translation.failedRequestMessage} :${json.decode(response.body)['message']}"); } - notifyListeners(); + Navigator.pop(context); + } catch (error) { + print(error); + Navigator.pop(context); } - return response.statusCode; - // } catch (error) { - // return -1; - // } } Future createIssueReport({ diff --git a/lib/controllers/providers/api/user_provider.dart b/lib/controllers/providers/api/user_provider.dart index 2a3701ca..5f439623 100644 --- a/lib/controllers/providers/api/user_provider.dart +++ b/lib/controllers/providers/api/user_provider.dart @@ -6,6 +6,8 @@ import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/user.dart'; +import '../../../new_views/common_widgets/app_lazy_loading.dart'; + class UserProvider extends ChangeNotifier { //reset provider data void reset() { @@ -39,12 +41,13 @@ class UserProvider extends ChangeNotifier { /// return state code if request complete may be 200, 404 or 403 /// for more details check http state manager /// lib\controllers\http_status_manger\http_status_manger.dart - Future login({@required User user}) async { + Future login({@required BuildContext context, @required User user}) async { if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; try { + showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); response = await ApiManager.instance.post(URLs.login, body: await user.toLoginJson()); _loading = false; if (response.statusCode >= 200 && response.statusCode < 300) { @@ -55,8 +58,10 @@ class UserProvider extends ChangeNotifier { return response.statusCode; } notifyListeners(); + Navigator.pop(context); return response.statusCode; } catch (error) { + Navigator.pop(context); debugPrint(error); _loading = false; notifyListeners(); diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index b175041e..1e17e38f 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -259,5 +259,9 @@ "attachImage" : "إرفاق صورة", "callComments" : "تعليقات الطلب", "comments" : "تعليقات", - "recordVoice" : "تسجيل صوت" + "recordVoice" : "تسجيل صوت", + "receiverName" : "اسم المستلم", + "receiverDetails" : "تفاصيل المستلم", + "requestedThrough" : "الطلب عبر", + "typeOfRequest" : "نوع الطلب" } \ No newline at end of file diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 69dc34fe..ccd60f9f 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -264,5 +264,9 @@ "attachImage" : "Attach Image", "callComments" : "Call Comments", "comments": "Comments", - "recordVoice" : "Record Voice" + "recordVoice" : "Record Voice", + "receiverName" : "Receiver Name", + "receiverDetails" : "Receiver Details", + "requestedThrough" : "Requested Through", + "typeOfRequest" : "Type of Request" } \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 49c29e7a..511abe04 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -46,7 +46,6 @@ import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqes import 'package:test_sa/new_views/app_style/app_themes.dart'; import 'package:test_sa/new_views/pages/land_page/land_page.dart'; import 'package:test_sa/new_views/pages/login_page.dart'; -import 'package:test_sa/new_views/pages/new_transfer_request_page.dart'; import 'package:test_sa/new_views/pages/splash_page.dart'; import 'package:test_sa/providers/department_provider.dart'; import 'package:test_sa/providers/gas_request_providers/cylinder_size_provider.dart'; @@ -56,6 +55,8 @@ import 'package:test_sa/providers/gas_request_providers/site_provider.dart'; import 'package:test_sa/providers/loading_list_notifier.dart'; import 'package:test_sa/providers/service_request_providers/equipment_status_provider.dart'; 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/views/pages/device_transfer/request_device_transfer.dart'; import 'package:test_sa/views/pages/device_transfer/track_device_transfer.dart'; import 'package:test_sa/views/pages/sub_workorder/create_sub_workorder_page.dart'; @@ -160,6 +161,8 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider(create: (_) => ServiceReportAssistantsEmployeeProvider()), ChangeNotifierProvider(create: (_) => PriorityProvider()), ChangeNotifierProvider(create: (_) => EquipmentStatusProvider()), + ChangeNotifierProvider(create: (_) => RequestedThroughProvider()), + ChangeNotifierProvider(create: (_) => TypeOfRequestProvider()), ], child: GestureDetector( onTap: () { @@ -182,7 +185,6 @@ class MyApp extends StatelessWidget { old.LandPage.id: (_) => const old.LandPage(), LandPage.routeName: (_) => const LandPage(), NewGasRefillRequestPage.routeName: (_) => const NewGasRefillRequestPage(), - NewTransferRequestPage.routeName: (_) => const NewTransferRequestPage(), ServiceRequestsPage.id: (_) => ServiceRequestsPage(), ReportIssuesPage.id: (_) => const ReportIssuesPage(), RequestGasRefill.id: (_) => const RequestGasRefill(), diff --git a/lib/models/device/asset_transfer.dart b/lib/models/device/asset_transfer.dart index d44ab4fa..f60ce1ff 100644 --- a/lib/models/device/asset_transfer.dart +++ b/lib/models/device/asset_transfer.dart @@ -1,3 +1,8 @@ +import 'package:flutter/src/widgets/framework.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:test_sa/extensions/context_extension.dart'; +import 'package:test_sa/models/device/device.dart'; + import 'asset_transfer_attachment.dart'; class AssetTransfer { @@ -220,4 +225,65 @@ class AssetTransfer { } return map; } + + Map transferBody({Device asset}) { + final map = {}; + map['id'] = 0; + map['transferNo'] = transferNo; + map['transferCode'] = transferCode; + map['assetId'] = asset?.id; + map['destSiteId'] = destSiteId; + map['destBuildingId'] = destBuildingId; + map['destFloorId'] = destFloorId; + map['destDepartmentId'] = destDepartmentId; + map['destRoom'] = destRoom; + map['senderSiteId'] = asset?.site?.id; + map['senderBuildingId'] = asset?.building?.id; + map['senderFloorId'] = asset?.floor?.id; + map['senderDepartmentId'] = asset?.department?.id; + map['senderRoom'] = asset?.room; + map['senderAssignedEmployeeId'] = senderAssignedEmployeeId; + map['senderMachineStatusId'] = senderMachineStatusId; + map['senderComment'] = senderComment; + map['senderStartDate'] = senderStartDate; + map['senderEndDate'] = senderEndDate; + map['senderWorkingHours'] = senderWorkingHours; + map['senderTravelingHours'] = senderTravelingHours; + map['senderEngSignature'] = senderEngSignature; + if (senderAttachments != null) { + map['senderAttachments'] = senderAttachments.map((v) => v.toJson()).toList(); + } + map['receiverAssignedEmployeeId'] = receiverAssignedEmployeeId; + map['receiverMachineStatusId'] = receiverMachineStatusId; + map['receiverComment'] = receiverComment; + map['receiverStartDate'] = receiverStartDate; + map['receiverEndDate'] = receiverEndDate; + map['receiverWorkingHours'] = receiverWorkingHours; + map['receiverTravelingHours'] = receiverTravelingHours; + map['receiverEngSignature'] = receiverEngSignature; + if (receiverAttachments != null) { + map['receiverAttachments'] = receiverAttachments.map((v) => v.toJson()).toList(); + } + return map; + } + + Future validate(BuildContext context) async { + if (assetId == null) { + await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.device}"); + return false; + } else if (destSiteId == null) { + await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.destinationSite}"); + return false; + } else if (destBuildingId == null) { + await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.building}"); + return false; + } else if (destFloorId == null) { + await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.floor}"); + return false; + } else if (destDepartmentId == null) { + await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.department}"); + return false; + } + return true; + } } diff --git a/lib/models/new_models/gas_refill_model.dart b/lib/models/new_models/gas_refill_model.dart index 509c52e6..270beb17 100644 --- a/lib/models/new_models/gas_refill_model.dart +++ b/lib/models/new_models/gas_refill_model.dart @@ -3,7 +3,6 @@ import 'dart:developer'; import 'package:flutter/cupertino.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:test_sa/extensions/context_extension.dart'; -import 'package:test_sa/models/enums/translation_keys.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/new_models/assigned_employee.dart'; import 'package:test_sa/models/new_models/building.dart'; @@ -122,8 +121,8 @@ class GasRefillModel { Map toJson() { final map = {}; - map['id'] = id; - map['gazRefillNo'] = gazRefillNo; + map['id'] = id ?? 0; + map['gazRefillNo'] = "GR-${DateTime.now().toString().split(" ").first}"; map['expectedDate'] = expectedDate; map['expectedTime'] = expectedTime; map['startDate'] = startDate; @@ -220,7 +219,7 @@ class GasRefillDetails { Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id ?? 0; if (gasType != null) { map['gasType'] = gasType.toJson(); } diff --git a/lib/models/service_request/service_request.dart b/lib/models/service_request/service_request.dart index 350185fb..38a76e82 100644 --- a/lib/models/service_request/service_request.dart +++ b/lib/models/service_request/service_request.dart @@ -152,6 +152,12 @@ class ServiceRequest { } else if (defectType == null) { await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.equipmentStatus}"); return false; + } else if (requestedThrough == null) { + await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.requestedThrough}"); + return false; + } else if (type == null) { + await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.typeOfRequest}"); + return false; } return true; } diff --git a/lib/new_views/common_widgets/default_app_bar.dart b/lib/new_views/common_widgets/default_app_bar.dart index e1e5765d..2f524003 100644 --- a/lib/new_views/common_widgets/default_app_bar.dart +++ b/lib/new_views/common_widgets/default_app_bar.dart @@ -4,13 +4,12 @@ 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 '../../models/enums/translation_keys.dart'; import '../app_style/app_color.dart'; class DefaultAppBar extends StatelessWidget implements PreferredSizeWidget { final String title; - const DefaultAppBar({@required this.title, Key key}) : super(key: key); + const DefaultAppBar({this.title, Key key}) : super(key: key); @override Widget build(BuildContext context) { @@ -23,7 +22,7 @@ class DefaultAppBar extends StatelessWidget implements PreferredSizeWidget { Navigator.of(context).pop(); }), Text( - title, + title ?? "", style: AppTextStyles.heading3?.copyWith(fontWeight: FontWeight.w600, color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), ).expanded, ], diff --git a/lib/new_views/common_widgets/single_item_drop_down_menu.dart b/lib/new_views/common_widgets/single_item_drop_down_menu.dart index b03f3ec2..85ed7b9a 100644 --- a/lib/new_views/common_widgets/single_item_drop_down_menu.dart +++ b/lib/new_views/common_widgets/single_item_drop_down_menu.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; -import 'package:test_sa/models/enums/translation_keys.dart'; import 'package:test_sa/new_views/common_widgets/app_loading_manager.dart'; import 'package:test_sa/providers/loading_list_notifier.dart'; @@ -47,7 +46,7 @@ class _SingleItemDropDownMenuState { Future _login() async { if (!_formKey.currentState.validate()) return; _formKey.currentState.save(); - showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); - int status = await _userProvider.login(user: _user); - Navigator.pop(context); + int status = await _userProvider.login(context: context, user: _user); if (status >= 200 && status < 300 && _userProvider.user.isAuthenticated ?? false) { _settingProvider.setUser(_userProvider.user); diff --git a/lib/new_views/pages/new_gas_refill_request_page.dart b/lib/new_views/pages/new_gas_refill_request_page.dart index 3120da99..83f67b4a 100644 --- a/lib/new_views/pages/new_gas_refill_request_page.dart +++ b/lib/new_views/pages/new_gas_refill_request_page.dart @@ -6,7 +6,6 @@ import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; -import 'package:test_sa/models/enums/translation_keys.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/new_models/building.dart'; import 'package:test_sa/models/new_models/department.dart'; @@ -25,7 +24,6 @@ import 'package:test_sa/providers/loading_list_notifier.dart'; import '../../controllers/providers/api/gas_refill_provider.dart'; import '../../controllers/validator/validator.dart'; -import '../common_widgets/app_lazy_loading.dart'; import '../common_widgets/default_app_bar.dart'; class NewGasRefillRequestPage extends StatefulWidget { @@ -95,6 +93,7 @@ class _NewGasRefillRequestPageState extends State { SingleItemDropDownMenu( context: context, title: context.translation.cylinderType, + initialValue: _currentDetails.cylinderType, onSelect: (value) { _currentDetails.cylinderType = value; }, @@ -103,6 +102,7 @@ class _NewGasRefillRequestPageState extends State { SingleItemDropDownMenu( context: context, title: context.translation.cylinderSize, + initialValue: _currentDetails.cylinderSize, onSelect: (value) { _currentDetails.cylinderSize = value; }, @@ -115,6 +115,9 @@ class _NewGasRefillRequestPageState extends State { onSelect: (value) { setState(() { _gasModel.site = value; + _gasModel?.building = null; + _gasModel?.floor = null; + _gasModel?.department = null; }); }, ), @@ -128,6 +131,8 @@ class _NewGasRefillRequestPageState extends State { onSelect: (value) { setState(() { _gasModel.building = value; + _gasModel?.floor = null; + _gasModel?.department = null; }); }, ), @@ -141,6 +146,7 @@ class _NewGasRefillRequestPageState extends State { onSelect: (value) { setState(() { _gasModel.floor = value; + _gasModel?.department = null; }); }, ), @@ -242,18 +248,10 @@ class _NewGasRefillRequestPageState extends State { Fluttertoast.showToast(msg: context.translation.youHaveToAddRequests); return; } - showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); - final status = await Provider.of(context, listen: false).createModel( + await Provider.of(context, listen: false).createModel( + context: context, user: Provider.of(context, listen: false).user, model: _gasModel, ); - Navigator.pop(context); - if (status >= 200 && status < 300) { - Fluttertoast.showToast(msg: context.translation.createdSuccessfully); - Navigator.of(context).pop(); - setState(() {}); - } else { - Fluttertoast.showToast(msg: context.translation.failedToCompleteRequest); - } } } diff --git a/lib/providers/service_request_providers/requested_through_provider.dart b/lib/providers/service_request_providers/requested_through_provider.dart new file mode 100644 index 00000000..928f507c --- /dev/null +++ b/lib/providers/service_request_providers/requested_through_provider.dart @@ -0,0 +1,36 @@ +import 'dart:convert'; + +import 'package:http/http.dart'; +import 'package:test_sa/providers/loading_list_notifier.dart'; + +import '../../controllers/api_routes/api_manager.dart'; +import '../../controllers/api_routes/urls.dart'; +import '../../models/lookup.dart'; + +class RequestedThroughProvider extends LoadingListNotifier { + @override + Future getDate() async { + if (loading == true) return -2; + loading = true; + notifyListeners(); + loading = true; + notifyListeners(); + try { + Response response = await ApiManager.instance.get(URLs.getServiceRequestThrough); + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); + } + loading = false; + notifyListeners(); + return response.statusCode; + } catch (error) { + loading = false; + stateCode = -1; + notifyListeners(); + return -1; + } + } +} diff --git a/lib/providers/service_request_providers/type_of_request_provider.dart b/lib/providers/service_request_providers/type_of_request_provider.dart new file mode 100644 index 00000000..5650b3db --- /dev/null +++ b/lib/providers/service_request_providers/type_of_request_provider.dart @@ -0,0 +1,36 @@ +import 'dart:convert'; + +import 'package:http/http.dart'; +import 'package:test_sa/providers/loading_list_notifier.dart'; + +import '../../controllers/api_routes/api_manager.dart'; +import '../../controllers/api_routes/urls.dart'; +import '../../models/lookup.dart'; + +class TypeOfRequestProvider extends LoadingListNotifier { + @override + Future getDate() async { + if (loading == true) return -2; + loading = true; + notifyListeners(); + loading = true; + notifyListeners(); + try { + Response response = await ApiManager.instance.get(URLs.getServiceRequestTypes); + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); + } + loading = false; + notifyListeners(); + return response.statusCode; + } catch (error) { + loading = false; + stateCode = -1; + notifyListeners(); + return -1; + } + } +} diff --git a/lib/views/pages/device_transfer/request_device_transfer.dart b/lib/views/pages/device_transfer/request_device_transfer.dart index aff207fd..6c4ebe2d 100644 --- a/lib/views/pages/device_transfer/request_device_transfer.dart +++ b/lib/views/pages/device_transfer/request_device_transfer.dart @@ -3,23 +3,25 @@ import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/asset_transfer_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/controllers/validator/validator.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/extensions/text_extensions.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/device/asset_transfer.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/buttons/app_button.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; +import 'package:test_sa/models/device/device.dart'; +import 'package:test_sa/models/new_models/department.dart'; +import 'package:test_sa/models/new_models/floor.dart'; +import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart'; -import '../../../../controllers/localization/localization.dart'; -import '../../../controllers/validator/validator.dart'; -import '../../app_style/colors.dart'; -import '../../widgets/app_text_form_field.dart'; -import '../../widgets/gas_refill/building_type_menu.dart'; -import '../../widgets/gas_refill/department_type_menu.dart'; -import '../../widgets/gas_refill/floor_type_menu.dart'; -import '../../widgets/hospitals/hospital_auto_complete_field_new.dart'; +import '../../../models/new_models/building.dart'; +import '../../../models/new_models/site.dart'; +import '../../../new_views/common_widgets/app_filled_button.dart'; +import '../../../new_views/common_widgets/default_app_bar.dart'; +import '../../../new_views/common_widgets/single_item_drop_down_menu.dart'; +import '../../../providers/gas_request_providers/site_provider.dart'; +import '../../../providers/loading_list_notifier.dart'; +import '../../widgets/equipment/pick_asset.dart'; class RequestDeviceTransfer extends StatefulWidget { static const String id = "/request-device-transfer"; @@ -31,287 +33,148 @@ class RequestDeviceTransfer extends StatefulWidget { } class _RequestDeviceTransferState extends State { - bool _isLoading = false; - bool _validate = false; UserProvider _userProvider; SettingProvider _settingProvider; AssetTransferProvider _deviceTransferProvider; final TextEditingController _requestedQuantityController = TextEditingController(); - final AssetTransfer _formModel = AssetTransfer(/*receiver: DeviceTransferInfo(), sender: DeviceTransferInfo()*/); + final AssetTransfer _transferModel = AssetTransfer(); final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); + final TextEditingController _receiverNameController = TextEditingController(), _commentsController = TextEditingController(); + final Device _assetDestination = Device(); + Device _pickedAsset; @override void setState(VoidCallback fn) { if (mounted) super.setState(() {}); } - _onSubmit() async { - _validate = true; - if (!_formKey.currentState.validate()) { - setState(() {}); - return false; + void _onSubmit() async { + _transferModel.assetId = _pickedAsset.id; + _transferModel.destSiteId = _assetDestination.site?.id; + _transferModel.destBuildingId = _assetDestination.building?.id; + _transferModel.destFloorId = _assetDestination.floor?.id; + _transferModel.destDepartmentId = _assetDestination.department?.id; + if (!_formKey.currentState.validate() || !(await _transferModel.validate(context))) { + return; } _formKey.currentState.save(); - - // if (!_formModel.validate()) { - // setState(() {}); - // return false; - // } - - _isLoading = true; - setState(() {}); - // _formModel.sender?.client?.id = _userProvider.user?.clientId; - int status = await _deviceTransferProvider.createRequest( - user: _userProvider.user, - host: _settingProvider.host, - model: _formModel, - ); - _isLoading = false; - setState(() {}); - if (status >= 200 && status < 300) { - // Fluttertoast.showToast( - // msg: _subtitle.requestCompleteSuccessfully, - // ); - Navigator.of(context).pop(); - } - // else { - // String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); - // ScaffoldMessenger.of(context).showSnackBar(SnackBar( - // content: Text(errorMessage), - // )); - // } + await _deviceTransferProvider.createRequest(context: context, assetDestination: _transferModel, asset: _pickedAsset); } @override void dispose() { _requestedQuantityController.dispose(); _deviceTransferProvider.reset(); + _receiverNameController.dispose(); + _commentsController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { - _userProvider = Provider.of(context); - _settingProvider = Provider.of(context); + _userProvider = Provider.of(context, listen: false); + _settingProvider = Provider.of(context, listen: false); _deviceTransferProvider = Provider.of(context, listen: false); return Scaffold( key: _scaffoldKey, + appBar: DefaultAppBar(title: context.translation.newTransferRequest), body: Form( key: _formKey, child: SafeArea( - child: LoadingManager( - isLoading: _isLoading, - isFailedLoading: false, - stateCode: 200, - onRefresh: () async {}, - child: SingleChildScrollView( - padding: EdgeInsets.all(12 * AppStyle.getScaleFactor(context)), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Center( - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Text( - "Transfer Asset", - style: Theme.of(context).textTheme.headline5.copyWith(color: Theme.of(context).primaryColor, fontSize: 28, fontWeight: FontWeight.bold), - ), + child: Column( + children: [ + SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + 16.height, + PickAsset( + device: _pickedAsset, + onPickAsset: (asset) { + _pickedAsset = asset; + setState(() {}); + }, + ), + 16.height, + context.translation.receiverDetails.heading5(context), + 8.height, + AppTextFormField( + controller: _receiverNameController, + labelText: context.translation.receiverName, + validator: (text) => Validator.hasValue(text) ? null : context.translation.requiredField, + onSaved: (text) {}, + ), + 8.height, + SingleItemDropDownMenu( + context: context, + title: context.translation.destinationSite, + initialValue: _assetDestination?.site, + onSelect: (value) { + _assetDestination.site = value; + _assetDestination.building = null; + _assetDestination.floor = null; + _assetDestination.department = null; + setState(() {}); + }, + ), + 8.height, + SingleItemDropDownMenu( + context: context, + title: context.translation.building, + initialValue: _assetDestination?.building, + enabled: _assetDestination?.site?.buildings?.isNotEmpty ?? false, + staticData: _assetDestination?.site?.buildings ?? [], + onSelect: (value) { + _assetDestination?.building = value; + _assetDestination?.floor = null; + _assetDestination?.department = null; + setState(() {}); + }, + ), + 8.height, + SingleItemDropDownMenu( + context: context, + title: context.translation.floor, + initialValue: _assetDestination?.floor, + enabled: _assetDestination?.building?.floors?.isNotEmpty ?? false, + staticData: _assetDestination?.building?.floors ?? [], + onSelect: (value) { + _assetDestination?.floor = value; + _assetDestination?.department = null; + setState(() {}); + }, + ), + 8.height, + SingleItemDropDownMenu( + context: context, + title: context.translation.department, + initialValue: _assetDestination?.department, + enabled: _assetDestination?.floor?.departments?.isNotEmpty ?? false, + staticData: _assetDestination?.floor?.departments ?? [], + onSelect: (value) { + _assetDestination?.department = value; + }, ), - ), - // const SizedBox(height: 8,), - // ASubTitle(_subtitle.title), - // if(_validate && _formModel.title == null || _formModel.title?.isEmpty == true) - // ASubTitle(_subtitle.requiredWord,color: Colors.red,), - // const SizedBox(height: 4,), - // ATextFormField( - // initialValue: _formModel?.title, - // textAlign: TextAlign.center, - // style: Theme.of(context).textTheme.subtitle1, - // textInputType: TextInputType.text, - // onSaved: (value){ - // _formModel.title = value; - // }, - // ), - 12.height, - const ASubTitle("Asset"), - if (_validate /*&& _formModel.device == null*/) - ASubTitle( - context.translation.requiredWord, - color: Colors.red, + 16.height, + context.translation.comments.heading5(context), + 8.height, + AppTextFormField( + controller: _commentsController, + labelText: context.translation.comments, + onSaved: (text) { + _transferModel.senderComment = text; + }, ), - 6.height, - // DeviceButton( - // device: _formModel.device, - // onDevicePick: (device) { - // _formModel.device = device; - // _formModel.sender.client = device.hospital; - // setState(() {}); - // }, - // ), - // if (_formModel.device != null) 8.height, - // if (_formModel.device != null) AdditionalAssetInfo(title: "Asset Site", value: _formModel.device.hospital?.name), - // if (_formModel.device != null) 4.height, - // if (_formModel.device != null) AdditionalAssetInfo(title: "Asset Department", value: _formModel.device.destDepartmentName), - // if (_formModel.device != null) 4.height, - // if (_formModel.device != null) AdditionalAssetInfo(title: "Asset Floor", value: _formModel.device.destFloor), - // if (_formModel.device != null) 4.height, - // if (_formModel.device != null) AdditionalAssetInfo(title: "Asset Room", value: _formModel.device.destRoom), - // if (_formModel.device != null) 8.height, - // const SizedBox(height: 8,), - // const ASubTitle("Sender Department"), - // if(_validate && _formModel.senderDepartment == null) - // ASubTitle(_subtitle.requiredWord,color: Colors.red,), - // const SizedBox(height: 4,), - // DepartmentButton( - // department: _formModel.senderDepartment, - // onDepartmentPick: (department){ - // _formModel.senderDepartment = department; - // setState(() {}); - // }, - // ), - // 12.height, - // const ASubTitle("Destination Client"), - // if (_validate && _formModel.receiver.client == null) - // ASubTitle( - // _subtitle.requiredWord, - // color: Colors.red, - // ), - // 6.height, - // HospitalButton( - // hospital: _formModel.receiver.client, - // onHospitalPick: (hospital) { - // _formModel.receiver.client = hospital; - // setState(() {}); - // }, - // ), - // 12.height, - // const ASubTitle("Destination Department"), - // if (_validate && _formModel.receiver.department == null) - // ASubTitle( - // _subtitle.requiredWord, - // color: Colors.red, - // ), - // 6.height, - // DepartmentButton( - // department: _formModel.receiver.department, - // onDepartmentPick: (department) { - // _formModel.receiver.department = department; - // setState(() {}); - // }, - // ), - const SizedBox( - height: 4, - ), - Divider( - color: Theme.of(context).colorScheme.primary, - ), - const SizedBox(height: 8), - const ASubTitle("Destination"), - const SizedBox( - height: 4, - ), - HospitalAutoCompleteField( - initialValue: _deviceTransferProvider.hospital?.name, - // onSave: (value){ - // _search.hospital = value; - // }, - onSearch: (value) { - _deviceTransferProvider.hospital = value; - _deviceTransferProvider.building = null; - _deviceTransferProvider.floor = null; - _deviceTransferProvider.department = null; - // _formModel.receiver.client = value; - setState(() {}); - }, - ), - const SizedBox( - height: 8, - ), - BuildingTypeMenu( - initialValue: _deviceTransferProvider?.building, - building: _deviceTransferProvider?.hospital?.buildings, - onSelect: (status) { - _deviceTransferProvider.building = status; - setState(() {}); - }, - ), - const SizedBox(height: 8), - FloorTypeMenu( - initialValue: _deviceTransferProvider?.floor, - floors: _deviceTransferProvider?.building?.floors, - onSelect: (status) { - _deviceTransferProvider.floor = status; - setState(() {}); - }, - ), - const SizedBox(height: 8), - DepartmentTypeMenu( - initialValue: _deviceTransferProvider?.department, - departments: _deviceTransferProvider?.floor?.departments, - onSelect: (status) { - _deviceTransferProvider.department = status; - // _formModel.receiver.department = Department(id: status.id, name: status.name); - setState(() {}); - }, - ), - const SizedBox(height: 8), - const ASubTitle("Room"), - const SizedBox( - height: 4, - ), - ATextFormField( - textAlign: TextAlign.center, - controller: _requestedQuantityController, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only", - textInputType: TextInputType.number, - onSaved: (value) { - _deviceTransferProvider.room = value; - }, - ), - 12.height, - AButton( - text: context.translation.submit, - onPressed: _onSubmit, - ), - const SizedBox( - height: 100, - ) - ], - ), - ), - ), + 100.height, + ], + ), + ).expanded, + AppFilledButton(label: context.translation.submitRequest, maxWidth: true, onPressed: _onSubmit) + ], + ).paddingOnly(start: 16, end: 16, bottom: 24), ), ), ); } } - -class AdditionalAssetInfo extends StatelessWidget { - final String title, value; - const AdditionalAssetInfo({@required this.title, @required this.value, Key key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(title ?? ""), - Container( - width: double.infinity, - alignment: Alignment.center, - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16), - decoration: BoxDecoration( - color: AColors.inputFieldBackgroundColor, - border: Border.all( - color: const Color(0xffefefef), - ), - borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), - ), - child: ASubTitle(value ?? ""), - ), - ], - ); - } -} diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index 9542bf4b..6604135f 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -22,7 +22,6 @@ import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import 'package:test_sa/views/widgets/status/service_request/service_request_defect_types_mune.dart'; import '../../../controllers/api_routes/http_status_manger.dart'; -import '../../../controllers/localization/localization.dart'; import '../../../controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart'; import '../../widgets/app_text_form_field.dart'; import '../../widgets/buttons/app_back_button.dart'; diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index e7a56bc5..09a23c55 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -12,7 +12,6 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/new_views/pages/new_gas_refill_request_page.dart'; -import 'package:test_sa/new_views/pages/new_transfer_request_page.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/pages/device_transfer/track_device_transfer.dart'; @@ -27,6 +26,7 @@ import 'package:test_sa/views/widgets/drawer/drawer_item.dart'; import 'package:url_launcher/url_launcher.dart'; import '../../widgets/land_page/land_page_item.dart'; +import '../device_transfer/request_device_transfer.dart'; import 'requests/requests_page.dart'; @Deprecated("Use the page which is inside the [new_views/pages/land_page] folder") @@ -75,7 +75,7 @@ class _LandPageState extends State { // _serviceRequestsProvider = Provider.of(context); // _preventiveMaintenanceVisitsProvider = Provider.of(context); // _regularVisitsProvider = Provider.of(context); - // + // if (firstTime) { if (path != null) { Navigator.of(context).pushNamed("/" + path.split("/").first, arguments: path.split("/").last); @@ -147,7 +147,7 @@ class _LandPageState extends State { mainAxisSpacing: 12, childAspectRatio: 1, children: [ - /// enable this condition when the nurse account works + /// todo [zaid] : enable this condition when the nurse account works // if (_userProvider.user != null && _userProvider.user.type == UsersTypes.normal_user) LandPageItem( // text: _subtitle.newServiceRequest, @@ -182,7 +182,7 @@ class _LandPageState extends State { // Navigator.of(context).pushNamed(PreventiveMaintenanceVisitsPage.id); // }, // ), - /// enable this condition when the nurse account works + /// todo [zaid] : enable this condition when the nurse account works // if (_userProvider?.user != null && _userProvider?.user?.type != UsersTypes.engineer) LandPageItem( text: "Request Gas Refill", @@ -203,8 +203,7 @@ class _LandPageState extends State { text: "Transfer Asset", icon: FontAwesomeIcons.rightLeft, onPressed: () { - // Navigator.of(context).pushNamed(RequestDeviceTransfer.id); - Navigator.of(context).pushNamed(NewTransferRequestPage.routeName); + Navigator.of(context).pushNamed(RequestDeviceTransfer.id); }, ), LandPageItem( @@ -215,7 +214,7 @@ class _LandPageState extends State { }, ), - /// enable this condition when the nurse account works + /// todo [zaid] : enable this condition when the nurse account works // if (_userProvider?.user != null && _userProvider?.user?.type != UsersTypes.normal_user) LandPageItem( text: "Create Sub Work Order", diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index 1429a4fa..ead6d04d 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -1,11 +1,7 @@ import 'dart:convert'; import 'dart:io'; -import 'package:file_picker/file_picker.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:fluttertoast/fluttertoast.dart'; -import 'package:image_picker/image_picker.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -16,19 +12,20 @@ import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; +import 'package:test_sa/providers/service_request_providers/requested_through_provider.dart'; import 'package:test_sa/views/widgets/equipment/pick_asset.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/sound/record_sound.dart'; import '../../../../models/lookup.dart'; import '../../../../new_views/app_style/app_color.dart'; -import '../../../../new_views/common_widgets/app_dashed_button.dart'; -import '../../../../new_views/common_widgets/app_lazy_loading.dart'; import '../../../../new_views/common_widgets/app_text_form_field.dart'; import '../../../../new_views/common_widgets/default_app_bar.dart'; import '../../../../new_views/common_widgets/single_item_drop_down_menu.dart'; import '../../../../providers/service_request_providers/equipment_status_provider.dart'; import '../../../../providers/service_request_providers/priority_provider.dart'; +import '../../../../providers/service_request_providers/type_of_request_provider.dart'; class CreateRequestPage extends StatefulWidget { static const String id = "/create-request"; @@ -156,8 +153,30 @@ class CreateRequestPageState extends State { }, ), 8.height, - AppDashedButton(title: _serviceRequest.devicePhotos?.first?.split("/")?.last ?? context.translation.attachImage, onPressed: _attachImage), - 16.height, + Consumer(builder: (context, snapshot, _) { + return SingleItemDropDownMenu( + context: context, + enabled: false, + title: context.translation.requestedThrough, + initialValue: snapshot.items?.firstWhere((element) => element.id == 375, orElse: () => null), + ); + }), + 8.height, + SingleItemDropDownMenu( + context: context, + title: context.translation.typeOfRequest, + initialValue: _serviceRequest?.type, + onSelect: (value) { + _serviceRequest.type = value; + }, + ), + 8.height, + MultiFilesPicker( + label: context.translation.attachImage, + onlyImages: true, + files: _deviceImages, + ), + ((_serviceRequest.devicePhotos?.isNotEmpty ?? false) ? 16 : 8).height, Align( alignment: AlignmentDirectional.centerStart, child: context.translation.callComments.heading5(context), @@ -191,58 +210,8 @@ class CreateRequestPageState extends State { ); } - _attachImage() async { - ImageSource source = await showDialog( - context: context, - builder: (dialogContext) => CupertinoAlertDialog( - actions: [ - TextButton( - child: Text(context.translation.pickFromCamera), - onPressed: () { - Navigator.of(dialogContext).pop(ImageSource.camera); - }, - ), - TextButton( - child: Text(context.translation.pickFromGallery), - onPressed: () { - Navigator.of(dialogContext).pop(ImageSource.gallery); - }, - ), - TextButton( - child: Text(context.translation.pickFromFiles), - onPressed: () async { - await _fromFilePicker(); - Navigator.pop(context); - }, - ), - ], - ), - ); - if (source == null) return; - - final pickedFile = await ImagePicker().pickImage(source: source, imageQuality: 70, maxWidth: 800, maxHeight: 800); - if (pickedFile != null) { - _serviceRequest.devicePhotos ??= []; - _serviceRequest.devicePhotos?.clear(); - _serviceRequest.devicePhotos?.add(pickedFile.path); - setState(() {}); - } - } - - _fromFilePicker() async { - FilePickerResult result = await FilePicker.platform.pickFiles( - type: FileType.custom, - allowedExtensions: ['jpg', 'jpeg', 'png', 'pdf', 'doc', 'docx', 'xlsx', 'pptx'], - ); - if (result?.files?.first != null) { - _serviceRequest.devicePhotos ??= []; - _serviceRequest.devicePhotos?.clear(); - _serviceRequest.devicePhotos?.add(result?.files?.first?.path); - setState(() {}); - } - } - Future _submit() async { + _serviceRequest?.requestedThrough = Provider.of(context, listen: false).items?.firstWhere((element) => element.id == 375, orElse: () => null); if (_formKey.currentState.validate() && await _serviceRequest.validateNewRequest(context)) { _formKey.currentState.save(); _serviceRequest.devicePhotos = _deviceImages.map((e) => _isLocalUrl(e.path) ? "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}" : e.path).toList(); @@ -252,19 +221,12 @@ class CreateRequestPageState extends State { _serviceRequest.audio = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"; } } - showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); - int status = await _serviceRequestsProvider.createRequest( + await _serviceRequestsProvider.createRequest( + context: context, user: _userProvider.user, host: _settingProvider.host, serviceRequest: _serviceRequest, ); - Navigator.of(context); - if (status >= 200 && status < 300) { - Fluttertoast.showToast(msg: context.translation.successfulRequestMessage); - Navigator.pop(context); - } else { - Fluttertoast.showToast(msg: context.translation.failedRequestMessage); - } } } } diff --git a/lib/views/pages/user/requests/work_order/create_service_report.dart b/lib/views/pages/user/requests/work_order/create_service_report.dart index 55fef57a..8893c3f1 100644 --- a/lib/views/pages/user/requests/work_order/create_service_report.dart +++ b/lib/views/pages/user/requests/work_order/create_service_report.dart @@ -5,7 +5,6 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -17,7 +16,6 @@ import 'package:test_sa/models/engineer.dart'; import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; @@ -59,7 +57,7 @@ class _CreateServiceReportState extends State with TickerPr ServiceReport _serviceReport; bool _isLoading = false; bool _showCommentField = false; - + final List _files = []; final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); diff --git a/lib/views/pages/user/requests/work_order/edit_service_report.dart b/lib/views/pages/user/requests/work_order/edit_service_report.dart index 8e6d3475..21934713 100644 --- a/lib/views/pages/user/requests/work_order/edit_service_report.dart +++ b/lib/views/pages/user/requests/work_order/edit_service_report.dart @@ -5,7 +5,6 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_types_provider.dart'; @@ -18,7 +17,6 @@ import 'package:test_sa/models/engineer.dart'; import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; @@ -60,7 +58,7 @@ class _EditServiceReportState extends State with TickerProvid ServiceReport _serviceReport; bool _isLoading = false; bool _showCommentField = false; - + List _images = []; final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); diff --git a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart index 0fe9a0f3..d3c562aa 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/widgets/loaders/image_loader.dart'; diff --git a/lib/views/widgets/images/multi_image_picker.dart b/lib/views/widgets/images/multi_image_picker.dart index c0885083..916ffd38 100644 --- a/lib/views/widgets/images/multi_image_picker.dart +++ b/lib/views/widgets/images/multi_image_picker.dart @@ -5,170 +5,74 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:image_picker/image_picker.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/buttons/app_flat_button.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import '../../../new_views/common_widgets/app_dashed_button.dart'; import 'multi_image_picker_item.dart'; class MultiFilesPicker extends StatefulWidget { final String label; final bool error; final List files; - final bool enabled; + final bool enabled, onlyImages; - const MultiFilesPicker({Key key, this.files, this.label, this.error = false, this.enabled = true}) : super(key: key); + const MultiFilesPicker({Key key, this.files, this.label, this.error = false, this.enabled = true, this.onlyImages = false}) : super(key: key); @override - _MultiFilesPickerState createState() => _MultiFilesPickerState(); + State createState() => _MultiFilesPickerState(); } -class _MultiFilesPickerState extends State with TickerProviderStateMixin { - Size _size; - +class _MultiFilesPickerState extends State { @override Widget build(BuildContext context) { - _size = MediaQuery.of(context).size; - - return (widget.enabled == false && (widget.files?.isEmpty ?? false)) - ? const SizedBox() - : Container( - padding: const EdgeInsets.all(12), - decoration: BoxDecoration( - color: const Color(0xfff5f5f5), - border: Border.all( - color: const Color(0xffefefef), - ), - borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // SizedBox(height: 8 * AppStyle.getScaleFactor(context),), - Row( - children: [ - Expanded( - child: Text( - widget.label ?? context.translation.images, - style: Theme.of(context).textTheme.headline6.copyWith( - fontSize: 14, - ), - textScaleFactor: AppStyle.getScaleFactor(context), - ), - ), - if (widget.enabled) - AFlatButton( - text: context.translation.add, - onPressed: widget.enabled - ? () { - // onImagePick(_subtitle); - onFilePicker(context.translation); - } - : null, - ), - ], - ), - 12.height, - AnimatedSize( - duration: const Duration(milliseconds: 400), - child: !widget.error - ? const SizedBox.shrink() - : Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - context.translation.imagesRequired, - style: Theme.of(context).textTheme.headline6.copyWith( - fontSize: 14, - color: AColors.red, - ), - textScaleFactor: AppStyle.getScaleFactor(context), - ), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - ], - ), - ), - AnimatedSwitcher( - duration: const Duration(milliseconds: 400), - child: Container( - key: ValueKey(widget.files.length), - width: _size.width, - height: 200 * AppStyle.getScaleFactor(context), - padding: EdgeInsets.all( - 8 * AppStyle.getScaleFactor(context), - ), - alignment: Alignment.topLeft, - decoration: BoxDecoration( - border: Border.all(color: Theme.of(context).primaryColor, width: 2), - borderRadius: BorderRadius.circular(8 * AppStyle.getScaleFactor(context)), - ), - child: widget.files.isEmpty && widget.enabled - ? MaterialButton( - onPressed: widget.enabled - ? () { - // onImagePick(_subtitle); - onFilePicker(context.translation); - } - : null, - child: Center( - child: Icon( - Icons.file_upload, - size: 48 * AppStyle.getScaleFactor(context), - color: Theme.of(context).primaryColor, - )), - ) - : GridView.count( - crossAxisCount: 2, - //_size.width ~/ 80, - scrollDirection: Axis.horizontal, - mainAxisSpacing: 10, - crossAxisSpacing: 10, - children: List.generate(widget.files.length, (index) { - File _image = widget.files[index]; - return MultiFilesPickerItem( - file: _image, - enabled: widget.enabled, - onRemoveTap: (image) { - if (!widget.enabled) { - return; - } - widget.files.remove(image); - setState(() {}); - }, - ); - }), - ), - ), - ), - ], + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppDashedButton(title: widget.label, onPressed: (widget.enabled == false) ? () {} : onFilePicker), + 16.height, + if (widget.files?.isNotEmpty ?? false) + Wrap( + spacing: 8.toScreenWidth, + children: List.generate( + widget.files.length, + (index) { + File image = widget.files[index]; + return MultiFilesPickerItem( + file: image, + enabled: widget.enabled, + onRemoveTap: (image) { + if (!widget.enabled) { + return; + } + widget.files.remove(image); + setState(() {}); + }, + ); + }, ), - ); + ), + ], + ); } - fromFilePicker(AppLocalizations subtitle) async { + fromFilePicker() async { FilePickerResult result = await FilePicker.platform.pickFiles( type: FileType.custom, allowMultiple: true, - allowedExtensions: ['jpg', 'jpeg', 'png', 'pdf', 'doc', 'docx', 'xlsx', 'pptx'], + allowedExtensions: widget.onlyImages ? ['jpg', 'jpeg', 'png'] : ['jpg', 'jpeg', 'png', 'pdf', 'doc', 'docx', 'xlsx', 'pptx'], ); if (result != null) { for (var path in result.paths) { - widget.files.insert(0, File(path)); + widget.files.add(File(path)); } setState(() {}); } } - onFilePicker(AppLocalizations subtitle) async { + onFilePicker() async { if (widget.files.length >= 5) { - Fluttertoast.showToast(msg: subtitle.maxImagesNumberIs5); + Fluttertoast.showToast(msg: context.translation.maxImagesNumberIs5); return; } ImageSource source = await showDialog( @@ -176,21 +80,21 @@ class _MultiFilesPickerState extends State with TickerProvider builder: (dialogContext) => CupertinoAlertDialog( actions: [ TextButton( - child: Text(subtitle.pickFromCamera), + child: Text(context.translation.pickFromCamera), onPressed: () { Navigator.of(dialogContext).pop(ImageSource.camera); }, ), TextButton( - child: Text(subtitle.pickFromGallery), + child: Text(context.translation.pickFromGallery), onPressed: () { Navigator.of(dialogContext).pop(ImageSource.gallery); }, ), TextButton( - child: Text(subtitle.pickFromFiles), + child: Text(context.translation.pickFromFiles), onPressed: () async { - await fromFilePicker(subtitle); + await fromFilePicker(); Navigator.pop(context); }, ), @@ -204,7 +108,7 @@ class _MultiFilesPickerState extends State with TickerProvider if (pickedFile != null) { File fileImage = File(pickedFile.path); if (fileImage != null) { - widget.files.insert(0, fileImage); + widget.files.add(fileImage); setState(() {}); } } diff --git a/lib/views/widgets/images/multi_image_picker_item.dart b/lib/views/widgets/images/multi_image_picker_item.dart index 907c20fa..04666f67 100644 --- a/lib/views/widgets/images/multi_image_picker_item.dart +++ b/lib/views/widgets/images/multi_image_picker_item.dart @@ -3,10 +3,12 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:open_file/open_file.dart'; +import 'package:test_sa/extensions/context_extension.dart'; +import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/buttons/app_back_button.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/views/widgets/loaders/image_loader.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -22,72 +24,64 @@ class MultiFilesPickerItem extends StatelessWidget { var isImage = file.path.split(".").last.toLowerCase() == "png" || file.path.split(".").last.toLowerCase() == "jpg" || file.path.split(".").last.toLowerCase() == "jpeg"; var isPdf = file.path.split(".").last.toLowerCase() == "pdf"; var isExcel = file.path.split(".").last.toLowerCase() == "xlsx"; - return Container( - width: 80 * AppStyle.getScaleFactor(context), - height: 80 * AppStyle.getScaleFactor(context), - decoration: BoxDecoration( - boxShadow: [BoxShadow(color: isImage ? Colors.black38 : AColors.cyan.withOpacity(0.5), blurRadius: 2)], - image: DecorationImage( - image: isImage - ? (_isLocalUrl(file.path) ? FileImage(file) : NetworkImage(file.path)) - : AssetImage("assets/images/${isPdf ? "pdf" : isExcel ? "excel" : "doc"}.png"), - fit: BoxFit.cover, - ), - borderRadius: BorderRadius.circular(8), - ), - child: MaterialButton( - padding: EdgeInsets.zero, - onPressed: () async { - if (isImage) { - Navigator.of(context).push( - MaterialPageRoute( - builder: (_) => Scaffold( - body: SafeArea( - child: Stack( - children: [ - InteractiveViewer( - child: _isLocalUrl(file.path) - ? Image.file(file) - : ImageLoader( - url: file.path, - boxFit: BoxFit.cover, - )) - .center, - const ABackButton(), - ], - ), - ), - ), + return SizedBox( + width: 54.toScreenWidth, + height: 51.toScreenWidth, + child: Stack( + alignment: AlignmentDirectional.topEnd, + children: [ + Container( + margin: EdgeInsetsDirectional.only(top: 4.toScreenHeight, end: 6.toScreenWidth), + decoration: BoxDecoration( + border: Border.all(width: 1, color: context.isDark ? AppColor.neutral30 : AppColor.neutral30), + image: DecorationImage( + image: isImage + ? (_isLocalUrl(file.path) ? FileImage(file) : NetworkImage(file.path)) + : AssetImage("assets/images/${isPdf ? "pdf" : isExcel ? "excel" : "doc"}.png"), + fit: BoxFit.cover, ), - ); - } else if (_isLocalUrl(file.path)) { - OpenFile.open(file.path); - } else { - if (!await launchUrl(Uri.parse(file.path), mode: LaunchMode.externalApplication)) { - Fluttertoast.showToast(msg: "UnExpected Error with file."); - throw Exception('Could not launch '); - } - } - }, - child: enabled - ? Align( - alignment: Alignment.topRight, - child: IconButton( - padding: const EdgeInsets.all(2.0), - icon: Container( - padding: const EdgeInsets.all(1), - decoration: BoxDecoration(color: Theme.of(context).scaffoldBackgroundColor.withOpacity(.3), borderRadius: BorderRadius.circular(8)), - child: const Icon( - Icons.remove_circle, - color: AColors.red, + borderRadius: BorderRadius.circular(8), + ), + child: MaterialButton( + padding: EdgeInsets.zero, + onPressed: () async { + if (isImage) { + Navigator.of(context).push( + MaterialPageRoute( + builder: (_) => Scaffold( + appBar: const DefaultAppBar(), + body: SafeArea( + child: InteractiveViewer( + child: _isLocalUrl(file.path) + ? Image.file(file) + : ImageLoader( + url: file.path, + boxFit: BoxFit.cover, + ), + ).center, + ), + ), ), - ), - onPressed: () { - onRemoveTap(file); - }, - ), - ) - : const SizedBox(), + ); + } else if (_isLocalUrl(file.path)) { + OpenFile.open(file.path); + } else { + if (!await launchUrl(Uri.parse(file.path), mode: LaunchMode.externalApplication)) { + Fluttertoast.showToast(msg: "UnExpected Error with file."); + throw Exception('Could not launch '); + } + } + }, + ), + ), + if (enabled) + InkWell( + child: "remove".toSvgAsset(width: 16), + onTap: () { + onRemoveTap(file); + }, + ) + ], ), ); } diff --git a/lib/views/widgets/pentry/pentry_info_form.dart b/lib/views/widgets/pentry/pentry_info_form.dart index 2cfc7076..f38b1fbc 100644 --- a/lib/views/widgets/pentry/pentry_info_form.dart +++ b/lib/views/widgets/pentry/pentry_info_form.dart @@ -2,7 +2,6 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/models/pantry/pentry.dart'; @@ -35,7 +34,7 @@ class _PentryInfoFormState extends State { @override Widget build(BuildContext context) { widget.model?.files ??= []; - + final userProvider = Provider.of(context); return Padding( padding: EdgeInsets.only( From 39515c48ad1de5985f0f729037c9ca92e7e2fd76 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Mon, 23 Oct 2023 13:03:09 +0300 Subject: [PATCH 2/2] Merged --- lib/l10n/app_ar.arb | 5 +++-- lib/l10n/app_en.arb | 4 +--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index 1e17e38f..a1dd2baa 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -250,7 +250,7 @@ "assetNo" : "رقم الجهاز", "manufacture" : "صناعة", "model" : "الطراز", - "serialNumber" : "الرقم التسلسلي", + "Serial No" : "الرقم التسلسلي", "device" : "الجهاز", "pickAsset" : "إختر جهاز", "firstAction" : "First Action", @@ -263,5 +263,6 @@ "receiverName" : "اسم المستلم", "receiverDetails" : "تفاصيل المستلم", "requestedThrough" : "الطلب عبر", - "typeOfRequest" : "نوع الطلب" + "typeOfRequest" : "نوع الطلب", + "assetDetails" : "تفاصيل الجهاز" } \ No newline at end of file diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index f2e6d32f..bcae22c3 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -250,7 +250,6 @@ "assetNo" : "Asset No.", "manufacture" : "Manufacture", "model" : "Model", - "serialNumber" : "Serial Number", "serialNo" : "Serial No", "device" : "Device", "pickAsset" : "Pick Asset", @@ -266,8 +265,7 @@ "callComments" : "Call Comments", "comments": "Comments", "recordVoice" : "Record Voice", - "assetDetails" : "Asset Details" - "recordVoice" : "Record Voice", + "assetDetails" : "Asset Details", "receiverName" : "Receiver Name", "receiverDetails" : "Receiver Details", "requestedThrough" : "Requested Through",