Skip to content

Commit 9c06587

Browse files
committed
Refactor search logic to trigger with jQuery instead of inserting
attributes directly, moving it to a separate JS file; fixes a bug in the new schema - Legacy-Id: 3927
1 parent 1756491 commit 9c06587

6 files changed

Lines changed: 104 additions & 125 deletions

File tree

ietf/idrfc/views_search.py

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -43,35 +43,21 @@
4343
from ietf.utils import normalize_draftname
4444
from django.conf import settings
4545

46-
def addInputEvents(widget):
47-
widget.attrs["oninput"] = 'inputEvent()'
48-
widget.attrs["onpropertychange"] = 'propertyChange()'
49-
50-
def addChangeEvent(widget):
51-
widget.attrs["onchange"] = 'changeEvent()'
52-
5346
class SearchForm(forms.Form):
5447
name = forms.CharField(required=False)
55-
addInputEvents(name.widget)
5648
rfcs = forms.BooleanField(required=False,initial=True)
5749
activeDrafts = forms.BooleanField(required=False,initial=True)
5850
oldDrafts = forms.BooleanField(required=False,initial=False)
5951
lucky = forms.BooleanField(required=False,initial=False)
6052

6153
by = forms.ChoiceField(choices=[(x,x) for x in ('author','group','area','ad','state')], required=False, initial='wg', label='Foobar')
6254
author = forms.CharField(required=False)
63-
addInputEvents(author.widget)
6455
group = forms.CharField(required=False)
65-
addInputEvents(group.widget)
6656
area = forms.ModelChoiceField(Area.active_areas(), empty_label="any area", required=False)
67-
addChangeEvent(area.widget)
6857
ad = forms.ChoiceField(choices=(), required=False)
69-
addChangeEvent(ad.widget)
7058
state = forms.ModelChoiceField(IDState.objects.all(), empty_label="any state", required=False)
71-
addChangeEvent(state.widget)
7259
subState = forms.ChoiceField(choices=(), required=False)
73-
addChangeEvent(subState.widget)
74-
60+
7561
def __init__(self, *args, **kwargs):
7662
super(SearchForm, self).__init__(*args, **kwargs)
7763
self.fields['ad'].choices = [('', 'any AD')] + [(ad.id, "%s %s" % (ad.first_name, ad.last_name)) for ad in IESGLogin.objects.filter(user_level=1).order_by('last_name')] + [('-99', '------------------')] + [(ad.id, "%s %s" % (ad.first_name, ad.last_name)) for ad in IESGLogin.objects.filter(user_level=2).order_by('last_name')]
@@ -275,25 +261,18 @@ def search_query(query_original, sort_by=None):
275261

276262
class SearchForm(forms.Form):
277263
name = forms.CharField(required=False)
278-
addInputEvents(name.widget) # consider moving this to jQuery client-side instead
279264
rfcs = forms.BooleanField(required=False,initial=True)
280265
activeDrafts = forms.BooleanField(required=False,initial=True)
281266
oldDrafts = forms.BooleanField(required=False,initial=False)
282267
lucky = forms.BooleanField(required=False,initial=False)
283268

284269
by = forms.ChoiceField(choices=[(x,x) for x in ('author','group','area','ad','state')], required=False, initial='wg', label='Foobar')
285270
author = forms.CharField(required=False)
286-
addInputEvents(author.widget)
287271
group = forms.CharField(required=False)
288-
addInputEvents(group.widget)
289272
area = forms.ModelChoiceField(Group.objects.filter(type="area", state="active").order_by('name'), empty_label="any area", required=False)
290-
addInputEvents(area.widget)
291273
ad = forms.ChoiceField(choices=(), required=False)
292-
addInputEvents(ad.widget)
293274
state = forms.ModelChoiceField(State.objects.filter(type="draft-iesg"), empty_label="any state", required=False)
294-
addInputEvents(state.widget)
295275
subState = forms.ChoiceField(choices=(), required=False)
296-
addInputEvents(subState.widget)
297276

298277
def __init__(self, *args, **kwargs):
299278
super(SearchForm, self).__init__(*args, **kwargs)

ietf/templates/base.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@
102102
//]]>
103103
</script>
104104
<script type="text/javascript" src="/js/base.js"></script>
105+
{% block js %}{% endblock %}
105106

106107
{% block content_end %}
107108
{% endblock %}

ietf/templates/idrfc/main.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,3 +82,7 @@ <h1>Search Internet-Drafts and RFCs</h1>
8282
var oButton = new YAHOO.widget.Button("search_submit_button", {});
8383
});
8484
{% endblock scripts %}
85+
86+
{% block js %}
87+
<script type="text/javascript" src="/js/doc-search.js"></script>
88+
{% endblock %}

ietf/templates/idrfc/search_form.html

Lines changed: 6 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -47,25 +47,25 @@
4747
</table>
4848
</div>
4949

