2
0
mirror of https://github.com/inventree/inventree-app.git synced 2025-05-08 02:08:55 +00:00

Add custom search context for "category"

This commit is contained in:
Oliver Walters 2021-02-13 00:40:21 +11:00
parent 36f0d7b120
commit 858464d301
4 changed files with 32 additions and 89 deletions

View File

@ -86,9 +86,15 @@ class InvenTreeModel {
// Search this Model type in the database
Future<List<InvenTreeModel>> search(BuildContext context, String searchTerm) async {
Future<List<InvenTreeModel>> search(BuildContext context, String searchTerm, {Map<String, String> 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;

@ -1 +1 @@
Subproject commit 47cab0e55b09fc0bfe80ee841e2f8b653d18bb0a
Subproject commit 045288ea2a1d6b2248de084fdbacafc2256e1313

View File

@ -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<CategoryDisplayWidget> {
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}"})
);
}
)
];
}

View File

@ -19,6 +19,15 @@ class PartSearchDelegate extends SearchDelegate<InvenTreePart> {
bool _searching = false;
// Custom filters for the part search
Map<String, String> filters = {};
PartSearchDelegate({this.filters}) {
if (filters == null) {
filters = {};
}
}
// List of part results
List<InvenTreePart> partResults = [];
@ -37,7 +46,10 @@ class PartSearchDelegate extends SearchDelegate<InvenTreePart> {
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<InvenTreePart> {
assert(theme != null);
return theme;
}
}
class SearchWidget extends StatefulWidget {
@override
_SearchState createState() => _SearchState();
}
class _SearchState extends RefreshableState<SearchWidget> {
String _searchText = "";
List<InvenTreePart> _parts = List<InvenTreePart>();
List<InvenTreeStockItem> _stockItems = List<InvenTreeStockItem>();
@override
String getAppBarTitle(BuildContext context) => I18N.of(context).search;
Future<void> _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<void> request(BuildContext context) async {
_search(context);
}
@override
Widget getBody(BuildContext context) {
return Center(
child: ListView(
children: <Widget>[
TextField(
decoration: InputDecoration(
hintText: I18N.of(context).search,
),
onChanged: (String text) {
_searchText = text;
}
),
RaisedButton(
child: Text(I18N.of(context).search),
onPressed: () {
_search(context);
},
),
]
)
);
}
}