##// END OF EJS Templates
Moved javascript filters functions to application.js....
Jean-Philippe Lang -
r8578:858bd8dc4021
parent child
Show More
@@ -1,155 +1,53
1 <script type="text/javascript">
2 //<![CDATA[
3 function add_filter() {
4 select = $('add_filter_select');
5 field = select.value
6 Element.show('tr_' + field);
7 check_box = $('cb_' + field);
8 check_box.checked = true;
9 toggle_filter(field);
10 select.selectedIndex = 0;
11
12 for (i=0; i<select.options.length; i++) {
13 if (select.options[i].value == field) {
14 select.options[i].disabled = true;
15 }
16 }
17 }
18
19 function toggle_filter(field) {
20 check_box = $('cb_' + field);
21 if (check_box.checked) {
22 Element.show("operators_" + field);
23 Form.Element.enable("operators_" + field);
24 toggle_operator(field);
25 } else {
26 Element.hide("operators_" + field);
27 Form.Element.disable("operators_" + field);
28 enableValues(field, []);
29 }
30 }
31
32 function enableValues(field, indexes) {
33 var f = $$(".values_" + field);
34 for(var i=0;i<f.length;i++) {
35 if (indexes.include(i)) {
36 Form.Element.enable(f[i]);
37 f[i].up('span').show();
38 } else {
39 f[i].value = '';
40 Form.Element.disable(f[i]);
41 f[i].up('span').hide();
42 }
43 }
44 if (indexes.length > 0) {
45 Element.show("div_values_" + field);
46 } else {
47 Element.hide("div_values_" + field);
48 }
49 }
50
51 function toggle_operator(field) {
52 operator = $("operators_" + field);
53 switch (operator.value) {
54 case "!*":
55 case "*":
56 case "t":
57 case "w":
58 case "o":
59 case "c":
60 enableValues(field, []);
61 break;
62 case "><":
63 enableValues(field, [0,1]);
64 break;
65 case "<t+":
66 case ">t+":
67 case "t+":
68 case ">t-":
69 case "<t-":
70 case "t-":
71 enableValues(field, [2]);
72 break;
73 default:
74 enableValues(field, [0]);
75 break;
76 }
77 }
78
79 function toggle_multi_select(el) {
80 var select = $(el);
81 if (select.multiple == true) {
82 select.multiple = false;
83 } else {
84 select.multiple = true;
85 }
86 }
87
88 function submit_query_form(id) {
89 selectAllOptions("selected_columns");
90 $(id).submit();
91 }
92
93 function apply_filters_observer() {
94 $$("#query_form input[type=text]").invoke("observe", "keypress", function(e){
95 if(e.keyCode == Event.KEY_RETURN) {
96 submit_query_form("query_form");
97 }
98 });
99 }
100 Event.observe(document,"dom:loaded", apply_filters_observer);
101 //]]>
102 </script>
103
104 <table width="100%">
1 <table width="100%">
105 <tr>
2 <tr>
106 <td>
3 <td>
107 <table>
4 <table>
108 <% query.available_filters.sort{|a,b| a[1][:order]<=>b[1][:order]}.each do |filter| %>
5 <% query.available_filters.sort{|a,b| a[1][:order]<=>b[1][:order]}.each do |filter| %>
109 <% field = filter[0]
6 <% field = filter[0]
110 options = filter[1] %>
7 options = filter[1] %>
111 <tr <%= 'style="display:none;"' unless query.has_filter?(field) %> id="tr_<%= field %>" class="filter">
8 <tr <%= 'style="display:none;"' unless query.has_filter?(field) %> id="tr_<%= field %>" class="filter">
112 <td class="field">
9 <td class="field">
113 <%= check_box_tag 'f[]', field, query.has_filter?(field), :onclick => "toggle_filter('#{field}');", :id => "cb_#{field}" %>
10 <%= check_box_tag 'f[]', field, query.has_filter?(field), :onclick => "toggle_filter('#{field}');", :id => "cb_#{field}" %>
114 <label for="cb_<%= field %>"><%= filter[1][:name] || l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) %></label>
11 <label for="cb_<%= field %>"><%= filter[1][:name] || l(("field_"+field.to_s.gsub(/\_id$/, "")).to_sym) %></label>
115 </td>
12 </td>
116 <td class="operator">
13 <td class="operator">
117 <%= label_tag "operators_#{field}", l(:description_filter), :class => "hidden-for-sighted" %>
14 <%= label_tag "operators_#{field}", l(:description_filter), :class => "hidden-for-sighted" %>
118 <%= select_tag "op[#{field}]", options_for_select(operators_for_select(options[:type]),
15 <%= select_tag "op[#{field}]", options_for_select(operators_for_select(options[:type]),
119 query.operator_for(field)), :id => "operators_#{field}",
16 query.operator_for(field)), :id => "operators_#{field}",
120 :onchange => "toggle_operator('#{field}');" %>
17 :onchange => "toggle_operator('#{field}');" %>
121 </td>
18 </td>
122 <td class="values">
19 <td class="values">
123 <div id="div_values_<%= field %>" style="display:none;">
20 <div id="div_values_<%= field %>" style="display:none;">
124 <% case options[:type]
21 <% case options[:type]
125 when :list, :list_optional, :list_status, :list_subprojects %>
22 when :list, :list_optional, :list_status, :list_subprojects %>
126 <span class="span_values_<%= field %>">
23 <span class="span_values_<%= field %>">
127 <%= select_tag "v[#{field}][]", options_for_select(options[:values], query.values_for(field)), :class => "values_#{field}", :id => "values_#{field}_1", :multiple => (query.values_for(field) && query.values_for(field).length > 1) %>
24 <%= select_tag "v[#{field}][]", options_for_select(options[:values], query.values_for(field)), :class => "values_#{field}", :id => "values_#{field}_1", :multiple => (query.values_for(field) && query.values_for(field).length > 1) %>
128 <%= link_to_function image_tag('bullet_toggle_plus.png'), "toggle_multi_select('values_#{field}_1');" %>
25 <%= link_to_function image_tag('bullet_toggle_plus.png'), "toggle_multi_select('values_#{field}_1');" %>
129 </span>
26 </span>
130 <% when :date, :date_past %>
27 <% when :date, :date_past %>
131 <span class="span_values_<%= field %>"><%= text_field_tag "v[#{field}][]", query.value_for(field), :size => 10, :class => "values_#{field}", :id => "values_#{field}_1" %> <%= calendar_for "values_#{field}_1" %></span>
28 <span class="span_values_<%= field %>"><%= text_field_tag "v[#{field}][]", query.value_for(field), :size => 10, :class => "values_#{field}", :id => "values_#{field}_1" %> <%= calendar_for "values_#{field}_1" %></span>
132 <span class="span_values_<%= field %>"><%= text_field_tag "v[#{field}][]", query.value_for(field, 1), :size => 10, :class => "values_#{field}", :id => "values_#{field}_2" %> <%= calendar_for "values_#{field}_2" %></span>
29 <span class="span_values_<%= field %>"><%= text_field_tag "v[#{field}][]", query.value_for(field, 1), :size => 10, :class => "values_#{field}", :id => "values_#{field}_2" %> <%= calendar_for "values_#{field}_2" %></span>
133 <span class="span_values_<%= field %>"><%= text_field_tag "v[#{field}][]", query.value_for(field), :size => 3, :class => "values_#{field}" %> <%= l(:label_day_plural) %></span>
30 <span class="span_values_<%= field %>"><%= text_field_tag "v[#{field}][]", query.value_for(field), :size => 3, :class => "values_#{field}" %> <%= l(:label_day_plural) %></span>
134 <% when :string, :text %>
31 <% when :string, :text %>
135 <span class="span_values_<%= field %>"><%= text_field_tag "v[#{field}][]", query.value_for(field), :class => "values_#{field}", :id => "values_#{field}", :size => 30 %></span>
32 <span class="span_values_<%= field %>"><%= text_field_tag "v[#{field}][]", query.value_for(field), :class => "values_#{field}", :id => "values_#{field}", :size => 30 %></span>
136 <% when :integer, :float %>
33 <% when :integer, :float %>
137 <span class="span_values_<%= field %>"><%= text_field_tag "v[#{field}][]", query.value_for(field), :class => "values_#{field}", :id => "values_#{field}_1", :size => 6 %></span>
34 <span class="span_values_<%= field %>"><%= text_field_tag "v[#{field}][]", query.value_for(field), :class => "values_#{field}", :id => "values_#{field}_1", :size => 6 %></span>
138 <span class="span_values_<%= field %>"><%= text_field_tag "v[#{field}][]", query.value_for(field, 1), :class => "values_#{field}", :id => "values_#{field}_2", :size => 6 %></span>
35 <span class="span_values_<%= field %>"><%= text_field_tag "v[#{field}][]", query.value_for(field, 1), :class => "values_#{field}", :id => "values_#{field}_2", :size => 6 %></span>
139 <% end %>
36 <% end %>
140 </div>
37 </div>
141 <script type="text/javascript">toggle_filter('<%= field %>');</script>
38 <script type="text/javascript">toggle_filter('<%= field %>');</script>
142 </td>
39 </td>
143 </tr>
40 </tr>
144 <% end %>
41 <% end %>
145 </table>
42 </table>
146 </td>
43 </td>
147 <td class="add-filter">
44 <td class="add-filter">
148 <%= label_tag('add_filter_select', l(:label_filter_add)) %>
45 <%= label_tag('add_filter_select', l(:label_filter_add)) %>
149 <%= select_tag 'add_filter_select', options_for_select([["",""]] + query.available_filters.sort{|a,b| a[1][:order]<=>b[1][:order]}.collect{|field| [ field[1][:name] || l(("field_"+field[0].to_s.gsub(/_id$/, "")).to_sym), field[0]] unless query.has_filter?(field[0])}.compact),
46 <%= select_tag 'add_filter_select', options_for_select([["",""]] + query.available_filters.sort{|a,b| a[1][:order]<=>b[1][:order]}.collect{|field| [ field[1][:name] || l(("field_"+field[0].to_s.gsub(/_id$/, "")).to_sym), field[0]] unless query.has_filter?(field[0])}.compact),
150 :onchange => "add_filter();",
47 :onchange => "add_filter();",
151 :name => nil %>
48 :name => nil %>
152 </td>
49 </td>
153 </tr>
50 </tr>
154 </table>
51 </table>
155 <%= hidden_field_tag 'f[]', '' %>
52 <%= hidden_field_tag 'f[]', '' %>
53 <%= javascript_tag 'Event.observe(window,"load",apply_filters_observer);' %>
@@ -1,419 +1,517
1 /* redMine - project management software
1 /* redMine - project management software
2 Copyright (C) 2006-2008 Jean-Philippe Lang */
2 Copyright (C) 2006-2008 Jean-Philippe Lang */
3
3
4 function checkAll (id, checked) {
4 function checkAll (id, checked) {
5 var els = Element.descendants(id);
5 var els = Element.descendants(id);
6 for (var i = 0; i < els.length; i++) {
6 for (var i = 0; i < els.length; i++) {
7 if (els[i].disabled==false) {
7 if (els[i].disabled==false) {
8 els[i].checked = checked;
8 els[i].checked = checked;
9 }
9 }
10 }
10 }
11 }
11 }
12
12
13 function toggleCheckboxesBySelector(selector) {
13 function toggleCheckboxesBySelector(selector) {
14 boxes = $$(selector);
14 boxes = $$(selector);
15 var all_checked = true;
15 var all_checked = true;
16 for (i = 0; i < boxes.length; i++) { if (boxes[i].checked == false) { all_checked = false; } }
16 for (i = 0; i < boxes.length; i++) { if (boxes[i].checked == false) { all_checked = false; } }
17 for (i = 0; i < boxes.length; i++) { boxes[i].checked = !all_checked; }
17 for (i = 0; i < boxes.length; i++) { boxes[i].checked = !all_checked; }
18 }
18 }
19
19
20 function setCheckboxesBySelector(checked, selector) {
20 function setCheckboxesBySelector(checked, selector) {
21 var boxes = $$(selector);
21 var boxes = $$(selector);
22 boxes.each(function(ele) {
22 boxes.each(function(ele) {
23 ele.checked = checked;
23 ele.checked = checked;
24 });
24 });
25 }
25 }
26
26
27 function showAndScrollTo(id, focus) {
27 function showAndScrollTo(id, focus) {
28 Element.show(id);
28 Element.show(id);
29 if (focus!=null) { Form.Element.focus(focus); }
29 if (focus!=null) { Form.Element.focus(focus); }
30 Element.scrollTo(id);
30 Element.scrollTo(id);
31 }
31 }
32
32
33 function toggleRowGroup(el) {
33 function toggleRowGroup(el) {
34 var tr = Element.up(el, 'tr');
34 var tr = Element.up(el, 'tr');
35 var n = Element.next(tr);
35 var n = Element.next(tr);
36 tr.toggleClassName('open');
36 tr.toggleClassName('open');
37 while (n != undefined && !n.hasClassName('group')) {
37 while (n != undefined && !n.hasClassName('group')) {
38 Element.toggle(n);
38 Element.toggle(n);
39 n = Element.next(n);
39 n = Element.next(n);
40 }
40 }
41 }
41 }
42
42
43 function collapseAllRowGroups(el) {
43 function collapseAllRowGroups(el) {
44 var tbody = Element.up(el, 'tbody');
44 var tbody = Element.up(el, 'tbody');
45 tbody.childElements('tr').each(function(tr) {
45 tbody.childElements('tr').each(function(tr) {
46 if (tr.hasClassName('group')) {
46 if (tr.hasClassName('group')) {
47 tr.removeClassName('open');
47 tr.removeClassName('open');
48 } else {
48 } else {
49 tr.hide();
49 tr.hide();
50 }
50 }
51 })
51 })
52 }
52 }
53
53
54 function expandAllRowGroups(el) {
54 function expandAllRowGroups(el) {
55 var tbody = Element.up(el, 'tbody');
55 var tbody = Element.up(el, 'tbody');
56 tbody.childElements('tr').each(function(tr) {
56 tbody.childElements('tr').each(function(tr) {
57 if (tr.hasClassName('group')) {
57 if (tr.hasClassName('group')) {
58 tr.addClassName('open');
58 tr.addClassName('open');
59 } else {
59 } else {
60 tr.show();
60 tr.show();
61 }
61 }
62 })
62 })
63 }
63 }
64
64
65 function toggleAllRowGroups(el) {
65 function toggleAllRowGroups(el) {
66 var tr = Element.up(el, 'tr');
66 var tr = Element.up(el, 'tr');
67 if (tr.hasClassName('open')) {
67 if (tr.hasClassName('open')) {
68 collapseAllRowGroups(el);
68 collapseAllRowGroups(el);
69 } else {
69 } else {
70 expandAllRowGroups(el);
70 expandAllRowGroups(el);
71 }
71 }
72 }
72 }
73
73
74 function toggleFieldset(el) {
74 function toggleFieldset(el) {
75 var fieldset = Element.up(el, 'fieldset');
75 var fieldset = Element.up(el, 'fieldset');
76 fieldset.toggleClassName('collapsed');
76 fieldset.toggleClassName('collapsed');
77 Effect.toggle(fieldset.down('div'), 'slide', {duration:0.2});
77 Effect.toggle(fieldset.down('div'), 'slide', {duration:0.2});
78 }
78 }
79
79
80 function hideFieldset(el) {
80 function hideFieldset(el) {
81 var fieldset = Element.up(el, 'fieldset');
81 var fieldset = Element.up(el, 'fieldset');
82 fieldset.toggleClassName('collapsed');
82 fieldset.toggleClassName('collapsed');
83 fieldset.down('div').hide();
83 fieldset.down('div').hide();
84 }
84 }
85
85
86 function add_filter() {
87 select = $('add_filter_select');
88 field = select.value
89 Element.show('tr_' + field);
90 check_box = $('cb_' + field);
91 check_box.checked = true;
92 toggle_filter(field);
93 select.selectedIndex = 0;
94
95 for (i=0; i<select.options.length; i++) {
96 if (select.options[i].value == field) {
97 select.options[i].disabled = true;
98 }
99 }
100 }
101
102 function toggle_filter(field) {
103 check_box = $('cb_' + field);
104 if (check_box.checked) {
105 Element.show("operators_" + field);
106 Form.Element.enable("operators_" + field);
107 toggle_operator(field);
108 } else {
109 Element.hide("operators_" + field);
110 Form.Element.disable("operators_" + field);
111 enableValues(field, []);
112 }
113 }
114
115 function enableValues(field, indexes) {
116 var f = $$(".values_" + field);
117 for(var i=0;i<f.length;i++) {
118 if (indexes.include(i)) {
119 Form.Element.enable(f[i]);
120 f[i].up('span').show();
121 } else {
122 f[i].value = '';
123 Form.Element.disable(f[i]);
124 f[i].up('span').hide();
125 }
126 }
127 if (indexes.length > 0) {
128 Element.show("div_values_" + field);
129 } else {
130 Element.hide("div_values_" + field);
131 }
132 }
133
134 function toggle_operator(field) {
135 operator = $("operators_" + field);
136 switch (operator.value) {
137 case "!*":
138 case "*":
139 case "t":
140 case "w":
141 case "o":
142 case "c":
143 enableValues(field, []);
144 break;
145 case "><":
146 enableValues(field, [0,1]);
147 break;
148 case "<t+":
149 case ">t+":
150 case "t+":
151 case ">t-":
152 case "<t-":
153 case "t-":
154 enableValues(field, [2]);
155 break;
156 default:
157 enableValues(field, [0]);
158 break;
159 }
160 }
161
162 function toggle_multi_select(el) {
163 var select = $(el);
164 if (select.multiple == true) {
165 select.multiple = false;
166 } else {
167 select.multiple = true;
168 }
169 }
170
171 function submit_query_form(id) {
172 selectAllOptions("selected_columns");
173 $(id).submit();
174 }
175
176 function apply_filters_observer() {
177 $$("#query_form input[type=text]").invoke("observe", "keypress", function(e){
178 if(e.keyCode == Event.KEY_RETURN) {
179 submit_query_form("query_form");
180 }
181 });
182 }
183
86 var fileFieldCount = 1;
184 var fileFieldCount = 1;
87
185
88 function addFileField() {
186 function addFileField() {
89 var fields = $('attachments_fields');
187 var fields = $('attachments_fields');
90 if (fields.childElements().length >= 10) return false;
188 if (fields.childElements().length >= 10) return false;
91 fileFieldCount++;
189 fileFieldCount++;
92 var s = document.createElement("span");
190 var s = document.createElement("span");
93 s.update(fields.down('span').innerHTML);
191 s.update(fields.down('span').innerHTML);
94 s.down('input.file').name = "attachments[" + fileFieldCount + "][file]";
192 s.down('input.file').name = "attachments[" + fileFieldCount + "][file]";
95 s.down('input.description').name = "attachments[" + fileFieldCount + "][description]";
193 s.down('input.description').name = "attachments[" + fileFieldCount + "][description]";
96 fields.appendChild(s);
194 fields.appendChild(s);
97 }
195 }
98
196
99 function removeFileField(el) {
197 function removeFileField(el) {
100 var fields = $('attachments_fields');
198 var fields = $('attachments_fields');
101 var s = Element.up(el, 'span');
199 var s = Element.up(el, 'span');
102 if (fields.childElements().length > 1) {
200 if (fields.childElements().length > 1) {
103 s.remove();
201 s.remove();
104 } else {
202 } else {
105 s.update(s.innerHTML);
203 s.update(s.innerHTML);
106 }
204 }
107 }
205 }
108
206
109 function checkFileSize(el, maxSize, message) {
207 function checkFileSize(el, maxSize, message) {
110 var files = el.files;
208 var files = el.files;
111 if (files) {
209 if (files) {
112 for (var i=0; i<files.length; i++) {
210 for (var i=0; i<files.length; i++) {
113 if (files[i].size > maxSize) {
211 if (files[i].size > maxSize) {
114 alert(message);
212 alert(message);
115 el.value = "";
213 el.value = "";
116 }
214 }
117 }
215 }
118 }
216 }
119 }
217 }
120
218
121 function showTab(name) {
219 function showTab(name) {
122 var f = $$('div#content .tab-content');
220 var f = $$('div#content .tab-content');
123 for(var i=0; i<f.length; i++){
221 for(var i=0; i<f.length; i++){
124 Element.hide(f[i]);
222 Element.hide(f[i]);
125 }
223 }
126 var f = $$('div.tabs a');
224 var f = $$('div.tabs a');
127 for(var i=0; i<f.length; i++){
225 for(var i=0; i<f.length; i++){
128 Element.removeClassName(f[i], "selected");
226 Element.removeClassName(f[i], "selected");
129 }
227 }
130 Element.show('tab-content-' + name);
228 Element.show('tab-content-' + name);
131 Element.addClassName('tab-' + name, "selected");
229 Element.addClassName('tab-' + name, "selected");
132 return false;
230 return false;
133 }
231 }
134
232
135 function moveTabRight(el) {
233 function moveTabRight(el) {
136 var lis = Element.up(el, 'div.tabs').down('ul').childElements();
234 var lis = Element.up(el, 'div.tabs').down('ul').childElements();
137 var tabsWidth = 0;
235 var tabsWidth = 0;
138 var i;
236 var i;
139 for (i=0; i<lis.length; i++) {
237 for (i=0; i<lis.length; i++) {
140 if (lis[i].visible()) {
238 if (lis[i].visible()) {
141 tabsWidth += lis[i].getWidth() + 6;
239 tabsWidth += lis[i].getWidth() + 6;
142 }
240 }
143 }
241 }
144 if (tabsWidth < Element.up(el, 'div.tabs').getWidth() - 60) {
242 if (tabsWidth < Element.up(el, 'div.tabs').getWidth() - 60) {
145 return;
243 return;
146 }
244 }
147 i=0;
245 i=0;
148 while (i<lis.length && !lis[i].visible()) {
246 while (i<lis.length && !lis[i].visible()) {
149 i++;
247 i++;
150 }
248 }
151 lis[i].hide();
249 lis[i].hide();
152 }
250 }
153
251
154 function moveTabLeft(el) {
252 function moveTabLeft(el) {
155 var lis = Element.up(el, 'div.tabs').down('ul').childElements();
253 var lis = Element.up(el, 'div.tabs').down('ul').childElements();
156 var i = 0;
254 var i = 0;
157 while (i<lis.length && !lis[i].visible()) {
255 while (i<lis.length && !lis[i].visible()) {
158 i++;
256 i++;
159 }
257 }
160 if (i>0) {
258 if (i>0) {
161 lis[i-1].show();
259 lis[i-1].show();
162 }
260 }
163 }
261 }
164
262
165 function displayTabsButtons() {
263 function displayTabsButtons() {
166 var lis;
264 var lis;
167 var tabsWidth = 0;
265 var tabsWidth = 0;
168 var i;
266 var i;
169 $$('div.tabs').each(function(el) {
267 $$('div.tabs').each(function(el) {
170 lis = el.down('ul').childElements();
268 lis = el.down('ul').childElements();
171 for (i=0; i<lis.length; i++) {
269 for (i=0; i<lis.length; i++) {
172 if (lis[i].visible()) {
270 if (lis[i].visible()) {
173 tabsWidth += lis[i].getWidth() + 6;
271 tabsWidth += lis[i].getWidth() + 6;
174 }
272 }
175 }
273 }
176 if ((tabsWidth < el.getWidth() - 60) && (lis[0].visible())) {
274 if ((tabsWidth < el.getWidth() - 60) && (lis[0].visible())) {
177 el.down('div.tabs-buttons').hide();
275 el.down('div.tabs-buttons').hide();
178 } else {
276 } else {
179 el.down('div.tabs-buttons').show();
277 el.down('div.tabs-buttons').show();
180 }
278 }
181 });
279 });
182 }
280 }
183
281
184 function setPredecessorFieldsVisibility() {
282 function setPredecessorFieldsVisibility() {
185 relationType = $('relation_relation_type');
283 relationType = $('relation_relation_type');
186 if (relationType && (relationType.value == "precedes" || relationType.value == "follows")) {
284 if (relationType && (relationType.value == "precedes" || relationType.value == "follows")) {
187 Element.show('predecessor_fields');
285 Element.show('predecessor_fields');
188 } else {
286 } else {
189 Element.hide('predecessor_fields');
287 Element.hide('predecessor_fields');
190 }
288 }
191 }
289 }
192
290
193 function promptToRemote(text, param, url) {
291 function promptToRemote(text, param, url) {
194 value = prompt(text + ':');
292 value = prompt(text + ':');
195 if (value) {
293 if (value) {
196 new Ajax.Request(url + '?' + param + '=' + encodeURIComponent(value), {asynchronous:true, evalScripts:true});
294 new Ajax.Request(url + '?' + param + '=' + encodeURIComponent(value), {asynchronous:true, evalScripts:true});
197 return false;
295 return false;
198 }
296 }
199 }
297 }
200
298
201 function showModal(id, width) {
299 function showModal(id, width) {
202 el = $(id);
300 el = $(id);
203 if (el == undefined || el.visible()) {return;}
301 if (el == undefined || el.visible()) {return;}
204 var h = $$('body')[0].getHeight();
302 var h = $$('body')[0].getHeight();
205 var d = document.createElement("div");
303 var d = document.createElement("div");
206 d.id = 'modalbg';
304 d.id = 'modalbg';
207 $('main').appendChild(d);
305 $('main').appendChild(d);
208 $('modalbg').setStyle({ width: '100%', height: h + 'px' });
306 $('modalbg').setStyle({ width: '100%', height: h + 'px' });
209 $('modalbg').show();
307 $('modalbg').show();
210
308
211 var pageWidth = document.viewport.getWidth();
309 var pageWidth = document.viewport.getWidth();
212 if (width) {
310 if (width) {
213 el.setStyle({'width': width});
311 el.setStyle({'width': width});
214 }
312 }
215 el.setStyle({'left': (((pageWidth - el.getWidth())/2 *100) / pageWidth) + '%'});
313 el.setStyle({'left': (((pageWidth - el.getWidth())/2 *100) / pageWidth) + '%'});
216 el.addClassName('modal');
314 el.addClassName('modal');
217 el.show();
315 el.show();
218
316
219 var submit = el.down("input[type=submit]");
317 var submit = el.down("input[type=submit]");
220 if (submit) {
318 if (submit) {
221 submit.focus();
319 submit.focus();
222 }
320 }
223 }
321 }
224
322
225 function hideModal(el) {
323 function hideModal(el) {
226 var modal = Element.up(el, 'div.modal');
324 var modal = Element.up(el, 'div.modal');
227 if (modal) {
325 if (modal) {
228 modal.hide();
326 modal.hide();
229 }
327 }
230 var bg = $('modalbg');
328 var bg = $('modalbg');
231 if (bg) {
329 if (bg) {
232 bg.remove();
330 bg.remove();
233 }
331 }
234 }
332 }
235
333
236 function collapseScmEntry(id) {
334 function collapseScmEntry(id) {
237 var els = document.getElementsByClassName(id, 'browser');
335 var els = document.getElementsByClassName(id, 'browser');
238 for (var i = 0; i < els.length; i++) {
336 for (var i = 0; i < els.length; i++) {
239 if (els[i].hasClassName('open')) {
337 if (els[i].hasClassName('open')) {
240 collapseScmEntry(els[i].id);
338 collapseScmEntry(els[i].id);
241 }
339 }
242 Element.hide(els[i]);
340 Element.hide(els[i]);
243 }
341 }
244 $(id).removeClassName('open');
342 $(id).removeClassName('open');
245 }
343 }
246
344
247 function expandScmEntry(id) {
345 function expandScmEntry(id) {
248 var els = document.getElementsByClassName(id, 'browser');
346 var els = document.getElementsByClassName(id, 'browser');
249 for (var i = 0; i < els.length; i++) {
347 for (var i = 0; i < els.length; i++) {
250 Element.show(els[i]);
348 Element.show(els[i]);
251 if (els[i].hasClassName('loaded') && !els[i].hasClassName('collapsed')) {
349 if (els[i].hasClassName('loaded') && !els[i].hasClassName('collapsed')) {
252 expandScmEntry(els[i].id);
350 expandScmEntry(els[i].id);
253 }
351 }
254 }
352 }
255 $(id).addClassName('open');
353 $(id).addClassName('open');
256 }
354 }
257
355
258 function scmEntryClick(id) {
356 function scmEntryClick(id) {
259 el = $(id);
357 el = $(id);
260 if (el.hasClassName('open')) {
358 if (el.hasClassName('open')) {
261 collapseScmEntry(id);
359 collapseScmEntry(id);
262 el.addClassName('collapsed');
360 el.addClassName('collapsed');
263 return false;
361 return false;
264 } else if (el.hasClassName('loaded')) {
362 } else if (el.hasClassName('loaded')) {
265 expandScmEntry(id);
363 expandScmEntry(id);
266 el.removeClassName('collapsed');
364 el.removeClassName('collapsed');
267 return false;
365 return false;
268 }
366 }
269 if (el.hasClassName('loading')) {
367 if (el.hasClassName('loading')) {
270 return false;
368 return false;
271 }
369 }
272 el.addClassName('loading');
370 el.addClassName('loading');
273 return true;
371 return true;
274 }
372 }
275
373
276 function scmEntryLoaded(id) {
374 function scmEntryLoaded(id) {
277 Element.addClassName(id, 'open');
375 Element.addClassName(id, 'open');
278 Element.addClassName(id, 'loaded');
376 Element.addClassName(id, 'loaded');
279 Element.removeClassName(id, 'loading');
377 Element.removeClassName(id, 'loading');
280 }
378 }
281
379
282 function randomKey(size) {
380 function randomKey(size) {
283 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');
381 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');
284 var key = '';
382 var key = '';
285 for (i = 0; i < size; i++) {
383 for (i = 0; i < size; i++) {
286 key += chars[Math.floor(Math.random() * chars.length)];
384 key += chars[Math.floor(Math.random() * chars.length)];
287 }
385 }
288 return key;
386 return key;
289 }
387 }
290
388
291 function observeParentIssueField(url) {
389 function observeParentIssueField(url) {
292 new Ajax.Autocompleter('issue_parent_issue_id',
390 new Ajax.Autocompleter('issue_parent_issue_id',
293 'parent_issue_candidates',
391 'parent_issue_candidates',
294 url,
392 url,
295 { minChars: 3,
393 { minChars: 3,
296 frequency: 0.5,
394 frequency: 0.5,
297 paramName: 'q',
395 paramName: 'q',
298 method: 'get',
396 method: 'get',
299 updateElement: function(value) {
397 updateElement: function(value) {
300 document.getElementById('issue_parent_issue_id').value = value.id;
398 document.getElementById('issue_parent_issue_id').value = value.id;
301 }});
399 }});
302 }
400 }
303
401
304 function observeRelatedIssueField(url) {
402 function observeRelatedIssueField(url) {
305 new Ajax.Autocompleter('relation_issue_to_id',
403 new Ajax.Autocompleter('relation_issue_to_id',
306 'related_issue_candidates',
404 'related_issue_candidates',
307 url,
405 url,
308 { minChars: 3,
406 { minChars: 3,
309 frequency: 0.5,
407 frequency: 0.5,
310 paramName: 'q',
408 paramName: 'q',
311 method: 'get',
409 method: 'get',
312 updateElement: function(value) {
410 updateElement: function(value) {
313 document.getElementById('relation_issue_to_id').value = value.id;
411 document.getElementById('relation_issue_to_id').value = value.id;
314 },
412 },
315 parameters: 'scope=all'
413 parameters: 'scope=all'
316 });
414 });
317 }
415 }
318
416
319 function setVisible(id, visible) {
417 function setVisible(id, visible) {
320 var el = $(id);
418 var el = $(id);
321 if (el) {if (visible) {el.show();} else {el.hide();}}
419 if (el) {if (visible) {el.show();} else {el.hide();}}
322 }
420 }
323
421
324 function observeProjectModules() {
422 function observeProjectModules() {
325 var f = function() {
423 var f = function() {
326 /* Hides trackers and issues custom fields on the new project form when issue_tracking module is disabled */
424 /* Hides trackers and issues custom fields on the new project form when issue_tracking module is disabled */
327 var c = ($('project_enabled_module_names_issue_tracking').checked == true);
425 var c = ($('project_enabled_module_names_issue_tracking').checked == true);
328 setVisible('project_trackers', c);
426 setVisible('project_trackers', c);
329 setVisible('project_issue_custom_fields', c);
427 setVisible('project_issue_custom_fields', c);
330 };
428 };
331
429
332 Event.observe(window, 'load', f);
430 Event.observe(window, 'load', f);
333 Event.observe('project_enabled_module_names_issue_tracking', 'change', f);
431 Event.observe('project_enabled_module_names_issue_tracking', 'change', f);
334 }
432 }
335
433
336 /*
434 /*
337 * Class used to warn user when leaving a page with unsaved textarea
435 * Class used to warn user when leaving a page with unsaved textarea
338 * Author: mathias.fischer@berlinonline.de
436 * Author: mathias.fischer@berlinonline.de
339 */
437 */
340
438
341 var WarnLeavingUnsaved = Class.create({
439 var WarnLeavingUnsaved = Class.create({
342 observedForms: false,
440 observedForms: false,
343 observedElements: false,
441 observedElements: false,
344 changedForms: false,
442 changedForms: false,
345 message: null,
443 message: null,
346
444
347 initialize: function(message){
445 initialize: function(message){
348 this.observedForms = $$('form');
446 this.observedForms = $$('form');
349 this.observedElements = $$('textarea');
447 this.observedElements = $$('textarea');
350 this.message = message;
448 this.message = message;
351
449
352 this.observedElements.each(this.observeChange.bind(this));
450 this.observedElements.each(this.observeChange.bind(this));
353 this.observedForms.each(this.submitAction.bind(this));
451 this.observedForms.each(this.submitAction.bind(this));
354
452
355 window.onbeforeunload = this.unload.bind(this);
453 window.onbeforeunload = this.unload.bind(this);
356 },
454 },
357
455
358 unload: function(){
456 unload: function(){
359 this.observedElements.each(function(el) {el.blur();})
457 this.observedElements.each(function(el) {el.blur();})
360 if(this.changedForms)
458 if(this.changedForms)
361 return this.message;
459 return this.message;
362 },
460 },
363
461
364 setChanged: function(){
462 setChanged: function(){
365 this.changedForms = true;
463 this.changedForms = true;
366 },
464 },
367
465
368 setUnchanged: function(){
466 setUnchanged: function(){
369 this.changedForms = false;
467 this.changedForms = false;
370 },
468 },
371
469
372 observeChange: function(element){
470 observeChange: function(element){
373 element.observe('change',this.setChanged.bindAsEventListener(this));
471 element.observe('change',this.setChanged.bindAsEventListener(this));
374 },
472 },
375
473
376 submitAction: function(element){
474 submitAction: function(element){
377 element.observe('submit',this.setUnchanged.bindAsEventListener(this));
475 element.observe('submit',this.setUnchanged.bindAsEventListener(this));
378 }
476 }
379 });
477 });
380
478
381 /*
479 /*
382 * 1 - registers a callback which copies the csrf token into the
480 * 1 - registers a callback which copies the csrf token into the
383 * X-CSRF-Token header with each ajax request. Necessary to
481 * X-CSRF-Token header with each ajax request. Necessary to
384 * work with rails applications which have fixed
482 * work with rails applications which have fixed
385 * CVE-2011-0447
483 * CVE-2011-0447
386 * 2 - shows and hides ajax indicator
484 * 2 - shows and hides ajax indicator
387 */
485 */
388 Ajax.Responders.register({
486 Ajax.Responders.register({
389 onCreate: function(request){
487 onCreate: function(request){
390 var csrf_meta_tag = $$('meta[name=csrf-token]')[0];
488 var csrf_meta_tag = $$('meta[name=csrf-token]')[0];
391
489
392 if (csrf_meta_tag) {
490 if (csrf_meta_tag) {
393 var header = 'X-CSRF-Token',
491 var header = 'X-CSRF-Token',
394 token = csrf_meta_tag.readAttribute('content');
492 token = csrf_meta_tag.readAttribute('content');
395
493
396 if (!request.options.requestHeaders) {
494 if (!request.options.requestHeaders) {
397 request.options.requestHeaders = {};
495 request.options.requestHeaders = {};
398 }
496 }
399 request.options.requestHeaders[header] = token;
497 request.options.requestHeaders[header] = token;
400 }
498 }
401
499
402 if ($('ajax-indicator') && Ajax.activeRequestCount > 0) {
500 if ($('ajax-indicator') && Ajax.activeRequestCount > 0) {
403 Element.show('ajax-indicator');
501 Element.show('ajax-indicator');
404 }
502 }
405 },
503 },
406 onComplete: function(){
504 onComplete: function(){
407 if ($('ajax-indicator') && Ajax.activeRequestCount == 0) {
505 if ($('ajax-indicator') && Ajax.activeRequestCount == 0) {
408 Element.hide('ajax-indicator');
506 Element.hide('ajax-indicator');
409 }
507 }
410 }
508 }
411 });
509 });
412
510
413 function hideOnLoad() {
511 function hideOnLoad() {
414 $$('.hol').each(function(el) {
512 $$('.hol').each(function(el) {
415 el.hide();
513 el.hide();
416 });
514 });
417 }
515 }
418
516
419 Event.observe(window, 'load', hideOnLoad);
517 Event.observe(window, 'load', hideOnLoad);
General Comments 0
You need to be logged in to leave comments. Login now