diff --git a/_includes/recline-deps.html b/_includes/recline-deps.html index d58ce6d0..6bdfeea9 100644 --- a/_includes/recline-deps.html +++ b/_includes/recline-deps.html @@ -14,7 +14,6 @@ - @@ -61,8 +60,6 @@ - - diff --git a/css/transform.css b/css/transform.css deleted file mode 100644 index 9d404877..00000000 --- a/css/transform.css +++ /dev/null @@ -1,37 +0,0 @@ -.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; -} diff --git a/demos/multiview/app.js b/demos/multiview/app.js index 6ea80a4b..06e3dc61 100755 --- a/demos/multiview/app.js +++ b/demos/multiview/app.js @@ -89,13 +89,6 @@ var createExplorer = function(dataset, state) { view: new recline.View.Map({ model: dataset }) - }, - { - id: 'transform', - label: 'Transform', - view: new recline.View.Transform({ - model: dataset - }) } ]; diff --git a/docs/src/data.transform.html b/docs/src/data.transform.html deleted file mode 100644 index ec2a4784..00000000 --- a/docs/src/data.transform.html +++ /dev/null @@ -1,66 +0,0 @@ - data.transform.js
Jump To …

data.transform.js

this.recline = this.recline || {};
-this.recline.Data = this.recline.Data || {};
-
-(function(my) {

adapted from https://github.com/harthur/costco. heather rules

my.Transform = {};
-
-my.Transform.evalFunction = function(funcString) {
-  try {
-    eval("var editFunc = " + funcString);
-  } catch(e) {
-    return {errorMessage: e+""};
-  }
-  return editFunc;
-};
-
-my.Transform.previewTransform = function(docs, editFunc, currentColumn) {
-  var preview = [];
-  var updated = my.Transform.mapDocs($.extend(true, {}, docs), editFunc);
-  for (var i = 0; i < updated.docs.length; i++) {      
-    var before = docs[i]
-      , after = updated.docs[i]
-      ;
-    if (!after) after = {};
-    if (currentColumn) {
-      preview.push({before: before[currentColumn], after: after[currentColumn]});      
-    } else {
-      preview.push({before: before, after: after});      
-    }
-  }
-  return preview;
-};
-
-my.Transform.mapDocs = function(docs, editFunc) {
-  var edited = []
-    , deleted = []
-    , failed = []
-    ;
-  
-  var updatedDocs = _.map(docs, function(doc) {
-    try {
-      var updated = editFunc(_.clone(doc));
-    } catch(e) {
-      failed.push(doc);
-      return;
-    }
-    if(updated === null) {
-      updated = {_deleted: true};
-      edited.push(updated);
-      deleted.push(doc);
-    }
-    else if(updated && !_.isEqual(updated, doc)) {
-      edited.push(updated);
-    }
-    return updated;      
-  });
-  
-  return {
-    updates: edited, 
-    docs: updatedDocs, 
-    deletes: deleted, 
-    failed: failed
-  };
-};
-
-}(this.recline.Data))
-
-
\ No newline at end of file diff --git a/docs/src/view.transform.html b/docs/src/view.transform.html deleted file mode 100644 index b5019a47..00000000 --- a/docs/src/view.transform.html +++ /dev/null @@ -1,124 +0,0 @@ - view.transform.js
Jump To …

view.transform.js

/*jshint multistr:true */
-
-this.recline = this.recline || {};
-this.recline.View = this.recline.View || {};

Views module following classic module pattern

