From 61a9557df58f99e74265ae434186605c3d020241 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 28 Sep 2021 00:45:48 +1000 Subject: [PATCH] Display purchase order info --- lib/inventree/purchase_order.dart | 17 +++- lib/widget/company_detail.dart | 1 - lib/widget/purchase_order_detail.dart | 138 ++++++++++++++++++++++++++ lib/widget/purchase_order_list.dart | 13 ++- 4 files changed, 162 insertions(+), 7 deletions(-) create mode 100644 lib/widget/purchase_order_detail.dart diff --git a/lib/inventree/purchase_order.dart b/lib/inventree/purchase_order.dart index 877bbaba..71664b43 100644 --- a/lib/inventree/purchase_order.dart +++ b/lib/inventree/purchase_order.dart @@ -30,6 +30,13 @@ class InvenTreePurchaseOrder extends InvenTreeModel { InvenTreePurchaseOrder() : super(); + @override + Map defaultGetFilters() { + return { + "supplier_detail": "true", + }; + } + @override Map defaultListFilters() { return { @@ -55,11 +62,15 @@ class InvenTreePurchaseOrder extends InvenTreeModel { int get supplierId => jsondata['supplier'] ?? -1; - InvenTreeCompany get supplier { + InvenTreeCompany? get supplier { - dynamic supplier_detail = jsondata["supplier_detail"] ?? {}; + dynamic supplier_detail = jsondata["supplier_detail"] ?? null; - return InvenTreeCompany.fromJson(supplier_detail); + if (supplier_detail == null) { + return null; + } else { + return InvenTreeCompany.fromJson(supplier_detail); + } } String get supplierReference => jsondata['supplier_reference'] ?? ""; diff --git a/lib/widget/company_detail.dart b/lib/widget/company_detail.dart index bc87322e..86d4c5e6 100644 --- a/lib/widget/company_detail.dart +++ b/lib/widget/company_detail.dart @@ -1,6 +1,5 @@ import 'package:inventree/api.dart'; -import 'package:inventree/api_form.dart'; import 'package:inventree/app_colors.dart'; import 'package:inventree/inventree/company.dart'; import 'package:inventree/widget/refreshable_state.dart'; diff --git a/lib/widget/purchase_order_detail.dart b/lib/widget/purchase_order_detail.dart new file mode 100644 index 00000000..f368b082 --- /dev/null +++ b/lib/widget/purchase_order_detail.dart @@ -0,0 +1,138 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:inventree/api.dart'; +import 'package:inventree/inventree/company.dart'; +import 'package:inventree/inventree/purchase_order.dart'; +import 'package:inventree/widget/refreshable_state.dart'; + +import '../l10.dart'; +import 'location_display.dart'; + + +class PurchaseOrderDetailWidget extends StatefulWidget { + + PurchaseOrderDetailWidget(this.order, {Key? key}): super(key: key); + + final InvenTreePurchaseOrder order; + + @override + _PurchaseOrderDetailState createState() => _PurchaseOrderDetailState(order); +} + + +class _PurchaseOrderDetailState extends RefreshableState { + + _PurchaseOrderDetailState(this.order); + + final InvenTreePurchaseOrder order; + + @override + String getAppBarTitle(BuildContext context) => L10().purchaseOrder; + + @override + List getAppBarActions(BuildContext context) { + List actions = []; + + if (InvenTreeAPI().checkPermission("purchase_order", "change")) { + actions.add( + IconButton( + icon: FaIcon(FontAwesomeIcons.edit), + tooltip: L10().edit, + onPressed: () { + editOrder(context); + } + ) + ); + } + + return actions; + } + + @override + Future request() async { + await order.reload(); + } + + void editOrder(BuildContext context) async { + + order.editForm( + context, + L10().purchaseOrderEdit, + onSuccess: (data) async { + refresh(); + } + ); + } + + List orderTiles(BuildContext context) { + + List tiles = []; + + InvenTreeCompany? supplier = order.supplier; + + print(order.jsondata); + + tiles.add(Card( + child: ListTile( + title: Text(order.reference), + subtitle: Text(order.description), + leading: supplier == null ? null : InvenTreeAPI().getImage(supplier.thumbnail, width: 40, height: 40), + trailing: Text("${order.lineItems}"), + ) + )); + + return tiles; + + } + + @override + Widget getBody(BuildContext context) { + + return Center( + child: getSelectedWidget(context, tabIndex), + ); + } + + Widget getSelectedWidget(BuildContext context, int index) { + switch (index) { + case 0: + return ListView( + children: orderTiles(context) + ); + case 2: + // Stock items received against this order + Map filters = { + "purchase_order": "${order.pk}" + }; + + return PaginatedStockList(filters); + + default: + return ListView(); + } + } + + @override + Widget getBottomNavBar(BuildContext context) { + return BottomNavigationBar( + currentIndex: tabIndex, + onTap: onTabSelectionChanged, + items: [ + BottomNavigationBarItem( + icon: FaIcon(FontAwesomeIcons.info), + label: L10().details + ), + BottomNavigationBarItem( + icon: FaIcon(FontAwesomeIcons.thList), + label: L10().lineItems, + ), + BottomNavigationBarItem( + icon: FaIcon(FontAwesomeIcons.boxes), + label: L10().stockItems + ) + ], + ); + } + +} \ No newline at end of file diff --git a/lib/widget/purchase_order_list.dart b/lib/widget/purchase_order_list.dart index a0e71009..86f3e61a 100644 --- a/lib/widget/purchase_order_list.dart +++ b/lib/widget/purchase_order_list.dart @@ -1,8 +1,10 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; +import 'package:inventree/inventree/company.dart'; import 'package:inventree/inventree/sentry.dart'; import 'package:inventree/widget/paginator.dart'; +import 'package:inventree/widget/purchase_order_detail.dart'; import 'package:inventree/widget/refreshable_state.dart'; import '../l10.dart'; @@ -154,19 +156,24 @@ class _PaginatedPurchaseOrderListState extends State<_PaginatedPurchaseOrderList Widget _buildOrder(BuildContext context, InvenTreePurchaseOrder order) { - var supplier = order.supplier; + InvenTreeCompany? supplier = order.supplier; return ListTile( title: Text(order.reference), subtitle: Text(order.description), - leading: InvenTreeAPI().getImage( + leading: supplier == null ? null : InvenTreeAPI().getImage( supplier.thumbnail, width: 40, height: 40, ), trailing: Text("${order.lineItems}"), onTap: () async { - // TODO - Display purchase order information + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => PurchaseOrderDetailWidget(order) + ) + ); }, ); }