Working on ppm

design_3.0_demo_module
zaid_daoud 2 years ago
parent 3c91abf47d
commit 3299c0c7a4

@ -134,10 +134,9 @@ class RegularVisitsProvider extends ChangeNotifier {
} }
} }
Future<Pentry> getPently({String host, User user, int id}) async { Future<Pentry> getPentry({String host, User user, int id}) async {
Response response; 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; Pentry pantry;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
pantry = Pentry.fromMap(json.decode(utf8.decode(response.bodyBytes))); pantry = Pentry.fromMap(json.decode(utf8.decode(response.bodyBytes)));

@ -7,7 +7,11 @@ extension StringExtensions on String {
} }
String get toServiceRequestDetailsFormat { String get toServiceRequestDetailsFormat {
try {
DateTime dateTime = DateTime.tryParse(this); DateTime dateTime = DateTime.tryParse(this);
return "${DateFormat('dd MMM, yyyy').format(dateTime)} ${DateFormat('hh:mm a').format(dateTime)}"; return "${DateFormat('dd MMM, yyyy').format(dateTime)} ${DateFormat('hh:mm a').format(dateTime)}";
} catch (e) {
return "null";
}
} }
} }

@ -304,5 +304,7 @@
"partNo" : "الجزء رقم", "partNo" : "الجزء رقم",
"engSign" : "توقيع المهندس", "engSign" : "توقيع المهندس",
"requesterName" : "اسم الطالب", "requesterName" : "اسم الطالب",
"updateWorkOrder" : "تعديل طلب العمل" "updateWorkOrder" : "تعديل طلب العمل",
"createPreventiveMaintenanceRequest" : "إنشاء طلب صيانة وقائية",
"createNewRequest" : "إنشاء طلب جديد"
} }

@ -308,6 +308,7 @@
"partNo" : "Part No.", "partNo" : "Part No.",
"engSign" : "Engineer Signature", "engSign" : "Engineer Signature",
"requesterName" : "Requester Name", "requesterName" : "Requester Name",
"updateWorkOrder" : "Update Work Order" "updateWorkOrder" : "Update Work Order",
"createPreventiveMaintenanceRequest" : "Create Preventive Maintenance Request",
"createNewRequest" : "Create New Request"
} }

