/* Config properties: * rstore: A storage to track changes * Only works if rstore has a model and use 'idProperty' */ Ext.define('PVE.data.DiffStore', { extend: 'Ext.data.Store', constructor: function(config) { var me = this; config = config || {}; if (!config.rstore) { throw "no rstore specified"; } if (!config.rstore.model) { throw "no rstore model specified"; } var rstore = config.rstore; Ext.apply(config, { model: rstore.model, proxy: { type: 'memory' } }); me.callParent([config]); var first_load = true; var cond_add_item = function(data, id) { var olditem = me.getById(id); if (olditem) { olditem.beginEdit(); me.model.prototype.fields.eachKey(function(field) { if (olditem.data[field] !== data[field]) { olditem.set(field, data[field]); } }); olditem.endEdit(true); olditem.commit(); } else { var newrec = Ext.ModelMgr.create(data, me.model, id); var pos = (me.appendAtStart && !first_load) ? 0 : me.data.length; me.insert(pos, newrec); } }; me.mon(rstore, 'load', function(s, records, success) { if (!success) { return; } me.suspendEvents(); // remove vanished items (me.snapshot || me.data).each(function(olditem) { var item = rstore.getById(olditem.getId()); if (!item) { me.remove(olditem); } }); rstore.each(function(item) { cond_add_item(item.data, item.getId()); }); me.filter(); first_load = false; me.resumeEvents(); me.fireEvent('datachanged', me); }); } });