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