From 1d9f387c7c80969a0f3415be3187408b6fbdd1bf Mon Sep 17 00:00:00 2001
From: Dries Buytaert <dries@buytaert.net>
Date: Fri, 17 Sep 2010 14:53:22 +0000
Subject: [PATCH] - Patch #732914 by Jacine, sun, reglogge, cosmicdreams:
 improve the markup/CSS for content and user filter forms.

---
 includes/common.inc                |  3 ++
 modules/node/node.admin.inc        | 71 +++++++++---------------------
 modules/node/node.css              | 16 -------
 modules/node/node.module           |  4 --
 modules/node/node.test             | 10 +++--
 modules/system/admin-rtl.css       | 17 +++++++
 modules/system/admin.css           | 33 ++++++++++++++
 modules/system/system-behavior.css | 22 ---------
 modules/system/system.css          |  1 -
 modules/system/system.module       | 29 ++++++++++++
 modules/user/user-rtl.css          | 12 -----
 modules/user/user.admin.inc        | 67 ++++++++--------------------
 modules/user/user.css              | 16 -------
 modules/user/user.module           |  4 --
 14 files changed, 128 insertions(+), 177 deletions(-)

diff --git a/includes/common.inc b/includes/common.inc
index bebe2ad52deb..6c679857b71b 100644
--- a/includes/common.inc
+++ b/includes/common.inc
@@ -5958,6 +5958,9 @@ function drupal_common_theme() {
     'date' => array(
       'render element' => 'element',
     ),
+    'exposed_filters' => array(
+      'render element' => 'form',
+    ),
     'checkbox' => array(
       'render element' => 'element',
     ),
diff --git a/modules/node/node.admin.inc b/modules/node/node.admin.inc
index 4214573b22f7..b3413a9590b7 100644
--- a/modules/node/node.admin.inc
+++ b/modules/node/node.admin.inc
@@ -148,7 +148,7 @@ function node_filter_form() {
   $form['filters'] = array(
     '#type' => 'fieldset',
     '#title' => t('Show only items where'),
-    '#theme' => 'node_filters',
+    '#theme' => 'exposed_filters__node',
   );
   foreach ($session as $filter) {
     list($type, $value) = $filter;
@@ -163,11 +163,12 @@ function node_filter_form() {
     else {
       $value = $filters[$type]['options'][$value];
     }
+    $t_args = array('%property' => $filters[$type]['title'], '%value' => $value);
     if ($i++) {
-      $form['filters']['current'][] = array('#markup' => t('<em>and</em> where <strong>%type</strong> is <strong>%value</strong>', array('%type' => $filters[$type]['title'], '%value' => $value)));
+      $form['filters']['current'][] = array('#markup' => t('and where %property is %value', $t_args));
     }
     else {
-      $form['filters']['current'][] = array('#markup' => t('<strong>%type</strong> is <strong>%value</strong>', array('%type' => $filters[$type]['title'], '%value' => $value)));
+      $form['filters']['current'][] = array('#markup' => t('where %property is %value', $t_args));
     }
     if (in_array($type, array('type', 'language'))) {
       // Remove the option if it is already being filtered on.
@@ -175,9 +176,17 @@ function node_filter_form() {
     }
   }
 
+  $form['filters']['status'] = array(
+    '#type' => 'container',
+    '#attributes' => array('class' => array('clearfix')),
+    '#prefix' => ($i ? '<div class="additional-filters">' . t('and where') . '</div>' : ''),
+  );
+  $form['filters']['status']['filters'] = array(
+    '#type' => 'container',
+    '#attributes' => array('class' => array('filters')),
+  );
   foreach ($filters as $key => $filter) {
-    $names[$key] = $filter['title'];
-    $form['filters']['status'][$key] = array(
+    $form['filters']['status']['filters'][$key] = array(
       '#type' => 'select',
       '#options' => $filter['options'],
       '#title' => $filter['title'],
@@ -185,15 +194,17 @@ function node_filter_form() {
     );
   }
 
-  $form['filters']['actions'] = array(
+  $form['filters']['status']['actions'] = array(
     '#type' => 'actions',
-    '#id' => 'node-admin-buttons',
     '#attributes' => array('class' => array('container-inline')),
   );
-  $form['filters']['actions']['submit'] = array('#type' => 'submit', '#value' => (count($session) ? t('Refine') : t('Filter')));
+  $form['filters']['status']['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => count($session) ? t('Refine') : t('Filter'),
+  );
   if (count($session)) {
-    $form['filters']['actions']['undo'] = array('#type' => 'submit', '#value' => t('Undo'));
-    $form['filters']['actions']['reset'] = array('#type' => 'submit', '#value' => t('Reset'));
+    $form['filters']['status']['actions']['undo'] = array('#type' => 'submit', '#value' => t('Undo'));
+    $form['filters']['status']['actions']['reset'] = array('#type' => 'submit', '#value' => t('Reset'));
   }
 
   drupal_add_js('misc/form.js');
@@ -201,46 +212,6 @@ function node_filter_form() {
   return $form;
 }
 
-/**
- * Returns HTML for a node administration filter selector.
- *
- * @param $variables
- *   An associative array containing:
- *   - form: A render element representing the form.
- *
- * @ingroup themeable
- */
-function theme_node_filters($variables) {
-  $form = $variables['form'];
-  $output = '';
-
-  $output .= '<ul class="clearfix">';
-  if (!empty($form['current'])) {
-    foreach (element_children($form['current']) as $key) {
-      $output .= '<li>' . drupal_render($form['current'][$key]) . '</li>';
-    }
-  }
-  $output .= '</ul>';
-
-  $output .= '<div class="clearfix">';
-
-  $output .= '<dl class="multiselect">' . (!empty($form['current']) ? '<dt><em>' . t('and') . '</em> ' . t('where') . '</dt>' : '');
-
-  $output .= '<dd>';
-
-  foreach (element_children($form['status']) as $key) {
-    $output .= drupal_render($form['status'][$key]);
-  }
-  $output .= '</dd>';
-
-  $output .= '</dl>';
-  $output .= drupal_render($form['actions']);
-
-  $output .= '</div>';
-
-  return $output;
-}
-
 /**
  * Process result from node administration filter form.
  */
diff --git a/modules/node/node.css b/modules/node/node.css
index 16143cb6f973..efd21b5899cc 100644
--- a/modules/node/node.css
+++ b/modules/node/node.css
@@ -6,22 +6,6 @@
 .preview .node {
   background-color: #ffffea;
 }
-/* Override the default multiselect layout in system-behavior.css. */
-#node-admin-content dl.multiselect dd,
-dl.multiselect dd .form-item {
-  width: 20em; /* 6em label + 14em select */
-}
-#node-admin-content dl.multiselect dd .form-item label {
-  display: block;
-  float: left; /* LTR */
-  width: 6em;
-  font-weight: normal;
-}
-#node-admin-buttons {
-  float: left; /* LTR */
-  margin-left: 0.5em; /* LTR */
-  clear: right; /* LTR */
-}
 td.revision-current {
   background: #ffc;
 }
diff --git a/modules/node/node.module b/modules/node/node.module
index b5de4d7398b1..7d37e1f750a3 100644
--- a/modules/node/node.module
+++ b/modules/node/node.module
@@ -132,10 +132,6 @@ function node_theme() {
     'node_search_admin' => array(
       'render element' => 'form',
     ),
-    'node_filters' => array(
-      'render element' => 'form',
-      'file' => 'node.admin.inc',
-    ),
     'node_add_list' => array(
       'variables' => array('content' => NULL),
       'file' => 'node.pages.inc',
diff --git a/modules/node/node.test b/modules/node/node.test
index f2d6952d6582..a31d1ae665a9 100644
--- a/modules/node/node.test
+++ b/modules/node/node.test
@@ -1224,7 +1224,9 @@ class NodeAdminTestCase extends DrupalWebTestCase {
       'status' => 'status-1',
     );
     $this->drupalPost(NULL, $edit, t('Filter'));
-    $this->assertRaw(t('<strong>%type</strong> is <strong>%value</strong>', array('%type' => t('status'), '%value' => t('published'))), t('Content list is filtered by status.'));
+
+    $this->assertRaw(t('where %property is %value', array('%property' => t('status'), '%value' => 'published')), t('Content list is filtered by status.'));
+
     $this->assertLinkByHref('node/' . $nodes['published_page']->nid . '/edit');
     $this->assertLinkByHref('node/' . $nodes['published_article']->nid . '/edit');
     $this->assertNoLinkByHref('node/' . $nodes['unpublished_page_1']->nid . '/edit');
@@ -1234,8 +1236,10 @@ class NodeAdminTestCase extends DrupalWebTestCase {
       'type' => 'page',
     );
     $this->drupalPost(NULL, $edit, t('Refine'));
-    $this->assertRaw(t('<strong>%type</strong> is <strong>%value</strong>', array('%type' => t('status'), '%value' => t('published'))), t('Content list is filtered by status.'));
-    $this->assertRaw(t('<strong>%type</strong> is <strong>%value</strong>', array('%type' => t('type'), '%value' => 'Basic page')), t('Content list is filtered by content type.'));
+
+    $this->assertRaw(t('where %property is %value', array('%property' => t('status'), '%value' => 'published')), t('Content list is filtered by status.'));
+    $this->assertRaw(t('and where %property is %value', array('%property' => t('type'), '%value' => 'Basic page')), t('Content list is filtered by content type.'));
+
     $this->assertLinkByHref('node/' . $nodes['published_page']->nid . '/edit');
     $this->assertNoLinkByHref('node/' . $nodes['published_article']->nid . '/edit');
 
diff --git a/modules/system/admin-rtl.css b/modules/system/admin-rtl.css
index 35d92e956533..4331fab4d985 100644
--- a/modules/system/admin-rtl.css
+++ b/modules/system/admin-rtl.css
@@ -48,3 +48,20 @@ table.screenshot {
   margin-right: 15px;
 }
 
+/**
+ * Exposed filters
+ */
+.exposed-filters .filters {
+  float: right;
+  margin-left: 1em;
+  margin-right: 0;
+}
+.exposed-filters .form-item label {
+  float: right;
+}
+/* Current filters */
+.exposed-filters .additional-filters {
+  float: right;
+  margin-left: 1em;
+  margin-right: 0;
+}
diff --git a/modules/system/admin.css b/modules/system/admin.css
index 70d415a25e40..fbd32d427d9f 100644
--- a/modules/system/admin.css
+++ b/modules/system/admin.css
@@ -138,3 +138,36 @@ table.screenshot {
 html.js .custom-container label {
   visibility: hidden;
 }
+
+/**
+ * Exposed filters
+ */
+.exposed-filters .filters {
+  float: left; /* LTR */
+  margin-right: 1em; /* LTR */
+  width: 25em; /* IE6 */
+}
+.exposed-filters .form-item {
+  margin: 0 0 0.1em 0;
+  padding: 0;
+}
+.exposed-filters .form-item label {
+  float: left; /* LTR */
+  font-weight: normal;
+  width: 10em;
+}
+.exposed-filters .form-select {
+  width: 14em;
+}
+/* Current filters */
+.exposed-filters .current-filters {
+  margin-bottom: 1em;
+}
+.exposed-filters .current-filters .placeholder {
+  font-style: normal;
+  font-weight: bold;
+}
+.exposed-filters .additional-filters {
+  float: left; /* LTR */
+  margin-right: 1em; /* LTR */
+}
diff --git a/modules/system/system-behavior.css b/modules/system/system-behavior.css
index 15e65882fef1..343cff68a02f 100644
--- a/modules/system/system-behavior.css
+++ b/modules/system/system-behavior.css
@@ -182,28 +182,6 @@ tr .ajax-progress .throbber {
   width: 16em;
 }
 
-/**
- * Multiselect form
- */
-dl.multiselect dd,
-dl.multiselect dd .form-item,
-dl.multiselect dd select {
-  font-family: inherit;
-  font-size: inherit;
-  width: 14em;
-}
-dl.multiselect dt,
-dl.multiselect dd {
-  float: left; /* LTR */
-  line-height: 1.75em;
-  padding: 0;
-  margin: 0 1em 0 0; /* LTR */
-}
-dl.multiselect .form-item {
-  height: 1.75em;
-  margin: 0;
-}
-
 /**
  * Password strength indicator
  */
diff --git a/modules/system/system.css b/modules/system/system.css
index a5fa7f9571f2..0acff828afe0 100644
--- a/modules/system/system.css
+++ b/modules/system/system.css
@@ -82,7 +82,6 @@ thead th {
 .item-list ul li {
   margin: 0 0 0.25em 1.5em; /* LTR */
   padding: 0;
-  list-style: disc;
 }
 .form-item {
   margin-top: 1em;
diff --git a/modules/system/system.module b/modules/system/system.module
index 21b2f79add69..9d09304765c1 100644
--- a/modules/system/system.module
+++ b/modules/system/system.module
@@ -3769,6 +3769,35 @@ function theme_system_settings_form($variables) {
   return drupal_render_children($variables['form']);
 }
 
+/**
+ * Returns HTML for an exposed filter form.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: An associative array containing the structure of the form.
+ *
+ * @return
+ *   A string containing an HTML-formatted form.
+ *
+ * @ingroup themeable
+ */
+function theme_exposed_filters($variables) {
+  $form = $variables['form'];
+  $output = '';
+
+  if (isset($form['current'])) {
+    $items = array();
+    foreach (element_children($form['current']) as $key) {
+      $items[] = drupal_render($form['current'][$key]);
+    }
+    $output .= theme('item_list', array('items' => $items, 'attributes' => array('class' => array('clearfix', 'current-filters'))));
+  }
+
+  $output .= drupal_render_children($form);
+
+  return '<div class="exposed-filters">' . $output . '</div>';
+}
+
 /**
  * Implements hook_admin_paths().
  */
diff --git a/modules/user/user-rtl.css b/modules/user/user-rtl.css
index 9f82196199f2..1c5d178c0ec2 100644
--- a/modules/user/user-rtl.css
+++ b/modules/user/user-rtl.css
@@ -4,18 +4,6 @@
   padding-left: 0;
   padding-right: 1.5em;
 }
-
-#user-filter-form dl.multiselect dd .form-item label {
-  float: right;
-}
-
-#user-admin-buttons {
-  float: right;
-  margin-left: 0;
-  margin-right: 0.5em;
-  clear: left;
-}
-
 .profile .user-picture {
   float: left;
   margin: 0 0 1em 1em;
diff --git a/modules/user/user.admin.inc b/modules/user/user.admin.inc
index 58f881010964..09fb96463ca8 100644
--- a/modules/user/user.admin.inc
+++ b/modules/user/user.admin.inc
@@ -40,7 +40,7 @@ function user_filter_form() {
   $form['filters'] = array(
     '#type' => 'fieldset',
     '#title' => t('Show only users where'),
-    '#theme' => 'user_filters',
+    '#theme' => 'exposed_filters__user',
   );
   foreach ($session as $filter) {
     list($type, $value) = $filter;
@@ -53,18 +53,26 @@ function user_filter_form() {
     else {
       $value = $filters[$type]['options'][$value];
     }
-    $params = array('%property' => $filters[$type]['title'] , '%value' => $value);
+    $t_args = 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));
+      $form['filters']['current'][] = array('#markup' => t('and where %property is %value', $t_args));
     }
     else {
-      $form['filters']['current'][] = array('#markup' => t('<strong>%property</strong> is <strong>%value</strong>', $params));
+      $form['filters']['current'][] = array('#markup' => t('%property is %value', $t_args));
     }
   }
 
+  $form['filters']['status'] = array(
+    '#type' => 'container',
+    '#attributes' => array('class' => array('clearfix')),
+    '#prefix' => ($i ? '<div class="additional-filters">' . t('and where') . '</div>' : ''),
+  );
+  $form['filters']['status']['filters'] = array(
+    '#type' => 'container',
+    '#attributes' => array('class' => array('filters')),
+  );
   foreach ($filters as $key => $filter) {
-    $names[$key] = $filter['title'];
-    $form['filters']['status'][$key] = array(
+    $form['filters']['status']['filters'][$key] = array(
       '#type' => 'select',
       '#options' => $filter['options'],
       '#title' => $filter['title'],
@@ -72,21 +80,20 @@ function user_filter_form() {
     );
   }
 
-  $form['filters']['actions'] = array(
+  $form['filters']['status']['actions'] = array(
     '#type' => 'actions',
-    '#id' => 'user-admin-buttons',
     '#attributes' => array('class' => array('container-inline')),
   );
-  $form['filters']['actions']['submit'] = array(
+  $form['filters']['status']['actions']['submit'] = array(
     '#type' => 'submit',
     '#value' => (count($session) ? t('Refine') : t('Filter')),
   );
   if (count($session)) {
-    $form['filters']['actions']['undo'] = array(
+    $form['filters']['status']['actions']['undo'] = array(
       '#type' => 'submit',
       '#value' => t('Undo'),
     );
-    $form['filters']['actions']['reset'] = array(
+    $form['filters']['status']['actions']['reset'] = array(
       '#type' => 'submit',
       '#value' => t('Reset'),
     );
@@ -1017,41 +1024,3 @@ function user_admin_role_delete_confirm_submit($form, &$form_state) {
   $form_state['redirect'] = 'admin/people/permissions/roles';
 }
 
-/**
- * Returns HTML for the user administration filter selector.
- *
- * @param $variables
- *   An associative array containing:
- *   - form: A render element representing the form.
- *
- * @ingroup themeable
- */
-function theme_user_filters($variables) {
-  $form = $variables['form'];
-
-  $output = '<ul class="clearfix">';
-  if (!empty($form['current'])) {
-    foreach (element_children($form['current']) as $key) {
-      $output .= '<li>' . drupal_render($form['current'][$key]) . '</li>';
-    }
-  }
-  $output .= '</ul>';
-
-  $output .= '<div class="clearfix">';
-
-  $output .= '<dl class="multiselect">' . (!empty($form['current']) ? '<dt><em>' . t('and') . '</em> ' . t('where') . '</dt>' : '');
-
-  $output .= '<dd>';
-
-  foreach (element_children($form['status']) as $key) {
-    $output .= drupal_render($form['status'][$key]);
-  }
-  $output .= '</dd>';
-
-  $output .= '</dl>';
-  $output .= drupal_render($form['actions']);
-
-  $output .= '</div>';
-
-  return $output;
-}
diff --git a/modules/user/user.css b/modules/user/user.css
index 9fd40e0c45fb..8b891e243183 100644
--- a/modules/user/user.css
+++ b/modules/user/user.css
@@ -10,22 +10,6 @@
 #permissions tr.even .form-item {
   white-space: normal;
 }
-/* Override the default multiselect layout in system-behavior.css. */
-#user-filter-form dl.multiselect dd,
-dl.multiselect dd .form-item {
-  width: 20em; /* 6em label + 14em select */
-}
-#user-filter-form dl.multiselect dd .form-item label {
-  display: block;
-  float: left; /* LTR */
-  width: 6em;
-  font-weight: normal;
-}
-#user-admin-buttons {
-  float: left; /* LTR */
-  margin-left: 0.5em; /* LTR */
-  clear: right; /* LTR */
-}
 #user-admin-settings fieldset .fieldset-description {
   font-size: 0.85em;
   padding-bottom: .5em;
diff --git a/modules/user/user.module b/modules/user/user.module
index 89c0efabfcd2..1895b3fdea43 100644
--- a/modules/user/user.module
+++ b/modules/user/user.module
@@ -122,10 +122,6 @@ function user_theme() {
       'render element' => 'form',
       'file' => 'user.admin.inc',
     ),
-    'user_filters' => array(
-      'render element' => 'form',
-      'file' => 'user.admin.inc',
-    ),
     'user_permission_description' => array(
       'variables' => array('permission_item' => NULL, 'hide' => NULL),
       'file' => 'user.admin.inc',
-- 
GitLab