/**
* @class Ext.grid.property.Store
* @extends Ext.data.Store
* A custom {@link Ext.data.Store} for the {@link Ext.grid.property.Grid}. This class handles the mapping
* between the custom data source objects supported by the grid and the {@link Ext.grid.property.Property} format
* used by the {@link Ext.data.Store} base class.
* @constructor
* @param {Ext.grid.Grid} grid The grid this store will be bound to
* @param {Object} source The source data config object
*/
Ext.define('Ext.grid.property.Store', {
extend: 'Ext.data.Store',
alternateClassName: 'Ext.grid.PropertyStore',
uses: ['Ext.data.reader.Reader', 'Ext.data.proxy.Proxy', 'Ext.data.ResultSet', 'Ext.grid.property.Property'],
constructor : function(grid, source){
var me = this;
me.grid = grid;
me.source = source;
me.callParent([{
data: source,
model: Ext.grid.property.Property,
proxy: me.getProxy()
}]);
},
// Return a singleton, customized Proxy object which configures itself with a custom Reader
getProxy: function() {
if (!this.proxy) {
Ext.grid.property.Store.prototype.proxy = Ext.create('Ext.data.proxy.Memory', {
model: Ext.grid.property.Property,
reader: this.getReader()
});
}
return this.proxy;
},
// Return a singleton, customized Reader object which reads Ext.grid.property.Property records from an object.
getReader: function() {
if (!this.reader) {
Ext.grid.property.Store.prototype.reader = Ext.create('Ext.data.reader.Reader', {
model: Ext.grid.property.Property,
buildExtractors: Ext.emptyFn,
read: function(dataObject) {
return this.readRecords(dataObject);
},
readRecords: function(dataObject) {
var val,
propName,
result = {
records: [],
success: true
};
for (propName in dataObject) {
if (dataObject.hasOwnProperty(propName)) {
val = dataObject[propName];
if (this.isEditableValue(val)) {
result.records.push(new Ext.grid.property.Property({
name: propName,
value: val
}, propName));
}
}
}
result.total = result.count = result.records.length;
return Ext.create('Ext.data.ResultSet', result);
},
// private
isEditableValue: function(val){
return Ext.isPrimitive(val) || Ext.isDate(val);
}
});
}
return this.reader;
},
// protected - should only be called by the grid. Use grid.setSource instead.
setSource : function(dataObject) {
var me = this;
me.source = dataObject;
me.suspendEvents();
me.removeAll();
me.proxy.data = dataObject;
me.load();
me.resumeEvents();
me.fireEvent('datachanged', me);
},
// private
getProperty : function(row) {
return Ext.isNumber(row) ? this.getAt(row) : this.getById(row);
},
// private
setValue : function(prop, value, create){
var me = this,
rec = me.getRec(prop);
if (rec) {
rec.set('value', value);
me.source[prop] = value;
} else if (create) {
// only create if specified.
me.source[prop] = value;
rec = new Ext.grid.property.Property({name: prop, value: value}, prop);
me.store.add(rec);
}
},
// private
remove : function(prop) {
var rec = this.getRec(prop);
if (rec) {
store.remove(rec);
delete this.source[prop];
}
},
// private
getRec : function(prop) {
return this.getById(prop);
},
// protected - should only be called by the grid. Use grid.getSource instead.
getSource : function() {
return this.source;
}
});