diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py
index afafaac240..2f65744139 100644
--- a/InvenTree/part/models.py
+++ b/InvenTree/part/models.py
@@ -288,6 +288,7 @@ class Part(models.Model):
header.append('Part')
header.append('Description')
header.append('Quantity')
+ header.append('Note')
lines.append(header)
@@ -297,6 +298,7 @@ class Part(models.Model):
line.append(it.sub_part.name)
line.append(it.sub_part.description)
line.append(it.quantity)
+ line.append(it.note)
lines.append([str(x) for x in line])
diff --git a/InvenTree/part/templates/part/bom.html b/InvenTree/part/templates/part/bom.html
index 3debd65076..90d7dd4b61 100644
--- a/InvenTree/part/templates/part/bom.html
+++ b/InvenTree/part/templates/part/bom.html
@@ -9,69 +9,47 @@
{% include 'part/tabs.html' with tab='bom' %}
-
-
+{% if editing_enabled %}
+
+
+
+{% else %}
+
+
+
+
+{% endif %}
{% endblock %}
+
+{% block js_load %}
+{{ block.super }}
+
+
+
+{% endblock %}
+
{% block js_ready %}
{{ block.super }}
function reloadBom() {
$("#bom-table").bootstrapTable('refresh');
}
- $('#bom-table').on('click', '.delete-button', function () {
- var button = $(this);
-
- launchDeleteForm(
- button.attr('url'),
- {
- success: reloadBom
- });
- });
-
- $("#bom-table").on('click', '.edit-button', function () {
- var button = $(this);
-
- launchModalForm(
- button.attr('url'),
- {
- success: reloadBom
- });
-
- });
-
- $("#new-bom-item").click(function () {
- launchModalForm(
- "{% url 'bom-item-create' %}",
- {
- reload: true,
- data: {
- parent: {{ part.id }}
- }
- });
- });
-
- $("#export-bom").click(function () {
- /*
- launchModalForm(
- "{% url 'bom-export' part.id %}",
- {
- });
- */
- //TODO - Select format of the data
- location.href = "{% url 'bom-export' part.id %}";
- });
-
+ // Load the BOM data
$("#bom-table").bootstrapTable({
sortable: true,
search: true,
@@ -102,7 +80,29 @@
field: 'quantity',
title: 'Required',
searchable: false,
- sortable: true
+ sortable: true,
+ formatter: function(value, row, index, field) {
+ return renderEditable(value,
+ {
+ _pk: row.pk,
+ _title: 'Quantity',
+ }
+ );
+ }
+ },
+ {
+ field: 'note',
+ title: 'Note',
+ searchable: true,
+ sortable: false,
+ formatter: function(value, row, index, field) {
+ return renderEditable(value,
+ {
+ _pk: row.pk,
+ _title: 'Note',
+ _empty: 'Enter note',
+ });
+ }
},
{
field: 'sub_part.available_stock',
@@ -123,12 +123,90 @@
return renderLink(text, row.sub_part.url + "stock/");
}
},
- {
- formatter: function(value, row, index, field) {
- return editButton(row.url + 'edit') + ' ' + deleteButton(row.url + 'delete');
- }
- }
],
url: "{% url 'api-bom-list' %}"
});
+
+ /*
+ $('#bom-table').on('click', '.delete-button', function () {
+ var button = $(this);
+
+ launchDeleteForm(
+ button.attr('url'),
+ {
+ success: reloadBom
+ });
+ });
+
+ $("#bom-table").on('click', '.edit-button', function () {
+ var button = $(this);
+
+ launchModalForm(
+ button.attr('url'),
+ {
+ success: reloadBom
+ });
+
+ });
+ */
+
+ {% if editing_enabled %}
+ $("#editing-finish").click(function() {
+ alert("Finished!");
+ location.href = "{% url 'part-bom' part.id %}";
+ });
+
+ $("#editing-cancel").click(function() {
+ alert("Cancelled!");
+ location.href = "{% url 'part-bom' part.id %}";
+ });
+
+ // Inline mode
+ //$.fn.editable.defaults.mode = 'inline';
+
+ $("#bom-table").on('load-success.bs.table', function() {
+ // Make the table elements editable
+ $("#bom-table").find('.editable-item').editable();
+ });
+
+ {% else %}
+
+ $("#edit-bom").click(function () {
+
+ location.href = "{% url 'part-bom' part.id %}?edit=1";
+
+ /*
+ editBOM(
+ {
+ url: "{% url 'api-bom-list' %}",
+ part_name: "{{ part.name }}",
+ part_id: "{{ part.id }}",
+ }
+ );
+ */
+ /*
+ launchModalForm(
+ "{% url 'bom-item-create' %}",
+ {
+ reload: true,
+ data: {
+ parent: {{ part.id }}
+ }
+ });
+ */
+ });
+
+ $("#export-bom").click(function () {
+ /*
+ launchModalForm(
+ "{% url 'bom-export' part.id %}",
+ {
+ });
+ */
+ //TODO - Select format of the data
+ location.href = "{% url 'bom-export' part.id %}";
+ });
+
+ {% endif %}
+
{% endblock %}
\ No newline at end of file
diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py
index d9897f82d4..f956c28ddc 100644
--- a/InvenTree/part/views.py
+++ b/InvenTree/part/views.py
@@ -90,6 +90,17 @@ class PartDetail(DetailView):
queryset = Part.objects.all()
template_name = 'part/detail.html'
+ # Add in some extra context information based on query params
+ def get_context_data(self, **kwargs):
+ context = super(PartDetail, self).get_context_data(**kwargs)
+
+ if str(self.request.GET.get('edit', None)) == '1':
+ context['editing_enabled'] = True
+ else:
+ context['editing_enabled'] = False
+
+ return context
+
class PartImage(AjaxUpdateView):