Merge remote-tracking branch 'origin/main_design2.0' into main_design2.0

main_design2.0
nextwo 2 years ago
commit d6de203ba0

@ -0,0 +1,3 @@
<svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11.9499 9.51862C12.6027 8.54479 12.984 7.37301 12.984 6.11339C12.984 2.74246 10.2534 0 6.89703 0C3.54065 0 0.810059 2.74246 0.810059 6.11336C0.810059 9.48425 3.54068 12.2267 6.89706 12.2267C8.176 12.2267 9.36378 11.8282 10.3445 11.1488L15.1958 16L16.8101 14.3788L11.9499 9.51862ZM6.89706 10.5097C4.48871 10.5097 2.52931 8.54181 2.52931 6.12299C2.52931 3.70421 4.48868 1.73634 6.89706 1.73634C9.30543 1.73634 11.2648 3.70421 11.2648 6.12302C11.2648 8.54184 9.3054 10.5097 6.89706 10.5097Z" fill="#767676"/>
</svg>

After

Width:  |  Height:  |  Size: 619 B

@ -28,7 +28,8 @@ class URLs {
static get getSitesAutoComplete => "$_baseUrl/Customer/GetCustomersAutoComplete"; // get static get getSitesAutoComplete => "$_baseUrl/Customer/GetCustomersAutoComplete"; // get
static get getDepartments => "$_baseUrl/Customer/GetDepartmentLookup"; // get static get getDepartments => "$_baseUrl/Customer/GetDepartmentLookup"; // get
static get getEquipment => "$_baseUrl/Asset/GetAssets"; // get ?client=208051 static get getAssets => "$_baseUrl/Asset/GetAssets"; // get
static get getAssetById => "$_baseUrl/Asset/GetAssetById?assetId="; // get
static get getModels => "$_baseUrl/ModelDefinition/GetModelDefinitionAsset"; // get ?client=2 static get getModels => "$_baseUrl/ModelDefinition/GetModelDefinitionAsset"; // get ?client=2
// 08051 // 08051
static get getServiceRequests => "$_baseUrl/CallRequest/GetCallRequests"; // get static get getServiceRequests => "$_baseUrl/CallRequest/GetCallRequests"; // get

@ -3,10 +3,12 @@ import 'dart:convert';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/http_status_manger.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/asset_by_id_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import '../../../models/device/device.dart'; import '../../../models/device/device.dart';
class AssetProvider extends ChangeNotifier { class AssetProvider extends ChangeNotifier {
@ -19,13 +21,12 @@ class AssetProvider extends ChangeNotifier {
final pageItemNumber = 10; final pageItemNumber = 10;
bool nextPage = true; bool nextPage = true;
// state code of current request to defied error message
// like 400 customer request failed
// 500 service not available
int _stateCode; int _stateCode;
int get stateCode => _stateCode; int get stateCode => _stateCode;
set stateCode(int code) => _stateCode = code;
List<Device> _devices = []; List<Device> _devices = [];
List<Device> get devices => _devices; List<Device> get devices => _devices;
@ -37,30 +38,22 @@ class AssetProvider extends ChangeNotifier {
bool get isLoading => _loading; bool get isLoading => _loading;
AssetByIdModel _assetById;
AssetByIdModel get assetById => _assetById;
set isLoading(bool isLoading) { set isLoading(bool isLoading) {
_loading = isLoading; _loading = isLoading;
notifyListeners(); notifyListeners();
} }
/// return -2 if request in progress Future<int> getAssets({@required String host, @required User user, @required int hospitalId, String serialNumber, String number, bool isQr = false}) async {
/// return -1 if error happen when sending request
/// return state code if request complete may be 200, 404 or 403
/// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getEquipment({
@required String host,
@required User user,
@required int hospitalId,
String serialNumber,
String number,
bool isQr = false,
}) async {
if (_loading == true) return -2; if (_loading == true) return -2;
_loading = true; _loading = true;
notifyListeners(); notifyListeners();
Response response; Response response;
try { try {
response = await ApiManager.instance.post(URLs.getEquipment, body: { response = await ApiManager.instance.post(URLs.getAssets, body: {
"pageSize": pageItemNumber, "pageSize": pageItemNumber,
"pageNumber": devices.length ~/ pageItemNumber + 1, "pageNumber": devices.length ~/ pageItemNumber + 1,
"siteId": hospitalId, "siteId": hospitalId,
@ -95,11 +88,24 @@ class AssetProvider extends ChangeNotifier {
return response.statusCode; return response.statusCode;
} }
/// return -2 if request in progress Future<AssetByIdModel> getAssetById(int assetId, AppLocalizations appLocalizations) async {
/// return -1 if error happen when sending request Response response;
/// return state code if request complete may be 200, 404 or 403 try {
/// for more details check http state manager response = await ApiManager.instance.get(URLs.getAssetById + "$assetId");
/// lib\controllers\http_status_manger\http_status_manger.dart } catch (error) {
print(error);
throw (HttpStatusManger.getStatusMessage(status: -1, subtitle: appLocalizations));
}
_stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
Map<String, dynamic> assetData = json.decode(response.body)["data"];
_assetById = AssetByIdModel.fromJson(assetData);
return _assetById;
}
throw (HttpStatusManger.getStatusMessage(status: response.statusCode, subtitle: appLocalizations));
}
Future<List<Device>> getDevicesList({ Future<List<Device>> getDevicesList({
@required String host, @required String host,
@required User user, @required User user,
@ -109,10 +115,10 @@ class AssetProvider extends ChangeNotifier {
}) async { }) async {
Response response; Response response;
try { try {
response = await ApiManager.instance.post(URLs.getEquipment, body: { response = await ApiManager.instance.post(URLs.getAssets, body: {
"pageSize": pageItemNumber, "pageSize": pageItemNumber,
"pageNumber": devices.length ~/ pageItemNumber + 1, "pageNumber": devices.length ~/ pageItemNumber + 1,
"siteId": devices.length ~/ pageItemNumber + 1, "siteId": hospitalId,
if (serialNumber?.isEmpty == false) "assetSerialNumber": serialNumber, if (serialNumber?.isEmpty == false) "assetSerialNumber": serialNumber,
if (number?.isEmpty == false) "assetNo": number, if (number?.isEmpty == false) "assetNo": number,
}); });

@ -37,6 +37,7 @@
"back": "السابق", "back": "السابق",
"search": "بحث", "search": "بحث",
"searchByName": "بحث بالاسم", "searchByName": "بحث بالاسم",
"searchByAssetNumber": "بحث برقم الجهاز",
"address": "العنوان", "address": "العنوان",
"addressNotFound": "لا يوجد عنوان", "addressNotFound": "لا يوجد عنوان",
"addressValidateMessage": "العنوان مطلوب", "addressValidateMessage": "العنوان مطلوب",

@ -37,6 +37,7 @@
"back": "Back", "back": "Back",
"search": "Search", "search": "Search",
"searchByName": "Search by name", "searchByName": "Search by name",
"searchByAssetNumber": "Search by asset number",
"address": "Address", "address": "Address",
"addressNotFound": "Address not found", "addressNotFound": "Address not found",
"addressValidateMessage": "Address validateMessage", "addressValidateMessage": "Address validateMessage",
@ -250,6 +251,7 @@
"manufacture" : "Manufacture", "manufacture" : "Manufacture",
"model" : "Model", "model" : "Model",
"serialNumber" : "Serial Number", "serialNumber" : "Serial Number",
"serialNo" : "Serial No",
"device" : "Device", "device" : "Device",
"pickAsset" : "Pick Asset", "pickAsset" : "Pick Asset",
"firstAction" : "First Action", "firstAction" : "First Action",
@ -263,5 +265,6 @@
"attachImage" : "Attach Image", "attachImage" : "Attach Image",
"callComments" : "Call Comments", "callComments" : "Call Comments",
"comments": "Comments", "comments": "Comments",
"recordVoice" : "Record Voice" "recordVoice" : "Record Voice",
"assetDetails" : "Asset Details"
} }

@ -65,13 +65,14 @@ import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart';
import 'package:test_sa/views/pages/user/land_page.dart' as old; import 'package:test_sa/views/pages/user/land_page.dart' as old;
import 'package:test_sa/views/pages/user/notifications/notifications_page.dart'; import 'package:test_sa/views/pages/user/notifications/notifications_page.dart';
import 'package:test_sa/views/pages/user/report_issues_page.dart'; import 'package:test_sa/views/pages/user/report_issues_page.dart';
import 'package:test_sa/views/pages/user/requests/create_request.dart'; import 'package:test_sa/views/pages/user/requests/create_service_request_page.dart';
import 'package:test_sa/views/pages/user/requests/future_request_service_details.dart'; import 'package:test_sa/views/pages/user/requests/future_request_service_details.dart';
import 'package:test_sa/views/pages/user/requests/requests_page.dart'; import 'package:test_sa/views/pages/user/requests/requests_page.dart';
import 'package:test_sa/views/pages/user/requests/work_order/work_orders_list_page.dart'; import 'package:test_sa/views/pages/user/requests/work_order/work_orders_list_page.dart';
import 'package:test_sa/views/pages/user/visits/preventive_maintenance_visits_page.dart'; import 'package:test_sa/views/pages/user/visits/preventive_maintenance_visits_page.dart';
import 'package:test_sa/views/pages/user/visits/regular_visits_page.dart'; import 'package:test_sa/views/pages/user/visits/regular_visits_page.dart';
import 'package:test_sa/views/widgets/departments/single_department_picker.dart'; import 'package:test_sa/views/widgets/departments/single_department_picker.dart';
import 'package:test_sa/views/widgets/equipment/asset_detail_page.dart';
import 'package:test_sa/views/widgets/equipment/single_device_picker.dart'; import 'package:test_sa/views/widgets/equipment/single_device_picker.dart';
import 'package:test_sa/views/widgets/hospitals/single_hospital_picker.dart'; import 'package:test_sa/views/widgets/hospitals/single_hospital_picker.dart';
@ -186,7 +187,7 @@ class MyApp extends StatelessWidget {
ServiceRequestsPage.id: (_) => ServiceRequestsPage(), ServiceRequestsPage.id: (_) => ServiceRequestsPage(),
ReportIssuesPage.id: (_) => const ReportIssuesPage(), ReportIssuesPage.id: (_) => const ReportIssuesPage(),
RequestGasRefill.id: (_) => const RequestGasRefill(), RequestGasRefill.id: (_) => const RequestGasRefill(),
CreateRequestPage.id: (_) => const CreateRequestPage(), CreateServiceRequestPage.id: (_) => const CreateServiceRequestPage(),
SingleHospitalPicker.id: (_) => SingleHospitalPicker(), SingleHospitalPicker.id: (_) => SingleHospitalPicker(),
SingleDevicePicker.id: (_) => SingleDevicePicker(), SingleDevicePicker.id: (_) => SingleDevicePicker(),
SingleDepartmentPicker.id: (_) => SingleDepartmentPicker(), SingleDepartmentPicker.id: (_) => SingleDepartmentPicker(),
@ -200,6 +201,7 @@ class MyApp extends StatelessWidget {
SearchSubWorkOrderPage.id: (_) => const SearchSubWorkOrderPage(), SearchSubWorkOrderPage.id: (_) => const SearchSubWorkOrderPage(),
CreateSubWorkOrderPage.id: (_) => const CreateSubWorkOrderPage(), CreateSubWorkOrderPage.id: (_) => const CreateSubWorkOrderPage(),
WorkOrderListPage.id: (_) => WorkOrderListPage(), WorkOrderListPage.id: (_) => WorkOrderListPage(),
AssetDetailPage.id: (_) => AssetDetailPage(),
}, },
), ),
), ),

@ -0,0 +1,707 @@
import 'package:test_sa/models/device/technical_guidance_book.dart';
import 'package:test_sa/models/lookup.dart';
class AssetByIdModel {
List<MultiAssets> multiAssets;
int id;
ModelDefinition modelDefinition;
Suppliers supplier;
String ipAddress;
String macAddress;
String portNumber;
AssetReplace assetReplace;
AssetInfo oldAsset;
AssetReplace isParent;
AssetInfo parentAsset;
AssetReplace assetType;
String demoRequest;
String missionCritical;
Site site;
AssetReplace building;
AssetReplace floor;
Department department;
String room;
int testsDay;
num purchasingPrice;
String nbv;
String currency;
String poDate;
String poNo;
String invoiceNumber;
String invoiceDate;
String replacementDate;
num budgetYear;
num lastPOPrice;
Lookup commissioningStatus;
Department originDepartment;
Site originSite;
String productionDate;
String edd;
String technicalInspectionDate;
String deliveryInspectionDate;
String endUserAcceptanceDate;
String technicalAcceptanceDate;
String finalAcceptanceDate;
String installationDate;
int siteWarrantyMonthNo;
num extendedWarrantyMonthNo;
num remainderWarrantyMonthNo;
num eomWarrantyMonthsNo;
num warrantyValue;
String warrantyEndDate;
String warrantyContractConditions;
List<TechnicalGuidanceBook> technicalGuidanceBooks;
String comment;
bool isEnabled;
String tagCode;
List<String> assetAttachments;
String retirementTypeName;
String retirementStatusName;
String retirementDate;
AssetGroup assetGroup;
String assetPhoto;
String nextPMDate;
String lastPMDate;
AssetByIdModel(
{this.multiAssets,
this.id,
this.modelDefinition,
this.supplier,
this.ipAddress,
this.macAddress,
this.portNumber,
this.assetReplace,
this.oldAsset,
this.isParent,
this.parentAsset,
this.assetType,
this.demoRequest,
this.missionCritical,
this.site,
this.building,
this.floor,
this.department,
this.room,
this.testsDay,
this.purchasingPrice,
this.nbv,
this.currency,
this.poDate,
this.poNo,
this.invoiceNumber,
this.invoiceDate,
this.replacementDate,
this.budgetYear,
this.lastPOPrice,
this.commissioningStatus,
this.originDepartment,
this.originSite,
this.productionDate,
this.edd,
this.technicalInspectionDate,
this.deliveryInspectionDate,
this.endUserAcceptanceDate,
this.technicalAcceptanceDate,
this.finalAcceptanceDate,
this.installationDate,
this.siteWarrantyMonthNo,
this.extendedWarrantyMonthNo,
this.remainderWarrantyMonthNo,
this.eomWarrantyMonthsNo,
this.warrantyValue,
this.warrantyEndDate,
this.warrantyContractConditions,
this.technicalGuidanceBooks,
this.comment,
this.isEnabled,
this.tagCode,
this.assetAttachments,
this.retirementTypeName,
this.retirementStatusName,
this.retirementDate,
this.assetGroup,
this.assetPhoto,
this.nextPMDate,
this.lastPMDate});
AssetByIdModel.fromJson(Map<String, dynamic> json) {
if (json['multiAssets'] != null) {
multiAssets = <MultiAssets>[];
json['multiAssets'].forEach((v) {
multiAssets.add(new MultiAssets.fromJson(v));
});
}
id = json['id'];
print("supplier:${json['supplier']}");
modelDefinition = json['modelDefinition'] != null ? new ModelDefinition.fromJson(json['modelDefinition']) : null;
supplier = json['supplier'] != null ? Suppliers.fromJson(json['supplier']) : null;
ipAddress = json['ipAddress'];
macAddress = json['macAddress'];
portNumber = json['portNumber'];
assetReplace = json['assetReplace'] != null ? new AssetReplace.fromJson(json['assetReplace']) : null;
oldAsset = json['oldAsset'] != null ? AssetInfo.fromJson(json['oldAsset']) : null;
isParent = json['isParent'] != null ? new AssetReplace.fromJson(json['isParent']) : null;
parentAsset = json['parentAsset'] != null ? AssetInfo.fromJson(json['parentAsset']) : null;
assetType = json['assetType'] != null ? new AssetReplace.fromJson(json['assetType']) : null;
demoRequest = json['demoRequest'];
missionCritical = json['missionCritical'];
site = json['site'] != null ? new Site.fromJson(json['site']) : null;
building = json['building'] != null ? new AssetReplace.fromJson(json['building']) : null;
floor = json['floor'] != null ? new AssetReplace.fromJson(json['floor']) : null;
department = json['department'] != null ? new Department.fromJson(json['department']) : null;
room = json['room'];
testsDay = json['testsDay'];
purchasingPrice = json['purchasingPrice'];
nbv = json['nbv'];
currency = json['currency'];
poDate = json['poDate'];
poNo = json['poNo'];
invoiceNumber = json['invoiceNumber'];
invoiceDate = json['invoiceDate'];
replacementDate = json['replacementDate'];
budgetYear = json['budgetYear'];
lastPOPrice = json['lastPOPrice'];
commissioningStatus = json['commissioningStatus'] != null ? new Lookup.fromJson(json['commissioningStatus']) : null;
originDepartment = json['originDepartment'] != null ? new Department.fromJson(json['originDepartment']) : null;
originSite = json['originSite'] != null ? new Site.fromJson(json['originSite']) : null;
productionDate = json['productionDate'];
edd = json['edd'];
technicalInspectionDate = json['technicalInspectionDate'];
deliveryInspectionDate = json['deliveryInspectionDate'];
endUserAcceptanceDate = json['endUserAcceptanceDate'];
technicalAcceptanceDate = json['technicalAcceptanceDate'];
finalAcceptanceDate = json['finalAcceptanceDate'];
installationDate = json['installationDate'];
siteWarrantyMonthNo = json['siteWarrantyMonthNo'];
extendedWarrantyMonthNo = json['extendedWarrantyMonthNo'];
remainderWarrantyMonthNo = json['remainderWarrantyMonthNo'];
eomWarrantyMonthsNo = json['eomWarrantyMonthsNo'];
warrantyValue = json['warrantyValue'];
warrantyEndDate = json['warrantyEndDate'];
warrantyContractConditions = json['warrantyContractConditions'];
if (json['technicalGuidanceBooks'] != null) {
technicalGuidanceBooks = [];
json['technicalGuidanceBooks'].forEach((v) {
technicalGuidanceBooks.add(TechnicalGuidanceBook.fromJson(v));
});
}
comment = json['comment'];
isEnabled = json['isEnabled'];
tagCode = json['tagCode'];
if (json['assetAttachments'] != null) {
assetAttachments = <Null>[];
json['assetAttachments'].forEach((v) {
assetAttachments.add(v);
});
}
retirementTypeName = json['retirementTypeName'];
retirementStatusName = json['retirementStatusName'];
retirementDate = json['retirementDate'];
assetGroup = json['assetGroup'] != null ? new AssetGroup.fromJson(json['assetGroup']) : null;
assetPhoto = json['assetPhoto'];
nextPMDate = json['nextPMDate'];
lastPMDate = json['lastPMDate'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.multiAssets != null) {
data['multiAssets'] = this.multiAssets.map((v) => v.toJson()).toList();
}
data['id'] = this.id;
if (this.modelDefinition != null) {
data['modelDefinition'] = this.modelDefinition.toJson();
}
if (this.supplier != null) {
data['supplier'] = this.supplier.toJson();
}
data['ipAddress'] = this.ipAddress;
data['macAddress'] = this.macAddress;
data['portNumber'] = this.portNumber;
if (this.assetReplace != null) {
data['assetReplace'] = this.assetReplace.toJson();
}
data['oldAsset'] = this.oldAsset?.toJson();
if (this.isParent != null) {
data['isParent'] = this.isParent.toJson();
}
data['parentAsset'] = this.parentAsset?.toJson();
if (this.assetType != null) {
data['assetType'] = this.assetType.toJson();
}
data['demoRequest'] = this.demoRequest;
data['missionCritical'] = this.missionCritical;
if (this.site != null) {
data['site'] = this.site.toJson();
}
if (this.building != null) {
data['building'] = this.building.toJson();
}
if (this.floor != null) {
data['floor'] = this.floor.toJson();
}
if (this.department != null) {
data['department'] = this.department.toJson();
}
data['room'] = this.room;
data['testsDay'] = this.testsDay;
data['purchasingPrice'] = this.purchasingPrice;
data['nbv'] = this.nbv;
data['currency'] = this.currency;
data['poDate'] = this.poDate;
data['poNo'] = this.poNo;
data['invoiceNumber'] = this.invoiceNumber;
data['invoiceDate'] = this.invoiceDate;
data['replacementDate'] = this.replacementDate;
data['budgetYear'] = this.budgetYear;
data['lastPOPrice'] = this.lastPOPrice;
data['commissioningStatus'] = this.commissioningStatus?.toJson();
if (this.originDepartment != null) {
data['originDepartment'] = this.originDepartment.toJson();
}
if (this.originSite != null) {
data['originSite'] = this.originSite.toJson();
}
data['productionDate'] = this.productionDate;
data['edd'] = this.edd;
data['technicalInspectionDate'] = this.technicalInspectionDate;
data['deliveryInspectionDate'] = this.deliveryInspectionDate;
data['endUserAcceptanceDate'] = this.endUserAcceptanceDate;
data['technicalAcceptanceDate'] = this.technicalAcceptanceDate;
data['finalAcceptanceDate'] = this.finalAcceptanceDate;
data['installationDate'] = this.installationDate;
data['siteWarrantyMonthNo'] = this.siteWarrantyMonthNo;
data['extendedWarrantyMonthNo'] = this.extendedWarrantyMonthNo;
data['remainderWarrantyMonthNo'] = this.remainderWarrantyMonthNo;
data['eomWarrantyMonthsNo'] = this.eomWarrantyMonthsNo;
data['warrantyValue'] = this.warrantyValue;
data['warrantyEndDate'] = this.warrantyEndDate;
data['warrantyContractConditions'] = this.warrantyContractConditions;
if (this.technicalGuidanceBooks != null) {
data['technicalGuidanceBooks'] = this.technicalGuidanceBooks.map((v) => v).toList();
}
data['comment'] = this.comment;
data['isEnabled'] = this.isEnabled;
data['tagCode'] = this.tagCode;
if (this.assetAttachments != null) {
data['assetAttachments'] = this.assetAttachments.map((v) => v).toList();
}
data['retirementTypeName'] = this.retirementTypeName;
data['retirementStatusName'] = this.retirementStatusName;
data['retirementDate'] = this.retirementDate;
if (this.assetGroup != null) {
data['assetGroup'] = this.assetGroup.toJson();
}
data['assetPhoto'] = this.assetPhoto;
data['nextPMDate'] = this.nextPMDate;
data['lastPMDate'] = this.lastPMDate;
return data;
}
}
class MultiAssets {
String assetSerialNo;
String systemID;
String assetNumber;
MultiAssets({this.assetSerialNo, this.systemID, this.assetNumber});
MultiAssets.fromJson(Map<String, dynamic> json) {
assetSerialNo = json['assetSerialNo'];
systemID = json['systemID'];
assetNumber = json['assetNumber'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['assetSerialNo'] = this.assetSerialNo;
data['systemID'] = this.systemID;
data['assetNumber'] = this.assetNumber;
return data;
}
}
class ModelDefinition {
int id;
String assetName;
String assetDescription;
String modelDefCode;
String modelName;
int manufacturerId;
String manufacturerName;
String supplierName;
String replacementDate;
String essentialEquipement;
String businessCritical;
int lifeSpan;
List<ModelDefRelatedDefects> modelDefRelatedDefects;
List<Suppliers> suppliers;
ModelDefinition(
{this.id,
this.assetName,
this.assetDescription,
this.modelDefCode,
this.modelName,
this.manufacturerId,
this.manufacturerName,
this.supplierName,
this.replacementDate,
this.essentialEquipement,
this.businessCritical,
this.lifeSpan,
this.modelDefRelatedDefects,
this.suppliers});
ModelDefinition.fromJson(Map<String, dynamic> json) {
id = json['id'];
assetName = json['assetName'];
assetDescription = json['assetDescription'];
modelDefCode = json['modelDefCode'];
modelName = json['modelName'];
manufacturerId = json['manufacturerId'];
manufacturerName = json['manufacturerName'];
supplierName = json['supplierName'];
replacementDate = json['replacementDate'];
essentialEquipement = json['essentialEquipement'];
businessCritical = json['businessCritical'];
lifeSpan = json['lifeSpan'];
if (json['modelDefRelatedDefects'] != null) {
modelDefRelatedDefects = [];
json['modelDefRelatedDefects'].forEach((v) {
modelDefRelatedDefects.add(ModelDefRelatedDefects.fromJson(v));
});
}
if (json['suppliers'] != null) {
suppliers = <Suppliers>[];
json['suppliers'].forEach((v) {
suppliers.add(new Suppliers.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['assetName'] = this.assetName;
data['assetDescription'] = this.assetDescription;
data['modelDefCode'] = this.modelDefCode;
data['modelName'] = this.modelName;
data['manufacturerId'] = this.manufacturerId;
data['manufacturerName'] = this.manufacturerName;
data['supplierName'] = this.supplierName;
data['replacementDate'] = this.replacementDate;
data['essentialEquipement'] = this.essentialEquipement;
data['businessCritical'] = this.businessCritical;
data['lifeSpan'] = this.lifeSpan;
if (this.modelDefRelatedDefects != null) {
data['modelDefRelatedDefects'] = this.modelDefRelatedDefects.map((v) => v.toJson()).toList();
}
if (this.suppliers != null) {
data['suppliers'] = this.suppliers.map((v) => v.toJson()).toList();
}
return data;
}
}
class Suppliers {
int id;
String suppliername;
Suppliers({this.id, this.suppliername});
Suppliers.fromJson(Map<String, dynamic> json) {
id = json['id'];
suppliername = json['suppliername'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['suppliername'] = this.suppliername;
return data;
}
}
class AssetReplace {
int id;
String name;
int value;
AssetReplace({this.id, this.name, this.value});
AssetReplace.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
value = json['value'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['name'] = this.name;
data['value'] = this.value;
return data;
}
}
class Site {
int id;
int customerCode;
String custName;
List<Buildings> buildings;
Site({this.id, this.customerCode, this.custName, this.buildings});
Site.fromJson(Map<String, dynamic> json) {
id = json['id'];
customerCode = json['customerCode'];
custName = json['custName'];
if (json['buildings'] != null) {
buildings = <Buildings>[];
json['buildings'].forEach((v) {
buildings.add(new Buildings.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['customerCode'] = this.customerCode;
data['custName'] = this.custName;
if (this.buildings != null) {
data['buildings'] = this.buildings.map((v) => v.toJson()).toList();
}
return data;
}
}
class Buildings {
int id;
String name;
int value;
List<Floors> floors;
Buildings({this.id, this.name, this.value, this.floors});
Buildings.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
value = json['value'];
if (json['floors'] != null) {
floors = <Floors>[];
json['floors'].forEach((v) {
floors.add(new Floors.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['name'] = this.name;
data['value'] = this.value;
if (this.floors != null) {
data['floors'] = this.floors.map((v) => v.toJson()).toList();
}
return data;
}
}
class Floors {
int id;
String name;
int value;
List<Departments> departments;
Floors({this.id, this.name, this.value, this.departments});
Floors.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
value = json['value'];
if (json['departments'] != null) {
departments = <Departments>[];
json['departments'].forEach((v) {
departments.add(new Departments.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['name'] = this.name;
data['value'] = this.value;
if (this.departments != null) {
data['departments'] = this.departments.map((v) => v.toJson()).toList();
}
return data;
}
}
class Departments {
int id;
String name;
Departments({this.id, this.name});
Departments.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['name'] = this.name;
return data;
}
}
class Department {
int id;
String departmentName;
String departmentCode;
String ntCode;
Department({this.id, this.departmentName, this.departmentCode, this.ntCode});
Department.fromJson(Map<String, dynamic> json) {
id = json['id'];
departmentName = json['departmentName'];
departmentCode = json['departmentCode'];
ntCode = json['ntCode'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['departmentName'] = this.departmentName;
data['departmentCode'] = this.departmentCode;
data['ntCode'] = this.ntCode;
return data;
}
}
class AssetGroup {
int id;
String name;
String code;
AssetGroup({this.id, this.name, this.code});
AssetGroup.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
code = json['code'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['name'] = this.name;
data['code'] = this.code;
return data;
}
}
class ModelDefRelatedDefects {
ModelDefRelatedDefects({
this.id,
this.defectName,
this.workPerformed,
this.estimatedTime,
});
ModelDefRelatedDefects.fromJson(dynamic json) {
id = json['id'];
defectName = json['defectName'];
workPerformed = json['workPerformed'];
estimatedTime = json['estimatedTime'];
}
num id;
String defectName;
String workPerformed;
String estimatedTime;
ModelDefRelatedDefects copyWith({
num id,
String defectName,
String workPerformed,
String estimatedTime,
}) =>
ModelDefRelatedDefects(
id: id ?? this.id ?? 0,
defectName: defectName ?? this.defectName,
workPerformed: workPerformed ?? this.workPerformed,
estimatedTime: estimatedTime ?? this.estimatedTime,
);
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = id;
map['defectName'] = defectName;
map['workPerformed'] = workPerformed;
map['estimatedTime'] = estimatedTime;
return map;
}
}
class AssetInfo {
AssetInfo({
this.id,
this.assetSerialNo,
this.assetNumber,
this.tagCode,
this.systemId,
this.assetName,
});
AssetInfo.fromJson(dynamic json) {
id = json['id'];
assetSerialNo = json['assetSerialNo'];
assetNumber = json['assetNumber'];
tagCode = json['tagCode'];
systemId = json['systemId'];
assetName = json['assetName'];
}
num id;
String assetSerialNo;
String assetNumber;
String tagCode;
String systemId;
String assetName;
AssetInfo copyWith({
num id,
String assetSerialNo,
String assetNumber,
String tagCode,
String systemId,
String assetName,
}) =>
AssetInfo(
id: id ?? this.id,
assetSerialNo: assetSerialNo ?? this.assetSerialNo,
assetNumber: assetNumber ?? this.assetNumber,
tagCode: tagCode ?? this.tagCode,
systemId: systemId ?? this.systemId,
assetName: assetName ?? this.assetName,
);
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = id;
map['assetSerialNo'] = assetSerialNo;
map['assetNumber'] = assetNumber;
map['tagCode'] = tagCode;
map['systemId'] = systemId;
map['assetName'] = assetName;
return map;
}
}

@ -58,6 +58,7 @@ class Device {
this.technicalGuidanceBooks, this.technicalGuidanceBooks,
this.comment, this.comment,
this.tagCode, this.tagCode,
this.assetPhoto,
}); });
Device.fromJson(dynamic json) { Device.fromJson(dynamic json) {
@ -163,6 +164,7 @@ class Device {
List<TechnicalGuidanceBook> technicalGuidanceBooks; List<TechnicalGuidanceBook> technicalGuidanceBooks;
String comment; String comment;
String tagCode; String tagCode;
String assetPhoto;
Device copyWith({ Device copyWith({
num id, num id,
String assetSerialNo, String assetSerialNo,
@ -212,6 +214,7 @@ class Device {
List<TechnicalGuidanceBook> technicalGuidanceBooks, List<TechnicalGuidanceBook> technicalGuidanceBooks,
String comment, String comment,
String tagCode, String tagCode,
String assetPhoto,
}) => }) =>
Device( Device(
id: id ?? this.id, id: id ?? this.id,
@ -262,6 +265,7 @@ class Device {
technicalGuidanceBooks: technicalGuidanceBooks ?? this.technicalGuidanceBooks, technicalGuidanceBooks: technicalGuidanceBooks ?? this.technicalGuidanceBooks,
comment: comment ?? this.comment, comment: comment ?? this.comment,
tagCode: tagCode ?? this.tagCode, tagCode: tagCode ?? this.tagCode,
assetPhoto: assetPhoto ?? this.assetPhoto,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
@ -351,6 +355,7 @@ class Device {
} }
map['comment'] = comment; map['comment'] = comment;
map['tagCode'] = tagCode; map['tagCode'] = tagCode;
map['assetPhoto'] = assetPhoto;
return map; return map;
} }
} }

@ -4,6 +4,7 @@ class ModelDefinition {
ModelDefinition({ ModelDefinition({
this.id, this.id,
this.assetName, this.assetName,
this.assetDescription,
this.modelDefCode, this.modelDefCode,
this.modelName, this.modelName,
this.manufacturerId, this.manufacturerId,
@ -20,6 +21,7 @@ class ModelDefinition {
ModelDefinition.fromJson(dynamic json) { ModelDefinition.fromJson(dynamic json) {
id = json['id']; id = json['id'];
assetName = json['assetName']; assetName = json['assetName'];
assetDescription = json['assetDescription'];
modelDefCode = json['modelDefCode']; modelDefCode = json['modelDefCode'];
modelName = json['modelName']; modelName = json['modelName'];
manufacturerId = json['manufacturerId']; manufacturerId = json['manufacturerId'];
@ -44,6 +46,7 @@ class ModelDefinition {
} }
num id; num id;
String assetName; String assetName;
String assetDescription;
String modelDefCode; String modelDefCode;
String modelName; String modelName;
num manufacturerId; num manufacturerId;
@ -58,6 +61,7 @@ class ModelDefinition {
ModelDefinition copyWith({ ModelDefinition copyWith({
num id, num id,
String assetName, String assetName,
String assetDescription,
String modelDefCode, String modelDefCode,
String modelName, String modelName,
num manufacturerId, num manufacturerId,
@ -73,6 +77,7 @@ class ModelDefinition {
ModelDefinition( ModelDefinition(
id: id ?? this.id, id: id ?? this.id,
assetName: assetName ?? this.assetName, assetName: assetName ?? this.assetName,
assetDescription: assetDescription ?? this.assetDescription,
modelDefCode: modelDefCode ?? this.modelDefCode, modelDefCode: modelDefCode ?? this.modelDefCode,
modelName: modelName ?? this.modelName, modelName: modelName ?? this.modelName,
manufacturerId: manufacturerId ?? this.manufacturerId, manufacturerId: manufacturerId ?? this.manufacturerId,
@ -89,6 +94,7 @@ class ModelDefinition {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id; map['id'] = id;
map['assetName'] = assetName; map['assetName'] = assetName;
map['assetDescription'] = assetDescription;
map['modelDefCode'] = modelDefCode; map['modelDefCode'] = modelDefCode;
map['modelName'] = modelName; map['modelName'] = modelName;
map['manufacturerId'] = manufacturerId; map['manufacturerId'] = manufacturerId;

@ -5,7 +5,7 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/new_views/pages/new_gas_refill_request_page.dart'; import 'package:test_sa/new_views/pages/new_gas_refill_request_page.dart';
import 'package:test_sa/new_views/pages/new_transfer_request_page.dart'; import 'package:test_sa/new_views/pages/new_transfer_request_page.dart';
import 'package:test_sa/views/pages/user/requests/create_request.dart'; import 'package:test_sa/views/pages/user/requests/create_service_request_page.dart';
import '../../models/enums/translation_keys.dart'; import '../../models/enums/translation_keys.dart';
import '../app_style/app_color.dart'; import '../app_style/app_color.dart';
@ -55,7 +55,7 @@ class _AppFloatingActionButtonState extends State<AppFloatingActionButton> {
const Divider().defaultStyle(context).paddingOnly(start: 16, end: 16), const Divider().defaultStyle(context).paddingOnly(start: 16, end: 16),
_FloatingButtonListTile(iconName: "transfer_request", label: context.translation.transferRequest, routeName: NewTransferRequestPage.routeName), _FloatingButtonListTile(iconName: "transfer_request", label: context.translation.transferRequest, routeName: NewTransferRequestPage.routeName),
const Divider().defaultStyle(context).paddingOnly(start: 16, end: 16), const Divider().defaultStyle(context).paddingOnly(start: 16, end: 16),
_FloatingButtonListTile(iconName: "service_request", label: context.translation.serviceRequest, routeName: CreateRequestPage.id), _FloatingButtonListTile(iconName: "service_request", label: context.translation.serviceRequest, routeName: CreateServiceRequestPage.id),
], ],
).paddingOnly(top: 8, bottom: 8), ).paddingOnly(top: 8, bottom: 8),
), ),

@ -1,7 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/models/enums/translation_keys.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/app_style/app_text_style.dart'; import 'package:test_sa/new_views/app_style/app_text_style.dart';
@ -20,11 +19,13 @@ class AppTextFormField extends StatefulWidget {
final TextAlign textAlign; final TextAlign textAlign;
final FocusNode node; final FocusNode node;
final Widget suffixIcon; final Widget suffixIcon;
final Widget prefixIcon;
final IconData prefixIconData; final IconData prefixIconData;
final int prefixIconSize; final int prefixIconSize;
final TextEditingController controller; final TextEditingController controller;
final TextInputAction textInputAction; final TextInputAction textInputAction;
final VoidCallback onAction; final VoidCallback onAction;
final Color backgroundColor;
const AppTextFormField({ const AppTextFormField({
Key key, Key key,
@ -42,11 +43,13 @@ class AppTextFormField extends StatefulWidget {
this.style, this.style,
this.textAlign, this.textAlign,
this.suffixIcon, this.suffixIcon,
this.prefixIcon,
this.prefixIconData, this.prefixIconData,
this.prefixIconSize, this.prefixIconSize,
this.controller, this.controller,
this.textInputAction, this.textInputAction,
this.onAction, this.onAction,
this.backgroundColor,
}) : super(key: key); }) : super(key: key);
@override @override
@ -93,19 +96,20 @@ class _AppTextFormFieldState extends State<AppTextFormField> {
constraints: const BoxConstraints(), constraints: const BoxConstraints(),
suffixIconConstraints: const BoxConstraints(minWidth: 0), suffixIconConstraints: const BoxConstraints(minWidth: 0),
filled: true, filled: true,
fillColor: context.isDark ? AppColor.neutral50 : Colors.white, fillColor: widget.backgroundColor ?? (context.isDark ? AppColor.neutral50 : Colors.white),
errorStyle: AppTextStyle.tiny.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red60), errorStyle: AppTextStyle.tiny.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red60),
floatingLabelStyle: AppTextStyle.body1?.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? null : AppColor.neutral20), floatingLabelStyle: AppTextStyle.body1?.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? null : AppColor.neutral20),
hintText: widget.hintText ?? "", hintText: widget.hintText ?? "",
labelText: widget.labelText ?? "", labelText: widget.labelText ?? "",
suffixIcon: widget.suffixIcon ?? prefixIcon: widget.prefixIcon ??
(widget.prefixIconData == null (widget.prefixIconData == null
? null ? null
: Icon( : Icon(
widget.prefixIconData, widget.prefixIconData,
size: widget.prefixIconSize == null ? 20.toScreenWidth : (widget.prefixIconSize - 10).toScreenWidth, size: widget.prefixIconSize == null ? 20.toScreenWidth : (widget.prefixIconSize - 10).toScreenWidth,
color: AppColor.neutral70, color: AppColor.neutral70,
)), )),
suffixIcon: widget.suffixIcon,
), ),
), ),
); );

@ -0,0 +1,33 @@
import 'package:flutter/material.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import '../../models/device/device.dart';
class AssetInfoCard extends StatelessWidget {
const AssetInfoCard({Key key, @required this.asset}) : super(key: key);
final Device asset;
@override
Widget build(BuildContext context) {
return Card(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
asset.modelDefinition?.assetName?.heading5(context),
8.height,
"${context.translation.assetNo}: ${asset.assetNumber}".bodyText(context),
"${context.translation.manufacture}: ${asset.modelDefinition?.manufacturerName}".bodyText(context),
"${context.translation.model}: ${asset.modelDefinition?.modelName}".bodyText(context),
"${context.translation.serialNumber}: ${asset.assetNumber}".bodyText(context),
const Divider().defaultStyle(context),
"${context.translation.department}: ${asset.department?.departmentName}".bodyText(context),
"${context.translation.site}: ${asset.site?.custName}".bodyText(context),
],
).paddingAll(16),
);
}
}

@ -18,7 +18,7 @@ import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/pages/device_transfer/track_device_transfer.dart'; import 'package:test_sa/views/pages/device_transfer/track_device_transfer.dart';
import 'package:test_sa/views/pages/sub_workorder/search_sub_workorder_page.dart'; import 'package:test_sa/views/pages/sub_workorder/search_sub_workorder_page.dart';
import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart'; import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart';
import 'package:test_sa/views/pages/user/requests/create_request.dart'; import 'package:test_sa/views/pages/user/requests/create_service_request_page.dart';
import 'package:test_sa/views/pages/user/visits/regular_visits_page.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_back_button.dart';
import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button.dart';
@ -154,7 +154,7 @@ class _LandPageState extends State<LandPage> {
text: "New Service Request", text: "New Service Request",
icon: FontAwesomeIcons.screwdriverWrench, icon: FontAwesomeIcons.screwdriverWrench,
onPressed: () { onPressed: () {
Navigator.of(context).pushNamed(CreateRequestPage.id); Navigator.of(context).pushNamed(CreateServiceRequestPage.id);
}, },
), ),
LandPageItem( LandPageItem(

@ -30,17 +30,17 @@ import '../../../../new_views/common_widgets/single_item_drop_down_menu.dart';
import '../../../../providers/service_request_providers/equipment_status_provider.dart'; import '../../../../providers/service_request_providers/equipment_status_provider.dart';
import '../../../../providers/service_request_providers/priority_provider.dart'; import '../../../../providers/service_request_providers/priority_provider.dart';
class CreateRequestPage extends StatefulWidget { class CreateServiceRequestPage extends StatefulWidget {
static const String id = "/create-request"; static const String id = "/create-request";
final ServiceRequest serviceRequest; final ServiceRequest serviceRequest;
const CreateRequestPage({this.serviceRequest, Key key}) : super(key: key); const CreateServiceRequestPage({this.serviceRequest, Key key}) : super(key: key);
@override @override
CreateRequestPageState createState() => CreateRequestPageState(); CreateServiceRequestPageState createState() => CreateServiceRequestPageState();
} }
class CreateRequestPageState extends State<CreateRequestPage> { class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
TextEditingController _commentController; TextEditingController _commentController;
double _height; double _height;

@ -32,13 +32,14 @@ class _FutureRequestServiceDetailsState extends State<FutureRequestServiceDetail
body: FutureBuilder<ServiceRequest>( body: FutureBuilder<ServiceRequest>(
future: ServiceRequestsProvider().getSingleServiceRequest(requestId: requestId, user: _userProvider.user, host: _settingProvider.host, subtitle: context.translation), future: ServiceRequestsProvider().getSingleServiceRequest(requestId: requestId, user: _userProvider.user, host: _settingProvider.host, subtitle: context.translation),
builder: (BuildContext context, AsyncSnapshot<ServiceRequest> snapshot) { builder: (BuildContext context, AsyncSnapshot<ServiceRequest> snapshot) {
if (snapshot.hasError) if (snapshot.hasError) {
return FailedLoading( return FailedLoading(
message: snapshot.error.toString(), message: snapshot.error.toString(),
onReload: () { onReload: () {
setState(() {}); setState(() {});
}, },
); );
}
if (snapshot.hasData) { if (snapshot.hasData) {
return ServiceRequestDetailsPage( return ServiceRequestDetailsPage(
serviceRequest: snapshot.data, serviceRequest: snapshot.data,

@ -20,7 +20,7 @@ import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.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 'package:test_sa/views/pages/user/requests/create_request.dart'; import 'package:test_sa/views/pages/user/requests/create_service_request_page.dart';
import 'package:test_sa/views/pages/user/requests/work_order/create_service_report.dart'; import 'package:test_sa/views/pages/user/requests/work_order/create_service_report.dart';
import 'package:test_sa/views/pages/user/requests/work_order/future_service_report.dart'; import 'package:test_sa/views/pages/user/requests/work_order/future_service_report.dart';
import 'package:test_sa/views/pages/user/requests/work_order/work_orders_list_page.dart'; import 'package:test_sa/views/pages/user/requests/work_order/work_orders_list_page.dart';
@ -209,7 +209,7 @@ class ServiceRequestDetailsPage extends StatelessWidget {
maxWidth: true, maxWidth: true,
onPressed: () { onPressed: () {
Navigator.of(context).push( Navigator.of(context).push(
MaterialPageRoute(builder: (_) => CreateRequestPage(serviceRequest: serviceRequest)), MaterialPageRoute(builder: (_) => CreateServiceRequestPage(serviceRequest: serviceRequest)),
); );
}) })
: AppFilledButton( : AppFilledButton(

@ -1,7 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
@Deprecated("Use the one inside the [new_views/common_widgets] folder")
class ATextFormField extends StatefulWidget { class ATextFormField extends StatefulWidget {
final Function(String) onSaved; final Function(String) onSaved;
final Function(String) validator; final Function(String) validator;

@ -0,0 +1,177 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/controllers/providers/api/devices_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/device/asset_by_id_model.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/views/widgets/loaders/app_loading.dart';
import 'package:test_sa/views/widgets/loaders/failed_loading.dart';
import 'package:test_sa/views/widgets/loaders/lazy_loading.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
class AssetDetailPage extends StatefulWidget {
static const String id = "/asset-details";
AssetDetailPage({Key key}) : super(key: key);
@override
_AssetDetailPageState createState() {
return _AssetDetailPageState();
}
}
class _AssetDetailPageState extends State<AssetDetailPage> {
@override
void initState() {
super.initState();
}
@override
void dispose() {
super.dispose();
}
int assetId;
AssetProvider _assetProvider;
@override
Widget build(BuildContext context) {
assetId ??= ModalRoute.of(context).settings.arguments;
_assetProvider ??= Provider.of<AssetProvider>(context);
_assetProvider?.stateCode = null;
return Scaffold(
appBar: DefaultAppBar(title: context.translation.assetDetails),
body: FutureBuilder<AssetByIdModel>(
future: _assetProvider.getAssetById(assetId, context.translation),
builder: (BuildContext context, AsyncSnapshot<AssetByIdModel> snapshot) {
if (snapshot.hasError) {
return FailedLoading(
message: snapshot.error.toString(),
onReload: () {
setState(() {});
},
);
}
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(child: ALoading());
} else if (snapshot.hasData) {}
if (snapshot.hasData) {
return SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Container(
padding: const EdgeInsets.all(16),
decoration: ShapeDecoration(
color: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20),
),
shadows: const [BoxShadow(color: Color(0x07000000), blurRadius: 14, offset: Offset(0, 0), spreadRadius: 0)],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AspectRatio(
aspectRatio: 159 / 94,
child: Container(
width: 95,
height: 95,
decoration: ShapeDecoration(
color: const Color(0xFFEAF1F4),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
image: DecorationImage(
fit: BoxFit.cover,
image: NetworkImage(
_assetProvider.assetById?.assetPhoto != null ? URLs.getFileUrl(_assetProvider.assetById.assetPhoto) : "https://www.lasteelcraft.com/images/no-image-available.png"),
)),
),
),
6.height,
Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
_assetProvider.assetById?.modelDefinition?.assetName ?? "-",
style: AppTextStyles.heading5.copyWith(color: Color(0xFF3B3D4A)),
),
8.height,
Text(
"${context.translation.assetNumber}: ${_assetProvider.assetById.multiAssets.first.assetNumber}",
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
),
Text(
"${context.translation.model}: ${_assetProvider.assetById.modelDefinition.modelDefCode}",
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
),
Text(
"${context.translation.serialNo}: ${_assetProvider.assetById.multiAssets.first.assetSerialNo}",
maxLines: 2,
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
),
Text(
"MD: ${_assetProvider.assetById.department.departmentName ?? "-"}",
maxLines: 2,
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
),
Text(
"Supplier: ${_assetProvider.assetById.supplier?.suppliername ?? "-"}",
maxLines: 2,
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
),
Text(
"Manufacturer: ${_assetProvider.assetById.modelDefinition.manufacturerName}",
maxLines: 2,
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
),
Text(
"Location: ${_assetProvider.assetById.site.custName}",
maxLines: 2,
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
),
8.height,
const Divider(color: Color(0xFFEAF1F4), height: 1, thickness: 1),
8.height,
Text(
"Installation Date: ${_assetProvider.assetById.installationDate ?? "-"}",
maxLines: 2,
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
),
Text(
"Next PM Date: ${_assetProvider.assetById.installationDate ?? "-"}",
maxLines: 2,
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
),
Text(
"Last PM Date: ${_assetProvider.assetById.installationDate ?? "-"}",
maxLines: 2,
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
),
if ((_assetProvider.assetById.modelDefinition.assetDescription ?? "").isNotEmpty) ...[
8.height,
const Divider(color: Color(0xFFEAF1F4), height: 1, thickness: 1),
8.height,
Text(
_assetProvider.assetById.modelDefinition.assetDescription ?? "-",
maxLines: 2,
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
),
]
],
)
],
),
),
);
}
return Center(child: ALoading());
},
),
);
}
}

@ -0,0 +1,103 @@
import 'package:flutter/material.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/device/device.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 '../../../models/device/device.dart';
class AssetItemGridView extends StatelessWidget {
final Device device;
final Function(Device) onPressed;
const AssetItemGridView({Key key, this.device, this.onPressed}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.all(16),
decoration: ShapeDecoration(
color: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20),
),
shadows: const [BoxShadow(color: Color(0x07000000), blurRadius: 14, offset: Offset(0, 0), spreadRadius: 0)],
),
child: Column(
children: [
AspectRatio(
aspectRatio: 159 / 94,
child: Container(
width: 95,
height: 95,
decoration: ShapeDecoration(
color: const Color(0xFFEAF1F4),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
image: DecorationImage(
fit: BoxFit.cover,
image: NetworkImage(device.assetPhoto != null ? URLs.getFileUrl(device.assetPhoto) : "https://www.lasteelcraft.com/images/no-image-available.png"),
)),
),
),
6.height,
Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
device.modelDefinition.assetName,
maxLines: 2,
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF3B3D4A)),
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Text(
"${context.translation.assetNumber} : ${device.assetNumber}",
style: AppTextStyles.bodyText2.copyWith(color: Color(0xFF757575)),
),
Text(
"${context.translation.model} : ${device.modelDefinition.modelDefCode}",
style: AppTextStyles.bodyText2.copyWith(color: Color(0xFF757575)),
),
Text(
"${context.translation.serialNo} : ${device.assetSerialNo}",
maxLines: 2,
overflow: TextOverflow.fade,
style: AppTextStyles.bodyText2.copyWith(
color: Color(0xFF757575),
),
),
],
),
Row(
mainAxisSize: MainAxisSize.min,
children: [
Text(
'View Details',
style: AppTextStyles.bodyText2.copyWith(color: const Color(0xFF4A8DB7)),
),
4.width,
const Icon(
Icons.arrow_forward,
color: Color(0xFF4A8DB7),
size: 14,
)
],
),
],
).expanded
],
),
).onPress(() => onPressed(device));
}
}

@ -0,0 +1,102 @@
import 'package:flutter/material.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/device/device.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 '../../../models/device/device.dart';
class AssetItemListView extends StatelessWidget {
final Device device;
final Function(Device) onPressed;
const AssetItemListView({Key key, this.device, this.onPressed}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.all(16),
decoration: ShapeDecoration(
color: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(20),
),
shadows: const [BoxShadow(color: Color(0x07000000), blurRadius: 14, offset: Offset(0, 0), spreadRadius: 0)],
),
child: Row(
children: [
Container(
width: 95,
height: 95,
decoration: ShapeDecoration(
color: const Color(0xFFEAF1F4),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
image: DecorationImage(
fit: BoxFit.cover,
image: NetworkImage(device.assetPhoto != null ? URLs.getFileUrl(device.assetPhoto) : "https://www.lasteelcraft.com/images/no-image-available.png"),
)),
),
15.width,
Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Text(
device.modelDefinition.assetName,
maxLines: 2,
style: AppTextStyles.heading5.copyWith(color: Color(0xFF3B3D4A)),
),
Text(
"${context.translation.assetNumber} : ${device.assetNumber}",
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
),
Text(
"${context.translation.model} : ${device.modelDefinition.modelDefCode}",
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
),
],
),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Text(
"${context.translation.serialNo} : ${device.assetSerialNo}",
maxLines: 2,
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
).expanded,
Row(
mainAxisSize: MainAxisSize.min,
children: [
Text(
'View Details',
style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF4A8DB7)),
),
4.width,
const Icon(
Icons.arrow_forward,
color: Color(0xFF4A8DB7),
size: 14,
)
],
),
],
)
],
).expanded
],
),
).onPress(() => onPressed(device));
}
}

@ -51,7 +51,7 @@ class _AutoCompleteDeviceFieldState extends State<AutoCompleteDeviceField> {
stateCode: _devicesProvider.stateCode, stateCode: _devicesProvider.stateCode,
onRefresh: () async { onRefresh: () async {
_devicesProvider.reset(); _devicesProvider.reset();
await _devicesProvider.getEquipment(host: _settingProvider.host, user: _userProvider.user, hospitalId: widget.hospitalId); await _devicesProvider.getAssets(host: _settingProvider.host, user: _userProvider.user, hospitalId: widget.hospitalId);
}, },
child: Container( child: Container(
padding: const EdgeInsets.symmetric(horizontal: 16), padding: const EdgeInsets.symmetric(horizontal: 16),

@ -1,67 +0,0 @@
import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/device/device.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 '../../../models/device/device.dart';
class DeviceItem extends StatelessWidget {
final Device device;
final Function(Device) onPressed;
const DeviceItem({Key key, this.device, this.onPressed}) : super(key: key);
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 6),
child: ElevatedButton(
style: ElevatedButton.styleFrom(
primary: AColors.primaryColor,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)),
),
),
onPressed: () {
onPressed(device);
},
child: ListTile(
title: Text(
"${context.translation.assetName} : \n${device.modelDefinition.assetName}",
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white),
),
subtitle: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Divider(
color: Theme.of(context).scaffoldBackgroundColor,
),
Text(
"${context.translation.assetNumber} : ${device.assetNumber}",
style: Theme.of(context).textTheme.subtitle1.copyWith(color: AColors.white),
),
Divider(
color: Theme.of(context).scaffoldBackgroundColor,
),
Text(
"${context.translation.brand} : ${device.modelDefinition.manufacturerName}",
style: Theme.of(context).textTheme.subtitle1.copyWith(color: AColors.white),
),
Divider(
color: Theme.of(context).scaffoldBackgroundColor,
),
Text(
"${context.translation.model} : ${device.modelDefinition.modelName}",
style: Theme.of(context).textTheme.subtitle1.copyWith(color: AColors.white),
),
],
),
),
),
);
}
}

