##// END OF EJS Templates
Moved javascript filters functions to application.js....
Jean-Philippe Lang -
r8578:858bd8dc4021
parent child
Show More
@@ -1,155 +1,53
1 <script type="text/javascript">
2 //<![CDATA[
3 function add_filter() {
4 select = $('add_filter_select');
5 field = select.value
6 Element.show('tr_' + field);
7 check_box = $('cb_' + field);
8 check_box.checked = true;
9 toggle_filter(field);
10 select.selectedIndex = 0;
11
12 for (i=0; i<select.options.length; i++) {
13 if (select.options[i].value == field) {
14 select.options[i].disabled = true;
15 }
16 }
17 }
18
19 function toggle_filter(field) {
20 check_box = $('cb_' + field);
21 if (check_box.checked) {
22 Element.show("operators_" + field);
23 Form.Element.enable("operators_" + field);
24 toggle_operator(field);
25 } else {
26 Element.hide("operators_" + field);
27 Form.Element.disable("operators_" + field);
28 enableValues(field, []);
29 }
30 }
31
32 function enableValues(field, indexes) {
33 var f = $$(".values_" + field);
34 for(var i=0;i<f.length;i++) {
35 if (indexes.include(i)) {
36 Form.Element.enable(f[i]);
37 f[i].up('span').show();
38 } else {
39 f[i].value = '';
40 Form.Element.disable(f[i]);
41 f[i].up('span').hide();
42 }
43 }
44 if (indexes.length > 0) {
45 Element.show("div_values_" + field);
46 } else {
47 Element.hide("div_values_" + field);
48 }
49 }
50
51 function toggle_operator(field) {
52 operator = $("operators_" + field);
53 switch (operator.value) {
54 case "!*":
55 case "*":
56 case "t":
57 case "w":
58 case "o":
59 case "c":
60 enableValues(field, []);
61 break;
62 case "><":
63 enableValues(field, [0,1]);
64 break;
65 case "<t+":
66 case ">t+":
67 case "t+":
68 case ">t-":
69 case "<t-":
70 case "t-":
71 enableValues(field, [2]);
72 break;
73 default:
74 enableValues(field, [0]);
75 break;
76 }
77 }
78
79 function toggle_multi_select(el) {
80 var select = $(el);
81 if (select.multiple == true) {
82 select.multiple = false;
83 } else {
84 select.multiple = true;
85 }
86 }
87
88 function submit_query_form(id) {
89 selectAllOptions("selected_columns");
90 $(id).submit();
91 }
92
93 function apply_filters_observer() {
94 $$("#query_form input[type=text]").invoke("observe", "keypress", function(e){
95 if(e.keyCode == Event.KEY_RETURN) {
96 submit_query_form("query_form");
97 }
98 });
99 }
100 Event.observe(document,"dom:loaded", apply_filters_observer);
101 //]]>
102 </script>
103
104 1 <table width="100%">
105 2 <tr>
106 3 <td>
107 4 <table>
108 5 <% query.available_filters.sort{|a,b| a[1][:order]<=>b[1][:order]}.each do |filter| %>
109 6 <% field = filter[0]
110 7 options = filter[1] %>
111 8 <tr <%= 'style="display:none;"' unless query.has_filter?(field) %> id="tr_<%= field %>" class="filter">
112 9 <td class="field">
113 10 <%= check_box_tag 'f[]', field, query.has_filter?(field), :onclick => "toggle_filter('#{field}');", :id => "cb_#{field}" %>
114 11 <label for="cb_<%= field %>"><%= filter[1][:name] || l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) %></label>
115 12 </td>
116 13 <td class="operator">
117 14 <%= label_tag "operators_#{field}", l(:description_filter), :class => "hidden-for-sighted" %>
118 15 <%= select_tag "op[#{field}]", options_for_select(operators_for_select(options[:type]),
119 16 query.operator_for(field)), :id => "operators_#{field}",
120 17 :onchange => "toggle_operator('#{field}');" %>
121 18 </td>
122 19 <td class="values">
123 20 <div id="div_values_<%= field %>" style="display:none;">
124 21 <% case options[:type]
125 22 when :list, :list_optional, :list_status, :list_subprojects %>
126 23 <span class="span_values_<%= field %>">
127 24 <%= select_tag "v[#{field}][]", options_for_select(options[:values], query.values_for(field)), :class => "values_#{field}", :id => "values_#{field}_1", :multiple => (query.values_for(field) && query.values_for(field).length > 1) %>
128 25 <%= link_to_function image_tag('bullet_toggle_plus.png'), "toggle_multi_select('values_#{field}_1');" %>
129 26 </span>
130 27 <% when :date, :date_past %>
131 28 <span class="span_values_<%= field %>"><%= text_field_tag "v[#{field}][]", query.value_for(field), :size => 10, :class => "values_#{field}", :id => "values_#{field}_1" %> <%= calendar_for "values_#{field}_1" %></span>
132 29 <span class="span_values_<%= field %>"><%= text_field_tag "v[#{field}][]", query.value_for(field, 1), :size => 10, :class => "values_#{field}", :id => "values_#{field}_2" %> <%= calendar_for "values_#{field}_2" %></span>
133 30 <span class="span_values_<%= field %>"><%= text_field_tag "v[#{field}][]", query.value_for(field), :size => 3, :class => "values_#{field}" %> <%= l(:label_day_plural) %></span>
134 31 <% when :string, :text %>
135 32 <span class="span_values_<%= field %>"><%= text_field_tag "v[#{field}][]", query.value_for(field), :class => "values_#{field}", :id => "values_#{field}", :size => 30 %></span>
136 33 <% when :integer, :float %>
137 34 <span class="span_values_<%= field %>"><%= text_field_tag "v[#{field}][]", query.value_for(field), :class => "values_#{field}", :id => "values_#{field}_1", :size => 6 %></span>
138 35 <span class="span_values_<%= field %>"><%= text_field_tag "v[#{field}][]", query.value_for(field, 1), :class => "values_#{field}", :id => "values_#{field}_2", :size => 6 %></span>
139 36 <% end %>
140 37 </div>
141 38 <script type="text/javascript">toggle_filter('<%= field %>');</script>
142 39 </td>
143 40 </tr>
144 41 <% end %>
145 42 </table>
146 43 </td>
147 44 <td class="add-filter">
148 45 <%= label_tag('add_filter_select', l(:label_filter_add)) %>
149 46 <%= select_tag 'add_filter_select', options_for_select([["",""]] + query.available_filters.sort{|a,b| a[1][:order]<=>b[1][:order]}.collect{|field| [ field[1][:name] || l(("field_"+field[0].to_s.gsub(/_id$/, "")).to_sym), field[0]] unless query.has_filter?(field[0])}.compact),
150 47 :onchange => "add_filter();",
151 48 :name => nil %>
152 49 </td>
153 50 </tr>
154 51 </table>
155 52 <%= hidden_field_tag 'f[]', '' %>
53 <%= javascript_tag 'Event.observe(window,"load",apply_filters_observer);' %>
@@ -1,419 +1,517
1 1 /* redMine - project management software
2 2 Copyright (C) 2006-2008 Jean-Philippe Lang */
3 3
4 4 function checkAll (id, checked) {
5 5 var els = Element.descendants(id);
6 6 for (var i = 0; i < els.length; i++) {
7 7 if (els[i].disabled==false) {
8 8 els[i].checked = checked;
9 9 }
10 10 }
11 11 }
12 12
13 13 function toggleCheckboxesBySelector(selector) {
14 14 boxes = $$(selector);
15 15 var all_checked = true;
16 16 for (i = 0; i < boxes.length; i++) { if (boxes[i].checked == false) { all_checked = false; } }
17 17 for (i = 0; i < boxes.length; i++) { boxes[i].checked = !all_checked; }
18 18 }
19 19
20 20 function setCheckboxesBySelector(checked, selector) {
21 21 var boxes = $$(selector);
22 22 boxes.each(function(ele) {
23 23 ele.checked = checked;
24 24 });
25 25 }
26 26
27 27 function showAndScrollTo(id, focus) {
28 28 Element.show(id);
29 29 if (focus!=null) { Form.Element.focus(focus); }
30 30 Element.scrollTo(id);
31 31 }
32 32
33 33 function toggleRowGroup(el) {
34 34 var tr = Element.up(el, 'tr');
35 35 var n = Element.next(tr);
36 36 tr.toggleClassName('open');
37 37 while (n != undefined && !n.hasClassName('group')) {
38 38 Element.toggle(n);
39 39 n = Element.next(n);
40 40 }
41 41 }
42 42
43 43 function collapseAllRowGroups(el) {
44 44 var tbody = Element.up(el, 'tbody');
45 45 tbody.childElements('tr').each(function(tr) {
46 46 if (tr.hasClassName('group')) {
47 47 tr.removeClassName('open');
48 48 } else {
49 49 tr.hide();
50 50 }
51 51 })
52 52 }
53 53
54 54 function expandAllRowGroups(el) {
55 55 var tbody = Element.up(el, 'tbody');
56 56 tbody.childElements('tr').each(function(tr) {
57 57 if (tr.hasClassName('group')) {
58 58 tr.addClassName('open');
59 59 } else {
60 60 tr.show();
61 61 }
62 62 })
63 63 }
64 64
65 65 function toggleAllRowGroups(el) {
66 66 var tr = Element.up(el, 'tr');
67 67 if (tr.hasClassName('open')) {
68 68 collapseAllRowGroups(el);
69 69 } else {
70 70 expandAllRowGroups(el);
71 71 }
72 72 }
73 73
74 74 function toggleFieldset(el) {
75 75 var fieldset = Element.up(el, 'fieldset');
76 76 fieldset.toggleClassName('collapsed');
77 77 Effect.toggle(fieldset.down('div'), 'slide', {duration:0.2});
78 78 }
79 79
80 80 function hideFieldset(el) {
81 81 var fieldset = Element.up(el, 'fieldset');
82 82 fieldset.toggleClassName('collapsed');
83 83 fieldset.down('div').hide();
84 84 }
85 85
86 function add_filter() {
87 select = $('add_filter_select');
88 field = select.value
89 Element.show('tr_' + field);
90 check_box = $('cb_' + field);
91 check_box.checked = true;
92 toggle_filter(field);
93 select.selectedIndex = 0;
94
95 for (i=0; i<select.options.length; i++) {
96 if (select.options[i].value == field) {
97 select.options[i].disabled = true;
98 }
99 }
100 }
101
102 function toggle_filter(field) {
103 check_box = $('cb_' + field);
104 if (check_box.checked) {
105 Element.show("operators_" + field);
106 Form.Element.enable("operators_" + field);
107 toggle_operator(field);
108 } else {
109 Element.hide("operators_" + field);
110 Form.Element.disable("operators_" + field);
111 enableValues(field, []);
112 }
113 }
114
115 function enableValues(field, indexes) {
116 var f = $$(".values_" + field);
117 for(var i=0;i<f.length;i++) {
118 if (indexes.include(i)) {
119 Form.Element.enable(f[i]);
120 f[i].up('span').show();
121 } else {
122 f[i].value = '';
123 Form.Element.disable(f[i]);
124 f[i].up('span').hide();
125 }
126 }
127 if (indexes.length > 0) {
128 Element.show("div_values_" + field);
129 } else {
130 Element.hide("div_values_" + field);
131 }
132 }
133
134 function toggle_operator(field) {
135 operator = $("operators_" + field);
136 switch (operator.value) {
137 case "!*":
138 case "*":
139 case "t":
140 case "w":
141 case "o":
142 case "c":
143 enableValues(field, []);
144 break;
145 case "><":
146 enableValues(field, [0,1]);
147 break;
148 case "<t+":
149 case ">t+":
150 case "t+":
151 case ">t-":
152 case "<t-":
153 case "t-":
154 enableValues(field, [2]);
155 break;
156 default:
157 enableValues(field, [0]);
158 break;
159 }
160 }
161
162 function toggle_multi_select(el) {
163 var select = $(el);
164 if (select.multiple == true) {
165 select.multiple = false;
166 } else {
167 select.multiple = true;
168 }
169 }
170
171 function submit_query_form(id) {
172 selectAllOptions("selected_columns");
173 $(id).submit();
174 }
175
176 function apply_filters_observer() {
177 $$("#query_form input[type=text]").invoke("observe", "keypress", function(e){
178 if(e.keyCode == Event.KEY_RETURN) {
179 submit_query_form("query_form");
180 }
181 });
182 }
183
86 184 var fileFieldCount = 1;
87 185
88 186 function addFileField() {
89 187 var fields = $('attachments_fields');
90 188 if (fields.childElements().length >= 10) return false;
91 189 fileFieldCount++;
92 190 var s = document.createElement("span");
93 191 s.update(fields.down('span').innerHTML);
94 192 s.down('input.file').name = "attachments[" + fileFieldCount + "][file]";
95 193 s.down('input.description').name = "attachments[" + fileFieldCount + "][description]";
96 194 fields.appendChild(s);
97 195 }
98 196
99 197 function removeFileField(el) {
100 198 var fields = $('attachments_fields');
101 199 var s = Element.up(el, 'span');
102 200 if (fields.childElements().length > 1) {
103 201 s.remove();
104 202 } else {
105 203 s.update(s.innerHTML);
106 204 }
107 205 }
108 206
109 207 function checkFileSize(el, maxSize, message) {
110 208 var files = el.files;
111 209 if (files) {
112 210 for (var i=0; i<files.length; i++) {
113 211 if (files[i].size > maxSize) {
114 212 alert(message);
115 213 el.value = "";
116 214 }
117 215 }
118 216 }
119 217 }
120 218
121 219 function showTab(name) {
122 220 var f = $$('div#content .tab-content');
123 221 for(var i=0; i<f.length; i++){
124 222 Element.hide(f[i]);
125 223 }
126 224 var f = $$('div.tabs a');
127 225 for(var i=0; i<f.length; i++){
128 226 Element.removeClassName(f[i], "selected");
129 227 }
130 228 Element.show('tab-content-' + name);
131 229 Element.addClassName('tab-' + name, "selected");
132 230 return false;
133 231 }
134 232
135 233 function moveTabRight(el) {
136 234 var lis = Element.up(el, 'div.tabs').down('ul').childElements();
137 235 var tabsWidth = 0;
138 236 var i;
139 237 for (i=0; i<lis.length; i++) {
140 238 if (lis[i].visible()) {
141 239 tabsWidth += lis[i].getWidth() + 6;
142 240 }
143 241 }
144 242 if (tabsWidth < Element.up(el, 'div.tabs').getWidth() - 60) {
145 243 return;
146 244 }
147 245 i=0;
148 246 while (i<lis.length && !lis[i].visible()) {
149 247 i++;
150 248 }
151 249 lis[i].hide();
152 250 }
153 251
154 252 function moveTabLeft(el) {
155 253 var lis = Element.up(el, 'div.tabs').down('ul').childElements();
156 254 var i = 0;
157 255 while (i<lis.length && !lis[i].visible()) {
158 256 i++;
159 257 }
160 258 if (i>0) {
161 259 lis[i-1].show();
162 260 }
163 261 }
164 262
165 263 function displayTabsButtons() {
166 264 var lis;
167 265 var tabsWidth = 0;
168 266 var i;
169 267 $$('div.tabs').each(function(el) {
170 268 lis = el.down('ul').childElements();
171 269 for (i=0; i<lis.length; i++) {
172 270 if (lis[i].visible()) {
173 271 tabsWidth += lis[i].getWidth() + 6;
174 272 }
175 273 }
176 274 if ((tabsWidth < el.getWidth() - 60) && (lis[0].visible())) {
177 275 el.down('div.tabs-buttons').hide();
178 276 } else {
179 277 el.down('div.tabs-buttons').show();
180 278 }
181 279 });
182 280 }
183 281
184 282 function setPredecessorFieldsVisibility() {
185 283 relationType = $('relation_relation_type');
186 284 if (relationType && (relationType.value == "precedes" || relationType.value == "follows")) {
187 285 Element.show('predecessor_fields');
188 286 } else {
189 287 Element.hide('predecessor_fields');
190 288 }
191 289 }
192 290
193 291 function promptToRemote(text, param, url) {
194 292 value = prompt(text + ':');
195 293 if (value) {
196 294 new Ajax.Request(url + '?' + param + '=' + encodeURIComponent(value), {asynchronous:true, evalScripts:true});
197 295 return false;
198 296 }
199 297 }
200 298
201 299 function showModal(id, width) {
202 300 el = $(id);
203 301 if (el == undefined || el.visible()) {return;}
204 302 var h = $$('body')[0].getHeight();
205 303 var d = document.createElement("div");
206 304 d.id = 'modalbg';
207 305 $('main').appendChild(d);
208 306 $('modalbg').setStyle({ width: '100%', height: h + 'px' });
209 307 $('modalbg').show();
210 308
211 309 var pageWidth = document.viewport.getWidth();
212 310 if (width) {
213 311 el.setStyle({'width': width});
214 312 }
215 313 el.setStyle({'left': (((pageWidth - el.getWidth())/2 *100) / pageWidth) + '%'});
216 314 el.addClassName('modal');
217 315 el.show();
218 316
219 317 var submit = el.down("input[type=submit]");
220 318 if (submit) {
221 319 submit.focus();
222 320 }
223 321 }
224 322
225 323 function hideModal(el) {
226 324 var modal = Element.up(el, 'div.modal');
227 325 if (modal) {
228 326 modal.hide();
229 327 }
230 328 var bg = $('modalbg');
231 329 if (bg) {
232 330 bg.remove();
233 331 }
234 332 }
235 333
236 334 function collapseScmEntry(id) {
237 335 var els = document.getElementsByClassName(id, 'browser');
238 336 for (var i = 0; i < els.length; i++) {
239 337 if (els[i].hasClassName('open')) {
240 338 collapseScmEntry(els[i].id);
241 339 }
242 340 Element.hide(els[i]);
243 341 }
244 342 $(id).removeClassName('open');
245 343 }
246 344
247 345 function expandScmEntry(id) {
248 346 var els = document.getElementsByClassName(id, 'browser');
249 347 for (var i = 0; i < els.length; i++) {
250 348 Element.show(els[i]);
251 349 if (els[i].hasClassName('loaded') && !els[i].hasClassName('collapsed')) {
252 350 expandScmEntry(els[i].id);
253 351 }
254 352 }
255 353 $(id).addClassName('open');
256 354 }
257 355
258 356 function scmEntryClick(id) {
259 357 el = $(id);
260 358 if (el.hasClassName('open')) {
261 359 collapseScmEntry(id);
262 360 el.addClassName('collapsed');
263 361 return false;
264 362 } else if (el.hasClassName('loaded')) {
265 363 expandScmEntry(id);
266 364 el.removeClassName('collapsed');
267 365 return false;
268 366 }
269 367 if (el.hasClassName('loading')) {
270 368 return false;
271 369 }
272 370 el.addClassName('loading');
273 371 return true;
274 372 }
275 373
276 374 function scmEntryLoaded(id) {
277 375 Element.addClassName(id, 'open');
278 376 Element.addClassName(id, 'loaded');
279 377 Element.removeClassName(id, 'loading');
280 378 }
281 379
282 380 function randomKey(size) {
283 381 var chars = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
284 382 var key = '';
285 383 for (i = 0; i < size; i++) {
286 384 key += chars[Math.floor(Math.random() * chars.length)];
287 385 }
288 386 return key;
289 387 }
290 388
291 389 function observeParentIssueField(url) {
292 390 new Ajax.Autocompleter('issue_parent_issue_id',
293 391 'parent_issue_candidates',
294 392 url,
295 393 { minChars: 3,
296 394 frequency: 0.5,
297 395 paramName: 'q',
298 396 method: 'get',
299 397 updateElement: function(value) {
300 398 document.getElementById('issue_parent_issue_id').value = value.id;
301 399 }});
302 400 }
303 401
304 402 function observeRelatedIssueField(url) {
305 403 new Ajax.Autocompleter('relation_issue_to_id',
306 404 'related_issue_candidates',
307 405 url,
308 406 { minChars: 3,
309 407 frequency: 0.5,
310 408 paramName: 'q',
311 409 method: 'get',
312 410 updateElement: function(value) {
313 411 document.getElementById('relation_issue_to_id').value = value.id;
314 412 },
315 413 parameters: 'scope=all'
316 414 });
317 415 }
318 416
319 417 function setVisible(id, visible) {
320 418 var el = $(id);
321 419 if (el) {if (visible) {el.show();} else {el.hide();}}
322 420 }
323 421
324 422 function observeProjectModules() {
325 423 var f = function() {
326 424 /* Hides trackers and issues custom fields on the new project form when issue_tracking module is disabled */
327 425 var c = ($('project_enabled_module_names_issue_tracking').checked == true);
328 426 setVisible('project_trackers', c);
329 427 setVisible('project_issue_custom_fields', c);
330 428 };
331 429
332 430 Event.observe(window, 'load', f);
333 431 Event.observe('project_enabled_module_names_issue_tracking', 'change', f);
334 432 }
335 433
336 434 /*
337 435 * Class used to warn user when leaving a page with unsaved textarea
338 436 * Author: mathias.fischer@berlinonline.de
339 437 */
340 438
341 439 var WarnLeavingUnsaved = Class.create({
342 440 observedForms: false,
343 441 observedElements: false,
344 442 changedForms: false,
345 443 message: null,
346 444
347 445 initialize: function(message){
348 446 this.observedForms = $$('form');
349 447 this.observedElements = $$('textarea');
350 448 this.message = message;
351 449
352 450 this.observedElements.each(this.observeChange.bind(this));
353 451 this.observedForms.each(this.submitAction.bind(this));
354 452
355 453 window.onbeforeunload = this.unload.bind(this);
356 454 },
357 455
358 456 unload: function(){
359 457 this.observedElements.each(function(el) {el.blur();})
360 458 if(this.changedForms)
361 459 return this.message;
362 460 },
363 461
364 462 setChanged: function(){
365 463 this.changedForms = true;
366 464 },
367 465
368 466 setUnchanged: function(){
369 467 this.changedForms = false;
370 468 },
371 469
372 470 observeChange: function(element){
373 471 element.observe('change',this.setChanged.bindAsEventListener(this));
374 472 },
375 473
376 474 submitAction: function(element){
377 475 element.observe('submit',this.setUnchanged.bindAsEventListener(this));
378 476 }
379 477 });
380 478
381 479 /*
382 480 * 1 - registers a callback which copies the csrf token into the
383 481 * X-CSRF-Token header with each ajax request. Necessary to
384 482 * work with rails applications which have fixed
385 483 * CVE-2011-0447
386 484 * 2 - shows and hides ajax indicator
387 485 */
388 486 Ajax.Responders.register({
389 487 onCreate: function(request){
390 488 var csrf_meta_tag = $$('meta[name=csrf-token]')[0];
391 489
392 490 if (csrf_meta_tag) {
393 491 var header = 'X-CSRF-Token',
394 492 token = csrf_meta_tag.readAttribute('content');
395 493
396 494 if (!request.options.requestHeaders) {
397 495 request.options.requestHeaders = {};
398 496 }
399 497 request.options.requestHeaders[header] = token;
400 498 }
401 499
402 500 if ($('ajax-indicator') && Ajax.activeRequestCount > 0) {
403 501 Element.show('ajax-indicator');
404 502 }
405 503 },
406 504 onComplete: function(){
407 505 if ($('ajax-indicator') && Ajax.activeRequestCount == 0) {
408 506 Element.hide('ajax-indicator');
409 507 }
410 508 }
411 509 });
412 510
413 511 function hideOnLoad() {
414 512 $$('.hol').each(function(el) {
415 513 el.hide();
416 514 });
417 515 }
418 516
419 517 Event.observe(window, 'load', hideOnLoad);
General Comments 0
You need to be logged in to leave comments. Login now