mirror of
https://github.com/inventree/inventree-app.git
synced 2025-05-01 06:56:50 +00:00
Search fix (#208)
* Prevent setState if search widget is not mounted * Prevent search textbox from disappearing
This commit is contained in:
parent
38b34e0fd9
commit
c25175ac54
@ -36,6 +36,8 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
|
|||||||
|
|
||||||
_SearchDisplayState(this.hasAppBar) : super();
|
_SearchDisplayState(this.hasAppBar) : super();
|
||||||
|
|
||||||
|
final _formKey = GlobalKey<FormState>();
|
||||||
|
|
||||||
final bool hasAppBar;
|
final bool hasAppBar;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -105,6 +107,9 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
|
|||||||
} else {
|
} else {
|
||||||
debounceTimer = Timer(Duration(milliseconds: 250), () {
|
debounceTimer = Timer(Duration(milliseconds: 250), () {
|
||||||
search(text);
|
search(text);
|
||||||
|
if (!_focusNode.hasFocus) {
|
||||||
|
_focusNode.requestFocus();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -120,6 +125,10 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
|
|||||||
|
|
||||||
var api = InvenTreeAPI();
|
var api = InvenTreeAPI();
|
||||||
|
|
||||||
|
if (!mounted) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
setState(() {
|
setState(() {
|
||||||
// Do not search on an empty string
|
// Do not search on an empty string
|
||||||
nPartResults = 0;
|
nPartResults = 0;
|
||||||
@ -140,10 +149,12 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
|
|||||||
if (api.checkPermission("part", "view")) {
|
if (api.checkPermission("part", "view")) {
|
||||||
InvenTreePart().count(searchQuery: term).then((int n) {
|
InvenTreePart().count(searchQuery: term).then((int n) {
|
||||||
if (term == searchController.text) {
|
if (term == searchController.text) {
|
||||||
setState(() {
|
if (mounted) {
|
||||||
nPartResults = n;
|
setState(() {
|
||||||
nSearchResults++;
|
nPartResults = n;
|
||||||
});
|
nSearchResults++;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -152,10 +163,12 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
|
|||||||
if (api.checkPermission("part_category", "view")) {
|
if (api.checkPermission("part_category", "view")) {
|
||||||
InvenTreePartCategory().count(searchQuery: term,).then((int n) {
|
InvenTreePartCategory().count(searchQuery: term,).then((int n) {
|
||||||
if (term == searchController.text) {
|
if (term == searchController.text) {
|
||||||
setState(() {
|
if (mounted) {
|
||||||
nCategoryResults = n;
|
setState(() {
|
||||||
nSearchResults++;
|
nCategoryResults = n;
|
||||||
});
|
nSearchResults++;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -164,10 +177,12 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
|
|||||||
if (api.checkPermission("stock", "view")) {
|
if (api.checkPermission("stock", "view")) {
|
||||||
InvenTreeStockItem().count(searchQuery: term).then((int n) {
|
InvenTreeStockItem().count(searchQuery: term).then((int n) {
|
||||||
if (term == searchController.text) {
|
if (term == searchController.text) {
|
||||||
setState(() {
|
if (mounted) {
|
||||||
nStockResults = n;
|
setState(() {
|
||||||
nSearchResults++;
|
nStockResults = n;
|
||||||
});
|
nSearchResults++;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -176,11 +191,12 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
|
|||||||
if (api.checkPermission("stock_location", "view")) {
|
if (api.checkPermission("stock_location", "view")) {
|
||||||
InvenTreeStockLocation().count(searchQuery: term).then((int n) {
|
InvenTreeStockLocation().count(searchQuery: term).then((int n) {
|
||||||
if (term == searchController.text) {
|
if (term == searchController.text) {
|
||||||
setState(() {
|
if (mounted) {
|
||||||
nLocationResults = n;
|
setState(() {
|
||||||
|
nLocationResults = n;
|
||||||
nSearchResults++;
|
nSearchResults++;
|
||||||
});
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -209,10 +225,12 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
|
|||||||
}
|
}
|
||||||
).then((int n) {
|
).then((int n) {
|
||||||
if (term == searchController.text) {
|
if (term == searchController.text) {
|
||||||
setState(() {
|
if (mounted) {
|
||||||
nPurchaseOrderResults = n;
|
setState(() {
|
||||||
nSearchResults++;
|
nPurchaseOrderResults = n;
|
||||||
});
|
nSearchResults++;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -229,13 +247,18 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
|
|||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
hintText: L10().queryEmpty,
|
hintText: L10().queryEmpty,
|
||||||
),
|
),
|
||||||
|
key: _formKey,
|
||||||
readOnly: false,
|
readOnly: false,
|
||||||
autofocus: true,
|
autofocus: false,
|
||||||
autocorrect: false,
|
autocorrect: false,
|
||||||
focusNode: _focusNode,
|
focusNode: _focusNode,
|
||||||
controller: searchController,
|
controller: searchController,
|
||||||
onChanged: (String text) {
|
onChanged: (String text) {
|
||||||
onSearchTextChanged(text);
|
onSearchTextChanged(text);
|
||||||
|
_focusNode.requestFocus();
|
||||||
|
},
|
||||||
|
onFieldSubmitted: (String text) {
|
||||||
|
_focusNode.requestFocus();
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
trailing: GestureDetector(
|
trailing: GestureDetector(
|
||||||
@ -245,6 +268,7 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
|
|||||||
),
|
),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
searchController.clear();
|
searchController.clear();
|
||||||
|
_focusNode.requestFocus();
|
||||||
onSearchTextChanged("", immediate: true);
|
onSearchTextChanged("", immediate: true);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user