@ -1,12 +1,12 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/views/widgets/equipment/single_device_picker.dart'; import 'package:test_sa/views/widgets/equipment/single_device_picker.dart';
import '../../../models/device/device.dart'; import '../../../models/device/device.dart';
import '../../../new_views/app_style/app_color.dart'; import '../../../new_views/app_style/app_color.dart';
import '../../../new_views/common_widgets/asset_info_card.dart';
class PickAsset extends StatelessWidget { class PickAsset extends StatelessWidget {
final Function(Device) onPickAsset; final Function(Device) onPickAsset;
@ -36,29 +36,12 @@ class PickAsset extends StatelessWidget {
Device device = await Navigator.of(context).pushNamed(SingleDevicePicker.id) as Device; Device device = await Navigator.of(context).pushNamed(SingleDevicePicker.id) as Device;
onPickAsset(device); onPickAsset(device);
}).expanded, }).expanded,
"qr".toSvgAsset(height: 24, fit: BoxFit.fitHeight).onPress(() { "qr".toSvgAsset(height: 24, fit: BoxFit.fitHeight, color: context.isDark ? AppColor.primary40 : AppColor.primary70),
/// TODO [Zaid] : open qr reader
}),
], ],
// TODO [Zaid] : if you have container as parent widget, no need to add padding widget separately
).paddingOnly(start: 16, end: 16, top: 8, bottom: 8), ).paddingOnly(start: 16, end: 16, top: 8, bottom: 8),
), ),
if (device != null) if (device != null) AssetInfoCard(asset: device).paddingOnly(top: 8),
Card(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
device.modelDefinition?.assetName?.heading5(context),
8.height,
"${context.translation.assetNo}: ${device.assetNumber}".bodyText(context),
"${context.translation.manufacture}: ${device.modelDefinition?.manufacturerName}".bodyText(context),
"${context.translation.model}: ${device.modelDefinition?.modelName}".bodyText(context),
"${context.translation.serialNumber}: ${device.assetNumber}".bodyText(context),
const Divider().defaultStyle(context),
"${context.translation.department}: ${device.department?.departmentName}".bodyText(context),
"${context.translation.site}: ${device.site?.custName}".bodyText(context),
],
).paddingAll(16),
).paddingOnly(top: 8),
], ],
); );
} }

