backgrid-filter.min.js revision 89092dc10fe08b037266c0b4efb94b221f6fffb3
/*
backgrid-filter
http://github.com/wyuenho/backgrid
Copyright (c) 2013 Jimmy Yuen Ho Wong and contributors
Licensed under the MIT @license.
*/
!function(e,t){"function"==typeof define&&define.amd?define(["underscore","backbone","backgrid"],t):"object"==typeof exports?!function(){var e;try{e=require("lunr")}catch(i){}module.exports=t(require("underscore"),require("backbone"),require("backgrid"),e)}():t(e._,e.Backbone,e.Backgrid,e.lunr)}(this,function(e,t,i,n){"use strict";var a=i.Extension.ServerSideFilter=t.View.extend({tagName:"form",className:"backgrid-filter form-search",template:function(e){return'<span class="search">&nbsp;</span><input type="search" '+(e.placeholder?'placeholder="'+e.placeholder+'"':"")+' name="'+e.name+'" '+(e.value?'value="'+e.value+'"':"")+'/><a class="clear" data-backgrid-action="clear" href="#">&times;</a>'},events:{"keyup input[type=search]":"showClearButtonMaybe","click a[data-backgrid-action=clear]":"clear",submit:"search"},name:"q",value:null,placeholder:null,initialize:function(e){a.__super__.initialize.apply(this,arguments),this.name=e.name||this.name,this.value=e.value||this.value,this.placeholder=e.placeholder||this.placeholder,this.template=e.template||this.template;var i=this.collection,n=this;t.PageableCollection&&i instanceof t.PageableCollection&&"server"==i.mode&&(i.queryParams[this.name]=function(){return n.searchBox().val()||null})},clearSearchBox:function(){this.value=null,this.searchBox().val(null),this.showClearButtonMaybe()},showClearButtonMaybe:function(){var e=this.clearButton(),t=this.searchBox().val();t?e.show():e.hide()},searchBox:function(){return this.$el.find("input[type=search]")},clearButton:function(){return this.$el.find("a[data-backgrid-action=clear]")},query:function(){return this.value=this.searchBox().val(),this.value},search:function(e){e&&e.preventDefault();var i={},n=this.query();n&&(i[this.name]=n);var a=this.collection;t.PageableCollection&&a instanceof t.PageableCollection?a.getFirstPage({data:i,reset:!0,fetch:!0}):a.fetch({data:i,reset:!0})},clear:function(e){e&&e.preventDefault(),this.clearSearchBox();var i=this.collection;t.PageableCollection&&i instanceof t.PageableCollection?i.getFirstPage({reset:!0,fetch:!0}):i.fetch({reset:!0})},render:function(){return this.$el.empty().append(this.template({name:this.name,placeholder:this.placeholder,value:this.value})),this.showClearButtonMaybe(),this.delegateEvents(),this}}),s=i.Extension.ClientSideFilter=a.extend({events:e.extend({},a.prototype.events,{"click a[data-backgrid-action=clear]":function(e){e.preventDefault(),this.clear()},"keydown input[type=search]":"search",submit:function(e){e.preventDefault(),this.search()}}),fields:null,wait:149,initialize:function(t){s.__super__.initialize.apply(this,arguments),this.fields=t.fields||this.fields,this.wait=t.wait||this.wait,this._debounceMethods(["search","clear"]);var i=this.collection=this.collection.fullCollection||this.collection,n=this.shadowCollection=i.clone();this.listenTo(i,"add",function(e,t,i){n.add(e,i)}),this.listenTo(i,"remove",function(e,t,i){n.remove(e,i)}),this.listenTo(i,"sort",function(e){this.searchBox().val()||n.reset(e.models)}),this.listenTo(i,"reset",function(t,i){i=e.extend({reindex:!0},i||{}),i.reindex&&null==i.from&&null==i.to&&n.reset(t.models)})},_debounceMethods:function(t){e.isString(t)&&(t=[t]),this.undelegateEvents();for(var i=0,n=t.length;n>i;i++){var a=t[i],s=this[a];this[a]=e.debounce(s,this.wait)}this.delegateEvents()},makeRegExp:function(e){return new RegExp(e.trim().split(/\s+/).join("|"),"i")},makeMatcher:function(e){var t=this.makeRegExp(e);return function(e){for(var i=this.fields||e.keys(),n=0,a=i.length;a>n;n++)if(t.test(e.get(i[n])+""))return!0;return!1}},search:function(){var t=e.bind(this.makeMatcher(this.query()),this),i=this.collection;i.pageableCollection&&i.pageableCollection.getFirstPage({silent:!0}),i.reset(this.shadowCollection.filter(t),{reindex:!1})},clear:function(){this.clearSearchBox();var e=this.collection;e.pageableCollection&&e.pageableCollection.getFirstPage({silent:!0}),e.reset(this.shadowCollection.models,{reindex:!1})}}),l=i.Extension.LunrFilter=s.extend({ref:"id",fields:null,initialize:function(e){l.__super__.initialize.apply(this,arguments),this.ref=e.ref||this.ref;var t=this.collection=this.collection.fullCollection||this.collection;this.listenTo(t,"add",this.addToIndex),this.listenTo(t,"remove",this.removeFromIndex),this.listenTo(t,"reset",this.resetIndex),this.listenTo(t,"change",this.updateIndex),this.resetIndex(t)},resetIndex:function(t,i){if(i=e.extend({reindex:!0},i||{}),i.reindex){var a=this;this.index=n(function(){e.each(a.fields,function(e,t){this.field(t,e),this.ref(a.ref)},this)}),t.each(function(e){this.addToIndex(e)},this)}},addToIndex:function(e){var t=this.index,i=e.toJSON();t.documentStore.has(i[this.ref])?t.update(i):t.add(i)},removeFromIndex:function(e){var t=this.index,i=e.toJSON();t.documentStore.has(i[this.ref])&&t.remove(i)},updateIndex:function(t){var i=t.changedAttributes();i&&!e.isEmpty(e.intersection(e.keys(this.fields),e.keys(i)))&&this.index.update(t.toJSON())},search:function(){var e=this.collection;if(!this.query())return void e.reset(this.shadowCollection.models,{reindex:!1});for(var t=this.index.search(this.query()),i=[],n=0;n<t.length;n++){var a=t[n];i.push(this.shadowCollection.get(a.ref))}e.pageableCollection&&e.pageableCollection.getFirstPage({silent:!0}),e.reset(i,{reindex:!1})}})});