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