| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- /*
- * jQuery Alvaro's Collaptable 1.0.2
- *
- * Copyright (c) 2010 Alvaro Véliz Marín - yo@alvaroveliz.cl
- *
- * Licensed under the MIT license:
- * http://www.opensource.org/licenses/mit-license.php
- *
- * More info in http://github.com/alvaroveliz/aCollapTable
- */
- (function($){
- $.fn.extend({
- aCollapTable: function(options) {
- var defaults = {
- startCollapsed : true,
- addColumn: true,
- plusButton: '+',
- minusButton: '-'
- };
- var options = $.extend(defaults, options);
- var self = this;
- var parents = [];
- var _collaptable = function($element, $parent, $display)
- {
- parent = (typeof($parent) == 'undefined') ? $element.parents('tr').data('id') : $parent;
- display = (typeof($display) == 'undefined') ? ( ($element.hasClass('act-expanded')) ? 'none' : 'table-row' ) : $display;
- table = self;
- $('tr[data-parent='+parent+']', table).each(function(key, item){
- $(item).css('display', display);
- if ($(item).hasClass('act-tr-expanded')) {
- _collaptable($element, $(item).data('id'), display);
- }
- });
- spacer = _getSpacer($element.parents('tr'));
- if (display == 'none') {
- $element.html(spacer + options.plusButton).removeClass('act-expanded').addClass('act-collapsed');
- $element.parents('tr').addClass('act-tr-collapsed').removeClass('act-tr-expanded');
- }
- else {
- $element.html(spacer + options.minusButton).removeClass('act-collapsed').addClass('act-expanded');
- $element.parents('tr').addClass('act-tr-expanded').removeClass('act-tr-collapsed');
- }
- };
- var _levelsAndParents = function(obj)
- {
- $('tr', obj).each(function(k, item){
- if ($(item).data('id')) {
- parent = { id : $(item).data('id'), parent : $(item).data('parent') };
- parents.push(parent);
- }
- });
- $('tr', obj).each(function(k, item){
- if ($(item).data('id')) {
- level = _getLevel($(item));
- $(item).attr('data-level', level);
- }
- });
- };
- var _getLevel = function($item, $level)
- {
- $level = (typeof($level) == 'undefined') ? 0 : $level;
- if ( $item.data('parent') == '' ) {
- return $level;
- }
- else {
- $parent = $('tr[data-id='+$item.data('parent')+']');
- return _getLevel($parent, $level+1);
- }
- };
- var _getSpacer = function($item)
- {
- spacer = '';
- for (i = 0; i < $item.data('level') ; i++) {
- spacer += ' ';
- }
- return spacer;
- };
- var _bindButtons = function()
- {
- $(document).on('click', '.act-button-expand', function(){
- if ( $('tr', self).length > 0 ) {
- expands = [];
- $('tr', self).each(function(k, item){
- if ($(item).hasClass('act-tr-collapsed') && $(item).css('display') != 'none') {
- expands.push($(item));
- }
- });
- $.each(expands, function(k, $item){
- _collaptable($('.act-more', $item));
- });
- }
- });
- $(document).on('click', '.act-button-collapse', function(){
- if ( $('tr', self).length > 0 ) {
- }
- });
- $(document).on('click', '.act-button-expand-all', function(){
- if ( $('tr', self).length > 0 ) {
- collapseds = [];
- $('tr', self).each(function(k, item){
- if ($(item).hasClass('act-tr-collapsed')) {
- _collaptable($('.act-more', $(item)));
- }
- });
- }
- });
- $(document).on('click', '.act-button-collapse-all', function(){
- if ( $('tr', self).length > 0 ) {
- collapseds = [];
- $('tr', self).each(function(k, item){
- if ($(item).hasClass('act-tr-expanded')) {
- _collaptable($('.act-more', $(item)));
- }
- });
- }
- });
- }
- return this.each(function() {
- var o = options;
- var obj = $(this);
- _levelsAndParents(obj);
- _bindButtons();
- // adding minus
- if ( $('tr', obj).length > 0) {
- $('tr', obj).each(function(k, item){
- spacer = _getSpacer($(item));
- $minus = $('<a />').attr('href', 'javascript:void(0)')
- .addClass('act-more act-expanded')
- .html(spacer + o.minusButton)
- .bind('click', function(){
- _collaptable($(this));
- })
- ;
- if ($('tr[data-parent='+$(item).data('id')+']').length > 0) {
- $button = (o.addColumn == true) ? $('<td />').html($minus) : $minus;
- itemClass = (o.startCollapsed) ? 'act-tr-collapsed' : 'act-tr-expanded';
- $(item).addClass(itemClass);
- }
- else {
- $button = (o.addColumn == true) ? $('<td />').html(spacer+' ') : spacer+' ';
- }
- if (o.addColumn == true) {
- $(item).prepend($button);
- }
- else {
- $(item).children(':first').prepend($button);
- }
- // level class
- $(item).addClass('act-tr-level-'+$(item).data('level'));
- });
- // start collapsed
- if (o.startCollapsed) {
- $('.act-more').each(function(k, item){
- $(item).click();
- });
- }
- }
- });
- }
- });
- })(jQuery);
|