2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-06-16 12:05:53 +00:00

Merge remote-tracking branch 'inventree/master' into pricing-form-updates

This commit is contained in:
Oliver Walters
2023-02-21 22:13:13 +11:00
22 changed files with 361 additions and 180 deletions

View File

@ -2,11 +2,14 @@
# InvenTree API version # 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 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 v96 -> 2023-02-16 : https://github.com/inventree/InvenTree/pull/4345
- Adds stocktake report generation functionality - Adds stocktake report generation functionality

View File

@ -46,6 +46,7 @@ import InvenTree.ready
import InvenTree.tasks import InvenTree.tasks
import InvenTree.validators import InvenTree.validators
import order.validators import order.validators
from plugin import registry
logger = logging.getLogger('inventree') logger = logging.getLogger('inventree')
@ -1628,6 +1629,15 @@ class InvenTreeSetting(BaseInvenTreeSetting):
return False 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): class InvenTreeUserSetting(BaseInvenTreeSetting):
"""An InvenTreeSetting object with a usercontext.""" """An InvenTreeSetting object with a usercontext."""
@ -1781,6 +1791,13 @@ class InvenTreeUserSetting(BaseInvenTreeSetting):
'validator': bool, '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": { "REPORT_INLINE": {
'name': _('Inline report display'), 'name': _('Inline report display'),
'description': _('Display PDF reports in the browser, instead of downloading as a file'), 'description': _('Display PDF reports in the browser, instead of downloading as a file'),

View File

