? ng-sort-images.patch
Index: ng_sort_jqueryui.js
===================================================================
RCS file: ng_sort_jqueryui.js
diff -N ng_sort_jqueryui.js
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ js/ng_sort_jqueryui.js	19 May 2010 13:06:03 -0000
@@ -0,0 +1,21 @@
+Drupal.behaviors.initSorting = function(context) {
+  $('div.item-list ul').addClass('image-sorting-list');
+  $('div.item-list ul li').addClass('image-sorting-list-item').each(function(index, element) {
+    $(element).attr("id", "edit-images-"+index);
+  });
+  $('div.item-list').removeClass('item-list');
+  $('*[id^=edit-images-][id$=-sort-wrapper]').each(function() {
+    $(this).hide();
+  });
+  $(function() {
+    $("ul.image-sorting-list").sortable({
+      update : function(event, ui) {
+        ui.item.parent().children().each(function(index, element) {
+          var id = $(element).attr('id');
+          $('#'+id+'-sort').val(index);
+        });
+      }
+    });
+    $("ul.image-sorting-list").disableSelection();
+  });
+};
Index: node_gallery.css
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/node_gallery/node_gallery.css,v
retrieving revision 1.4.2.2
diff -u -p -r1.4.2.2 node_gallery.css
--- node_gallery.css	18 May 2010 02:07:15 -0000	1.4.2.2
+++ node_gallery.css	18 May 2010 09:53:30 -0000
@@ -15,4 +15,7 @@ table.image-navigator td.image-navigator
 table.image-navigator td.image-navigator-last {width:9%; text-align:center}
 table.image-navigator td.image-navigator-right {width:30%}
 
-.gallery-upload-thumb img { width: 100px; }
\ No newline at end of file
+.gallery-upload-thumb img { width: 100px; }
+
+li.image-sorting-list-item { width: 85px; float: left; list-style: none inside; background: none}
+ul.image-sorting-list { list-style-type: none }
Index: node_gallery.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/node_gallery/node_gallery.module,v
retrieving revision 1.18.2.80
diff -u -p -r1.18.2.80 node_gallery.module
--- node_gallery.module	13 May 2010 01:54:12 -0000	1.18.2.80
+++ node_gallery.module	21 May 2010 09:27:18 -0000
@@ -111,6 +111,16 @@ function node_gallery_menu() {
     'file' => 'node_gallery.admin.inc',
     'type' => MENU_CALLBACK,
   );
