From 0b487c611153dafa5bc7c4248fb0ee0c88a92095 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 15 Nov 2021 23:00:05 +1100 Subject: [PATCH] "used in" table now accommodates "inherited" BOMs --- InvenTree/templates/js/translated/api.js | 6 ++- InvenTree/templates/js/translated/bom.js | 64 ++++++++++++++++++++++-- 2 files changed, 65 insertions(+), 5 deletions(-) diff --git a/InvenTree/templates/js/translated/api.js b/InvenTree/templates/js/translated/api.js index 15a74a9a71..735ce0a676 100644 --- a/InvenTree/templates/js/translated/api.js +++ b/InvenTree/templates/js/translated/api.js @@ -217,8 +217,10 @@ function showApiError(xhr, url) { break; } - message += '
'; - message += `URL: ${url}`; + if (url) { + message += '
'; + message += `URL: ${url}`; + } showMessage(title, { style: 'danger', diff --git a/InvenTree/templates/js/translated/bom.js b/InvenTree/templates/js/translated/bom.js index de0d92fac8..48255e80a2 100644 --- a/InvenTree/templates/js/translated/bom.js +++ b/InvenTree/templates/js/translated/bom.js @@ -673,8 +673,9 @@ function loadBomTable(table, options={}) { table.treegrid('collapseAll'); }, - error: function() { + error: function(xhr) { console.log('Error requesting BOM for part=' + part_pk); + showApiError(xhr); } } ); @@ -879,6 +880,63 @@ function loadUsedInTable(table, part_id, options={}) { showColumns: true, queryParams: filters, original: params, + rootParentId: 'top-level-item', + idField: 'pk', + uniqueId: 'pk', + parentIdField: 'parent', + treeShowField: 'part', + onLoadSuccess: function(tableData) { + // Once the initial data are loaded, check if there are any "inherited" BOM lines + for (var ii = 0; ii < tableData.length; ii++) { + var row = tableData[ii]; + + // This is a "top level" item in the table + row.parent = 'top-level-item'; + + // Ignore this row as it is not "inherited" by variant parts + if (!row.inherited) { + continue; + } + + var variants = inventreeGet( + '{% url "api-part-list" %}', + { + assembly: true, + ancestor: row.part, + }, + { + success: function(variantData) { + // Iterate through each variant item + for (var jj = 0; jj < variantData.length; jj++) { + variantData[jj].parent = row.pk; + + var variant = variantData[jj]; + + // Add this variant to the table, augmented + $(table).bootstrapTable('append', [{ + // Point the parent to the "master" assembly row + parent: row.pk, + part: variant.pk, + part_detail: variant, + sub_part: row.sub_part, + sub_part_detail: row.sub_part_detail, + quantity: row.quantity, + }]); + } + }, + error: function(xhr) { + showApiError(xhr); + } + } + ); + + } + }, + onPostBody: function() { + $(table).treegrid({ + treeColumn: 0, + }); + }, columns: [ { field: 'pk', @@ -892,7 +950,7 @@ function loadUsedInTable(table, part_id, options={}) { switchable: false, sortable: true, formatter: function(value, row) { - var url = `/part/${value}/`; + var url = `/part/${value}/?display=bom`; var html = ''; var part = row.part_detail; @@ -923,7 +981,7 @@ function loadUsedInTable(table, part_id, options={}) { }, { field: 'quantity', - title: '{% trans "Quantity" %}', + title: '{% trans "Required Quantity" %}', } ] });