@ -299,27 +299,12 @@ loadSupplierPriceBreakTable({
}); });
$('#new-price-break').click(function() { $('#new-price-break').click(function() {
createSupplierPartPriceBreak({{ part.pk }}, {
constructForm( onSuccess: function() {
'{% url "api-part-supplier-price-list" %}', $("#price-break-table").bootstrapTable("refresh");
{
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");
}
} }
); });
}); });
loadPurchaseOrderTable($("#purchase-order-table"), { loadPurchaseOrderTable($("#purchase-order-table"), {

View File

@ -206,28 +206,7 @@ src="{% static 'img/blank_image.png' %}"
$("#edit-order").click(function() { $("#edit-order").click(function() {
constructForm('{% url "api-so-detail" order.pk %}', { editSalesOrder({{ 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" %}',
reload: true, reload: true,
}); });
}); });

View File

@ -793,17 +793,9 @@
constructForm('{% url "api-part-test-template-list" %}', { constructForm('{% url "api-part-test-template-list" %}', {
method: 'POST', method: 'POST',
fields: { fields: partTestTemplateFields({
test_name: {}, part: {{ part.pk }}
description: {}, }),
required: {},
requires_value: {},
requires_attachment: {},
part: {
value: {{ part.pk }},
hidden: true,
}
},
title: '{% trans "Add Test Result Template" %}', title: '{% trans "Add Test Result Template" %}',
onSuccess: function() { onSuccess: function() {
$("#test-template-table").bootstrapTable("refresh"); $("#test-template-table").bootstrapTable("refresh");

View File

@ -310,7 +310,8 @@ class StockLocationList(APIDownloadMixin, ListCreateAPI):
filterset_fields = [ filterset_fields = [
'name', 'name',
'structural' 'structural',
'external',
] ]
search_fields = [ search_fields = [

View File

@ -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'),
),
]

View File

@ -122,6 +122,12 @@ class StockLocation(InvenTreeBarcodeMixin, MetadataMixin, InvenTreeTree):
'but may be located to child locations.'), '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): def get_location_owner(self):
"""Get the closest "owner" for this location. """Get the closest "owner" for this location.

View File

@ -584,6 +584,7 @@ class LocationSerializer(InvenTree.serializers.InvenTreeModelSerializer):
'owner', 'owner',
'icon', 'icon',
'structural', 'structural',
'external',
] ]
read_only_fields = [ read_only_fields = [

View File

@ -313,17 +313,9 @@
constructForm('{% url "api-stock-test-result-list" %}', { constructForm('{% url "api-stock-test-result-list" %}', {
method: 'POST', method: 'POST',
fields: { fields: stockItemTestResultFields({
test: {}, stock_item: {{ item.pk }},
result: {}, }),
value: {},
attachment: {},
notes: {},
stock_item: {
value: {{ item.pk }},
hidden: true,
}
},
title: '{% trans "Add Test Result" %}', title: '{% trans "Add Test Result" %}',
onSuccess: reloadTable, onSuccess: reloadTable,
}); });

View File

@ -640,7 +640,9 @@ $("#stock-return-from-customer").click(function() {
value: {{ item.part.default_location.pk }}, value: {{ item.part.default_location.pk }},
{% endif %} {% endif %}
}, },
notes: {}, notes: {
icon: 'fa-sticky-note',
},
}, },
method: 'POST', method: 'POST',
title: '{% trans "Return to Stock" %}', title: '{% trans "Return to Stock" %}',

View File

@ -15,6 +15,7 @@
<table class='table table-striped table-condensed'> <table class='table table-striped table-condensed'>
<tbody> <tbody>
{% include "InvenTree/settings/setting.html" with key="LABEL_INLINE" icon='fa-tag' user_setting=True %} {% 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 %}
</tbody> </tbody>
</table> </table>
</div> </div>

View File

@ -25,7 +25,9 @@ function addAttachmentButtonCallbacks(url, fields={}) {
var file_fields = { var file_fields = {
attachment: {}, attachment: {},
comment: {}, comment: {
icon: 'fa-comment',
},
}; };
Object.assign(file_fields, fields); Object.assign(file_fields, fields);
@ -42,8 +44,12 @@ function addAttachmentButtonCallbacks(url, fields={}) {
$('#new-attachment-link').click(function() { $('#new-attachment-link').click(function() {
var link_fields = { var link_fields = {
link: {}, link: {
comment: {}, icon: 'fa-link',
},
comment: {
icon: 'fa-comment',
},
}; };
Object.assign(link_fields, fields); Object.assign(link_fields, fields);
@ -252,8 +258,12 @@ function loadAttachmentTable(url, options) {
constructForm(`${url}${pk}/`, { constructForm(`${url}${pk}/`, {
fields: { fields: {
link: {}, link: {
comment: {}, icon: 'fa-link',
},
comment: {
icon: 'fa-comment',
},
}, },
processResults: function(data, fields, opts) { processResults: function(data, fields, opts) {
// Remove the "link" field if the attachment is a file! // Remove the "link" field if the attachment is a file!

View File

@ -408,6 +408,7 @@ function bomItemFields() {
hidden: true, hidden: true,
}, },
sub_part: { sub_part: {
icon: 'fa-shapes',
secondary: { secondary: {
title: '{% trans "New Part" %}', title: '{% trans "New Part" %}',
fields: function() { fields: function() {
@ -424,7 +425,9 @@ function bomItemFields() {
quantity: {}, quantity: {},
reference: {}, reference: {},
overage: {}, overage: {},
note: {}, note: {
icon: 'fa-sticky-note',
},
allow_variants: {}, allow_variants: {},
inherited: {}, inherited: {},
consumable: {}, consumable: {},

View File

@ -536,7 +536,9 @@ function completeBuildOutputs(build_id, outputs, options={}) {
structural: false, structural: false,
}, },
}, },
notes: {}, notes: {
icon: 'fa-sticky-note',
},
accept_incomplete_allocation: {}, accept_incomplete_allocation: {},
}, },
confirm: true, confirm: true,

View File

@ -13,11 +13,13 @@
createCompany, createCompany,
createManufacturerPart, createManufacturerPart,
createSupplierPart, createSupplierPart,
createSupplierPartPriceBreak,
deleteManufacturerParts, deleteManufacturerParts,
deleteManufacturerPartParameters, deleteManufacturerPartParameters,
deleteSupplierParts, deleteSupplierParts,
duplicateSupplierPart, duplicateSupplierPart,
editCompany, editCompany,
editSupplierPartPriceBreak,
loadCompanyTable, loadCompanyTable,
loadManufacturerPartTable, loadManufacturerPartTable,
loadManufacturerPartParameterTable, loadManufacturerPartParameterTable,
@ -128,7 +130,7 @@ function supplierPartFields(options={}) {
icon: 'fa-link', icon: 'fa-link',
}, },
note: { note: {
icon: 'fa-pencil-alt', icon: 'fa-sticky-note',
}, },
packaging: { packaging: {
icon: 'fa-box', 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 // Returns a default form-set for creating / editing a Company object
function companyFormFields() { function companyFormFields() {
@ -1125,11 +1164,7 @@ function loadSupplierPriceBreakTable(options={}) {
var pk = $(this).attr('pk'); var pk = $(this).attr('pk');
constructForm(`/api/company/price-break/${pk}/`, { constructForm(`/api/company/price-break/${pk}/`, {
fields: { fields: supplierPartPriceBreakFields(),
quantity: {},
price: {},
price_currency: {},
},
title: '{% trans "Edit Price Break" %}', title: '{% trans "Edit Price Break" %}',
onSuccess: function() { onSuccess: function() {
table.bootstrapTable('refresh'); table.bootstrapTable('refresh');

View File

@ -262,7 +262,11 @@ function selectLabel(labels, items, options={}) {
`; `;
plugins.forEach(function(plugin) { plugins.forEach(function(plugin) {
plugin_selection += `<option value='${plugin.key}' title='${plugin.meta.human_name}'>${plugin.name} - <small>${plugin.meta.human_name}</small></option>`; var selected = '';
if (user_settings['LABEL_DEFAULT_PRINTER'] == plugin.key) {
selected = ' selected';
}
plugin_selection += `<option value='${plugin.key}' title='${plugin.meta.human_name}'${selected}>${plugin.name} - <small>${plugin.meta.human_name}</small></option>`;
}); });
plugin_selection += ` plugin_selection += `

View File

@ -35,6 +35,7 @@
duplicatePurchaseOrder, duplicatePurchaseOrder,
editPurchaseOrder, editPurchaseOrder,
editPurchaseOrderLineItem, editPurchaseOrderLineItem,
editSalesOrder,
exportOrder, exportOrder,
issuePurchaseOrder, issuePurchaseOrder,
loadPurchaseOrderLineItemTable, loadPurchaseOrderLineItemTable,
@ -55,6 +56,9 @@
*/ */
/*
* Form field definitions for a SalesOrderShipment
*/
function salesOrderShipmentFields(options={}) { function salesOrderShipmentFields(options={}) {
var fields = { var fields = {
order: {}, 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 * Create a new SalesOrder
*/ */
function createSalesOrder(options={}) { function createSalesOrder(options={}) {
let fields = salesOrderFields(options);
if (options.customer) {
fields.customer.value = options.customer;
}
constructForm('{% url "api-so-list" %}', { constructForm('{% url "api-so-list" %}', {
method: 'POST', method: 'POST',
fields: { fields: 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',
}
},
onSuccess: function(data) { onSuccess: function(data) {
location.href = `/order/sales-order/${data.pk}/`; 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 * Launch a modal form to create a new SalesOrderLineItem
*/ */
function createSalesOrderLineItem(options={}) { function createSalesOrderLineItem(options={}) {
var fields = soLineItemFields(options); let fields = soLineItemFields(options);
constructForm('{% url "api-so-line-list" %}', { constructForm('{% url "api-so-line-list" %}', {
fields: fields, fields: fields,
@ -591,6 +623,7 @@ function purchaseOrderFields(options={}) {
reference: { reference: {
icon: 'fa-hashtag', icon: 'fa-hashtag',
}, },
description: {},
supplier: { supplier: {
icon: 'fa-building', icon: 'fa-building',
secondary: { secondary: {
@ -604,7 +637,6 @@ function purchaseOrderFields(options={}) {
} }
} }
}, },
description: {},
supplier_reference: {}, supplier_reference: {},
target_date: { target_date: {
icon: 'fa-calendar-alt', icon: 'fa-calendar-alt',
@ -762,13 +794,23 @@ function soLineItemFields(options={}) {
order: { order: {
hidden: true, hidden: true,
}, },
part: {}, part: {
icon: 'fa-shapes',
},
quantity: {}, quantity: {},
reference: {}, reference: {},
sale_price: {}, sale_price: {
sale_price_currency: {}, icon: 'fa-dollar-sign',
target_date: {}, },
notes: {}, sale_price_currency: {
icon: 'fa-coins',
},
target_date: {
icon: 'fa-calendar-alt',
},
notes: {
icon: 'fa-sticky-note',
},
}; };
if (options.order) { if (options.order) {
@ -792,9 +834,15 @@ function extraLineFields(options={}) {
}, },
quantity: {}, quantity: {},
reference: {}, reference: {},
price: {}, price: {
price_currency: {}, icon: 'fa-dollar-sign',
notes: {}, },
price_currency: {
icon: 'fa-coins',
},
notes: {
icon: 'fa-sticky-note',
},
}; };
if (options.order) { if (options.order) {
@ -815,6 +863,7 @@ function poLineItemFields(options={}) {
} }
}, },
part: { part: {
icon: 'fa-shapes',
filters: { filters: {
part_detail: true, part_detail: true,
supplier_detail: true, supplier_detail: true,
@ -911,15 +960,24 @@ function poLineItemFields(options={}) {
}, },
quantity: {}, quantity: {},
reference: {}, reference: {},
purchase_price: {}, purchase_price: {
purchase_price_currency: {}, icon: 'fa-dollar-sign',
target_date: {}, },
purchase_price_currency: {
icon: 'fa-coins',
},
target_date: {
icon: 'fa-calendar-alt',
},
destination: { destination: {
icon: 'fa-sitemap',
filters: { filters: {
structural: false, structural: false,
} }
}, },
notes: {}, notes: {
icon: 'fa-sticky-note',
},
}; };
if (options.order) { if (options.order) {
@ -2655,13 +2713,7 @@ function loadPurchaseOrderExtraLineTable(table, options={}) {
var pk = $(this).attr('pk'); var pk = $(this).attr('pk');
constructForm(`/api/order/po-extra-line/${pk}/`, { constructForm(`/api/order/po-extra-line/${pk}/`, {
fields: { fields: extraLineFields(),
quantity: {},
reference: {},
price: {},
price_currency: {},
notes: {},
},
title: '{% trans "Edit Line" %}', title: '{% trans "Edit Line" %}',
onSuccess: reloadTable, onSuccess: reloadTable,
}); });
@ -4100,7 +4152,7 @@ function loadSalesOrderLineItemTable(table, options={}) {
inventreeGet(`/api/order/so-line/${pk}/`, {}, { inventreeGet(`/api/order/so-line/${pk}/`, {}, {
success: function(data) { success: function(data) {
var fields = soLineItemFields(); let fields = soLineItemFields();
constructForm('{% url "api-so-line-list" %}', { constructForm('{% url "api-so-line-list" %}', {
method: 'POST', method: 'POST',
@ -4120,14 +4172,7 @@ function loadSalesOrderLineItemTable(table, options={}) {
var pk = $(this).attr('pk'); var pk = $(this).attr('pk');
constructForm(`/api/order/so-line/${pk}/`, { constructForm(`/api/order/so-line/${pk}/`, {
fields: { fields: soLineItemFields(),
quantity: {},
reference: {},
sale_price: {},
sale_price_currency: {},
target_date: {},
notes: {},
},
title: '{% trans "Edit Line Item" %}', title: '{% trans "Edit Line Item" %}',
onSuccess: reloadTable, onSuccess: reloadTable,
}); });
@ -4438,13 +4483,7 @@ function loadSalesOrderExtraLineTable(table, options={}) {
var pk = $(this).attr('pk'); var pk = $(this).attr('pk');
constructForm(`/api/order/so-extra-line/${pk}/`, { constructForm(`/api/order/so-extra-line/${pk}/`, {
fields: { fields: extraLineFields(),
quantity: {},
reference: {},
price: {},
price_currency: {},
notes: {},
},
title: '{% trans "Edit Line" %}', title: '{% trans "Edit Line" %}',
onSuccess: reloadTable, onSuccess: reloadTable,
}); });

View File

@ -41,6 +41,7 @@
loadSimplePartTable, loadSimplePartTable,
partDetail, partDetail,
partStockLabel, partStockLabel,
partTestTemplateFields,
toggleStar, toggleStar,
validateBom, validateBom,
*/ */
@ -108,11 +109,13 @@ function partFields(options={}) {
icon: 'fa-link', icon: 'fa-link',
}, },
default_location: { default_location: {
icon: 'fa-sitemap',
filters: { filters: {
structural: false, structural: false,
} }
}, },
default_supplier: { default_supplier: {
icon: 'fa-building',
filters: { filters: {
part_detail: true, part_detail: true,
supplier_detail: true, supplier_detail: true,
@ -253,6 +256,7 @@ function categoryFields() {
name: {}, name: {},
description: {}, description: {},
default_location: { default_location: {
icon: 'fa-sitemap',
filters: { filters: {
structural: false, structural: false,
} }
@ -978,11 +982,21 @@ function loadPartStocktakeTable(partId, options={}) {
fields: { fields: {
item_count: {}, item_count: {},
quantity: {}, quantity: {},
cost_min: {}, cost_min: {
cost_min_currency: {}, icon: 'fa-dollar-sign',
cost_max: {}, },
cost_max_currency: {}, cost_min_currency: {
note: {}, 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" %}', title: '{% trans "Edit Stocktake Entry" %}',
onSuccess: function() { 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) { function loadPartTestTemplateTable(table, options) {
/*
* Load PartTestTemplate table.
*/
var params = options.params || {}; var params = options.params || {};
@ -2505,13 +2541,7 @@ function loadPartTestTemplateTable(table, options) {
var url = `/api/part/test-template/${pk}/`; var url = `/api/part/test-template/${pk}/`;
constructForm(url, { constructForm(url, {
fields: { fields: partTestTemplateFields(),
test_name: {},
description: {},
required: {},
requires_value: {},
requires_attachment: {},
},
title: '{% trans "Edit Test Result Template" %}', title: '{% trans "Edit Test Result Template" %}',
onSuccess: function() { onSuccess: function() {
table.bootstrapTable('refresh'); table.bootstrapTable('refresh');

View File

@ -652,8 +652,12 @@ function initPriceBreakSet(table, options) {
value: part_id, value: part_id,
}, },
quantity: {}, quantity: {},
price: {}, price: {
price_currency: {}, icon: 'fa-dollar-sign',
},
price_currency: {
icon: 'fa-coins',
},
}, },
method: 'POST', method: 'POST',
title: '{% trans "Add Price Break" %}', title: '{% trans "Add Price Break" %}',
@ -677,8 +681,12 @@ function initPriceBreakSet(table, options) {
constructForm(`${pb_url}${pk}/`, { constructForm(`${pb_url}${pk}/`, {
fields: { fields: {
quantity: {}, quantity: {},
price: {}, price: {
price_currency: {}, icon: 'fa-dollar-sign',
},
price_currency: {
icon: 'fa-coins',
},
}, },
title: '{% trans "Edit Price Break" %}', title: '{% trans "Edit Price Break" %}',
onSuccess: reloadPriceBreakTable, onSuccess: reloadPriceBreakTable,

View File

@ -117,6 +117,7 @@ function stockLocationFields(options={}) {
description: {}, description: {},
owner: {}, owner: {},
structural: {}, structural: {},
external: {},
icon: { icon: {
help_text: `{% trans "Icon (optional) - Explore all available icons on" %} <a href="https://fontawesome.com/v5/search?s=solid" target="_blank" rel="noopener noreferrer">Font Awesome</a>.`, help_text: `{% trans "Icon (optional) - Explore all available icons on" %} <a href="https://fontawesome.com/v5/search?s=solid" target="_blank" rel="noopener noreferrer">Font Awesome</a>.`,
placeholder: 'fas fa-box', placeholder: 'fas fa-box',
@ -310,18 +311,24 @@ function stockItemFields(options={}) {
icon: 'fa-layer-group', icon: 'fa-layer-group',
}, },
status: {}, status: {},
expiry_date: {}, expiry_date: {
icon: 'fa-calendar-alt',
},
purchase_price: { purchase_price: {
icon: 'fa-dollar-sign', icon: 'fa-dollar-sign',
}, },
purchase_price_currency: {}, purchase_price_currency: {
icon: 'fa-coins',
},
packaging: { packaging: {
icon: 'fa-box', icon: 'fa-box',
}, },
link: { link: {
icon: 'fa-link', icon: 'fa-link',
}, },
owner: {}, owner: {
icon: 'fa-user',
},
delete_on_deplete: {}, delete_on_deplete: {},
}; };
@ -685,7 +692,9 @@ function assignStockToCustomer(items, options={}) {
is_customer: true, is_customer: true,
}, },
}, },
notes: {}, notes: {
icon: 'fa-sticky-note',
},
}, },
confirm: true, confirm: true,
confirmMessage: '{% trans "Confirm stock assignment" %}', confirmMessage: '{% trans "Confirm stock assignment" %}',
@ -854,7 +863,9 @@ function mergeStockItems(items, options={}) {
structural: false, structural: false,
} }
}, },
notes: {}, notes: {
icon: 'fa-sticky-note',
},
allow_mismatched_suppliers: {}, allow_mismatched_suppliers: {},
allow_mismatched_status: {}, allow_mismatched_status: {},
}, },
@ -1298,6 +1309,28 @@ function formatDate(row) {
return html; 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 * Load StockItemTestResult table
*/ */
@ -1563,7 +1596,9 @@ function loadStockTestResultsTable(table, options) {
result: {}, result: {},
value: {}, value: {},
attachment: {}, attachment: {},
notes: {}, notes: {
icon: 'fa-sticky-note',
},
stock_item: { stock_item: {
value: options.stock_item, value: options.stock_item,
hidden: true, hidden: true,
@ -1583,13 +1618,7 @@ function loadStockTestResultsTable(table, options) {
var url = `/api/stock/test/${pk}/`; var url = `/api/stock/test/${pk}/`;
constructForm(url, { constructForm(url, {
fields: { fields: stockItemTestResultFields(),
test: {},
result: {},
value: {},
attachment: {},
notes: {},
},
title: '{% trans "Edit Test Result" %}', title: '{% trans "Edit Test Result" %}',
onSuccess: reloadTestTable, onSuccess: reloadTestTable,
}); });
@ -2491,6 +2520,24 @@ function loadStockLocationTable(table, options) {
title: '{% trans "Stock Items" %}', title: '{% trans "Stock Items" %}',
switchable: true, switchable: true,
sortable: 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, structural: false,
} }
}, },
note: {}, note: {
icon: 'fa-sticky-note',
},
}, },
preFormContent: function(opts) { preFormContent: function(opts) {
var html = ''; var html = '';

View File

@ -134,6 +134,10 @@ function getAvailableTableFilters(tableKey) {
type: 'bool', type: 'bool',
title: '{% trans "Structural" %}', title: '{% trans "Structural" %}',
}, },
external: {
type: 'bool',
title: '{% trans "External" %}',
},
}; };
} }