Skip to content
Snippets Groups Projects
Select Git revision
  • 174d1ce37b414301b367f7286f000ccdb6f03e66
  • master default
  • issue-752
  • develop
  • issue-677
  • issue-677-original-with-migrate
  • issue-716
  • issue-654
  • issue-732
  • issue-737
  • issue-735
  • issue-707
  • issue-706
  • issue-705
  • issue-703
  • issue-696
  • issue-690
  • issue-675
  • issue-670
  • issue-635
  • issue-404
  • 7.19
  • 2012-04-18
  • 2012-04-03
  • 2012-04-02
  • 2012-03-01
  • 2012-02-07
  • 20120207
  • 2012-01-13
  • 2012-01-12
  • 2011-12-16
  • 2011-12-05
  • 2011-11-17
  • 2011-11-14
  • 2011-11-08.2
  • 2011-11-08
  • 2011-11-01
  • 2011-10-27
  • 2011-10-06
  • 2011-10-03
  • 2011-09-19
41 results

tableselect.js

Blame
  • Forked from UNL Information Services / UNL-CMS
    Source project has a limited visibility.
    tableselect.js 3.64 KiB
    (function ($) {
    
    Drupal.behaviors.tableSelect = {
      attach: function (context, settings) {
        // Select the inner-most table in case of nested tables.
        $('th.select-all', context).closest('table').once('table-select', Drupal.tableSelect);
      }
    };
    
    Drupal.tableSelect = function () {
      // Do not add a "Select all" checkbox if there are no rows with checkboxes in the table
      if ($('td input:checkbox', this).length == 0) {
        return;
      }
    
      // Keep track of the table, which checkbox is checked and alias the settings.
      var table = this, checkboxes, lastChecked;
      var strings = { 'selectAll': Drupal.t('Select all rows in this table'), 'selectNone': Drupal.t('Deselect all rows in this table') };
      var updateSelectAll = function (state) {
        // Update table's select-all checkbox (and sticky header's if available).
        $(table).prev('table.sticky-header').andSelf().find('th.select-all input:checkbox').each(function() {
          $(this).attr('title', state ? strings.selectNone : strings.selectAll);
          this.checked = state;
        });
      };
    
      // Find all <th> with class select-all, and insert the check all checkbox.
      $('th.select-all', table).prepend($('<input type="checkbox" class="form-checkbox" />').attr('title', strings.selectAll)).click(function (event) {
        if ($(event.target).is('input:checkbox')) {
          // Loop through all checkboxes and set their state to the select all checkbox' state.
          checkboxes.each(function () {
            this.checked = event.target.checked;
            // Either add or remove the selected class based on the state of the check all checkbox.
            $(this).closest('tr').toggleClass('selected', this.checked);
          });
          // Update the title and the state of the check all box.
          updateSelectAll(event.target.checked);
        }
      });
    
      // For each of the checkboxes within the table that are not disabled.
      checkboxes = $('td input:checkbox:enabled', table).click(function (e) {
        // Either add or remove the selected class based on the state of the check all checkbox.
        $(this).closest('tr').toggleClass('selected', this.checked);
    
        // If this is a shift click, we need to highlight everything in the range.
        // Also make sure that we are actually checking checkboxes over a range and
        // that a checkbox has been checked or unchecked before.
        if (e.shiftKey && lastChecked && lastChecked != e.target) {
          // We use the checkbox's parent TR to do our range searching.
          Drupal.tableSelectRange($(e.target).closest('tr')[0], $(lastChecked).closest('tr')[0], e.target.checked);
        }
    
        // If all checkboxes are checked, make sure the select-all one is checked too, otherwise keep unchecked.
        updateSelectAll((checkboxes.length == $(checkboxes).filter(':checked').length));
    
        // Keep track of the last checked checkbox.
        lastChecked = e.target;
      });
    };
    
    Drupal.tableSelectRange = function (from, to, state) {
      // We determine the looping mode based on the the order of from and to.
      var mode = from.rowIndex > to.rowIndex ? 'previousSibling' : 'nextSibling';
    
      // Traverse through the sibling nodes.
      for (var i = from[mode]; i; i = i[mode]) {
        // Make sure that we're only dealing with elements.
        if (i.nodeType != 1) {
          continue;
        }
    
        // Either add or remove the selected class based on the state of the target checkbox.
        $(i).toggleClass('selected', state);
        $('input:checkbox', i).each(function () {
          this.checked = state;
        });
    
        if (to.nodeType) {
          // If we are at the end of the range, stop.
          if (i == to) {
            break;
          }
        }
        // A faster alternative to doing $(i).filter(to).length.
        else if ($.filter(to, [i]).r.length) {
          break;
        }
      }
    };
    
    })(jQuery);