{% load i18n %}
/* Part API functions
* Requires api.js to be loaded first
*/
function toggleStar(options) {
/* Toggle the 'starred' status of a part.
* Performs AJAX queries and updates the display on the button.
*
* options:
* - button: ID of the button (default = '#part-star-icon')
* - part: pk of the part object
* - user: pk of the user
*/
var url = '/api/part/star/';
inventreeGet(
url,
{
part: options.part,
user: options.user,
},
{
success: function(response) {
if (response.length == 0) {
// Zero length response = star does not exist
// So let's add one!
inventreePut(
url,
{
part: options.part,
user: options.user,
},
{
method: 'POST',
success: function(response, status) {
$(options.button).addClass('icon-yellow');
},
}
);
} else {
var pk = response[0].pk;
// There IS a star (delete it!)
inventreePut(
url + pk + "/",
{
},
{
method: 'DELETE',
success: function(response, status) {
$(options.button).removeClass('icon-yellow');
},
}
);
}
},
}
);
}
function loadPartTable(table, url, options={}) {
/* Load part listing data into specified table.
*
* Args:
* - table: HTML reference to the table
* - url: Base URL for API query
* - options: object containing following (optional) fields
* checkbox: Show the checkbox column
* query: extra query params for API request
* buttons: If provided, link buttons to selection status of this table
* disableFilters: If true, disable custom filters
*/
// Ensure category detail is included
options.params['category_detail'] = true;
var params = options.params || {};
var filters = {};
if (!options.disableFilters) {
filters = loadTableFilters("parts");
}
for (var key in params) {
filters[key] = params[key];
}
setupFilterList("parts", $(table));
var columns = [
{
field: 'pk',
title: 'ID',
visible: false,
}
];
if (options.checkbox) {
columns.push({
checkbox: true,
title: '{% trans 'Select' %}',
searchable: false,
});
}
columns.push({
field: 'name',
title: '{% trans 'Part' %}',
sortable: true,
formatter: function(value, row, index, field) {
var name = '';
if (row.IPN) {
name += row.IPN;
name += ' | ';
}
name += value;
if (row.revision) {
name += ' | ';
name += row.revision;
}
if (row.is_template) {
name = '' + name + '';
}
var display = imageHoverIcon(row.thumbnail) + renderLink(name, '/part/' + row.pk + '/');
if (row.is_template) {
display += ``;
}
if (row.assembly) {
display += ``;
}
if (row.starred) {
display += ``;
}
if (row.salable) {
display += ``;
}
/*
if (row.component) {
display = display + ``;
}
*/
if (!row.active) {
display += `{% trans "Inactive" %}`;
}
return display;
}
});
columns.push({
sortable: true,
field: 'description',
title: '{% trans 'Description' %}',
formatter: function(value, row, index, field) {
if (row.is_template) {
value = '' + value + '';
}
return value;
}
});
columns.push({
sortable: true,
field: 'category_detail',
title: '{% trans 'Category' %}',
formatter: function(value, row, index, field) {
if (row.category) {
return renderLink(value.pathstring, "/part/category/" + row.category + "/");
}
else {
return '{% trans "No category" %}';
}
}
});
columns.push({
field: 'in_stock',
title: '{% trans "Stock" %}',
searchable: false,
sortable: true,
formatter: function(value, row, index, field) {
var link = "stock";
if (value) {
// There IS stock available for this part
// Is stock "low" (below the 'minimum_stock' quantity)?
if (row.minimum_stock && row.minimum_stock > value) {
value += "{% trans "Low stock" %}";
}
} else if (row.on_order) {
// There is no stock available, but stock is on order
value = "0{% trans "On Order" %}: " + row.on_order + "";
link = "orders";
} else if (row.building) {
// There is no stock available, but stock is being built
value = "0{% trans "Building" %}: " + row.building + "";
link = "builds";
} else {
// There is no stock available
value = "0{% trans "No Stock" %}";
}
return renderLink(value, '/part/' + row.pk + "/" + link + "/");
}
});
$(table).inventreeTable({
url: url,
sortName: 'name',
method: 'get',
queryParams: filters,
groupBy: false,
original: params,
formatNoMatches: function() { return "{% trans "No parts found" %}"; },
columns: columns,
});
if (options.buttons) {
linkButtonsToSelection($(table), options.buttons);
}
/* Button callbacks for part table buttons */
$("#multi-part-order").click(function() {
var selections = $(table).bootstrapTable("getSelections");
var parts = [];
selections.forEach(function(item) {
parts.push(item.pk);
});
launchModalForm("/order/purchase-order/order-parts/", {
data: {
parts: parts,
},
});
});
$("#multi-part-category").click(function() {
var selections = $(table).bootstrapTable("getSelections");
var parts = [];
selections.forEach(function(item) {
parts.push(item.pk);
});
launchModalForm("/part/set-category/", {
data: {
parts: parts,
},
reload: true,
});
});
$('#multi-part-export').click(function() {
var selections = $(table).bootstrapTable("getSelections");
var parts = '';
selections.forEach(function(item) {
parts += item.pk;
parts += ',';
});
location.href = '/part/export/?parts=' + parts;
});
}