support null safety 4

merge-requests/2/head
nextwo 3 years ago
parent f926951125
commit 82e3005e85

@ -135,7 +135,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
"token": user.token ?? "", "token": user.token ?? "",
"sn_id": serviceRequest.deviceId ?? "", "sn_id": serviceRequest.deviceId ?? "",
"date": (DateTime.now().millisecondsSinceEpoch).toString(), "date": (DateTime.now().millisecondsSinceEpoch).toString(),
"client": user.hospital.id ?? '', "client": user.hospital?.id ?? '',
"complaint": serviceRequest.maintenanceIssue, "complaint": serviceRequest.maintenanceIssue,
"image": json.encode(serviceRequest.devicePhotos), "image": json.encode(serviceRequest.devicePhotos),
"priority": (serviceRequest.priority?.id).toString(), "priority": (serviceRequest.priority?.id).toString(),
@ -174,8 +174,8 @@ class ServiceRequestsProvider extends ChangeNotifier {
}) async { }) async {
Response response; Response response;
Map<String, String> body = issue.toMap(); Map<String, String> body = issue.toMap();
body["uid"] = user.id; body["uid"] = user.id??"";
body["token"] = user.token; body["token"] = user.token??"";
try { try {
response = await post( response = await post(
Uri.parse(host + URLs.createReport), Uri.parse(host + URLs.createReport),
@ -228,8 +228,8 @@ class ServiceRequestsProvider extends ChangeNotifier {
}) async { }) async {
Response response; Response response;
Map<String, String> body = report.toMap(); Map<String, String> body = report.toMap();
body["uid"] = user.id; body["uid"] = user.id??"";
body["token"] = user.token; body["token"] = user.token??"";
body["job_id"] = request.id ?? ''; body["job_id"] = request.id ?? '';
try { try {
response = await post( response = await post(
@ -285,8 +285,8 @@ class ServiceRequestsProvider extends ChangeNotifier {
}) async { }) async {
Response response; Response response;
Map<String, String> body = report.toMap(); Map<String, String> body = report.toMap();
body["uid"] = user.id; body["uid"] = user.id??"";
body["token"] = user.token; body["token"] = user.token??"";
body["job_id"] = request.id ?? ''; body["job_id"] = request.id ?? '';
body["report_id"] = request.reportID ?? ''; body["report_id"] = request.reportID ?? '';
try { try {
@ -314,8 +314,8 @@ class ServiceRequestsProvider extends ChangeNotifier {
}) async { }) async {
Response response; Response response;
Map<String, String> body = {}; Map<String, String> body = {};
body["uid"] = user.id; body["uid"] = user.id??"";
body["token"] = user.token; body["token"] = user.token??"";
body["job_id"] = request.id ?? ''; body["job_id"] = request.id ?? '';
body["start_time"] = ((timer.startAt?.millisecondsSinceEpoch ?? 0) / 1000) body["start_time"] = ((timer.startAt?.millisecondsSinceEpoch ?? 0) / 1000)
.toStringAsFixed(0); .toStringAsFixed(0);

@ -29,7 +29,7 @@ class GasRefillDetails {
: int.tryParse(parsedJson["requsted_qty"].toString()) ?? 0, : int.tryParse(parsedJson["requsted_qty"].toString()) ?? 0,
deliveredQuantity: parsedJson["deliverd_qty"] == null deliveredQuantity: parsedJson["deliverd_qty"] == null
? 0 ? 0
: int.tryParse(parsedJson["deliverd_qty"].toString()) ?? 0, : int.tryParse(parsedJson["deliverd_qty"].toString()) ?? 0, model: null,
); );
} }
@ -40,7 +40,7 @@ class GasRefillDetails {
? Lookup.fromStatus(details.cylinderSize!) ? Lookup.fromStatus(details.cylinderSize!)
: null, : null,
requestedQuantity: details.requestedQuantity, requestedQuantity: details.requestedQuantity,
deliveredQuantity: details.deliveredQuantity, deliveredQuantity: details.deliveredQuantity, model: null,
); );
} }
} }

@ -4,7 +4,6 @@ import '../../../controllers/localization/localization.dart';
import '../../../controllers/providers/api/device_transfer_provider.dart'; import '../../../controllers/providers/api/device_transfer_provider.dart';
import '../../../controllers/providers/api/user_provider.dart'; import '../../../controllers/providers/api/user_provider.dart';
import '../../../controllers/providers/settings/setting_provider.dart'; import '../../../controllers/providers/settings/setting_provider.dart';
import '../../../extensions/int_extensions.dart';
import '../../../models/device/device_transfer.dart'; import '../../../models/device/device_transfer.dart';
import '../../../models/device/device_transfer_info.dart'; import '../../../models/device/device_transfer_info.dart';
import '../../../models/subtitle.dart'; import '../../../models/subtitle.dart';
@ -122,7 +121,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
), ),
const SizedBox(height:12), const SizedBox(height:12),
DeviceTransferInfoSection( DeviceTransferInfoSection(
info: widget.model.sender, info: widget.model.sender!,
), ),
const SizedBox(height:8), const SizedBox(height:8),
Row( Row(
@ -148,7 +147,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
), ),
const SizedBox(height:12), const SizedBox(height:12),
DeviceTransferInfoSection( DeviceTransferInfoSection(
info: widget.model.receiver, info: widget.model.receiver!,
), ),
], ],

