2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-06-18 13:05:42 +00:00

Merge branch 'inventree:master' into search-autocomplete

This commit is contained in:
Matthias Mair
2021-07-19 23:39:16 +02:00
committed by GitHub
42 changed files with 604 additions and 929 deletions

View File

@ -23,7 +23,8 @@
{% include "InvenTree/settings/setting.html" with key="PART_SHOW_PRICE_IN_FORMS" icon="fa-dollar-sign" %}
{% include "InvenTree/settings/setting.html" with key="PART_SHOW_RELATED" icon="fa-random" %}
{% include "InvenTree/settings/setting.html" with key="PART_RECENT_COUNT" icon="fa-clock" %}
<tr><td colspan='5 '></td></tr>
{% include "InvenTree/settings/setting.html" with key="PART_CREATE_INITIAL" icon="fa-boxes" %}
<tr><td colspan='5'></td></tr>
{% include "InvenTree/settings/setting.html" with key="PART_TEMPLATE" icon="fa-clone" %}
{% include "InvenTree/settings/setting.html" with key="PART_ASSEMBLY" icon="fa-tools" %}
{% include "InvenTree/settings/setting.html" with key="PART_COMPONENT" icon="fa-th"%}

View File

@ -1,6 +1,142 @@
{% load i18n %}
function manufacturerPartFields() {
return {
part: {},
manufacturer: {},
MPN: {
icon: 'fa-hashtag',
},
description: {},
link: {
icon: 'fa-link',
}
};
}
function createManufacturerPart(options={}) {
var fields = manufacturerPartFields();
if (options.part) {
fields.part.value = options.part;
fields.part.hidden = true;
}
if (options.manufacturer) {
fields.manufacturer.value = options.manufacturer;
}
constructForm('{% url "api-manufacturer-part-list" %}', {
fields: fields,
method: 'POST',
title: '{% trans "Add Manufacturer Part" %}',
onSuccess: options.onSuccess
});
}
function editManufacturerPart(part, options={}) {
var url = `/api/company/part/manufacturer/${part}/`;
constructForm(url, {
fields: manufacturerPartFields(),
title: '{% trans "Edit Manufacturer Part" %}',
onSuccess: options.onSuccess
});
}
function deleteManufacturerPart(part, options={}) {
constructForm(`/api/company/part/manufacturer/${part}/`, {
method: 'DELETE',
title: '{% trans "Delete Manufacturer Part" %}',
onSuccess: options.onSuccess,
});
}
function supplierPartFields() {
return {
part: {},
supplier: {},
SKU: {
icon: 'fa-hashtag',
},
manufacturer_part: {
filters: {
part_detail: true,
manufacturer_detail: true,
}
},
description: {},
link: {
icon: 'fa-link',
},
note: {
icon: 'fa-pencil-alt',
},
packaging: {
icon: 'fa-box',
}
};
}
/*
* Launch a form to create a new ManufacturerPart
*/
function createSupplierPart(options={}) {
var fields = supplierPartFields();
if (options.part) {
fields.manufacturer_part.filters.part = options.part;
fields.part.hidden = true;
fields.part.value = options.part;
}
if (options.supplier) {
fields.supplier.value = options.supplier;
}
if (options.manufacturer_part) {
fields.manufacturer_part.value = options.manufacturer_part;
}
constructForm('{% url "api-supplier-part-list" %}', {
fields: fields,
method: 'POST',
title: '{% trans "Add Supplier Part" %}',
onSuccess: options.onSuccess,
});
}
function editSupplierPart(part, options={}) {
constructForm(`/api/company/part/${part}/`, {
fields: supplierPartFields(),
title: '{% trans "Edit Supplier Part" %}',
onSuccess: options.onSuccess
});
}
function deleteSupplierPart(part, options={}) {
constructForm(`/api/company/part/${part}/`, {
method: 'DELETE',
title: '{% trans "Delete Supplier Part" %}',
onSuccess: options.onSuccess,
});
}
// Returns a default form-set for creating / editing a Company object
function companyFormFields(options={}) {
@ -323,8 +459,52 @@ function loadManufacturerPartTable(table, url, options) {
title: '{% trans "Description" %}',
sortable: false,
switchable: true,
},
{
field: 'actions',
title: '',
sortable: false,
switchable: false,
formatter: function(value, row) {
var pk = row.pk;
var html = `<div class='btn-group float-right' role='group'>`;
html += makeIconButton('fa-edit icon-blue', 'button-manufacturer-part-edit', pk, '{% trans "Edit manufacturer part" %}');
html += makeIconButton('fa-trash-alt icon-red', 'button-manufacturer-part-delete', pk, '{% trans "Delete manufacturer part" %}');
html += '</div>';
return html;
}
}
],
onPostBody: function() {
// Callbacks
$(table).find('.button-manufacturer-part-edit').click(function() {
var pk = $(this).attr('pk');
editManufacturerPart(
pk,
{
onSuccess: function() {
$(table).bootstrapTable('refresh');
}
});
});
$(table).find('.button-manufacturer-part-delete').click(function() {
var pk = $(this).attr('pk');
deleteManufacturerPart(
pk,
{
onSuccess: function() {
$(table).bootstrapTable('refresh');
}
});
})
}
});
}
@ -570,7 +750,51 @@ function loadSupplierPartTable(table, url, options) {
field: 'packaging',
title: '{% trans "Packaging" %}',
sortable: false,
},
{
field: 'actions',
title: '',
sortable: false,
switchable: false,
formatter: function(value, row) {
var pk = row.pk;
var html = `<div class='btn-group float-right' role='group'>`;
html += makeIconButton('fa-edit icon-blue', 'button-supplier-part-edit', pk, '{% trans "Edit supplier part" %}');
html += makeIconButton('fa-trash-alt icon-red', 'button-supplier-part-delete', pk, '{% trans "Delete supplier part" %}');
html += '</div>';
return html;
}
}
],
onPostBody: function() {
// Callbacks
$(table).find('.button-supplier-part-edit').click(function() {
var pk = $(this).attr('pk');
editSupplierPart(
pk,
{
onSuccess: function() {
$(table).bootstrapTable('refresh');
}
});
});
$(table).find('.button-supplier-part-delete').click(function() {
var pk = $(this).attr('pk');
deleteSupplierPart(
pk,
{
onSuccess: function() {
$(table).bootstrapTable('refresh');
}
});
})
}
});
}