(function($, my) {

ColumnTransform

- -

View (Dialog) for doing data transformations

my.Transform = Backbone.View.extend({
-  template: ' \
-    <div class="recline-transform"> \
-      <div class="script"> \
-        <h2> \
-          Transform Script \
-          <button class="okButton btn btn-primary">Run on all records</button> \
-        </h2> \
-        <textarea class="expression-preview-code"></textarea> \
-      </div> \
-      <div class="expression-preview-parsing-status"> \
-        No syntax error. \
-      </div> \
-      <div class="preview"> \
-        <h3>Preview</h3> \
-        <div class="expression-preview-container"></div> \
-      </div> \
-    </div> \
-  ',
-
-  events: {
-    'click .okButton': 'onSubmit',
-    'keydown .expression-preview-code': 'onEditorKeydown'
-  },
-
-  initialize: function(options) {
-    this.el = $(this.el);
-  },
-
-  render: function() {
-    var htmls = Mustache.render(this.template);
-    this.el.html(htmls);

Put in the basic (identity) transform script -TODO: put this into the template?

    var editor = this.el.find('.expression-preview-code');
-    if (this.model.fields.length > 0) {
-      var col = this.model.fields.models[0].id;
-    } else {
-      var col = 'unknown';
-    }
-    editor.val("function(doc) {\n  doc['"+ col +"'] = doc['"+ col +"'];\n  return doc;\n}");
-    editor.keydown();
-  },
-
-  onSubmit: function(e) {
-    var self = this;
-    var funcText = this.el.find('.expression-preview-code').val();
-    var editFunc = recline.Data.Transform.evalFunction(funcText);
-    if (editFunc.errorMessage) {
-      this.trigger('recline:flash', {message: "Error with function! " + editFunc.errorMessage});
-      return;
-    }
-    this.model.transform(editFunc);
-  },
-
-  editPreviewTemplate: ' \
-      <table class="table table-condensed table-bordered before-after"> \
-      <thead> \
-      <tr> \
-        <th>Field</th> \
-        <th>Before</th> \
-        <th>After</th> \
-      </tr> \
-      </thead> \
-      <tbody> \
-      {{#row}} \
-      <tr> \
-        <td> \
-          {{field}} \
-        </td> \
-        <td class="before {{#different}}different{{/different}}"> \
-          {{before}} \
-        </td> \
-        <td class="after {{#different}}different{{/different}}"> \
-          {{after}} \
-        </td> \
-      </tr> \
-      {{/row}} \
-      </tbody> \
-      </table> \
-  ',
-
-  onEditorKeydown: function(e) {
-    var self = this;

if you don't setTimeout it won't grab the latest character if you call e.target.value

    window.setTimeout( function() {
-      var errors = self.el.find('.expression-preview-parsing-status');
-      var editFunc = recline.Data.Transform.evalFunction(e.target.value);
-      if (!editFunc.errorMessage) {
-        errors.text('No syntax error.');
-        var docs = self.model.records.map(function(doc) {
-          return doc.toJSON();
-        });
-        var previewData = recline.Data.Transform.previewTransform(docs, editFunc);
-        var $el = self.el.find('.expression-preview-container');
-        var fields = self.model.fields.toJSON();
-        var rows = _.map(previewData.slice(0,4), function(row) {
-          return _.map(fields, function(field) {
-            return {
-              field: field.id,
-              before: row.before[field.id],
-              after: row.after[field.id],
-              different: !_.isEqual(row.before[field.id], row.after[field.id])
-            }
-          });
-        });
-        $el.html('');
-        _.each(rows, function(row) {
-          var templated = Mustache.render(self.editPreviewTemplate, {
-            row: row
-          });
-          $el.append(templated);
-        });
-      } else {
-        errors.text(editFunc.errorMessage);
-      }
-    }, 1, true);
-  }
-});
-
-})(jQuery, recline.View);
-
-
\ No newline at end of file diff --git a/src/backend.memory.js b/src/backend.memory.js index 5344da96..07e14fd6 100644 --- a/src/backend.memory.js +++ b/src/backend.memory.js @@ -230,18 +230,6 @@ this.recline.Backend.Memory = this.recline.Backend.Memory || {}; }); return facetResults; }; - - this.transform = function(editFunc) { - var dfd = new Deferred(); - // TODO: should we clone before mapping? Do not see the point atm. - self.records = _.map(self.records, editFunc); - // now deal with deletes (i.e. nulls) - self.records = _.filter(self.records, function(record) { - return record != null; - }); - dfd.resolve(); - return dfd.promise(); - }; }; }(this.recline.Backend.Memory)); diff --git a/src/data.transform.js b/src/data.transform.js deleted file mode 100644 index f7c64fba..00000000 --- a/src/data.transform.js +++ /dev/null @@ -1,67 +0,0 @@ -this.recline = this.recline || {}; -this.recline.Data = this.recline.Data || {}; - -(function(my) { -// adapted from https://github.com/harthur/costco. heather rules - -my.Transform = {}; - -my.Transform.evalFunction = function(funcString) { - try { - eval("var editFunc = " + funcString); - } catch(e) { - return {errorMessage: e+""}; - } - return editFunc; -}; - -my.Transform.previewTransform = function(docs, editFunc, currentColumn) { - var preview = []; - var updated = my.Transform.mapDocs($.extend(true, {}, docs), editFunc); - for (var i = 0; i < updated.docs.length; i++) { - var before = docs[i] - , after = updated.docs[i] - ; - if (!after) after = {}; - if (currentColumn) { - preview.push({before: before[currentColumn], after: after[currentColumn]}); - } else { - preview.push({before: before, after: after}); - } - } - return preview; -}; - -my.Transform.mapDocs = function(docs, editFunc) { - var edited = [] - , deleted = [] - , failed = [] - ; - - var updatedDocs = _.map(docs, function(doc) { - try { - var updated = editFunc(_.clone(doc)); - } catch(e) { - failed.push(doc); - return; - } - if(updated === null) { - updated = {_deleted: true}; - edited.push(updated); - deleted.push(doc); - } - else if(updated && !_.isEqual(updated, doc)) { - edited.push(updated); - } - return updated; - }); - - return { - updates: edited, - docs: updatedDocs, - deletes: deleted, - failed: failed - }; -}; - -}(this.recline.Data)) diff --git a/src/model.js b/src/model.js index 1e8b0bd9..1e6e6441 100644 --- a/src/model.js +++ b/src/model.js @@ -159,20 +159,6 @@ my.Dataset = Backbone.Model.extend({ 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() { - // reload data as records have changed - self.query(); - self.trigger('recline:flash', {message: "Records updated successfully"}); - }); - }, - // ### query // // AJAX method with promise API to get records from the backend. diff --git a/src/view.multiview.js b/src/view.multiview.js index d0640ff7..8542488b 100644 --- a/src/view.multiview.js +++ b/src/view.multiview.js @@ -164,12 +164,6 @@ my.MultiView = Backbone.View.extend({ model: this.model, state: this.state.get('view-timeline') }) - }, { - id: 'transform', - label: 'Transform', - view: new my.Transform({ - model: this.model - }) }]; } // Hashes of sidebar elements diff --git a/src/view.transform.js b/src/view.transform.js deleted file mode 100644 index df690f48..00000000 --- a/src/view.transform.js +++ /dev/null @@ -1,132 +0,0 @@ -/*jshint multistr:true */ - -this.recline = this.recline || {}; -this.recline.View = this.recline.View || {}; - -// Views module following classic module pattern -(function($, my) { - -// ## ColumnTransform -// -// View (Dialog) for doing data transformations -my.Transform = Backbone.View.extend({ - template: ' \ -
\ -
\ -

\ - Transform Script \ - \ -

\ - \ -
\ -
\ - No syntax error. \ -
\ -
\ -

Preview

\ -
\ -
\ -
\ - ', - - events: { - 'click .okButton': 'onSubmit', - 'keydown .expression-preview-code': 'onEditorKeydown' - }, - - initialize: function(options) { - this.el = $(this.el); - }, - - render: function() { - var htmls = Mustache.render(this.template); - this.el.html(htmls); - // Put in the basic (identity) transform script - // TODO: put this into the template? - var editor = this.el.find('.expression-preview-code'); - if (this.model.fields.length > 0) { - var col = this.model.fields.models[0].id; - } else { - var col = 'unknown'; - } - editor.val("function(doc) {\n doc['"+ col +"'] = doc['"+ col +"'];\n return doc;\n}"); - editor.keydown(); - }, - - onSubmit: function(e) { - var self = this; - var funcText = this.el.find('.expression-preview-code').val(); - var editFunc = recline.Data.Transform.evalFunction(funcText); - if (editFunc.errorMessage) { - this.trigger('recline:flash', {message: "Error with function! " + editFunc.errorMessage}); - return; - } - this.model.transform(editFunc); - }, - - editPreviewTemplate: ' \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - {{#row}} \ - \ - \ - \ - \ - \ - {{/row}} \ - \ -
FieldBeforeAfter
\ - {{field}} \ - \ - {{before}} \ - \ - {{after}} \ -
\ - ', - - onEditorKeydown: function(e) { - var self = this; - // if you don't setTimeout it won't grab the latest character if you call e.target.value - window.setTimeout( function() { - var errors = self.el.find('.expression-preview-parsing-status'); - var editFunc = recline.Data.Transform.evalFunction(e.target.value); - if (!editFunc.errorMessage) { - errors.text('No syntax error.'); - var docs = self.model.records.map(function(doc) { - return doc.toJSON(); - }); - var previewData = recline.Data.Transform.previewTransform(docs, editFunc); - var $el = self.el.find('.expression-preview-container'); - var fields = self.model.fields.toJSON(); - var rows = _.map(previewData.slice(0,4), function(row) { - return _.map(fields, function(field) { - return { - field: field.id, - before: row.before[field.id], - after: row.after[field.id], - different: !_.isEqual(row.before[field.id], row.after[field.id]) - } - }); - }); - $el.html(''); - _.each(rows, function(row) { - var templated = Mustache.render(self.editPreviewTemplate, { - row: row - }); - $el.append(templated); - }); - } else { - errors.text(editFunc.errorMessage); - } - }, 1, true); - } -}); - -})(jQuery, recline.View); diff --git a/test/backend.memory.test.js b/test/backend.memory.test.js index 1f0da7d7..e4636884 100644 --- a/test/backend.memory.test.js +++ b/test/backend.memory.test.js @@ -187,31 +187,6 @@ test('update and delete', function () { equal(data.records[0].x, memoryData[1].x); }); -test('transform', function () { - var data = [ - {a: 1, b: " bla"}, - {a: 2, b: "foo "}, - {a: 3, b: "bar"} - ]; - var store = new recline.Backend.Memory.Store(data); - store.transform(function(d) { - d.a = d.a * 10; - return d; - }) - equal(store.records[0].a, 10); - equal(store.records[1].a, 20); -}); - -test('transform deletes', function () { - var data = [{a: 1, b: " bla"},{a: 2, b: "foo "},{a: 3, b: "bar"}]; - var store = new recline.Backend.Memory.Store(data); - store.transform(function(d) { - if (d.a == '1') return null; - else return d; - }) - equal(store.records.length, 2); -}); - })(this.jQuery); // ====================================== diff --git a/test/data.transform.test.js b/test/data.transform.test.js deleted file mode 100644 index 95fdeeda..00000000 --- a/test/data.transform.test.js +++ /dev/null @@ -1,61 +0,0 @@ -module("Data.Transform"); - -test('previewTransform', function () { - var docs = [ - { - 'date': '2012/2013 - 1' - } - ]; - var func = function(doc) { - return doc; - }; - var exp = [ - { - "after": { - "date": "2012/2013 - 1" - }, - "before": { - "date": "2012/2013 - 1" - } - } - ]; - var out = recline.Data.Transform.previewTransform(docs, func); - deepEqual(out, exp); - - var func = function(doc) { - var d = doc['date']; - doc['date'] = d.split('/')[0]; - return doc; - }; - var exp = [ - { - "after": { - "date": "2012" - }, - "before": { - "date": "2012/2013 - 1" - } - } - ]; - var out = recline.Data.Transform.previewTransform(docs, func); - deepEqual(out, exp); - - var func = function(doc) { - var d = doc['date']; - doc['date'] = d.split('/')[0] + '-' + d.split(' - ')[1]; - return doc; - }; - var exp = [ - { - "after": { - "date": "2012-1" - }, - "before": { - "date": "2012/2013 - 1" - } - } - ]; - var out = recline.Data.Transform.previewTransform(docs, func); - deepEqual(out, exp); -}); - diff --git a/test/index.html b/test/index.html index 31b8bb08..a60fa4fa 100644 --- a/test/index.html +++ b/test/index.html @@ -50,7 +50,6 @@ - @@ -72,10 +71,6 @@ - - - -

Qunit Tests