123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559 |
- (function ($) {
- Drupal.ModuleFilter.tabs = {};
- Drupal.ModuleFilter.enabling = {};
- Drupal.ModuleFilter.disabling = {};
- Drupal.ModuleFilter.jQueryIsNewer = function() {
- if (Drupal.ModuleFilter.jQueryNewer == undefined) {
- var v1parts = $.fn.jquery.split('.');
- var v2parts = new Array('1', '4', '4');
- for (var i = 0; i < v1parts.length; ++i) {
- if (v2parts.length == i) {
- Drupal.ModuleFilter.jQueryNewer = true;
- return Drupal.ModuleFilter.jQueryNewer;
- }
- if (v1parts[i] == v2parts[i]) {
- continue;
- }
- else if (v1parts[i] > v2parts[i]) {
- Drupal.ModuleFilter.jQueryNewer = true;
- return Drupal.ModuleFilter.jQueryNewer;
- }
- else {
- Drupal.ModuleFilter.jQueryNewer = false;
- return Drupal.ModuleFilter.jQueryNewer;
- }
- }
- if (v1parts.length != v2parts.length) {
- Drupal.ModuleFilter.jQueryNewer = false;
- return Drupal.ModuleFilter.jQueryNewer;
- }
- Drupal.ModuleFilter.jQueryNewer = false;
- }
- return Drupal.ModuleFilter.jQueryNewer;
- };
- Drupal.behaviors.moduleFilterTabs = {
- attach: function(context) {
- if (Drupal.settings.moduleFilter.tabs) {
- $('#module-filter-wrapper table:not(.sticky-header)', context).once('module-filter-tabs', function() {
- var $modules = $('#module-filter-modules');
- var moduleFilter = $('input[name="module_filter[name]"]').data('moduleFilter');
- var table = $(this);
- $('thead', table).show();
- // Remove package header rows.
- $('tr.admin-package-header', table).remove();
- var $tabsWrapper = $('<div id="module-filter-tabs"></div>');
- // Build tabs from package title rows.
- var tabs = '<ul>';
- for (var i in Drupal.settings.moduleFilter.packageIDs) {
- var id = Drupal.checkPlain(Drupal.settings.moduleFilter.packageIDs[i]);
- var name = id;
- var tabClass = 'project-tab';
- var title = null;
- var summary = (Drupal.settings.moduleFilter.countEnabled) ? '<span class="count">' + Drupal.ModuleFilter.countSummary(id) + '</span>' : '';
- switch (id) {
- case 'all':
- name = Drupal.t('All');
- break;
- case 'new':
- name = Drupal.t('New');
- title = Drupal.t('Modules installed within the last week.');
- if (Drupal.settings.moduleFilter.enabledCounts['new'].total == 0) {
- tabClass += ' disabled';
- summary += '<span>' + Drupal.t('No modules added within the last week.') + '</span>';
- }
- break;
- case 'recent':
- name = Drupal.t('Recent');
- title = Drupal.t('Modules enabled/disabled within the last week.');
- if (Drupal.settings.moduleFilter.enabledCounts['recent'].total == 0) {
- tabClass += ' disabled';
- summary += '<span>' + Drupal.t('No modules were enabled or disabled within the last week.') + '</span>';
- }
- break;
- default:
- var $row = $('#' + id + '-package', this);
- name = Drupal.checkPlain($.trim($row.text()));
- $row.remove();
- break;
- }
- tabs += '<li id="' + id + '-tab" class="' + tabClass + '"><a href="#' + id + '" class="overlay-exclude"' + (title ? ' title="' + title + '"' : '') + '><strong>' + name + '</strong><span class="summary">' + summary + '</span></a></li>';
- }
- tabs += '</ul>';
- $tabsWrapper.append(tabs);
- $modules.before($tabsWrapper);
- // Index tabs.
- $('#module-filter-tabs li').each(function() {
- var $tab = $(this);
- var id = $tab.attr('id');
- Drupal.ModuleFilter.tabs[id] = new Drupal.ModuleFilter.Tab($tab, id);
- });
- $('tbody td.checkbox input', $modules).change(function() {
- var $checkbox = $(this);
- var key = $checkbox.parents('tr').data('indexKey');
- moduleFilter.index[key].status = $checkbox.is(':checked');
- if (Drupal.settings.moduleFilter.visualAid) {
- var type = ($checkbox.is(':checked')) ? 'enable' : 'disable';
- Drupal.ModuleFilter.updateVisualAid(type, $checkbox.parents('tr'));
- }
- });
- // Sort rows.
- var rows = $('tbody tr.module', table).get();
- rows.sort(function(a, b) {
- var compA = $('td:nth(1)', a).text().toLowerCase();
- var compB = $('td:nth(1)', b).text().toLowerCase();
- return (compA < compB) ? -1 : (compA > compB) ? 1 : 0;
- });
- $.each(rows, function(idx, itm) { table.append(itm); });
- // Re-stripe rows.
- $('tr.module', table)
- .removeClass('odd even')
- .filter(':odd').addClass('even').end()
- .filter(':even').addClass('odd');
- moduleFilter.adjustHeight();
- moduleFilter.element.bind('moduleFilter:start', function() {
- moduleFilter.tabResults = {
- 'all-tab': { items: {}, count: 0 },
- 'recent-tab': { items: {}, count: 0 },
- 'new-tab': { items: {}, count: 0 }
- };
- // Empty result info from tabs.
- for (var i in Drupal.ModuleFilter.tabs) {
- if (Drupal.ModuleFilter.tabs[i].resultInfo != undefined) {
- Drupal.ModuleFilter.tabs[i].resultInfo.empty();
- }
- }
- });
- moduleFilter.element.bind('moduleFilter:finish', function(e, data) {
- $.each(moduleFilter.index, function(key, item) {
- if (!item.element.hasClass('js-hide')) {
- var id = Drupal.ModuleFilter.getTabID(item.element);
- if (moduleFilter.tabResults[id] == undefined) {
- moduleFilter.tabResults[id] = { items: {}, count: 0 };
- }
- if (moduleFilter.tabResults[id].items[item.key] == undefined) {
- // All tab
- moduleFilter.tabResults['all-tab'].count++;
- // Recent tab
- if (item.element.hasClass('recent-module')) {
- moduleFilter.tabResults['recent-tab'].count++;
- }
- // New tab
- if (item.element.hasClass('new-module')) {
- moduleFilter.tabResults['new-tab'].count++;
- }
- moduleFilter.tabResults[id].items[item.key] = item;
- moduleFilter.tabResults[id].count++;
- }
- if (Drupal.ModuleFilter.activeTab != undefined && Drupal.ModuleFilter.activeTab.id != 'all-tab') {
- if ((Drupal.ModuleFilter.activeTab.id == 'recent-tab' && !item.element.hasClass('recent-module')) || (Drupal.ModuleFilter.activeTab.id == 'new-tab' && !item.element.hasClass('new-module')) || (Drupal.ModuleFilter.activeTab.id != 'recent-tab' && Drupal.ModuleFilter.activeTab.id != 'new-tab' && id != Drupal.ModuleFilter.activeTab.id)) {
- // The item is not in the active tab, so hide it.
- item.element.addClass('js-hide');
- }
- }
- }
- });
- if (Drupal.settings.moduleFilter.visualAid) {
- if (moduleFilter.text) {
- // Add result info to tabs.
- for (var id in moduleFilter.tabResults) {
- var tab = Drupal.ModuleFilter.tabs[id];
- if (tab.resultInfo == undefined) {
- var resultInfo = '<span class="result-info"></span>'
- $('a', tab.element).prepend(resultInfo);
- tab.resultInfo = $('span.result-info', tab.element);
- }
- tab.resultInfo.append(moduleFilter.tabResults[id].count);
- }
- if (Drupal.settings.moduleFilter.hideEmptyTabs) {
- for (var id in Drupal.ModuleFilter.tabs) {
- if (moduleFilter.tabResults[id] != undefined) {
- Drupal.ModuleFilter.tabs[id].element.show();
- }
- else if (Drupal.ModuleFilter.activeTab == undefined || Drupal.ModuleFilter.activeTab.id != id) {
- Drupal.ModuleFilter.tabs[id].element.hide();
- }
- }
- }
- }
- else {
- // Make sure all tabs are visible.
- if (Drupal.settings.moduleFilter.hideEmptyTabs) {
- $('#module-filter-tabs li').show();
- }
- }
- }
- if ((Drupal.ModuleFilter.activeTab != undefined && (moduleFilter.tabResults[Drupal.ModuleFilter.activeTab.id] == undefined || moduleFilter.tabResults[Drupal.ModuleFilter.activeTab.id].count <= 0))) {
- // The current tab contains no results.
- moduleFilter.results = 0;
- }
- moduleFilter.adjustHeight();
- });
- if (Drupal.settings.moduleFilter.useURLFragment) {
- $(window).bind('hashchange.module-filter', $.proxy(Drupal.ModuleFilter, 'eventHandlerOperateByURLFragment')).triggerHandler('hashchange.module-filter');
- }
- else {
- Drupal.ModuleFilter.selectTab();
- }
- if (Drupal.settings.moduleFilter.useSwitch) {
- $('td.checkbox div.form-item', table).hide();
- $('td.checkbox', table).each(function(i) {
- var $cell = $(this);
- var $checkbox = $(':checkbox', $cell);
- var $switch = $('.toggle-enable', $cell);
- $switch.removeClass('js-hide').click(function() {
- if (!$(this).hasClass('disabled')) {
- if (Drupal.ModuleFilter.jQueryIsNewer()) {
- $checkbox.click();
- $switch.toggleClass('off');
- }
- else {
- $checkbox.click().change();
- $switch.toggleClass('off');
- }
- }
- });
- });
- }
- var $tabs = $('#module-filter-tabs');
- function getParentTopOffset($obj, offset) {
- var $parent = $obj.offsetParent();
- if ($obj[0] != $parent[0]) {
- offset += $parent.position().top;
- return getParentTopOffset($parent, offset);
- }
- return offset;
- }
- var tabsTopOffset = null;
- function getParentsTopOffset() {
- if (tabsTopOffset === null) {
- tabsTopOffset = getParentTopOffset($tabs.parent(), 0);
- }
- return tabsTopOffset;
- }
- function viewportTop() {
- var top = $(window).scrollTop();
- return top;
- }
- function viewportBottom() {
- var top = $(window).scrollTop();
- var bottom = top + $(window).height();
- bottom -= $('#page-actions').height();
- return bottom;
- }
- function fixToTop(top) {
- if ($tabs.hasClass('bottom-fixed')) {
- $tabs.css({
- 'position': 'absolute',
- 'top': $tabs.position().top - getParentsTopOffset(),
- 'bottom': 'auto'
- });
- $tabs.removeClass('bottom-fixed');
- }
- if (($tabs.css('position') == 'absolute' && $tabs.offset().top - top >= 0) || ($tabs.css('position') != 'absolute' && $tabs.offset().top - top <= 0)) {
- $tabs.addClass('top-fixed');
- $tabs.attr('style', '');
- }
- }
- function fixToBottom(bottom) {
- if ($tabs.hasClass('top-fixed')) {
- $tabs.css({
- 'position': 'absolute',
- 'top': $tabs.position().top - getParentsTopOffset(),
- 'bottom': 'auto'
- });
- $tabs.removeClass('top-fixed');
- }
- if ($tabs.offset().top + $tabs.height() - bottom <= 0) {
- $tabs.addClass('bottom-fixed');
- var style = '';
- var pageActionsHeight = $('#page-actions').height();
- if (pageActionsHeight > 0) {
- style = 'bottom: ' + pageActionsHeight + 'px';
- }
- else if (Drupal.settings.moduleFilter.dynamicPosition) {
- // style = 'bottom: ' + $('#module-filter-submit', $tabs).height() + 'px';
- }
- $tabs.attr('style', style);
- }
- }
- var lastTop = 0;
- $(window).scroll(function() {
- var top = viewportTop();
- var bottom = viewportBottom();
- if ($modules.offset().top >= top) {
- $tabs.removeClass('top-fixed').attr('style', '');
- }
- else {
- if (top > lastTop) { // Downward scroll.
- if ($tabs.height() > bottom - top) {
- fixToBottom(bottom);
- }
- else {
- fixToTop(top);
- }
- }
- else { // Upward scroll.
- fixToTop(top);
- }
- }
- lastTop = top;
- });
- moduleFilter.adjustHeight();
- });
- }
- }
- };
- Drupal.ModuleFilter.Tab = function(element, id) {
- var self = this;
- this.id = id;
- this.hash = id.substring(0, id.length - 4);
- this.element = element;
- $('a', this.element).click(function() {
- if (!Drupal.settings.moduleFilter.useURLFragment) {
- var hash = (!self.element.hasClass('selected')) ? self.hash : 'all';
- Drupal.ModuleFilter.selectTab(hash);
- return false;
- }
- if (self.element.hasClass('selected')) {
- // Clear the active tab.
- window.location.hash = 'all';
- return false;
- }
- });
- $('tr.' + this.id, $('#system-modules')).hover(
- function() {
- self.element.addClass('suggest');
- },
- function() {
- self.element.removeClass('suggest');
- }
- );
- };
- Drupal.ModuleFilter.selectTab = function(hash) {
- if (!hash || Drupal.ModuleFilter.tabs[hash + '-tab'] == undefined || Drupal.settings.moduleFilter.enabledCounts[hash].total == 0) {
- if (Drupal.settings.moduleFilter.rememberActiveTab) {
- var activeTab = Drupal.ModuleFilter.getState('activeTab');
- if (activeTab && Drupal.ModuleFilter.tabs[activeTab + '-tab'] != undefined) {
- hash = activeTab;
- }
- }
- if (!hash) {
- hash = 'all';
- }
- }
- if (Drupal.ModuleFilter.activeTab != undefined) {
- Drupal.ModuleFilter.activeTab.element.removeClass('selected');
- }
- Drupal.ModuleFilter.activeTab = Drupal.ModuleFilter.tabs[hash + '-tab'];
- Drupal.ModuleFilter.activeTab.element.addClass('selected');
- var moduleFilter = $('input[name="module_filter[name]"]').data('moduleFilter');
- var filter = moduleFilter.applyFilter();
- if (!Drupal.ModuleFilter.modulesTop) {
- Drupal.ModuleFilter.modulesTop = $('#module-filter-modules').offset().top;
- }
- else {
- // Calculate header offset; this is important in case the site is using
- // admin_menu module which has fixed positioning and is on top of everything
- // else.
- var headerOffset = Drupal.settings.tableHeaderOffset ? eval(Drupal.settings.tableHeaderOffset + '()') : 0;
- // Scroll back to top of #module-filter-modules.
- $('html, body').animate({
- scrollTop: Drupal.ModuleFilter.modulesTop - headerOffset
- }, 500);
- // $('html, body').scrollTop(Drupal.ModuleFilter.modulesTop);
- }
- Drupal.ModuleFilter.setState('activeTab', hash);
- };
- Drupal.ModuleFilter.eventHandlerOperateByURLFragment = function(event) {
- var hash = $.param.fragment();
- Drupal.ModuleFilter.selectTab(hash);
- };
- Drupal.ModuleFilter.countSummary = function(id) {
- return Drupal.t('@enabled of @total', { '@enabled': Drupal.settings.moduleFilter.enabledCounts[id].enabled, '@total': Drupal.settings.moduleFilter.enabledCounts[id].total });
- };
- Drupal.ModuleFilter.Tab.prototype.updateEnabling = function(name, remove) {
- this.enabling = this.enabling || {};
- if (!remove) {
- this.enabling[name] = name;
- }
- else {
- delete this.enabling[name];
- }
- };
- Drupal.ModuleFilter.Tab.prototype.updateDisabling = function(name, remove) {
- this.disabling = this.disabling || {};
- if (!remove) {
- this.disabling[name] = name;
- }
- else {
- delete this.disabling[name];
- }
- };
- Drupal.ModuleFilter.Tab.prototype.updateVisualAid = function() {
- var visualAid = '';
- var enabling = new Array();
- var disabling = new Array();
- if (this.enabling != undefined) {
- for (var i in this.enabling) {
- enabling.push(this.enabling[i]);
- }
- if (enabling.length > 0) {
- enabling.sort();
- visualAid += '<span class="enabling">+' + enabling.join('</span>, <span class="enabling">') + '</span>';
- }
- }
- if (this.disabling != undefined) {
- for (var i in this.disabling) {
- disabling.push(this.disabling[i]);
- }
- if (disabling.length > 0) {
- disabling.sort();
- if (enabling.length > 0) {
- visualAid += '<br />';
- }
- visualAid += '<span class="disabling">-' + disabling.join('</span>, <span class="disabling">') + '</span>';
- }
- }
- if (this.visualAid == undefined) {
- $('a span.summary', this.element).append('<span class="visual-aid"></span>');
- this.visualAid = $('span.visual-aid', this.element);
- }
- this.visualAid.empty().append(visualAid);
- };
- Drupal.ModuleFilter.getTabID = function($row) {
- var id = $row.data('moduleFilterTabID');
- if (!id) {
- // Find the tab ID.
- var classes = $row.attr('class').split(' ');
- for (var i in classes) {
- if (Drupal.ModuleFilter.tabs[classes[i]] != undefined) {
- id = classes[i];
- break;
- }
- }
- $row.data('moduleFilterTabID', id);
- }
- return id;
- };
- Drupal.ModuleFilter.updateVisualAid = function(type, $row) {
- var id = Drupal.ModuleFilter.getTabID($row);
- if (!id) {
- return false;
- }
- var tab = Drupal.ModuleFilter.tabs[id];
- var name = Drupal.checkPlain($('td:nth(1) strong', $row).text());
- switch (type) {
- case 'enable':
- if (Drupal.ModuleFilter.disabling[id + name] != undefined) {
- delete Drupal.ModuleFilter.disabling[id + name];
- tab.updateDisabling(name, true);
- $row.removeClass('disabling');
- }
- else {
- Drupal.ModuleFilter.enabling[id + name] = name;
- tab.updateEnabling(name);
- $row.addClass('enabling');
- }
- break;
- case 'disable':
- if (Drupal.ModuleFilter.enabling[id + name] != undefined) {
- delete Drupal.ModuleFilter.enabling[id + name];
- tab.updateEnabling(name, true);
- $row.removeClass('enabling');
- }
- else {
- Drupal.ModuleFilter.disabling[id + name] = name;
- tab.updateDisabling(name);
- $row.addClass('disabling');
- }
- break;
- }
- tab.updateVisualAid();
- };
- Drupal.ModuleFilter.Filter.prototype.adjustHeight = function() {
- // Hack for adjusting the height of the modules section.
- var minHeight = $('#module-filter-tabs ul').height() + 10;
- minHeight += $('#module-filter-tabs #module-filter-submit').height();
- $('#module-filter-modules').css('min-height', minHeight);
- this.element.trigger('moduleFilter:adjustHeight');
- }
- })(jQuery);
|