View File

@ -252,6 +252,11 @@ function constructDeleteForm(fields, options) {
*/
function constructForm(url, options) {
// An "empty" form will be defined locally
if (url == null) {
constructFormBody({}, options);
}
// Save the URL
options.url = url;
@ -378,6 +383,11 @@ function constructFormBody(fields, options) {
fields[field].placeholder = field_options.placeholder;
}
// Choices
if (field_options.choices) {
fields[field].choices = field_options.choices;
}
// Field prefix
if (field_options.prefix) {
fields[field].prefix = field_options.prefix;
@ -1113,7 +1123,7 @@ function initializeRelatedField(name, field, options) {
var pk = field.value;
var url = `${field.api_url}/${pk}/`.replace('//', '/');
inventreeGet(url, {}, {
inventreeGet(url, field.filters || {}, {
success: function(data) {
setRelatedFieldData(name, data, options);
}
@ -1211,6 +1221,9 @@ function renderModelData(name, model, data, parameters, options) {
case 'partparametertemplate':
renderer = renderPartParameterTemplate;
break;
case 'manufacturerpart':
renderer = renderManufacturerPart;
break;
case 'supplierpart':
renderer = renderSupplierPart;
break;

View File

@ -765,6 +765,9 @@ function attachSecondaryModal(modal, options) {
function attachSecondaries(modal, secondaries) {
/* Attach a provided list of secondary modals */
// 2021-07-18 - Secondary modals will be disabled for now, until they are re-implemented in the "API forms" architecture
return;
for (var i = 0; i < secondaries.length; i++) {
attachSecondaryModal(modal, secondaries[i]);
}

View File

@ -67,7 +67,9 @@ function renderStockItem(name, data, parameters, options) {
// Renderer for "StockLocation" model
function renderStockLocation(name, data, parameters, options) {
var html = `<span>${data.name}</span>`;
var level = '- '.repeat(data.level);
var html = `<span>${level}${data.pathstring}</span>`;
if (data.description) {
html += ` - <i>${data.description}</i>`;
@ -75,10 +77,6 @@ function renderStockLocation(name, data, parameters, options) {
html += `<span class='float-right'>{% trans "Location ID" %}: ${data.pk}</span>`;
if (data.pathstring) {
html += `<p><small>${data.pathstring}</small></p>`;
}
return html;
}
@ -154,7 +152,9 @@ function renderOwner(name, data, parameters, options) {
// Renderer for "PartCategory" model
function renderPartCategory(name, data, parameters, options) {
var html = `<span><b>${data.name}</b></span>`;
var level = '- '.repeat(data.level);
var html = `<span>${level}${data.pathstring}</span>`;
if (data.description) {
html += ` - <i>${data.description}</i>`;
@ -162,10 +162,6 @@ function renderPartCategory(name, data, parameters, options) {
html += `<span class='float-right'>{% trans "Category ID" %}: ${data.pk}</span>`;
if (data.pathstring) {
html += `<p><small>${data.pathstring}</small></p>`;
}
return html;
}
@ -178,7 +174,35 @@ function renderPartParameterTemplate(name, data, parameters, options) {
}
// Rendered for "SupplierPart" model
// Renderer for "ManufacturerPart" model
function renderManufacturerPart(name, data, parameters, options) {
var manufacturer_image = null;
var part_image = null;
if (data.manufacturer_detail) {
manufacturer_image = data.manufacturer_detail.image;
}
if (data.part_detail) {
part_image = data.part_detail.thumbnail || data.part_detail.image;
}
var html = '';
html += select2Thumbnail(manufacturer_image);
html += select2Thumbnail(part_image);
html += ` <span><b>${data.manufacturer_detail.name}</b> - ${data.MPN}</span>`;
html += ` - <i>${data.part_detail.full_name}</i>`;
html += `<span class='float-right'>{% trans "Manufacturer Part ID" %}: ${data.pk}</span>`;
return html;
}
// Renderer for "SupplierPart" model
function renderSupplierPart(name, data, parameters, options) {
var supplier_image = null;

View File

@ -14,6 +14,7 @@ function createSalesOrder(options={}) {
customer: {
value: options.customer,
},
customer_reference: {},
description: {},
target_date: {
icon: 'fa-calendar-alt',
@ -44,6 +45,7 @@ function createPurchaseOrder(options={}) {
supplier: {
value: options.supplier,
},
supplier_reference: {},
description: {},
target_date: {
icon: 'fa-calendar-alt',

View File

@ -20,6 +20,55 @@ function stockStatusCodes() {
}
/*
* Export stock table
*/
function exportStock(params={}) {
constructFormBody({}, {
title: '{% trans "Export Stock" %}',
fields: {
format: {
label: '{% trans "Format" %}',
help_text: '{% trans "Select file format" %}',
required: true,
type: 'choice',
value: 'csv',
choices: [
{ value: 'csv', display_name: 'CSV' },
{ value: 'tsv', display_name: 'TSV' },
{ value: 'xls', display_name: 'XLS' },
{ value: 'xlsx', display_name: 'XLSX' },
]
},
sublocations: {
label: '{% trans "Include Sublocations" %}',
help_text: '{% trans "Include stock items in sublocations" %}',
type: 'boolean',
value: 'true',
}
},
onSubmit: function(fields, form_options) {
var format = getFormFieldValue('format', fields['format'], form_options);
var cascade = getFormFieldValue('sublocations', fields['sublocations'], form_options);
// Hide the modal
$(form_options.modal).modal('hide');
var url = `{% url "stock-export" %}?format=${format}&cascade=${cascade}`;
for (var key in params) {
url += `&${key}=${params[key]}`;
}
console.log(url);
location.href = url;
}
});
}
/**
* Perform stock adjustments
*/
@ -1616,27 +1665,6 @@ function createNewStockItem(options) {
},
];
options.secondary = [
{
field: 'part',
label: '{% trans "New Part" %}',
title: '{% trans "Create New Part" %}',
url: "{% url 'part-create' %}",
},
{
field: 'supplier_part',
label: '{% trans "New Supplier Part" %}',
title: '{% trans "Create new Supplier Part" %}',
url: "{% url 'supplier-part-create' %}"
},
{
field: 'location',
label: '{% trans "New Location" %}',
title: '{% trans "Create New Location" %}',
url: "{% url 'stock-location-create' %}",
},
];
launchModalForm("{% url 'stock-item-create' %}", options);
}

View File

@ -1,5 +1,11 @@
{% load i18n %}
function reloadtable(table) {
$(table).bootstrapTable('refresh');
}
function editButton(url, text='Edit') {
return "<button class='btn btn-success edit-button btn-sm' type='button' url='" + url + "'>" + text + "</button>";
}