@ -1,17 +1,23 @@
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/devices_provider.dart'; import 'package:test_sa/controllers/providers/api/devices_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/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/views/widgets/equipment/device_item.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/views/widgets/equipment/asset_detail_page.dart';
import 'package:test_sa/views/widgets/equipment/asset_item_gridview.dart';
import 'package:test_sa/views/widgets/equipment/asset_item_listview.dart';
import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; import 'package:test_sa/views/widgets/loaders/lazy_loading.dart';
import 'package:test_sa/new_views/common_widgets/app_text_form_field.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/loaders/no_item_found.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import '../../../models/device/device.dart'; import '../../../models/device/device.dart';
import '../app_text_form_field.dart'; import '../../../new_views/app_style/app_color.dart';
import '../../../new_views/common_widgets/asset_info_card.dart';
import '../qr/scan_qr.dart'; import '../qr/scan_qr.dart';
class SingleDevicePicker extends StatefulWidget { class SingleDevicePicker extends StatefulWidget {
@ -30,15 +36,15 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
List<Device> _initList = []; List<Device> _initList = [];
bool _firstTime = true; bool _firstTime = true;
bool showListView = true;
TextEditingController numberController = TextEditingController(); TextEditingController numberController = TextEditingController();
TextEditingController snController = TextEditingController(); TextEditingController snController = TextEditingController();
_getDevice(String result, {bool isQr = false}) async { _getDevice(String result, {bool isQr = false}) async {
if (result == null) return; if (result == null) return;
// List<Device> devices = await _devicesProvider.getDevicesListBySN(host: _settingProvider.host, user: _userProvider.user, hospitalId: _userProvider.user.clientId, sn: result);
_devicesProvider.reset(); _devicesProvider.reset();
await _devicesProvider.getEquipment( await _devicesProvider.getAssets(
user: _userProvider.user, user: _userProvider.user,
host: _settingProvider.host, host: _settingProvider.host,
hospitalId: _userProvider.user.clientId, hospitalId: _userProvider.user.clientId,
@ -48,13 +54,6 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
); );
_searchableList.clear(); _searchableList.clear();
_searchableList.addAll(_devicesProvider.devices); _searchableList.addAll(_devicesProvider.devices);
// Navigator.of(context).pop();
// Navigator.of(context).pop();
// if (devices.isEmpty) {
// Fluttertoast.showToast(msg: _subtitle.noDeviceFound);
// return;
// }
// Navigator.of(context).pop(devices.first);
} }
@override @override
@ -84,6 +83,52 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
return Scaffold( return Scaffold(
resizeToAvoidBottomInset: false, resizeToAvoidBottomInset: false,
appBar: AppBar(
automaticallyImplyLeading: false,
titleSpacing: 0,
title: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
height: 40,
padding: const EdgeInsets.only(left: 16, right: 8),
alignment: Alignment.center,
decoration: ShapeDecoration(
color: Color(0xFFEAF1F4),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
),
child: Row(
children: [
const Icon(Icons.search, color: Color(0xFF757575), size: 16),
8.width,
Text(
context.translation.search,
style: AppTextStyles.bodyText.copyWith(
color: const Color(0xFF757575),
),
).expanded,
],
),
).onPress(() {
// todo 'sikander' add search screen
}).expanded,
16.width,
const Icon(
Icons.grid_view_outlined,
color: Color(0xFF757575),
).onPress(() => setState(() {
showListView = !showListView;
})),
16.width,
Text(
'Filter',
style: AppTextStyles.bodyText2.copyWith(color: const Color(0xFF4A8DB7)),
),
],
).paddingOnly(start: 16, end: 16),
),
body: SafeArea( body: SafeArea(
child: LoadingManager( child: LoadingManager(
isLoading: _devicesProvider.isLoading, isLoading: _devicesProvider.isLoading,
@ -91,24 +136,25 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
isFailedLoading: _devicesProvider.devices == null, isFailedLoading: _devicesProvider.devices == null,
onRefresh: () async { onRefresh: () async {
_devicesProvider.reset(); _devicesProvider.reset();
await _devicesProvider.getEquipment(user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId); await _devicesProvider.getAssets(user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId);
}, },
child: Column( child: Column(
children: [ children: [
const SizedBox(height: 16), const SizedBox(height: 16),
// todo "Siaknder" will remove when add search screen
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
child: Column( child: Column(
children: [ children: [
ATextFormField( AppTextFormField(
hintText: "Search by Asset Number", labelText: context.translation.searchByAssetNumber,
controller: numberController, controller: numberController,
style: Theme.of(context).textTheme.subtitle1, prefixIcon: "search".toSvgAsset().paddingAll(16),
suffixIcon: const Icon(Icons.search_rounded), backgroundColor: context.isDark ? AppColor.neutral40 : AppColor.neutral30,
textInputAction: TextInputAction.search, textInputAction: TextInputAction.search,
onAction: () async { onAction: () async {
_devicesProvider.reset(); _devicesProvider.reset();
await _devicesProvider.getEquipment( await _devicesProvider.getAssets(
user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId, serialNumber: snController.text, number: numberController.text); user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId, serialNumber: snController.text, number: numberController.text);
_searchableList.clear(); _searchableList.clear();
_searchableList.addAll(_devicesProvider.devices); _searchableList.addAll(_devicesProvider.devices);
@ -117,15 +163,15 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
const SizedBox( const SizedBox(
height: 8, height: 8,
), ),
ATextFormField( AppTextFormField(
hintText: context.translation.searchBySn, labelText: context.translation.searchBySn,
controller: snController, controller: snController,
style: Theme.of(context).textTheme.subtitle1, prefixIcon: "search".toSvgAsset().paddingAll(16),
suffixIcon: const Icon(Icons.search_rounded), backgroundColor: context.isDark ? AppColor.neutral40 : AppColor.neutral30,
textInputAction: TextInputAction.search, textInputAction: TextInputAction.search,
onAction: () async { onAction: () async {
_devicesProvider.reset(); _devicesProvider.reset();
await _devicesProvider.getEquipment( await _devicesProvider.getAssets(
user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId, serialNumber: snController.text, number: numberController.text); user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId, serialNumber: snController.text, number: numberController.text);
_searchableList.clear(); _searchableList.clear();
_searchableList.addAll(_devicesProvider.devices); _searchableList.addAll(_devicesProvider.devices);
@ -145,19 +191,35 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
await _devicesProvider.getDevicesList( await _devicesProvider.getDevicesList(
user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId, serialNumber: snController.text, number: numberController.text); user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId, serialNumber: snController.text, number: numberController.text);
}, },
child: ListView.builder( child: showListView
padding: EdgeInsets.zero, ? ListView.separated(
shrinkWrap: true, padding: const EdgeInsets.all(16),
itemCount: _searchableList.length, itemCount: _searchableList.length,
itemBuilder: (listContext, itemIndex) { separatorBuilder: (listContext, itemIndex) => 8.height,
return DeviceItem( itemBuilder: (listContext, itemIndex) {
device: _searchableList[itemIndex], return AssetItemListView(
onPressed: (device) { device: _searchableList[itemIndex],
Navigator.of(context).pop(device); onPressed: (device) {
}, Navigator.of(context).pop(device);
); },
}, );
), },
)
: GridView.builder(
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, childAspectRatio: 191 / 261, crossAxisSpacing: 16, mainAxisSpacing: 16),
itemCount: _searchableList.length,
padding: const EdgeInsets.all(16),
itemBuilder: (context, index) {
return AssetItemGridView(
device: _searchableList[index],
onPressed: (device) {
Navigator.of(context).pushNamed(AssetDetailPage.id, arguments: device.id);
return;
Navigator.of(context).pop(device);
},
);
},
),
)), )),
], ],
), ),
@ -165,7 +227,7 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
), ),
floatingActionButton: FloatingActionButton( floatingActionButton: FloatingActionButton(
heroTag: "some tag 2", heroTag: "some tag 2",
child: const Icon(Icons.qr_code_scanner), child: "qr".toSvgAsset(height: 32, fit: BoxFit.fitHeight, color: Theme.of(context).scaffoldBackgroundColor),
onPressed: () async { onPressed: () async {
String result = await Navigator.of(context).push( String result = await Navigator.of(context).push(
MaterialPageRoute(builder: (_) => const ScanQr()), MaterialPageRoute(builder: (_) => const ScanQr()),

@ -1,11 +1,9 @@
import 'package:audioplayers/audioplayers.dart'; import 'package:audioplayers/audioplayers.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/app_style/app_text_style.dart'; import 'package:test_sa/new_views/app_style/app_text_style.dart';
import 'package:test_sa/views/app_style/sizing.dart';
import '../../app_style/colors.dart';
class ASoundPlayer extends StatefulWidget { class ASoundPlayer extends StatefulWidget {
final String audio; final String audio;
@ -33,13 +31,14 @@ class _ASoundPlayerState extends State<ASoundPlayer> {
decoration: ShapeDecoration( decoration: ShapeDecoration(
color: Colors.white, color: Colors.white,
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
side: const BorderSide(width: 1, color: Color(0xFFEAF1F4)), side: BorderSide(width: 1, color: (context.isDark ? AppColor.neutral20 : AppColor.neutral30)),
borderRadius: BorderRadius.circular(32), borderRadius: BorderRadius.circular(32),
), ),
), ),
child: Icon( child: Icon(
icon, icon,
color: const Color(0xff163A51).withOpacity(0.5), size: 30,
color: (context.isDark ? AppColor.primary40 : AppColor.primary70).withOpacity(0.5),
), ),
).onPress(onpress); ).onPress(onpress);
} }
@ -66,7 +65,7 @@ class _ASoundPlayerState extends State<ASoundPlayer> {
rebuild(); rebuild();
}); });
case PlayerState.stopped: case PlayerState.stopped:
return audioPlayerButton(_isLocalFile ? Icons.play_circle_fill_outlined : Icons.download_rounded, () async { return audioPlayerButton(_isLocalFile ? Icons.play_arrow_rounded : Icons.download_rounded, () async {
_failedToLoad = false; _failedToLoad = false;
try { try {
await _audioPlayer.play( await _audioPlayer.play(
@ -182,7 +181,7 @@ class _ASoundPlayerState extends State<ASoundPlayer> {
value: _audioPosition?.inMilliseconds?.toDouble() ?? 0.0, value: _audioPosition?.inMilliseconds?.toDouble() ?? 0.0,
min: 0, min: 0,
max: _audioTime?.inMilliseconds?.toDouble() ?? 60.0, max: _audioTime?.inMilliseconds?.toDouble() ?? 60.0,
activeColor: AppColor.primary70, activeColor: context.isDark ? AppColor.primary40 : AppColor.primary70,
inactiveColor: AppColor.neutral30, inactiveColor: AppColor.neutral30,
onChangeStart: (value) { onChangeStart: (value) {
_sliderMoving = true; _sliderMoving = true;

Loading…
Cancel
Save