Chris@1115
|
1 /* Redmine - project management software
|
Chris@1295
|
2 Copyright (C) 2006-2013 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@1295
|
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@1295
|
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@1295
|
134 if (operators[i] == operator) { option.attr('selected', true); }
|
Chris@1115
|
135 select.append(option);
|
Chris@1115
|
136 }
|
Chris@1295
|
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@1295
|
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@1295
|
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@1295
|
245 case "ld":
|
Chris@1115
|
246 case "w":
|
Chris@1295
|
247 case "lw":
|
Chris@1295
|
248 case "l2w":
|
Chris@1295
|
249 case "m":
|
Chris@1295
|
250 case "lm":
|
Chris@1295
|
251 case "y":
|
Chris@1115
|
252 case "o":
|
Chris@1115
|
253 case "c":
|
Chris@1115
|
254 enableValues(field, []);
|
Chris@1115
|
255 break;
|
Chris@1115
|
256 case "><":
|
Chris@1115
|
257 enableValues(field, [0,1]);
|
Chris@1115
|
258 break;
|
Chris@1115
|
259 case "<t+":
|
Chris@1115
|
260 case ">t+":
|
Chris@1115
|
261 case "><t+":
|
Chris@1115
|
262 case "t+":
|
Chris@1115
|
263 case ">t-":
|
Chris@1115
|
264 case "<t-":
|
Chris@1115
|
265 case "><t-":
|
Chris@1115
|
266 case "t-":
|
Chris@1115
|
267 enableValues(field, [2]);
|
Chris@1115
|
268 break;
|
Chris@1115
|
269 case "=p":
|
Chris@1115
|
270 case "=!p":
|
Chris@1115
|
271 case "!p":
|
Chris@1115
|
272 enableValues(field, [1]);
|
Chris@1115
|
273 break;
|
Chris@1115
|
274 default:
|
Chris@1115
|
275 enableValues(field, [0]);
|
Chris@1115
|
276 break;
|
Chris@1115
|
277 }
|
Chris@1115
|
278 }
|
Chris@1115
|
279
|
Chris@1115
|
280 function toggleMultiSelect(el) {
|
Chris@1115
|
281 if (el.attr('multiple')) {
|
Chris@1115
|
282 el.removeAttr('multiple');
|
Chris@1115
|
283 } else {
|
Chris@1115
|
284 el.attr('multiple', true);
|
Chris@1115
|
285 }
|
Chris@1115
|
286 }
|
Chris@1115
|
287
|
Chris@1115
|
288 function submit_query_form(id) {
|
Chris@1115
|
289 selectAllOptions("selected_columns");
|
Chris@1115
|
290 $('#'+id).submit();
|
Chris@245
|
291 }
|
Chris@245
|
292
|
Chris@0
|
293 function showTab(name) {
|
Chris@1115
|
294 $('div#content .tab-content').hide();
|
Chris@1115
|
295 $('div.tabs a').removeClass('selected');
|
Chris@1115
|
296 $('#tab-content-' + name).show();
|
Chris@1115
|
297 $('#tab-' + name).addClass('selected');
|
Chris@1115
|
298 return false;
|
Chris@0
|
299 }
|
Chris@0
|
300
|
Chris@0
|
301 function moveTabRight(el) {
|
Chris@1115
|
302 var lis = $(el).parents('div.tabs').first().find('ul').children();
|
Chris@1115
|
303 var tabsWidth = 0;
|
Chris@1115
|
304 var i = 0;
|
Chris@1115
|
305 lis.each(function(){
|
Chris@1115
|
306 if ($(this).is(':visible')) {
|
Chris@1115
|
307 tabsWidth += $(this).width() + 6;
|
Chris@1115
|
308 }
|
Chris@1115
|
309 });
|
Chris@1115
|
310 if (tabsWidth < $(el).parents('div.tabs').first().width() - 60) { return; }
|
Chris@1115
|
311 while (i<lis.length && !lis.eq(i).is(':visible')) { i++; }
|
Chris@1115
|
312 lis.eq(i).hide();
|
Chris@0
|
313 }
|
Chris@0
|
314
|
Chris@0
|
315 function moveTabLeft(el) {
|
Chris@1115
|
316 var lis = $(el).parents('div.tabs').first().find('ul').children();
|
Chris@1115
|
317 var i = 0;
|
Chris@1115
|
318 while (i<lis.length && !lis.eq(i).is(':visible')) { i++; }
|
Chris@1115
|
319 if (i>0) {
|
Chris@1115
|
320 lis.eq(i-1).show();
|
Chris@1115
|
321 }
|
Chris@0
|
322 }
|
Chris@0
|
323
|
Chris@0
|
324 function displayTabsButtons() {
|
Chris@1115
|
325 var lis;
|
Chris@1115
|
326 var tabsWidth = 0;
|
Chris@1115
|
327 var el;
|
Chris@1115
|
328 $('div.tabs').each(function() {
|
Chris@1115
|
329 el = $(this);
|
Chris@1115
|
330 lis = el.find('ul').children();
|
Chris@1115
|
331 lis.each(function(){
|
Chris@1115
|
332 if ($(this).is(':visible')) {
|
Chris@1115
|
333 tabsWidth += $(this).width() + 6;
|
Chris@1115
|
334 }
|
Chris@1115
|
335 });
|
Chris@1115
|
336 if ((tabsWidth < el.width() - 60) && (lis.first().is(':visible'))) {
|
Chris@1115
|
337 el.find('div.tabs-buttons').hide();
|
Chris@1115
|
338 } else {
|
Chris@1115
|
339 el.find('div.tabs-buttons').show();
|
Chris@1115
|
340 }
|
Chris@1115
|
341 });
|
Chris@0
|
342 }
|
Chris@0
|
343
|
Chris@0
|
344 function setPredecessorFieldsVisibility() {
|
Chris@1115
|
345 var relationType = $('#relation_relation_type');
|
Chris@1115
|
346 if (relationType.val() == "precedes" || relationType.val() == "follows") {
|
Chris@1115
|
347 $('#predecessor_fields').show();
|
Chris@1115
|
348 } else {
|
Chris@1115
|
349 $('#predecessor_fields').hide();
|
Chris@1115
|
350 }
|
Chris@0
|
351 }
|
Chris@0
|
352
|
Chris@909
|
353 function showModal(id, width) {
|
Chris@1115
|
354 var el = $('#'+id).first();
|
Chris@1295
|
355 if (el.length === 0 || el.is(':visible')) {return;}
|
Chris@1115
|
356 var title = el.find('h3.title').text();
|
Chris@1115
|
357 el.dialog({
|
Chris@1115
|
358 width: width,
|
Chris@1115
|
359 modal: true,
|
Chris@1115
|
360 resizable: false,
|
Chris@1115
|
361 dialogClass: 'modal',
|
Chris@1115
|
362 title: title
|
Chris@1115
|
363 });
|
Chris@1115
|
364 el.find("input[type=text], input[type=submit]").first().focus();
|
Chris@909
|
365 }
|
Chris@909
|
366
|
Chris@909
|
367 function hideModal(el) {
|
Chris@1115
|
368 var modal;
|
Chris@1115
|
369 if (el) {
|
Chris@1115
|
370 modal = $(el).parents('.ui-dialog-content');
|
Chris@1115
|
371 } else {
|
Chris@1115
|
372 modal = $('#ajax-modal');
|
Chris@909
|
373 }
|
Chris@1115
|
374 modal.dialog("close");
|
Chris@1115
|
375 }
|
Chris@1115
|
376
|
Chris@1115
|
377 function submitPreview(url, form, target) {
|
Chris@1115
|
378 $.ajax({
|
Chris@1115
|
379 url: url,
|
Chris@1115
|
380 type: 'post',
|
Chris@1115
|
381 data: $('#'+form).serialize(),
|
Chris@1115
|
382 success: function(data){
|
Chris@1115
|
383 $('#'+target).html(data);
|
Chris@1115
|
384 }
|
Chris@1115
|
385 });
|
Chris@909
|
386 }
|
Chris@909
|
387
|
Chris@0
|
388 function collapseScmEntry(id) {
|
Chris@1115
|
389 $('.'+id).each(function() {
|
Chris@1115
|
390 if ($(this).hasClass('open')) {
|
Chris@1115
|
391 collapseScmEntry($(this).attr('id'));
|
Chris@0
|
392 }
|
Chris@1115
|
393 $(this).hide();
|
Chris@1115
|
394 });
|
Chris@1115
|
395 $('#'+id).removeClass('open');
|
Chris@0
|
396 }
|
Chris@0
|
397
|
Chris@0
|
398 function expandScmEntry(id) {
|
Chris@1115
|
399 $('.'+id).each(function() {
|
Chris@1115
|
400 $(this).show();
|
Chris@1115
|
401 if ($(this).hasClass('loaded') && !$(this).hasClass('collapsed')) {
|
Chris@1115
|
402 expandScmEntry($(this).attr('id'));
|
Chris@0
|
403 }
|
Chris@1115
|
404 });
|
Chris@1115
|
405 $('#'+id).addClass('open');
|
Chris@0
|
406 }
|
Chris@0
|
407
|
Chris@1115
|
408 function scmEntryClick(id, url) {
|
Chris@1115
|
409 el = $('#'+id);
|
Chris@1115
|
410 if (el.hasClass('open')) {
|
Chris@0
|
411 collapseScmEntry(id);
|
Chris@1115
|
412 el.addClass('collapsed');
|
Chris@0
|
413 return false;
|
Chris@1115
|
414 } else if (el.hasClass('loaded')) {
|
Chris@0
|
415 expandScmEntry(id);
|
Chris@1115
|
416 el.removeClass('collapsed');
|
Chris@0
|
417 return false;
|
Chris@0
|
418 }
|
Chris@1115
|
419 if (el.hasClass('loading')) {
|
Chris@0
|
420 return false;
|
Chris@0
|
421 }
|
Chris@1115
|
422 el.addClass('loading');
|
Chris@1115
|
423 $.ajax({
|
Chris@1115
|
424 url: url,
|
Chris@1115
|
425 success: function(data){
|
Chris@1115
|
426 el.after(data);
|
Chris@1115
|
427 el.addClass('open').addClass('loaded').removeClass('loading');
|
Chris@1115
|
428 }
|
Chris@1115
|
429 });
|
Chris@0
|
430 return true;
|
Chris@0
|
431 }
|
Chris@0
|
432
|
Chris@1115
|
433 function randomKey(size) {
|
Chris@1115
|
434 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
|
435 var key = '';
|
Chris@1115
|
436 for (i = 0; i < size; i++) {
|
Chris@1115
|
437 key += chars[Math.floor(Math.random() * chars.length)];
|
Chris@1115
|
438 }
|
Chris@1115
|
439 return key;
|
Chris@0
|
440 }
|
Chris@0
|
441
|
Chris@1115
|
442 // Can't use Rails' remote select because we need the form data
|
Chris@1115
|
443 function updateIssueFrom(url) {
|
Chris@1115
|
444 $.ajax({
|
Chris@1115
|
445 url: url,
|
Chris@1115
|
446 type: 'post',
|
Chris@1115
|
447 data: $('#issue-form').serialize()
|
Chris@1115
|
448 });
|
Chris@0
|
449 }
|
Chris@0
|
450
|
Chris@1115
|
451 function updateBulkEditFrom(url) {
|
Chris@1115
|
452 $.ajax({
|
Chris@1115
|
453 url: url,
|
Chris@1115
|
454 type: 'post',
|
Chris@1115
|
455 data: $('#bulk_edit_form').serialize()
|
Chris@1115
|
456 });
|
Chris@0
|
457 }
|
Chris@0
|
458
|
Chris@1295
|
459 function observeAutocompleteField(fieldId, url, options) {
|
Chris@1115
|
460 $(document).ready(function() {
|
Chris@1295
|
461 $('#'+fieldId).autocomplete($.extend({
|
Chris@1115
|
462 source: url,
|
Chris@1295
|
463 minLength: 2,
|
Chris@1295
|
464 search: function(){$('#'+fieldId).addClass('ajax-loading');},
|
Chris@1295
|
465 response: function(){$('#'+fieldId).removeClass('ajax-loading');}
|
Chris@1295
|
466 }, options));
|
Chris@1295
|
467 $('#'+fieldId).addClass('autocomplete');
|
Chris@1115
|
468 });
|
Chris@119
|
469 }
|
Chris@119
|
470
|
Chris@1115
|
471 function observeSearchfield(fieldId, targetId, url) {
|
Chris@1115
|
472 $('#'+fieldId).each(function() {
|
Chris@1115
|
473 var $this = $(this);
|
Chris@1295
|
474 $this.addClass('autocomplete');
|
Chris@1115
|
475 $this.attr('data-value-was', $this.val());
|
Chris@1115
|
476 var check = function() {
|
Chris@1115
|
477 var val = $this.val();
|
Chris@1115
|
478 if ($this.attr('data-value-was') != val){
|
Chris@1115
|
479 $this.attr('data-value-was', val);
|
Chris@1115
|
480 $.ajax({
|
Chris@1115
|
481 url: url,
|
Chris@1115
|
482 type: 'get',
|
Chris@1115
|
483 data: {q: $this.val()},
|
Chris@1295
|
484 success: function(data){ if(targetId) $('#'+targetId).html(data); },
|
Chris@1115
|
485 beforeSend: function(){ $this.addClass('ajax-loading'); },
|
Chris@1115
|
486 complete: function(){ $this.removeClass('ajax-loading'); }
|
Chris@1115
|
487 });
|
Chris@1115
|
488 }
|
Chris@1115
|
489 };
|
Chris@1115
|
490 var reset = function() {
|
Chris@1115
|
491 if (timer) {
|
Chris@1115
|
492 clearInterval(timer);
|
Chris@1115
|
493 timer = setInterval(check, 300);
|
Chris@1115
|
494 }
|
Chris@1115
|
495 };
|
Chris@1115
|
496 var timer = setInterval(check, 300);
|
Chris@1115
|
497 $this.bind('keyup click mousemove', reset);
|
Chris@1115
|
498 });
|
Chris@119
|
499 }
|
Chris@119
|
500
|
Chris@119
|
501 function observeProjectModules() {
|
Chris@119
|
502 var f = function() {
|
Chris@119
|
503 /* Hides trackers and issues custom fields on the new project form when issue_tracking module is disabled */
|
Chris@1115
|
504 if ($('#project_enabled_module_names_issue_tracking').attr('checked')) {
|
Chris@1115
|
505 $('#project_trackers').show();
|
Chris@1115
|
506 }else{
|
Chris@1115
|
507 $('#project_trackers').hide();
|
Chris@1115
|
508 }
|
Chris@119
|
509 };
|
Chris@1115
|
510
|
Chris@1115
|
511 $(window).load(f);
|
Chris@1115
|
512 $('#project_enabled_module_names_issue_tracking').change(f);
|
Chris@119
|
513 }
|
Chris@119
|
514
|
Chris@1115
|
515 function initMyPageSortable(list, url) {
|
Chris@1115
|
516 $('#list-'+list).sortable({
|
Chris@1115
|
517 connectWith: '.block-receiver',
|
Chris@1115
|
518 tolerance: 'pointer',
|
Chris@1115
|
519 update: function(){
|
Chris@1115
|
520 $.ajax({
|
Chris@1115
|
521 url: url,
|
Chris@1115
|
522 type: 'post',
|
Chris@1115
|
523 data: {'blocks': $.map($('#list-'+list).children(), function(el){return $(el).attr('id');})}
|
Chris@1115
|
524 });
|
Chris@1115
|
525 }
|
Chris@1115
|
526 });
|
Chris@1115
|
527 $("#list-top, #list-left, #list-right").disableSelection();
|
Chris@1115
|
528 }
|
Chris@245
|
529
|
Chris@1115
|
530 var warnLeavingUnsavedMessage;
|
Chris@1115
|
531 function warnLeavingUnsaved(message) {
|
Chris@1115
|
532 warnLeavingUnsavedMessage = message;
|
Chris@119
|
533
|
Chris@1115
|
534 $('form').submit(function(){
|
Chris@1115
|
535 $('textarea').removeData('changed');
|
Chris@1115
|
536 });
|
Chris@1115
|
537 $('textarea').change(function(){
|
Chris@1115
|
538 $(this).data('changed', 'changed');
|
Chris@1115
|
539 });
|
Chris@1115
|
540 window.onbeforeunload = function(){
|
Chris@1115
|
541 var warn = false;
|
Chris@1115
|
542 $('textarea').blur().each(function(){
|
Chris@1115
|
543 if ($(this).data('changed')) {
|
Chris@1115
|
544 warn = true;
|
Chris@1115
|
545 }
|
Chris@1115
|
546 });
|
Chris@1115
|
547 if (warn) {return warnLeavingUnsavedMessage;}
|
Chris@1115
|
548 };
|
Chris@1295
|
549 }
|
Chris@441
|
550
|
Chris@1295
|
551 function setupAjaxIndicator() {
|
Chris@1295
|
552
|
Chris@1295
|
553 $('#ajax-indicator').bind('ajaxSend', function(event, xhr, settings) {
|
Chris@1295
|
554
|
Chris@1295
|
555 if ($('.ajax-loading').length === 0 && settings.contentType != 'application/octet-stream') {
|
Chris@1115
|
556 $('#ajax-indicator').show();
|
Chris@0
|
557 }
|
Chris@1115
|
558 });
|
Chris@1295
|
559
|
Chris@1295
|
560 $('#ajax-indicator').bind('ajaxStop', function() {
|
Chris@1115
|
561 $('#ajax-indicator').hide();
|
Chris@1115
|
562 });
|
Chris@1295
|
563 }
|
Chris@0
|
564
|
Chris@0
|
565 function hideOnLoad() {
|
Chris@1115
|
566 $('.hol').hide();
|
Chris@0
|
567 }
|
Chris@0
|
568
|
Chris@1115
|
569 function addFormObserversForDoubleSubmit() {
|
Chris@1115
|
570 $('form[method=post]').each(function() {
|
Chris@1115
|
571 if (!$(this).hasClass('multiple-submit')) {
|
Chris@1115
|
572 $(this).submit(function(form_submission) {
|
Chris@1115
|
573 if ($(form_submission.target).attr('data-submitted')) {
|
Chris@1115
|
574 form_submission.preventDefault();
|
Chris@1115
|
575 } else {
|
Chris@1115
|
576 $(form_submission.target).attr('data-submitted', true);
|
Chris@1115
|
577 }
|
Chris@1115
|
578 });
|
Chris@1115
|
579 }
|
Chris@1115
|
580 });
|
Chris@1115
|
581 }
|
Chris@1115
|
582
|
Chris@1295
|
583 function blockEventPropagation(event) {
|
Chris@1295
|
584 event.stopPropagation();
|
Chris@1295
|
585 event.preventDefault();
|
Chris@1295
|
586 }
|
Chris@1295
|
587
|
Chris@1295
|
588 $(document).ready(setupAjaxIndicator);
|
Chris@1115
|
589 $(document).ready(hideOnLoad);
|
Chris@1115
|
590 $(document).ready(addFormObserversForDoubleSubmit);
|