? og_subgroups_867124.patch
Index: og_subgroups.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/og_subgroups/og_subgroups.module,v
retrieving revision 1.47.2.3
diff -u -p -r1.47.2.3 og_subgroups.module
--- og_subgroups.module	3 Sep 2010 21:01:24 -0000	1.47.2.3
+++ og_subgroups.module	27 Oct 2010 18:51:23 -0000
@@ -24,19 +24,22 @@ function og_subgroups_menu() {
       'access arguments' => array('administer groups hierachy'),
       'weight' => 1,
      );
-
-    $items['node/%node/og/subgroups'] = array(
-      'title' => 'Subgroups',
-      'page callback' => 'drupal_get_form',
-      'page arguments' => array('og_subgroups_outline', 1),
-      'access arguments' => array(1),
-      'access callback' => 'og_subgroups_access',
-      'type' => MENU_LOCAL_TASK,
-      'weight' => 2,
-    );
   return $items;
 }
 
+/**
+ * Implenentation of hook_form_alter().
+ */
+function og_subgroups_form_alter(&$form, &$form_state, $form_id) {
+  if (isset($form['#node']) && $form_id == $form['#node']->type .'_node_form') {
+    $node = $form['#node'];
+    if (og_is_group_type($node->type)) {
+      // Add the subgroup fields to the node form
+      $form = array_merge($form, og_subgroups_form($node));
+    }
+  }
+}
+
 /** 
  * API function to set/ update groups hierarchy.
  * 
@@ -48,12 +51,10 @@ function og_subgroups_menu() {
  *  The node id of the group that will be the parrent
  * @param $validate
  *  Set to TRUE when a validation on the node and parent node is required.
- * @param $log
- *  The log message.
  * @return 
  *  boolean indicating if operation preformed in case $validate is enabled.
  */
