Engineer : Track Service Screen & Preventive Maintenance Screen & Notifications Screen

merge-requests/4/head
zaid_daoud 3 years ago
parent e88c88ef4e
commit d8252529ce

@ -13,7 +13,7 @@ class NotificationsProvider extends ChangeNotifier {
//reset provider data
void reset() {
notifications = null;
notifications.clear();
nextPage = true;
stateCode = null;
}
@ -27,7 +27,7 @@ class NotificationsProvider extends ChangeNotifier {
bool? nextPage = true;
// list of user requests
List<AppNotification>? notifications;
List<AppNotification> notifications = [];
// when requests in-process _loading = true
// done _loading = true
@ -64,8 +64,7 @@ class NotificationsProvider extends ChangeNotifier {
List<AppNotification> serviceRequestsPage = requestsListJson
.map((request) => AppNotification.fromJson(request))
.toList();
notifications ??= [];
notifications?.addAll(serviceRequestsPage);
notifications.addAll(serviceRequestsPage);
if (serviceRequestsPage.length == pageItemNumber) {
nextPage = true;
} else {

@ -16,7 +16,7 @@ class RegularVisitsProvider extends ChangeNotifier {
//reset provider data
void reset() {
visits = null;
visits.clear();
nextPage = true;
stateCode = null;
}
@ -30,7 +30,7 @@ class RegularVisitsProvider extends ChangeNotifier {
bool nextPage = true;
// list of user requests
List<Visit>? visits;
List<Visit> visits = [];
// when requests in-process _loading = true
// done _loading = true
@ -45,8 +45,8 @@ class RegularVisitsProvider extends ChangeNotifier {
/// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getVisits({
required String host,
required User user,
required String? host,
required User? user,
// VisitsSearch visitsSearch,
}) async {
if (isLoading == true) {
@ -58,7 +58,7 @@ class RegularVisitsProvider extends ChangeNotifier {
try {
response = await get(
Uri.parse(
"$host${URLs.getRegularVisits}?uid=${user.id}&token=${user.token}&page=${(visits?.length ?? 0) ~/ pageItemNumber}${visitsSearch?.toSearchString()}",
"$host${URLs.getRegularVisits}?uid=${user?.id}&token=${user?.token}&page=${(visits.length) ~/ pageItemNumber}${visitsSearch?.toSearchString()}",
),
headers: {"Content-Type": "application/json; charset=utf-8"},
);

@ -50,7 +50,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getRequests({
required String host,
required User user,
required User? user,
required String? hospitalId,
}) async {
if (isLoading == true) {
@ -61,7 +61,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
try {
response = await get(
Uri.parse(
"$host${URLs.getServiceRequests}?uid=${user.id}${hospitalId == null ? "" : "&client_nid=$hospitalId"}&token=${user.token}&page=${(serviceRequests?.length ?? 0) ~/ pageItemNumber}${search?.toSearchString()}",
"$host${URLs.getServiceRequests}?uid=${user?.id}${hospitalId == null ? "" : "&client_nid=$hospitalId"}&token=${user?.token}&page=${(serviceRequests?.length ?? 0) ~/ pageItemNumber}${search?.toSearchString()}",
),
headers: {"Content-Type": "application/json; charset=utf-8"},
);
@ -108,7 +108,9 @@ class ServiceRequestsProvider extends ChangeNotifier {
'$host${URLs.getSingleServiceRequest}?call_nid=$requestId$userData',
));
} catch (error) {
throw (HttpStatusManger.getStatusMessage(status: -1, subtitle: subtitle) ?? '');
throw (HttpStatusManger.getStatusMessage(
status: -1, subtitle: subtitle) ??
'');
}
// If the call to the server was successful, parse the JSON.
@ -121,7 +123,8 @@ class ServiceRequestsProvider extends ChangeNotifier {
return requests[0];
} else {
throw (HttpStatusManger.getStatusMessage(
status: response.statusCode, subtitle: subtitle) ?? "");
status: response.statusCode, subtitle: subtitle) ??
"");
}
}

@ -158,10 +158,10 @@ class MyApp extends StatelessWidget {
ServiceRequestsPage.id: (_) => ServiceRequestsPage(),
NotificationsPage.id: (_) => NotificationsPage(),
FutureRequestServiceDetails.id: (_) =>
FutureRequestServiceDetails(),
const FutureRequestServiceDetails(),
PreventiveMaintenanceVisitsPage.id: (_) =>
PreventiveMaintenanceVisitsPage(),
RegularVisitsPage.id: (_) => RegularVisitsPage(),
RegularVisitsPage.id: (_) => const RegularVisitsPage(),
TrackGasRefillPage.id: (_) => const TrackGasRefillPage(),
RequestDeviceTransfer.id: (_) => const RequestDeviceTransfer(),
TrackDeviceTransferPage.id: (_) => const TrackDeviceTransferPage(),

@ -34,8 +34,10 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
UserProvider? _userProvider;
SettingProvider? _settingProvider;
DeviceTransferProvider? _deviceTransferProvider;
final TextEditingController _requestedQuantityController = TextEditingController();
final DeviceTransfer _formModel = DeviceTransfer(receiver: DeviceTransferInfo());
final TextEditingController _requestedQuantityController =
TextEditingController();
final DeviceTransfer _formModel =
DeviceTransfer(receiver: DeviceTransferInfo());
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@ -73,7 +75,8 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
);
Navigator.of(context).pop();
} else {
String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle);
String errorMessage = HttpStatusManger.getStatusMessage(
status: status, subtitle: _subtitle);
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(errorMessage),
));
@ -91,7 +94,8 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
_subtitle = AppLocalization.of(context)?.subtitle;
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
_deviceTransferProvider = Provider.of<DeviceTransferProvider>(context, listen: false);
_deviceTransferProvider =
Provider.of<DeviceTransferProvider>(context, listen: false);
return Scaffold(
key: _scaffoldKey,
body: Form(
@ -112,7 +116,10 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
padding: const EdgeInsets.all(8.0),
child: Text(
"Transfer Device",
style: Theme.of(context).textTheme.headline5?.copyWith(color: Theme.of(context).primaryColor, fontSize: 28, fontWeight: FontWeight.bold),
style: Theme.of(context).textTheme.headline5?.copyWith(
color: Theme.of(context).primaryColor,
fontSize: 28,
fontWeight: FontWeight.bold),
),
),
),
@ -139,7 +146,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
),
6.height,
DeviceButton(
device: _formModel.device!,
device: _formModel.device,
onDevicePick: (device) {
_formModel.device = device;
setState(() {});

@ -16,6 +16,7 @@ import '../../../widgets/search/service_request_search_bar.dart';
class ServiceRequestsPage extends StatefulWidget {
static final String id = "/service-requests";
@override
_ServiceRequestsPageState createState() => _ServiceRequestsPageState();
}
@ -27,12 +28,13 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage>
late SettingProvider _settingProvider;
bool _expandedSearch = false;
bool _firstTime = true;
@override
Widget build(BuildContext context) {
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
Subtitle _subtitle = AppLocalization.of(context)!.subtitle!;
Subtitle? subtitle = AppLocalization.of(context)?.subtitle;
if (_firstTime) {
_serviceRequestsProvider.reset();
_firstTime = false;
@ -58,19 +60,24 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage>
children: [
Container(
color: AColors.primaryColor,
padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4),
padding:
const EdgeInsets.symmetric(horizontal: 0, vertical: 4),
child: Column(
children: [
Row(
children: [
ABackButton(),
const ABackButton(),
Expanded(
child: Center(
child: Text(
_subtitle.serviceRequests,
style: Theme.of(context).textTheme.headline6?.copyWith(
subtitle?.serviceRequests ?? '',
style: Theme.of(context)
.textTheme
.titleLarge
?.copyWith(
color: AColors.white,
fontStyle: FontStyle.italic ),
fontStyle: FontStyle.italic,
),
),
),
),
@ -81,25 +88,27 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage>
buttonSize: 42,
backgroundColor: AColors.white,
onPressed: () async {
ServiceRequestSearch? _temp = await showModalBottomSheet(
ServiceRequestSearch? temp =
await showModalBottomSheet(
context: context,
isScrollControlled: true,
builder: (context) {
return ServiceRequestsSearchDialog(
initialSearchValue: _serviceRequestsProvider.search!,
initialSearchValue:
_serviceRequestsProvider.search!,
);
},
);
});
if(_temp != null){
_serviceRequestsProvider.search = _temp;
if (temp != null) {
_serviceRequestsProvider.search = temp;
_serviceRequestsProvider.reset();
setState(() {});
}
},
),
SizedBox(width: 16,)
const SizedBox(width: 16)
],
),
],
),
),
@ -108,17 +117,16 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage>
nextPage: _serviceRequestsProvider.nextPage!,
onLazyLoad: () async {
await _serviceRequestsProvider.getRequests(
user: _userProvider.user!,
user: _userProvider.user,
host: _settingProvider.host ?? "",
hospitalId: _userProvider.user!.hospital!.id,
hospitalId: _userProvider.user?.hospital?.id,
);
},
requests: _serviceRequestsProvider.serviceRequests!,
requests: _serviceRequestsProvider.serviceRequests ?? [],
),
),
],
),
],
),
),

