Fixes for display of allocation tables (build order and / or sales order)

- Hide these tables where they do not make sense for a given Part or StockItem
- Remove redundant "loadStockAllocationTable" function
This commit is contained in:
Oliver 2022-03-16 23:25:51 +11:00
parent e691536a84
commit e2179fb4d1
3 changed files with 43 additions and 167 deletions

View File

@ -309,6 +309,7 @@
</div>
<div class='panel panel-hidden' id='panel-build-orders'>
{% if part.assembly %}
<div class='panel-heading'>
<div class='d-flex flex-wrap'>
<h4>{% trans "Part Builds" %}</h4>
@ -334,7 +335,9 @@
<table class='table table-striped table-condensed' data-toolbar='#build-button-toolbar' id='build-table'>
</table>
</div>
{% endif %}
{% if part.component %}
<div class='panel-heading'>
<h4>{% trans "Build Order Allocations" %}</h4>
</div>
@ -346,6 +349,7 @@
</div>
<table class='table table-striped table-condensed' id='build-order-allocation-table' data-toolbar='#build-allocation-button-toolbar'></table>
</div>
{% endif %}
</div>
<div class='panel panel-hidden' id='panel-suppliers'>
@ -514,6 +518,7 @@
// Load the "builds" tab
onPanelLoad("build-orders", function() {
{% if part.assembly %}
$("#start-build").click(function() {
newBuildOrder({
part: {{ part.pk }},
@ -526,12 +531,15 @@
part: {{ part.id }},
}
});
{% endif %}
{% if part.component %}
loadBuildOrderAllocationTable("#build-order-allocation-table", {
params: {
part: {{ part.id }},
}
});
{% endif %}
});

View File

@ -37,19 +37,36 @@
</div>
<div class='panel panel-hidden' id='panel-allocations'>
{% if item.part.component %}
<div class='panel-heading'>
<h4>{% trans "Stock Item Allocations" %}</h4>
<h4>{% trans "Build Order Allocations" %}</h4>
{% include "spacer.html" %}
</div>
<div class='panel-content'>
<div id='allocations-button-toolbar'>
<div id='build-order-allocations-toolbar'>
<div class='btn-group' role='group'>
{% include "filter_list.html" with id="allocations" %}
{% include "filter_list.html" with id="buildorderallocation" %}
</div>
</div>
<table class='table table-striped table-condensed' data-toolbar='#allocatoins-button-toolbar' id='stock-allocation-table'></table>
<table class='table table-striped table-condensed' data-toolbar='#build-order-allocation-toolbar' id='build-order-allocation-table'></table>
</div>
{% endif %}
{% if item.part.salable %}
<div class='panel-heading'>
<h4>{% trans "Sales Order Allocations" %}</h4>
{% include "spacer.html" %}
</div>
<div class='panel-content'>
<div id='sales-order-allocations-toolbar'>
<div class='btn-group' role='group'>
{% include "filter_list.html" with id="salesorderallocation" %}
</div>
</div>
<table class='table table-striped table-condensed' data-toolbar='#sales-order-allocation-toolbar' id='sales-order-allocation-table'></table>
</div>
{% endif %}
</div>
<div class='panel panel-hidden' id='panel-children'>
@ -164,14 +181,21 @@
// Load the "allocations" tab
onPanelLoad('allocations', function() {
loadStockAllocationTable(
$("#stock-allocation-table"),
{
params: {
stock_item: {{ item.pk }},
},
{% if item.part.component %}
loadBuildOrderAllocationTable('#build-order-allocation-table', {
params: {
stock_item: {{ item.pk }},
}
);
});
{% endif %}
{% if item.part.salable %}
loadSalesOrderAllocationTable('#sales-order-allocation-table', {
params: {
stock_item: {{ item.pk }},
}
});
{% endif %}
});
$('#stock-item-install').click(function() {

View File

@ -46,7 +46,6 @@
findStockItemBySerialNumber,
installStockItem,
loadInstalledInTable,
loadStockAllocationTable,
loadStockLocationTable,
loadStockTable,
loadStockTestResultsTable,
@ -2302,161 +2301,6 @@ function loadStockTable(table, options) {
}
/*
* Display a table of allocated stock, for either a part or stock item
* Allocations are displayed for:
*
* a) Sales Orders
* b) Build Orders
*/
function loadStockAllocationTable(table, options={}) {
var params = options.params || {};
params.build_detail = true;
var filterListElement = options.filterList || '#filter-list-allocations';
var filters = {};
var filterKey = options.filterKey || options.name || 'allocations';
var original = {};
for (var k in params) {
original[k] = params[k];
filters[k] = params[k];
}
setupFilterList(filterKey, table, filterListElement);
/*
* We have two separate API queries to make here:
* a) Build Order Allocations
* b) Sales Order Allocations
*
* We will let the call to inventreeTable take care of build orders,
* and then load sales orders after that.
*/
table.inventreeTable({
url: '{% url "api-build-item-list" %}',
name: 'allocations',
original: original,
method: 'get',
queryParams: filters,
sidePagination: 'client',
showColumns: false,
onLoadSuccess: function(tableData) {
var query_params = params;
query_params.customer_detail = true;
query_params.order_detail = true;
// Note: SalesOrderAllocations do not get deleted,
// so we must filter by "outstanding" status
query_params.outstanding = true;
delete query_params.build_detail;
// Load sales order allocation data
inventreeGet('{% url "api-so-allocation-list" %}', query_params, {
success: function(data) {
// Update table to include sales order data
$(table).bootstrapTable('append', data);
}
});
},
columns: [
{
field: 'order',
title: '{% trans "Order" %}',
formatter: function(value, row) {
var html = '';
if (row.build) {
// Add an icon for the part being built
html += thumbnailImage(row.build_detail.part_detail.thumbnail, {
title: row.build_detail.part_detail.full_name
});
html += ' ';
html += renderLink(
global_settings.BUILDORDER_REFERENCE_PREFIX + row.build_detail.reference,
`/build/${row.build}/`
);
html += makeIconBadge('fa-tools', '{% trans "Build Order" %}');
} else if (row.order) {
// Add an icon for the customer
html += thumbnailImage(row.customer_detail.thumbnail || row.customer_detail.image, {
title: row.customer_detail.name,
});
html += ' ';
html += renderLink(
global_settings.SALESORDER_REFERENCE_PREFIX + row.order_detail.reference,
`/order/sales-order/${row.order}/`
);
html += makeIconBadge('fa-truck', '{% trans "Sales Order" %}');
} else {
return '-';
}
return html;
}
},
{
field: 'description',
title: '{% trans "Description" %}',
formatter: function(value, row) {
if (row.order_detail) {
return row.order_detail.description;
} else if (row.build_detail) {
return row.build_detail.title;
} else {
return '-';
}
}
},
{
field: 'status',
title: '{% trans "Order Status" %}',
formatter: function(value, row) {
if (row.build) {
return buildStatusDisplay(row.build_detail.status);
} else if (row.order) {
return salesOrderStatusDisplay(row.order_detail.status);
} else {
return '-';
}
}
},
{
field: 'quantity',
title: '{% trans "Allocated Quantity" %}',
formatter: function(value, row) {
var text = value;
var pk = row.stock_item || row.item;
if (pk) {
var url = `/stock/item/${pk}/`;
return renderLink(text, url);
} else {
return value;
}
}
},
]
});
}
/*
* Display a table of stock locations
*/