diff --git a/InvenTree/build/serializers.py b/InvenTree/build/serializers.py index f28c9fcf89..ac36fd5b41 100644 --- a/InvenTree/build/serializers.py +++ b/InvenTree/build/serializers.py @@ -9,6 +9,7 @@ from .models import Build class BuildSerializer(serializers.ModelSerializer): url = serializers.CharField(source='get_absolute_url', read_only=True) + status_text = serializers.CharField(source='get_status_display', read_only=True) class Meta: model = Build @@ -20,4 +21,6 @@ class BuildSerializer(serializers.ModelSerializer): 'completion_date', 'part', 'quantity', + 'status', + 'status_text', 'notes'] diff --git a/InvenTree/part/templates/part/stock.html b/InvenTree/part/templates/part/stock.html index 5bece01f2e..9f628fef1c 100644 --- a/InvenTree/part/templates/part/stock.html +++ b/InvenTree/part/templates/part/stock.html @@ -45,50 +45,11 @@ }); }); - $("#stock-table").bootstrapTable({ - sortable: true, - search: true, - pagination: true, - queryParams: function(p) { - return { - part: {{ part.id }}, - in_stock: true, - } + loadStockTable($("#stock-table"), { + params: { + part: {{ part.id }}, }, - columns: [ - { - field: 'pk', - title: 'ID', - visible: false, - }, - { - checkbox: true, - }, - { - field: 'location', - title: 'Location', - sortable: true, - formatter: function(value, row, index, field){ - return renderLink(value.pathstring, value.url); - } - }, - { - field: 'quantity', - title: 'Stock', - searchable: false, - sortable: true, - formatter: function(value, row, index, field) { - var text = renderLink(value, row.url) - text = text + "" + row.status + ""; - return text; - } - }, - { - field: 'notes', - title: 'Notes', - }, - ], - url: "{% url 'api-stock-list' %}" + url: "{% url 'api-stock-list' %}", }); function selectedStock() { @@ -109,28 +70,24 @@ return false; }); - function _stock(action) { - adjustStock({ - action: action, - items: selectedStock(), - success: function() { - $('#stock-table').bootstrapTable('refresh'); - } - }); - } - $("#multi-item-stocktake").click(function() { - _stock('stocktake'); + updateStockItems({ + action: 'stocktake' + }); return false; }); $("#multi-item-take").click(function() { - _stock('remove'); + updateStockItems({ + action: 'remove', + }); return false; }); $("#multi-item-give").click(function() { - _stock('add'); + updateStockItems({ + action: 'add', + }); return false; }) diff --git a/InvenTree/static/script/inventree/stock.js b/InvenTree/static/script/inventree/stock.js index 4f008aec0c..c0a931cdbf 100644 --- a/InvenTree/static/script/inventree/stock.js +++ b/InvenTree/static/script/inventree/stock.js @@ -153,6 +153,19 @@ function updateStock(items, options={}) { }); } + +function selectStockItems(options) { + /* Return list of selections from stock table + * If options.table not provided, assumed to be '#stock-table' + */ + + var table_name = options.table || '#stock-table'; + + // Return list of selected items from the bootstrap table + return $(table_name).bootstrapTable('getSelections'); +} + + function adjustStock(options) { if (options.items) { updateStock(options.items, options); @@ -172,6 +185,32 @@ function adjustStock(options) { } } + +function updateStockItems(options) { + /* Update one or more stock items selected from a stock-table + * Options available: + * 'action' - Action to perform - 'add' / 'remove' / 'stocktake' + * 'table' - ID of the stock table (default = '#stock-table' + */ + + var table = options.table || '#stock-table'; + + var items = selectStockItems({ + table: table, + }); + + // Pass items through + options.items = items; + options.table = table; + + // On success, reload the table + options.success = function() { + $(table).bootstrapTable('refresh'); + }; + + adjustStock(options); +} + function moveStockItems(items, options) { var modal = options.modal || '#modal-form'; @@ -277,4 +316,64 @@ function deleteStockItems(items, options) { modal: modal, title: 'Delete ' + items.length + ' stock items' }); -} \ No newline at end of file +} + + +function loadStockTable(modal, options) { + modal.bootstrapTable({ + sortable: true, + search: true, + method: 'get', + pagination: true, + rememberOrder: true, + queryParams: options.params, + columns: [ + { + checkbox: true, + title: 'Select', + searchable: false, + }, + { + field: 'pk', + title: 'ID', + visible: false, + }, + { + field: 'part.name', + title: 'Part', + sortable: true, + formatter: function(value, row, index, field) { + return renderLink(value, row.part.url); + } + }, + { + field: 'location', + title: 'Location', + sortable: true, + formatter: function(value, row, index, field) { + if (row.location) { + return renderLink(row.location.pathstring, row.location.url); + } + else { + return ''; + } + } + }, + { + field: 'quantity', + title: 'Quantity', + sortable: true, + formatter: function(value, row, index, field) { + var text = renderLink(value, row.url); + text = text + "" + row.status_text + ""; + return text; + } + }, + { + field: 'notes', + title: 'Notes', + } + ], + url: options.url, + }); +}; \ No newline at end of file diff --git a/InvenTree/stock/serializers.py b/InvenTree/stock/serializers.py index 104737c437..f79ceaa3b1 100644 --- a/InvenTree/stock/serializers.py +++ b/InvenTree/stock/serializers.py @@ -63,6 +63,7 @@ class StockItemSerializer(serializers.ModelSerializer): part = PartBriefSerializer(many=False, read_only=True) location = LocationBriefSerializer(many=False, read_only=True) + status_text = serializers.CharField(source='get_status_display', read_only=True) class Meta: model = StockItem @@ -78,6 +79,7 @@ class StockItemSerializer(serializers.ModelSerializer): 'serial', 'batch', 'status', + 'status_text', 'notes', ] diff --git a/InvenTree/stock/templates/stock/location.html b/InvenTree/stock/templates/stock/location.html index 5a232ec74f..79ae9ecd15 100644 --- a/InvenTree/stock/templates/stock/location.html +++ b/InvenTree/stock/templates/stock/location.html @@ -9,6 +9,7 @@
{{ location.description }}
{% else %}All stock items
{% endif %}