[ Index ]

PHP Cross Reference of Drupal 6 (gatewave)

title

Body

[close]

/misc/ -> tableselect.js (source)

   1  // $Id: tableselect.js,v 1.8 2007/11/19 12:15:16 goba Exp $
   2  
   3  Drupal.behaviors.tableSelect = function (context) {
   4    $('form table:has(th.select-all):not(.tableSelect-processed)', context).each(Drupal.tableSelect);
   5  };
   6  
   7  Drupal.tableSelect = function() {
   8    // Do not add a "Select all" checkbox if there are no rows with checkboxes in the table
   9    if ($('td input:checkbox', this).size() == 0) {
  10      return;
  11    }
  12  
  13    // Keep track of the table, which checkbox is checked and alias the settings.
  14    var table = this, checkboxes, lastChecked;
  15    var strings = { 'selectAll': Drupal.t('Select all rows in this table'), 'selectNone': Drupal.t('Deselect all rows in this table') };
  16    var updateSelectAll = function(state) {
  17      $('th.select-all input:checkbox', table).each(function() {
  18        $(this).attr('title', state ? strings.selectNone : strings.selectAll);
  19        this.checked = state;
  20      });
  21    };
  22  
  23    // Find all <th> with class select-all, and insert the check all checkbox.
  24    $('th.select-all', table).prepend($('<input type="checkbox" class="form-checkbox" />').attr('title', strings.selectAll)).click(function(event) {
  25      if ($(event.target).is('input:checkbox')) {
  26        // Loop through all checkboxes and set their state to the select all checkbox' state.
  27        checkboxes.each(function() {
  28          this.checked = event.target.checked;
  29          // Either add or remove the selected class based on the state of the check all checkbox.
  30          $(this).parents('tr:first')[ this.checked ? 'addClass' : 'removeClass' ]('selected');
  31        });
  32        // Update the title and the state of the check all box.
  33        updateSelectAll(event.target.checked);
  34      }
  35    });
  36  
  37    // For each of the checkboxes within the table.
  38    checkboxes = $('td input:checkbox', table).click(function(e) {
  39      // Either add or remove the selected class based on the state of the check all checkbox.
  40      $(this).parents('tr:first')[ this.checked ? 'addClass' : 'removeClass' ]('selected');
  41  
  42      // If this is a shift click, we need to highlight everything in the range.
  43      // Also make sure that we are actually checking checkboxes over a range and
  44      // that a checkbox has been checked or unchecked before.
  45      if (e.shiftKey && lastChecked && lastChecked != e.target) {
  46        // We use the checkbox's parent TR to do our range searching.
  47        Drupal.tableSelectRange($(e.target).parents('tr')[0], $(lastChecked).parents('tr')[0], e.target.checked);
  48      }
  49  
  50      // If all checkboxes are checked, make sure the select-all one is checked too, otherwise keep unchecked.
  51      updateSelectAll((checkboxes.length == $(checkboxes).filter(':checked').length));
  52  
  53      // Keep track of the last checked checkbox.
  54      lastChecked = e.target;
  55    });
  56    $(this).addClass('tableSelect-processed');
  57  };
  58  
  59  Drupal.tableSelectRange = function(from, to, state) {
  60    // We determine the looping mode based on the the order of from and to.
  61    var mode = from.rowIndex > to.rowIndex ? 'previousSibling' : 'nextSibling';
  62  
  63    // Traverse through the sibling nodes.
  64    for (var i = from[mode]; i; i = i[mode]) {
  65      // Make sure that we're only dealing with elements.
  66      if (i.nodeType != 1) {
  67        continue;
  68      }
  69  
  70      // Either add or remove the selected class based on the state of the target checkbox.
  71      $(i)[ state ? 'addClass' : 'removeClass' ]('selected');
  72      $('input:checkbox', i).each(function() {
  73        this.checked = state;
  74      });
  75  
  76      if (to.nodeType) {
  77        // If we are at the end of the range, stop.
  78        if (i == to) {
  79          break;
  80        }
  81      }
  82      // A faster alternative to doing $(i).filter(to).length.
  83      else if (jQuery.filter(to, [i]).r.length) {
  84        break;
  85      }
  86    }
  87  };


Generated: Thu Mar 24 11:18:33 2011 Cross-referenced by PHPXref 0.7