From 58cac002dc20615a05e39d2eb608e3e35703f73b Mon Sep 17 00:00:00 2001 From: Rufus Pollock Date: Mon, 4 Jun 2012 23:57:24 +0100 Subject: [PATCH] [#145,widget/fields,model][m]: working fields widget with field summary data generated by Dataset.getFieldsSummary function. * Layout is still not right -- need to put widget in sidebar (though looks a lot better) * Datset.getFieldsSummary to compute facets for fields * Remove facet usage in the demo --- app/js/app.js | 1 - css/multiview.css | 28 +++++++++++++++++++++++-- src/model.js | 26 +++++++++++++++++++++++ src/widget.fields.js | 49 ++++++++++++++++++++++++++++++++------------ test/model.test.js | 15 ++++++++++++++ 5 files changed, 103 insertions(+), 16 deletions(-) diff --git a/app/js/app.js b/app/js/app.js index 6e670b60..2e456f17 100755 --- a/app/js/app.js +++ b/app/js/app.js @@ -242,7 +242,6 @@ var ExplorerApp = Backbone.View.extend({ // provide a demonstration in memory dataset function localDataset() { var dataset = Fixture.getDataset(); - dataset.queryState.addFacet('country'); return dataset; } diff --git a/css/multiview.css b/css/multiview.css index 4c661429..ccdb52e6 100644 --- a/css/multiview.css +++ b/css/multiview.css @@ -98,15 +98,39 @@ * Fields Widget *********************************************************/ +.recline-fields-view { + width: 200px; +} + +.recline-fields-view .fields-list { + padding: 0; +} + .recline-fields-view .fields-list .accordion-heading a, -.recline-fields-view .fields-list .accordion-heading h3 { +.recline-fields-view .fields-list .accordion-heading h4 { display: inline; } -.recline-fields-view .fields-list .accordion-heading h3 { +.recline-fields-view .fields-list .accordion-heading h4 { margin-left: 10px; } +.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 { +} + /********************************************************** * Notifications *********************************************************/ diff --git a/src/model.js b/src/model.js index d84b5090..11eca39f 100644 --- a/src/model.js +++ b/src/model.js @@ -111,6 +111,31 @@ my.Dataset = Backbone.Model.extend({ return data; }, + // Get a summary for each field in the form of a `Facet`. + // + // @return null as this is async function. Provides deferred/promise interface. + 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 = $.Deferred(); + this.backend.query(this, query.toJSON()).done(function(queryResult) { + if (queryResult.facets) { + _.each(queryResult.facets, function(facetResult, facetId) { + facetResult.id = facetId; + var facet = new my.Facet(facetResult); + // TODO: probably want replace rather than reset (i.e. just replace the facet with this id) + self.fields.get(facetId).facets.reset(facet); + }); + } + dfd.resolve(queryResult); + }); + return dfd.promise(); + }, + // ### _backendFromString(backendString) // // See backend argument to initialize for details @@ -291,6 +316,7 @@ my.Field = Backbone.Model.extend({ if (!this.renderer) { this.renderer = this.defaultRenderers[this.get('type')]; } + this.facets = new my.FacetList(); }, defaultRenderers: { object: function(val, field, doc) { diff --git a/src/widget.fields.js b/src/widget.fields.js index a2568467..91ff4d16 100644 --- a/src/widget.fields.js +++ b/src/widget.fields.js @@ -22,24 +22,33 @@ this.recline.View = this.recline.View || {}; (function($, my) { my.Fields = Backbone.View.extend({ - className: 'recline-fields-view well', + className: 'recline-fields-view', template: ' \ -
\ +
\ {{#fields}} \ -
\ +
\
\ -

\ - {{label}} ({{id}}) \ +

\ + {{label}} \ \ {{type}} \ - More information » \ + » \ \ \ -

\ + \
\
\
\ - {{type}} \ + {{#facets}} \ +
\ +
    \ + {{#terms}} \ +
  • {{term}} [{{count}}]
  • \ + {{/terms}} \ +
\ +
\ + {{/facets}} \ +
\
\
\
\ @@ -50,19 +59,33 @@ my.Fields = Backbone.View.extend({ events: { }, initialize: function(model) { - _.bindAll(this, 'render'); + var self = this; this.el = $(this.el); - this.model.fields.bind('all', this.render); + _.bindAll(this, 'render'); + + this.model.fields.bind('all', function() { + // fields can get reset or changed in which case we need to recalculate + self.model.getFieldsSummary(); + self.render(); + }); + this.model.fields.each(function(field) { + field.facets.bind('all', self.render); + }); this.render(); }, render: function() { + var self = this; var tmplData = { - fields: this.model.fields.toJSON() + fields: [] }; + this.model.fields.each(function(field) { + var out = field.toJSON(); + out.facets = field.facets.toJSON(); + tmplData.fields.push(out); + }); var templated = Mustache.render(this.template, tmplData); this.el.html(templated); - // this.el.hide(); - this.el.find('.collapse').collapse() + this.el.find('.collapse').collapse(); } }); diff --git a/test/model.test.js b/test/model.test.js index 90d2e6d7..0433be74 100644 --- a/test/model.test.js +++ b/test/model.test.js @@ -125,6 +125,21 @@ test('Dataset _prepareQuery', function () { deepEqual(out, exp); }); +test('Dataset getFieldsSummary', function () { + var dataset = Fixture.getDataset(); + dataset.getFieldsSummary().done(function() { + var countryField = dataset.fields.get('country'); + var facet = countryField.facets.models[0]; + equal(facet.get('terms').length, 3); + var exp = [ + { count: 3, term: 'UK' }, + { count: 2, term: 'DE' }, + { count: 1, term: 'US' } + ]; + deepEqual(facet.get('terms'), exp); + }); +}); + // ================================= // Query