2
0
mirror of https://github.com/inventree/inventree-app.git synced 2025-04-28 13:36:50 +00:00

Allows displays of Bill of Materials for assembled parts

This commit is contained in:
Oliver Walters 2022-07-05 16:59:32 +10:00
parent f7e045aaeb
commit e35c4df846
3 changed files with 34 additions and 14 deletions

View File

@ -303,9 +303,6 @@ class InvenTreePart extends InvenTreeModel {
// Get the number of units being build for this Part // Get the number of units being build for this Part
double get building => double.tryParse(jsondata["building"].toString()) ?? 0; 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) // Get the number of BOMs this Part is used in (if it is a component)
int get usedInCount => (jsondata["used_in"] ?? 0) as int; int get usedInCount => (jsondata["used_in"] ?? 0) as int;

View File

@ -2,16 +2,18 @@ import "package:flutter/material.dart";
import "package:font_awesome_flutter/font_awesome_flutter.dart"; import "package:font_awesome_flutter/font_awesome_flutter.dart";
import "package:inventree/api.dart";
import "package:inventree/app_colors.dart"; import "package:inventree/app_colors.dart";
import "package:inventree/inventree/stock.dart"; import "package:inventree/inventree/stock.dart";
import "package:inventree/l10.dart"; import "package:inventree/l10.dart";
import "package:inventree/helpers.dart"; import "package:inventree/helpers.dart";
import "package:inventree/inventree/part.dart";
import "package:inventree/widget/attachment_widget.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/part_notes.dart";
import "package:inventree/widget/progress.dart"; import "package:inventree/widget/progress.dart";
import "package:inventree/inventree/part.dart";
import "package:inventree/widget/category_display.dart"; import "package:inventree/widget/category_display.dart";
import "package:inventree/api.dart";
import "package:inventree/widget/refreshable_state.dart"; import "package:inventree/widget/refreshable_state.dart";
import "package:inventree/widget/part_image_widget.dart"; import "package:inventree/widget/part_image_widget.dart";
import "package:inventree/widget/snacks.dart"; import "package:inventree/widget/snacks.dart";
@ -41,6 +43,8 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> {
int attachmentCount = 0; int attachmentCount = 0;
int bomCount = 0;
@override @override
String getAppBarTitle(BuildContext context) => L10().partDetails; String getAppBarTitle(BuildContext context) => L10().partDetails;
@ -118,6 +122,12 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> {
"part": part.pk.toString() "part": part.pk.toString()
} }
); );
bomCount = await InvenTreePart().count(
filters: {
"in_bom_for": part.pk.toString(),
}
);
} }
Future <void> _toggleStar() async { Future <void> _toggleStar() async {
@ -296,14 +306,24 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> {
// Tiles for an "assembly" part // Tiles for an "assembly" part
if (part.isAssembly) { if (part.isAssembly) {
if (part.bomItemCount > 0) { if (bomCount > 0) {
tiles.add( tiles.add(
ListTile( ListTile(
title: Text(L10().billOfMaterials), title: Text(L10().billOfMaterials),
leading: FaIcon(FontAwesomeIcons.thList), leading: FaIcon(FontAwesomeIcons.thList, color: COLOR_CLICK),
trailing: Text("${part.bomItemCount}"), trailing: Text("${bomCount}"),
onTap: () { 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), icon: FaIcon(FontAwesomeIcons.boxes),
label: L10().stock label: L10().stock
), ),
// TODO - Add part actions
BottomNavigationBarItem( BottomNavigationBarItem(
icon: FaIcon(FontAwesomeIcons.wrench), icon: FaIcon(FontAwesomeIcons.wrench),
label: L10().actions, label: L10().actions,

View File

@ -12,23 +12,27 @@ import "package:inventree/l10.dart";
class PartList extends StatefulWidget { class PartList extends StatefulWidget {
const PartList(this.filters); const PartList(this.filters, {this.title = ""});
final String title;
final Map<String, String> filters; final Map<String, String> filters;
@override @override
_PartListState createState() => _PartListState(filters); _PartListState createState() => _PartListState(filters, title);
} }
class _PartListState extends RefreshableState<PartList> { class _PartListState extends RefreshableState<PartList> {
_PartListState(this.filters); _PartListState(this.filters, this.title);
final String title;
final Map<String, String> filters; final Map<String, String> filters;
@override @override
String getAppBarTitle(BuildContext context) => L10().parts; String getAppBarTitle(BuildContext context) => title.isNotEmpty ? title : L10().parts;
@override @override
Widget getBody(BuildContext context) { Widget getBody(BuildContext context) {