annotate .svn/pristine/3e/3ed8c1b8169d56ca657416dab8458700070dce49.svn-base @ 1295:622f24f53b42 redmine-2.3

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