Skip to content
Snippets Groups Projects
Commit 376bf144 authored by Aleksey Tkachenko's avatar Aleksey Tkachenko
Browse files

Issue #2141121 by shumushin: Initial D8 port

parent 429c5cee
No related branches found
No related tags found
No related merge requests found
Showing
with 545 additions and 581 deletions
Module Filter 8.x-1.x, 2016-10-28
---------------------------------
Issue #2141121 by shumushin: Initial D8 port
Module Filter 7.x-2.x, 2016-03-20
---------------------------------
Issue #2452067 by Madis: Option to show description expanded as default
......
......@@ -33,7 +33,7 @@ Configuration
-------------
To enable and configure this module do the following:
1. Go to Admin -> Modules, and enable Module Filter.
1. Go to Admin -> Extend, and enable Module Filter.
2. Go to Admin -> Configuration -> User interface -> Module filter, and make
any necessary configuration changes.
......
{
"name": "drupal/module_filter",
"description": "Configure how the modules page looks and acts",
"type": "drupal-module",
"homepage": "https://www.drupal.org/project/module_filter",
"authors": [
{
"name": "Sergey Krasulevskiy",
"homepage": "https://www.drupal.org/u/skrasulevskiy",
"role": "Maintainer"
},
{
"name": "Alex Shipilov",
"homepage": "https://www.drupal.org/u/alexshipilov",
}
],
"support": {
"issues": "https://www.drupal.org/project/issues/module_filter"
},
"license": "GPL-2.0+",
"minimum-stability": "dev",
"require": {}
}
module_filter_visual_aid: true
module_filter_hide_empty_tabs: false
module_filter_dynamic_save_position: true
module_filter_use_url_fragment: true
module_filter_use_switch: true
module_filter_set_focus: true
module_filter_track_recent_modules: true
module_filter_remember_active_tab: true
module_filter_remember_update_state: false
module_filter_tabs: true
module_filter_count_enabled: true
module_filter_recent_modules: { }
module_filter.settings:
type: mapping
label: Settings
mapping:
module_filter_visual_aid:
type: boolean
module_filter_hide_empty_tabs:
type: boolean
module_filter_dynamic_save_position:
type: boolean
module_filter_use_url_fragment:
type: boolean
module_filter_use_switch:
type: boolean
module_filter_set_focus:
type: boolean
module_filter_track_recent_modules:
type: boolean
module_filter_remember_active_tab:
type: boolean
module_filter_remember_update_state:
type: boolean
module_filter_tabs:
type: boolean
module_filter_count_enabled:
type: boolean
module_filter_recent_modules:
type: sequence
sequence:
- type: integer
......@@ -18,3 +18,6 @@
text-transform: uppercase;
color: #888;
}
#module-filter-wrapper .links .dropbutton-widget {
background-color: #f3f4ee;
}
......@@ -7,9 +7,6 @@
#system-modules th.name {
width: 25%;
}
#system-modules th.version {
width: 10%;
}
#system-modules th.links {
width: 15%;
}
......@@ -17,12 +14,12 @@
vertical-align: top;
}
#system-modules .expand.inner {
background: transparent url(../images/collapsed.png) left 0.6em no-repeat;
background: transparent url(/core/misc/menu-collapsed.png) left 0.6em no-repeat;
margin-left: -12px;
padding-left: 12px;
}
#system-modules .expanded.expand.inner {
background: transparent url(../images/expanded.png) left 0.6em no-repeat;
background: transparent url(/core/misc/menu-expanded.png) left 0.6em no-repeat;
}
#system-modules .description {
cursor: pointer;
......@@ -32,9 +29,6 @@
text-overflow: ellipsis;
white-space: nowrap;
}
#system-modules .description .inner.expanded > * {
cursor: auto;
}
#system-modules .description .requirements,
#system-modules .description .links {
display: none;
......@@ -51,3 +45,6 @@
padding: 5px 0;
max-width: 490px;
}
#system-modules td.links {
overflow: visible;
}
......@@ -16,3 +16,6 @@ p.module-filter-no-results {
clear: both;
padding-top: 30px;
}
.module-filter-inputs-wrapper {
display: block;
}
images/collapsed.png

105 B

images/expanded.png

106 B

