From 00052bba0fcf8d1e1d393600bdb390366f901413 Mon Sep 17 00:00:00 2001 From: Rufus Pollock Date: Sat, 2 Jun 2012 22:42:34 +0100 Subject: [PATCH] [view/slickgrid][s]: slickgrid supports renderers/formatters correctly and does not escape html. --- src/model.js | 19 ++++++++++++++----- src/view-slickgrid.js | 26 ++++++++++++++++++++------ test/view-slickgrid.test.js | 4 ++-- 3 files changed, 36 insertions(+), 13 deletions(-) diff --git a/src/model.js b/src/model.js index 99ef250f..d84b5090 100644 --- a/src/model.js +++ b/src/model.js @@ -190,13 +190,22 @@ my.Record = Backbone.Model.extend({ // For the provided Field get the corresponding rendered computed data value // for this record. getFieldValue: function(field) { + val = this.getFieldValueUnrendered(field); + if (field.renderer) { + val = field.renderer(val, field, this.toJSON()); + } + return val; + }, + + // ### getFieldValueUnrendered + // + // For the provided Field get the corresponding computed data value + // for this record. + getFieldValueUnrendered: function(field) { var val = this.get(field.id); if (field.deriver) { val = field.deriver(val, field, this); } - if (field.renderer) { - val = field.renderer(val, field, this); - } return val; }, @@ -233,9 +242,9 @@ my.RecordList = Backbone.Collection.extend({ // Following additional instance properties: // // @property {Function} renderer: a function to render the data for this field. -// Signature: function(value, field, doc) where value is the value of this +// Signature: function(value, field, record) where value is the value of this // cell, field is corresponding field object and record is the record -// object. Note that implementing functions can ignore arguments (e.g. +// object (as simple JS object). Note that implementing functions can ignore arguments (e.g. // function(value) would be a valid formatter function). // // @property {Function} deriver: a function to derive/compute the value of data diff --git a/src/view-slickgrid.js b/src/view-slickgrid.js index efe34eac..1b0e69ac 100644 --- a/src/view-slickgrid.js +++ b/src/view-slickgrid.js @@ -68,12 +68,26 @@ my.SlickGrid = Backbone.View.extend({ // We need all columns, even the hidden ones, to show on the column picker var columns = []; + // custom formatter as default one escapes html + // plus this way we distinguish between rendering/formatting and computed value (so e.g. sort still works ...) + // row = row index, cell = cell index, value = value, columnDef = column definition, dataContext = full row values + var formatter = function(row, cell, value, columnDef, dataContext) { + var field = self.model.fields.get(columnDef.id); + if (field.renderer) { + return field.renderer(value, field, dataContext); + } else { + return value; + } + } _.each(this.model.fields.toJSON(),function(field){ - var column = {id:field['id'], - name:field['label'], - field:field['id'], - sortable: true, - minWidth: 80}; + var column = { + id:field['id'], + name:field['label'], + field:field['id'], + sortable: true, + minWidth: 80, + formatter: formatter + }; var widthInfo = _.find(self.state.get('columnsWidth'),function(c){return c.column == field.id}); if (widthInfo){ @@ -113,7 +127,7 @@ my.SlickGrid = Backbone.View.extend({ this.model.currentRecords.each(function(doc){ var row = {}; self.model.fields.each(function(field){ - row[field.id] = doc.getFieldValue(field); + row[field.id] = doc.getFieldValueUnrendered(field); }); data.push(row); }); diff --git a/test/view-slickgrid.test.js b/test/view-slickgrid.test.js index 1b3448cc..6e5e7017 100644 --- a/test/view-slickgrid.test.js +++ b/test/view-slickgrid.test.js @@ -65,7 +65,7 @@ test('renderers', function () { var dataset = Fixture.getDataset(); dataset.fields.get('country').renderer = function(val, field, doc){ - return 'Country: ' + val; + return 'Country: ' + val + ''; }; var deriver = function(val, field, doc){ @@ -73,7 +73,6 @@ test('renderers', function () { } dataset.fields.add(new recline.Model.Field({id:'computed'},{deriver:deriver})); - var view = new recline.View.SlickGrid({ model: dataset }); @@ -84,6 +83,7 @@ test('renderers', function () { view.grid.init(); equal($(view.grid.getCellNode(0,view.grid.getColumnIndex('country'))).text(),'Country: DE'); + equal($(view.grid.getCellNode(0,view.grid.getColumnIndex('country'))).html(),'Country: DE'); equal($(view.grid.getCellNode(0,view.grid.getColumnIndex('computed'))).text(),'10'); view.remove(); });