50-
<span onclick="toggleAdvanced();"><b><img src="/images/{% if meta.advanced %}minus{% else %}plus{% endif %}.png" alt="" id="search_advanced-img" /> Advanced</b></span>
50+
<span class="toggle_advanced"><b><img src="/images/{% if meta.advanced %}minus{% else %}plus{% endif %}.png" alt="" id="search_advanced-img" /> Advanced</b></span>
5151

5252
<div id="search_advanced" style="{% if not meta.advanced %}display:none;{%endif%}margin-top:1em;">
5353
Additional search criteria:
5454

5555
<div class="search_field">
56-
<label><input type="radio" class="radio" name="by" value="author" {% ifequal meta.by "author" %}checked="checked"{% endifequal %} onclick="changeBy();"/> Author (last name):</label> {{ form.author }}
56+
<label><input type="radio" class="radio" name="by" value="author" {% ifequal meta.by "author" %}checked="checked"{% endifequal %}/> Author (last name):</label> {{ form.author }}
5757
</div>
5858
<div class="search_field">
59-
<label><input type="radio" class="radio" name="by" value="group" {% ifequal meta.by "group" %}checked="checked"{% endifequal %} onclick="changeBy();"/> WG:</label> {{ form.group }}
59+
<label><input type="radio" class="radio" name="by" value="group" {% ifequal meta.by "group" %}checked="checked"{% endifequal %}/> WG:</label> {{ form.group }}
6060
</div>
6161
<div class="search_field">
62-
<label><input type="radio" class="radio" name="by" value="area" {% ifequal meta.by "area" %}checked="checked"{% endifequal %} onclick="changeBy();"/> Area:</label> {{ form.area }}
62+
<label><input type="radio" class="radio" name="by" value="area" {% ifequal meta.by "area" %}checked="checked"{% endifequal %}/> Area:</label> {{ form.area }}
6363
</div>
6464
<div class="search_field">
65-
<label><input type="radio" class="radio" name="by" value="ad" {% ifequal meta.by "ad" %}checked="checked"{% endifequal %} onclick="changeBy();"/> Responsible AD:</label> {{ form.ad }}
65+
<label><input type="radio" class="radio" name="by" value="ad" {% ifequal meta.by "ad" %}checked="checked"{% endifequal %}/> Responsible AD:</label> {{ form.ad }}
6666
</div>
6767
<div class="search_field">
68-
<label><input type="radio" class="radio" name="by" value="state" {% ifequal meta.by "state" %}checked="checked"{% endifequal %} onclick="changeBy();"/> IESG State:</label> {{ form.state }} :: {{ form.subState }}
68+
<label><input type="radio" class="radio" name="by" value="state" {% ifequal meta.by "state" %}checked="checked"{% endifequal %}/> IESG State:</label> {{ form.state }} :: {{ form.subState }}
6969
</div>
7070
{% comment %}
7171
<div class="search_field" style="text-decoration:line-through;color:#808080;">
@@ -83,100 +83,3 @@
8383
</div>
8484

8585
</form>
86-
87-
<script type="text/javascript">
88-
//<![CDATA[
89-
// we want to disable our submit button if we have no search text,
90-
// and we have no advanced options selected
91-
function toggleSubmit() {
92-
var button = document.getElementById("id_search_submit");
93-
var by = findCheckedSearchBy();
94-
var value = findSearchByValue(by);
95-
var text = document.getElementById("id_name");
96-
if ((value == "") && (text.value == "")) {
97-
button.disabled = true;
98-
} else {
99-
button.disabled = false;
100-
}
101-
}
102-
103-
// check our button status after every change to text fields
104-
// Internet Explorer uses 'onpropertychange', everyone else 'oninput'
105-
function inputEvent(event) {
106-
toggleSubmit();
107-
}
108-
function propertyChange() {
109-
toggleSubmit();
110-
}
111-
112-
// check our button status after every change to selection pulldowns
113-
function changeEvent(event) {
114-
toggleSubmit();
115-
}
116-
117-
function togglePlusMinus(id) {
118-
var el = document.getElementById(id);
119-
var imgEl = document.getElementById(id+"-img");
120-
if (el.style.display == 'none') {
121-
el.style.display = 'block';
122-
imgEl.src = "/images/minus.png";
123-
} else {
124-
el.style.display = 'none';
125-
imgEl.src = "/images/plus.png";
126-
}
127-
}
128-
129-
function findCheckedSearchBy() {
130-
var by='';
131-
var f = document.search_form;
132-
for (var i = 0; i < f.by.length; i++) {
133-
if (f.by[i].checked) {
134-
by = f.by[i].value;
135-
break;
136-
}
137-
}
138-
return by;
139-
}
140-
141-
function findSearchByValue(by) {
142-
if (by == 'author') { return document.getElementById("id_author").value; }
143-
if (by == 'group') { return document.getElementById("id_group").value; }
144-
if (by == 'area') { return document.getElementById("id_area").value; }
145-
if (by == 'ad') { return document.getElementById("id_ad").value; }
146-
if (by == 'state') {
147-
// state might be state...
148-
state_value = document.getElementById("id_state").value;
149-
if (state_value) { return state_value; }
150-
// ...or sub-state
151-
return document.getElementById("id_subState").value;
152-
}
153-
return '';
154-
}
155-
156-
function changeBy() {
157-
var by=findCheckedSearchBy();
158-
var f = document.search_form;
159-
f.author.disabled=true;
160-
f.group.disabled=true;
161-
f.area.disabled=true;
162-
f.ad.disabled=true;
163-
f.state.disabled=true; f.subState.disabled=true;
164-
if (by=='author') { f.author.disabled=false;}
165-
if (by=='group') { f.group.disabled=false;}
166-
if (by=='area') { f.area.disabled=false;}
167-
if (by=='ad') { f.ad.disabled=false; }
168-
if (by=='state') { f.state.disabled=false; f.subState.disabled=false; }
169-
170-
toggleSubmit();
171-
}
172-
173-
function toggleAdvanced() {
174-
togglePlusMinus("search_advanced");
175-
var f = document.search_form;
176-
for (var i = 0; i < f.by.length; i++) { f.by[i].checked = false; }
177-
changeBy();
178-
}
179-
180-
changeBy();
181-
//]]>
182-
</script>

