Ability to include part_detail in build API

- Build list now uses bootstrapTable
This commit is contained in:
Oliver Walters 2020-04-11 19:59:16 +10:00
parent a4e45eab13
commit f0ffb0f8c0
6 changed files with 61 additions and 85 deletions

View File

@ -8,6 +8,8 @@ function loadBuildTable(table, options) {
filters[key] = params[key]; filters[key] = params[key];
} }
setupFilterList("build", table);
table.inventreeTable({ table.inventreeTable({
method: 'get', method: 'get',
formatNoMatches: function() { formatNoMatches: function() {
@ -26,14 +28,26 @@ function loadBuildTable(table, options) {
{ {
field: 'title', field: 'title',
title: 'Build', title: 'Build',
sortable: true,
formatter: function(value, row, index, field) {
return renderLink(value, '/build/' + row.pk + '/');
}
}, },
{ {
field: 'part', field: 'part',
title: 'Part', title: 'Part',
sortable: true,
formatter: function(value, row, index, field) {
var name = row.part_detail.full_name;
return imageHoverIcon(row.part_detail.thumbnail) + renderLink(name, '/part/' + row.part + '/');
}
}, },
{ {
field: 'quantity', field: 'quantity',
title: 'Quantity', title: 'Quantity',
sortable: true,
}, },
{ {
field: 'status_text', field: 'status_text',

View File

@ -238,8 +238,8 @@ function setupFilterList(tableKey, table, target) {
var addClicked = false; var addClicked = false;
if (!target || target.length == 0) { if (target == null || target.length == 0) {
target = '#filter-list-" + tableKey'; target = `#filter-list-${tableKey}`;
} }
var tag = `filter-tag-${tableKey}`; var tag = `filter-tag-${tableKey}`;

View File

@ -11,6 +11,8 @@ from rest_framework import generics, permissions
from django.conf.urls import url, include from django.conf.urls import url, include
from InvenTree.helpers import str2bool
from .models import Build, BuildItem from .models import Build, BuildItem
from .serializers import BuildSerializer, BuildItemSerializer from .serializers import BuildSerializer, BuildItemSerializer
@ -39,6 +41,17 @@ class BuildList(generics.ListCreateAPIView):
'part', 'part',
] ]
def get_serializer(self, *args, **kwargs):
try:
part_detail = str2bool(self.request.GET.get('part_detail', None))
except AttributeError:
part_detail = None
kwargs['part_detail'] = part_detail
return self.serializer_class(*args, **kwargs)
class BuildDetail(generics.RetrieveUpdateAPIView): class BuildDetail(generics.RetrieveUpdateAPIView):
""" API endpoint for detail view of a Build object """ """ API endpoint for detail view of a Build object """

View File

@ -10,6 +10,7 @@ from InvenTree.serializers import InvenTreeModelSerializer
from stock.serializers import StockItemSerializerBrief from stock.serializers import StockItemSerializerBrief
from .models import Build, BuildItem from .models import Build, BuildItem
from part.serializers import PartBriefSerializer
class BuildSerializer(InvenTreeModelSerializer): class BuildSerializer(InvenTreeModelSerializer):
@ -18,6 +19,16 @@ class BuildSerializer(InvenTreeModelSerializer):
url = serializers.CharField(source='get_absolute_url', read_only=True) url = serializers.CharField(source='get_absolute_url', read_only=True)
status_text = serializers.CharField(source='get_status_display', read_only=True) status_text = serializers.CharField(source='get_status_display', read_only=True)
part_detail = PartBriefSerializer(source='part', many=False, read_only=True)
def __init__(self, *args, **kwargs):
part_detail = kwargs.pop('part_detail', False)
super().__init__(*args, **kwargs)
if part_detail is not True:
self.fields.pop('part_detail')
class Meta: class Meta:
model = Build model = Build
fields = [ fields = [
@ -27,6 +38,7 @@ class BuildSerializer(InvenTreeModelSerializer):
'creation_date', 'creation_date',
'completion_date', 'completion_date',
'part', 'part',
'part_detail',
'quantity', 'quantity',
'status', 'status',
'status_text', 'status_text',

View File

@ -1,38 +0,0 @@
{% extends "collapse.html" %}
{% block collapse_title %}
<b>{{ title }}</b> - {{ builds | length }}
{% endblock %}
{% block collapse_content %}
<table class='table table-striped table-condensed build-table' id='build-table-{{collapse_id}}' data-toolbar='#button-toolbar'>
<thead>
<tr>
<th>Build</th>
<th>Part</th>
<th>Quantity</th>
<th>Status</th>
{% if completed %}
<th>Completed</th>
{% else %}
<th>Created</th>
{% endif %}
</tr>
</thead>
<tbody>
{% for build in builds %}
<tr>
<td><a href="{% url 'build-detail' build.id %}">{{ build.title }}</a></td>
<td><a href="{% url 'part-build' build.part.id %}">{{ build.part.full_name }}</a></td>
<td>{{ build.quantity }}</td>
<td>{% include "build_status.html" with build=build %}
{% if completed %}
<td>{{ build.completion_date }}<span class='badge'>{{ build.completed_by.username }}</span></td>
{% else %}
<td>{{ build.creation_date }}</td>
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}

View File

@ -13,25 +13,24 @@ InvenTree | Build List
<h3>Part Builds</h3> <h3>Part Builds</h3>
</div> </div>
<div class='col-sm-6'> <div class='col-sm-6'>
<div class='container' id='active-build-toolbar' style='float: right;'>
<div class='btn-group' style='float: right;'> </div>
<button type='button' class="btn btn-success" id='new-build'>Start New Build</button>
<hr>
<div id='button-toolbar'>
<div class='button-toolbar container-fluid' style='float: right;'>
<button type='button' class="btn btn-success" id='new-build'>Start New Build</button>
<div class='filter-list' id='filter-list-build'>
<!-- An empty div in which the filter list will be constructed -->
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<hr> <table class='table table-striped table-condensed' id='build-table' data-toolbar='#button-toolbar'>
<table class='table table-striped table-condensed' id='build-table'>
</table> </table>
{% include "build/build_list.html" with builds=active title="Active Builds" completed=False collapse_id='active' %}
{% include "build/build_list.html" with builds=completed completed=True title="Completed Builds" collapse_id="complete" %}
{% include "build/build_list.html" with builds=cancelled title="Cancelled Builds" completed=False collapse_id="cancelled" %}
{% endblock %} {% endblock %}
{% block js_ready %} {% block js_ready %}
@ -41,42 +40,18 @@ InvenTree | Build List
$("#new-build").click(function() { $("#new-build").click(function() {
launchModalForm( launchModalForm(
"{% url 'build-create' %}", "{% url 'build-create' %}",
{ {
follow: true follow: true
}); }
);
}); });
loadBuildTable($("#build-table"), { loadBuildTable($("#build-table"), {
url: "{% url 'api-build-list' %}" url: "{% url 'api-build-list' %}",
}); params: {
part_detail: "true",
$(".build-table").inventreeTable({ },
formatNoMatches: function() { return 'No builds found'; },
columns: [
{
field: 'name',
title: 'Build',
sortable: true,
},
{
field: 'part',
title: 'Part',
sortable: true,
},
{
title: 'Quantity',
sortable: true,
searchable: false
},
{
title: 'Status',
sortable: true,
},
{
sortable: true,
},
]
}); });
{% endblock %} {% endblock %}