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);
|