Index: includes/tablesort.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/tablesort.inc,v retrieving revision 1.36 diff -u -r1.36 tablesort.inc --- includes/tablesort.inc 25 Aug 2005 21:14:16 -0000 1.36 +++ includes/tablesort.inc 31 Aug 2005 22:31:38 -0000 @@ -20,6 +20,32 @@ } /** + * Set-up required attributes for Ajax tablesort and return whether we are + * currently handling an Ajax request. + */ +function tablesort_ajax($header, &$attributes) { + // Tables with an id can be sorted through Ajax + if (isset($attributes['id'])) { + // Determine if there are any sortable columns. + $tablesort = false; + foreach ($header as $item) { + if (is_array($item) && isset($item['field'])) { + $tablesort = true; + break; + } + } + // Mark the table if needed + if ($tablesort) { + drupal_add_js('misc/tablesort.js'); + $attributes['class'] = trim($attributes['class'] .' tablesort'); + // Are we currently handling an Ajax request for this table? + return $_GET['tablesort'] == $attributes['id']; + } + } + return FALSE; +} + +/** * Fetch pager link arguments. * * When producing a sortable table that presents paged data, pass the output @@ -87,7 +113,7 @@ $image = ''; } $cell['data'] = l($cell['data'] . $image, $_GET['q'], array('title' => $title), 'sort='. $ts['sort'] .'&order='. urlencode($cell['data']). $ts['query_string'], NULL, FALSE, TRUE); - + $cell['class'] = trim($cell['class'] .' tablesort'); unset($cell['field'], $cell['sort']); } return $cell; Index: includes/theme.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/theme.inc,v retrieving revision 1.256 diff -u -r1.256 theme.inc --- includes/theme.inc 28 Aug 2005 15:29:34 -0000 1.256 +++ includes/theme.inc 31 Aug 2005 22:31:39 -0000 @@ -692,15 +692,20 @@ * * @param $attributes * An array of HTML attributes to apply to the table tag. + * @param $ajax + * Whether this table should be sorted using Ajax. If set to TRUE, you must + * pass a valid $attributes['id']. * @return * An HTML string representing the table. */ function theme_table($header, $rows, $attributes = NULL) { - + // Initialize Ajax tablesort + $shortcircuit = tablesort_ajax($header, $attributes); $output = '\n"; // Format the table header: if (count($header)) { + // Note: tablesort_init() may modify $attributes $ts = tablesort_init($header); $output .= ' '; foreach ($header as $cell) { @@ -751,6 +756,13 @@ } $output .= "\n"; + + // Print table directly if doing an Ajax request for this table + if ($shortcircuit) { + print $output; + exit; + } + return $output; } cvs diff: Diffing misc Index: misc/drupal.css =================================================================== RCS file: /cvs/drupal/drupal/misc/drupal.css,v retrieving revision 1.116 diff -u -r1.116 drupal.css --- misc/drupal.css 31 Aug 2005 21:17:26 -0000 1.116 +++ misc/drupal.css 31 Aug 2005 22:31:39 -0000 @@ -570,6 +570,7 @@ background: #0072b9; color: #fff; } + /* Animated throbber */ html.js input.form-autocomplete { background: url('throbber.gif') no-repeat 100% 2px; @@ -577,6 +578,12 @@ html.js input.throbbing { background-position: 100% -18px; } +html.js th.tablesort { + padding-right: 18px; +} +html.js th.throbbing { + background: url('throbber.gif') no-repeat 100% -18px; +} /* ** Progressbar styles Index: misc/tablesort.js =================================================================== RCS file: misc/tablesort.js diff -N misc/tablesort.js --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ misc/tablesort.js 31 Aug 2005 22:31:39 -0000 @@ -0,0 +1,76 @@ +// $Id$ + +if (isJsEnabled()) { + addLoadEvent(tablesortAutoAttach); +} + +/** + * Attach the tablesort behaviour to specially marked tables. + */ +function tablesortAutoAttach() { + var tables = document.getElementsByTagName('table'); + var header, table; + // Find specially marked tables + for (var i = 0; table = tables[i]; i++) { + if (!hasClass(table, 'tablesort')) { + continue; + } + var ts = new tablesort(table); + // Find all the header cells + headers = table.getElementsByTagName('th'); + if (headers.length == 0) { + continue; + } + for (var j = 0; header = headers[j]; j++) { + // Find the first link + var links = header.getElementsByTagName('a'); + if (links.length == 0) { + continue; + } + var link = links[0]; + // Install onclick override + link.onclick = function() { + ts.doSort(this); + this.blur(); + this.onclick = function() { + return false; + } + return false; + } + } + } +} + +/** + * A tablesort object tied to a particular . + */ +function tablesort(table) { + var ts = this; + this.table = table; +} + +/** + * Sort the table by a new column + */ +tablesort.prototype.doSort = function (link) { + var header = link.parentNode; + this.uri = link.href + '&tablesort=' + escape(this.table.id); + addClass(header, 'throbbing'); + HTTPGet(this.uri, this.receiveSort, this); +} + +/** + * HTTP callback function. Replaces the entire table with the new one. + */ +tablesort.prototype.receiveSort = function(string, xmlhttp, ts) { + if (xmlhttp.status != 200) { + return alert('An HTTP error '+ xmlhttp.status +' occured.\n'+ ts.uri); + } + // Create DOM node for new table + var div = document.createElement('div'); + div.innerHTML = string; + // Replace old table + ts.table.parentNode.replaceChild(div, ts.table); + // Re-attach behaviour + tablesortAutoAttach(); +} cvs diff: Diffing modules Index: modules/comment.module =================================================================== RCS file: /cvs/drupal/drupal/modules/comment.module,v retrieving revision 1.368 diff -u -r1.368 comment.module --- modules/comment.module 30 Aug 2005 15:22:29 -0000 1.368 +++ modules/comment.module 31 Aug 2005 22:31:43 -0000 @@ -1036,7 +1036,7 @@ $rows[] = array(array('data' => t('No comments available.'), 'colspan' => '6')); } - return theme('table', $header, $rows); + return theme('table', $header, $rows, array('id' => 'comment-admin-overview')); } /** Index: modules/forum.module =================================================================== RCS file: /cvs/drupal/drupal/modules/forum.module,v retrieving revision 1.266 diff -u -r1.266 forum.module --- modules/forum.module 30 Aug 2005 15:22:29 -0000 1.266 +++ modules/forum.module 31 Aug 2005 22:31:46 -0000 @@ -953,7 +953,7 @@ } } - $output .= theme('table', $forum_topic_list_header, $rows); + $output .= theme('table', $forum_topic_list_header, $rows, array('id' => 'forum-topic-list')); return $output; } Index: modules/node.module =================================================================== RCS file: /cvs/drupal/drupal/modules/node.module,v retrieving revision 1.526 diff -u -r1.526 node.module --- modules/node.module 30 Aug 2005 15:22:29 -0000 1.526 +++ modules/node.module 31 Aug 2005 22:31:51 -0000 @@ -920,6 +920,14 @@ $output .= form_group(t('Show only items where'), $form); // Build query + $header = array(NULL, + array('data' => t('Title'), 'field' => 'n.title'), + array('data' => t('Type'), 'field' => 'n.type'), + array('data' => t('Author'), 'field' => 'u.name'), + array('data' => t('Status'), 'field' => 'n.status'), + array('data' => t('Last Updated'), 'field' => 'n.changed', 'sort' => 'desc'), + t('Operations')); + $where = $args = array(); $join = ''; foreach ($session as $filter) { @@ -936,7 +944,7 @@ $join .= $filters[$key]['join']; } $where = count($where) ? 'WHERE '. implode(' AND ', $where) : ''; - $result = pager_query('SELECT n.*, u.name, u.uid FROM {node} n '. $join .' INNER JOIN {users} u ON n.uid = u.uid '. $where .' ORDER BY n.changed DESC', 50, 0, NULL, $args); + $result = pager_query('SELECT n.*, u.name, u.uid FROM {node} n '. $join .' INNER JOIN {users} u ON n.uid = u.uid '. $where . tablesort_sql($header), 50, 0, NULL, $args); // Make sure the update controls are disabled if we don't have any rows to select from. $disabled = !db_num_rows($result); @@ -953,8 +961,6 @@ $output .= ''; // Overview table: - $header = array(NULL, t('Title'), t('Type'), t('Author'), t('Status'), t('Operations')); - $destination = drupal_get_destination(); while ($node = db_fetch_object($result)) { $rows[] = array(form_checkbox(NULL, 'nodes]['. $node->nid, 1, 0), @@ -962,6 +968,7 @@ node_get_name($node), theme('username', $node), ($node->status ? t('published') : t('not published')), + format_date($node->created, 'small'), l(t('edit'), 'node/'. $node->nid .'/edit', array(), $destination)); } @@ -973,7 +980,7 @@ $rows[] = array(array('data' => t('No posts available.'), 'colspan' => '6')); } - $output .= theme('table', $header, $rows); + $output .= theme('table', $header, $rows, array('id' => 'node-admin-nodes')); return form($output, 'post', url('admin/node/action')); } Index: modules/path.module =================================================================== RCS file: /cvs/drupal/drupal/modules/path.module,v retrieving revision 1.62 diff -u -r1.62 path.module --- modules/path.module 25 Aug 2005 21:14:16 -0000 1.62 +++ modules/path.module 31 Aug 2005 22:31:52 -0000 @@ -277,7 +277,7 @@ $rows[] = array(array('data' => t('No URL aliases available.'), 'colspan' => '4')); } - return theme('table', $header, $rows); + return theme('table', $header, $rows, array('id' => 'path-overview')); } /** Index: modules/statistics.module =================================================================== RCS file: /cvs/drupal/drupal/modules/statistics.module,v retrieving revision 1.204 diff -u -r1.204 statistics.module --- modules/statistics.module 25 Aug 2005 21:14:17 -0000 1.204 +++ modules/statistics.module 31 Aug 2005 22:31:54 -0000 @@ -210,7 +210,7 @@ } drupal_set_title($account->name); - return theme('table', $header, $rows); + return theme('table', $header, $rows, array('id' => 'statistics-user-tracker')); } else { drupal_not_found(); @@ -243,7 +243,7 @@ $rows[] = array(array('data' => $pager, 'colspan' => '4')); } - return theme('table', $header, $rows); + return theme('table', $header, $rows, array('id' => 'statistics-recent-hits')); } /** @@ -271,7 +271,7 @@ } drupal_set_title(t('Top pages in the past %interval', array('%interval' => format_interval(variable_get('statistics_flush_accesslog_timer', 259200))))); - return theme('table', $header, $rows); + return theme('table', $header, $rows, array('id' => 'statistics-top-pages')); } /** @@ -301,7 +301,7 @@ } drupal_set_title(t('Top visitors in the past %interval', array('%interval' => format_interval(variable_get('statistics_flush_accesslog_timer', 259200))))); - return theme('table', $header, $rows); + return theme('table', $header, $rows, array('id' => 'statistics-top-visitors')); } /** @@ -328,7 +328,7 @@ $rows[] = array(array('data' => $pager, 'colspan' => '3')); } - return theme('table', $header, $rows); + return theme('table', $header, $rows, array('id' => 'statistics-top-referrers')); } /** Index: modules/user.module =================================================================== RCS file: /cvs/drupal/drupal/modules/user.module,v retrieving revision 1.502 diff -u -r1.502 user.module --- modules/user.module 25 Aug 2005 21:14:17 -0000 1.502 +++ modules/user.module 31 Aug 2005 22:32:02 -0000 @@ -1734,7 +1734,7 @@ if (!empty($pager)) { $rows[] = array(array('data' => $pager, 'colspan' => '5')); } - return theme('table', $header, $rows); + return theme('table', $header, $rows, array('id' => 'user-admin-account')); } function user_configure() { Index: modules/watchdog.module =================================================================== RCS file: /cvs/drupal/drupal/modules/watchdog.module,v retrieving revision 1.126 diff -u -r1.126 watchdog.module --- modules/watchdog.module 25 Aug 2005 21:14:17 -0000 1.126 +++ modules/watchdog.module 31 Aug 2005 22:32:02 -0000 @@ -123,7 +123,7 @@ } $output = '
'. form($form) .'
'; - $output .= theme('table', $header, $rows); + $output .= theme('table', $header, $rows, array('id' => 'watchdog-overview')); return $output; }