{% load i18n %} {% load inventree_extras %} /* Part API functions * Requires api.js to be loaded first */ function yesNoLabel(value) { if (value) { return `{% trans "YES" %}`; } else { return `{% trans "NO" %}`; } } function editPart(pk, options={}) { var url = `/api/part/${pk}/`; var fields = { category: { /* secondary: { label: '{% trans "New Category" %}', title: '{% trans "Create New Part Category" %}', api_url: '{% url "api-part-category-list" %}', method: 'POST', fields: { name: {}, description: {}, parent: { secondary: { title: '{% trans "New Parent" %}', api_url: '{% url "api-part-category-list" %}', method: 'POST', fields: { name: {}, description: {}, parent: {}, } } }, } }, */ }, name: { placeholder: 'part name', }, IPN: {}, description: {}, revision: {}, keywords: { icon: 'fa-key', }, variant_of: {}, link: { icon: 'fa-link', }, default_location: { /* secondary: { label: '{% trans "New Location" %}', title: '{% trans "Create new stock location" %}', }, */ }, default_supplier: { filters: { part: pk, part_detail: true, manufacturer_detail: true, supplier_detail: true, }, /* secondary: { label: '{% trans "New Supplier Part" %}', title: '{% trans "Create new supplier part" %}', } */ }, units: {}, minimum_stock: {}, virtual: {}, is_template: {}, assembly: {}, component: {}, trackable: {}, purchaseable: {}, salable: {}, active: {}, }; constructForm(url, { fields: fields, title: '{% trans "Edit Part" %}', reload: true, }); } 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/${options.part}/`; inventreeGet(url, {}, { success: function(response) { var starred = response.starred; inventreePut( url, { starred: !starred, }, { method: 'PATCH', success: function(response) { if (response.starred) { $(options.button).addClass('icon-yellow'); } else { $(options.button).removeClass('icon-yellow'); } } } ); } }); } function makePartIcons(part, options={}) { /* Render a set of icons for the given part. */ var html = ''; if (part.trackable) { html += makeIconBadge('fa-directions', '{% trans "Trackable part" %}'); } if (part.virtual) { html += makeIconBadge('fa-ghost', '{% trans "Virtual part" %}'); } if (part.is_template) { html += makeIconBadge('fa-clone', '{% trans "Template part" %}'); } if (part.assembly) { html += makeIconBadge('fa-tools', '{% trans "Assembled part" %}'); } if (part.starred) { html += makeIconBadge('fa-star', '{% trans "Starred part" %}'); } if (part.salable) { html += makeIconBadge('fa-dollar-sign', title='{% trans "Salable part" %}'); } if (!part.active) { html += `{% trans "Inactive" %}`; } return html; } function loadPartVariantTable(table, partId, options={}) { /* Load part variant table */ var params = options.params || {}; params.ancestor = partId; // Load filters var filters = loadTableFilters("variants"); for (var key in params) { filters[key] = params[key]; } setupFilterList("variants", $(table)); var cols = [ { field: 'pk', title: 'ID', visible: false, switchable: false, }, { field: 'name', title: '{% trans "Name" %}', switchable: false, formatter: function(value, row, index, field) { var html = ''; var name = ''; if (row.IPN) { name += row.IPN; name += ' | '; } name += value; if (row.revision) { name += ' | '; name += row.revision; } if (row.is_template) { name = '' + name + ''; } html += imageHoverIcon(row.thumbnail); html += renderLink(name, `/part/${row.pk}/`); if (row.trackable) { html += makeIconBadge('fa-directions', '{% trans "Trackable part" %}'); } if (row.virtual) { html += makeIconBadge('fa-ghost', '{% trans "Virtual part" %}'); } if (row.is_template) { html += makeIconBadge('fa-clone', '{% trans "Template part" %}'); } if (row.assembly) { html += makeIconBadge('fa-tools', '{% trans "Assembled part" %}'); } if (!row.active) { html += `{% trans "Inactive" %}`; } return html; }, }, { field: 'IPN', title: '{% trans "IPN" %}', }, { field: 'revision', title: '{% trans "Revision" %}', }, { field: 'description', title: '{% trans "Description" %}', }, { field: 'in_stock', title: '{% trans "Stock" %}', formatter: function(value, row) { return renderLink(value, `/part/${row.pk}/stock/`); } } ]; table.inventreeTable({ url: "{% url 'api-part-list' %}", name: 'partvariants', showColumns: true, original: params, queryParams: filters, formatNoMatches: function() { return '{% trans "No variants found" %}'; }, columns: cols, treeEnable: true, rootParentId: partId, parentIdField: 'variant_of', idField: 'pk', uniqueId: 'pk', treeShowField: 'name', sortable: true, search: true, onPostBody: function() { table.treegrid({ treeColumn: 0, }); table.treegrid('collapseAll'); } }); } function loadSimplePartTable(table, url, options={}) { options.disableFilters = true; loadPartTable(table, url, options); } function loadPartParameterTable(table, url, options) { var params = options.params || {}; // Load filters var filters = loadTableFilters("part-parameters"); for (var key in params) { filters[key] = params[key]; } // setupFilterLsit("#part-parameters", $(table)); $(table).inventreeTable({ url: url, original: params, queryParams: filters, name: 'partparameters', groupBy: false, formatNoMatches: function() { return '{% trans "No parameters found" %}'; }, columns: [ { checkbox: true, switchable: false, visible: true, }, { field: 'name', title: '{% trans "Name" %}', switchable: false, sortable: true, formatter: function(value, row) { return row.template_detail.name; } }, { field: 'data', title: '{% trans "Value" %}', switchable: false, sortable: true, }, { field: 'units', title: '{% trans "Units" %}', switchable: true, sortable: true, formatter: function(value, row) { return row.template_detail.units; } }, { field: 'actions', title: '', switchable: false, sortable: false, formatter: function(value, row) { var pk = row.pk; var html = `