##// END OF EJS Templates
Handle spaces in development scm stderr log file path....
Handle spaces in development scm stderr log file path. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@8129 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r7806:7ed7d8984ddc
r8009:f385a3e3da51
Show More
application.js
415 lines | 10.7 KiB | application/javascript | JavascriptLexer
Jean-Philippe Lang
Issue list now supports bulk edit/move/delete (#563, #607). For now, issues from different projects can not be bulk edited/moved/deleted at once....
r1116 /* redMine - project management software
Copyright (C) 2006-2008 Jean-Philippe Lang */
Jean-Philippe Lang
Added svn:eol-style native property for various files...
r416 function checkAll (id, checked) {
Jean-Philippe Lang
Fixed: Check All / Uncheck All in Email Settings doesn't work (#1180)....
r1414 var els = Element.descendants(id);
for (var i = 0; i < els.length; i++) {
if (els[i].disabled==false) {
els[i].checked = checked;
Jean-Philippe Lang
Added svn:eol-style native property for various files...
r416 }
}
}
Jean-Philippe Lang
Adds checkboxes toggle links on permissions report....
r1769 function toggleCheckboxesBySelector(selector) {
boxes = $$(selector);
var all_checked = true;
for (i = 0; i < boxes.length; i++) { if (boxes[i].checked == false) { all_checked = false; } }
for (i = 0; i < boxes.length; i++) { boxes[i].checked = !all_checked; }
}
Eric Davis
Changed the notifications to use a hierarchy UI...
r4108 function setCheckboxesBySelector(checked, selector) {
var boxes = $$(selector);
boxes.each(function(ele) {
ele.checked = checked;
});
}
Jean-Philippe Lang
Makes issue update link work without javascript (#1337)....
r1591 function showAndScrollTo(id, focus) {
Element.show(id);
if (focus!=null) { Form.Element.focus(focus); }
Element.scrollTo(id);
}
Jean-Philippe Lang
Adds group folding on issue list (#2679)....
r2615 function toggleRowGroup(el) {
var tr = Element.up(el, 'tr');
var n = Element.next(tr);
tr.toggleClassName('open');
while (n != undefined && !n.hasClassName('group')) {
Element.toggle(n);
n = Element.next(n);
}
}
Jean-Philippe Lang
Adds links on the issue list to collapse/expang all groups (#7236)....
r5054 function collapseAllRowGroups(el) {
var tbody = Element.up(el, 'tbody');
tbody.childElements('tr').each(function(tr) {
if (tr.hasClassName('group')) {
tr.removeClassName('open');
} else {
tr.hide();
}
})
}
function expandAllRowGroups(el) {
var tbody = Element.up(el, 'tbody');
tbody.childElements('tr').each(function(tr) {
if (tr.hasClassName('group')) {
tr.addClassName('open');
} else {
tr.show();
}
})
}
function toggleAllRowGroups(el) {
var tr = Element.up(el, 'tr');
if (tr.hasClassName('open')) {
collapseAllRowGroups(el);
} else {
expandAllRowGroups(el);
}
}
Jean-Philippe Lang
Makes tickets and timelogs filters collapsible (UI)....
r2777 function toggleFieldset(el) {
var fieldset = Element.up(el, 'fieldset');
fieldset.toggleClassName('collapsed');
Effect.toggle(fieldset.down('div'), 'slide', {duration:0.2});
}
Jean-Philippe Lang
Allow additional workflow transitions for issue author and assignee (#2732)....
r4775 function hideFieldset(el) {
var fieldset = Element.up(el, 'fieldset');
fieldset.toggleClassName('collapsed');
fieldset.down('div').hide();
}
Jean-Philippe Lang
Adds an optional description to attachments....
r1166 var fileFieldCount = 1;
Jean-Philippe Lang
Added svn:eol-style native property for various files...
r416 function addFileField() {
Jean-Philippe Lang
Simplifies javascript for adding a new file....
r6091 var fields = $('attachments_fields');
Jean-Philippe Lang
Adds a button to remove a file upload before submission (#5670)....
r6092 if (fields.childElements().length >= 10) return false;
fileFieldCount++;
Jean-Philippe Lang
Simplifies javascript for adding a new file....
r6091 var s = document.createElement("span");
s.update(fields.down('span').innerHTML);
s.down('input.file').name = "attachments[" + fileFieldCount + "][file]";
s.down('input.description').name = "attachments[" + fileFieldCount + "][description]";
fields.appendChild(s);
Jean-Philippe Lang
Added svn:eol-style native property for various files...
r416 }
Jean-Philippe Lang
Adds a button to remove a file upload before submission (#5670)....
r6092 function removeFileField(el) {
var fields = $('attachments_fields');
var s = Element.up(el, 'span');
if (fields.childElements().length > 1) {
s.remove();
} else {
s.update(s.innerHTML);
}
}
Jean-Philippe Lang
Check attachment size when the user selects a file (#9667)....
r7806 function checkFileSize(el, maxSize, message) {
var files = el.files;
if (files) {
for (var i=0; i<files.length; i++) {
if (files[i].size > maxSize) {
alert(message);
el.value = "";
}
}
}
}
Jean-Philippe Lang
Added svn:eol-style native property for various files...
r416 function showTab(name) {
var f = $$('div#content .tab-content');
for(var i=0; i<f.length; i++){
Element.hide(f[i]);
}
var f = $$('div.tabs a');
for(var i=0; i<f.length; i++){
Element.removeClassName(f[i], "selected");
}
Element.show('tab-content-' + name);
Element.addClassName('tab-' + name, "selected");
return false;
Jean-Philippe Lang
Added an ajax indicator for all ajax calls. Also removed highlight effects on my page layout edition....
r482 }
Jean-Philippe Lang
Adds buttons to scroll the tabs when they overflow....
r3060 function moveTabRight(el) {
var lis = Element.up(el, 'div.tabs').down('ul').childElements();
var tabsWidth = 0;
var i;
for (i=0; i<lis.length; i++) {
if (lis[i].visible()) {
tabsWidth += lis[i].getWidth() + 6;
}
}
if (tabsWidth < Element.up(el, 'div.tabs').getWidth() - 60) {
return;
}
i=0;
while (i<lis.length && !lis[i].visible()) {
i++;
}
lis[i].hide();
}
function moveTabLeft(el) {
var lis = Element.up(el, 'div.tabs').down('ul').childElements();
var i = 0;
while (i<lis.length && !lis[i].visible()) {
i++;
}
if (i>0) {
lis[i-1].show();
}
}
function displayTabsButtons() {
var lis;
var tabsWidth = 0;
var i;
$$('div.tabs').each(function(el) {
lis = el.down('ul').childElements();
for (i=0; i<lis.length; i++) {
if (lis[i].visible()) {
tabsWidth += lis[i].getWidth() + 6;
}
}
Jean-Philippe Lang
Do not hide scroll buttons if some tabs are still hidden....
r3064 if ((tabsWidth < el.getWidth() - 60) && (lis[0].visible())) {
Jean-Philippe Lang
Adds buttons to scroll the tabs when they overflow....
r3060 el.down('div.tabs-buttons').hide();
} else {
el.down('div.tabs-buttons').show();
}
});
}
Jean-Philippe Lang
Issue relations first commit (not thoroughly tested). 4 kinds of relation are available:...
r503 function setPredecessorFieldsVisibility() {
relationType = $('relation_relation_type');
Jean-Philippe Lang
Adds 'follows' relation (#1432)....
r3076 if (relationType && (relationType.value == "precedes" || relationType.value == "follows")) {
Jean-Philippe Lang
Issue relations first commit (not thoroughly tested). 4 kinds of relation are available:...
r503 Element.show('predecessor_fields');
} else {
Element.hide('predecessor_fields');
}
}
Jean-Philippe Lang
Added a link to add a new category when creating or editing an issue....
r642 function promptToRemote(text, param, url) {
value = prompt(text + ':');
if (value) {
Jean-Philippe Lang
Fixed: encoding problem when adding non-ASCII issue category in the new issue page (#1286)....
r1428 new Ajax.Request(url + '?' + param + '=' + encodeURIComponent(value), {asynchronous:true, evalScripts:true});
Jean-Philippe Lang
Added a link to add a new category when creating or editing an issue....
r642 return false;
}
}
Jean-Philippe Lang
Adds a dialog box for CSV export options (#4742)....
r7754 function showModal(id, width) {
el = $(id);
if (el == undefined || el.visible()) {return;}
var h = $$('body')[0].getHeight();
var d = document.createElement("div");
d.id = 'modalbg';
$('main').appendChild(d);
$('modalbg').setStyle({ width: '100%', height: h + 'px' });
$('modalbg').show();
var pageWidth = document.viewport.getWidth();
el.setStyle({'width': width});
el.setStyle({'left': (((pageWidth - el.getWidth())/2 *100) / pageWidth) + '%'});
el.addClassName('modal');
el.show();
var submit = el.down("input[type=submit]");
if (submit) {
submit.focus();
}
}
function hideModal(el) {
var modal = Element.up(el, 'div.modal');
if (modal) {
modal.hide();
}
var bg = $('modalbg');
if (bg) {
bg.remove();
}
}
Jean-Philippe Lang
SCM browser: directories can now be collapsed and re-expanded with no additional request....
r850 function collapseScmEntry(id) {
var els = document.getElementsByClassName(id, 'browser');
for (var i = 0; i < els.length; i++) {
Jean-Philippe Lang
SCM browser:...
r854 if (els[i].hasClassName('open')) {
collapseScmEntry(els[i].id);
}
Jean-Philippe Lang
SCM browser: directories can now be collapsed and re-expanded with no additional request....
r850 Element.hide(els[i]);
}
$(id).removeClassName('open');
}
function expandScmEntry(id) {
var els = document.getElementsByClassName(id, 'browser');
for (var i = 0; i < els.length; i++) {
Element.show(els[i]);
Jean-Philippe Lang
SCM browser:...
r855 if (els[i].hasClassName('loaded') && !els[i].hasClassName('collapsed')) {
expandScmEntry(els[i].id);
}
Jean-Philippe Lang
SCM browser: directories can now be collapsed and re-expanded with no additional request....
r850 }
$(id).addClassName('open');
}
function scmEntryClick(id) {
el = $(id);
if (el.hasClassName('open')) {
collapseScmEntry(id);
Jean-Philippe Lang
SCM browser:...
r855 el.addClassName('collapsed');
Jean-Philippe Lang
SCM browser: directories can now be collapsed and re-expanded with no additional request....
r850 return false;
} else if (el.hasClassName('loaded')) {
expandScmEntry(id);
Jean-Philippe Lang
SCM browser:...
r855 el.removeClassName('collapsed');
Jean-Philippe Lang
SCM browser: directories can now be collapsed and re-expanded with no additional request....
r850 return false;
}
Jean-Philippe Lang
SCM browser:...
r855 if (el.hasClassName('loading')) {
return false;
}
el.addClassName('loading');
Jean-Philippe Lang
SCM browser: directories can now be collapsed and re-expanded with no additional request....
r850 return true;
}
function scmEntryLoaded(id) {
Element.addClassName(id, 'open');
Element.addClassName(id, 'loaded');
Jean-Philippe Lang
SCM browser:...
r855 Element.removeClassName(id, 'loading');
Jean-Philippe Lang
SCM browser: directories can now be collapsed and re-expanded with no additional request....
r850 }
Jean-Philippe Lang
Adds a simple API and a standalone script that can be used to forward emails from a local or remote email server to Redmine (#1110)....
r1570 function randomKey(size) {
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');
var key = '';
for (i = 0; i < size; i++) {
key += chars[Math.floor(Math.random() * chars.length)];
}
return key;
}
Jean-Philippe Lang
Adds subtasking (#443) including:...
r3459 function observeParentIssueField(url) {
new Ajax.Autocompleter('issue_parent_issue_id',
'parent_issue_candidates',
url,
{ minChars: 3,
frequency: 0.5,
paramName: 'q',
updateElement: function(value) {
document.getElementById('issue_parent_issue_id').value = value.id;
}});
}
Jean-Philippe Lang
Autocomplete issue relations on subject (#3170)....
r4388 function observeRelatedIssueField(url) {
new Ajax.Autocompleter('relation_issue_to_id',
'related_issue_candidates',
url,
{ minChars: 3,
frequency: 0.5,
paramName: 'q',
updateElement: function(value) {
document.getElementById('relation_issue_to_id').value = value.id;
},
parameters: 'scope=all'
});
}
Jean-Philippe Lang
Do not show trackers and issue custom fields on project form when issue tracking is disabled (#7225)....
r4528 function setVisible(id, visible) {
var el = $(id);
if (el) {if (visible) {el.show();} else {el.hide();}}
}
function observeProjectModules() {
var f = function() {
/* Hides trackers and issues custom fields on the new project form when issue_tracking module is disabled */
var c = ($('project_enabled_module_names_issue_tracking').checked == true);
setVisible('project_trackers', c);
setVisible('project_issue_custom_fields', c);
};
Event.observe(window, 'load', f);
Event.observe('project_enabled_module_names_issue_tracking', 'change', f);
}
Jean-Philippe Lang
Warning on leaving a page with unsaved content in textarea (#2910)....
r4780 /*
* Class used to warn user when leaving a page with unsaved textarea
* Author: mathias.fischer@berlinonline.de
*/
var WarnLeavingUnsaved = Class.create({
observedForms: false,
observedElements: false,
changedForms: false,
message: null,
initialize: function(message){
this.observedForms = $$('form');
this.observedElements = $$('textarea');
this.message = message;
this.observedElements.each(this.observeChange.bind(this));
this.observedForms.each(this.submitAction.bind(this));
window.onbeforeunload = this.unload.bind(this);
},
unload: function(){
Jean-Philippe Lang
Fixed: No warning if unsaved text has not lost focus (#8468)....
r5849 this.observedElements.each(function(el) {el.blur();})
Jean-Philippe Lang
Warning on leaving a page with unsaved content in textarea (#2910)....
r4780 if(this.changedForms)
return this.message;
},
setChanged: function(){
this.changedForms = true;
},
setUnchanged: function(){
this.changedForms = false;
},
observeChange: function(element){
element.observe('change',this.setChanged.bindAsEventListener(this));
},
submitAction: function(element){
element.observe('submit',this.setUnchanged.bindAsEventListener(this));
}
});
Jean-Philippe Lang
Do not show trackers and issue custom fields on project form when issue tracking is disabled (#7225)....
r4528
Jean-Philippe Lang
Send the CSRF token with Ajax requests (#7843)....
r5014 /*
* 1 - registers a callback which copies the csrf token into the
* X-CSRF-Token header with each ajax request. Necessary to
* work with rails applications which have fixed
* CVE-2011-0447
* 2 - shows and hides ajax indicator
*/
Jean-Philippe Lang
Added an ajax indicator for all ajax calls. Also removed highlight effects on my page layout edition....
r482 Ajax.Responders.register({
Jean-Philippe Lang
Send the CSRF token with Ajax requests (#7843)....
r5014 onCreate: function(request){
var csrf_meta_tag = $$('meta[name=csrf-token]')[0];
if (csrf_meta_tag) {
var header = 'X-CSRF-Token',
token = csrf_meta_tag.readAttribute('content');
if (!request.options.requestHeaders) {
request.options.requestHeaders = {};
}
request.options.requestHeaders[header] = token;
}
Jean-Philippe Lang
Added an ajax indicator for all ajax calls. Also removed highlight effects on my page layout edition....
r482 if ($('ajax-indicator') && Ajax.activeRequestCount > 0) {
Element.show('ajax-indicator');
}
},
onComplete: function(){
if ($('ajax-indicator') && Ajax.activeRequestCount == 0) {
Element.hide('ajax-indicator');
}
}
});
Jean-Philippe Lang
Fixed: changing user/roles of project member not possible without javascript (#4852)...
r3369
Eric Davis
Hide the role forms when editing or adding Project members. #5452...
r3670 function hideOnLoad() {
Jean-Philippe Lang
Fixed: changing user/roles of project member not possible without javascript (#4852)...
r3369 $$('.hol').each(function(el) {
el.hide();
});
Eric Davis
Hide the role forms when editing or adding Project members. #5452...
r3670 }
Event.observe(window, 'load', hideOnLoad);