Index: system_module.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/util/system_module.module,v
retrieving revision 1.4.2.2
diff -u -r1.4.2.2 system_module.module
--- system_module.module	18 Sep 2009 15:56:16 -0000	1.4.2.2
+++ system_module.module	18 Sep 2009 19:30:37 -0000
@@ -9,7 +9,7 @@
 function system_module_help($path, $args) {
   switch ($path) {
     case 'admin/build/modules':
-      return l(t('Set collapsed state'), 'admin/settings/util/sysmods');
+      return '<p>'. l(t('Set collapsed state'), 'admin/settings/util/sysmods') .'</p>';
 
     case 'admin/settings/util/sysmods':
       return l(t('Go to modules admin page'), 'admin/build/modules');
@@ -34,13 +34,17 @@
 
   // Get all available packages.
   $modules = module_rebuild_cache();
+  $packages = $includes = array();
   foreach ($modules as $module) {
     if (!isset($module->info['package']) || !$module->info['package']) {
       $module->info['package'] = t('Other');
     }
-    $packages[$module->info['package']] = $module->info['package'];
+    $pkg = $module->info['package'];
+    $packages[$pkg] = $pkg;
+    $includes[$pkg][] = $module->info['name'];
   }
   ksort($packages);
+  ksort($includes);
 
   // Build settings form
   $result = db_fetch_array(db_query("SELECT data FROM {system_module_users} WHERE uid = %d}", $user->uid));
@@ -68,6 +72,27 @@
     '#options' => $packages,
     );
 
+  $form['dir'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Directory of package contents'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+    );
+
+  $rows = array();
+  $header = array(t('Package'), t('Includes'));
+  foreach ($includes as $pkg => $modules) {
+   $pkg_id = _system_modules_make_pkgid($pkg);
+    $rows[] = array(
+      l($pkg, 'admin/build/modules', array('fragment' => "package_$pkg_id", 'query' => 'expand="'. $pkg .'"')),
+      implode(', ', $modules),
+      );
+  }
+  $form['dir']['list'] = array(
+    '#type' => 'markup',
+    '#value' => theme('table', $header, $rows),
+    );
+
   $form['submit'] = array(
     '#type' => 'submit',
     '#value' => 'Save configuration',
@@ -113,6 +138,7 @@
   }
 }
 
+// @TODO: Doesn't the system already do this?
 function system_module_disable() {
   drupal_rebuild_theme_registry();
 }
@@ -198,11 +224,20 @@
     else {
       $collapsed = (isset($user->system_module_cfg[$package]) ? TRUE : FALSE);
     }
+    // Is there an 'expand' request?
+    if (isset($_GET['expand'])) {
+      // Strip the quotes from the name.
+      $expand = drupal_substr($_GET['expand'], 1, -1);
+      if ($expand == $package) {
+        $collapsed = FALSE;
+      }
+    }
 
     $fieldset = array(
       '#title' => $package .' ['. $enabled_count .'] of ['. sizeof($modules) .']',
       '#collapsible' => TRUE,
       '#collapsed' => $collapsed,
+      '#attributes' => array('id' => 'package_'. _system_modules_make_pkgid($package)),
       '#value' => theme('table', $header, $rows, array('class' => 'package')),
     );
     $output .= theme('fieldset', $fieldset);
@@ -210,4 +245,19 @@
 
   $output .= drupal_render($form);
   return $output;
-}
\ No newline at end of file
+}
+
+/**
+ * Build a package id for the fieldset.
+ */
+function _system_modules_make_pkgid($package) {
+  switch ($package) {
+    case 'Core - required':
+    case 'Core - optional':
+      $pkg_id = drupal_strtolower(str_replace(' ', '', $package));
+      break;
+    default:
+      $pkg_id = drupal_strtolower(str_replace(array(' ', '/', '"', "'"), array('_', '_', '', ''), $package));
+  }
+  return $pkg_id;
+}

