From 08e01a729bc5c08b45d3cdd2fae3867a5dac409e Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 11 Dec 2024 15:48:24 +1100 Subject: [PATCH 1/6] Updates (cherry picked from commit 94125667d9cdd1bd486aa58a2c4908c143b47225) --- assets/release_notes.md | 1 + lib/api.dart | 4 ++++ lib/inventree/purchase_order.dart | 7 +++++++ lib/l10n/app_en.arb | 3 +++ 4 files changed, 15 insertions(+) diff --git a/assets/release_notes.md b/assets/release_notes.md index e4367d53..c72bd2c1 100644 --- a/assets/release_notes.md +++ b/assets/release_notes.md @@ -2,6 +2,7 @@ --- - Fixes barcode scanning bug which prevents scanning of DataMatrix codes +- Display "destination" information in PurchaseOrder detail view - Adds "assigned to me" filter for Purchase Order list - Adds "assigned to me" filter for Sales Order list diff --git a/lib/api.dart b/lib/api.dart index 704b7df1..d686e1b1 100644 --- a/lib/api.dart +++ b/lib/api.dart @@ -333,6 +333,10 @@ class InvenTreeAPI { // Ref: https://github.com/inventree/InvenTree/pull/7420 bool get supportsModernAttachments => isConnected() && apiVersion >= 207; + // Does the server support the "destination" field on the PurchaseOrder model? + // Ref: https://github.com/inventree/InvenTree/pull/8403 + bool get supportsPurchaseOrderDestination => isConnected() && apiVersion >= 276; + // Cached list of plugins (refreshed when we connect to the server) List _plugins = []; diff --git a/lib/inventree/purchase_order.dart b/lib/inventree/purchase_order.dart index e4723881..9a4f4943 100644 --- a/lib/inventree/purchase_order.dart +++ b/lib/inventree/purchase_order.dart @@ -40,6 +40,7 @@ class InvenTreePurchaseOrder extends InvenTreeOrder { "supplier_reference": {}, "description": {}, "project_code": {}, + "destination": {}, "target_date": {}, "link": {}, "responsible": {}, @@ -54,6 +55,10 @@ class InvenTreePurchaseOrder extends InvenTreeOrder { fields.remove("project_code"); } + if (!InvenTreeAPI().supportsPurchaseOrderDestination) { + fields.remove("destination"); + } + return fields; } @@ -87,6 +92,8 @@ class InvenTreePurchaseOrder extends InvenTreeOrder { String get supplierReference => getString("supplier_reference"); + int get destinationId => getInt("destination"); + bool get isOpen => api.PurchaseOrderStatus.isNameIn(status, ["PENDING", "PLACED", "ON_HOLD"]); bool get isPending => api.PurchaseOrderStatus.isNameIn(status, ["PENDING", "ON_HOLD"]); diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 3ce98666..72d5d92f 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -310,6 +310,9 @@ "description": "Description", "@description": {}, + "destination": "Destination", + "@destination": {}, + "destroyed": "Destroyed", "@destroyed": {}, From e2a688315d422a9547bb1a1c67c82c2b5bb748b1 Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 11 Dec 2024 15:59:22 +1100 Subject: [PATCH 2/6] Display "destination" in purchase order detail (cherry picked from commit d0e4bf0246412938050f5de5a01b0b987cf9a0a2) --- lib/inventree/purchase_order.dart | 2 +- lib/widget/order/purchase_order_detail.dart | 54 +++++++++++++++++++-- 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/lib/inventree/purchase_order.dart b/lib/inventree/purchase_order.dart index 9a4f4943..b224458d 100644 --- a/lib/inventree/purchase_order.dart +++ b/lib/inventree/purchase_order.dart @@ -226,7 +226,7 @@ class InvenTreePOLineItem extends InvenTreeOrderLine { String get purchasePriceCurrency => getString("purchase_price_currency"); - int get destination => getInt("destination"); + int get destinationId => getInt("destination"); Map get destinationDetail => getMap("destination_detail"); } diff --git a/lib/widget/order/purchase_order_detail.dart b/lib/widget/order/purchase_order_detail.dart index 29dc68bf..89efb4da 100644 --- a/lib/widget/order/purchase_order_detail.dart +++ b/lib/widget/order/purchase_order_detail.dart @@ -1,8 +1,6 @@ import "package:flutter/material.dart"; import "package:flutter_speed_dial/flutter_speed_dial.dart"; import "package:flutter_tabler_icons/flutter_tabler_icons.dart"; -import "package:inventree/widget/dialogs.dart"; -import "package:inventree/widget/order/po_line_list.dart"; import "package:inventree/app_colors.dart"; import "package:inventree/barcode/barcode.dart"; @@ -10,8 +8,16 @@ import "package:inventree/barcode/purchase_order.dart"; import "package:inventree/helpers.dart"; import "package:inventree/l10.dart"; +import "package:inventree/inventree/model.dart"; import "package:inventree/inventree/company.dart"; +import "package:inventree/inventree/stock.dart"; import "package:inventree/inventree/purchase_order.dart"; + +import "package:inventree/widget/dialogs.dart"; +import "package:inventree/widget/stock/location_display.dart"; +import "package:inventree/widget/order/po_line_list.dart"; + + import "package:inventree/widget/attachment_widget.dart"; import "package:inventree/widget/company/company_detail.dart"; import "package:inventree/widget/notes_widget.dart"; @@ -42,6 +48,8 @@ class _PurchaseOrderDetailState extends RefreshableState lines = []; + InvenTreeStockLocation? destination; + int completedLines = 0; int attachmentCount = 0; @@ -258,6 +266,28 @@ class _PurchaseOrderDetailState extends RefreshableState 0) { + InvenTreeStockLocation().get(widget.order.destinationId).then((InvenTreeModel? loc) { + if (mounted) { + if (loc != null && loc is InvenTreeStockLocation) { + setState(() { + destination = loc; + }); + } else { + setState(() { + destination = null; + }); + } + } + }); + } else { + if (mounted) { + setState(() { + destination = null; + }); + } + } } // Edit the currently displayed PurchaseOrder @@ -348,6 +378,23 @@ class _PurchaseOrderDetailState extends RefreshableState { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => LocationDisplayWidget(destination!) + ) + ) + } + )); + } + Color lineColor = completedLines < widget.order.lineItemCount ? COLOR_WARNING : COLOR_SUCCESS; tiles.add(ListTile( @@ -444,5 +491,4 @@ class _PurchaseOrderDetailState extends RefreshableState Date: Wed, 11 Dec 2024 15:59:32 +1100 Subject: [PATCH 3/6] Display "destination" in purchase order line item detail (cherry picked from commit 818f8cf7098df5dd83e86b9102288f22556c8700) --- lib/widget/order/po_line_detail.dart | 53 ++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/lib/widget/order/po_line_detail.dart b/lib/widget/order/po_line_detail.dart index bddeb4db..7689c5aa 100644 --- a/lib/widget/order/po_line_detail.dart +++ b/lib/widget/order/po_line_detail.dart @@ -5,14 +5,18 @@ import "package:flutter_tabler_icons/flutter_tabler_icons.dart"; import "package:inventree/api_form.dart"; import "package:inventree/app_colors.dart"; import "package:inventree/helpers.dart"; +import "package:inventree/inventree/model.dart"; import "package:inventree/l10.dart"; -import "package:inventree/widget/progress.dart"; -import "package:inventree/widget/part/part_detail.dart"; -import "package:inventree/widget/refreshable_state.dart"; import "package:inventree/inventree/company.dart"; import "package:inventree/inventree/part.dart"; import "package:inventree/inventree/purchase_order.dart"; +import "package:inventree/inventree/stock.dart"; + +import "package:inventree/widget/progress.dart"; +import "package:inventree/widget/part/part_detail.dart"; +import "package:inventree/widget/stock/location_display.dart"; +import "package:inventree/widget/refreshable_state.dart"; import "package:inventree/widget/snacks.dart"; import "package:inventree/widget/company/supplier_part_detail.dart"; @@ -38,6 +42,8 @@ class _POLineDetailWidgetState extends RefreshableState { _POLineDetailWidgetState(); + InvenTreeStockLocation? destination; + @override String getAppBarTitle() => L10().lineItem; @@ -84,6 +90,29 @@ class _POLineDetailWidgetState extends RefreshableState { @override Future request(BuildContext context) async { await widget.item.reload(); + + if (widget.item.destinationId > 0) { + InvenTreeStockLocation().get(widget.item.destinationId).then((InvenTreeModel? loc) { + if (mounted) { + if (loc != null && loc is InvenTreeStockLocation) { + setState(() { + destination = loc; + }); + } else { + setState(() { + destination = null; + }); + } + } + }); + } else { + if (mounted) { + setState(() { + destination = null; + }); + } + } + } // Callback to edit this line item @@ -199,6 +228,24 @@ class _POLineDetailWidgetState extends RefreshableState { ) ); + // Destination + if (destination != null) { + tiles.add(ListTile( + title: Text(L10().destination), + subtitle: Text(destination!.name), + leading: Icon(TablerIcons.map_pin, color: COLOR_ACTION), + onTap: () => + { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => LocationDisplayWidget(destination!) + ) + ) + } + )); + } + // Received quantity tiles.add( ListTile( From d016a663d8d9a0c4fd385d41f418e4424a295b46 Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 11 Dec 2024 16:07:00 +1100 Subject: [PATCH 4/6] Add order reference to app bar (cherry picked from commit 260bfb56a225cb653d630a81098142b80569e302) --- lib/widget/order/purchase_order_detail.dart | 10 +++++++++- lib/widget/order/sales_order_detail.dart | 10 +++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/widget/order/purchase_order_detail.dart b/lib/widget/order/purchase_order_detail.dart index 89efb4da..9040228b 100644 --- a/lib/widget/order/purchase_order_detail.dart +++ b/lib/widget/order/purchase_order_detail.dart @@ -58,7 +58,15 @@ class _PurchaseOrderDetailState extends RefreshableState L10().purchaseOrder; + String getAppBarTitle() { + String title = L10().purchaseOrder; + + if (widget.order.reference.isNotEmpty) { + title += " - ${widget.order.reference}"; + } + + return title; + } @override List appBarActions(BuildContext context) { diff --git a/lib/widget/order/sales_order_detail.dart b/lib/widget/order/sales_order_detail.dart index 30c218ed..54c6800d 100644 --- a/lib/widget/order/sales_order_detail.dart +++ b/lib/widget/order/sales_order_detail.dart @@ -46,7 +46,15 @@ class _SalesOrderDetailState extends RefreshableState { int attachmentCount = 0; @override - String getAppBarTitle() => L10().salesOrder; + String getAppBarTitle() { + String title = L10().salesOrder; + + if (widget.order.reference.isNotEmpty) { + title += " - ${widget.order.reference}"; + } + + return title; + } @override List appBarActions(BuildContext context) { From 52a1eedc7ef868c80b600d7a051411fa14e87a02 Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 11 Dec 2024 16:28:43 +1100 Subject: [PATCH 5/6] Update company display --- lib/widget/company/company_detail.dart | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/widget/company/company_detail.dart b/lib/widget/company/company_detail.dart index 65f65d10..c0ab4814 100644 --- a/lib/widget/company/company_detail.dart +++ b/lib/widget/company/company_detail.dart @@ -48,7 +48,15 @@ class _CompanyDetailState extends RefreshableState { int attachmentCount = 0; @override - String getAppBarTitle() => L10().company; + String getAppBarTitle() { + String title = L10().company; + + if (widget.company.name.isNotEmpty) { + title += " - ${widget.company.name}"; + } + + return title; + } @override List appBarActions(BuildContext context) { From cc0085e50f5aa688670afd3d636b1babf865a81b Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 11 Dec 2024 16:38:09 +1100 Subject: [PATCH 6/6] Adjust --- lib/widget/order/po_line_detail.dart | 2 +- lib/widget/order/purchase_order_detail.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/widget/order/po_line_detail.dart b/lib/widget/order/po_line_detail.dart index 7689c5aa..9dc178fc 100644 --- a/lib/widget/order/po_line_detail.dart +++ b/lib/widget/order/po_line_detail.dart @@ -239,7 +239,7 @@ class _POLineDetailWidgetState extends RefreshableState { Navigator.push( context, MaterialPageRoute( - builder: (context) => LocationDisplayWidget(destination!) + builder: (context) => LocationDisplayWidget(destination) ) ) } diff --git a/lib/widget/order/purchase_order_detail.dart b/lib/widget/order/purchase_order_detail.dart index 9040228b..f4a45d07 100644 --- a/lib/widget/order/purchase_order_detail.dart +++ b/lib/widget/order/purchase_order_detail.dart @@ -396,7 +396,7 @@ class _PurchaseOrderDetailState extends RefreshableState LocationDisplayWidget(destination!) + builder: (context) => LocationDisplayWidget(destination) ) ) }