mirror of
https://github.com/Oreolek/ifhub.club.git
synced 2024-07-16 21:34:25 +03:00
187 lines
6 KiB
JavaScript
187 lines
6 KiB
JavaScript
/**
|
|
* Аякс поиск
|
|
*
|
|
* @module ls/search-ajax
|
|
*
|
|
* @license GNU General Public License, version 2
|
|
* @copyright 2013 OOO "ЛС-СОФТ" {@link http://livestreetcms.com}
|
|
* @author Denis Shakhov <denis.shakhov@gmail.com>
|
|
*/
|
|
|
|
(function($) {
|
|
"use strict";
|
|
|
|
$.widget( "livestreet.lsSearchAjax", {
|
|
/**
|
|
* Дефолтные опции
|
|
*/
|
|
options: {
|
|
// Ссылки
|
|
urls: {
|
|
search: null
|
|
},
|
|
|
|
// Селекторы
|
|
selectors: {
|
|
more: '.js-more-search',
|
|
},
|
|
|
|
// Фильтры
|
|
filters : [],
|
|
|
|
// Парметры передаваемый при аякс запросе
|
|
params : {}
|
|
},
|
|
|
|
/**
|
|
* Конструктор
|
|
*
|
|
* @constructor
|
|
* @private
|
|
*/
|
|
_create: function () {
|
|
var _this = this;
|
|
|
|
this.elements = {
|
|
more: this.element.find( this.option( 'selectors.more' ) )
|
|
};
|
|
|
|
// Иниц-ия фильтров
|
|
$.each( this.option( 'filters' ), function ( index, value ) {
|
|
_this.addFilter( value );
|
|
});
|
|
|
|
// Кнопка подгрузки
|
|
this.elements.more.livequery(function () {
|
|
$( this ).more({
|
|
url: _this.option( 'urls.search' ),
|
|
result: 'sText', // тут лучше на дефолтный sHtml заменить
|
|
beforeload: function ( event, context ) {
|
|
$.extend( context.option( 'params' ), _this.option( 'params' ) );
|
|
}
|
|
});
|
|
});
|
|
},
|
|
|
|
/**
|
|
* Добавление фильра
|
|
*/
|
|
addFilter: function( filter ) {
|
|
var _this = this,
|
|
element = $( filter.selector ),
|
|
activeClass = filter.activeClass || ls.options.classes.states.active;
|
|
|
|
switch ( filter.type ) {
|
|
// Текстовое поле
|
|
case 'text':
|
|
var alphanumericFilter = $( filter.alphanumericFilterSelector );
|
|
|
|
element.on( 'keyup', function () {
|
|
_this.setParam( filter.name, $( this ).val() );
|
|
_this.setParam( 'isPrefix', 0 );
|
|
|
|
if ( alphanumericFilter.length ) {
|
|
alphanumericFilter
|
|
.eq(0)
|
|
.find( 'li' )
|
|
.removeClass( ls.options.classes.states.active )
|
|
.first()
|
|
.addClass( ls.options.classes.states.active );
|
|
}
|
|
|
|
ls.timer.run( _this, _this.update, null, null, 300 );
|
|
});
|
|
|
|
break;
|
|
case 'radio':
|
|
case 'checkbox':
|
|
case 'select':
|
|
// TODO: multiselect
|
|
element.on( 'change', function () {
|
|
var value, el = $( this );
|
|
|
|
if ( filter.type == 'checkbox' ) {
|
|
value = el.is( ':checked' ) ? 1 : 0;
|
|
} else {
|
|
value = el.val();
|
|
}
|
|
|
|
_this.setParam( filter.name, value );
|
|
_this.update();
|
|
});
|
|
|
|
break;
|
|
case 'list':
|
|
case 'sort':
|
|
case 'alphanumeric':
|
|
element.on( 'click', function ( event ) {
|
|
var el = $( this ),
|
|
els = el.closest( 'ul' ).find( 'li' ).not( el ),
|
|
value = el.data( 'value' );
|
|
|
|
els.removeClass( activeClass );
|
|
el.addClass( activeClass );
|
|
|
|
if ( filter.type == 'sort' ) {
|
|
var order = el.attr( 'data-order' );
|
|
|
|
els.attr( 'data-order', 'asc' );
|
|
el.attr( 'data-order', el.attr( 'data-order' ) == 'asc' ? 'desc' : 'asc' );
|
|
|
|
_this.setParam( 'order', order );
|
|
}
|
|
|
|
if ( filter.type == 'alphanumeric' ) {
|
|
var letter = el.data( 'letter' );
|
|
|
|
_this.setParam( 'isPrefix', letter ? 1 : 0 );
|
|
value = letter;
|
|
|
|
// Сбрасываем текстовый фильтр
|
|
$( filter.textFilterSelector ).val( '' );
|
|
}
|
|
|
|
_this.setParam( filter.name, value );
|
|
_this.update();
|
|
|
|
event.preventDefault();
|
|
});
|
|
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Установка параметра
|
|
*/
|
|
setParam: function( name, value ) {
|
|
this.option( 'params.' + name, value );
|
|
// this.updateUrl();
|
|
},
|
|
|
|
/**
|
|
* Получение параметра
|
|
*/
|
|
getParam: function( name ) {
|
|
return this.option( 'params.' + name );
|
|
},
|
|
|
|
/**
|
|
* Обновление поиска
|
|
*/
|
|
update: function() {
|
|
ls.ajax.load( this.option( 'urls.search' ), this.option( 'params' ), function ( response ) {
|
|
this.element.html( $.trim( response.sText ) );
|
|
}.bind( this ));
|
|
},
|
|
|
|
/**
|
|
* Обновляет ссылку на основе параметров
|
|
*/
|
|
updateUrl: function () {
|
|
window.history.pushState( {}, 'Search', window.location.origin + window.location.pathname + '?' + $.param( this.option( 'params' ) ) );
|
|
}
|
|
});
|
|
})( jQuery ); |