Skip to content

Commit

Permalink
Required for order fix (#5077)
Browse files Browse the repository at this point in the history
* Fix part tables on index page

- Stop table filters overriding each other

* Refactor "needed for build" table

- Now shows amount actually needed

* Fix typo

* js fix

* linting

* Fix warning messages on index page

* js linting
  • Loading branch information
SchrodingersGat authored Jun 20, 2023
1 parent 4c9d4ad commit 09cc654
Show file tree
Hide file tree
Showing 7 changed files with 213 additions and 118 deletions.
1 change: 1 addition & 0 deletions InvenTree/InvenTree/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@
re_path(r'^filters.js', DynamicJsView.as_view(template_name='js/translated/filters.js'), name='filters.js'),
re_path(r'^forms.js', DynamicJsView.as_view(template_name='js/translated/forms.js'), name='forms.js'),
re_path(r'^helpers.js', DynamicJsView.as_view(template_name='js/translated/helpers.js'), name='helpers.js'),
re_path(r'^index.js', DynamicJsView.as_view(template_name='js/translated/index.js'), name='index.js'),
re_path(r'^label.js', DynamicJsView.as_view(template_name='js/translated/label.js'), name='label.js'),
re_path(r'^model_renderers.js', DynamicJsView.as_view(template_name='js/translated/model_renderers.js'), name='model_renderers.js'),
re_path(r'^modals.js', DynamicJsView.as_view(template_name='js/translated/modals.js'), name='modals.js'),
Expand Down
2 changes: 1 addition & 1 deletion InvenTree/part/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -962,7 +962,7 @@ def filter_stock_to_build(self, queryset, name, value):

depleted_stock = rest_filters.BooleanFilter(label='Depleted Stock', method='filter_depleted_stock')

def filter_deployed_stock(self, queryset, name, value):
def filter_depleted_stock(self, queryset, name, value):
"""Filter the queryset based on whether the part is fully depleted of stock"""

if str2bool(value):
Expand Down
76 changes: 12 additions & 64 deletions InvenTree/templates/InvenTree/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -25,61 +25,6 @@

{{ block.super }}

function addHeaderTitle(title) {

addSidebarHeader({
text: title,
});
}

function addHeaderAction(label, title, icon, options) {

// Construct a "badge" to add to the sidebar item
var badge = `
<span id='sidebar-badge-${label}' class='sidebar-item-badge badge rounded-pill badge-right bg-dark'>
<span class='fas fa-spin fa-spinner'></span>
</span>
`;

addSidebarItem({
label: label,
text: title,
icon: icon,
content_after: badge
});

// Add a detail item to the detail item-panel
$("#detail-panels").append(
`<div class='panel panel-inventree panel-hidden' id='panel-${label}'>
<div class='panel-heading'>
<h4>${title}</h4>
</div>
<div class='panel-content'>
<table class='table table-condensed table-striped' id='table-${label}'></table>
</div>
</div>`
);

let table_name = `#table-${label}`;

// Connect a callback to the table
$(table_name).on('load-success.bs.table', function(data) {

let options = $(table_name).bootstrapTable('getOptions');

let count = options.totalRows;

let badge = $(`#sidebar-badge-${label}`);

badge.html(count);

if (count > 0) {
badge.removeClass('bg-dark');
badge.addClass('bg-primary');
}
});
}

{% settings_value 'HOMEPAGE_HIDE_INACTIVE' user=request.user as hide_inactive %}
{% settings_value 'HOMEPAGE_PART_STARRED' user=request.user as setting_part_starred %}
{% settings_value 'HOMEPAGE_CATEGORY_STARRED' user=request.user as setting_category_starred %}
Expand All @@ -93,6 +38,7 @@ <h4>${title}</h4>
{% if setting_part_starred %}
addHeaderAction('starred-parts', '{% trans "Subscribed Parts" %}', 'fa-bell');
loadSimplePartTable("#table-starred-parts", "{% url 'api-part-list' %}", {
name: 'starred-parts',
params: {
starred: true,
{% if hide_inactive %}
Expand All @@ -116,6 +62,7 @@ <h4>${title}</h4>
{% if setting_part_latest %}
addHeaderAction('latest-parts', '{% trans "Latest Parts" %}', 'fa-newspaper');
loadSimplePartTable("#table-latest-parts", "{% url 'api-part-list' %}", {
name: 'latest-parts',
params: {
ordering: "-creation_date",
created_after: moment().subtract(1, 'months').format('YYYY-MM-DD'),
Expand All @@ -130,6 +77,7 @@ <h4>${title}</h4>
{% if setting_bom_validation %}
addHeaderAction('bom-validation', '{% trans "BOM Waiting Validation" %}', 'fa-times-circle');
loadSimplePartTable("#table-bom-validation", "{% url 'api-part-list' %}", {
name: 'parts-invalid-bom',
params: {
"bom_valid": false,
{% if hide_inactive %}
Expand Down Expand Up @@ -158,6 +106,7 @@ <h4>${title}</h4>
{% if setting_stock_recent %}
addHeaderAction('recently-updated-stock', '{% trans "Recently Updated" %}', 'fa-clock');
loadStockTable($('#table-recently-updated-stock'), {
disableFilters: true,
params: {
part_detail: true,
ordering: "-updated",
Expand All @@ -170,6 +119,7 @@ <h4>${title}</h4>
{% if setting_stock_low %}
addHeaderAction('low-stock', '{% trans "Low Stock" %}', 'fa-flag');
loadSimplePartTable("#table-low-stock", "{% url 'api-part-list' %}", {
name: 'parts-low-stock',
params: {
low_stock: true,
{% if hide_inactive %}
Expand All @@ -183,6 +133,7 @@ <h4>${title}</h4>
{% if setting_stock_depleted %}
addHeaderAction('depleted-stock', '{% trans "Depleted Stock" %}', 'fa-times');
loadSimplePartTable("#table-depleted-stock", "{% url 'api-part-list' %}", {
name: 'parts-depleted-stock',
params: {
depleted_stock: true,
{% if hide_inactive %}
Expand All @@ -195,22 +146,16 @@ <h4>${title}</h4>

{% if setting_stock_needed %}
addHeaderAction('stock-to-build', '{% trans "Required for Build Orders" %}', 'fa-bullhorn');
loadSimplePartTable("#table-stock-to-build", "{% url 'api-part-list' %}", {
params: {
stock_to_build: true,
{% if hide_inactive %}
active: true,
{% endif %}
},
name: "to_build_parts",
});

loadRequiredForBuildsPartsTable("#table-stock-to-build", {});
{% endif %}

{% if expiry %}

{% if setting_stock_expired %}
addHeaderAction('expired-stock', '{% trans "Expired Stock" %}', 'fa-calendar-times');
loadStockTable($("#table-expired-stock"), {
disableFilters: true,
params: {
expired: true,
location_detail: true,
Expand All @@ -219,12 +164,14 @@ <h4>${title}</h4>
active: true,
{% endif %}
},
name: 'expired-stock',
});
{% endif %}

{% if setting_stock_stale %}
addHeaderAction('stale-stock', '{% trans "Stale Stock" %}', 'fa-stopwatch');
loadStockTable($("#table-stale-stock"), {
disableFilters: true,
params: {
stale: true,
expired: false,
Expand All @@ -234,6 +181,7 @@ <h4>${title}</h4>
active: true,
{% endif %}
},
name: 'stale-stock',
});
{% endif %}

Expand Down
1 change: 1 addition & 0 deletions InvenTree/templates/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,7 @@
<script defer type='text/javascript' src="{% i18n_static 'filters.js' %}"></script>
<script defer type='text/javascript' src="{% i18n_static 'forms.js' %}"></script>
<script defer type='text/javascript' src="{% i18n_static 'helpers.js' %}"></script>
<script defer type='text/javascript' src="{% i18n_static 'index.js' %}"></script>
<script defer type='text/javascript' src="{% i18n_static 'label.js' %}"></script>
<script defer type='text/javascript' src="{% i18n_static 'modals.js' %}"></script>
<script defer type='text/javascript' src="{% i18n_static 'model_renderers.js' %}"></script>
Expand Down
135 changes: 135 additions & 0 deletions InvenTree/templates/js/translated/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
{% load i18n %}

/* globals
addSidebarHeader,
addSidebarItem,
checkPermission,
global_settings,
imageHoverIcon,
makeProgressBar,
renderLink,
shortenString,
user_settings,
withTitle,
*/

/* exported
addHeaderAction,
addHeaderTitle,
*/


/*
* Add a 'header title' to the index sidebar
*/
function addHeaderTitle(title) {
addSidebarHeader({
text: title,
});
}


function addHeaderAction(label, title, icon, options) {

// Construct a "badge" to add to the sidebar item
var badge = `
<span id='sidebar-badge-${label}' class='sidebar-item-badge badge rounded-pill badge-right bg-dark'>
<span class='fas fa-spin fa-spinner'></span>
</span>
`;

addSidebarItem({
label: label,
text: title,
icon: icon,
content_after: badge
});

// Add a detail item to the detail item-panel
$("#detail-panels").append(
`<div class='panel panel-inventree panel-hidden' id='panel-${label}'>
<div class='panel-heading'>
<h4>${title}</h4>
</div>
<div class='panel-content'>
<table class='table table-condensed table-striped' id='table-${label}'></table>
</div>
</div>`
);

let table_name = `#table-${label}`;

// Connect a callback to the table
$(table_name).on('load-success.bs.table', function(data) {

let options = $(table_name).bootstrapTable('getOptions');

let count = options.totalRows;

let badge = $(`#sidebar-badge-${label}`);

badge.html(count);

if (count > 0) {
badge.removeClass('bg-dark');
badge.addClass('bg-primary');
}
});
}


/*
* Load a table displaying parts which are outstanding for builds
*/
function loadRequiredForBuildsPartsTable(table, options={}) {
let name = 'parts-required-for-builds';

let params = {
stock_to_build: true,
};

$(table).inventreeTable({
url: '{% url "api-part-list" %}',
queryParams: params,
name: name,
showColumns: false,
search: false,
sortable: false,
formatNoMatches: function() {
return '{% trans "No parts required for builds" %}';
},
columns: [
{
field: 'name',
title: '{% trans "Part" %}',
formatter: function(value, row) {
let name = shortenString(row.full_name);
let display= imageHoverIcon(row.thumbnail) + renderLink(name, `/part/${row.pk}/`);

return withTitle(display, row.full_name);
}
},
{
field: 'description',
title: '{% trans "Description" %}',
},
{
field: 'total_in_stock',
title: '{% trans "Available" %}',
formatter: function(value, row) {
return value;
}
},
{
field: 'allocated_to_build_orders',
title: '{% trans "Allocated Stock" %}',
formatter: function(_value, row) {
return makeProgressBar(
row.allocated_to_build_orders,
row.required_for_build_orders,
);
}
},
]
});
}
44 changes: 25 additions & 19 deletions InvenTree/templates/js/translated/part.js
Original file line number Diff line number Diff line change
Expand Up @@ -2237,30 +2237,36 @@ function loadPartTable(table, url, options={}) {

options.params = options.params || {};

let table_name = options.name || 'parts';

// Ensure category detail is included
options.params['category_detail'] = true;

var params = options.params || {};

var filters = loadTableFilters('parts', options.params);
let filters = {};

setupFilterList('parts', $(table), options.filterTarget, {
download: true,
labels: {
url: '{% url "api-part-label-list" %}',
key: 'part',
},
singular_name: '{% trans "part" %}',
plural_name: '{% trans "parts" %}',
custom_actions: [
{
label: 'parts',
icon: 'fa-tools',
title: '{% trans "Part actions" %}',
actions: makePartActions(table),
}
]
});
if (!options.disableFilters) {
filters = loadTableFilters(table_name, options.params);

setupFilterList('parts', $(table), options.filterTarget, {
download: true,
labels: {
url: '{% url "api-part-label-list" %}',
key: 'part',
},
singular_name: '{% trans "part" %}',
plural_name: '{% trans "parts" %}',
custom_actions: [
{
label: 'parts',
icon: 'fa-tools',
title: '{% trans "Part actions" %}',
actions: makePartActions(table),
}
]
});
}

var columns = [
{
Expand Down Expand Up @@ -2426,9 +2432,9 @@ function loadPartTable(table, url, options={}) {
$(table).inventreeTable({
url: url,
method: 'get',
name: table_name,
queryParams: filters,
groupBy: false,
name: options.name || 'part',
original: params,
sidePagination: 'server',
pagination: 'true',
Expand Down
Loading

0 comments on commit 09cc654

Please sign in to comment.