From fc979023e6ff86fb8b84fe189f9052e2b375ccfe Mon Sep 17 00:00:00 2001 From: Rufus Pollock Date: Wed, 29 Feb 2012 22:01:37 +0000 Subject: [PATCH] [view,backend/dataproxy][s]: handle errors from dataproxy better and notify errors better in view. --- recline.js | 58 +++++++++++++++++++++------------------- src/backend/dataproxy.js | 3 +++ src/view.js | 21 ++++++++++++--- 3 files changed, 51 insertions(+), 31 deletions(-) diff --git a/recline.js b/recline.js index 9ce1731d..3102ad36 100644 --- a/recline.js +++ b/recline.js @@ -1092,17 +1092,30 @@ my.DataExplorer = Backbone.View.extend({ this.router = new Backbone.Router(); this.setupRouting(); - this.model.bind('query:start', function(eventName) { + this.model.bind('query:start', function() { my.notify('Loading data', {loader: true}); }); - this.model.bind('query:done', function(eventName) { + this.model.bind('query:done', function() { my.clearNotifications(); self.el.find('.doc-count').text(self.model.docCount || 'Unknown'); my.notify('Data loaded', {category: 'success'}); }); - this.model.bind('query:fail', function(eventName, error) { + this.model.bind('query:fail', function(error) { my.clearNotifications(); - my.notify(error.message, {category: 'error', persist: true}); + var msg = ''; + if (typeof(error) == 'string') { + msg = error; + } else if (typeof(error) == 'object') { + if (error.title) { + msg = error.title + ': '; + } + if (error.message) { + msg += error.message; + } + } else { + msg = 'There was an error querying the backend'; + } + my.notify(msg, {category: 'error', persist: true}); }); // retrieve basic data like fields etc @@ -1594,29 +1607,10 @@ this.recline.Backend = this.recline.Backend || {}; var self = this; if (method === "read") { if (model.__type__ == 'Dataset') { - var base = self.get('dataproxy_url'); - // TODO: should we cache for extra efficiency - var data = { - url: model.get('url') - , 'max-results': 1 - , type: model.get('format') || 'csv' - }; - var jqxhr = $.ajax({ - url: base - , data: data - , dataType: 'jsonp' - }); + // Do nothing as we will get fields in query step (and no metadata to + // retrieve) var dfd = $.Deferred(); - my.wrapInTimeout(jqxhr).done(function(results) { - model.fields.reset(_.map(results.fields, function(fieldId) { - return {id: fieldId}; - }) - ); - dfd.resolve(model, jqxhr); - }) - .fail(function(arguments) { - dfd.reject(arguments); - }); + dfd.resolve(model); return dfd.promise(); } } else { @@ -1636,7 +1630,14 @@ this.recline.Backend = this.recline.Backend || {}; , dataType: 'jsonp' }); var dfd = $.Deferred(); - jqxhr.done(function(results) { + my.wrapInTimeout(jqxhr).done(function(results) { + if (results.error) { + dfd.reject(results.error); + } + dataset.fields.reset(_.map(results.fields, function(fieldId) { + return {id: fieldId}; + }) + ); var _out = _.map(results.data, function(doc) { var tmp = {}; _.each(results.fields, function(key, idx) { @@ -1645,6 +1646,9 @@ this.recline.Backend = this.recline.Backend || {}; return tmp; }); dfd.resolve(_out); + }) + .fail(function(arguments) { + dfd.reject(arguments); }); return dfd.promise(); } diff --git a/src/backend/dataproxy.js b/src/backend/dataproxy.js index 67551493..45abc89a 100644 --- a/src/backend/dataproxy.js +++ b/src/backend/dataproxy.js @@ -48,6 +48,9 @@ this.recline.Backend = this.recline.Backend || {}; }); var dfd = $.Deferred(); my.wrapInTimeout(jqxhr).done(function(results) { + if (results.error) { + dfd.reject(results.error); + } dataset.fields.reset(_.map(results.fields, function(fieldId) { return {id: fieldId}; }) diff --git a/src/view.js b/src/view.js index 53dbfc85..49edde47 100644 --- a/src/view.js +++ b/src/view.js @@ -104,17 +104,30 @@ my.DataExplorer = Backbone.View.extend({ this.router = new Backbone.Router(); this.setupRouting(); - this.model.bind('query:start', function(eventName) { + this.model.bind('query:start', function() { my.notify('Loading data', {loader: true}); }); - this.model.bind('query:done', function(eventName) { + this.model.bind('query:done', function() { my.clearNotifications(); self.el.find('.doc-count').text(self.model.docCount || 'Unknown'); my.notify('Data loaded', {category: 'success'}); }); - this.model.bind('query:fail', function(eventName, error) { + this.model.bind('query:fail', function(error) { my.clearNotifications(); - my.notify(error.message, {category: 'error', persist: true}); + var msg = ''; + if (typeof(error) == 'string') { + msg = error; + } else if (typeof(error) == 'object') { + if (error.title) { + msg = error.title + ': '; + } + if (error.message) { + msg += error.message; + } + } else { + msg = 'There was an error querying the backend'; + } + my.notify(msg, {category: 'error', persist: true}); }); // retrieve basic data like fields etc