ietf/templates/idrfc/search_main.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,7 @@ <h1>Internet-Drafts and RFCs</h1>
5353
var oButton = new YAHOO.widget.Button("search_submit_button", {});
5454
});
5555
{% endblock scripts %}
56+
57+
{% block js %}
58+
<script type="text/javascript" src="/js/doc-search.js"></script>
59+
{% endblock %}

static/js/doc-search.js

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
$(function () {
2+
var form = jQuery("#search_form");
3+
4+
form.find(".search_field").click(function () {
5+
changeBy();
6+
});
7+
8+
form.find(".search_field").find("input,select")
9+
.change(toggleSubmit).click(toggleSubmit).keyup(toggleSubmit);
10+
11+
form.find(".toggle_advanced").click(function () {
12+
togglePlusMinus("search_advanced");
13+
form.find('.search_field input[type="radio"]').attr("checked", false);
14+
changeBy();
15+
});
16+
17+
changeBy();
18+
19+
// we want to disable our submit button if we have no search text,
20+
// and we have no advanced options selected
21+
function toggleSubmit() {
22+
var button = document.getElementById("id_search_submit");
23+
var by = findCheckedSearchBy();
24+
var value = findSearchByValue(by);
25+
var text = document.getElementById("id_name");
26+
if ((value == "") && (text.value == "")) {
27+
button.disabled = true;
28+
} else {
29+
button.disabled = false;
30+
}
31+
}
32+
33+
function togglePlusMinus(id) {
34+
var el = document.getElementById(id);
35+
var imgEl = document.getElementById(id+"-img");
36+
if (el.style.display == 'none') {
37+
el.style.display = 'block';
38+
imgEl.src = "/images/minus.png";
39+
} else {
40+
el.style.display = 'none';
41+
imgEl.src = "/images/plus.png";
42+
}
43+
}
44+
45+
function findCheckedSearchBy() {
46+
var by='';
47+
var f = document.search_form;
48+
for (var i = 0; i < f.by.length; i++) {
49+
if (f.by[i].checked) {
50+
by = f.by[i].value;
51+
break;
52+
}
53+
}
54+
return by;
55+
}
56+
57+
function findSearchByValue(by) {
58+
if (by == 'author') { return document.getElementById("id_author").value; }
59+
if (by == 'group') { return document.getElementById("id_group").value; }
60+
if (by == 'area') { return document.getElementById("id_area").value; }
61+
if (by == 'ad') { return document.getElementById("id_ad").value; }
62+
if (by == 'state') {
63+
// state might be state...
64+
state_value = document.getElementById("id_state").value;
65+
if (state_value) { return state_value; }
66+
// ...or sub-state
67+
return document.getElementById("id_subState").value;
68+
}
69+
return '';
70+
}
71+
72+
function changeBy() {
73+
var by = findCheckedSearchBy();
74+
var f = document.search_form;
75+
f.author.disabled=true;
76+
f.group.disabled=true;
77+
f.area.disabled=true;
78+
f.ad.disabled=true;
79+
f.state.disabled=true; f.subState.disabled=true;
80+
if (by=='author') { f.author.disabled=false;}
81+
if (by=='group') { f.group.disabled=false;}
82+
if (by=='area') { f.area.disabled=false;}
83+
if (by=='ad') { f.ad.disabled=false; }
84+
if (by=='state') { f.state.disabled=false; f.subState.disabled=false; }
85+
86+
toggleSubmit();
87+
}
88+
});

0 commit comments

Comments
 (0)