2
0
mirror of https://github.com/inventree/inventree-app.git synced 2025-07-01 19:30:44 +00:00

Format Code and Add Format Checks to CI (#643)

* Remove unused lib/generated/i18n.dart

* Use `fvm dart format .`

* Add contributing guidelines

* Enforce dart format

* Add `dart format off` directive to generated files
This commit is contained in:
Ben Hagen
2025-06-24 01:55:01 +02:00
committed by GitHub
parent e9db6532e4
commit 4444884afa
100 changed files with 5332 additions and 5592 deletions

View File

@ -23,21 +23,17 @@ import "package:inventree/widget/order/sales_order_list.dart";
import "package:inventree/widget/company/company_list.dart";
import "package:inventree/widget/company/supplier_part_list.dart";
// Widget for performing database-wide search
class SearchWidget extends StatefulWidget {
const SearchWidget(this.hasAppbar);
final bool hasAppbar;
@override
_SearchDisplayState createState() => _SearchDisplayState(hasAppbar);
}
class _SearchDisplayState extends RefreshableState<SearchWidget> {
_SearchDisplayState(this.hasAppBar) : super();
final _formKey = GlobalKey<FormState>();
@ -80,7 +76,6 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
* Determine if the search is still running
*/
bool isSearching() {
if (searchController.text.isEmpty) {
return false;
}
@ -128,7 +123,6 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
// Callback when the text is being edited
// Incorporates a debounce timer to restrict search frequency
void onSearchTextChanged(String text, {bool immediate = false}) {
if (debounceTimer?.isActive ?? false) {
debounceTimer!.cancel();
}
@ -151,8 +145,7 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
* }
* }
*/
int getSearchResultCount(Map <String, dynamic> results, String key) {
int getSearchResultCount(Map<String, dynamic> results, String key) {
dynamic result = results[key];
if (result == null || result is! Map) {
@ -170,43 +163,70 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
// Actually perform the search query
Future<void> _perform_search(Map<String, dynamic> body) async {
InvenTreeAPI().post(
"search/",
body: body,
expectedStatusCode: 200).then((APIResponse response) {
InvenTreeAPI().post("search/", body: body, expectedStatusCode: 200).then((
APIResponse response,
) {
String searchTerm = (body["search"] ?? "").toString();
String searchTerm = (body["search"] ?? "").toString();
// Only update if the results correspond to the current search term
if (searchTerm == searchController.text && mounted) {
decrementPendingSearches();
// Only update if the results correspond to the current search term
if (searchTerm == searchController.text && mounted) {
Map<String, dynamic> results = {};
decrementPendingSearches();
if (response.isValid() && response.data is Map<String, dynamic>) {
results = response.data as Map<String, dynamic>;
Map<String, dynamic> results = {};
setState(() {
nPartResults = getSearchResultCount(
results,
InvenTreePart.MODEL_TYPE,
);
nCategoryResults = getSearchResultCount(
results,
InvenTreePartCategory.MODEL_TYPE,
);
nStockResults = getSearchResultCount(
results,
InvenTreeStockItem.MODEL_TYPE,
);
nLocationResults = getSearchResultCount(
results,
InvenTreeStockLocation.MODEL_TYPE,
);
nPurchaseOrderResults = getSearchResultCount(
results,
InvenTreePurchaseOrder.MODEL_TYPE,
);
nSalesOrderResults = getSearchResultCount(
results,
InvenTreeSalesOrder.MODEL_TYPE,
);
nSupplierPartResults = getSearchResultCount(
results,
InvenTreeSupplierPart.MODEL_TYPE,
);
nManufacturerPartResults = getSearchResultCount(
results,
InvenTreeManufacturerPart.MODEL_TYPE,
);
nCompanyResults = getSearchResultCount(
results,
InvenTreeCompany.MODEL_TYPE,
);
if (response.isValid() && response.data is Map<String, dynamic>) {
results = response.data as Map<String, dynamic>;
setState(() {
nPartResults = getSearchResultCount(results, InvenTreePart.MODEL_TYPE);
nCategoryResults = getSearchResultCount(results, InvenTreePartCategory.MODEL_TYPE);
nStockResults = getSearchResultCount(results, InvenTreeStockItem.MODEL_TYPE);
nLocationResults = getSearchResultCount(results, InvenTreeStockLocation.MODEL_TYPE);
nPurchaseOrderResults = getSearchResultCount(results, InvenTreePurchaseOrder.MODEL_TYPE);
nSalesOrderResults = getSearchResultCount(results, InvenTreeSalesOrder.MODEL_TYPE);
nSupplierPartResults = getSearchResultCount(results, InvenTreeSupplierPart.MODEL_TYPE);
nManufacturerPartResults = getSearchResultCount(results, InvenTreeManufacturerPart.MODEL_TYPE);
nCompanyResults = getSearchResultCount(results, InvenTreeCompany.MODEL_TYPE);
// Special case for company search results
nCustomerResults = getSearchResultCount(results, "customer");
nManufacturerResults = getSearchResultCount(results, "manufacturer");
nSupplierResults = getSearchResultCount(results, "supplier");
});
} else {
resetSearchResults();
}
// Special case for company search results
nCustomerResults = getSearchResultCount(results, "customer");
nManufacturerResults = getSearchResultCount(
results,
"manufacturer",
);
nSupplierResults = getSearchResultCount(results, "supplier");
});
} else {
resetSearchResults();
}
}
});
}
@ -237,7 +257,6 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
// Consolidated search allows us to perform *all* searches in a single query
if (api.supportsConsolidatedSearch) {
Map<String, dynamic> body = {
"limit": 1,
"search": term,
@ -262,17 +281,13 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
}
if (body.isNotEmpty) {
if (mounted) {
setState(() {
nPendingSearches = 1;
});
_search_query = CancelableOperation.fromFuture(
_perform_search(body),
);
_search_query = CancelableOperation.fromFuture(_perform_search(body));
}
}
} else {
legacySearch(term);
@ -283,7 +298,6 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
* Perform "legacy" search (without consolidated search API endpoint
*/
Future<void> legacySearch(String term) async {
// Search parts
if (InvenTreePart().canView) {
nPendingSearches++;
@ -302,7 +316,7 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
// Search part categories
if (InvenTreePartCategory().canView) {
nPendingSearches++;
InvenTreePartCategory().count(searchQuery: term,).then((int n) {
InvenTreePartCategory().count(searchQuery: term).then((int n) {
if (term == searchController.text) {
if (mounted) {
decrementPendingSearches();
@ -346,37 +360,31 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
// Search purchase orders
if (InvenTreePurchaseOrder().canView) {
nPendingSearches++;
InvenTreePurchaseOrder().count(
searchQuery: term,
filters: {
"outstanding": "true"
}
).then((int n) {
if (term == searchController.text) {
if (mounted) {
decrementPendingSearches();
setState(() {
nPurchaseOrderResults = n;
});
}
}
});
nPendingSearches++;
InvenTreePurchaseOrder()
.count(searchQuery: term, filters: {"outstanding": "true"})
.then((int n) {
if (term == searchController.text) {
if (mounted) {
decrementPendingSearches();
setState(() {
nPurchaseOrderResults = n;
});
}
}
});
}
}
@override
List<Widget> getTiles(BuildContext context) {
List<Widget> tiles = [];
// Search input
tiles.add(
ListTile(
title: TextFormField(
decoration: InputDecoration(
hintText: L10().queryEmpty,
),
decoration: InputDecoration(hintText: L10().queryEmpty),
key: _formKey,
readOnly: false,
autofocus: true,
@ -385,12 +393,13 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
onChanged: (String text) {
onSearchTextChanged(text);
},
onFieldSubmitted: (String text) {
},
onFieldSubmitted: (String text) {},
),
trailing: GestureDetector(
child: Icon(
searchController.text.isEmpty ? TablerIcons.search : TablerIcons.backspace,
searchController.text.isEmpty
? TablerIcons.search
: TablerIcons.backspace,
color: searchController.text.isEmpty ? COLOR_ACTION : COLOR_DANGER,
),
onTap: () {
@ -398,8 +407,7 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
onSearchTextChanged("", immediate: true);
},
),
)
),
);
String query = searchController.text;
@ -415,17 +423,13 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
trailing: Text("${nPartResults}"),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => PartList(
{
"original_search": query
}
)
)
context,
MaterialPageRoute(
builder: (context) => PartList({"original_search": query}),
),
);
}
)
},
),
);
}
@ -440,15 +444,12 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => PartCategoryList(
{
"original_search": query
}
)
)
builder: (context) =>
PartCategoryList({"original_search": query}),
),
);
},
)
),
);
}
@ -463,15 +464,11 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => StockItemList(
{
"original_search": query,
}
)
)
builder: (context) => StockItemList({"original_search": query}),
),
);
},
)
),
);
}
@ -486,15 +483,12 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => StockLocationList(
{
"original_search": query
}
)
)
builder: (context) =>
StockLocationList({"original_search": query}),
),
);
},
)
),
);
}
@ -510,14 +504,12 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
context,
MaterialPageRoute(
builder: (context) => PurchaseOrderListWidget(
filters: {
"original_search": query
}
)
)
filters: {"original_search": query},
),
),
);
},
)
),
);
}
@ -532,15 +524,12 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SalesOrderListWidget(
filters: {
"original_search": query
}
)
)
builder: (context) =>
SalesOrderListWidget(filters: {"original_search": query}),
),
);
},
)
),
);
}
@ -555,16 +544,13 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => CompanyListWidget(
L10().companies,
{
"original_search": query
}
)
)
builder: (context) => CompanyListWidget(L10().companies, {
"original_search": query,
}),
),
);
},
)
),
);
}
@ -579,17 +565,14 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => CompanyListWidget(
L10().customers,
{
"original_search": query,
"is_customer": "true"
}
)
)
builder: (context) => CompanyListWidget(L10().customers, {
"original_search": query,
"is_customer": "true",
}),
),
);
},
)
),
);
}
@ -604,17 +587,14 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => CompanyListWidget(
L10().manufacturers,
{
"original_search": query,
"is_manufacturer": "true"
}
)
)
builder: (context) => CompanyListWidget(L10().manufacturers, {
"original_search": query,
"is_manufacturer": "true",
}),
),
);
},
)
),
);
}
@ -629,17 +609,14 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => CompanyListWidget(
L10().suppliers,
{
"original_search": query,
"is_supplier": "true"
}
)
)
builder: (context) => CompanyListWidget(L10().suppliers, {
"original_search": query,
"is_supplier": "true",
}),
),
);
},
)
),
);
}
@ -654,15 +631,12 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SupplierPartList(
{
"original_search": query
}
)
)
builder: (context) =>
SupplierPartList({"original_search": query}),
),
);
},
)
),
);
}
@ -672,7 +646,7 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
title: Text(L10().searching),
leading: Icon(TablerIcons.search),
trailing: CircularProgressIndicator(),
)
),
);
}
@ -684,7 +658,7 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
style: TextStyle(fontStyle: FontStyle.italic),
),
leading: Icon(TablerIcons.zoom_cancel),
)
),
);
} else {
for (Widget result in results) {
@ -694,5 +668,4 @@ class _SearchDisplayState extends RefreshableState<SearchWidget> {
return tiles;
}
}