@ -139,7 +139,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
), ),
6.height, 6.height,
DeviceButton( DeviceButton(
device: _formModel.device, device: _formModel.device!,
onDevicePick: (device) { onDevicePick: (device) {
_formModel.device = device; _formModel.device = device;
setState(() {}); setState(() {});
@ -166,7 +166,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
), ),
6.height, 6.height,
HospitalButton( HospitalButton(
hospital: _formModel.receiver?.client, hospital: _formModel.receiver!.client!,
onHospitalPick: (hospital) { onHospitalPick: (hospital) {
_formModel.receiver?.client = hospital; _formModel.receiver?.client = hospital;
setState(() {}); setState(() {});

@ -81,10 +81,10 @@ class _LoginState extends State<Login> {
textAlign: TextAlign.left, textAlign: TextAlign.left,
style: Theme.of(context).textTheme.bodyText1, style: Theme.of(context).textTheme.bodyText1,
prefixIconData: Icons.account_circle, prefixIconData: Icons.account_circle,
validator: (value) => Validator.hasValue(value) ? null : _subtitle?.nameValidateMessage, validator: (value) => Validator.hasValue(value!) ? '' : _subtitle?.nameValidateMessage??"",
textInputType: TextInputType.name, textInputType: TextInputType.name,
onSaved: (value) { onSaved: (value) {
_user.userName = value; _user.userName = value!;
}, },
), ),
SizedBox(height: 12), SizedBox(height: 12),
@ -95,13 +95,13 @@ class _LoginState extends State<Login> {
style: Theme.of(context).textTheme.bodyText1, style: Theme.of(context).textTheme.bodyText1,
prefixIconData: Icons.vpn_key_sharp, prefixIconData: Icons.vpn_key_sharp,
textAlign: TextAlign.left, textAlign: TextAlign.left,
validator: (value) => Validator.isValidPassword(value) ? null : _subtitle?.passwordValidateMessage, validator: (value) => Validator.isValidPassword(value!) ? '' : _subtitle?.passwordValidateMessage??"",
showPassword: () { showPassword: () {
_obscurePassword = !_obscurePassword; _obscurePassword = !_obscurePassword;
setState(() {}); setState(() {});
}, },
onSaved: (value) { onSaved: (value) {
_user.password = value; _user.password = value!;
}, },
), ),
SizedBox( SizedBox(

@ -8,6 +8,7 @@ import '../../controllers/localization/localization.dart';
import '../../controllers/providers/api/user_provider.dart'; import '../../controllers/providers/api/user_provider.dart';
import '../../controllers/providers/settings/setting_provider.dart'; import '../../controllers/providers/settings/setting_provider.dart';
import '../../controllers/validator/validator.dart'; import '../../controllers/validator/validator.dart';
import '../../models/hospital.dart';
import '../../models/subtitle.dart'; import '../../models/subtitle.dart';
import '../../models/user.dart'; import '../../models/user.dart';
import '../widgets/app_text_form_field.dart'; import '../widgets/app_text_form_field.dart';
@ -74,9 +75,9 @@ class _RegisterState extends State<Register> {
hintText: _subtitle?.name??"", hintText: _subtitle?.name??"",
prefixIconData: Icons.account_circle, prefixIconData: Icons.account_circle,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
validator: (value) => Validator.hasValue(value) ? null : _subtitle?.nameValidateMessage, validator: (value) => Validator.hasValue(value!) ? '' : _subtitle?.nameValidateMessage??"",
onSaved: (value) { onSaved: (value) {
_user.userName = value; _user.userName = value!;
}, },
), ),
const SizedBox(height: 12), const SizedBox(height: 12),
@ -86,9 +87,9 @@ class _RegisterState extends State<Register> {
prefixIconData: Icons.email, prefixIconData: Icons.email,
textInputType: TextInputType.emailAddress, textInputType: TextInputType.emailAddress,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
validator: (value) => Validator.isEmail(value) ? null : _subtitle?.emailValidateMessage, validator: (value) => Validator.isEmail(value!) ? '' : _subtitle?.emailValidateMessage??"",
onSaved: (value) { onSaved: (value) {
_user.email = value; _user.email = value!;
}, },
), ),
const SizedBox(height: 12), const SizedBox(height: 12),
@ -98,13 +99,13 @@ class _RegisterState extends State<Register> {
prefixIconData: Icons.vpn_key_sharp, prefixIconData: Icons.vpn_key_sharp,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
obscureText: _obscurePassword, obscureText: _obscurePassword,
validator: (value) => Validator.isValidPassword(value) ? null : _subtitle?.passwordValidateMessage, validator: (value) => Validator.isValidPassword(value!) ? '' : _subtitle?.passwordValidateMessage??'',
showPassword: () { showPassword: () {
_obscurePassword = !_obscurePassword; _obscurePassword = !_obscurePassword;
setState(() {}); setState(() {});
}, },
onSaved: (value) { onSaved: (value) {
_user.password = value; _user.password = value!;
}, },
onChange: (value) { onChange: (value) {
_user.password = value; _user.password = value;
@ -117,7 +118,7 @@ class _RegisterState extends State<Register> {
hintText: _subtitle?.confirmPassword??"", hintText: _subtitle?.confirmPassword??"",
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
obscureText: _obscurePassword, obscureText: _obscurePassword,
validator: (value) => _user.password == value ? null : _subtitle?.confirmPasswordValidateMessage, validator: (value) => _user.password == value ? '' : _subtitle?.confirmPasswordValidateMessage??"",
showPassword: () { showPassword: () {
_obscurePassword = !_obscurePassword; _obscurePassword = !_obscurePassword;
setState(() {}); setState(() {});
@ -125,7 +126,7 @@ class _RegisterState extends State<Register> {
), ),
const SizedBox(height: 12), const SizedBox(height: 12),
HospitalButton( HospitalButton(
hospital: _user.hospital, hospital: _user.hospital??Hospital(),
onHospitalPick: (hospital) { onHospitalPick: (hospital) {
_user.hospital = hospital; _user.hospital = hospital;
setState(() {}); setState(() {});
@ -145,7 +146,7 @@ class _RegisterState extends State<Register> {
hintText: _subtitle?.phoneNumber??"", hintText: _subtitle?.phoneNumber??"",
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
prefixIconData: Icons.phone_android, prefixIconData: Icons.phone_android,
validator: (value) => Validator.isPhoneNumber(value) ? null : _subtitle?.phoneNumberValidateMessage, validator: (value) => Validator.isPhoneNumber(value!) ? '' : _subtitle?.phoneNumberValidateMessage??"",
textInputType: TextInputType.phone, textInputType: TextInputType.phone,
onSaved: (value) { onSaved: (value) {
_user.phoneNumber = value; _user.phoneNumber = value;
@ -158,7 +159,7 @@ class _RegisterState extends State<Register> {
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
prefixIconData: FontAwesomeIcons.whatsapp, prefixIconData: FontAwesomeIcons.whatsapp,
prefixIconSize: 36, prefixIconSize: 36,
validator: (value) => Validator.isPhoneNumber(value) ? null : _subtitle?.phoneNumberValidateMessage, validator: (value) => (Validator.isPhoneNumber(value!)) ? "" : _subtitle?.phoneNumberValidateMessage??"",
textInputType: TextInputType.phone, textInputType: TextInputType.phone,
onSaved: (value) { onSaved: (value) {
_user.whatsApp = value; _user.whatsApp = value;

@ -94,7 +94,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
_formModel.details?.insert(0,_currentDetails); _formModel.details?.insert(0,_currentDetails);
_validate = false; _validate = false;
Scrollable.ensureVisible(_DetailsKey.currentContext); Scrollable.ensureVisible(_DetailsKey.currentContext!);
_requestedQuantityController.clear(); _requestedQuantityController.clear();
_currentDetails = GasRefillDetails(model: null); _currentDetails = GasRefillDetails(model: null);
setState(() {}); setState(() {});
@ -201,11 +201,11 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
controller: _requestedQuantityController, controller: _requestedQuantityController,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
validator: (value) => validator: (value) =>
Validator.isNumeric(value) Validator.isNumeric(value!)
? null : "allow numbers only", ? '' : "allow numbers only",
textInputType: TextInputType.number, textInputType: TextInputType.number,
onSaved: (value){ onSaved: (value){
_currentDetails.requestedQuantity = int.tryParse(value); _currentDetails.requestedQuantity = int.tryParse(value!);
}, },
), ),
const SizedBox(height: 16), const SizedBox(height: 16),

@ -7,36 +7,36 @@ import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:package_info/package_info.dart'; import 'package:package_info/package_info.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:share/share.dart'; import 'package:share/share.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/notification/firebase_notification_manger.dart';
import 'package:test_sa/controllers/providers/api/departments_provider.dart';
import 'package:test_sa/controllers/providers/api/devices_provider.dart';
import 'package:test_sa/controllers/providers/api/preventive_maintenance_visits_provider.dart';
import 'package:test_sa/controllers/providers/api/regular_visits_provider.dart';
import 'package:test_sa/controllers/providers/api/service_requests_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/int_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/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/pages/device_transfer/request_device_transfer.dart';
import 'package:test_sa/views/pages/device_transfer/track_device_transfer.dart';
import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart';
import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart';
import 'package:test_sa/views/pages/user/notifications/notifications_page.dart';
import 'package:test_sa/views/pages/user/requests/create_request.dart';
import 'package:test_sa/views/pages/user/visits/regular_visits_page.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/dialogs/dialog.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 '../../../controllers/localization/localization.dart';
import '../../../controllers/notification/firebase_notification_manger.dart';
import '../../../controllers/providers/api/departments_provider.dart';
import '../../../controllers/providers/api/devices_provider.dart';
import '../../../controllers/providers/api/preventive_maintenance_visits_provider.dart';
import '../../../controllers/providers/api/regular_visits_provider.dart';
import '../../../controllers/providers/api/service_requests_provider.dart';
import '../../../controllers/providers/api/user_provider.dart';
import '../../../controllers/providers/settings/setting_provider.dart';
import '../../../extensions/int_extensions.dart';
import '../../../extensions/widget_extensions.dart';
import '../../../models/enums/user_types.dart';
import '../../../models/subtitle.dart';
import '../../app_style/colors.dart';
import '../../app_style/sizing.dart';
import '../../widgets/buttons/app_back_button.dart';
import '../../widgets/buttons/app_icon_button.dart';
import '../../widgets/dialogs/dialog.dart';
import '../../widgets/drawer/drawer_item.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/track_device_transfer.dart';
import 'gas_refill/request_gas_refill.dart';
import 'gas_refill/track_gas_refill.dart';
import 'notifications/notifications_page.dart';
import 'requests/create_request.dart';
import 'requests/requests_page.dart'; import 'requests/requests_page.dart';
import 'visits/regular_visits_page.dart';
class LandPage extends StatefulWidget { class LandPage extends StatefulWidget {
static const String id = "/land-page"; static const String id = "/land-page";
@ -48,17 +48,17 @@ class LandPage extends StatefulWidget {
} }
class _LandPageState extends State<LandPage> { class _LandPageState extends State<LandPage> {
double _height; late double _height;
double _width; late double _width;
UserProvider _userProvider; late UserProvider _userProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
DepartmentsProvider _departmentsProvider; late DepartmentsProvider _departmentsProvider;
DevicesProvider _devicesProvider; late DevicesProvider _devicesProvider;
double _buttonHeight; late double _buttonHeight;
bool firstTime = true; late bool firstTime = true;
ServiceRequestsProvider _serviceRequestsProvider; late ServiceRequestsProvider _serviceRequestsProvider;
PreventiveMaintenanceVisitsProvider _preventiveMaintenanceVisitsProvider; late PreventiveMaintenanceVisitsProvider _preventiveMaintenanceVisitsProvider;
RegularVisitsProvider _regularVisitsProvider; late RegularVisitsProvider _regularVisitsProvider;
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@override @override
@ -73,7 +73,7 @@ class _LandPageState extends State<LandPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
String path = ModalRoute.of(context).settings.arguments; String path = ModalRoute.of(context)!.settings.arguments.toString();
_height = MediaQuery.of(context).size.height; _height = MediaQuery.of(context).size.height;
_width = MediaQuery.of(context).size.width; _width = MediaQuery.of(context).size.width;
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
@ -83,7 +83,7 @@ class _LandPageState extends State<LandPage> {
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context); _serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
_preventiveMaintenanceVisitsProvider = Provider.of<PreventiveMaintenanceVisitsProvider>(context); _preventiveMaintenanceVisitsProvider = Provider.of<PreventiveMaintenanceVisitsProvider>(context);
_regularVisitsProvider = Provider.of<RegularVisitsProvider>(context); _regularVisitsProvider = Provider.of<RegularVisitsProvider>(context);
Subtitle _subtitle = AppLocalization.of(context).subtitle; Subtitle _subtitle = AppLocalization.of(context)!.subtitle!;
if (firstTime) { if (firstTime) {
if (path != null) { if (path != null) {
Navigator.of(context).pushNamed("/" + path.split("/").first, arguments: path.split("/").last); Navigator.of(context).pushNamed("/" + path.split("/").first, arguments: path.split("/").last);
@ -153,7 +153,7 @@ class _LandPageState extends State<LandPage> {
mainAxisSpacing: 12, mainAxisSpacing: 12,
childAspectRatio: 1, childAspectRatio: 1,
children: [ children: [
if (_userProvider.user.type == UsersTypes.normal_user) if (_userProvider.user!.type == UsersTypes.normal_user)
LandPageItem( LandPageItem(
text: _subtitle.newServiceRequest, text: _subtitle.newServiceRequest,
icon: FontAwesomeIcons.tools, icon: FontAwesomeIcons.tools,
@ -184,7 +184,7 @@ class _LandPageState extends State<LandPage> {
// Navigator.of(context).pushNamed(PreventiveMaintenanceVisitsPage.id); // Navigator.of(context).pushNamed(PreventiveMaintenanceVisitsPage.id);
// }, // },
// ), // ),
if (_userProvider.user.type != UsersTypes.engineer) if (_userProvider.user?.type != UsersTypes.engineer)
LandPageItem( LandPageItem(
text: "Request Gas Refill", text: "Request Gas Refill",
icon: FontAwesomeIcons.truckFast, icon: FontAwesomeIcons.truckFast,
@ -250,7 +250,7 @@ class _LandPageState extends State<LandPage> {
buttonSize: 42, buttonSize: 42,
backgroundColor: AColors.white, backgroundColor: AColors.white,
onPressed: () { onPressed: () {
_scaffoldKey.currentState.openEndDrawer(); _scaffoldKey.currentState?.openEndDrawer();
}, },
), ),
), ),
@ -284,8 +284,8 @@ class _LandPageState extends State<LandPage> {
), ),
12.width, 12.width,
Text( Text(
_userProvider.user.userName, _userProvider.user?.userName??"",
style: Theme.of(context).textTheme.headline6.copyWith( style: Theme.of(context).textTheme.headline6?.copyWith(
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
), ),
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
@ -307,11 +307,11 @@ class _LandPageState extends State<LandPage> {
focusColor: AColors.grey3A, focusColor: AColors.grey3A,
groupValue: _settingProvider.language, groupValue: _settingProvider.language,
onChanged: (value) { onChanged: (value) {
_settingProvider.setLanguage(value); _settingProvider.setLanguage(value!);
}), }),
Text( Text(
"English", "English",
style: Theme.of(context).textTheme.bodyText1.copyWith(color: AColors.grey3A), style: Theme.of(context).textTheme.bodyText1?.copyWith(color: AColors.grey3A),
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
Radio( Radio(
@ -320,11 +320,11 @@ class _LandPageState extends State<LandPage> {
focusColor: AColors.grey3A, focusColor: AColors.grey3A,
groupValue: _settingProvider.language, groupValue: _settingProvider.language,
onChanged: (value) { onChanged: (value) {
_settingProvider.setLanguage(value); _settingProvider.setLanguage(value!);
}), }),
Text( Text(
"عربي", "عربي",
style: Theme.of(context).textTheme.bodyText1.copyWith(color: AColors.grey3A), style: Theme.of(context).textTheme.bodyText1?.copyWith(color: AColors.grey3A),
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
], ],
@ -381,7 +381,7 @@ class _LandPageState extends State<LandPage> {
children: [ children: [
Text( Text(
"Powered By NewTrack", "Powered By NewTrack",
style: Theme.of(context).textTheme.headline6.copyWith(fontWeight: FontWeight.w500, color: AColors.grey3A, fontSize: 12), style: Theme.of(context).textTheme.headline6?.copyWith(fontWeight: FontWeight.w500, color: AColors.grey3A, fontSize: 12),
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
6.width, 6.width,

@ -1,21 +1,22 @@
import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart';
import 'package:test_sa/controllers/localization/localization.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/validator/validator.dart';
import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/user.dart';
import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/app_text_form_field.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/departments/department_button.dart';
import 'package:test_sa/views/widgets/hospitals/hospital_button.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../../../controllers/http_status_manger/http_status_manger.dart';
import '../../../controllers/localization/localization.dart';
import '../../../controllers/providers/api/user_provider.dart';
import '../../../controllers/providers/settings/setting_provider.dart';
import '../../../controllers/validator/validator.dart';
import '../../../models/subtitle.dart';
import '../../../models/user.dart';
import '../../app_style/colors.dart';
import '../../app_style/sizing.dart';
import '../../widgets/app_text_form_field.dart';
import '../../widgets/buttons/app_back_button.dart';
import '../../widgets/buttons/app_button.dart';
import '../../widgets/departments/department_button.dart';
import '../../widgets/hospitals/hospital_button.dart';
import '../../widgets/loaders/loading_manager.dart';
class ProfilePage extends StatefulWidget { class ProfilePage extends StatefulWidget {
static final String id = "/user/profile"; static final String id = "/user/profile";
@override @override
@ -23,10 +24,10 @@ class ProfilePage extends StatefulWidget {
} }
class _ProfilePageState extends State<ProfilePage> { class _ProfilePageState extends State<ProfilePage> {
UserProvider _userProvider; late UserProvider _userProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
double _width; late double _width;
double _height; late double _height;
User _user = User(); User _user = User();
bool _firstTime = true; bool _firstTime = true;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
@ -37,9 +38,9 @@ class _ProfilePageState extends State<ProfilePage> {
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_width = MediaQuery.of(context).size.width; _width = MediaQuery.of(context).size.width;
_height = MediaQuery.of(context).size.height; _height = MediaQuery.of(context).size.height;
Subtitle _subtitle = AppLocalization.of(context).subtitle; Subtitle _subtitle = AppLocalization.of(context)!.subtitle!;
if(_firstTime){ if(_firstTime){
_user = User.fromJson(_userProvider.user.toJson()); _user = User.fromJson(_userProvider.user!.toJson());
_firstTime = false; _firstTime = false;
} }
return Scaffold( return Scaffold(
@ -85,10 +86,10 @@ class _ProfilePageState extends State<ProfilePage> {
enable: false, enable: false,
prefixIconData: Icons.account_circle, prefixIconData: Icons.account_circle,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
validator: (value) => Validator.hasValue(value) validator: (value) => Validator.hasValue(value!)
? null : _subtitle.nameValidateMessage, ? '' : _subtitle.nameValidateMessage,
onSaved: (value){ onSaved: (value){
_user.userName = value; _user.userName = value!;
}, },
), ),
SizedBox(height: 8,), SizedBox(height: 8,),
@ -99,16 +100,16 @@ class _ProfilePageState extends State<ProfilePage> {
prefixIconData: Icons.email, prefixIconData: Icons.email,
textInputType: TextInputType.emailAddress, textInputType: TextInputType.emailAddress,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
validator: (value) => Validator.isEmail(value) validator: (value) => Validator.isEmail(value!)
? null : _subtitle.emailValidateMessage, ? '' : _subtitle.emailValidateMessage,
onSaved: (value){ onSaved: (value){
_user.email = value; _user.email = value!;
}, },
), ),
SizedBox(height: 8,), SizedBox(height: 8,),
AbsorbPointer( AbsorbPointer(
child: HospitalButton( child: HospitalButton(
hospital: _user.hospital, hospital: _user.hospital!,
onHospitalPick: (hospital){ onHospitalPick: (hospital){
_user.hospital = hospital; _user.hospital = hospital;
setState(() {}); setState(() {});
@ -130,7 +131,7 @@ class _ProfilePageState extends State<ProfilePage> {
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
prefixIconData: Icons.phone_android, prefixIconData: Icons.phone_android,
validator: (value) => validator: (value) =>
Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage, Validator.isPhoneNumber(value!) ? '' : _subtitle.phoneNumberValidateMessage,
textInputType: TextInputType.phone, textInputType: TextInputType.phone,
onSaved: (value){ onSaved: (value){
_user.phoneNumber = value; _user.phoneNumber = value;
@ -144,7 +145,7 @@ class _ProfilePageState extends State<ProfilePage> {
prefixIconData: FontAwesomeIcons.whatsapp, prefixIconData: FontAwesomeIcons.whatsapp,
prefixIconSize: 36, prefixIconSize: 36,
validator: (value) => validator: (value) =>
Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage, Validator.isPhoneNumber(value!) ? '' : _subtitle.phoneNumberValidateMessage,
textInputType: TextInputType.phone, textInputType: TextInputType.phone,
onSaved: (value){ onSaved: (value){
_user.whatsApp = value; _user.whatsApp = value;
@ -161,9 +162,9 @@ class _ProfilePageState extends State<ProfilePage> {
child: AButton( child: AButton(
text: _subtitle.update, text: _subtitle.update,
onPressed: () async { onPressed: () async {
if(!_formKey.currentState.validate()) if(!(_formKey.currentState?.validate()??false))
return; return;
_formKey.currentState.save(); _formKey.currentState?.save();
if(_user.department?.id == null){ if(_user.department?.id == null){
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar( SnackBar(
@ -176,10 +177,10 @@ class _ProfilePageState extends State<ProfilePage> {
} }
int status = await _userProvider.updateProfile( int status = await _userProvider.updateProfile(
user: _user, user: _user,
host: _settingProvider.host, host: _settingProvider.host!,
); );
if(status >= 200 && status < 300){ if(status >= 200 && status < 300){
_settingProvider.setUser(_userProvider.user); _settingProvider.setUser(_userProvider.user!);
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar( SnackBar(
content: Text( content: Text(

@ -1,26 +1,29 @@
import 'package:flutter/material.dart'; 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/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import '../../../controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import '../../../controllers/providers/api/service_requests_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import '../../../controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/validator/validator.dart'; import '../../../controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/models/issue.dart'; import '../../../controllers/validator/validator.dart';
import 'package:test_sa/models/service_request/service_request.dart'; import '../../../models/issue.dart';
import 'package:test_sa/models/subtitle.dart'; import '../../../models/service_request/service_request.dart';
import 'package:test_sa/views/app_style/colors.dart'; import '../../../models/subtitle.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import '../../../models/user.dart';
import 'package:test_sa/views/widgets/app_text_form_field.dart'; import '../../app_style/colors.dart';
import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import '../../app_style/sizing.dart';
import 'package:test_sa/views/widgets/buttons/app_button.dart'; import '../../widgets/app_text_form_field.dart';
import 'package:test_sa/views/widgets/issues/report_issue_item.dart'; import '../../widgets/buttons/app_back_button.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import '../../widgets/buttons/app_button.dart';
import '../../widgets/issues/report_issue_item.dart';
import '../../widgets/loaders/loading_manager.dart';
class ReportIssuesPage extends StatefulWidget { class ReportIssuesPage extends StatefulWidget {
static final String id = "/report-issue"; static final String id = "/report-issue";
final ServiceRequest serviceRequest; final ServiceRequest serviceRequest;
const ReportIssuesPage({Key key, this.serviceRequest}) : super(key: key); const ReportIssuesPage({Key? key, required this.serviceRequest}) : super(key: key);
@override @override
_ReportIssuesPageState createState() => _ReportIssuesPageState(); _ReportIssuesPageState createState() => _ReportIssuesPageState();
} }
@ -28,15 +31,15 @@ class ReportIssuesPage extends StatefulWidget {
class _ReportIssuesPageState extends State<ReportIssuesPage> { class _ReportIssuesPageState extends State<ReportIssuesPage> {
List<String> _issues = []; List<String> _issues = [];
Issue _issue = Issue(reports: []); Issue _issue = Issue(reports: []);
double _height; late double _height;
bool _isLoading = false; bool _isLoading = false;
ServiceRequestsProvider _serviceRequestsProvider; late ServiceRequestsProvider _serviceRequestsProvider;
UserProvider _userProvider; late UserProvider _userProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle; Subtitle _subtitle = AppLocalization.of(context)!.subtitle!;
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context); _serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
@ -64,7 +67,7 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
), ),
child: Text( child: Text(
_subtitle.reportIssue, _subtitle.reportIssue,
style: Theme.of(context).textTheme.headline5.copyWith( style: Theme.of(context).textTheme.headline5?.copyWith(
color: AColors.cyan, color: AColors.cyan,
fontWeight: FontWeight.bold fontWeight: FontWeight.bold
), ),
@ -103,8 +106,8 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
validator: (value) => validator: (value) =>
Validator.hasValue(value) Validator.hasValue(value!)
? null : _subtitle.titleValidateMessage, ? '' : _subtitle.titleValidateMessage,
textInputType: TextInputType.name, textInputType: TextInputType.name,
onSaved: (value){ onSaved: (value){
_issue.title = value; _issue.title = value;
@ -115,13 +118,13 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
children: List.generate( children: List.generate(
_issues.length, _issues.length,
(index) => ReportIssueItem( (index) => ReportIssueItem(
isSelected: _issue.reports.contains(index), isSelected: _issue.reports?.contains(index),
issueInfo: _issues[index], issueInfo: _issues[index],
onChange: (info,value){ onChange: (info,value){
if(value){ if(value){
_issue.reports.add(index); _issue.reports?.add(index);
} else { } else {
_issue.reports.remove(index); _issue.reports?.remove(index);
} }
setState(() {}); setState(() {});
}, },
@ -148,15 +151,15 @@ class _ReportIssuesPageState extends State<ReportIssuesPage> {
child: AButton( child: AButton(
text: _subtitle.submit, text: _subtitle.submit,
onPressed: () async { onPressed: () async {
if(!_formKey.currentState.validate()) if(!(_formKey.currentState?.validate()??false))
return; return;
_formKey.currentState.save(); _formKey.currentState?.save();
_issue.serviceRequestId = widget.serviceRequest.id; _issue.serviceRequestId = widget.serviceRequest.id;
_isLoading =true; _isLoading =true;
setState(() {}); setState(() {});
int status = await _serviceRequestsProvider.createIssueReport( int status = await _serviceRequestsProvider.createIssueReport(
user: _userProvider.user, user: _userProvider.user??User(),
host: _settingProvider.host, host: _settingProvider.host??"",
issue: _issue, issue: _issue,
); );
_isLoading =false; _isLoading =false;

@ -5,29 +5,31 @@ import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import '../../../../controllers/http_status_manger/http_status_manger.dart';
import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import '../../../../controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import '../../../../controllers/providers/api/service_requests_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import '../../../../controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/validator/validator.dart'; import '../../../../controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import '../../../../controllers/validator/validator.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import '../../../../extensions/int_extensions.dart';
import 'package:test_sa/models/device/device.dart'; import '../../../../extensions/widget_extensions.dart';
import 'package:test_sa/models/service_request/service_request.dart'; import '../../../../models/device/device.dart';
import 'package:test_sa/models/subtitle.dart'; import '../../../../models/service_request/service_request.dart';
import 'package:test_sa/views/app_style/colors.dart'; import '../../../../models/subtitle.dart';
import 'package:test_sa/views/widgets/app_text_form_field.dart'; import '../../../app_style/colors.dart';
import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import '../../../widgets/app_text_form_field.dart';
import 'package:test_sa/views/widgets/buttons/app_button.dart'; import '../../../widgets/buttons/app_back_button.dart';
import 'package:test_sa/views/widgets/equipment/device_button.dart'; import '../../../widgets/buttons/app_button.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import '../../../widgets/equipment/device_button.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import '../../../widgets/images/multi_image_picker.dart';
import 'package:test_sa/views/widgets/sound/record_sound.dart'; import '../../../widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/speech_to_text/speech_to_text.dart'; import '../../../widgets/sound/record_sound.dart';
import 'package:test_sa/views/widgets/status/service_request/service_request_defect_types_mune.dart'; import '../../../widgets/speech_to_text/speech_to_text.dart';
import 'package:test_sa/views/widgets/status/service_request/service_request_priority_mune.dart'; import '../../../widgets/status/service_request/service_request_defect_types_mune.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../widgets/status/service_request/service_request_priority_mune.dart';
import '../../../widgets/titles/app_sub_title.dart';
class CreateRequestPage extends StatefulWidget { class CreateRequestPage extends StatefulWidget {
static final String id = "/create-request"; static final String id = "/create-request";
@ -37,18 +39,18 @@ class CreateRequestPage extends StatefulWidget {
} }
class _CreateRequestPageState extends State<CreateRequestPage> { class _CreateRequestPageState extends State<CreateRequestPage> {
double _height; late double _height;
UserProvider _userProvider; late UserProvider _userProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
ServiceRequestsProvider _serviceRequestsProvider; late ServiceRequestsProvider _serviceRequestsProvider;
ServiceRequest _serviceRequest = ServiceRequest(); ServiceRequest _serviceRequest = ServiceRequest();
List<File> _deviceImages = []; List<File> _deviceImages = [];
bool _isLoading = false; bool _isLoading = false;
Device _device; late Device _device;
Subtitle _subtitle; late Subtitle _subtitle;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
TextEditingController _controller; late TextEditingController _controller;
@override @override
void initState() { void initState() {
@ -68,7 +70,7 @@ class _CreateRequestPageState extends State<CreateRequestPage> {
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context); _serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
_subtitle = AppLocalization.of(context).subtitle; _subtitle = AppLocalization.of(context)!.subtitle!;
return Scaffold( return Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
body: SafeArea( body: SafeArea(
@ -99,7 +101,7 @@ class _CreateRequestPageState extends State<CreateRequestPage> {
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: Text( child: Text(
_subtitle.newServiceRequest, _subtitle.newServiceRequest,
style: Theme.of(context).textTheme.headline5.copyWith(color: AColors.cyan, fontWeight: FontWeight.w600), style: Theme.of(context).textTheme.headline5?.copyWith(color: AColors.cyan, fontWeight: FontWeight.w600),
), ),
), ),
), ),
@ -107,21 +109,21 @@ class _CreateRequestPageState extends State<CreateRequestPage> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
12.height, 12.height,
_userProvider.user.hospital == null _userProvider.user?.hospital == null
? SizedBox.shrink() ? SizedBox.shrink()
: ATextFormField( : ATextFormField(
enable: false, enable: false,
initialValue: _userProvider.user.hospital?.name ?? _subtitle.noHospitalFound, initialValue: _userProvider.user?.hospital?.name ?? _subtitle.noHospitalFound,
hintText: _subtitle.hospital, hintText: _subtitle.hospital,
prefixIconData: FontAwesomeIcons.hospital, prefixIconData: FontAwesomeIcons.hospital,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
), ),
12.height, 12.height,
_userProvider.user.department == null _userProvider.user?.department == null
? SizedBox.shrink() ? SizedBox.shrink()
: ATextFormField( : ATextFormField(
enable: false, enable: false,
initialValue: _userProvider.user.department?.name ?? _subtitle.noUniteFound, initialValue: _userProvider.user?.department?.name ?? _subtitle.noUniteFound,
hintText: _subtitle.unite, hintText: _subtitle.unite,
prefixIconData: FontAwesomeIcons.hospitalUser, prefixIconData: FontAwesomeIcons.hospitalUser,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
@ -167,7 +169,7 @@ class _CreateRequestPageState extends State<CreateRequestPage> {
prefixIconData: FontAwesomeIcons.triangleExclamation, prefixIconData: FontAwesomeIcons.triangleExclamation,
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
validator: (value) => Validator.hasValue(value) ? null : _subtitle.maintenanceIssueRequired, validator: (value) => Validator.hasValue(value!) ? '' : _subtitle.maintenanceIssueRequired,
onSaved: (value) { onSaved: (value) {
_serviceRequest.maintenanceIssue = value; _serviceRequest.maintenanceIssue = value;
}, },
@ -184,19 +186,19 @@ class _CreateRequestPageState extends State<CreateRequestPage> {
child: AButton( child: AButton(
text: _subtitle.submit, text: _subtitle.submit,
onPressed: () async { onPressed: () async {
if (!_formKey.currentState.validate()) return; if (!(_formKey.currentState?.validate()??false)) return;
_formKey.currentState.save(); _formKey.currentState?.save();
_serviceRequest.deviceId = _device?.id ?? ""; _serviceRequest.deviceId = _device?.id ?? "";
_isLoading = true; _isLoading = true;
setState(() {}); setState(() {});
_serviceRequest.devicePhotos = _deviceImages.map((e) => base64Encode(e.readAsBytesSync())).toList(); _serviceRequest.devicePhotos = _deviceImages.map((e) => base64Encode(e.readAsBytesSync())).toList();
if (_serviceRequest.audio != null) { if (_serviceRequest.audio != null) {
final file = File(_serviceRequest.audio); final file = File(_serviceRequest.audio!);
_serviceRequest.audio = base64Encode(file.readAsBytesSync()); _serviceRequest.audio = base64Encode(file.readAsBytesSync());
} }
int status = await _serviceRequestsProvider.createRequest( int status = await _serviceRequestsProvider.createRequest(
user: _userProvider.user, user: _userProvider.user!,
host: _settingProvider.host, host: _settingProvider.host??"",
serviceRequest: _serviceRequest, serviceRequest: _serviceRequest,
); );
_isLoading = false; _isLoading = false;

@ -1,14 +1,16 @@
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/service_requests_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/models/service_request/service_request.dart';
import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/pages/user/requests/request_details.dart';
import 'package:test_sa/views/widgets/loaders/app_loading.dart';
import 'package:test_sa/views/widgets/loaders/failed_loading.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../../../../controllers/localization/localization.dart';
import '../../../../controllers/providers/api/service_requests_provider.dart';
import '../../../../controllers/providers/api/user_provider.dart';
import '../../../../controllers/providers/settings/setting_provider.dart';
import '../../../../models/service_request/service_request.dart';
import '../../../../models/subtitle.dart';
import '../../../widgets/loaders/app_loading.dart';
import '../../../widgets/loaders/failed_loading.dart';
import 'request_details.dart';
class FutureRequestServiceDetails extends StatefulWidget { class FutureRequestServiceDetails extends StatefulWidget {
static final String id = "/service-request-details"; static final String id = "/service-request-details";
@ -18,20 +20,20 @@ class FutureRequestServiceDetails extends StatefulWidget {
class _FutureRequestServiceDetailsState extends State<FutureRequestServiceDetails> { class _FutureRequestServiceDetailsState extends State<FutureRequestServiceDetails> {
UserProvider _userProvider; late UserProvider _userProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
String requestId = ModalRoute.of(context).settings.arguments; String requestId = ModalRoute.of(context)!.settings.arguments.toString();
Subtitle _subtitle = AppLocalization.of(context).subtitle; Subtitle _subtitle = AppLocalization.of(context)!.subtitle!;
return Scaffold( return Scaffold(
body: FutureBuilder<ServiceRequest>( body: FutureBuilder<ServiceRequest>(
future: ServiceRequestsProvider().getSingleServiceRequest( future: ServiceRequestsProvider().getSingleServiceRequest(
requestId: requestId, requestId: requestId,
user: _userProvider.user, user: _userProvider.user!,
host: _settingProvider.host, host: _settingProvider.host??"",
subtitle: _subtitle subtitle: _subtitle
), ),
builder: (BuildContext context, AsyncSnapshot<ServiceRequest> snapshot){ builder: (BuildContext context, AsyncSnapshot<ServiceRequest> snapshot){
@ -42,7 +44,7 @@ class _FutureRequestServiceDetailsState extends State<FutureRequestServiceDetail
); );
if(snapshot.hasData){ if(snapshot.hasData){
return RequestDetailsPage( return RequestDetailsPage(
serviceRequest: snapshot.data, serviceRequest: snapshot.data!,
); );
} }
return Center(child: ALoading()); return Center(child: ALoading());

@ -6,6 +6,7 @@ import 'package:flutter/rendering.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../../../../../controllers/http_status_manger/http_status_manger.dart';
import '../../../../../controllers/localization/localization.dart'; import '../../../../../controllers/localization/localization.dart';
import '../../../../../controllers/providers/api/service_requests_provider.dart'; import '../../../../../controllers/providers/api/service_requests_provider.dart';
import '../../../../../controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; import '../../../../../controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart';
@ -14,21 +15,27 @@ import '../../../../../controllers/providers/settings/setting_provider.dart';
import '../../../../../controllers/validator/validator.dart'; import '../../../../../controllers/validator/validator.dart';
import '../../../../../models/device/device.dart'; import '../../../../../models/device/device.dart';
import '../../../../../models/lookup.dart'; import '../../../../../models/lookup.dart';
import '../../../../../models/part.dart';
import '../../../../../models/service_report.dart'; import '../../../../../models/service_report.dart';
import '../../../../../models/service_request/service_request.dart'; import '../../../../../models/service_request/service_request.dart';
import '../../../../../models/subtitle.dart'; import '../../../../../models/subtitle.dart';
import '../../../../app_style/colors.dart'; import '../../../../app_style/colors.dart';
import '../../../../app_style/sizing.dart'; import '../../../../app_style/sizing.dart';
import '../../../../widgets/app_text_form_field.dart'; import '../../../../widgets/app_text_form_field.dart';
import '../../../../widgets/buttons/app_back_button.dart';
import '../../../../widgets/buttons/app_button.dart';
import '../../../../widgets/date_and_time/date_picker.dart'; import '../../../../widgets/date_and_time/date_picker.dart';
import '../../../../widgets/equipment/auto_complete_devices_field.dart'; import '../../../../widgets/equipment/auto_complete_devices_field.dart';
import '../../../../widgets/images/mini_one_image_picker.dart'; import '../../../../widgets/images/mini_one_image_picker.dart';
import '../../../../widgets/loaders/loading_manager.dart'; import '../../../../widgets/loaders/loading_manager.dart';
import '../../../../widgets/parts/auto_complete_parts_field.dart';
import '../../../../widgets/parts/part_item.dart';
import '../../../../widgets/speech_to_text/speech_to_text.dart'; import '../../../../widgets/speech_to_text/speech_to_text.dart';
import '../../../../widgets/status/report/service_report_last_call.dart'; import '../../../../widgets/status/report/service_report_last_call.dart';
import '../../../../widgets/status/report/service_report_reasons.dart'; import '../../../../widgets/status/report/service_report_reasons.dart';
import '../../../../widgets/status/report/service_report_status.dart'; import '../../../../widgets/status/report/service_report_status.dart';
import '../../../../widgets/status/report/service_status.dart'; import '../../../../widgets/status/report/service_status.dart';
import '../../../../widgets/timer/app_timer.dart';
import '../../../../widgets/titles/app_sub_title.dart'; import '../../../../widgets/titles/app_sub_title.dart';
class CreateServiceReport extends StatefulWidget { class CreateServiceReport extends StatefulWidget {
static final String id = "/create-service-report"; static final String id = "/create-service-report";
@ -214,7 +221,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
const SizedBox.shrink(), const SizedBox.shrink(),
AutoCompleteDeviceField( AutoCompleteDeviceField(
hospitalId: widget.request?.hospitalId??"", hospitalId: widget.request?.hospitalId??"",
initialValue: _serviceReport?.device, initialValue: _serviceReport!.device!,
onPick: (id){ onPick: (id){
_serviceReport?.device?.id = id; _serviceReport?.device?.id = id;
}, },
@ -305,8 +312,8 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
validator: (value) => validator: (value) =>
Validator.hasValue(value) Validator.hasValue(value!)
? null : _subtitle?.requiredWord, ? '' : _subtitle?.requiredWord??"",
textInputType: TextInputType.number, textInputType: TextInputType.number,
onSaved: (value){ onSaved: (value){
_serviceReport?.invoiceNumber = value; _serviceReport?.invoiceNumber = value;
@ -327,8 +334,8 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
validator: (value) => validator: (value) =>
Validator.hasValue(value) Validator.hasValue(value!)
? null : _subtitle?.requiredWord, ? '' : _subtitle?.requiredWord??"",
textInputType: TextInputType.text, textInputType: TextInputType.text,
onSaved: (value){ onSaved: (value){
_serviceReport?.invoiceCode = value; _serviceReport?.invoiceCode = value;
@ -362,8 +369,8 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
controller: _faultController, controller: _faultController,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
validator: (value) => validator: (value) =>
Validator.hasValue(value) Validator.hasValue(value!)
? null : _subtitle?.requiredWord, ? '' : _subtitle?.requiredWord??"",
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
onSaved: (value){ onSaved: (value){
_serviceReport?.faultDescription = value; _serviceReport?.faultDescription = value;
@ -391,8 +398,8 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
controller: _workPreformedController, controller: _workPreformedController,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
validator: (value) => validator: (value) =>
Validator.hasValue(value) Validator.hasValue(value!)
? null : _subtitle?.requiredWord, ? '' : _subtitle?.requiredWord??"",
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
onSaved: (value){ onSaved: (value){
_serviceReport?.workPreformed = value; _serviceReport?.workPreformed = value;
@ -446,12 +453,12 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.workingHours), ASubTitle(_subtitle?.workingHours??""),
const SizedBox(height: 8,), const SizedBox(height: 8,),
AppTimer( AppTimer(
timer: _serviceReport.timer, timer: _serviceReport?.timer,
onChange: (timer) async{ onChange: (timer) async{
_serviceReport.timer = timer; _serviceReport?.timer = timer;
return true; return true;
}, },
), ),
@ -476,7 +483,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.travelingHours), ASubTitle(_subtitle?.travelingHours??""),
const SizedBox(height: 4,), const SizedBox(height: 4,),
ATextFormField( ATextFormField(
initialValue: _serviceReport?.travelingHours, initialValue: _serviceReport?.travelingHours,
@ -488,7 +495,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
// ? null : _subtitle.requiredWord, // ? null : _subtitle.requiredWord,
textInputType: TextInputType.number, textInputType: TextInputType.number,
onSaved: (value){ onSaved: (value){
_serviceReport.travelingHours = value; _serviceReport?.travelingHours = value;
}, },
), ),
], ],
@ -527,7 +534,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.jobSheetNumber), ASubTitle(_subtitle?.jobSheetNumber??""),
const SizedBox(height: 4,), const SizedBox(height: 4,),
ATextFormField( ATextFormField(
initialValue: _serviceReport?.jobSheetNumber, initialValue: _serviceReport?.jobSheetNumber,
@ -535,7 +542,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
textInputType: TextInputType.name, textInputType: TextInputType.name,
onSaved: (value){ onSaved: (value){
_serviceReport.jobSheetNumber = value; _serviceReport?.jobSheetNumber = value;
}, },
), ),
], ],
@ -552,14 +559,14 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.partNumber), ASubTitle(_subtitle?.partNumber??""),
_validate && _serviceReport.parts == null ? _validate && _serviceReport?.parts == null ?
ASubTitle(_subtitle.requiredWord,color: Colors.red,): ASubTitle(_subtitle?.requiredWord??"",color: Colors.red,):
const SizedBox.shrink(), const SizedBox.shrink(),
const SizedBox(height: 4,), const SizedBox(height: 4,),
AutoCompletePartsField( AutoCompletePartsField(
onPick: (part){ onPick: (part){
_serviceReport.parts.add(part); _serviceReport?.parts?.add(part);
}, },
), ),
], ],
@ -571,19 +578,19 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
SizedBox(height: 8*AppStyle.getScaleFactor(context),), SizedBox(height: 8*AppStyle.getScaleFactor(context),),
Row( Row(
children: [ children: [
Expanded(flex:3,child: Text(_subtitle.number)), Expanded(flex:3,child: Text(_subtitle?.number??"")),
Expanded(flex: 1,child: Text(_subtitle.quantity)), Expanded(flex: 1,child: Text(_subtitle?.quantity??"")),
], ],
), ),
Column( Column(
children: List.generate( children: List.generate(
_serviceReport.parts.length, _serviceReport!.parts!.length,
(index) { (index) {
Part _part = _serviceReport.parts[index]; Part _part = _serviceReport!.parts![index];
return PartItem( return PartItem(
part: _part, part: _part,
onDelete: (part){ onDelete: (part){
_serviceReport.parts.remove(part); _serviceReport!.parts!.remove(part);
setState(() {}); setState(() {});
}, },
); );
@ -599,30 +606,30 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
Padding( Padding(
padding: const EdgeInsets.all(16.0), padding: const EdgeInsets.all(16.0),
child: AButton( child: AButton(
text: _subtitle.submit, text: _subtitle?.submit??"",
onPressed: () async { onPressed: () async {
_validate = true; _validate = true;
if(!_formKey.currentState.validate()){ if(!(_formKey.currentState?.validate()??false)){
setState(() {}); setState(() {});
return; return;
} }
if(!_serviceReport.validate()) return; if(!(_serviceReport?.validate()??false)) return;
_formKey.currentState.save(); _formKey.currentState?.save();
_isLoading =true; _isLoading =true;
setState(() {}); setState(() {});
int status = await _serviceRequestsProvider.createServiceReport( int? status = await _serviceRequestsProvider?.createServiceReport(
user: _userProvider.user, user: _userProvider!.user!,
host: _settingProvider.host, host: _settingProvider?.host??"",
report: _serviceReport, report: _serviceReport!,
request: widget.request request: widget.request!
); );
_isLoading =false; _isLoading =false;
setState(() {}); setState(() {});
if(status >= 200 && status < 300){ if(status != null && status >= 200 && status < 300){
Fluttertoast.showToast( Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully, msg: _subtitle?.requestCompleteSuccessfully??"",
); );
Navigator.of(context).pop(); Navigator.of(context).pop();
Navigator.of(context).pop(); Navigator.of(context).pop();

@ -5,42 +5,44 @@ import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.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/http_status_manger/http_status_manger.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import '../../../../../controllers/http_status_manger/http_status_manger.dart';
import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import '../../../../../controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; import '../../../../../controllers/providers/api/service_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import '../../../../../controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import '../../../../../controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/validator/validator.dart'; import '../../../../../controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/models/part.dart'; import '../../../../../controllers/validator/validator.dart';
import 'package:test_sa/models/service_report.dart'; import '../../../../../models/part.dart';
import 'package:test_sa/models/service_request/service_request.dart'; import '../../../../../models/service_report.dart';
import 'package:test_sa/models/subtitle.dart'; import '../../../../../models/service_request/service_request.dart';
import 'package:test_sa/views/app_style/colors.dart'; import '../../../../../models/subtitle.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import '../../../../app_style/colors.dart';
import 'package:test_sa/views/widgets/app_text_form_field.dart'; import '../../../../app_style/sizing.dart';
import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import '../../../../widgets/app_text_form_field.dart';
import 'package:test_sa/views/widgets/buttons/app_button.dart'; import '../../../../widgets/buttons/app_back_button.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import '../../../../widgets/buttons/app_button.dart';
import 'package:test_sa/views/widgets/equipment/auto_complete_devices_field.dart'; import '../../../../widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart'; import '../../../../widgets/equipment/auto_complete_devices_field.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import '../../../../widgets/images/mini_one_image_picker.dart';
import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; import '../../../../widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/parts/part_item.dart'; import '../../../../widgets/parts/auto_complete_parts_field.dart';
import 'package:test_sa/views/widgets/speech_to_text/speech_to_text.dart'; import '../../../../widgets/parts/part_item.dart';
import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart'; import '../../../../widgets/speech_to_text/speech_to_text.dart';
import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart'; import '../../../../widgets/status/report/service_report_last_call.dart';
import 'package:test_sa/views/widgets/status/report/service_report_status.dart'; import '../../../../widgets/status/report/service_report_reasons.dart';
import 'package:test_sa/views/widgets/status/report/service_report_type.dart'; import '../../../../widgets/status/report/service_report_status.dart';
import 'package:test_sa/views/widgets/status/report/service_status.dart'; import '../../../../widgets/status/report/service_report_type.dart';
import 'package:test_sa/views/widgets/timer/app_timer.dart'; import '../../../../widgets/status/report/service_status.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../../widgets/timer/app_timer.dart';
import '../../../../widgets/titles/app_sub_title.dart';
class EditServiceReport extends StatefulWidget { class EditServiceReport extends StatefulWidget {
static final String id = "/edit-service-report"; static final String id = "/edit-service-report";
final ServiceRequest request ; final ServiceRequest request ;
final ServiceReport report; final ServiceReport report;
const EditServiceReport({Key key, this.request, this.report}) : super(key: key); const EditServiceReport({Key? key, required this.request, required this.report}) : super(key: key);
@override @override
_EditServiceReportState createState() => _EditServiceReportState(); _EditServiceReportState createState() => _EditServiceReportState();
} }
@ -48,16 +50,16 @@ class EditServiceReport extends StatefulWidget {
class _EditServiceReportState extends State<EditServiceReport> with TickerProviderStateMixin{ class _EditServiceReportState extends State<EditServiceReport> with TickerProviderStateMixin{
UserProvider _userProvider; late UserProvider _userProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
ServiceRequestsProvider _serviceRequestsProvider; late ServiceRequestsProvider _serviceRequestsProvider;
bool _validate = false; bool _validate = false;
ServiceReport _serviceReport; late ServiceReport _serviceReport;
bool _isLoading = false; bool _isLoading = false;
Subtitle _subtitle; late Subtitle _subtitle;
File _image; late File _image;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
TextEditingController _faultController = TextEditingController(); TextEditingController _faultController = TextEditingController();
@ -80,7 +82,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context); _serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
_subtitle = AppLocalization.of(context).subtitle; _subtitle = AppLocalization.of(context)!.subtitle!;
return Scaffold( return Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
body: SafeArea( body: SafeArea(
@ -102,7 +104,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: Text( child: Text(
_subtitle.editServiceReport, _subtitle.editServiceReport,
style: Theme.of(context).textTheme.headline5.copyWith( style: Theme.of(context).textTheme.headline5?.copyWith(
color: AColors.cyan, color: AColors.cyan,
fontSize: 28, fontSize: 28,
fontWeight: FontWeight.bold fontWeight: FontWeight.bold
@ -117,7 +119,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
color: AColors.grey, color: AColors.grey,
borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)),
boxShadow: [ boxShadow: [
const BoxShadow( BoxShadow(
color: AColors.grey, color: AColors.grey,
offset: Offset(0,-1), offset: Offset(0,-1),
) )
@ -135,7 +137,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
ASubTitle("${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}",font: 14,), ASubTitle("${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}",font: 14,),
Text( Text(
"${_subtitle.customer}: ${widget.request.hospitalName}", "${_subtitle.customer}: ${widget.request.hospitalName}",
style: Theme.of(context).textTheme.subtitle1.copyWith( style: Theme.of(context).textTheme.subtitle1?.copyWith(
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
fontSize: 12, fontSize: 12,
), ),
@ -212,9 +214,9 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
const SizedBox.shrink(), const SizedBox.shrink(),
AutoCompleteDeviceField( AutoCompleteDeviceField(
hospitalId: widget.request.hospitalId, hospitalId: widget.request.hospitalId,
initialValue: _serviceReport.device, initialValue: _serviceReport.device!,
onPick: (id){ onPick: (id){
_serviceReport.device.id = id; _serviceReport.device?.id = id;
}, },
), ),
const SizedBox(height: 8,), const SizedBox(height: 8,),
@ -303,8 +305,8 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
validator: (value) => validator: (value) =>
Validator.hasValue(value) Validator.hasValue(value!)
? null : _subtitle.requiredWord, ? '' : _subtitle.requiredWord,
textInputType: TextInputType.number, textInputType: TextInputType.number,
onSaved: (value){ onSaved: (value){
_serviceReport.invoiceNumber = value; _serviceReport.invoiceNumber = value;
@ -325,8 +327,8 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
validator: (value) => validator: (value) =>
Validator.hasValue(value) Validator.hasValue(value!)
? null : _subtitle.requiredWord, ? '' : _subtitle.requiredWord,
textInputType: TextInputType.text, textInputType: TextInputType.text,
onSaved: (value){ onSaved: (value){
_serviceReport.invoiceCode = value; _serviceReport.invoiceCode = value;
@ -360,8 +362,8 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
controller: _faultController, controller: _faultController,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
validator: (value) => validator: (value) =>
Validator.hasValue(value) Validator.hasValue(value!)
? null : _subtitle.requiredWord, ? '' : _subtitle.requiredWord,
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
onSaved: (value){ onSaved: (value){
_serviceReport.faultDescription = value; _serviceReport.faultDescription = value;
@ -389,8 +391,8 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
controller: _workPreformedController, controller: _workPreformedController,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
validator: (value) => validator: (value) =>
Validator.hasValue(value) Validator.hasValue(value!)
? null : _subtitle.requiredWord, ? '' : _subtitle.requiredWord,
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
onSaved: (value){ onSaved: (value){
_serviceReport.workPreformed = value; _serviceReport.workPreformed = value;
@ -482,8 +484,8 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
hintText: "i.e 3, 3.5, 4", hintText: "i.e 3, 3.5, 4",
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
validator: (value) => validator: (value) =>
Validator.isNumeric(value) Validator.isNumeric(value!)
? null : _subtitle.requiredWord, ? '' : _subtitle.requiredWord,
textInputType: TextInputType.number, textInputType: TextInputType.number,
onSaved: (value){ onSaved: (value){
_serviceReport.travelingHours = value; _serviceReport.travelingHours = value;
@ -510,8 +512,8 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
hintText: "i.e 3, 3.5, 4", hintText: "i.e 3, 3.5, 4",
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
validator: (value) => validator: (value) =>
Validator.isNumeric(value) Validator.isNumeric(value!)
? null : _subtitle.requiredWord, ? '' : _subtitle.requiredWord,
textInputType: TextInputType.number, textInputType: TextInputType.number,
onSaved: (value){ onSaved: (value){
_serviceReport.operatingHours = value; _serviceReport.operatingHours = value;
@ -557,7 +559,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
const SizedBox(height: 4,), const SizedBox(height: 4,),
AutoCompletePartsField( AutoCompletePartsField(
onPick: (part){ onPick: (part){
_serviceReport.parts.add(part); _serviceReport.parts?.add(part);
setState(() {}); setState(() {});
}, },
), ),
@ -576,13 +578,13 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
), ),
Column( Column(
children: List.generate( children: List.generate(
_serviceReport.parts.length, _serviceReport.parts!.length,
(index) { (index) {
Part _part = _serviceReport.parts[index]; Part _part = _serviceReport.parts![index];
return PartItem( return PartItem(
part: _part, part: _part,
onDelete: (part){ onDelete: (part){
_serviceReport.parts.remove(part); _serviceReport.parts?.remove(part);
setState(() {}); setState(() {});
}, },
); );
@ -601,7 +603,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
text: _subtitle.update, text: _subtitle.update,
onPressed: () async { onPressed: () async {
_validate = true; _validate = true;
if(!_formKey.currentState.validate()){ if(!(_formKey.currentState?.validate()??false)){
setState(() {}); setState(() {});
return; return;
} }
@ -609,14 +611,14 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
setState(() {}); setState(() {});
return; return;
} }
_formKey.currentState.save(); _formKey.currentState?.save();
_isLoading =true; _isLoading =true;
setState(() {}); setState(() {});
int status = await _serviceRequestsProvider.updateServiceReport( int status = await _serviceRequestsProvider.updateServiceReport(
user: _userProvider.user, user: _userProvider.user!,
host: _settingProvider.host, host: _settingProvider.host??"",
report: _serviceReport, report: _serviceReport,
request: widget.request request: widget.request
); );

@ -1,20 +1,20 @@
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/service_requests_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/models/service_report.dart';
import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/widgets/loaders/app_loading.dart';
import 'package:test_sa/views/widgets/loaders/failed_loading.dart';
import '../../../../../controllers/localization/localization.dart';
import '../../../../../controllers/providers/api/service_requests_provider.dart';
import '../../../../../controllers/providers/api/user_provider.dart';
import '../../../../../controllers/providers/settings/setting_provider.dart';
import '../../../../../models/service_report.dart';
import '../../../../../models/service_request/service_request.dart';
import '../../../../../models/subtitle.dart';
import '../../../../widgets/loaders/app_loading.dart';
import '../../../../widgets/loaders/failed_loading.dart';
import 'edit_service_report.dart'; import 'edit_service_report.dart';
class FutureServiceReport extends StatefulWidget { class FutureServiceReport extends StatefulWidget {
final ServiceRequest request; final ServiceRequest request;
const FutureServiceReport({Key key, this.request}) : super(key: key); const FutureServiceReport({Key? key, required this.request}) : super(key: key);
@override @override
_FutureServiceReportState createState() => _FutureServiceReportState(); _FutureServiceReportState createState() => _FutureServiceReportState();
@ -22,19 +22,19 @@ class FutureServiceReport extends StatefulWidget {
class _FutureServiceReportState extends State<FutureServiceReport> { class _FutureServiceReportState extends State<FutureServiceReport> {
UserProvider _userProvider; late UserProvider _userProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
Subtitle _subtitle = AppLocalization.of(context).subtitle; Subtitle _subtitle = AppLocalization.of(context)!.subtitle!;
return Scaffold( return Scaffold(
body: FutureBuilder<ServiceReport>( body: FutureBuilder<ServiceReport>(
future: ServiceRequestsProvider().getSingleServiceReport( future: ServiceRequestsProvider().getSingleServiceReport(
reportId: widget.request.reportID, reportId: widget.request.reportID??"",
user: _userProvider.user, user: _userProvider.user!,
host: _settingProvider.host, host: _settingProvider.host??"",
subtitle: _subtitle subtitle: _subtitle
), ),
builder: (BuildContext context, AsyncSnapshot<ServiceReport> snapshot){ builder: (BuildContext context, AsyncSnapshot<ServiceReport> snapshot){
@ -45,7 +45,7 @@ class _FutureServiceReportState extends State<FutureServiceReport> {
); );
if(snapshot.hasData){ if(snapshot.hasData){
return EditServiceReport( return EditServiceReport(
report: snapshot.data, report: snapshot.data!,
request: widget.request, request: widget.request,
); );
} }

@ -2,39 +2,40 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/service_requests_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/models/enums/user_types.dart';
import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/models/subtitle.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/requests/report/create_service_report.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/dialogs/dialog.dart';
import 'package:test_sa/views/widgets/images/images_list.dart';
import 'package:test_sa/views/widgets/loaders/image_loader.dart';
import 'package:test_sa/views/widgets/requests/info_row.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart';
import 'package:test_sa/views/widgets/requests/service_request_update_dialog.dart';
import 'package:test_sa/views/widgets/sound/sound_player.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
import '../../../../controllers/http_status_manger/http_status_manger.dart';
import '../../../../controllers/localization/localization.dart';
import '../../../../controllers/providers/api/service_requests_provider.dart';
import '../../../../controllers/providers/api/user_provider.dart';
import '../../../../controllers/providers/settings/setting_provider.dart';
import '../../../../models/enums/user_types.dart';
import '../../../../models/service_request/service_request.dart';
import '../../../../models/subtitle.dart';
import '../../../app_style/colors.dart';
import '../../../app_style/sizing.dart';
import '../../../widgets/buttons/app_back_button.dart';
import '../../../widgets/buttons/app_button.dart';
import '../../../widgets/buttons/app_icon_button.dart';
import '../../../widgets/dialogs/dialog.dart';
import '../../../widgets/images/images_list.dart';
import '../../../widgets/loaders/image_loader.dart';
import '../../../widgets/requests/info_row.dart';
import '../../../widgets/requests/request_status.dart';
import '../../../widgets/requests/service_request_update_dialog.dart';
import '../../../widgets/sound/sound_player.dart';
import '../../../widgets/titles/app_sub_title.dart';
import '../report_issues_page.dart'; import '../report_issues_page.dart';
import 'report/create_service_report.dart';
import 'report/future_service_report.dart'; import 'report/future_service_report.dart';
class RequestDetailsPage extends StatelessWidget { class RequestDetailsPage extends StatelessWidget {
static final String id = "/call-details"; static final String id = "/call-details";
final ServiceRequest serviceRequest; final ServiceRequest serviceRequest;
const RequestDetailsPage({Key key, this.serviceRequest}) : super(key: key); const RequestDetailsPage({Key? key, required this.serviceRequest}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle; Subtitle _subtitle = AppLocalization.of(context)!.subtitle!;
UserProvider _userProvider = Provider.of<UserProvider>(context); UserProvider _userProvider = Provider.of<UserProvider>(context);
SettingProvider _settingProvider = Provider.of<SettingProvider>(context); SettingProvider _settingProvider = Provider.of<SettingProvider>(context);
ServiceRequestsProvider _serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context); ServiceRequestsProvider _serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
@ -54,7 +55,7 @@ class RequestDetailsPage extends StatelessWidget {
child: Center( child: Center(
child: Text( child: Text(
_subtitle.details, _subtitle.details,
style: Theme.of(context).textTheme.headline6.copyWith( style: Theme.of(context).textTheme.headline6?.copyWith(
color: AColors.white, color: AColors.white,
fontStyle: FontStyle.italic fontStyle: FontStyle.italic
), ),
@ -62,7 +63,7 @@ class RequestDetailsPage extends StatelessWidget {
), ),
), ),
Visibility( Visibility(
visible: _userProvider.user.type == UsersTypes.normal_user, visible: _userProvider.user?.type == UsersTypes.normal_user,
replacement: AIconButton( replacement: AIconButton(
iconData: Icons.edit, iconData: Icons.edit,
color: AColors.white, color: AColors.white,
@ -122,7 +123,7 @@ class RequestDetailsPage extends StatelessWidget {
), ),
), ),
serviceRequest.devicePhotos.isEmpty ? SizedBox.shrink(): (serviceRequest.devicePhotos?.isEmpty??false) ? SizedBox.shrink():
Column( Column(
children: [ children: [
SizedBox(height: 8,), SizedBox(height: 8,),
@ -135,7 +136,7 @@ class RequestDetailsPage extends StatelessWidget {
body: InteractiveViewer( body: InteractiveViewer(
child: Center( child: Center(
child: ImageLoader( child: ImageLoader(
url: serviceRequest.devicePhotos.first, url: serviceRequest.devicePhotos?.first,
boxFit: BoxFit.contain, boxFit: BoxFit.contain,
), ),
), ),
@ -148,7 +149,7 @@ class RequestDetailsPage extends StatelessWidget {
height: 140 * AppStyle.getScaleFactor(context), height: 140 * AppStyle.getScaleFactor(context),
width: MediaQuery.of(context).size.width, width: MediaQuery.of(context).size.width,
child: ImageLoader( child: ImageLoader(
url: serviceRequest.devicePhotos.first, url: serviceRequest.devicePhotos?.first,
boxFit: BoxFit.cover, boxFit: BoxFit.cover,
), ),
), ),
@ -157,7 +158,7 @@ class RequestDetailsPage extends StatelessWidget {
SizedBox( SizedBox(
height: 60* AppStyle.getScaleFactor(context), height: 60* AppStyle.getScaleFactor(context),
child: ImagesList( child: ImagesList(
images: serviceRequest.devicePhotos, images: serviceRequest.devicePhotos!,
), ),
), ),
], ],
@ -208,7 +209,7 @@ class RequestDetailsPage extends StatelessWidget {
serviceRequest.nextVisitDate == null ? SizedBox.shrink() : serviceRequest.nextVisitDate == null ? SizedBox.shrink() :
RequestInfoRow( RequestInfoRow(
title: _subtitle.nextVisitDate, title: _subtitle.nextVisitDate,
info: DateFormat('EE dd/MM/yyyy').format(serviceRequest.nextVisitDate), info: DateFormat('EE dd/MM/yyyy').format(serviceRequest.nextVisitDate!),
), ),
Row( Row(
children: [ children: [
@ -220,7 +221,7 @@ class RequestDetailsPage extends StatelessWidget {
), ),
), ),
StatusLabel(label: serviceRequest.statusLabel, StatusLabel(label: serviceRequest.statusLabel,
color: AColors.getRequestStatusColor(serviceRequest.statusValue) color: AColors.getRequestStatusColor(serviceRequest.statusValue!)
), ),
], ],
), ),
@ -270,8 +271,8 @@ class RequestDetailsPage extends StatelessWidget {
} }
); );
int status = await _serviceRequestsProvider.createDuplicatedReport( int status = await _serviceRequestsProvider.createDuplicatedReport(
host: _settingProvider.host, host: _settingProvider.host??"",
user: _userProvider.user, user: _userProvider.user!,
request: serviceRequest request: serviceRequest
); );
Navigator.of(context).pop(); Navigator.of(context).pop();
@ -289,7 +290,7 @@ class RequestDetailsPage extends StatelessWidget {
) )
], ],
), ),
serviceRequest.viewReport ? serviceRequest.viewReport??false ?
ListView( ListView(
padding: EdgeInsets.symmetric(horizontal: 16), padding: EdgeInsets.symmetric(horizontal: 16),
children: [ children: [
@ -309,7 +310,7 @@ class RequestDetailsPage extends StatelessWidget {
title: _subtitle.jobSheetNumber, title: _subtitle.jobSheetNumber,
info: serviceRequest.jobSheetNumber, info: serviceRequest.jobSheetNumber,
), ),
_userProvider.user.type == UsersTypes.engineer ? _userProvider.user?.type == UsersTypes.engineer ?
Padding( Padding(
padding: EdgeInsets.all(32), padding: EdgeInsets.all(32),
child: AButton( child: AButton(
@ -327,7 +328,7 @@ class RequestDetailsPage extends StatelessWidget {
): SizedBox.shrink(), ): SizedBox.shrink(),
], ],
): ):
_userProvider.user.type == UsersTypes.engineer ? _userProvider.user?.type == UsersTypes.engineer ?
Center( Center(
child: Padding( child: Padding(
padding: EdgeInsets.all(32), padding: EdgeInsets.all(32),

@ -1,17 +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/controllers/providers/api/service_requests_provider.dart'; import '../../../../controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import '../../../../controllers/providers/api/service_requests_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import '../../../../controllers/providers/api/user_provider.dart';
import 'package:test_sa/models/service_request/service_request_search.dart'; import '../../../../controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/models/subtitle.dart'; import '../../../../models/service_request/service_request_search.dart';
import 'package:test_sa/views/app_style/colors.dart'; import '../../../../models/subtitle.dart';
import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import '../../../app_style/colors.dart';
import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; import '../../../widgets/buttons/app_back_button.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import '../../../widgets/buttons/app_icon_button.dart';
import 'package:test_sa/views/widgets/requests/service_request_list.dart'; import '../../../widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/search/service_request_search_bar.dart'; import '../../../widgets/requests/service_request_list.dart';
import '../../../widgets/search/service_request_search_bar.dart';
class ServiceRequestsPage extends StatefulWidget { class ServiceRequestsPage extends StatefulWidget {
static final String id = "/service-requests"; static final String id = "/service-requests";
@override @override
@ -20,9 +22,9 @@ class ServiceRequestsPage extends StatefulWidget {
class _ServiceRequestsPageState extends State<ServiceRequestsPage> class _ServiceRequestsPageState extends State<ServiceRequestsPage>
with TickerProviderStateMixin{ with TickerProviderStateMixin{
ServiceRequestsProvider _serviceRequestsProvider; late ServiceRequestsProvider _serviceRequestsProvider;
UserProvider _userProvider; late UserProvider _userProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
bool _expandedSearch = false; bool _expandedSearch = false;
bool _firstTime = true; bool _firstTime = true;
@override @override
@ -30,7 +32,7 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage>
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context); _serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
Subtitle _subtitle = AppLocalization.of(context).subtitle; Subtitle _subtitle = AppLocalization.of(context)!.subtitle!;
if(_firstTime){ if(_firstTime){
_serviceRequestsProvider.reset(); _serviceRequestsProvider.reset();
_firstTime = false; _firstTime = false;
@ -45,9 +47,9 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage>
onRefresh: () async { onRefresh: () async {
_serviceRequestsProvider.reset(); _serviceRequestsProvider.reset();
await _serviceRequestsProvider.getRequests( await _serviceRequestsProvider.getRequests(
user: _userProvider.user, user: _userProvider.user!,
host: _settingProvider.host, host: _settingProvider.host??"",
hospitalId: _userProvider.user.hospital.id, hospitalId: _userProvider.user!.hospital!.id,
); );
}, },
child: Stack( child: Stack(
@ -66,10 +68,9 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage>
child: Center( child: Center(
child: Text( child: Text(
_subtitle.serviceRequests, _subtitle.serviceRequests,
style: Theme.of(context).textTheme.headline6.copyWith( style: Theme.of(context).textTheme.headline6?.copyWith(
color: AColors.white, color: AColors.white,
fontStyle: FontStyle.italic fontStyle: FontStyle.italic ),
),
), ),
), ),
), ),
@ -80,12 +81,12 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage>
buttonSize: 42, buttonSize: 42,
backgroundColor: AColors.white, backgroundColor: AColors.white,
onPressed: () async { onPressed: () async {
ServiceRequestSearch _temp = await showModalBottomSheet( ServiceRequestSearch? _temp = await showModalBottomSheet(
context: context, context: context,
isScrollControlled: true, isScrollControlled: true,
builder: (context){ builder: (context){
return ServiceRequestsSearchDialog( return ServiceRequestsSearchDialog(
initialSearchValue: _serviceRequestsProvider.search, initialSearchValue: _serviceRequestsProvider.search!,
); );
}); });
if(_temp != null){ if(_temp != null){
@ -104,15 +105,15 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage>
), ),
Expanded( Expanded(
child: ServiceRequestsList( child: ServiceRequestsList(
nextPage: _serviceRequestsProvider.nextPage, nextPage: _serviceRequestsProvider.nextPage!,
onLazyLoad: () async { onLazyLoad: () async {
await _serviceRequestsProvider.getRequests( await _serviceRequestsProvider.getRequests(
user: _userProvider.user, user: _userProvider.user!,
host: _settingProvider.host, host: _settingProvider.host??"",
hospitalId: _userProvider.user.hospital.id, hospitalId: _userProvider.user!.hospital!.id,
); );
}, },
requests: _serviceRequestsProvider.serviceRequests, requests: _serviceRequestsProvider.serviceRequests!,
), ),
), ),
], ],

@ -1,25 +1,26 @@
import 'package:flutter/material.dart'; 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/http_status_manger/http_status_manger.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import '../../../../../controllers/http_status_manger/http_status_manger.dart';
import 'package:test_sa/controllers/providers/api/regular_visits_provider.dart'; import '../../../../../controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import '../../../../../controllers/providers/api/regular_visits_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import '../../../../../controllers/providers/api/user_provider.dart';
import 'package:test_sa/models/pantry/pentry.dart'; import '../../../../../controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/models/subtitle.dart'; import '../../../../../models/pantry/pentry.dart';
import 'package:test_sa/models/visits/visit.dart'; import '../../../../../models/subtitle.dart';
import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import '../../../../../models/visits/visit.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import '../../../../widgets/buttons/app_small_button.dart';
import 'package:test_sa/views/widgets/pentry/pentry_calibration_tool_form.dart'; import '../../../../widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/pentry/pentry_info_form.dart'; import '../../../../widgets/pentry/pentry_calibration_tool_form.dart';
import 'package:test_sa/views/widgets/pentry/pentry_pm_kit_form.dart'; import '../../../../widgets/pentry/pentry_info_form.dart';
import 'package:test_sa/views/widgets/pentry/pentry_ppm_check_list_form.dart'; import '../../../../widgets/pentry/pentry_pm_kit_form.dart';
import '../../../../widgets/pentry/pentry_ppm_check_list_form.dart';
class EditPentry extends StatefulWidget { class EditPentry extends StatefulWidget {
final Pentry pentry; final Pentry? pentry;
final Visit visit; final Visit? visit;
const EditPentry({Key key,this.pentry, this.visit}) : super(key: key); const EditPentry({Key? key,this.pentry, this.visit}) : super(key: key);
@override @override
State<EditPentry> createState() => _EditPentryState(); State<EditPentry> createState() => _EditPentryState();
@ -28,14 +29,14 @@ class EditPentry extends StatefulWidget {
class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateMixin{ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateMixin{
bool _isLoading = false; bool _isLoading = false;
bool _validate = false; bool _validate = false;
Subtitle _subtitle; late Subtitle _subtitle;
UserProvider _userProvider; late UserProvider _userProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
RegularVisitsProvider _regularVisitsProvider; late RegularVisitsProvider _regularVisitsProvider;
Pentry _pentry; late Pentry _pentry;
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
TabController _tabController; late TabController _tabController;
_onSubmit() async { _onSubmit() async {
_validate = true; _validate = true;
@ -48,10 +49,10 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
setState(() {}); setState(() {});
int status = await _regularVisitsProvider.updatePentry( int status = await _regularVisitsProvider.updatePentry(
user: _userProvider.user, user: _userProvider.user!,
host: _settingProvider.host, host: _settingProvider.host??"",
pentry: _pentry, pentry: _pentry,
visit: widget.visit visit: widget.visit!
); );
_isLoading =false; _isLoading =false;
setState(() {}); setState(() {});
@ -71,7 +72,7 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
@override @override
void initState() { void initState() {
_pentry = widget.pentry; _pentry = widget.pentry!;
_tabController = TabController(length: 4, vsync: this); _tabController = TabController(length: 4, vsync: this);
super.initState(); super.initState();
} }
@ -84,7 +85,7 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle; _subtitle = AppLocalization.of(context)!.subtitle!;
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_regularVisitsProvider = Provider.of<RegularVisitsProvider>(context); _regularVisitsProvider = Provider.of<RegularVisitsProvider>(context);

@ -1,20 +1,22 @@
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 '../../../../../controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import '../../../../../controllers/providers/api/regular_visits_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import '../../../../../controllers/providers/api/user_provider.dart';
import 'package:test_sa/models/pantry/pentry.dart'; import '../../../../../controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/models/subtitle.dart'; import '../../../../../models/pantry/pentry.dart';
import 'package:test_sa/models/visits/visit.dart'; import '../../../../../models/subtitle.dart';
import 'package:test_sa/views/pages/user/visits/pantry/edit_pentry.dart'; import '../../../../../models/visits/visit.dart';
import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import '../../../../widgets/loaders/app_loading.dart';
import 'package:test_sa/views/widgets/loaders/failed_loading.dart'; import '../../../../widgets/loaders/failed_loading.dart';
import 'edit_pentry.dart';
class FutureEditPentry extends StatefulWidget { class FutureEditPentry extends StatefulWidget {
final Visit visit; final Visit visit;
const FutureEditPentry({Key key, this.visit}) : super(key: key); const FutureEditPentry({Key? key, required this.visit}) : super(key: key);
@override @override
State<FutureEditPentry> createState() => _FutureEditPentryState(); State<FutureEditPentry> createState() => _FutureEditPentryState();
@ -22,22 +24,22 @@ class FutureEditPentry extends StatefulWidget {
class _FutureEditPentryState extends State<FutureEditPentry> { class _FutureEditPentryState extends State<FutureEditPentry> {
UserProvider _userProvider; late UserProvider _userProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
//String requestId = ModalRoute.of(context).settings.arguments; //String requestId = ModalRoute.of(context).settings.arguments;
Subtitle subtitle = AppLocalization.of(context).subtitle; Subtitle subtitle = AppLocalization.of(context)!.subtitle!;
return Scaffold( return Scaffold(
body: FutureBuilder<Pentry>( body: FutureBuilder<Pentry?>(
future: RegularVisitsProvider().getPently( future: RegularVisitsProvider().getPently(
user: _userProvider.user, user: _userProvider.user!,
host: _settingProvider.host, host: _settingProvider.host??"",
id: widget.visit.id 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(

@ -2,22 +2,24 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; 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/http_status_manger/http_status_manger.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import '../../../../controllers/http_status_manger/http_status_manger.dart';
import 'package:test_sa/controllers/providers/api/preventive_maintenance_visits_provider.dart'; import '../../../../controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import '../../../../controllers/providers/api/preventive_maintenance_visits_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import '../../../../controllers/providers/api/user_provider.dart';
import 'package:test_sa/models/subtitle.dart'; import '../../../../controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/models/visits/visits_group.dart'; import '../../../../models/subtitle.dart';
import 'package:test_sa/models/visits/visits_search.dart'; import '../../../../models/visits/visits_group.dart';
import 'package:test_sa/views/app_style/colors.dart'; import '../../../../models/visits/visits_search.dart';
import 'package:test_sa/views/pages/user/visits/update_visits_group_sheet.dart'; import '../../../app_style/colors.dart';
import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import '../../../widgets/buttons/app_back_button.dart';
import 'package:test_sa/views/widgets/buttons/app_button.dart'; import '../../../widgets/buttons/app_button.dart';
import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; import '../../../widgets/buttons/app_icon_button.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import '../../../widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/search/visits_search_bar.dart'; import '../../../widgets/search/visits_search_bar.dart';
import 'package:test_sa/views/widgets/visits/visits_list.dart'; import '../../../widgets/visits/visits_list.dart';
import 'update_visits_group_sheet.dart';
class PreventiveMaintenanceVisitsPage extends StatefulWidget { class PreventiveMaintenanceVisitsPage extends StatefulWidget {
static final String id = "/preventive-maintenance-visits"; static final String id = "/preventive-maintenance-visits";
@override @override
@ -26,17 +28,17 @@ class PreventiveMaintenanceVisitsPage extends StatefulWidget {
class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceVisitsPage> class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceVisitsPage>
with TickerProviderStateMixin{ with TickerProviderStateMixin{
PreventiveMaintenanceVisitsProvider _visitsProvider; late PreventiveMaintenanceVisitsProvider _visitsProvider;
UserProvider _userProvider; late UserProvider _userProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
Subtitle _subtitle; late Subtitle _subtitle;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_visitsProvider = Provider.of<PreventiveMaintenanceVisitsProvider>(context); _visitsProvider = Provider.of<PreventiveMaintenanceVisitsProvider>(context);
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_subtitle = AppLocalization.of(context).subtitle; _subtitle = AppLocalization.of(context)!.subtitle!;
return Scaffold( return Scaffold(
body: SafeArea( body: SafeArea(
child: LoadingManager( child: LoadingManager(
@ -47,8 +49,8 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
//_visitsProvider.visitsSearch = VisitsSearch(); //_visitsProvider.visitsSearch = VisitsSearch();
_visitsProvider.reset(); _visitsProvider.reset();
await _visitsProvider.getVisits( await _visitsProvider.getVisits(
user: _userProvider.user, user: _userProvider.user!,
host: _settingProvider.host, host: _settingProvider.host??"",
//visitsSearch: _visitsSearch //visitsSearch: _visitsSearch
); );
}, },
@ -68,7 +70,7 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
child: Center( child: Center(
child: Text( child: Text(
_subtitle.preventiveMaintenance, _subtitle.preventiveMaintenance,
style: Theme.of(context).textTheme.headline6.copyWith( style: Theme.of(context).textTheme.headline6?.copyWith(
color: AColors.white, color: AColors.white,
fontStyle: FontStyle.italic fontStyle: FontStyle.italic
), ),
@ -81,12 +83,12 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
buttonSize: 42, buttonSize: 42,
backgroundColor: AColors.white, backgroundColor: AColors.white,
onPressed: () async { onPressed: () async {
VisitsSearch _temp = await showModalBottomSheet( VisitsSearch? _temp = await showModalBottomSheet(
context: context, context: context,
isScrollControlled: true, isScrollControlled: true,
builder: (context){ builder: (context){
return VisitsSearchDialog( return VisitsSearchDialog(
initialSearchValue: _visitsProvider.visitsSearch, initialSearchValue: _visitsProvider.visitsSearch!, onSearch: (VisitsSearch ) {},
); );
}); });
if(_temp != null){ if(_temp != null){
@ -94,8 +96,8 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
_visitsProvider.reset(); _visitsProvider.reset();
setState(() {}); setState(() {});
await _visitsProvider.getVisits( await _visitsProvider.getVisits(
user: _userProvider.user, user: _userProvider.user!,
host: _settingProvider.host, host: _settingProvider.host??"",
//visitsSearch: _visitsSearch //visitsSearch: _visitsSearch
); );
} }
@ -109,7 +111,7 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
), ),
), ),
Visibility( Visibility(
visible: _visitsProvider.visitsSearch.toSearchString().isNotEmpty, visible:_visitsProvider.visitsSearch?.toSearchString().isNotEmpty??false,
child: Padding( child: Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: AButton( child: AButton(
@ -124,11 +126,11 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
), ),
Expanded( Expanded(
child: VisitsList( child: VisitsList(
nextPage: _visitsProvider.nextPage, nextPage: _visitsProvider.nextPage!,
onLazyLoad: () async { onLazyLoad: () async {
await _visitsProvider.getVisits( await _visitsProvider.getVisits(
user: _userProvider.user, user: _userProvider.user!,
host: _settingProvider.host, host: _settingProvider.host??"",
//visitsSearch: _visitsSearch //visitsSearch: _visitsSearch
); );
}, },
@ -152,8 +154,8 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
}, },
); );
int status = await _visitsProvider.updateGroupOfVisits( int status = await _visitsProvider.updateGroupOfVisits(
user: _userProvider.user, user: _userProvider.user!,
host: _settingProvider.host, host: _settingProvider.host??"",
group: _group group: _group
); );
Navigator.of(context).pop(); Navigator.of(context).pop();
@ -175,7 +177,7 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
} }
} }
}, },
visits: _visitsProvider.visits, visits: _visitsProvider.visits!,
), ),
), ),
], ],

@ -2,22 +2,24 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; 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/http_status_manger/http_status_manger.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import '../../../../controllers/http_status_manger/http_status_manger.dart';
import 'package:test_sa/controllers/providers/api/regular_visits_provider.dart'; import '../../../../controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import '../../../../controllers/providers/api/regular_visits_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import '../../../../controllers/providers/api/user_provider.dart';
import 'package:test_sa/models/subtitle.dart'; import '../../../../controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/models/visits/visits_group.dart'; import '../../../../models/subtitle.dart';
import 'package:test_sa/models/visits/visits_search.dart'; import '../../../../models/visits/visits_group.dart';
import 'package:test_sa/views/app_style/colors.dart'; import '../../../../models/visits/visits_search.dart';
import 'package:test_sa/views/pages/user/visits/update_visits_group_sheet.dart'; import '../../../app_style/colors.dart';
import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import '../../../widgets/buttons/app_back_button.dart';
import 'package:test_sa/views/widgets/buttons/app_button.dart'; import '../../../widgets/buttons/app_button.dart';
import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; import '../../../widgets/buttons/app_icon_button.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import '../../../widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/search/visits_search_bar.dart'; import '../../../widgets/search/visits_search_bar.dart';
import 'package:test_sa/views/widgets/visits/visits_list.dart'; import '../../../widgets/visits/visits_list.dart';
import 'update_visits_group_sheet.dart';
class RegularVisitsPage extends StatefulWidget { class RegularVisitsPage extends StatefulWidget {
static final String id = "/Regular-visits"; static final String id = "/Regular-visits";
@override @override
@ -26,17 +28,17 @@ class RegularVisitsPage extends StatefulWidget {
class _RegularVisitsPageState extends State<RegularVisitsPage> class _RegularVisitsPageState extends State<RegularVisitsPage>
with TickerProviderStateMixin{ with TickerProviderStateMixin{
RegularVisitsProvider _visitsProvider; late RegularVisitsProvider _visitsProvider;
UserProvider _userProvider; late UserProvider _userProvider;
SettingProvider _settingProvider; late SettingProvider _settingProvider;
bool _expandedSearch = false; bool _expandedSearch = false;
Subtitle _subtitle; late Subtitle _subtitle;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_visitsProvider = Provider.of<RegularVisitsProvider>(context); _visitsProvider = Provider.of<RegularVisitsProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_subtitle = AppLocalization.of(context).subtitle; _subtitle = AppLocalization.of(context)!.subtitle!;
return Scaffold( return Scaffold(
body: SafeArea( body: SafeArea(
child: LoadingManager( child: LoadingManager(
@ -47,8 +49,8 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
_visitsProvider.reset(); _visitsProvider.reset();
//_visitsProvider.visitsSearch = VisitsSearch(); //_visitsProvider.visitsSearch = VisitsSearch();
await _visitsProvider.getVisits( await _visitsProvider.getVisits(
user: _userProvider.user, user: _userProvider.user!,
host: _settingProvider.host, host: _settingProvider.host!,
); );
}, },
child: Stack( child: Stack(
@ -67,7 +69,7 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
child: Center( child: Center(
child: Text( child: Text(
_subtitle.preventiveMaintenance, _subtitle.preventiveMaintenance,
style: Theme.of(context).textTheme.headline6.copyWith( style: Theme.of(context).textTheme.headline6?.copyWith(
color: AColors.white, color: AColors.white,
fontStyle: FontStyle.italic fontStyle: FontStyle.italic
), ),
@ -88,11 +90,11 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
isScrollControlled: true, isScrollControlled: true,
builder: (context){ builder: (context){
return VisitsSearchDialog( return VisitsSearchDialog(
initialSearchValue: _visitsProvider.visitsSearch, initialSearchValue: _visitsProvider.visitsSearch!, onSearch: (VisitsSearch ) { },
); );
}); });
if(_temp != null){ if(_temp != null){
_visitsProvider.visitsSearch.fromSearch(_temp) ; _visitsProvider.visitsSearch?.fromSearch(_temp) ;
_visitsProvider.reset(); _visitsProvider.reset();
setState(() {}); setState(() {});
} }
@ -107,7 +109,7 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
), ),
), ),
Visibility( Visibility(
visible: _visitsProvider.visitsSearch.toSearchString().isNotEmpty, visible: _visitsProvider.visitsSearch?.toSearchString().isNotEmpty??false,
child: Padding( child: Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: AButton( child: AButton(
@ -125,8 +127,8 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
nextPage: _visitsProvider.nextPage, nextPage: _visitsProvider.nextPage,
onLazyLoad: () async { onLazyLoad: () async {
await _visitsProvider.getVisits( await _visitsProvider.getVisits(
user: _userProvider.user, user: _userProvider.user!,
host: _settingProvider.host, host: _settingProvider.host??"",
); );
}, },
onEditGroup: (visits) async { onEditGroup: (visits) async {
@ -149,8 +151,8 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
}, },
); );
int status = await _visitsProvider.updateGroupOfVisits( int status = await _visitsProvider.updateGroupOfVisits(
user: _userProvider.user, user: _userProvider.user!,
host: _settingProvider.host, host: _settingProvider.host??"",
group: _group group: _group
); );
Navigator.of(context).pop(); Navigator.of(context).pop();
@ -172,7 +174,7 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
} }
} }
}, },
visits: _visitsProvider.visits, visits: _visitsProvider.visits!,
), ),
), ),
], ],

@ -2,24 +2,26 @@ import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/models/lookup.dart'; import '../../../../controllers/localization/localization.dart';
import 'package:test_sa/models/subtitle.dart'; import '../../../../models/lookup.dart';
import 'package:test_sa/models/visits/visit.dart'; import '../../../../models/subtitle.dart';
import 'package:test_sa/models/visits/visits_group.dart'; import '../../../../models/visits/visit.dart';
import 'package:test_sa/views/app_style/colors.dart'; import '../../../../models/visits/visits_group.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import '../../../app_style/colors.dart';
import 'package:test_sa/views/widgets/app_text_form_field.dart'; import '../../../app_style/sizing.dart';
import 'package:test_sa/views/widgets/buttons/app_button.dart'; import '../../../widgets/app_text_form_field.dart';
import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import '../../../widgets/buttons/app_button.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import '../../../widgets/buttons/app_small_button.dart';
import 'package:test_sa/views/widgets/images/one_image_picker.dart'; import '../../../widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/search/filter_item.dart'; import '../../../widgets/images/one_image_picker.dart';
import 'package:test_sa/views/widgets/visits/visit_status.dart'; import '../../../widgets/search/filter_item.dart';
import '../../../widgets/visits/visit_status.dart';
class UpdateVisitsGroupSheet extends StatefulWidget { class UpdateVisitsGroupSheet extends StatefulWidget {
final List<Visit> visits; final List<Visit>? visits;
final String title; final String? title;
const UpdateVisitsGroupSheet({Key key, this.visits, this.title}) : super(key: key); const UpdateVisitsGroupSheet({Key? key, this.visits, this.title}) : super(key: key);
@override @override
_UpdateVisitsGroupSheetState createState() => _UpdateVisitsGroupSheetState(); _UpdateVisitsGroupSheetState createState() => _UpdateVisitsGroupSheetState();
@ -37,8 +39,8 @@ class _UpdateVisitsGroupSheetState extends State<UpdateVisitsGroupSheet> {
Lookup(label: "Failed", id: 1), Lookup(label: "Failed", id: 1),
]; ];
VisitsGroup _group = VisitsGroup(); VisitsGroup _group = VisitsGroup();
File _image; late File _image;
Subtitle _subtitle; late Subtitle _subtitle;
@override @override
void initState() { void initState() {
@ -49,7 +51,7 @@ class _UpdateVisitsGroupSheetState extends State<UpdateVisitsGroupSheet> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle; _subtitle = AppLocalization.of(context)!.subtitle!;
return Container( return Container(
height: MediaQuery.of(context).size.height / 1.3, height: MediaQuery.of(context).size.height / 1.3,
padding: EdgeInsets.symmetric( padding: EdgeInsets.symmetric(
@ -198,9 +200,9 @@ class _UpdateVisitsGroupSheetState extends State<UpdateVisitsGroupSheet> {
SizedBox(height: 8 * AppStyle.getScaleFactor(context),), SizedBox(height: 8 * AppStyle.getScaleFactor(context),),
Expanded( Expanded(
child: ListView.builder( child: ListView.builder(
itemCount: widget.visits.length, itemCount: widget.visits?.length,
itemBuilder: (context,index){ itemBuilder: (context,index){
Visit visit = widget.visits[index]; Visit visit = widget.visits![index];
return Container( return Container(
padding: EdgeInsets.symmetric(vertical: 8,horizontal: 8), padding: EdgeInsets.symmetric(vertical: 8,horizontal: 8),
margin: EdgeInsets.symmetric(vertical: 4), margin: EdgeInsets.symmetric(vertical: 4),
@ -217,8 +219,8 @@ class _UpdateVisitsGroupSheetState extends State<UpdateVisitsGroupSheet> {
children: [ children: [
Expanded( Expanded(
child: Text( child: Text(
"${_subtitle.sn}: "+visit.deviceSerialNumber ?? _subtitle.noSerialNumberFound, "${_subtitle.sn}: ${visit.deviceSerialNumber?? _subtitle.noSerialNumberFound}" ,
style: Theme.of(context).textTheme.headline6.copyWith( style: Theme.of(context).textTheme.headline6?.copyWith(
color: AColors.white, color: AColors.white,
fontSize: 16, fontSize: 16,
fontWeight: FontWeight.bold fontWeight: FontWeight.bold

@ -1,29 +1,29 @@
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/models/subtitle.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/future_edit_pently.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/images_list.dart';
import 'package:test_sa/views/widgets/loaders/image_loader.dart';
import 'package:test_sa/views/widgets/requests/info_row.dart';
import 'package:test_sa/views/widgets/visits/visit_status.dart';
import '../../../../controllers/localization/localization.dart';
import '../../../../controllers/providers/api/regular_visits_provider.dart'; import '../../../../controllers/providers/api/regular_visits_provider.dart';
import '../../../../models/subtitle.dart';
import '../../../../models/visits/visit.dart';
import '../../../app_style/colors.dart';
import '../../../app_style/sizing.dart';
import '../../../widgets/buttons/app_back_button.dart';
import '../../../widgets/buttons/app_icon_button.dart';
import '../../../widgets/images/images_list.dart';
import '../../../widgets/loaders/image_loader.dart';
import '../../../widgets/requests/info_row.dart';
import '../../../widgets/visits/visit_status.dart';
import 'pantry/future_edit_pently.dart';
class VisitDetailsPage extends StatelessWidget { class VisitDetailsPage extends StatelessWidget {
static final String id = "/visit-details"; static final String id = "/visit-details";
final Visit visit; final Visit visit;
const VisitDetailsPage({Key key, this.visit}) : super(key: key); const VisitDetailsPage({Key? key, required this.visit}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle; Subtitle _subtitle = AppLocalization.of(context)!.subtitle!;
final regularVisitsProvider = Provider.of<RegularVisitsProvider>(context); final regularVisitsProvider = Provider.of<RegularVisitsProvider>(context);
return Scaffold( return Scaffold(
@ -40,7 +40,7 @@ class VisitDetailsPage extends StatelessWidget {
child: Center( child: Center(
child: Text( child: Text(
_subtitle.visitInformation, _subtitle.visitInformation,
style: Theme.of(context).textTheme.headline6.copyWith( style: Theme.of(context).textTheme.headline6?.copyWith(
color: AColors.white, color: AColors.white,
fontStyle: FontStyle.italic fontStyle: FontStyle.italic
), ),
@ -76,7 +76,7 @@ class VisitDetailsPage extends StatelessWidget {
body: InteractiveViewer( body: InteractiveViewer(
child: Center( child: Center(
child: ImageLoader( child: ImageLoader(
url: visit.images.first, url: visit.images?.first,
boxFit: BoxFit.contain, boxFit: BoxFit.contain,
), ),
), ),
@ -89,7 +89,7 @@ class VisitDetailsPage extends StatelessWidget {
height: 140 * AppStyle.getScaleFactor(context), height: 140 * AppStyle.getScaleFactor(context),
width: MediaQuery.of(context).size.width, width: MediaQuery.of(context).size.width,
child: ImageLoader( child: ImageLoader(
url: visit.images.isEmpty ? " ":visit.images.first, url: (visit.images?.isEmpty??false) ? " ":visit.images?.first,
boxFit: BoxFit.cover, boxFit: BoxFit.cover,
), ),
), ),
@ -98,7 +98,7 @@ class VisitDetailsPage extends StatelessWidget {
SizedBox( SizedBox(
height: 60* AppStyle.getScaleFactor(context), height: 60* AppStyle.getScaleFactor(context),
child: ImagesList( child: ImagesList(
images: visit.images, images: visit.images!,
), ),
), ),
SizedBox(height: 8,), SizedBox(height: 8,),
@ -128,7 +128,7 @@ class VisitDetailsPage extends StatelessWidget {
Expanded( Expanded(
child: Text( child: Text(
"${_subtitle.status} : ", "${_subtitle.status} : ",
style: Theme.of(context).textTheme.subtitle1.copyWith( style: Theme.of(context).textTheme.subtitle1?.copyWith(
fontWeight: FontWeight.bold fontWeight: FontWeight.bold
), ),
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),

@ -1,7 +1,4 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/sizing.dart';
import '../../../controllers/localization/localization.dart'; import '../../../controllers/localization/localization.dart';
import '../../../models/subtitle.dart'; import '../../../models/subtitle.dart';

@ -45,11 +45,11 @@ class GasRefillUpdateDetailsItem extends StatelessWidget {
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1, style: Theme.of(context).textTheme.subtitle1,
validator: (value) => validator: (value) =>
Validator.isNumeric(value) Validator.isNumeric(value!)
? null : "allow numbers only", ? "" : "allow numbers only",
textInputType: TextInputType.number, textInputType: TextInputType.number,
onSaved: (value){ onSaved: (value){
details.deliveredQuantity = int.tryParse(value); details.deliveredQuantity = int.tryParse(value!);
}, },
), ),
], ],

@ -29,6 +29,7 @@ class ServiceRequestsList extends StatelessWidget {
return LazyLoading( return LazyLoading(
nextPage: nextPage, nextPage: nextPage,
onLazyLoad: onLazyLoad, onLazyLoad: onLazyLoad,
onLoadingEnd: () { },
child: ListView.builder( child: ListView.builder(
//physics: BouncingScrollPhysics(), //physics: BouncingScrollPhysics(),
itemCount: requests.length, itemCount: requests.length,

@ -15,13 +15,13 @@ import 'filter_item.dart';
class VisitsSearchDialog extends StatefulWidget { class VisitsSearchDialog extends StatefulWidget {
final VisitsSearch initialSearchValue; final VisitsSearch initialSearchValue;
final bool expandedSearch; final bool? expandedSearch;
final Function(VisitsSearch) onSearch; final Function(VisitsSearch) onSearch;
const VisitsSearchDialog({ const VisitsSearchDialog({
Key? key, Key? key,
required this.initialSearchValue, required this.initialSearchValue,
required this.expandedSearch, this.expandedSearch,
required this.onSearch, required this.onSearch,
}) : super(key: key); }) : super(key: key);
@ -220,8 +220,8 @@ class VisitsSearchDialogState extends State<VisitsSearchDialog>
height: 4.0 * AppStyle.getScaleFactor(context), height: 4.0 * AppStyle.getScaleFactor(context),
), ),
FromToDateBar( FromToDateBar(
from: _search?.actualDateFrom, from: _search!.actualDateFrom!,
to: _search?.actualDateTo, to: _search!.actualDateTo!,
onPickFrom: (date) { onPickFrom: (date) {
_search?.actualDateFrom = date; _search?.actualDateFrom = date;
}, },

@ -69,7 +69,7 @@ class VisitItem extends StatelessWidget {
children: [ children: [
Expanded( Expanded(
child: Text( child: Text(
"S.N: " + visit.deviceSerialNumber ?? "No serial number", "S.N: ${visit.deviceSerialNumber ?? "No serial number"}",
style: Theme.of(context).textTheme.titleLarge?.copyWith( style: Theme.of(context).textTheme.titleLarge?.copyWith(
color: onItemColor, color: onItemColor,
fontSize: 16, fontSize: 16,

@ -10,7 +10,7 @@ class VisitStatusLabel extends StatelessWidget {
const VisitStatusLabel({Key? key, required this.visit}) : super(key: key); const VisitStatusLabel({Key? key, required this.visit}) : super(key: key);
Color getStatusColor() { Color getStatusColor() {
switch (visit.status.id) { switch (visit.status?.id) {
case 0: case 0:
return AColors.green; return AColors.green;
case 1: case 1:
@ -33,9 +33,9 @@ class VisitStatusLabel extends StatelessWidget {
boxShadow: const [AppStyle.boxShadow], boxShadow: const [AppStyle.boxShadow],
), ),
child: Text( child: Text(
visit.status.label == null || visit.status.label.isEmpty visit.status?.label == null || (visit.status?.label?.isEmpty??false)
? "no status" ? "no status"
: visit.status.label, : visit.status?.label??"",
style: Theme.of(context).textTheme.titleSmall?.copyWith( style: Theme.of(context).textTheme.titleSmall?.copyWith(
color: getStatusColor().computeLuminance() > 0.5 color: getStatusColor().computeLuminance() > 0.5
? AColors.black ? AColors.black

@ -47,6 +47,7 @@ class VisitsListState extends State<VisitsList> {
LazyLoading( LazyLoading(
nextPage: widget.nextPage, nextPage: widget.nextPage,
onLazyLoad: widget.onLazyLoad, onLazyLoad: widget.onLazyLoad,
onLoadingEnd: () {},
child: ListView.builder( child: ListView.builder(
//physics: BouncingScrollPhysics(), //physics: BouncingScrollPhysics(),
itemCount: widget.visits.length, itemCount: widget.visits.length,

Loading…
Cancel
Save