From fb3f442ed5135faa3cee804c980a7a8e5d483e1d Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Wed, 25 Oct 2023 11:56:14 +0300 Subject: [PATCH] asset search done & filter assets need to be discussed --- .../providers/api/devices_provider.dart | 18 +- .../providers/api/gas_refill_provider.dart | 10 +- lib/l10n/app_ar.arb | 13 +- lib/l10n/app_en.arb | 13 +- lib/main.dart | 4 + lib/models/device/asset_search.dart | 185 ++++++++++++++++++ lib/providers/department_provider.dart | 25 +-- .../device_transfer/asset_filter_screen.dart | 85 ++++++++ .../device_transfer/asset_search_screen.dart | 149 ++++++++++++++ .../auto_complete_devices_field.dart | 2 +- lib/views/widgets/equipment/pick_asset.dart | 5 +- .../equipment/single_device_picker.dart | 71 ++----- 12 files changed, 499 insertions(+), 81 deletions(-) create mode 100644 lib/models/device/asset_search.dart create mode 100644 lib/views/pages/device_transfer/asset_filter_screen.dart create mode 100644 lib/views/pages/device_transfer/asset_search_screen.dart diff --git a/lib/controllers/providers/api/devices_provider.dart b/lib/controllers/providers/api/devices_provider.dart index 8fc9c854..3443a4a8 100644 --- a/lib/controllers/providers/api/devices_provider.dart +++ b/lib/controllers/providers/api/devices_provider.dart @@ -7,6 +7,7 @@ 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/models/device/asset_by_id_model.dart'; +import 'package:test_sa/models/device/asset_search.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -48,19 +49,18 @@ class AssetProvider extends ChangeNotifier { notifyListeners(); } - Future getAssets({@required String host, @required User user, @required int hospitalId, String serialNumber, String number, bool isQr = false}) async { + Future getAssets({AssetSearch search, bool isQr = false}) async { if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; try { - response = await ApiManager.instance.post(URLs.getAssets, body: { + final Map body = { "pageSize": pageItemNumber, "pageNumber": devices.length ~/ pageItemNumber + 1, - "siteId": hospitalId, - if (serialNumber?.isEmpty == false) "assetSerialNumber": serialNumber, - if (number?.isEmpty == false) "assetNo": number, - }); + }; + if (search != null) body.addAll(search.toJson()); + response = await ApiManager.instance.post(URLs.getAssets, body: body); } catch (error) { _loading = false; _stateCode = -1; @@ -71,10 +71,10 @@ class AssetProvider extends ChangeNotifier { if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List equipmentListJson = json.decode(response.body)["data"]; - var dList = equipmentListJson.map((asset) => Asset.fromJson(asset)).toList(); + var dList = equipmentListJson?.map((asset) => Asset.fromJson(asset))?.toList() ?? []; try { if (isQr) { - dList = dList.where((element) => number?.toLowerCase() == element?.assetNumber?.toLowerCase())?.toList() ?? []; + dList = dList.where((element) => search?.assetNo?.toLowerCase() == element?.assetNumber?.toLowerCase())?.toList() ?? []; } } catch (e) { print(e); @@ -119,7 +119,7 @@ class AssetProvider extends ChangeNotifier { response = await ApiManager.instance.post(URLs.getAssets, body: { "pageSize": pageItemNumber, "pageNumber": devices.length ~/ pageItemNumber + 1, - "siteId": hospitalId, + // "siteId": hospitalId, if (serialNumber?.isEmpty == false) "assetSerialNumber": serialNumber, if (number?.isEmpty == false) "assetNo": number, }); diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index 7b5a4a23..ffa42782 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -101,11 +101,11 @@ class GasRefillProvider extends ChangeNotifier { Response response; try { showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); - final body = model.toJson() - ..addAll({ - "uid": user.id.toString(), - "token": user.token ?? "", - }); + final Map body = { + "uid": user.id.toString(), + "token": user.token ?? "", + }; + if (model != null) body.addAll(model.toJson()); response = await ApiManager.instance.post(URLs.requestGasRefill, body: body); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index a1dd2baa..3606f065 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -264,5 +264,16 @@ "receiverDetails" : "تفاصيل المستلم", "requestedThrough" : "الطلب عبر", "typeOfRequest" : "نوع الطلب", - "assetDetails" : "تفاصيل الجهاز" + "assetDetails" : "تفاصيل الجهاز", + "searchBy" : "إبحث بـ", + "searchByDesc" : "إبحث بأي من المعايير التالية", + "location" : "الموقع", + "supplier" : "المزود", + "md": "تعريف النموذج", + "snNumber" : "الرقم التسلسلي", + "oracleCode" : "رمز اوراكل", + "filter" : "تصفية", + "byDepartment" : "حسب القسم", + "bySite" : "حسب الموقع", + "applyFilter" : "تصفية" } \ No newline at end of file diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index bcae22c3..cf293de3 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -269,5 +269,16 @@ "receiverName" : "Receiver Name", "receiverDetails" : "Receiver Details", "requestedThrough" : "Requested Through", - "typeOfRequest" : "Type of Request" + "typeOfRequest" : "Type of Request", + "searchBy" : "Search by", + "searchByDesc" : "Search by any of the following criteria", + "location" : "Location", + "supplier" : "Supplier", + "md": "MD", + "snNumber" : "SN Number", + "oracleCode" : "Oracle Code", + "filter" : "Filter", + "byDepartment" : "By Department", + "bySite" : "By Site", + "applyFilter" : "Apply Filter" } \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 4f62131d..ec11a2de 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -57,6 +57,8 @@ import 'package:test_sa/providers/service_request_providers/equipment_status_pro import 'package:test_sa/providers/service_request_providers/priority_provider.dart'; import 'package:test_sa/providers/service_request_providers/requested_through_provider.dart'; import 'package:test_sa/providers/service_request_providers/type_of_request_provider.dart'; +import 'package:test_sa/views/pages/device_transfer/asset_filter_screen.dart'; +import 'package:test_sa/views/pages/device_transfer/asset_search_screen.dart'; import 'package:test_sa/views/pages/device_transfer/request_device_transfer.dart'; import 'package:test_sa/views/pages/device_transfer/track_device_transfer.dart'; import 'package:test_sa/views/pages/sub_workorder/create_sub_workorder_page.dart'; @@ -204,6 +206,8 @@ class MyApp extends StatelessWidget { CreateSubWorkOrderPage.id: (_) => const CreateSubWorkOrderPage(), WorkOrderListPage.id: (_) => WorkOrderListPage(), AssetDetailPage.id: (_) => AssetDetailPage(), + AssetSearchScreen.id: (_) => const AssetSearchScreen(), + AssetFilterScreen.id: (_) => const AssetFilterScreen(), }, ), ), diff --git a/lib/models/device/asset_search.dart b/lib/models/device/asset_search.dart new file mode 100644 index 00000000..a120fcdb --- /dev/null +++ b/lib/models/device/asset_search.dart @@ -0,0 +1,185 @@ +import 'package:test_sa/models/lookup.dart'; + +class AssetSearch { + AssetSearch({ + this.code, + this.assetSerialNumber, + this.assetName, + this.supplyDateSymbol, + this.supplyDateFrom, + this.supplyDateTo, + this.warrantyEndDateSymbol, + this.warrantyEndDateFrom, + this.warrantyEndDateTo, + this.delieveryInspectionDateSymbol, + this.deliveryInspectionDateFrom, + this.deliveryInspectionDateTo, + this.maintenanceContract, + this.assetClassification, + this.assetStatus, + this.assetNotScraped, + this.assetNo, + this.modelDefinition, + this.site, + this.manufacturer, + this.model, + this.department, + this.supplier, + this.tagCode, + this.assetGroupName, + this.assetGroup, + }); + + AssetSearch.fromJson(dynamic json) { + code = json['code']; + assetSerialNumber = json['assetSerialNumber']; + assetName = json['assetName']; + supplyDateSymbol = json['supplyDateSymbol'] != null ? Lookup.fromJson(json['supplyDateSymbol']) : null; + supplyDateFrom = json['supplyDateFrom']; + supplyDateTo = json['supplyDateTo']; + warrantyEndDateSymbol = json['warrantyEndDateSymbol']; + warrantyEndDateFrom = json['warrantyEndDateFrom']; + warrantyEndDateTo = json['warrantyEndDateTo']; + delieveryInspectionDateSymbol = json['delieveryInspectionDateSymbol']; + deliveryInspectionDateFrom = json['deliveryInspectionDateFrom']; + deliveryInspectionDateTo = json['deliveryInspectionDateTo']; + maintenanceContract = json['maintenanceContract'] != null ? Lookup.fromJson(json['maintenanceContract']) : null; + assetClassification = json['assetClassification'] != null ? Lookup.fromJson(json['assetClassification']) : null; + assetStatus = json['assetStatus'] != null ? Lookup.fromJson(json['assetStatus']) : null; + assetNotScraped = json['assetNotScraped'] != null ? Lookup.fromJson(json['assetNotScraped']) : null; + assetNo = json['assetNo']; + modelDefinition = json['modelDefinition']; + site = json['site']; + manufacturer = json['manufacturer']; + model = json['model']; + department = json['department']; + supplier = json['supplier']; + tagCode = json['tagCode']; + assetGroupName = json['assetGroupName']; + assetGroup = json['assetGroup'] != null ? Lookup.fromJson(json['assetGroup']) : null; + } + String code; + String assetSerialNumber; + String assetName; + Lookup supplyDateSymbol; + String supplyDateFrom; + String supplyDateTo; + num warrantyEndDateSymbol; + String warrantyEndDateFrom; + String warrantyEndDateTo; + num delieveryInspectionDateSymbol; + String deliveryInspectionDateFrom; + String deliveryInspectionDateTo; + Lookup maintenanceContract; + Lookup assetClassification; + Lookup assetStatus; + Lookup assetNotScraped; + String assetNo; + String modelDefinition; + String site; + String manufacturer; + String model; + String department; + String supplier; + String tagCode; + String assetGroupName; + Lookup assetGroup; + AssetSearch copyWith({ + String code, + String assetSerialNumber, + String assetName, + Lookup supplyDateSymbol, + String supplyDateFrom, + String supplyDateTo, + num warrantyEndDateSymbol, + String warrantyEndDateFrom, + String warrantyEndDateTo, + num delieveryInspectionDateSymbol, + String deliveryInspectionDateFrom, + String deliveryInspectionDateTo, + Lookup maintenanceContract, + Lookup assetClassification, + Lookup assetStatus, + Lookup assetNotScraped, + String assetNo, + String modelDefinition, + String site, + String manufacturer, + String model, + String department, + String supplier, + String tagCode, + String assetGroupName, + Lookup assetGroup, + }) => + AssetSearch( + code: code ?? this.code, + assetSerialNumber: assetSerialNumber ?? this.assetSerialNumber, + assetName: assetName ?? this.assetName, + supplyDateSymbol: supplyDateSymbol ?? this.supplyDateSymbol, + supplyDateFrom: supplyDateFrom ?? this.supplyDateFrom, + supplyDateTo: supplyDateTo ?? this.supplyDateTo, + warrantyEndDateSymbol: warrantyEndDateSymbol ?? this.warrantyEndDateSymbol, + warrantyEndDateFrom: warrantyEndDateFrom ?? this.warrantyEndDateFrom, + warrantyEndDateTo: warrantyEndDateTo ?? this.warrantyEndDateTo, + delieveryInspectionDateSymbol: delieveryInspectionDateSymbol ?? this.delieveryInspectionDateSymbol, + deliveryInspectionDateFrom: deliveryInspectionDateFrom ?? this.deliveryInspectionDateFrom, + deliveryInspectionDateTo: deliveryInspectionDateTo ?? this.deliveryInspectionDateTo, + maintenanceContract: maintenanceContract ?? this.maintenanceContract, + assetClassification: assetClassification ?? this.assetClassification, + assetStatus: assetStatus ?? this.assetStatus, + assetNotScraped: assetNotScraped ?? this.assetNotScraped, + assetNo: assetNo ?? this.assetNo, + modelDefinition: modelDefinition ?? this.modelDefinition, + site: site ?? this.site, + manufacturer: manufacturer ?? this.manufacturer, + model: model ?? this.model, + department: department ?? this.department, + supplier: supplier ?? this.supplier, + tagCode: tagCode ?? this.tagCode, + assetGroupName: assetGroupName ?? this.assetGroupName, + assetGroup: assetGroup ?? this.assetGroup, + ); + Map toJson() { + final map = {}; + if (code != null && code.isNotEmpty) map['code'] = code; + if (assetSerialNumber != null && assetSerialNumber.isNotEmpty) map['assetSerialNumber'] = assetSerialNumber; + if (assetName != null && assetName.isNotEmpty) map['assetName'] = assetName; + if (supplyDateSymbol != null) { + map['supplyDateSymbol'] = supplyDateSymbol.toJson(); + } + if (supplyDateFrom != null && supplyDateFrom.isNotEmpty) map['supplyDateFrom'] = supplyDateFrom; + if (supplyDateTo != null && supplyDateTo.isNotEmpty) map['supplyDateTo'] = supplyDateTo; + if (warrantyEndDateSymbol != null) map['warrantyEndDateSymbol'] = warrantyEndDateSymbol; + if (warrantyEndDateFrom != null && warrantyEndDateFrom.isNotEmpty) map['warrantyEndDateFrom'] = warrantyEndDateFrom; + if (warrantyEndDateTo != null && warrantyEndDateTo.isNotEmpty) map['warrantyEndDateTo'] = warrantyEndDateTo; + if (delieveryInspectionDateSymbol != null) map['delieveryInspectionDateSymbol'] = delieveryInspectionDateSymbol; + if (deliveryInspectionDateFrom != null && deliveryInspectionDateFrom.isNotEmpty) map['deliveryInspectionDateFrom'] = deliveryInspectionDateFrom; + if (deliveryInspectionDateTo != null && deliveryInspectionDateTo.isNotEmpty) map['deliveryInspectionDateTo'] = deliveryInspectionDateTo; + if (maintenanceContract != null) { + map['maintenanceContract'] = maintenanceContract.toJson(); + } + if (assetClassification != null) { + map['assetClassification'] = assetClassification.toJson(); + } + if (assetStatus != null) { + map['assetStatus'] = assetStatus.toJson(); + } + if (assetNotScraped != null) { + map['assetNotScraped'] = assetNotScraped.toJson(); + } + if (assetNo != null && assetNo.isNotEmpty) map['assetNo'] = assetNo; + if (modelDefinition != null && modelDefinition.isNotEmpty) map['modelDefinition'] = modelDefinition; + if (site != null && site.isNotEmpty) map['site'] = site; + if (manufacturer != null && manufacturer.isNotEmpty) map['manufacturer'] = manufacturer; + if (model != null && model.isNotEmpty) map['model'] = model; + if (department != null && department.isNotEmpty) map['department'] = department; + if (supplier != null && supplier.isNotEmpty) map['supplier'] = supplier; + if (tagCode != null && tagCode.isNotEmpty) map['tagCode'] = tagCode; + if (assetGroupName != null && assetGroupName.isNotEmpty) map['assetGroupName'] = assetGroupName; + if (assetGroup != null) { + map['assetGroup'] = assetGroup.toJson(); + } + return map; + } +} diff --git a/lib/providers/department_provider.dart b/lib/providers/department_provider.dart index 4575b580..b735dbc3 100644 --- a/lib/providers/department_provider.dart +++ b/lib/providers/department_provider.dart @@ -4,31 +4,32 @@ import 'package:http/http.dart'; import '../../controllers/api_routes/api_manager.dart'; import '../../controllers/api_routes/urls.dart'; -import '../../models/lookup.dart'; +import '../models/new_models/department.dart'; import 'loading_list_notifier.dart'; -class DepartmentProvider extends LoadingListNotifier { +class DepartmentProvider extends LoadingListNotifier { @override Future getDate() async { if (loading ?? false) return -2; loading = true; notifyListeners(); + Response response; try { - Response response = await ApiManager.instance.get(URLs.getDepartments); - stateCode = response.statusCode; - if (response.statusCode >= 200 && response.statusCode < 300) { - // client's request was successfully received - List categoriesListJson = json.decode(response.body)["data"]; - items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); - } - loading = false; - notifyListeners(); - return response.statusCode; + response = await ApiManager.instance.post(URLs.getDepartments, body: {"pageSize": 50}); } catch (error) { loading = false; stateCode = -1; notifyListeners(); return -1; } + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List listJson = json.decode(response.body)["data"]; + items = listJson.map((department) => Department.fromJson(department)).toList(); + } + loading = false; + notifyListeners(); + return response.statusCode; } } diff --git a/lib/views/pages/device_transfer/asset_filter_screen.dart b/lib/views/pages/device_transfer/asset_filter_screen.dart new file mode 100644 index 00000000..bf4348aa --- /dev/null +++ b/lib/views/pages/device_transfer/asset_filter_screen.dart @@ -0,0 +1,85 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.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/widget_extensions.dart'; +import 'package:test_sa/models/new_models/department.dart'; +import 'package:test_sa/models/new_models/site.dart'; +import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; +import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart'; +import 'package:test_sa/providers/department_provider.dart'; +import 'package:test_sa/providers/gas_request_providers/site_provider.dart'; + +import '../../../models/device/asset_search.dart'; +import '../../../new_views/common_widgets/app_lazy_loading.dart'; +import '../../../new_views/common_widgets/default_app_bar.dart'; + +class AssetFilterScreen extends StatefulWidget { + static const String id = "asset_filter_screen"; + final AssetSearch data; + const AssetFilterScreen({Key key, this.data}) : super(key: key); + + @override + State createState() => _AssetFilterScreenState(); +} + +class _AssetFilterScreenState extends State { + AssetSearch filter; + Site _site; + Department _department; + @override + void initState() { + filter = widget.data ?? AssetSearch(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: DefaultAppBar(title: context.translation.filter), + body: Column( + children: [ + SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + // context.translation.equipmentStatus.heading5(context), + // 16.height, + SingleItemDropDownMenu( + context: context, + title: context.translation.byDepartment, + initialValue: _department, + onSelect: (value) { + _department = value; + }, + ), + 8.height, + SingleItemDropDownMenu( + context: context, + title: context.translation.bySite, + initialValue: _site, + onSelect: (value) { + _site = value; + }, + ), + ], + ), + ).expanded, + AppFilledButton(onPressed: _search, label: context.translation.applyFilter), + ], + ).paddingAll(16), + ); + } + + void _search() async { + filter.site = _site?.name; + filter.department = _department?.departmentName; + final deviceProvider = Provider.of(context, listen: false); + deviceProvider.reset(); + showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); + await deviceProvider.getAssets(search: filter); + Navigator.pop(context); + Navigator.of(context).pop(filter); + } +} diff --git a/lib/views/pages/device_transfer/asset_search_screen.dart b/lib/views/pages/device_transfer/asset_search_screen.dart new file mode 100644 index 00000000..da0dcb37 --- /dev/null +++ b/lib/views/pages/device_transfer/asset_search_screen.dart @@ -0,0 +1,149 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.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/new_views/common_widgets/app_filled_button.dart'; +import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart'; + +import '../../../models/device/asset_search.dart'; +import '../../../new_views/common_widgets/app_lazy_loading.dart'; +import '../../../new_views/common_widgets/default_app_bar.dart'; + +class AssetSearchScreen extends StatefulWidget { + static const String id = "asset_search_screen"; + final AssetSearch data; + const AssetSearchScreen({Key key, this.data}) : super(key: key); + + @override + State createState() => _AssetSearchScreenState(); +} + +class _AssetSearchScreenState extends State { + AssetSearch search; + final GlobalKey _formKey = GlobalKey(); + + @override + void initState() { + search = widget.data ?? AssetSearch(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: DefaultAppBar(title: context.translation.search), + body: Form( + key: _formKey, + child: Column( + children: [ + SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + context.translation.searchBy.heading5(context), + 8.height, + context.translation.searchByDesc.bodyText(context), + 16.height, + AppTextFormField( + labelText: context.translation.assetName, + initialValue: search.assetName, + onSaved: (value) { + search.assetName = value; + }, + ), + 8.height, + AppTextFormField( + labelText: context.translation.assetNumber, + initialValue: search.assetNo, + onSaved: (value) { + search.assetNo = value; + }, + ), + 8.height, + + /// todo : TBD (no matched parameter) + AppTextFormField( + labelText: context.translation.oracleCode, + onSaved: (value) {}, + ), + 8.height, + AppTextFormField( + labelText: context.translation.snNumber, + initialValue: search.assetSerialNumber, + onSaved: (value) { + search.assetSerialNumber = value; + }, + ), + 8.height, + AppTextFormField( + labelText: context.translation.model, + initialValue: search.model, + onSaved: (value) { + search.model = value; + }, + ), + 8.height, + AppTextFormField( + labelText: context.translation.supplier, + initialValue: search.supplier, + onSaved: (value) { + search.supplier = value; + }, + ), + 8.height, + AppTextFormField( + labelText: context.translation.site, + initialValue: search.site, + onSaved: (value) { + search.site = value; + }, + ), + 8.height, + AppTextFormField( + labelText: context.translation.manufacture, + initialValue: search.manufacturer, + onSaved: (value) { + search.manufacturer = value; + }, + ), + 8.height, + AppTextFormField( + labelText: context.translation.md, + initialValue: search.modelDefinition, + onSaved: (value) { + search.modelDefinition = value; + }, + ), + 8.height, + + /// todo : TBD (no matched parameter) + AppTextFormField( + labelText: context.translation.location, + onSaved: (value) {}, + ), + 8.height, + ], + ), + ).expanded, + AppFilledButton(onPressed: _search, label: context.translation.search), + ], + ).paddingAll(16), + ), + ); + } + + void _search() async { + if (_formKey.currentState.validate()) { + _formKey.currentState.save(); + final deviceProvider = Provider.of(context, listen: false); + deviceProvider.reset(); + showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); + await deviceProvider.getAssets(search: search); + Navigator.pop(context); + Navigator.of(context).pop(search); + } + } +} diff --git a/lib/views/widgets/equipment/auto_complete_devices_field.dart b/lib/views/widgets/equipment/auto_complete_devices_field.dart index 42d16500..9f9bfb8f 100644 --- a/lib/views/widgets/equipment/auto_complete_devices_field.dart +++ b/lib/views/widgets/equipment/auto_complete_devices_field.dart @@ -51,7 +51,7 @@ class _AutoCompleteDeviceFieldState extends State { stateCode: _devicesProvider.stateCode, onRefresh: () async { _devicesProvider.reset(); - await _devicesProvider.getAssets(host: _settingProvider.host, user: _userProvider.user, hospitalId: widget.hospitalId); + await _devicesProvider.getAssets(); }, child: Container( padding: const EdgeInsets.symmetric(horizontal: 16), diff --git a/lib/views/widgets/equipment/pick_asset.dart b/lib/views/widgets/equipment/pick_asset.dart index e68dc8c4..e3cddf2b 100644 --- a/lib/views/widgets/equipment/pick_asset.dart +++ b/lib/views/widgets/equipment/pick_asset.dart @@ -1,5 +1,6 @@ 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 'package:test_sa/views/widgets/equipment/single_device_picker.dart'; @@ -24,6 +25,7 @@ class PickAsset extends StatelessWidget { borderRadius: BorderRadius.circular(10), boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.03), blurRadius: 14)], ), + padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), child: Row( children: [ Column( @@ -38,8 +40,7 @@ class PickAsset extends StatelessWidget { }).expanded, "qr".toSvgAsset(height: 24, fit: BoxFit.fitHeight, color: context.isDark ? AppColor.primary40 : AppColor.primary70), ], - // 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), + ), ), if (device != null) AssetInfoCard(asset: device).paddingOnly(top: 8), ], diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/single_device_picker.dart index 9a3f4639..52508512 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/lib/views/widgets/equipment/single_device_picker.dart @@ -7,7 +7,6 @@ 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/new_views/common_widgets/app_text_form_field.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'; @@ -16,7 +15,9 @@ import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import '../../../models/device/asset.dart'; -import '../../../new_views/app_style/app_color.dart'; +import '../../../models/device/asset_search.dart'; +import '../../pages/device_transfer/asset_filter_screen.dart'; +import '../../pages/device_transfer/asset_search_screen.dart'; import '../qr/scan_qr.dart'; class SingleDevicePicker extends StatefulWidget { @@ -34,6 +35,7 @@ class _SingleDevicePickerState extends State { List _searchableList = []; List _initList = []; bool _firstTime = true; + AssetSearch _searchAsset; bool showListView = true; @@ -44,11 +46,7 @@ class _SingleDevicePickerState extends State { if (result == null) return; _devicesProvider.reset(); await _devicesProvider.getAssets( - user: _userProvider.user, - host: _settingProvider.host, - hospitalId: _userProvider.user.clientId, - serialNumber: "", - number: result, + search: AssetSearch(assetNo: result, assetSerialNumber: ""), isQr: isQr, ); _searchableList.clear(); @@ -110,8 +108,13 @@ class _SingleDevicePickerState extends State { ).expanded, ], ), - ).onPress(() { - // todo 'sikander' add search screen + ).onPress(() async { + final result = await Navigator.push(context, MaterialPageRoute(builder: (context) => AssetSearchScreen(data: _searchAsset))); + if (result != null) { + _searchAsset = result; + } + _searchableList.clear(); + _searchableList.addAll(_devicesProvider.devices); }).expanded, 16.width, const Icon( @@ -124,7 +127,14 @@ class _SingleDevicePickerState extends State { Text( 'Filter', style: AppTextStyles.bodyText2.copyWith(color: const Color(0xFF4A8DB7)), - ), + ).onPress(() async { + final result = await Navigator.push(context, MaterialPageRoute(builder: (context) => AssetFilterScreen(data: _searchAsset))); + if (result != null) { + _searchAsset = result; + } + _searchableList.clear(); + _searchableList.addAll(_devicesProvider.devices); + }), ], ).paddingOnly(start: 16, end: 16), ), @@ -135,50 +145,11 @@ class _SingleDevicePickerState extends State { isFailedLoading: _devicesProvider.devices == null, onRefresh: () async { _devicesProvider.reset(); - await _devicesProvider.getAssets(user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId); + await _devicesProvider.getAssets(search: _searchAsset); }, child: Column( children: [ const SizedBox(height: 16), - // todo "Siaknder" will remove when add search screen - Padding( - padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), - child: Column( - children: [ - AppTextFormField( - labelText: context.translation.searchByAssetNumber, - controller: numberController, - prefixIcon: "search".toSvgAsset().paddingAll(16), - backgroundColor: context.isDark ? AppColor.neutral40 : AppColor.neutral30, - textInputAction: TextInputAction.search, - onAction: () async { - _devicesProvider.reset(); - await _devicesProvider.getAssets( - user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId, serialNumber: snController.text, number: numberController.text); - _searchableList.clear(); - _searchableList.addAll(_devicesProvider.devices); - }, - ), - const SizedBox( - height: 8, - ), - AppTextFormField( - labelText: context.translation.searchBySn, - controller: snController, - prefixIcon: "search".toSvgAsset().paddingAll(16), - backgroundColor: context.isDark ? AppColor.neutral40 : AppColor.neutral30, - textInputAction: TextInputAction.search, - onAction: () async { - _devicesProvider.reset(); - await _devicesProvider.getAssets( - user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId, serialNumber: snController.text, number: numberController.text); - _searchableList.clear(); - _searchableList.addAll(_devicesProvider.devices); - }, - ), - ], - ), - ), Expanded( child: _searchableList.isEmpty ? NoItemFound(