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/api.dart"; import "package:inventree/app_colors.dart"; import "package:inventree/barcode/barcode.dart"; import "package:inventree/l10.dart"; import "package:inventree/inventree/part.dart"; import "package:inventree/inventree/company.dart"; import "package:inventree/widget/company_detail.dart"; import "package:inventree/widget/part_detail.dart"; import "package:inventree/widget/progress.dart"; import "package:inventree/widget/refreshable_state.dart"; import "package:inventree/widget/snacks.dart"; import "package:url_launcher/url_launcher.dart"; /* * Detail widget for viewing a single SupplierPart instance */ class SupplierPartDetailWidget extends StatefulWidget { const SupplierPartDetailWidget(this.supplierPart, {Key? key}) : super(key: key); final InvenTreeSupplierPart supplierPart; @override _SupplierPartDisplayState createState() => _SupplierPartDisplayState(); } class _SupplierPartDisplayState extends RefreshableState { _SupplierPartDisplayState(); @override String getAppBarTitle() => L10().supplierPart; /* * Launch a form to edit the current SupplierPart instance */ Future editSupplierPart(BuildContext context) async { widget.supplierPart.editForm( context, L10().supplierPartEdit, onSuccess: (data) async { refresh(context); showSnackIcon(L10().supplierPartUpdated, success: true); } ); } @override List barcodeButtons(BuildContext context) { List actions = []; if (widget.supplierPart.canEdit) { actions.add( customBarcodeAction( context, this, widget.supplierPart.customBarcode, "supplierpart", widget.supplierPart.pk ) ); } return actions; } @override List appBarActions(BuildContext context) { List actions = []; if (widget.supplierPart.canEdit) { actions.add( IconButton( icon: Icon(Icons.edit_square), tooltip: L10().edit, onPressed: () { editSupplierPart(context); } ) ); } return actions; } @override Future request(BuildContext context) async { final bool result = widget.supplierPart.pk > 0 && await widget.supplierPart.reload(); if (!result) { Navigator.of(context).pop(); } } /* * Build a set of tiles to display for this SupplierPart */ @override List getTiles(BuildContext context) { List tiles = []; if (loading) { tiles.add(progressIndicator()); return tiles; } // Internal Part tiles.add( ListTile( title: Text(L10().internalPart), subtitle: Text(widget.supplierPart.partName), leading: FaIcon(FontAwesomeIcons.shapes, color: COLOR_ACTION), trailing: InvenTreeAPI().getThumbnail(widget.supplierPart.partImage), onTap: () async { showLoadingOverlay(context); final part = await InvenTreePart().get(widget.supplierPart.partId); hideLoadingOverlay(); if (part is InvenTreePart) { Navigator.push(context, MaterialPageRoute( builder: (context) => PartDetailWidget(part))); } }, ) ); // Supplier details tiles.add( ListTile( title: Text(L10().supplier), subtitle: Text(widget.supplierPart.supplierName), leading: FaIcon(FontAwesomeIcons.building, color: COLOR_ACTION), trailing: InvenTreeAPI().getThumbnail(widget.supplierPart.supplierImage), onTap: () async { showLoadingOverlay(context); var supplier = await InvenTreeCompany().get(widget.supplierPart.supplierId); hideLoadingOverlay(); if (supplier is InvenTreeCompany) { Navigator.push(context, MaterialPageRoute( builder: (context) => CompanyDetailWidget(supplier) )); } } ) ); // SKU (part number) tiles.add( ListTile( title: Text(L10().supplierPartNumber), subtitle: Text(widget.supplierPart.SKU), leading: FaIcon(FontAwesomeIcons.barcode), ) ); // Manufacturer information if (widget.supplierPart.manufacturerPartId > 0) { tiles.add( ListTile( title: Text(L10().manufacturer), subtitle: Text(widget.supplierPart.manufacturerName), leading: FaIcon(FontAwesomeIcons.industry, color: COLOR_ACTION), trailing: InvenTreeAPI().getThumbnail(widget.supplierPart.manufacturerImage), onTap: () async { showLoadingOverlay(context); var supplier = await InvenTreeCompany().get(widget.supplierPart.manufacturerId); hideLoadingOverlay(); if (supplier is InvenTreeCompany) { Navigator.push(context, MaterialPageRoute( builder: (context) => CompanyDetailWidget(supplier) )); } } ) ); tiles.add( ListTile( title: Text(L10().manufacturerPartNumber), subtitle: Text(widget.supplierPart.MPN), leading: FaIcon(FontAwesomeIcons.barcode), ) ); } // Packaging if (widget.supplierPart.packaging.isNotEmpty || widget.supplierPart.pack_quantity.isNotEmpty) { tiles.add( ListTile( title: Text(L10().packaging), subtitle: widget.supplierPart.packaging.isNotEmpty ? Text(widget.supplierPart.packaging) : null, leading: FaIcon(FontAwesomeIcons.boxesPacking), trailing: widget.supplierPart.pack_quantity.isNotEmpty ? Text(widget.supplierPart.pack_quantity) : null, ) ); } if (widget.supplierPart.link.isNotEmpty) { tiles.add( ListTile( title: Text(widget.supplierPart.link), leading: FaIcon(FontAwesomeIcons.link, color: COLOR_ACTION), onTap: () async { var uri = Uri.tryParse(widget.supplierPart.link); if (uri != null && await canLaunchUrl(uri)) { await launchUrl(uri); } }, ) ); } if (widget.supplierPart.note.isNotEmpty) { tiles.add( ListTile( title: Text(widget.supplierPart.note), leading: FaIcon(FontAwesomeIcons.pencil), ) ); } return tiles; } }