@ -21,7 +21,9 @@ import '../../../widgets/visits/visits_list.dart';
import 'update_visits_group_sheet.dart';
class RegularVisitsPage extends StatefulWidget {
static final String id = "/Regular-visits";
static const String id = "/Regular-visits";
const RegularVisitsPage({super.key});
@override
_RegularVisitsPageState createState() => _RegularVisitsPageState();
}
@ -43,14 +45,13 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
body: SafeArea(
child: LoadingManager(
isLoading: _visitsProvider.isLoading,
isFailedLoading: _visitsProvider.visits == null,
stateCode: _visitsProvider.stateCode,
onRefresh: () async {
_visitsProvider.reset();
//_visitsProvider.visitsSearch = VisitsSearch();
await _visitsProvider.getVisits(
user: _userProvider.user!,
host: _settingProvider.host!,
user: _userProvider.user,
host: _settingProvider.host,
);
},
child: Stack(
@ -59,7 +60,8 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
children: [
Container(
color: AColors.primaryColor,
padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4),
padding:
const EdgeInsets.symmetric(horizontal: 0, vertical: 4),
child: Column(
children: [
Row(
@ -69,10 +71,12 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
child: Center(
child: Text(
_subtitle.preventiveMaintenance,
style: Theme.of(context).textTheme.headline6?.copyWith(
style: Theme.of(context)
.textTheme
.headline6
?.copyWith(
color: AColors.white,
fontStyle: FontStyle.italic
),
fontStyle: FontStyle.italic),
),
),
),
@ -80,36 +84,44 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
duration: Duration(milliseconds: 400),
child: AIconButton(
key: ValueKey(_expandedSearch),
iconData: _expandedSearch ? Icons.keyboard_arrow_up :Icons.search,
iconData: _expandedSearch
? Icons.keyboard_arrow_up
: Icons.search,
color: AColors.secondaryColor,
buttonSize: 42,
backgroundColor: AColors.white,
onPressed: () async {
VisitsSearch _temp = await showModalBottomSheet(
VisitsSearch _temp =
await showModalBottomSheet(
context: context,
isScrollControlled: true,
builder: (context) {
return VisitsSearchDialog(
initialSearchValue: _visitsProvider.visitsSearch!, onSearch: (VisitsSearch ) { },
initialSearchValue:
_visitsProvider.visitsSearch!,
onSearch: (VisitsSearch) {},
);
});
if(_temp != null){
_visitsProvider.visitsSearch?.fromSearch(_temp) ;
_visitsProvider.visitsSearch
?.fromSearch(_temp);
_visitsProvider.reset();
setState(() {});
}
},
),
),
SizedBox(width: 16,)
SizedBox(
width: 16,
)
],
),
],
),
),
Visibility(
visible: _visitsProvider.visitsSearch?.toSearchString().isNotEmpty??false,
visible: _visitsProvider.visitsSearch
?.toSearchString()
.isNotEmpty ??
false,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: AButton(
@ -132,29 +144,33 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
);
},
onEditGroup: (visits) async {
VisitsGroup _group = await showModalBottomSheet(
VisitsGroup? group = await showModalBottomSheet(
isScrollControlled: true,
context: context,
builder: (context) {
return UpdateVisitsGroupSheet(visits: visits,title: _subtitle.updateRegularVisits,);
return UpdateVisitsGroupSheet(
visits: visits,
title: _subtitle.updateRegularVisits,
);
},
)as VisitsGroup;
if(_group != null){
) as VisitsGroup?;
if (group != null) {
showDialog<void>(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return CupertinoAlertDialog(
title: Text(_subtitle.updatingDots),
content: Center(child: CircularProgressIndicator()),
content:
Center(child: CircularProgressIndicator()),
);
},
);
int status = await _visitsProvider.updateGroupOfVisits(
int status =
await _visitsProvider.updateGroupOfVisits(
user: _userProvider.user!,
host: _settingProvider.host ?? "",
group: _group
);
group: group);
Navigator.of(context).pop();
if (status >= 200 && status < 300) {
Fluttertoast.showToast(
@ -165,21 +181,18 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
} else {
Fluttertoast.showToast(
msg: HttpStatusManger.getStatusMessage(
status: status,
subtitle: _subtitle
),
status: status, subtitle: _subtitle),
toastLength: Toast.LENGTH_LONG,
gravity: ToastGravity.BOTTOM,
);
}
}
},
visits: _visitsProvider.visits!,
visits: _visitsProvider.visits,
),
),
],
),
],
),
),

