From 1b63d34db7d3df895f202b6cf6245c39dc70da7c Mon Sep 17 00:00:00 2001 From: tjhunt Date: Fri, 26 Sep 2008 06:50:31 +0000 Subject: [PATCH] MDL-16605 Add an ajaxy search box on the define/override roles screen to help find the capability you want --- admin/roles/manage.html | 8 ++- admin/roles/manage.php | 3 +- admin/roles/override.html | 7 +- admin/roles/override.php | 3 +- admin/roles/roles.js | 113 +++++++++++++++++++++++++++++++ lang/en_utf8/moodle.php | 1 + theme/standard/styles_layout.css | 8 +++ 7 files changed, 138 insertions(+), 5 deletions(-) create mode 100644 admin/roles/roles.js diff --git a/admin/roles/manage.html b/admin/roles/manage.html index 5d6845359d..930d417b1c 100755 --- a/admin/roles/manage.html +++ b/admin/roles/manage.html @@ -95,7 +95,7 @@ $strprohibit = get_string('prohibit','role'); ?> - +
@@ -214,6 +214,10 @@ foreach ($capabilities as $capability) { - + diff --git a/admin/roles/manage.php b/admin/roles/manage.php index 1ed02410ac..dba2f525be 100755 --- a/admin/roles/manage.php +++ b/admin/roles/manage.php @@ -417,7 +417,8 @@ } /// print UI now - + require_js(array('yui_yahoo', 'yui_dom', 'yui_event')); + require_js($CFG->admin . '/roles/roles.js'); admin_externalpage_print_header(); $currenttab = 'manage'; diff --git a/admin/roles/override.html b/admin/roles/override.html index 74d0eafd75..a366723034 100755 --- a/admin/roles/override.html +++ b/admin/roles/override.html @@ -15,7 +15,7 @@ -
+
@@ -150,6 +150,11 @@ if ($safeoverridenotice) { echo '
'.$strsafewarning.'
'; } + + if (count($capabilities) > 12) { + print_js_call('cap_table_filter.init', + array('overriderolestable', get_string('search'), get_string('clear'))); + } ?> diff --git a/admin/roles/override.php b/admin/roles/override.php index fbb45ca6f0..34c99232f4 100755 --- a/admin/roles/override.php +++ b/admin/roles/override.php @@ -146,7 +146,8 @@ /// Print the header and tabs - + require_js(array('yui_yahoo', 'yui_dom', 'yui_event')); + require_js($CFG->admin . '/roles/roles.js'); if ($context->contextlevel == CONTEXT_USER) { $navlinks = array(); /// course header diff --git a/admin/roles/roles.js b/admin/roles/roles.js new file mode 100644 index 0000000000..2f85336f0e --- /dev/null +++ b/admin/roles/roles.js @@ -0,0 +1,113 @@ +/* This class filters the rows of a table like the one on the define or +override roles pages. It adds a search box just above the table, and if +content is typed into that box, it hides any rows in the table where the +capability name does not contain that text. */ +cap_table_filter = { + input: null, + table: null, + button: null, + delayhandle: -1, + searchdelay: 100, // milliseconds + + init: function(tableid, strsearch, strclear) { + // Find the form controls. + cap_table_filter.table = document.getElementById(tableid); + + // Create a div to hold the search UI. + var div = document.createElement('div'); + div.className = 'capabilitysearchui'; + div.style.width = cap_table_filter.table.offsetWidth + 'px'; + + // Create the capability search input. + var input = document.createElement('input'); + input.type = 'text'; + input.id = tableid + 'capabilitysearch'; + cap_table_filter.input = input; + + // Create a label for the search input. + var label = document.createElement('label'); + label.htmlFor = input.id; + label.appendChild(document.createTextNode(strsearch + ' ')); + + // Create a clear button to clear the input. + var button = document.createElement('input'); + button.value = strclear; + button.type = 'button'; + button.disabled = true; + cap_table_filter.button = button; + + // Tie it all together + div.appendChild(label); + div.appendChild(input); + div.appendChild(button); + cap_table_filter.table.parentNode.insertBefore(div, cap_table_filter.table); + YAHOO.util.Event.addListener(input, 'keyup', cap_table_filter.change); + YAHOO.util.Event.addListener(button, 'click', cap_table_filter.clear); + + // Horrible hack! + var hidden = document.createElement('input'); + hidden.type = 'hidden'; + hidden.disabled = true; + div.appendChild(hidden); + hidden = document.createElement('input'); + hidden.type = 'hidden'; + hidden.disabled = true; + div.appendChild(hidden); + }, + + clear: function () { + cap_table_filter.input.value = ''; + if(cap_table_filter.delayhandle != -1) { + clearTimeout(cap_table_filter.delayhandle); + cap_table_filter.delayhandle = -1; + } + cap_table_filter.filter(); + }, + + change: function() { + var handle = setTimeout(function(){cap_table_filter.filter();}, cap_table_filter.searchdelay); + if(cap_table_filter.delayhandle != -1) { + clearTimeout(cap_table_filter.delayhandle); + } + cap_table_filter.delayhandle = handle; + }, + + set_visible: function(row, visible) { + if (visible) { + YAHOO.util.Dom.removeClass(row, 'hiddenrow'); + } else { + YAHOO.util.Dom.addClass(row, 'hiddenrow'); + } + }, + + filter: function() { + var filtertext = cap_table_filter.input.value; + cap_table_filter.button.disabled = filtertext == ''; + var rows = cap_table_filter.table.getElementsByTagName('tr'); + var lastheading = null; + var capssincelastheading = 0; + for (var i = 1; i < rows.length; i++) { + var row = rows[i]; + if (YAHOO.util.Dom.hasClass(row, 'rolecapheading')) { + if (lastheading) { + cap_table_filter.set_visible(lastheading, capssincelastheading > 0); + } + lastheading = row; + capssincelastheading = 0; + } + if (YAHOO.util.Dom.hasClass(row, 'rolecap')) { + var capcell = YAHOO.util.Dom.getElementsByClassName('name', 'td', row)[0]; + var capname = capcell.innerText || capcell.textContent; + if (capname.indexOf(filtertext) >= 0) { + cap_table_filter.set_visible(row, true); + capssincelastheading += 1; + } else { + cap_table_filter.set_visible(row, false); + } + } + } + if (lastheading) { + cap_table_filter.set_visible(lastheading, capssincelastheading > 0); + } + } +}; diff --git a/lang/en_utf8/moodle.php b/lang/en_utf8/moodle.php index 95558b41a3..6afbed3bb1 100644 --- a/lang/en_utf8/moodle.php +++ b/lang/en_utf8/moodle.php @@ -232,6 +232,7 @@ $string['clammovedfilebasic'] = 'The file has been moved to a quarantine directo $string['clamquarantinedirfailed'] = 'Could not move the file into your specified quarantine directory, $a. You need to fix this as files are being deleted if they\'re found to be infected.'; $string['clamunknownerror'] = 'There was an unknown error with clam.'; $string['cleaningtempdata'] = 'Cleaning temp data'; +$string['clear'] = 'Clear'; $string['clicktochange'] = 'Click to change'; $string['clickhere'] = 'Click here ...'; $string['closewindow'] = 'Close this window'; diff --git a/theme/standard/styles_layout.css b/theme/standard/styles_layout.css index a020494dd6..4649a7e563 100644 --- a/theme/standard/styles_layout.css +++ b/theme/standard/styles_layout.css @@ -1009,6 +1009,14 @@ body#admin-modules table.generaltable td.c0 margin-left:auto; margin-right:auto; } +.capabilitysearchui { + text-align: left; + margin-left: auto; + margin-right: auto; +} +table.rolecap .hiddenrow { + display: none; +} .rolecap .inherit, .rolecap .allow, -- 2.39.5