From a558be6532577f4c7d529fb54d402d4bc58a2aed Mon Sep 17 00:00:00 2001
From: Angie Byron <webchick@24967.no-reply.drupal.org>
Date: Tue, 17 Nov 2009 02:50:41 +0000
Subject: [PATCH] #622136 by brandonojc and mgifford: Fixed user filter
 accessibility.

---
 modules/node/node-rtl.css   |  2 +-
 modules/node/node.admin.inc |  2 +-
 modules/node/node.css       |  4 +--
 modules/system/system.css   |  5 +---
 modules/user/user-rtl.css   |  5 ++++
 modules/user/user.admin.inc | 49 ++++++++++++++++++++-----------------
 modules/user/user.css       | 15 +++++++-----
 modules/user/user.module    | 14 ++++++++---
 modules/user/user.test      |  1 -
 themes/seven/reset.css      |  9 +++----
 10 files changed, 60 insertions(+), 46 deletions(-)

diff --git a/modules/node/node-rtl.css b/modules/node/node-rtl.css
index 7e0dce5202a5..48d62aedc5d0 100644
--- a/modules/node/node-rtl.css
+++ b/modules/node/node-rtl.css
@@ -1,6 +1,6 @@
 /* $Id$ */
 
-#node-admin-content dl.multiselect dd.b .form-item label {
+#node-admin-content dl.multiselect dd .form-item label {
   display: block;
   float: right;
   width: 6em;
diff --git a/modules/node/node.admin.inc b/modules/node/node.admin.inc
index f9c21155dd32..53a82d3507bb 100644
--- a/modules/node/node.admin.inc
+++ b/modules/node/node.admin.inc
@@ -242,7 +242,7 @@ function theme_node_filters($variables) {
 
   $output .= '<dl class="multiselect">' . (!empty($form['current']) ? '<dt><em>' . t('and') . '</em> ' . t('where') . '</dt>' : '');
 
-  $output .= '<dd class="b">';
+  $output .= '<dd>';
 
   foreach (element_children($form['status']) as $key) {
     $output .= drupal_render($form['status'][$key]);
diff --git a/modules/node/node.css b/modules/node/node.css
index b102203ade4e..177c574e123c 100644
--- a/modules/node/node.css
+++ b/modules/node/node.css
@@ -7,10 +7,10 @@
   background-color: #ffffea;
 }
 /* Override the default multiselect layout in system.css. */
-#node-admin-content dl.multiselect dd.b, dl.multiselect dd.b .form-item {
+#node-admin-content dl.multiselect dd, dl.multiselect dd .form-item {
   width: 20em; /* 6em label + 14em select */
 }
-#node-admin-content dl.multiselect dd.b .form-item label {
+#node-admin-content dl.multiselect dd .form-item label {
   display: block;
   float: left; /* LTR */
   width: 6em;
diff --git a/modules/system/system.css b/modules/system/system.css
index 454edd493a9d..02a6b2657963 100644
--- a/modules/system/system.css
+++ b/modules/system/system.css
@@ -193,14 +193,11 @@ tr.merge-up, tr.merge-up td, tr.merge-up th {
   padding-bottom: 0;
   font-size: 0.9em;
 }
-dl.multiselect dd.b, dl.multiselect dd.b .form-item, dl.multiselect dd.b select {
+dl.multiselect dd, dl.multiselect dd .form-item, dl.multiselect dd select {
   font-family: inherit;
   font-size: inherit;
   width: 14em;
 }
-dl.multiselect dd.a, dl.multiselect dd.a .form-item {
-  width: 8em;
-}
 dl.multiselect dt, dl.multiselect dd {
   float: left; /* LTR */
   line-height: 1.75em;
diff --git a/modules/user/user-rtl.css b/modules/user/user-rtl.css
index ed3f23aa88b9..ca3d9fa874d2 100644
--- a/modules/user/user-rtl.css
+++ b/modules/user/user-rtl.css
@@ -4,6 +4,11 @@
   padding-left: 0;
   padding-right: 1.5em;
 }
+
+#user-admin-filter dl.multiselect dd .form-item label {
+  float: right;
+}
+
 #user-admin-buttons {
   float: right;
   margin-left: 0;