@ -112,6 +112,7 @@ class AColors {
return AColors.statusDefault; return AColors.statusDefault;
} }
} }
static Color getPriorityStatusColor(int id) { static Color getPriorityStatusColor(int id) {
switch (id) { switch (id) {
case 81: case 81:

@ -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:test_sa/views/widgets/drawer/drawer_item.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
import '../../../models/enums/user_types.dart';
import '../../widgets/land_page/land_page_item.dart'; import '../../widgets/land_page/land_page_item.dart';
import '../device_transfer/request_device_transfer.dart'; import '../device_transfer/request_device_transfer.dart';
import 'requests/requests_page.dart'; import 'requests/requests_page.dart';
@ -147,8 +148,7 @@ class _LandPageState extends State<LandPage> {
mainAxisSpacing: 12, mainAxisSpacing: 12,
childAspectRatio: 1, childAspectRatio: 1,
children: [ children: [
/// todo [zaid] : enable this condition when the nurse account works if (_userProvider.user != null && _userProvider.user.type == UsersTypes.normal_user)
// if (_userProvider.user != null && _userProvider.user.type == UsersTypes.normal_user)
LandPageItem( LandPageItem(
// text: _subtitle.newServiceRequest, // text: _subtitle.newServiceRequest,
text: "New Service Request", text: "New Service Request",
@ -182,8 +182,7 @@ class _LandPageState extends State<LandPage> {
// Navigator.of(context).pushNamed(PreventiveMaintenanceVisitsPage.id); // 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)
// if (_userProvider?.user != null && _userProvider?.user?.type != UsersTypes.engineer)
LandPageItem( LandPageItem(
text: "Request Gas Refill", text: "Request Gas Refill",
icon: FontAwesomeIcons.truckFast, icon: FontAwesomeIcons.truckFast,
@ -213,9 +212,7 @@ class _LandPageState extends State<LandPage> {
Navigator.of(context).pushNamed(TrackDeviceTransferPage.id); Navigator.of(context).pushNamed(TrackDeviceTransferPage.id);
}, },
), ),
if (_userProvider?.user != null && _userProvider?.user?.type != UsersTypes.normal_user)
/// todo [zaid] : enable this condition when the nurse account works
// if (_userProvider?.user != null && _userProvider?.user?.type != UsersTypes.normal_user)
LandPageItem( LandPageItem(
text: "Create Sub Work Order", text: "Create Sub Work Order",
svgPath: "assets/images/sub_workorder_icon.svg", svgPath: "assets/images/sub_workorder_icon.svg",

@ -14,7 +14,6 @@ import '../../../../../controllers/providers/api/user_provider.dart';
import '../../../../../models/enums/user_types.dart'; import '../../../../../models/enums/user_types.dart';
import '../../../../../models/service_request/search_work_order.dart'; import '../../../../../models/service_request/search_work_order.dart';
import '../../../../widgets/requests/request_status.dart'; import '../../../../widgets/requests/request_status.dart';
import 'update_service_report.dart';
class WorkOrderDetailsPage extends StatelessWidget { class WorkOrderDetailsPage extends StatelessWidget {
static const String id = "/work_order_details_page"; 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('${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))), Text('${"Call last Situation"}: ${workOrder.calllastSituation.name ?? '' ?? ""}', style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575))),
], ],
).paddingAll(16).onPress(() { ).paddingAll(16),
// onPressed(request);
}),
), ),
).expanded, ).expanded,
if (userProvider.user.type == UsersTypes.engineer && serviceRequest.statusValue != 5 && serviceRequest.statusValue != 3) if (userProvider.user.type == UsersTypes.engineer && serviceRequest.statusValue != 5 && serviceRequest.statusValue != 3)
AppFilledButton( AppFilledButton(
onPressed: () { onPressed: () {
Navigator.of(context).push( Navigator.of(context).push(MaterialPageRoute(builder: (_) => Container()));
MaterialPageRoute(builder: (_) => UpdateServiceReport(request: serviceRequest, workOrder: workOrder)),
);
}, },
label: context.translation.updateRequest, label: context.translation.updateRequest,
).paddingAll(16), ).paddingAll(16),

@ -1,12 +1,10 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.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/regular_visits_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/pantry/pentry.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/models/visits/visit.dart';
import 'package:test_sa/views/pages/user/visits/pantry/edit_pentry.dart'; import 'package:test_sa/views/pages/user/visits/pantry/edit_pentry.dart';
import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import 'package:test_sa/views/widgets/loaders/app_loading.dart';
@ -32,7 +30,7 @@ class _FutureEditPentryState extends State<FutureEditPentry> {
return Scaffold( return Scaffold(
body: FutureBuilder<Pentry>( body: FutureBuilder<Pentry>(
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<Pentry> snapshot) { builder: (BuildContext context, AsyncSnapshot<Pentry> snapshot) {
if (snapshot.hasError) { if (snapshot.hasError) {
return FailedLoading( return FailedLoading(

@ -3,21 +3,14 @@ import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/api_routes/http_status_manger.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/regular_visits_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.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_group.dart';
import 'package:test_sa/models/visits/visits_search.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/pages/user/visits/update_visits_group_sheet.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/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'; import 'package:test_sa/views/widgets/visits/visits_list.dart';
class RegularVisitsPage extends StatefulWidget { class RegularVisitsPage extends StatefulWidget {
@ -40,6 +33,7 @@ class _RegularVisitsPageState extends State<RegularVisitsPage> with TickerProvid
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
return Scaffold( return Scaffold(
appBar: DefaultAppBar(title: context.translation.preventiveMaintenance),
body: SafeArea( body: SafeArea(
child: LoadingManager( child: LoadingManager(
isLoading: _visitsProvider.isLoading, isLoading: _visitsProvider.isLoading,
@ -53,74 +47,6 @@ class _RegularVisitsPageState extends State<RegularVisitsPage> with TickerProvid
host: _settingProvider.host, 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( child: VisitsList(
nextPage: _visitsProvider.nextPage, nextPage: _visitsProvider.nextPage,
onLazyLoad: () async { onLazyLoad: () async {
@ -130,7 +56,7 @@ class _RegularVisitsPageState extends State<RegularVisitsPage> with TickerProvid
); );
}, },
onEditGroup: (visits) async { onEditGroup: (visits) async {
VisitsGroup _group = await showModalBottomSheet( VisitsGroup group = await showModalBottomSheet(
isScrollControlled: true, isScrollControlled: true,
context: context, context: context,
builder: (context) { builder: (context) {
@ -140,7 +66,7 @@ class _RegularVisitsPageState extends State<RegularVisitsPage> with TickerProvid
); );
}, },
) as VisitsGroup; ) as VisitsGroup;
if (_group != null) { if (group != null) {
showDialog<void>( showDialog<void>(
context: context, context: context,
barrierDismissible: false, barrierDismissible: false,
@ -151,7 +77,7 @@ class _RegularVisitsPageState extends State<RegularVisitsPage> with TickerProvid
); );
}, },
); );
int status = await _visitsProvider.updateGroupOfVisits(user: _userProvider.user, host: _settingProvider.host, group: _group); int status = await _visitsProvider.updateGroupOfVisits(user: _userProvider.user, host: _settingProvider.host, group: group);
Navigator.of(context).pop(); Navigator.of(context).pop();
if (status >= 200 && status < 300) { if (status >= 200 && status < 300) {
Fluttertoast.showToast( Fluttertoast.showToast(
@ -170,11 +96,128 @@ class _RegularVisitsPageState extends State<RegularVisitsPage> with TickerProvid
}, },
visits: _visitsProvider.visits, 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<void>(
// 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,
// ),
// ),
// ],
// ),
// ],
// ),
), ),
), ),
); );

@ -1,22 +1,19 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.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/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/extensions/widget_extensions.dart';
import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/models/visits/visit.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/app_style/sizing.dart'; import 'package:test_sa/views/pages/user/visits/pantry/future_edit_pently.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 '../../../../controllers/providers/api/user_provider.dart'; import '../../../../controllers/providers/api/user_provider.dart';
import '../../../../models/enums/user_types.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 { class VisitDetailsPage extends StatelessWidget {
static const String id = "/visit-details"; static const String id = "/visit-details";
@ -29,149 +26,64 @@ class VisitDetailsPage extends StatelessWidget {
UserProvider userProvider = Provider.of<UserProvider>(context); UserProvider userProvider = Provider.of<UserProvider>(context);
return Scaffold( return Scaffold(
appBar: DefaultAppBar(title: context.translation.preventiveMaintenance),
body: SafeArea( body: SafeArea(
child: Column( child: Column(
children: [ children: [
Container( SingleChildScrollView(
color: AColors.primaryColor, child: Container(
padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), margin: const EdgeInsets.all(16),
child: Row( width: double.infinity,
children: [ decoration: ShapeDecoration(
const ABackButton(), color: Colors.white,
Expanded( shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
child: Center( shadows: const [BoxShadow(color: Color(0x07000000), blurRadius: 14, offset: Offset(0, 0), spreadRadius: 0)],
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) child: Column(
], mainAxisSize: MainAxisSize.min,
), crossAxisAlignment: CrossAxisAlignment.start,
),
Expanded(
child: ListView(
padding: const EdgeInsets.symmetric(horizontal: 16),
children: [ 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( Row(
children: [ children: [
Expanded( // StatusLabel(
child: Text( // label: visit.priority.name,
"${context.translation.status} : ", // id: visit.priority.id,
style: Theme.of(context).textTheme.titleMedium.copyWith(fontWeight: FontWeight.bold), // textColor: AColors.getPriorityStatusTextColor(visit.priority.id),
textScaleFactor: AppStyle.getScaleFactor(context), // backgroundColor: AColors.getPriorityStatusColor(visit.priority.id)),
), // 8.width,
), StatusLabel(
VisitStatusLabel( label: visit.status.name,
visit: visit, id: visit.status.id,
), textColor: AColors.getRequestStatusTextColor(visit.status.value),
backgroundColor: AColors.getRequestStatusColor(visit.status.value),
),
1.width.expanded,
], ],
), ),
Divider( 8.height,
color: Theme.of(context).primaryColor, Text(visit.deviceEnglishName, style: AppTextStyles.heading5.copyWith(color: const Color(0xFF3B3D4A))),
), 8.height,
RequestInfoRow( Text('${context.translation.assetNumber}: ${visit.deviceNumber}', style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575))),
title: context.translation.contactStatus, Text('Asset Serial No.: ${visit.deviceSerialNumber}', style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575))),
info: visit.assignTo, Text('Code: ${visit.serialNumber}', style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575))),
), const Divider().defaultStyle(context),
RequestInfoRow( Text('Expected Date: ${visit.expectDate?.toServiceRequestDetailsFormat}', style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575))),
title: context.translation.engineerName, Text('Actual Date: ${visit.actualDate?.toServiceRequestDetailsFormat}', style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575))),
info: visit.employName, const Divider().defaultStyle(context),
), Text('Assigned to: ${visit.assignTo}', style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575))),
RequestInfoRow( Text('Engineer Name: ${visit.employName}', style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575))),
title: context.translation.hospital, Text('Site: ${visit.hospitalName}', style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575))),
content: visit.hospitalName,
),
], ],
).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),
], ],
), ),
), ),

@ -1,172 +1,101 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.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/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/enums/user_types.dart';
import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/visits/visit.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/views/widgets/visits/visit_status.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 { class VisitItem extends StatelessWidget {
final Visit visit; 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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
UserProvider userProvider = Provider.of<UserProvider>(context); UserProvider userProvider = Provider.of<UserProvider>(context);
Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; return Container(
Color onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; decoration: ShapeDecoration(
color: Colors.white,
return Padding( shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
padding: const EdgeInsets.symmetric(vertical: 4), shadows: const [BoxShadow(color: Color(0x07000000), blurRadius: 14, offset: Offset(0, 0), spreadRadius: 0)],
child: ElevatedButton( ),
style: ElevatedButton.styleFrom( padding: const EdgeInsets.all(16),
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 8), margin: EdgeInsets.only(bottom: 8.toScreenHeight),
backgroundColor: itemColor, child: Row(
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, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Row( Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [ 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( Row(
children: [ children: [
Expanded( // StatusLabel(
child: Text( // label: visit.priority.name,
visit.hospitalName ?? "No client found", // id: visit.priority.id,
style: Theme.of(context).textTheme.titleMedium.copyWith( // textColor: AColors.getPriorityStatusTextColor(visit.priority.id),
color: onItemColor, // backgroundColor: AColors.getPriorityStatusColor(visit.priority.id)),
fontSize: 14, // 8.width,
), StatusLabel(
), label: visit.status.name,
), id: visit.status.id,
textColor: AColors.getRequestStatusTextColor(visit.status.value),
backgroundColor: AColors.getRequestStatusColor(visit.status.value),
),
1.width.expanded,
], ],
), ),
8.height,
Text(visit.deviceEnglishName, style: AppTextStyles.heading5.copyWith(color: const Color(0xFF3B3D4A))),
8.height,
Text( Text(
visit.modelAndBrand ?? "", '${context.translation.assetNumber}: ${visit.deviceNumber}',
style: Theme.of(context).textTheme.titleMedium.copyWith( style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575)),
color: onItemColor,
fontSize: 14,
),
), ),
if (visit.employName != null && visit.employName.isNotEmpty) Divider(color: onItemColor), Text(
if (visit.employName != null && visit.employName.isNotEmpty) 'Asset Serial No.: ${visit.deviceSerialNumber}',
Row( style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575)),
children: [
Expanded(
child: Text(
visit.employName ?? "No employ found",
style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14, fontWeight: FontWeight.bold),
),
),
// Text(
// visit.contactStatus ?? "",
// style: Theme.of(context).textTheme.subtitle1.copyWith(
// color: onItemColor,
// fontSize: 14,
// ),
// ),
],
), ),
Divider( Text(
color: onItemColor, 'Code: ${visit.serialNumber}',
style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575)),
), ),
16.height,
Row( Row(
mainAxisSize: MainAxisSize.min,
children: [ children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
context.translation.expectDate,
style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14),
),
Text( Text(
visit.expectDate ?? context.translation.noDateFound, 'View Details',
style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14), style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF4A8DB7)),
), ),
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( Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( if (userProvider.user.type == UsersTypes.engineer && visit.status.value != 5 && visit.status.value != 3)
context.translation.actualDate, "edit".toSvgAsset(height: 48, width: 48).onPress(() {
style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14), Navigator.of(context).push(MaterialPageRoute(builder: (_) => FutureEditPentry(visit: visit)));
), }),
Text( Text(visit.createdOn != null ? visit.createdOn.toServiceRequestCardFormat : "", textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: const Color(0xFF3B3D4A))),
visit.actualDate ?? context.translation.noDateFound,
style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14),
),
],
),
], ],
), )
], ],
), ),
),
); );
} }
} }

