? flexifilter-admin-list.tpl.php
? flexifilter_ui.patch
Index: flexifilter.admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/flexifilter/flexifilter.admin.inc,v
retrieving revision 1.13
diff -u -p -r1.13 flexifilter.admin.inc
--- flexifilter.admin.inc	24 Jan 2008 01:57:10 -0000	1.13
+++ flexifilter.admin.inc	29 Jan 2008 01:05:20 -0000
@@ -4,10 +4,24 @@
 /**
  * Generates the form for the admin overview page
  */
-function flexifilter_filter_list_form() {
+function flexifilter_admin_list_form($form_state) {
   drupal_set_title("Flexifilters overview");
   $path = drupal_get_path('module', 'flexifilter') .'/flexifilter.css';
   drupal_add_css($path, 'module', 'all', FALSE);
+  if (isset($form_state['values']['enabled'])) {
+    foreach ($form_state['values']['enabled']['statuses'] as $fid => $value) {
+      if ($value == 'disabled') {
+        db_query('UPDATE {flexifilters} SET enabled = 0 WHERE fid = %d', $fid);
+      }
+    }
+  }
+  if (isset($form_state['values']['disabled'])) {
+    foreach ($form_state['values']['disabled']['statuses'] as $fid => $value) {
+      if ($value == 'enabled') {
+        db_query('UPDATE {flexifilters} SET enabled = 1 WHERE fid = %d', $fid);
+      }
+    }
+  }
 
   $form = array();
   $form['enabled_header'] = array(
@@ -21,7 +35,23 @@ function flexifilter_filter_list_form() 
     '#suffix' => t('If a flexifilter is disabled, then it cannot be used within input formats, although it can be used within other flexifilters.') .'<br/>',
   );
   $form['disabled'] = flexifilter_filter_list_form_table(FALSE);
-
+  
+  $form['submit'] = array(
+    '#type'  => 'submit', 
+    '#value' => t('Save'),
+    '#ahah'  => array(
+      'path'     => 'admin/build/flexifilters/js/list_form',
+      'selector' => '.flexifilter-status',
+      'wrapper'  => 'flexifilter-admin-list-form',
+      'event'    => 'change',
+      'effect'   => 'none',
+      'method'   => 'replace',
+    ),
+  );
+  if (!isset($form_state['values'])) {
+    $form['#theme'] = 'flexifilter_filter_admin_form';
+  }
+  
   return $form;
 }
 
@@ -29,39 +59,63 @@ function flexifilter_filter_list_form() 
  * Helper function for flexifilter_filter_list_form. Returns the table for the overview page.
  *
  * @param $enabled
- *   Is TRUE if we're theming the currently enabled filters.s
+ *   Is TRUE if we're theming the currently enabled filters.
  */
 function flexifilter_filter_list_form_table($enabled) {
-  $show_disable_link = $enabled;
-  $show_enable_link  = !$enabled && flexifilter_get_number_enabled_filters() < FLEXIFILTER_MAX_FILTERS;
-  $header            = array(t('Label'), t('Description'), t('Edit'), t('Delete'), t($enabled ? 'Disable' : 'Enable'));
-  $rows              = array();
-  $filters           = flexifilter_get_filters();
+  $options = array();
+  if (flexifilter_get_number_enabled_filters() < FLEXIFILTER_MAX_FILTERS) {
+    $options['enabled'] = t('Enabled');
+  }
+  $options['disabled'] = t('Disabled');
+  $rowinfo  = array();
+  $statuses = array();
+  $filters  = flexifilter_get_filters();
   foreach ($filters as $id => $filter) {
     if ($filter['enabled'] == $enabled) {
-      $row   = array($filter['label'], $filter['description']);
-      $row[] = l(t('Edit'), 'admin/build/flexifilters/'. $id .'/edit', array(), drupal_get_destination());
-      $row[] = l(t('Delete'), 'admin/build/flexifilters/'. $id .'/delete', array(), drupal_get_destination());
-      if ($show_disable_link) {
-        $row[] = l(t('Disable'), 'admin/build/flexifilters/'. $id .'/disable', array(), drupal_get_destination());
-      }
-      else if ($show_enable_link) {
-        $row[] = l(t('Enable'), 'admin/build/flexifilters/'. $id .'/enable', array(), drupal_get_destination());
-      }
-      else {
-        $row[] = '';
-      }
-      $rows[] = $row;
+      $rowinfo[] = array(
+        'label' => $filter['label'],
+        'description' => $filter['description'],
+        'edit' => l(t('Edit'), 'admin/build/flexifilters/'. $id .'/edit', array(), drupal_get_destination()),
+      );
+      $statuses[$filter['id']] = array(
+        '#type' => 'select',
+        '#title' => t('Status'),
+        '#options' => $options,
+        '#default_value' => ($enabled? 'enabled' : 'disabled'),
+        '#attributes' => array('class' => 'flexifilter-status'),
+      );
     }
   }
-  if (count($rows)) {
-    return array('#value' => theme('table', $header, $rows, array('class' => 'flexifilters-list')));
+  if (count($rowinfo)) {
+    return array('#theme' => 'flexifilter_admin_list', '#rowinfo' => $rowinfo, 'statuses' => $statuses, '#tree' => TRUE);
   }
   else {
-    return array('#value' => t('None.'));
+    return array('#value' => '<strong>'. t('There are no @status filters at this moment.', array('@status' => ($enabled? t('enabled') : t('disabled')))) .'</strong><br />');
   }
 }
 
+function template_preprocess_flexifilter_admin_list(&$variables) {
+  $variables['table'] = array();
+  foreach ($variables['form']['#rowinfo'] as $index => $rowinfo) {
+    $variables['table'][$index] = $rowinfo;
+  }
+  $count = 0;
+  foreach (element_children($variables['form']['statuses']) as $key) {
+    unset($variables['form']['statuses'][$key]['#title']);
+    $variables['table'][$count]['status'] = drupal_render($variables['form']['statuses'][$key]);
+    $count++;
+  }
+  $variables['label']       = t('Label');
+  $variables['description'] = t('Description');
+  $variables['status']      = t('Status');
+}
+
+function theme_flexifilter_filter_admin_form($form) {
+  unset($form['submit']);
+  return '<div id="flexifilter-admin-list-form">'. drupal_render($form) .'</div>';
+}
+
+
 /**
  * Helper function for flexifilter_filter_edit_form; removes the automatic
  * naming of submit controls.
@@ -728,42 +782,6 @@ function flexifilter_filter_delete_form_
   $form_state['redirect'] = 'admin/build/flexifilters';
 }
 
-function flexifilter_filter_disable_form($form_state, $flexifilter) {
-  $form = array();
-  $form['fid'] = array('#type' => 'hidden', '#value' => $flexifilter['id']);
-
-  return confirm_form($form, t('Are you sure you want to disable the flexifilter "%flexifilter"?', array('%flexifilter' => $flexifilter['label'])), 'admin/build/flexifilters', t('If you disable the flexifilter, then it cannot be used in any Input Formats.'), t('Disable'), t('Cancel'));
-}
-
-function flexifilter_filter_disable_form_submit($form, &$form_state) {
-  $fid     = $form_state['values']['fid'];
-  $filters = flexifilter_get_filters();
-  $filter  = $filters[$fid];
-  if ($filter['enabled']) {
-    flexifilter_remove_from_filters($filter['delta']);
-    db_query('UPDATE {flexifilters} SET enabled = 0 WHERE fid = %d', $fid);
-    drupal_set_message(t('Flexifilter disabled.'));
-  }
-  $form_state['redirect'] = 'admin/build/flexifilters';
-}
-
-function flexifilter_filter_enable_form($form_state, $flexifilter) {
-  $form = array();
-  $form['fid'] = array('#type' => 'hidden', '#value' => $flexifilter['id']);
-
-  return confirm_form($form, t('Are you sure you want to enable the flexifilter "%flexifilter"?', array('%flexifilter' => $flexifilter['label'])), 'admin/build/flexifilters', t(''), t('Enable'), t('Cancel'));
-}
-
-function flexifilter_filter_enable_form_submit($form, &$form_state) {
-  $fid     = $form_state['values']['fid'];
-  $filters = flexifilter_get_filters();
-  $filter  = $filters[$fid];
-  if (!$filter['enabled'] && flexifilter_get_number_enabled_filters() < FLEXIFILTER_MAX_FILTERS) {
-    db_query('UPDATE {flexifilters} SET enabled = 1, delta = %d WHERE fid = %d', flexifilter_get_unused_delta(), $fid);
-    drupal_set_message(t('Flexifilter enabled.'));
-  }
-  $form_state['redirect'] = 'admin/build/flexifilters';
-}
 
 function flexifilter_filter_export_form($form_state, $flexifilter) {
   $form = array();
@@ -847,4 +865,46 @@ function flexifilter_filter_default_form
   }
   flexifilter_install_flexifilters('flexifilter', $to_be_saved);
   $form_state['redirect'] = 'admin/build/flexifilters';
-}
\ No newline at end of file
+}
+
+function flexifilter_js($parameter = '') {
+  switch ($parameter) {
+    case 'list_form':
+      $form = _flexifilter_js();
+      $output = '<div id="flexifilter-admin-list-form">';
+      foreach (element_children($form) as $key) {
+        $output .= drupal_render($form[$key]);
+      }
+      drupal_json(array('status' => TRUE, 'data' => $output .'</div>'));
+      break;
+  }
+}
+
+function _flexifilter_js() {
+  $form_state = array('storage' => NULL, 'submitted' => FALSE);
+  $form_build_id = $_POST['form_build_id'];
+  $form = form_get_cache($form_build_id, &$form_state);
+  // #parameters has $form_id, $form_state and then whatever was passed to
+  // drupal_get_form.
+  $args = $form['#parameters'];
+  $form_id = array_shift($args);
+  $form['#post'] = $_POST;
+  $form['#redirect'] = FALSE;
+  // This will set up $form_state['clicked_button'] and
+  // $form_state['storage']['mlid'].
+  drupal_process_form($form_id, $form, $form_state);
+  // Recreate and re-cache the form.
+  $form = drupal_rebuild_form($form_id, $form_state, $args, $form_build_id);
+  // Pick up the parents of the pressed button.
+  $array_parents = $form_state['clicked_button']['#array_parents'];
+  // The last parent is the button itself, we need the wrapper instead.
+  $button_index = array_pop($array_parents);
+  while ($array_parents) {
+    $parent = array_shift($array_parents);
+    $form = $form[$parent];
+  }
+  // Remove the button.
+  unset($form[$button_index]);
+  // Render messages and selects.
+  return $form;
+}
Index: flexifilter.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/flexifilter/flexifilter.module,v
retrieving revision 1.14
diff -u -p -r1.14 flexifilter.module
--- flexifilter.module	23 Jan 2008 22:43:16 -0000	1.14
+++ flexifilter.module	29 Jan 2008 01:05:20 -0000
@@ -21,7 +21,7 @@ function flexifilter_menu() {
     'description' => t('Create new flexible input filters without writing any code.'),
     'page callback' => 'drupal_get_form',
     'access arguments' => array('administer flexifilter'),
-    'page arguments' => array('flexifilter_filter_list_form'),
+    'page arguments' => array('flexifilter_admin_list_form'),
     'file' => 'flexifilter.admin.inc',
   );
   $items['admin/build/flexifilters/list'] = array(
@@ -78,23 +78,22 @@ function flexifilter_menu() {
     'page arguments' => array('flexifilter_filter_delete_form', 3),
     'file' => 'flexifilter.admin.inc',
   );
-  $items['admin/build/flexifilters/%flexifilter/enable'] = array(
-    'title' => t('Enable'),
+  $items['admin/build/flexifilters/js'] = array(
+    'title' => t('JavaScript Callback'),
     'type' => MENU_CALLBACK,
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('flexifilter_filter_enable_form', 3),
-    'file' => 'flexifilter.admin.inc',
-  );
-  $items['admin/build/flexifilters/%flexifilter/disable'] = array(
-    'title' => t('Disable'),
-    'type' => MENU_CALLBACK,
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('flexifilter_filter_disable_form', 3),
+    'page callback' => 'flexifilter_js',
     'file' => 'flexifilter.admin.inc',
   );
   return $items;
 }
 
+function flexifilter_theme() {
+  return array(
+    'flexifilter_admin_list' => array('template' => 'flexifilter-admin-list', 'file' => 'flexifilter.admin.inc', 'arguments' => array('form' => NULL)),
+    'flexifilter_filter_admin_form' => array('file' => 'flexifilter.admin.inc', 'arguments' => array('form' => NULL)),
+  );
+}
+
 /**
  * Implementation of hook_help()
  */
