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