From 3299c0c7a4a1e50d8fd8a323edd29b994e4b8709 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Sun, 5 Nov 2023 08:41:05 +0300 Subject: [PATCH] Working on ppm --- .../api/regular_visits_provider.dart | 5 +- lib/extensions/string_extensions.dart | 8 +- lib/l10n/app_ar.arb | 4 +- lib/l10n/app_en.arb | 5 +- lib/views/app_style/colors.dart | 1 + lib/views/pages/user/land_page.dart | 57 ++-- .../work_order/work_order_details_page.dart | 9 +- .../visits/pantry/future_edit_pently.dart | 4 +- .../user/visits/regular_visits_page.dart | 301 ++++++++++-------- .../pages/user/visits/visit_details.dart | 210 ++++-------- lib/views/widgets/visits/visit_item.dart | 227 +++++-------- lib/views/widgets/visits/visits_list.dart | 155 ++++----- 12 files changed, 426 insertions(+), 560 deletions(-) diff --git a/lib/controllers/providers/api/regular_visits_provider.dart b/lib/controllers/providers/api/regular_visits_provider.dart index 7209c08a..4fae99fa 100644 --- a/lib/controllers/providers/api/regular_visits_provider.dart +++ b/lib/controllers/providers/api/regular_visits_provider.dart @@ -134,10 +134,9 @@ class RegularVisitsProvider extends ChangeNotifier { } } - Future getPently({String host, User user, int id}) async { + Future getPentry({String host, User user, int id}) async { Response response; - response = await get(Uri.parse("$host${URLs.getPentry}/$id"), headers: {"Content-Type": "application/json; charset=utf-8"}); - + response = await ApiManager.instance.get("${URLs.getPentry}/$id"); Pentry pantry; if (response.statusCode >= 200 && response.statusCode < 300) { pantry = Pentry.fromMap(json.decode(utf8.decode(response.bodyBytes))); diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index d0e7904f..6c1a9a7d 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -7,7 +7,11 @@ extension StringExtensions on String { } String get toServiceRequestDetailsFormat { - DateTime dateTime = DateTime.tryParse(this); - return "${DateFormat('dd MMM, yyyy').format(dateTime)} ${DateFormat('hh:mm a').format(dateTime)}"; + try { + DateTime dateTime = DateTime.tryParse(this); + return "${DateFormat('dd MMM, yyyy').format(dateTime)} ${DateFormat('hh:mm a').format(dateTime)}"; + } catch (e) { + return "null"; + } } } diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index 68235356..9523a7d9 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -304,5 +304,7 @@ "partNo" : "الجزء رقم", "engSign" : "توقيع المهندس", "requesterName" : "اسم الطالب", - "updateWorkOrder" : "تعديل طلب العمل" + "updateWorkOrder" : "تعديل طلب العمل", + "createPreventiveMaintenanceRequest" : "إنشاء طلب صيانة وقائية", + "createNewRequest" : "إنشاء طلب جديد" } \ No newline at end of file diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index de54e1d8..d76461ad 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -308,6 +308,7 @@ "partNo" : "Part No.", "engSign" : "Engineer Signature", "requesterName" : "Requester Name", - "updateWorkOrder" : "Update Work Order" - + "updateWorkOrder" : "Update Work Order", + "createPreventiveMaintenanceRequest" : "Create Preventive Maintenance Request", + "createNewRequest" : "Create New Request" } \ No newline at end of file diff --git a/lib/views/app_style/colors.dart b/lib/views/app_style/colors.dart index 6afd9b6b..02759ffd 100644 --- a/lib/views/app_style/colors.dart +++ b/lib/views/app_style/colors.dart @@ -112,6 +112,7 @@ class AColors { return AColors.statusDefault; } } + static Color getPriorityStatusColor(int id) { switch (id) { case 81: diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index 9f00f6b3..3afdd1a5 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -25,6 +25,7 @@ import 'package:test_sa/views/widgets/dialogs/dialog.dart'; import 'package:test_sa/views/widgets/drawer/drawer_item.dart'; import 'package:url_launcher/url_launcher.dart'; +import '../../../models/enums/user_types.dart'; import '../../widgets/land_page/land_page_item.dart'; import '../device_transfer/request_device_transfer.dart'; import 'requests/requests_page.dart'; @@ -147,16 +148,15 @@ class _LandPageState extends State { mainAxisSpacing: 12, childAspectRatio: 1, children: [ - /// todo [zaid] : enable this condition when the nurse account works - // if (_userProvider.user != null && _userProvider.user.type == UsersTypes.normal_user) - LandPageItem( - // text: _subtitle.newServiceRequest, - text: "New Service Request", - icon: FontAwesomeIcons.screwdriverWrench, - onPressed: () { - Navigator.of(context).pushNamed(CreateServiceRequestPage.id); - }, - ), + if (_userProvider.user != null && _userProvider.user.type == UsersTypes.normal_user) + LandPageItem( + // text: _subtitle.newServiceRequest, + text: "New Service Request", + icon: FontAwesomeIcons.screwdriverWrench, + onPressed: () { + Navigator.of(context).pushNamed(CreateServiceRequestPage.id); + }, + ), LandPageItem( // text: _subtitle.trackServiceRequest, text: "Track Service Request", @@ -182,16 +182,15 @@ class _LandPageState extends State { // Navigator.of(context).pushNamed(PreventiveMaintenanceVisitsPage.id); // }, // ), - /// todo [zaid] : enable this condition when the nurse account works - // if (_userProvider?.user != null && _userProvider?.user?.type != UsersTypes.engineer) - LandPageItem( - text: "Request Gas Refill", - icon: FontAwesomeIcons.truckFast, - onPressed: () { - // Navigator.of(context).pushNamed(RequestGasRefill.id); - Navigator.of(context).pushNamed(NewGasRefillRequestPage.routeName); - }, - ), + if (_userProvider?.user != null && _userProvider?.user?.type != UsersTypes.engineer) + LandPageItem( + text: "Request Gas Refill", + icon: FontAwesomeIcons.truckFast, + onPressed: () { + // Navigator.of(context).pushNamed(RequestGasRefill.id); + Navigator.of(context).pushNamed(NewGasRefillRequestPage.routeName); + }, + ), LandPageItem( text: "Track Gas Refill", icon: Icons.content_paste_search, @@ -213,16 +212,14 @@ class _LandPageState extends State { Navigator.of(context).pushNamed(TrackDeviceTransferPage.id); }, ), - - /// 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", - svgPath: "assets/images/sub_workorder_icon.svg", - onPressed: () { - Navigator.of(context).pushNamed(SearchSubWorkOrderPage.id); - }, - ), + if (_userProvider?.user != null && _userProvider?.user?.type != UsersTypes.normal_user) + LandPageItem( + text: "Create Sub Work Order", + svgPath: "assets/images/sub_workorder_icon.svg", + onPressed: () { + Navigator.of(context).pushNamed(SearchSubWorkOrderPage.id); + }, + ), ], ), ], diff --git a/lib/views/pages/user/requests/work_order/work_order_details_page.dart b/lib/views/pages/user/requests/work_order/work_order_details_page.dart index cd9d9ab1..195b6c00 100644 --- a/lib/views/pages/user/requests/work_order/work_order_details_page.dart +++ b/lib/views/pages/user/requests/work_order/work_order_details_page.dart @@ -14,7 +14,6 @@ import '../../../../../controllers/providers/api/user_provider.dart'; import '../../../../../models/enums/user_types.dart'; import '../../../../../models/service_request/search_work_order.dart'; import '../../../../widgets/requests/request_status.dart'; -import 'update_service_report.dart'; class WorkOrderDetailsPage extends StatelessWidget { static const String id = "/work_order_details_page"; @@ -70,17 +69,13 @@ class WorkOrderDetailsPage extends StatelessWidget { Text('${context.translation.site}: ${workOrder.callRequest.asset.site.custName ?? ""}', style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575))), Text('${"Call last Situation"}: ${workOrder.calllastSituation.name ?? '' ?? ""}', style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575))), ], - ).paddingAll(16).onPress(() { - // onPressed(request); - }), + ).paddingAll(16), ), ).expanded, if (userProvider.user.type == UsersTypes.engineer && serviceRequest.statusValue != 5 && serviceRequest.statusValue != 3) AppFilledButton( onPressed: () { - Navigator.of(context).push( - MaterialPageRoute(builder: (_) => UpdateServiceReport(request: serviceRequest, workOrder: workOrder)), - ); + Navigator.of(context).push(MaterialPageRoute(builder: (_) => Container())); }, label: context.translation.updateRequest, ).paddingAll(16), diff --git a/lib/views/pages/user/visits/pantry/future_edit_pently.dart b/lib/views/pages/user/visits/pantry/future_edit_pently.dart index dca08d02..8343904c 100644 --- a/lib/views/pages/user/visits/pantry/future_edit_pently.dart +++ b/lib/views/pages/user/visits/pantry/future_edit_pently.dart @@ -1,12 +1,10 @@ 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/regular_visits_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/extensions/context_extension.dart'; import 'package:test_sa/models/pantry/pentry.dart'; -import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/views/pages/user/visits/pantry/edit_pentry.dart'; import 'package:test_sa/views/widgets/loaders/app_loading.dart'; @@ -32,7 +30,7 @@ class _FutureEditPentryState extends State { return Scaffold( body: FutureBuilder( - future: RegularVisitsProvider().getPently(user: _userProvider.user, host: _settingProvider.host, id: widget.visit.id), + future: RegularVisitsProvider().getPentry(user: _userProvider.user, host: _settingProvider.host, id: widget.visit.id), builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasError) { return FailedLoading( diff --git a/lib/views/pages/user/visits/regular_visits_page.dart b/lib/views/pages/user/visits/regular_visits_page.dart index 628dd099..0a9edb13 100644 --- a/lib/views/pages/user/visits/regular_visits_page.dart +++ b/lib/views/pages/user/visits/regular_visits_page.dart @@ -3,21 +3,14 @@ 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/regular_visits_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/extensions/context_extension.dart'; -import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/visits/visits_group.dart'; -import 'package:test_sa/models/visits/visits_search.dart'; -import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/views/pages/user/visits/update_visits_group_sheet.dart'; -import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; -import 'package:test_sa/views/widgets/buttons/app_button.dart'; -import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/search/visits_search_bar.dart'; import 'package:test_sa/views/widgets/visits/visits_list.dart'; class RegularVisitsPage extends StatefulWidget { @@ -40,6 +33,7 @@ class _RegularVisitsPageState extends State with TickerProvid _userProvider = Provider.of(context); return Scaffold( + appBar: DefaultAppBar(title: context.translation.preventiveMaintenance), body: SafeArea( child: LoadingManager( isLoading: _visitsProvider.isLoading, @@ -53,128 +47,177 @@ class _RegularVisitsPageState extends State with TickerProvid host: _settingProvider.host, ); }, - child: Stack( - children: [ - Column( - children: [ - Container( - color: AColors.primaryColor, - padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), - child: Column( - children: [ - Row( - children: [ - ABackButton(), - Expanded( - child: Center( - child: Text( - context.translation.preventiveMaintenance, - style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), - ), - ), - ), - AnimatedSwitcher( - duration: Duration(milliseconds: 400), - child: AIconButton( - key: ValueKey(_expandedSearch), - iconData: _expandedSearch ? Icons.keyboard_arrow_up : Icons.search, - color: AColors.secondaryColor, - buttonSize: 42, - backgroundColor: AColors.white, - onPressed: () async { - VisitsSearch _temp = await showModalBottomSheet( - context: context, - isScrollControlled: true, - builder: (context) { - return VisitsSearchDialog( - initialSearchValue: _visitsProvider.visitsSearch, - ); - }); - if (_temp != null) { - _visitsProvider.visitsSearch.fromSearch(_temp); - _visitsProvider.reset(); - setState(() {}); - } - }, - ), - ), - SizedBox( - width: 16, - ) - ], - ), - ], - ), - ), - Visibility( - visible: (_visitsProvider.visitsSearch.toMap()..remove("mostRecent")).isNotEmpty, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: AButton( - text: context.translation.clearSearch, - onPressed: () { - _visitsProvider.visitsSearch = VisitsSearch(); - _visitsProvider.reset(); - setState(() {}); - }, - ), - ), - ), - Expanded( - child: VisitsList( - nextPage: _visitsProvider.nextPage, - onLazyLoad: () async { - await _visitsProvider.getVisits( - user: _userProvider.user, - host: _settingProvider.host, - ); - }, - onEditGroup: (visits) async { - VisitsGroup _group = await showModalBottomSheet( - isScrollControlled: true, - context: context, - builder: (context) { - return UpdateVisitsGroupSheet( - visits: visits, - title: context.translation.updateRegularVisits, - ); - }, - ) as VisitsGroup; - if (_group != null) { - showDialog( - context: context, - barrierDismissible: false, - builder: (BuildContext context) { - return CupertinoAlertDialog( - title: Text(context.translation.updatingDots), - content: Center(child: CircularProgressIndicator()), - ); - }, - ); - int status = await _visitsProvider.updateGroupOfVisits(user: _userProvider.user, host: _settingProvider.host, group: _group); - Navigator.of(context).pop(); - if (status >= 200 && status < 300) { - Fluttertoast.showToast( - msg: context.translation.preventiveMaintenanceUpdatedSuccessfully, - toastLength: Toast.LENGTH_LONG, - gravity: ToastGravity.BOTTOM, - ); - } else { - Fluttertoast.showToast( - msg: HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation), - toastLength: Toast.LENGTH_LONG, - gravity: ToastGravity.BOTTOM, - ); - } - } - }, - visits: _visitsProvider.visits, - ), - ), - ], - ), - ], + child: VisitsList( + nextPage: _visitsProvider.nextPage, + onLazyLoad: () async { + await _visitsProvider.getVisits( + user: _userProvider.user, + host: _settingProvider.host, + ); + }, + onEditGroup: (visits) async { + VisitsGroup group = await showModalBottomSheet( + isScrollControlled: true, + context: context, + builder: (context) { + return UpdateVisitsGroupSheet( + visits: visits, + title: context.translation.updateRegularVisits, + ); + }, + ) as VisitsGroup; + if (group != null) { + showDialog( + context: context, + barrierDismissible: false, + builder: (BuildContext context) { + return CupertinoAlertDialog( + title: Text(context.translation.updatingDots), + content: Center(child: CircularProgressIndicator()), + ); + }, + ); + int status = await _visitsProvider.updateGroupOfVisits(user: _userProvider.user, host: _settingProvider.host, group: group); + Navigator.of(context).pop(); + if (status >= 200 && status < 300) { + Fluttertoast.showToast( + msg: context.translation.preventiveMaintenanceUpdatedSuccessfully, + toastLength: Toast.LENGTH_LONG, + gravity: ToastGravity.BOTTOM, + ); + } else { + Fluttertoast.showToast( + msg: HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation), + toastLength: Toast.LENGTH_LONG, + gravity: ToastGravity.BOTTOM, + ); + } + } + }, + visits: _visitsProvider.visits, ), + // child: Stack( + // children: [ + // Column( + // children: [ + // Container( + // color: AColors.primaryColor, + // padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), + // child: Column( + // children: [ + // Row( + // children: [ + // ABackButton(), + // Expanded( + // child: Center( + // child: Text( + // context.translation.preventiveMaintenance, + // style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), + // ), + // ), + // ), + // AnimatedSwitcher( + // duration: Duration(milliseconds: 400), + // child: AIconButton( + // key: ValueKey(_expandedSearch), + // iconData: _expandedSearch ? Icons.keyboard_arrow_up : Icons.search, + // color: AColors.secondaryColor, + // buttonSize: 42, + // backgroundColor: AColors.white, + // onPressed: () async { + // VisitsSearch _temp = await showModalBottomSheet( + // context: context, + // isScrollControlled: true, + // builder: (context) { + // return VisitsSearchDialog( + // initialSearchValue: _visitsProvider.visitsSearch, + // ); + // }); + // if (_temp != null) { + // _visitsProvider.visitsSearch.fromSearch(_temp); + // _visitsProvider.reset(); + // setState(() {}); + // } + // }, + // ), + // ), + // SizedBox( + // width: 16, + // ) + // ], + // ), + // ], + // ), + // ), + // Visibility( + // visible: (_visitsProvider.visitsSearch.toMap()..remove("mostRecent")).isNotEmpty, + // child: Padding( + // padding: const EdgeInsets.all(8.0), + // child: AButton( + // text: context.translation.clearSearch, + // onPressed: () { + // _visitsProvider.visitsSearch = VisitsSearch(); + // _visitsProvider.reset(); + // setState(() {}); + // }, + // ), + // ), + // ), + // Expanded( + // child: VisitsList( + // nextPage: _visitsProvider.nextPage, + // onLazyLoad: () async { + // await _visitsProvider.getVisits( + // user: _userProvider.user, + // host: _settingProvider.host, + // ); + // }, + // onEditGroup: (visits) async { + // VisitsGroup _group = await showModalBottomSheet( + // isScrollControlled: true, + // context: context, + // builder: (context) { + // return UpdateVisitsGroupSheet( + // visits: visits, + // title: context.translation.updateRegularVisits, + // ); + // }, + // ) as VisitsGroup; + // if (_group != null) { + // showDialog( + // context: context, + // barrierDismissible: false, + // builder: (BuildContext context) { + // return CupertinoAlertDialog( + // title: Text(context.translation.updatingDots), + // content: Center(child: CircularProgressIndicator()), + // ); + // }, + // ); + // int status = await _visitsProvider.updateGroupOfVisits(user: _userProvider.user, host: _settingProvider.host, group: _group); + // Navigator.of(context).pop(); + // if (status >= 200 && status < 300) { + // Fluttertoast.showToast( + // msg: context.translation.preventiveMaintenanceUpdatedSuccessfully, + // toastLength: Toast.LENGTH_LONG, + // gravity: ToastGravity.BOTTOM, + // ); + // } else { + // Fluttertoast.showToast( + // msg: HttpStatusManger.getStatusMessage(status: status, subtitle: context.translation), + // toastLength: Toast.LENGTH_LONG, + // gravity: ToastGravity.BOTTOM, + // ); + // } + // } + // }, + // visits: _visitsProvider.visits, + // ), + // ), + // ], + // ), + // ], + // ), ), ), ); diff --git a/lib/views/pages/user/visits/visit_details.dart b/lib/views/pages/user/visits/visit_details.dart index 6b9499da..4a53c0f9 100644 --- a/lib/views/pages/user/visits/visit_details.dart +++ b/lib/views/pages/user/visits/visit_details.dart @@ -1,22 +1,19 @@ 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/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/visits/visit.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/user/visits/pantry/edit_pentry.dart'; -import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; -import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; -import 'package:test_sa/views/widgets/images/files_list.dart'; -import 'package:test_sa/views/widgets/images/images_list.dart'; -import 'package:test_sa/views/widgets/requests/info_row.dart'; -import 'package:test_sa/views/widgets/visits/visit_status.dart'; +import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; +import 'package:test_sa/views/pages/user/visits/pantry/future_edit_pently.dart'; import '../../../../controllers/providers/api/user_provider.dart'; import '../../../../models/enums/user_types.dart'; -import '../../../widgets/loaders/image_loader.dart'; +import '../../../../new_views/common_widgets/app_filled_button.dart'; +import '../../../app_style/colors.dart'; +import '../../../widgets/requests/request_status.dart'; class VisitDetailsPage extends StatelessWidget { static const String id = "/visit-details"; @@ -29,149 +26,64 @@ class VisitDetailsPage extends StatelessWidget { UserProvider userProvider = Provider.of(context); return Scaffold( + appBar: DefaultAppBar(title: context.translation.preventiveMaintenance), body: SafeArea( child: Column( children: [ - Container( - color: AColors.primaryColor, - padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), - child: Row( - children: [ - const ABackButton(), - Expanded( - child: Center( - child: Text( - context.translation.visitInformation, - style: Theme.of(context).textTheme.titleLarge.copyWith(color: AColors.white, fontStyle: FontStyle.italic), - ), - ), - ), - if (userProvider?.user?.type == UsersTypes.engineer) - AIconButton( - iconData: Icons.edit, - color: AColors.white, - buttonSize: 42, - backgroundColor: AColors.green, - onPressed: visit?.status?.name == "Closed" || visit?.status?.name == "Complete" - ? null - : () async { - Navigator.of(context).push( - MaterialPageRoute( - builder: (_) => EditPentry( - visit: visit, - pentry: visit.pentry, - ), - ), - ); - }, - ), - const SizedBox(width: 42) - ], - ), - ), - Expanded( - child: ListView( - padding: const EdgeInsets.symmetric(horizontal: 16), - children: [ - const SizedBox(height: 8), - // MaterialButton( - // padding: EdgeInsets.zero, - // onPressed: () { - // if ((visit.images?.isNotEmpty ?? false) && (visit.images?.first?.isNotEmpty ?? false)) { - // Navigator.of(context).push( - // MaterialPageRoute( - // builder: (_) => Scaffold( - // body: InteractiveViewer( - // child: Center( - // child: ImageLoader( - // url: visit.images.first, - // boxFit: BoxFit.contain, - // ), - // ), - // ), - // ), - // ), - // ); - // } - // }, - // child: SizedBox( - // height: 140 * AppStyle.getScaleFactor(context), - // width: MediaQuery.of(context).size.width, - // child: ImageLoader( - // url: visit.images.isEmpty ? " " : visit.images.first, - // boxFit: BoxFit.cover, - // ), - // ), - // ), - // const SizedBox( - // height: 8, - // ), - if (visit?.images?.isNotEmpty ?? false) - SizedBox( - height: 60 * AppStyle.getScaleFactor(context), - child: FilesList( - images: visit.images, - ), - ).paddingOnly(top: 4, bottom: 4), - const SizedBox( - height: 8, - ), - RequestInfoRow( - title: context.translation.code, - info: visit.serialNumber, - ), - RequestInfoRow( - title: "Asset Number", - info: visit.deviceNumber, - ), - RequestInfoRow( - title: context.translation.deviceName, - content: visit.deviceEnglishName, - ), - RequestInfoRow( - title: context.translation.deviceSN, - info: visit.deviceSerialNumber, - ), - RequestInfoRow( - title: context.translation.expectDate, - info: visit.expectDate, - ), - RequestInfoRow( - title: context.translation.actualDate, - info: visit.actualDate, - ), - Row( - children: [ - Expanded( - child: Text( - "${context.translation.status} : ", - style: Theme.of(context).textTheme.titleMedium.copyWith(fontWeight: FontWeight.bold), - textScaleFactor: AppStyle.getScaleFactor(context), + SingleChildScrollView( + child: Container( + margin: const EdgeInsets.all(16), + width: double.infinity, + decoration: ShapeDecoration( + color: Colors.white, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), + shadows: const [BoxShadow(color: Color(0x07000000), blurRadius: 14, offset: Offset(0, 0), spreadRadius: 0)], + ), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + // StatusLabel( + // label: visit.priority.name, + // id: visit.priority.id, + // textColor: AColors.getPriorityStatusTextColor(visit.priority.id), + // backgroundColor: AColors.getPriorityStatusColor(visit.priority.id)), + // 8.width, + StatusLabel( + label: visit.status.name, + id: visit.status.id, + textColor: AColors.getRequestStatusTextColor(visit.status.value), + backgroundColor: AColors.getRequestStatusColor(visit.status.value), ), - ), - VisitStatusLabel( - visit: visit, - ), - ], - ), - Divider( - color: Theme.of(context).primaryColor, - ), - RequestInfoRow( - title: context.translation.contactStatus, - info: visit.assignTo, - ), - RequestInfoRow( - title: context.translation.engineerName, - info: visit.employName, - ), - RequestInfoRow( - title: context.translation.hospital, - content: visit.hospitalName, - ), - ], + 1.width.expanded, + ], + ), + 8.height, + Text(visit.deviceEnglishName, style: AppTextStyles.heading5.copyWith(color: const Color(0xFF3B3D4A))), + 8.height, + Text('${context.translation.assetNumber}: ${visit.deviceNumber}', style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575))), + Text('Asset Serial No.: ${visit.deviceSerialNumber}', style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575))), + Text('Code: ${visit.serialNumber}', style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575))), + const Divider().defaultStyle(context), + Text('Expected Date: ${visit.expectDate?.toServiceRequestDetailsFormat}', style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575))), + Text('Actual Date: ${visit.actualDate?.toServiceRequestDetailsFormat}', style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575))), + const Divider().defaultStyle(context), + Text('Assigned to: ${visit.assignTo}', style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575))), + Text('Engineer Name: ${visit.employName}', style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575))), + Text('Site: ${visit.hospitalName}', style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575))), + ], + ).paddingAll(16), ), - ), + ).expanded, + if (userProvider.user.type == UsersTypes.engineer && visit.status.value != 5 && visit.status.value != 3) + AppFilledButton( + onPressed: () { + Navigator.of(context).push(MaterialPageRoute(builder: (_) => FutureEditPentry(visit: visit))); + }, + label: context.translation.updateRequest, + ).paddingAll(16), ], ), ), diff --git a/lib/views/widgets/visits/visit_item.dart b/lib/views/widgets/visits/visit_item.dart index b4546039..6defea31 100644 --- a/lib/views/widgets/visits/visit_item.dart +++ b/lib/views/widgets/visits/visit_item.dart @@ -1,171 +1,100 @@ 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/extensions/int_extensions.dart'; +import 'package:test_sa/extensions/string_extensions.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/enums/user_types.dart'; -import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/visits/visit.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/visits/visit_status.dart'; +import 'package:test_sa/views/pages/user/visits/visit_details.dart'; + +import '../../../controllers/providers/api/user_provider.dart'; +import '../../../extensions/text_extensions.dart'; +import '../../app_style/colors.dart'; +import '../../pages/user/visits/pantry/future_edit_pently.dart'; +import '../requests/request_status.dart'; class VisitItem extends StatelessWidget { final Visit visit; - final int index; - final bool isSelected; - final bool activeSelectMod; - final Function(Visit) onPressed; - final Function(Visit) onLongPress; - final Function(Visit) onSelect; - const VisitItem({Key key, this.visit, this.onPressed, this.isSelected = false, this.activeSelectMod = false, this.onLongPress, this.onSelect, this.index}) : super(key: key); + const VisitItem({Key key, this.visit}) : super(key: key); @override Widget build(BuildContext context) { UserProvider userProvider = Provider.of(context); - Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; - Color onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; - - return Padding( - padding: const EdgeInsets.symmetric(vertical: 4), - child: ElevatedButton( - style: ElevatedButton.styleFrom( - padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 8), - backgroundColor: itemColor, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), - ), - ), - onPressed: () { - if (activeSelectMod && userProvider.user.type == UsersTypes.engineer) { - onSelect(visit); - } else { - onPressed(visit); - } - }, - onLongPress: userProvider.user.type == UsersTypes.engineer - ? () { - onLongPress(visit); - } - : null, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Expanded( - child: Text( - "S.N: ${visit.deviceSerialNumber}" ?? "No serial number", - style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 16, fontWeight: FontWeight.bold), - ), - ), - AnimatedSwitcher( - duration: const Duration(milliseconds: 400), - child: Visibility( - key: ValueKey(activeSelectMod), - visible: activeSelectMod, - child: SizedBox( - height: 18, - child: Checkbox( - activeColor: Colors.black38, - value: isSelected, - onChanged: (value) { - onSelect(visit); - }), - ), - ), - ), - VisitStatusLabel( - visit: visit, - ) - ], - ), - Divider( - color: onItemColor, - ), - Text( - visit.deviceNumber ?? "", - style: Theme.of(context).textTheme.titleMedium.copyWith(color: onItemColor, fontSize: 14), - ), - Divider( - color: onItemColor, - ), - Row( - children: [ - Expanded( - child: Text( - visit.hospitalName ?? "No client found", - style: Theme.of(context).textTheme.titleMedium.copyWith( - color: onItemColor, - fontSize: 14, - ), - ), - ), - ], - ), - Text( - visit.modelAndBrand ?? "", - style: Theme.of(context).textTheme.titleMedium.copyWith( - color: onItemColor, - fontSize: 14, - ), - ), - if (visit.employName != null && visit.employName.isNotEmpty) Divider(color: onItemColor), - if (visit.employName != null && visit.employName.isNotEmpty) + return Container( + decoration: ShapeDecoration( + color: Colors.white, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), + shadows: const [BoxShadow(color: Color(0x07000000), blurRadius: 14, offset: Offset(0, 0), spreadRadius: 0)], + ), + padding: const EdgeInsets.all(16), + margin: EdgeInsets.only(bottom: 8.toScreenHeight), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ Row( children: [ - Expanded( - child: Text( - visit.employName ?? "No employ found", - style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14, fontWeight: FontWeight.bold), - ), + // StatusLabel( + // label: visit.priority.name, + // id: visit.priority.id, + // textColor: AColors.getPriorityStatusTextColor(visit.priority.id), + // backgroundColor: AColors.getPriorityStatusColor(visit.priority.id)), + // 8.width, + StatusLabel( + label: visit.status.name, + id: visit.status.id, + textColor: AColors.getRequestStatusTextColor(visit.status.value), + backgroundColor: AColors.getRequestStatusColor(visit.status.value), ), - // Text( - // visit.contactStatus ?? "", - // style: Theme.of(context).textTheme.subtitle1.copyWith( - // color: onItemColor, - // fontSize: 14, - // ), - // ), + 1.width.expanded, ], ), - Divider( - color: onItemColor, - ), - Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - context.translation.expectDate, - style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14), - ), - Text( - visit.expectDate ?? context.translation.noDateFound, - style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14), - ), - ], + 8.height, + Text(visit.deviceEnglishName, style: AppTextStyles.heading5.copyWith(color: const Color(0xFF3B3D4A))), + 8.height, + Text( + '${context.translation.assetNumber}: ${visit.deviceNumber}', + style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575)), + ), + Text( + 'Asset Serial No.: ${visit.deviceSerialNumber}', + style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575)), + ), + Text( + 'Code: ${visit.serialNumber}', + style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575)), + ), + 16.height, + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'View Details', + style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF4A8DB7)), ), - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - context.translation.actualDate, - style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14), - ), - Text( - visit.actualDate ?? context.translation.noDateFound, - style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14), - ), - ], - ), - ], - ), - ], - ), + 4.width, + const Icon(Icons.arrow_forward, color: Color(0xFF4A8DB7), size: 14) + ], + ).onPress(() { + Navigator.of(context).push(MaterialPageRoute(builder: (_) => VisitDetailsPage(visit: visit))); + }), + ], + ).expanded, + 8.width, + Column( + children: [ + if (userProvider.user.type == UsersTypes.engineer && visit.status.value != 5 && visit.status.value != 3) + "edit".toSvgAsset(height: 48, width: 48).onPress(() { + Navigator.of(context).push(MaterialPageRoute(builder: (_) => FutureEditPentry(visit: visit))); + }), + Text(visit.createdOn != null ? visit.createdOn.toServiceRequestCardFormat : "", textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: const Color(0xFF3B3D4A))), + ], + ) + ], ), ); } diff --git a/lib/views/widgets/visits/visits_list.dart b/lib/views/widgets/visits/visits_list.dart index 0fd150be..280dc1ee 100644 --- a/lib/views/widgets/visits/visits_list.dart +++ b/lib/views/widgets/visits/visits_list.dart @@ -1,14 +1,16 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; -import 'package:test_sa/models/subtitle.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/visits/visit.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/pages/user/visits/visit_details.dart'; +import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import 'package:test_sa/views/widgets/visits/visit_item.dart'; +import '../../../controllers/providers/api/user_provider.dart'; +import '../../../models/enums/user_types.dart'; + class VisitsList extends StatefulWidget { final List visits; final bool nextPage; @@ -32,92 +34,75 @@ class _VisitsListState extends State { @override Widget build(BuildContext context) { + UserProvider userProvider = Provider.of(context); if (widget.visits.isEmpty) { - return NoItemFound( - message: context.translation.noVisitsFound, - ); + return NoItemFound(message: context.translation.noVisitsFound); } return Stack( children: [ - LazyLoading( - nextPage: widget.nextPage, - onLazyLoad: widget.onLazyLoad, - child: ListView.builder( - //physics: BouncingScrollPhysics(), - itemCount: widget.visits.length, - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), - itemBuilder: (context, itemIndex) { - Visit visit = widget.visits[itemIndex]; - bool isSelected = _selectedVisits.contains(visit); - return VisitItem( - visit: visit, - isSelected: isSelected, - index: itemIndex, - activeSelectMod: _selectedVisits.isNotEmpty, - onPressed: (visit) { - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => VisitDetailsPage( - visit: visit, - ))); - }, - onSelect: (visit) { - if (isSelected) { - _selectedVisits.remove(visit); - } else { - _selectedVisits.add(visit); - } - setState(() {}); - }, - onLongPress: (visit) { - if (isSelected) { - _selectedVisits.remove(visit); - } else { - _selectedVisits.add(visit); - } - setState(() {}); - }, - ); - }), - ), - Align( - alignment: Alignment.bottomLeft, - child: Padding( - padding: EdgeInsets.all(8.0 * AppStyle.getScaleFactor(context)), - child: AnimatedSwitcher( - duration: const Duration(milliseconds: 400), - child: Visibility( - key: ValueKey(_selectedVisits.isNotEmpty), - visible: _selectedVisits.isNotEmpty, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - FloatingActionButton( - heroTag: "cancel", - child: const Icon(Icons.cancel), - onPressed: () { - _selectedVisits.clear(); - setState(() {}); - }, - ), - FloatingActionButton( - heroTag: "edit", - child: const Icon(Icons.edit), - onPressed: () { - if (!widget.visits.contains(_selectedVisits.first)) { - _selectedVisits.clear(); - setState(() {}); - return; - } - widget.onEditGroup(_selectedVisits); - //_selectedVisits.clear(); - }, - ), - ], - ), + Column( + children: [ + LazyLoading( + nextPage: widget.nextPage, + onLazyLoad: widget.onLazyLoad, + child: ListView.builder( + itemCount: widget.visits.length, + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + itemBuilder: (context, itemIndex) { + Visit visit = widget.visits[itemIndex]; + // bool isSelected = _selectedVisits.contains(visit); + return VisitItem(visit: visit); + }, ), - ), - ), - ) + ).expanded, + if (userProvider.user.type == UsersTypes.normal_user) + AppFilledButton( + onPressed: () { + Navigator.push(context, MaterialPageRoute(builder: (context) => Container())); + }, + label: context.translation.createNewRequest, + ).paddingAll(16), + ], + ), + // Align( + // alignment: Alignment.bottomLeft, + // child: Padding( + // padding: EdgeInsets.all(8.0 * AppStyle.getScaleFactor(context)), + // child: AnimatedSwitcher( + // duration: const Duration(milliseconds: 400), + // child: Visibility( + // key: ValueKey(_selectedVisits.isNotEmpty), + // visible: _selectedVisits.isNotEmpty, + // child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // children: [ + // FloatingActionButton( + // heroTag: "cancel", + // child: const Icon(Icons.cancel), + // onPressed: () { + // _selectedVisits.clear(); + // setState(() {}); + // }, + // ), + // FloatingActionButton( + // heroTag: "edit", + // child: const Icon(Icons.edit), + // onPressed: () { + // if (!widget.visits.contains(_selectedVisits.first)) { + // _selectedVisits.clear(); + // setState(() {}); + // return; + // } + // widget.onEditGroup(_selectedVisits); + // //_selectedVisits.clear(); + // }, + // ), + // ], + // ), + // ), + // ), + // ), + // ) ], ); }