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

@ -29,7 +29,7 @@ class GasRefillDetails {
: int.tryParse(parsedJson["requsted_qty"].toString()) ?? 0,
deliveredQuantity: parsedJson["deliverd_qty"] == null
? 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!)
: null,
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/user_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_info.dart';
import '../../../models/subtitle.dart';
@ -122,7 +121,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
),
const SizedBox(height:12),
DeviceTransferInfoSection(
info: widget.model.sender,
info: widget.model.sender!,
),
const SizedBox(height:8),
Row(
@ -148,7 +147,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
),
const SizedBox(height:12),
DeviceTransferInfoSection(
info: widget.model.receiver,
info: widget.model.receiver!,
),
],

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

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

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

@ -94,7 +94,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
_formModel.details?.insert(0,_currentDetails);
_validate = false;
Scrollable.ensureVisible(_DetailsKey.currentContext);
Scrollable.ensureVisible(_DetailsKey.currentContext!);
_requestedQuantityController.clear();
_currentDetails = GasRefillDetails(model: null);
setState(() {});
@ -201,11 +201,11 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
controller: _requestedQuantityController,
style: Theme.of(context).textTheme.subtitle1,
validator: (value) =>
Validator.isNumeric(value)
? null : "allow numbers only",
Validator.isNumeric(value!)
? '' : "allow numbers only",
textInputType: TextInputType.number,
onSaved: (value){
_currentDetails.requestedQuantity = int.tryParse(value);
_currentDetails.requestedQuantity = int.tryParse(value!);
},
),
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:provider/provider.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 '../../../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 '../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 'visits/regular_visits_page.dart';
class LandPage extends StatefulWidget {
static const String id = "/land-page";
@ -48,17 +48,17 @@ class LandPage extends StatefulWidget {
}
class _LandPageState extends State<LandPage> {
double _height;
double _width;
UserProvider _userProvider;
SettingProvider _settingProvider;
DepartmentsProvider _departmentsProvider;
DevicesProvider _devicesProvider;
double _buttonHeight;
bool firstTime = true;
ServiceRequestsProvider _serviceRequestsProvider;
PreventiveMaintenanceVisitsProvider _preventiveMaintenanceVisitsProvider;
RegularVisitsProvider _regularVisitsProvider;
late double _height;
late double _width;
late UserProvider _userProvider;
late SettingProvider _settingProvider;
late DepartmentsProvider _departmentsProvider;
late DevicesProvider _devicesProvider;
late double _buttonHeight;
late bool firstTime = true;
late ServiceRequestsProvider _serviceRequestsProvider;
late PreventiveMaintenanceVisitsProvider _preventiveMaintenanceVisitsProvider;
late RegularVisitsProvider _regularVisitsProvider;
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@override
@ -73,7 +73,7 @@ class _LandPageState extends State<LandPage> {
@override
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;
_width = MediaQuery.of(context).size.width;
_settingProvider = Provider.of<SettingProvider>(context);
@ -83,7 +83,7 @@ class _LandPageState extends State<LandPage> {
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
_preventiveMaintenanceVisitsProvider = Provider.of<PreventiveMaintenanceVisitsProvider>(context);
_regularVisitsProvider = Provider.of<RegularVisitsProvider>(context);
Subtitle _subtitle = AppLocalization.of(context).subtitle;
Subtitle _subtitle = AppLocalization.of(context)!.subtitle!;
if (firstTime) {
if (path != null) {
Navigator.of(context).pushNamed("/" + path.split("/").first, arguments: path.split("/").last);
@ -153,7 +153,7 @@ class _LandPageState extends State<LandPage> {
mainAxisSpacing: 12,
childAspectRatio: 1,
children: [
if (_userProvider.user.type == UsersTypes.normal_user)
if (_userProvider.user!.type == UsersTypes.normal_user)
LandPageItem(
text: _subtitle.newServiceRequest,
icon: FontAwesomeIcons.tools,
@ -184,7 +184,7 @@ class _LandPageState extends State<LandPage> {
// Navigator.of(context).pushNamed(PreventiveMaintenanceVisitsPage.id);
// },
// ),
if (_userProvider.user.type != UsersTypes.engineer)
if (_userProvider.user?.type != UsersTypes.engineer)
LandPageItem(
text: "Request Gas Refill",
icon: FontAwesomeIcons.truckFast,
@ -250,7 +250,7 @@ class _LandPageState extends State<LandPage> {
buttonSize: 42,
backgroundColor: AColors.white,
onPressed: () {
_scaffoldKey.currentState.openEndDrawer();
_scaffoldKey.currentState?.openEndDrawer();
},
),
),
@ -284,8 +284,8 @@ class _LandPageState extends State<LandPage> {
),
12.width,
Text(
_userProvider.user.userName,
style: Theme.of(context).textTheme.headline6.copyWith(
_userProvider.user?.userName??"",
style: Theme.of(context).textTheme.headline6?.copyWith(
fontWeight: FontWeight.w600,
),
textScaleFactor: AppStyle.getScaleFactor(context),
@ -307,11 +307,11 @@ class _LandPageState extends State<LandPage> {
focusColor: AColors.grey3A,
groupValue: _settingProvider.language,
onChanged: (value) {
_settingProvider.setLanguage(value);
_settingProvider.setLanguage(value!);
}),
Text(
"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),
),
Radio(
@ -320,11 +320,11 @@ class _LandPageState extends State<LandPage> {
focusColor: AColors.grey3A,
groupValue: _settingProvider.language,
onChanged: (value) {
_settingProvider.setLanguage(value);
_settingProvider.setLanguage(value!);
}),
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),
),
],
@ -381,7 +381,7 @@ class _LandPageState extends State<LandPage> {
children: [
Text(
"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),
),
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:font_awesome_flutter/font_awesome_flutter.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 {
static final String id = "/user/profile";
@override
@ -23,10 +24,10 @@ class ProfilePage extends StatefulWidget {
}
class _ProfilePageState extends State<ProfilePage> {
UserProvider _userProvider;
SettingProvider _settingProvider;
double _width;
double _height;
late UserProvider _userProvider;
late SettingProvider _settingProvider;
late double _width;
late double _height;
User _user = User();
bool _firstTime = true;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
@ -37,9 +38,9 @@ class _ProfilePageState extends State<ProfilePage> {
_settingProvider = Provider.of<SettingProvider>(context);
_width = MediaQuery.of(context).size.width;
_height = MediaQuery.of(context).size.height;
Subtitle _subtitle = AppLocalization.of(context).subtitle;
Subtitle _subtitle = AppLocalization.of(context)!.subtitle!;
if(_firstTime){
_user = User.fromJson(_userProvider.user.toJson());
_user = User.fromJson(_userProvider.user!.toJson());
_firstTime = false;
}
return Scaffold(
@ -85,10 +86,10 @@ class _ProfilePageState extends State<ProfilePage> {
enable: false,
prefixIconData: Icons.account_circle,
style: Theme.of(context).textTheme.headline6,
validator: (value) => Validator.hasValue(value)
? null : _subtitle.nameValidateMessage,
validator: (value) => Validator.hasValue(value!)
? '' : _subtitle.nameValidateMessage,
onSaved: (value){
_user.userName = value;
_user.userName = value!;
},
),
SizedBox(height: 8,),
@ -99,16 +100,16 @@ class _ProfilePageState extends State<ProfilePage> {
prefixIconData: Icons.email,
textInputType: TextInputType.emailAddress,
style: Theme.of(context).textTheme.headline6,
validator: (value) => Validator.isEmail(value)
? null : _subtitle.emailValidateMessage,
validator: (value) => Validator.isEmail(value!)
? '' : _subtitle.emailValidateMessage,
onSaved: (value){
_user.email = value;
_user.email = value!;
},
),
SizedBox(height: 8,),
AbsorbPointer(
child: HospitalButton(
hospital: _user.hospital,
hospital: _user.hospital!,
onHospitalPick: (hospital){
_user.hospital = hospital;
setState(() {});
@ -130,7 +131,7 @@ class _ProfilePageState extends State<ProfilePage> {
style: Theme.of(context).textTheme.headline6,
prefixIconData: Icons.phone_android,
validator: (value) =>
Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage,
Validator.isPhoneNumber(value!) ? '' : _subtitle.phoneNumberValidateMessage,
textInputType: TextInputType.phone,
onSaved: (value){
_user.phoneNumber = value;
@ -144,7 +145,7 @@ class _ProfilePageState extends State<ProfilePage> {
prefixIconData: FontAwesomeIcons.whatsapp,
prefixIconSize: 36,
validator: (value) =>
Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage,
Validator.isPhoneNumber(value!) ? '' : _subtitle.phoneNumberValidateMessage,
textInputType: TextInputType.phone,
onSaved: (value){
_user.whatsApp = value;
@ -161,9 +162,9 @@ class _ProfilePageState extends State<ProfilePage> {
child: AButton(
text: _subtitle.update,
onPressed: () async {
if(!_formKey.currentState.validate())
if(!(_formKey.currentState?.validate()??false))
return;
_formKey.currentState.save();
_formKey.currentState?.save();
if(_user.department?.id == null){
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
@ -176,10 +177,10 @@ class _ProfilePageState extends State<ProfilePage> {
}
int status = await _userProvider.updateProfile(
user: _user,
host: _settingProvider.host,
host: _settingProvider.host!,
);
if(status >= 200 && status < 300){
_settingProvider.setUser(_userProvider.user);
_settingProvider.setUser(_userProvider.user!);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(

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

@ -5,29 +5,31 @@ import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.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/controllers/validator/validator.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/device/device.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/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/equipment/device_button.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/sound/record_sound.dart';
import 'package:test_sa/views/widgets/speech_to_text/speech_to_text.dart';
import 'package:test_sa/views/widgets/status/service_request/service_request_defect_types_mune.dart';
import 'package:test_sa/views/widgets/status/service_request/service_request_priority_mune.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 '../../../../controllers/validator/validator.dart';
import '../../../../extensions/int_extensions.dart';
import '../../../../extensions/widget_extensions.dart';
import '../../../../models/device/device.dart';
import '../../../../models/service_request/service_request.dart';
import '../../../../models/subtitle.dart';
import '../../../app_style/colors.dart';
import '../../../widgets/app_text_form_field.dart';
import '../../../widgets/buttons/app_back_button.dart';
import '../../../widgets/buttons/app_button.dart';
import '../../../widgets/equipment/device_button.dart';
import '../../../widgets/images/multi_image_picker.dart';
import '../../../widgets/loaders/loading_manager.dart';
import '../../../widgets/sound/record_sound.dart';
import '../../../widgets/speech_to_text/speech_to_text.dart';
import '../../../widgets/status/service_request/service_request_defect_types_mune.dart';
import '../../../widgets/status/service_request/service_request_priority_mune.dart';
import '../../../widgets/titles/app_sub_title.dart';
class CreateRequestPage extends StatefulWidget {
static final String id = "/create-request";
@ -37,18 +39,18 @@ class CreateRequestPage extends StatefulWidget {
}
class _CreateRequestPageState extends State<CreateRequestPage> {
double _height;
UserProvider _userProvider;
SettingProvider _settingProvider;
ServiceRequestsProvider _serviceRequestsProvider;
late double _height;
late UserProvider _userProvider;
late SettingProvider _settingProvider;
late ServiceRequestsProvider _serviceRequestsProvider;
ServiceRequest _serviceRequest = ServiceRequest();
List<File> _deviceImages = [];
bool _isLoading = false;
Device _device;
Subtitle _subtitle;
late Device _device;
late Subtitle _subtitle;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
TextEditingController _controller;
late TextEditingController _controller;
@override
void initState() {
@ -68,7 +70,7 @@ class _CreateRequestPageState extends State<CreateRequestPage> {
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
_subtitle = AppLocalization.of(context).subtitle;
_subtitle = AppLocalization.of(context)!.subtitle!;
return Scaffold(
key: _scaffoldKey,
body: SafeArea(
@ -99,7 +101,7 @@ class _CreateRequestPageState extends State<CreateRequestPage> {
padding: const EdgeInsets.all(8.0),
child: Text(
_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,
children: [
12.height,
_userProvider.user.hospital == null
_userProvider.user?.hospital == null
? SizedBox.shrink()
: ATextFormField(
enable: false,
initialValue: _userProvider.user.hospital?.name ?? _subtitle.noHospitalFound,
initialValue: _userProvider.user?.hospital?.name ?? _subtitle.noHospitalFound,
hintText: _subtitle.hospital,
prefixIconData: FontAwesomeIcons.hospital,
style: Theme.of(context).textTheme.subtitle1,
),
12.height,
_userProvider.user.department == null
_userProvider.user?.department == null
? SizedBox.shrink()
: ATextFormField(
enable: false,
initialValue: _userProvider.user.department?.name ?? _subtitle.noUniteFound,
initialValue: _userProvider.user?.department?.name ?? _subtitle.noUniteFound,
hintText: _subtitle.unite,
prefixIconData: FontAwesomeIcons.hospitalUser,
style: Theme.of(context).textTheme.subtitle1,
@ -167,7 +169,7 @@ class _CreateRequestPageState extends State<CreateRequestPage> {
prefixIconData: FontAwesomeIcons.triangleExclamation,
style: Theme.of(context).textTheme.headline6,
textInputType: TextInputType.multiline,
validator: (value) => Validator.hasValue(value) ? null : _subtitle.maintenanceIssueRequired,
validator: (value) => Validator.hasValue(value!) ? '' : _subtitle.maintenanceIssueRequired,
onSaved: (value) {
_serviceRequest.maintenanceIssue = value;
},
@ -184,19 +186,19 @@ class _CreateRequestPageState extends State<CreateRequestPage> {
child: AButton(
text: _subtitle.submit,
onPressed: () async {
if (!_formKey.currentState.validate()) return;
_formKey.currentState.save();
if (!(_formKey.currentState?.validate()??false)) return;
_formKey.currentState?.save();
_serviceRequest.deviceId = _device?.id ?? "";
_isLoading = true;
setState(() {});
_serviceRequest.devicePhotos = _deviceImages.map((e) => base64Encode(e.readAsBytesSync())).toList();
if (_serviceRequest.audio != null) {
final file = File(_serviceRequest.audio);
final file = File(_serviceRequest.audio!);
_serviceRequest.audio = base64Encode(file.readAsBytesSync());
}
int status = await _serviceRequestsProvider.createRequest(
user: _userProvider.user,
host: _settingProvider.host,
user: _userProvider.user!,
host: _settingProvider.host??"",
serviceRequest: _serviceRequest,
);
_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: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 {
static final String id = "/service-request-details";
@ -18,20 +20,20 @@ class FutureRequestServiceDetails extends StatefulWidget {
class _FutureRequestServiceDetailsState extends State<FutureRequestServiceDetails> {
UserProvider _userProvider;
SettingProvider _settingProvider;
late UserProvider _userProvider;
late SettingProvider _settingProvider;
@override
Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
String requestId = ModalRoute.of(context).settings.arguments;
Subtitle _subtitle = AppLocalization.of(context).subtitle;
String requestId = ModalRoute.of(context)!.settings.arguments.toString();
Subtitle _subtitle = AppLocalization.of(context)!.subtitle!;
return Scaffold(
body: FutureBuilder<ServiceRequest>(
future: ServiceRequestsProvider().getSingleServiceRequest(
requestId: requestId,
user: _userProvider.user,
host: _settingProvider.host,
user: _userProvider.user!,
host: _settingProvider.host??"",
subtitle: _subtitle
),
builder: (BuildContext context, AsyncSnapshot<ServiceRequest> snapshot){
@ -42,7 +44,7 @@ class _FutureRequestServiceDetailsState extends State<FutureRequestServiceDetail
);
if(snapshot.hasData){
return RequestDetailsPage(
serviceRequest: snapshot.data,
serviceRequest: snapshot.data!,
);
}
return Center(child: ALoading());

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

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

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

@ -2,39 +2,40 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.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/create_service_report.dart';
import 'report/future_service_report.dart';
class RequestDetailsPage extends StatelessWidget {
static final String id = "/call-details";
final ServiceRequest serviceRequest;
const RequestDetailsPage({Key key, this.serviceRequest}) : super(key: key);
const RequestDetailsPage({Key? key, required this.serviceRequest}) : super(key: key);
@override
Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle;
Subtitle _subtitle = AppLocalization.of(context)!.subtitle!;
UserProvider _userProvider = Provider.of<UserProvider>(context);
SettingProvider _settingProvider = Provider.of<SettingProvider>(context);
ServiceRequestsProvider _serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
@ -54,7 +55,7 @@ class RequestDetailsPage extends StatelessWidget {
child: Center(
child: Text(
_subtitle.details,
style: Theme.of(context).textTheme.headline6.copyWith(
style: Theme.of(context).textTheme.headline6?.copyWith(
color: AColors.white,
fontStyle: FontStyle.italic
),
@ -62,7 +63,7 @@ class RequestDetailsPage extends StatelessWidget {
),
),
Visibility(
visible: _userProvider.user.type == UsersTypes.normal_user,
visible: _userProvider.user?.type == UsersTypes.normal_user,
replacement: AIconButton(
iconData: Icons.edit,
color: AColors.white,
@ -122,7 +123,7 @@ class RequestDetailsPage extends StatelessWidget {
),
),
serviceRequest.devicePhotos.isEmpty ? SizedBox.shrink():
(serviceRequest.devicePhotos?.isEmpty??false) ? SizedBox.shrink():
Column(
children: [
SizedBox(height: 8,),
@ -135,7 +136,7 @@ class RequestDetailsPage extends StatelessWidget {
body: InteractiveViewer(
child: Center(
child: ImageLoader(
url: serviceRequest.devicePhotos.first,
url: serviceRequest.devicePhotos?.first,
boxFit: BoxFit.contain,
),
),
@ -148,7 +149,7 @@ class RequestDetailsPage extends StatelessWidget {
height: 140 * AppStyle.getScaleFactor(context),
width: MediaQuery.of(context).size.width,
child: ImageLoader(
url: serviceRequest.devicePhotos.first,
url: serviceRequest.devicePhotos?.first,
boxFit: BoxFit.cover,
),
),
@ -157,7 +158,7 @@ class RequestDetailsPage extends StatelessWidget {
SizedBox(
height: 60* AppStyle.getScaleFactor(context),
child: ImagesList(
images: serviceRequest.devicePhotos,
images: serviceRequest.devicePhotos!,
),
),
],
@ -208,7 +209,7 @@ class RequestDetailsPage extends StatelessWidget {
serviceRequest.nextVisitDate == null ? SizedBox.shrink() :
RequestInfoRow(
title: _subtitle.nextVisitDate,
info: DateFormat('EE dd/MM/yyyy').format(serviceRequest.nextVisitDate),
info: DateFormat('EE dd/MM/yyyy').format(serviceRequest.nextVisitDate!),
),
Row(
children: [
@ -220,7 +221,7 @@ class RequestDetailsPage extends StatelessWidget {
),
),
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(
host: _settingProvider.host,
user: _userProvider.user,
host: _settingProvider.host??"",
user: _userProvider.user!,
request: serviceRequest
);
Navigator.of(context).pop();
@ -289,7 +290,7 @@ class RequestDetailsPage extends StatelessWidget {
)
],
),
serviceRequest.viewReport ?
serviceRequest.viewReport??false ?
ListView(
padding: EdgeInsets.symmetric(horizontal: 16),
children: [
@ -309,7 +310,7 @@ class RequestDetailsPage extends StatelessWidget {
title: _subtitle.jobSheetNumber,
info: serviceRequest.jobSheetNumber,
),
_userProvider.user.type == UsersTypes.engineer ?
_userProvider.user?.type == UsersTypes.engineer ?
Padding(
padding: EdgeInsets.all(32),
child: AButton(
@ -327,7 +328,7 @@ class RequestDetailsPage extends StatelessWidget {
): SizedBox.shrink(),
],
):
_userProvider.user.type == UsersTypes.engineer ?
_userProvider.user?.type == UsersTypes.engineer ?
Center(
child: Padding(
padding: EdgeInsets.all(32),

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

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

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

@ -2,22 +2,24 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.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/preventive_maintenance_visits_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/visits/visits_group.dart';
import 'package:test_sa/models/visits/visits_search.dart';
import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/pages/user/visits/update_visits_group_sheet.dart';
import 'package:test_sa/views/widgets/buttons/app_back_button.dart';
import 'package:test_sa/views/widgets/buttons/app_button.dart';
import 'package:test_sa/views/widgets/buttons/app_icon_button.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/search/visits_search_bar.dart';
import 'package:test_sa/views/widgets/visits/visits_list.dart';
import '../../../../controllers/http_status_manger/http_status_manger.dart';
import '../../../../controllers/localization/localization.dart';
import '../../../../controllers/providers/api/preventive_maintenance_visits_provider.dart';
import '../../../../controllers/providers/api/user_provider.dart';
import '../../../../controllers/providers/settings/setting_provider.dart';
import '../../../../models/subtitle.dart';
import '../../../../models/visits/visits_group.dart';
import '../../../../models/visits/visits_search.dart';
import '../../../app_style/colors.dart';
import '../../../widgets/buttons/app_back_button.dart';
import '../../../widgets/buttons/app_button.dart';
import '../../../widgets/buttons/app_icon_button.dart';
import '../../../widgets/loaders/loading_manager.dart';
import '../../../widgets/search/visits_search_bar.dart';
import '../../../widgets/visits/visits_list.dart';
import 'update_visits_group_sheet.dart';
class PreventiveMaintenanceVisitsPage extends StatefulWidget {
static final String id = "/preventive-maintenance-visits";
@override
@ -26,17 +28,17 @@ class PreventiveMaintenanceVisitsPage extends StatefulWidget {
class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceVisitsPage>
with TickerProviderStateMixin{
PreventiveMaintenanceVisitsProvider _visitsProvider;
UserProvider _userProvider;
SettingProvider _settingProvider;
Subtitle _subtitle;
late PreventiveMaintenanceVisitsProvider _visitsProvider;
late UserProvider _userProvider;
late SettingProvider _settingProvider;
late Subtitle _subtitle;
@override
Widget build(BuildContext context) {
_visitsProvider = Provider.of<PreventiveMaintenanceVisitsProvider>(context);
_userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
_subtitle = AppLocalization.of(context).subtitle;
_subtitle = AppLocalization.of(context)!.subtitle!;
return Scaffold(
body: SafeArea(
child: LoadingManager(
@ -47,8 +49,8 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
//_visitsProvider.visitsSearch = VisitsSearch();
_visitsProvider.reset();
await _visitsProvider.getVisits(
user: _userProvider.user,
host: _settingProvider.host,
user: _userProvider.user!,
host: _settingProvider.host??"",
//visitsSearch: _visitsSearch
);
},
@ -68,7 +70,7 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
child: Center(
child: Text(
_subtitle.preventiveMaintenance,
style: Theme.of(context).textTheme.headline6.copyWith(
style: Theme.of(context).textTheme.headline6?.copyWith(
color: AColors.white,
fontStyle: FontStyle.italic
),
@ -81,12 +83,12 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
buttonSize: 42,
backgroundColor: AColors.white,
onPressed: () async {
VisitsSearch _temp = await showModalBottomSheet(
VisitsSearch? _temp = await showModalBottomSheet(
context: context,
isScrollControlled: true,
builder: (context){
return VisitsSearchDialog(
initialSearchValue: _visitsProvider.visitsSearch,
initialSearchValue: _visitsProvider.visitsSearch!, onSearch: (VisitsSearch ) {},
);
});
if(_temp != null){
@ -94,8 +96,8 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
_visitsProvider.reset();
setState(() {});
await _visitsProvider.getVisits(
user: _userProvider.user,
host: _settingProvider.host,
user: _userProvider.user!,
host: _settingProvider.host??"",
//visitsSearch: _visitsSearch
);
}
@ -109,7 +111,7 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
),
),
Visibility(
visible: _visitsProvider.visitsSearch.toSearchString().isNotEmpty,
visible:_visitsProvider.visitsSearch?.toSearchString().isNotEmpty??false,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: AButton(
@ -124,11 +126,11 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
),
Expanded(
child: VisitsList(
nextPage: _visitsProvider.nextPage,
nextPage: _visitsProvider.nextPage!,
onLazyLoad: () async {
await _visitsProvider.getVisits(
user: _userProvider.user,
host: _settingProvider.host,
user: _userProvider.user!,
host: _settingProvider.host??"",
//visitsSearch: _visitsSearch
);
},
@ -152,8 +154,8 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
},
);
int status = await _visitsProvider.updateGroupOfVisits(
user: _userProvider.user,
host: _settingProvider.host,
user: _userProvider.user!,
host: _settingProvider.host??"",
group: _group
);
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:fluttertoast/fluttertoast.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/regular_visits_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/visits/visits_group.dart';
import 'package:test_sa/models/visits/visits_search.dart';
import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/pages/user/visits/update_visits_group_sheet.dart';
import 'package:test_sa/views/widgets/buttons/app_back_button.dart';
import 'package:test_sa/views/widgets/buttons/app_button.dart';
import 'package:test_sa/views/widgets/buttons/app_icon_button.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/search/visits_search_bar.dart';
import 'package:test_sa/views/widgets/visits/visits_list.dart';
import '../../../../controllers/http_status_manger/http_status_manger.dart';
import '../../../../controllers/localization/localization.dart';
import '../../../../controllers/providers/api/regular_visits_provider.dart';
import '../../../../controllers/providers/api/user_provider.dart';
import '../../../../controllers/providers/settings/setting_provider.dart';
import '../../../../models/subtitle.dart';
import '../../../../models/visits/visits_group.dart';
import '../../../../models/visits/visits_search.dart';
import '../../../app_style/colors.dart';
import '../../../widgets/buttons/app_back_button.dart';
import '../../../widgets/buttons/app_button.dart';
import '../../../widgets/buttons/app_icon_button.dart';
import '../../../widgets/loaders/loading_manager.dart';
import '../../../widgets/search/visits_search_bar.dart';
import '../../../widgets/visits/visits_list.dart';
import 'update_visits_group_sheet.dart';
class RegularVisitsPage extends StatefulWidget {
static final String id = "/Regular-visits";
@override
@ -26,17 +28,17 @@ class RegularVisitsPage extends StatefulWidget {
class _RegularVisitsPageState extends State<RegularVisitsPage>
with TickerProviderStateMixin{
RegularVisitsProvider _visitsProvider;
UserProvider _userProvider;
SettingProvider _settingProvider;
late RegularVisitsProvider _visitsProvider;
late UserProvider _userProvider;
late SettingProvider _settingProvider;
bool _expandedSearch = false;
Subtitle _subtitle;
late Subtitle _subtitle;
@override
Widget build(BuildContext context) {
_visitsProvider = Provider.of<RegularVisitsProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
_userProvider = Provider.of<UserProvider>(context);
_subtitle = AppLocalization.of(context).subtitle;
_subtitle = AppLocalization.of(context)!.subtitle!;
return Scaffold(
body: SafeArea(
child: LoadingManager(
@ -47,8 +49,8 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
_visitsProvider.reset();
//_visitsProvider.visitsSearch = VisitsSearch();
await _visitsProvider.getVisits(
user: _userProvider.user,
host: _settingProvider.host,
user: _userProvider.user!,
host: _settingProvider.host!,
);
},
child: Stack(
@ -67,7 +69,7 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
child: Center(
child: Text(
_subtitle.preventiveMaintenance,
style: Theme.of(context).textTheme.headline6.copyWith(
style: Theme.of(context).textTheme.headline6?.copyWith(
color: AColors.white,
fontStyle: FontStyle.italic
),
@ -88,11 +90,11 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
isScrollControlled: true,
builder: (context){
return VisitsSearchDialog(
initialSearchValue: _visitsProvider.visitsSearch,
initialSearchValue: _visitsProvider.visitsSearch!, onSearch: (VisitsSearch ) { },
);
});
if(_temp != null){
_visitsProvider.visitsSearch.fromSearch(_temp) ;
_visitsProvider.visitsSearch?.fromSearch(_temp) ;
_visitsProvider.reset();
setState(() {});
}
@ -107,7 +109,7 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
),
),
Visibility(
visible: _visitsProvider.visitsSearch.toSearchString().isNotEmpty,
visible: _visitsProvider.visitsSearch?.toSearchString().isNotEmpty??false,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: AButton(
@ -125,8 +127,8 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
nextPage: _visitsProvider.nextPage,
onLazyLoad: () async {
await _visitsProvider.getVisits(
user: _userProvider.user,
host: _settingProvider.host,
user: _userProvider.user!,
host: _settingProvider.host??"",
);
},
onEditGroup: (visits) async {
@ -149,8 +151,8 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
},
);
int status = await _visitsProvider.updateGroupOfVisits(
user: _userProvider.user,
host: _settingProvider.host,
user: _userProvider.user!,
host: _settingProvider.host??"",
group: _group
);
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 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/visits/visit.dart';
import 'package:test_sa/models/visits/visits_group.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_button.dart';
import 'package:test_sa/views/widgets/buttons/app_small_button.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/images/one_image_picker.dart';
import 'package:test_sa/views/widgets/search/filter_item.dart';
import 'package:test_sa/views/widgets/visits/visit_status.dart';
import '../../../../controllers/localization/localization.dart';
import '../../../../models/lookup.dart';
import '../../../../models/subtitle.dart';
import '../../../../models/visits/visit.dart';
import '../../../../models/visits/visits_group.dart';
import '../../../app_style/colors.dart';
import '../../../app_style/sizing.dart';
import '../../../widgets/app_text_form_field.dart';
import '../../../widgets/buttons/app_button.dart';
import '../../../widgets/buttons/app_small_button.dart';
import '../../../widgets/date_and_time/date_picker.dart';
import '../../../widgets/images/one_image_picker.dart';
import '../../../widgets/search/filter_item.dart';
import '../../../widgets/visits/visit_status.dart';
class UpdateVisitsGroupSheet extends StatefulWidget {
final List<Visit> visits;
final String title;
const UpdateVisitsGroupSheet({Key key, this.visits, this.title}) : super(key: key);
final List<Visit>? visits;
final String? title;
const UpdateVisitsGroupSheet({Key? key, this.visits, this.title}) : super(key: key);
@override
_UpdateVisitsGroupSheetState createState() => _UpdateVisitsGroupSheetState();
@ -37,8 +39,8 @@ class _UpdateVisitsGroupSheetState extends State<UpdateVisitsGroupSheet> {
Lookup(label: "Failed", id: 1),
];
VisitsGroup _group = VisitsGroup();
File _image;
Subtitle _subtitle;
late File _image;
late Subtitle _subtitle;
@override
void initState() {
@ -49,7 +51,7 @@ class _UpdateVisitsGroupSheetState extends State<UpdateVisitsGroupSheet> {
@override
Widget build(BuildContext context) {
_subtitle = AppLocalization.of(context).subtitle;
_subtitle = AppLocalization.of(context)!.subtitle!;
return Container(
height: MediaQuery.of(context).size.height / 1.3,
padding: EdgeInsets.symmetric(
@ -198,9 +200,9 @@ class _UpdateVisitsGroupSheetState extends State<UpdateVisitsGroupSheet> {
SizedBox(height: 8 * AppStyle.getScaleFactor(context),),
Expanded(
child: ListView.builder(
itemCount: widget.visits.length,
itemCount: widget.visits?.length,
itemBuilder: (context,index){
Visit visit = widget.visits[index];
Visit visit = widget.visits![index];
return Container(
padding: EdgeInsets.symmetric(vertical: 8,horizontal: 8),
margin: EdgeInsets.symmetric(vertical: 4),
@ -217,8 +219,8 @@ class _UpdateVisitsGroupSheetState extends State<UpdateVisitsGroupSheet> {
children: [
Expanded(
child: Text(
"${_subtitle.sn}: "+visit.deviceSerialNumber ?? _subtitle.noSerialNumberFound,
style: Theme.of(context).textTheme.headline6.copyWith(
"${_subtitle.sn}: ${visit.deviceSerialNumber?? _subtitle.noSerialNumberFound}" ,
style: Theme.of(context).textTheme.headline6?.copyWith(
color: AColors.white,
fontSize: 16,
fontWeight: FontWeight.bold

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

@ -1,7 +1,4 @@
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 '../../../models/subtitle.dart';

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

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

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

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

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

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

Loading…
Cancel
Save