| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- /*
- * tablesaw: A set of plugins for responsive tables
- * Stack: switches from column layout to rows with inline labels
- * Copyright (c) 2013 Filament Group, Inc.
- * MIT License
- */
- ;(function( win, $, undefined ){
- var classes = {
- stackTable: 'tablesaw-stack',
- cellLabels: 'tablesaw-cell-label',
- cellContentLabels: 'tablesaw-cell-content'
- };
- var data = {
- obj: 'tablesaw-stack'
- };
- var attrs = {
- labelless: 'data-tablesaw-no-labels',
- hideempty: 'data-tablesaw-hide-empty'
- };
- var Stack = function( element ) {
- this.$table = $( element );
- this.labelless = this.$table.is( '[' + attrs.labelless + ']' );
- this.hideempty = this.$table.is( '[' + attrs.hideempty + ']' );
- if( !this.labelless ) {
- // allHeaders references headers, plus all THs in the thead, which may include several rows, or not
- this.allHeaders = this.$table.find( "th" );
- }
- this.$table.data( data.obj, this );
- };
- Stack.prototype.init = function( colstart ) {
- this.$table.addClass( classes.stackTable );
- if( this.labelless ) {
- return;
- }
- // get headers in reverse order so that top-level headers are appended last
- var reverseHeaders = $( this.allHeaders );
- var hideempty = this.hideempty;
-
- // create the hide/show toggles
- reverseHeaders.each(function(){
- var $t = $( this ),
- $cells = $( this.cells ).filter(function() {
- return !$( this ).parent().is( "[" + attrs.labelless + "]" ) && ( !hideempty || !$( this ).is( ":empty" ) );
- }),
- hierarchyClass = $cells.not( this ).filter( "thead th" ).length && " tablesaw-cell-label-top",
- // TODO reduce coupling with sortable
- $sortableButton = $t.find( ".tablesaw-sortable-btn" ),
- html = $sortableButton.length ? $sortableButton.html() : $t.html();
- if( html !== "" ){
- if( hierarchyClass ){
- var iteration = parseInt( $( this ).attr( "colspan" ), 10 ),
- filter = "";
- if( iteration ){
- filter = "td:nth-child("+ iteration +"n + " + ( colstart ) +")";
- }
- $cells.filter( filter ).prepend( "<b class='" + classes.cellLabels + hierarchyClass + "'>" + html + "</b>" );
- } else {
- $cells.wrapInner( "<span class='" + classes.cellContentLabels + "'></span>" );
- $cells.prepend( "<b class='" + classes.cellLabels + "'>" + html + "</b>" );
- }
- }
- });
- };
- Stack.prototype.destroy = function() {
- this.$table.removeClass( classes.stackTable );
- this.$table.find( '.' + classes.cellLabels ).remove();
- this.$table.find( '.' + classes.cellContentLabels ).each(function() {
- $( this ).replaceWith( this.childNodes );
- });
- };
- // on tablecreate, init
- $( document ).on( "tablesawcreate", function( e, Tablesaw, colstart ){
- if( Tablesaw.mode === 'stack' ){
- var table = new Stack( Tablesaw.table );
- table.init( colstart );
- }
- } );
- $( document ).on( "tablesawdestroy", function( e, Tablesaw ){
- if( Tablesaw.mode === 'stack' ){
- $( Tablesaw.table ).data( data.obj ).destroy();
- }
- } );
- }( this, jQuery ));
|