Index: modules/menu/menu.admin.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/menu/menu.admin.inc,v retrieving revision 1.6 diff -u -r1.6 menu.admin.inc --- modules/menu/menu.admin.inc 11 Nov 2007 06:56:44 -0000 1.6 +++ modules/menu/menu.admin.inc 16 Nov 2007 00:46:13 -0000 @@ -27,7 +27,7 @@ * relevant operations. */ function menu_overview_form(&$form_state, $menu) { - $sql =" + $sql = " SELECT m.load_functions, m.to_arg_functions, m.access_callback, m.access_arguments, m.page_callback, m.page_arguments, m.title, m.title_callback, m.title_arguments, m.type, ml.* FROM {menu_links} ml LEFT JOIN {menu_router} m ON m.path = ml.router_path WHERE ml.menu_name = '%s' @@ -74,6 +74,23 @@ '#type' => 'checkbox', '#default_value' => $item['has_children'] && $item['expanded'], ); + $form[$mlid]['weight'] = array( + '#type' => 'weight', + '#default_value' => isset($form_state[$mlid]['weight']) ? $form_state[$mlid]['weight'] : $item['weight'], + ); + $form[$mlid]['depth'] = array( + '#type' => 'hidden', + '#value' => $item['depth'], + ); + $form[$mlid]['mlid'] = array( + '#type' => 'hidden', + '#value' => $item['mlid'], + ); + $form[$mlid]['plid'] = array( + '#type' => 'textfield', + '#default_value' => isset($form_state[$mlid]['plid']) ? $form_state[$mlid]['plid'] : $item['plid'], + '#size' => 6, + ); // Build a list of operations. $operations = array(); $operations['edit'] = l(t('edit'), 'admin/build/menu/item/'. $item['mlid'] .'/edit'); @@ -99,27 +116,49 @@ return $form; } -function menu_overview_form_submit($form) { +function menu_overview_form_submit($form, &$form_state) { + $updated_items = array(); + $fields = array('expanded', 'weight', 'plid', 'weight'); foreach (element_children($form) as $mlid) { if (isset($form[$mlid]['hidden'])) { - $element = $form[$mlid]; + $element = &$form[$mlid]; + // Update any fields that have changed in this menu item. + foreach ($fields as $field) { + if ($element[$field]['#value'] != $element[$field]['#default_value']) { + $element['#item'][$field] = $element[$field]['#value']; + $updated_items[$mlid] = $element['#item']; + } + } + // Hidden is a special case, the value needs to be reversed. if ($element['hidden']['#value'] != $element['hidden']['#default_value']) { $element['#item']['hidden'] = !$element['hidden']['#value']; - menu_link_save($element['#item']); - } - if ($element['expanded']['#value'] != $element['expanded']['#default_value']) { - $element['#item']['expanded'] = $element['expanded']['#value']; - menu_link_save($element['#item']); + $updated_items[$mlid] = $element['#item']; } } } + + // Save all our changed items to the database. + foreach ($updated_items as $item) { + menu_link_save($item); + } } /** * Theme the menu overview form into a table. */ function theme_menu_overview_form($form) { - $header = array(t('Enabled'), t('Expanded'), t('Menu item'), array('data' => t('Operations'), 'colspan' => '3')); + drupal_add_tabledrag('menu-overview', 'match', 'parent', 'menu-plid', 'menu-plid', 'menu-mlid'); + drupal_add_tabledrag('menu-overview', 'order', 'sibling', 'menu-weight'); + + $header = array( + t('Menu item'), + array('data' => t('Expanded'), 'class' => 'checkbox'), + array('data' => t('Enabled'), 'class' => 'checkbox'), + t('Parent'), + t('Weight'), + array('data' => t('Operations'), 'colspan' => '3'), + ); + $rows = array(); foreach (element_children($form) as $mlid) { if (isset($form[$mlid]['hidden'])) { @@ -133,15 +172,22 @@ $operations[] = ''; } + // Add special classes to be used for tabledrag.js. + $element['plid']['#attributes']['class'] = 'menu-plid menu-plid-'. $element['plid']['#value']; + $element['mlid']['#attributes']['class'] = 'menu-mlid menu-mlid-'. $element['plid']['#value']; + $element['weight']['#attributes']['class'] = 'menu-weight menu-weight-'. $element['plid']['#value']; + $row = array(); - $row[] = array('data' => drupal_render($element['hidden']), 'align' => 'center'); - $row[] = array('data' => drupal_render($element['expanded']), 'align' => 'center'); - $depth = $element['#item']['depth']; - $indentation = str_repeat('  ', $depth - 1) . ($depth > 1 ? '- ' : ''); - $row[] = $indentation . drupal_render($element['title']); + + $row[] = theme('indentation', $element['depth']['#value'] - 1) . drupal_render($element['depth']) . drupal_render($element['title']); + $row[] = array('data' => drupal_render($element['expanded']), 'class' => 'checkbox'); + $row[] = array('data' => drupal_render($element['hidden']), 'class' => 'checkbox'); + $row[] = drupal_render($element['plid']) . drupal_render($element['mlid']); + $row[] = drupal_render($element['weight']); $row = array_merge($row, $operations); $row = array_merge(array('data' => $row), $element['#attributes']); + $row['class'] = !empty($row['class'])? $row['class'] .' draggable' : 'draggable'; $rows[] = $row; } } Index: includes/common.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/common.inc,v retrieving revision 1.713 diff -u -r1.713 common.inc --- includes/common.inc 14 Nov 2007 09:49:30 -0000 1.713 +++ includes/common.inc 16 Nov 2007 00:46:12 -0000 @@ -2920,6 +2920,9 @@ 'progress_bar' => array( 'arguments' => array('percent' => NULL, 'message' => NULL), ), + 'indentation' => array( + 'arguments' => array('size' => 1), + ), // from pager.inc 'pager' => array( 'arguments' => array('tags' => array(), 'limit' => 10, 'element' => 0, 'parameters' => array()), Index: includes/theme.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/theme.inc,v retrieving revision 1.394 diff -u -r1.394 theme.inc --- includes/theme.inc 11 Nov 2007 22:43:44 -0000 1.394 +++ includes/theme.inc 16 Nov 2007 00:46:13 -0000 @@ -1672,6 +1672,22 @@ } /** + * Create a standard indentation div. Used for drag and drop tables. + * + * @param $size + * Optional. The number of indentations to create. + * @return + * A string containing indentations. + */ +function theme_indentation($size = 1) { + $output = ''; + for ($n = 0; $n < $size; $n++) { + $output .= '
 
'; + } + return $output; +} + +/** * @} End of "defgroup themeable". */ Index: modules/system/system.css =================================================================== RCS file: /cvs/drupal/drupal/modules/system/system.css,v retrieving revision 1.39 diff -u -r1.39 system.css --- modules/system/system.css 14 Nov 2007 09:49:30 -0000 1.39 +++ modules/system/system.css 16 Nov 2007 00:46:13 -0000 @@ -23,6 +23,9 @@ td.active { background-color: #ddd; } +td.checkbox, th.checkbox { + text-align: center; +} tbody { border-top: 1px solid #ccc; }