? .DS_Store
? change_how_user_roles_are_added_and_deleted.patch
Index: og_user_roles.pages.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/og_user_roles/og_user_roles.pages.inc,v
retrieving revision 1.3
diff -u -p -r1.3 og_user_roles.pages.inc
--- og_user_roles.pages.inc	8 Jun 2009 13:00:05 -0000	1.3
+++ og_user_roles.pages.inc	6 Jul 2009 17:19:13 -0000
@@ -118,6 +118,12 @@ function og_user_roles_page_form($form_s
       '#options' => $roles,
       '#parents' => array('user_roles', $account->uid),
     );
+    // save the user's original roles. Compared with the values in $form['user_roles'][$uid]['roles']['new']
+    // to determine which roles were added and deleted. Used in the submit handler.
+    $form['user_roles'][$account->uid]['original_roles'] = array(
+      '#type' => 'value',
+      '#value' => og_user_roles_get_roles_by_group($node->nid, $account->uid),
+    );
   }
   $form['submit'] = array('#type' => 'submit', '#value' => t('Save'));
 
@@ -129,12 +135,27 @@ function og_user_roles_page_form($form_s
  */
 function og_user_roles_page_form_submit($form, &$form_state) {
   $gid = $form['#node']->nid;
+  foreach ($form_state['values']['user_roles'] as $uid => $roles) {
+    $original_roles = ($roles['original_roles']) ? $roles['original_roles'] : array();
+    $new_roles = array();
+    foreach($roles as $rid => $checked) {
+      if(is_numeric($rid)) {
+        $new_roles[$rid] = $checked;
+      }
+    }
+      
+    //determine which roles to add
+    $add_roles = array_diff($new_roles, $original_roles);
+    $add_roles = array_filter($add_roles);
 
-  foreach ($form_state['values']['user_roles'] as $uid => $new_roles) {
-    og_user_roles_role_delete($gid, $uid);
+    //determine which roles to delete
+    $delete_roles = array_diff($original_roles, $new_roles);
 
-    $new_roles = array_filter($new_roles);
-    foreach ($new_roles as $rid => $checked) {
+    foreach ($delete_roles as $rid => $checked) {
+      og_user_roles_role_delete($gid, $uid, $rid);
+    }
+    
+    foreach ($add_roles as $rid => $checked) {
       og_user_roles_role_add($gid, $uid, $rid);
     }
   }
