Merge branch 'modal-forms'

This commit is contained in:
Oliver 2018-04-26 09:26:52 +10:00
commit 3c17777114
10 changed files with 295 additions and 25 deletions

View File

@ -0,0 +1,102 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.template.loader import render_to_string
from django.http import JsonResponse
from django.shortcuts import get_object_or_404
from django.views.generic import UpdateView, CreateView, DeleteView
class AjaxView(object):
ajax_form_action = ''
ajax_form_title = ''
ajax_submit_text = 'Submit'
def getAjaxTemplate(self):
if hasattr(self, 'ajax_template_name'):
return self.ajax_template_name
else:
return self.template_name
def renderJsonResponse(self, request, form, data={}):
context = {'form': form,
'form_action': self.ajax_form_action,
'form_title': self.ajax_form_title,
'submit_text': self.ajax_submit_text,
}
data['html_form'] = render_to_string(
self.getAjaxTemplate(),
context,
request=request
)
return JsonResponse(data)
class AjaxCreateView(AjaxView, CreateView):
def post(self, request, *args, **kwargs):
if request.is_ajax():
form = self.form_class(request.POST)
data = {'form_valid': form.is_valid()}
if form.is_valid():
obj = form.save()
# Return the PK of the newly-created object
data['pk'] = obj.pk
return self.renderJsonResponse(request, form, data)
else:
return super(CreateView, self).post(request, *args, **kwargs)
def get(self, request, *args, **kwargs):
response = super(CreateView, self).get(request, *args, **kwargs)
if request.is_ajax():
form = self.form_class(initial=self.get_initial())
return self.renderJsonResponse(request, form)
else:
return response
class AjaxUpdateView(AjaxView, UpdateView):
def post(self, request, *args, **kwargs):
if request.is_ajax():
form = self.form_class(request.POST, instance=self.get_object())
data = {'form_valid': form.is_valid()}
if form.is_valid():
obj = form.save()
return self.renderJsonResponse(request, form, data)
else:
response = super(UpdateView, self).post(request, *args, **kwargs)
return response
def get(self, request, *args, **kwargs):
response = super(UpdateView, self).get(request, *args, **kwargs)
if request.is_ajax():
form = self.form_class(instance = self.get_object())
return self.renderJsonResponse(request, form)
else:
return response

View File

