diff --git a/InvenTree/InvenTree/api_version.py b/InvenTree/InvenTree/api_version.py index c1defa567b..203aa09713 100644 --- a/InvenTree/InvenTree/api_version.py +++ b/InvenTree/InvenTree/api_version.py @@ -2,11 +2,14 @@ # InvenTree API version -INVENTREE_API_VERSION = 96 +INVENTREE_API_VERSION = 97 """ Increment this API version number whenever there is a significant change to the API that any clients need to know about +v97 -> 2023-02-20 : https://github.com/inventree/InvenTree/pull/4377 + - Adds "external" attribute to StockLocation model + v96 -> 2023-02-16 : https://github.com/inventree/InvenTree/pull/4345 - Adds stocktake report generation functionality diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py index 3f251fd0b8..9eac812ae0 100644 --- a/InvenTree/common/models.py +++ b/InvenTree/common/models.py @@ -46,6 +46,7 @@ import InvenTree.ready import InvenTree.tasks import InvenTree.validators import order.validators +from plugin import registry logger = logging.getLogger('inventree') @@ -1628,6 +1629,15 @@ class InvenTreeSetting(BaseInvenTreeSetting): return False +def label_printer_options(): + """Build a list of available label printer options.""" + printers = [('', _('No Printer (Export to PDF)'))] + label_printer_plugins = registry.with_mixin('labels') + if label_printer_plugins: + printers.extend([(p.slug, p.name + ' - ' + p.human_name) for p in label_printer_plugins]) + return printers + + class InvenTreeUserSetting(BaseInvenTreeSetting): """An InvenTreeSetting object with a usercontext.""" @@ -1781,6 +1791,13 @@ class InvenTreeUserSetting(BaseInvenTreeSetting): 'validator': bool, }, + "LABEL_DEFAULT_PRINTER": { + 'name': _('Default label printer'), + 'description': _('Configure which label printer should be selected by default'), + 'default': '', + 'choices': label_printer_options + }, + "REPORT_INLINE": { 'name': _('Inline report display'), 'description': _('Display PDF reports in the browser, instead of downloading as a file'), diff --git a/InvenTree/company/templates/company/supplier_part.html b/InvenTree/company/templates/company/supplier_part.html index 82d0311f96..58ac0fa0eb 100644 --- a/InvenTree/company/templates/company/supplier_part.html +++ b/InvenTree/company/templates/company/supplier_part.html @@ -299,27 +299,12 @@ loadSupplierPriceBreakTable({ }); $('#new-price-break').click(function() { - - constructForm( - '{% url "api-part-supplier-price-list" %}', - { - method: 'POST', - fields: { - quantity: {}, - part: { - value: {{ part.pk }}, - hidden: true, - }, - price: {}, - price_currency: { - }, - }, - title: '{% trans "Add Price Break" %}', - onSuccess: function() { - $("#price-break-table").bootstrapTable("refresh"); - } + createSupplierPartPriceBreak({{ part.pk }}, { + onSuccess: function() { + $("#price-break-table").bootstrapTable("refresh"); } - ); + }); + }); loadPurchaseOrderTable($("#purchase-order-table"), { diff --git a/InvenTree/order/templates/order/sales_order_base.html b/InvenTree/order/templates/order/sales_order_base.html index b0ab15be67..2521f92bb9 100644 --- a/InvenTree/order/templates/order/sales_order_base.html +++ b/InvenTree/order/templates/order/sales_order_base.html @@ -206,28 +206,7 @@ src="{% static 'img/blank_image.png' %}" $("#edit-order").click(function() { - constructForm('{% url "api-so-detail" order.pk %}', { - fields: { - reference: { - icon: 'fa-hashtag', - }, - {% if order.lines.count == 0 and order.status == SalesOrderStatus.PENDING %} - customer: { - }, - {% endif %} - customer_reference: {}, - description: {}, - target_date: { - icon: 'fa-calendar-alt', - }, - link: { - icon: 'fa-link', - }, - responsible: { - icon: 'fa-user', - }, - }, - title: '{% trans "Edit Sales Order" %}', + editSalesOrder({{ order.pk }}, { reload: true, }); }); diff --git a/InvenTree/part/templates/part/detail.html b/InvenTree/part/templates/part/detail.html index f064f6a8cb..372eecd076 100644 --- a/InvenTree/part/templates/part/detail.html +++ b/InvenTree/part/templates/part/detail.html @@ -793,17 +793,9 @@ constructForm('{% url "api-part-test-template-list" %}', { method: 'POST', - fields: { - test_name: {}, - description: {}, - required: {}, - requires_value: {}, - requires_attachment: {}, - part: { - value: {{ part.pk }}, - hidden: true, - } - }, + fields: partTestTemplateFields({ + part: {{ part.pk }} + }), title: '{% trans "Add Test Result Template" %}', onSuccess: function() { $("#test-template-table").bootstrapTable("refresh"); diff --git a/InvenTree/stock/api.py b/InvenTree/stock/api.py index 29177eab0b..88df0a541e 100644 --- a/InvenTree/stock/api.py +++ b/InvenTree/stock/api.py @@ -310,7 +310,8 @@ class StockLocationList(APIDownloadMixin, ListCreateAPI): filterset_fields = [ 'name', - 'structural' + 'structural', + 'external', ] search_fields = [ diff --git a/InvenTree/stock/migrations/0095_stocklocation_external.py b/InvenTree/stock/migrations/0095_stocklocation_external.py new file mode 100644 index 0000000000..3163f4aa17 --- /dev/null +++ b/InvenTree/stock/migrations/0095_stocklocation_external.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.18 on 2023-02-20 12:22 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('stock', '0094_auto_20230220_0025'), + ] + + operations = [ + migrations.AddField( + model_name='stocklocation', + name='external', + field=models.BooleanField(default=False, help_text='This is an external stock location', verbose_name='External'), + ), + ] diff --git a/InvenTree/stock/models.py b/InvenTree/stock/models.py index 582151b17f..77928b3fee 100644 --- a/InvenTree/stock/models.py +++ b/InvenTree/stock/models.py @@ -122,6 +122,12 @@ class StockLocation(InvenTreeBarcodeMixin, MetadataMixin, InvenTreeTree): 'but may be located to child locations.'), ) + external = models.BooleanField( + default=False, + verbose_name=_('External'), + help_text=_('This is an external stock location') + ) + def get_location_owner(self): """Get the closest "owner" for this location. diff --git a/InvenTree/stock/serializers.py b/InvenTree/stock/serializers.py index 99b0866792..7336a1d15c 100644 --- a/InvenTree/stock/serializers.py +++ b/InvenTree/stock/serializers.py @@ -584,6 +584,7 @@ class LocationSerializer(InvenTree.serializers.InvenTreeModelSerializer): 'owner', 'icon', 'structural', + 'external', ] read_only_fields = [ diff --git a/InvenTree/stock/templates/stock/item.html b/InvenTree/stock/templates/stock/item.html index 22e43be7b6..15e905f96e 100644 --- a/InvenTree/stock/templates/stock/item.html +++ b/InvenTree/stock/templates/stock/item.html @@ -313,17 +313,9 @@ constructForm('{% url "api-stock-test-result-list" %}', { method: 'POST', - fields: { - test: {}, - result: {}, - value: {}, - attachment: {}, - notes: {}, - stock_item: { - value: {{ item.pk }}, - hidden: true, - } - }, + fields: stockItemTestResultFields({ + stock_item: {{ item.pk }}, + }), title: '{% trans "Add Test Result" %}', onSuccess: reloadTable, }); diff --git a/InvenTree/stock/templates/stock/item_base.html b/InvenTree/stock/templates/stock/item_base.html index ffe49237f1..2ec331e233 100644 --- a/InvenTree/stock/templates/stock/item_base.html +++ b/InvenTree/stock/templates/stock/item_base.html @@ -640,7 +640,9 @@ $("#stock-return-from-customer").click(function() { value: {{ item.part.default_location.pk }}, {% endif %} }, - notes: {}, + notes: { + icon: 'fa-sticky-note', + }, }, method: 'POST', title: '{% trans "Return to Stock" %}', diff --git a/InvenTree/templates/InvenTree/settings/user_labels.html b/InvenTree/templates/InvenTree/settings/user_labels.html index 93c7c0b2bc..85492a2b98 100644 --- a/InvenTree/templates/InvenTree/settings/user_labels.html +++ b/InvenTree/templates/InvenTree/settings/user_labels.html @@ -15,6 +15,7 @@ {% include "InvenTree/settings/setting.html" with key="LABEL_INLINE" icon='fa-tag' user_setting=True %} + {% include "InvenTree/settings/setting.html" with key="LABEL_DEFAULT_PRINTER" icon='fa-tag' user_setting=True %}
diff --git a/InvenTree/templates/js/translated/attachment.js b/InvenTree/templates/js/translated/attachment.js index e56f5928ef..2ef3018123 100644 --- a/InvenTree/templates/js/translated/attachment.js +++ b/InvenTree/templates/js/translated/attachment.js @@ -25,7 +25,9 @@ function addAttachmentButtonCallbacks(url, fields={}) { var file_fields = { attachment: {}, - comment: {}, + comment: { + icon: 'fa-comment', + }, }; Object.assign(file_fields, fields); @@ -42,8 +44,12 @@ function addAttachmentButtonCallbacks(url, fields={}) { $('#new-attachment-link').click(function() { var link_fields = { - link: {}, - comment: {}, + link: { + icon: 'fa-link', + }, + comment: { + icon: 'fa-comment', + }, }; Object.assign(link_fields, fields); @@ -252,8 +258,12 @@ function loadAttachmentTable(url, options) { constructForm(`${url}${pk}/`, { fields: { - link: {}, - comment: {}, + link: { + icon: 'fa-link', + }, + comment: { + icon: 'fa-comment', + }, }, processResults: function(data, fields, opts) { // Remove the "link" field if the attachment is a file! diff --git a/InvenTree/templates/js/translated/bom.js b/InvenTree/templates/js/translated/bom.js index 4e94c014b0..4d277e9620 100644 --- a/InvenTree/templates/js/translated/bom.js +++ b/InvenTree/templates/js/translated/bom.js @@ -408,6 +408,7 @@ function bomItemFields() { hidden: true, }, sub_part: { + icon: 'fa-shapes', secondary: { title: '{% trans "New Part" %}', fields: function() { @@ -424,7 +425,9 @@ function bomItemFields() { quantity: {}, reference: {}, overage: {}, - note: {}, + note: { + icon: 'fa-sticky-note', + }, allow_variants: {}, inherited: {}, consumable: {}, diff --git a/InvenTree/templates/js/translated/build.js b/InvenTree/templates/js/translated/build.js index ef8ad46109..7d410a2a54 100644 --- a/InvenTree/templates/js/translated/build.js +++ b/InvenTree/templates/js/translated/build.js @@ -536,7 +536,9 @@ function completeBuildOutputs(build_id, outputs, options={}) { structural: false, }, }, - notes: {}, + notes: { + icon: 'fa-sticky-note', + }, accept_incomplete_allocation: {}, }, confirm: true, diff --git a/InvenTree/templates/js/translated/company.js b/InvenTree/templates/js/translated/company.js index 16b3ae9458..10eee69f48 100644 --- a/InvenTree/templates/js/translated/company.js +++ b/InvenTree/templates/js/translated/company.js @@ -13,11 +13,13 @@ createCompany, createManufacturerPart, createSupplierPart, + createSupplierPartPriceBreak, deleteManufacturerParts, deleteManufacturerPartParameters, deleteSupplierParts, duplicateSupplierPart, editCompany, + editSupplierPartPriceBreak, loadCompanyTable, loadManufacturerPartTable, loadManufacturerPartParameterTable, @@ -128,7 +130,7 @@ function supplierPartFields(options={}) { icon: 'fa-link', }, note: { - icon: 'fa-pencil-alt', + icon: 'fa-sticky-note', }, packaging: { icon: 'fa-box', @@ -321,6 +323,43 @@ function deleteSupplierParts(parts, options={}) { } +/* Construct set of fields for SupplierPartPriceBreak form */ +function supplierPartPriceBreakFields(options={}) { + let fields = { + part: { + hidden: true, + }, + quantity: {}, + price: { + icon: 'fa-dollar-sign', + }, + price_currency: { + icon: 'fa-coins', + }, + }; + + return fields; +} + +/* Create a new SupplierPartPriceBreak instance */ +function createSupplierPartPriceBreak(part_id, options={}) { + + let fields = supplierPartPriceBreakFields(options); + + fields.part.value = part_id; + + constructForm('{% url "api-part-supplier-price-list" %}', { + fields: fields, + method: 'POST', + fields: fields, + title: '{% trans "Add Price Break" %}', + onSuccess: function(response) { + handleFormSuccess(response, options); + } + }); +} + + // Returns a default form-set for creating / editing a Company object function companyFormFields() { @@ -1125,11 +1164,7 @@ function loadSupplierPriceBreakTable(options={}) { var pk = $(this).attr('pk'); constructForm(`/api/company/price-break/${pk}/`, { - fields: { - quantity: {}, - price: {}, - price_currency: {}, - }, + fields: supplierPartPriceBreakFields(), title: '{% trans "Edit Price Break" %}', onSuccess: function() { table.bootstrapTable('refresh'); diff --git a/InvenTree/templates/js/translated/label.js b/InvenTree/templates/js/translated/label.js index 18cd1605d0..4373f0d23b 100644 --- a/InvenTree/templates/js/translated/label.js +++ b/InvenTree/templates/js/translated/label.js @@ -262,7 +262,11 @@ function selectLabel(labels, items, options={}) { `; plugins.forEach(function(plugin) { - plugin_selection += ``; + var selected = ''; + if (user_settings['LABEL_DEFAULT_PRINTER'] == plugin.key) { + selected = ' selected'; + } + plugin_selection += ``; }); plugin_selection += ` diff --git a/InvenTree/templates/js/translated/order.js b/InvenTree/templates/js/translated/order.js index ffae026398..5fe3b6298e 100644 --- a/InvenTree/templates/js/translated/order.js +++ b/InvenTree/templates/js/translated/order.js @@ -35,6 +35,7 @@ duplicatePurchaseOrder, editPurchaseOrder, editPurchaseOrderLineItem, + editSalesOrder, exportOrder, issuePurchaseOrder, loadPurchaseOrderLineItemTable, @@ -55,6 +56,9 @@ */ +/* + * Form field definitions for a SalesOrderShipment + */ function salesOrderShipmentFields(options={}) { var fields = { order: {}, @@ -520,42 +524,55 @@ function createSalesOrderShipment(options={}) { } +function salesOrderFields(options={}) { + let fields = { + reference: { + icon: 'fa-hashtag', + }, + description: {}, + customer: { + icon: 'fa-user-tie', + secondary: { + title: '{% trans "Add Customer" %}', + fields: function() { + var fields = companyFormFields(); + + fields.is_customer.value = true; + + return fields; + } + } + }, + customer_reference: {}, + target_date: { + icon: 'fa-calendar-alt', + }, + link: { + icon: 'fa-link', + }, + responsible: { + icon: 'fa-user', + } + }; + + return fields; +} + + /* * Create a new SalesOrder */ function createSalesOrder(options={}) { + let fields = salesOrderFields(options); + + if (options.customer) { + fields.customer.value = options.customer; + } + constructForm('{% url "api-so-list" %}', { method: 'POST', - fields: { - reference: { - icon: 'fa-hashtag', - }, - customer: { - value: options.customer, - secondary: { - title: '{% trans "Add Customer" %}', - fields: function() { - var fields = companyFormFields(); - - fields.is_customer.value = true; - - return fields; - } - } - }, - customer_reference: {}, - description: {}, - target_date: { - icon: 'fa-calendar-alt', - }, - link: { - icon: 'fa-link', - }, - responsible: { - icon: 'fa-user', - } - }, + fields: fields, onSuccess: function(data) { location.href = `/order/sales-order/${data.pk}/`; }, @@ -564,12 +581,27 @@ function createSalesOrder(options={}) { } +/* + * Edit an existing SalesOrder + */ +function editSalesOrder(order_id, options={}) { + + constructForm(`/api/order/so/${order_id}/`, { + fields: salesOrderFields(options), + title: '{% trans "Edit Sales Order" %}', + onSuccess: function(response) { + handleFormSuccess(response, options); + } + }); +} + + /* * Launch a modal form to create a new SalesOrderLineItem */ function createSalesOrderLineItem(options={}) { - var fields = soLineItemFields(options); + let fields = soLineItemFields(options); constructForm('{% url "api-so-line-list" %}', { fields: fields, @@ -591,6 +623,7 @@ function purchaseOrderFields(options={}) { reference: { icon: 'fa-hashtag', }, + description: {}, supplier: { icon: 'fa-building', secondary: { @@ -604,7 +637,6 @@ function purchaseOrderFields(options={}) { } } }, - description: {}, supplier_reference: {}, target_date: { icon: 'fa-calendar-alt', @@ -762,13 +794,23 @@ function soLineItemFields(options={}) { order: { hidden: true, }, - part: {}, + part: { + icon: 'fa-shapes', + }, quantity: {}, reference: {}, - sale_price: {}, - sale_price_currency: {}, - target_date: {}, - notes: {}, + sale_price: { + icon: 'fa-dollar-sign', + }, + sale_price_currency: { + icon: 'fa-coins', + }, + target_date: { + icon: 'fa-calendar-alt', + }, + notes: { + icon: 'fa-sticky-note', + }, }; if (options.order) { @@ -792,9 +834,15 @@ function extraLineFields(options={}) { }, quantity: {}, reference: {}, - price: {}, - price_currency: {}, - notes: {}, + price: { + icon: 'fa-dollar-sign', + }, + price_currency: { + icon: 'fa-coins', + }, + notes: { + icon: 'fa-sticky-note', + }, }; if (options.order) { @@ -815,6 +863,7 @@ function poLineItemFields(options={}) { } }, part: { + icon: 'fa-shapes', filters: { part_detail: true, supplier_detail: true, @@ -911,15 +960,24 @@ function poLineItemFields(options={}) { }, quantity: {}, reference: {}, - purchase_price: {}, - purchase_price_currency: {}, - target_date: {}, + purchase_price: { + icon: 'fa-dollar-sign', + }, + purchase_price_currency: { + icon: 'fa-coins', + }, + target_date: { + icon: 'fa-calendar-alt', + }, destination: { + icon: 'fa-sitemap', filters: { structural: false, } }, - notes: {}, + notes: { + icon: 'fa-sticky-note', + }, }; if (options.order) { @@ -2655,13 +2713,7 @@ function loadPurchaseOrderExtraLineTable(table, options={}) { var pk = $(this).attr('pk'); constructForm(`/api/order/po-extra-line/${pk}/`, { - fields: { - quantity: {}, - reference: {}, - price: {}, - price_currency: {}, - notes: {}, - }, + fields: extraLineFields(), title: '{% trans "Edit Line" %}', onSuccess: reloadTable, }); @@ -4100,7 +4152,7 @@ function loadSalesOrderLineItemTable(table, options={}) { inventreeGet(`/api/order/so-line/${pk}/`, {}, { success: function(data) { - var fields = soLineItemFields(); + let fields = soLineItemFields(); constructForm('{% url "api-so-line-list" %}', { method: 'POST', @@ -4120,14 +4172,7 @@ function loadSalesOrderLineItemTable(table, options={}) { var pk = $(this).attr('pk'); constructForm(`/api/order/so-line/${pk}/`, { - fields: { - quantity: {}, - reference: {}, - sale_price: {}, - sale_price_currency: {}, - target_date: {}, - notes: {}, - }, + fields: soLineItemFields(), title: '{% trans "Edit Line Item" %}', onSuccess: reloadTable, }); @@ -4438,13 +4483,7 @@ function loadSalesOrderExtraLineTable(table, options={}) { var pk = $(this).attr('pk'); constructForm(`/api/order/so-extra-line/${pk}/`, { - fields: { - quantity: {}, - reference: {}, - price: {}, - price_currency: {}, - notes: {}, - }, + fields: extraLineFields(), title: '{% trans "Edit Line" %}', onSuccess: reloadTable, }); diff --git a/InvenTree/templates/js/translated/part.js b/InvenTree/templates/js/translated/part.js index 5f944fdc7c..94ffbc5333 100644 --- a/InvenTree/templates/js/translated/part.js +++ b/InvenTree/templates/js/translated/part.js @@ -41,6 +41,7 @@ loadSimplePartTable, partDetail, partStockLabel, + partTestTemplateFields, toggleStar, validateBom, */ @@ -108,11 +109,13 @@ function partFields(options={}) { icon: 'fa-link', }, default_location: { + icon: 'fa-sitemap', filters: { structural: false, } }, default_supplier: { + icon: 'fa-building', filters: { part_detail: true, supplier_detail: true, @@ -253,6 +256,7 @@ function categoryFields() { name: {}, description: {}, default_location: { + icon: 'fa-sitemap', filters: { structural: false, } @@ -978,11 +982,21 @@ function loadPartStocktakeTable(partId, options={}) { fields: { item_count: {}, quantity: {}, - cost_min: {}, - cost_min_currency: {}, - cost_max: {}, - cost_max_currency: {}, - note: {}, + cost_min: { + icon: 'fa-dollar-sign', + }, + cost_min_currency: { + icon: 'fa-coins', + }, + cost_max: { + icon: 'fa-dollar-sign', + }, + cost_max_currency: { + icon: 'fa-coins', + }, + note: { + icon: 'fa-sticky-note', + }, }, title: '{% trans "Edit Stocktake Entry" %}', onSuccess: function() { @@ -2403,10 +2417,32 @@ function loadPartCategoryTable(table, options) { }); } + +/* Construct a set of fields for the PartTestTemplate model form */ +function partTestTemplateFields(options={}) { + let fields = { + test_name: {}, + description: {}, + required: {}, + requires_value: {}, + requires_attachment: {}, + part: { + hidden: true, + } + }; + + if (options.part) { + fields.part.value = options.part; + } + + return fields; +} + + +/* + * Load PartTestTemplate table. + */ function loadPartTestTemplateTable(table, options) { - /* - * Load PartTestTemplate table. - */ var params = options.params || {}; @@ -2505,13 +2541,7 @@ function loadPartTestTemplateTable(table, options) { var url = `/api/part/test-template/${pk}/`; constructForm(url, { - fields: { - test_name: {}, - description: {}, - required: {}, - requires_value: {}, - requires_attachment: {}, - }, + fields: partTestTemplateFields(), title: '{% trans "Edit Test Result Template" %}', onSuccess: function() { table.bootstrapTable('refresh'); diff --git a/InvenTree/templates/js/translated/pricing.js b/InvenTree/templates/js/translated/pricing.js index 020d717728..690ed1762a 100644 --- a/InvenTree/templates/js/translated/pricing.js +++ b/InvenTree/templates/js/translated/pricing.js @@ -652,8 +652,12 @@ function initPriceBreakSet(table, options) { value: part_id, }, quantity: {}, - price: {}, - price_currency: {}, + price: { + icon: 'fa-dollar-sign', + }, + price_currency: { + icon: 'fa-coins', + }, }, method: 'POST', title: '{% trans "Add Price Break" %}', @@ -677,8 +681,12 @@ function initPriceBreakSet(table, options) { constructForm(`${pb_url}${pk}/`, { fields: { quantity: {}, - price: {}, - price_currency: {}, + price: { + icon: 'fa-dollar-sign', + }, + price_currency: { + icon: 'fa-coins', + }, }, title: '{% trans "Edit Price Break" %}', onSuccess: reloadPriceBreakTable, diff --git a/InvenTree/templates/js/translated/stock.js b/InvenTree/templates/js/translated/stock.js index db0bb68530..412305251b 100644 --- a/InvenTree/templates/js/translated/stock.js +++ b/InvenTree/templates/js/translated/stock.js @@ -117,6 +117,7 @@ function stockLocationFields(options={}) { description: {}, owner: {}, structural: {}, + external: {}, icon: { help_text: `{% trans "Icon (optional) - Explore all available icons on" %} Font Awesome.`, placeholder: 'fas fa-box', @@ -310,18 +311,24 @@ function stockItemFields(options={}) { icon: 'fa-layer-group', }, status: {}, - expiry_date: {}, + expiry_date: { + icon: 'fa-calendar-alt', + }, purchase_price: { icon: 'fa-dollar-sign', }, - purchase_price_currency: {}, + purchase_price_currency: { + icon: 'fa-coins', + }, packaging: { icon: 'fa-box', }, link: { icon: 'fa-link', }, - owner: {}, + owner: { + icon: 'fa-user', + }, delete_on_deplete: {}, }; @@ -685,7 +692,9 @@ function assignStockToCustomer(items, options={}) { is_customer: true, }, }, - notes: {}, + notes: { + icon: 'fa-sticky-note', + }, }, confirm: true, confirmMessage: '{% trans "Confirm stock assignment" %}', @@ -854,7 +863,9 @@ function mergeStockItems(items, options={}) { structural: false, } }, - notes: {}, + notes: { + icon: 'fa-sticky-note', + }, allow_mismatched_suppliers: {}, allow_mismatched_status: {}, }, @@ -1298,6 +1309,28 @@ function formatDate(row) { return html; } +/* Construct set of default fields for a StockItemTestResult */ +function stockItemTestResultFields(options={}) { + let fields = { + test: {}, + result: {}, + value: {}, + attachment: {}, + notes: { + icon: 'fa-sticky-note', + }, + stock_item: { + hidden: true, + }, + }; + + if (options.stock_item) { + fields.stock_item.value = options.stock_item; + } + + return fields; +} + /* * Load StockItemTestResult table */ @@ -1563,7 +1596,9 @@ function loadStockTestResultsTable(table, options) { result: {}, value: {}, attachment: {}, - notes: {}, + notes: { + icon: 'fa-sticky-note', + }, stock_item: { value: options.stock_item, hidden: true, @@ -1583,13 +1618,7 @@ function loadStockTestResultsTable(table, options) { var url = `/api/stock/test/${pk}/`; constructForm(url, { - fields: { - test: {}, - result: {}, - value: {}, - attachment: {}, - notes: {}, - }, + fields: stockItemTestResultFields(), title: '{% trans "Edit Test Result" %}', onSuccess: reloadTestTable, }); @@ -2491,6 +2520,24 @@ function loadStockLocationTable(table, options) { title: '{% trans "Stock Items" %}', switchable: true, sortable: true, + }, + { + field: 'structural', + title: '{% trans "Structural" %}', + switchable: true, + sortable: false, + formatter: function(value) { + return yesNoLabel(value); + } + }, + { + field: 'external', + title: '{% trans "External" %}', + switchable: true, + sortable: false, + formatter: function(value) { + return yesNoLabel(value); + } } ] }); @@ -2841,7 +2888,9 @@ function uninstallStockItem(installed_item_id, options={}) { structural: false, } }, - note: {}, + note: { + icon: 'fa-sticky-note', + }, }, preFormContent: function(opts) { var html = ''; diff --git a/InvenTree/templates/js/translated/table_filters.js b/InvenTree/templates/js/translated/table_filters.js index 5035c7178e..6eb1b35791 100644 --- a/InvenTree/templates/js/translated/table_filters.js +++ b/InvenTree/templates/js/translated/table_filters.js @@ -134,6 +134,10 @@ function getAvailableTableFilters(tableKey) { type: 'bool', title: '{% trans "Structural" %}', }, + external: { + type: 'bool', + title: '{% trans "External" %}', + }, }; }