diff --git a/lib/inventree/model.dart b/lib/inventree/model.dart index 57f0c2f9..330bf3bb 100644 --- a/lib/inventree/model.dart +++ b/lib/inventree/model.dart @@ -86,9 +86,15 @@ class InvenTreeModel { // Search this Model type in the database - Future> search(BuildContext context, String searchTerm) async { + Future> search(BuildContext context, String searchTerm, {Map filters}) async { - final results = list(context, filters: {"cascade": "true", "search": searchTerm}); + if (filters == null) { + filters = {}; + } + + filters["search"] = searchTerm; + + final results = list(context, filters: filters); return results; diff --git a/lib/l10n b/lib/l10n index 47cab0e5..045288ea 160000 --- a/lib/l10n +++ b/lib/l10n @@ -1 +1 @@ -Subproject commit 47cab0e55b09fc0bfe80ee841e2f8b653d18bb0a +Subproject commit 045288ea2a1d6b2248de084fdbacafc2256e1313 diff --git a/lib/widget/category_display.dart b/lib/widget/category_display.dart index 10c9d37c..51576969 100644 --- a/lib/widget/category_display.dart +++ b/lib/widget/category_display.dart @@ -3,6 +3,7 @@ import 'package:InvenTree/api.dart'; import 'package:InvenTree/inventree/part.dart'; import 'package:InvenTree/preferences.dart'; import 'package:InvenTree/widget/progress.dart'; +import 'package:InvenTree/widget/search.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; @@ -44,6 +45,15 @@ class _CategoryDisplayState extends RefreshableState { icon: FaIcon(FontAwesomeIcons.edit), tooltip: I18N.of(context).edit, onPressed: _editCategoryDialog, + ), + IconButton( + icon: FaIcon(FontAwesomeIcons.search), + onPressed: () { + showSearch( + context: context, + delegate: PartSearchDelegate(filters: {"category": "${category.pk}"}) + ); + } ) ]; } diff --git a/lib/widget/search.dart b/lib/widget/search.dart index c7637408..7c50f8ff 100644 --- a/lib/widget/search.dart +++ b/lib/widget/search.dart @@ -19,6 +19,15 @@ class PartSearchDelegate extends SearchDelegate { bool _searching = false; + // Custom filters for the part search + Map filters = {}; + + PartSearchDelegate({this.filters}) { + if (filters == null) { + filters = {}; + } + } + // List of part results List partResults = []; @@ -37,7 +46,10 @@ class PartSearchDelegate extends SearchDelegate { showResults(context); - final results = await InvenTreePart().search(context, query); + // Enable cascading part search by default + filters["cascade"] = "true"; + + final results = await InvenTreePart().search(context, query, filters: filters); partResults.clear(); @@ -158,89 +170,4 @@ class PartSearchDelegate extends SearchDelegate { assert(theme != null); return theme; } -} - - -class SearchWidget extends StatefulWidget { - - @override - _SearchState createState() => _SearchState(); -} - - -class _SearchState extends RefreshableState { - - String _searchText = ""; - - List _parts = List(); - List _stockItems = List(); - - @override - String getAppBarTitle(BuildContext context) => I18N.of(context).search; - - 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: I18N.of(context).search, - ), - onChanged: (String text) { - _searchText = text; - } - ), - RaisedButton( - child: Text(I18N.of(context).search), - onPressed: () { - _search(context); - }, - ), - ] - ) - ); - } } \ No newline at end of file