/**========================================================= * Module: panel-tools.js * Dismiss panels * [data-tool="panel-dismiss"] * * Requires animo.js =========================================================*/ (function($, window, document){ 'use strict'; var panelSelector = '[data-tool="panel-dismiss"]', removeEvent = 'panel.remove', removedEvent = 'panel.removed'; $(document).on('click', panelSelector, function () { // find the first parent panel var parent = $(this).closest('.panel'); var deferred = new $.Deferred(); // Trigger the event and finally remove the element parent.trigger(removeEvent, [parent, deferred]); // needs resolve() to be called deferred.done(removeElement); function removeElement() { if($.support.animation) { parent.animo({animation: 'bounceOut'}, destroyPanel); } else destroyPanel(); } function destroyPanel() { var col = parent.parent(); $.when(parent.trigger(removedEvent, [parent])) .done(function(){ parent.remove(); // remove the parent if it is a row and is empty and not a sortable (portlet) col .trigger(removedEvent) // An event to catch when the panel has been removed from DOM .filter(function() { var el = $(this); return (el.is('[class*="col-"]:not(.sortable)') && el.children('*').length === 0); }).remove(); }); } }); }(jQuery, window, document)); /** * Collapse panels * [data-tool="panel-collapse"] * * Also uses browser storage to keep track * of panels collapsed state */ (function($, window, document) { 'use strict'; var panelSelector = '[data-tool="panel-collapse"]', storageKeyName = 'jq-panelState'; // Prepare the panel to be collapsable and its events $(panelSelector).each(function() { // find the first parent panel var $this = $(this), parent = $this.closest('.panel'), wrapper = parent.find('.panel-wrapper'), collapseOpts = {toggle: false}, iconElement = $this.children('em'), panelId = parent.attr('id'); // if wrapper not added, add it // we need a wrapper to avoid jumping due to the paddings if( ! wrapper.length) { wrapper = parent.children('.panel-heading').nextAll() //find('.panel-body, .panel-footer') .wrapAll('
') .parent() .addClass('panel-wrapper'); collapseOpts = {}; } // Init collapse and bind events to switch icons wrapper .collapse(collapseOpts) .on('hide.bs.collapse', function() { setIconHide( iconElement ); savePanelState( panelId, 'hide' ); wrapper.prev('.panel-heading').addClass('panel-heading-collapsed'); }) .on('show.bs.collapse', function() { setIconShow( iconElement ); savePanelState( panelId, 'show' ); wrapper.prev('.panel-heading').removeClass('panel-heading-collapsed'); }); // Load the saved state if exists var currentState = loadPanelState( panelId ); if(currentState) { setTimeout(function() { wrapper.collapse( currentState ); }, 0); savePanelState( panelId, currentState ); } }); // finally catch clicks to toggle panel collapse $(document).on('click', panelSelector, function () { var parent = $(this).closest('.panel'); var wrapper = parent.find('.panel-wrapper'); wrapper.collapse('toggle'); }); ///////////////////////////////////////////// // Common use functions for panel collapse // ///////////////////////////////////////////// function setIconShow(iconEl) { iconEl.removeClass('fa-plus').addClass('fa-minus'); } function setIconHide(iconEl) { iconEl.removeClass('fa-minus').addClass('fa-plus'); } function savePanelState(id, state) { var data = $.localStorage.get(storageKeyName); if(!data) { data = {}; } data[id] = state; $.localStorage.set(storageKeyName, data); } function loadPanelState(id) { var data = $.localStorage.get(storageKeyName); if(data) { return data[id] || false; } } }(jQuery, window, document)); /** * Refresh panels * [data-tool="panel-refresh"] * [data-spinner="standard"] */ (function($, window, document){ 'use strict'; var panelSelector = '[data-tool="panel-refresh"]', refreshEvent = 'panel.refresh', whirlClass = 'whirl', defaultSpinner = 'standard'; // method to clear the spinner when done function removeSpinner(){ this.removeClass(whirlClass); } // catch clicks to toggle panel refresh $(document).on('click', panelSelector, function () { var $this = $(this), panel = $this.parents('.panel').eq(0), spinner = $this.data('spinner') || defaultSpinner ; // start showing the spinner panel.addClass(whirlClass + ' ' + spinner); // attach as public method panel.removeSpinner = removeSpinner; // Trigger the event and send the panel object $this.trigger(refreshEvent, [panel]); }); }(jQuery, window, document));