##// END OF EJS Templates
Simplifies javascript for adding a new file....
Jean-Philippe Lang -
r6091:e6104d344fdc
parent child
Show More
@@ -1,372 +1,360
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 var fileFieldCount = 1;
86 var fileFieldCount = 1;
87
87
88 function addFileField() {
88 function addFileField() {
89 if (fileFieldCount >= 10) return false
89 if (fileFieldCount >= 10) return false
90 fileFieldCount++;
90 fileFieldCount++;
91 var f = document.createElement("input");
91 var fields = $('attachments_fields');
92 f.type = "file";
92 var s = document.createElement("span");
93 f.name = "attachments[" + fileFieldCount + "][file]";
93 s.update(fields.down('span').innerHTML);
94 f.size = 30;
94 s.down('input.file').name = "attachments[" + fileFieldCount + "][file]";
95 var d = document.createElement("input");
95 s.down('input.description').name = "attachments[" + fileFieldCount + "][description]";
96 d.type = "text";
96 fields.appendChild(s);
97 d.name = "attachments[" + fileFieldCount + "][description]";
98 d.size = 60;
99 var dLabel = new Element('label');
100 dLabel.addClassName('inline');
101 // Pulls the languge value used for Optional Description
102 dLabel.update($('attachment_description_label_content').innerHTML)
103 p = document.getElementById("attachments_fields");
104 p.appendChild(document.createElement("br"));
105 p.appendChild(f);
106 p.appendChild(dLabel);
107 dLabel.appendChild(d);
108
109 }
97 }
110
98
111 function showTab(name) {
99 function showTab(name) {
112 var f = $$('div#content .tab-content');
100 var f = $$('div#content .tab-content');
113 for(var i=0; i<f.length; i++){
101 for(var i=0; i<f.length; i++){
114 Element.hide(f[i]);
102 Element.hide(f[i]);
115 }
103 }
116 var f = $$('div.tabs a');
104 var f = $$('div.tabs a');
117 for(var i=0; i<f.length; i++){
105 for(var i=0; i<f.length; i++){
118 Element.removeClassName(f[i], "selected");
106 Element.removeClassName(f[i], "selected");
119 }
107 }
120 Element.show('tab-content-' + name);
108 Element.show('tab-content-' + name);
121 Element.addClassName('tab-' + name, "selected");
109 Element.addClassName('tab-' + name, "selected");
122 return false;
110 return false;
123 }
111 }
124
112
125 function moveTabRight(el) {
113 function moveTabRight(el) {
126 var lis = Element.up(el, 'div.tabs').down('ul').childElements();
114 var lis = Element.up(el, 'div.tabs').down('ul').childElements();
127 var tabsWidth = 0;
115 var tabsWidth = 0;
128 var i;
116 var i;
129 for (i=0; i<lis.length; i++) {
117 for (i=0; i<lis.length; i++) {
130 if (lis[i].visible()) {
118 if (lis[i].visible()) {
131 tabsWidth += lis[i].getWidth() + 6;
119 tabsWidth += lis[i].getWidth() + 6;
132 }
120 }
133 }
121 }
134 if (tabsWidth < Element.up(el, 'div.tabs').getWidth() - 60) {
122 if (tabsWidth < Element.up(el, 'div.tabs').getWidth() - 60) {
135 return;
123 return;
136 }
124 }
137 i=0;
125 i=0;
138 while (i<lis.length && !lis[i].visible()) {
126 while (i<lis.length && !lis[i].visible()) {
139 i++;
127 i++;
140 }
128 }
141 lis[i].hide();
129 lis[i].hide();
142 }
130 }
143
131
144 function moveTabLeft(el) {
132 function moveTabLeft(el) {
145 var lis = Element.up(el, 'div.tabs').down('ul').childElements();
133 var lis = Element.up(el, 'div.tabs').down('ul').childElements();
146 var i = 0;
134 var i = 0;
147 while (i<lis.length && !lis[i].visible()) {
135 while (i<lis.length && !lis[i].visible()) {
148 i++;
136 i++;
149 }
137 }
150 if (i>0) {
138 if (i>0) {
151 lis[i-1].show();
139 lis[i-1].show();
152 }
140 }
153 }
141 }
154
142
155 function displayTabsButtons() {
143 function displayTabsButtons() {
156 var lis;
144 var lis;
157 var tabsWidth = 0;
145 var tabsWidth = 0;
158 var i;
146 var i;
159 $$('div.tabs').each(function(el) {
147 $$('div.tabs').each(function(el) {
160 lis = el.down('ul').childElements();
148 lis = el.down('ul').childElements();
161 for (i=0; i<lis.length; i++) {
149 for (i=0; i<lis.length; i++) {
162 if (lis[i].visible()) {
150 if (lis[i].visible()) {
163 tabsWidth += lis[i].getWidth() + 6;
151 tabsWidth += lis[i].getWidth() + 6;
164 }
152 }
165 }
153 }
166 if ((tabsWidth < el.getWidth() - 60) && (lis[0].visible())) {
154 if ((tabsWidth < el.getWidth() - 60) && (lis[0].visible())) {
167 el.down('div.tabs-buttons').hide();
155 el.down('div.tabs-buttons').hide();
168 } else {
156 } else {
169 el.down('div.tabs-buttons').show();
157 el.down('div.tabs-buttons').show();
170 }
158 }
171 });
159 });
172 }
160 }
173
161
174 function setPredecessorFieldsVisibility() {
162 function setPredecessorFieldsVisibility() {
175 relationType = $('relation_relation_type');
163 relationType = $('relation_relation_type');
176 if (relationType && (relationType.value == "precedes" || relationType.value == "follows")) {
164 if (relationType && (relationType.value == "precedes" || relationType.value == "follows")) {
177 Element.show('predecessor_fields');
165 Element.show('predecessor_fields');
178 } else {
166 } else {
179 Element.hide('predecessor_fields');
167 Element.hide('predecessor_fields');
180 }
168 }
181 }
169 }
182
170
183 function promptToRemote(text, param, url) {
171 function promptToRemote(text, param, url) {
184 value = prompt(text + ':');
172 value = prompt(text + ':');
185 if (value) {
173 if (value) {
186 new Ajax.Request(url + '?' + param + '=' + encodeURIComponent(value), {asynchronous:true, evalScripts:true});
174 new Ajax.Request(url + '?' + param + '=' + encodeURIComponent(value), {asynchronous:true, evalScripts:true});
187 return false;
175 return false;
188 }
176 }
189 }
177 }
190
178
191 function collapseScmEntry(id) {
179 function collapseScmEntry(id) {
192 var els = document.getElementsByClassName(id, 'browser');
180 var els = document.getElementsByClassName(id, 'browser');
193 for (var i = 0; i < els.length; i++) {
181 for (var i = 0; i < els.length; i++) {
194 if (els[i].hasClassName('open')) {
182 if (els[i].hasClassName('open')) {
195 collapseScmEntry(els[i].id);
183 collapseScmEntry(els[i].id);
196 }
184 }
197 Element.hide(els[i]);
185 Element.hide(els[i]);
198 }
186 }
199 $(id).removeClassName('open');
187 $(id).removeClassName('open');
200 }
188 }
201
189
202 function expandScmEntry(id) {
190 function expandScmEntry(id) {
203 var els = document.getElementsByClassName(id, 'browser');
191 var els = document.getElementsByClassName(id, 'browser');
204 for (var i = 0; i < els.length; i++) {
192 for (var i = 0; i < els.length; i++) {
205 Element.show(els[i]);
193 Element.show(els[i]);
206 if (els[i].hasClassName('loaded') && !els[i].hasClassName('collapsed')) {
194 if (els[i].hasClassName('loaded') && !els[i].hasClassName('collapsed')) {
207 expandScmEntry(els[i].id);
195 expandScmEntry(els[i].id);
208 }
196 }
209 }
197 }
210 $(id).addClassName('open');
198 $(id).addClassName('open');
211 }
199 }
212
200
213 function scmEntryClick(id) {
201 function scmEntryClick(id) {
214 el = $(id);
202 el = $(id);
215 if (el.hasClassName('open')) {
203 if (el.hasClassName('open')) {
216 collapseScmEntry(id);
204 collapseScmEntry(id);
217 el.addClassName('collapsed');
205 el.addClassName('collapsed');
218 return false;
206 return false;
219 } else if (el.hasClassName('loaded')) {
207 } else if (el.hasClassName('loaded')) {
220 expandScmEntry(id);
208 expandScmEntry(id);
221 el.removeClassName('collapsed');
209 el.removeClassName('collapsed');
222 return false;
210 return false;
223 }
211 }
224 if (el.hasClassName('loading')) {
212 if (el.hasClassName('loading')) {
225 return false;
213 return false;
226 }
214 }
227 el.addClassName('loading');
215 el.addClassName('loading');
228 return true;
216 return true;
229 }
217 }
230
218
231 function scmEntryLoaded(id) {
219 function scmEntryLoaded(id) {
232 Element.addClassName(id, 'open');
220 Element.addClassName(id, 'open');
233 Element.addClassName(id, 'loaded');
221 Element.addClassName(id, 'loaded');
234 Element.removeClassName(id, 'loading');
222 Element.removeClassName(id, 'loading');
235 }
223 }
236
224
237 function randomKey(size) {
225 function randomKey(size) {
238 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');
226 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');
239 var key = '';
227 var key = '';
240 for (i = 0; i < size; i++) {
228 for (i = 0; i < size; i++) {
241 key += chars[Math.floor(Math.random() * chars.length)];
229 key += chars[Math.floor(Math.random() * chars.length)];
242 }
230 }
243 return key;
231 return key;
244 }
232 }
245
233
246 function observeParentIssueField(url) {
234 function observeParentIssueField(url) {
247 new Ajax.Autocompleter('issue_parent_issue_id',
235 new Ajax.Autocompleter('issue_parent_issue_id',
248 'parent_issue_candidates',
236 'parent_issue_candidates',
249 url,
237 url,
250 { minChars: 3,
238 { minChars: 3,
251 frequency: 0.5,
239 frequency: 0.5,
252 paramName: 'q',
240 paramName: 'q',
253 updateElement: function(value) {
241 updateElement: function(value) {
254 document.getElementById('issue_parent_issue_id').value = value.id;
242 document.getElementById('issue_parent_issue_id').value = value.id;
255 }});
243 }});
256 }
244 }
257
245
258 function observeRelatedIssueField(url) {
246 function observeRelatedIssueField(url) {
259 new Ajax.Autocompleter('relation_issue_to_id',
247 new Ajax.Autocompleter('relation_issue_to_id',
260 'related_issue_candidates',
248 'related_issue_candidates',
261 url,
249 url,
262 { minChars: 3,
250 { minChars: 3,
263 frequency: 0.5,
251 frequency: 0.5,
264 paramName: 'q',
252 paramName: 'q',
265 updateElement: function(value) {
253 updateElement: function(value) {
266 document.getElementById('relation_issue_to_id').value = value.id;
254 document.getElementById('relation_issue_to_id').value = value.id;
267 },
255 },
268 parameters: 'scope=all'
256 parameters: 'scope=all'
269 });
257 });
270 }
258 }
271
259
272 function setVisible(id, visible) {
260 function setVisible(id, visible) {
273 var el = $(id);
261 var el = $(id);
274 if (el) {if (visible) {el.show();} else {el.hide();}}
262 if (el) {if (visible) {el.show();} else {el.hide();}}
275 }
263 }
276
264
277 function observeProjectModules() {
265 function observeProjectModules() {
278 var f = function() {
266 var f = function() {
279 /* Hides trackers and issues custom fields on the new project form when issue_tracking module is disabled */
267 /* Hides trackers and issues custom fields on the new project form when issue_tracking module is disabled */
280 var c = ($('project_enabled_module_names_issue_tracking').checked == true);
268 var c = ($('project_enabled_module_names_issue_tracking').checked == true);
281 setVisible('project_trackers', c);
269 setVisible('project_trackers', c);
282 setVisible('project_issue_custom_fields', c);
270 setVisible('project_issue_custom_fields', c);
283 };
271 };
284
272
285 Event.observe(window, 'load', f);
273 Event.observe(window, 'load', f);
286 Event.observe('project_enabled_module_names_issue_tracking', 'change', f);
274 Event.observe('project_enabled_module_names_issue_tracking', 'change', f);
287 }
275 }
288
276
289 /*
277 /*
290 * Class used to warn user when leaving a page with unsaved textarea
278 * Class used to warn user when leaving a page with unsaved textarea
291 * Author: mathias.fischer@berlinonline.de
279 * Author: mathias.fischer@berlinonline.de
292 */
280 */
293
281
294 var WarnLeavingUnsaved = Class.create({
282 var WarnLeavingUnsaved = Class.create({
295 observedForms: false,
283 observedForms: false,
296 observedElements: false,
284 observedElements: false,
297 changedForms: false,
285 changedForms: false,
298 message: null,
286 message: null,
299
287
300 initialize: function(message){
288 initialize: function(message){
301 this.observedForms = $$('form');
289 this.observedForms = $$('form');
302 this.observedElements = $$('textarea');
290 this.observedElements = $$('textarea');
303 this.message = message;
291 this.message = message;
304
292
305 this.observedElements.each(this.observeChange.bind(this));
293 this.observedElements.each(this.observeChange.bind(this));
306 this.observedForms.each(this.submitAction.bind(this));
294 this.observedForms.each(this.submitAction.bind(this));
307
295
308 window.onbeforeunload = this.unload.bind(this);
296 window.onbeforeunload = this.unload.bind(this);
309 },
297 },
310
298
311 unload: function(){
299 unload: function(){
312 this.observedElements.each(function(el) {el.blur();})
300 this.observedElements.each(function(el) {el.blur();})
313 if(this.changedForms)
301 if(this.changedForms)
314 return this.message;
302 return this.message;
315 },
303 },
316
304
317 setChanged: function(){
305 setChanged: function(){
318 this.changedForms = true;
306 this.changedForms = true;
319 },
307 },
320
308
321 setUnchanged: function(){
309 setUnchanged: function(){
322 this.changedForms = false;
310 this.changedForms = false;
323 },
311 },
324
312
325 observeChange: function(element){
313 observeChange: function(element){
326 element.observe('change',this.setChanged.bindAsEventListener(this));
314 element.observe('change',this.setChanged.bindAsEventListener(this));
327 },
315 },
328
316
329 submitAction: function(element){
317 submitAction: function(element){
330 element.observe('submit',this.setUnchanged.bindAsEventListener(this));
318 element.observe('submit',this.setUnchanged.bindAsEventListener(this));
331 }
319 }
332 });
320 });
333
321
334 /*
322 /*
335 * 1 - registers a callback which copies the csrf token into the
323 * 1 - registers a callback which copies the csrf token into the
336 * X-CSRF-Token header with each ajax request. Necessary to
324 * X-CSRF-Token header with each ajax request. Necessary to
337 * work with rails applications which have fixed
325 * work with rails applications which have fixed
338 * CVE-2011-0447
326 * CVE-2011-0447
339 * 2 - shows and hides ajax indicator
327 * 2 - shows and hides ajax indicator
340 */
328 */
341 Ajax.Responders.register({
329 Ajax.Responders.register({
342 onCreate: function(request){
330 onCreate: function(request){
343 var csrf_meta_tag = $$('meta[name=csrf-token]')[0];
331 var csrf_meta_tag = $$('meta[name=csrf-token]')[0];
344
332
345 if (csrf_meta_tag) {
333 if (csrf_meta_tag) {
346 var header = 'X-CSRF-Token',
334 var header = 'X-CSRF-Token',
347 token = csrf_meta_tag.readAttribute('content');
335 token = csrf_meta_tag.readAttribute('content');
348
336
349 if (!request.options.requestHeaders) {
337 if (!request.options.requestHeaders) {
350 request.options.requestHeaders = {};
338 request.options.requestHeaders = {};
351 }
339 }
352 request.options.requestHeaders[header] = token;
340 request.options.requestHeaders[header] = token;
353 }
341 }
354
342
355 if ($('ajax-indicator') && Ajax.activeRequestCount > 0) {
343 if ($('ajax-indicator') && Ajax.activeRequestCount > 0) {
356 Element.show('ajax-indicator');
344 Element.show('ajax-indicator');
357 }
345 }
358 },
346 },
359 onComplete: function(){
347 onComplete: function(){
360 if ($('ajax-indicator') && Ajax.activeRequestCount == 0) {
348 if ($('ajax-indicator') && Ajax.activeRequestCount == 0) {
361 Element.hide('ajax-indicator');
349 Element.hide('ajax-indicator');
362 }
350 }
363 }
351 }
364 });
352 });
365
353
366 function hideOnLoad() {
354 function hideOnLoad() {
367 $$('.hol').each(function(el) {
355 $$('.hol').each(function(el) {
368 el.hide();
356 el.hide();
369 });
357 });
370 }
358 }
371
359
372 Event.observe(window, 'load', hideOnLoad);
360 Event.observe(window, 'load', hideOnLoad);
General Comments 0
You need to be logged in to leave comments. Login now