From 83ac6041cbffb0ce48d83a94818366cf56751fa6 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Thu, 16 Apr 2020 20:56:59 +1000 Subject: [PATCH] Make search widget "refreshable" - Return results for Part - Return results for StockItem --- lib/inventree/model.dart | 21 +++++--- lib/widget/location_display.dart | 1 - lib/widget/search.dart | 90 +++++++++++++++++++++++++++----- 3 files changed, 91 insertions(+), 21 deletions(-) diff --git a/lib/inventree/model.dart b/lib/inventree/model.dart index 96847ee6..58687de6 100644 --- a/lib/inventree/model.dart +++ b/lib/inventree/model.dart @@ -182,7 +182,7 @@ class InvenTreeModel { } // Return list of objects from the database, with optional filters - Future> list(BuildContext context, {Map filters}) async { + Future> list(BuildContext context, {Map filters, bool dialog=true}) async { if (filters == null) { filters = {}; @@ -201,18 +201,25 @@ class InvenTreeModel { // TODO - Add "timeout" // TODO - Add error catching - showProgressDialog(context, "Requesting Data", "Requesting ${NAME} data from server"); + if (dialog) { + showProgressDialog(context, "Requesting Data", "Requesting ${NAME} data from server"); + } var response = await api.get(URL, params:params) .timeout(Duration(seconds: 10)) .catchError((e) { - hideProgressDialog(context); + if (dialog) { + hideProgressDialog(context); + } if (e is TimeoutException) { - showErrorDialog(context, "Timeout", "No response from server"); + if (dialog) { + showErrorDialog(context, "Timeout", "No response from server"); + } } else { - showErrorDialog(context, "Error", e.toString()); + // Re-throw the error + throw e; } return null; @@ -222,7 +229,9 @@ class InvenTreeModel { return null; } - hideProgressDialog(context); + if (dialog) { + hideProgressDialog(context); + } // A list of "InvenTreeModel" items List results = new List(); diff --git a/lib/widget/location_display.dart b/lib/widget/location_display.dart index f8ab0c8d..4382e404 100644 --- a/lib/widget/location_display.dart +++ b/lib/widget/location_display.dart @@ -1,7 +1,6 @@ import 'package:InvenTree/api.dart'; import 'package:InvenTree/inventree/stock.dart'; import 'package:InvenTree/preferences.dart'; -import 'package:InvenTree/widget/drawer.dart'; import 'package:InvenTree/widget/stock_detail.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widget/search.dart b/lib/widget/search.dart index 52bf164a..2b3e2c84 100644 --- a/lib/widget/search.dart +++ b/lib/widget/search.dart @@ -1,7 +1,12 @@ -import 'package:InvenTree/widget/drawer.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; + +import 'package:InvenTree/widget/refreshable_state.dart'; +import 'package:InvenTree/inventree/part.dart'; +import 'package:InvenTree/inventree/stock.dart'; + class SearchWidget extends StatefulWidget { @@ -10,24 +15,81 @@ class SearchWidget extends StatefulWidget { } -class _SearchState extends State { +class _SearchState extends RefreshableState { + + String _searchText = ""; + + List _parts = List(); + List _stockItems = List(); @override - Widget build(BuildContext context) { + String getAppBarTitle(BuildContext context) { + return "Search"; + } - return Scaffold( - appBar: AppBar( - title: Text("Search"), - ), - drawer: new InvenTreeDrawer(context), - body: Center( - child: ListView( - children: [ + Future _search(BuildContext context) { + print("Search: $_searchText}"); - ], - ) + // Ignore if the search text is empty + if (_searchText.isNotEmpty) { + + // Search for parts + InvenTreePart().list(context, filters: {"search": _searchText}).then((var parts) { + setState(() { + _parts.clear(); + for (var part in parts) { + if (part is InvenTreePart) { + _parts.add(part); + } + } + + print("Matched ${_parts.length} parts"); + }); + }); + + // Search for stock items + InvenTreeStockItem().list(context, filters: {"search": _searchText}).then((var items) { + setState(() { + _stockItems.clear(); + for (var item in items) { + if (item is InvenTreeStockItem) { + _stockItems.add(item); + } + } + + print("Matched ${_stockItems.length} stock items"); + }); + }); + } + } + + @override + Future request(BuildContext context) async { + _search(context); + } + + @override + Widget getBody(BuildContext context) { + + return Center( + child: ListView( + children: [ + TextField( + decoration: InputDecoration( + hintText: "Search" + ), + onChanged: (String text) { + _searchText = text; + } + ), + RaisedButton( + child: Text("Search"), + onPressed: () { + _search(context); + }, + ), + ] ) ); - } } \ No newline at end of file