From e65d2a44edc8b4c81112a614280d282a26ba02de Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Sun, 21 Jul 2024 14:59:58 +0300 Subject: [PATCH] search asset ui --- .../providers/api/devices_provider.dart | 2 +- .../device_transfer/search_asset_page.dart | 45 +++-------------- .../equipment/asset_item_listview.dart | 5 +- lib/views/widgets/equipment/asset_picker.dart | 5 +- .../equipment/single_device_picker.dart | 8 ++-- ...scan_qr_widget.dart => asset_scan_qr.dart} | 48 ++++++++++--------- pubspec.lock | 8 ---- pubspec.yaml | 1 - 8 files changed, 43 insertions(+), 79 deletions(-) rename lib/views/widgets/qr/{scan_qr_widget.dart => asset_scan_qr.dart} (69%) diff --git a/lib/controllers/providers/api/devices_provider.dart b/lib/controllers/providers/api/devices_provider.dart index af9f979..49927b7 100644 --- a/lib/controllers/providers/api/devices_provider.dart +++ b/lib/controllers/providers/api/devices_provider.dart @@ -66,7 +66,7 @@ class AssetProvider extends ChangeNotifier { try { final Map body = { "pageSize": isSearchBy ? searchPageItemNumber : pageItemNumber, - "pageNumber": isSearchBy ? searchDevices.length ~/ searchPageItemNumber + 1 : devices.length ~/ pageItemNumber + 1, + "pageNumber": isSearchBy ? (searchDevices.length / searchPageItemNumber).ceil() + 1 : devices.length ~/ pageItemNumber + 1, }; if (search != null) body.addAll(search.toJson()); response = await ApiManager.instance.post(URLs.getAssets, body: body); diff --git a/lib/views/pages/device_transfer/search_asset_page.dart b/lib/views/pages/device_transfer/search_asset_page.dart index b4c6513..15d89fb 100644 --- a/lib/views/pages/device_transfer/search_asset_page.dart +++ b/lib/views/pages/device_transfer/search_asset_page.dart @@ -3,6 +3,7 @@ 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_text_form_field.dart'; @@ -11,7 +12,6 @@ import '../../../models/device/asset_search.dart'; import '../../../new_views/app_style/app_color.dart'; import '../../../new_views/common_widgets/app_lazy_loading.dart'; import '../../../new_views/common_widgets/custom_app_bar.dart'; -import '../../widgets/bottom_sheets/asset_detail_bottom_sheet.dart'; import '../../widgets/equipment/asset_item_listview.dart'; import '../../widgets/horizontal_list_widget.dart'; import '../../widgets/loaders/lazy_loading.dart'; @@ -20,9 +20,8 @@ import '../../widgets/loaders/no_item_found.dart'; class SearchAssetPage extends StatefulWidget { /// add on route static const String id = "asset_search_page"; - final AssetSearch data; - const SearchAssetPage({Key key, this.data}) : super(key: key); + const SearchAssetPage({Key key}) : super(key: key); @override State createState() => _SearchAssetPageState(); @@ -39,8 +38,7 @@ class _SearchAssetPageState extends State { @override void initState() { - search = widget.data ?? AssetSearch(); - _searchController = TextEditingController(text: search.assetName); + _searchController = TextEditingController(); super.initState(); } @@ -57,12 +55,6 @@ class _SearchAssetPageState extends State { context.translation.assetNumber, context.translation.oracleCode, context.translation.snNumber, - context.translation.model, - context.translation.supplier, - context.translation.site, - context.translation.manufacture, - context.translation.md, - context.translation.location, ]; _deviceProvider = Provider.of(context, listen: false); @@ -142,7 +134,7 @@ class _SearchAssetPageState extends State { await _deviceProvider.getAssets(search: search, isSearchBy: true); setState(() { _searchableList.clear(); - _searchableList.addAll(_deviceProvider.devices); + _searchableList.addAll(_deviceProvider.searchDevices); }); } }, @@ -155,18 +147,8 @@ class _SearchAssetPageState extends State { onPressed: (device) { Navigator.of(context).pop(); Navigator.of(context).pop(device); - // showModalBottomSheet( - // context: context, - // isScrollControlled: true, - // shape: const RoundedRectangleBorder( - // borderRadius: BorderRadius.vertical( - // top: Radius.circular(20), - // ), - // ), - // clipBehavior: Clip.antiAliasWithSaveLayer, - // builder: (BuildContext context) => AssetDetailBottomSheet(device), - // ); }, + selectButton: Text(context.translation.select, style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context))), ); }, ).paddingOnly(start: 16, end: 16), @@ -191,7 +173,7 @@ class _SearchAssetPageState extends State { } _setValue(value) { - /// todo : check oracle code and location (no matched parameter) + /// todo : check oracle code (no matched parameter) switch (_selectedIndex) { case 0: search.assetName = value; @@ -202,21 +184,6 @@ class _SearchAssetPageState extends State { case 3: search.assetSerialNumber = value; break; - case 4: - search.model = value; - break; - case 5: - search.supplier = value; - break; - case 6: - search.site = value; - break; - case 7: - search.manufacturer = value; - break; - case 8: - search.modelDefinition = value; - break; default: break; } diff --git a/lib/views/widgets/equipment/asset_item_listview.dart b/lib/views/widgets/equipment/asset_item_listview.dart index 5155e25..aaa0baf 100644 --- a/lib/views/widgets/equipment/asset_item_listview.dart +++ b/lib/views/widgets/equipment/asset_item_listview.dart @@ -10,8 +10,9 @@ import 'package:test_sa/new_views/app_style/app_color.dart'; class AssetItemListView extends StatelessWidget { final Asset device; final Function(Asset) onPressed; + final Widget selectButton; - const AssetItemListView({Key key, this.device, this.onPressed}) : super(key: key); + const AssetItemListView({Key key, this.device, this.onPressed, this.selectButton}) : super(key: key); @override Widget build(BuildContext context) { @@ -49,7 +50,7 @@ class AssetItemListView extends StatelessWidget { children: [ "${context.translation.serialNo} : ${device.assetSerialNo}".bodyText(context).expanded, 4.width, - Row( + selectButton ?? Row( mainAxisSize: MainAxisSize.min, children: [ Text( diff --git a/lib/views/widgets/equipment/asset_picker.dart b/lib/views/widgets/equipment/asset_picker.dart index 68b72b4..701b8d9 100644 --- a/lib/views/widgets/equipment/asset_picker.dart +++ b/lib/views/widgets/equipment/asset_picker.dart @@ -5,6 +5,7 @@ import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/views/widgets/bottom_sheets/asset_detail_bottom_sheet.dart'; import 'package:test_sa/views/widgets/equipment/single_device_picker.dart'; +import 'package:test_sa/views/widgets/qr/asset_scan_qr.dart'; import '../../../models/device/asset.dart'; import '../../../new_views/app_style/app_color.dart'; @@ -42,7 +43,7 @@ class AssetPicker extends StatelessWidget { ], ), ).onPress(() async { - Asset device = await Navigator.of(context).pushNamed(MyAssetsPage.id) as Asset; + Asset device = await Navigator.of(context).push(MaterialPageRoute(builder: (context)=>AssetScanQr(title: context.translation.assetScan,))) as Asset; if (device != null) { onPick(device); } @@ -65,7 +66,7 @@ class AssetPicker extends StatelessWidget { ], ), ).onPress(() async { - Asset device = await Navigator.of(context).pushNamed(MyAssetsPage.id) as Asset; + Asset device = await Navigator.of(context).push(MaterialPageRoute(builder: (context)=>AssetScanQr(title: context.translation.assetScan,))) as Asset; if (device != null) { onPick(device); } diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/single_device_picker.dart index 443a251..98ca6dc 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/lib/views/widgets/equipment/single_device_picker.dart @@ -7,19 +7,21 @@ 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/pages/device_transfer/asset_search_screen.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/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; +import 'package:test_sa/views/widgets/qr/scan_qr.dart'; import '../../../models/device/asset.dart'; import '../../../models/device/asset_search.dart'; import '../../../new_views/app_style/app_color.dart'; import '../../pages/device_transfer/asset_filter_screen.dart'; import '../../pages/device_transfer/search_asset_page.dart'; -import '../qr/scan_qr_widget.dart'; +import '../qr/asset_scan_qr.dart'; class MyAssetsPage extends StatefulWidget { static final String id = "/single-device-Picker"; @@ -114,7 +116,7 @@ class _MyAssetsPageState extends State { ], ), ).onPress(() async { - final result = await Navigator.push(context, MaterialPageRoute(builder: (context) => SearchAssetPage(data: _searchAsset))); + final result = await Navigator.push(context, MaterialPageRoute(builder: (context) => AssetSearchScreen())); if (result != null) { _searchAsset = result; } @@ -210,7 +212,7 @@ class _MyAssetsPageState extends State { child: "qr".toSvgAsset(height: 32, fit: BoxFit.fitHeight, color: Theme.of(context).scaffoldBackgroundColor), onPressed: () async { String result = await Navigator.of(context).push( - MaterialPageRoute(builder: (_) => ScanQrWidget(title: context.translation.assetScan,)), + MaterialPageRoute(builder: (_) => ScanQr()), ) as String; _getDevice(result, isQr: true); }, diff --git a/lib/views/widgets/qr/scan_qr_widget.dart b/lib/views/widgets/qr/asset_scan_qr.dart similarity index 69% rename from lib/views/widgets/qr/scan_qr_widget.dart rename to lib/views/widgets/qr/asset_scan_qr.dart index b826e66..5007285 100644 --- a/lib/views/widgets/qr/scan_qr_widget.dart +++ b/lib/views/widgets/qr/asset_scan_qr.dart @@ -1,29 +1,34 @@ import 'dart:io'; import 'package:flutter/material.dart'; -import 'package:image_picker/image_picker.dart'; +import 'package:provider/provider.dart'; import 'package:qr_code_scanner/qr_code_scanner.dart'; -import 'package:qr_code_tools/qr_code_tools.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 '../../../controllers/providers/api/devices_provider.dart'; +import '../../../models/device/asset_search.dart'; import '../../../new_views/common_widgets/app_filled_button.dart'; import '../../../new_views/common_widgets/custom_app_bar.dart'; +import '../../pages/device_transfer/search_asset_page.dart'; -class ScanQrWidget extends StatefulWidget { - const ScanQrWidget({Key key, this.title}) : super(key: key); +class AssetScanQr extends StatefulWidget { + static const String id = "/asset-scan-qr"; + + const AssetScanQr({Key key, this.title}) : super(key: key); final String title; @override - _ScanQrWidgetState createState() => _ScanQrWidgetState(); + _AssetScanQrState createState() => _AssetScanQrState(); } -class _ScanQrWidgetState extends State { +class _AssetScanQrState extends State { Barcode result; QRViewController _controller; bool _scanDone = false; final GlobalKey qrKey = GlobalKey(debugLabel: 'QR_scanner'); + AssetProvider _devicesProvider; // In order to get hot reload to work we need to pause the camera if the platform // is android, or resume the camera if the platform is iOS. @@ -44,26 +49,22 @@ class _ScanQrWidgetState extends State { } _pickManually() async { - final picker = ImagePicker(); - final pickedFile = await picker.pickImage(source: ImageSource.gallery); + await Navigator.push(context, MaterialPageRoute(builder: (context) => const SearchAssetPage())); + } - if (pickedFile != null) { - try { - String qrData = await QrCodeToolsPlugin.decodeFrom(pickedFile.path); - if (qrData != null && !_scanDone) { - setState(() { - _scanDone = true; - }); - Navigator.of(context).pop(qrData); - } - } catch (e) { - print('Error QR code: $e'); - } - } + _getDevice(String result, {bool isQr = false}) async { + if (result == null) return; + _devicesProvider.reset(); + await _devicesProvider.getAssets( + search: AssetSearch(assetNo: result, assetSerialNumber: ""), + isQr: isQr, + ); + return _devicesProvider.devices; } @override Widget build(BuildContext context) { + _devicesProvider = Provider.of(context); return Scaffold( body: SafeArea( child: Stack( @@ -74,10 +75,11 @@ class _ScanQrWidgetState extends State { setState(() { _controller = controller; }); - controller.scannedDataStream.listen((scanData) { + controller.scannedDataStream.listen((scanData) async { if (!_scanDone) { _scanDone = true; - Navigator.of(context).pop(scanData.code); + final result = await _getDevice(scanData.code, isQr: true); + Navigator.of(context).pop(result[0]); } }); }, diff --git a/pubspec.lock b/pubspec.lock index 2cce00c..1fcfc4d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1005,14 +1005,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" - qr_code_tools: - dependency: "direct main" - description: - name: qr_code_tools - sha256: "837fe12708ae7d41786e4e07c57719682fb0bc6c2cfc40bc23232148424b1ca8" - url: "https://pub.dev" - source: hosted - version: "0.0.7" recase: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 130212f..c20a5a3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -56,7 +56,6 @@ dependencies: firebase_core: ^2.4.0 firebase_messaging: ^14.2.0 qr_code_scanner: ^1.0.1 - qr_code_tools: ^0.0.7 flutter_sound: ^9.2.13 permission_handler: ^10.2.0 rive: ^0.9.1