diff --git a/modules/user/user.admin.inc b/modules/user/user.admin.inc
index bbc633436c1f..f317a1bbff1d 100644
--- a/modules/user/user.admin.inc
+++ b/modules/user/user.admin.inc
@@ -44,10 +44,17 @@ function user_filter_form() {
   );
   foreach ($session as $filter) {
     list($type, $value) = $filter;
-    // Merge an array of arrays into one if necessary.
-    $options = $type == 'permission' ? call_user_func_array('array_merge', $filters[$type]['options']) : $filters[$type]['options'];
-    $params = array('%property' => $filters[$type]['title'] , '%value' => $options[$value]);
-    if ($i++ > 0) {
+    if ($type == 'permission') {
+      // Merge arrays of module permissions into one.
+      // Slice past the first element '[any]' whose value is not an array.
+      $options = call_user_func_array('array_merge', array_slice($filters[$type]['options'], 1));
+      $value = $options[$value];
+    }
+    else {
+      $value = $filters[$type]['options'][$value];
+    }
+    $params = array('%property' => $filters[$type]['title'] , '%value' => $value);
+    if ($i++) {
       $form['filters']['current'][] = array('#markup' => t('<em>and</em> where <strong>%property</strong> is <strong>%value</strong>', $params));
     }
     else {
@@ -60,13 +67,11 @@ function user_filter_form() {
     $form['filters']['status'][$key] = array(
       '#type' => 'select',
       '#options' => $filter['options'],
+      '#title' => $filter['title'],
+      '#default_value' => '[any]',
     );
   }
 
-  $form['filters']['filter'] = array(
-    '#type' => 'radios',
-    '#options' => $names,
-  );
   $form['filters']['buttons']['submit'] = array(
     '#type' => 'submit',
     '#value' => (count($session) ? t('Refine') : t('Filter')),
@@ -94,13 +99,17 @@ function user_filter_form_submit($form, &$form_state) {
   $op = $form_state['values']['op'];
   $filters = user_filters();
   switch ($op) {
-    case t('Filter'): case t('Refine'):
-      if (isset($form_state['values']['filter'])) {
-        $filter = $form_state['values']['filter'];
-        // Merge an array of arrays into one if necessary.
-        $options = $filter == 'permission' ? call_user_func_array('array_merge', $filters[$filter]['options']) : $filters[$filter]['options'];
-        if (isset($options[$form_state['values'][$filter]])) {
-          $_SESSION['user_overview_filter'][] = array($filter, $form_state['values'][$filter]);
+    case t('Filter'):
+    case t('Refine'):
+      // Apply every filter that has a choice selected other than 'any'.
+      foreach ($filters as $filter => $options) {
+        if (isset($form_state['values'][$filter]) && $form_state['values'][$filter] != '[any]') {
+          // Merge an array of arrays into one if necessary.
+          $options = ($filter == 'permission') ? form_options_flatten($filters[$filter]['options']) : $filters[$filter]['options'];
+          // Only accept valid selections offered on the dropdown, block bad input.
+          if (isset($options[$form_state['values'][$filter]])) {
+            $_SESSION['user_overview_filter'][] = array($filter, $form_state['values'][$filter]);
+          }
         }
       }
       break;
@@ -886,14 +895,11 @@ function theme_user_filters($variables) {
       $output .= '<li>' . drupal_render($form['current'][$key]) . '</li>';
     }
   }
+  $output .= '</ul>';
 
-  $output .= '<li><dl class="multiselect">' . (!empty($form['current']) ? '<dt><em>' . t('and') . '</em> ' . t('where') . '</dt>' : '') . '<dd class="a">';
-  foreach (element_children($form['filter']) as $key) {
-    $output .= drupal_render($form['filter'][$key]);
-  }
-  $output .= '</dd>';
+  $output .= '<dl class="multiselect">' . (!empty($form['current']) ? '<dt><em>' . t('and') . '</em> ' . t('where') . '</dt>' : '');
 
-  $output .= '<dt>' . t('is') . '</dt><dd class="b">';
+  $output .= '<dd>';
 
   foreach (element_children($form['status']) as $key) {
     $output .= drupal_render($form['status'][$key]);
@@ -902,7 +908,6 @@ function theme_user_filters($variables) {
 
   $output .= '</dl>';
   $output .= '<div class="container-inline" id="user-admin-buttons">' . drupal_render($form['buttons']) . '</div>';
-  $output .= '</li></ul>';
 
   return $output;
 }
diff --git a/modules/user/user.css b/modules/user/user.css
index f878b31b28d0..ceb1562d1a33 100644
--- a/modules/user/user.css
+++ b/modules/user/user.css
@@ -9,12 +9,15 @@
 #permissions tr.odd .form-item, #permissions tr.even .form-item {
   white-space: normal;
 }
-#user-admin-filter ul {
-  list-style-type: none;
-  list-style-image: none;
-  padding: 0;
-  margin: 0;
-  width: 100%;
+/* Override the default multiselect layout in system.css. */
+#user-admin-filter dl.multiselect dd, dl.multiselect dd .form-item {
+  width: 20em; /* 6em label + 14em select */
+}
+#user-admin-filter dl.multiselect dd .form-item label {
+  display: block;
+  float: left; /* LTR */
+  width: 6em;
+  font-weight: normal;
 }
 #user-admin-buttons {
   float: left; /* LTR */
diff --git a/modules/user/user.module b/modules/user/user.module
index a136dbde90f9..a9cca9849092 100644
--- a/modules/user/user.module
+++ b/modules/user/user.module
@@ -2783,7 +2783,9 @@ function user_filters() {
     $filters['role'] = array(
       'title' => t('role'),
       'field' => 'ur.rid',
-      'options' => $roles,
+      'options' => array(
+        '[any]' => t('any'),
+      ) + $roles,
     );
   }
 
@@ -2800,13 +2802,19 @@ function user_filters() {
   ksort($options);
   $filters['permission'] = array(
     'title' => t('permission'),
-    'options' => $options,
+    'options' => array(
+      '[any]' => t('any'),
+    ) + $options,
   );
 
   $filters['status'] = array(
     'title' => t('status'),
     'field' => 'u.status',
-    'options' => array(1 => t('active'), 0 => t('blocked')),
+    'options' => array(
+      '[any]' => t('any'),
+      1 => t('active'),
+      0 => t('blocked'),
+    ),
   );
   return $filters;
 }
diff --git a/modules/user/user.test b/modules/user/user.test
index ec24035a8d12..23ed393c6ad3 100644
--- a/modules/user/user.test
+++ b/modules/user/user.test
@@ -984,7 +984,6 @@ class UserAdminTestCase extends DrupalWebTestCase {
 
     // Filter the users by permission 'administer taxonomy'.
     $edit = array();
-    $edit['filter'] = 'permission';
     $edit['permission'] = 'administer taxonomy';
     $this->drupalPost('admin/people', $edit, t('Filter'));
 
diff --git a/themes/seven/reset.css b/themes/seven/reset.css
index a2d42911e418..a0a5ea7cd4fa 100644
--- a/themes/seven/reset.css
+++ b/themes/seven/reset.css
@@ -124,13 +124,10 @@ tr.even .form-item,
 .item-list .pager li,
 .pager-current,
 .tips,
-dl.multiselect dd.b,
-dl.multiselect dd.b .form-item,
-dl.multiselect dd.b select,
-dl.multiselect dd.a,
-dl.multiselect dd.a .form-item,
-dl.multiselect dt,
 dl.multiselect dd,
+dl.multiselect dd .form-item,
+dl.multiselect dd select,
+dl.multiselect dt,
 dl.multiselect .form-item,
 ul.primary,
 ul.primary li,
-- 
GitLab