@ -1,14 +1,16 @@
import 'package:flutter/material.dart'; 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/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/models/visits/visit.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/views/pages/user/visits/visit_details.dart';
import 'package:test_sa/views/widgets/loaders/lazy_loading.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/loaders/no_item_found.dart';
import 'package:test_sa/views/widgets/visits/visit_item.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 { class VisitsList extends StatefulWidget {
final List<Visit> visits; final List<Visit> visits;
final bool nextPage; final bool nextPage;
@ -32,92 +34,75 @@ class _VisitsListState extends State<VisitsList> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
UserProvider userProvider = Provider.of<UserProvider>(context);
if (widget.visits.isEmpty) { if (widget.visits.isEmpty) {
return NoItemFound( return NoItemFound(message: context.translation.noVisitsFound);
message: context.translation.noVisitsFound,
);
} }
return Stack( return Stack(
children: [
Column(
children: [ children: [
LazyLoading( LazyLoading(
nextPage: widget.nextPage, nextPage: widget.nextPage,
onLazyLoad: widget.onLazyLoad, onLazyLoad: widget.onLazyLoad,
child: ListView.builder( child: ListView.builder(
//physics: BouncingScrollPhysics(),
itemCount: widget.visits.length, itemCount: widget.visits.length,
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
itemBuilder: (context, itemIndex) { itemBuilder: (context, itemIndex) {
Visit visit = widget.visits[itemIndex]; Visit visit = widget.visits[itemIndex];
bool isSelected = _selectedVisits.contains(visit); // bool isSelected = _selectedVisits.contains(visit);
return VisitItem( return VisitItem(visit: visit);
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( ).expanded,
alignment: Alignment.bottomLeft, if (userProvider.user.type == UsersTypes.normal_user)
child: Padding( AppFilledButton(
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: () { onPressed: () {
_selectedVisits.clear(); Navigator.push(context, MaterialPageRoute(builder: (context) => Container()));
setState(() {});
}, },
), label: context.translation.createNewRequest,
FloatingActionButton( ).paddingAll(16),
heroTag: "edit",
child: const Icon(Icons.edit),
onPressed: () {
if (!widget.visits.contains(_selectedVisits.first)) {
_selectedVisits.clear();
setState(() {});
return;
}
widget.onEditGroup(_selectedVisits);
//_selectedVisits.clear();
},
),
], ],
), ),
), // 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();
// },
// ),
// ],
// ),
// ),
// ),
// ),
// )
], ],
); );
} }

Loading…
Cancel
Save