diff --git a/ckanext/reclinepreview/theme/public/preview_recline.js b/ckanext/reclinepreview/theme/public/preview_recline.js index c8bf386c5ea..7b700d03e1b 100644 --- a/ckanext/reclinepreview/theme/public/preview_recline.js +++ b/ckanext/reclinepreview/theme/public/preview_recline.js @@ -15,7 +15,7 @@ this.ckan.module('reclinepreview', function (jQuery, _) { jQuery.proxyAll(this, /_on/); this.el.ready(this._onReady); // hack to make leaflet use a particular location to look for images - L.Icon.Default.imagePath = this.options.site_url + 'vendor/leaflet/0.4.4/images' + L.Icon.Default.imagePath = this.options.site_url + 'vendor/leaflet/0.4.4/images'; }, _onReady: function() { @@ -125,9 +125,9 @@ this.ckan.module('reclinepreview', function (jQuery, _) { var sidebarViews = [ { - id: 'filterEditor', + id: 'valueFilter', label: 'Filters', - view: new recline.View.FilterEditor({ + view: new recline.View.ValueFilter({ model: dataset }) } diff --git a/ckanext/reclinepreview/theme/public/vendor/recline/recline.css b/ckanext/reclinepreview/theme/public/vendor/recline/recline.css index e6437a11baf..c030e764692 100644 --- a/ckanext/reclinepreview/theme/public/vendor/recline/recline.css +++ b/ckanext/reclinepreview/theme/public/vendor/recline/recline.css @@ -395,6 +395,18 @@ div.data-table-cell-content-numeric > a.data-table-cell-edit { width: 175px; } +.recline-filter-editor input { + margin-top: 0.5em; +} + +.recline-filter-editor .add-filter { + margin-top: 1em; + margin-bottom: 2em; +} + +.recline-filter-editor .update-filter { + margin-top: 1em; +} /********************************************************** * Fields Widget diff --git a/ckanext/reclinepreview/theme/public/vendor/recline/recline.dataset.js b/ckanext/reclinepreview/theme/public/vendor/recline/recline.dataset.js index 92183702532..cdd33a0eb92 100644 --- a/ckanext/reclinepreview/theme/public/vendor/recline/recline.dataset.js +++ b/ckanext/reclinepreview/theme/public/vendor/recline/recline.dataset.js @@ -55,8 +55,8 @@ my.Dataset = Backbone.Model.extend({ if (this.backend !== recline.Backend.Memory) { this.backend.fetch(this.toJSON()) .done(handleResults) - .fail(function(arguments) { - dfd.reject(arguments); + .fail(function(args) { + dfd.reject(args); }); } else { // special case where we have been given data directly @@ -79,8 +79,8 @@ my.Dataset = Backbone.Model.extend({ .done(function() { dfd.resolve(self); }) - .fail(function(arguments) { - dfd.reject(arguments); + .fail(function(args) { + dfd.reject(args); }); } @@ -198,9 +198,9 @@ my.Dataset = Backbone.Model.extend({ self.trigger('query:done'); dfd.resolve(self.records); }) - .fail(function(arguments) { - self.trigger('query:fail', arguments); - dfd.reject(arguments); + .fail(function(args) { + self.trigger('query:fail', args); + dfd.reject(args); }); return dfd.promise(); }, @@ -309,9 +309,11 @@ my.Record = Backbone.Model.extend({ // // For the provided Field get the corresponding rendered computed data value // for this record. + // + // NB: if field is undefined a default '' value will be returned getFieldValue: function(field) { val = this.getFieldValueUnrendered(field); - if (field.renderer) { + if (field && !_.isUndefined(field.renderer)) { val = field.renderer(val, field, this.toJSON()); } return val; @@ -321,7 +323,12 @@ my.Record = Backbone.Model.extend({ // // For the provided Field get the corresponding computed data value // for this record. + // + // NB: if field is undefined a default '' value will be returned getFieldValueUnrendered: function(field) { + if (!field) { + return ''; + } var val = this.get(field.id); if (field.deriver) { val = field.deriver(val, field, this); @@ -443,7 +450,7 @@ my.Field = Backbone.Model.extend({ if (val && typeof val === 'string') { val = val.replace(/(https?:\/\/[^ ]+)/g, '$1'); } - return val + return val; } } } diff --git a/ckanext/reclinepreview/theme/public/vendor/recline/recline.dataset.min.js b/ckanext/reclinepreview/theme/public/vendor/recline/recline.dataset.min.js index 441e3937d81..c09914ac855 100644 --- a/ckanext/reclinepreview/theme/public/vendor/recline/recline.dataset.min.js +++ b/ckanext/reclinepreview/theme/public/vendor/recline/recline.dataset.min.js @@ -1,7 +1,7 @@ this.recline=this.recline||{};this.recline.Model=this.recline.Model||{};(function(my){var Deferred=_.isUndefined(this.jQuery)?_.Deferred:jQuery.Deferred;my.Dataset=Backbone.Model.extend({constructor:function Dataset(){Backbone.Model.prototype.constructor.apply(this,arguments);},initialize:function(){_.bindAll(this,'query');this.backend=null;if(this.get('backend')){this.backend=this._backendFromString(this.get('backend'));}else{if(this.get('records')){this.backend=recline.Backend.Memory;}} -this.fields=new my.FieldList();this.records=new my.RecordList();this._changes={deletes:[],updates:[],creates:[]};this.facets=new my.FacetList();this.recordCount=null;this.queryState=new my.Query();this.queryState.bind('change',this.query);this.queryState.bind('facet:add',this.query);this._store=this.backend;if(this.backend==recline.Backend.Memory){this.fetch();}},fetch:function(){var self=this;var dfd=new Deferred();if(this.backend!==recline.Backend.Memory){this.backend.fetch(this.toJSON()).done(handleResults).fail(function(arguments){dfd.reject(arguments);});}else{handleResults({records:this.get('records'),fields:this.get('fields'),useMemoryStore:true});} +this.fields=new my.FieldList();this.records=new my.RecordList();this._changes={deletes:[],updates:[],creates:[]};this.facets=new my.FacetList();this.recordCount=null;this.queryState=new my.Query();this.queryState.bind('change',this.query);this.queryState.bind('facet:add',this.query);this._store=this.backend;if(this.backend==recline.Backend.Memory){this.fetch();}},fetch:function(){var self=this;var dfd=new Deferred();if(this.backend!==recline.Backend.Memory){this.backend.fetch(this.toJSON()).done(handleResults).fail(function(args){dfd.reject(args);});}else{handleResults({records:this.get('records'),fields:this.get('fields'),useMemoryStore:true});} function handleResults(results){var out=self._normalizeRecordsAndFields(results.records,results.fields);if(results.useMemoryStore){self._store=new recline.Backend.Memory.Store(out.records,out.fields);} -self.set(results.metadata);self.fields.reset(out.fields);self.query().done(function(){dfd.resolve(self);}).fail(function(arguments){dfd.reject(arguments);});} +self.set(results.metadata);self.fields.reset(out.fields);self.query().done(function(){dfd.resolve(self);}).fail(function(args){dfd.reject(args);});} return dfd.promise();},_normalizeRecordsAndFields:function(records,fields){if(!fields&&records&&records.length>0){if(records[0]instanceof Array){fields=records[0];records=records.slice(1);}else{fields=_.map(_.keys(records[0]),function(key){return{id:key};});}} if(fields&&fields.length>0&&(fields[0]===null||typeof(fields[0])!='object')){var seen={};fields=_.map(fields,function(field,index){if(field===null){field='';}else{field=field.toString();} var fieldId=field.replace(/^\s+|\s+$/g,'');if(fieldId===''){fieldId='_noname_';field=fieldId;} @@ -11,10 +11,11 @@ return{id:fieldId};});} if(records&&records.length>0&&records[0]instanceof Array){records=_.map(records,function(doc){var tmp={};_.each(fields,function(field,idx){tmp[field.id]=doc[idx];});return tmp;});} return{fields:fields,records:records};},save:function(){var self=this;return this._store.save(this._changes,this.toJSON());},transform:function(editFunc){var self=this;if(!this._store.transform){alert('Transform is not supported with this backend: '+this.get('backend'));return;} this.trigger('recline:flash',{message:"Updating all visible docs. This could take a while...",persist:true,loader:true});this._store.transform(editFunc).done(function(){self.query();self.trigger('recline:flash',{message:"Records updated successfully"});});},query:function(queryObj){var self=this;var dfd=new Deferred();this.trigger('query:start');if(queryObj){this.queryState.set(queryObj,{silent:true});} -var actualQuery=this.queryState.toJSON();this._store.query(actualQuery,this.toJSON()).done(function(queryResult){self._handleQueryResult(queryResult);self.trigger('query:done');dfd.resolve(self.records);}).fail(function(arguments){self.trigger('query:fail',arguments);dfd.reject(arguments);});return dfd.promise();},_handleQueryResult:function(queryResult){var self=this;self.recordCount=queryResult.total;var docs=_.map(queryResult.hits,function(hit){var _doc=new my.Record(hit);_doc.fields=self.fields;_doc.bind('change',function(doc){self._changes.updates.push(doc.toJSON());});_doc.bind('destroy',function(doc){self._changes.deletes.push(doc.toJSON());});return _doc;});self.records.reset(docs);if(queryResult.facets){var facets=_.map(queryResult.facets,function(facetResult,facetId){facetResult.id=facetId;return new my.Facet(facetResult);});self.facets.reset(facets);}},toTemplateJSON:function(){var data=this.toJSON();data.recordCount=this.recordCount;data.fields=this.fields.toJSON();return data;},getFieldsSummary:function(){var self=this;var query=new my.Query();query.set({size:0});this.fields.each(function(field){query.addFacet(field.id);});var dfd=new Deferred();this._store.query(query.toJSON(),this.toJSON()).done(function(queryResult){if(queryResult.facets){_.each(queryResult.facets,function(facetResult,facetId){facetResult.id=facetId;var facet=new my.Facet(facetResult);self.fields.get(facetId).facets.reset(facet);});} +var actualQuery=this.queryState.toJSON();this._store.query(actualQuery,this.toJSON()).done(function(queryResult){self._handleQueryResult(queryResult);self.trigger('query:done');dfd.resolve(self.records);}).fail(function(args){self.trigger('query:fail',args);dfd.reject(args);});return dfd.promise();},_handleQueryResult:function(queryResult){var self=this;self.recordCount=queryResult.total;var docs=_.map(queryResult.hits,function(hit){var _doc=new my.Record(hit);_doc.fields=self.fields;_doc.bind('change',function(doc){self._changes.updates.push(doc.toJSON());});_doc.bind('destroy',function(doc){self._changes.deletes.push(doc.toJSON());});return _doc;});self.records.reset(docs);if(queryResult.facets){var facets=_.map(queryResult.facets,function(facetResult,facetId){facetResult.id=facetId;return new my.Facet(facetResult);});self.facets.reset(facets);}},toTemplateJSON:function(){var data=this.toJSON();data.recordCount=this.recordCount;data.fields=this.fields.toJSON();return data;},getFieldsSummary:function(){var self=this;var query=new my.Query();query.set({size:0});this.fields.each(function(field){query.addFacet(field.id);});var dfd=new Deferred();this._store.query(query.toJSON(),this.toJSON()).done(function(queryResult){if(queryResult.facets){_.each(queryResult.facets,function(facetResult,facetId){facetResult.id=facetId;var facet=new my.Facet(facetResult);self.fields.get(facetId).facets.reset(facet);});} dfd.resolve(queryResult);});return dfd.promise();},recordSummary:function(record){return record.summary();},_backendFromString:function(backendString){var backend=null;if(recline&&recline.Backend){_.each(_.keys(recline.Backend),function(name){if(name.toLowerCase()===backendString.toLowerCase()){backend=recline.Backend[name];}});} -return backend;}});my.Record=Backbone.Model.extend({constructor:function Record(){Backbone.Model.prototype.constructor.apply(this,arguments);},initialize:function(){_.bindAll(this,'getFieldValue');},getFieldValue:function(field){val=this.getFieldValueUnrendered(field);if(field.renderer){val=field.renderer(val,field,this.toJSON());} -return val;},getFieldValueUnrendered:function(field){var val=this.get(field.id);if(field.deriver){val=field.deriver(val,field,this);} +return backend;}});my.Record=Backbone.Model.extend({constructor:function Record(){Backbone.Model.prototype.constructor.apply(this,arguments);},initialize:function(){_.bindAll(this,'getFieldValue');},getFieldValue:function(field){val=this.getFieldValueUnrendered(field);if(field&&!_.isUndefined(field.renderer)){val=field.renderer(val,field,this.toJSON());} +return val;},getFieldValueUnrendered:function(field){if(!field){return'';} +var val=this.get(field.id);if(field.deriver){val=field.deriver(val,field,this);} return val;},summary:function(record){var self=this;var html='