diff --git a/lib/dashboard_latest/dashboard_provider.dart b/lib/dashboard_latest/dashboard_provider.dart index 090a8e6e..617a0dc4 100644 --- a/lib/dashboard_latest/dashboard_provider.dart +++ b/lib/dashboard_latest/dashboard_provider.dart @@ -107,9 +107,7 @@ class DashBoardProvider extends ChangeNotifier { notifyListeners(); Response response; try { - response = await ApiManager.instance.get( - URLs.getWorkOrderByIdUrl + "?workOrderId=$id", - ); + response = await ApiManager.instance.get(URLs.getWorkOrderByIdUrl + "?workOrderId=$id"); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { @@ -178,19 +176,14 @@ class DashBoardProvider extends ChangeNotifier { if (response.statusCode >= 200 && response.statusCode < 300) { if (_requestDetailList == null) { _requestDetailList = DD.DashboardDetail.fromJson(json.decode(response.body)); - - //notifyListeners(); } else { - _requestDetailList!.data!.addAll(DD.DashboardDetail.fromJson(json.decode(response.body)["data"][0]).data ?? []); - - //notifyListeners(); + _requestDetailList!.data!.addAll(DD.DashboardDetail.fromJson(json.decode(response.body)).data ?? []); } if (_requestDetailList!.data!.length >= pageItemNumber) { nextPage = true; } else { nextPage = false; } - //notifyListeners(); } else { requestDetailList = null; } diff --git a/lib/dashboard_latest/dashboard_view.dart b/lib/dashboard_latest/dashboard_view.dart index cae90ec8..3e4ff381 100644 --- a/lib/dashboard_latest/dashboard_view.dart +++ b/lib/dashboard_latest/dashboard_view.dart @@ -5,7 +5,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/notification/firebase_notification_manger.dart'; import 'package:test_sa/controllers/notification/notification_manger.dart'; -import 'package:test_sa/controllers/providers/api/all_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/notifications_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; @@ -36,8 +35,8 @@ class _DashboardViewState extends State { late SettingProvider settingProvider; late UserProvider userProvider; - late AllRequestsProvider allRequestsProvider; - late DashBoardProvider dashBoardProvider; + + // late AllRequestsProvider allRequestsProvider; late NotificationsProvider notificationsProvider; late ScrollController _scrollController; late DashBoardProvider _dashBoardProvider; @@ -51,6 +50,7 @@ class _DashboardViewState extends State { void getRequests() { _dashBoardProvider.getDashBoardCount(usersType: userProvider.user!.type!); + _dashBoardProvider.resetRequestDataList(); _dashBoardProvider.getRequestDetail(usersType: userProvider.user!.type!, status: _dashBoardProvider.tabs[_dashBoardProvider.currentListIndex].tag); } @@ -59,7 +59,7 @@ class _DashboardViewState extends State { userProvider = Provider.of(context, listen: false); settingProvider = Provider.of(context, listen: false); RequestDetailProvider requestDetailProvider = Provider.of(context, listen: false); - allRequestsProvider = Provider.of(context, listen: false); + //allRequestsProvider = Provider.of(context, listen: false); _dashBoardProvider = Provider.of(context, listen: false); _dashBoardProvider.setTabs(userProvider.user!.type!, context); notificationsProvider = Provider.of(context, listen: false); @@ -99,9 +99,9 @@ class _DashboardViewState extends State { void handleScroll() async { _scrollController = ScrollController(); _scrollController.addListener(() async { - if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent && !allRequestsProvider.isFilterRequestLoading) { - allRequestsProvider.pageNum = allRequestsProvider.pageNum + 1; - await allRequestsProvider.getFilterRequests(showLoader: false, status: allRequestsProvider.status); + if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent && !_dashBoardProvider.isDetailLoading) { + _dashBoardProvider.pageNum = _dashBoardProvider.pageNum + 1; + _dashBoardProvider.getRequestDetail(usersType: user.type!, showLoader: false, status: _dashBoardProvider.currentListIndex); } }); } @@ -115,7 +115,7 @@ class _DashboardViewState extends State { @override Widget build(BuildContext context) { bool isNurse = (Provider.of(context, listen: false).user!.type) == UsersTypes.normal_user; - print('user data is ${Provider.of(context, listen: false).user?.toJson()}'); + print('user data is ${Provider.of(context, listen: false).user?.toJson()}'); return Scaffold( // backgroundColor: AppColor.background(context), appBar: PreferredSize( diff --git a/lib/dashboard_latest/widgets/request_category_fragment.dart b/lib/dashboard_latest/widgets/request_category_fragment.dart index 4f3ffe72..84e73f81 100644 --- a/lib/dashboard_latest/widgets/request_category_fragment.dart +++ b/lib/dashboard_latest/widgets/request_category_fragment.dart @@ -10,6 +10,7 @@ import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/new_models/dashboard_detail.dart'; import 'package:test_sa/new_views/common_widgets/tab_button.dart'; +import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; class RequestCategoryFragment extends StatelessWidget { const RequestCategoryFragment({Key? key}) : super(key: key); @@ -33,7 +34,9 @@ class RequestCategoryFragment extends StatelessWidget { child: const SizedBox().toRequestShimmer(context, dashboardProvider.isDetailLoading), ); })).paddingOnly(start: 16, end: 16, top: 16) - : RequestCategoryList(dashboardProvider.requestDetailList?.data ?? [], dashboardProvider.isDetailLoading, dashboardProvider.requestDetailList?.totalRows ?? 0), + : (dashboardProvider.requestDetailList?.data?.isEmpty ?? true) + ? const NoDataFound().paddingOnly(top: 50).center + : RequestCategoryList(dashboardProvider.requestDetailList?.data ?? [], dashboardProvider.isDetailLoading, dashboardProvider.requestDetailList?.totalRows ?? 0), ]); }); } diff --git a/lib/dashboard_latest/widgets/request_category_list.dart b/lib/dashboard_latest/widgets/request_category_list.dart index b42d2290..022e785f 100644 --- a/lib/dashboard_latest/widgets/request_category_list.dart +++ b/lib/dashboard_latest/widgets/request_category_list.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; +import 'package:test_sa/dashboard_latest/widgets/app_bar_widget.dart'; import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/new_models/dashboard_detail.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/pages/land_page/requests/asset_item_view.dart'; @@ -23,14 +25,7 @@ class RequestCategoryList extends StatelessWidget { physics: const NeverScrollableScrollPhysics(), itemBuilder: (context, index) { if (index == list.length) { - return const ListTile( - title: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - CircularProgressIndicator(color: AppColor.primary10, strokeWidth: 1), - ], - ), - ); + return const CircularProgressIndicator(color: AppColor.primary10, strokeWidth: 1).center; } return Padding(padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight), child: _buildRequestItem(list[index])); }, diff --git a/lib/models/helper_data_models/workorder/work_order_helper_models.dart b/lib/models/helper_data_models/workorder/work_order_helper_models.dart index ba6296f1..1a2960e2 100644 --- a/lib/models/helper_data_models/workorder/work_order_helper_models.dart +++ b/lib/models/helper_data_models/workorder/work_order_helper_models.dart @@ -1,14 +1,15 @@ - import 'package:test_sa/models/fault_description.dart'; import 'package:test_sa/models/lookup.dart'; import '../../new_models/work_order_detail_model.dart'; + class FixRemotelyHelperModel { int? workOrderId; DateTime? startDate; DateTime? endDate; int? workingHour; String? comment; + FixRemotelyHelperModel({this.workOrderId, this.startDate, this.endDate, this.workingHour, this.comment}); Map toJson() { @@ -25,17 +26,10 @@ class WorkOrderHelperModel { String? voiceNote; List? workOrderAttachments; - WorkOrderHelperModel( - {this.assetId, - this.equipmentStatusId, - this.priorityId, - this.problemDescriptionId, - this.comments, - this.voiceNote, - this.workOrderAttachments}); + WorkOrderHelperModel({this.assetId, this.equipmentStatusId, this.priorityId, this.problemDescriptionId, this.comments, this.voiceNote, this.workOrderAttachments}); Map toJson() { - final Map data = {}; + final Map data = {}; data['assetId'] = assetId; data['equipmentStatusId'] = equipmentStatusId; data['priorityId'] = priorityId; @@ -43,54 +37,58 @@ class WorkOrderHelperModel { data['comments'] = comments; data['voiceNote'] = voiceNote; if (workOrderAttachments != null) { - data['workOrderAttachments'] = - workOrderAttachments!.map((v) => v.toJson()).toList(); + data['workOrderAttachments'] = workOrderAttachments!.map((v) => v.toJson()).toList(); } return data; } } class WorkOrderAttachments { + WorkOrderAttachments({this.id, this.name}); + int? id; String? name; - WorkOrderAttachments({this.id, this.name}); - + WorkOrderAttachments.fromJson(Map json) { + id = json['id']; + name = json['name']; + } Map toJson() { - final Map data = {}; + final Map data = {}; data['id'] = id; data['name'] = name; return data; } } + class EngineerUpdateWorkOrderHelperModel { int? workOrderId; - Lookup?equipmentStatus; + Lookup? equipmentStatus; String? returnToService; Lookup? serviceType; Lookup? loanAvailability; - num?loanAssetId; + num? loanAssetId; WorkOrderAsset? loanAsset; Lookup? failureReason; FaultDescription? faultDescription; String? solution; - EngineerUpdateWorkOrderHelperModel( - {this.workOrderId, - this.equipmentStatus, - this.failureReason, - this.faultDescription, - this.loanAvailability, - this.loanAssetId, - this.loanAsset, - this.serviceType, - this.solution, - this.returnToService, - }); + EngineerUpdateWorkOrderHelperModel({ + this.workOrderId, + this.equipmentStatus, + this.failureReason, + this.faultDescription, + this.loanAvailability, + this.loanAssetId, + this.loanAsset, + this.serviceType, + this.solution, + this.returnToService, + }); Map toJson() { - final Map data = {}; + final Map data = {}; data['workOrderId'] = workOrderId; data['equipmentStatusId'] = equipmentStatus?.id; data['returnToService'] = returnToService; @@ -118,6 +116,7 @@ class NurseActionHelperModel { return {'workOrderId': workOrderId, 'feedback': feedback, 'signatureNurse': signatureNurse}; } } + class NeedVisitHelperModel { int? workOrderId; DateTime? visitDate; @@ -125,7 +124,6 @@ class NeedVisitHelperModel { NeedVisitHelperModel({this.workOrderId, this.visitDate, this.comment}); - Map toJson() { return {'workOrderId': workOrderId, 'visitDate': visitDate?.toIso8601String(), 'comment': comment}; } @@ -136,9 +134,9 @@ class EngineerRejectHelperModel { String? feedback; Lookup? rejectionReason; - EngineerRejectHelperModel({this.workOrderId, this.feedback,this.rejectionReason}); + EngineerRejectHelperModel({this.workOrderId, this.feedback, this.rejectionReason}); Map toJson() { return {'workOrderId': workOrderId, 'feedback': feedback, 'rejectReasonId': rejectionReason?.id}; } -} \ No newline at end of file +} diff --git a/lib/models/new_models/work_order_detail_model.dart b/lib/models/new_models/work_order_detail_model.dart index d96c897f..98f075da 100644 --- a/lib/models/new_models/work_order_detail_model.dart +++ b/lib/models/new_models/work_order_detail_model.dart @@ -117,7 +117,7 @@ class WorkOrderData { Lookup? problemDescription; String? comments; String? voiceNote; - List workOrderAttachments; + List workOrderAttachments; String? returnToService; Lookup? serviceType; Lookup? failureReasone; @@ -164,7 +164,7 @@ class WorkOrderData { problemDescription: json["problemDescription"] == null ? null : Lookup.fromJson(json["problemDescription"]), comments: json["comments"], voiceNote: json["voiceNote"], - workOrderAttachments: json["workOrderAttachments"] == null ? [] : List.from(json["workOrderAttachments"]!.map((x) => x)), + workOrderAttachments: json["workOrderAttachments"] == null ? [] : List.from(json['workOrderAttachments']).map((e)=>WorkOrderAttachments.fromJson(e)).toList(), returnToService: json["returnToService"], serviceType: json["serviceType"] == null ? null : Lookup.fromJson(json["serviceType"]), failureReasone: json["failureReasone"] == null ? null : Lookup.fromJson(json["failureReasone"]), @@ -212,7 +212,7 @@ class WorkOrderData { "problemDescription": problemDescription?.toJson(), "comments": comments, "voiceNote": voiceNote, - "workOrderAttachments": workOrderAttachments.map((x) => x).toList(), + "workOrderAttachments": workOrderAttachments.map((e)=>e.toJson()).toList(), "returnToService": returnToService, "serviceType": serviceType?.toJson(), "failureReasone": failureReasone?.toJson(), @@ -403,12 +403,14 @@ class ActivitySparePart { int? id; PartCatalogItem? partCatalogItem; double? quantity; + String? comment; List? acitiySparePartAttachments; ActivitySparePart( {this.id, this.partCatalogItem, this.quantity, + this.comment, this.acitiySparePartAttachments}); ActivitySparePart.fromJson(Map json) { @@ -417,6 +419,7 @@ class ActivitySparePart { ? new PartCatalogItem.fromJson(json['partCatalogItem']) : null; quantity = json['quantity']; + comment = json['comment']; if (json['acitiySparePartAttachments'] != null) { acitiySparePartAttachments = []; json['acitiySparePartAttachments'].forEach((v) { @@ -432,6 +435,7 @@ class ActivitySparePart { data['partCatalogItem'] = partCatalogItem!.toJson(); } data['quantity'] = quantity; + data['comment'] = comment; if (acitiySparePartAttachments != null) { data['acitiySparePartAttachments'] = acitiySparePartAttachments!.map((v) => v.toJson()).toList(); diff --git a/lib/new_views/app_style/app_color.dart b/lib/new_views/app_style/app_color.dart index 1cd1ef6c..66a1d70d 100644 --- a/lib/new_views/app_style/app_color.dart +++ b/lib/new_views/app_style/app_color.dart @@ -75,7 +75,7 @@ class AppColor { static const Color orange70 = Color(0xffFFC945); // static Color greenStatus(BuildContext context) => context.isDark ? const Color(0xff1FA269) : green50; - static Color greenStatus(BuildContext context) => context.isDark ? const Color(0xff54C166) : green70; + static Color greenStatus(BuildContext context) => context.isDark ? const Color(0xff54C166) : green70.withOpacity(.5); // static Color blueStatus(BuildContext context) => context.isDark ? primary40 : primary50; static Color blueStatus(BuildContext context) => context.isDark ? primary40 : primary90; @@ -101,6 +101,12 @@ class AppColor { return orange60; case "high priority": return white10; + case "yes": + return white10; + case "low priority": + return green15; + case "low": + return green15; default: return Colors.white; } @@ -152,6 +158,8 @@ class AppColor { return greenStatus(context); case "high priority": return redStatus(context); + case "yes": + return redStatus(context); case "low priority": return greenStatus(context); case "open": @@ -202,6 +210,8 @@ class AppColor { //low priority case 81: return Colors.white; + case 370: + return green15; case 82: //high priority return white10; @@ -215,6 +225,8 @@ class AppColor { //low priority case 81: return greenStatus(context); + case 370: + return greenStatus(context); //high priority case 82: return redStatus(context); diff --git a/lib/new_views/common_widgets/app_bottom_nav_bar.dart b/lib/new_views/common_widgets/app_bottom_nav_bar.dart index 086b0b32..e12734c3 100644 --- a/lib/new_views/common_widgets/app_bottom_nav_bar.dart +++ b/lib/new_views/common_widgets/app_bottom_nav_bar.dart @@ -46,15 +46,15 @@ class AppBottomNavigationBar extends StatelessWidget { return BottomNavigationBarItem( icon: iconName .toSvgAsset( - width: showLabel ? 28 : 38, - height: showLabel ? 26 : 37, + width: showLabel ? 26 : 38, + height: showLabel ? 26 : 38, color: showLabel || (showLabel && selectedIndex != 2) ? selectedIndex == index ? Theme.of(context).bottomNavigationBarTheme.selectedItemColor : Theme.of(context).bottomNavigationBarTheme.unselectedItemColor : null, ) - .paddingOnly(top: 21, bottom: showLabel ? 4 : 0), + .paddingOnly(top: showLabel ? 0 : 12, bottom: showLabel ? 6 : 0), label: showLabel ? label : '', ); } 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 00377aea..fbd3c761 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 @@ -138,7 +138,7 @@ class _SingleItemDropDownMenuState[ - listCard( - context: context, - icon: 'add_icon', - label: '${context.translation.create}\n${context.translation.serviceRequest}', - onTap: () { - Navigator.pushReplacementNamed(context, CreateNewRequest.id); - - }, - ), - listCard( - context: context, - icon: 'add_icon', - label: '${context.translation.create}\n${context.translation.gasRefill}', - onTap: () { - //NewGasRefillRequestPage.routeName) - Navigator.pushReplacementNamed(context, NewGasRefillRequestPage.routeName); - }, - ), - listCard( - context: context, - icon: 'add_icon', - label: '${context.translation.create}\n${context.translation.deviceTransfer}', - onTap: () async { - Navigator.pushReplacementNamed(context, RequestDeviceTransfer.id); - }, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Select Request".heading4(context), + 16.height, + GridView( + padding: EdgeInsets.all(0), + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, childAspectRatio: 1, crossAxisSpacing: 16, mainAxisSpacing: 16), + children: [ + listCard( + context: context, + icon: 'add_icon', + label: '${context.translation.create}\n${context.translation.serviceRequest}', + onTap: () { + Navigator.pushReplacementNamed(context, CreateNewRequest.id); + }, + ), + listCard( + context: context, + icon: 'add_icon', + label: '${context.translation.create}\n${context.translation.gasRefill}', + onTap: () { + //NewGasRefillRequestPage.routeName) + Navigator.pushReplacementNamed(context, NewGasRefillRequestPage.routeName); + }, + ), + listCard( + context: context, + icon: 'add_icon', + label: '${context.translation.create}\n${context.translation.deviceTransfer}', + onTap: () async { + Navigator.pushReplacementNamed(context, RequestDeviceTransfer.id); + }, + ), + ], ), + 16.height, ], ), ); @@ -59,9 +71,14 @@ class CreateRequestTypeBottomSheet extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - icon.toSvgAsset(), - 24.height, + const Icon( + Icons.add_circle, + color: AppColor.neutral120, + size: 32, + ), + //24.height, label.bodyText2(context).custom(color: AppColor.black20), ], ), diff --git a/lib/new_views/pages/land_page/requests/service_request_item_view.dart b/lib/new_views/pages/land_page/requests/service_request_item_view.dart index c708c1c1..359bd6a8 100644 --- a/lib/new_views/pages/land_page/requests/service_request_item_view.dart +++ b/lib/new_views/pages/land_page/requests/service_request_item_view.dart @@ -37,8 +37,8 @@ class ServiceRequestItemView extends StatelessWidget { 8.width, StatusLabel( label: requestData!.statusName!, - textColor: AppColor.getRequestStatusTextColorByName(context, requestData!.statusName!), - backgroundColor: AppColor.getRequestStatusColorByName(context, requestData!.statusName!), + textColor: AppColor.getHistoryLogStatusTextColorByName( requestData!.statusName!), + backgroundColor: AppColor.getHistoryLogStatusColorByName( requestData!.statusName!), ), 1.width.expanded, Text(requestData!.transactionDate!.toServiceRequestCardFormat, diff --git a/lib/new_views/pages/land_page/requests_list_page.dart b/lib/new_views/pages/land_page/requests_list_page.dart index 9f06dace..eb58aff8 100644 --- a/lib/new_views/pages/land_page/requests_list_page.dart +++ b/lib/new_views/pages/land_page/requests_list_page.dart @@ -9,6 +9,7 @@ import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/new_models/dashboard_detail.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/new_views/pages/land_page/requests/request_paginated_listview.dart'; +import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; class RequestsListPage extends StatefulWidget { static const String routeName = "/requests-list-page"; @@ -67,6 +68,8 @@ class _RequestsListPageState extends State { ); }, ); + } else if (snapshot.requestDetailList?.data?.isEmpty ?? true) { + return const NoDataFound().center; } else { return RequestPaginatedListview(snapshot.requestDetailList?.data ?? [], snapshot.isDetailLoading, snapshot.requestDetailList?.totalRows ?? 0, _scrollController); } diff --git a/lib/service_request_latest/views/components/activities_list_view.dart b/lib/service_request_latest/views/components/activities_list_view.dart index c16fb9c4..449c0b2e 100644 --- a/lib/service_request_latest/views/components/activities_list_view.dart +++ b/lib/service_request_latest/views/components/activities_list_view.dart @@ -1,19 +1,14 @@ -import 'dart:async'; - import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; -import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/helper_data_models/spare_part/activity_spare_part_model.dart'; import 'package:test_sa/models/new_models/work_order_detail_model.dart'; -import 'package:test_sa/models/service_request/search_work_order.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/service_request/spare_parts.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; @@ -23,8 +18,7 @@ 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/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart'; import 'package:test_sa/service_request_latest/views/forms/spare_part/spare_part_request.dart'; -import 'package:test_sa/views/pages/user/requests/work_order/update_service_report.dart'; -import 'package:test_sa/views/pages/user/requests/work_order/work_order_details_page.dart'; +import 'package:test_sa/views/widgets/images/files_list.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; @@ -52,99 +46,107 @@ class ActivitiesListView extends StatelessWidget { itemCount: activities.length, separatorBuilder: (czt, index) => 8.height, itemBuilder: (context, index) { - return Row( + return Column( + mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - StatusLabel( - label: activities[index].activityStatus?.name, - textColor: AppColor.getRequestStatusTextColorByName(context, activities[index].activityStatus?.name), - backgroundColor: AppColor.getRequestStatusColorByName(context, activities[index].activityStatus?.name), - ), - "drag_icon".toSvgAsset(height: 12, width: 23, color: AppColor.neutral160), - if (userProvider.user!.type == UsersTypes.engineer && - requestDetailProvider.currentWorkOrder?.data?.status?.value != 5 && - requestDetailProvider.currentWorkOrder?.data?.status?.value != 3) - Row( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - "edit_icon".toSvgAsset(height: 21, width: 21).onPress(() { - print('attachments in activity model is ${activities[index].activitySparePart?.acitiySparePartAttachments}'); - requestDetailProvider.sparePartHelperModel=SparePartHelperModel( - id: activities[index].id, - workOrderId: requestDetailProvider.currentWorkOrder?.data?.requestId, - sparePartAttachments:activities[index].activitySparePart?.acitiySparePartAttachments??[], - sparePart:SparePart( - id: activities[index].activitySparePart?.partCatalogItem?.id, - partName: activities[index].activitySparePart?.partCatalogItem?.partName, - partNo: activities[index].activitySparePart?.partCatalogItem?.partNumber), - quantity: activities[index].activitySparePart?.quantity, - activityStatusId: activities[index].activityStatus?.id, - //TODO commets are missing in api response.. - // comment: activities[index].activitySparePart?.description, - ); - - requestDetailProvider.updateSparePartHelperModel(requestDetailProvider.sparePartHelperModel); - print('model in activity page is ${requestDetailProvider.sparePartHelperModel?.toJson()}'); - Navigator.of(context).push( - MaterialPageRoute(builder: (_) => const SparePartRequest (), - )); - }), - 24.width, - "delete_icon".toSvgAsset(height: 21, width: 21).onPress(()async { - showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); - int status = await requestDetailProvider.deleteActivitySparePart(id: activities[index].id!, workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!); - if (status == 200) { - await requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!); - Navigator.pop(context); - } else { - Navigator.pop(context); - } - }), - ], - ) - ], - ), - 6.height, - //activity type... - Text( - '${activities[index].activityType?.cleanupWhitespace.capitalizeFirstOfEach}', - style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50), - ), - 3.height, - Text( - '${context.translation.partName}: ${activities[index].activitySparePart?.partCatalogItem?.partName}', - style: AppTextStyles.bodyText2.copyWith(color: AppColor.neutral120), + StatusLabel( + label: activities[index].activityStatus?.name, + textColor: AppColor.getHistoryLogStatusTextColorByName(activities[index].activityStatus!.name!), + backgroundColor: AppColor.getHistoryLogStatusColorByName(activities[index].activityStatus!.name!), ), - 2.height, - Text( - '${context.translation.partNo}: ${activities[index].activitySparePart?.partCatalogItem?.partNumber}', - style: AppTextStyles.bodyText2.copyWith(color: AppColor.neutral120), - ), - 2.height, - //TODO description text not in api. - // Text( - // '${context.translation.date}: ${activities[index].currentSituation?.date}', - // style: AppTextStyles.bodyText2.copyWith(color: AppColor.neutral120), - // ), - 2.height, + "drag_icon".toSvgAsset(height: 12, width: 23, color: AppColor.neutral160), + if (userProvider.user!.type == UsersTypes.engineer && + requestDetailProvider.currentWorkOrder?.data?.status?.value != 5 && + requestDetailProvider.currentWorkOrder?.data?.status?.value != 3) + Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "edit_icon".toSvgAsset(height: 21, width: 21).onPress(() { + requestDetailProvider.sparePartHelperModel = SparePartHelperModel( + id: activities[index].id, + workOrderId: requestDetailProvider.currentWorkOrder?.data?.requestId, + comment: activities[index].activitySparePart?.comment, + sparePartAttachments: activities[index].activitySparePart?.acitiySparePartAttachments ?? [], + sparePart: SparePart( + id: activities[index].activitySparePart?.partCatalogItem?.id, + partName: activities[index].activitySparePart?.partCatalogItem?.partName, + partNo: activities[index].activitySparePart?.partCatalogItem?.partNumber), + quantity: activities[index].activitySparePart?.quantity, + activityStatusId: activities[index].activityStatus?.id, + //TODO commets are missing in api response.. + // comment: activities[index].activitySparePart?.description, + ); + + requestDetailProvider.updateSparePartHelperModel(requestDetailProvider.sparePartHelperModel); + + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => const SparePartRequest(), + )); + }), + 24.width, + "delete_icon".toSvgAsset(height: 21, width: 21).onPress(() async { + showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); + int status = + await requestDetailProvider.deleteActivitySparePart(id: activities[index].id!, workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!); + if (status == 200) { + await requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!); + Navigator.pop(context); + } else { + Navigator.pop(context); + } + }), + ], + ) ], - ).onPress(() { - //TODO write onview detail method.. - // Navigator.push( - // context, - // MaterialPageRoute(builder: (context) => WorkOrderDetailsPage(workOrder: activities[index], serviceRequest: ServiceRequest())), - // ); - }).expanded, + ), + 6.height, + //activity type... + Text( + '${activities[index].activityType?.cleanupWhitespace.capitalizeFirstOfEach}', + style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50), + ), + 3.height, + Text( + '${context.translation.partName}: ${activities[index].activitySparePart?.partCatalogItem?.partName}', + style: AppTextStyles.bodyText2.copyWith(color: AppColor.neutral120), + ), + 2.height, + Text( + '${context.translation.partNo}: ${activities[index].activitySparePart?.partCatalogItem?.partNumber}', + style: AppTextStyles.bodyText2.copyWith(color: AppColor.neutral120), + ), + 2.height, + //TODO description text not in api. + // Text( + // '${context.translation.date}: ${activities[index].currentSituation?.date}', + // style: AppTextStyles.bodyText2.copyWith(color: AppColor.neutral120), + // ), + if (activities[index].activitySparePart?.comment?.isNotEmpty ?? false) ...[ + const Divider().defaultStyle(context), + 2.height, + Text( + activities[index].activitySparePart?.comment ?? "", + style: AppTextStyles.bodyText2.copyWith(color: AppColor.neutral120), + ), + ], + if (activities[index].activitySparePart?.acitiySparePartAttachments?.isNotEmpty ?? false) ...[ + 2.height, + const Divider().defaultStyle(context), + FilesList(images: activities[index].activitySparePart!.acitiySparePartAttachments!.map((toElement) => URLs.getFileUrl(toElement.name!)!).toList()), + ], ], - ).toShadowContainer(context); + ).toShadowContainer(context, padding: 12).onPress(() { + //TODO write onview detail method.. + // Navigator.push( + // context, + // MaterialPageRoute(builder: (context) => WorkOrderDetailsPage(workOrder: activities[index], serviceRequest: ServiceRequest())), + // ); + }); }, ).expanded, if (userProvider.user!.type == UsersTypes.engineer && 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 3f534873..e83675cd 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 @@ -437,9 +437,9 @@ class ServiceRequestBottomSheet { const SizedBox().indicatorWidget(), Align( alignment: AlignmentDirectional.centerStart, - child: context.translation.rejectionReason.heading4(context).paddingOnly(top: 21), + child: context.translation.rejectionReason.heading4(context).paddingOnly(top: 12), ), - 15.height, + 16.height, SingleItemDropDownMenu( context: context, title: context.translation.reason, diff --git a/lib/service_request_latest/views/components/initial_visit_card.dart b/lib/service_request_latest/views/components/initial_visit_card.dart index 265d79b7..defc6e2f 100644 --- a/lib/service_request_latest/views/components/initial_visit_card.dart +++ b/lib/service_request_latest/views/components/initial_visit_card.dart @@ -5,8 +5,6 @@ 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/work_order_helper_models.dart'; -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/service_request_latest/request_detail_provider.dart'; import 'package:test_sa/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart'; @@ -17,7 +15,6 @@ class InitialVisitCard extends StatelessWidget { @override Widget build(BuildContext context) { return Consumer(builder: (context, RequestDetailProvider requestDetailProvider, snapshot) { - return Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(14), @@ -35,17 +32,14 @@ class InitialVisitCard extends StatelessWidget { style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.black10), ), "edit_icon".toSvgAsset(height: 21, width: 21).onPress(() { - ServiceRequestBottomSheet.initialVisitBottomSheet(context: context); }), ]), 2.height, context.translation.visitDateAndTime.bodyText2(context).custom(color: AppColor.neutral120), - 8.height, + 12.height, if (requestDetailProvider.needVisitHelperModel?.comment != null) ...[ - requestDetailProvider.needVisitHelperModel!.comment!.bodyText2(context).custom( - color: AppColor.neutral120, - ), + requestDetailProvider.needVisitHelperModel!.comment!.bodyText2(context).custom(color: AppColor.neutral120), ] ], ), 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 a56e96e7..e28d784d 100644 --- a/lib/service_request_latest/views/components/request_detail_view.dart +++ b/lib/service_request_latest/views/components/request_detail_view.dart @@ -1,8 +1,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/all_requests_provider.dart'; -import 'package:test_sa/controllers/providers/api/comments_provider.dart'; -import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; @@ -11,24 +9,15 @@ import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/work_order_next_step.dart'; -import 'package:test_sa/models/helper_data_models/asset_retired/asset_retired_model.dart'; import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart'; import 'package:test_sa/models/new_models/work_order_detail_model.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/user.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/default_app_bar.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/service_request_latest/views/components/initial_visit_card.dart'; -import 'package:test_sa/service_request_latest/views/components/timer_widget.dart'; import 'package:test_sa/service_request_latest/views/forms/asset_retired/asset_retired.dart'; -import 'package:test_sa/service_request_latest/views/nurse/create_new_request_view.dart'; -import 'package:test_sa/views/pages/user/requests/comments_bottom_sheet.dart'; -import 'package:test_sa/views/pages/user/requests/update_service_request_page.dart'; import 'package:test_sa/views/widgets/images/files_list.dart'; -import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; import 'package:test_sa/views/widgets/sound/sound_player.dart'; @@ -100,8 +89,8 @@ class WorkOrderDetailView extends StatelessWidget { StatusLabel( radius: 4, label: workOrder.status!.name, - textColor: AppColor.getRequestStatusTextColor(context, workOrder.status!.id!), - backgroundColor: AppColor.getRequestStatusColor(context, workOrder.status!.id!), + textColor: AppColor.getHistoryLogStatusTextColorByName(workOrder.status!.name!), + backgroundColor: AppColor.getHistoryLogStatusColorByName(workOrder.status!.name!), ), 1.width.expanded, Column( @@ -210,12 +199,12 @@ class WorkOrderDetailView extends StatelessWidget { if (workOrder.workOrderAttachments.isNotEmpty ?? false) ...[ 8.height, const Divider().defaultStyle(context), - FilesList(images: workOrder.workOrderAttachments), + FilesList(images: workOrder.workOrderAttachments.map((toElement) => URLs.getFileUrl(toElement.name!)!).toList()), ], if (workOrder.voiceNote?.isNotEmpty ?? false) ...[ const Divider().defaultStyle(context), 16.height, - ASoundPlayer(audio: workOrder.voiceNote!), + ASoundPlayer(audio: URLs.getFileUrl(workOrder.voiceNote!)!), 8.height, ], ], 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 b77bae96..870726ea 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 @@ -4,11 +4,11 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; -import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; +import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/models/fault_description.dart'; import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart'; import 'package:test_sa/models/new_models/work_order_detail_model.dart'; @@ -24,6 +24,7 @@ import 'package:test_sa/service_request_latest/request_detail_provider.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/equipment/pick_asset.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; + import '../../../../../../models/lookup.dart'; import '../../../../../../new_views/common_widgets/default_app_bar.dart'; @@ -69,7 +70,7 @@ class _VerifyAssetDetailsState extends State with TickerProv _loanAvailabilityProvider = Provider.of(context, listen: false); _equipmentStatusProvider = Provider.of(context, listen: false); _reasonProvider?.serviceRequestId = _requestDetailProvider?.currentWorkOrder!.data!.requestId.toString(); - _faults = await Provider.of(context,listen: false).getFaultDescriptionList(assetId: _requestDetailProvider?.currentWorkOrder?.data?.asset?.id); + _faults = await Provider.of(context, listen: false).getFaultDescriptionList(assetId: _requestDetailProvider?.currentWorkOrder?.data?.asset?.id); _reasonProvider?.getDate(); _equipmentStatusProvider?.getDate(); _loanAvailabilityProvider?.getDate(); @@ -144,12 +145,13 @@ class _VerifyAssetDetailsState extends State with TickerProv }); }, ), - 8.height, + 12.height, SingleItemDropDownMenu( context: context, title: context.translation.loanAvailability, backgroundColor: AppColor.neutral100, height: 56.toScreenHeight, + showShadow: false, initialValue: requestDetailProvider.engineerUpdateWorkOrderHelperModel?.loanAvailability, onSelect: (status) { if (status != null) { @@ -174,7 +176,7 @@ class _VerifyAssetDetailsState extends State with TickerProv }); }, ), - 8.height, + 12.height, SingleItemDropDownMenu( context: context, title: context.translation.failureReason, @@ -188,27 +190,27 @@ class _VerifyAssetDetailsState extends State with TickerProv } }, ), - 8.height, + 12.height, SingleItemDropDownMenu( context: context, title: context.translation.faultDescription, backgroundColor: AppColor.neutral100, staticData: _faults, - showShadow: true, - initialValue: requestDetailProvider.engineerUpdateWorkOrderHelperModel?.faultDescription, + showShadow: false, + initialValue: requestDetailProvider.engineerUpdateWorkOrderHelperModel?.faultDescription, onSelect: (fault) { requestDetailProvider.engineerUpdateWorkOrderHelperModel?.faultDescription = fault; requestDetailProvider.engineerUpdateWorkOrderHelperModel?.solution = fault?.workPerformed; - if(mounted){ - requestDetailProvider.updateEngineerUpdateWorkOrderHelperModel(requestDetailProvider.engineerUpdateWorkOrderHelperModel); + if (mounted) { + requestDetailProvider.updateEngineerUpdateWorkOrderHelperModel(requestDetailProvider.engineerUpdateWorkOrderHelperModel); } }, ), - 11.height, + 12.height, context.translation.solutions.heading6(context).custom(color: AppColor.neutral50), - 11.height, + 8.height, requestDetailProvider.engineerUpdateWorkOrderHelperModel?.solution != null - ? requestDetailProvider.engineerUpdateWorkOrderHelperModel!.solution!.heading6(context).custom(color: AppColor.neutral50) + ? requestDetailProvider.engineerUpdateWorkOrderHelperModel!.solution!.bodyText2(context).custom(color: AppColor.neutral120) : const SizedBox(), ], ).paddingOnly(start: 13, end: 13, top: 16, bottom: 16), 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 c9b2d338..22f7acb5 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 @@ -17,7 +17,6 @@ import 'package:test_sa/providers/loading_list_notifier.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/widgets/images/new_multi_image_picker.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import '../../../../../../models/service_request/spare_parts.dart'; import '../../../../../../new_views/common_widgets/app_text_form_field.dart'; @@ -104,142 +103,135 @@ class _SparePartRequestState extends State with TickerProvider appBar: DefaultAppBar(title: context.translation.sparePartRequest), body: Consumer(builder: (context, RequestDetailProvider requestDetailProvider, child) { return SafeArea( - child: LoadingManager( - isLoading: _isLoading, - isFailedLoading: false, - stateCode: 200, - onRefresh: () async {}, child: Form( - key: _formKey, - child: Column( - children: [ - SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Card( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - context.translation.sparePartDetails.heading5(context), - 12.height, - SingleItemDropDownMenu( - context: context, - title: context.translation.partNo, - staticData: _spareParts, - showShadow: false, - initialValue: requestDetailProvider.sparePartHelperModel?.sparePart, - backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, - onSelect: (part) { - if (part != null) { - requestDetailProvider.sparePartHelperModel?.sparePart = part; - _oracleNoController.text = part.oracleCode ?? ''; - requestDetailProvider.updateSparePartHelperModel(_requestDetailProvider?.sparePartHelperModel); - } - }, - ), - 12.height, - AppTextFormField( - controller: _partQtyController, - labelText: context.translation.quantity, - textInputType: TextInputType.number, - labelStyle: AppTextStyles.textFieldLabelStyle, - showWithoutDecoration: true, - backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, - enable: requestDetailProvider.sparePartHelperModel?.sparePart?.id != null, - validator: (value) => value == null || value.isEmpty - ? context.translation.requiredField - : Validator.isNumeric(value) - ? null - : context.translation.onlyNumbers, - onChange: (value) { - requestDetailProvider.sparePartHelperModel?.quantity = num.tryParse(value ?? ""); - }, - onSaved: (text) { - requestDetailProvider.sparePartHelperModel?.quantity = num.tryParse(text ?? ""); - }, - ), - 12.height, - AppTextFormField( - labelStyle: AppTextStyles.textFieldLabelStyle, - controller: _oracleNoController, - labelText: context.translation.oracleNo, - textInputType: TextInputType.number, - showWithoutDecoration: true, - backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, - enable: false, - ), - 12.height, - AppTextFormField( - initialValue: requestDetailProvider.sparePartHelperModel?.comment, - labelStyle: AppTextStyles.textFieldLabelStyle, - controller: _descriptionController, - backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, - labelText: context.translation.description, - alignLabelWithHint: true, - showWithoutDecoration: true, - textInputType: TextInputType.multiline, - onChange: (value) { - requestDetailProvider.sparePartHelperModel?.comment = value; - }, - onSaved: (value) { - requestDetailProvider.sparePartHelperModel?.comment = value; - }, - ), - 12.height, - NewMultiFilesPicker( - label: context.translation.attachQuotation, - files: _files, - buttonIcon: 'quotation_icon'.toSvgAsset(), - buttonColor: AppColor.primary10, - onChange: (List list) { - for (var element in list) { - print('path is ${element.file.path}'); - } - }, - ), - ], - ).paddingAll(16), - ), - 8.height, - ], + key: _formKey, + child: Column( + children: [ + SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Card( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + context.translation.sparePartDetails.heading5(context), + 12.height, + SingleItemDropDownMenu( + context: context, + title: context.translation.partNo, + staticData: _spareParts, + showShadow: false,loading: _isLoading, + initialValue: requestDetailProvider.sparePartHelperModel?.sparePart, + backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, + onSelect: (part) { + if (part != null) { + requestDetailProvider.sparePartHelperModel?.sparePart = part; + _oracleNoController.text = part.oracleCode ?? ''; + requestDetailProvider.updateSparePartHelperModel(_requestDetailProvider?.sparePartHelperModel); + } + }, + ), + 12.height, + AppTextFormField( + controller: _partQtyController, + labelText: context.translation.quantity, + textInputType: TextInputType.number, + labelStyle: AppTextStyles.textFieldLabelStyle, + showWithoutDecoration: true, + backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, + enable: requestDetailProvider.sparePartHelperModel?.sparePart?.id != null, + validator: (value) => value == null || value.isEmpty + ? context.translation.requiredField + : Validator.isNumeric(value) + ? null + : context.translation.onlyNumbers, + onChange: (value) { + requestDetailProvider.sparePartHelperModel?.quantity = num.tryParse(value ?? ""); + }, + onSaved: (text) { + requestDetailProvider.sparePartHelperModel?.quantity = num.tryParse(text ?? ""); + }, + ), + 12.height, + AppTextFormField( + labelStyle: AppTextStyles.textFieldLabelStyle, + controller: _oracleNoController, + labelText: context.translation.oracleNo, + textInputType: TextInputType.number, + showWithoutDecoration: true, + backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, + enable: false, + ), + 12.height, + AppTextFormField( + initialValue: requestDetailProvider.sparePartHelperModel?.comment, + labelStyle: AppTextStyles.textFieldLabelStyle, + controller: _descriptionController, + backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, + labelText: context.translation.description, + alignLabelWithHint: true, + showWithoutDecoration: true, + textInputType: TextInputType.multiline, + onChange: (value) { + requestDetailProvider.sparePartHelperModel?.comment = value; + }, + onSaved: (value) { + requestDetailProvider.sparePartHelperModel?.comment = value; + }, + ), + 12.height, + NewMultiFilesPicker( + label: context.translation.attachQuotation, + files: _files, + buttonIcon: 'quotation_icon'.toSvgAsset(), + buttonColor: AppColor.primary10, + onChange: (List list) { + + for (var element in list) { + print('path is ${element.file.path}'); + } + }, + ), + ], + ).paddingAll(16), ), - ).paddingAll(12).expanded, - FooterActionButton.footerContainer( - child: AppFilledButton( - label: _requestDetailProvider?.sparePartHelperModel?.id == 0 ? context.translation.addSparePartActivity : context.translation.updateSparePartActivity, - buttonColor: AppColor.green70, - onPressed: () async { - requestDetailProvider.sparePartHelperModel?.sparePartAttachments?.clear(); - for (var pickerObject in _files) { - String fileData = _isLocalUrl(pickerObject.file.path) - ? ("${pickerObject.file.path.split("/").last}|${base64Encode(File(pickerObject.file.path).readAsBytesSync())}") - : pickerObject.file.path; - requestDetailProvider.sparePartHelperModel?.sparePartAttachments?.add(SparePartAttachments(id: pickerObject.id, name: fileData)); - } - - showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); - int status = -1; - if (_requestDetailProvider?.sparePartHelperModel?.id == 0) { - status = await requestDetailProvider.createActivitySparePart(); - } else { - status = await requestDetailProvider.updateActivitySparePart(); - } - if (status == 200) { - await requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!); - //this is for hide the dialoge... - Navigator.pop(context); - Navigator.pop(context); - } else { - Navigator.pop(context); - } - }, - )), - ], - ), - ), + 8.height, + ], + ), + ).paddingAll(12).expanded, + FooterActionButton.footerContainer( + child: AppFilledButton( + label: _requestDetailProvider?.sparePartHelperModel?.id == 0 ? context.translation.addSparePartActivity : context.translation.updateSparePartActivity, + buttonColor: AppColor.green70, + onPressed: () async { + requestDetailProvider.sparePartHelperModel?.sparePartAttachments?.clear(); + for (var pickerObject in _files) { + String fileData = + _isLocalUrl(pickerObject.file.path) ? ("${pickerObject.file.path.split("/").last}|${base64Encode(File(pickerObject.file.path).readAsBytesSync())}") : pickerObject.file.path; + requestDetailProvider.sparePartHelperModel?.sparePartAttachments?.add(SparePartAttachments(id: pickerObject.id, name: fileData)); + } + + showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); + int status = -1; + if (_requestDetailProvider?.sparePartHelperModel?.id == 0) { + status = await requestDetailProvider.createActivitySparePart(); + } else { + status = await requestDetailProvider.updateActivitySparePart(); + } + if (status == 200) { + await requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!); + //this is for hide the dialoge... + Navigator.pop(context); + Navigator.pop(context); + } else { + Navigator.pop(context); + } + }, + )), + ], ), - ); + )); }), ); } diff --git a/lib/views/widgets/images/files_list.dart b/lib/views/widgets/images/files_list.dart index 427e8c8f..41679d07 100644 --- a/lib/views/widgets/images/files_list.dart +++ b/lib/views/widgets/images/files_list.dart @@ -18,7 +18,7 @@ class FilesList extends StatelessWidget { @override Widget build(BuildContext context) { return GridView.builder( - padding: const EdgeInsets.only(top: 16, bottom: 16), + padding: const EdgeInsets.only(top: 8, bottom: 8), physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 6, mainAxisSpacing: 8, crossAxisSpacing: 8),