diff options
author | Andreas Gohr <andi@splitbrain.org> | 2007-11-17 16:57:40 +0100 |
---|---|---|
committer | Andreas Gohr <andi@splitbrain.org> | 2007-11-17 16:57:40 +0100 |
commit | 2a3623da3390f0118660d541928ae8c635631b3d (patch) | |
tree | 4d153d6415c7f73ee6320abc729611d46600a3ec /lib/plugins/acl/script.js | |
parent | beccd742c1d9973601f82b20ad07c4f6c0f32084 (diff) | |
download | dokuwiki-2a3623da3390f0118660d541928ae8c635631b3d.tar.gz dokuwiki-2a3623da3390f0118660d541928ae8c635631b3d.zip |
ACL Manager rewritten
This patch replaces the old ACL manager plugin with a new, completely
rewritten one.
The ACL manager is now independent of the page from which it was called,
instead all pages and namespaces are selectable from an AJAX enhanced
list similar to the one used in the media manager. This should take care
of a major complain by new users.
Another major confusion was that the old manager only showed relevant
rules. This new manager always shows *all* defined ACL rules.
darcs-hash:20071117155740-7ad00-1de71e396d5dbc117bf5788fb5667af828d5c20f.gz
Diffstat (limited to 'lib/plugins/acl/script.js')
-rw-r--r-- | lib/plugins/acl/script.js | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/lib/plugins/acl/script.js b/lib/plugins/acl/script.js new file mode 100644 index 000000000..228b1e5c4 --- /dev/null +++ b/lib/plugins/acl/script.js @@ -0,0 +1,159 @@ +acl = { + init: function(){ + this.ctl = $('acl_manager'); + if(!this.ctl) return; + + var sel = $('acl__user').getElementsByTagName('select')[0]; + + addEvent(sel,'change',acl.userselhandler); + addEvent($('acl__tree'),'click',acl.treehandler); + addEvent($('acl__user').getElementsByTagName('input')[1],'click',acl.loadinfo); + addEvent($('acl__user').getElementsByTagName('input')[1],'keypress',acl.loadinfo); + }, + + + /** + * Handle user dropdown + */ + userselhandler: function(e){ + // make entry field visible/invisible + if(this.value == '__g__' || this.value == '__u__'){ + $('acl__user').getElementsByTagName('input')[0].style.display = ''; //acl_w + $('acl__user').getElementsByTagName('input')[1].style.display = ''; //submit + }else{ + $('acl__user').getElementsByTagName('input')[0].style.display = 'none'; + $('acl__user').getElementsByTagName('input')[1].style.display = 'none'; + } + + acl.loadinfo(); + }, + + /** + * Load the current permission info and edit form + * + * @param frm - Form element with needed data + */ + loadinfo: function(){ + // get form + var frm = $('acl__detail').getElementsByTagName('form')[0]; + + // prepare an AJAX call + var ajax = new sack(DOKU_BASE + 'lib/plugins/acl/ajax.php'); + ajax.AjaxFailedAlert = ''; + ajax.encodeURIString = false; + if(ajax.failed) return true; + + // prepare data + var data = Array(); + data[0] = ajax.encVar('ns',frm.elements['ns'].value); + data[1] = ajax.encVar('id',frm.elements['id'].value); + data[2] = ajax.encVar('acl_t',frm.elements['acl_t'].value); + data[3] = ajax.encVar('acl_w',frm.elements['acl_w'].value); + data[4] = ajax.encVar('ajax','info'); + + ajax.elementObj = $('acl__info'); + + ajax.runAJAX(data.join('&')); + return false; + }, + + /** + * parse URL attributes into a associative array + * + * @todo put into global script lib? + */ + parseatt: function(str){ + if(str[0] == '?') str = str.substr(1); + var attributes = {}; + var all = str.split('&'); + for(var i=0; i<all.length; i++){ + var att = all[i].split('='); + attributes[att[0]] = decodeURIComponent(att[1]); + } + return attributes; + }, + + /** + * htmlspecialchars equivalent + * + * @todo put in gloabl scripts lib? + */ + hsc: function(str) { + str = str.replace(/&/g,"&"); + str = str.replace(/\"/g,"""); + str = str.replace(/\'/g,"'"); + str = str.replace(/</g,"<"); + str = str.replace(/>/g,">"); + return str; + }, + + + /** + * Open or close a subtree using AJAX + * + * @author Andreas Gohr <andi@splitbrain.org> + */ + treetoggle: function(clicky){ + var listitem = clicky.parentNode.parentNode; + + // if already open, close by removing the sublist + var sublists = listitem.getElementsByTagName('ul'); + if(sublists.length){ + listitem.removeChild(sublists[0]); + clicky.src = DOKU_BASE+'lib/images/plus.gif'; + clicky.alt = '+'; + return false; + } + + // get the enclosed link (is always the first one) + var link = listitem.getElementsByTagName('a')[0]; + + // prepare an AJAX call to fetch the subtree + var ajax = new sack(DOKU_BASE + 'lib/plugins/acl/ajax.php'); + ajax.AjaxFailedAlert = ''; + ajax.encodeURIString = false; + if(ajax.failed) return true; + + //prepare the new ul + var ul = document.createElement('ul'); + listitem.appendChild(ul); + ajax.elementObj = ul; + ajax.runAJAX(link.search.substr(1)+'&ajax=tree'); + clicky.src = DOKU_BASE+'lib/images/minus.gif'; + return false; + }, + + + treehandler: function(e){ + if(e.target.href){ // is it a link? + // remove highlighting + var obj = getElementsByClass('cur',$('acl__tree'),'a')[0]; + if(obj) obj.className = obj.className.replace(/ cur/,''); + + // add new highlighting + e.target.className += ' cur'; + + // set new page to detail form + var frm = $('acl__detail').getElementsByTagName('form')[0]; + if(e.target.className.search(/wikilink1/) > -1){ + frm.elements['ns'].value = ''; + frm.elements['id'].value = acl.hsc(acl.parseatt(e.target.search)['id']); + }else if(e.target.className.search(/idx_dir/) > -1){ + frm.elements['ns'].value = acl.hsc(acl.parseatt(e.target.search)['ns']); + frm.elements['id'].value = ''; + } + + acl.loadinfo(); + }else if(e.target.src){ // is it an image? +console.log('its an image'); + acl.treetoggle(e.target); + } + + e.stopPropagation(); + e.preventDefault(); + return false; + } + +}; + +addInitEvent(acl.init); |