/*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); this.render(); }, 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 = costco.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 = costco.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 = costco.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);