mambax7/alumni-26x

View on GitHub
media/jquery/tablesorter-master/js/widgets/widget-reflow.js

Summary

Maintainability
A
3 hrs
Test Coverage
/* Widget: reflow - updated 2/7/2015 (v2.19.0) *//*
 * Requires tablesorter v2.8+ and jQuery 1.7+
 * Also, this widget requires the following default css (modify as desired)

  / * REQUIRED CSS: change your reflow breakpoint here (35em below) * /
  @media ( max-width: 35em ) {
    .ui-table-reflow td,
    .ui-table-reflow th {
      -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
      box-sizing: border-box;
      float: right;
      / * if not using the stickyHeaders widget (not the css3 version)
       * the "!important" flag, and "height: auto" can be removed * /
      width: 100% !important;
      height: auto !important;
    }
    / * reflow widget * /
    .ui-table-reflow tbody td[data-title]:before {
      color: #469;
      font-size: .9em;
      content: attr(data-title);
      float: left;
      width: 50%;
      white-space: pre-wrap;
      text-align: bottom;
      display: inline-block;
    }
    / * reflow2 widget * /
    table.ui-table-reflow .ui-table-cell-label.ui-table-cell-label-top {
      display: block;
      padding: .4em 0;
      margin: .4em 0;
      text-transform: uppercase;
      font-size: .9em;
      font-weight: 400;
    }
    table.ui-table-reflow .ui-table-cell-label {
      padding: .4em;
      min-width: 30%;
      display: inline-block;
      margin: -.4em 1em -.4em -.4em;
    }
  }
  .ui-table-reflow .ui-table-cell-label {
    display: none;
  }

 */
/*jshint browser:true, jquery:true, unused:false */
/*global jQuery: false */
;(function($){
    'use strict';

    var ts = $.tablesorter,

    tablereflow = {
        // simple reflow
        // add data-attribute to each cell which shows when media query is active
        // this widget DOES NOT WORK on a table with multiple thead rows
        init : function(table, c, wo) {
            var $this,
                title = wo.reflow_dataAttrib,
                header = wo.reflow_headerAttrib,
                headers = [];
            c.$table
                .addClass(wo.reflow_className)
                .off('refresh.tsreflow updateComplete.tsreflow2')
                // emulate jQuery Mobile refresh
                // https://api.jquerymobile.com/table-reflow/#method-refresh
                .on('refresh.tsreflow updateComplete.tsreflow2', function(){
                    tablereflow.init(table, c, wo);
                });
            c.$headers.each(function(){
                $this = $(this);
                headers.push( $.trim( $this.attr(header) || $this.text() ) );
            });
            c.$tbodies.children().each(function(){
                $(this).children().each(function(i){
                    $(this).attr(title, headers[i]);
                });
            });
        },
        init2: function(table, c, wo) {
            var $this, $tbody, i, $hdr, txt, len,
                cols = c.columns,
                header = wo.reflow2_headerAttrib,
                headers = [];
            c.$table
                .addClass(wo.reflow2_className)
                .off('refresh.tsreflow2 updateComplete.tsreflow2')
                // emulate jQuery Mobile refresh
                // https://api.jquerymobile.com/table-reflow/#method-refresh
                .on('refresh.tsreflow2 updateComplete.tsreflow2', function(){
                    tablereflow.init2(table, c, wo);
                });

            // add <b> to every table cell with thead cell contents
            for (i = 0; i < cols; i++) {
                $hdr = c.$headers.filter('[data-column="' + i + '"]');
                if ($hdr.length > 1) {
                    txt = [];
                    /*jshint loopfunc:true */
                    $hdr.each(function(){
                        $this = $(this);
                        if (!$this.hasClass(wo.reflow2_classIgnore)) {
                            txt.push( $this.attr(header) || $this.text() );
                        }
                    });
                } else {
                    txt = [ $hdr.attr(header) || $hdr.text() ];
                }
                headers.push( txt );
            }
            // include 'remove-me' class so these additional elements are removed before updating
            txt = '<b class="' + c.selectorRemove.slice(1) + ' ' + wo.reflow2_labelClass;
            c.$tbodies.children().each(function(){
                $tbody = ts.processTbody(table, $(this), true);
                $tbody.children().each(function(j){
                    $this = $(this);
                    len = headers[j].length;
                    i = len - 1;
                    while (i >= 0) {
                        $this.prepend(txt + (i === 0 && len > 1 ? ' ' + wo.reflow2_labelTop : '') + '">' + headers[j][i] + '</b>');
                        i--;
                    }
                });
                ts.processTbody(table, $tbody, false);
            });
        },
        remove : function(table, c, wo) {
            c.$table.removeClass(wo.reflow_className);
        },
        remove2 : function(table, c, wo) {
            c.$table.removeClass(wo.reflow2_className);
        }
    };

    ts.addWidget({
        id: 'reflow',
        options: {
            // class name added to make it responsive (class name within media query)
            reflow_className    : 'ui-table-reflow',
            // header attribute containing modified header name
            reflow_headerAttrib : 'data-name',
            // data attribute added to each tbody cell
            reflow_dataAttrib   : 'data-title'
        },
        init: function(table, thisWidget, c, wo) {
            tablereflow.init(table, c, wo);
        },
        remove: function(table, c, wo){
            tablereflow.remove(table, c, wo);
        }
    });

    ts.addWidget({
        id: 'reflow2',
        options: {
            // class name added to make it responsive (class name within media query)
            reflow2_className    : 'ui-table-reflow',
            // ignore header cell content with this class name
            reflow2_classIgnore  : 'ui-table-reflow-ignore',
            // header attribute containing modified header name
            reflow2_headerAttrib : 'data-name',
            // class name applied to thead labels
            reflow2_labelClass   : 'ui-table-cell-label',
            // class name applied to first row thead label
            reflow2_labelTop     : 'ui-table-cell-label-top'
        },
        init: function(table, thisWidget, c, wo) {
            tablereflow.init2(table, c, wo);
        },
        remove: function(table, c, wo){
            tablereflow.remove2(table, c, wo);
        }
    });

})(jQuery);