diff --git a/lib/inventree/part.dart b/lib/inventree/part.dart index 85ee6d86..4b86896e 100644 --- a/lib/inventree/part.dart +++ b/lib/inventree/part.dart @@ -303,9 +303,6 @@ class InvenTreePart extends InvenTreeModel { // Get the number of units being build for this Part double get building => double.tryParse(jsondata["building"].toString()) ?? 0; - // Get the number of BOM items in this Part (if it is an assembly) - int get bomItemCount => (jsondata["bom_items"] ?? 0) as int; - // Get the number of BOMs this Part is used in (if it is a component) int get usedInCount => (jsondata["used_in"] ?? 0) as int; diff --git a/lib/widget/part_detail.dart b/lib/widget/part_detail.dart index 376d5480..7ac72256 100644 --- a/lib/widget/part_detail.dart +++ b/lib/widget/part_detail.dart @@ -2,16 +2,18 @@ import "package:flutter/material.dart"; import "package:font_awesome_flutter/font_awesome_flutter.dart"; +import "package:inventree/api.dart"; import "package:inventree/app_colors.dart"; import "package:inventree/inventree/stock.dart"; import "package:inventree/l10.dart"; import "package:inventree/helpers.dart"; +import "package:inventree/inventree/part.dart"; + import "package:inventree/widget/attachment_widget.dart"; +import "package:inventree/widget/part_list.dart"; import "package:inventree/widget/part_notes.dart"; import "package:inventree/widget/progress.dart"; -import "package:inventree/inventree/part.dart"; import "package:inventree/widget/category_display.dart"; -import "package:inventree/api.dart"; import "package:inventree/widget/refreshable_state.dart"; import "package:inventree/widget/part_image_widget.dart"; import "package:inventree/widget/snacks.dart"; @@ -41,6 +43,8 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> { int attachmentCount = 0; + int bomCount = 0; + @override String getAppBarTitle(BuildContext context) => L10().partDetails; @@ -118,6 +122,12 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> { "part": part.pk.toString() } ); + + bomCount = await InvenTreePart().count( + filters: { + "in_bom_for": part.pk.toString(), + } + ); } Future <void> _toggleStar() async { @@ -296,14 +306,24 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> { // Tiles for an "assembly" part if (part.isAssembly) { - if (part.bomItemCount > 0) { + if (bomCount > 0) { tiles.add( ListTile( title: Text(L10().billOfMaterials), - leading: FaIcon(FontAwesomeIcons.thList), - trailing: Text("${part.bomItemCount}"), + leading: FaIcon(FontAwesomeIcons.thList, color: COLOR_CLICK), + trailing: Text("${bomCount}"), onTap: () { - // TODO + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => PartList( + { + "in_bom_for": "${part.pk}", + }, + title: L10().billOfMaterials, + ) + ) + ); } ) ); @@ -583,7 +603,6 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> { icon: FaIcon(FontAwesomeIcons.boxes), label: L10().stock ), - // TODO - Add part actions BottomNavigationBarItem( icon: FaIcon(FontAwesomeIcons.wrench), label: L10().actions, diff --git a/lib/widget/part_list.dart b/lib/widget/part_list.dart index 528273f7..2be5e557 100644 --- a/lib/widget/part_list.dart +++ b/lib/widget/part_list.dart @@ -12,23 +12,27 @@ import "package:inventree/l10.dart"; class PartList extends StatefulWidget { - const PartList(this.filters); + const PartList(this.filters, {this.title = ""}); + + final String title; final Map<String, String> filters; @override - _PartListState createState() => _PartListState(filters); + _PartListState createState() => _PartListState(filters, title); } class _PartListState extends RefreshableState<PartList> { - _PartListState(this.filters); + _PartListState(this.filters, this.title); + + final String title; final Map<String, String> filters; @override - String getAppBarTitle(BuildContext context) => L10().parts; + String getAppBarTitle(BuildContext context) => title.isNotEmpty ? title : L10().parts; @override Widget getBody(BuildContext context) {