diff --git a/dist/filter.js b/dist/filter.js index 65a1475..29bc075 100644 --- a/dist/filter.js +++ b/dist/filter.js @@ -866,6 +866,7 @@ this.view = this.opts.view || renderRecord; this.templateFn = templateBuilder($(this.opts.template).html()); this.criterias = []; + this.orders = []; this._index = 1; this.appendToContainer = this.opts.appendToContainer || appendToContainer; this.has_pagination = !!this.opts.pagination; @@ -1049,6 +1050,22 @@ return true; }; + F.addOrder = function(orders){ + var self = this; + + if(!orders){ return false; } + + if($.isArray(orders)){ + $.each(orders, function(){ + addOrderCriteria.call(self, this); + }); + }else{ + addOrderCriteria.call(self, orders); + } + + return true; + }; + // Add Filter criteria // criteria: { ele: '#name', event: 'check', field: 'name', type: 'range' } var addFilterCriteria = function(criteria){ @@ -1073,6 +1090,30 @@ return true; }; + // Add Order criteria + // order: { ele: '#ordertoggle'} + // option value must be value="field.in.object|asc/desc" + + var addOrderCriteria = function(order){ + if(!order || !order.ele){ + return false; + } + + order.$ele = $(order.ele); + + if(!order.$ele.length){ + return false; + } + + order = setDefaultCriteriaOpts(order); + this.bindEvent(order.ele, order.event); + + order.active = true; + this.orders.push(order); + + return true; + }; + F.removeCriteria = function(field){ var self = this, criteria, index; @@ -1119,9 +1160,18 @@ F.getSelectedValues = function(criteria, context){ var vals = []; - criteria.$ele.filter(criteria.selector).each(function() { - vals.push($(this).val()); - }); + if(criteria.multiples){ + criteria.$ele.filter(criteria.selector).each(function() { + var str = $(this).val(); + var res = str.split(criteria.delimiter || '-'); + Array.prototype.push.apply(vals, res); + }); + }else{ + criteria.$ele.filter(criteria.selector).each(function() { + vals.push($(this).val()); + }); + } + if(vals==""){vals = ['$#$^*IJKJKIU*(ISHKJM 0; - criteria = count ? this.Model.where(query) : this.Model; + if(orcount > 0){ + criteria = count ? this.Model.where(query).order(orvals) : this.Model.order(orvals); + }else{ + criteria = count ? this.Model.where(query) : this.Model; + } this.execCallback('shortResult', criteria); this.last_result = criteria.all; diff --git a/src/filter.js b/src/filter.js index fe2cd8a..15c2f63 100644 --- a/src/filter.js +++ b/src/filter.js @@ -7,6 +7,7 @@ var FJS = function(records, container, options) { this.view = this.opts.view || renderRecord; this.templateFn = templateBuilder($(this.opts.template).html()); this.criterias = []; + this.orders = []; this._index = 1; this.appendToContainer = this.opts.appendToContainer || appendToContainer; this.has_pagination = !!this.opts.pagination; @@ -189,6 +190,22 @@ F.addCriteria = function(criterias){ return true; }; + +F.addOrder = function(orders){ +var self = this; + +if(!orders){ return false; } + +if($.isArray(orders)){ + $.each(orders, function(){ + addOrderCriteria.call(self, this); + }); +}else{ + addOrderCriteria.call(self, orders); +} + +return true; +}; // Add Filter criteria // criteria: { ele: '#name', event: 'check', field: 'name', type: 'range' } @@ -206,13 +223,43 @@ var addFilterCriteria = function(criteria){ criteria = setDefaultCriteriaOpts(criteria); this.bindEvent(criteria.ele, criteria.event); - criteria._q = criteria.field + (criteria.type == 'range' ? '.$bt' : '') + if(criteria.type == 'range'){ + criteria._q = criteria.field + '.$bt'; + }else if(criteria.type == 'like'){ + criteria._q = criteria.field + '.$li'; + }else{ + criteria._q = criteria.field + } criteria.active = true; this.criterias.push(criteria); return true; }; + +// Add Order criteria +// order: { ele: '#ordertoggle'} +// option value must be value="field.in.object|asc/desc" + +var addOrderCriteria = function(order){ + if(!order || !order.ele){ + return false; + } + + order.$ele = $(order.ele); + + if(!order.$ele.length){ + return false; + } + +order = setDefaultCriteriaOpts(order); + this.bindEvent(order.ele, order.event); + +order.active = true; + this.orders.push(order); + + return true; +}; F.removeCriteria = function(field){ var self = this, criteria, index; @@ -259,11 +306,27 @@ F.activateCriteria = function(names){ F.getSelectedValues = function(criteria, context){ var vals = []; - - criteria.$ele.filter(criteria.selector).each(function() { - vals.push($(this).val()); - }); - + + if(criteria.type == 'like'){ + var vals = ""; + criteria.$ele.filter(criteria.selector).each(function() { + vals+= "(?=.*"+$(this).val()+")"; + }); + } + else if(criteria.multiples){ + criteria.$ele.filter(criteria.selector).each(function() { + var str = $(this).val(); + var res = str.split(criteria.delimiter || '-'); + Array.prototype.push.apply(vals, res); + }); + if(vals==""){vals = ['$#$^*IJKJKIU*(ISHKJM 0; - criteria = count ? this.Model.where(query) : this.Model; + + $.each(this.orders, function(){ + if(this.active){ + orvals = self.getOrderValues(this, self); + orcount = orcount + 1; + } + }); + if(orcount > 0){ + criteria = count ? this.Model.where(query).order(orvals) : this.Model.order(orvals); + }else{ + criteria = count ? this.Model.where(query) : this.Model; + } + this.execCallback('shortResult', criteria); this.last_result = criteria.all;