mirror of
				https://github.com/inventree/InvenTree.git
				synced 2025-11-04 15:15:42 +00:00 
			
		
		
		
	Merge branch 'inventree:master' into plugin-mark-sample
This commit is contained in:
		@@ -1348,6 +1348,7 @@ class PartList(generics.ListCreateAPIView):
 | 
				
			|||||||
        'creation_date',
 | 
					        'creation_date',
 | 
				
			||||||
        'IPN',
 | 
					        'IPN',
 | 
				
			||||||
        'in_stock',
 | 
					        'in_stock',
 | 
				
			||||||
 | 
					        'unallocated_stock',
 | 
				
			||||||
        'category',
 | 
					        'category',
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1746,7 +1746,7 @@ function allocateStockToBuild(build_id, part_id, bom_items, options={}) {
 | 
				
			|||||||
                        required: true,
 | 
					                        required: true,
 | 
				
			||||||
                        render_part_detail: true,
 | 
					                        render_part_detail: true,
 | 
				
			||||||
                        render_location_detail: true,
 | 
					                        render_location_detail: true,
 | 
				
			||||||
                        render_stock_id: false,
 | 
					                        render_pk: false,
 | 
				
			||||||
                        auto_fill: true,
 | 
					                        auto_fill: true,
 | 
				
			||||||
                        auto_fill_filters: auto_fill_filters,
 | 
					                        auto_fill_filters: auto_fill_filters,
 | 
				
			||||||
                        onSelect: function(data, field, opts) {
 | 
					                        onSelect: function(data, field, opts) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,6 +31,24 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Should the ID be rendered for this string
 | 
				
			||||||
 | 
					function renderId(title, pk, parameters={}) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Default = true
 | 
				
			||||||
 | 
					    var render = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if ('render_pk' in parameters) {
 | 
				
			||||||
 | 
					        render = parameters['render_pk'];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    if (render) {
 | 
				
			||||||
 | 
					        return `<span class='float-right'><small>${title}: ${pk}</small></span>`;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        return '';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Renderer for "Company" model
 | 
					// Renderer for "Company" model
 | 
				
			||||||
// eslint-disable-next-line no-unused-vars
 | 
					// eslint-disable-next-line no-unused-vars
 | 
				
			||||||
function renderCompany(name, data, parameters={}, options={}) {
 | 
					function renderCompany(name, data, parameters={}, options={}) {
 | 
				
			||||||
@@ -39,7 +57,7 @@ function renderCompany(name, data, parameters={}, options={}) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    html += `<span><b>${data.name}</b></span> - <i>${data.description}</i>`;
 | 
					    html += `<span><b>${data.name}</b></span> - <i>${data.description}</i>`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    html += `<span class='float-right'><small>{% trans "Company ID" %}: ${data.pk}</small></span>`;
 | 
					    html += renderId('{% trans "Company ID" %}', data.pk, parameters);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return html;
 | 
					    return html;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -67,18 +85,6 @@ function renderStockItem(name, data, parameters={}, options={}) {
 | 
				
			|||||||
        part_detail = `<img src='${image}' class='select2-thumbnail'><span>${data.part_detail.full_name}</span> - `;
 | 
					        part_detail = `<img src='${image}' class='select2-thumbnail'><span>${data.part_detail.full_name}</span> - `;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var render_stock_id = true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if ('render_stock_id' in parameters) {
 | 
					 | 
				
			||||||
        render_stock_id = parameters['render_stock_id'];
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    var stock_id = '';
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    if (render_stock_id) {
 | 
					 | 
				
			||||||
        stock_id = `<span class='float-right'><small>{% trans "Stock ID" %}: ${data.pk}</small></span>`;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    var render_location_detail = false;
 | 
					    var render_location_detail = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ('render_location_detail' in parameters) {
 | 
					    if ('render_location_detail' in parameters) {
 | 
				
			||||||
@@ -88,7 +94,7 @@ function renderStockItem(name, data, parameters={}, options={}) {
 | 
				
			|||||||
    var location_detail = '';
 | 
					    var location_detail = '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (render_location_detail && data.location_detail) {
 | 
					    if (render_location_detail && data.location_detail) {
 | 
				
			||||||
        location_detail = ` - (<em>${data.location_detail.name}</em>)`;
 | 
					        location_detail = ` <small>- (<em>${data.location_detail.name}</em>)</small>`;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var stock_detail = '';
 | 
					    var stock_detail = '';
 | 
				
			||||||
@@ -103,7 +109,10 @@ function renderStockItem(name, data, parameters={}, options={}) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    var html = `
 | 
					    var html = `
 | 
				
			||||||
    <span>
 | 
					    <span>
 | 
				
			||||||
        ${part_detail}${stock_detail}${location_detail}${stock_id}
 | 
					        ${part_detail}
 | 
				
			||||||
 | 
					        ${stock_detail}
 | 
				
			||||||
 | 
					        ${location_detail}
 | 
				
			||||||
 | 
					        ${renderId('{% trans "Stock ID" %}', data.pk, parameters)}
 | 
				
			||||||
    </span>
 | 
					    </span>
 | 
				
			||||||
    `;
 | 
					    `;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -183,7 +192,7 @@ function renderPart(name, data, parameters={}, options={}) {
 | 
				
			|||||||
        <small>
 | 
					        <small>
 | 
				
			||||||
            ${stock_data}
 | 
					            ${stock_data}
 | 
				
			||||||
            ${extra}
 | 
					            ${extra}
 | 
				
			||||||
            {% trans "Part ID" %}: ${data.pk}
 | 
					            ${renderId('{% trans "Part ID" $}', data.pk, parameters)}
 | 
				
			||||||
            </small>
 | 
					            </small>
 | 
				
			||||||
    </span>`;
 | 
					    </span>`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -245,13 +254,7 @@ function renderPurchaseOrder(name, data, parameters={}, options={}) {
 | 
				
			|||||||
        html += ` - <em>${data.description}</em>`;
 | 
					        html += ` - <em>${data.description}</em>`;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    html += `
 | 
					    html += renderId('{% trans "Order ID" %}', data.pk, parameters);
 | 
				
			||||||
    <span class='float-right'>
 | 
					 | 
				
			||||||
        <small>
 | 
					 | 
				
			||||||
            {% trans "Order ID" %}: ${data.pk}
 | 
					 | 
				
			||||||
        </small>
 | 
					 | 
				
			||||||
    </span>
 | 
					 | 
				
			||||||
    `;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return html;
 | 
					    return html;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -277,12 +280,7 @@ function renderSalesOrder(name, data, parameters={}, options={}) {
 | 
				
			|||||||
        html += ` - <em>${data.description}</em>`;
 | 
					        html += ` - <em>${data.description}</em>`;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    html += `
 | 
					    html += renderId('{% trans "Order ID" %}', data.pk, parameters);
 | 
				
			||||||
    <span class='float-right'>
 | 
					 | 
				
			||||||
        <small>
 | 
					 | 
				
			||||||
            {% trans "Order ID" %}: ${data.pk}
 | 
					 | 
				
			||||||
        </small>
 | 
					 | 
				
			||||||
    </span>`;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return html;
 | 
					    return html;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -491,13 +491,16 @@ function duplicateBom(part_id, options={}) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Construct a "badge" label showing stock information for this particular part
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
function partStockLabel(part, options={}) {
 | 
					function partStockLabel(part, options={}) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (part.in_stock) {
 | 
					    if (part.in_stock) {
 | 
				
			||||||
        // There IS stock available for this part
 | 
					        // There IS stock available for this part
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Is stock "low" (below the 'minimum_stock' quantity)?
 | 
					        // Is stock "low" (below the 'minimum_stock' quantity)?
 | 
				
			||||||
        if (part.minimum_stock && part.minimum_stock > part.in_stock) {
 | 
					        if ((part.minimum_stock > 0) && (part.minimum_stock > part.in_stock)) {
 | 
				
			||||||
            return `<span class='badge rounded-pill bg-warning ${options.classes}'>{% trans "Low stock" %}: ${part.in_stock}${part.units}</span>`;
 | 
					            return `<span class='badge rounded-pill bg-warning ${options.classes}'>{% trans "Low stock" %}: ${part.in_stock}${part.units}</span>`;
 | 
				
			||||||
        } else if (part.unallocated_stock == 0) {
 | 
					        } else if (part.unallocated_stock == 0) {
 | 
				
			||||||
            if (part.ordering) {
 | 
					            if (part.ordering) {
 | 
				
			||||||
@@ -507,11 +510,15 @@ function partStockLabel(part, options={}) {
 | 
				
			|||||||
                // There is no available stock, but stock is being built
 | 
					                // There is no available stock, but stock is being built
 | 
				
			||||||
                return `<span class='badge rounded-pill bg-info ${options.classes}'>{% trans "Building" %}: ${part.building}${part.units}</span>`;
 | 
					                return `<span class='badge rounded-pill bg-info ${options.classes}'>{% trans "Building" %}: ${part.building}${part.units}</span>`;
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                // There is no available stock
 | 
					                // There is no available stock at all
 | 
				
			||||||
                return `<span class='badge rounded-pill bg-warning ${options.classes}'>{% trans "Available" %}: 0/${part.in_stock}${part.units}</span>`;
 | 
					                return `<span class='badge rounded-pill bg-warning ${options.classes}'>{% trans "No stock available" %}</span>`;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else {
 | 
					        } else if (part.unallocated_stock < part.in_stock) {
 | 
				
			||||||
 | 
					            // Unallocated quanttiy is less than total quantity
 | 
				
			||||||
            return `<span class='badge rounded-pill bg-success ${options.classes}'>{% trans "Available" %}: ${part.unallocated_stock}/${part.in_stock}${part.units}</span>`;
 | 
					            return `<span class='badge rounded-pill bg-success ${options.classes}'>{% trans "Available" %}: ${part.unallocated_stock}/${part.in_stock}${part.units}</span>`;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            // Stock is completely available
 | 
				
			||||||
 | 
					            return `<span class='badge rounded-pill bg-success ${options.classes}'>{% trans "Available" %}: ${part.unallocated_stock}${part.units}</span>`;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        // There IS NO stock available for this part
 | 
					        // There IS NO stock available for this part
 | 
				
			||||||
@@ -1355,7 +1362,7 @@ function loadPartTable(table, url, options={}) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    col = {
 | 
					    col = {
 | 
				
			||||||
        field: 'unallocated_stock',
 | 
					        field: 'unallocated_stock',
 | 
				
			||||||
        title: '{% trans "Available" %}',
 | 
					        title: '{% trans "Stock" %}',
 | 
				
			||||||
        searchable: false,
 | 
					        searchable: false,
 | 
				
			||||||
        formatter: function(value, row) {            
 | 
					        formatter: function(value, row) {            
 | 
				
			||||||
            var link = '?display=part-stock';
 | 
					            var link = '?display=part-stock';
 | 
				
			||||||
@@ -1377,7 +1384,7 @@ function loadPartTable(table, url, options={}) {
 | 
				
			|||||||
                        link = '?display=build-orders';
 | 
					                        link = '?display=build-orders';
 | 
				
			||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
                        // There is no available stock
 | 
					                        // There is no available stock
 | 
				
			||||||
                        value = `0<span class='badge badge-right rounded-pill bg-warning'>{% trans "Not available" %}</span>`;
 | 
					                        value = `0<span class='badge badge-right rounded-pill bg-warning'>{% trans "No stock available" %}</span>`;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -132,6 +132,7 @@ function updateSearch() {
 | 
				
			|||||||
            renderStockItem,
 | 
					            renderStockItem,
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                url: '/stock/item',
 | 
					                url: '/stock/item',
 | 
				
			||||||
 | 
					                render_location_detail: true,
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -232,6 +233,9 @@ function addSearchQuery(key, title, query_url, query_params, render_func, render
 | 
				
			|||||||
    query_params.offset = 0;
 | 
					    query_params.offset = 0;
 | 
				
			||||||
    query_params.limit = user_settings.SEARCH_PREVIEW_RESULTS;
 | 
					    query_params.limit = user_settings.SEARCH_PREVIEW_RESULTS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Do not display "pk" value for search results
 | 
				
			||||||
 | 
					    render_params.render_pk = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Add the result group to the panel
 | 
					    // Add the result group to the panel
 | 
				
			||||||
    $('#offcanvas-search').find('#search-results').append(`
 | 
					    $('#offcanvas-search').find('#search-results').append(`
 | 
				
			||||||
    <div class='search-result-group-wrapper' id='search-results-wrapper-${key}'></div>
 | 
					    <div class='search-result-group-wrapper' id='search-results-wrapper-${key}'></div>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user