Merge remote-tracking branch 'origin/zaid_development_new' into zaid_development_new

main_design2.0
Sikander Saleem 3 years ago
commit b02a4ab1fc

@ -167,7 +167,7 @@
"newServiceReport": "تقرير خدمة جديد", "newServiceReport": "تقرير خدمة جديد",
"number": "رقم", "number": "رقم",
"operatingHours": "ساعات العمل", "operatingHours": "ساعات العمل",
"partNumber": "رقم القطعة", "partNumberName": "رقم/اسم القطعة",
"quantity": "كمية", "quantity": "كمية",
"reasons": "الاسباب", "reasons": "الاسباب",
"reportStatus": "حالة التقرير", "reportStatus": "حالة التقرير",

@ -167,7 +167,7 @@
"newServiceReport": "New Work Order", "newServiceReport": "New Work Order",
"number": "Number", "number": "Number",
"operatingHours": "Operating Hours", "operatingHours": "Operating Hours",
"partNumber": "Part Number", "partNumberName": "Part Number/Name",
"quantity": "Quantity", "quantity": "Quantity",
"reasons": "Reasons", "reasons": "Reasons",
"reportStatus": "Report Status", "reportStatus": "Report Status",

@ -6,6 +6,7 @@ import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/device/device_transfer.dart'; import 'package:test_sa/models/device/device_transfer.dart';
import 'package:test_sa/models/device/device_transfer_info.dart'; import 'package:test_sa/models/device/device_transfer_info.dart';
import 'package:test_sa/models/device/device_transfer_search.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
import '../../../models/hospital.dart'; import '../../../models/hospital.dart';
@ -14,6 +15,8 @@ class DeviceTransferProvider extends ChangeNotifier {
// number of items call in each request // number of items call in each request
final pageItemNumber = 12; final pageItemNumber = 12;
DeviceTransferSearch deviceTransferSearch = DeviceTransferSearch();
//reset provider data //reset provider data
void reset() { void reset() {
items = null; items = null;
@ -60,7 +63,6 @@ class DeviceTransferProvider extends ChangeNotifier {
Future<int> getRequests({ Future<int> getRequests({
@required String host, @required String host,
@required User user, @required User user,
bool mostRecent,
}) async { }) async {
if (isLoading == true) return -2; if (isLoading == true) return -2;
isLoading = true; isLoading = true;
@ -70,6 +72,7 @@ class DeviceTransferProvider extends ChangeNotifier {
Map<String, dynamic> body = {}; Map<String, dynamic> body = {};
body["pageNumber"] = (items?.length ?? 0) ~/ pageItemNumber + 1; body["pageNumber"] = (items?.length ?? 0) ~/ pageItemNumber + 1;
body["pageSize"] = pageItemNumber; body["pageSize"] = pageItemNumber;
body.addAll(deviceTransferSearch.toMap());
response = await ApiManager.instance.post( response = await ApiManager.instance.post(
URLs.getDeviceTransfer, URLs.getDeviceTransfer,
@ -83,7 +86,7 @@ class DeviceTransferProvider extends ChangeNotifier {
List<DeviceTransfer> itemsPage = listJson.map((request) => DeviceTransfer.fromJson(request)).toList(); List<DeviceTransfer> itemsPage = listJson.map((request) => DeviceTransfer.fromJson(request)).toList();
items ??= []; items ??= [];
items.addAll(itemsPage.toSet().toList()); items.addAll(itemsPage.toSet().toList());
sortMostRecent(items, mostRecent); sortMostRecent(items, deviceTransferSearch.mostRecent);
print(listJson); print(listJson);
if (itemsPage.length == pageItemNumber) { if (itemsPage.length == pageItemNumber) {

@ -1,4 +1,5 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:developer';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
@ -113,10 +114,10 @@ class GasRefillProvider extends ChangeNotifier {
"floor": {"id": floor?.id, "name": floor?.name, "value": floor?.value}, "floor": {"id": floor?.id, "name": floor?.name, "value": floor?.value},
if (expectedDateTime != null) "expectedDate": expectedDateTime?.toIso8601String(), if (expectedDateTime != null) "expectedDate": expectedDateTime?.toIso8601String(),
if (expectedDateTime != null) "expectedTime": expectedDateTime?.toIso8601String(), if (expectedDateTime != null) "expectedTime": expectedDateTime?.toIso8601String(),
if (startDate != null) "startDate": startDate?.toIso8601String(), if (timer?.startAt != null) "startDate": timer.startAt.toIso8601String(),
if (startDate != null) "startTime": startDate?.toIso8601String(), if (timer?.startAt != null) "startTime": timer.startAt.toIso8601String(),
if (endDate != null) "endDate": endDate?.toIso8601String(), if (timer?.endAt != null) "endDate": timer.endAt.toIso8601String(),
if (endDate != null) "endTime": endDate?.toIso8601String(), if (timer?.endAt != null) "endTime": timer.endAt.toIso8601String(),
"department": {"id": department?.id, "departmentName": department?.name, "departmentCode": "", "ntCode": ""}, "department": {"id": department?.id, "departmentName": department?.name, "departmentCode": "", "ntCode": ""},
"GazRefillNo": "GR-${DateTime.now().toString().split(" ").first}", "GazRefillNo": "GR-${DateTime.now().toString().split(" ").first}",
"status": model.status.toMap(), "status": model.status.toMap(),
@ -159,12 +160,12 @@ class GasRefillProvider extends ChangeNotifier {
"status": newModel.status.toMap(), "status": newModel.status.toMap(),
"expectedDate": newModel.expectedDate?.toIso8601String(), "expectedDate": newModel.expectedDate?.toIso8601String(),
"expectedTime": newModel.expectedDate?.toIso8601String(), "expectedTime": newModel.expectedDate?.toIso8601String(),
"startDate": newModel.startDate?.toIso8601String(), if (timer?.startAt != null) "startDate": timer.startAt.toIso8601String(),
"startTime": newModel.startDate?.toIso8601String(), if (timer?.startAt != null) "startTime": timer.startAt.toIso8601String(),
"endDate": newModel.endDate?.toIso8601String(), if (timer?.endAt != null) "endDate": timer.endAt.toIso8601String(),
"endTime": newModel.endDate?.toIso8601String(), if (timer?.endAt != null) "endTime": timer.endAt.toIso8601String(),
// "workingHours": ((endDate?.difference(startDate)?.inMinutes ?? 0) / 60), // "workingHours": ((endDate?.difference(startDate)?.inMinutes ?? 0) / 60),
'workingHours': newModel.workingHours, 'workingHours': timer.durationInSecond != null ? timer.durationInSecond / 60 / 60 : newModel.workingHours,
"assignedEmployee": oldModel?.assignedEmployee?.id == null ? null : oldModel?.assignedEmployee?.toJson(), "assignedEmployee": oldModel?.assignedEmployee?.id == null ? null : oldModel?.assignedEmployee?.toJson(),
"site": hospital?.toMap(), "site": hospital?.toMap(),
"building": building?.toJson(includeFloors: false), "building": building?.toJson(includeFloors: false),
@ -183,24 +184,25 @@ class GasRefillProvider extends ChangeNotifier {
"deliverdQty": model.deliveredQuantity, "deliverdQty": model.deliveredQuantity,
}) })
.toList(); .toList();
log(body.toString());
Response response; return -1;
try { // Response response;
response = await ApiManager.instance.put(URLs.updateGasRefill, body: body); // try {
// response = await post( // response = await ApiManager.instance.put(URLs.updateGasRefill, body: body);
// Uri.parse("$host${URLs.updateGasRefill}/${newModel.id}"), // // response = await post(
// body: body, // // Uri.parse("$host${URLs.updateGasRefill}/${newModel.id}"),
// ); // // body: body,
// // );
stateCode = response.statusCode; //
if (response.statusCode >= 200 && response.statusCode < 300) { // stateCode = response.statusCode;
oldModel.fromGasRefillModel(newModel); // if (response.statusCode >= 200 && response.statusCode < 300) {
notifyListeners(); // oldModel.fromGasRefillModel(newModel);
} // notifyListeners();
return response.statusCode; // }
} catch (error) { // return response.statusCode;
return -1; // } catch (error) {
} // return -1;
// }
} }
Hospital hospital; Hospital hospital;
@ -208,7 +210,5 @@ class GasRefillProvider extends ChangeNotifier {
Floors floor; Floors floor;
Departments department; Departments department;
DateTime expectedDateTime; DateTime expectedDateTime;
DateTime startDate;
DateTime endDate;
TimerModel timer; TimerModel timer;
} }

@ -312,7 +312,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
}, },
"assetType": report.assetType?.toMap(), "assetType": report.assetType?.toMap(),
"assignedEmployee": {"id": report.engineer?.id, "name": report.engineer?.name ?? ""}, "assignedEmployee": {"id": report.engineer?.id, "name": report.engineer?.name ?? ""},
"visitDate": report.visitDate?.toIso8601String() ?? "", "visitDate": report.returnToService?.toIso8601String() ?? "",
// "assistantEmployees": [ // "assistantEmployees": [
// {"id": report.engineer.id, "name": report.engineer.name}, // {"id": report.engineer.id, "name": report.engineer.name},
// ], // ],

@ -0,0 +1,49 @@
import '../lookup.dart';
class DeviceTransferSearch {
String assetName, assetNumber, site;
bool mostRecent;
Lookup dateOperator;
String from, to;
DeviceTransferSearch({
this.assetName,
this.assetNumber,
this.site,
this.mostRecent,
this.dateOperator,
this.from,
this.to,
});
Map<String, dynamic> toMap() {
Map<String, dynamic> search = {};
if (assetName != null && assetName.isNotEmpty) {
search["assetName"] = assetName;
}
if (assetNumber != null && assetNumber.isNotEmpty) {
search["assetNumber"] = assetNumber;
}
if (site != null && site.isNotEmpty) {
search["site"] = site;
}
if (dateOperator != null && from != null) {
search["requestedDateSymbol"] = dateOperator.toMap();
search["requestedDateFrom"] = from;
}
if (dateOperator != null && to != null) {
search["requestedDateTo"] = to;
}
return search;
}
void fromSearch(DeviceTransferSearch newSearch) {
assetName = newSearch.assetName;
assetNumber = newSearch.assetNumber;
site = newSearch.site;
mostRecent = newSearch.mostRecent;
from = newSearch.from;
to = newSearch.to;
dateOperator = newSearch.dateOperator;
}
}

@ -160,7 +160,7 @@ class ServiceReport {
return false; return false;
} }
if (returnToService == null) { if (returnToService == null) {
await Fluttertoast.showToast(msg: "return To Service Date Required"); await Fluttertoast.showToast(msg: "Return To Service Date Required");
return false; return false;
} }
if (timer?.startAt == null) { if (timer?.startAt == null) {

@ -205,7 +205,7 @@ class Subtitle {
String reasons; String reasons;
String attachImage; String attachImage;
String operatingHours; String operatingHours;
String partNumber; String partNumberName;
String number; String number;
String quantity; String quantity;
String orderWorkNumber; String orderWorkNumber;
@ -417,7 +417,7 @@ class Subtitle {
@required this.newServiceReport, @required this.newServiceReport,
@required this.number, @required this.number,
@required this.operatingHours, @required this.operatingHours,
@required this.partNumber, @required this.partNumberName,
@required this.reasons, @required this.reasons,
@required this.reportStatus, @required this.reportStatus,
@required this.reportType, @required this.reportType,
@ -618,7 +618,7 @@ class Subtitle {
newServiceReport: parsedJson["newServiceReport"], newServiceReport: parsedJson["newServiceReport"],
number: parsedJson["number"], number: parsedJson["number"],
operatingHours: parsedJson["operatingHours"], operatingHours: parsedJson["operatingHours"],
partNumber: parsedJson["partNumber"], partNumberName: parsedJson["partNumberName"],
quantity: parsedJson["quantity"], quantity: parsedJson["quantity"],
reasons: parsedJson["reasons"], reasons: parsedJson["reasons"],
reportStatus: parsedJson["reportStatus"], reportStatus: parsedJson["reportStatus"],

@ -143,7 +143,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
if (_userProvider.user?.type == UsersTypes.engineer) if (_userProvider.user?.type == UsersTypes.engineer)
ASmallButton( ASmallButton(
text: _subtitle.edit, text: _subtitle.edit,
onPressed: (_isSender || _isReceiver || false) onPressed: (_isSender)
? () { ? () {
Navigator.of(context).push(MaterialPageRoute( Navigator.of(context).push(MaterialPageRoute(
builder: (_) => UpdateDeviceTransfer( builder: (_) => UpdateDeviceTransfer(
@ -169,7 +169,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
if (_userProvider.user?.type == UsersTypes.engineer) if (_userProvider.user?.type == UsersTypes.engineer)
ASmallButton( ASmallButton(
text: _subtitle.edit, text: _subtitle.edit,
onPressed: (_isReceiver || false) onPressed: (_isReceiver)
? () { ? () {
Navigator.of(context).push(MaterialPageRoute( Navigator.of(context).push(MaterialPageRoute(
builder: (_) => UpdateDeviceTransfer( builder: (_) => UpdateDeviceTransfer(

@ -1,15 +1,16 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart'; import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/device/device_transfer_search.dart';
import 'package:test_sa/views/app_style/colors.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_back_button.dart';
import 'package:test_sa/views/widgets/device_trancfer/device_transfer_list.dart'; import 'package:test_sa/views/widgets/device_trancfer/device_transfer_list.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/switch_button.dart'; import 'package:test_sa/views/widgets/search/asset_transfer_search_dialog.dart';
import '../../widgets/buttons/app_icon_button.dart';
class TrackDeviceTransferPage extends StatefulWidget { class TrackDeviceTransferPage extends StatefulWidget {
static const String id = "/track-device-transfer"; static const String id = "/track-device-transfer";
@ -24,13 +25,12 @@ class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage> with
DeviceTransferProvider _deviceTransferProvider; DeviceTransferProvider _deviceTransferProvider;
UserProvider _userProvider; UserProvider _userProvider;
SettingProvider _settingProvider; SettingProvider _settingProvider;
bool mostRecent = false;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_deviceTransferProvider = Provider.of<DeviceTransferProvider>(context); _deviceTransferProvider = Provider.of<DeviceTransferProvider>(context);
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context); _settingProvider = Provider.of<SettingProvider>(context);
Subtitle _subtitle = AppLocalization.of(context).subtitle;
return Scaffold( return Scaffold(
body: SafeArea( body: SafeArea(
@ -56,7 +56,7 @@ class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage> with
children: [ children: [
Row( Row(
children: [ children: [
ABackButton(), const ABackButton(),
Expanded( Expanded(
child: Center( child: Center(
child: Text( child: Text(
@ -65,29 +65,35 @@ class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage> with
), ),
), ),
), ),
const SizedBox( AIconButton(
width: 48, iconData: Icons.search,
) color: AColors.secondaryColor,
buttonSize: 42,
backgroundColor: AColors.white,
onPressed: () async {
DeviceTransferSearch temp = await showModalBottomSheet(
context: context,
isScrollControlled: true,
builder: (context) {
return AssetTransferSearchDialog(initialSearchValue: _deviceTransferProvider.deviceTransferSearch);
});
if (temp != null) {
_deviceTransferProvider.deviceTransferSearch = temp;
_deviceTransferProvider.reset();
setState(() {});
await _deviceTransferProvider.getRequests(
user: _userProvider.user,
host: _settingProvider.host,
);
}
},
),
const SizedBox(width: 16),
], ],
), ),
], ],
), ),
), ),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: ASwitchButton(
title: "Most Recent",
value: mostRecent,
onChange: (value) async {
mostRecent = value;
await _deviceTransferProvider.getRequests(
user: _userProvider.user,
host: _settingProvider.host,
mostRecent: mostRecent,
);
},
),
),
Expanded( Expanded(
child: DeviceTransferList( child: DeviceTransferList(
nextPage: _deviceTransferProvider.nextPage, nextPage: _deviceTransferProvider.nextPage,

@ -87,7 +87,7 @@ class _SparePartsBottomSheetState extends State<SparePartsBottomSheet> {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(subtitle.partNumber), ASubTitle(subtitle.partNumberName),
_validate && _workOrder.sparePartsWorkOrders == null _validate && _workOrder.sparePartsWorkOrders == null
? ASubTitle( ? ASubTitle(
subtitle.requiredWord, subtitle.requiredWord,

@ -106,7 +106,7 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
Expanded( Expanded(
child: Center( child: Center(
child: Text( child: Text(
_subtitle.details, "Gas Refill Request",
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
), ),
), ),

@ -12,6 +12,7 @@ import 'package:test_sa/models/gas_refill/gas_refill_details.dart';
import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; import 'package:test_sa/models/gas_refill/gas_refill_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/timer_model.dart';
import 'package:test_sa/views/app_style/sizing.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/app_text_form_field.dart';
import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart';
@ -156,14 +157,15 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
if (widget.gasRefillModel != null) { if (widget.gasRefillModel != null) {
_formModel.status = widget.gasRefillModel?.status ?? const Lookup(value: 0); _formModel.status = widget.gasRefillModel?.status ?? const Lookup(value: 0);
_gasRefillProvider.expectedDateTime = _formModel.expectedDate; _gasRefillProvider.expectedDateTime = _formModel.expectedDate;
_gasRefillProvider.timer = TimerModel(startAt: widget.gasRefillModel?.startDate, endAt: widget.gasRefillModel?.endDate);
} else {
_gasRefillProvider.timer = null;
} }
HospitalsProvider().getHospitalsListByVal(searchVal: _userProvider.user?.clientName).then((value) { HospitalsProvider().getHospitalsListByVal(searchVal: _userProvider.user?.clientName).then((value) {
_gasRefillProvider.hospital = value?.firstWhere((element) => element.name == _userProvider.user?.clientName, orElse: () => null); _gasRefillProvider.hospital = value?.firstWhere((element) => element.name == _userProvider.user?.clientName, orElse: () => null);
_gasRefillProvider.building = _gasRefillProvider.hospital?.buildings?.firstWhere((element) => element.name == widget.gasRefillModel?.building?.name, orElse: () => null); _gasRefillProvider.building = _gasRefillProvider.hospital?.buildings?.firstWhere((element) => element.name == widget.gasRefillModel?.building?.name, orElse: () => null);
_gasRefillProvider.floor = _gasRefillProvider.building?.floors?.firstWhere((element) => element.name == widget.gasRefillModel?.floor?.name, orElse: () => null); _gasRefillProvider.floor = _gasRefillProvider.building?.floors?.firstWhere((element) => element.name == widget.gasRefillModel?.floor?.name, orElse: () => null);
_gasRefillProvider.department = _gasRefillProvider.floor?.departments?.firstWhere((element) => element.name == widget.gasRefillModel?.department?.departmentName, orElse: () => null); _gasRefillProvider.department = _gasRefillProvider.floor?.departments?.firstWhere((element) => element.name == widget.gasRefillModel?.department?.departmentName, orElse: () => null);
_gasRefillProvider.startDate = widget.gasRefillModel?.startDate;
_gasRefillProvider.endDate = widget.gasRefillModel?.endDate;
_firstTime = false; _firstTime = false;
setState(() {}); setState(() {});
}); });
@ -252,6 +254,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
BuildingTypeMenu( BuildingTypeMenu(
initialValue: _gasRefillProvider?.building, initialValue: _gasRefillProvider?.building,
building: _gasRefillProvider?.hospital?.buildings, building: _gasRefillProvider?.hospital?.buildings,
enabled: widget.gasRefillModel == null,
onSelect: (status) { onSelect: (status) {
_gasRefillProvider.building = status; _gasRefillProvider.building = status;
setState(() {}); setState(() {});
@ -261,6 +264,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
FloorTypeMenu( FloorTypeMenu(
initialValue: _gasRefillProvider?.floor, initialValue: _gasRefillProvider?.floor,
floors: _gasRefillProvider?.building?.floors, floors: _gasRefillProvider?.building?.floors,
enabled: widget.gasRefillModel == null,
onSelect: (status) { onSelect: (status) {
_gasRefillProvider.floor = status; _gasRefillProvider.floor = status;
setState(() {}); setState(() {});
@ -270,6 +274,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
DepartmentTypeMenu( DepartmentTypeMenu(
initialValue: _gasRefillProvider?.department, initialValue: _gasRefillProvider?.department,
departments: _gasRefillProvider?.floor?.departments, departments: _gasRefillProvider?.floor?.departments,
enabled: widget.gasRefillModel == null,
onSelect: (status) { onSelect: (status) {
_gasRefillProvider.department = status; _gasRefillProvider.department = status;
setState(() {}); setState(() {});
@ -286,8 +291,6 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
timer: _gasRefillProvider.timer, timer: _gasRefillProvider.timer,
onChange: (timer) async { onChange: (timer) async {
_gasRefillProvider.timer = timer; _gasRefillProvider.timer = timer;
_formModel.startDate ??= timer.startAt;
_gasRefillProvider.endDate = timer.endAt;
_formModel.workingHours = num.tryParse((((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0"); _formModel.workingHours = num.tryParse((((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0");
return true; return true;
}, },

@ -22,7 +22,6 @@ 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/app_text_form_field.dart';
import 'package:test_sa/views/widgets/buttons/app_back_button.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_button.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; import 'package:test_sa/views/widgets/e_signature/e_signature.dart';
import 'package:test_sa/views/widgets/equipment/auto_complete_devices_field.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/images/mini_one_image_picker.dart';
@ -35,6 +34,7 @@ import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart'
import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
import '../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart'; import '../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart';
import '../../../../widgets/date_and_time/date_picker.dart';
import '../../../../widgets/status/report/service_report_fault_description.dart'; import '../../../../widgets/status/report/service_report_fault_description.dart';
import '../../../../widgets/status/report/service_report_repair_location.dart'; import '../../../../widgets/status/report/service_report_repair_location.dart';
import '../../../../widgets/timer/app_timer.dart'; import '../../../../widgets/timer/app_timer.dart';
@ -69,7 +69,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
@override @override
void initState() { void initState() {
_serviceReport = ServiceReport( _serviceReport = ServiceReport(
visitDate: DateTime.now(), returnToService: DateTime.now(),
//type: const Lookup(value: 2), //type: const Lookup(value: 2),
device: widget.request.device, device: widget.request.device,
parts: [], parts: [],
@ -200,63 +200,6 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
// Report type and Reasons // Report type and Reasons
Row(
children: [
// Report Status
// Expanded(
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// ASubTitle(_subtitle.reportType),
// _validate && _serviceReport.type == null ?
// ASubTitle(_subtitle.requiredWord,color: Colors.red,):
// const SizedBox.shrink(),
// const SizedBox(height: 4,),
// ServiceReportTypeMenu(
// initialValue: _serviceReport.type,
// onSelect: (status){
// _serviceReport.type = status;
// },
// ),
// ],
// ),
// ),
// const SizedBox(width: 8,),
// visit date
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.visitDate),
_validate && _serviceReport.visitDate == null
? ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
Row(
children: [
Expanded(
child: ADatePicker(
date: _serviceReport.visitDate,
from: DateTime.now().subtract(const Duration(days: 365)),
to: DateTime.now().add(const Duration(days: 365)),
onDatePicker: (date) {
_serviceReport.visitDate = date;
setState(() {});
},
),
),
],
),
],
),
),
],
),
const SizedBox(
height: 8,
),
// device sn // device sn
Visibility( Visibility(
visible: widget.request.deviceSerialNumber == null, visible: widget.request.deviceSerialNumber == null,
@ -420,6 +363,63 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
SizedBox( SizedBox(
height: 8 * AppStyle.getScaleFactor(context), height: 8 * AppStyle.getScaleFactor(context),
), ),
Row(
children: [
// Report Status
// Expanded(
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// ASubTitle(_subtitle.reportType),
// _validate && _serviceReport.type == null ?
// ASubTitle(_subtitle.requiredWord,color: Colors.red,):
// const SizedBox.shrink(),
// const SizedBox(height: 4,),
// ServiceReportTypeMenu(
// initialValue: _serviceReport.type,
// onSelect: (status){
// _serviceReport.type = status;
// },
// ),
// ],
// ),
// ),
// const SizedBox(width: 8,),
// visit date
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const ASubTitle("Return to Service"),
_validate && _serviceReport.returnToService == null
? ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
Row(
children: [
Expanded(
child: ADatePicker(
date: _serviceReport.returnToService,
from: DateTime.now().subtract(const Duration(days: 365)),
to: DateTime.now().add(const Duration(days: 365)),
onDatePicker: (date) {
_serviceReport.returnToService = date;
setState(() {});
},
),
),
],
),
],
),
),
],
),
const SizedBox(
height: 8,
),
ASubTitle(_subtitle.workingHours), ASubTitle(_subtitle.workingHours),
const SizedBox(height: 8), const SizedBox(height: 8),
Row( Row(
@ -569,7 +569,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
), ),
Row( Row(
children: [ children: [
ASubTitle(_subtitle.workPreformed), const ASubTitle("Solutions"),
// Expanded( // Expanded(
// child: SizedBox( // child: SizedBox(
// height: 32 * AppStyle.getScaleFactor(context), // height: 32 * AppStyle.getScaleFactor(context),
@ -609,7 +609,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.reasons), const ASubTitle("Failure Reason"),
_validate && _serviceReport.reason?.id == null _validate && _serviceReport.reason?.id == null
? ASubTitle( ? ASubTitle(
_subtitle.requiredWord, _subtitle.requiredWord,
@ -655,7 +655,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
}, },
), ),
const SizedBox(height: 16), const SizedBox(height: 16),
ASubTitle(_subtitle.travelingExpense), const ASubTitle("Travel Expenses"),
const SizedBox( const SizedBox(
height: 4, height: 4,
), ),
@ -791,7 +791,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
// ), // ),
const SizedBox(height: 8), const SizedBox(height: 8),
ASubTitle(_subtitle.comment), const ASubTitle("Technical comment"),
const SizedBox(height: 4), const SizedBox(height: 4),
ATextFormField( ATextFormField(
initialValue: _serviceReport?.comment, initialValue: _serviceReport?.comment,
@ -858,7 +858,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.partNumber), ASubTitle(_subtitle.partNumberName),
_validate && _serviceReport.parts == null _validate && _serviceReport.parts == null
? ASubTitle( ? ASubTitle(
_subtitle.requiredWord, _subtitle.requiredWord,

@ -1000,7 +1000,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.partNumber), ASubTitle(_subtitle.partNumberName),
_validate && _serviceReport.parts == null _validate && _serviceReport.parts == null
? ASubTitle( ? ASubTitle(
_subtitle.requiredWord, _subtitle.requiredWord,

@ -13,20 +13,18 @@ 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/info_row.dart';
import 'package:test_sa/views/widgets/visits/visit_status.dart'; import 'package:test_sa/views/widgets/visits/visit_status.dart';
import '../../../../controllers/providers/api/regular_visits_provider.dart';
import '../../../../controllers/providers/api/user_provider.dart'; import '../../../../controllers/providers/api/user_provider.dart';
import '../../../../models/enums/user_types.dart'; import '../../../../models/enums/user_types.dart';
class VisitDetailsPage extends StatelessWidget { class VisitDetailsPage extends StatelessWidget {
static final String id = "/visit-details"; static const String id = "/visit-details";
final Visit visit; final Visit visit;
const VisitDetailsPage({Key key, this.visit}) : super(key: key); const VisitDetailsPage({Key key, this.visit}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle; Subtitle subtitle = AppLocalization.of(context).subtitle;
final regularVisitsProvider = Provider.of<RegularVisitsProvider>(context); UserProvider userProvider = Provider.of<UserProvider>(context);
UserProvider _userProvider = Provider.of<UserProvider>(context);
return Scaffold( return Scaffold(
body: SafeArea( body: SafeArea(
@ -37,16 +35,16 @@ class VisitDetailsPage extends StatelessWidget {
padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4),
child: Row( child: Row(
children: [ children: [
ABackButton(), const ABackButton(),
Expanded( Expanded(
child: Center( child: Center(
child: Text( child: Text(
_subtitle.visitInformation, subtitle.visitInformation,
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), style: Theme.of(context).textTheme.titleLarge.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
), ),
), ),
), ),
if (_userProvider?.user?.type == UsersTypes.engineer) if (userProvider?.user?.type == UsersTypes.engineer)
AIconButton( AIconButton(
iconData: Icons.edit, iconData: Icons.edit,
color: AColors.white, color: AColors.white,
@ -60,15 +58,15 @@ class VisitDetailsPage extends StatelessWidget {
))); )));
}, },
), ),
SizedBox(width: 42) const SizedBox(width: 42)
], ],
), ),
), ),
Expanded( Expanded(
child: ListView( child: ListView(
padding: EdgeInsets.symmetric(horizontal: 16), padding: const EdgeInsets.symmetric(horizontal: 16),
children: [ children: [
SizedBox( const SizedBox(
height: 8, height: 8,
), ),
MaterialButton( MaterialButton(
@ -97,7 +95,7 @@ class VisitDetailsPage extends StatelessWidget {
), ),
), ),
), ),
SizedBox( const SizedBox(
height: 8, height: 8,
), ),
SizedBox( SizedBox(
@ -106,11 +104,11 @@ class VisitDetailsPage extends StatelessWidget {
images: visit.images, images: visit.images,
), ),
), ),
SizedBox( const SizedBox(
height: 8, height: 8,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.code, title: subtitle.code,
info: visit.serialNumber, info: visit.serialNumber,
), ),
RequestInfoRow( RequestInfoRow(
@ -118,27 +116,27 @@ class VisitDetailsPage extends StatelessWidget {
info: visit.deviceNumber, info: visit.deviceNumber,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.deviceName, title: subtitle.deviceName,
content: visit.deviceEnglishName, content: visit.deviceEnglishName,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.deviceSN, title: subtitle.deviceSN,
info: visit.deviceSerialNumber, info: visit.deviceSerialNumber,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.expectDate, title: subtitle.expectDate,
info: visit.expectDate, info: visit.expectDate,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.actualDate, title: subtitle.actualDate,
info: visit.actualDate, info: visit.actualDate,
), ),
Row( Row(
children: [ children: [
Expanded( Expanded(
child: Text( child: Text(
"${_subtitle.status} : ", "${subtitle.status} : ",
style: Theme.of(context).textTheme.subtitle1.copyWith(fontWeight: FontWeight.bold), style: Theme.of(context).textTheme.titleMedium.copyWith(fontWeight: FontWeight.bold),
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
), ),
@ -151,15 +149,15 @@ class VisitDetailsPage extends StatelessWidget {
color: Theme.of(context).primaryColor, color: Theme.of(context).primaryColor,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.contactStatus, title: subtitle.contactStatus,
info: visit.assignTo, info: visit.assignTo,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.engineerName, title: subtitle.engineerName,
info: visit.employName, info: visit.employName,
), ),
RequestInfoRow( RequestInfoRow(
title: _subtitle.hospital, title: subtitle.hospital,
content: visit.hospitalName, content: visit.hospitalName,
), ),
], ],

@ -3,12 +3,15 @@ import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
import '../loaders/app_loading.dart';
class BuildingTypeMenu extends StatefulWidget { class BuildingTypeMenu extends StatefulWidget {
final Function(Buildings) onSelect; final Function(Buildings) onSelect;
Buildings initialValue; Buildings initialValue;
List<Buildings> building; List<Buildings> building;
bool enabled;
BuildingTypeMenu({Key key, this.onSelect, this.initialValue, this.building = const []}) : super(key: key); BuildingTypeMenu({Key key, this.onSelect, this.initialValue, this.building = const [], this.enabled = true}) : super(key: key);
@override @override
_BuildingTypeMenuState createState() { _BuildingTypeMenuState createState() {
@ -51,46 +54,55 @@ class _BuildingTypeMenuState extends State<BuildingTypeMenu> {
decoration: BoxDecoration( decoration: BoxDecoration(
color: AColors.inputFieldBackgroundColor, color: AColors.inputFieldBackgroundColor,
border: Border.all( border: Border.all(
color: Color(0xffefefef), color: const Color(0xffefefef),
), ),
borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)),
// boxShadow: const [ // boxShadow: const [
// AppStyle.boxShadow // AppStyle.boxShadow
// ] // ]
), ),
child: DropdownButton<Buildings>( child: widget.enabled
value: _selectedBuilding, ? DropdownButton<Buildings>(
iconSize: 24, value: _selectedBuilding,
icon: const Icon(Icons.keyboard_arrow_down_rounded), iconSize: 24,
elevation: 0, icon: const Icon(Icons.keyboard_arrow_down_rounded),
isExpanded: true, elevation: 0,
hint: Text( isExpanded: true,
"Select Building", hint: Text(
style: Theme.of(context).textTheme.subtitle1, "Select Building",
), style: Theme.of(context).textTheme.subtitle1,
style: TextStyle(color: Theme.of(context).primaryColor), ),
underline: SizedBox.shrink(), style: TextStyle(color: Theme.of(context).primaryColor),
onChanged: (Buildings newValue) { underline: const SizedBox.shrink(),
setState(() { onChanged: (Buildings newValue) {
_selectedBuilding = newValue; setState(() {
}); _selectedBuilding = newValue;
widget.onSelect(newValue); });
}, widget.onSelect(newValue);
items: _building?.map<DropdownMenuItem<Buildings>>((Buildings value) { },
return DropdownMenuItem<Buildings>( items: _building?.map<DropdownMenuItem<Buildings>>((Buildings value) {
value: value, return DropdownMenuItem<Buildings>(
child: Text( value: value,
value.name ?? "", child: Text(
style: Theme.of(context).textTheme.subtitle1.copyWith( value.name ?? "",
color: Theme.of(context).primaryColor, style: Theme.of(context).textTheme.subtitle1.copyWith(
fontSize: 11, color: Theme.of(context).primaryColor,
//fontWeight: FontWeight.bold fontSize: 11,
//fontWeight: FontWeight.bold
),
), ),
);
})?.toList() ??
[],
)
: widget.initialValue == null
? const Padding(
padding: EdgeInsets.all(8.0),
child: ALoading(),
)
: ListTile(
title: Center(child: Text(widget.initialValue.name)),
), ),
);
})?.toList() ??
[],
),
); );
} }
} }

@ -3,12 +3,21 @@ import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
import '../loaders/app_loading.dart';
class DepartmentTypeMenu extends StatefulWidget { class DepartmentTypeMenu extends StatefulWidget {
final Function(Departments) onSelect; final Function(Departments) onSelect;
Departments initialValue; Departments initialValue;
List<Departments> departments; List<Departments> departments;
bool enabled;
DepartmentTypeMenu({Key key, this.onSelect, this.initialValue, this.departments = const []}) : super(key: key); DepartmentTypeMenu({
Key key,
this.onSelect,
this.initialValue,
this.departments = const [],
this.enabled = true,
}) : super(key: key);
@override @override
_DepartmentTypeMenuState createState() { _DepartmentTypeMenuState createState() {
@ -58,39 +67,43 @@ class _DepartmentTypeMenuState extends State<DepartmentTypeMenu> {
// AppStyle.boxShadow // AppStyle.boxShadow
// ] // ]
), ),
child: DropdownButton<Departments>( child: widget.enabled
value: _selected, ? DropdownButton<Departments>(
iconSize: 24, value: _selected,
icon: const Icon(Icons.keyboard_arrow_down_rounded), iconSize: 24,
elevation: 0, icon: const Icon(Icons.keyboard_arrow_down_rounded),
isExpanded: true, elevation: 0,
hint: Text( isExpanded: true,
"Select Department", hint: Text(
style: Theme.of(context).textTheme.subtitle1, "Select Department",
), style: Theme.of(context).textTheme.subtitle1,
style: TextStyle(color: Theme.of(context).primaryColor), ),
underline: SizedBox.shrink(), style: TextStyle(color: Theme.of(context).primaryColor),
onChanged: (Departments newValue) { underline: SizedBox.shrink(),
setState(() { onChanged: (Departments newValue) {
_selected = newValue; setState(() {
}); _selected = newValue;
widget.onSelect(newValue); });
}, widget.onSelect(newValue);
items: widget?.departments?.map<DropdownMenuItem<Departments>>((Departments value) { },
return DropdownMenuItem<Departments>( items: widget?.departments?.map<DropdownMenuItem<Departments>>((Departments value) {
value: value, return DropdownMenuItem<Departments>(
child: Text( value: value,
value.name, child: Text(
style: Theme.of(context).textTheme.subtitle1.copyWith( value.name,
color: Theme.of(context).primaryColor, style: Theme.of(context).textTheme.subtitle1.copyWith(
fontSize: 11, color: Theme.of(context).primaryColor,
//fontWeight: FontWeight.bold fontSize: 11,
//fontWeight: FontWeight.bold
),
), ),
), );
); })?.toList() ??
})?.toList() ?? [],
[], )
), : widget.initialValue == null
? const Padding(padding: EdgeInsets.all(8.0), child: ALoading())
: ListTile(title: Center(child: Text(widget.initialValue.name))),
); );
} }
} }

@ -3,12 +3,21 @@ import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
import '../loaders/app_loading.dart';
class FloorTypeMenu extends StatefulWidget { class FloorTypeMenu extends StatefulWidget {
final Function(Floors) onSelect; final Function(Floors) onSelect;
Floors initialValue; Floors initialValue;
List<Floors> floors; List<Floors> floors;
bool enabled;
FloorTypeMenu({Key key, this.onSelect, this.initialValue, this.floors = const []}) : super(key: key); FloorTypeMenu({
Key key,
this.onSelect,
this.initialValue,
this.floors = const [],
this.enabled = true,
}) : super(key: key);
@override @override
_FloorTypeMenuState createState() { _FloorTypeMenuState createState() {
@ -51,46 +60,55 @@ class _FloorTypeMenuState extends State<FloorTypeMenu> {
decoration: BoxDecoration( decoration: BoxDecoration(
color: AColors.inputFieldBackgroundColor, color: AColors.inputFieldBackgroundColor,
border: Border.all( border: Border.all(
color: Color(0xffefefef), color: const Color(0xffefefef),
), ),
borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)),
// boxShadow: const [ // boxShadow: const [
// AppStyle.boxShadow // AppStyle.boxShadow
// ] // ]
), ),
child: DropdownButton<Floors>( child: widget.enabled
value: _selected, ? DropdownButton<Floors>(
iconSize: 24, value: _selected,
icon: const Icon(Icons.keyboard_arrow_down_rounded), iconSize: 24,
elevation: 0, icon: const Icon(Icons.keyboard_arrow_down_rounded),
isExpanded: true, elevation: 0,
hint: Text( isExpanded: true,
"Select Floor", hint: Text(
style: Theme.of(context).textTheme.subtitle1, "Select Floor",
), style: Theme.of(context).textTheme.subtitle1,
style: TextStyle(color: Theme.of(context).primaryColor), ),
underline: SizedBox.shrink(), style: TextStyle(color: Theme.of(context).primaryColor),
onChanged: (Floors newValue) { underline: const SizedBox.shrink(),
setState(() { onChanged: (Floors newValue) {
_selected = newValue; setState(() {
}); _selected = newValue;
widget.onSelect(newValue); });
}, widget.onSelect(newValue);
items: _floors?.map<DropdownMenuItem<Floors>>((Floors value) { },
return DropdownMenuItem<Floors>( items: _floors?.map<DropdownMenuItem<Floors>>((Floors value) {
value: value, return DropdownMenuItem<Floors>(
child: Text( value: value,
value.name ?? "", child: Text(
style: Theme.of(context).textTheme.subtitle1.copyWith( value.name ?? "",
color: Theme.of(context).primaryColor, style: Theme.of(context).textTheme.subtitle1.copyWith(
fontSize: 11, color: Theme.of(context).primaryColor,
//fontWeight: FontWeight.bold fontSize: 11,
//fontWeight: FontWeight.bold
),
), ),
);
})?.toList() ??
[],
)
: widget.initialValue == null
? const Padding(
padding: EdgeInsets.all(8.0),
child: ALoading(),
)
: ListTile(
title: Center(child: Text(widget.initialValue.name)),
), ),
);
})?.toList() ??
[],
),
); );
} }
} }

@ -0,0 +1,202 @@
import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/models/device/device_transfer_search.dart';
import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/buttons/app_button.dart';
import 'package:test_sa/views/widgets/buttons/app_small_button.dart';
import '../app_text_form_field.dart';
import '../date_and_time/date_picker.dart';
import '../status/report/service_report_visit_date_operator.dart';
import '../switch_button.dart';
import '../titles/app_sub_title.dart';
class AssetTransferSearchDialog extends StatefulWidget {
final DeviceTransferSearch initialSearchValue;
final bool expandedSearch;
final Function(DeviceTransferSearch) onSearch;
const AssetTransferSearchDialog({Key key, this.initialSearchValue, this.expandedSearch, this.onSearch}) : super(key: key);
@override
AssetTransferSearchDialogState createState() => AssetTransferSearchDialogState();
}
class AssetTransferSearchDialogState extends State<AssetTransferSearchDialog> with TickerProviderStateMixin {
DeviceTransferSearch _search;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
@override
void initState() {
super.initState();
_search = DeviceTransferSearch();
_search.fromSearch(widget.initialSearchValue);
}
@override
Widget build(BuildContext context) {
Subtitle subtitle = AppLocalization.of(context).subtitle;
return SizedBox(
height: MediaQuery.of(context).size.height / 1.3,
child: Form(
key: _formKey,
child: ListView(
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
ASmallButton(
text: subtitle.cancel,
onPressed: () {
Navigator.of(context).pop();
},
),
ASmallButton(
text: subtitle.search,
onPressed: () {
if (!_formKey.currentState.validate()) {
return;
}
_formKey.currentState.save();
Navigator.of(context).pop(_search);
},
)
],
),
ASwitchButton(
title: "Most Recent",
value: _search.mostRecent ?? false,
onChange: (value) {
_search.mostRecent = value;
setState(() {});
},
),
SizedBox(
height: 8.0 * AppStyle.getScaleFactor(context),
),
ATextFormField(
initialValue: _search.assetNumber,
hintText: subtitle.assetNumber,
style: Theme.of(context).textTheme.headline6,
textInputAction: TextInputAction.search,
onAction: () {
if (!_formKey.currentState.validate()) {
return;
}
_formKey.currentState.save();
Navigator.of(context).pop(_search);
},
onSaved: (value) {
_search.assetNumber = value;
},
),
SizedBox(
height: 8.0 * AppStyle.getScaleFactor(context),
),
ATextFormField(
initialValue: _search.assetName,
hintText: subtitle.assetName,
style: Theme.of(context).textTheme.headline6,
textInputAction: TextInputAction.search,
onAction: () {
if (!_formKey.currentState.validate()) {
return;
}
_formKey.currentState.save();
Navigator.of(context).pop(_search);
},
onSaved: (value) {
_search.site = value;
},
),
SizedBox(
height: 8.0 * AppStyle.getScaleFactor(context),
),
ATextFormField(
initialValue: _search.site,
hintText: subtitle.site,
style: Theme.of(context).textTheme.headline6,
textInputAction: TextInputAction.search,
onAction: () {
if (!_formKey.currentState.validate()) {
return;
}
_formKey.currentState.save();
Navigator.of(context).pop(_search);
},
onSaved: (value) {
_search.assetName = value;
},
),
SizedBox(
height: 8.0 * AppStyle.getScaleFactor(context),
),
const ASubTitle("Request Date"),
const SizedBox(height: 4),
ServiceReportVisitDateOperator(
initialValue: _search.dateOperator,
onSelect: (status) {
_search.dateOperator = status;
setState(() {});
},
),
Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
if (_search?.dateOperator?.name?.toLowerCase()?.contains("between") ?? false) const ASubTitle("From"),
ADatePicker(
date: DateTime.tryParse(_search.from ?? ""),
from: DateTime(1950),
onDatePicker: (date) {
_search.from = date?.toIso8601String();
setState(() {});
},
),
],
),
),
if (_search?.dateOperator?.name?.toLowerCase()?.contains("between") ?? false) const SizedBox(width: 16),
if (_search?.dateOperator?.name?.toLowerCase()?.contains("between") ?? false)
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const ASubTitle("To"),
ADatePicker(
date: DateTime.tryParse(_search.to ?? ""),
from: DateTime(1950),
onDatePicker: (date) {
_search.to = date?.toIso8601String();
setState(() {});
},
),
],
),
),
],
),
const SizedBox(width: 16),
Visibility(
visible: _search.toMap().isNotEmpty,
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
child: AButton(
padding: EdgeInsets.zero,
text: subtitle.clearSearch,
onPressed: () {
_search = DeviceTransferSearch();
Navigator.of(context).pop(_search);
},
),
),
),
],
),
),
);
}
}

@ -244,7 +244,7 @@ class _ServiceRequestsSearchDialogState extends State<ServiceRequestsSearchDialo
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch, crossAxisAlignment: CrossAxisAlignment.stretch,
children: [ children: [
const ASubTitle("From"), if (_search?.dateOperator?.name?.toLowerCase()?.contains("between") ?? false) const ASubTitle("From"),
ADatePicker( ADatePicker(
date: DateTime.tryParse(_search.from ?? ""), date: DateTime.tryParse(_search.from ?? ""),
from: DateTime(1950), from: DateTime(1950),

@ -21,27 +21,28 @@ class VisitItem extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
UserProvider _userProvider = Provider.of<UserProvider>(context); UserProvider userProvider = Provider.of<UserProvider>(context);
Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary;
Color onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; Color onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary;
Subtitle _subtitle = AppLocalization.of(context).subtitle; Subtitle subtitle = AppLocalization.of(context).subtitle;
return Padding( return Padding(
padding: const EdgeInsets.symmetric(vertical: 4), padding: const EdgeInsets.symmetric(vertical: 4),
child: ElevatedButton( child: ElevatedButton(
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
padding: EdgeInsets.symmetric(vertical: 8, horizontal: 8), padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 8),
primary: itemColor, backgroundColor: itemColor,
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)),
), ),
), ),
onPressed: () { onPressed: () {
if (activeSelectMod && _userProvider.user.type == UsersTypes.engineer) if (activeSelectMod && userProvider.user.type == UsersTypes.engineer) {
onSelect(visit); onSelect(visit);
else } else {
onPressed(visit); onPressed(visit);
}
}, },
onLongPress: _userProvider.user.type == UsersTypes.engineer onLongPress: userProvider.user.type == UsersTypes.engineer
? () { ? () {
onLongPress(visit); onLongPress(visit);
} }
@ -53,12 +54,12 @@ class VisitItem extends StatelessWidget {
children: [ children: [
Expanded( Expanded(
child: Text( child: Text(
"S.N: " + visit.deviceSerialNumber ?? "No serial number", "S.N: ${visit.deviceSerialNumber}" ?? "No serial number",
style: Theme.of(context).textTheme.headline6.copyWith(color: onItemColor, fontSize: 16, fontWeight: FontWeight.bold), style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 16, fontWeight: FontWeight.bold),
), ),
), ),
AnimatedSwitcher( AnimatedSwitcher(
duration: Duration(milliseconds: 400), duration: const Duration(milliseconds: 400),
child: Visibility( child: Visibility(
key: ValueKey(activeSelectMod), key: ValueKey(activeSelectMod),
visible: activeSelectMod, visible: activeSelectMod,
@ -83,10 +84,7 @@ class VisitItem extends StatelessWidget {
), ),
Text( Text(
visit.deviceNumber ?? "", visit.deviceNumber ?? "",
style: Theme.of(context).textTheme.subtitle1.copyWith( style: Theme.of(context).textTheme.titleMedium.copyWith(color: onItemColor, fontSize: 14),
color: onItemColor,
fontSize: 14,
),
), ),
Divider( Divider(
color: onItemColor, color: onItemColor,
@ -96,7 +94,7 @@ class VisitItem extends StatelessWidget {
Expanded( Expanded(
child: Text( child: Text(
visit.hospitalName ?? "No client found", visit.hospitalName ?? "No client found",
style: Theme.of(context).textTheme.subtitle1.copyWith( style: Theme.of(context).textTheme.titleMedium.copyWith(
color: onItemColor, color: onItemColor,
fontSize: 14, fontSize: 14,
), ),
@ -106,29 +104,30 @@ class VisitItem extends StatelessWidget {
), ),
Text( Text(
visit.modelAndBrand ?? "", visit.modelAndBrand ?? "",
style: Theme.of(context).textTheme.subtitle1.copyWith( style: Theme.of(context).textTheme.titleMedium.copyWith(
color: onItemColor, color: onItemColor,
fontSize: 14, fontSize: 14,
), ),
), ),
Divider(color: onItemColor), if (visit.employName != null && visit.employName.isNotEmpty) Divider(color: onItemColor),
Row( if (visit.employName != null && visit.employName.isNotEmpty)
children: [ Row(
Expanded( children: [
child: Text( Expanded(
visit.employName ?? "No employ found", child: Text(
style: Theme.of(context).textTheme.headline6.copyWith(color: onItemColor, fontSize: 14, fontWeight: FontWeight.bold), visit.employName ?? "No employ found",
style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14, fontWeight: FontWeight.bold),
),
), ),
), // Text(
// Text( // visit.contactStatus ?? "",
// visit.contactStatus ?? "", // style: Theme.of(context).textTheme.subtitle1.copyWith(
// style: Theme.of(context).textTheme.subtitle1.copyWith( // color: onItemColor,
// color: onItemColor, // fontSize: 14,
// fontSize: 14, // ),
// ), // ),
// ), ],
], ),
),
Divider( Divider(
color: onItemColor, color: onItemColor,
), ),
@ -139,18 +138,12 @@ class VisitItem extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
_subtitle.expectDate, subtitle.expectDate,
style: Theme.of(context).textTheme.headline6.copyWith( style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14),
color: onItemColor,
fontSize: 14,
),
), ),
Text( Text(
visit.expectDate ?? _subtitle.noDateFound, visit.expectDate ?? subtitle.noDateFound,
style: Theme.of(context).textTheme.headline6.copyWith( style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14),
color: onItemColor,
fontSize: 14,
),
), ),
], ],
), ),
@ -159,25 +152,12 @@ class VisitItem extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
_subtitle.actualDate, subtitle.actualDate,
style: Theme.of(context).textTheme.headline6.copyWith( style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14),
color: onItemColor,
fontSize: 14,
),
), ),
Text( Text(
visit.actualDate ?? _subtitle.noDateFound, visit.actualDate ?? subtitle.noDateFound,
style: Theme.of(context).textTheme.headline6.copyWith( style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14),
color: onItemColor,
fontSize: 14,
),
// Text(
// visit.contactStatus ?? "",
// style: Theme.of(context).textTheme.subtitle1.copyWith(
// color: onItemColor,
// fontSize: 14,
// ),
// ),
), ),
], ],
), ),

@ -21,7 +21,7 @@ class VisitsList extends StatefulWidget {
} }
class _VisitsListState extends State<VisitsList> { class _VisitsListState extends State<VisitsList> {
List<Visit> _selectedVisits = []; final List<Visit> _selectedVisits = [];
@override @override
void initState() { void initState() {
@ -31,10 +31,10 @@ class _VisitsListState extends State<VisitsList> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle; Subtitle subtitle = AppLocalization.of(context).subtitle;
if (widget.visits.length == 0) { if (widget.visits.isEmpty) {
return NoItemFound( return NoItemFound(
message: _subtitle.noVisitsFound, message: subtitle.noVisitsFound,
); );
} }
return Stack( return Stack(
@ -45,13 +45,13 @@ class _VisitsListState extends State<VisitsList> {
child: ListView.builder( child: ListView.builder(
//physics: BouncingScrollPhysics(), //physics: BouncingScrollPhysics(),
itemCount: widget.visits.length, itemCount: widget.visits.length,
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
itemBuilder: (context, itemIndex) { itemBuilder: (context, itemIndex) {
Visit _visit = widget.visits[itemIndex]; Visit visit = widget.visits[itemIndex];
bool _isSelected = _selectedVisits.contains(_visit); bool isSelected = _selectedVisits.contains(visit);
return VisitItem( return VisitItem(
visit: _visit, visit: visit,
isSelected: _isSelected, isSelected: isSelected,
index: itemIndex, index: itemIndex,
activeSelectMod: _selectedVisits.isNotEmpty, activeSelectMod: _selectedVisits.isNotEmpty,
onPressed: (visit) { onPressed: (visit) {
@ -61,7 +61,7 @@ class _VisitsListState extends State<VisitsList> {
))); )));
}, },
onSelect: (visit) { onSelect: (visit) {
if (_isSelected) { if (isSelected) {
_selectedVisits.remove(visit); _selectedVisits.remove(visit);
} else { } else {
_selectedVisits.add(visit); _selectedVisits.add(visit);
@ -69,7 +69,7 @@ class _VisitsListState extends State<VisitsList> {
setState(() {}); setState(() {});
}, },
onLongPress: (visit) { onLongPress: (visit) {
if (_isSelected) { if (isSelected) {
_selectedVisits.remove(visit); _selectedVisits.remove(visit);
} else { } else {
_selectedVisits.add(visit); _selectedVisits.add(visit);
@ -84,7 +84,7 @@ class _VisitsListState extends State<VisitsList> {
child: Padding( child: Padding(
padding: EdgeInsets.all(8.0 * AppStyle.getScaleFactor(context)), padding: EdgeInsets.all(8.0 * AppStyle.getScaleFactor(context)),
child: AnimatedSwitcher( child: AnimatedSwitcher(
duration: Duration(milliseconds: 400), duration: const Duration(milliseconds: 400),
child: Visibility( child: Visibility(
key: ValueKey(_selectedVisits.isNotEmpty), key: ValueKey(_selectedVisits.isNotEmpty),
visible: _selectedVisits.isNotEmpty, visible: _selectedVisits.isNotEmpty,
@ -93,7 +93,7 @@ class _VisitsListState extends State<VisitsList> {
children: [ children: [
FloatingActionButton( FloatingActionButton(
heroTag: "cancel", heroTag: "cancel",
child: Icon(Icons.cancel), child: const Icon(Icons.cancel),
onPressed: () { onPressed: () {
_selectedVisits.clear(); _selectedVisits.clear();
setState(() {}); setState(() {});
@ -101,7 +101,7 @@ class _VisitsListState extends State<VisitsList> {
), ),
FloatingActionButton( FloatingActionButton(
heroTag: "edit", heroTag: "edit",
child: Icon(Icons.edit), child: const Icon(Icons.edit),
onPressed: () { onPressed: () {
if (!widget.visits.contains(_selectedVisits.first)) { if (!widget.visits.contains(_selectedVisits.first)) {
_selectedVisits.clear(); _selectedVisits.clear();

Loading…
Cancel
Save