+  $items['node/%node_gallery_gallery/sort'] = array(
+    'title' => 'Sort Images',
+    'page callback' => 'node_gallery_sort_images',
+    'page arguments' => array(1),
+    'access callback' => 'node_gallery_user_access',
+    'access arguments' => array('edit image', 1),
+    'file' => 'node_gallery.pages.inc',
+    'weight' => -4,
+    'type' => MENU_LOCAL_TASK,
+  );
   $items['node/%node_gallery_gallery/images'] = array(
     'title' => 'Manage Images',
     'page callback' => 'node_gallery_manage_images',
@@ -239,6 +249,9 @@ function node_gallery_theme() {
     'gallery_sort_images_form' => array(
       'arguments' => array('form' => NULL),
   ),
+    'node_gallery_sort_images_form' => array(
+      'arguments' => array('form' => NULL),
+  ),
   );
   foreach ($themes as &$theme) {
     $theme['path'] = $path;
@@ -502,7 +515,7 @@ function node_gallery_nodeapi(&$node, $o
 function _node_gallery_gallery_view(&$node, $teaser = NULL, $page = NULL) {
   $relationship = node_gallery_get_relationship($node->type);
   $config = $relationship['settings'];
-
+  
   if ($page) {
     $crumbs[] = l(t('Home'), NULL);
     $crumbs[] = l(t('Galleries'), 'galleries');
Index: node_gallery.pages.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/node_gallery/node_gallery.pages.inc,v
retrieving revision 1.12.2.33
diff -u -p -r1.12.2.33 node_gallery.pages.inc
--- node_gallery.pages.inc	11 May 2010 19:44:47 -0000	1.12.2.33
+++ node_gallery.pages.inc	19 May 2010 13:08:32 -0000
@@ -102,6 +102,150 @@ function node_gallery_manage_images($gal
   return views_embed_view(MANAGE_IMAGES_VIEW_NAME, 'default', $gallery->nid);
 }
 
+ /**
+ * Form function for the "Sort Images" tab.
+ * @param $gallery
+ *   A populated node gallery object.
+ *
+ * @return
+ *   Form array.
+ */
+function node_gallery_sort_images_form($form_state, $gallery) {
+  $form = array();
+  $view = views_get_view('node_gallery_gallery_sort_views');
+  $view->set_display('display_list');
+  $view->set_arguments(array($gallery->nid));
+  $output = $view->preview();
+  $form['grid'] = array(
+    '#type' => 'markup',
+    '#value' => $output
+  );
+  $form['images'] = array();
+  $form['images']['#tree'] = true;
+  $count = count($view->result);
+  for ($i = 0; $i < $count; ++$i) {
+    $form['images'][$i]['nid'] = array(
+      '#type' => 'value',
+      '#value' => $view->result[$i]->nid,
+    );
+    $form['images'][$i]['original_sort'] = array(
+      '#type' => 'value',
+      '#value' => $view->result[$i]->node_gallery_images_weight,
+    );
+    $form['images'][$i]['sort'] = array(
+      '#type' => 'weight',
+      '#delta' => $count,
+      '#default_value' => $view->result[$i]->node_gallery_images_weight,
+      '#attributes' => array(
+        'class' => 'sort'
+      )
+    );
+  }
+  $form['gid'] = array(
+    '#type' => 'value',
+    '#value' => $gallery->nid,
+  );
+  $form['gallery_type'] = array(
+    '#type' => 'value',
+    '#value' => $gallery->type,
+  );
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save')
+  );
+  return $form;
+}
+
+function theme_node_gallery_sort_images_form($form) {
+  $output = '';
+  if (module_exists('jquery_ui')) {
+    jquery_ui_add(array('ui.draggable', 'ui.droppable', 'ui.sortable'));
+    drupal_add_js(drupal_get_path('module', 'node_gallery').'/js/ng_sort_jqueryui.js');
+    $output .= drupal_render($form['grid']);
+    $output .= '<br style="clear: both;" />';
+  } else {
+    // get fieldname to retrieve the filepath for the thumbnail without loading the node
+    $relationship = node_gallery_get_relationship($form['gallery_type']['#value']);
+    $field_name = $relationship['imagefield_name'];
+    $rows = array();
+    $header = array('Preview', 'Weight');
+    foreach (element_children($form['images']) as $key) {
+      $element = $form['images'][$key];
+      $filepath = node_gallery_get_image_filepath($element['nid']['#value'], $field_name);
+      $row = array(
+        // the imagecache thumbnail
+        theme('imagecache', 'node-gallery-admin-thumbnail', $filepath),
+        // the weight drop down
+        drupal_render($form['images'][$key]['sort']),
+      );
+     $rows[] = array('data' => $row, 'class' => 'draggable');
+    }
+    // this will replace the weight drop downs with drag&drop when javascript is available
+    drupal_add_tabledrag('sort-images-table', 'order', 'sibling', 'sort');
+    $output .= theme('table', $header, $rows, array('id' => 'sort-images-table'));
+    // don't render the grid if we're using the tablesort
+    unset($form['grid']);
+  }
+  // render the left over elements, if any
+  $output .= drupal_render($form);
+  return $output;
+}
+
+function node_gallery_sort_images_form_submit($form, &$form_state) {
+  $images = array();
+  $gid = $form_state['values']['gid'];
+  foreach ($form_state['values']['images'] as $element) {
+    if ($element['sort'] == $element['original_sort'])
+      continue;
+    $images[] = array(
+      'nid' => $element['nid'],
+      'gid' => $gid,
+      'weight' => $element['sort'],
+    );
+  }
+  if (!empty($images)) {
+    $batch = array(
+      'title' => t('Updating image order'),
+      'operations' => array(
+        array('batch_sorting_callback', array($images)),
+      ),
+      'finished' => 'batch_sorting_finished',
+      'file' => drupal_get_path('module', 'node_gallery') . '/node_gallery.pages.inc',
+    );
+    batch_set($batch);
+  } else {
+    drupal_set_message(t("The order of the images was left unchanged."));
+  }
+}
+
+function batch_sorting_callback($images, &$context) {
+  if (empty($context['sandbox'])) {
+    $context['sandbox']['iterator'] = 0;
+    $context['sandbox']['count'] = count($images);
+  }
+  $context['results'][] = drupal_write_record('node_gallery_images', $images[$context['sandbox']['iterator']], 'nid');
+  $context['sandbox']['iterator']++;
+  if ($context['sandbox']['iterator'] < $context['sandbox']['count']) {
+    $context['finished'] = $context['sandbox']['iterator'] / (float)$context['sandbox']['count'];
+  } else {
+    $context['finished'] = 1;
+  }
+}
+
+function batch_sorting_finished($success, $results, $operation) {
+  if ($success) {
+    $message = format_plural(count($results), 'One image processed.', '@count images processed.');
+  } else {
+    $message = t('Finished with an error.');
+  }
+  drupal_set_message($message);
+}
+
+function node_gallery_sort_images($gallery) {
+  return drupal_get_form('node_gallery_sort_images_form', $gallery);
+}
+
+
 /**
  * Builds the form used for imagefield_import integration.
  * @param $gallery
Index: views2inc/node_gallery.views_default.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/node_gallery/views2inc/Attic/node_gallery.views_default.inc,v
retrieving revision 1.1.2.16
diff -u -p -r1.1.2.16 node_gallery.views_default.inc
--- views2inc/node_gallery.views_default.inc	26 Mar 2010 13:33:27 -0000	1.1.2.16
+++ views2inc/node_gallery.views_default.inc	18 May 2010 09:11:00 -0000
@@ -1638,6 +1638,288 @@ function node_gallery_views_default_view
   ));
   $views[$view->name] = $view;
 
+  $view = new view;
+  $view->name = 'node_gallery_gallery_sort_views';
+  $view->description = 'Views of images meant for sorting images.';
+  $view->tag = 'node_gallery';
+  $view->view_php = '';
+  $view->base_table = 'node';
+  $view->is_cacheable = FALSE;
+  $view->api_version = 2;
+  $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
+  $handler = $view->new_display('default', 'Default', 'default');
+  $handler->override_option('relationships', array(
+    'gid' => array(
+      'label' => 'Parent Gallery',
+      'required' => 1,
+      'id' => 'gid',
+      'table' => 'node_gallery_images',
+      'field' => 'gid',
+      'relationship' => 'none',
+    ),
+  ));
+  $handler->override_option('fields', array(
+    'title' => array(
+      'label' => '',
+      'alter' => array(
+        'alter_text' => 0,
+        'text' => '',
+        'make_link' => 0,
+        'path' => '',
+        'link_class' => '',
+        'alt' => '',
+        'prefix' => '',
+        'suffix' => '',
+        'help' => '',
+        'trim' => 1,
+        'max_length' => '10',
+        'word_boundary' => 0,
+        'ellipsis' => 1,
+        'strip_tags' => 0,
+        'html' => 0,
+      ),
+      'link_to_node' => 1,
+      'exclude' => 0,
+      'id' => 'title',
+      'table' => 'node',
+      'field' => 'title',
+      'relationship' => 'none',
+      'override' => array(
+        'button' => 'Override',
+      ),
+    ),
+    'field_node_gallery_image_fid' => array(
+      'label' => '',
+      'alter' => array(
+        'alter_text' => 0,
+        'text' => '',
+        'make_link' => 0,
+        'path' => '',
+        'link_class' => '',
+        'alt' => '',
+        'prefix' => '',
+        'suffix' => '',
+        'target' => '',
+        'help' => '',
+        'trim' => 0,
+        'max_length' => '',
+        'word_boundary' => 0,
+        'ellipsis' => 1,
+        'html' => 0,
+        'strip_tags' => 0,
+      ),
+      'empty' => '',
+      'hide_empty' => 0,
+      'empty_zero' => 0,
+      'link_to_node' => 0,
+      'label_type' => 'none',
+      'format' => 'node-gallery-admin-thumbnail_default',
+      'multiple' => array(
+        'group' => 0,
+        'multiple_number' => '',
+        'multiple_from' => '',
+        'multiple_reversed' => 0,
+      ),
+      'exclude' => 0,
+      'id' => 'field_node_gallery_image_fid',
+      'table' => 'node_data_field_node_gallery_image',
+      'field' => 'field_node_gallery_image_fid',
+      'relationship' => 'none',
+    ),
+  ));
+  $handler->override_option('sorts', array(
+    'weight' => array(
+      'order' => 'ASC',
+      'id' => 'weight',
+      'table' => 'node_gallery_images',
+      'field' => 'weight',
+      'relationship' => 'none',
+    ),
+    'created' => array(
+      'order' => 'DESC',
+      'granularity' => 'second',
+      'id' => 'created',
+      'table' => 'node',
+      'field' => 'created',
+      'override' => array(
+        'button' => 'Override',
+      ),
+      'relationship' => 'none',
+    ),
+  ));
+  $handler->override_option('arguments', array(
+    'nid' => array(
+      'default_action' => 'not found',
+      'style_plugin' => 'default_summary',
+      'style_options' => array(),
+      'wildcard' => 'all',
+      'wildcard_substitution' => 'All',
+      'title' => '',
+      'breadcrumb' => '',
+      'default_argument_type' => 'fixed',
+      'default_argument' => '',
+      'validate_type' => 'none',
+      'validate_fail' => 'not found',
+      'break_phrase' => 0,
+      'not' => 0,
+      'id' => 'nid',
+      'table' => 'node',
+      'field' => 'nid',
+      'validate_user_argument_type' => 'uid',
+      'validate_user_roles' => array(
+        '2' => 0,
+        '4' => 0,
+        '3' => 0,
+      ),
+      'relationship' => 'gid',
+      'default_options_div_prefix' => '',
+      'default_argument_user' => 0,
+      'default_argument_fixed' => '',
+      'default_argument_php' => '',
+      'validate_argument_node_type' => array(
+        'product' => 0,
+        'photograph' => 0,
+        'product_kit' => 0,
+        'cck_gallery' => 0,
+        'cck_image' => 0,
+        'event' => 0,
+        'node_gallery_gallery' => 0,
+        'node_gallery_image' => 0,
+        'page' => 0,
+        'story' => 0,
+      ),
+      'validate_argument_node_access' => 0,
+      'validate_argument_nid_type' => 'nid',
+      'validate_argument_vocabulary' => array(
+        '1' => 0,
+      ),
+      'validate_argument_type' => 'tid',
+      'validate_argument_transform' => 0,
+      'validate_user_restrict_roles' => 0,
+      'validate_argument_node_flag_name' => '*relationship*',
+      'validate_argument_node_flag_test' => 'flaggable',
+      'validate_argument_node_flag_id_type' => 'id',
+      'validate_argument_user_flag_name' => '*relationship*',
+      'validate_argument_user_flag_test' => 'flaggable',
+      'validate_argument_user_flag_id_type' => 'id',
+      'validate_argument_php' => '',
+    ),
+  ));
+  $handler->override_option('filters', array(
+    'status' => array(
+      'operator' => '=',
+      'value' => '1',
+      'group' => '0',
+      'exposed' => FALSE,
+      'expose' => array(
+        'operator' => FALSE,
+        'label' => '',
+      ),
+      'id' => 'status',
+      'table' => 'node',
+      'field' => 'status',
+      'relationship' => 'none',
+    ),
+  ));
+  $handler->override_option('access', array(
+    'type' => 'none',
+  ));
+  $handler->override_option('cache', array(
+    'type' => 'none',
+  ));
+  $handler->override_option('items_per_page', 0);
+  $handler->override_option('use_pager', '0');
+  $handler->override_option('style_plugin', 'grid');
+  $handler->override_option('style_options', array(
+    'grouping' => '',
+    'columns' => '6',
+    'alignment' => 'horizontal',
+  ));
+  $handler = $view->new_display('page', 'Sort images table', 'display_table');
+  $handler->override_option('style_plugin', 'table');
+  $handler->override_option('style_options', array());
+  $handler->override_option('path', 'ng_sort_table');
+  $handler->override_option('menu', array(
+    'type' => 'none',
+    'title' => '',
+    'description' => '',
+    'weight' => 0,
+    'name' => 'navigation',
+  ));
+  $handler->override_option('tab_options', array(
+    'type' => 'none',
+    'title' => '',
+    'description' => '',
+    'weight' => 0,
+    'name' => 'navigation',
+  ));
+  $handler = $view->new_display('page', 'Sort images list', 'display_list');
+  $handler->override_option('fields', array(
+    'field_node_gallery_image_fid' => array(
+      'label' => '',
+      'alter' => array(
+        'alter_text' => 0,
+        'text' => '',
+        'make_link' => 0,
+        'path' => '',
+        'link_class' => '',
+        'alt' => '',
+        'prefix' => '',
+        'suffix' => '',
+        'target' => '',
+        'help' => '',
+        'trim' => 0,
+        'max_length' => '',
+        'word_boundary' => 0,
+        'ellipsis' => 1,
+        'html' => 0,
+        'strip_tags' => 0,
+      ),
+      'empty' => '',
+      'hide_empty' => 0,
+      'empty_zero' => 0,
+      'link_to_node' => 0,
+      'label_type' => 'none',
+      'format' => 'node-gallery-admin-thumbnail_default',
+      'multiple' => array(
+        'group' => 0,
+        'multiple_number' => '',
+        'multiple_from' => '',
+        'multiple_reversed' => 0,
+      ),
+      'exclude' => 0,
+      'id' => 'field_node_gallery_image_fid',
+      'table' => 'node_data_field_node_gallery_image',
+      'field' => 'field_node_gallery_image_fid',
+      'relationship' => 'none',
+      'override' => array(
+        'button' => 'Use default',
+      ),
+    ),
+  ));
+  $handler->override_option('style_plugin', 'list');
+  $handler->override_option('style_options', array(
+    'grouping' => '',
+    'type' => 'ul',
+  ));
+  $handler->override_option('path', 'ng_sort_list');
+  $handler->override_option('menu', array(
+    'type' => 'none',
+    'title' => '',
+    'description' => '',
+    'weight' => 0,
+    'name' => 'navigation',
+  ));
+  $handler->override_option('tab_options', array(
+    'type' => 'none',
+    'title' => '',
+    'description' => '',
+    'weight' => 0,
+    'name' => 'navigation',
+  ));
+  $views[$view->name] = $view;
+
+
   return $views;
 }
 
