From a889417fe03f363593d508671bb7b39b09f35c36 Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 18 Apr 2024 21:48:45 +1000 Subject: [PATCH] Company active filters (#484) * Add support for "active" status for: - SupplierPart - Company * Add filtering options * Fix default value * Add inactive tiles * Update text and release notes --- assets/release_notes.md | 7 ++++++ lib/api.dart | 3 +++ lib/inventree/company.dart | 16 +++++++++++++- lib/l10n/app_en.arb | 3 +++ lib/widget/company/company_detail.dart | 23 ++++++++++++++++++++ lib/widget/company/company_list.dart | 17 +++++++++++++++ lib/widget/company/supplier_part_detail.dart | 23 ++++++++++++++++++++ lib/widget/company/supplier_part_list.dart | 15 ++++++++++++- 8 files changed, 105 insertions(+), 2 deletions(-) diff --git a/assets/release_notes.md b/assets/release_notes.md index a920d6aa..16a736b2 100644 --- a/assets/release_notes.md +++ b/assets/release_notes.md @@ -1,3 +1,10 @@ +### 0.14.3 - April 2024 +--- + +- Support "active" field for Company model +- Support "active" field for SupplierPart model +- Updated translations + ### 0.14.2 - February 2024 --- diff --git a/lib/api.dart b/lib/api.dart index 7028bea0..cf33bd16 100644 --- a/lib/api.dart +++ b/lib/api.dart @@ -342,6 +342,9 @@ class InvenTreeAPI { // Does the server support "null" top-level filtering for PartCategory and StockLocation endpoints? bool get supportsNullTopLevelFiltering => isConnected() && apiVersion < 174; + // Does the server support "active" status on Company and SupplierPart API endpoints? + bool get supportsCompanyActiveStatus => isConnected() && apiVersion >= 189; + // Cached list of plugins (refreshed when we connect to the server) List _plugins = []; diff --git a/lib/inventree/company.dart b/lib/inventree/company.dart index 4ebbc987..94b71b11 100644 --- a/lib/inventree/company.dart +++ b/lib/inventree/company.dart @@ -23,7 +23,7 @@ class InvenTreeCompany extends InvenTreeModel { @override Map> formFields() { - return { + Map> fields = { "name": {}, "description": {}, "website": {}, @@ -32,6 +32,12 @@ class InvenTreeCompany extends InvenTreeModel { "is_customer": {}, "currency": {}, }; + + if (InvenTreeAPI().supportsCompanyActiveStatus) { + fields["active"] = {}; + } + + return fields; } String get image => (jsondata["image"] ?? jsondata["thumbnail"] ?? InvenTreeAPI.staticImage) as String; @@ -50,6 +56,8 @@ class InvenTreeCompany extends InvenTreeModel { bool get isCustomer => getBool("is_customer"); + bool get active => getBool("active", backup: true); + int get partSuppliedCount => getInt("part_supplied"); int get partManufacturedCount => getInt("parts_manufactured"); @@ -137,6 +145,10 @@ class InvenTreeSupplierPart extends InvenTreeModel { fields["pack_quantity"] = {}; } + if (InvenTreeAPI().supportsCompanyActiveStatus) { + fields["active"] = {}; + } + return fields; } @@ -175,6 +187,8 @@ class InvenTreeSupplierPart extends InvenTreeModel { String get supplierImage => (jsondata["supplier_detail"]?["image"] ?? jsondata["supplier_detail"]["thumbnail"] ?? InvenTreeAPI.staticThumb) as String; String get SKU => getString("SKU"); + + bool get active => getBool("active", backup: true); int get partId => getInt("part"); diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 231a79e8..8c0f05c6 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -509,6 +509,9 @@ "inactive": "Inactive", "@inactive": {}, + "inactiveCompany": "This company is marked as inactive", + "@inactiveCompany": {}, + "inactiveDetail": "This part is marked as inactive", "@inactiveDetail": {}, diff --git a/lib/widget/company/company_detail.dart b/lib/widget/company/company_detail.dart index bf83ee4d..9d098aa5 100644 --- a/lib/widget/company/company_detail.dart +++ b/lib/widget/company/company_detail.dart @@ -233,6 +233,29 @@ class _CompanyDetailState extends RefreshableState { ), )); + if (!widget.company.active) { + tiles.add( + ListTile( + title: Text( + L10().inactive, + style: TextStyle( + color: COLOR_DANGER + ) + ), + subtitle: Text( + L10().inactiveCompany, + style: TextStyle( + color: COLOR_DANGER + ) + ), + leading: FaIcon( + FontAwesomeIcons.circleExclamation, + color: COLOR_DANGER + ), + ) + ); + } + if (widget.company.website.isNotEmpty) { tiles.add(ListTile( title: Text("${widget.company.website}"), diff --git a/lib/widget/company/company_list.dart b/lib/widget/company/company_list.dart index b68dffd0..1c7db1b9 100644 --- a/lib/widget/company/company_list.dart +++ b/lib/widget/company/company_list.dart @@ -2,6 +2,7 @@ import "package:flutter/material.dart"; import "package:inventree/api.dart"; +import "package:inventree/l10.dart"; import "package:inventree/inventree/company.dart"; import "package:inventree/inventree/model.dart"; @@ -58,6 +59,22 @@ class _CompanyListState extends PaginatedSearchState { _CompanyListState() : super(); + @override + Map> get filterOptions { + + Map> filters = {}; + + if (InvenTreeAPI().supportsCompanyActiveStatus) { + filters["active"] = { + "label": L10().filterActive, + "help_text": L10().filterActiveDetail, + "tristate": true, + }; + } + + return filters; + } + @override Future requestPage(int limit, int offset, Map params) async { diff --git a/lib/widget/company/supplier_part_detail.dart b/lib/widget/company/supplier_part_detail.dart index 6ca43cb2..a8268e3c 100644 --- a/lib/widget/company/supplier_part_detail.dart +++ b/lib/widget/company/supplier_part_detail.dart @@ -131,6 +131,29 @@ class _SupplierPartDisplayState extends RefreshableState get orderingOptions => {}; @override - Map> get filterOptions => {}; + Map> get filterOptions { + + Map> filters = {}; + + if (InvenTreeAPI().supportsCompanyActiveStatus) { + filters["active"] = { + "label": L10().filterActive, + "help_text": L10().filterActiveDetail, + "tristate": true, + }; + } + + return filters; + } @override Future requestPage(int limit, int offset, Map params) async {