@ -42,10 +42,11 @@ class EditCategoryForm(forms.ModelForm):
super(EditCategoryForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_id = 'id-edit-part-form'
self.helper.form_method = 'post'
#self.helper.form_id = 'id-edit-part-form'
#self.helper.form_method = 'post'
self.helper.add_input(Submit('submit', 'Submit'))
self.helper.form_tag = False
#self.helper.add_input(Submit('submit', 'Submit'))
class Meta:
model = PartCategory
@ -62,10 +63,11 @@ class EditBomItemForm(forms.ModelForm):
super(EditBomItemForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_id = 'id-edit-part-form'
#self.helper.form_id = 'id-edit-part-form'
self.helper.form_method = 'post'
self.helper.add_input(Submit('submit', 'Submit'))
self.helper.form_tag = False
#self.helper.add_input(Submit('submit', 'Submit'))
class Meta:
model = BomItem

View File

@ -1,9 +1,16 @@
{% extends "part/part_base.html" %}
{% load static %}
{% block details %}
{% include 'part/tabs.html' with tab='bom' %}
<div class='modal fade' id='modal-form'>
<div class='modal-dialog'>
<div class='modal-content'>
</div>
</div>
</div>
<h3>Bill of Materials</h3>
<table class="table table-striped">
@ -18,17 +25,38 @@
<tr>
<td><a href="{% url 'part-detail' sub_part.id %}">{{ sub_part.name }}</a></td>
<td>{{ sub_part.description }}</td>
<td>{{ bom_item.quantity }}</span></td>
<td><a href="{% url 'bom-item-detail' bom_item.id %}">Edit</a></td>
<td>{{ bom_item.quantity }}</td>
<td>
<button type='button' url="{% url 'bom-item-edit' bom_item.id %}" class='btn btn-success edit-row-button'>Edit</button>
</td>
</tr>
{% endwith %}
{% endfor %}
</table>
<div class='container-fluid'>
<a href="{% url 'bom-item-create' %}?parent={{ part.id }}">
<button class='btn btn-success'>Add BOM Item</button>
</a>
<button type='button' class='btn btn-success' id='new-bom-item'>Add BOM Item</button>
</div>
{% endblock %}
{% block javascript %}
<script type='text/javascript' src="{% static 'script/modal_form.js' %}"></script>
<script type='text/javascript'>
$(".edit-row-button").click(function () {
var button = $(this);
launchModalForm("#modal-form",
button.attr('url'));
});
$("#new-bom-item").click(function () {
launchModalForm("#modal-form",
"{% url 'bom-item-create' %}/?parent={{ part.id }}");
});
</script>
{% endblock %}

View File

@ -22,9 +22,9 @@
{% endif %}
<div class='container-fluid'>
<a href="{% url 'category-create' %}?category={{ category.id }}">
<button class="btn btn-success">New Category</button>
</a>
<button type='button' class='btn btn-primary js-create-cat'>
New Category
</button>
<a href="{% url 'part-create' %}?category={{ category.id }}">
<button class="btn btn-success">New Part</button>
</a>
@ -39,4 +39,28 @@
</div>
<div class='modal fade' id='modal-cat'>
<div class='modal-dialog'>
<div class='modal-content'>
</div>
</div>
</div>
{% endblock %}
{% block javascript %}
<script type='text/javascript' src="{% static 'script/modal_form.js' %}"></script>
<script type='text/javascript'>
$(".js-create-cat").click(function() {
launchModalForm("#modal-cat",
"{% url 'category-create' %}",
{category: {{ category.id }} });
});
</script>
{% endblock %}

View File

@ -5,6 +5,13 @@
{% include "part/cat_link.html" with category=category %}
<div class='modal fade' id='modal-cat'>
<div class='modal-dialog'>
<div class='modal-content'>
</div>
</div>
</div>
{% if children.all|length > 0 %}
<h4>Part Categories</h4>
{% include "part/category_subcategories.html" with children=children %}
@ -14,12 +21,26 @@
{% include "part/category_parts.html" with parts=parts %}
<div class='container-fluid'>
<a href="{% url 'category-create' %}">
<button class="btn btn-success">New Category</button>
</a>
<button type='button' class='btn btn-primary js-create-cat'>
New Category
</button>
<a href="{% url 'part-create' %}">
<button class="btn btn-success">New Part</button>
</a>
</div>
{% endblock %}
{% block javascript %}
<script type='text/javascript' src="{% static 'script/modal_form.js' %}"></script>
<script type="text/javascript">
$(document).ready(function () {
$(".js-create-cat").click(function() {
launchModalForm("#modal-cat", "{% url 'category-create' %}");
});
});
</script>
{% endblock %}

View File

@ -4,6 +4,8 @@ from __future__ import unicode_literals
from django.shortcuts import get_object_or_404
from django.http import HttpResponseRedirect
from django.urls import reverse_lazy
from django.views.generic import DetailView, ListView
from django.views.generic.edit import UpdateView, DeleteView, CreateView
@ -17,6 +19,7 @@ from .forms import EditBomItemForm
from .forms import EditSupplierPartForm
from InvenTree.views import AjaxCreateView, AjaxUpdateView
class PartIndex(ListView):
model = Part
@ -130,8 +133,11 @@ class CategoryDelete(DeleteView):
return HttpResponseRedirect(self.get_object().get_absolute_url())
class CategoryCreate(CreateView):
class CategoryCreate(AjaxCreateView):
model = PartCategory
ajax_form_action = reverse_lazy('category-create')
ajax_form_title = 'Create new part category'
ajax_template_name = 'modal_form.html'
template_name = 'part/category_new.html'
form_class = EditCategoryForm
@ -162,10 +168,12 @@ class BomItemDetail(DetailView):
template_name = 'part/bom-detail.html'
class BomItemCreate(CreateView):
class BomItemCreate(AjaxCreateView):
model = BomItem
form_class = EditBomItemForm
template_name = 'part/bom-create.html'
ajax_template_name = 'modal_form.html'
ajax_form_title = 'Create BOM item'
def get_initial(self):
# Look for initial values
@ -180,10 +188,12 @@ class BomItemCreate(CreateView):
return initials
class BomItemEdit(UpdateView):
class BomItemEdit(AjaxUpdateView):
model = BomItem
form_class = EditBomItemForm
template_name = 'part/bom-edit.html'
ajax_template_name = 'modal_form.html'
ajax_form_title = 'Edit BOM item'
class BomItemDelete(DeleteView):

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,56 @@
function launchModalForm(modal, url, data) {
$.ajax({
url: url, // Where to request the data from
type: 'get', // GET request
data: data, // Any additional context data (e.g. initial values)
dataType: 'json',
beforeSend: function() {
$(modal).modal('show');
},
success: function(response) {
if (response.html_form) {
var target = modal + ' .modal-content';
$(target).html(response.html_form);
} else {
alert('JSON response missing form data');
$(modal).modal('hide');
}
},
error: function (xhr, ajaxOptions, thrownError) {
alert('Error requesting form data:\n' + thrownError);
$(modal).modal('hide');
}
});
$(modal).on('submit', '.js-modal-form', function() {
var form = $(this);
$.ajax({
url: url,
data: form.serialize(),
type: form.attr('method'),
dataType: 'json',
success: function (response) {
if (response.form_valid) {
alert("Success!");
$(modal).modal('hide');
}
else if (response.html_form) {
var target = modal + ' .modal-content';
$(target).html(response.html_form);
}
else {
alert('JSON response missing form data');
$(modal).modal('hide');
}
},
error: function (xhr, ajaxOptions, thrownError) {
alert("Error posting form data:\n" + thrownError);
$(modal).modal('hide');
}
});
// Override the default form submit functionality
return false;
});
}

View File

@ -13,11 +13,6 @@
<link rel='stylesheet' href="{% static 'css/bootstrap_3.3.7_css_bootstrap.min.css' %}">
<link rel="stylesheet" href="{% static 'css/inventree.css' %}">
<!-- Scripts -->
<script type="text/javascript" src="{% static 'script/jquery_3.3.1_jquery.min.js' %}"></script>
{% block head %}
{% endblock %}
@ -39,5 +34,13 @@ InvenTree
{% endblock %}
</div>
<!-- Scripts -->
<script type="text/javascript" src="{% static 'script/jquery_3.3.1_jquery.min.js' %}"></script>
<script type="text/javascript" src="{% static 'script/bootstrap.min.js' %}"></script>
{% block javascript %}
{% endblock %}
</body>
</html>

View File

@ -0,0 +1,17 @@
<form method="post" action='{{ form_action }}' class='js-modal-form'>
{% csrf_token %}
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
<h4 class="modal-title">{{ form_title }}</h4>
</div>
<div class="modal-body">
{% load crispy_forms_tags %}
{% crispy form %}
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="submit" class="btn btn-primary">{{ submit_text }}</button>
</div>
</form>