/*
|
* This is a simple in-memory store implementation that is ONLY intended for use with
|
* calendar samples running locally in the browser with no external data source. Under
|
* normal circumstances, stores that use a MemoryProxy are read-only and intended only
|
* for displaying data read from memory. In the case of the calendar, it's still quite
|
* useful to be able to deal with in-memory data for sample purposes (as many people
|
* may not have PHP set up to run locally), but by default, updates will not work since the
|
* calendar fully expects all CRUD operations to be supported by the store (and in fact
|
* will break, for example, if phantom records are not removed properly). This simple
|
* class gives us a convenient way of loading and updating calendar event data in memory,
|
* but should NOT be used outside of the local samples.
|
*/
|
Ext.define('Ext.calendar.data.MemoryEventStore', {
|
extend: 'Ext.data.Store',
|
model: 'Ext.calendar.data.EventModel',
|
|
requires: [
|
'Ext.data.proxy.Memory',
|
'Ext.data.reader.Json',
|
'Ext.data.writer.Json',
|
'Ext.calendar.data.EventModel',
|
'Ext.calendar.data.EventMappings'
|
],
|
|
proxy: {
|
type: 'memory',
|
reader: {
|
type: 'json',
|
root: 'evts'
|
},
|
writer: {
|
type: 'json'
|
}
|
},
|
|
// private
|
constructor: function(config){
|
this.callParent(arguments);
|
|
this.sorters = this.sorters || [{
|
property: Ext.calendar.data.EventMappings.StartDate.name,
|
direction: 'ASC'
|
}];
|
|
this.idProperty = this.idProperty || Ext.calendar.data.EventMappings.EventId.mapping || 'id';
|
this.fields = Ext.calendar.data.EventModel.prototype.fields.getRange();
|
this.onCreateRecords = Ext.Function.createInterceptor(this.onCreateRecords, this.interceptCreateRecords);
|
this.initRecs();
|
},
|
|
// private - override to make sure that any records added in-memory
|
// still get a unique PK assigned at the data level
|
interceptCreateRecords: function(records, operation, success) {
|
if (success) {
|
var i = 0,
|
rec,
|
len = records.length;
|
|
for (; i < len; i++) {
|
records[i].data[Ext.calendar.data.EventMappings.EventId.name] = records[i].id;
|
}
|
}
|
},
|
|
// If the store started with preloaded inline data, we have to make sure the records are set up
|
// properly as valid "saved" records otherwise they may get "added" on initial edit.
|
initRecs: function(){
|
this.each(function(rec){
|
rec.store = this;
|
rec.phantom = false;
|
}, this);
|
},
|
|
// private - override the default logic for memory storage
|
onProxyLoad: function(operation) {
|
var me = this,
|
records;
|
|
if (me.data && me.data.length > 0) {
|
// this store has already been initially loaded, so do not reload
|
// and lose updates to the store, just use store's latest data
|
me.totalCount = me.data.length;
|
records = me.data.items;
|
}
|
else {
|
// this is the initial load, so defer to the proxy's result
|
var resultSet = operation.getResultSet(),
|
successful = operation.wasSuccessful();
|
|
records = operation.getRecords();
|
|
if (resultSet) {
|
me.totalCount = resultSet.total;
|
}
|
if (successful) {
|
me.loadRecords(records, operation);
|
}
|
}
|
|
me.loading = false;
|
me.fireEvent('load', me, records, successful);
|
}
|
});
|