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 = 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)));

@ -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";
}
}
}

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

@ -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"
}

@ -112,6 +112,7 @@ class AColors {
return AColors.statusDefault;
}
}
static Color getPriorityStatusColor(int id) {
switch (id) {
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: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<LandPage> {
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<LandPage> {
// 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<LandPage> {
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);
},
),
],
),
],

@ -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),

@ -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<FutureEditPentry> {
return Scaffold(
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) {
if (snapshot.hasError) {
return FailedLoading(

@ -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<RegularVisitsPage> with TickerProvid
_userProvider = Provider.of<UserProvider>(context);
return Scaffold(
appBar: DefaultAppBar(title: context.translation.preventiveMaintenance),
body: SafeArea(
child: LoadingManager(
isLoading: _visitsProvider.isLoading,
@ -53,128 +47,177 @@ class _RegularVisitsPageState extends State<RegularVisitsPage> 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<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,
),
),
],
),
],
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,
),
// 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: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<UserProvider>(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),
],
),
),

@ -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<UserProvider>(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))),
],
)
],
),
);
}

@ -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<Visit> visits;
final bool nextPage;
@ -32,92 +34,75 @@ class _VisitsListState extends State<VisitsList> {
@override
Widget build(BuildContext context) {
UserProvider userProvider = Provider.of<UserProvider>(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();
// },
// ),
// ],
// ),
// ),
// ),
// ),
// )
],
);
}

Loading…
Cancel
Save