/**
* Encapsulates a group of records. Can provide a
* {@link #getSummaryRecord} summary record.
*
* @since 6.5.0
*/
Ext.define('Ext.data.Group', {
extend: 'Ext.util.Group',
isDataGroup: true,
store: null,
isCollapsed: false,
updateParent: function(parent, oldParent) {
if (!this.isCollapsed && parent && parent.isGroup) {
this.isCollapsed = parent.isCollapsed;
}
this.callParent([parent, oldParent]);
},
/**
* Mark this group as expanded.
* @param {Boolean} [includeChildren=false] Set to true to expand the children groups too.
*/
expand: function(includeChildren) {
this.doExpandCollapse(true, includeChildren);
},
/**
* Mark this group as collapsed.
* @param {Boolean} [includeChildren=false] Set to true to collapse the children groups too.
*/
collapse: function(includeChildren) {
this.doExpandCollapse(false, includeChildren);
},
doExpandCollapse: function(expanded, includeChildren) {
var groups = this.getGroups(),
len, i;
this.isCollapsed = !expanded;
if (includeChildren && groups) {
len = groups.length;
for (i = 0; i < len; i++) {
groups.items[i].doExpandCollapse(expanded, includeChildren);
}
}
},
/**
* Mark this group as collapsed or expanded depending on the current state.
*/
toggleCollapsed: function() {
this.doExpandCollapse(this.isCollapsed);
},
/**
* Returns the group header summary results for the group.
* @return {Ext.data.Model}
*/
getGroupRecord: function() {
var record = this.getNewSummaryRecord('groupRecord', true);
record.isGroup = true;
return record;
},
/**
* Returns the summary results for the group.
* @return {Ext.data.Model}
*/
getSummaryRecord: function() {
var record = this.getNewSummaryRecord('summaryRecord', true);
record.isSummary = true;
return record;
},
getNewSummaryRecord: function(property, calculate) {
var me = this,
summaryRecord = me[property],
store = me.store,
generation = store.getData().generation,
M, T, idProperty;
if (!summaryRecord) {
M = store.getModel();
T = M.getSummaryModel();
me[property] = summaryRecord = new T();
idProperty = M.idField.name;
summaryRecord.data[idProperty] = summaryRecord.id = M.identifier.generate();
summaryRecord.group = me;
summaryRecord.commit();
}
if (!store.getRemoteSummary() && !summaryRecord.isRemote &&
summaryRecord.summaryGeneration !== generation && calculate === true) {
summaryRecord.calculateSummary(me.items);
summaryRecord.summaryGeneration = generation;
}
else if (store.getRemoteSummary() && summaryRecord.isRemote) {
// reset values that have no summary config anymore
me.fixRemoteSummary(summaryRecord);
}
summaryRecord.isNonData = true;
return summaryRecord;
},
// remove all data for the summaries that are no more available
fixRemoteSummary: function(summaryRecord) {
var fields = summaryRecord.getFields(),
len = fields.length,
i, result, summary, name, field;
for (i = 0; i < len; ++i) {
field = fields[i];
summary = field.getSummary();
result = result || {};
name = field.name;
if (name !== 'id' && !summary) {
result[name] = null;
}
}
if (result) {
summaryRecord.set(result, summaryRecord._commitOptions);
}
},
recalculateSummaries: function() {
var items = this.items;
this.getGroupRecord().calculateSummary(items);
this.getSummaryRecord().calculateSummary(items);
},
eject: function() {
var me = this;
me.callParent();
if (me.groupRecord) {
me.groupRecord.summaryGeneration = 0;
}
if (me.summaryRecord) {
me.summaryRecord.summaryGeneration = 0;
}
}
});