2011-08-22 23 views
5

He intentado hacer un widget que pueda ordenar un grupo de filas por separado dentro de una tabla y al mismo tiempo hacer que el grupo de filas se quede con "filas agrupadas". No puedo entender cómo abordar este problema ...Tablesorter, clasificación de subgrupo

EDITAR: Quiero ordenar en las columnas no colspan. cada grupo debe comportarse como una subtabla

Configuración básica en jsfiddle, ¿alguien puede empujarme en la dirección correcta?

EDIT: nueva jsFiddle http://jsfiddle.net/L8bwW/28/

+0

¿Cómo se quiere hacer su clasificación? ¿Desea ordenar en filas anchas, luego en filas divididas, como el Finder/Explorer ordenando alfabéticamente en las carpetas y luego en las subcarpetas? – Blazemonger

+0

disculpa por no ser claro, quiero ordenar en las columnas no colspan. cada grupo debe comportarse como una subtabla – anderssonola

+0

Entonces, ¿las filas anchas (colspan) están unidas a la única fila debajo de ellas? ¿O están "fijos en su lugar" y, por ejemplo, aparecen como la tercera y sexta fila independientemente de cómo se clasifiquen los demás? – Blazemonger

Respuesta

4

Aquí está una Working example que no utiliza tablesorter.

La clave es utilizar el elemento tbody para agrupar sus filas. Luego ordena todas las filas, pero la última, dentro de cada tbody.

La tabla podría tener este aspecto:

<table class="sortable"> 
    <thead> 
     <tr> <th></th> <th>A-head</th> <th>B-head</th> <th>C-head</th> </tr> 
    </thead> 
    <tfoot> 
     <tr> <td></td> <td>A-foot</td> <td>B-foot</td> <td>C-foot</td></tr> 
    </tfoot> 

    <tbody class='sortable'> 
     <tr> <td>DDD</td><td> r1c1</td> <td>r1c2</td> <td>r1c3</td> </tr> 
     <tr> <td>AAA</td><td> r2c1</td> <td>r2c2</td> <td>r2c3</td> </tr> 
     <tr> <td>CCC</td><td> r3c1</td> <td>r3c2</td> <td>r3c3</td> </tr> 
     <tr> <td>BBB</td><td> r4c1</td> <td>r4c2</td> <td>r4c3</td> </tr> 
     <tr> <td colspan="4">summary info for the first group of rows</td> </tr> 
    </tbody> 

    <tbody class='sortable'> 
     <tr> <td>Zorro</td><td> r5c1</td> <td>r5c2</td> <td>r5c3</td> </tr> 
     <tr> <td>Caleb</td><td> r6c1</td> <td>r6c2</td> <td>r6c3</td> </tr> 
     <tr> <td>Momo</td><td> r7c1</td> <td>r7c2</td> <td>r7c3</td> </tr> 
     <tr> <td>Wolfie</td><td> r8c1</td> <td>r8c2</td> <td>r8c3</td> </tr> 
     <tr> <td colspan="4">summary info for rowgroup #2</td> </tr> 
    </tbody> 
    ... 

y una especie fn de que podría tener este aspecto:

function SortIt() { 
     jQuery('table.sortable > tbody.sortable').each(function(index,tbody) { 
     var $rowGroup = jQuery(tbody); 

     // select all but the last row in the tbody 
     var rows = $rowGroup.find('tr:not(last-child)').get(); 

     var sortDirection = $rowGroup.is('.sorted-asc') ? -1 : 1; 

     // Set a custom property on each row - 'sortKey', the key to sort. 
     // This example uses the text in the first column. It could use 
     // any column, or any content in the row. 
     jQuery.each(rows, function(index, row) { 
      row.sortKey = jQuery(row).children('td').first().text(); 
     }); 

     // actually sort the rows 
     rows.sort(function(a, b) { 
      if (a.sortKey < b.sortKey) return -sortDirection; 
      if (a.sortKey > b.sortKey) return sortDirection; 
      return 0; 
     }); 

     // retain the summary row - the last one 
     var summaryRow = $rowGroup.find("tr:last-child"); 

     // remove all the rows from the tbody 
     $rowGroup.find("tr").remove(); 

     // append the rows in sorted order 
     jQuery.each(rows, function(index, row) { 
      $rowGroup.append(row); 
      row.sortKey = null; 
     }); 

     // append the final row 
     $rowGroup.append(summaryRow); 

     if (sortDirection == 1) { $rowGroup.addClass('sorted-asc'); } 
     else {$rowGroup.removeClass('sorted-asc'); } 

     }); 
    } 
Cuestiones relacionadas