-function og_subgroups_set_hierarchy($op, $node, $parent_nid, $validate = FALSE, $log = NULL) {
+function og_subgroups_set_hierarchy($op, $node, $parent_nid, $validate = FALSE) {
   $valid = FALSE;
   if ($validate) {
     // Check node is a group type.
@@ -74,13 +75,12 @@ function og_subgroups_set_hierarchy($op,
   }
   if ($valid) {
     if ($op == 'insert') {
-      db_query('INSERT INTO {og_subgroups} (gid, parent) VALUES (%d, %d)', $node->nid, $parent_nid);  
+      db_query('INSERT INTO {og_subgroups} (gid, parent) VALUES (%d, %d)', $node->nid, $parent_nid);
+      drupal_set_message(t('The subgroup has been set.'));
     }
     elseif ($op == 'update') {
       db_query('UPDATE {og_subgroups} SET parent = %d WHERE gid = %d', $parent_nid, $node->nid);
-    }    
-    if ($log) {
-      db_query("UPDATE {node_revisions} SET log = '%s' WHERE vid = %d", $log, $node->vid);     
+      drupal_set_message(t('The subgroup has been assigned a new parent.'));
     }
   }
   return $valid;
@@ -94,10 +94,11 @@ function og_subgroups_set_hierarchy($op,
  */
 function og_subgroups_remove_hierarchy($node) {
   db_query('DELETE FROM {og_subgroups} WHERE gid = %d', $node->nid); 
+  drupal_set_message(t('The parent/child relationship has been removed.'));
 }
 
 function og_subgroups_access($node) {
-  return og_is_group_admin($node) && og_is_group_type($node->type);
+  return ( og_is_group_admin($node) || user_access('edit groups hierachy'));
 }
 
 /**
@@ -234,6 +235,10 @@ function og_subgroups_nodeapi($node, $op
       }
       break;
     case 'insert':
+      if ($node->og_subgroups['parent']) {
+        og_subgroups_set_hierarchy('insert', $node, $node->og_subgroups['parent']);
+      }
+
       $groups = og_get_node_groups($node);
       if ($groups) {
         $content_directions = variable_get('og_subgroups_propagate_content', array());
@@ -241,6 +246,16 @@ function og_subgroups_nodeapi($node, $op
       }
       break;
     case 'update':
+      // Get the original parent value
+      $original_parent = og_subgroups_get_family($node->nid, 'up');
+
+      if (empty($original_parent) && $node->og_subgroups['parent']) {
+        og_subgroups_set_hierarchy('insert', $node, $node->og_subgroups['parent']);
+      }
+      else if ($original_parent[0]->gid != $node->og_subgroups['parent']) {
+        ($node->og_subgroups['parent'] == 0) ? og_subgroups_remove_hierarchy($node) : og_subgroups_set_hierarchy('update', $node, $node->og_subgroups['parent']);
+      }
+
       $groups = og_get_node_groups($node);
       if ($groups) {
         $content_directions = variable_get('og_subgroups_propagate_content', array());
@@ -336,86 +351,61 @@ function og_subgroups_get_eligable_group
  * Implementation of function og_subgroups_outline()
  * Handles all subgroups outline operations.
  */
-function og_subgroups_outline($form_state, $node) {
+function og_subgroups_form($node) {
   // Get all accessible/ inaccesiable groups for the user.
   $options = og_subgroups_get_eligable_groups('accessibale');
   $inaccessibale = og_subgroups_get_eligable_groups('inaccessibale');
   
-  $description = t('The parent group for this group node in the subgroups.');
+  $description = t('The parent group for this group node.');
   if ($inaccessibale) {
     $description .= '<br/>'. t("There are some groups which are inaccesible to you and their names appears as &lt;private group&gt;.");
   }
   
-  $form['parent'] = array(
-    '#type' => 'select',
-    '#title' => t('Parent'),
-    '#default_value' => $node->og_subgroups,
-    '#options' => og_subgroups_tree($options, $node->nid, $inaccessibale),
-    '#description' => $description,
-  );
-  $form['log'] = array(
-    '#type' => 'textarea',
-    '#title' => t('Log message'),
-    '#description' => t('An explanation to help other group admins understand your motivations to change the subgroups.'),
-  );
-  $form['nid'] = array(
-    '#type' => 'value', 
-    '#value' => $node->nid,
+  $form['og_subgroups'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Subgroups'),
+    '#description' => t('Position groups under one another to create a subgroup hierarchy'),
+    '#collapsible' => TRUE,
+    '#collapsed' => FALSE,
+    '#tree' => TRUE,
+    '#access' => og_subgroups_access($node),
   );
-  
-  if (isset($node->og_subgroups)) {
-    $form['update'] = array(
-      '#type' => 'submit',
-      '#value' => t('Update subgroups'),
-    );
-    $form['remove'] = array(
-      '#type' => 'submit',
-      '#value' => t('Remove group from subgroups'),
+
+  if (module_exists('og_subgroups_hs')) {
+    // If array, then node is being previewed.
+    $default = (is_array($node->og_subgroups)) ? $node->og_subgroups['parent'] : $node->og_subgroups;
+    $form['og_subgroups']['parent'] = array(
+      '#type' => 'hierarchical_select',
+      '#title' => t('Parent'),
+      '#size' => 1,
+      '#config' => array(
+        'module' => 'og_subgroups_hs',
+        'params' => array(
+          'nid' => (isset($node->nid)) ? $node->nid : NULL,
+        ),
+        'save_lineage'    => 0,
+        'enforce_deepest' => 0,
+        'entity_count'    => 0,
+        'resizable'       => 0,
+      ),
+      '#default_value' => $default,
+      '#description' => $description,
     );
   }
   else {
-    $form['add'] = array(
-      '#type' => 'submit', 
-      '#value' => t('Set subgroups'),
+    $form['og_subgroups']['parent'] = array(
+      '#type' => 'select',
+      '#title' => t('Parent'),
+      '#default_value' => $node->og_subgroups,
+      '#options' => og_subgroups_tree($options, $node->nid, $inaccessibale),
+      '#description' => $description,
     );
-  } 
+  }
 
-  (in_array($node->nid, $inaccessibale)) ? $title = t('&lt;private group&gt;') : $title = check_plain($node->title);
-  drupal_set_title($title);
   return $form;
 }
 
 /**
- * Handles subgroups form submissions.
- */
-function og_subgroups_outline_submit($form, &$form_state) {
-  $op = $form_state['values']['op'];
-  $node = node_load($form_state['values']['nid']);
-  switch ($op) {
-    case t('Set subgroups'):
-      if ($form_state['values']['parent']) {
-        og_subgroups_set_hierarchy('insert', $node, $form_state['values']['parent'], FALSE, $form_values['log']);
-      }
-      drupal_set_message(t('The subgroup has been set.'));
-      break;
-    case t('Update subgroups'):
-      if ($form_state['values']['parent']) {
-        og_subgroups_set_hierarchy('update', $node, $form_state['values']['parent'], FALSE, $form_values['log']);
-      } 
-      else {
-        og_subgroups_remove_hierarchy($node);
-      }
-      drupal_set_message(t('The subgroup has been updated.'));
-      break;
-    case t('Remove group from subgroups'):
-      og_subgroups_remove_hierarchy($node);
-      drupal_set_message(t('Group has been removed from subgroups.'));
-      break;
-  }
-  $form_state['redirect'] = 'node/' . $node->nid;
-}
-
-/**
  * Returns an array of titles and groups nids in tree hiearachy order.
  * 
  * @param $groups
@@ -451,8 +441,6 @@ function og_subgroups_tree($groups, $exc
       $tree = og_subgroups_tree_recurse($gid, $exclude, $inaccessibale, $tree, $indent .'--');
     }
 
-    
-
   }
   return $tree;
 }
Index: og_subgroups_hs.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/og_subgroups/Attic/og_subgroups_hs.module,v
retrieving revision 1.1.2.2
diff -u -p -r1.1.2.2 og_subgroups_hs.module
--- og_subgroups_hs.module	3 Sep 2010 21:01:24 -0000	1.1.2.2
+++ og_subgroups_hs.module	27 Oct 2010 18:51:23 -0000
@@ -6,39 +6,6 @@
  * Implementation of the Hierarchical Select API for the OG Subgroups module.
  */
 
-
-//----------------------------------------------------------------------------
-// Drupal core hooks.
-
-
-/**
- * Implementation of hook_form_alter().
- */
-function og_subgroups_hs_form_alter(&$form, $form_state, $form_id) {
-  switch ($form_id) {
-    case 'og_subgroups_outline':
-      unset($form['parent']['#options']);
-      $form['parent'] = array(
-        '#type' => 'hierarchical_select',
-        '#title' => 'Parent Groups',
-        '#size' => 1,
-        '#config' => array(
-          'module' => 'og_subgroups_hs',
-          'params' => array(
-            'nid' => (isset($form['nid'])) ? $form['nid']['#value'] : NULL,
-          ),
-          'save_lineage'    => 0,
-          'enforce_deepest' => 0,
-          'entity_count'    => 0,
-          'resizable'       => 0,
-        ),
-        '#default_value' => (isset($form['nid'])) ? $form['nid']['#value'] : NULL,
-      );
-    break;
-  }
-}
-
-
 //----------------------------------------------------------------------------
 // Hierarchical Select hooks.
 
