commit 7d7b5830ac08eefc81819a25b77ffed4c5fb9f25
Author: Assos Assos <assos+forge@centrale-marseille.fr>
Date:   Wed Feb 25 22:43:02 2015 +0100

    Weekly update of contrib modules

diff --git a/drupal7/sites/all/modules/entity/entity.info b/drupal7/sites/all/modules/entity/entity.info
index a60170ff..ff88ce54 100644
--- a/drupal7/sites/all/modules/entity/entity.info
+++ b/drupal7/sites/all/modules/entity/entity.info
@@ -25,9 +25,9 @@ files[] = views/handlers/entity_views_handler_field_uri.inc
 files[] = views/handlers/entity_views_handler_relationship_by_bundle.inc
 files[] = views/handlers/entity_views_handler_relationship.inc
 files[] = views/plugins/entity_views_plugin_row_entity_view.inc
-; Information added by Drupal.org packaging script on 2014-04-08
-version = "7.x-1.5"
+; Information added by Drupal.org packaging script on 2015-02-25
+version = "7.x-1.6"
 core = "7.x"
 project = "entity"
-datestamp = "1396975454"
+datestamp = "1424876582"
 
diff --git a/drupal7/sites/all/modules/entity/entity.info.inc b/drupal7/sites/all/modules/entity/entity.info.inc
index fd52d065..30da6552 100644
--- a/drupal7/sites/all/modules/entity/entity.info.inc
+++ b/drupal7/sites/all/modules/entity/entity.info.inc
@@ -169,6 +169,7 @@ function _entity_metadata_convert_schema_type($type) {
   switch ($type) {
     case 'int':
     case 'serial':
+    case 'date':
       return 'integer';
     case 'float':
     case 'numeric':
diff --git a/drupal7/sites/all/modules/entity/entity_token.info b/drupal7/sites/all/modules/entity/entity_token.info
index 194e2133..b579ced1 100644
--- a/drupal7/sites/all/modules/entity/entity_token.info
+++ b/drupal7/sites/all/modules/entity/entity_token.info
@@ -5,9 +5,9 @@ files[] = entity_token.tokens.inc
 files[] = entity_token.module
 dependencies[] = entity
 
-; Information added by Drupal.org packaging script on 2014-04-08
-version = "7.x-1.5"
+; Information added by Drupal.org packaging script on 2015-02-25
+version = "7.x-1.6"
 core = "7.x"
 project = "entity"
-datestamp = "1396975454"
+datestamp = "1424876582"
 
diff --git a/drupal7/sites/all/modules/entity/includes/entity.inc b/drupal7/sites/all/modules/entity/includes/entity.inc
index 4efd071a..be24499d 100644
--- a/drupal7/sites/all/modules/entity/includes/entity.inc
+++ b/drupal7/sites/all/modules/entity/includes/entity.inc
@@ -31,6 +31,7 @@ class Entity {
   protected $entityInfo;
   protected $idKey, $nameKey, $statusKey;
   protected $defaultLabel = FALSE;
+  protected $wrapper;
 
   /**
    * Creates a new entity.
@@ -111,6 +112,23 @@ class Entity {
     return !empty($this->entityInfo['entity keys']['bundle']) ? $this->{$this->entityInfo['entity keys']['bundle']} : $this->entityType;
   }
 
+  /**
+   * Returns the EntityMetadataWrapper of the entity.
+   *
+   * @return EntityDrupalWrapper
+   *   An EntityMetadataWrapper containing the entity.
+   */
+  public function wrapper() {
+    if (empty($this->wrapper)) {
+      $this->wrapper = entity_metadata_wrapper($this->entityType, $this);
+    }
+    elseif ($this->wrapper->value() !== $this) {
+      // Wrapper has been modified outside, so let's better create a new one.
+      $this->wrapper = entity_metadata_wrapper($this->entityType, $this);
+    }
+    return $this->wrapper;
+  }
+
   /**
    * Returns the label of the entity.
    *
diff --git a/drupal7/sites/all/modules/entity/includes/entity.wrapper.inc b/drupal7/sites/all/modules/entity/includes/entity.wrapper.inc
index 67764e7e..06b89adf 100644
--- a/drupal7/sites/all/modules/entity/includes/entity.wrapper.inc
+++ b/drupal7/sites/all/modules/entity/includes/entity.wrapper.inc
@@ -504,7 +504,7 @@ class EntityStructureWrapper extends EntityMetadataWrapper implements IteratorAg
       while (!($entity instanceof EntityDrupalWrapper) && isset($entity->info['parent'])) {
         $entity = $entity->info['parent'];
       }
-      if ($entity instanceof EntityDrupalWrapper && !$entity->entityAccess('update', $account)) {
+      if ($entity instanceof EntityDrupalWrapper && $entity->entityAccess('update', $account) === FALSE) {
         return FALSE;
       }
     }
@@ -515,6 +515,7 @@ class EntityStructureWrapper extends EntityMetadataWrapper implements IteratorAg
     elseif ($op == 'edit' && isset($info['setter permission'])) {
       return user_access($info['setter permission'], $account);
     }
+    // If access is unknown, we return TRUE.
     return TRUE;
   }
 
@@ -809,7 +810,14 @@ class EntityDrupalWrapper extends EntityStructureWrapper {
     if (!empty($this->info['parent'])) {
       // If this is a property, make sure the user is able to view the
       // currently referenced entity also.
-      return $this->entityAccess('view', $account) && parent::access($op, $account);
+      if ($this->entityAccess('view', $account) === FALSE) {
+        return FALSE;
+      }
+      if (parent::access($op, $account) === FALSE) {
+        return FALSE;
+      }
+      // If access is unknown, we return TRUE.
+      return TRUE;
     }
     else {
       // This is not a property, so fallback on entity access.
diff --git a/drupal7/sites/all/modules/entity/modules/callbacks.inc b/drupal7/sites/all/modules/entity/modules/callbacks.inc
index 3865efd4..26f802e6 100644
--- a/drupal7/sites/all/modules/entity/modules/callbacks.inc
+++ b/drupal7/sites/all/modules/entity/modules/callbacks.inc
@@ -703,13 +703,14 @@ function entity_metadata_no_hook_node_access($op, $node = NULL, $account = NULL)
 /**
  * Access callback for the user entity.
  */
-function entity_metadata_user_access($op, $entity = NULL, $account = NULL, $entity_type) {
+function entity_metadata_user_access($op, $entity = NULL, $account = NULL, $entity_type = NULL) {
   $account = isset($account) ? $account : $GLOBALS['user'];
   // Grant access to the users own user account and to the anonymous one.
-  if (isset($entity) && $op != 'delete' && (($entity->uid == $account->uid && $entity->uid) || (!$entity->uid && $op == 'view'))) {
+  if (isset($entity->uid) && $op != 'delete' && (($entity->uid == $account->uid && $entity->uid) || (!$entity->uid && $op == 'view'))) {
     return TRUE;
   }
-  if (user_access('administer users', $account) || user_access('access user profiles', $account) && $op == 'view' && $entity->status) {
+  if (user_access('administer users', $account)
+    || user_access('access user profiles', $account) && $op == 'view' && (empty($entity) || !empty($entity->status))) {
     return TRUE;
   }
   return FALSE;
@@ -724,7 +725,7 @@ function entity_metadata_user_properties_access($op, $property, $entity = NULL,
   }
   $account = isset($account) ? $account : $GLOBALS['user'];
   // Flag to indicate if this user entity is the own user account.
-  $is_own_account = isset($entity) && $account->uid == $entity->uid;
+  $is_own_account = isset($entity->uid) && $account->uid == $entity->uid;
   switch ($property) {
     case 'name':
       // Allow view access to anyone with access to the entity.
@@ -794,7 +795,7 @@ function entity_metadata_comment_properties_access($op, $property, $entity = NUL
 /**
  * Access callback for the taxonomy entities.
  */
-function entity_metadata_taxonomy_access($op, $entity = NULL, $account = NULL, $entity_type) {
+function entity_metadata_taxonomy_access($op, $entity = NULL, $account = NULL, $entity_type = NULL) {
   if ($entity_type == 'taxonomy_vocabulary') {
     return user_access('administer taxonomy', $account);
   }
diff --git a/drupal7/sites/all/modules/entity/modules/field.info.inc b/drupal7/sites/all/modules/entity/modules/field.info.inc
index 9ef372b3..aeea79a1 100644
--- a/drupal7/sites/all/modules/entity/modules/field.info.inc
+++ b/drupal7/sites/all/modules/entity/modules/field.info.inc
@@ -51,7 +51,10 @@ function entity_metadata_field_default_property_callback(&$info, $entity_type, $
     $property = &$info[$entity_type]['bundles'][$instance['bundle']]['properties'][$name];
     $instance += array('property info' => array());
     $property = $instance['property info'] + array(
-      'label' => $instance['label'],
+      // Since the label will be exposed via hook_token_info() and it is not
+      // clearly defined if that should be sanitized already we prevent XSS
+      // right here (field labels are user provided text).
+      'label' => filter_xss_admin($instance['label']),
       'type' => $field_type['property_type'],
       'description' => t('Field "@name".', array('@name' => $name)),
       'getter callback' => 'entity_metadata_field_property_get',
@@ -164,7 +167,7 @@ function entity_metadata_field_image_callback(&$info, $entity_type, $field, $ins
   if (empty($instance['settings']['alt_field'])) {
     unset($property['property info']['alt']);
   }
-  if (empty($field['settings']['title_field'])) {
+  if (empty($instance['settings']['title_field'])) {
     unset($property['property info']['title']);
   }
 }
diff --git a/drupal7/sites/all/modules/entity/tests/entity_feature.info b/drupal7/sites/all/modules/entity/tests/entity_feature.info
index 051ff006..80d2a908 100644
--- a/drupal7/sites/all/modules/entity/tests/entity_feature.info
+++ b/drupal7/sites/all/modules/entity/tests/entity_feature.info
@@ -6,9 +6,9 @@ files[] = entity_feature.module
 dependencies[] = entity_test
 hidden = TRUE
 
-; Information added by Drupal.org packaging script on 2014-04-08
-version = "7.x-1.5"
+; Information added by Drupal.org packaging script on 2015-02-25
+version = "7.x-1.6"
 core = "7.x"
 project = "entity"
-datestamp = "1396975454"
+datestamp = "1424876582"
 
diff --git a/drupal7/sites/all/modules/entity/tests/entity_test.info b/drupal7/sites/all/modules/entity/tests/entity_test.info
index c8075060..d34326c9 100644
--- a/drupal7/sites/all/modules/entity/tests/entity_test.info
+++ b/drupal7/sites/all/modules/entity/tests/entity_test.info
@@ -7,9 +7,9 @@ files[] = entity_test.install
 dependencies[] = entity
 hidden = TRUE
 
-; Information added by Drupal.org packaging script on 2014-04-08
-version = "7.x-1.5"
+; Information added by Drupal.org packaging script on 2015-02-25
+version = "7.x-1.6"
 core = "7.x"
 project = "entity"
-datestamp = "1396975454"
+datestamp = "1424876582"
 
diff --git a/drupal7/sites/all/modules/entity/tests/entity_test.install b/drupal7/sites/all/modules/entity/tests/entity_test.install
index 42ba4b66..a9693230 100644
--- a/drupal7/sites/all/modules/entity/tests/entity_test.install
+++ b/drupal7/sites/all/modules/entity/tests/entity_test.install
@@ -51,8 +51,14 @@ function entity_test_schema() {
       'uid' => array('uid'),
     ),
     'foreign keys' => array(
-      'uid' => array('users' => 'uid'),
-      'name' => array('entity_test_types' => 'name'),
+      'uid' => array(
+        'table' => 'users',
+        'columns' => array('uid' => 'uid')
+      ),
+      'name' => array(
+        'table' => 'entity_test_types',
+        'columns' => array('name' => 'name')
+      ),
     ),
     'primary key' => array('pid'),
   );
diff --git a/drupal7/sites/all/modules/entity/tests/entity_test_i18n.info b/drupal7/sites/all/modules/entity/tests/entity_test_i18n.info
index af304d50..8adf04af 100644
--- a/drupal7/sites/all/modules/entity/tests/entity_test_i18n.info
+++ b/drupal7/sites/all/modules/entity/tests/entity_test_i18n.info
@@ -5,9 +5,9 @@ dependencies[] = i18n_string
 package = Multilingual - Internationalization
 core = 7.x
 hidden = TRUE
-; Information added by Drupal.org packaging script on 2014-04-08
-version = "7.x-1.5"
+; Information added by Drupal.org packaging script on 2015-02-25
+version = "7.x-1.6"
 core = "7.x"
 project = "entity"
-datestamp = "1396975454"
+datestamp = "1424876582"
 
diff --git a/drupal7/sites/all/modules/entity/theme/entity.theme.inc b/drupal7/sites/all/modules/entity/theme/entity.theme.inc
index d365996a..9238dfdb 100644
--- a/drupal7/sites/all/modules/entity/theme/entity.theme.inc
+++ b/drupal7/sites/all/modules/entity/theme/entity.theme.inc
@@ -169,7 +169,7 @@ function template_preprocess_entity(&$variables) {
   $variables['title'] = check_plain(entity_label($entity_type, $entity));
 
   $uri = entity_uri($entity_type, $entity);
-  $variables['url'] = $uri ? url($uri['path'], $uri['options']) : FALSE;
+  $variables['url'] = $uri && !empty($uri['path']) ? url($uri['path'], $uri['options']) : FALSE;
 
   if (isset($variables['elements']['#page'])) {
     // If set by the caller, respect the page property.
@@ -177,7 +177,7 @@ function template_preprocess_entity(&$variables) {
   }
   else {
     // Else, try to automatically detect it.
-    $variables['page'] = $uri && $uri['path'] == $_GET['q'];
+    $variables['page'] = $uri && !empty($uri['path']) && $uri['path'] == $_GET['q'];
   }
 
   // Helpful $content variable for templates.
diff --git a/drupal7/sites/all/modules/entity/views/handlers/entity_views_handler_relationship_by_bundle.inc b/drupal7/sites/all/modules/entity/views/handlers/entity_views_handler_relationship_by_bundle.inc
index 55b0fc2f..a4d09d3e 100644
--- a/drupal7/sites/all/modules/entity/views/handlers/entity_views_handler_relationship_by_bundle.inc
+++ b/drupal7/sites/all/modules/entity/views/handlers/entity_views_handler_relationship_by_bundle.inc
@@ -93,7 +93,7 @@ class entity_views_handler_relationship_by_bundle extends views_handler_relation
       $def['extra'] = array(
         array(
           // The table and the IN operator are implicit.
-          'field' => $entity_info['bundle keys']['bundle'],
+          'field' => $entity_info['entity keys']['bundle'],
           'value' => $this->options['bundle_types'],
         ),
       );
diff --git a/drupal7/sites/all/modules/module_filter/CHANGELOG.txt b/drupal7/sites/all/modules/module_filter/CHANGELOG.txt
index 319c50bb..c5c66703 100644
--- a/drupal7/sites/all/modules/module_filter/CHANGELOG.txt
+++ b/drupal7/sites/all/modules/module_filter/CHANGELOG.txt
@@ -1,3 +1,19 @@
+Module Filter 7.x-2.x, 2015-02-20
+---------------------------------
+Simplifying the table rows by hiding version and requirements until a
+  particular description is clicked.
+
+
+Module Filter 7.x-2.x, 2014-09-01
+---------------------------------
+#2235553 by greenSkin: Fixed latest jquery_update breaks module filter.
+#2304687 by mpdonadio: Fixed Remove hardcoded operations.
+#2293029 by topsitemakers: Fixed Take header offset into account when selecting
+  a tab.
+#2290213 by topsitemakers: Minor typo in description - "has no affect" -> "has
+  no effect".
+
+
 Module Filter 7.x-2.0-alpha2, 2013-12-06
 ----------------------------------------
 #2141743, #2141743 by greenSkin: Fixed issues related to the new dynamically
diff --git a/drupal7/sites/all/modules/module_filter/css/modules.css b/drupal7/sites/all/modules/module_filter/css/modules.css
new file mode 100644
index 00000000..91fa7418
--- /dev/null
+++ b/drupal7/sites/all/modules/module_filter/css/modules.css
@@ -0,0 +1,47 @@
+#system-modules table {
+  table-layout: fixed;
+}
+#system-modules th.checkbox {
+  width: 8%;
+}
+#system-modules th.name {
+  width: 25%;
+}
+#system-modules th.links {
+  width: 15%;
+}
+#system-modules td {
+  vertical-align: top;
+}
+#system-modules .expand.inner {
+  background: transparent url(/misc/menu-collapsed.png) left 0.6em no-repeat;
+  margin-left: -12px;
+  padding-left: 12px;
+}
+#system-modules .expanded.expand.inner {
+  background: transparent url(/misc/menu-expanded.png) left 0.6em no-repeat;
+}
+#system-modules .description {
+  cursor: pointer;
+}
+#system-modules .description .inner {
+  overflow: hidden; /* truncates descriptions if too long */
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+#system-modules .description .requirements,
+#system-modules .description .links {
+  display: none;
+}
+#system-modules .description .expanded.inner {
+  overflow: visible;
+  white-space: normal;
+}
+#system-modules .description .expanded .requirements,
+#system-modules .description .expanded .links {
+  display: block;
+}
+#system-modules .requirements {
+  padding: 5px 0;
+  max-width: 490px;
+}
diff --git a/drupal7/sites/all/modules/module_filter/js/module_filter_tab.js b/drupal7/sites/all/modules/module_filter/js/module_filter_tab.js
index e30941cd..aa54b983 100644
--- a/drupal7/sites/all/modules/module_filter/js/module_filter_tab.js
+++ b/drupal7/sites/all/modules/module_filter/js/module_filter_tab.js
@@ -418,9 +418,13 @@ Drupal.ModuleFilter.selectTab = function(hash) {
     Drupal.ModuleFilter.modulesTop = $('#module-filter-modules').offset().top;
   }
   else {
+    // 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;
     // Scroll back to top of #module-filter-modules.
     $('html, body').animate({
-      scrollTop: Drupal.ModuleFilter.modulesTop
+      scrollTop: Drupal.ModuleFilter.modulesTop - headerOffset
     }, 500);
     // $('html, body').scrollTop(Drupal.ModuleFilter.modulesTop);
   }
diff --git a/drupal7/sites/all/modules/module_filter/js/modules.js b/drupal7/sites/all/modules/module_filter/js/modules.js
index 505c395c..7df5f87f 100644
--- a/drupal7/sites/all/modules/module_filter/js/modules.js
+++ b/drupal7/sites/all/modules/module_filter/js/modules.js
@@ -2,6 +2,12 @@
 
 Drupal.behaviors.moduleFilter = {
   attach: function(context) {
+    $('#system-modules td.description').once('description', function() {
+      $('.inner.expand', $(this)).click(function() {
+        $(this).toggleClass('expanded');
+      });
+    });
+
     $('.module-filter-inputs-wrapper', context).once('module-filter', function() {
       var filterInput = $('input[name="module_filter[name]"]', context);
       var selector = '#system-modules table tbody tr';
diff --git a/drupal7/sites/all/modules/module_filter/module_filter.admin.inc b/drupal7/sites/all/modules/module_filter/module_filter.admin.inc
index 83d4cd6c..2345d8de 100644
--- a/drupal7/sites/all/modules/module_filter/module_filter.admin.inc
+++ b/drupal7/sites/all/modules/module_filter/module_filter.admin.inc
@@ -17,7 +17,7 @@ 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 affect when using Overlay module.'),
+    '#description' => t('Currently has no effect when using Overlay module.'),
     '#default_value' => variable_get('module_filter_set_focus', 1),
   );
 
diff --git a/drupal7/sites/all/modules/module_filter/module_filter.info b/drupal7/sites/all/modules/module_filter/module_filter.info
index 9c6d21a7..a48b58f3 100644
--- a/drupal7/sites/all/modules/module_filter/module_filter.info
+++ b/drupal7/sites/all/modules/module_filter/module_filter.info
@@ -17,9 +17,9 @@ files[] = js/module_filter_tab.js
 
 configure = admin/config/user-interface/modulefilter
 
-; Information added by Drupal.org packaging script on 2013-12-06
-version = "7.x-2.0-alpha2"
+; Information added by Drupal.org packaging script on 2015-02-22
+version = "7.x-2.0"
 core = "7.x"
 project = "module_filter"
-datestamp = "1386356916"
+datestamp = "1424631189"
 
diff --git a/drupal7/sites/all/modules/module_filter/module_filter.module b/drupal7/sites/all/modules/module_filter/module_filter.module
index b8fde5f9..42b39135 100644
--- a/drupal7/sites/all/modules/module_filter/module_filter.module
+++ b/drupal7/sites/all/modules/module_filter/module_filter.module
@@ -83,7 +83,7 @@ function module_filter_form_system_modules_alter(&$form, &$form_state, $form_id)
 
   if (variable_get('module_filter_tabs', 1)) {
     $form['module_filter']['#attached']['css'][] = drupal_get_path('module', 'module_filter') .'/css/module_filter_tab.css';
-    $form['module_filter']['#attached']['js'][] = 'misc/jquery.ba-bbq.js';
+    $form['module_filter']['#attached']['library'][] = array('system', 'jquery.bbq');
     $form['module_filter']['#attached']['js'][] = drupal_get_path('module', 'module_filter') .'/js/module_filter_tab.js';
 
     if (!module_exists('page_actions') && variable_get('module_filter_dynamic_save_position', 1)) {
@@ -91,6 +91,8 @@ function module_filter_form_system_modules_alter(&$form, &$form_state, $form_id)
       $form['module_filter']['#attached']['js'][] = drupal_get_path('module', 'module_filter') .'/js/dynamic_position.js';
     }
 
+    $form['#attached']['css'][] = drupal_get_path('module', 'module_filter') . '/css/modules.css';
+
     $form['#theme'] = 'module_filter_system_modules_tabs';
   }
 
diff --git a/drupal7/sites/all/modules/module_filter/module_filter.theme.inc b/drupal7/sites/all/modules/module_filter/module_filter.theme.inc
index 0b7be8a3..b199bedf 100644
--- a/drupal7/sites/all/modules/module_filter/module_filter.theme.inc
+++ b/drupal7/sites/all/modules/module_filter/module_filter.theme.inc
@@ -32,10 +32,10 @@ function theme_module_filter_system_modules_tabs($variables) {
   }
 
   $header = array(
-    t('Enabled'),
-    t('Name'),
-    t('Version'),
-    t('Description')
+    array('data' => '', 'class' => array('checkbox')),
+    array('data' => t('Name'), 'class' => array('name')),
+    array('data' => t('Description'), 'class' => array('description')),
+    array('data' => t('Links'), 'class' => array('links')),
   );
   $package_ids = array('all');
   $enabled['all'] = array();
@@ -79,6 +79,11 @@ function theme_module_filter_system_modules_tabs($variables) {
       }
 
       $row = array();
+
+      $version = !empty($module['version']['#markup']);
+      $requires = !empty($module['#requires']);
+      $required_by = !empty($module['#required_by']);
+
       $toggle_enable = '';
       if (isset($module['enable']['#type']) && $module['enable']['#type'] == 'checkbox') {
         unset($module['enable']['#title']);
@@ -89,26 +94,32 @@ function theme_module_filter_system_modules_tabs($variables) {
         $toggle_enable = '<div class="js-hide toggle-enable ' . $class . '"><div>&nbsp;</div></div>';
       }
       $row[] = array('class' => array('checkbox'), 'data' => $toggle_enable . drupal_render($module['enable']));
+
       $label = '<label';
       if (isset($module['enable']['#id'])) {
         $label .= ' for="' . $module['enable']['#id'] . '"';
       }
-      $row[] = array('class' => array('name'), 'data' => $label . '><strong>' . drupal_render($module['name']) . '</strong><br><span class="module-machine-name">(' . $key . ')</span></label>');
-      $row[] = array('class' => array('version'), 'data' => drupal_render($module['version']));
-      // Add the description, along with any modules it requires and any
-      // operation links.
-      $description = drupal_render($module['description']);
-      if ($module['#requires']) {
-        $description .= '<div class="admin-requirements">' . t('Requires: !module-list', array('!module-list' => implode(', ', $module['#requires']))) . '</div>';
-      }
-      if ($module['#required_by']) {
-        $description .= '<div class="admin-requirements">' . t('Required by: !module-list', array('!module-list' => implode(', ', $module['#required_by']))) . '</div>';
+      $row[] = array('class' => array('name'), 'data' => $label . '><strong>' . drupal_render($module['name']) . '</strong> <span class="module-machine-name">(' . $key . ')</span></label>');
+
+      // Add the description, along with any modules it requires.
+      $description = '<span class="details"><span class="text">' . drupal_render($module['description']) . '</span></span>';
+      if ($version || $requires || $required_by) {
+        $description .= '<div class="requirements">';
+        if ($version) {
+          $description .= '<div class="admin-requirements">' . t('Version: !module-version', array('!module-version' => drupal_render($module['version']))) . '</div>';
+        }
+        if ($requires) {
+          $description .= '<div class="admin-requirements">' . t('Requires: !module-list', array('!module-list' => implode(', ', $module['#requires']))) . '</div>';
+        }
+        if ($required_by) {
+          $description .= '<div class="admin-requirements">' . t('Required by: !module-list', array('!module-list' => implode(', ', $module['#required_by']))) . '</div>';
+        }
+        $description .= '</div>';
       }
+      $row[] = array('data' => '<div class="inner expand" role="button">' . $description . '</div>', 'class' => array('description'));
+
       $operations = (module_exists('ctools')) ? theme('module_filter_operations', array('links' => $module['links'], 'dropbutton' => TRUE)) : theme('module_filter_operations', array('links' => $module['links']));
-      if (!empty($operations)) {
-        $description .= $operations;
-      }
-      $row[] = array('data' => $description, 'class' => array('description'));
+      $row[] = array('data' => '<div class="links">' . $operations . '</div>', 'class' => array('links'));
 
       $class = array(module_filter_get_id($package) . '-tab', 'module', $stripe);
       if (isset($recent_modules[$key])) {
@@ -159,7 +170,7 @@ function theme_module_filter_operations(&$vars) {
   $dropbutton = $vars['dropbutton'];
 
   $operations = array();
-  foreach (array('configure', 'permissions', 'help') as $key) {
+  foreach (element_children($links) as $key) {
     if ($dropbutton) {
       hide($links[$key]);
       if (!empty($links[$key]['#href'])) {