@ -9,9 +9,10 @@ import 'single_device_picker.dart';
class DeviceButton extends StatelessWidget {
final Function(Device)? onDevicePick;
final Device device;
final Device? device;
const DeviceButton({Key? key, required this.device, this.onDevicePick}) : super(key: key);
const DeviceButton({Key? key, required this.device, this.onDevicePick})
: super(key: key);
@override
Widget build(BuildContext context) {
@ -19,9 +20,11 @@ class DeviceButton extends StatelessWidget {
return ElevatedButton(
style: ElevatedButton.styleFrom(
elevation: 0,
padding: EdgeInsets.symmetric(horizontal: 16, vertical: device == null ? 12 : 8),
padding: EdgeInsets.symmetric(
horizontal: 16, vertical: device == null ? 12 : 8),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)),
borderRadius: BorderRadius.circular(
AppStyle.borderRadius * AppStyle.getScaleFactor(context)),
),
foregroundColor: AColors.primaryColor,
backgroundColor: AColors.inputFieldBackgroundColor,
@ -45,7 +48,7 @@ class DeviceButton extends StatelessWidget {
child: ListTile(
contentPadding: EdgeInsets.all(0),
title: Text(
"${_subtitle?.sn??""} : ${device.serialNumber??""}",
"${_subtitle?.sn ?? ""} : ${device?.serialNumber ?? ""}",
style: Theme.of(context).textTheme.subtitle1,
),
subtitle: Column(
@ -55,24 +58,26 @@ class DeviceButton extends StatelessWidget {
color: Theme.of(context).textTheme.subtitle1?.color,
),
Text(
"${_subtitle?.brand} : ${device.brand}",
"${_subtitle?.brand} : ${device?.brand}",
style: Theme.of(context).textTheme.subtitle2,
),
Divider(
color: Theme.of(context).textTheme.subtitle1?.color,
),
Text(
"${_subtitle?.model} : ${device.model}",
"${_subtitle?.model} : ${device?.model}",
style: Theme.of(context).textTheme.subtitle2,
),
],
),
)),
const Icon(Icons.keyboard_arrow_down, size: 28, color: AColors.grey3A),
const Icon(Icons.keyboard_arrow_down,
size: 28, color: AColors.grey3A),
],
),
onPressed: () async {
Device _device = await Navigator.of(context).pushNamed(SingleDevicePicker.id) as Device;
Device _device = await Navigator.of(context)
.pushNamed(SingleDevicePicker.id) as Device;
onDevicePick!(_device);
});
}

Loading…
Cancel
Save