--- logintoboggan.permissions.js +++ logintoboggan.permissions.js @@ -1,77 +1,25 @@ /** - * This is a custom implementation of user.permissions.js, which is necessary - * because LoginToboggan needs its pre-auth role to not be explicitly tied to - * the auth role. The change is minor -- simply exclude the pre-auth role from - * all the auto-checking as the anon and auth user roles are. + * LoginToboggan needs its pre-auth role to not be explicitly tied to + * the auth role. */ - (function ($) { /** * Shows checked and disabled checkboxes for inherited permissions. */ -Drupal.behaviors.permissions = { - attach: function (context) { - var self = this; - $('table#permissions').once('permissions', function () { - // On a site with many roles and permissions, this behavior initially has - // to perform thousands of DOM manipulations to inject checkboxes and hide - // them. By detaching the table from the DOM, all operations can be - // performed without triggering internal layout and re-rendering processes - // in the browser. - var $table = $(this); - if ($table.prev().length) { - var $ancestor = $table.prev(), method = 'after'; - } - else { - var $ancestor = $table.parent(), method = 'append'; - } - $table.detach(); - - // Create dummy checkboxes. We use dummy checkboxes instead of reusing - // the existing checkboxes here because new checkboxes don't alter the - // submitted form. If we'd automatically check existing checkboxes, the - // permission table would be polluted with redundant entries. This - // is deliberate, but desirable when we automatically check them. - var $dummy = $('') - .attr('title', Drupal.t("This permission is inherited from the authenticated user role.")) - .hide(); - - $('input[type=checkbox]', this).not('.rid-2, .rid-1, .rid-' + Drupal.settings.LoginToboggan.preAuthID).addClass('real-checkbox').each(function () { - $dummy.clone().insertAfter(this); +Drupal.behaviors.LoginTobogganPermissions = { + attach: function (context, settings) { + // Revert changes made by modules/user/user.permissions.js + $('table#permissions', context).once('tobogganPermissions', function () { + $('input[type=checkbox]', this).filter('.rid-' + settings.LoginToboggan.preAuthID).removeClass('real-checkbox').each(function () { + $(this).next().filter('.dummy-checkbox').remove(); + $('input.rid-' + settings.LoginToboggan.preAuthID).each(function () { + this.style.display = ''; + }); }); - - // Initialize the authenticated user checkbox. - $('input[type=checkbox].rid-2', this) - .bind('click.permissions', self.toggle) - // .triggerHandler() cannot be used here, as it only affects the first - // element. - .each(self.toggle); - - // Re-insert the table into the DOM. - $ancestor[method]($table); }); }, - - /** - * Toggles all dummy checkboxes based on the checkboxes' state. - * - * If the "authenticated user" checkbox is checked, the checked and disabled - * checkboxes are shown, the real checkboxes otherwise. - */ - toggle: function () { - var authCheckbox = this, $row = $(this).closest('tr'); - // jQuery performs too many layout calculations for .hide() and .show(), - // leading to a major page rendering lag on sites with many roles and - // permissions. Therefore, we toggle visibility directly. - $row.find('.real-checkbox').each(function () { - this.style.display = (authCheckbox.checked ? 'none' : ''); - }); - $row.find('.dummy-checkbox').each(function () { - this.style.display = (authCheckbox.checked ? '' : 'none'); - }); - } }; })(jQuery);