From 8f12aea64093320837bb928862904c958a3d6ee2 Mon Sep 17 00:00:00 2001 From: John Glover Date: Wed, 3 Apr 2013 14:59:47 +0200 Subject: [PATCH] [#702] Update Recline to latest master version. Adds filter support for datastore backend and a couple of other bug fixes. --- .../theme/public/preview_recline.js | 6 +- .../theme/public/vendor/recline/recline.css | 12 + .../public/vendor/recline/recline.dataset.js | 9 +- .../vendor/recline/recline.dataset.min.js | 5 +- .../theme/public/vendor/recline/recline.js | 216 ++++++++++++++---- .../public/vendor/recline/recline.min.css | 2 +- .../public/vendor/recline/recline.min.js | 59 +++-- 7 files changed, 241 insertions(+), 68 deletions(-) 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..7579c2ecaad 100644 --- a/ckanext/reclinepreview/theme/public/vendor/recline/recline.dataset.js +++ b/ckanext/reclinepreview/theme/public/vendor/recline/recline.dataset.js @@ -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); 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..f3298056220 100644 --- a/ckanext/reclinepreview/theme/public/vendor/recline/recline.dataset.min.js +++ b/ckanext/reclinepreview/theme/public/vendor/recline/recline.dataset.min.js @@ -13,8 +13,9 @@ return{fields:fields,records:records};},save:function(){var self=this;return thi 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);});} 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='
';this.fields.each(function(field){if(field.id!='id'){html+='
'+field.get('label')+': '+self.getFieldValue(field)+'
';}});html+='
';return html;},fetch:function(){},save:function(){},destroy:function(){this.trigger('destroy',this);}});my.RecordList=Backbone.Collection.extend({constructor:function RecordList(){Backbone.Collection.prototype.constructor.apply(this,arguments);},model:my.Record});my.Field=Backbone.Model.extend({constructor:function Field(){Backbone.Model.prototype.constructor.apply(this,arguments);},defaults:{label:null,type:'string',format:null,is_derived:false},initialize:function(data,options){if('0'in data){throw new Error('Looks like you did not pass a proper hash with id to Field constructor');} if(this.attributes.label===null){this.set({label:this.id});} if(this.attributes.type.toLowerCase()in this._typeMap){this.attributes.type=this._typeMap[this.attributes.type.toLowerCase()];} diff --git a/ckanext/reclinepreview/theme/public/vendor/recline/recline.js b/ckanext/reclinepreview/theme/public/vendor/recline/recline.js index adb0ab154fe..f6bc1f46b79 100644 --- a/ckanext/reclinepreview/theme/public/vendor/recline/recline.js +++ b/ckanext/reclinepreview/theme/public/vendor/recline/recline.js @@ -66,15 +66,25 @@ this.recline.Backend.Ckan = this.recline.Backend.Ckan || {}; var actualQuery = { resource_id: dataset.id, q: queryObj.q, + filters: {}, limit: queryObj.size || 10, offset: queryObj.from || 0 }; + if (queryObj.sort && queryObj.sort.length > 0) { var _tmp = _.map(queryObj.sort, function(sortObj) { return sortObj.field + ' ' + (sortObj.order || ''); }); actualQuery.sort = _tmp.join(','); } + + if (queryObj.filters && queryObj.filters.length > 0) { + _.each(queryObj.filters, function(filter) { + if (filter.type === "term") { + actualQuery.filters[filter.field] = filter.term; + } + }); + } return actualQuery; }; @@ -105,15 +115,14 @@ this.recline.Backend.Ckan = this.recline.Backend.Ckan || {}; // // @param endpoint: CKAN api endpoint (e.g. http://datahub.io/api) my.DataStore = function(endpoint) { - var that = { - endpoint: endpoint || my.API_ENDPOINT - }; + var that = {endpoint: endpoint || my.API_ENDPOINT}; + that.search = function(data) { var searchUrl = that.endpoint + '/3/action/datastore_search'; var jqxhr = jQuery.ajax({ url: searchUrl, - data: data, - dataType: 'json' + type: 'POST', + data: JSON.stringify(data) }); return jqxhr; }; @@ -1650,9 +1659,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; @@ -1662,7 +1673,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); @@ -2092,14 +2108,19 @@ my.Flot = Backbone.View.extend({ var xtype = xfield.get('type'); var isDateTime = (xtype === 'date' || xtype === 'date-time' || xtype === 'time'); - if (this.model.records.models[parseInt(x, 10)]) { - x = this.model.records.models[parseInt(x, 10)].get(this.state.attributes.group); - if (isDateTime) { - x = new Date(x).toLocaleDateString(); - } - } else if (isDateTime) { - x = new Date(parseInt(x, 10)).toLocaleDateString(); + if (this.xvaluesAreIndex) { + x = parseInt(x, 10); + // HACK: deal with bar graph style cases where x-axis items were strings + // In this case x at this point is the index of the item in the list of + // records not its actual x-axis value + x = this.model.records.models[x].get(this.state.attributes.group); } + if (isDateTime) { + x = new Date(x).toLocaleDateString(); + } + // } else if (isDateTime) { + // x = new Date(parseInt(x, 10)).toLocaleDateString(); + // } return x; }, @@ -2119,13 +2140,13 @@ my.Flot = Backbone.View.extend({ // convert x to a string and make sure that it is not too long or the // tick labels will overlap // TODO: find a more accurate way of calculating the size of tick labels - var label = self._xaxisLabel(x); + var label = self._xaxisLabel(x) || ""; if (typeof label !== 'string') { label = label.toString(); } - if (self.state.attributes.graphType !== 'bars' && label.length > 8) { - label = label.slice(0, 5) + "..."; + if (self.state.attributes.graphType !== 'bars' && label.length > 10) { + label = label.slice(0, 10) + "..."; } return label; @@ -2134,31 +2155,16 @@ my.Flot = Backbone.View.extend({ var xaxis = {}; xaxis.tickFormatter = tickFormatter; - // calculate the x-axis ticks - // - // the number of ticks should be a multiple of the number of points so that - // each tick lines up with a point - if (numPoints) { - var ticks = [], - maxTicks = 10, - x = 1, - i = 0; - - // show all ticks in bar graphs - // for other graphs only show up to maxTicks ticks - if (self.state.attributes.graphType !== 'bars') { - while (x <= maxTicks) { - if ((numPoints / x) <= maxTicks) { - break; - } - x = x + 1; - } - } - - for (i = 0; i < numPoints; i = i + x) { - ticks.push(i); + // for labels case we only want ticks at the label intervals + // HACK: however we also get this case with Date fields. In that case we + // could have a lot of values and so we limit to max 30 (we assume) + if (this.xvaluesAreIndex) { + var numTicks = Math.min(this.model.records.length, 15); + var increment = this.model.records.length / numTicks; + var ticks = []; + for (i=0; i \ +

Filters

\ + \ + \ +
\ + {{#filters}} \ + {{{filterRender}}} \ + {{/filters}} \ + {{#filters.length}} \ + \ + {{/filters.length}} \ +
\ + \ + ', + filterTemplates: { + term: ' \ +
\ +
\ + {{field}} \ + × \ + \ +
\ +
\ + ' + }, + events: { + 'click .js-remove-filter': 'onRemoveFilter', + 'click .js-add-filter': 'onAddFilterShow', + 'submit form.js-edit': 'onTermFiltersUpdate', + 'submit form.js-add': 'onAddFilter' + }, + initialize: function() { + this.el = $(this.el); + _.bindAll(this, 'render'); + this.model.fields.bind('all', this.render); + this.model.queryState.bind('change', this.render); + this.model.queryState.bind('change:filters:new-blank', this.render); + this.render(); + }, + render: function() { + var self = this; + var tmplData = $.extend(true, {}, this.model.queryState.toJSON()); + // we will use idx in list as the id ... + tmplData.filters = _.map(tmplData.filters, function(filter, idx) { + filter.id = idx; + return filter; + }); + tmplData.fields = this.model.fields.toJSON(); + tmplData.filterRender = function() { + return Mustache.render(self.filterTemplates.term, this); + }; + var out = Mustache.render(this.template, tmplData); + this.el.html(out); + }, + updateFilter: function(input) { + var self = this; + var filters = self.model.queryState.get('filters'); + var $input = $(input); + var filterIndex = parseInt($input.attr('data-filter-id'), 10); + var value = $input.val(); + filters[filterIndex].term = value; + }, + onAddFilterShow: function(e) { + e.preventDefault(); + var $target = $(e.target); + $target.hide(); + this.el.find('form.js-add').show(); + }, + onAddFilter: function(e) { + e.preventDefault(); + var $target = $(e.target); + $target.hide(); + var field = $target.find('select.fields').val(); + this.model.queryState.addFilter({type: 'term', field: field}); + }, + onRemoveFilter: function(e) { + e.preventDefault(); + var $target = $(e.target); + var filterId = $target.attr('data-filter-id'); + this.model.queryState.removeFilter(filterId); + }, + onTermFiltersUpdate: function(e) { + var self = this; + e.preventDefault(); + var filters = self.model.queryState.get('filters'); + var $form = $(e.target); + _.each($form.find('input'), function(input) { + self.updateFilter(input); + }); + self.model.queryState.set({filters: filters, from: 0}); + self.model.queryState.trigger('change'); + } +}); + +})(jQuery, recline.View); diff --git a/ckanext/reclinepreview/theme/public/vendor/recline/recline.min.css b/ckanext/reclinepreview/theme/public/vendor/recline/recline.min.css index db61ee86dd7..ff445f823a8 100644 --- a/ckanext/reclinepreview/theme/public/vendor/recline/recline.min.css +++ b/ckanext/reclinepreview/theme/public/vendor/recline/recline.min.css @@ -1 +1 @@ -.recline-flot .graph{height:500px;overflow:hidden}.recline-flot .legend table{width:auto;margin-bottom:0}.recline-flot .legend td{padding:5px;line-height:13px}.recline-flot .graph .alert{width:450px}#recline-flot-tooltip{position:absolute;background-color:#FEE!important;color:#000000!important;opacity:0.8!important;border:1px solid #fdd!important}.recline-graph .graph{height:500px}.recline-graph .legend table{width:auto;margin-bottom:0}.recline-graph .legend td{padding:5px;line-height:13px}.recline-graph .graph .alert{width:450px}.flotr-mouse-value{background-color:#FEE!important;color:#000000!important;opacity:0.8!important;border:1px solid #fdd!important}.flotr-legend{border:none!important}.flotr-legend-bg{display:none}.flotr-legend-color-box{padding:5px}table.recline-grid{table-layout:fixed;width:100%}.recline-grid .btn-group .dropdown-toggle{padding:1px 3px;line-height:auto}.recline-grid td,.recline-grid th{border-left:1px solid #ccc;padding:3px 4px;text-align:left;word-wrap:break-word;white-space:normal}.recline-grid tbody tr{vertical-align:top;border-bottom:solid 1px #ccc}.recline-grid tbody tr:last-child{border-bottom:1px solid #ccc}.recline-grid tbody td:last-child{border-right:1px solid #ccc}.recline-grid th{background-color:#e6e6e6;background-repeat:no-repeat;background-image:-webkit-gradient(linear,0 0,0 100%,from(#ffffff),color-stop(25%,#ffffff),to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff,#ffffff 25%,#e6e6e6);background-image:-moz-linear-gradient(top,#ffffff,#ffffff 25%,#e6e6e6);background-image:-ms-linear-gradient(#ffffff,#ffffff 25%,#e6e6e6);background-image:-o-linear-gradient(#ffffff,#ffffff 25%,#e6e6e6);background-image:linear-gradient(#ffffff,#ffffff 25%,#e6e6e6);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff',endColorstr='#e6e6e6',GradientType=0);text-shadow:0 1px 1px rgba(255,255,255,0.75);color:#333;border:1px solid #ccc;border-bottom-color:#bbb;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-webkit-transition:0.1s linear all;-moz-transition:0.1s linear all;-ms-transition:0.1s linear all;-o-transition:0.1s linear all;transition:0.1s linear all}div.table-container{overflow:auto}html>body div.table-container{overflow:hidden}thead.fixed-header tr{overflow-x:hidden}thead.fixed-header tr{position:relative}html>body thead.fixed-header tr{display:block}tbody.scroll-content{display:block;max-height:500px;overflow:auto}.column-header-menu,a.root-header-menu{float:right}div.data-table-cell-content{line-height:1.2;color:#222;position:relative}div.data-table-cell-content-numeric{text-align:right}a.data-table-cell-edit{position:absolute;top:0;right:0;display:block;width:25px;height:16px;text-decoration:none;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAQCAYAAABUWyyMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OTNEODNFMjVEMDA5MTFERjk5NzhEQzZDRDUwRkEzMUEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTNEODNFMjZEMDA5MTFERjk5NzhEQzZDRDUwRkEzMUEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5M0Q4M0UyM0QwMDkxMURGOTk3OERDNkNENTBGQTMxQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5M0Q4M0UyNEQwMDkxMURGOTk3OERDNkNENTBGQTMxQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PpApVmcAAAKVSURBVHjaYvz//z/DcAAsIGLaxjf2QKoLiM2oaPYpIC7L8hc5COI4F9+hmR17e1UOskAFVgCxBJUDyQxqriQ97GCCCpBkATCUGQxVOTHY7KyMDFoKHMhKJXCwCQJgKDNEOAlisHk5mRh8LPgw7GChNEg2HfvI8OnbPzDbwYAH6BkmhmsPflA12EtnPmN4/vY3mF0YKgb2zJYTn5CV/EfxiKgAC4O7CS8DHzczw5PXvxl2nv7E8PP3fxTx87e/o1hipMrFcOfZT6BmVgYZUTawmKUWN8Pxa1+xOkpNhp2hLk6CQVKYleHcrW8MTYteMHz+/g9FfMW+9yh6Ih0FGA5e/MLAAIx5IzUusFiqtzDD7K1vYUpcmZA1+FnxM7z++AccyqBkAgphmMPY2ZiAHvsMFkcGMkAPgMQ+ff3L8PPXPzD++O0vztDtypBmuPXkJziUebiYwSEMcxiID/IYiEYJLKDjQWLP3v1h+AI0G4RhMQQF5UzoDvr5CxIDoJhQlmKHy527/Y3hLjDkD4BCBgsAxSAoiYEwrqQFchAoWcBiAOQge30euBwoJkAh37/6FVb9oBgEeQCE0ZKWC8488vj1LzCmJTgLTKZn0ZIquYAJOURBsQDKB68//GHgYEWkOlBMgPICKIYcoCGIC4BiFRSDuEIUFBtSQizg5AWKHRgAxQSoZALFECy54QKgZAbLKxgegZVAfFxM4LyiLMUGTPeQ0ujAhS9gz7mb8sI9iisWQclSG7UIRgFlM56CM3R3uhTY0bC0DkpOtx//AGd4mEdxxSIoWaIVwQyMoCYKsGanWTsFWM8wQmt2mtkBqmdgMfKCRna8wMGmth2MMI/EAfEdKltwB2ouAz3sYBwurV8mhmECAAIMAEe3EkMWh/DvAAAAAElFTkSuQmCC);background-repeat:no-repeat;visibility:hidden}a.data-table-cell-edit:hover{background-position:-25px 0px}.recline-grid td:hover .data-table-cell-edit{visibility:visible}div.data-table-cell-content-numeric>a.data-table-cell-edit{left:0px;right:auto}.data-table-value-nonstring{color:#282}.data-table-error{color:red}.data-table-cell-editor-editor{overflow:hidden;display:block;width:98%;height:3em;font-family:monospace;margin:3px 0}.data-table-cell-copypaste-editor{overflow:hidden;display:block;width:98%;height:10em;font-family:monospace;margin:3px 0}.data-table-cell-editor-action{float:left;vertical-align:bottom;text-align:center}.data-table-cell-editor-key{font-size:0.8em;color:#999}.recline-read-only .recline-grid .write-op,.recline-read-only .recline-grid a.data-table-cell-edit{display:none}.recline-read-only a.row-header-menu{display:none}.recline-map .map{height:500px}.recline-map .editor{float:right;width:200px;padding-left:0px;margin-left:10px}.recline-map .editor form{padding-left:4px}.recline-map .editor select{width:100%}.recline-map .editor .editor-options{margin-top:10px;border-top:1px solid gray;padding:5px 0}.recline-data-explorer .data-view-container{display:block}.recline-data-explorer .data-view-sidebar{float:right;margin-left:8px;width:220px}.recline-data-explorer .header .navigation{margin-bottom:8px}.recline-data-explorer .header .navigation,.recline-data-explorer .header .pagination,.recline-data-explorer .header .pagination form{display:inline}.recline-data-explorer .header .navigation{float:left}.recline-data-explorer .header .menu-right{float:right;margin-left:5px;padding-left:5px;border-left:solid 2px #ddd}.header .recline-results-info{line-height:28px;margin-left:20px;float:left}.header .recline-query-editor{float:right;height:30px}.header .input-prepend{margin-bottom:auto}.header .add-on{float:left}.header .add-on{margin-left:-27px}.header .input-prepend{vertical-align:top}.header .recline-query-editor form button{vertical-align:top}.header .recline-pager{float:left;margin:auto;display:block;margin-left:20px}.header .recline-pager .pagination input{width:30px;height:18px;padding:2px 4px;margin:0;margin-top:-4px}.header .recline-pager .pagination a{line-height:26px;padding:0 6px}.recline-filter-editor{padding:8px;display:none}.recline-filter-editor .filter-term a{font-size:18px}.recline-filter-editor input,.recline-filter-editor select{width:175px}.recline-fields-view{display:none}.recline-fields-view .fields-list{padding:0}.recline-fields-view .fields-list .accordion-heading,.recline-fields-view .fields-list h3{margin:3px 0 3px 5px}.recline-fields-view .fields-list .accordion-heading a,.recline-fields-view .fields-list .accordion-heading h4{display:inline}.recline-fields-view .fields-list .accordion-heading a{padding:0}.recline-fields-view .fields-list .accordion-heading h4{word-wrap:break-word}.recline-fields-view .clear{clear:both}.recline-fields-view .facet-items{list-style-type:none;margin-left:0}.recline-fields-view .facet-item .term{font-weight:bold}.recline-fields-view .facet-item .count{}.recline-data-explorer .notification-loader{width:18px;margin-left:5px;background-image:url(data:image/gif;base64,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%3D%3D);display:inline-block}.recline-data-explorer .alert-loader{position:absolute;width:200px;left:50%;margin-left:-100px;z-index:10000;padding:40px 0px 40px 0px;margin-top:-10px;text-align:center;font-size:16px;font-weight:bold;-webkit-border-radius:0px;-moz-border-radius:0px;border-radius:0px;border-top:none}.recline-slickgrid .slick-header-columns .slick-header-column{background-color:#e6e6e6;background-repeat:no-repeat;background-image:-webkit-gradient(linear,0 0,0 100%,from(#ffffff),color-stop(25%,#ffffff),to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff,#ffffff 25%,#e6e6e6);background-image:-moz-linear-gradient(top,#ffffff,#ffffff 25%,#e6e6e6);background-image:-ms-linear-gradient(#ffffff,#ffffff 25%,#e6e6e6);background-image:-o-linear-gradient(#ffffff,#ffffff 25%,#e6e6e6);background-image:linear-gradient(#ffffff,#ffffff 25%,#e6e6e6);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff',endColorstr='#e6e6e6',GradientType=0);text-shadow:0 1px 1px rgba(255,255,255,0.75);color:#333;font-weight:bold;border-right:1px solid #ccc;border-top:1px solid #ccc;border-bottom:1px solid #bbb;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.recline-slickgrid .slick-header-column:hover,.slick-header-column-active{}.recline-slickgrid .slick-headerrow{background:#fafafa}.recline-slickgrid .slick-headerrow-column{background:#fafafa;border-bottom:0;height:100%}.recline-slickgrid .slick-row.ui-state-active{background:#F5F7D7}.recline-slickgrid .slick-row{position:absolute;background:white;border:0px;line-height:20px}.recline-slickgrid .slick-row.selected{z-index:10;background:#DFE8F6}.recline-slickgrid .slick-cell{padding-left:4px;padding-right:4px}.recline-slickgrid .slick-group{border-bottom:2px solid silver}.recline-slickgrid .slick-group-toggle{width:9px;height:9px;margin-right:5px}.recline-slickgrid .slick-group-toggle.expanded{background:url(../images/collapse.gif) no-repeat center center}.recline-slickgrid .slick-group-toggle.collapsed{background:url(../images/expand.gif) no-repeat center center}.recline-slickgrid .slick-group-totals{color:gray;background:white}.recline-slickgrid .slick-cell.selected{background-color:beige}.recline-slickgrid .slick-cell.active{border-color:gray;border-style:solid}.recline-slickgrid .slick-sortable-placeholder{background:silver!important}.recline-slickgrid .slick-row[row$="1"],.slick-row[row$="3"],.slick-row[row$="5"],.slick-row[row$="7"],.slick-row[row$="9"]{background:#fafafa}.recline-slickgrid .slick-row.ui-state-active{background:#F5F7D7}.recline-slickgrid .slick-row.loading{opacity:0.5;filter:alpha(opacity=50)}.recline-slickgrid .slick-cell.invalid{border-color:red}.recline-slickgrid .slick-row .slick-cell:first-child,.recline-slickgrid .slick-header{border-left:1px solid #ccc}.recline-slickgrid .slick-row .slick-cell{margin-right:-1px}.slick-contextmenu{border-radius:5px}.slick-contextmenu li{clear:both;height:24px;cursor:pointer}.slick-contextmenu .divider{cursor:default}.slick-contextmenu>li:hover{background-color:#0088cc}.slick-contextmenu .divider:hover{background-color:#E5E5E5}.slick-contextmenu li:hover>label{color:white}.slick-contextmenu input{float:left;margin-left:15px;margin-top:5px}.slick-contextmenu label{float:left;margin-right:15px;margin-left:5px;margin-top:3px;color:#555;cursor:pointer}.recline-transform{overflow:hidden}.recline-transform .script textarea{width:100%;height:100px;font-family:monospace;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.recline-transform h2{margin-bottom:10px}.recline-transform h2 .okButton{margin-left:10px;margin-top:-2px}.expression-preview-parsing-status{color:#999}.expression-preview-parsing-status.error{color:red}.recline-transform .before-after .after{font-style:italic}.recline-transform .before-after .after.different{font-weight:bold} \ No newline at end of file +.recline-flot .graph{height:500px;overflow:hidden}.recline-flot .legend table{width:auto;margin-bottom:0}.recline-flot .legend td{padding:5px;line-height:13px}.recline-flot .graph .alert{width:450px}#recline-flot-tooltip{position:absolute;background-color:#FEE!important;color:#000000!important;opacity:0.8!important;border:1px solid #fdd!important}.recline-graph .graph{height:500px}.recline-graph .legend table{width:auto;margin-bottom:0}.recline-graph .legend td{padding:5px;line-height:13px}.recline-graph .graph .alert{width:450px}.flotr-mouse-value{background-color:#FEE!important;color:#000000!important;opacity:0.8!important;border:1px solid #fdd!important}.flotr-legend{border:none!important}.flotr-legend-bg{display:none}.flotr-legend-color-box{padding:5px}table.recline-grid{table-layout:fixed;width:100%}.recline-grid .btn-group .dropdown-toggle{padding:1px 3px;line-height:auto}.recline-grid td,.recline-grid th{border-left:1px solid #ccc;padding:3px 4px;text-align:left;word-wrap:break-word;white-space:normal}.recline-grid tbody tr{vertical-align:top;border-bottom:solid 1px #ccc}.recline-grid tbody tr:last-child{border-bottom:1px solid #ccc}.recline-grid tbody td:last-child{border-right:1px solid #ccc}.recline-grid th{background-color:#e6e6e6;background-repeat:no-repeat;background-image:-webkit-gradient(linear,0 0,0 100%,from(#ffffff),color-stop(25%,#ffffff),to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff,#ffffff 25%,#e6e6e6);background-image:-moz-linear-gradient(top,#ffffff,#ffffff 25%,#e6e6e6);background-image:-ms-linear-gradient(#ffffff,#ffffff 25%,#e6e6e6);background-image:-o-linear-gradient(#ffffff,#ffffff 25%,#e6e6e6);background-image:linear-gradient(#ffffff,#ffffff 25%,#e6e6e6);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff',endColorstr='#e6e6e6',GradientType=0);text-shadow:0 1px 1px rgba(255,255,255,0.75);color:#333;border:1px solid #ccc;border-bottom-color:#bbb;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-webkit-transition:0.1s linear all;-moz-transition:0.1s linear all;-ms-transition:0.1s linear all;-o-transition:0.1s linear all;transition:0.1s linear all}div.table-container{overflow:auto}html>body div.table-container{overflow:hidden}thead.fixed-header tr{overflow-x:hidden}thead.fixed-header tr{position:relative}html>body thead.fixed-header tr{display:block}tbody.scroll-content{display:block;max-height:500px;overflow:auto}.column-header-menu,a.root-header-menu{float:right}div.data-table-cell-content{line-height:1.2;color:#222;position:relative}div.data-table-cell-content-numeric{text-align:right}a.data-table-cell-edit{position:absolute;top:0;right:0;display:block;width:25px;height:16px;text-decoration:none;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAQCAYAAABUWyyMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OTNEODNFMjVEMDA5MTFERjk5NzhEQzZDRDUwRkEzMUEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTNEODNFMjZEMDA5MTFERjk5NzhEQzZDRDUwRkEzMUEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5M0Q4M0UyM0QwMDkxMURGOTk3OERDNkNENTBGQTMxQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5M0Q4M0UyNEQwMDkxMURGOTk3OERDNkNENTBGQTMxQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PpApVmcAAAKVSURBVHjaYvz//z/DcAAsIGLaxjf2QKoLiM2oaPYpIC7L8hc5COI4F9+hmR17e1UOskAFVgCxBJUDyQxqriQ97GCCCpBkATCUGQxVOTHY7KyMDFoKHMhKJXCwCQJgKDNEOAlisHk5mRh8LPgw7GChNEg2HfvI8OnbPzDbwYAH6BkmhmsPflA12EtnPmN4/vY3mF0YKgb2zJYTn5CV/EfxiKgAC4O7CS8DHzczw5PXvxl2nv7E8PP3fxTx87e/o1hipMrFcOfZT6BmVgYZUTawmKUWN8Pxa1+xOkpNhp2hLk6CQVKYleHcrW8MTYteMHz+/g9FfMW+9yh6Ih0FGA5e/MLAAIx5IzUusFiqtzDD7K1vYUpcmZA1+FnxM7z++AccyqBkAgphmMPY2ZiAHvsMFkcGMkAPgMQ+ff3L8PPXPzD++O0vztDtypBmuPXkJziUebiYwSEMcxiID/IYiEYJLKDjQWLP3v1h+AI0G4RhMQQF5UzoDvr5CxIDoJhQlmKHy527/Y3hLjDkD4BCBgsAxSAoiYEwrqQFchAoWcBiAOQge30euBwoJkAh37/6FVb9oBgEeQCE0ZKWC8488vj1LzCmJTgLTKZn0ZIquYAJOURBsQDKB68//GHgYEWkOlBMgPICKIYcoCGIC4BiFRSDuEIUFBtSQizg5AWKHRgAxQSoZALFECy54QKgZAbLKxgegZVAfFxM4LyiLMUGTPeQ0ujAhS9gz7mb8sI9iisWQclSG7UIRgFlM56CM3R3uhTY0bC0DkpOtx//AGd4mEdxxSIoWaIVwQyMoCYKsGanWTsFWM8wQmt2mtkBqmdgMfKCRna8wMGmth2MMI/EAfEdKltwB2ouAz3sYBwurV8mhmECAAIMAEe3EkMWh/DvAAAAAElFTkSuQmCC);background-repeat:no-repeat;visibility:hidden}a.data-table-cell-edit:hover{background-position:-25px 0px}.recline-grid td:hover .data-table-cell-edit{visibility:visible}div.data-table-cell-content-numeric>a.data-table-cell-edit{left:0px;right:auto}.data-table-value-nonstring{color:#282}.data-table-error{color:red}.data-table-cell-editor-editor{overflow:hidden;display:block;width:98%;height:3em;font-family:monospace;margin:3px 0}.data-table-cell-copypaste-editor{overflow:hidden;display:block;width:98%;height:10em;font-family:monospace;margin:3px 0}.data-table-cell-editor-action{float:left;vertical-align:bottom;text-align:center}.data-table-cell-editor-key{font-size:0.8em;color:#999}.recline-read-only .recline-grid .write-op,.recline-read-only .recline-grid a.data-table-cell-edit{display:none}.recline-read-only a.row-header-menu{display:none}.recline-map .map{height:500px}.recline-map .editor{float:right;width:200px;padding-left:0px;margin-left:10px}.recline-map .editor form{padding-left:4px}.recline-map .editor select{width:100%}.recline-map .editor .editor-options{margin-top:10px;border-top:1px solid gray;padding:5px 0}.recline-data-explorer .data-view-container{display:block}.recline-data-explorer .data-view-sidebar{float:right;margin-left:8px;width:220px}.recline-data-explorer .header .navigation{margin-bottom:8px}.recline-data-explorer .header .navigation,.recline-data-explorer .header .pagination,.recline-data-explorer .header .pagination form{display:inline}.recline-data-explorer .header .navigation{float:left}.recline-data-explorer .header .menu-right{float:right;margin-left:5px;padding-left:5px;border-left:solid 2px #ddd}.header .recline-results-info{line-height:28px;margin-left:20px;float:left}.header .recline-query-editor{float:right;height:30px}.header .input-prepend{margin-bottom:auto}.header .add-on{float:left}.header .add-on{margin-left:-27px}.header .input-prepend{vertical-align:top}.header .recline-query-editor form button{vertical-align:top}.header .recline-pager{float:left;margin:auto;display:block;margin-left:20px}.header .recline-pager .pagination input{width:30px;height:18px;padding:2px 4px;margin:0;margin-top:-4px}.header .recline-pager .pagination a{line-height:26px;padding:0 6px}.recline-filter-editor{padding:8px;display:none}.recline-filter-editor .filter-term a{font-size:18px}.recline-filter-editor input,.recline-filter-editor select{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}.recline-fields-view{display:none}.recline-fields-view .fields-list{padding:0}.recline-fields-view .fields-list .accordion-heading,.recline-fields-view .fields-list h3{margin:3px 0 3px 5px}.recline-fields-view .fields-list .accordion-heading a,.recline-fields-view .fields-list .accordion-heading h4{display:inline}.recline-fields-view .fields-list .accordion-heading a{padding:0}.recline-fields-view .fields-list .accordion-heading h4{word-wrap:break-word}.recline-fields-view .clear{clear:both}.recline-fields-view .facet-items{list-style-type:none;margin-left:0}.recline-fields-view .facet-item .term{font-weight:bold}.recline-fields-view .facet-item .count{}.recline-data-explorer .notification-loader{width:18px;margin-left:5px;background-image:url(data:image/gif;base64,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%3D%3D);display:inline-block}.recline-data-explorer .alert-loader{position:absolute;width:200px;left:50%;margin-left:-100px;z-index:10000;padding:40px 0px 40px 0px;margin-top:-10px;text-align:center;font-size:16px;font-weight:bold;-webkit-border-radius:0px;-moz-border-radius:0px;border-radius:0px;border-top:none}.recline-slickgrid .slick-header-columns .slick-header-column{background-color:#e6e6e6;background-repeat:no-repeat;background-image:-webkit-gradient(linear,0 0,0 100%,from(#ffffff),color-stop(25%,#ffffff),to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff,#ffffff 25%,#e6e6e6);background-image:-moz-linear-gradient(top,#ffffff,#ffffff 25%,#e6e6e6);background-image:-ms-linear-gradient(#ffffff,#ffffff 25%,#e6e6e6);background-image:-o-linear-gradient(#ffffff,#ffffff 25%,#e6e6e6);background-image:linear-gradient(#ffffff,#ffffff 25%,#e6e6e6);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff',endColorstr='#e6e6e6',GradientType=0);text-shadow:0 1px 1px rgba(255,255,255,0.75);color:#333;font-weight:bold;border-right:1px solid #ccc;border-top:1px solid #ccc;border-bottom:1px solid #bbb;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.recline-slickgrid .slick-header-column:hover,.slick-header-column-active{}.recline-slickgrid .slick-headerrow{background:#fafafa}.recline-slickgrid .slick-headerrow-column{background:#fafafa;border-bottom:0;height:100%}.recline-slickgrid .slick-row.ui-state-active{background:#F5F7D7}.recline-slickgrid .slick-row{position:absolute;background:white;border:0px;line-height:20px}.recline-slickgrid .slick-row.selected{z-index:10;background:#DFE8F6}.recline-slickgrid .slick-cell{padding-left:4px;padding-right:4px}.recline-slickgrid .slick-group{border-bottom:2px solid silver}.recline-slickgrid .slick-group-toggle{width:9px;height:9px;margin-right:5px}.recline-slickgrid .slick-group-toggle.expanded{background:url(../images/collapse.gif) no-repeat center center}.recline-slickgrid .slick-group-toggle.collapsed{background:url(../images/expand.gif) no-repeat center center}.recline-slickgrid .slick-group-totals{color:gray;background:white}.recline-slickgrid .slick-cell.selected{background-color:beige}.recline-slickgrid .slick-cell.active{border-color:gray;border-style:solid}.recline-slickgrid .slick-sortable-placeholder{background:silver!important}.recline-slickgrid .slick-row[row$="1"],.slick-row[row$="3"],.slick-row[row$="5"],.slick-row[row$="7"],.slick-row[row$="9"]{background:#fafafa}.recline-slickgrid .slick-row.ui-state-active{background:#F5F7D7}.recline-slickgrid .slick-row.loading{opacity:0.5;filter:alpha(opacity=50)}.recline-slickgrid .slick-cell.invalid{border-color:red}.recline-slickgrid .slick-row .slick-cell:first-child,.recline-slickgrid .slick-header{border-left:1px solid #ccc}.recline-slickgrid .slick-row .slick-cell{margin-right:-1px}.slick-contextmenu{border-radius:5px}.slick-contextmenu li{clear:both;height:24px;cursor:pointer}.slick-contextmenu .divider{cursor:default}.slick-contextmenu>li:hover{background-color:#0088cc}.slick-contextmenu .divider:hover{background-color:#E5E5E5}.slick-contextmenu li:hover>label{color:white}.slick-contextmenu input{float:left;margin-left:15px;margin-top:5px}.slick-contextmenu label{float:left;margin-right:15px;margin-left:5px;margin-top:3px;color:#555;cursor:pointer}.recline-transform{overflow:hidden}.recline-transform .script textarea{width:100%;height:100px;font-family:monospace;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.recline-transform h2{margin-bottom:10px}.recline-transform h2 .okButton{margin-left:10px;margin-top:-2px}.expression-preview-parsing-status{color:#999}.expression-preview-parsing-status.error{color:red}.recline-transform .before-after .after{font-style:italic}.recline-transform .before-after .after.different{font-weight:bold} \ No newline at end of file diff --git a/ckanext/reclinepreview/theme/public/vendor/recline/recline.min.js b/ckanext/reclinepreview/theme/public/vendor/recline/recline.min.js index 3ba7d8d831a..6ed057ef33a 100644 --- a/ckanext/reclinepreview/theme/public/vendor/recline/recline.min.js +++ b/ckanext/reclinepreview/theme/public/vendor/recline/recline.min.js @@ -1,7 +1,8 @@ this.recline=this.recline||{};this.recline.Backend=this.recline.Backend||{};this.recline.Backend.Ckan=this.recline.Backend.Ckan||{};(function(my){my.__type__='ckan';var Deferred=_.isUndefined(this.jQuery)?_.Deferred:jQuery.Deferred;my.API_ENDPOINT='http://datahub.io/api';my.fetch=function(dataset){if(dataset.endpoint){var wrapper=my.DataStore(dataset.endpoint);}else{var out=my._parseCkanResourceUrl(dataset.url);dataset.id=out.resource_id;var wrapper=my.DataStore(out.endpoint);} -var dfd=new Deferred();var jqxhr=wrapper.search({resource_id:dataset.id,limit:0});jqxhr.done(function(results){var fields=_.map(results.result.fields,function(field){field.type=field.type in CKAN_TYPES_MAP?CKAN_TYPES_MAP[field.type]:field.type;return field;});var out={fields:fields,useMemoryStore:false};dfd.resolve(out);});return dfd.promise();};my._normalizeQuery=function(queryObj,dataset){var actualQuery={resource_id:dataset.id,q:queryObj.q,limit:queryObj.size||10,offset:queryObj.from||0};if(queryObj.sort&&queryObj.sort.length>0){var _tmp=_.map(queryObj.sort,function(sortObj){return sortObj.field+' '+(sortObj.order||'');});actualQuery.sort=_tmp.join(',');} +var dfd=new Deferred();var jqxhr=wrapper.search({resource_id:dataset.id,limit:0});jqxhr.done(function(results){var fields=_.map(results.result.fields,function(field){field.type=field.type in CKAN_TYPES_MAP?CKAN_TYPES_MAP[field.type]:field.type;return field;});var out={fields:fields,useMemoryStore:false};dfd.resolve(out);});return dfd.promise();};my._normalizeQuery=function(queryObj,dataset){var actualQuery={resource_id:dataset.id,q:queryObj.q,filters:{},limit:queryObj.size||10,offset:queryObj.from||0};if(queryObj.sort&&queryObj.sort.length>0){var _tmp=_.map(queryObj.sort,function(sortObj){return sortObj.field+' '+(sortObj.order||'');});actualQuery.sort=_tmp.join(',');} +if(queryObj.filters&&queryObj.filters.length>0){_.each(queryObj.filters,function(filter){if(filter.type==="term"){actualQuery.filters[filter.field]=filter.term;}});} return actualQuery;};my.query=function(queryObj,dataset){if(dataset.endpoint){var wrapper=my.DataStore(dataset.endpoint);}else{var out=my._parseCkanResourceUrl(dataset.url);dataset.id=out.resource_id;var wrapper=my.DataStore(out.endpoint);} -var actualQuery=my._normalizeQuery(queryObj,dataset);var dfd=new Deferred();var jqxhr=wrapper.search(actualQuery);jqxhr.done(function(results){var out={total:results.result.total,hits:results.result.records};dfd.resolve(out);});return dfd.promise();};my.DataStore=function(endpoint){var that={endpoint:endpoint||my.API_ENDPOINT};that.search=function(data){var searchUrl=that.endpoint+'/3/action/datastore_search';var jqxhr=jQuery.ajax({url:searchUrl,data:data,dataType:'json'});return jqxhr;};return that;};my._parseCkanResourceUrl=function(url){parts=url.split('/');var len=parts.length;return{resource_id:parts[len-1],endpoint:parts.slice(0,[len-4]).join('/')+'/api'};};var CKAN_TYPES_MAP={'int4':'integer','int8':'integer','float8':'float'};}(this.recline.Backend.Ckan));this.recline=this.recline||{};this.recline.Backend=this.recline.Backend||{};this.recline.Backend.CSV=this.recline.Backend.CSV||{};(function(my){my.__type__='csv';var Deferred=_.isUndefined(this.jQuery)?_.Deferred:jQuery.Deferred;my.fetch=function(dataset){var dfd=new Deferred();if(dataset.file){var reader=new FileReader();var encoding=dataset.encoding||'UTF-8';reader.onload=function(e){var rows=my.parseCSV(e.target.result,dataset);dfd.resolve({records:rows,metadata:{filename:dataset.file.name},useMemoryStore:true});};reader.onerror=function(e){alert('Failed to load file. Code: '+e.target.error.code);};reader.readAsText(dataset.file,encoding);}else if(dataset.data){var rows=my.parseCSV(dataset.data,dataset);dfd.resolve({records:rows,useMemoryStore:true});}else if(dataset.url){jQuery.get(dataset.url).done(function(data){var rows=my.parseCSV(data,dataset);dfd.resolve({records:rows,useMemoryStore:true});});} +var actualQuery=my._normalizeQuery(queryObj,dataset);var dfd=new Deferred();var jqxhr=wrapper.search(actualQuery);jqxhr.done(function(results){var out={total:results.result.total,hits:results.result.records};dfd.resolve(out);});return dfd.promise();};my.DataStore=function(endpoint){var that={endpoint:endpoint||my.API_ENDPOINT};that.search=function(data){var searchUrl=that.endpoint+'/3/action/datastore_search';var jqxhr=jQuery.ajax({url:searchUrl,type:'POST',data:JSON.stringify(data)});return jqxhr;};return that;};my._parseCkanResourceUrl=function(url){parts=url.split('/');var len=parts.length;return{resource_id:parts[len-1],endpoint:parts.slice(0,[len-4]).join('/')+'/api'};};var CKAN_TYPES_MAP={'int4':'integer','int8':'integer','float8':'float'};}(this.recline.Backend.Ckan));this.recline=this.recline||{};this.recline.Backend=this.recline.Backend||{};this.recline.Backend.CSV=this.recline.Backend.CSV||{};(function(my){my.__type__='csv';var Deferred=_.isUndefined(this.jQuery)?_.Deferred:jQuery.Deferred;my.fetch=function(dataset){var dfd=new Deferred();if(dataset.file){var reader=new FileReader();var encoding=dataset.encoding||'UTF-8';reader.onload=function(e){var rows=my.parseCSV(e.target.result,dataset);dfd.resolve({records:rows,metadata:{filename:dataset.file.name},useMemoryStore:true});};reader.onerror=function(e){alert('Failed to load file. Code: '+e.target.error.code);};reader.readAsText(dataset.file,encoding);}else if(dataset.data){var rows=my.parseCSV(dataset.data,dataset);dfd.resolve({records:rows,useMemoryStore:true});}else if(dataset.url){jQuery.get(dataset.url).done(function(data){var rows=my.parseCSV(data,dataset);dfd.resolve({records:rows,useMemoryStore:true});});} return dfd.promise();};my.parseCSV=function(s,options){s=chomp(s);var options=options||{};var trm=(options.trim===false)?false:true;var delimiter=options.delimiter||',';var quotechar=options.quotechar||'"';var cur='',inQuote=false,fieldQuoted=false,field='',row=[],out=[],i,processField;processField=function(field){if(fieldQuoted!==true){if(field===''){field=null;}else if(trm===true){field=trim(field);} if(rxIsInt.test(field)){field=parseInt(field,10);}else if(rxIsFloat.test(field)){field=parseFloat(field,10);}} return field;};for(i=0;i'+field.get('label')+': '+self.getFieldValue(field)+'';}});html+='';return html;},fetch:function(){},save:function(){},destroy:function(){this.trigger('destroy',this);}});my.RecordList=Backbone.Collection.extend({constructor:function RecordList(){Backbone.Collection.prototype.constructor.apply(this,arguments);},model:my.Record});my.Field=Backbone.Model.extend({constructor:function Field(){Backbone.Model.prototype.constructor.apply(this,arguments);},defaults:{label:null,type:'string',format:null,is_derived:false},initialize:function(data,options){if('0'in data){throw new Error('Looks like you did not pass a proper hash with id to Field constructor');} if(this.attributes.label===null){this.set({label:this.id});} if(this.attributes.type.toLowerCase()in this._typeMap){this.attributes.type=this._typeMap[this.attributes.type.toLowerCase()];} @@ -102,15 +104,14 @@ facets[fieldId]={terms:{field:fieldId}};this.set({facets:facets},{silent:true}); ',initialize:function(options){var self=this;this.graphColors=["#edc240","#afd8f8","#cb4b4b","#4da74d","#9440ed"];this.el=$(this.el);_.bindAll(this,'render','redraw','_toolTip','_xaxisLabel');this.needToRedraw=false;this.model.bind('change',this.render);this.model.fields.bind('reset',this.render);this.model.fields.bind('add',this.render);this.model.records.bind('add',this.redraw);this.model.records.bind('reset',this.redraw);var stateData=_.extend({group:null,series:[],graphType:'lines-and-points'},options.state);this.state=new recline.Model.ObjectState(stateData);this.previousTooltipPoint={x:null,y:null};this.editor=new my.FlotControls({model:this.model,state:this.state.toJSON()});this.editor.state.bind('change',function(){self.state.set(self.editor.state.toJSON());self.redraw();});this.elSidebar=this.editor.el;},render:function(){var self=this;var tmplData=this.model.toTemplateJSON();var htmls=Mustache.render(this.template,tmplData);$(this.el).html(htmls);this.$graph=this.el.find('.panel.graph');this.$graph.on("plothover",this._toolTip);return this;},redraw:function(){var areWeVisible=!jQuery.expr.filters.hidden(this.el[0]);if((!areWeVisible||this.model.records.length===0)){this.needToRedraw=true;return;} if(this.state.get('group')&&this.state.get('series')){var series=this.createSeries();var options=this.getGraphOptions(this.state.attributes.graphType,series[0].data.length);this.plot=$.plot(this.$graph,series,options);}},show:function(){if(this.needToRedraw){this.redraw();}},_toolTip:function(event,pos,item){if(item){if(this.previousTooltipPoint.x!==item.dataIndex||this.previousTooltipPoint.y!==item.seriesIndex){this.previousTooltipPoint.x=item.dataIndex;this.previousTooltipPoint.y=item.seriesIndex;$("#recline-flot-tooltip").remove();var x=item.datapoint[0].toFixed(2),y=item.datapoint[1].toFixed(2);if(this.state.attributes.graphType==='bars'){x=item.datapoint[1].toFixed(2),y=item.datapoint[0].toFixed(2);} var content=_.template('<%= group %> = <%= x %>, <%= series %> = <%= y %>',{group:this.state.attributes.group,x:this._xaxisLabel(x),series:item.series.label,y:y});var xLocation,yLocation;if(this.state.attributes.graphType==='bars'){xLocation=item.pageX+15;yLocation=item.pageY-10;}else if(this.state.attributes.graphType==='columns'){xLocation=item.pageX+15;yLocation=item.pageY;}else{xLocation=item.pageX+10;yLocation=item.pageY-20;} -$('
'+content+'
').css({top:yLocation,left:xLocation}).appendTo("body").fadeIn(200);}}else{$("#recline-flot-tooltip").remove();this.previousTooltipPoint.x=null;this.previousTooltipPoint.y=null;}},_xaxisLabel:function(x){var xfield=this.model.fields.get(this.state.attributes.group);var xtype=xfield.get('type');var isDateTime=(xtype==='date'||xtype==='date-time'||xtype==='time');if(this.model.records.models[parseInt(x,10)]){x=this.model.records.models[parseInt(x,10)].get(this.state.attributes.group);if(isDateTime){x=new Date(x).toLocaleDateString();}}else if(isDateTime){x=new Date(parseInt(x,10)).toLocaleDateString();} -return x;},getGraphOptions:function(typeId,numPoints){var self=this;var tickFormatter=function(x){var label=self._xaxisLabel(x);if(typeof label!=='string'){label=label.toString();} -if(self.state.attributes.graphType!=='bars'&&label.length>8){label=label.slice(0,5)+"...";} -return label;};var xaxis={};xaxis.tickFormatter=tickFormatter;if(numPoints){var ticks=[],maxTicks=10,x=1,i=0;if(self.state.attributes.graphType!=='bars'){while(x<=maxTicks){if((numPoints/x)<=maxTicks){break;} -x=x+1;}} -for(i=0;i'+content+'').css({top:yLocation,left:xLocation}).appendTo("body").fadeIn(200);}}else{$("#recline-flot-tooltip").remove();this.previousTooltipPoint.x=null;this.previousTooltipPoint.y=null;}},_xaxisLabel:function(x){var xfield=this.model.fields.get(this.state.attributes.group);var xtype=xfield.get('type');var isDateTime=(xtype==='date'||xtype==='date-time'||xtype==='time');if(this.xvaluesAreIndex){x=parseInt(x,10);x=this.model.records.models[x].get(this.state.attributes.group);} +if(isDateTime){x=new Date(x).toLocaleDateString();} +return x;},getGraphOptions:function(typeId,numPoints){var self=this;var tickFormatter=function(x){var label=self._xaxisLabel(x)||"";if(typeof label!=='string'){label=label.toString();} +if(self.state.attributes.graphType!=='bars'&&label.length>10){label=label.slice(0,10)+"...";} +return label;};var xaxis={};xaxis.tickFormatter=tickFormatter;if(this.xvaluesAreIndex){var numTicks=Math.min(this.model.records.length,15);var increment=this.model.records.length/numTicks;var ticks=[];for(i=0;i \
\
\ @@ -612,4 +613,36 @@ newFrom=Math.max(newFrom,0);this.model.set({from:newFrom});},render:function(){v
\ \
\ - ',events:{'submit form':'onFormSubmit'},initialize:function(){_.bindAll(this,'render');this.el=$(this.el);this.model.bind('change',this.render);this.render();},onFormSubmit:function(e){e.preventDefault();var query=this.el.find('.text-query input').val();this.model.set({q:query});},render:function(){var tmplData=this.model.toJSON();var templated=Mustache.render(this.template,tmplData);this.el.html(templated);}});})(jQuery,recline.View); \ No newline at end of file + ',events:{'submit form':'onFormSubmit'},initialize:function(){_.bindAll(this,'render');this.el=$(this.el);this.model.bind('change',this.render);this.render();},onFormSubmit:function(e){e.preventDefault();var query=this.el.find('.text-query input').val();this.model.set({q:query});},render:function(){var tmplData=this.model.toJSON();var templated=Mustache.render(this.template,tmplData);this.el.html(templated);}});})(jQuery,recline.View);this.recline=this.recline||{};this.recline.View=this.recline.View||{};(function($,my){my.ValueFilter=Backbone.View.extend({className:'recline-filter-editor well',template:' \ +
\ +

Filters

\ + \ + \ +
\ + {{#filters}} \ + {{{filterRender}}} \ + {{/filters}} \ + {{#filters.length}} \ + \ + {{/filters.length}} \ +
\ +
\ + ',filterTemplates:{term:' \ +
\ +
\ + {{field}} \ + × \ + \ +
\ +
\ + '},events:{'click .js-remove-filter':'onRemoveFilter','click .js-add-filter':'onAddFilterShow','submit form.js-edit':'onTermFiltersUpdate','submit form.js-add':'onAddFilter'},initialize:function(){this.el=$(this.el);_.bindAll(this,'render');this.model.fields.bind('all',this.render);this.model.queryState.bind('change',this.render);this.model.queryState.bind('change:filters:new-blank',this.render);this.render();},render:function(){var self=this;var tmplData=$.extend(true,{},this.model.queryState.toJSON());tmplData.filters=_.map(tmplData.filters,function(filter,idx){filter.id=idx;return filter;});tmplData.fields=this.model.fields.toJSON();tmplData.filterRender=function(){return Mustache.render(self.filterTemplates.term,this);};var out=Mustache.render(this.template,tmplData);this.el.html(out);},updateFilter:function(input){var self=this;var filters=self.model.queryState.get('filters');var $input=$(input);var filterIndex=parseInt($input.attr('data-filter-id'),10);var value=$input.val();filters[filterIndex].term=value;},onAddFilterShow:function(e){e.preventDefault();var $target=$(e.target);$target.hide();this.el.find('form.js-add').show();},onAddFilter:function(e){e.preventDefault();var $target=$(e.target);$target.hide();var field=$target.find('select.fields').val();this.model.queryState.addFilter({type:'term',field:field});},onRemoveFilter:function(e){e.preventDefault();var $target=$(e.target);var filterId=$target.attr('data-filter-id');this.model.queryState.removeFilter(filterId);},onTermFiltersUpdate:function(e){var self=this;e.preventDefault();var filters=self.model.queryState.get('filters');var $form=$(e.target);_.each($form.find('input'),function(input){self.updateFilter(input);});self.model.queryState.set({filters:filters,from:0});self.model.queryState.trigger('change');}});})(jQuery,recline.View); \ No newline at end of file