(function($) { Drupal.behaviors.moduleFilter = { attach: function(context) { $('#system-modules td.description').once('description', function() { $(this).click(function() { $('.inner.expand', $(this)).toggleClass('expanded'); }); $('.inner.expand', $(this)).children().click(function(e) { if ($(this).parent().hasClass('expanded')) { e.stopPropagation(); } }); }); $('.module-filter-inputs-wrapper', context).once('module-filter', function() { var filterInput = $('input[name="module_filter[name]"]', context); var selector = '#system-modules table tbody tr'; if (Drupal.settings.moduleFilter.tabs) { selector += '.module'; } filterInput.moduleFilter(selector, { wrapper: $('#module-filter-modules'), delay: 500, striping: true, childSelector: 'td:nth(1)', rules: [ function(moduleFilter, item) { if (!item.unavailable) { if (moduleFilter.options.showEnabled) { if (item.status && !item.disabled) { return true; } } if (moduleFilter.options.showDisabled) { if (!item.status && !item.disabled) { return true; } } if (moduleFilter.options.showRequired) { if (item.status && item.disabled) { return true; } } } if (moduleFilter.options.showUnavailable) { if (item.unavailable || (!item.status && item.disabled)) { return true; } } return false; } ], buildIndex: [ function(moduleFilter, item) { var $checkbox = $('td.checkbox :checkbox', item.element); if ($checkbox.size() > 0) { item.status = $checkbox.is(':checked'); item.disabled = $checkbox.is(':disabled'); } else { item.status = false; item.disabled = true; item.unavailable = true; } return item; } ], showEnabled: $('#edit-module-filter-show-enabled').is(':checked'), showDisabled: $('#edit-module-filter-show-disabled').is(':checked'), showRequired: $('#edit-module-filter-show-required').is(':checked'), showUnavailable: $('#edit-module-filter-show-unavailable').is(':checked') }); var moduleFilter = filterInput.data('moduleFilter'); moduleFilter.operators = { description: function(string, moduleFilter, item) { if (item.description == undefined) { var description = $('.description', item.element).clone(); $('.admin-requirements', description).remove(); $('.admin-operations', description).remove(); item.description = description.text().toLowerCase(); } if (item.description.indexOf(string) >= 0) { return true; } }, requiredBy: function(string, moduleFilter, item) { if (item.requiredBy == undefined) { var requirements = Drupal.ModuleFilter.getRequirements(item.element); item.requires = requirements.requires; item.requiredBy = requirements.requiredBy; } for (var i in item.requiredBy) { if (item.requiredBy[i].indexOf(string) >= 0) { return true; } } }, requires: function(string, moduleFilter, item) { if (item.requires == undefined) { var requirements = Drupal.ModuleFilter.getRequirements(item.element); item.requires = requirements.requires; item.requiredBy = requirements.requiredBy; } for (var i in item.requires) { if (item.requires[i].indexOf(string) >= 0) { return true; } } } }; $('#edit-module-filter-show-enabled', context).change(function() { moduleFilter.options.showEnabled = $(this).is(':checked'); moduleFilter.applyFilter(); }); $('#edit-module-filter-show-disabled', context).change(function() { moduleFilter.options.showDisabled = $(this).is(':checked'); moduleFilter.applyFilter(); }); $('#edit-module-filter-show-required', context).change(function() { moduleFilter.options.showRequired = $(this).is(':checked'); moduleFilter.applyFilter(); }); $('#edit-module-filter-show-unavailable', context).change(function() { moduleFilter.options.showUnavailable = $(this).is(':checked'); moduleFilter.applyFilter(); }); if (!Drupal.settings.moduleFilter.tabs) { moduleFilter.element.bind('moduleFilter:start', function() { $('#system-modules fieldset').show(); }); moduleFilter.element.bind('moduleFilter:finish', function(e, data) { $('#system-modules fieldset').each(function(i) { $fieldset = $(this); if ($('tbody tr', $fieldset).filter(':visible').length == 0) { $fieldset.hide(); } }); }); moduleFilter.applyFilter(); } }); } }; Drupal.ModuleFilter.getRequirements = function(element) { var requires = new Array(); var requiredBy = new Array(); $('.admin-requirements', element).each(function() { var text = $(this).text(); if (text.substr(0, 9) == 'Requires:') { // Requires element. requiresString = text.substr(9); requires = requiresString.replace(/\([a-z]*\)/g, '').split(','); } else if (text.substr(0, 12) == 'Required by:') { // Required by element. requiredByString = text.substr(12); requiredBy = requiredByString.replace(/\([a-z]*\)/g, '').split(','); } }); for (var i in requires) { requires[i] = $.trim(requires[i].toLowerCase()); } for (var i in requiredBy) { requiredBy[i] = $.trim(requiredBy[i].toLowerCase()); } return { requires: requires, requiredBy: requiredBy }; }; })(jQuery);