##// END OF EJS Templates
Fixed: JS-error while using a global custom query w/ project filter in a project context (#15190)....
Jean-Philippe Lang -
r12004:ec5dbdb0bde1
parent child
Show More
@@ -1,592 +1,593
1 1 /* Redmine - project management software
2 2 Copyright (C) 2006-2013 Jean-Philippe Lang */
3 3
4 4 function checkAll(id, checked) {
5 5 $('#'+id).find('input[type=checkbox]:enabled').attr('checked', checked);
6 6 }
7 7
8 8 function toggleCheckboxesBySelector(selector) {
9 9 var all_checked = true;
10 10 $(selector).each(function(index) {
11 11 if (!$(this).is(':checked')) { all_checked = false; }
12 12 });
13 13 $(selector).attr('checked', !all_checked);
14 14 }
15 15
16 16 function showAndScrollTo(id, focus) {
17 17 $('#'+id).show();
18 18 if (focus !== null) {
19 19 $('#'+focus).focus();
20 20 }
21 21 $('html, body').animate({scrollTop: $('#'+id).offset().top}, 100);
22 22 }
23 23
24 24 function toggleRowGroup(el) {
25 25 var tr = $(el).parents('tr').first();
26 26 var n = tr.next();
27 27 tr.toggleClass('open');
28 28 while (n.length && !n.hasClass('group')) {
29 29 n.toggle();
30 30 n = n.next('tr');
31 31 }
32 32 }
33 33
34 34 function collapseAllRowGroups(el) {
35 35 var tbody = $(el).parents('tbody').first();
36 36 tbody.children('tr').each(function(index) {
37 37 if ($(this).hasClass('group')) {
38 38 $(this).removeClass('open');
39 39 } else {
40 40 $(this).hide();
41 41 }
42 42 });
43 43 }
44 44
45 45 function expandAllRowGroups(el) {
46 46 var tbody = $(el).parents('tbody').first();
47 47 tbody.children('tr').each(function(index) {
48 48 if ($(this).hasClass('group')) {
49 49 $(this).addClass('open');
50 50 } else {
51 51 $(this).show();
52 52 }
53 53 });
54 54 }
55 55
56 56 function toggleAllRowGroups(el) {
57 57 var tr = $(el).parents('tr').first();
58 58 if (tr.hasClass('open')) {
59 59 collapseAllRowGroups(el);
60 60 } else {
61 61 expandAllRowGroups(el);
62 62 }
63 63 }
64 64
65 65 function toggleFieldset(el) {
66 66 var fieldset = $(el).parents('fieldset').first();
67 67 fieldset.toggleClass('collapsed');
68 68 fieldset.children('div').toggle();
69 69 }
70 70
71 71 function hideFieldset(el) {
72 72 var fieldset = $(el).parents('fieldset').first();
73 73 fieldset.toggleClass('collapsed');
74 74 fieldset.children('div').hide();
75 75 }
76 76
77 77 function initFilters() {
78 78 $('#add_filter_select').change(function() {
79 79 addFilter($(this).val(), '', []);
80 80 });
81 81 $('#filters-table td.field input[type=checkbox]').each(function() {
82 82 toggleFilter($(this).val());
83 83 });
84 84 $('#filters-table td.field input[type=checkbox]').live('click', function() {
85 85 toggleFilter($(this).val());
86 86 });
87 87 $('#filters-table .toggle-multiselect').live('click', function() {
88 88 toggleMultiSelect($(this).siblings('select'));
89 89 });
90 90 $('#filters-table input[type=text]').live('keypress', function(e) {
91 91 if (e.keyCode == 13) submit_query_form("query_form");
92 92 });
93 93 }
94 94
95 95 function addFilter(field, operator, values) {
96 96 var fieldId = field.replace('.', '_');
97 97 var tr = $('#tr_'+fieldId);
98 98 if (tr.length > 0) {
99 99 tr.show();
100 100 } else {
101 101 buildFilterRow(field, operator, values);
102 102 }
103 103 $('#cb_'+fieldId).attr('checked', true);
104 104 toggleFilter(field);
105 105 $('#add_filter_select').val('').children('option').each(function() {
106 106 if ($(this).attr('value') == field) {
107 107 $(this).attr('disabled', true);
108 108 }
109 109 });
110 110 }
111 111
112 112 function buildFilterRow(field, operator, values) {
113 113 var fieldId = field.replace('.', '_');
114 114 var filterTable = $("#filters-table");
115 115 var filterOptions = availableFilters[field];
116 if (!filterOptions) return;
116 117 var operators = operatorByType[filterOptions['type']];
117 118 var filterValues = filterOptions['values'];
118 119 var i, select;
119 120
120 121 var tr = $('<tr class="filter">').attr('id', 'tr_'+fieldId).html(
121 122 '<td class="field"><input checked="checked" id="cb_'+fieldId+'" name="f[]" value="'+field+'" type="checkbox"><label for="cb_'+fieldId+'"> '+filterOptions['name']+'</label></td>' +
122 123 '<td class="operator"><select id="operators_'+fieldId+'" name="op['+field+']"></td>' +
123 124 '<td class="values"></td>'
124 125 );
125 126 filterTable.append(tr);
126 127
127 128 select = tr.find('td.operator select');
128 129 for (i = 0; i < operators.length; i++) {
129 130 var option = $('<option>').val(operators[i]).text(operatorLabels[operators[i]]);
130 131 if (operators[i] == operator) { option.attr('selected', true); }
131 132 select.append(option);
132 133 }
133 134 select.change(function(){ toggleOperator(field); });
134 135
135 136 switch (filterOptions['type']) {
136 137 case "list":
137 138 case "list_optional":
138 139 case "list_status":
139 140 case "list_subprojects":
140 141 tr.find('td.values').append(
141 142 '<span style="display:none;"><select class="value" id="values_'+fieldId+'_1" name="v['+field+'][]"></select>' +
142 143 ' <span class="toggle-multiselect">&nbsp;</span></span>'
143 144 );
144 145 select = tr.find('td.values select');
145 146 if (values.length > 1) { select.attr('multiple', true); }
146 147 for (i = 0; i < filterValues.length; i++) {
147 148 var filterValue = filterValues[i];
148 149 var option = $('<option>');
149 150 if ($.isArray(filterValue)) {
150 151 option.val(filterValue[1]).text(filterValue[0]);
151 152 if ($.inArray(filterValue[1], values) > -1) {option.attr('selected', true);}
152 153 } else {
153 154 option.val(filterValue).text(filterValue);
154 155 if ($.inArray(filterValue, values) > -1) {option.attr('selected', true);}
155 156 }
156 157 select.append(option);
157 158 }
158 159 break;
159 160 case "date":
160 161 case "date_past":
161 162 tr.find('td.values').append(
162 163 '<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_1" size="10" class="value date_value" /></span>' +
163 164 ' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_2" size="10" class="value date_value" /></span>' +
164 165 ' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="3" class="value" /> '+labelDayPlural+'</span>'
165 166 );
166 167 $('#values_'+fieldId+'_1').val(values[0]).datepicker(datepickerOptions);
167 168 $('#values_'+fieldId+'_2').val(values[1]).datepicker(datepickerOptions);
168 169 $('#values_'+fieldId).val(values[0]);
169 170 break;
170 171 case "string":
171 172 case "text":
172 173 tr.find('td.values').append(
173 174 '<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="30" class="value" /></span>'
174 175 );
175 176 $('#values_'+fieldId).val(values[0]);
176 177 break;
177 178 case "relation":
178 179 tr.find('td.values').append(
179 180 '<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="6" class="value" /></span>' +
180 181 '<span style="display:none;"><select class="value" name="v['+field+'][]" id="values_'+fieldId+'_1"></select></span>'
181 182 );
182 183 $('#values_'+fieldId).val(values[0]);
183 184 select = tr.find('td.values select');
184 185 for (i = 0; i < allProjects.length; i++) {
185 186 var filterValue = allProjects[i];
186 187 var option = $('<option>');
187 188 option.val(filterValue[1]).text(filterValue[0]);
188 189 if (values[0] == filterValue[1]) { option.attr('selected', true); }
189 190 select.append(option);
190 191 }
191 192 case "integer":
192 193 case "float":
193 194 tr.find('td.values').append(
194 195 '<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_1" size="6" class="value" /></span>' +
195 196 ' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_2" size="6" class="value" /></span>'
196 197 );
197 198 $('#values_'+fieldId+'_1').val(values[0]);
198 199 $('#values_'+fieldId+'_2').val(values[1]);
199 200 break;
200 201 }
201 202 }
202 203
203 204 function toggleFilter(field) {
204 205 var fieldId = field.replace('.', '_');
205 206 if ($('#cb_' + fieldId).is(':checked')) {
206 207 $("#operators_" + fieldId).show().removeAttr('disabled');
207 208 toggleOperator(field);
208 209 } else {
209 210 $("#operators_" + fieldId).hide().attr('disabled', true);
210 211 enableValues(field, []);
211 212 }
212 213 }
213 214
214 215 function enableValues(field, indexes) {
215 216 var fieldId = field.replace('.', '_');
216 217 $('#tr_'+fieldId+' td.values .value').each(function(index) {
217 218 if ($.inArray(index, indexes) >= 0) {
218 219 $(this).removeAttr('disabled');
219 220 $(this).parents('span').first().show();
220 221 } else {
221 222 $(this).val('');
222 223 $(this).attr('disabled', true);
223 224 $(this).parents('span').first().hide();
224 225 }
225 226
226 227 if ($(this).hasClass('group')) {
227 228 $(this).addClass('open');
228 229 } else {
229 230 $(this).show();
230 231 }
231 232 });
232 233 }
233 234
234 235 function toggleOperator(field) {
235 236 var fieldId = field.replace('.', '_');
236 237 var operator = $("#operators_" + fieldId);
237 238 switch (operator.val()) {
238 239 case "!*":
239 240 case "*":
240 241 case "t":
241 242 case "ld":
242 243 case "w":
243 244 case "lw":
244 245 case "l2w":
245 246 case "m":
246 247 case "lm":
247 248 case "y":
248 249 case "o":
249 250 case "c":
250 251 enableValues(field, []);
251 252 break;
252 253 case "><":
253 254 enableValues(field, [0,1]);
254 255 break;
255 256 case "<t+":
256 257 case ">t+":
257 258 case "><t+":
258 259 case "t+":
259 260 case ">t-":
260 261 case "<t-":
261 262 case "><t-":
262 263 case "t-":
263 264 enableValues(field, [2]);
264 265 break;
265 266 case "=p":
266 267 case "=!p":
267 268 case "!p":
268 269 enableValues(field, [1]);
269 270 break;
270 271 default:
271 272 enableValues(field, [0]);
272 273 break;
273 274 }
274 275 }
275 276
276 277 function toggleMultiSelect(el) {
277 278 if (el.attr('multiple')) {
278 279 el.removeAttr('multiple');
279 280 el.attr('size', 1);
280 281 } else {
281 282 el.attr('multiple', true);
282 283 if (el.children().length > 10)
283 284 el.attr('size', 10);
284 285 else
285 286 el.attr('size', 4);
286 287 }
287 288 }
288 289
289 290 function submit_query_form(id) {
290 291 selectAllOptions("selected_columns");
291 292 $('#'+id).submit();
292 293 }
293 294
294 295 function showTab(name, url) {
295 296 $('div#content .tab-content').hide();
296 297 $('div.tabs a').removeClass('selected');
297 298 $('#tab-content-' + name).show();
298 299 $('#tab-' + name).addClass('selected');
299 300 //replaces current URL with the "href" attribute of the current link
300 301 //(only triggered if supported by browser)
301 302 if ("replaceState" in window.history) {
302 303 window.history.replaceState(null, document.title, url);
303 304 }
304 305 return false;
305 306 }
306 307
307 308 function moveTabRight(el) {
308 309 var lis = $(el).parents('div.tabs').first().find('ul').children();
309 310 var tabsWidth = 0;
310 311 var i = 0;
311 312 lis.each(function() {
312 313 if ($(this).is(':visible')) {
313 314 tabsWidth += $(this).width() + 6;
314 315 }
315 316 });
316 317 if (tabsWidth < $(el).parents('div.tabs').first().width() - 60) { return; }
317 318 while (i<lis.length && !lis.eq(i).is(':visible')) { i++; }
318 319 lis.eq(i).hide();
319 320 }
320 321
321 322 function moveTabLeft(el) {
322 323 var lis = $(el).parents('div.tabs').first().find('ul').children();
323 324 var i = 0;
324 325 while (i < lis.length && !lis.eq(i).is(':visible')) { i++; }
325 326 if (i > 0) {
326 327 lis.eq(i-1).show();
327 328 }
328 329 }
329 330
330 331 function displayTabsButtons() {
331 332 var lis;
332 333 var tabsWidth = 0;
333 334 var el;
334 335 $('div.tabs').each(function() {
335 336 el = $(this);
336 337 lis = el.find('ul').children();
337 338 lis.each(function(){
338 339 if ($(this).is(':visible')) {
339 340 tabsWidth += $(this).width() + 6;
340 341 }
341 342 });
342 343 if ((tabsWidth < el.width() - 60) && (lis.first().is(':visible'))) {
343 344 el.find('div.tabs-buttons').hide();
344 345 } else {
345 346 el.find('div.tabs-buttons').show();
346 347 }
347 348 });
348 349 }
349 350
350 351 function setPredecessorFieldsVisibility() {
351 352 var relationType = $('#relation_relation_type');
352 353 if (relationType.val() == "precedes" || relationType.val() == "follows") {
353 354 $('#predecessor_fields').show();
354 355 } else {
355 356 $('#predecessor_fields').hide();
356 357 }
357 358 }
358 359
359 360 function showModal(id, width) {
360 361 var el = $('#'+id).first();
361 362 if (el.length === 0 || el.is(':visible')) {return;}
362 363 var title = el.find('h3.title').text();
363 364 el.dialog({
364 365 width: width,
365 366 modal: true,
366 367 resizable: false,
367 368 dialogClass: 'modal',
368 369 title: title
369 370 });
370 371 el.find("input[type=text], input[type=submit]").first().focus();
371 372 }
372 373
373 374 function hideModal(el) {
374 375 var modal;
375 376 if (el) {
376 377 modal = $(el).parents('.ui-dialog-content');
377 378 } else {
378 379 modal = $('#ajax-modal');
379 380 }
380 381 modal.dialog("close");
381 382 }
382 383
383 384 function submitPreview(url, form, target) {
384 385 $.ajax({
385 386 url: url,
386 387 type: 'post',
387 388 data: $('#'+form).serialize(),
388 389 success: function(data){
389 390 $('#'+target).html(data);
390 391 }
391 392 });
392 393 }
393 394
394 395 function collapseScmEntry(id) {
395 396 $('.'+id).each(function() {
396 397 if ($(this).hasClass('open')) {
397 398 collapseScmEntry($(this).attr('id'));
398 399 }
399 400 $(this).hide();
400 401 });
401 402 $('#'+id).removeClass('open');
402 403 }
403 404
404 405 function expandScmEntry(id) {
405 406 $('.'+id).each(function() {
406 407 $(this).show();
407 408 if ($(this).hasClass('loaded') && !$(this).hasClass('collapsed')) {
408 409 expandScmEntry($(this).attr('id'));
409 410 }
410 411 });
411 412 $('#'+id).addClass('open');
412 413 }
413 414
414 415 function scmEntryClick(id, url) {
415 416 el = $('#'+id);
416 417 if (el.hasClass('open')) {
417 418 collapseScmEntry(id);
418 419 el.addClass('collapsed');
419 420 return false;
420 421 } else if (el.hasClass('loaded')) {
421 422 expandScmEntry(id);
422 423 el.removeClass('collapsed');
423 424 return false;
424 425 }
425 426 if (el.hasClass('loading')) {
426 427 return false;
427 428 }
428 429 el.addClass('loading');
429 430 $.ajax({
430 431 url: url,
431 432 success: function(data) {
432 433 el.after(data);
433 434 el.addClass('open').addClass('loaded').removeClass('loading');
434 435 }
435 436 });
436 437 return true;
437 438 }
438 439
439 440 function randomKey(size) {
440 441 var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
441 442 var key = '';
442 443 for (var i = 0; i < size; i++) {
443 444 key += chars.charAt(Math.floor(Math.random() * chars.length));
444 445 }
445 446 return key;
446 447 }
447 448
448 449 function updateIssueFrom(url) {
449 450 $('#all_attributes input, #all_attributes textarea, #all_attributes select').each(function(){
450 451 $(this).data('valuebeforeupdate', $(this).val());
451 452 });
452 453 $.ajax({
453 454 url: url,
454 455 type: 'post',
455 456 data: $('#issue-form').serialize()
456 457 });
457 458 }
458 459
459 460 function replaceIssueFormWith(html){
460 461 var replacement = $(html);
461 462 $('#all_attributes input, #all_attributes textarea, #all_attributes select').each(function(){
462 463 var object_id = $(this).attr('id');
463 464 if (object_id && $(this).data('valuebeforeupdate')!=$(this).val()) {
464 465 replacement.find('#'+object_id).val($(this).val());
465 466 }
466 467 });
467 468 $('#all_attributes').empty();
468 469 $('#all_attributes').prepend(replacement);
469 470 }
470 471
471 472 function updateBulkEditFrom(url) {
472 473 $.ajax({
473 474 url: url,
474 475 type: 'post',
475 476 data: $('#bulk_edit_form').serialize()
476 477 });
477 478 }
478 479
479 480 function observeAutocompleteField(fieldId, url, options) {
480 481 $(document).ready(function() {
481 482 $('#'+fieldId).autocomplete($.extend({
482 483 source: url,
483 484 minLength: 2,
484 485 search: function(){$('#'+fieldId).addClass('ajax-loading');},
485 486 response: function(){$('#'+fieldId).removeClass('ajax-loading');}
486 487 }, options));
487 488 $('#'+fieldId).addClass('autocomplete');
488 489 });
489 490 }
490 491
491 492 function observeSearchfield(fieldId, targetId, url) {
492 493 $('#'+fieldId).each(function() {
493 494 var $this = $(this);
494 495 $this.addClass('autocomplete');
495 496 $this.attr('data-value-was', $this.val());
496 497 var check = function() {
497 498 var val = $this.val();
498 499 if ($this.attr('data-value-was') != val){
499 500 $this.attr('data-value-was', val);
500 501 $.ajax({
501 502 url: url,
502 503 type: 'get',
503 504 data: {q: $this.val()},
504 505 success: function(data){ if(targetId) $('#'+targetId).html(data); },
505 506 beforeSend: function(){ $this.addClass('ajax-loading'); },
506 507 complete: function(){ $this.removeClass('ajax-loading'); }
507 508 });
508 509 }
509 510 };
510 511 var reset = function() {
511 512 if (timer) {
512 513 clearInterval(timer);
513 514 timer = setInterval(check, 300);
514 515 }
515 516 };
516 517 var timer = setInterval(check, 300);
517 518 $this.bind('keyup click mousemove', reset);
518 519 });
519 520 }
520 521
521 522 function initMyPageSortable(list, url) {
522 523 $('#list-'+list).sortable({
523 524 connectWith: '.block-receiver',
524 525 tolerance: 'pointer',
525 526 update: function(){
526 527 $.ajax({
527 528 url: url,
528 529 type: 'post',
529 530 data: {'blocks': $.map($('#list-'+list).children(), function(el){return $(el).attr('id');})}
530 531 });
531 532 }
532 533 });
533 534 $("#list-top, #list-left, #list-right").disableSelection();
534 535 }
535 536
536 537 var warnLeavingUnsavedMessage;
537 538 function warnLeavingUnsaved(message) {
538 539 warnLeavingUnsavedMessage = message;
539 540 $('form').live('submit', function(){
540 541 $('textarea').removeData('changed');
541 542 });
542 543 $('textarea').live('change', function(){
543 544 $(this).data('changed', 'changed');
544 545 });
545 546 window.onbeforeunload = function(){
546 547 var warn = false;
547 548 $('textarea').blur().each(function(){
548 549 if ($(this).data('changed')) {
549 550 warn = true;
550 551 }
551 552 });
552 553 if (warn) {return warnLeavingUnsavedMessage;}
553 554 };
554 555 }
555 556
556 557 function setupAjaxIndicator() {
557 558 $('#ajax-indicator').bind('ajaxSend', function(event, xhr, settings) {
558 559 if ($('.ajax-loading').length === 0 && settings.contentType != 'application/octet-stream') {
559 560 $('#ajax-indicator').show();
560 561 }
561 562 });
562 563 $('#ajax-indicator').bind('ajaxStop', function() {
563 564 $('#ajax-indicator').hide();
564 565 });
565 566 }
566 567
567 568 function hideOnLoad() {
568 569 $('.hol').hide();
569 570 }
570 571
571 572 function addFormObserversForDoubleSubmit() {
572 573 $('form[method=post]').each(function() {
573 574 if (!$(this).hasClass('multiple-submit')) {
574 575 $(this).submit(function(form_submission) {
575 576 if ($(form_submission.target).attr('data-submitted')) {
576 577 form_submission.preventDefault();
577 578 } else {
578 579 $(form_submission.target).attr('data-submitted', true);
579 580 }
580 581 });
581 582 }
582 583 });
583 584 }
584 585
585 586 function blockEventPropagation(event) {
586 587 event.stopPropagation();
587 588 event.preventDefault();
588 589 }
589 590
590 591 $(document).ready(setupAjaxIndicator);
591 592 $(document).ready(hideOnLoad);
592 593 $(document).ready(addFormObserversForDoubleSubmit);
General Comments 0
You need to be logged in to leave comments. Login now