Extend use of the jQuery UI autocomplete widget to the submitters field. Signed-off-by: Stephen Finucane <stephen.finuc...@intel.com> --- patchwork/filters.py | 9 +-- patchwork/templates/patchwork/filters.html | 120 +++-------------------------- patchwork/urls.py | 2 +- patchwork/views/base.py | 32 ++++---- 4 files changed, 25 insertions(+), 138 deletions(-)
diff --git a/patchwork/filters.py b/patchwork/filters.py index 03a7616..dc90f89 100644 --- a/patchwork/filters.py +++ b/patchwork/filters.py @@ -137,14 +137,7 @@ class SubmitterFilter(Filter): return '' def _form(self): - name = '' - if self.person: - name = self.person.name - return mark_safe( - '<input onKeyUp="submitter_field_change(this)"' - ' name="submitter" id="submitter_input" value="%s"> ' - '<select id="submitter_select" disabled="true"></select>' - % escape(name)) + return mark_safe('<input id="submitter" name="submitter">') def key(self): if self.person: diff --git a/patchwork/templates/patchwork/filters.html b/patchwork/templates/patchwork/filters.html index ff1935c..fc2e0ec 100644 --- a/patchwork/templates/patchwork/filters.html +++ b/patchwork/templates/patchwork/filters.html @@ -5,8 +5,8 @@ <script type="text/javascript" src="{% static "js/jquery-ui-1.11.4.min.js" %}"></script> <script type="text/javascript" language="JavaScript"> var filterform_displayed = false; -function filter_click() -{ + +function filter_click() { var form = document.getElementById('filterform'); if (!form) { return; @@ -19,131 +19,24 @@ function filter_click() form.style['display'] = 'block'; filterform_displayed = true; } - - -} -function enable_selected_submitter(select, input) -{ - select.name = 'submitter'; - input.name = ''; } + function filter_form_submit(form) { var i; - var submitter_select = document.getElementById("submitter_select"); - var submitter_input = document.getElementById("submitter_input"); - if (!submitter_select || !submitter_input) { - req = null; - return; - } - - /* submitter handling. if possible, use the select box, otherwise leave - * as-is (and so the text box is used). */ - - if (submitter_select.options.length == 0) { - /* if there's no match, just use the input */ - - } else if (submitter_select.options.length == 1) { - /* if there's only one match, request by id */ - submitter_select.selectedIndex = 0; - enable_selected_submitter(submitter_select, submitter_input); - - } else if (submitter_select.selectedIndex != -1) { - /* if the user has explicitly selected, request by id */ - enable_selected_submitter(submitter_select, submitter_input); - - } - for (i = 0; i < form.elements.length; i++) { var e = form.elements[i]; if (e.type == 'submit') { continue; } - /* handle submitter data */ - if (e.type == 'select-one') { - if (e.name == '') { - e.disabled = true; - } - if (e.selectedIndex != -1 - && e.options[e.selectedIndex].value == '') { - e.disabled = true; - } - - continue; - } - if (e.value == '') { e.disabled = true; } } } -var req = null; - -function submitter_complete_response() -{ - if (req.readyState != 4) { - return - } - - var completions; - eval("completions = " + req.responseText); - - if (completions.length == 0) { - req = null; - return; - } - - var submitter_select = document.getElementById("submitter_select"); - var submitter_input = document.getElementById("submitter_input"); - if (!submitter_select || !submitter_input) { - req = null; - return; - } - - for (i = 0; i < completions.length; i++) { - name = completions[i]['fields']['name']; - if (name) { - name = completions[i]['fields']['name'] + - ' <' + completions[i]['fields']['email'] + '>'; - } else { - name = completions[i]['fields']['email']; - } - o = new Option(name, completions[i]['pk']); - submitter_select.options[i] = o; - } - - /* remove remaining options */ - for (; i < submitter_select.length; i++) { - submitter_select.options[i] = null; - } - - submitter_select.disabled = false; - req = null; -} - -function submitter_field_change(field) -{ - var limit = 20; - var value = field.value; - if (value.length < 4) { - return; - } - - if (req) { - return; - } - - var url = '{% url 'patchwork.views.submitter_complete' %}?q=' + value + - '&l=' + limit; - req = new XMLHttpRequest(); - req.onreadystatechange = submitter_complete_response; - req.open("GET", url, true); - req.send(''); -} - $(function() { $("#delegate").autocomplete({ source: "{% url 'patchwork.views.get_delegates' %}", @@ -159,6 +52,13 @@ $(function() { } }); }); + +$(function() { + $("#submitter").autocomplete({ + source: "{% url 'patchwork.views.get_submitters' %}", + minLength: 3, + }); +}); </script> <div class="filters"> diff --git a/patchwork/urls.py b/patchwork/urls.py index 53ac6e5..026eb7a 100644 --- a/patchwork/urls.py +++ b/patchwork/urls.py @@ -73,7 +73,7 @@ urlpatterns = patterns('', (r'^confirm/(?P<key>[0-9a-f]+)/$', 'patchwork.views.confirm'), # submitter/delegate autocomplete - (r'^submitter/$', 'patchwork.views.submitter_complete'), + (r'^submitter/$', 'patchwork.views.get_submitters'), (r'^delegate/$', 'patchwork.views.get_delegates'), # email setup diff --git a/patchwork/views/base.py b/patchwork/views/base.py index 501e994..3e961ab 100644 --- a/patchwork/views/base.py +++ b/patchwork/views/base.py @@ -97,29 +97,23 @@ def confirm(request, key): return render_to_response('patchwork/confirm-error.html', context) -def submitter_complete(request): - search = request.GET.get('q', '') - limit = request.GET.get('l', None) - response = HttpResponse(content_type='text/plain') - - if len(search) <= 3: - return response +def get_submitters(request): + if not request.is_ajax(): + return HttpResponse('fail', 'application/json') + search = request.GET.get('term', '') queryset = Person.objects.filter(Q(name__icontains=search) | Q(email__icontains=search)) - if limit is not None: - try: - limit = int(limit) - except ValueError: - limit = None - - if limit is not None and limit > 0: - queryset = queryset[:limit] - - json_serializer = serializers.get_serializer('json')() - json_serializer.serialize(queryset, ensure_ascii=False, stream=response) + results = [] + for person in queryset: + result = {} + result['id'] = person.id + result['label'] = str(person) + result['value'] = person.id + results.append(result) + data = json.dumps(results) - return response + return HttpResponse(data, 'application/json') def get_delegates(request): -- 2.0.0 _______________________________________________ Patchwork mailing list Patchwork@lists.ozlabs.org https://lists.ozlabs.org/listinfo/patchwork