import "package:flutter/material.dart"; import "package:flutter_speed_dial/flutter_speed_dial.dart"; import "package:font_awesome_flutter/font_awesome_flutter.dart"; import "package:inventree/inventree/company.dart"; import "package:inventree/inventree/model.dart"; import "package:inventree/widget/paginator.dart"; import "package:inventree/widget/purchase_order_detail.dart"; import "package:inventree/widget/refreshable_state.dart"; import "package:inventree/l10.dart"; import "package:inventree/api.dart"; import "package:inventree/barcode/barcode.dart"; import "package:inventree/inventree/purchase_order.dart"; /* * Widget class for displaying a list of Purchase Orders */ class PurchaseOrderListWidget extends StatefulWidget { const PurchaseOrderListWidget({this.filters = const {}, Key? key}) : super(key: key); final Map filters; @override _PurchaseOrderListWidgetState createState() => _PurchaseOrderListWidgetState(filters); } class _PurchaseOrderListWidgetState extends RefreshableState { _PurchaseOrderListWidgetState(this.filters); final Map filters; @override String getAppBarTitle() => L10().purchaseOrders; @override List actionButtons(BuildContext context) { List actions = []; if (InvenTreePurchaseOrder().canCreate) { actions.add( SpeedDialChild( child: FaIcon(FontAwesomeIcons.circlePlus), label: L10().purchaseOrderCreate, onTap: () { createPurchaseOrder(context); } ) ); } return actions; } Future createPurchaseOrder(BuildContext context) async { var fields = InvenTreePurchaseOrder().formFields(); fields.remove("contact"); InvenTreePurchaseOrder().createForm( context, L10().purchaseOrderCreate, fields: fields, onSuccess: (result) async { Map data = result as Map; if (data.containsKey("pk")) { var order = InvenTreePurchaseOrder.fromJson(data); Navigator.push( context, MaterialPageRoute( builder: (context) => PurchaseOrderDetailWidget(order) ) ); } } ); } @override List barcodeButtons(BuildContext context) { List actions = []; if (api.supportsBarcodePOReceiveEndpoint) { actions.add( SpeedDialChild( child: Icon(Icons.barcode_reader), label: L10().scanReceivedParts, onTap:() async { scanBarcode( context, handler: POReceiveBarcodeHandler(), ); }, ) ); } return actions; } @override Widget getBody(BuildContext context) { return PaginatedPurchaseOrderList(filters); } } class PaginatedPurchaseOrderList extends PaginatedSearchWidget { const PaginatedPurchaseOrderList(Map filters) : super(filters: filters); @override String get searchTitle => L10().purchaseOrders; @override _PaginatedPurchaseOrderListState createState() => _PaginatedPurchaseOrderListState(); } class _PaginatedPurchaseOrderListState extends PaginatedSearchState { _PaginatedPurchaseOrderListState() : super(); @override String get prefix => "po_"; @override Map get orderingOptions => { "reference": L10().reference, "supplier__name": L10().supplier, "status": L10().status, "target_date": L10().targetDate, }; @override Map> get filterOptions => { "outstanding": { "label": L10().outstanding, "help_text": L10().outstandingOrderDetail, "tristate": true, } }; @override Future requestPage(int limit, int offset, Map params) async { await InvenTreeAPI().PurchaseOrderStatus.load(); final page = await InvenTreePurchaseOrder().listPaginated(limit, offset, filters: params); return page; } @override Widget buildItem(BuildContext context, InvenTreeModel model) { InvenTreePurchaseOrder order = model as InvenTreePurchaseOrder; InvenTreeCompany? supplier = order.supplier; return ListTile( title: Text(order.reference), subtitle: Text(order.description), leading: supplier == null ? null : InvenTreeAPI().getThumbnail(supplier.thumbnail), trailing: Text( InvenTreeAPI().PurchaseOrderStatus.label(order.status), style: TextStyle( color: InvenTreeAPI().PurchaseOrderStatus.color(order.status), ), ), onTap: () async { Navigator.push( context, MaterialPageRoute( builder: (context) => PurchaseOrderDetailWidget(order) ) ); }, ); } }