diff -r 067a6173820c -r ebac7eeb89eb includes/clientside/static/acl.js --- a/includes/clientside/static/acl.js Sat Nov 08 22:37:40 2008 -0500 +++ b/includes/clientside/static/acl.js Sat Nov 08 22:37:59 2008 -0500 @@ -165,6 +165,14 @@ editbtn.href = '#'; editbtn.innerHTML = $lang.get('acl_btn_show_existing'); editbtn_wrapper.appendChild(editbtn); + + // tracer button + var tracebtn = document.createElement('a'); + tracebtn.href = '#'; + tracebtn.innerHTML = $lang.get('acl_btn_view_effective'); + editbtn_wrapper.appendChild(document.createElement('br')); + editbtn_wrapper.appendChild(tracebtn); + main.appendChild(editbtn_wrapper); editbtn.onclick = function() @@ -173,6 +181,12 @@ return false; } + tracebtn.onclick = function() + { + aclSetViewDebugTools(); + return false; + } + selector = document.createElement('div'); grpsel = __aclBuildGroupsHTML(groups); @@ -525,6 +539,9 @@ case 'list_existing': aclSetViewListExistingRespond(data); break; + case 'trace': + aclDrawTraceWrapper(data); + break; default: handle_invalid_json(ajax.responseText); break; @@ -658,7 +675,7 @@ function __aclBuildWizardWindow() { - darken(aclDisableTransitionFX); + darken(aclDisableTransitionFX, 70, 'acldarkener'); box = document.createElement('div'); box.style.width = '640px' box.style.height = '440px'; @@ -781,13 +798,13 @@ { if ( aclDisableTransitionFX ) { - enlighten(true); + enlighten(true, 'acldarkener'); el.parentNode.removeChild(el); } else { opacity(aclManagerID, 100, 0, 500); - setTimeout('var el = document.getElementById(aclManagerID); el.parentNode.removeChild(el); enlighten();', 750); + setTimeout('var el = document.getElementById(aclManagerID); el.parentNode.removeChild(el); enlighten(false, "acldarkener");', 750); } } } @@ -896,6 +913,14 @@ obj['namespace'] = aclDataCache.namespace; __aclJSONSubmitAjaxHandler(obj); break; + case 'trace': + var params = { + mode: 'trace', + user: document.getElementById(aclManagerID + 'trace_user').value, + page: document.getElementById(aclManagerID + 'trace_page').value + }; + __aclJSONSubmitAjaxHandler(params); + break; default: alert("JSON form submit: invalid mode string "+mode+", stopping execution"); return false; @@ -1075,6 +1100,361 @@ } } +function aclSetViewDebugTools() +{ + // selection window for viewing effective permissions + var main = document.getElementById(aclManagerID + '_main'); + main.innerHTML = ''; + + // set the submission handler to trace + var thefrm = document.forms[form.name]; + var modeobj = form_fetch_field(thefrm, 'mode'); + modeobj.value = 'trace'; + + // show the back button + document.getElementById(aclManagerID + '_back').style.display = 'inline'; + + // + // start building + // + + // selection interface + var selector = document.createElement('div'); + + var table = document.createElement('table'); + + // username + var tr_user = document.createElement('tr'); + var td_user_l = document.createElement('td'); + var lbl_user = document.createElement('label'); + lbl_user.setAttribute('for', aclManagerID + 'trace_user'); + lbl_user.appendChild(document.createTextNode($lang.get('acl_lbl_trace_user'))); + td_user_l.appendChild(lbl_user); + tr_user.appendChild(td_user_l); + + var td_user_i = document.createElement('td'); + var i_user = document.createElement('input'); + i_user.type = 'text'; + i_user.id = aclManagerID + 'trace_user'; + i_user.onkeyup = function() { new AutofillUsername(this); }; + i_user.size = '20'; + td_user_i.appendChild(i_user); + tr_user.appendChild(td_user_i); + + table.appendChild(tr_user); + + // page + var tr_page = document.createElement('tr'); + var td_page_l = document.createElement('td'); + var lbl_page = document.createElement('label'); + lbl_page.setAttribute('for', aclManagerID + 'trace_page'); + lbl_page.appendChild(document.createTextNode($lang.get('acl_lbl_trace_page'))); + td_page_l.appendChild(lbl_page); + tr_page.appendChild(td_page_l); + + var td_page_i = document.createElement('td'); + var i_page = document.createElement('input'); + i_page.type = 'text'; + i_page.id = aclManagerID + 'trace_page'; + i_page.onkeyup = function() { new AutofillPage(this); }; + i_page.size = '20'; + td_page_i.appendChild(i_page); + tr_page.appendChild(td_page_i); + + table.appendChild(tr_page); + + selector.appendChild(table); + + // wrapper + + var container = document.createElement('div'); + + container.style.margin = 'auto'; + container.style.width = '360px'; + container.style.paddingTop = '90px'; + + var head = document.createElement('h2'); + head.appendChild(document.createTextNode($lang.get('acl_lbl_trace_title'))); + + var desc = document.createElement('p'); + desc.innerHTML = $lang.get('acl_lbl_trace_body'); + + container.appendChild(head); + container.appendChild(desc); + container.appendChild(selector); + + main.appendChild(container); +} + +function aclTraceKey() +{ + var div = document.createElement('div'); + $(div).addClass('tblholder'); + var table = document.createElement('table'); + $(table).attr('cellspacing', '1').attr('cellpadding', '4'); + + var inherit_list = ['enano_default', 'global_everyone', 'global_group', 'global_user', 'pg_everyone', 'pg_group', 'pg_user', 'local_everyone', 'local_group', 'local_user']; + for ( var i = 0; i < inherit_list.length; i++ ) + { + var t = inherit_list[i]; + var tr = document.createElement('tr'); + var td_key = document.createElement('td'); + $(td_key).addClass('acl_' + t).addClass('acl_inherit_key'); + tr.appendChild(td_key); + var td_explain = document.createElement('td'); + $(td_explain).addClass(i % 2 == 0 ? 'row1' : 'row2'); + td_explain.appendChild(document.createTextNode($lang.get('acl_inherit_key_' + t))); + tr.appendChild(td_explain); + table.appendChild(tr); + } + div.appendChild(table); + return div; +} + +function aclTraceModalKey() +{ + load_component('messagebox'); + miniPrompt(function(parent) + { + // heading + var h3 = document.createElement('h3'); + h3.appendChild(document.createTextNode($lang.get('acl_msg_trace_key'))); + parent.appendChild(h3); + + var key = aclTraceKey(); + parent.appendChild(key); + + var p = document.createElement('p'); + $(p).css('text-align', 'center'); + + var closer = document.createElement('a'); + $(closer).addClass('abutton').addClass('abutton_red').css('font-weight', 'bold'); + closer.appendChild(document.createTextNode($lang.get('etc_close'))); + closer.href = '#'; + $(closer).click(function(e) + { + miniPromptDestroy(this); + return false; + }); + + p.appendChild(closer); + parent.appendChild(p); + }); +} + +function aclDrawTraceWrapper(data) +{ + var trace_by_perm = aclDrawTraceByPerm(data); + var trace_by_rule = aclDrawTraceByRule(data); + + trace_by_perm.id = 'aclDebugTraceViewPerm'; + trace_by_rule.id = 'aclDebugTraceViewRule'; + + var start_with_rule = ( readCookie('acl_trace_view') == 'rule' ); + + if ( start_with_rule ) + { + trace_by_perm.style.display = 'none'; + } + else + { + trace_by_rule.style.display = 'none'; + } + + // selection window for viewing effective permissions + var main = document.getElementById(aclManagerID + '_main'); + main.innerHTML = ''; + + var wrapper = document.createElement('div'); + $(wrapper).css('padding-bottom', '20px'); + + var floatlink = document.createElement('div'); + $(floatlink).css('float', 'right').css('margin-left', '20px').css('margin-bottom', '20px').css('text-align', 'right'); + var a_toggle = document.createElement('a'); + $(a_toggle).attr('id', 'aclDebugTraceViewToggle'); + a_toggle.innerHTML = '» '; + a_toggle.innerHTML += start_with_rule ? $lang.get('acl_btn_sort_perm') : $lang.get('acl_btn_sort_rule'); + a_toggle.href = '#'; + floatlink.appendChild(a_toggle); + floatlink.appendChild(document.createElement('br')); + var a_key = document.createElement('a'); + $(a_key).css('font-size', 'smaller'); + a_key.innerHTML = '» '; + a_key.innerHTML += $lang.get('acl_btn_view_key'); + a_key.href = '#'; + floatlink.appendChild(a_key); + wrapper.appendChild(floatlink); + + var h3 = document.createElement('h3'); + h3.appendChild(document.createTextNode($lang.get('acl_msg_debug_main_title'))); + wrapper.appendChild(h3); + var p = document.createElement('p'); + p.appendChild(document.createTextNode($lang.get('acl_msg_debug_main_body'))); + wrapper.appendChild(p); + + wrapper.appendChild(trace_by_perm); + wrapper.appendChild(trace_by_rule); + + main.appendChild(wrapper); + + $(a_toggle).click(function(e) + { + aclTraceToggleViews(); + return false; + }); + + $(a_key).click(function(e) + { + aclTraceModalKey(); + return false; + }); +} + +function aclTraceToggleViews() +{ + var trace_by_perm = document.getElementById('aclDebugTraceViewPerm'); + var trace_by_rule = document.getElementById('aclDebugTraceViewRule'); + + var toggler = document.getElementById('aclDebugTraceViewToggle'); + var newtext; + + if ( trace_by_perm.style.display == 'none' ) + { + newtext = $lang.get('acl_btn_sort_rule'); + $(trace_by_rule).hide('blind', {}, 750, function() + { + $(trace_by_perm).show('blind', {}, 750); + }); + createCookie('acl_trace_view', 'perm'); + } + else + { + newtext = $lang.get('acl_btn_sort_perm'); + $(trace_by_perm).hide('blind', {}, 750, function() + { + $(trace_by_rule).show('blind', {}, 750); + }); + createCookie('acl_trace_view', 'rule'); + } + $(toggler).fadeOut(500, function() + { + this.innerHTML = '» ' + newtext; + $(this).fadeIn(500); + }); +} + +function aclDrawTraceByPerm(data) +{ + var wrapper = document.createElement('div'); + // wrapper.style.display = 'none'; + + // temporarily append wrapper to body to allow onclick to work + // var body = document.getElementsByTagName('body')[0]; + // body.appendChild(wrapper); + + for ( var i in data.perms ) + { + var perm = data.perms[i]; + var item = document.createElement('div'); + item.className = perm.divclass; + + // first row - permission name + current setting + // use innerHTML here to allow for HTML in localized permission types + item.innerHTML += '' + perm.perm_name + ' - ' + perm.perm_value + ''; + item.appendChild(document.createElement('br')); + + // second row - permission localized name + rule ID + var sm = document.createElement('small'); + sm.innerHTML = perm.perm_src; + + item.appendChild(sm); + + wrapper.appendChild(item); + + // whole row is now in the document + if ( perm.rule_id != -1 ) + { + sm.innerHTML += ' ['; + // rule is editable + var editlink = document.createElement('a'); + editlink.href = 'javascript:ajaxOpenDirectACLRule(' + perm.rule_id + ');'; + editlink.appendChild(document.createTextNode($lang.get('acl_btn_edit_rule'))); + sm.appendChild(editlink); + sm.innerHTML += ']'; + } + } + + // var ret = wrapper.cloneNode(true); + // body.removeChild(wrapper); + // wrapper = false; + // ret.style.display = 'block'; + // console.debug(ret); + // return ret; + return wrapper; +} + +function aclDrawTraceByRule(data) +{ + var wrapper = document.createElement('div'); + var groupdata = {}; + + for ( var i in data.perms ) + { + var perm = data.perms[i]; + if ( !groupdata[perm['rule_id']] ) + { + groupdata[perm['rule_id']] = { + meta: { + divclass: perm.divclass, + perm_src: perm.perm_src, + rule_id: perm.rule_id + }, + rules: {} + }; + } + groupdata[perm['rule_id']]['rules'][i] = perm; + } + + console.debug('draw by rule - group data: ', groupdata); + + for ( var i in groupdata ) + { + var group = groupdata[i]; + var grp = document.createElement('div'); + var head = document.createElement('div'); + head.className = group.meta.divclass; + var span = document.createElement('span'); + span.style.fontSize = 'larger'; + span.appendChild(document.createTextNode(group.meta.perm_src)); + head.appendChild(span); + if ( group.meta.rule_id != -1 ) + { + head.innerHTML += ' ['; + // rule is editable + var editlink = document.createElement('a'); + editlink.href = 'javascript:ajaxOpenDirectACLRule(' + group.meta.rule_id + ');'; + editlink.appendChild(document.createTextNode($lang.get('acl_btn_edit_rule'))); + head.appendChild(editlink); + head.innerHTML += ']'; + } + grp.appendChild(head); + for ( var i in group.rules ) + { + var rule = group.rules[i]; + var rulediv = document.createElement('div'); + rulediv.style.padding = '3px 12px'; + rulediv.innerHTML += rule.perm_name + ': '; + var b = document.createElement('strong'); + b.appendChild(document.createTextNode(rule.perm_value)); + rulediv.appendChild(b); + grp.appendChild(rulediv); + } + wrapper.appendChild(grp); + } + + return wrapper; +} + function aclShowPresetLoader() { var prompt = miniPrompt(function(parent)