(function($) {
(function($, Drupal) {
Drupal.behaviors.moduleFilterDynamicPosition = {
attach: function(context) {
var $window = $(window);
Drupal.behaviors.moduleFilterDynamicPosition = {
attach: function(context) {
var $window = $(window);
$(context).find('#module-filter-wrapper').once('dynamic-position').each(function() {
// Move the submit button just below the tabs.
$('#module-filter-tabs').append($('#module-filter-submit'));
$('#module-filter-wrapper', context).once('dynamic-position', function() {
// Move the submit button just below the tabs.
$('#module-filter-tabs').append($('#module-filter-submit'));
var positionSubmit = function() {
var $tabs = $('#module-filter-tabs');
var $submit = $('#module-filter-submit', $tabs);
var positionSubmit = function() {
var $tabs = $('#module-filter-tabs');
var $submit = $('#module-filter-submit', $tabs);
// Vertical movement.
var bottom = $tabs.offset().top + $tabs.outerHeight();
if ($submit.hasClass('fixed-bottom')) {
bottom += $submit.height();
}
if (bottom >= $window.height() + $window.scrollTop()) {
$submit.addClass('fixed fixed-bottom');
$tabs.css('padding-bottom', $submit.height());
}
else {
$submit.removeClass('fixed fixed-bottom');
$tabs.css('padding-bottom', 0);
}
// Vertical movement.
var bottom = $tabs.offset().top + $tabs.outerHeight();
if ($submit.hasClass('fixed-bottom')) {
bottom += $submit.height();
}
if (bottom >= $window.height() + $window.scrollTop()) {
$submit.addClass('fixed fixed-bottom');
$tabs.css('padding-bottom', $submit.height());
}
else {
$submit.removeClass('fixed fixed-bottom');
$tabs.css('padding-bottom', 0);
}
// Horizontal movement.
if ($submit.hasClass('fixed-bottom') || $submit.hasClass('fixed-top')) {
var left = $tabs.offset().left - $window.scrollLeft();
if (left != $submit.offset().left - $window.scrollLeft()) {
$submit.css('left', left);
// Horizontal movement.
if ($submit.hasClass('fixed-bottom') || $submit.hasClass('fixed-top')) {
var left = $tabs.offset().left - $window.scrollLeft();
if (left != $submit.offset().left - $window.scrollLeft()) {
$submit.css('left', left);
}
}
}
};
};
// Control the positioning.
$window.scroll(positionSubmit);
$window.resize(positionSubmit);
var moduleFilter = $('input[name="module_filter[name]"]').data('moduleFilter');
moduleFilter.element.bind('moduleFilter:adjustHeight', positionSubmit);
moduleFilter.adjustHeight();
});
}
};
// Control the positioning.
$window.scroll(positionSubmit);
$window.resize(positionSubmit);
var moduleFilter = $('input[name="module_filter[name]"]').data('moduleFilter');
moduleFilter.element.bind('moduleFilter:adjustHeight', positionSubmit);
moduleFilter.adjustHeight();
});
}
};
})(jQuery);
})(jQuery, Drupal);
(function ($) {
Drupal.ModuleFilter = {};
Drupal.ModuleFilter.explode = function(string) {
var queryArray = string.match(/([a-zA-Z]+\:(\w+|"[^"]+")*)|\w+|"[^"]+"/g);
if (!queryArray) {
queryArray = new Array();
}
var i = queryArray.length;
while (i--) {
queryArray[i] = queryArray[i].replace(/"/g, "");
}
return queryArray;
};
Drupal.ModuleFilter.getState = function(key) {
if (!Drupal.ModuleFilter.state) {
Drupal.ModuleFilter.state = {};
var cookie = $.cookie('DrupalModuleFilter');
var query = cookie ? cookie.split('&') : [];
if (query) {
for (var i in query) {
// Extra check to avoid js errors in Chrome, IE and Safari when
// combined with JS like twitter's widget.js.
// See http://drupal.org/node/798764.
if (typeof(query[i]) == 'string' && query[i].indexOf('=') != -1) {
var values = query[i].split('=');
if (values.length === 2) {
Drupal.ModuleFilter.state[values[0]] = values[1];
}
}
}
(function ($, Drupal, drupalSettings) {
Drupal.ModuleFilter = {};
Drupal.ModuleFilter.explode = function(string) {
var queryArray = string.match(/([a-zA-Z]+\:(\w+|"[^"]+")*)|\w+|"[^"]+"/g);
if (!queryArray) {
queryArray = new Array();
}
}
return Drupal.ModuleFilter.state[key] ? Drupal.ModuleFilter.state[key] : false;
};
Drupal.ModuleFilter.setState = function(key, value) {
var existing = Drupal.ModuleFilter.getState(key);
if (existing != value) {
Drupal.ModuleFilter.state[key] = value;
var query = [];
for (var i in Drupal.ModuleFilter.state) {
query.push(i + '=' + Drupal.ModuleFilter.state[i]);
var i = queryArray.length;
while (i--) {
queryArray[i] = queryArray[i].replace(/"/g, "");
}
$.cookie('DrupalModuleFilter', query.join('&'), { expires: 7, path: '/' });
}
};
Drupal.ModuleFilter.Filter = function(element, selector, options) {
var self = this;
this.element = element;
this.text = $(this.element).val();
this.settings = Drupal.settings.moduleFilter;
this.selector = selector;
this.options = $.extend({
delay: 500,
striping: false,
childSelector: null,
empty: Drupal.t('No results'),
rules: new Array()
}, options);
if (this.options.wrapper == undefined) {
this.options.wrapper = $(self.selector).parent();
}
// Add clear button.
this.element.after('<div class="module-filter-clear"><a href="#" class="js-hide">' + Drupal.t('clear') + '</a></div>');
if (this.text) {
$('.module-filter-clear a', this.element.parent()).removeClass('js-hide');
}
$('.module-filter-clear a', this.element.parent()).click(function() {
self.element.val('');
self.text = '';
delete self.queries;
self.applyFilter();
self.element.focus();
$(this).addClass('js-hide');
return false;
});
this.updateQueries = function() {
var queryStrings = Drupal.ModuleFilter.explode(self.text);
self.queries = new Array();
for (var i in queryStrings) {
var query = { operator: 'text', string: queryStrings[i] };
if (self.operators != undefined) {
// Check if an operator is possibly used.
if (queryStrings[i].indexOf(':') > 0) {
// Determine operator used.
var args = queryStrings[i].split(':', 2);
var operator = args.shift();
if (self.operators[operator] != undefined) {
query.operator = operator;
query.string = args.shift();
return queryArray;
};
Drupal.ModuleFilter.getState = function(key) {
if (!Drupal.ModuleFilter.state) {
Drupal.ModuleFilter.state = {};
var cookie = $.cookie('DrupalModuleFilter');
var query = cookie ? cookie.split('&') : [];
if (query) {
for (var i in query) {
// Extra check to avoid js errors in Chrome, IE and Safari when
// combined with JS like twitter's widget.js.
// See http://drupal.org/node/798764.
if (typeof(query[i]) == 'string' && query[i].indexOf('=') != -1) {
var values = query[i].split('=');
if (values.length === 2) {
Drupal.ModuleFilter.state[values[0]] = values[1];
}
}
}
}
query.string = query.string.toLowerCase();
self.queries.push(query);
}
return Drupal.ModuleFilter.state[key] ? Drupal.ModuleFilter.state[key] : false;
};
if (self.queries.length <= 0) {
// Add a blank string query.
self.queries.push({ operator: 'text', string: '' });
Drupal.ModuleFilter.setState = function(key, value) {
var existing = Drupal.ModuleFilter.getState(key);
if (existing != value) {
Drupal.ModuleFilter.state[key] = value;
var query = [];
for (var i in Drupal.ModuleFilter.state) {
query.push(i + '=' + Drupal.ModuleFilter.state[i]);
}
$.cookie('DrupalModuleFilter', query.join('&'), { expires: 7, path: '/' });
}
};
this.applyFilter = function() {
self.results = new Array();
Drupal.ModuleFilter.Filter = function(element, selector, options) {
var self = this;
self.updateQueries();
this.element = element;
this.text = $(this.element).val();
if (self.index == undefined) {
self.buildIndex();
}
this.settings = drupalSettings.moduleFilter;
self.element.trigger('moduleFilter:start');
this.selector = selector;
$.each(self.index, function(key, item) {
var $item = item.element;
this.options = $.extend({
delay: 500,
striping: false,
childSelector: null,
empty: Drupal.t('No results'),
rules: new Array()
}, options);
if (this.options.wrapper == undefined) {
this.options.wrapper = $(self.selector).parent();
}
for (var i in self.queries) {
var query = self.queries[i];
if (query.operator == 'text') {
if (item.text.indexOf(query.string) < 0) {
continue;
}
}
else {
var func = self.operators[query.operator];
if (!(func(query.string, self, item))) {
continue;
// Add clear button.
this.element.after('<div class="module-filter-clear"><a href="#" class="js-hide">' + Drupal.t('clear') + '</a></div>');
if (this.text) {
$('.module-filter-clear a', this.element.parent()).removeClass('js-hide');
}
$('.module-filter-clear a', this.element.parent()).click(function() {
self.element.val('');
self.text = '';
delete self.queries;
self.applyFilter();
self.element.focus();
$(this).addClass('js-hide');
return false;
});
this.updateQueries = function() {
var queryStrings = Drupal.ModuleFilter.explode(self.text);
self.queries = new Array();
for (var i in queryStrings) {
var query = { operator: 'text', string: queryStrings[i] };
if (self.operators != undefined) {
// Check if an operator is possibly used.
if (queryStrings[i].indexOf(':') > 0) {
// Determine operator used.
var args = queryStrings[i].split(':', 2);
var operator = args.shift();
if (self.operators[operator] != undefined) {
query.operator = operator;
query.string = args.shift();
}
}
}
var rulesResult = self.processRules(item);
if (rulesResult !== false) {
return true;
}
query.string = query.string.toLowerCase();
self.queries.push(query);
}
$item.addClass('js-hide');
});
if (self.queries.length <= 0) {
// Add a blank string query.
self.queries.push({ operator: 'text', string: '' });
}
};
self.element.trigger('moduleFilter:finish', { results: self.results });
this.applyFilter = function() {
self.results = new Array();
if (self.options.striping) {
self.stripe();
}
self.updateQueries();
if (self.results.length > 0) {
self.options.wrapper.find('.module-filter-no-results').remove();
}
else {
if (!self.options.wrapper.find('.module-filter-no-results').length) {
self.options.wrapper.append($('<p class="module-filter-no-results"/>').text(self.options.empty));
};
}
};
if (self.index == undefined) {
self.buildIndex();
}
self.element.keyup(function(e) {
switch (e.which) {
case 13:
if (self.timeOut) {
clearTimeout(self.timeOut);
}
self.applyFilter();
break;
default:
if (self.text != $(this).val()) {
if (self.timeOut) {
clearTimeout(self.timeOut);
}
self.element.trigger('moduleFilter:start');
self.text = $(this).val();
$.each(self.index, function(key, item) {
var $item = item.element;
if (self.text) {
self.element.parent().find('.module-filter-clear a').removeClass('js-hide');
for (var i in self.queries) {
var query = self.queries[i];
if (query.operator == 'text') {
if (item.text.indexOf(query.string) < 0) {
continue;
}
}
else {
self.element.parent().find('.module-filter-clear a').addClass('js-hide');
var func = self.operators[query.operator];
if (!(func(query.string, self, item))) {
continue;
}
}
self.element.trigger('moduleFilter:keyup');
var rulesResult = self.processRules(item);
if (rulesResult !== false) {
return true;
}
}
self.timeOut = setTimeout(self.applyFilter, self.options.delay);
$item.addClass('js-hide');
});
self.element.trigger('moduleFilter:finish', { results: self.results });
if (self.options.striping) {
self.stripe();
}
if (self.results.length > 0) {
self.options.wrapper.find('.module-filter-no-results').remove();
}
else {
if (!self.options.wrapper.find('.module-filter-no-results').length) {
self.options.wrapper.append($('<p class="module-filter-no-results"/>').text(self.options.empty));
};
}
};
self.element.keyup(function(e) {
switch (e.which) {
case 13:
if (self.timeOut) {
clearTimeout(self.timeOut);
}
self.applyFilter();
break;
default:
if (self.text != $(this).val()) {
if (self.timeOut) {
clearTimeout(self.timeOut);
}
self.text = $(this).val();
if (self.text) {
self.element.parent().find('.module-filter-clear a').removeClass('js-hide');
}
else {
self.element.parent().find('.module-filter-clear a').addClass('js-hide');
}
self.element.trigger('moduleFilter:keyup');
self.timeOut = setTimeout(self.applyFilter, self.options.delay);
}
break;
}
});
self.element.keypress(function(e) {
if (e.which == 13) e.preventDefault();
});
};
Drupal.ModuleFilter.Filter.prototype.buildIndex = function() {
var self = this;
var index = new Array();
$(this.selector).each(function(i) {
var text = (self.options.childSelector) ? $(self.options.childSelector, this).text() : $(this).text();
var item = {
key: i,
element: $(this),
text: text.toLowerCase()
};
for (var j in self.options.buildIndex) {
var func = self.options.buildIndex[j];
item = $.extend(func(self, item), item);
}
$(this).data('indexKey', i);
index.push(item);
delete item;
});
this.index = index;
};
Drupal.ModuleFilter.Filter.prototype.processRules = function(item) {
var self = this;
var $item = item.element;
var rulesResult = true;
if (self.options.rules.length > 0) {
for (var i in self.options.rules) {
var func = self.options.rules[i];
rulesResult = func(self, item);
if (rulesResult === false) {
break;
}
break;
}
}
});
self.element.keypress(function(e) {
if (e.which == 13) e.preventDefault();
});
};
Drupal.ModuleFilter.Filter.prototype.buildIndex = function() {
var self = this;
var index = new Array();
$(this.selector).each(function(i) {
var text = (self.options.childSelector) ? $(self.options.childSelector, this).text() : $(this).text();
var item = {
key: i,
element: $(this),
text: text.toLowerCase()
};
for (var j in self.options.buildIndex) {
var func = self.options.buildIndex[j];
item = $.extend(func(self, item), item);
if (rulesResult !== false) {
$item.removeClass('js-hide');
self.results.push(item);
}
$(this).data('indexKey', i);
index.push(item);
delete item;
});
this.index = index;
};
Drupal.ModuleFilter.Filter.prototype.processRules = function(item) {
var self = this;
var $item = item.element;
var rulesResult = true;
if (self.options.rules.length > 0) {
for (var i in self.options.rules) {
var func = self.options.rules[i];
rulesResult = func(self, item);
if (rulesResult === false) {
break;
return rulesResult;
};
Drupal.ModuleFilter.Filter.prototype.stripe = function() {
var self = this;
var flip = { even: 'odd', odd: 'even' };
var stripe = 'odd';
$.each(self.index, function(key, item) {
if (!item.element.hasClass('js-hide')) {
item.element.removeClass('odd even')
.addClass(stripe);
stripe = flip[stripe];
}
});
};
$.fn.moduleFilter = function(selector, options) {
var filterInput = this;
filterInput.parents('.module-filter-inputs-wrapper').show();
if (drupalSettings.moduleFilter.setFocus) {
filterInput.focus();
}
}
if (rulesResult !== false) {
$item.removeClass('js-hide');
self.results.push(item);
}
return rulesResult;
};
Drupal.ModuleFilter.Filter.prototype.stripe = function() {
var self = this;
var flip = { even: 'odd', odd: 'even' };
var stripe = 'odd';
$.each(self.index, function(key, item) {
if (!item.element.hasClass('js-hide')) {
item.element.removeClass('odd even')
.addClass(stripe);
stripe = flip[stripe];
}
});
};
$.fn.moduleFilter = function(selector, options) {
var filterInput = this;
filterInput.parents('.module-filter-inputs-wrapper').show();
if (Drupal.settings.moduleFilter.setFocus) {
filterInput.focus();
}
if (Drupal.settings.moduleFilter.expandedDescription) {
$('#system-modules td.description .inner.expand').addClass('expanded');
}
filterInput.data('moduleFilter', new Drupal.ModuleFilter.Filter(this, selector, options));
};
})(jQuery);
filterInput.data('moduleFilter', new Drupal.ModuleFilter.Filter(this, selector, options));
};
})(jQuery, Drupal, drupalSettings);
(function ($) {
(function ($, Drupal, drupalSettings) {
Drupal.ModuleFilter.tabs = {};
Drupal.ModuleFilter.enabling = {};
......@@ -41,8 +41,9 @@ Drupal.ModuleFilter.jQueryIsNewer = function() {
Drupal.behaviors.moduleFilterTabs = {
attach: function(context) {
if (Drupal.settings.moduleFilter.tabs) {
$('#module-filter-wrapper table:not(.sticky-header)', context).once('module-filter-tabs', function() {
if (drupalSettings.moduleFilter.tabs) {
$(context).find('#module-filter-wrapper table:not(.sticky-header)').once('module-filter-tabs').each(function() {
//$('#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);
......@@ -56,13 +57,13 @@ Drupal.behaviors.moduleFilterTabs = {
// Build tabs from package title rows.
var tabs = '<ul>';
for (var i in Drupal.settings.moduleFilter.packageIDs) {
var id = Drupal.settings.moduleFilter.packageIDs[i];
for (var i in drupalSettings.moduleFilter.packageIDs) {
var id = drupalSettings.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>' : '';
var summary = (drupalSettings.moduleFilter.countEnabled) ? '<span class="count">' + Drupal.ModuleFilter.countSummary(id) + '</span>' : '';
switch (id) {
case 'all':
......@@ -71,7 +72,7 @@ Drupal.behaviors.moduleFilterTabs = {
case 'new':
name = Drupal.t('New');
title = Drupal.t('Modules installed within the last week.');
if (Drupal.settings.moduleFilter.enabledCounts['new'].total == 0) {
if (drupalSettings.moduleFilter.enabledCounts['new'].total == 0) {
tabClass += ' disabled';
summary += '<span>' + Drupal.t('No modules added within the last week.') + '</span>';
}
......@@ -79,7 +80,7 @@ Drupal.behaviors.moduleFilterTabs = {
case 'recent':
name = Drupal.t('Recent');
title = Drupal.t('Modules enabled/disabled within the last week.');
if (Drupal.settings.moduleFilter.enabledCounts['recent'].total == 0) {
if (drupalSettings.moduleFilter.enabledCounts['recent'].total == 0) {
tabClass += ' disabled';
summary += '<span>' + Drupal.t('No modules were enabled or disabled within the last week.') + '</span>';
}
......@@ -110,7 +111,7 @@ Drupal.behaviors.moduleFilterTabs = {
moduleFilter.index[key].status = $checkbox.is(':checked');
if (Drupal.settings.moduleFilter.visualAid) {
if (drupalSettings.moduleFilter.visualAid) {
var type = ($checkbox.is(':checked')) ? 'enable' : 'disable';
Drupal.ModuleFilter.updateVisualAid(type, $checkbox.parents('tr'));
}
......@@ -183,7 +184,7 @@ Drupal.behaviors.moduleFilterTabs = {
}
});
if (Drupal.settings.moduleFilter.visualAid) {
if (drupalSettings.moduleFilter.visualAid) {
if (moduleFilter.text) {
// Add result info to tabs.
for (var id in moduleFilter.tabResults) {
......@@ -198,7 +199,7 @@ Drupal.behaviors.moduleFilterTabs = {
tab.resultInfo.append(moduleFilter.tabResults[id].count);
}
if (Drupal.settings.moduleFilter.hideEmptyTabs) {
if (drupalSettings.moduleFilter.hideEmptyTabs) {
for (var id in Drupal.ModuleFilter.tabs) {
if (moduleFilter.tabResults[id] != undefined) {
Drupal.ModuleFilter.tabs[id].element.show();
......@@ -211,7 +212,7 @@ Drupal.behaviors.moduleFilterTabs = {
}
else {
// Make sure all tabs are visible.
if (Drupal.settings.moduleFilter.hideEmptyTabs) {
if (drupalSettings.moduleFilter.hideEmptyTabs) {
$('#module-filter-tabs li').show();
}
}
......@@ -225,14 +226,14 @@ Drupal.behaviors.moduleFilterTabs = {
moduleFilter.adjustHeight();
});
if (Drupal.settings.moduleFilter.useURLFragment) {
if (drupalSettings.moduleFilter.useURLFragment) {
$(window).bind('hashchange.module-filter', $.proxy(Drupal.ModuleFilter, 'eventHandlerOperateByURLFragment')).triggerHandler('hashchange.module-filter');
}
else {
Drupal.ModuleFilter.selectTab();
}
if (Drupal.settings.moduleFilter.useSwitch) {
if (drupalSettings.moduleFilter.useSwitch) {
$('td.checkbox div.form-item').hide();
$('td.checkbox').each(function(i) {
var $cell = $(this);
......@@ -242,14 +243,17 @@ Drupal.behaviors.moduleFilterTabs = {
if (!$(this).hasClass('disabled')) {
if (Drupal.ModuleFilter.jQueryIsNewer()) {
$checkbox.click();
$switch.toggleClass('off');
}
else {
$checkbox.click().change();
$switch.toggleClass('off');
}
}
});
$checkbox.click(function() {
if (!$switch.hasClass('disabled')) {
$switch.toggleClass('off');
}
});
});
}
......@@ -319,7 +323,7 @@ Drupal.behaviors.moduleFilterTabs = {
if (pageActionsHeight > 0) {
style = 'bottom: ' + pageActionsHeight + 'px';
}
else if (Drupal.settings.moduleFilter.dynamicPosition) {
else if (drupalSettings.moduleFilter.dynamicPosition) {
// style = 'bottom: ' + $('#module-filter-submit', $tabs).height() + 'px';
}
$tabs.attr('style', style);
......@@ -364,7 +368,7 @@ Drupal.ModuleFilter.Tab = function(element, id) {
this.element = element;
$('a', this.element).click(function() {
if (!Drupal.settings.moduleFilter.useURLFragment) {
if (!drupalSettings.moduleFilter.useURLFragment) {
var hash = (!self.element.hasClass('selected')) ? self.hash : 'all';
Drupal.ModuleFilter.selectTab(hash);
return false;
......@@ -388,8 +392,8 @@ Drupal.ModuleFilter.Tab = function(element, id) {
};
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) {
if (!hash || Drupal.ModuleFilter.tabs[hash + '-tab'] == undefined || drupalSettings.moduleFilter.enabledCounts[hash].total == 0) {
if (drupalSettings.moduleFilter.rememberActiveTab) {
var activeTab = Drupal.ModuleFilter.getState('activeTab');
if (activeTab && Drupal.ModuleFilter.tabs[activeTab + '-tab'] != undefined) {
hash = activeTab;
......@@ -418,7 +422,7 @@ Drupal.ModuleFilter.selectTab = function(hash) {
// 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;
var headerOffset = drupalSettings.tableHeaderOffset ? eval(drupalSettings.tableHeaderOffset + '()') : 0;
// Scroll back to top of #module-filter-modules.
$('html, body').animate({
scrollTop: Drupal.ModuleFilter.modulesTop - headerOffset
......@@ -430,12 +434,12 @@ Drupal.ModuleFilter.selectTab = function(hash) {
};
Drupal.ModuleFilter.eventHandlerOperateByURLFragment = function(event) {
var hash = $.param.fragment();
var hash = window.location.hash.substring(1);//$.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 });
return Drupal.t('@enabled of @total', { '@enabled': drupalSettings.moduleFilter.enabledCounts[id].enabled, '@total': drupalSettings.moduleFilter.enabledCounts[id].total });
};
Drupal.ModuleFilter.Tab.prototype.updateEnabling = function(name, remove) {
......@@ -556,4 +560,4 @@ Drupal.ModuleFilter.Filter.prototype.adjustHeight = function() {
this.element.trigger('moduleFilter:adjustHeight');
}
})(jQuery);
})(jQuery, Drupal, drupalSettings);
(function($) {
(function($, Drupal, drupalSettings) {
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();
}
$(context).find('#system-modules td.description').once('description').each(function() {
$('.inner.expand', $(this)).click(function() {
$(this).toggleClass('expanded');
});
});
$('.module-filter-inputs-wrapper', context).once('module-filter', function() {
$(context).find('.module-filter-inputs-wrapper').once('module-filter').each(function() {
var filterInput = $('input[name="module_filter[name]"]', context);
var selector = '#system-modules table tbody tr';
if (Drupal.settings.moduleFilter.tabs) {
if (drupalSettings.moduleFilter.tabs) {
selector += '.module';
}
......@@ -133,7 +128,7 @@ Drupal.behaviors.moduleFilter = {
moduleFilter.applyFilter();
});
if (!Drupal.settings.moduleFilter.tabs) {
if (!drupalSettings.moduleFilter.tabs) {
moduleFilter.element.bind('moduleFilter:start', function() {
$('#system-modules fieldset').show();
});
......@@ -178,4 +173,4 @@ Drupal.ModuleFilter.getRequirements = function(element) {
return { requires: requires, requiredBy: requiredBy };
};
})(jQuery);
})(jQuery, Drupal, drupalSettings);
(function($) {
(function($, Drupal, drupalSettings) {
Drupal.behaviors.moduleFilterUpdateStatus = {
attach: function(context) {
$('#module-filter-update-status-form').once('update-status', function() {
$(context).find('#module-filter-update-status-form').once('update-status').each(function() {
var filterInput = $('input[name="module_filter[name]"]', context);
filterInput.moduleFilter('table.update > tbody > tr', {
wrapper: $('table.update:first').parent(),
delay: 300,
childSelector: 'div.project a',
childSelector: 'div.project-update__title a',
rules: [
function(moduleFilter, item) {
switch (moduleFilter.options.show) {
......@@ -28,90 +28,92 @@ Drupal.behaviors.moduleFilterUpdateStatus = {
return true;
}
break;
case 'unknown':
if (item.state == 'unknown') {
return true;
}
break;
// Not used.
case 'unknown':
if (item.state == 'unknown') {
return true;
}
break;
}
return false;
}
return false;
}
],
buildIndex: [
function(moduleFilter, item) {
if ($('.version-status', item.element).text() == Drupal.t('Ignored from settings')) {
item.state = 'ignored';
],
buildIndex: [
function(moduleFilter, item) {
if ($('.version-status', item.element).text() == Drupal.t('Ignored from settings')) {
item.state = 'ignored';
return item;
}
if (item.element.is('.color-success')) {
item.state = 'ok';
}
else if (item.element.is('.color-warning')) {
item.state = 'warning';
}
else if (item.element.is('.color-error')) {
item.state = 'error';
}
// Not used.
else if (item.element.is('.unknown')) {
item.state = 'unknown';
}
return item;
}
if (item.element.is('.ok')) {
item.state = 'ok';
}
else if (item.element.is('.warning')) {
item.state = 'warning';
}
else if (item.element.is('.error')) {
item.state = 'error';
}
else if (item.element.is('.unknown')) {
item.state = 'unknown';
}
return item;
}
],
show: $('#edit-module-filter-show input[name="module_filter[show]"]', context).val()
});
],
show: $('#edit-module-filter-show input[name="module_filter[show]"]', context).val()
});
var moduleFilter = filterInput.data('moduleFilter');
var moduleFilter = filterInput.data('moduleFilter');
if (Drupal.settings.moduleFilter.rememberUpdateState) {
var updateShow = Drupal.ModuleFilter.getState('updateShow');
if (updateShow) {
moduleFilter.options.show = updateShow;
$('#edit-module-filter-show input[name="module_filter[show]"][value="' + updateShow + '"]', context).click();
if (drupalSettings.moduleFilter.rememberUpdateState) {
var updateShow = Drupal.ModuleFilter.getState('updateShow');
if (updateShow) {
moduleFilter.options.show = updateShow;
$('#edit-module-filter-show input[name="module_filter[show]"][value="' + updateShow + '"]', context).click();
}
}
}
$('#edit-module-filter-show input[name="module_filter[show]"]', context).change(function() {
moduleFilter.options.show = $(this).val();
Drupal.ModuleFilter.setState('updateShow', moduleFilter.options.show);
moduleFilter.applyFilter();
});
$('#edit-module-filter-show input[name="module_filter[show]"]', context).change(function() {
moduleFilter.options.show = $(this).val();
Drupal.ModuleFilter.setState('updateShow', moduleFilter.options.show);
moduleFilter.applyFilter();
});
moduleFilter.element.bind('moduleFilter:start', function() {
$('table.update').each(function() {
$(this).show().prev('h3').show();
moduleFilter.element.bind('moduleFilter:start', function() {
$('table.update').each(function() {
$(this).show().prev('h3').show();
});
});
moduleFilter.element.bind('moduleFilter:finish', function(e, data) {
$('table.update').each(function() {
var $table = $(this);
if ($('tbody tr', $(this)).filter(':visible').length == 0) {
$table.hide().prev('h3').hide();
}
});
});
});
moduleFilter.element.bind('moduleFilter:finish', function(e, data) {
$('table.update').each(function() {
var $table = $(this);
if ($('tbody tr', $(this)).filter(':visible').length == 0) {
$table.hide().prev('h3').hide();
moduleFilter.element.bind('moduleFilter:keyup', function() {
if (moduleFilter.clearOffset == undefined) {
moduleFilter.inputWidth = filterInput.width();
moduleFilter.clearOffset = moduleFilter.element.parent().find('.module-filter-clear a').width();
}
if (moduleFilter.text) {
filterInput.width(moduleFilter.inputWidth - moduleFilter.clearOffset - 5).parent().css('margin-right', moduleFilter.clearOffset + 5);
}
else {
filterInput.width(moduleFilter.inputWidth).parent().css('margin-right', 0);
}
});
});
moduleFilter.element.bind('moduleFilter:keyup', function() {
if (moduleFilter.clearOffset == undefined) {
moduleFilter.inputWidth = filterInput.width();
moduleFilter.clearOffset = moduleFilter.element.parent().find('.module-filter-clear a').width();
}
if (moduleFilter.text) {
filterInput.width(moduleFilter.inputWidth - moduleFilter.clearOffset - 5).parent().css('margin-right', moduleFilter.clearOffset + 5);
}
else {
moduleFilter.element.parent().find('.module-filter-clear a').click(function() {
filterInput.width(moduleFilter.inputWidth).parent().css('margin-right', 0);
}
});
});
moduleFilter.element.parent().find('.module-filter-clear a').click(function() {
filterInput.width(moduleFilter.inputWidth).parent().css('margin-right', 0);
moduleFilter.applyFilter();
});
}
};
moduleFilter.applyFilter();
});
}
};
})(jQuery);
})(jQuery, Drupal, drupalSettings);
<?php
/**
* @file
*
* @author greenSkin
*/
/*******************************************************************************
* Callback Functions, Forms, and Tables
******************************************************************************/
/**
* Settings form for module filter.
*/
function module_filter_settings() {
$form['module_filter_set_focus'] = array(
'#type' => 'checkbox',
'#title' => t('Set focus to filter field on page load'),
'#description' => t('Currently has no effect when using Overlay module.'),
'#default_value' => variable_get('module_filter_set_focus', 1),
);
$form['module_filter_tabs'] = array(
'#type' => 'checkbox',
'#title' => t('Enhance the modules page with tabs'),
'#description' => t('Alternate tabbed theme that restructures packages into tabs.'),
'#default_value' => variable_get('module_filter_tabs', 1),
);
$form['tabs'] = array(
'#type' => 'fieldset',
'#title' => t('Tabs'),
'#description' => t('Settings used with the tabs view of the modules page.'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
);
$form['tabs']['module_filter_count_enabled'] = array(
'#type' => 'checkbox',
'#title' => t('Number of enabled modules'),
'#description' => t('Display the number of enabled modules in the active tab along with the total number of modules.'),
'#default_value' => variable_get('module_filter_count_enabled', 1),
);
$form['tabs']['module_filter_visual_aid'] = array(
'#type' => 'checkbox',
'#title' => t('Visual aids'),
'#description' => t('When enabling/disabling modules, the module name will display in the tab summary.<br />When filtering, a count of results for each tab will be presented.'),
'#default_value' => variable_get('module_filter_visual_aid', 1),
);
$form['tabs']['module_filter_hide_empty_tabs'] = array(
'#type' => 'checkbox',
'#title' => t('Hide tabs with no results'),
'#description' => t('When a filter returns no results for a tab, the tab is hidden. This is dependent on visual aids being enabled.'),
'#default_value' => variable_get('module_filter_hide_empty_tabs', 0),
);
$form['tabs']['module_filter_dynamic_save_position'] = array(
'#type' => 'checkbox',
'#title' => t('Dynamically position Save button'),
'#description' => t("For sites with lots of tabs, enable to help keep the 'Save configuration' button more accessible."),
'#default_value' => variable_get('module_filter_dynamic_save_position', 1),
);
$form['tabs']['module_filter_use_url_fragment'] = array(
'#type' => 'checkbox',
'#title' => t('Use URL fragment'),
'#description' => t('Use URL fragment when navigating between tabs. This lets you use the browsers back/forward buttons to navigate through the tabs you selected.') . '<br />' . t('When the Overlay module is enabled this functionality will not be used since overlay relies on the URL fragment.'),
'#default_value' => variable_get('module_filter_use_url_fragment', 1),
);
$form['tabs']['module_filter_use_switch'] = array(
'#type' => 'checkbox',
'#title' => t('Use switch instead of checkbox'),
'#description' => t('This is purely cosmetic (at least for now). Displays a ON/OFF switch rather than a checkbox to enable/disable modules.<br /><strong>Modules will not actually be enabled/disabled until the form is saved.</strong>'),
'#default_value' => variable_get('module_filter_use_switch', 1),
);
$form['tabs']['module_filter_track_recent_modules'] = array(
'#type' => 'checkbox',
'#title' => t('Track recently enabled/disabled modules'),
'#description' => t('Adds a "Recent" tab that displays modules that have been enabled or disabled with the last week.'),
'#default_value' => variable_get('module_filter_track_recent_modules', 1),
);
$form['tabs']['module_filter_remember_active_tab'] = array(
'#type' => 'checkbox',
'#title' => t('Remember active tab.'),
'#description' => t('When enabled, the active tab will be remembered.'),
'#default_value' => variable_get('module_filter_remember_active_tab', 1),
);
$form['tabs']['module_filter_version_column'] = array(
'#type' => 'checkbox',
'#title' => t('Place version in own column'),
'#description' => t("Moves the version out of the description and into it's own column"),
'#default_value' => variable_get('module_filter_version_column', 0),
);
$form['tabs']['module_filter_expanded_description'] = array(
'#type' => 'checkbox',
'#title' => t('Expand description by default'),
'#description' => t('When enabled, the description will be expanded by default.'),
'#default_value' => variable_get('module_filter_expanded_description', 0),
);
$form['update'] = array(
'#type' => 'fieldset',
'#title' => t('Update status'),
'#collapsible' => TRUE,
'#collapsed' => (module_exists('update')) ? FALSE : TRUE,
);
$form['update']['module_filter_remember_update_state'] = array(
'#type' => 'checkbox',
'#title' => t('Remember the last selected filter.'),
'#description' => t('When enabled, the last state (All, Update available, Security update, Unknown) will be remembered.'),
'#default_value' => variable_get('module_filter_remember_update_state', 0),
);
if (module_exists('page_actions')) {
$form['tabs']['module_filter_dynamic_save_position']['#description'] .= '<br />' . t('The module %name is enabled and thus this setting will have no affect.', array('%name' => t('Page actions')));
}
return system_settings_form($form);
}
name = Module filter
description = "Filter the modules list."
core = 7.x
package = Administration
files[] = module_filter.install
files[] = module_filter.js
files[] = module_filter.module
files[] = module_filter.admin.inc
files[] = module_filter.theme.inc
files[] = css/module_filter.css
files[] = css/module_filter_tab.css
files[] = js/module_filter.js
files[] = js/module_filter_tab.js
configure = admin/config/user-interface/modulefilter
name: Module filter
description: Filter the modules list.
package: Administration
type: module
core: 8.x
configure: module_filter.settings
<?php
/**
* @file
*/
/**
* Implements hook_uninstall().
*/
function module_filter_uninstall() {
variable_del('module_filter_set_focus');
variable_del('module_filter_tabs');
variable_del('module_filter_count_enabled');
variable_del('module_filter_visual_aid');
variable_del('module_filter_hide_empty_tabs');
variable_del('module_filter_dynamic_save_position');
variable_del('module_filter_use_url_fragment');
variable_del('module_filter_use_switch');
variable_del('module_filter_track_recent_modules');
variable_del('module_filter_remember_active_tab');
variable_del('module_filter_remember_update_state');
variable_del('module_filter_version_column');
variable_del('module_filter_expanded_description');
}
/**
* Remove the 'module_filter_autocomplete' variable.
*/
function module_filter_update_7100() {
variable_del('module_filter_autocomplete');
}
/**
* Rebuild the menu and theme registry.
*/
function module_filter_update_7200() {
menu_rebuild();
system_rebuild_theme_data();
drupal_theme_rebuild();
}
/**
* Old update that use to remove the module_filter_dynamic_save_position variable.
*/
function module_filter_update_7201() {
// We don't want to remove this update hook but at the same time we no
// longer want to lose the variable setting, so we just comment it out.
// variable_del('module_filter_dynamic_save_position');
}
drupal.module_filter:
version: VERSION
js:
js/module_filter.js: { }
css:
theme:
css/module_filter.css: { }
dependencies:
- core/drupal
- core/drupalSettings
- core/jquery
- core/jquery.cookie
drupal.module_filter.module:
version: VERSION
css:
theme:
css/modules.css: { }
drupal.module_filter.modules:
version: VERSION
js:
js/modules.js: { }
dependencies:
- module_filter/drupal.module_filter
- core/drupal
- core/drupalSettings
- core/jquery
- core/jquery.once
drupal.module_filter.tab:
version: VERSION
js:
js/module_filter_tab.js: { }
css:
theme:
css/module_filter_tab.css: { }
dependencies:
- module_filter/drupal.module_filter
- core/drupal
- core/drupalSettings
- core/jquery
#- core/jquery.bbq
- core/jquery.once
drupal.module_filter.dynamic_position:
version: VERSION
js:
js/dynamic_position.js: { }
css:
theme:
css/dynamic_position.css: { }
dependencies:
- core/drupal
- core/jquery
- core/jquery.once
drupal.module_filter.update_status:
version: VERSION
js:
js/update_status.js: { }
css:
theme:
css/update_status.css: { }
dependencies:
- module_filter/drupal.module_filter
- core/drupal
- core/drupalSettings
- core/jquery
- core/jquery.once
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment