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