define(['jquery', 'context', 'util/encode', 'i18n'], function($, context, encode, __){ $.fn.acldata = function(key, val){ if (typeof val !== 'undefined'){ $.expr.attrHandle[key] = function(elem){ return $(elem).attr(key) || $(elem).data(key); }; } return $.fn.data.apply(this, arguments); }; function loadModules(role, successCallback) { $('#aclModules ul.group-list').empty(); $('#aclActions ul.group-list').empty(); $('#aclRoles ul.included-roles').empty(); if (role === '') return; $.ajax({ type: "POST", url: context.root_url + "funcAcl/Admin/getModules", data: 'role='+role, dataType: 'json', success: function(data) { for (var r in data['includedRoles']) { var $role = $('
  • '+ encode.html(data['includedRoles'][r]) +'
  • '); $role.appendTo($('#aclRoles ul.included-roles')); } for (var e in data['extensions']) { var ext = data['extensions'][e]; if (data.locked && ext['access'] === 'none') { continue; // for the dev mode show only the checked } switch (ext['access']) { case 'inherited': groupCheckboxTitle = __('Inherited access to the extension'); extra = ' has-inherited'; break; case 'full': groupCheckboxTitle = __('Revoke access rights to the entire extension'); extra = ' has-allaccess'; break; case 'partial': extra = ' has-access'; groupCheckboxTitle = __('Grant access rights to the entire extension'); break; default: // no access extra = ''; groupCheckboxTitle = __('Grant access rights to the entire extension'); break; } var $group = $('
  • '+ ext['label'] +'' + (data.locked ? '' : '') + '
  • '); $group.acldata('uri', ext.uri); switch (ext['access']) { case 'full': $('.selector', $group).click(function (e) { e.stopPropagation(); Access2None($(this)) }); break; case 'partial': $('.selector', $group).click(function (e) { e.stopPropagation(); Access2All($(this)) }); break; case 'none': // no access $('.selector', $group).click(function (e) {e.stopPropagation();Access2All($(this))}); break; } //Open/close group $('.group-title', $group).click(function(e) { if ($(this).parent().hasClass('open')){ $(this).removeClass('open'); $(this).parent().removeClass('open').addClass('closed'); $(this).find('.icon').removeClass('icon-down').addClass('icon-right'); $(this).parent().find('.selected').removeClass('selected'); } else { $(this).addClass('open'); $(this).parent().removeClass('closed').addClass('open'); $(this).find('.icon').removeClass('icon-right').addClass('icon-down'); } }); for (var m in ext.modules) { var mod = ext.modules[m]; if (data.locked && mod['access'] === 'none') { continue; // for the dev mode show only the checked } switch (mod['access']) { case 'inherited': modCheckboxTitle = __('Inherited access to the controller'); extra = ' has-inherited'; break; case 'full': modCheckboxTitle = __('Revoke access rights to the entire controller'); extra = ' has-allaccess'; break; case 'partial': extra = ' has-access'; modCheckboxTitle = __('Grant access rights to the entire controller'); break; default: // no access extra = ''; modCheckboxTitle = __('Grant access rights to the entire controller'); break; } var $el = $('
  • '+ mod['label'] +'' + (data.locked ? '' : '') +'
  • '); $el.acldata('uri', mod.uri); switch (mod['access']) { case 'full': $('.selector', $el).click(function (e) {e.stopPropagation();Access2None($(this))}); break; case 'partial': $('.selector', $el).click(function (e) {e.stopPropagation();Access2All($(this))}); break; case 'none': // no access $('.selector', $el).click(function (e) {e.stopPropagation();Access2All($(this))}); break; } //Select module $el.click(function() { $('#aclModules .selectable').removeClass('selected'); $(this).addClass('selected'); loadActions($('#roles').val(), $(this).acldata('uri')); }); $el.appendTo($('ul', $group)); } $group.appendTo($('#aclModules ul.group-list')); } if (typeof successCallback != 'undefined'){ successCallback(); } } }); } function loadActions(role, module, successCallback) { $.ajax({ type: "POST", url: context.root_url + "funcAcl/Admin/getActions", data: 'role='+role+'&module='+module, dataType: 'json', success: function(data) { $('#aclActions ul.group-list').empty(); for (e in data) { var act = data[e]; if (act['locked'] && (act['access'] === 'none')) { continue; // for the dev mode show only the checked } var extra = ''; switch (act['access']) { case 'inherited': actCheckBoxTitle = __('Inherited access to the action'); break; case 'full': extra = ' has-allaccess'; actCheckBoxTitle = __('Revoke access rights to the action'); break; default: // no access actCheckBoxTitle = __('Grant access rights to the action'); } var $el = $('
  • '+ e +'' + (act['locked'] ? '' : '') + '
  • '); $el.acldata('uri', act.uri); switch (act['access']) { case 'full': $('.selector', $el).click(function (e) {e.stopPropagation();Access2None($(this))}); break; case 'none': // no access $('.selector', $el).click(function (e) {e.stopPropagation();Access2All($(this))}); break; } //Select action //$el.click(function() { // $('#aclActions .selectable').removeClass('selected'); // $(this).toggleClass('selected'); //}); $el.appendTo($('#aclActions ul.group-list')); } if (typeof successCallback !== 'undefined'){ successCallback(); } } }); } function Access2All(el) { // Act var uri = $(el).closest('li').removeClass('has-access') .addClass('has-allaccess').acldata('uri'); actOnUri(uri, 'add', $('#roles').val()); el.unbind('click').click(function(e) { e.stopPropagation(); Access2None($(this)) }); } function Access2None(el) { // Act var uri = $(el).closest('li').removeClass('has-access') .removeClass('has-allaccess').acldata('uri'); actOnUri(uri, 'remove', $('#roles').val()); el.unbind('click').click(function(e) { e.stopPropagation(); Access2All($(this)) }); } function actOnUri(uri, act, role) { var type = uri.split('#')[1].split('_')[0]; var action = ''; switch (type) { case 'e': action = 'Extension'; break; case 'm': action = 'Module'; break; case 'a': action = 'Action'; break; } switch (act) { case 'add': action = "add"+action+"Access"; break; case 'remove': action = "remove"+action+"Access"; break; } //Do act $.ajax({ type: "POST", url: context.root_url + "funcAcl/Admin/" + action, data: 'role='+role+'&uri='+uri, dataType: 'json', success: function(data) { var open = []; $('#aclModules .group.expendable.open').each(function() {open.push($(this).index())}); var $el = $('#aclModules .selected'); var elidx; var selectedUri = null; if ($el.length) { selectedUri = $el.acldata('uri'); elidx = $el.index(); } else elidx = -1; // update GUI loadModules($('#roles').val(), function() { for (var i in open) { $('#aclModules .group.expendable:eq('+open[i]+')').removeClass('closed') .addClass('open') .find('.group-title').addClass('open'); } if (selectedUri != null) { $('#aclModules .open li').each(function() { if ($(this).acldata('uri') == selectedUri) { $(this).addClass('selected'); } }); loadActions($('#roles').val(), selectedUri); //$('#aclModules .open li:eq('+elidx+')').addClass('selected'); //loadActions($('#roles').val(), uri); } }); } }); } return { start : function(){ //Change role $('#roles').change(function() { if ($('#roles').val() === ''){ $('#roleactions').hide(); } else { $('#roleactions').show(); } loadModules($('#roles').val()); }).change(); } }; });