[#88,view/grid,refactor][s]: switch DataGrid to use new state setup (and introduce new Model ObjectState for this purpose).
* Switched hiddenFields to be part of state object (only state on DataGrid at the moment).
This commit is contained in:
@@ -381,6 +381,13 @@ my.FacetList = Backbone.Collection.extend({
|
|||||||
model: my.Facet
|
model: my.Facet
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// ## Object State
|
||||||
|
//
|
||||||
|
// Convenience Backbone model for storing (configuration) state of objects like Views.
|
||||||
|
my.ObjectState = Backbone.Model.extend({
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
// ## Backend registry
|
// ## Backend registry
|
||||||
//
|
//
|
||||||
// Backends will register themselves by id into this registry
|
// Backends will register themselves by id into this registry
|
||||||
|
|||||||
@@ -20,8 +20,12 @@ my.DataGrid = Backbone.View.extend({
|
|||||||
this.model.currentDocuments.bind('add', this.render);
|
this.model.currentDocuments.bind('add', this.render);
|
||||||
this.model.currentDocuments.bind('reset', this.render);
|
this.model.currentDocuments.bind('reset', this.render);
|
||||||
this.model.currentDocuments.bind('remove', this.render);
|
this.model.currentDocuments.bind('remove', this.render);
|
||||||
this.state = {};
|
this.tempState = {};
|
||||||
this.hiddenFields = [];
|
var state = _.extend({
|
||||||
|
hiddenFields: []
|
||||||
|
}, modelEtc.state
|
||||||
|
);
|
||||||
|
this.state = new recline.Model.ObjectState(state);
|
||||||
},
|
},
|
||||||
|
|
||||||
events: {
|
events: {
|
||||||
@@ -47,11 +51,11 @@ my.DataGrid = Backbone.View.extend({
|
|||||||
// Column and row menus
|
// Column and row menus
|
||||||
|
|
||||||
onColumnHeaderClick: function(e) {
|
onColumnHeaderClick: function(e) {
|
||||||
this.state.currentColumn = $(e.target).closest('.column-header').attr('data-field');
|
this.tempState.currentColumn = $(e.target).closest('.column-header').attr('data-field');
|
||||||
},
|
},
|
||||||
|
|
||||||
onRowHeaderClick: function(e) {
|
onRowHeaderClick: function(e) {
|
||||||
this.state.currentRow = $(e.target).parents('tr:first').attr('data-id');
|
this.tempState.currentRow = $(e.target).parents('tr:first').attr('data-id');
|
||||||
},
|
},
|
||||||
|
|
||||||
onRootHeaderClick: function(e) {
|
onRootHeaderClick: function(e) {
|
||||||
@@ -59,7 +63,7 @@ my.DataGrid = Backbone.View.extend({
|
|||||||
{{#columns}} \
|
{{#columns}} \
|
||||||
<li><a data-action="showColumn" data-column="{{.}}" href="JavaScript:void(0);">Show column: {{.}}</a></li> \
|
<li><a data-action="showColumn" data-column="{{.}}" href="JavaScript:void(0);">Show column: {{.}}</a></li> \
|
||||||
{{/columns}}';
|
{{/columns}}';
|
||||||
var tmp = $.mustache(tmpl, {'columns': this.hiddenFields});
|
var tmp = $.mustache(tmpl, {'columns': this.state.get('hiddenFields')});
|
||||||
this.el.find('.root-header-menu .dropdown-menu').html(tmp);
|
this.el.find('.root-header-menu .dropdown-menu').html(tmp);
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -67,15 +71,15 @@ my.DataGrid = Backbone.View.extend({
|
|||||||
var self = this;
|
var self = this;
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
var actions = {
|
var actions = {
|
||||||
bulkEdit: function() { self.showTransformColumnDialog('bulkEdit', {name: self.state.currentColumn}); },
|
bulkEdit: function() { self.showTransformColumnDialog('bulkEdit', {name: self.tempState.currentColumn}); },
|
||||||
facet: function() {
|
facet: function() {
|
||||||
self.model.queryState.addFacet(self.state.currentColumn);
|
self.model.queryState.addFacet(self.tempState.currentColumn);
|
||||||
},
|
},
|
||||||
facet_histogram: function() {
|
facet_histogram: function() {
|
||||||
self.model.queryState.addHistogramFacet(self.state.currentColumn);
|
self.model.queryState.addHistogramFacet(self.tempState.currentColumn);
|
||||||
},
|
},
|
||||||
filter: function() {
|
filter: function() {
|
||||||
self.model.queryState.addTermFilter(self.state.currentColumn, '');
|
self.model.queryState.addTermFilter(self.tempState.currentColumn, '');
|
||||||
},
|
},
|
||||||
transform: function() { self.showTransformDialog('transform'); },
|
transform: function() { self.showTransformDialog('transform'); },
|
||||||
sortAsc: function() { self.setColumnSort('asc'); },
|
sortAsc: function() { self.setColumnSort('asc'); },
|
||||||
@@ -86,7 +90,7 @@ my.DataGrid = Backbone.View.extend({
|
|||||||
var doc = _.find(self.model.currentDocuments.models, function(doc) {
|
var doc = _.find(self.model.currentDocuments.models, function(doc) {
|
||||||
// important this is == as the currentRow will be string (as comes
|
// important this is == as the currentRow will be string (as comes
|
||||||
// from DOM) while id may be int
|
// from DOM) while id may be int
|
||||||
return doc.id == self.state.currentRow;
|
return doc.id == self.tempState.currentRow;
|
||||||
});
|
});
|
||||||
doc.destroy().then(function() {
|
doc.destroy().then(function() {
|
||||||
self.model.currentDocuments.remove(doc);
|
self.model.currentDocuments.remove(doc);
|
||||||
@@ -105,7 +109,7 @@ my.DataGrid = Backbone.View.extend({
|
|||||||
var view = new my.ColumnTransform({
|
var view = new my.ColumnTransform({
|
||||||
model: this.model
|
model: this.model
|
||||||
});
|
});
|
||||||
view.state = this.state;
|
view.state = this.tempState;
|
||||||
view.render();
|
view.render();
|
||||||
$el.empty();
|
$el.empty();
|
||||||
$el.append(view.el);
|
$el.append(view.el);
|
||||||
@@ -131,17 +135,20 @@ my.DataGrid = Backbone.View.extend({
|
|||||||
|
|
||||||
setColumnSort: function(order) {
|
setColumnSort: function(order) {
|
||||||
var sort = [{}];
|
var sort = [{}];
|
||||||
sort[0][this.state.currentColumn] = {order: order};
|
sort[0][this.tempState.currentColumn] = {order: order};
|
||||||
this.model.query({sort: sort});
|
this.model.query({sort: sort});
|
||||||
},
|
},
|
||||||
|
|
||||||
hideColumn: function() {
|
hideColumn: function() {
|
||||||
this.hiddenFields.push(this.state.currentColumn);
|
var hiddenFields = this.state.get('hiddenFields');
|
||||||
|
hiddenFields.push(this.tempState.currentColumn);
|
||||||
|
this.state.set({hiddenFields: hiddenFields});
|
||||||
this.render();
|
this.render();
|
||||||
},
|
},
|
||||||
|
|
||||||
showColumn: function(e) {
|
showColumn: function(e) {
|
||||||
this.hiddenFields = _.without(this.hiddenFields, $(e.target).data('column'));
|
var hiddenFields = _.without(this.state.get('hiddenFields'), $(e.target).data('column'));
|
||||||
|
this.state.set({hiddenFields: hiddenFields});
|
||||||
this.render();
|
this.render();
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -197,7 +204,7 @@ my.DataGrid = Backbone.View.extend({
|
|||||||
render: function() {
|
render: function() {
|
||||||
var self = this;
|
var self = this;
|
||||||
this.fields = this.model.fields.filter(function(field) {
|
this.fields = this.model.fields.filter(function(field) {
|
||||||
return _.indexOf(self.hiddenFields, field.id) == -1;
|
return _.indexOf(self.state.get('hiddenFields'), field.id) == -1;
|
||||||
});
|
});
|
||||||
var htmls = $.mustache(this.template, this.toTemplateJSON());
|
var htmls = $.mustache(this.template, this.toTemplateJSON());
|
||||||
this.el.html(htmls);
|
this.el.html(htmls);
|
||||||
@@ -211,7 +218,7 @@ my.DataGrid = Backbone.View.extend({
|
|||||||
});
|
});
|
||||||
newView.render();
|
newView.render();
|
||||||
});
|
});
|
||||||
this.el.toggleClass('no-hidden', (self.hiddenFields.length === 0));
|
this.el.toggleClass('no-hidden', (self.state.get('hiddenFields').length === 0));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
18
src/view.js
18
src/view.js
@@ -108,12 +108,8 @@ my.DataExplorer = Backbone.View.extend({
|
|||||||
})
|
})
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
this.state = {
|
this.state = {};
|
||||||
dataset: null,
|
this._setupState();
|
||||||
queryState: this.model.queryState.toJSON(),
|
|
||||||
currentView: null
|
|
||||||
};
|
|
||||||
this._setupStateManagement();
|
|
||||||
// this must be called after pageViews are created
|
// this must be called after pageViews are created
|
||||||
this.render();
|
this.render();
|
||||||
|
|
||||||
@@ -237,15 +233,21 @@ my.DataExplorer = Backbone.View.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_setupStateManagement: function() {
|
_setupState: function() {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
this.state = {
|
||||||
|
dataset: null,
|
||||||
|
query: this.model.queryState.toJSON(),
|
||||||
|
currentView: null
|
||||||
|
};
|
||||||
this.model.queryState.bind('change', function() {
|
this.model.queryState.bind('change', function() {
|
||||||
self.state.queryState = this.model.queryState.toJSON();
|
self.state.queryState = this.model.queryState.toJSON();
|
||||||
});
|
});
|
||||||
_.each(this.pageViews, function(pageView) {
|
_.each(this.pageViews, function(pageView) {
|
||||||
if (pageView.view.state && pageView.view.state.bind) {
|
if (pageView.view.state && pageView.view.state.bind) {
|
||||||
|
self.state['view-' + pageView.id] = pageView.view.state.toJSON();
|
||||||
pageView.view.state.bind('change', function() {
|
pageView.view.state.bind('change', function() {
|
||||||
self.state['view-' + pageView.view.id] = pageView.view.state.toJSON();
|
self.state['view-' + pageView.id] = pageView.view.state.toJSON();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
(function ($) {
|
(function ($) {
|
||||||
|
|
||||||
module("View - Grid");
|
module("View - DataGrid");
|
||||||
|
|
||||||
function assertPresent(selector) {
|
function assertPresent(selector) {
|
||||||
var found = $(selector);
|
var found = $(selector);
|
||||||
@@ -12,7 +12,7 @@ function assertNotPresent(selector) {
|
|||||||
equal(found.length, 0);
|
equal(found.length, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
test('DataGrid - menu - hideColumn', function () {
|
test('menu - hideColumn', function () {
|
||||||
var dataset = Fixture.getDataset();
|
var dataset = Fixture.getDataset();
|
||||||
var view = new recline.View.DataGrid({
|
var view = new recline.View.DataGrid({
|
||||||
model: dataset
|
model: dataset
|
||||||
@@ -24,6 +24,24 @@ test('DataGrid - menu - hideColumn', function () {
|
|||||||
var hideColumn = view.el.find('.column-header[data-field="x"] a[data-action="hideColumn"]');
|
var hideColumn = view.el.find('.column-header[data-field="x"] a[data-action="hideColumn"]');
|
||||||
hideColumn.trigger('click');
|
hideColumn.trigger('click');
|
||||||
assertNotPresent('.column-header[data-field="x"]');
|
assertNotPresent('.column-header[data-field="x"]');
|
||||||
|
|
||||||
|
// also test a bit of state
|
||||||
|
deepEqual(view.state.toJSON(), {hiddenFields: ['x']});
|
||||||
|
view.remove();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('state', function () {
|
||||||
|
var dataset = Fixture.getDataset();
|
||||||
|
var view = new recline.View.DataGrid({
|
||||||
|
model: dataset,
|
||||||
|
state: {
|
||||||
|
hiddenFields: ['z']
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$('.fixtures .test-datatable').append(view.el);
|
||||||
|
view.render();
|
||||||
|
assertPresent('.column-header[data-field="x"]');
|
||||||
|
assertNotPresent('.column-header[data-field="z"]');
|
||||||
view.remove();
|
view.remove();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -24,8 +24,9 @@ test('getState', function () {
|
|||||||
el: $el
|
el: $el
|
||||||
});
|
});
|
||||||
var state = explorer.getState();
|
var state = explorer.getState();
|
||||||
ok(state.queryState);
|
ok(state.query);
|
||||||
equal(state.queryState.size, 100);
|
equal(state.query.size, 100);
|
||||||
|
deepEqual(state['view-grid'].hiddenFields, []);
|
||||||
$el.remove();
|
$el.remove();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user