| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 | (function ($) {  var fpa = {    selector : {      form: '#user-admin-permissions',      table : '#permissions',      row : 'tbody tr',      filter : 'td.permission',      grouping : 'td.module'    },    dom : {      table : '', // jquery object for entire permissions table      rows : '', // jquery object containing just the rows      perm_style : '', // jquery object containing permissions style      role_style : '', // jquery object containing roles style      section_left: '',      section_right: ''    },    search:''  };    /**   * Kick a function to the Back Of The Line.   *    * Anything that is botl'd will run after other attach events, like sticky table headers.   */  fpa.botl = function (func) {    setTimeout(function () {      func();    }, 0);  };    /**   * Changes a string into a safe single css class.   */  fpa.classify = function (str) {    return str.toLowerCase().replace(/ /ig, '-');  };    /**   * Callback for click events on module list.   */  fpa.filter_module = function () {    var $this = $(this);    $('div.fpa-left-section ul li').removeClass('active');    $this.parent().addClass('active');        var current_perm = fpa.dom.filter.val().split('@');    current_perm[1] = $this.attr('title');    fpa.dom.filter.val(current_perm.join('@').replace(/@$/ig, '')); // remove trailing @ as that means no module; clean 'All' filter value    fpa.filter('=');  };    fpa.filter = function (module_match) {    module_match = module_match || '*=';    perm = fpa.dom.filter.val();    fpa.botl(function () {      if (typeof perm != 'undefined' && ['', '@'].indexOf(perm) == -1) {        var perm_copy = fpa.classify(perm).split('@');        var selector = fpa.selector.table + ' ' + fpa.selector.row;                var perm_style_code = selector + '[fpa-module]{display:none;}';                if (perm_copy[0]) selector += '[fpa-permission*="' + perm_copy[0] + '"]';        if (perm_copy[1]) selector += '[fpa-module' + module_match + '"' + perm_copy[1] + '"]';                perm_style_code += selector + '{display: table-row;}';                fpa.dom.perm_style[0].innerHTML = perm_style_code;      }      else {        fpa.dom.perm_style[0].innerHTML = '';      }    });  };    fpa.prepare = function (context) {    fpa.dom.form = $(fpa.selector.form, context);    if (fpa.dom.form.length == 0) {      return;    }    fpa.dom.table = fpa.dom.form.find(fpa.selector.table);    fpa.dom.section_right = fpa.dom.table.wrap('<div class="fpa-right-section" />').parent();    fpa.dom.module_list = $('<ul />').insertBefore(fpa.dom.section_right).wrap('<div class="fpa-left-section" />');    // create module list        fpa.dom.all_modules = $('<div />')      .appendTo(fpa.dom.module_list)      .wrap('<li class="active" />')      .text('All modules')      .attr('title', '')      .click(fpa.filter_module);        fpa.dom.table.find(fpa.selector.grouping).each(function () {      var module_id = $(this).text();      // Add new item to module list.      $('<div />')        .appendTo(fpa.dom.module_list)        .wrap('<li />')        .text(module_id.replace(/ module$/ig, ''))        .attr('title', module_id)        .attr('fpa-module', fpa.classify(module_id))        .click(fpa.filter_module);    });        // tag rows with required classes    fpa.botl(function () {      fpa.dom.filter_form = $('<div class="fpa-filter-form" />').prependTo(fpa.dom.section_right);      fpa.dom.perm_style = $('<style type="text/css" />').prependTo(fpa.dom.section_right);      fpa.dom.role_style = $('<style type="text/css" />').prependTo(fpa.dom.section_right);            // Put the "Save Permissions" button at the top and bottom.      fpa.dom.form.find('input[type="submit"][name="op"]').remove()        .clone().insertAfter(fpa.dom.module_list)        .clone().insertAfter(fpa.dom.table);              fpa.dom.filter = $('<input id="fpa_filter" type="text" class="form-text" placeholder="permission@module" />')        .appendTo(fpa.dom.filter_form)        .keypress(function (e) {          //prevent enter key from submitting form          if (e.which == 13) {            return false;          }        })        .keyup(function (e) {          fpa.filter();        })        .wrap('<div id="fpa-filter-perm" class="form-item" />')        .before('<label for="fpa_filter">Filter:</label>')        .after('<div class="description">Enter in the format of permission@module;<br /> E.g. admin@system will show only permissions with<br />the text "admin" in modules with the text "system".</div>')        .val(Drupal.settings.fpa.perm);              $('<button class="clear-search">Clear Filter</button>')        .insertAfter(fpa.dom.filter)        .click(function (e) {          e.preventDefault();          fpa.dom.filter.val('');          fpa.filter();          fpa.dom.all_modules.click();        });              var roles_select = $('<select multiple="multiple" size=5 />')        .appendTo(fpa.dom.filter_form)        .wrap('<div id="fpa-filter-role" class="form-item" />')        .before('<label for="fpa_filter">Roles:</label>')        .after('<div class="description">Select which roles to display.<br />Ctrl+click to select multiple.</div>')        .change(function () {          var values = $(this).val();          var selector_array = [];          var role_style_code = fpa.selector.table + ' .checkbox{display:none;}';          for (i in values) {            selector_array.push(fpa.selector.table + ' .checkbox[title^="' + values[i] + '"]');          }          role_style_code += selector_array.join(',') + '{display: table-cell;}';                    fpa.dom.role_style[0].innerHTML = role_style_code;        });            fpa.dom.rows = fpa.dom.table.find(fpa.selector.row);            var roles = fpa.dom.table.find('thead th.checkbox').each(function () {        $this = $(this);        var role_text = $this.text();        var index = $this.attr('title', role_text).index() + 1;        fpa.dom.rows.find('td:nth-child(' + index + ')').attr('title', role_text);        $('<option />')          .appendTo(roles_select)          .attr('value', $this.text())          .attr('selected', 'selected')          .text($this.text());      });            var module_id = '';      var $module_row;            // iterate over the rows      fpa.dom.rows.each(function () {        var $this = $(this);                // Is this a module row?        var new_module_id = $this.find(fpa.selector.grouping).text();        if (new_module_id != '') {          $module_row = $this.addClass('module');          module_id = fpa.classify(new_module_id);        }        var perm = $this.find(fpa.selector.filter).clone();        perm.find('div.description').remove();        var permission = fpa.classify($.trim(perm.text()));        $this.attr('fpa-module', module_id).attr('fpa-permission', permission);        $module_row.attr('fpa-permission', $module_row.attr('fpa-permission') + ' ' + permission);      });            if (Drupal.settings.fpa.perm == '' && window.location.hash.indexOf('module-') > -1) {        fpa.dom.filter.val('@' + window.location.hash.substring(8));        fpa.filter('=');      }            fpa.filter();      fpa.dom.form.addClass('show');      fpa.dom.filter.focus();          });  };    fpa.modalframe = function (context) {    $('a.fpa_modalframe', context).click(function (e) {      e.preventDefault();      e.stopPropagation();      Drupal.modalFrame.open({        url: $(this).attr('href'),        draggable: false      });    });  };    Drupal.behaviors.fpa = {attach: function (context) {    fpa.prepare(context);    fpa.modalframe(context);  }};})(jQuery);
 |