diff --git a/lib/inventree/company.dart b/lib/inventree/company.dart index c4ca8773..0fe41894 100644 --- a/lib/inventree/company.dart +++ b/lib/inventree/company.dart @@ -1,9 +1,12 @@ +import 'package:inventree/api.dart'; + import 'model.dart'; /* * The InvenTreeCompany class repreents the Company model in the InvenTree database. */ + class InvenTreeCompany extends InvenTreeModel { @override @@ -14,7 +17,9 @@ class InvenTreeCompany extends InvenTreeModel { InvenTreeCompany() : super(); - String get image => jsondata['image'] ?? ''; + String get image => jsondata['image'] ?? jsondata['thumbnail'] ?? InvenTreeAPI.staticImage; + + String get thumbnail => jsondata['thumbnail'] ?? jsondata['image'] ?? InvenTreeAPI.staticThumb; String get website => jsondata['website'] ?? ''; @@ -44,14 +49,14 @@ class InvenTreeCompany extends InvenTreeModel { */ class InvenTreeSupplierPart extends InvenTreeModel { @override - String url = "company/part/"; + String URL = "company/part/"; @override Map defaultListFilters() { return { "manufacturer_detail": "true", "supplier_detail": "true", - "supplier_part_detail": "true", + "manufacturer_part_detail": "true", }; } @@ -61,12 +66,22 @@ class InvenTreeSupplierPart extends InvenTreeModel { int get manufacturerId => (jsondata['manufacturer'] ?? -1) as int; + String get manufacturerName => jsondata['manufacturer_detail']['name']; + + String get manufacturerImage => jsondata['manufacturer_detail']['image'] ?? jsondata['manufacturer_detail']['thumbnail']; + int get manufacturerPartId => (jsondata['manufacturer_part'] ?? -1) as int; int get supplierId => (jsondata['supplier'] ?? -1) as int; + String get supplierName => jsondata['supplier_detail']['name']; + + String get supplierImage => jsondata['supplier_detail']['image'] ?? jsondata['supplier_detail']['thumbnail']; + String get SKU => (jsondata['SKU'] ?? '') as String; + String get MPN => jsondata['MPN'] ?? ''; + @override InvenTreeModel createFromJson(Map json) { var part = InvenTreeSupplierPart.fromJson(json); diff --git a/lib/inventree/part.dart b/lib/inventree/part.dart index d8d8e8c2..b85f5e79 100644 --- a/lib/inventree/part.dart +++ b/lib/inventree/part.dart @@ -1,5 +1,6 @@ import 'package:inventree/api.dart'; import 'package:inventree/inventree/stock.dart'; +import 'package:inventree/inventree/company.dart'; import 'package:flutter/cupertino.dart'; import 'package:inventree/l10.dart'; @@ -174,13 +175,10 @@ class InvenTreePart extends InvenTreeModel { final parts = await InvenTreeSupplierPart().list( filters: { "part": "${pk}", - "manufacturer_detail": "true", - "supplier_detail": "true", - "supplier_part_detail": "true" } ); - for (result in parts) { + for (var result in parts) { if (result is InvenTreeSupplierPart) { _supplierParts.add(result); } @@ -196,7 +194,7 @@ class InvenTreePart extends InvenTreeModel { int get testTemplateCount => testingTemplates.length; // Request test templates from the serve - Future getTestTemplates({bool showDialog=false}) async { + Future getTestTemplates() async { InvenTreePartTestTemplate().list( filters: { diff --git a/lib/widget/part_detail.dart b/lib/widget/part_detail.dart index 39bd3f31..952c8495 100644 --- a/lib/widget/part_detail.dart +++ b/lib/widget/part_detail.dart @@ -14,6 +14,7 @@ import 'package:inventree/widget/snacks.dart'; import 'package:inventree/inventree/part.dart'; import 'package:inventree/widget/full_screen_image.dart'; import 'package:inventree/widget/category_display.dart'; +import 'package:inventree/widget/part_suppliers.dart'; import 'package:inventree/widget/dialogs.dart'; import 'package:inventree/widget/fields.dart'; import 'package:inventree/api.dart'; @@ -328,10 +329,13 @@ class _PartDisplayState extends RefreshableState { tiles.add( ListTile( title: Text(L10().suppliers), - leading: FaIcon(FontAwesomeIcons.industry), + leading: FaIcon(FontAwesomeIcons.industry, color: COLOR_CLICK), trailing: Text("${part.supplierCount}"), onTap: () { - // TODO + Navigator.push( + context, + MaterialPageRoute(builder: (context) => PartSupplierWidget(part)) + ); }, ) ); diff --git a/lib/widget/part_suppliers.dart b/lib/widget/part_suppliers.dart new file mode 100644 index 00000000..20f55c88 --- /dev/null +++ b/lib/widget/part_suppliers.dart @@ -0,0 +1,75 @@ +import 'package:inventree/l10.dart'; + +import 'package:inventree/api.dart'; + +import 'dart:core'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:inventree/inventree/part.dart'; +import 'package:inventree/inventree/company.dart'; +import 'package:inventree/widget/refreshable_state.dart'; + +class PartSupplierWidget extends StatefulWidget { + + PartSupplierWidget(this.part, {Key? key}) : super(key: key); + + final InvenTreePart part; + + @override + _PartSupplierState createState() => _PartSupplierState(part); + +} + + +class _PartSupplierState extends RefreshableState { + + _PartSupplierState(this.part); + + final InvenTreePart part; + + List _supplierParts = []; + + @override + Future request() async { + // TODO - Request list of suppliers for the part + await part.reload(); + _supplierParts = await part.getSupplierParts(); + } + + @override + String getAppBarTitle(BuildContext context) => L10().partSuppliers; + + @override + List getAppBarActions(BuildContext contexts) { + // TODO + return []; + } + + Widget _supplierPartTile(BuildContext context, int index) { + + InvenTreeSupplierPart _part = _supplierParts[index]; + + return ListTile( + leading: InvenTreeAPI().getImage( + _part.supplierImage, + width: 40, + height: 40, + ), + title: Text("${_part.SKU}"), + subtitle: Text("${_part.manufacturerName}: ${_part.MPN}") + ); + } + + @override + Widget getBody(BuildContext context) { + return ListView.separated( + shrinkWrap: true, + physics: ClampingScrollPhysics(), + separatorBuilder: (_, __) => const Divider(height: 3), + itemCount: _supplierParts.length, + itemBuilder: _supplierPartTile, + ); + } + +} \ No newline at end of file