this.recline = this.recline || {}; this.recline.View = this.recline.View || {}; // Views module following classic module pattern (function($, my) { // View (Dialog) for doing data transformations on whole dataset. my.DataTransform = Backbone.View.extend({ className: 'transform-view', template: ' \
\ Recursive transform on all rows \
\
\
\

Traverse and transform objects by visiting every node on a recursive walk using js-traverse.

\ \ \ \ \ \ \
\
\ \ \ \ \ \ \ \ \ \ \ \ \ \
\ Expression \
\
\ \
\
\ No syntax error. \
\
\ Preview \
\
\
\
\
\
\
\
\
\
\ \ ', initialize: function() { this.el = $(this.el); }, render: function() { this.el.html(this.template); } }); // View (Dialog) for doing data transformations (on columns of data). my.ColumnTransform = Backbone.View.extend({ className: 'transform-column-view', template: ' \
\ Functional transform on column {{name}} \
\
\
\ \ \ \ \ \ \
\
\ \ \ \ \ \ \ \ \ \ \ \ \ \
\ Expression \
\
\ \
\
\ No syntax error. \
\
\ Preview \
\
\
\
\
\
\
\
\
\
\ \ ', events: { 'click .okButton': 'onSubmit' , 'keydown .expression-preview-code': 'onEditorKeydown' }, initialize: function() { this.el = $(this.el); }, render: function() { var htmls = $.mustache(this.template, {name: this.state.currentColumn} ) 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'); editor.val("function(doc) {\n doc['"+ this.state.currentColumn+"'] = doc['"+ this.state.currentColumn+"'];\n return doc;\n}"); editor.focus().get(0).setSelectionRange(18, 18); editor.keydown(); }, onSubmit: function(e) { var self = this; var funcText = this.el.find('.expression-preview-code').val(); var editFunc = costco.evalFunction(funcText); if (editFunc.errorMessage) { my.notify("Error with function! " + editFunc.errorMessage); return; } util.hide('dialog'); my.notify("Updating all visible docs. This could take a while...", {persist: true, loader: true}); var docs = self.model.currentDocuments.map(function(doc) { return doc.toJSON(); }); // TODO: notify about failed docs? var toUpdate = costco.mapDocs(docs, editFunc).edited; var totalToUpdate = toUpdate.length; function onCompletedUpdate() { totalToUpdate += -1; if (totalToUpdate === 0) { my.notify(toUpdate.length + " documents updated successfully"); alert('WARNING: We have only updated the docs in this view. (Updating of all docs not yet implemented!)'); self.remove(); } } // TODO: Very inefficient as we search through all docs every time! _.each(toUpdate, function(editedDoc) { var realDoc = self.model.currentDocuments.get(editedDoc.id); realDoc.set(editedDoc); realDoc.save().then(onCompletedUpdate).fail(onCompletedUpdate) }); }, 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 = costco.evalFunction(e.target.value); if (!editFunc.errorMessage) { errors.text('No syntax error.'); var docs = self.model.currentDocuments.map(function(doc) { return doc.toJSON(); }); var previewData = costco.previewTransform(docs, editFunc, self.state.currentColumn); util.render('editPreview', 'expression-preview-container', {rows: previewData}); } else { errors.text(editFunc.errorMessage); } }, 1, true); } }); })(jQuery, recline.View);