Shell File Manager
jQuery(document).ready(function($){
//open/close lateral filter
$('.cd-filter-trigger').on('click', function(){
triggerFilter(true);
});
$('.cd-filter .cd-close').on('click', function(){
triggerFilter(false);
});
function triggerFilter($bool) {
var elementsToTrigger = $([$('.cd-filter-trigger'), $('.cd-filter'), $('.cd-tab-filter'), $('.cd-gallery')]);
elementsToTrigger.each(function(){
$(this).toggleClass('filter-is-visible', $bool);
});
}
//mobile version - detect click event on filters tab
var filter_tab_placeholder = $('.cd-tab-filter .placeholder a'),
filter_tab_placeholder_default_value = 'Select',
filter_tab_placeholder_text = filter_tab_placeholder.text();
$('.cd-tab-filter li').on('click', function(event){
//detect which tab filter item was selected
var selected_filter = $(event.target).data('type');
//check if user has clicked the placeholder item
if( $(event.target).is(filter_tab_placeholder) ) {
(filter_tab_placeholder_default_value == filter_tab_placeholder.text()) ? filter_tab_placeholder.text(filter_tab_placeholder_text) : filter_tab_placeholder.text(filter_tab_placeholder_default_value) ;
$('.cd-tab-filter').toggleClass('is-open');
//check if user has clicked a filter already selected
} else if( filter_tab_placeholder.data('type') == selected_filter ) {
filter_tab_placeholder.text($(event.target).text());
$('.cd-tab-filter').removeClass('is-open');
} else {
//close the dropdown and change placeholder text/data-type value
$('.cd-tab-filter').removeClass('is-open');
filter_tab_placeholder.text($(event.target).text()).data('type', selected_filter);
filter_tab_placeholder_text = $(event.target).text();
//add class selected to the selected filter item
$('.cd-tab-filter .selected').removeClass('selected');
$(event.target).addClass('selected');
}
});
//close filter dropdown inside lateral .cd-filter
$('.cd-filter-block h4').on('click', function(){
$(this).toggleClass('closed').siblings('.cd-filter-content').slideToggle(300);
})
//fix lateral filter and gallery on scrolling
$(window).on('scroll', function(){
(!window.requestAnimationFrame) ? fixGallery() : window.requestAnimationFrame(fixGallery);
});
function fixGallery() {
var offsetTop = $('.cd-main-content').offset().top,
scrollTop = $(window).scrollTop();
( scrollTop >= offsetTop ) ? $('.cd-main-content').addClass('is-fixed') : $('.cd-main-content').removeClass('is-fixed');
}
/************************************
MitItUp filter settings
More details:
https://mixitup.kunkalabs.com/
or:
http://codepen.io/patrickkunka/
*************************************/
buttonFilter.init();
$('.cd-gallery ul').mixItUp({
controls: {
enable: false
},
callbacks: {
onMixStart: function(){
$('.cd-fail-message').fadeOut(200);
},
onMixFail: function(){
$('.cd-fail-message').fadeIn(200);
}
}
});
//search filtering
//credits http://codepen.io/edprats/pen/pzAdg
var inputText;
var $matching = $();
var delay = (function(){
var timer = 0;
return function(callback, ms){
clearTimeout (timer);
timer = setTimeout(callback, ms);
};
})();
$(".cd-filter-content input[type='search']").keyup(function(){
// Delay function invoked to make sure user stopped typing
delay(function(){
inputText = $(".cd-filter-content input[type='search']").val().toLowerCase();
// Check to see if input field is empty
if ((inputText.length) > 0) {
$('.mix').each(function() {
var $this = $(this);
// add item to be filtered out if input text matches items inside the title
if($this.attr('class').toLowerCase().match(inputText)) {
$matching = $matching.add(this);
} else {
// removes any previously matched item
$matching = $matching.not(this);
}
});
$('.cd-gallery ul').mixItUp('filter', $matching);
} else {
// resets the filter to show all item if input is empty
$('.cd-gallery ul').mixItUp('filter', 'all');
}
}, 200 );
});
});
/*****************************************************
MixItUp - Define a single object literal
to contain all filter custom functionality
*****************************************************/
var buttonFilter = {
// Declare any variables we will need as properties of the object
$filters: null,
groups: [],
outputArray: [],
outputString: '',
// The "init" method will run on document ready and cache any jQuery objects we will need.
init: function(){
var self = this; // As a best practice, in each method we will asign "this" to the variable "self" so that it remains scope-agnostic. We will use it to refer to the parent "buttonFilter" object so that we can share methods and properties between all parts of the object.
self.$filters = $('.cd-main-content');
self.$container = $('.cd-gallery ul');
self.$filters.find('.cd-filters').each(function(){
var $this = $(this);
self.groups.push({
$inputs: $this.find('.filter'),
active: '',
tracker: false
});
});
self.bindHandlers();
},
// The "bindHandlers" method will listen for whenever a button is clicked.
bindHandlers: function(){
var self = this;
self.$filters.on('click', 'a', function(e){
self.parseFilters();
});
self.$filters.on('change', function(){
self.parseFilters();
});
},
parseFilters: function(){
var self = this;
// loop through each filter group and grap the active filter from each one.
for(var i = 0, group; group = self.groups[i]; i++){
group.active = [];
group.$inputs.each(function(){
var $this = $(this);
if($this.is('input[type="radio"]') || $this.is('input[type="checkbox"]')) {
if($this.is(':checked') ) {
group.active.push($this.attr('data-filter'));
}
} else if($this.is('select')){
group.active.push($this.val());
} else if( $this.find('.selected').length > 0 ) {
group.active.push($this.attr('data-filter'));
}
});
}
self.concatenate();
},
concatenate: function(){
var self = this;
self.outputString = ''; // Reset output string
for(var i = 0, group; group = self.groups[i]; i++){
self.outputString += group.active;
}
// If the output string is empty, show all rather than none:
!self.outputString.length && (self.outputString = 'all');
// Send the output string to MixItUp via the 'filter' method:
if(self.$container.mixItUp('isLoaded')){
self.$container.mixItUp('filter', self.outputString);
}
}
};
Shell File Manager Version 1.1, Coded By Shell
Email: [email protected]