-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmodule_filter.module
More file actions
356 lines (324 loc) · 12.2 KB
/
module_filter.module
File metadata and controls
356 lines (324 loc) · 12.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
<?php
/**
* @file
* This is the file description for Module Filter module.
*
* In this more verbose, multi-line description, you can specify what this
* file does exactly. Make sure to wrap your documentation in column 78 so
* that the file can be displayed nicely in default-sized consoles.
*
* @author greenSkin
*/
/**
* Implements hook_help().
*/
function module_filter_help($path, $arg) {
switch ($path) {
// Main module help for the block module
case 'admin/help#module_filter':
$output = '<p>';
$output .= t('What this module aims to accomplish is the ability to quickly find the module you are looking for without having to rely on the browser\'s search feature which more times than not shows you the module name in the \'Required by\' or \'Depends on\' sections of the various modules or even some other location on the page like a menu item.');
$output .= '</p>';
$output .= '<p>';
$output .= t('When tabs is enabled via the Module Filter\'s settings page, a new module layout theme is implemented. This tab layout provides a tab for each package as well as a tab that will show every module alphabetically.');
$output .= '</p>';
$output .= '<p>';
$output .= t('The filter textfield is available on each tab but currently doesn\'t support autocomplete.');
$output .= '</p>';
$output .= '<p>' . t('For more information, please visit the <a href="https://www.backdropcms.org/project/module_filter">official project page on BackdropCMS.org</a>') . '</p>';
return $output;
}
}
/**
* Implements hook_perm().
*/
function module_filter_permission() {
return array(
'administer module filter' => array(
'title' => t('Administer Module Filter'),
'description' => t('Configure how Module Filter performs.'),
),
);
}
/**
* Implements hook_menu().
*/
function module_filter_menu() {
$items['admin/config/user-interface/modulefilter'] = array(
'title' => 'Module filter',
'description' => 'Configure how the modules page looks and acts.',
'access arguments' => array('administer module filter'),
'page callback' => 'backdrop_get_form',
'page arguments' => array('module_filter_settings'),
'file' => 'module_filter.admin.inc',
);
return $items;
}
/**
* Implements hook_config_info().
*/
function module_filter_config_info() {
$prefixes['module_filter.settings'] = array(
'label' => t('Module filter settings'),
'group' => t('Configuration'),
);
return $prefixes;
}
/**
* Implements hook_library_info().
*/
function module_filter_library_info() {
// jQuery BBQ plugin, https://benalman.com/projects/jquery-bbq-plugin.
// Use updated version from https://github.com/yiisoft/yii framework/web/js.
$libraries['jquery.bbq'] = array(
'title' => 'jQuery BBQ',
'website' => 'https://github.com/cowboy/jquery-bbq',
'version' => '1.4pre with extra changes',
'js' => array(
backdrop_get_path('module', 'module_filter') . '/js/jquery.ba-bbq.min.js' => array(),
),
'dependencies' => array(
array('system', 'jquery'),
),
);
return $libraries;
}
/**
* Implements hook_menu_alter().
*/
function module_filter_menu_alter(&$items) {
if (config_get('module_filter.settings', 'update_status_alter') && isset($items['admin/reports/updates'])) {
// We route the updates report page through us.
$items['admin/reports/updates']['page callback'] = 'module_filter_update_status';
$items['admin/reports/updates']['file'] = 'module_filter.pages.inc';
$items['admin/reports/updates']['module'] = 'module_filter';
}
}
/**
* Implements hook_form_FORM_ID_alter().
*/
function module_filter_form_system_modules_alter(&$form, &$form_state, $form_id) {
// Don't alter the form when confirming.
if (isset($form['confirm'])) {
return;
}
$config = config('module_filter.settings');
$form['module_filter'] = array(
'#type' => 'module_filter',
'#attached' => array(
'js' => array(
backdrop_get_path('module', 'module_filter') . '/js/modules.js' => array('weight' => 1),
),
),
);
$checkbox_defaults = array(
((isset($_GET['enabled'])) ? $_GET['enabled'] : 1) ? 'enabled' : '',
((isset($_GET['disabled'])) ? $_GET['disabled'] : 1) ? 'disabled' : '',
((isset($_GET['required'])) ? $_GET['required'] : 1) ? 'required' : '',
((isset($_GET['unavailable'])) ? $_GET['unavailable'] : 1) ? 'unavailable' : '',
);
$form['module_filter']['show'] = array(
'#type' => 'checkboxes',
'#default_value' => array_filter($checkbox_defaults),
'#options' => array('enabled' => t('Enabled'), 'disabled' => t('Disabled'), 'required' => t('Required'), 'unavailable' => t('Unavailable')),
'#prefix' => '<div id="module-filter-show-wrapper">',
'#suffix' => '</div>',
);
if ($config->get('use_tabs')) {
$form['module_filter']['#attached']['css'][] = backdrop_get_path('module', 'module_filter') . '/css/module_filter_tab.css';
$form['module_filter']['#attached']['library'][] = array('module_filter', 'jquery.bbq');
$form['module_filter']['#attached']['js'][backdrop_get_path('module', 'module_filter') . '/js/module_filter_tab.js'] = array('weight' => 2);
if (!module_exists('page_actions') && $config->get('dynamic_save_position')) {
$form['module_filter']['#attached']['css'][] = backdrop_get_path('module', 'module_filter') . '/css/dynamic_position.css';
$form['module_filter']['#attached']['js'][backdrop_get_path('module', 'module_filter') . '/js/dynamic_position.js'] = array('weight' => 3);
}
$form['#attached']['css'][] = backdrop_get_path('module', 'module_filter') . '/css/modules.css';
$form['#theme'] = 'module_filter_system_modules_tabs';
}
unset($form['filter']);
$form['#submit'][] = 'module_filter_system_modules_submit_redirect';
if ($config->get('track_recent_modules')) {
$form['#submit'][] = 'module_filter_system_modules_submit_recent';
}
}
/**
* Implements hook_form_FORM_ID_alter().
*/
function module_filter_form_user_admin_permissions_alter(&$form, &$form_state) {
$form['module_filter'] = array(
'#type' => 'module_filter',
'#description' => t('Filter list by module. Use the query operator "perm" to filter by permission, e.g., perm:access.'),
'#attached' => array(
'js' => array(
backdrop_get_path('module', 'module_filter') . '/js/permissions.js',
),
),
'#weight' => -100,
);
}
/**
* Implements hook_element_info().
*/
function module_filter_element_info() {
$types['module_filter'] = array(
'#input' => TRUE,
'#process' => array('form_process_module_filter', 'ajax_process_form'),
'#weight' => -1,
'#tree' => TRUE,
'#theme' => 'module_filter',
);
return $types;
}
/**
* Implements hook_theme().
*/
function module_filter_theme() {
return array(
'module_filter' => array(
'render element' => 'element',
'file' => 'module_filter.theme.inc',
),
'module_filter_system_modules_tabs' => array(
'render element' => 'form',
'file' => 'module_filter.theme.inc',
),
'module_filter_operations' => array(
'variables' => array('links' => array(), 'dropbutton' => FALSE),
'file' => 'module_filter.theme.inc',
),
);
}
/**
* Create and add new textfield element.
*
* @param $element
* An associative array containing the properties and children of the
* form actions container.
* @param $form_state
* The $form_state array for the form this element belongs to.
*
* @return
* The processed element.
*/
function form_process_module_filter($element, &$form_state) {
$config = config('module_filter.settings');
$element['name'] = array(
'#type' => 'textfield',
'#title' => (isset($element['#title'])) ? $element['#title'] : t('Filter list'),
'#default_value' => (isset($element['#default_value'])) ? $element['#default_value'] : ((isset($_GET['filter'])) ? $_GET['filter'] : ''),
'#size' => (isset($element['#size'])) ? $element['#size'] : 45,
'#weight' => (isset($element['#weight'])) ? $element['#weight'] : -10,
'#attributes' => ((isset($element['#attributes'])) ? $element['#attributes'] : array()) + array('autocomplete' => 'off'),
'#attached' => array(
'css' => array(
backdrop_get_path('module', 'module_filter') . '/css/module_filter.css',
),
'js' => array(
'core/misc/jquery.cookie.js',
backdrop_get_path('module', 'module_filter') . '/js/module_filter.js',
array(
'data' => array(
'moduleFilter' => array(
'setFocus' => $config->get('set_focus'),
'tabs' => $config->get('use_tabs'),
'countEnabled' => $config->get('count_enabled'),
'visualAid' => $config->get('visual_aid'),
'hideEmptyTabs' => $config->get('hide_empty_tabs'),
'dynamicPosition' => (!module_exists('page_actions')) ? $config->get('dynamic_save_position') : FALSE,
'useURLFragment' => $config->get('use_url_fragment'),
'useSwitch' => $config->get('use_switch'),
'trackRecent' => $config->get('track_recent_modules'),
'rememberActiveTab' => $config->get('remember_active_tab'),
'rememberUpdateState' => $config->get('remember_update_state'),
'expandedDescription' => $config->get('expanded_description'),
),
),
'type' => 'setting',
),
),
),
);
if (isset($element['#description'])) {
$element['name']['#description'] = $element['#description'];
}
return $element;
}
/**
* Form submission handler to filters module list.
*/
function module_filter_system_modules_submit_redirect($form, &$form_state) {
$query = array();
if (!empty($form_state['values']['module_filter']['name'])) {
$query['filter'] = $form_state['values']['module_filter']['name'];
}
$query['enabled'] = (int) (!empty($form_state['values']['module_filter']['show']['enabled']));
$query['disabled'] = (int) (!empty($form_state['values']['module_filter']['show']['disabled']));
$query['required'] = (int) (!empty($form_state['values']['module_filter']['show']['required']));
$query['unavailable'] = (int) (!empty($form_state['values']['module_filter']['show']['unavailable']));
$form_state['redirect'] = array(
'admin/modules',
array('query' => $query),
);
}
/**
* Form submission handler to track recently enabled/disabled modules
*/
function module_filter_system_modules_submit_recent($form, &$form_state) {
$config = config('module_filter.settings');
$recent_modules = $config->get('recent_modules');
foreach ($form_state['values']['modules'] as $package => $modules) {
foreach ($modules as $key => $module) {
if ($form['modules'][$package][$key]['enable']['#default_value'] != $module['enable']) {
$recent_modules[$key] = REQUEST_TIME;
}
}
}
$config->set('recent_modules', $recent_modules);
$config->save();
backdrop_set_message(t('Recently enabled/disabled modules saved.'));
}
/**
* Create list of newly added modules (within a week)
* @return
* An array of newly added modules.
*/
function module_filter_new_modules() {
// Get current list of modules.
$files = system_rebuild_module_data();
// Remove hidden modules from display list.
$visible_files = $files;
foreach ($visible_files as $filename => $file) {
if (!empty($file->info['hidden'])) {
unset($visible_files[$filename]);
}
}
uasort($visible_files, 'system_sort_modules_by_info_name');
$new_modules = array();
foreach ($visible_files as $filename => $module) {
$ctime = filectime(dirname($module->uri) . '/' . $module->name . '.info');
if (($ctime - strtotime('-1 week')) > 0) {
$new_modules[$filename] = module_filter_get_id($filename);
}
}
return $new_modules;
}
/**
* Function to replace special characters with hyphen.
* @param string $text
* @return
* String
*/
function module_filter_get_id($text) {
$id = strtolower($text);
$id = preg_replace('/([^a-z0-9]+)/', '-', $id);
return trim($id, '-');
}
/**
* Function to return true/false depending on module changed time and a week timestamp
* @param integer $var
* @return
* Boolean indicating
*/
function module_filter_recent_filter($var) {
return (!($var < REQUEST_TIME - 60 * 60 * 24 * 7));
}