@syncfusion/ej2-pivotview
Version:
The pivot grid, or pivot table, is used to visualize large sets of relational data in a cross-tabular format, similar to an Excel pivot table.
6,562 lines • 377 kB
JavaScript
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
import { extend, Internationalization } from '@syncfusion/ej2-base';
import { isNullOrUndefined, SanitizeHtmlHelper } from '@syncfusion/ej2-base';
import { DataManager, Query } from '@syncfusion/ej2-data';
import { PivotUtil } from './util';
/**
* PivotEngine is used to manipulate the relational or Multi-Dimensional data as pivoting values.
*/
/** @hidden */
var PivotEngine = /** @class */ (function () {
function PivotEngine() {
/** @hidden */
this.aggregatedValueMatrix = [];
/** @hidden */
this.valueContent = [];
/** @hidden */
this.formatFields = {};
/** @hidden */
this.groupingFieldsInfo = {};
/** @hidden */
this.dateFormatFunction = {};
/** @hidden */
this.calculatedFields = {};
/** @hidden */
this.calculatedFormulas = {};
/** @hidden */
this.valueAxis = 0;
/** @hidden */
this.saveDataHeaders = {};
/** @hidden */
this.columnCount = 0;
/** @hidden */
this.rowCount = 0;
/** @hidden */
this.columnPageCount = 0;
/** @hidden */
this.rowPageCount = 0;
/** @hidden */
this.colFirstLvl = 0;
/** @hidden */
this.rowFirstLvl = 0;
/** @hidden */
this.rowStartPos = 0;
/** @hidden */
this.colStartPos = 0;
/** @hidden */
this.enableValueSorting = false;
/** @hidden */
this.headerCollection = { rowHeaders: [], columnHeaders: [], rowHeadersCount: 0, columnHeadersCount: 0 };
/** @hidden */
this.lastMember = {};
/** @hidden */
this.rMembers = [];
/** @hidden */
this.cMembers = [];
/** @hidden */
this.groupingFields = {};
/** @hidden */
this.isLastHeaderHasMeasures = true;
/** @hidden */
this.measureIndex = -1;
/** @hidden */
this.isPagingOrVirtualizationEnabled = false;
/** @hidden */
this.rowMaxLevel = 0;
this.valueMatrix = [];
this.topBottomFilterCache = {};
this.memberCnt = -1;
this.pageInLimit = false;
this.endPos = 0;
this.removeCount = 0;
this.colHdrBufferCalculated = false;
this.colValuesLength = 1;
this.rowValuesLength = 1;
this.slicedHeaders = [];
this.fieldFilterMem = {};
this.filterPosObj = {};
this.selectedHeaders = { selectedHeader: [], values: [] };
this.rowGrandTotal = null;
this.columnGrandTotal = null;
this.removeRowGrandTotal = false;
this.removeColumnGrandTotal = false;
this.isValueHasAdvancedAggregate = false;
this.rawIndexObject = {};
this.reformAxisCount = 0;
this.isEditing = false;
/** @hidden */
this.valueAxisFields = {};
/** @hidden */
this.data = [];
/** @hidden */
this.actualData = [];
/** @hidden */
this.groupRawIndex = {};
/** @hidden */
this.fieldKeys = {};
this.allowDataCompression = false;
this.dataSourceSettings = {};
this.frameHeaderObjectsCollection = false;
this.headerObjectsCollection = {};
this.columnKeys = {};
this.fieldDrillCollection = {};
this.formatRegex = /^(?:[ncpae])(?:([0-9]|1[0-9]|20))?$/i;
this.measureNames = {};
/** @hidden */
this.enablePaging = false;
/** @hidden */
this.enableVirtualization = false;
this.enableHtmlSanitizer = false;
this.enableOptimizedRendering = false;
this.groupedDataType = {};
this.tabularPivotValues = [];
this.sortMembers = {};
this.isFilterAction = false;
this.levelMap = {};
this.isMultiValueRowAxis = false;
this.isTabularMultiValueRowAxis = false;
/** @hidden */
this.viewportPageCount = 3;
/* private makeMirrorObject(elements: number[], obj: NumberIndex): void {
for (let lp: number = 0, end: number = elements.length; lp < end; lp++) {
obj[elements[lp]] = elements[lp];
}
} */
}
/**
* It is used to clear properties.
*
* @param {boolean} isExport - It indicates whether it is triggered after the export or not.
* @returns {void}
* @hidden
*/
PivotEngine.prototype.clearProperties = function (isExport) {
if (!this.isPagingOrVirtualizationEnabled && !isExport) {
this.columnKeys = {};
this.headerCollection = { rowHeaders: [], columnHeaders: [], rowHeadersCount: 0, columnHeadersCount: 0 };
}
if (this.enableValueSorting) {
this.valueContent = [];
}
this.saveDataHeaders = this.allowValueFilter ? this.saveDataHeaders : {};
this.rMembers = [];
this.cMembers = [];
this.lastMember = {};
this.slicedHeaders = [];
this.fieldFilterMem = {};
this.filterPosObj = {};
this.selectedHeaders = { selectedHeader: [], values: [] };
this.rowGrandTotal = null;
this.columnGrandTotal = null;
this.rawIndexObject = {};
this.topBottomFilterCache = {};
this.headerObjectsCollection = {};
this.fieldDrillCollection = {};
this.sortMembers = {};
};
/**
* It is used to render the pivot engine.
*
* @param {IDataOptions} dataSource - It contains the dataSourceSettings.
* @param {ICustomProperties} customProperties - It contains the custom Properties.
* @param {Function} fn - It contains aggreagateCellnInfo method.
* @param {Function} onHeadersSort - It contains onHeaderSort method.
* @returns {void}
* @hidden
*/
PivotEngine.prototype.renderEngine = function (dataSource, customProperties, fn, onHeadersSort) {
this.getValueCellInfo = fn;
this.getHeaderSortInfo = onHeadersSort;
this.customProperties = customProperties;
if (this.fieldList) {
for (var i = 0, j = dataSource.formatSettings; i < j.length; i++) {
if (!this.formatFields[j[i].name] && this.fieldList[j[i].name]) {
this.fieldList[j[i].name].members = {};
this.fieldList[j[i].name].formattedMembers = {};
this.fieldList[j[i].name].dateMember = [];
}
}
}
this.formatFields = {};
this.dateFormatFunction = {};
this.calculatedFields = {};
this.calculatedFormulas = {};
this.valueAxis = 0;
this.saveDataHeaders = {};
this.columnCount = 0;
this.rowCount = 0;
this.columnPageCount = 0;
this.rowPageCount = 0;
this.colFirstLvl = 0;
this.rowFirstLvl = 0;
this.rowStartPos = 0;
this.colStartPos = 0;
this.dataSourceSettings.excludeFields = isNullOrUndefined(dataSource.excludeFields) ? [] : dataSource.excludeFields;
this.enableValueSorting = false;
this.headerCollection = { rowHeaders: [], columnHeaders: [], rowHeadersCount: 0, columnHeadersCount: 0 };
this.aggregatedValueMatrix = [];
this.rMembers = [];
this.cMembers = [];
this.memberCnt = -1;
this.pageInLimit = false;
this.endPos = 0;
this.removeCount = 0;
this.colHdrBufferCalculated = false;
this.colValuesLength = 1;
this.rowValuesLength = 1;
this.slicedHeaders = [];
this.fieldFilterMem = {};
this.filterPosObj = {};
this.selectedHeaders = { selectedHeader: [], values: [] };
this.rowGrandTotal = null;
this.columnGrandTotal = null;
this.removeRowGrandTotal = false;
this.removeColumnGrandTotal = false;
this.isValueHasAdvancedAggregate = false;
this.rawIndexObject = {};
this.isLastHeaderHasMeasures = true;
this.isEditing = false;
var fields;
this.globalize = (customProperties && customProperties.globalize) ? customProperties.globalize : new Internationalization();
this.currencyCode = (customProperties && customProperties.currenyCode) ? customProperties.currenyCode : undefined;
this.localeObj = customProperties ? customProperties.localeObj : undefined;
this.fieldsType = customProperties ? customProperties.fieldsType : {};
this.clonedReport = customProperties ? (customProperties.clonedReport &&
customProperties.clonedReport.properties ?
customProperties.clonedReport.properties :
customProperties.clonedReport) : {};
this.enablePaging = customProperties.enablePaging;
this.enableVirtualization = customProperties.enableVirtualization;
this.enableOptimizedRendering = customProperties.enableOptimizedRendering;
this.enableHtmlSanitizer = customProperties.enableHtmlSanitizer;
this.isPagingOrVirtualizationEnabled = this.enablePaging || this.enableVirtualization;
this.enableSort = dataSource.enableSorting;
this.dataSourceSettings.alwaysShowValueHeader = dataSource.alwaysShowValueHeader;
this.dataSourceSettings.showHeaderWhenEmpty = isNullOrUndefined(dataSource.showHeaderWhenEmpty) ? true :
dataSource.showHeaderWhenEmpty;
this.dataSourceSettings.showSubTotals = isNullOrUndefined(dataSource.showSubTotals) ? true : dataSource.showSubTotals;
this.dataSourceSettings.showRowSubTotals = isNullOrUndefined(dataSource.showRowSubTotals) ? true : dataSource.showRowSubTotals;
this.dataSourceSettings.showColumnSubTotals = isNullOrUndefined(dataSource.showColumnSubTotals) ? true :
dataSource.showColumnSubTotals;
this.dataSourceSettings.showGrandTotals = isNullOrUndefined(dataSource.showGrandTotals) ? true : dataSource.showGrandTotals;
this.dataSourceSettings.grandTotalsPosition = isNullOrUndefined(dataSource.grandTotalsPosition) ? 'Bottom' :
dataSource.grandTotalsPosition;
this.dataSourceSettings.showRowGrandTotals = isNullOrUndefined(dataSource.showRowGrandTotals) ? true :
dataSource.showRowGrandTotals;
this.dataSourceSettings.showColumnGrandTotals = isNullOrUndefined(dataSource.showColumnGrandTotals) ? true :
dataSource.showColumnGrandTotals;
this.showSubTotalsAtTop = (this.dataSourceSettings.showSubTotals && this.dataSourceSettings.showColumnSubTotals &&
dataSource.subTotalsPosition === 'Top');
this.showSubTotalsAtBottom = (this.dataSourceSettings.showSubTotals && this.dataSourceSettings.showRowSubTotals &&
dataSource.subTotalsPosition === 'Bottom') || customProperties.isTabularLayout;
this.allowValueFilter = dataSource.allowValueFilter;
this.isValueFilterEnabled = false;
this.enableValueSorting = customProperties ? customProperties.enableValueSorting : false;
this.isDrillThrough = customProperties ? (customProperties.isDrillThrough ? customProperties.isDrillThrough : false) : false;
this.valueContent = [];
this.dataSourceSettings = PivotUtil.getClonedDataSourceSettings(dataSource);
if (!(dataSource.dataSource instanceof DataManager)) {
if (dataSource.type === 'CSV') {
this.data = dataSource.dataSource.map(function (innerArray) { return innerArray.slice(); });
if (this.fieldList) {
this.data.shift();
}
}
else {
this.data = dataSource.dataSource;
}
}
if (this.data && this.data[0]) {
if (!this.fieldList) {
if (dataSource.type === 'CSV') {
this.fields = this.data.shift();
}
else {
this.fields = Object.keys(this.data[0]);
}
this.fieldKeys = {};
for (var i = 0; i < this.fields.length; i++) {
this.fieldKeys[this.fields[i]] = dataSource.type === 'CSV' ? i : this.fields[i];
}
}
if (customProperties && customProperties.pageSettings && customProperties.allowDataCompression) {
this.actualData = this.data;
this.data = this.getGroupedRawData(dataSource);
}
this.dataSourceSettings.rows = dataSource.rows ? dataSource.rows : [];
this.dataSourceSettings.columns = dataSource.columns ? dataSource.columns : [];
this.dataSourceSettings.filters = dataSource.filters ? dataSource.filters : [];
this.dataSourceSettings.values = dataSource.values ? dataSource.values : [];
this.dataSourceSettings.formatSettings = dataSource.formatSettings ? dataSource.formatSettings : [];
this.dataSourceSettings.groupSettings = dataSource.groupSettings ? dataSource.groupSettings : [];
this.dataSourceSettings.calculatedFieldSettings = dataSource.calculatedFieldSettings ? dataSource.calculatedFieldSettings : [];
this.enableSort = dataSource.enableSorting === undefined ? true : dataSource.enableSorting;
this.dataSourceSettings.fieldMapping = dataSource.fieldMapping ? dataSource.fieldMapping : [];
this.valueAxisFields = {};
for (var _i = 0, _a = this.dataSourceSettings.values; _i < _a.length; _i++) {
var value = _a[_i];
this.valueAxisFields[value.name] = value;
}
fields = this.getGroupData(this.data);
this.validateFilters(dataSource);
this.isExpandAll = (this.isValueFiltersAvail && dataSource.allowValueFilter) ? true : dataSource.expandAll;
this.drilledMembers =
dataSource.drilledMembers ? (this.isValueFiltersAvail && dataSource.allowValueFilter) ? [] : dataSource.drilledMembers : [];
this.isMultiMeasures = this.dataSourceSettings.values.length > 1 ? true : false;
this.valueAxis = dataSource.valueAxis === 'row' ? 1 : 0;
this.measureIndex = !isNullOrUndefined(dataSource.valueIndex) ? dataSource.valueIndex : -1;
this.emptyCellTextContent = dataSource.emptyCellsTextContent ? dataSource.emptyCellsTextContent : '';
this.rowValuesLength = this.valueAxis === 1 ? this.dataSourceSettings.values.length : 1;
this.colValuesLength = this.valueAxis === 0 ? this.dataSourceSettings.values.length : 1;
this.valueSortSettings = dataSource.valueSortSettings ||
{ rowSortOrder: 'None', rowHeaderText: '', columnSortOrder: 'None', columnHeaderText: '', headerDelimiter: '.', columnIndex: undefined,
rowIndex: undefined };
this.valueSortData = [];
this.pageSettings = customProperties ? (customProperties.pageSettings ? customProperties.pageSettings : this.pageSettings)
: undefined;
this.allowDataCompression = customProperties && customProperties.allowDataCompression;
this.savedFieldList = customProperties ? customProperties.savedFieldList : undefined;
this.getFieldList(fields, this.enableSort, dataSource.allowValueFilter);
this.removeIrrelevantFields(Object.keys(this.fieldList));
this.fillFieldMembers();
this.updateSortSettings(dataSource.sortSettings, this.enableSort);
this.filterMembers = [];
var columnLength = this.dataSourceSettings.columns.length - 1;
this.columnKeys = {};
while (columnLength > -1) {
this.columnKeys[this.dataSourceSettings.columns[columnLength].name] = this.dataSourceSettings
.columns[columnLength];
columnLength--;
}
this.isMultiValueRowAxis = this.dataSourceSettings.valueAxis === 'row' && (this.dataSourceSettings.values.length > 1 || this.dataSourceSettings.alwaysShowValueHeader) && this.dataSourceSettings.rows.length > 0;
this.isTabularMultiValueRowAxis = this.isMultiValueRowAxis && customProperties.isTabularLayout;
this.updateFilterMembers(dataSource);
this.generateGridData(dataSource);
}
};
PivotEngine.prototype.removeIrrelevantFields = function (fields) {
var report = {};
report[0] = this.dataSourceSettings.rows;
report[1] = this.dataSourceSettings.columns;
report[2] = this.dataSourceSettings.values;
report[3] = this.dataSourceSettings.filters;
var pos = 0;
while (pos < 4) {
if (report[pos]) {
for (var cnt = 0; cnt < report[pos].length; cnt++) {
var fieldName = report[pos][cnt].name;
if ((this.dataSourceSettings.excludeFields.indexOf(fieldName) > -1) || (!isNullOrUndefined(fields)
&& fields.indexOf(fieldName) === -1)) {
report[pos].splice(cnt, 1);
cnt--;
}
else if (pos === 2) {
this.measureNames[fieldName] =
report[pos][cnt].caption ? report[pos][cnt].caption : fieldName;
this.measureNames[report[pos][cnt].caption ?
report[pos][cnt].caption : fieldName] = fieldName;
}
}
}
pos++;
}
this.isMultiMeasures = this.dataSourceSettings.values.length > 1 ? true : false;
this.measureIndex = this.measureIndex === -1 ? (this.valueAxis ? report[0].length : report[1].length) : this.measureIndex;
};
PivotEngine.prototype.updateDataSourceSettings = function (dataSource, requireDatasourceUpdate) {
if (requireDatasourceUpdate) {
this.emptyCellTextContent = dataSource.emptyCellsTextContent ? dataSource.emptyCellsTextContent : '';
this.valueAxis = dataSource.valueAxis === 'row' ? 1 : 0;
this.rowValuesLength = this.valueAxis === 1 ? this.dataSourceSettings.values.length : 1;
this.colValuesLength = this.valueAxis === 0 ? this.dataSourceSettings.values.length : 1;
this.measureIndex = !isNullOrUndefined(dataSource.valueIndex) ? dataSource.valueIndex : -1;
this.enableSort = dataSource.enableSorting;
this.dataSourceSettings.alwaysShowValueHeader = dataSource.alwaysShowValueHeader;
this.dataSourceSettings.showHeaderWhenEmpty = isNullOrUndefined(dataSource.showHeaderWhenEmpty) ? true :
dataSource.showHeaderWhenEmpty;
this.dataSourceSettings.showSubTotals = isNullOrUndefined(dataSource.showSubTotals) ? true : dataSource.showSubTotals;
this.dataSourceSettings.showRowSubTotals = isNullOrUndefined(dataSource.showRowSubTotals) ? true : dataSource.showRowSubTotals;
this.dataSourceSettings.showColumnSubTotals = isNullOrUndefined(dataSource.showColumnSubTotals) ? true :
dataSource.showColumnSubTotals;
this.dataSourceSettings.showGrandTotals = isNullOrUndefined(dataSource.showGrandTotals) ? true : dataSource.showGrandTotals;
this.dataSourceSettings.grandTotalsPosition = isNullOrUndefined(dataSource.grandTotalsPosition) ? 'Bottom' :
dataSource.grandTotalsPosition;
this.dataSourceSettings.showRowGrandTotals = isNullOrUndefined(dataSource.showRowGrandTotals) ? true :
dataSource.showRowGrandTotals;
this.dataSourceSettings.showColumnGrandTotals = isNullOrUndefined(dataSource.showColumnGrandTotals) ? true :
dataSource.showColumnGrandTotals;
this.showSubTotalsAtTop = this.dataSourceSettings.showSubTotals && dataSource.subTotalsPosition === 'Top' &&
dataSource.showColumnSubTotals;
this.showSubTotalsAtBottom = this.customProperties.isTabularLayout ? true : this.dataSourceSettings.showSubTotals && dataSource.subTotalsPosition === 'Bottom' && dataSource.showRowSubTotals;
this.allowValueFilter = dataSource.allowValueFilter;
this.dataSourceSettings.formatSettings = dataSource.formatSettings ? dataSource.formatSettings : [];
this.dataSourceSettings.groupSettings = dataSource.groupSettings ? dataSource.groupSettings : [];
this.dataSourceSettings.calculatedFieldSettings = dataSource.calculatedFieldSettings ? dataSource.calculatedFieldSettings : [];
this.enableSort = dataSource.enableSorting === undefined ? true : dataSource.enableSorting;
this.dataSourceSettings.fieldMapping = dataSource.fieldMapping ? dataSource.fieldMapping : [];
this.dataSourceSettings.values = dataSource.values ? dataSource.values : [];
this.dataSourceSettings.rows = dataSource.rows ? dataSource.rows : [];
this.dataSourceSettings.columns = dataSource.columns ? dataSource.columns : [];
this.dataSourceSettings.filters = dataSource.filters ? dataSource.filters : [];
this.dataSourceSettings.filterSettings = dataSource.filterSettings ? dataSource.filterSettings : [];
this.dataSourceSettings.sortSettings = dataSource.sortSettings ? dataSource.sortSettings : [];
this.dataSourceSettings.conditionalFormatSettings = dataSource.conditionalFormatSettings ?
dataSource.conditionalFormatSettings : [];
this.dataSourceSettings.valueSortSettings = dataSource.valueSortSettings ? dataSource.valueSortSettings : {};
this.removeIrrelevantFields(Object.keys(this.fieldList));
}
};
PivotEngine.prototype.getGroupedRawData = function (dataSourceSettings) {
this.data = [];
for (var _i = 0, _a = this.actualData; _i < _a.length; _i++) {
var data = _a[_i];
this.data[this.data.length] = PivotUtil.frameHeaderWithKeys(data);
}
var countFields = dataSourceSettings.values.filter(function (item) {
return item.type === 'Count' || item.type === 'DistinctCount';
}).map(function (item) { return item.name; });
var hasCountField = countFields.length > 0;
var realData = this.data;
var headerFields = dataSourceSettings.rows.concat(dataSourceSettings.columns.concat(dataSourceSettings.filters)).map(function (item) {
return item.name;
});
var groupRawData = {};
var finalData = [];
this.groupRawIndex = {};
var groupKeys = {};
var indexLength = 0;
for (var i = 0; i < realData.length; i++) {
var currData = realData[i];
var members = [];
if (hasCountField) {
for (var vPos = 0; vPos < countFields.length; vPos++) {
currData[this.fieldKeys[countFields[vPos]]] =
isNullOrUndefined(currData[this.fieldKeys[countFields[vPos]]]) ?
currData[this.fieldKeys[countFields[vPos]]] : 1;
}
}
for (var hPos = 0; hPos < headerFields.length; hPos++) {
members.push(currData[this.fieldKeys[headerFields[hPos]]]);
}
var memberJoin = members.join('-');
if (groupRawData[memberJoin]) {
for (var vPos = 0; vPos < dataSourceSettings.values.length; vPos++) {
var currFieldName = dataSourceSettings.values[vPos].name;
var currValue = currData[this.fieldKeys[currFieldName]];
var savedData = groupRawData[memberJoin];
var summType = dataSourceSettings.values[vPos].type;
if (!isNullOrUndefined(currValue)) {
if (typeof currValue !== 'number' || summType === 'DistinctCount') {
summType = 'Count';
}
if (isNullOrUndefined(savedData[currFieldName])) {
savedData[currFieldName] = summType === 'Product' ? 1 : ((summType === 'Min' || summType === 'Max')
? undefined : 0);
}
else if (typeof savedData[currFieldName] !== 'number') {
savedData[currFieldName] = 1;
}
if (summType === 'Count') {
savedData[currFieldName] += 1;
}
else if (summType === 'Min') {
if (!isNullOrUndefined(savedData[currFieldName])) {
savedData[currFieldName] = savedData[currFieldName] > currValue ?
currValue : savedData[currFieldName];
}
}
else if (summType === 'Max') {
if (!isNullOrUndefined(savedData[currFieldName])) {
savedData[currFieldName] = savedData[currFieldName] < currValue ?
currValue : savedData[currFieldName];
}
}
else if (summType === 'Product') {
savedData[currFieldName] *= currValue;
}
else {
savedData[currFieldName] += currValue;
}
}
}
if (this.isDrillThrough) {
this.groupRawIndex[groupKeys[memberJoin]].push(i);
}
}
else {
(groupRawData)[memberJoin] = currData;
finalData.push(currData);
if (this.isDrillThrough) {
this.groupRawIndex[indexLength] = [i];
groupKeys[memberJoin] = indexLength;
indexLength++;
}
}
}
return finalData;
};
PivotEngine.prototype.getGroupData = function (data) {
var _this = this;
var fieldkeySet = data[0];
var _loop_1 = function (i, groupElements) {
var group = groupElements[i];
var fieldName = group.name;
var caption = group.caption;
if (this_1.fields.indexOf(fieldName) > -1) {
var groupFields = {};
var customGroupFieldName = void 0;
if ((group.type === 'Date' && this_1.groupingFields[fieldName]) ||
(group.type === 'Custom' && this_1.groupingFields[fieldName])) {
return { value: fieldkeySet };
}
else if (group.type === 'Number') {
if (PivotUtil.getType(fieldkeySet[fieldName]) === 'number' ||
!this_1.groupingFields[fieldName]) {
if (group.rangeInterval) {
data.sort(function (a, b) { return (Number(a[_this.fieldKeys[fieldName]]) >
Number(b[_this.fieldKeys[fieldName]])) ? 1 :
((Number(b[_this.fieldKeys[fieldName]]) >
Number(a[_this.fieldKeys[fieldName]])) ? -1 : 0); });
}
}
else {
return { value: fieldkeySet };
}
}
// else if (group.type === 'Custom' && this.fields.indexOf(fieldName + '_custom_group') > -1) {
// return fieldkeySet;
// }
var len = data.length;
while (len--) {
var item = data[len];
var fieldValue = item[this_1.fieldKeys[fieldName]];
if ((fieldValue || fieldValue === '') && group.type === 'Date') {
var date = new Date(fieldValue.toString());
if (!isNullOrUndefined(date) && group.groupInterval.length > 0) {
for (var i_1 = 0, len_1 = group.groupInterval.length; i_1 < len_1; i_1++) {
var interval = group.groupInterval[i_1];
var isInRangeAvail = this_1.getRange(group, date.getTime());
var newDate = PivotUtil.resetTime(new Date());
switch (interval) {
case 'Years':
{
var newFieldName = (i_1 === group.groupInterval.length - 1) ? fieldName :
fieldName + '_date_group_years';
groupFields[newFieldName] = interval;
this_1.fieldKeys[newFieldName] = this_1.dataSourceSettings.type === 'CSV' ?
(this_1.fieldKeys[newFieldName] ? this_1.fieldKeys[newFieldName] :
this_1.fields.length) : newFieldName;
if (this_1.fields.indexOf(newFieldName) === -1) {
this_1.fields.push(newFieldName);
}
item[this_1.fieldKeys[newFieldName]] = (isInRangeAvail ? undefined :
new Date(newDate.setFullYear(date.getFullYear())).toString());
}
break;
case 'Quarters':
{
var newFieldName = (i_1 === group.groupInterval.length - 1) ? fieldName :
fieldName + '_date_group_quarters';
groupFields[newFieldName] = interval;
var month = Math.ceil((date.getMonth() + 1) / 3);
this_1.fieldKeys[newFieldName] = this_1.dataSourceSettings.type === 'CSV' ?
(this_1.fieldKeys[newFieldName] ? this_1.fieldKeys[newFieldName] :
this_1.fields.length) : newFieldName;
if (this_1.fields.indexOf(newFieldName) === -1) {
this_1.fields.push(newFieldName);
}
item[this_1.fieldKeys[newFieldName]] = (isInRangeAvail ? undefined :
((this_1.localeObj ? this_1.localeObj.getConstant('qtr') : 'Qtr') + month.toString()));
}
break;
case 'QuarterYear':
{
var newFieldName = (i_1 === group.groupInterval.length - 1) ? fieldName :
fieldName + '_date_group_quarterYear';
groupFields[newFieldName] = interval;
var month = Math.ceil((date.getMonth() + 1) / 3);
this_1.fieldKeys[newFieldName] = this_1.dataSourceSettings.type === 'CSV' ?
(this_1.fieldKeys[newFieldName] ? this_1.fieldKeys[newFieldName] :
this_1.fields.length) : newFieldName;
if (this_1.fields.indexOf(newFieldName) === -1) {
this_1.fields.push(newFieldName);
}
item[this_1.fieldKeys[newFieldName]] = (isInRangeAvail ? undefined :
((this_1.localeObj ? this_1.localeObj.getConstant('qtr') : 'Qtr') + month.toString() + ' '
+ (this_1.localeObj ? this_1.localeObj.getConstant('of') : 'of') + ' '
+ date.getFullYear().toString()));
}
break;
case 'Months':
{
var newFieldName = (i_1 === group.groupInterval.length - 1) ? fieldName :
fieldName + '_date_group_months';
groupFields[newFieldName] = interval;
this_1.fieldKeys[newFieldName] = this_1.dataSourceSettings.type === 'CSV' ?
(this_1.fieldKeys[newFieldName] ? this_1.fieldKeys[newFieldName] :
this_1.fields.length) : newFieldName;
if (this_1.fields.indexOf(newFieldName) === -1) {
this_1.fields.push(newFieldName);
}
item[this_1.fieldKeys[newFieldName]] = (isInRangeAvail ? undefined :
new Date(newDate.setMonth(date.getMonth(), 1)).toString());
}
break;
case 'Days':
{
var newFieldName = (i_1 === group.groupInterval.length - 1) ? fieldName :
fieldName + '_date_group_days';
groupFields[newFieldName] = interval;
this_1.fieldKeys[newFieldName] = this_1.dataSourceSettings.type === 'CSV' ?
(this_1.fieldKeys[newFieldName] ? this_1.fieldKeys[newFieldName] :
this_1.fields.length) : newFieldName;
if (this_1.fields.indexOf(newFieldName) === -1) {
this_1.fields.push(newFieldName);
}
item[this_1.fieldKeys[newFieldName]] = (isInRangeAvail ? undefined :
new Date(newDate.setMonth(date.getMonth(), date.getDate())).toString());
}
break;
case 'Hours':
{
var newFieldName = (i_1 === group.groupInterval.length - 1) ? fieldName :
fieldName + '_date_group_hours';
groupFields[newFieldName] = interval;
this_1.fieldKeys[newFieldName] = this_1.dataSourceSettings.type === 'CSV' ?
(this_1.fieldKeys[newFieldName] ? this_1.fieldKeys[newFieldName] :
this_1.fields.length) : newFieldName;
if (this_1.fields.indexOf(newFieldName) === -1) {
this_1.fields.push(newFieldName);
}
item[this_1.fieldKeys[newFieldName]] = (isInRangeAvail ? undefined :
new Date(newDate.setHours(date.getHours())).toString());
}
break;
case 'Minutes':
{
var newFieldName = (i_1 === group.groupInterval.length - 1) ? fieldName :
fieldName + '_date_group_minutes';
groupFields[newFieldName] = interval;
this_1.fieldKeys[newFieldName] = this_1.dataSourceSettings.type === 'CSV' ?
(this_1.fieldKeys[newFieldName] ? this_1.fieldKeys[newFieldName] :
this_1.fields.length) : newFieldName;
if (this_1.fields.indexOf(newFieldName) === -1) {
this_1.fields.push(newFieldName);
}
item[this_1.fieldKeys[newFieldName]] = (isInRangeAvail ? undefined :
new Date(newDate.setMinutes(date.getMinutes())).toString());
}
break;
case 'Seconds':
{
var newFieldName = (i_1 === group.groupInterval.length - 1) ? fieldName :
fieldName + '_date_group_seconds';
groupFields[newFieldName] = interval;
this_1.fieldKeys[newFieldName] = this_1.dataSourceSettings.type === 'CSV' ?
(this_1.fieldKeys[newFieldName] ? this_1.fieldKeys[newFieldName] :
this_1.fields.length) : newFieldName;
if (this_1.fields.indexOf(newFieldName) === -1) {
this_1.fields.push(newFieldName);
}
item[this_1.fieldKeys[newFieldName]] = (isInRangeAvail ? undefined :
new Date(newDate.setSeconds(date.getSeconds())).toString());
}
break;
}
}
}
}
else if (!isNaN(Number(item[this_1.fieldKeys[fieldName]])) && group.type === 'Number') {
var isInRangeAvail = this_1.getRange(group, Number(item[this_1.fieldKeys[fieldName]]));
item[this_1.fieldKeys[fieldName]] = isInRangeAvail ? undefined :
item[this_1.fieldKeys[fieldName]];
}
else if (item[this_1.fieldKeys[fieldName]] && group.type === 'Custom' &&
group.customGroups && group.customGroups.length > 0) {
var newFieldName = fieldName + '_custom_group';
var customGroups = group.customGroups;
var groupValue = void 0;
this_1.groupingFieldsInfo[fieldName] = fieldName;
this_1.groupingFieldsInfo[newFieldName] = fieldName;
for (var i_2 = 0, len_2 = customGroups.length; i_2 < len_2; i_2++) {
var cGroup = customGroups[i_2];
if (cGroup.items && cGroup.items.length > 1) {
customGroupFieldName = newFieldName;
this_1.fieldKeys[newFieldName] = this_1.dataSourceSettings.type === 'CSV' ?
(this_1.fieldKeys[newFieldName] ? this_1.fieldKeys[newFieldName] :
this_1.fields.length) : newFieldName;
if (this_1.fields.indexOf(newFieldName) === -1) {
this_1.fields.push(newFieldName);
}
var isDataMatch = PivotUtil.inArray(item[this_1.fieldKeys[fieldName]].toString(), cGroup.items) === -1 ? false : true;
item[this_1.fieldKeys[newFieldName]] =
(isDataMatch ? (cGroup.groupName && cGroup.groupName !== '') ? cGroup.groupName :
this_1.localeObj.getConstant('group') + ' ' + i_2 : (groupValue &&
groupValue !== item[this_1.fieldKeys[fieldName]].toString()) ?
groupValue : item[this_1.fieldKeys[fieldName]].toString());
groupValue = item[this_1.fieldKeys[newFieldName]];
}
}
}
var keys = Object.keys(item);
var isCompleteSet = [];
for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
var key = keys_1[_i];
isCompleteSet.push((item[key]) ? true : false);
}
fieldkeySet =
(((isCompleteSet.indexOf(false) === -1) && keys.length === Object.keys(data[0]).length) ? item : fieldkeySet);
//this.fields = Object.keys(fieldkeySet);
}
if (group.type === 'Date') {
var isDataSource = false;
var axisFields = [this_1.dataSourceSettings.rows, this_1.dataSourceSettings.columns,
this_1.dataSourceSettings.values, this_1.dataSourceSettings.filters];
var groupKeys = Object.keys(groupFields);
var gCnt = Object.keys(groupKeys).length;
var groupField = void 0;
for (var _a = 0, axisFields_1 = axisFields; _a < axisFields_1.length; _a++) {
var axis = axisFields_1[_a];
if (!isDataSource && axis) {
var cnt = axis.length;
var i_3 = 0;
while (i_3 < cnt) {
if (axis[i_3].name === fieldName) {
isDataSource = true;
var actualField = axis[i_3];
axis.splice(i_3, 1);
var dataFields = this_1.dataSourceSettings.rows;
dataFields = dataFields.concat(this_1.dataSourceSettings.columns, this_1.dataSourceSettings.values, this_1.dataSourceSettings.filters);
while (gCnt--) {
var caption_1 = actualField.caption ? actualField.caption : actualField.name;
if (this_1.clonedReport) {
var clonedFields = this_1.clonedReport.rows;
clonedFields = clonedFields.concat(this_1.clonedReport.columns, this_1.clonedReport.values, this_1.clonedReport.filters);
var cloneField = PivotUtil.getFieldByName(groupKeys[gCnt], clonedFields);
if (cloneField) {
caption_1 = cloneField.caption ? cloneField.caption : cloneField.name;
}
}
if (!PivotUtil.getFieldByName(groupKeys[gCnt], dataFields)) {
groupField = groupFields[groupKeys[gCnt]];
caption_1 = (caption_1.indexOf(' (') !== -1 && caption_1.indexOf(')') !== -1) ?
caption_1.slice(caption_1.indexOf('(') + 1, caption_1.length - 1) : caption_1;
var newField = {
name: groupKeys[gCnt],
caption: (this_1.localeObj ? this_1.localeObj.getConstant(groupField) : groupField) + ' (' + caption_1 + ')',
type: 'Count',
showNoDataItems: actualField.showNoDataItems,
baseField: actualField.baseField,
baseItem: actualField.baseItem,
showFilterIcon: actualField.showFilterIcon,
showSortIcon: actualField.showSortIcon,
showEditIcon: actualField.showEditIcon,
showRemoveIcon: actualField.showRemoveIcon,
showSubTotals: actualField.showValueTypeIcon,
allowDragAndDrop: actualField.allowDragAndDrop,
expandAll: actualField.expandAll,
groupName: actualField.groupName
};
axis.splice(i_3, 0, newField);
this_1.groupingFieldsInfo[newField.name] = fieldName;
}
else {
this_1.groupingFieldsInfo[groupKeys[gCnt]] = fieldName;
}
}
break;
}
else if (axis[i_3].name.indexOf(fieldName) > -1) {
var axisField = groupFields[axis[i_3].name];
var currentField = axis.filter(function (axisField) {
return axisField.name === fieldName;
})[0];
if (!isNullOrUndefined(currentField)) {
var currentFieldCaption = currentField.caption ?
(currentField.caption.indexOf(' (') !== -1 && currentField.caption.indexOf(')') !== -1) ?
currentField.caption.slice(currentField.caption.indexOf('(') + 1, currentField.caption.length - 1) : currentField.caption : fieldName;
axis[i_3].caption = (this_1.localeObj ? this_1.localeObj.getConstant(axisField) : currentField)
+ ' (' + currentFieldCaption + ')';
}
}
i_3++;
}
if (isDataSource) {
break;
}
}
}
gCnt = Object.keys(groupKeys).length;
var field = this_1.getMappingField(fieldName, this_1.clonedReport ? this_1.clonedReport.fieldMapping
: this_1.dataSourceSettings.fieldMapping);
var caption_2 = field.caption ? field.caption : fieldName;
while (gCnt--) {
groupField = groupFields[groupKeys[gCnt]];
for (var i_4 = 0, len_3 = this_1.dataSourceSettings.formatSettings.length; i_4 < len_3; i_4++) {
if (this_1.dataSourceSettings.formatSettings[i_4].name === groupKeys[gCnt]) {
this_1.dataSourceSettings.formatSettings.splice(i_4, 1);
break;
}
}
if (groupField !== 'Quarters' && groupField !== 'QuarterYear') {
var formatSettings = {
name: groupKeys[gCnt],
type: ['Years', 'Months', 'Days'].indexOf(groupField) > -1 ? 'date' : 'time',
format: ((groupField === 'Years') ? 'yyyy' : (groupField === 'Months') ? 'MMM' :
(groupField === 'Days') ? 'd-MMM' : (groupField === 'Hours') ? 'hh a' :
(groupField === 'Minutes') ? ':mm' : (groupField === 'Seconds') ? ':ss' : undefined)
};
this_1.dataSourceSettings.formatSettings.push(formatSettings);
}
if (!isDataSource) {
var mappingField = this_1.getMappingField(groupKeys[gCnt], this_1.dataSourceSettings.fieldMapping);
if (groupKeys[gCnt] !== fieldName && isNullOrUndefined(mappingField.name)) {
var newField = {
name: groupKeys[gCnt],
caption: (this_1.localeObj ? this_1.localeObj.getConstant(groupField) : groupField) + ' (' + caption_2 + ')'
};
this_1.dataSourceSettings.fieldMapping.push(newField);
this_1.groupingFieldsInfo[newField.name] = fieldName;
}
else if (groupKeys[gCnt] !== fieldName) {
mappingField.caption = (this_1.localeObj ? this_1.localeObj.getConstant(groupField) : groupField) + ' (' + caption_2 + ')';
this_1.groupingFieldsInfo[mappingField.name] = fieldName;
}
}
}
if (!isDataSource) {
var mappingField = this_1.getMappingField(fieldName, this_1.dataSourceSettings.fieldMapping);
groupField = groupFields[fieldName];
if (groupKeys[gCnt] !== fieldName && isNullOrUndefined(mappingField.name)) {
var newField = {
name: fieldName,
caption: (this_1.localeObj ? this_1.localeObj.getConstant(groupField) : groupField) + ' (' + caption_2 + ')'
};
this_1.dataSourceSettings.fieldMapping.push(newField);
this_1.groupingFieldsInfo[newField.name] = fieldName;
}
else {
mappingField.caption = (this_1.localeObj ? this_1.localeObj.getConstant(groupField) : groupField) + ' (' + caption_2 + ')';
this_1.groupingFieldsInfo[mappingField.name] = fieldName;
}
}
}
else if (group.type === 'Number' && group.rangeInterval) {
var cEndValue = void 0;
var framedSet = [];
var unframedSet = [];
var dataLength = data.length;
var cnt = 0;
this_1.groupingFields[fieldName] = fieldName;
var endingAt = void 0;
var groupName = [];
while (cnt < dataLength) {
var numericFieldName = Number(data[cnt][fieldName]);
unframedSet.push(numericFieldName);
if (!isNaN(numericFieldName) && framedSet.indexOf(numericFieldName) === -1) {
framedSet.push(numericFieldName);
}
cnt++;
}
dataLength = data.length;
cnt = 0;
while (cnt < dataLength) {
var currentData = data[cnt];
if (currentData && !isNaN(Number(currentData[fieldName]))) {
endingAt = typeof (group.endingAt) === 'string' ? parseInt(group.endingAt, 10) : group.endingAt;
cEndValue = endingAt ? endingAt : Math.max.apply(Math, framedSet);
var decimalCnt = !Number.isInteger(group.rangeInterval) ?
this_1.countDecimalPlaces(group.rangeInterval) : 0;
var range = void 0;
switch (decimalCnt) {
case 10:
range = 0.0000000001;
break;
case 9:
range = 0.000000001;
break;
case 8:
range = 0.00000001;
break;
case 7:
range = 0.0000001;
break;
case 6:
range = 0.000001;
break;
case 5:
range = 0.00001;
break;
case 4:
range = 0.0001;
break;
case 3:
range = 0.001;
break;
case 2:
range = 0.01;
break;
case 1:
range = 0.1;
break;
default:
range = 1;
}
var currentStartValue = Number.isInteger(group.rangeInterval) ?
Math.floor(Number(currentData[fieldName])) :
Number(currentData[fieldName].toFixed(decimalCnt));
var currentEndValue = Number.isInteger(group.rangeInterval) ?
Math.floor(Number(currentStartValue + (group.rangeInterval - 1))) :
Number((currentStartValue + (group.rangeInterval)).toFixed(decimalCnt));
if (currentStartValue >= groupName[0] && currentStartValue <= groupName[groupName.length - 1]) {
var startValue = groupName[0];
var endValue = Number.isInteger(group.rangeInterval) ?
Math.floor(groupName[groupName.length - 1]) :
Number(groupName[groupName.length - 1].toFixed(decimalCnt));
this_1.processGrouping(currentData, fieldName, startValue, endValue, cEndValue, group.rangeInterval, decimalCnt);
if (isNullOrUndefined(this_1.groupedDataType[fieldName])) {
this_1.groupedDataType[fieldName] = 'string';
}
}
else {
if (groupName.length === 0) {
for (var i_5 = currentStartValue; i_5 <= currentEndValue; i_5 = Number((i_5 + range).toFixed(decimalCnt))) {
groupName.push(i_5);
}
var startValue = groupName[0];
var endValue = Number.isInteger(group.rangeInterval) ?
Math.floor(groupName[groupName.length - 1]) :
Number(groupName[groupName.length - 1].toFixed(decimalCnt));
this_1.processGrouping(currentData, fieldName, startValue, endValue, cEndValue, group.rangeInterval, decimalCnt);
if (isNullOrUndefined(this_1.groupedDataType[fieldName])) {
this_1.groupedDataType[fieldName] = 'string';
}
}
else {
var startValue = Number.isInteger(group.rangeInterval) ?
Math.floor(groupName[groupName.length - 1]) + 1 :
Number((groupName[groupName.length - 1]).toFixed(decimalCnt));
var endValue = Number.isInteger(group.rangeInterval) ?
Math.floor(startValue + (group.rangeInterval - 1)) :
Number((startValue + group.rangeInterval).toFixed(decimalCnt));
var grouping = true;
groupName.splice(0, groupName.length);
while (grouping) {
if (currentStartValue >= startValue && currentStartValue <= endValue) {
this_1.processGrouping(currentData, fieldName, startValue, endValue, cEndValue, group.rangeInterval, decimalCnt);
if (isNullOrUndefined(this_1.groupedDataType[fieldName])) {
this_1.groupedDataType[fieldName] = 'string';
}
groupName.push(startValue);
groupName.push(endValue);
grouping = false;
}
startValue = Number.isInteger(group.rangeInterval) ? endValue + 1 : endValue;
endValue =
Number.isInteger(group.rangeInterval) ? Math.floor(startValue + (group.rangeInterval - 1)) :
Number((startValue + (group.rangeInterval)).toFixed(decimalCnt));
}
}
}
var keys = Object.keys(currentData);
var isCompleteSet = [];
for (var _b = 0, keys_2 = keys; _b < keys_2.length; _b++) {
var key = keys_2[_b];
isCompleteSet.push((currentData[key]) ? true : false);
}
fieldkeySet = (((isCompleteSet.indexOf(false) === -1) && keys.length === Object.keys(data[0]).length) ?
currentData : fieldkeySet);
}
cnt++;
}
var axisFields = [this_1.dataSourceSettings.rows, this_1.dataSourceSettings.columns,
this_1.dataSourceSettings.values, this_1.dataSourceSettings.filters];
for (var _c = 0, axisFields_2 = axisFields; _c < axisFields_2.length; _c++) {
var fields = axisFields_2[_c];
var field = PivotUtil.getFieldByName(fieldName, fields);
if (field) {
field = field.properties ? field.properties : field;
field.type = 'Count';
}
}
for (var i_6 = 0, len_4 = this_1.dataSourceSettings.formatSettings.length; i_6 < len_4; i_6++) {
if (this_1.dataSourceSettings.formatSettings[i_6].name === fieldName) {
this_1.dataSourceSettings.formatSettings.splice(i_6, 1);
break;
}
}
}
else if (group.type === 'Custom' && customGroupFieldName) {
var customFieldName = customGroupFieldName;
// this.groupingFields[customFieldName] = customFieldName;
var isDataSource = false;
var axisFields = [this_1.dataSourceSettings.rows, this_1.dataSourceSettings.columns,
this_1.dataSourceSettings.values, this_1.dataSourceSettings.filters];
var dataFields = this_1.dataSourceSettings.rows;
dataFields = dataFields.concat(this_1.dataSourceSettings.columns, this_1.dataSourceSettings.values, this_1.dataSourceSettings.filters);
var pattern = [];
if (!caption || caption === '') {
pattern = customFieldName.match(/_custom_group/g);
}
// let actualFieldName: string = fieldName.replace(/_custom_group/g, '');
var parentField = PivotUtil.getFieldByName(fieldName.replace(/_custom_group/g, ''), dataFields);
var customGroupField = PivotUtil.getFieldByName(customFieldName, dataFields);
for (var _d = 0, axisFields_3 = axisFields; _d < axisFields_3.length; _d++) {
var axis = axisFields_3[_d];
if (!isDataSource && axis) {
var cnt = axis.length;
var i_7 = 0;
while (i_7 < cnt) {
if (axis[i_7].name === group.name && !customGroupField) {
isDataSource = true;
var actualField = axis[i_7];
var newField = {
name: customFieldName,
caption: (!caption || caption === '') ? (parentField.caption ? parentField.caption : parentField.name) + (pattern.length + 1) : caption,
type: 'Count',
showNoDataItems: actualField.showNoDataItems,
baseField: actualField.baseField,
baseItem: actualField.baseItem,
showSubTotals: actualField.showValueTypeIcon,
allowDragAndDrop: actualField.allowDragAndDrop,
showFilterIcon: actualField.showFilterIcon,
showSortIcon: actualField.showSortIcon,
showRemoveIcon: actualField.showRemoveIcon,
showEditIcon: actualField.showEditIcon,
expandAll: actualField.expandAll,
groupName: actualField.groupName
};
axis.splice(i_7, 0, newField);
this_1.groupingFieldsInfo[newField.name] = fieldName;
this_1.groupingFieldsInfo[fieldName] = fieldName;
break;
}
else if (axis[i_7].name === customFieldName && customGroupField) {
var newField = {
name: customGroupField.name,
caption: (!caption || caption === '') ? customGroupField.caption : caption,
type: customGroupField.type,
showNoDataItems: customGroupField.showNoDataItems,
baseField: customGroupField.baseField,
baseItem: customGroupField.baseItem,
showRemoveIcon: customGroupField.showRemoveIcon,
showSubTotals: customGroupField.showValueTypeIcon,
allowDragAndDrop: customGroupField.allowDragAndDrop,
showFilterIcon: customGroupField.showFilterIcon,
showSortIcon: customGroupField.showSortIcon,
showEditIcon: customGroupField.showEditIcon,
expandAll: customGroupField.expandAll,
groupName: customGroupField.groupName
};
axis.splice(i_7, 1, newField);
this_1.groupingFieldsInfo[newField.name] = fieldName;
this_1.groupingFieldsInfo[fieldName] = fieldName;
break;
}
i_7++;
}
if (isDataSource) {
break;
}
}
}
var formatfield = PivotUtil.getFieldByName(fieldName, PivotUtil.cloneFormatSettings(this_1.dataSourceSettings.formatSettings));
if (formatfield) {
formatfield.name = customFieldName;
this_1.dataSourceSettings.formatSettings.push(formatfield);
}
this_1.groupingFields[fieldName] = fieldName;
}
this_1.groupingFields = extend(this_1.groupingFields, groupFields);
}
else {
if (i < groupElements.length - 1) {
return "continue";
}
else {
return { value: fieldkeySet };
}
}
};
var this_1 = this;
for (var i = 0, groupElements = this.dataSourceSettings.groupSettings; i < groupElements.length; i++) {
var state_1 = _loop_1(i, groupElements);
if (typeof state_1 === "object")
return state_1.value;
}
//this.fields = Object.keys(fieldkeySet);
return fieldkeySet;
};
PivotEngine.prototype.countDecimalPlaces = function (num) {
var decimalValue = num.toString();
return decimalValue.includes('.') ? decimalValue.split('.')[1].length : 0;
};
PivotEngine.prototype.processGrouping = function (currentData, fieldName, startValue, endValue, cEndValue, rangeInterval, decimalCnt) {
if ((Number.isInteger(currentData[fieldName])) || (!Number.isInteger(currentData[fieldName])
&& (Number(currentData[fieldName]) < endValue || cEndValue <= Number(currentData[fieldName])))) {
currentData[fieldName] = this.getNumberGroupHeaders(startValue, endValue, cEndValue);
}
else if (!Number.isInteger(currentData[fieldName]) && Number(currentData[fieldName]) >= endValue) {
currentData[fieldName] =
this.getNumberGroupHeaders(Number((startValue + rangeInterval).toFixed(decimalCnt)), Number((endValue + rangeInterval).toFixed(decimalCnt)), cEndValue);
}
};
PivotEngine.prototype.getNumberGroupHeaders = function (startValue, endValue, cEndValue) {
var fieldName = (startValue === endValue) ? startValue.toString() : (cEndValue >= startValue && cEndValue <= endValue) ?
(cEndValue === startValue) ? startValue.toString() : startValue.toString() + '-' + cEndValue.toString() :
startValue.toString() + '-' + endValue.toString();
return fieldName;
};
PivotEngine.prototype.getRange = function (group, cValue) {
var isRangeAvail;
if (group.type === 'Date') {
var cDate = new Date(cValue);
var startDate = typeof (group.startingAt) === 'string' ? new Date(group.startingAt) : group.startingAt;
var endDate = typeof (group.endingAt) === 'string' ? new Date(group.endingAt) : group.endingAt;
if (startDate && cDate.getTime() < startDate.getTime() ||
endDate && cDate.getTime() > endDate.getTime()) {
isRangeAvail = true;
}
else {
isRangeAvail = false;
}
}
else {
var startValue = typeof (group.startingAt) === 'string' ? parseFloat(group.startingAt) : group.startingAt;
var endValue = typeof (group.endingAt) === 'string' ? parseFloat(group.endingAt) : group.endingAt;
if (!isNaN(startValue) && cValue < startValue || !isNaN(endValue) && cValue > endValue) {
isRangeAvail = true;
}
else {
isRangeAvail = false;
}
}
return isRangeAvail;
};
/**
* It is used to define the format field number digits.
*
* @param {Object} formatField - It contains the format settings.
* @param {string} currentField - It contains the current format field.
* @returns {number} - Returns format digits.
* @hidden
*/
PivotEngine.prototype.getPercentFormat = function (formatField, currentField) {
var isHavingFormat = (!isNullOrUndefined(formatField[currentField]) &&
!isNullOrUndefined(this.formatFields[currentField].format)) ?
(this.formatFields[currentField].format).toLowerCase().match(/p[0-9]/) : undefined;
return !isNullOrUndefined(isHavingFormat) ? (Number((this.formatFields[currentField].format).replace(/[^0-9]/g, ''))) : 2;
};
PivotEngine.prototype.getFormattedFields = function (dataSourceSettings) {
this.formatFields = this.setFormattedFields(dataSourceSettings.formatSettings);
// for (let len: number = 0, lnt: number = fields.length; len < lnt; len++) {
// if (fields[len as number] && fields[len as number].name === this.dataSourceSettings.formatSettings[cnt as number].name) {
// this.formatFields[fields[len as number].name] = this.dataSourceSettings.formatSettings[cnt as number];
// }
// }
};
/**
* It is used to update the format fields.
*
* @param {IFormatSettings[]} formatSettings - It contains the format settings.
* @returns {Object} - An object mapping keys to format settings.
* @hidden
*/
PivotEngine.prototype.setFormattedFields = function (formatSettings) {
var cnt = formatSettings.length;
var formatFields = {};
while (cnt--) {
formatFields[formatSettings[cnt].name] = formatSettings[cnt];
if (formatSettings[cnt].type) {
this.dateFormatFunction[formatSettings[cnt].name] = {
exactFormat: this.globalize.getDateFormat(formatSettings[cnt]),
fullFormat: this.globalize.getDateFormat({
format: 'yyyy/MM/dd/HH/mm/ss', type: formatSettings[cnt].type
})
};
}
}
return formatFields;
};
PivotEngine.prototype.getFieldList = function (fields, isSort, isValueFilteringEnabled) {
var _this = this;
var type;
var lenE = this.dataSourceSettings.excludeFields.length - 1;
while (lenE > -1) {
var index = this.fields.indexOf(this.dataSourceSettings.excludeFields[lenE]);
if (index !== -1) {
this.fields.splice(index, 1);
}
if (this.fieldList) {
delete this.fieldList[this.dataSourceSettings.excludeFields[lenE]];
}
lenE--;
}
var keys = this.fields;
var dataFields = extend([], this.dataSourceSettings.rows, null, true);
dataFields = dataFields.concat(this.dataSourceSettings.columns, this.dataSourceSettings.values, this.dataSourceSettings.filters);
this.getFormattedFields(this.dataSourceSettings);
this.getCalculatedField(keys);
keys = this.fields;
var len = keys.length;
var dataTypes = ['string', 'number', 'datetime', 'date', 'boolean'];
if (this.savedFieldList) {
var index = 0;
this.fieldList = this.savedFieldList;
while (index < len) { /** while is used for better performance than for */
var key = keys[index];
var field = this.getMappingField(key, this.dataSourceSettings.fieldMapping);
if (this.fieldList[key]) {
this.fieldList[key].isSelected = false;
this.fieldList[key].index = index;
this.fieldList[key].filter = [];
this.fieldList[key].sort = isSort ? 'Ascending' : 'None';
this.fieldList[key].isExcelFilter = false;
this.fieldList[key].filterType = '';
this.fieldList[key].showFilterIcon = (field && 'showFilterIcon' in field) ?
field.showFilterIcon : true;
this.fieldList[key].showRemoveIcon = (field && 'showRemoveIcon' in field) ?
field.showRemoveIcon : true;
this.fieldList[key].showSortIcon = (field && 'showSortIcon' in field) ?
field.showSortIcon : true;
this.fieldList[key].showEditIcon = (field && 'showEditIcon' in field) ?
field.showEditIcon : true;
this.fieldList[key].showValueTypeIcon = (field && 'showValueTypeIcon' in field) ?
field.showValueTypeIcon : true;
this.fieldList[key].allowDragAndDrop = (field && 'allowDragAndDrop' in field) ?
field.allowDragAndDrop : true;
this.fieldList[key].isCalculatedField = (field && 'isCalculatedField' in field) ?
field.isCalculatedField : false;
this.fieldList[key].showNoDataItems = (field && 'showNoDataItems' in field) ?
field.showNoDataItems : false;
this.fieldList[key].showSubTotals = (field && 'showSubTotals' in field) ?
field.showSubTotals : true;
this.fieldList[key].expandAll = (field && 'expandAll' in field) ?
field.expandAll : false;
this.fieldList[key].pid = (field && 'groupName' in field && field.groupName) ? field.groupName :
this.groupingFieldsInfo[key] ? this.groupingFieldsInfo[key] : undefined;
if (this.isValueFiltersAvail && isValueFilteringEnabled) {
this.fieldList[key].dateMember = [];
this.fieldList[key].members = {};
this.fieldList[key].isMembersFilled = false;
}
this.updateMembersOrder(key);
}
else {
if (!isNullOrUndefined(this.groupedDataType[key])) {
type = this.groupedDataType[key];
}
else {
type = (field && 'dataType' in field && field.dataType && dataTypes.indexOf(field.dataType.toLowerCase()) > -1) ?
field.dataType.toLowerCase() : type;
}
this.fieldList[key] = {
caption: (field && 'caption' in field && field.caption) ? field.caption : key,
id: key,
type: ((key.indexOf('_custom_group') !== -1) || (key.indexOf('_date_group') !== -1)) ?
'string' : (type === undefined || type === 'undefined') ? 'number' : type,
isSelected: false,
sort: isSort ? 'Ascending' : 'None',
filterType: '',
index: index,
filter: [],
isCustomField: ((key.indexOf('_custom_group') !== -1) || (key.indexOf('_date_group') !== -1)),
showRemoveIcon: (field && 'showRemoveIcon' in field) ?
field.showRemoveIcon : true,
showFilterIcon: (field && 'showFilterIcon' in field) ?
field.showFilterIcon : true,
showSortIcon: (field && 'showSortIcon' in field) ?
field.showSortIcon : true,
showNoDataItems: (field && 'showNoDataItems' in field) ?
field.showNoDataItems : false,
isCalculatedField: (field && 'isCalculatedField' in field) ?
field.isCalculatedField : false,
showEditIcon: (field && 'showEditIcon' in field) ?
field.showEditIcon : true,
showValueTypeIcon: (field && 'showValueTypeIcon' in field) ?
field.showValueTypeIcon : true,
allowDragAndDrop: (field && 'allowDragAndDrop' in field) ?
field.allowDragAndDrop : true,
showSubTotals: (field && 'showSubTotals' in field) ?
field.showSubTotals : true,
expandAll: (field && 'expandAll' in field) ?
field.expandAll : false,
pid: (field && 'groupName' in field && field.groupName) ? field.groupName :
this.groupingFieldsInfo[key] ? this.groupingFieldsInfo[key] : undefined,
aggregateType: (field && 'type' in field) ? this.getFieldType(field) :
(((key.indexOf('_custom_group') !== -1) || (key.indexOf('_date_group') !== -1)) ? 'string' :
(type === undefined || type === 'undefined') ? 'number' : type) === 'number' ? 'Sum' : 'Count',
baseField: (field && 'baseField' in field) ?
field.baseField : undefined,
baseItem: (field && 'baseItem' in field) ?
field.baseItem : undefined
};
this.updateMembersOrder(key);
}
index++;
}
}
else {
this.fieldList = {};
var index = 0;
var _loop_2 = function () {
var key = keys[index];
var field = this_2.getMappingField(key, this_2.dataSourceSettings.fieldMapping);
if (!isNullOrUndefined(this_2.groupedDataType[key])) {
type = this_2.groupedDataType[key];
}
else {
type = (field && 'dataType' in field && field.dataType && dataTypes.indexOf(field.dataType.toLowerCase()) > -1) ?
field.dataType.toLowerCase() : PivotUtil.getType(fields[this_2.fieldKeys[key]]);
}
if (type === undefined || type === 'undefined') {
if (this_2.dataSourceSettings.groupSettings.length > 0) {
this_2.dataSourceSettings.groupSettings.forEach(function (setting) {
if (_this.fieldKeys[key] === setting.name && setting.type.toLocaleLowerCase() === 'number') {
type = 'string';
}
else {
type = 'number';
}
});
}
else {
type = 'number';
}
}
this_2.fieldList[key] = {
id: key,
pid: (field && 'groupName' in field && field.groupName) ? field.groupName :
this_2.groupingFieldsInfo[key] ? this_2.groupingFieldsInfo[key] : undefined,
caption: (field && 'caption' in field && field.caption) ? field.caption : key,
type: ((key.indexOf('_custom_group') !== -1) || (key.indexOf('_date_group') !== -1)) ?
'string' : type,
filterType: '',
index: index,
filter: [],
sort: isSort ? 'Ascending' : 'None',
isSelected: false,
isCustomField: ((key.indexOf('_custom_group') !== -1) || (key.indexOf('_date_group') !== -1)),
showFilterIcon: (field && 'showFilterIcon' in field) ?
field.showFilterIcon : true,
showRemoveIcon: (field && 'showRemoveIcon' in field) ?
field.showRemoveIcon : true,
showSortIcon: (field && 'showSortIcon' in field) ?
field.showSortIcon : true,
showEditIcon: (field && 'showEditIcon' in field) ?
field.showEditIcon : true,
showValueTypeIcon: (field && 'showValueTypeIcon' in field) ?
field.showValueTypeIcon : true,
allowDragAndDrop: (field && 'allowDragAndDrop' in field) ?
field.allowDragAndDrop : true,
showSubTotals: (field && 'showSubTotals' in field) ?
field.showSubTotals : true,
showNoDataItems: (field && 'showNoDataItems' in field) ?
field.showNoDataItems : false,
isCalculatedField: (field && 'isCalculatedField' in field) ?
field.isCalculatedField : false,
expandAll: (field && 'expandAll' in field) ?
field.expandAll : false,
aggregateType: (field && 'type' in field) ? this_2.getFieldType(field) :
(((key.indexOf('_custom_group') !== -1) || (key.indexOf('_date_group') !== -1)) ? 'string' :
(type === undefined || type === 'undefined') ? 'number' : type) === 'number' ? 'Sum' : 'Count',
baseField: (field && 'baseField' in field) ?
field.baseField : undefined,
baseItem: (field && 'baseItem' in field) ?
field.baseItem : undefined
};
this_2.updateMembersOrder(key);
index++;
};
var this_2 = this;
while (index < len) {
_loop_2();
}
}
this.groupedDataType = {};
this.updateTreeViewData(dataFields);
};
PivotEngine.prototype.getFieldType = function (field) {
if (!isNullOrUndefined(field.dataType) && field.dataType !== 'number' && field.type !== 'DistinctCount' &&
field.type !== 'Count') {
field.type = 'Count';
}
return field.type;
};
PivotEngine.prototype.updateMembersOrder = function (key) {
for (var _i = 0, _a = this.dataSourceSettings.sortSettings; _i < _a.length; _i++) {
var sortInfo = _a[_i];
if (key === sortInfo.name && sortInfo.membersOrder) {
this.fieldList[key].membersOrder = sortInfo.membersOrder;
break;
}
}
};
PivotEngine.prototype.getMappingField = function (key, fieldMapping) {
var field = {};
if (fieldMapping && fieldMapping.length > 0) {
for (var index = 0, cnt = fieldMapping.length; index < cnt; index++) {
if (fieldMapping[index].name === key) {
field = fieldMapping[index];
break;
}
}
}
return field;
};
PivotEngine.prototype.updateFieldList = function (savedFieldList) {
var keys = this.fields;
var len = keys.length;
while (len--) { /** while is used for better performance than for */
this.fieldList[keys[len]].isExcelFilter = savedFieldList[keys[len]].isExcelFilter;
}
};
PivotEngine.prototype.updateTreeViewData = function (fields) {
var _this = this;
var cnt = fields.length;
var lnt = this.dataSourceSettings.calculatedFieldSettings.length;
while (cnt--) {
if (this.fieldList[fields[cnt].name]) {
var field = this.fieldList[fields[cnt].name];
field.type = fields[cnt].dataType ? fields[cnt].dataType.toLowerCase() : field.type;
field.caption = fields[cnt].caption ? fields[cnt].caption : fields[cnt].name;
field.isSelected = true;
field.showNoDataItems = fields[cnt].showNoDataItems;
field.aggregateType = this.getFieldType(fields[cnt]);
field.baseField = fields[cnt].baseField;
field.baseItem = fields[cnt].baseItem;
field.allowDragAndDrop = fields[cnt].allowDragAndDrop;
field.showFilterIcon = fields[cnt].showFilterIcon;
field.showSortIcon = fields[cnt].showSortIcon;
field.showRemoveIcon = fields[cnt].showRemoveIcon;
field.showValueTypeIcon = fields[cnt].showValueTypeIcon;
field.showEditIcon = fields[cnt].showEditIcon;
field.showSubTotals = fields[cnt].showSubTotals;
field.expandAll = fields[cnt].expandAll;
}
}
while (lnt--) {
if (this.fieldList[this.dataSourceSettings.calculatedFieldSettings[lnt].name]) {
this.fieldList[this.dataSourceSettings.calculatedFieldSettings[lnt].name].aggregateType = 'CalculatedField';
this.fieldList[this.dataSourceSettings.calculatedFieldSettings[lnt].name].isCalculatedField = true;
this.fieldList[this.dataSourceSettings.calculatedFieldSettings[lnt].name].formula
= this.dataSourceSettings.calculatedFieldSettings[lnt].formula;
}
}
var unBoundFields = this.dataSourceSettings.groupSettings.filter(function (groupSetting) {
return !fields.some(function (field) { return groupSetting.name === field.name; });
});
var groupingTypes = [
'_date_group_years',
'_date_group_quarters',
'_date_group_quarterYear',
'_date_group_months',
'_date_group_days',
'_date_group_hours',
'_date_group_minutes',
'_date_group_seconds'
];
unBoundFields.forEach(function (unBoundField) {
var fieldName = unBoundField.name;
var fieldType = unBoundField.type.toLowerCase();
Object.keys(_this.fieldList).forEach(function (key) {
if (fieldType === 'date' && !isNullOrUndefined(unBoundField.caption) &&
(groupingTypes.some(function (dateType) { return key === "" + fieldName + dateType; }) || key === fieldName)) {
_this.fieldList[key].caption =
_this.fieldList[key].caption.replace(unBoundField.name, unBoundField.caption);
}
else if (fieldType === 'custom' && !isNullOrUndefined(unBoundField.caption) && key === fieldName + "_custom_group") {
_this.fieldList[key].caption = unBoundField.caption;
}
else if (fieldType === 'number' && !isNullOrUndefined(unBoundField.caption) && key === fieldName) {
_this.fieldList[key].caption = unBoundField.caption;
}
});
});
};
PivotEngine.prototype.getCalculatedField = function (keys) {
for (var _i = 0, _a = this.dataSourceSettings.calculatedFieldSettings; _i < _a.length; _i++) {
var field = _a[_i];
this.calculatedFields[field.name] = extend({}, field, null, true);
this.calculatedFields[field.name].actualFormula = field.formula;
}
var fieldKeys = Object.keys(this.calculatedFields);
var _loop_3 = function (calc, cnt) {
var field = this_3.calculatedFields[fieldKeys[calc]];
var calcProperties = field.properties;
var actualFormula = (calcProperties ? calcProperties.formula : field.formula).trim();
var formula = actualFormula.replace(/"/g, '');
field.formula = formula.indexOf('^') > -1 ? this_3.powerFunction(formula) : formula;
if (field.formula.indexOf('Math.min(') === -1 && field.formula.indexOf('min(') > -1) {
field.formula = field.formula.replace(/min\(/g, 'Math.min(');
}
if (field.formula.indexOf('Math.max(') === -1 && field.formula.indexOf('max(') > -1) {
field.formula = field.formula.replace(/max\(/g, 'Math.max(');
}
if (field.formula.indexOf('Math.abs(') === -1 && field.formula.indexOf('abs(') > -1) {
field.formula = field.formula.replace(/abs\(/g, 'Math.abs(');
}
field.name = calcProperties ? calcProperties.name : field.name;
if (this_3.dataSourceSettings.type === 'CSV') {
if (keys.indexOf(field.name) === -1) {
keys.push(field.name);
}
}
else {
keys = keys.filter(function (key) { return key !== field.name; });
keys.push(field.name);
}
var formulaType = actualFormula.split('"');
for (var len = 0, lmt = formulaType.length; len < lmt; len++) {
var type = formulaType[len].trim();
var aggregateValue = type.split(/[ .:;?!~,`"&|()<>{}[\]\r\n/\\]+/);
var matchStrings = type.match(/^([^()]+)\((.*)\)$/);
var selectedString = (aggregateValue[0] === 'DistinctCount' ?
'DistinctCount' : aggregateValue[0] === 'PopulationStDev' ?
'PopulationStDev' : aggregateValue[0] === 'SampleStDev' ? 'SampleStDev' : aggregateValue[0] === 'PopulationVar' ?
'PopulationVar' : aggregateValue[0] === 'SampleVar' ? 'SampleVar' : aggregateValue[0]);
if (['Sum', 'Count', 'Min', 'Max', 'Avg', 'Product', 'DistinctCount',
'PopulationStDev', 'SampleStDev', 'PopulationVar', 'SampleVar', 'Median'].indexOf(selectedString) !== -1) {
var index = (keys.indexOf(aggregateValue[1]) === -1 && matchStrings[2]) ?
keys.indexOf(matchStrings[2]) : keys.indexOf(aggregateValue[1]);
if (!this_3.calculatedFormulas[field.name]) {
this_3.calculatedFormulas[field.name] = [{
index: index,
type: selectedString,
formula: type
}];
}
else {
this_3.calculatedFormulas[field.name].push({
index: index,
type: selectedString,
formula: type
});
}
}
}
};
var this_3 = this;
for (var calc = 0, cnt = fieldKeys.length; calc < cnt; calc++) {
_loop_3(calc, cnt);
}
this.fields = keys;
};
PivotEngine.prototype.validateFilters = function (data) {
this.isValueFiltersAvail = false;
var filterElements = data.filterSettings ? data.filterSettings : [];
var dataFields = extend([], this.dataSourceSettings.rows, null, true);
dataFields = dataFields.concat(this.dataSourceSettings.columns);
for (var _i = 0, filterElements_1 = filterElements; _i < filterElements_1.length; _i++) {
var filter = filterElements_1[_i];
for (var _a = 0, dataFields_1 = dataFields; _a < dataFields_1.length; _a++) {
var field = dataFields_1[_a];
if (filter.name === field.name && filter.type === 'Value') {
this.isValueFiltersAvail = true;
break;
}
}
if (this.isValueFiltersAvail) {
break;
}
}
};
PivotEngine.prototype.validateValueFields = function () {
this.isValueHasAdvancedAggregate = false;
for (var _i = 0, _a = this.dataSourceSettings.values; _i < _a.length; _i++) {
var value = _a[_i];
if ((['DifferenceFrom', 'PercentageOfDifferenceFrom', 'PercentageOfParentRowTotal', 'PercentageOfParentColumnTotal', 'PercentageOfParentTotal', 'RunningTotals', 'PercentageOfRunningTotals']).indexOf(value.type) !== -1) {
this.isValueHasAdvancedAggregate = true;
break;
}
}
};
/**
* It is used to update the current field members.
*
* @param {string} fieldName - Current field Name.
* @returns {void}
* @hidden
*/
PivotEngine.prototype.fetchFieldMembers = function (fieldName) {
var fieldPosition = this.fieldList[fieldName].index;
this.generateMembers(fieldPosition, new Set());
};
PivotEngine.prototype.generateMembers = function (kl, formulaFields) {
var dlen = this.data.length;
var keys = this.fields;
var fList = this.fieldList;
var key = keys[kl];
if (!fList[key].members || this.allowDataCompression) {
fList[key].members = {};
if (this.allowDataCompression) {
fList[key].isMembersFilled = false;
}
}
if (!fList[key].dateMember || this.allowDataCompression) {
fList[key].dateMember = [];
}
var members = fList[key].members;
var dateMember = fList[key].dateMember;
if ((fList[key].isSelected || formulaFields.has(kl)) && !fList[key].isMembersFilled) {
var isDataAvail = Object.keys(members).length > 0;
var membersCnt = 0;
var isFieldHasExpandAll = fList[key].expandAll;
var isDateType = PivotUtil.isDateField(key, this);
//let sort: string[] = [];
for (var dl = 0; dl < dlen; dl++) {
var memberkey = this.data[dl][this.fieldKeys[key]];
var mkey = memberkey;
mkey = this.enableHtmlSanitizer ? SanitizeHtmlHelper.sanitize(mkey) : mkey;
// if (!isNullOrUndefined(mkey)) {
if (!isDataAvail) {
var formattedValue = isDateType ? this.getFormattedValue(mkey, key) : ({
formattedText: mkey === null ? (this.localeObj ? this.localeObj.getConstant('null') : String(mkey)) :
mkey === undefined ? (this.localeObj ? (key in this.groupingFields) ?
this.localeObj.getConstant('groupOutOfRange') : this.localeObj.getConstant('undefined') :
String(mkey)) : mkey.toString(), actualText: mkey === null ? (this.localeObj ?
this.localeObj.getConstant('null') : String(mkey)) : mkey === undefined ? (this.localeObj ?
(key in this.groupingFields) ? this.localeObj.getConstant('groupOutOfRange') :
this.localeObj.getConstant('undefined') : String(mkey)) : mkey
});
if (!Object.prototype.hasOwnProperty.call(members, mkey)) {
membersCnt++;
members[mkey] = {
index: [dl], ordinal: membersCnt,
isDrilled: this.isExpandAll || isFieldHasExpandAll,
caption: formattedValue.formattedText
};
dateMember.push({ formattedText: formattedValue.formattedText, actualText: isDateType ?
formattedValue.dateText : formattedValue.actualText });
//sort.push(mkey);
}
else {
members[mkey].index.push(dl);
}
}
var memberName = isNullOrUndefined(memberkey) ? memberkey : fList[key].type === 'number' ?
(!isNaN(Number(memberkey)) ? Number(memberkey) : undefined) : 1;
var valueMatrixInfo = {
ordinal: members[mkey].ordinal,
member: memberName
};
if (!(this.valueMatrix[dl])) {
this.valueMatrix[dl] = [];
}
this.valueMatrix[dl][kl] = valueMatrixInfo;
// }
}
fList[key].isMembersFilled = true;
}
};
PivotEngine.prototype.fillFieldMembers = function () {
var keys = this.fields;
var fList = this.fieldList;
var kLn = keys.length;
if (this.data.length - this.valueMatrix.length < 0) {
this.valueMatrix = this.valueMatrix.slice(0, this.data.length);
}
var formulaFields = new Set();
if (this.calculatedFormulas && Object.keys(this.calculatedFormulas).length > 0) {
for (var key in this.calculatedFormulas) {
if (fList[key] && fList[key].isSelected) {
var calculatedFormulas = this.calculatedFormulas[key];
for (var i = 0; i < calculatedFormulas.length; i++) {
var values = calculatedFormulas[i];
formulaFields.add(values.index);
}
}
}
}
for (var kl = 0; kl < kLn; kl++) {
this.generateMembers(kl, formulaFields);
/*sort = Object.keys(members).sort();
let sortedMembers: Members = {};
for (let sln: number = 0, slt: number = sort.length; sln < slt; sln++) {
sortedMembers[sort[sln]] = members[sort[sln]];
}
fList[key].members = sortedMembers; */
}
};
PivotEngine.prototype.generateValueMatrix = function () {
var keys = this.fields;
var len = this.data.length;
var keyLen = keys.length;
var flList = this.fieldList;
while (len--) {
var tkln = keyLen;
//if (isNullOrUndefined(vMat[len as number])) {
//}
while (tkln--) {
var key = keys[tkln];
var field = flList[key];
if (field.isMembersFilled) {
var fieldValue = this.data[len][this.fieldKeys[key]];
this.valueMatrix[len][tkln].member =
isNullOrUndefined(fieldValue) ? fieldValue : (field.type === 'number' ?
(!isNaN(Number(fieldValue)) ? Number(fieldValue) : undefined) : 1);
}
}
}
};
PivotEngine.prototype.updateSortSettings = function (sortSettings, isSort) {
for (var sln = 0, slt = sortSettings ? sortSettings.length : 0; sln < slt && isSort; sln++) {
if (this.fieldList[sortSettings[sln].name]) {
this.fieldList[sortSettings[sln].name].sort = sortSettings[sln].order;
}
}
};
PivotEngine.prototype.updateFilterMembers = function (source) {
var filterRw = this.filterMembers;
var list = {};
//let eList: {[key: string] : number} = {};
var isInclude = this.getFilters(source, list);
//this.getFilterExcludeList(source.rows, flist);
//this.getFilterExcludeList(source.columns, flist);
//this.getFilterExcludeList(source.filters, flist);
// let filters: Iterator = isInclude ? iList : eList;
var dln = this.valueMatrix.length;
if (isInclude) {
var keys = list.include.index;
for (var ln = 0; ln < keys.length; ln++) {
if (list.exclude === undefined || list.exclude.indexObject[keys[ln]] === undefined) {
filterRw.push(keys[ln]);
}
}
}
else {
for (var ln = 0; ln < dln; ln++) {
if (list.exclude === undefined || list.exclude.indexObject[ln] === undefined) {
filterRw.push(ln);
}
}
}
};
PivotEngine.prototype.getFilters = function (source, ilist) {
var filterElements = source.filterSettings ? source.filterSettings : [];
var isInclude = false;
var filter = [];
for (var rln = 0, rlt = filterElements.length; rln < rlt; rln++) {
var filterElement = filterElements[rln].properties ?
filterElements[rln].properties : filterElements[rln];
if (this.fieldList[filterElement.name] &&
this.fieldList[filterElement.name].isSelected &&
this.isValidFilterField(filterElement, source.allowMemberFilter, source.allowLabelFilter)) {
this.applyLabelFilter(filterElement);
if (filterElement) {
filter = filterElement.items;
}
if (filterElement.type && filterElement.type === 'Include') {
this.frameFilterList(filter, filterElement.name, ilist, 'include', filterElement.showLabelFilter, isInclude);
isInclude = true;
}
else {
this.frameFilterList(filter, filterElement.name, ilist, 'exclude', filterElement.showLabelFilter);
}
if (filterElement.showLabelFilter) {
filterElement.items = [];
filterElement.type = filterElement.showDateFilter ? 'Date' : filterElement.showNumberFilter ? 'Number' : 'Label';
}
}
}
/* for (let cln: number = 0, clt: number = cols.length; cln < clt; cln ++) {
filter = cols[cln as number].filter ? cols[cln as number].filter.items : [];
if (filter.length && cols[cln as number].filter.type && cols[cln as number].filter.type === 'include') {
//type = cols[cln as number].filter.type;
this.frameFilterList(filter, cols[cln as number].name, ilist, 'include', isInclude);
isInclude = true;
} else {
this.frameFilterList(filter, cols[cln as number].name, ilist, 'exclude');
}
}
for (let vln: number = 0, vlt: number = filters.length; vln < vlt; vln ++) {
filter = filters[vln].filter ? filters[vln].filter.items : [];
if (filter.length && filters[vln].filter.type && filters[vln].filter.type === 'include') {
this.frameFilterList(filter, filters[vln].name, ilist, 'include', isInclude);
isInclude = true;
} else {
this.frameFilterList(filter, filters[vln].name, ilist, 'exclude');
}
} */
return isInclude;
};
PivotEngine.prototype.isValidFilterField = function (filterElement, allowMemberFiltering, allowLabelFiltering) {
var fieldName = filterElement.name;
var isValidFilterElement = false;
var filterTypes = ['Include', 'Exclude'];
var dataFields = extend([], this.dataSourceSettings.rows, null, true);
dataFields = dataFields.concat(this.dataSourceSettings.columns);
if (this.fieldList[fieldName].isSelected && allowMemberFiltering && filterTypes.indexOf(filterElement.type) >= 0) {
isValidFilterElement = true;
for (var _i = 0, _a = this.dataSourceSettings.values; _i < _a.length; _i++) {
var field = _a[_i];
if (fieldName === field.name) {
isValidFilterElement = false;
break;
}
}
}
else if (allowLabelFiltering) {
for (var _b = 0, dataFields_2 = dataFields; _b < dataFields_2.length; _b++) {
var field = dataFields_2[_b];
if (fieldName === field.name &&
(['Label', 'Date', 'Number'].indexOf(filterElement.type) >= 0)) {
isValidFilterElement = true;
break;
}
}
}
return isValidFilterElement;
};
PivotEngine.prototype.applyLabelFilter = function (filterElement) {
if (['Label', 'Date', 'Number'].indexOf(filterElement.type) >= 0) {
var members = Object.keys(this.fieldList[filterElement.name].members);
filterElement.showLabelFilter = true;
if (filterElement.type === 'Label') {
filterElement.items = this.getLabelFilterMembers(members, filterElement.condition, filterElement.value1, filterElement.value2);
}
else if (filterElement.type === 'Date') {
filterElement.showDateFilter = true;
var date1 = typeof (filterElement.value1) === 'string' ?
new Date(filterElement.value1) : filterElement.value1;
var date2 = typeof (filterElement.value2) === 'string' ?
new Date(filterElement.value2) : filterElement.value2;
filterElement.items = this.getDateFilterMembers(members, filterElement.name, filterElement.condition, date1, date2);
}
else {
filterElement.showNumberFilter = true;
filterElement.items = [];
for (var _i = 0, members_1 = members; _i < members_1.length; _i++) {
var member = members_1[_i];
var operand1 = this.getParsedValue(filterElement.name, filterElement.value1);
var operand2 = this.getParsedValue(filterElement.name, filterElement.value2);
var cValue = this.getParsedValue(filterElement.name, member);
if (this.validateFilterValue(cValue, filterElement.condition, operand1, operand2)) {
filterElement.items.push(member);
}
}
}
var excludeOperators = ['DoesNotBeginWith', 'DoesNotContains', 'DoesNotEndsWith', 'DoesNotEquals', 'NotBetween'];
filterElement.type = (filterElement.condition ? (excludeOperators.indexOf(filterElement.condition) > -1 &&
!filterElement.showNumberFilter) ? 'Exclude' : 'Include' : 'Exclude');
}
else {
filterElement.showLabelFilter = false;
}
};
PivotEngine.prototype.getLabelFilterMembers = function (members, operator, value1, value2) {
var items = [];
for (var _i = 0, members_2 = members; _i < members_2.length; _i++) {
var member = members_2[_i];
var filterValue = member.toLowerCase();
if (value1.toString()) {
switch (operator) {
case 'Equals':
case 'DoesNotEquals':
if (filterValue === value1.toLowerCase()) {
items.push(member);
}
break;
case 'BeginWith':
case 'DoesNotBeginWith':
if (filterValue.indexOf(value1.toLowerCase()) === 0) {
items.push(member);
}
break;
case 'EndsWith':
case 'DoesNotEndsWith':
if (filterValue.match(value1.toLowerCase() + '$') !== null) {
items.push(member);
}
break;
case 'Contains':
case 'DoesNotContains':
if (filterValue.indexOf(value1.toLowerCase()) > -1) {
items.push(member);
}
break;
case 'GreaterThan':
if (filterValue > value1.toLowerCase()) {
items.push(member);
}
break;
case 'GreaterThanOrEqualTo':
if (filterValue >= value1.toLowerCase()) {
items.push(member);
}
break;
case 'LessThan':
if (filterValue < value1.toLowerCase()) {
items.push(member);
}
break;
case 'LessThanOrEqualTo':
if (filterValue <= value1.toLowerCase()) {
items.push(member);
}
break;
case 'Between':
case 'NotBetween':
if ((filterValue >= value1.toLowerCase()) && (filterValue <= value2.toLowerCase())) {
items.push(member);
}
break;
default:
if (filterValue === value1.toLowerCase()) {
items.push(member);
}
break;
}
}
}
return items;
};
PivotEngine.prototype.getDateFilterMembers = function (members, name, operator, value1, value2) {
var items = [];
for (var _i = 0, members_3 = members; _i < members_3.length; _i++) {
var member = members_3[_i];
var filterValue = new Date(member);
if (value1) {
switch (operator) {
case 'Equals':
case 'DoesNotEquals':
if (this.getFormattedValue(filterValue.toString(), name).formattedText === this.getFormattedValue(value1.toString(), name).formattedText) {
items.push(this.getFormattedValue(member, name).formattedText);
}
break;
case 'After':
if (filterValue.getTime() > value1.getTime()) {
items.push(this.getFormattedValue(member, name).formattedText);
}
break;
case 'AfterOrEqualTo':
if (filterValue.getTime() >= value1.getTime()) {
items.push(this.getFormattedValue(member, name).formattedText);
}
break;
case 'Before':
if (filterValue.getTime() < value1.getTime()) {
items.push(this.getFormattedValue(member, name).formattedText);
}
break;
case 'BeforeOrEqualTo':
if (filterValue.getTime() <= value1.getTime()) {
items.push(this.getFormattedValue(member, name).formattedText);
}
break;
case 'Between':
case 'NotBetween':
if ((filterValue.getTime() >= value1.getTime()) &&
(filterValue.getTime() <= value2.getTime())) {
items.push(this.getFormattedValue(member, name).formattedText);
}
break;
default:
if (this.getFormattedValue(filterValue.toString(), name).formattedText === this.getFormattedValue(value1.toString(), name).formattedText) {
items.push(this.getFormattedValue(member, name).formattedText);
}
break;
}
}
}
return items;
};
PivotEngine.prototype.validateFilterValue = function (val, operator, value1, value2) {
var isMemberInclude = false;
if (typeof (value1) === 'number') {
switch (operator) {
case 'Equals':
if (val === value1) {
isMemberInclude = true;
}
break;
case 'DoesNotEquals':
if (val !== value1) {
isMemberInclude = true;
}
break;
case 'GreaterThan':
if (val > value1) {
isMemberInclude = true;
}
break;
case 'GreaterThanOrEqualTo':
if (val >= value1) {
isMemberInclude = true;
}
break;
case 'LessThan':
if (val < value1) {
isMemberInclude = true;
}
break;
case 'LessThanOrEqualTo':
if (val <= value1) {
isMemberInclude = true;
}
break;
case 'Between':
if ((val >= value1) && (val <= value2)) {
isMemberInclude = true;
}
break;
case 'NotBetween':
if (!((val >= value1) && (val <= value2))) {
isMemberInclude = true;
}
break;
default:
if (val !== value1) {
isMemberInclude = true;
}
break;
}
}
return isMemberInclude;
};
PivotEngine.prototype.frameFilterList = function (filter, name, list, type, isLabelFilter, isInclude) {
if (!list[type]) {
list[type] = { indexObject: {}, index: [] };
this.updateFilter(filter, name, list, type, isLabelFilter, isInclude);
}
else {
this.updateFilter(filter, name, list, type, isLabelFilter, isInclude);
}
};
PivotEngine.prototype.updateFilter = function (filter, name, list, type, isLabelFilter, isInclude) {
var fln = 0;
var field = this.fieldList[name];
field.filter = filter;
field.filterType = type;
field.isExcelFilter = isLabelFilter;
var isGroupedField = name in this.groupingFields;
var members = PivotUtil.getFormattedMembers(field.members, name, this, isLabelFilter, isGroupedField);
var allowFil = isInclude;
var final = {};
var filterObj = {};
final[type] = { indexObject: {}, index: [] };
this.fieldFilterMem[name] = { memberObj: {} };
while (!isNullOrUndefined(filter[fln])) {
if (members[filter[fln]]) {
var indx = members[filter[fln]].index;
if (type === 'include') {
for (var iln = 0, ilt = indx.length; iln < ilt; iln++) {
if (!allowFil || list[type].indexObject[indx[iln]] !== undefined) {
final[type].indexObject[indx[iln]] = indx[iln];
final[type].index.push(indx[iln]);
}
}
}
else {
for (var iln = 0, ilt = indx.length; iln < ilt; iln++) {
if (list[type].indexObject[indx[iln]] === undefined) {
list[type].indexObject[indx[iln]] = indx[iln];
list[type].index.push(indx[iln]);
}
}
this.fieldFilterMem[name].memberObj[filter[fln]] = filter[fln];
}
}
fln++;
}
if (type === 'include') {
list[type] = final[type];
for (var iln = 0; iln < filter.length; iln++) {
if (members[filter[iln]]) {
filterObj[filter[iln]] = filter[iln];
}
}
var items = Object.keys(members);
for (var iln = 0, ilt = items.length; iln < ilt; iln++) {
if (filterObj[items[iln]] === undefined) {
this.fieldFilterMem[name].memberObj[items[iln]] = items[iln];
}
}
}
};
PivotEngine.prototype.applyValueFiltering = function (rowData, level, rows, columns, valueFilter, rowFilterData, type) {
this.isValueFiltered = false;
var allMember = extend({}, (type === 'row' && this.rowGrandTotal ? this.rowGrandTotal : type === 'column' && this.columnGrandTotal ? this.columnGrandTotal : (!(this.dataSourceSettings.grandTotalsPosition === 'Top') ? rows[rows.length - 1] : rows[0])), null, true);
this.getFilteredData(rows, columns, valueFilter, rowFilterData, level, rowData.name, allMember, type);
if (this.isValueFiltered) {
if ((type === 'row' && this.rowGrandTotal === null) || (type === 'column' && this.columnGrandTotal === null)) {
rowFilterData.push(allMember);
}
rows = rowFilterData;
}
return rows;
};
PivotEngine.prototype.getFilteredData = function (rows, columns, filterSettings, rowFilterData, level, fieldName, allMember, type) {
var rLen = rows.length;
for (var i = 0; i < rLen; i++) {
if (filterSettings[fieldName]) {
if (rows[i].level === level) {
this.isValueFiltered = true;
this.fieldList[fieldName].isExcelFilter = true;
var value = 0;
var measure = filterSettings[fieldName].measure;
var mPos = this.fieldList[measure].index;
var aggregate = this.fieldList[measure].aggregateType;
this.rawIndexObject = {};
value = (type === 'row' ? this.getAggregateValue(rows[i].index, columns.indexObject, mPos, aggregate, false) :
this.getAggregateValue(columns.index, rows[i].indexObject, mPos, aggregate, false));
var cellDetails = {
fieldName: measure,
row: rows[i],
column: columns,
value: value,
cellSets: this.getValueCellInfo ? this.getCellSet(this.rawIndexObject) : [],
rowCellType: (rows[i].hasChild && rows[i].isDrilled ? 'subTotal' : rows[i].type === 'grand sum' ? 'grandTotal' : 'value'),
columnCellType: (columns.hasChild && columns.isDrilled ? 'subTotal' : columns.type === 'grand sum' ? 'grandTotal' : 'value'),
aggregateType: aggregate,
skipFormatting: false
};
if (this.getValueCellInfo) {
this.getValueCellInfo(cellDetails);
}
value = cellDetails.value;
this.rawIndexObject = {};
var condition = filterSettings[fieldName].condition;
if (condition === 'Top' || condition === 'Bottom') {
var levelName = rows[i].valueSort ? rows[i].valueSort.levelName : '';
var topBottomSet = this.applyTopBottomFiltering(fieldName, level, rows, filterSettings[fieldName], levelName, columns, type);
var memberId = rows[i].actualText;
if (!topBottomSet.has(memberId) && rows[i].type !== 'grand sum') {
var data = this.removefilteredData(rows[i], this.valueFilteredData);
var row = data ? data : rows[i];
this.validateFilteredParentData(row, this.valueFilteredData, allMember, 0, level, type);
}
else if (rows[i].type !== 'grand sum') {
rowFilterData.push(extend({}, rows[i], null, true));
rowFilterData[rowFilterData.length - 1].isLevelFiltered = true;
}
}
else {
var operand1 = this.getParsedValue(measure, filterSettings[fieldName].value1);
var operand2 = this.getParsedValue(measure, filterSettings[fieldName].value2);
if (!this.validateFilterValue(value, filterSettings[fieldName].condition, operand1, operand2) && rows[i].type !== 'grand sum') {
var data = this.removefilteredData(rows[i], this.valueFilteredData);
var row = data ? data : rows[i];
this.validateFilteredParentData(row, this.valueFilteredData, allMember, 0, level, type);
}
else if (rows[i].type !== 'grand sum') {
rowFilterData.push(extend({}, rows[i], null, true));
rowFilterData[rowFilterData.length - 1].isLevelFiltered = true;
}
}
}
else if (rows[i].hasChild && rows[i].members.length > 0 && rows[i].type !== 'grand sum') {
rowFilterData.push(extend({}, rows[i], null, true));
rowFilterData[rowFilterData.length - 1].members = [];
rowFilterData[rowFilterData.length - 1].isLevelFiltered = true;
this.getFilteredData(rows[i].members, columns, filterSettings, rowFilterData[rowFilterData.length - 1].members, level, fieldName, allMember, type);
}
}
}
};
PivotEngine.prototype.getParsedValue = function (measure, value) {
var cValue = value ? value.toString() : '';
if (this.formatFields[measure] && value) {
var formatSetting = extend({}, this.formatFields[measure], null, true);
delete formatSetting.name;
return this.globalize.parseNumber(cValue, formatSetting);
}
else {
return this.globalize.parseNumber(cValue, { format: 'N' });
}
};
PivotEngine.prototype.removefilteredData = function (row, rowFilterData) {
var rows = extend([], rowFilterData, null, true);
var filteredData;
for (var i = 0; i < rows.length; i++) {
if (row.isLevelFiltered && row.axis === rows[i].axis &&
row.valueSort.levelName === rows[i].valueSort.levelName &&
row.actualText === rows[i].actualText && row.axis === rows[i].axis &&
row.level === rows[i].level && row.ordinal === rows[i].ordinal) {
filteredData = rows[i];
rowFilterData.splice(i, 1);
break;
}
else if (rowFilterData[i].hasChild && rowFilterData[i].members.length > 0) {
this.removefilteredData(row, rowFilterData[i].members);
}
}
return filteredData;
};
PivotEngine.prototype.applyTopBottomFiltering = function (fieldName, level, members, filter, parentLevelName, columns, filterType) {
var cacheKey = fieldName + '_' + level + '_' + (parentLevelName || 'global') + '_' + filter.condition + '_' + filter.measure + '_' + filter.value1;
if (this.topBottomFilterCache[cacheKey]) {
return this.topBottomFilterCache[cacheKey];
}
var count;
var parsedValue = parseInt(filter.value1, 10);
if (isNaN(parsedValue)) {
count = 10;
}
else {
count = parsedValue;
}
var topBottomSet = new Set();
if (count <= 0) {
this.topBottomFilterCache[cacheKey] = topBottomSet;
return topBottomSet;
}
var memberValues = [];
var rLen = members.length;
var measure = filter.measure;
var mPos = this.fieldList[measure].index;
var aggregate = this.fieldList[measure].aggregateType;
for (var i = 0; i < rLen; i++) {
if (members[i].level === level && members[i].type !== 'grand sum' && members[i].type !== 'sum') {
var aggregateValue = 0;
var member = members[i];
this.rawIndexObject = {};
if (filterType === 'row') {
aggregateValue = this.getAggregateValue(member.index, columns.indexObject, mPos, aggregate, false);
}
else {
aggregateValue = this.getAggregateValue(columns.index, member.indexObject, mPos, aggregate, false);
}
this.rawIndexObject = {};
memberValues.push({
memberId: member.actualText,
memberName: member.actualText,
aggregateValue: aggregateValue,
member: member
});
}
}
var condition = filter.condition;
var nonEmptyMembers = memberValues.filter(function (member) {
return member.aggregateValue !== undefined && member.aggregateValue !== null && member.aggregateValue !== 0;
});
if (condition === 'Top') {
nonEmptyMembers.sort(function (a, b) {
return b.aggregateValue - a.aggregateValue;
});
}
else if (condition === 'Bottom') {
nonEmptyMembers.sort(function (a, b) {
return a.aggregateValue - b.aggregateValue;
});
}
var len = Math.min(count, nonEmptyMembers.length);
for (var i = 0; i < len; i++) {
topBottomSet.add(nonEmptyMembers[i].memberId);
}
this.topBottomFilterCache[cacheKey] = topBottomSet;
return topBottomSet;
};
PivotEngine.prototype.validateFilteredParentData = function (row, rows, allMemberData, i, level, type) {
if (rows.length > 0) {
for (var _i = 0, rows_1 = rows; _i < rows_1.length; _i++) {
var rowFilteredData = rows_1[_i];
if (rowFilteredData.level === i) {
if (type === 'row') {
var index = row.index;
for (var _a = 0, index_1 = index; _a < index_1.length; _a++) {
var key = index_1[_a];
if (allMemberData.index.indexOf(key) >= 0) {
allMemberData.index.splice(allMemberData.index.indexOf(key), 1);
}
if (((row.valueSort.levelName.toString()).indexOf(rowFilteredData.valueSort.levelName.toString()) >= 0) &&
rowFilteredData.level !== level && rowFilteredData.index.indexOf(key) >= 0) {
rowFilteredData.index.splice(rowFilteredData.index.indexOf(key), 1);
}
}
}
else {
var index = row.indexObject;
for (var _b = 0, _c = Object.keys(index); _b < _c.length; _b++) {
var key = _c[_b];
if (Object.prototype.hasOwnProperty.call(index, key)) {
delete allMemberData.indexObject[key];
if (((row.valueSort.levelName.toString()).indexOf(rowFilteredData.valueSort.levelName.toString()) >= 0) &&
rowFilteredData.level !== level) {
delete rowFilteredData.indexObject[key];
}
}
}
}
if (rowFilteredData && rowFilteredData.members.length > 0 &&
rowFilteredData.members[0].level === i + 1 && rowFilteredData.members[0].level !== level) {
this.validateFilteredParentData(row, rowFilteredData.members, allMemberData, i + 1, level, type);
}
}
}
}
else {
if (type === 'row') {
var index = row.index;
for (var _d = 0, index_2 = index; _d < index_2.length; _d++) {
var key = index_2[_d];
if (allMemberData.index.indexOf(key) >= 0) {
allMemberData.index.splice(allMemberData.index.indexOf(key), 1);
}
}
}
else {
var index = row.indexObject;
for (var _e = 0, _f = Object.keys(index); _e < _f.length; _e++) {
var key = _f[_e];
if (Object.prototype.hasOwnProperty.call(index, key)) {
delete allMemberData.indexObject[key];
}
}
}
}
};
PivotEngine.prototype.updateFramedHeaders = function (framedHeaders, dataHeaders, filteredHeaders, headers, type) {
for (var _i = 0, framedHeaders_1 = framedHeaders; _i < framedHeaders_1.length; _i++) {
var dHeader = framedHeaders_1[_i];
this.isHeaderAvail = false;
if (this.validateFilteredHeaders(dHeader, filteredHeaders, type) || dHeader.type === 'grand sum') {
if (type === 'row') {
this.rowCount += this.rowValuesLength;
}
else {
this.columnCount += this.customProperties.isTabularLayout ? (this.rowMaxLevel + this.colValuesLength) :
this.colValuesLength;
}
headers.push(extend({}, dHeader, null, true));
headers[headers.length - 1].members = [];
if (dHeader.hasChild && dHeader.isDrilled && dHeader.members.length > 0) {
this.updateFramedHeaders(dHeader.members, dataHeaders, filteredHeaders, headers[headers.length - 1].members, type);
}
}
}
return this.filterFramedHeaders;
};
PivotEngine.prototype.validateFilteredHeaders = function (dHeader, filteredHeaders, type) {
for (var _i = 0, filteredHeaders_1 = filteredHeaders; _i < filteredHeaders_1.length; _i++) {
var vHeader = filteredHeaders_1[_i];
if (!this.isHeaderAvail) {
if (dHeader.actualText === vHeader.actualText &&
dHeader.level === vHeader.level &&
dHeader.valueSort.levelName === vHeader.valueSort.levelName) {
if (type === 'row') {
if (vHeader.index.length > 0) {
this.isHeaderAvail = true;
dHeader.index = vHeader.index;
return true;
}
else {
this.isHeaderAvail = false;
dHeader.index = vHeader.index;
return false;
}
}
else {
if (Object.keys(vHeader.indexObject).length > 0) {
this.isHeaderAvail = true;
dHeader.indexObject = vHeader.indexObject;
return true;
}
else {
this.isHeaderAvail = false;
dHeader.indexObject = vHeader.indexObject;
return false;
}
}
}
else if (vHeader.hasChild && vHeader.members.length > 0 && vHeader.type !== 'grand sum') {
this.validateFilteredHeaders(dHeader, vHeader.members, type);
}
}
}
return this.isHeaderAvail;
};
PivotEngine.prototype.isEmptyDataAvail = function (rowHeaders, columnHeaders) {
this.isEmptyData = false;
if (rowHeaders.length > 0 && rowHeaders[rowHeaders.length - 1].type === 'grand sum' &&
rowHeaders[rowHeaders.length - 1].index.length === 0) {
this.isEmptyData = true;
}
if (columnHeaders.length > 0 && columnHeaders[columnHeaders.length - 1].type === 'grand sum' &&
Object.keys(columnHeaders[columnHeaders.length - 1].indexObject).length === 0) {
this.isEmptyData = true;
}
if (rowHeaders.length === 0 || columnHeaders.length === 0) {
this.isEmptyData = true;
}
};
/**
* It is used to update the grid data.
*
* @param {IDataOptions} dataSource - It contains the dataSourceSettings.
* @returns {void}
* @hidden
*/
PivotEngine.prototype.updateGridData = function (dataSource) {
this.updateDataSourceSettings(dataSource, true);
this.data = dataSource.dataSource;
if (this.allowDataCompression) {
this.actualData = this.data;
this.data = this.getGroupedRawData(dataSource);
}
for (var _i = 0, _a = this.fields; _i < _a.length; _i++) {
var field = _a[_i];
this.fieldList[field].members = {};
this.fieldList[field].dateMember = [];
this.fieldList[field].isMembersFilled = false;
}
this.fillFieldMembers();
this.filterMembers = [];
this.cMembers = [];
this.rMembers = [];
this.updateFilterMembers(dataSource);
this.isEditing = true;
this.isDrillThrough = true;
this.generateGridData(dataSource);
this.isEditing = false;
};
PivotEngine.prototype.generateGridData = function (dataSource, requireDatasourceUpdate, isExport, headerCollection, isScrolled) {
if (requireDatasourceUpdate === void 0) { requireDatasourceUpdate = false; }
if (isScrolled === void 0) { isScrolled = false; }
if (isNullOrUndefined(headerCollection) && this.customProperties.isTabularLayout) {
this.rowMaxLevel = 0;
}
this.updateDataSourceSettings(dataSource, requireDatasourceUpdate);
var columns = dataSource.columns ? dataSource.columns : [];
var data = this.data;
var rows = dataSource.rows ? dataSource.rows : [];
var filterSettings = dataSource.filterSettings;
var values = dataSource.values ? dataSource.values : [];
this.removeCount = 0;
this.isExpandAll = dataSource.expandAll;
this.drilledMembers = dataSource.drilledMembers ? dataSource.drilledMembers : [];
this.isEmptyData = false;
var filterMembers = [];
var showNoDataItems = (rows[0] && rows[0].showNoDataItems) || (columns[0] && columns[0].showNoDataItems);
// let dataFields: IFieldOptions[] = extend([], this.dataSourceSettings.rows, null, true) as IFieldOptions[];
// dataFields = dataFields.concat(this.dataSourceSettings.columns, this.dataSourceSettings.values, this.dataSourceSettings.filters);
if (showNoDataItems) {
for (var ln = 0; ln < this.valueMatrix.length; ln++) {
filterMembers.push(ln);
}
}
for (var ln = 0; ln < this.filterMembers.length; ln++) {
this.filterPosObj[this.filterMembers[ln]] = this.filterMembers[ln];
}
//let childrens: Field = this.fieldList[rows[0].name + ''];
this.valueSortSettings.columnIndex = undefined;
this.validateValueFields();
this.frameDrillObject();
if (!this.isValueFilterEnabled || this.isEditing) {
if (!headerCollection) {
this.isLastHeaderHasMeasures = true;
this.columnCount = 0;
this.rowCount = 0;
this.cMembers = [];
this.rMembers = [];
this.levelMap = {};
if (rows.length !== 0 && values.length !== 0) {
this.rMembers = this.getIndexedHeaders(rows, data, this.customProperties.isTabularLayout ? this.rowMaxLevel : 0, rows[0].showNoDataItems ? filterMembers :
this.filterMembers, 'row', '', this.allowValueFilter);
this.updateRowMaxLevel();
}
if (columns.length !== 0 && values.length !== 0) {
this.cMembers = this.getIndexedHeaders(columns, data, 0, columns[0].showNoDataItems ? filterMembers : this.filterMembers, 'column', '', this.allowValueFilter);
}
this.insertAllMembersCommon();
this.saveDataHeaders = (this.isValueFiltersAvail && dataSource.allowValueFilter) ? {
rowHeaders: extend([], this.rMembers, null, true),
columnHeaders: extend([], this.cMembers, null, true)
} : {};
}
}
if (this.customProperties.isTabularLayout) {
this.showSubTotalsAtBottom = true;
}
this.pivotValues = [];
this.headerContent = [];
this.valueContent = [];
this.valueFilteredData = [];
this.filterFramedHeaders = [];
var rowheads = [];
var colheads = [];
var rowFilteredData = [];
var columnFilteredData = [];
var updatedRowMembers = [];
var valuesCount = (this.dataSourceSettings.values.length);
if (this.isValueFiltersAvail && dataSource.allowValueFilter && !headerCollection) {
this.valueFilteredData = [];
var rowHeaders = this.saveDataHeaders.rowHeaders ? this.saveDataHeaders.rowHeaders : [];
var columnHeaders = this.saveDataHeaders.columnHeaders ? this.saveDataHeaders.columnHeaders : [];
if (filterSettings.length > 0) {
var valueFilters = {};
var valueFields = {};
for (var _i = 0, values_1 = values; _i < values_1.length; _i++) {
var value = values_1[_i];
valueFields[value.name] = value;
}
for (var _a = 0, filterSettings_1 = filterSettings; _a < filterSettings_1.length; _a++) {
var filter = filterSettings_1[_a];
rowHeaders = (rowFilteredData.length > 0 ? rowFilteredData : rowHeaders);
columnHeaders = (columnFilteredData.length > 0 ? columnFilteredData : columnHeaders);
this.valueFilteredData = [];
var filterElement = filter.properties ?
filter.properties : filter;
if (filterElement.type === 'Value' && this.fieldList[filter.name] && this.fieldList[filter.name].isSelected) {
valueFilters[filter.name] = filter;
filterElement.items = [];
var isAvail = false;
var rLen = rows.length;
var cLen = columns.length;
for (var i = 0; i < rLen; i++) {
if (filterElement.name === rows[i].name && valueFields[filterElement.measure] && !isAvail) {
isAvail = true;
rowFilteredData = this.applyValueFiltering(rows[i], i, rowHeaders, (this.columnGrandTotal ? this.columnGrandTotal : (this.dataSourceSettings.grandTotalsPosition === 'Top' && this.dataSourceSettings.showGrandTotals) ? columnHeaders[0] : columnHeaders[columnHeaders.length - 1]), valueFilters, this.valueFilteredData, 'row');
break;
}
}
for (var j = 0; j < cLen; j++) {
if (filterElement.name === columns[j].name && valueFields[filterElement.measure] && !isAvail) {
isAvail = true;
columnFilteredData = this.applyValueFiltering(columns[j], j, columnHeaders, (this.rowGrandTotal ? this.rowGrandTotal : (this.dataSourceSettings.grandTotalsPosition === 'Top' && this.dataSourceSettings.showGrandTotals) ? rowHeaders[0] : rowHeaders[rowHeaders.length - 1]), valueFilters, this.valueFilteredData, 'column');
break;
}
}
}
}
}
rowFilteredData = (rowFilteredData.length > 0 ? rowFilteredData : rowHeaders);
columnFilteredData = (columnFilteredData.length > 0 ? columnFilteredData : columnHeaders);
this.isEmptyDataAvail(rowFilteredData, columnFilteredData);
var savedFieldList = PivotUtil.getClonedFieldList(this.fieldList);
var fields = this.data[0];
this.getFieldList(fields, this.enableSort, dataSource.allowValueFilter);
this.fillFieldMembers();
this.updateSortSettings(dataSource.sortSettings, this.enableSort);
this.filterMembers = [];
this.updateFilterMembers(dataSource);
this.isLastHeaderHasMeasures = true;
this.rMembers = rows.length !== 0 ?
this.getIndexedHeaders(rows, data, 0, rows[0].showNoDataItems ?
filterMembers : this.filterMembers, 'row', '') : [];
this.cMembers = columns.length !== 0 ?
this.getIndexedHeaders(columns, data, 0, columns[0].showNoDataItems ?
filterMembers : this.filterMembers, 'column', '') : [];
this.insertAllMembersCommon();
this.updateFieldList(savedFieldList);
this.rowCount = 0;
this.columnCount = 0;
this.rMembers = this.updateFramedHeaders(this.rMembers, this.rMembers, rowFilteredData, this.filterFramedHeaders, 'row');
this.filterFramedHeaders = [];
this.cMembers = this.updateFramedHeaders(this.cMembers, this.cMembers, columnFilteredData, this.filterFramedHeaders, 'column');
this.isValueFilterEnabled = true;
}
if (!headerCollection) {
this.applyValueSorting();
}
if (this.isPagingOrVirtualizationEnabled) {
if (!headerCollection) {
this.headerCollection.rowHeaders = this.rMembers;
this.headerCollection.columnHeaders = this.cMembers;
this.headerCollection.rowHeadersCount = this.rowCount;
this.headerCollection.columnHeadersCount = this.columnCount;
}
else {
this.rMembers = headerCollection.rowHeaders;
this.cMembers = headerCollection.columnHeaders;
this.rowCount = headerCollection.rowHeadersCount;
this.columnCount = headerCollection.columnHeadersCount;
}
this.calculatePagingValues();
}
if (!this.valueAxis && this.isLastHeaderHasMeasures) {
this.getAggregatedHeaders(rows, columns, this.rMembers, this.cMembers, values);
}
this.getHeaderData(rows, columns, values, updatedRowMembers, this.cMembers, colheads, this.pivotValues, 0, this.valueAxis ? 1 : valuesCount);
this.insertSubTotals();
this.getTableData((updatedRowMembers.length > 0 ? updatedRowMembers : this.rMembers), rowheads, colheads, 0, this.pivotValues, valuesCount, 0, (this.rowGrandTotal ? this.rowGrandTotal :
this.rMembers[this.rMembers.length - 1]), (this.columnGrandTotal ? this.columnGrandTotal :
this.cMembers[this.cMembers.length - 1]));
this.applyAdvancedAggregate(rowheads, colheads, this.pivotValues);
if (this.customProperties.isTabularLayout) {
this.pivotValues = this.getTabularPivotValues(requireDatasourceUpdate);
this.setRowSpan();
}
this.isEngineUpdated = true;
this.isEmptyDataAvail(this.rMembers, this.cMembers);
// console.log(st1 - st2);
this.clearProperties(isExport);
};
PivotEngine.prototype.updateHeaders = function (rowFlag, columnFlag) {
/* removing the row grant-total members */
rowFlag = (isNullOrUndefined(rowFlag) ? (this.dataSourceSettings.showGrandTotals && this.dataSourceSettings.showRowGrandTotals) ?
true : (this.dataSourceSettings.rows.length > 0) ? false : true : rowFlag);
if (((this.pageSettings && (this.removeRowGrandTotal)) || (!rowFlag && !this.rowGrandTotal)) &&
this.rMembers[this.rMembers.length - 1].type === 'grand sum') {
this.rMembers = this.rMembers.slice(0, this.rMembers.length - 1);
}
/* removing the column gran-total members */
columnFlag = (isNullOrUndefined(columnFlag) ? (this.dataSourceSettings.showGrandTotals &&
this.dataSourceSettings.showColumnGrandTotals) ? true : (this.dataSourceSettings.columns.length > 0) ? false : true :
columnFlag);
if (((this.pageSettings && (this.removeColumnGrandTotal)) || (!columnFlag && !this.columnGrandTotal)) &&
this.cMembers[this.cMembers.length - 1].type === 'grand sum') {
this.cMembers = this.cMembers.slice(0, this.cMembers.length - 1);
}
};
PivotEngine.prototype.updatePivotValues = function (updateHeaders) {
var rowFlag = (this.dataSourceSettings.showGrandTotals && this.dataSourceSettings.showRowGrandTotals) ?
true : (this.dataSourceSettings.rows.length > 0) ? false : true;
var columnFlag = (this.dataSourceSettings.showGrandTotals && this.dataSourceSettings.showColumnGrandTotals) ?
true : (this.dataSourceSettings.columns.length > 0) ? false : true;
if (updateHeaders) {
this.updateHeaders(rowFlag, columnFlag);
}
/* removing the row grant-totals */
if (((this.pageSettings && (this.removeRowGrandTotal)) ||
(!rowFlag && !this.rowGrandTotal)) && this.valueContent.length > 0) {
var slicePos = 1;
if (this.valueAxis && this.dataSourceSettings.values.length > 0) {
slicePos = 1 + this.dataSourceSettings.values.length;
}
if (this.pivotValues[this.pivotValues.length - slicePos] &&
this.pivotValues[this.pivotValues.length - slicePos][0].type === 'grand sum') {
this.pivotValues = this.pivotValues.slice(0, this.pivotValues.length - slicePos);
this.valueContent = this.valueContent.slice(0, this.valueContent.length - slicePos);
}
}
/* removing the column gran-totals */
if (((this.pageSettings && (this.removeColumnGrandTotal)) ||
(!columnFlag && !this.columnGrandTotal)) && this.headerContent.length > 0) {
var slicePos = this.dataSourceSettings.values.length;
if (this.valueAxis && this.dataSourceSettings.values.length > 0) {
slicePos = 1;
}
if (this.pivotValues[0][this.pivotValues[0].length - slicePos] &&
this.pivotValues[0][this.pivotValues[0].length - slicePos].type === 'grand sum') {
for (var ln = 0; ln < this.pivotValues.length; ln++) {
if (this.pivotValues[ln]) {
this.pivotValues[ln] =
this.pivotValues[ln].slice(0, this.pivotValues[ln].length - slicePos);
}
if (this.headerContent[ln]) {
for (var pos = this.pivotValues[ln].length; pos < (this.pivotValues[ln].length + slicePos); pos++) {
delete this.headerContent[ln][pos];
}
}
}
}
}
this.removeRowGrandTotal = this.removeColumnGrandTotal = false;
};
/**
* It performs the updateing Engine by the drilled item.
*
* @param {IDrilledItem} drilledItem - It cotains the drilled items.
* @returns {void}
* @hidden
*/
PivotEngine.prototype.onDrill = function (drilledItem) {
this.frameDrillObject(drilledItem);
var headersInfo = this.getHeadersInfo(drilledItem.fieldName, drilledItem.axis);
this.performDrillOperation(headersInfo.headers, drilledItem, headersInfo.fields, headersInfo.position, 0);
if (headersInfo.axis === 'row') {
this.updateRowMaxLevel();
}
this.headerCollection.rowHeadersCount = this.rowCount;
this.headerCollection.columnHeadersCount = this.columnCount;
if (headersInfo.axis === 'row') {
this.headerCollection.rowHeaders = headersInfo.headers;
}
else {
this.headerCollection.columnHeaders = headersInfo.headers;
}
this.updateEngine();
};
/**
* It performs to update the engine by sorting data.
*
* @param {ISort} sortItem - It cotains the drilled item data.
* @param {IDataOptions} dataSource - It contains dataSource.
* @returns {void}
* @hidden
*/
PivotEngine.prototype.onSort = function (sortItem, dataSource) {
if (dataSource) {
this.updateDataSourceSettings(dataSource, true);
}
var headersInfo = this.getHeadersInfo(sortItem.name, '');
this.fieldList[sortItem.name].sort = sortItem.order;
this.performSortOperation(headersInfo.headers, sortItem, headersInfo, 0);
this.updateEngine();
};
/**
* It performs to update the engine by filtering data.
*
* @param {IFilter} filterItem - It contains the value of filter Item.
* @param {IDataOptions} dataSource - It contains dataSource.
* @returns {void}
* @hidden
*/
PivotEngine.prototype.onFilter = function (filterItem, dataSource) {
this.isFilterAction = true;
this.frameDrillObject();
this.updateDataSourceSettings(dataSource, true);
var headersInfo = this.getHeadersInfo(filterItem.name, '');
this.isLastHeaderHasMeasures = (this.valueAxis && headersInfo.axis === 'row') ||
(!this.valueAxis && headersInfo.axis === 'column') ? true : this.isLastHeaderHasMeasures;
if (filterItem.type === 'Include' && filterItem.items.length === this.fieldList[filterItem.name].dateMember.length) {
this.fieldList[filterItem.name].filter = [];
this.fieldList[filterItem.name].filterType = '';
}
else {
this.fieldList[filterItem.name].filter = filterItem.items;
this.fieldList[filterItem.name].filterType = filterItem.type;
}
var posObj = {};
for (var _i = 0, _a = this.filterMembers; _i < _a.length; _i++) {
var pos = _a[_i];
posObj[pos] = pos;
}
this.filterMembers = [];
this.fieldFilterMem = {};
this.updateFilterMembers(dataSource);
var addPos = this.filterMembers.filter(function (pos) { return posObj[pos] === undefined; });
var itemsObj = {};
for (var _b = 0, _c = filterItem.items; _b < _c.length; _b++) {
var item = _c[_b];
itemsObj[item] = item;
}
var showNoDataItems = (this.dataSourceSettings.rows[0] && this.dataSourceSettings.rows[0].showNoDataItems) || (this.dataSourceSettings.columns[0] && this.dataSourceSettings.columns[0].showNoDataItems);
if (showNoDataItems && this.columnKeys[filterItem.name]) {
showNoDataItems = (this.dataSourceSettings.columns[0] && this.dataSourceSettings.columns[0].showNoDataItems) ? true : false;
}
else if (showNoDataItems && headersInfo.axis === 'row') {
showNoDataItems = (this.dataSourceSettings.rows[0] && this.dataSourceSettings.rows[0].showNoDataItems) ? true : false;
}
if (showNoDataItems) {
var filterMembers = [];
this.filterPosObj = {};
for (var ln = 0; ln < addPos.length; ln++) {
this.filterPosObj[addPos[ln]] = addPos[ln];
}
for (var ln = 0; ln < this.valueMatrix.length; ln++) {
filterMembers.push(ln);
}
addPos = filterMembers;
}
this.performFilterCommonUpdate(filterItem, headersInfo, addPos);
if (headersInfo.axis === 'column') {
headersInfo = this.getHeadersInfo('', 'row');
this.performFilterCommonUpdate(filterItem, headersInfo, addPos);
}
else {
headersInfo = this.getHeadersInfo('', 'column');
this.performFilterCommonUpdate(filterItem, headersInfo, addPos);
}
this.frameHeaderObjectsCollection = false;
this.headerObjectsCollection = {};
this.updateEngine();
};
/**
* It performs to update the engine by the aggregation.
*
* @param {IFieldOptions} field - It cotains the field data.
* @param {IDataOptions} dataSource - It contains dataSource.
* @returns {void}
* @hidden
*/
PivotEngine.prototype.onAggregation = function (field, dataSource) {
if (dataSource) {
this.updateDataSourceSettings(dataSource, true);
}
this.fieldList[field.name].aggregateType = field.type;
this.rMembers = this.headerCollection.rowHeaders;
this.cMembers = this.headerCollection.columnHeaders;
if (this.allowDataCompression) {
this.data = this.getGroupedRawData(this.dataSourceSettings);
this.generateValueMatrix();
}
this.updateEngine();
};
/**
* It performs to update the engine by the calculated field operation.
*
* @param {ICalculatedFields} field - It cotains the Calculated Fields.
* @param {IDataOptions} dataSourceSettings - It cotains the dataSourceSettings.
* @returns {void}
* @hidden
*/
PivotEngine.prototype.onCalcOperation = function (field, dataSourceSettings) {
this.dataSourceSettings.calculatedFieldSettings = dataSourceSettings.calculatedFieldSettings ?
dataSourceSettings.calculatedFieldSettings : [];
this.dataSourceSettings.values = dataSourceSettings.values ? dataSourceSettings.values : [];
this.rMembers = this.headerCollection.rowHeaders;
this.cMembers = this.headerCollection.columnHeaders;
this.getCalculatedField(this.fields);
if (this.fieldList[field.name]) {
this.fieldList[field.name].formula = field.formula;
}
else {
this.fieldList[field.name] = {
id: field.name,
caption: field.name,
type: 'number',
aggregateType: 'CalculatedField',
filterType: '',
index: this.fields.length - 1,
filter: [],
sort: this.enableSort ? 'Ascending' : 'None',
isSelected: true,
isExcelFilter: false,
formula: field.formula
};
if (this.valueAxis === 1) {
this.headerCollection.rowHeadersCount = this.rowCount = (this.rowCount / (this.dataSourceSettings.values.length - 1)) * this.dataSourceSettings.values.length;
}
else {
this.headerCollection.columnHeadersCount = this.columnCount = (this.columnCount / (this.dataSourceSettings.values.length - 1)) * this.dataSourceSettings.values.length;
}
}
this.getFormattedFields(dataSourceSettings);
this.fillFieldMembers();
this.updateEngine();
};
PivotEngine.prototype.performDrillOperation = function (headers, drilledItem, fields, position, currentPosition) {
var count = 0;
while (count < headers.length) {
if (position === currentPosition) {
var levelName = headers[count].valueSort.levelName.split(this.valueSortSettings.headerDelimiter);
if (drilledItem.memberName === levelName.join(drilledItem.delimiter ? drilledItem.delimiter : '**')) {
if (drilledItem.action === 'down') {
var memberCount = this.getRowMemberContributionCount(headers[count]);
headers[count].isDrilled = true;
headers[count].members = this.getIndexedHeaders(fields, this.data, position + 1, headers[count].index, drilledItem.axis, drilledItem.memberName.
split(drilledItem.delimiter ? drilledItem.delimiter : '**').join(this.valueSortSettings.headerDelimiter));
var rowCountDifference = this.getRowMemberContributionCount(headers[count]) - memberCount;
this.rowCount += rowCountDifference;
var sortedHeaders = void 0;
if (drilledItem.axis === 'row') {
sortedHeaders = this.applyValueSorting(headers[count].members, this.cMembers);
headers[count].members = sortedHeaders.rMembers;
if (!this.customProperties.isTabularLayout) {
this.rowCount += (this.showSubTotalsAtBottom ? 1 : 0);
}
this.drillDownLevel(headers[count].level, true);
}
else {
var showSubTotals = this.dataSourceSettings.showSubTotals &&
this.dataSourceSettings.showColumnSubTotals && fields[position].showSubTotals;
this.columnCount -= !showSubTotals ? this.colValuesLength : 0;
sortedHeaders = this.applyValueSorting(this.rMembers, headers[count].members);
headers[count].members = sortedHeaders.cMembers;
}
}
else {
var memberCount = this.getRowMemberContributionCount(headers[count]);
headers[count].isDrilled = false;
this.updateHeadersCount(headers[count].members, drilledItem.axis, position, fields, 'minus', true);
var rowCountDifference = this.getRowMemberContributionCount(headers[count]) - memberCount;
this.rowCount += rowCountDifference;
headers[count].members = [];
if (drilledItem.axis === 'row') {
this.drillUpLevel(headers[count].level);
if (!this.customProperties.isTabularLayout) {
this.rowCount -= (this.showSubTotalsAtBottom ? 1 : 0);
}
}
}
break;
}
}
else if (headers[count].members.length > 0) {
headers[count].members = this.performDrillOperation(headers[count].members, drilledItem, fields, position, currentPosition + 1);
}
count++;
}
return headers;
};
PivotEngine.prototype.performSortOperation = function (headers, sortItem, headersInfo, currentPosition) {
var count = 0;
while (count < headers.length) {
if (headersInfo.position === currentPosition) {
headers = this.getSortedHeaders(headers, sortItem.order.toString());
break;
}
else if (headers[count].members.length > 0) {
headers[count].members =
this.performSortOperation(headers[count].members, sortItem, headersInfo, currentPosition + 1);
}
count++;
}
return headers;
};
PivotEngine.prototype.performFilterDeletion = function (headers, filterItem, headersInfo, filterObjects, currentPosition) {
var count = 0;
var loopIn = true;
var _loop_4 = function () {
if (headersInfo.position === currentPosition) {
var engine_1 = this_4;
headers = headers.filter(function (item) {
return engine_1.fieldFilterMem[filterItem.name].memberObj[item.formattedText] === '' ? false :
!engine_1.fieldFilterMem[filterItem.name].memberObj[item.formattedText] || item.type === 'grand sum';
});
loopIn = false;
}
else if (headers[count].members.length > 0) {
headers[count].members = this_4.performFilterDeletion(headers[count].members, filterItem, headersInfo, filterObjects, currentPosition + 1);
}
count++;
};
var this_4 = this;
while (count < headers.length && loopIn) {
_loop_4();
}
var engine = this;
return headers.filter(function (item) {
return (item.members.length > 0 || item.type === 'grand sum') ? true : engine.matchIndexes(item.indexObject, filterObjects);
});
};
PivotEngine.prototype.matchIndexes = function (index, filterObjects) {
var keys = Object.keys(index);
var len = keys.length;
if (len === 0) {
return true;
}
while (len > -1) {
if (filterObjects[index[keys[len]]] !== undefined) {
return true;
}
len--;
}
return false;
};
PivotEngine.prototype.performFilterAddition = function (headers, fields, headersInfo) {
var count = 0;
var _loop_5 = function () {
var levelName = headers[count].valueSort.levelName;
if (this_5.headerObjectsCollection[levelName]) {
var memberNameObj_1 = {};
for (var _i = 0, _a = headers[count].members; _i < _a.length; _i++) {
var member = _a[_i];
memberNameObj_1[member.valueSort.levelName.toString()] = member.valueSort.levelName.toString();
}
var excessHeaders = this_5.headerObjectsCollection[levelName].filter(function (member) {
return !memberNameObj_1[member.valueSort.levelName.toString()];
});
headers[count].members = headers[count].members.concat(excessHeaders);
headers[count].members = this_5.getSortedHeaders(headers[count].members, this_5.fieldList[headersInfo.fields[headers[count].members[0].level].name].sort);
delete this_5.headerObjectsCollection[levelName];
}
if (headers[count].members.length > 0) {
headers[count].members = this_5.performFilterAddition(headers[count].members, fields, headersInfo);
}
count++;
};
var this_5 = this;
while (count < headers.length) {
_loop_5();
}
return headers;
};
PivotEngine.prototype.performFilterCommonUpdate = function (filterItem, headersInfo, addPos) {
if (headersInfo.axis === 'row' || headersInfo.axis === 'column') {
var rawHeaders = headersInfo.axis === 'row' ? this.rMembers : this.cMembers;
var filterObjects = {};
for (var _i = 0, _a = this.filterMembers; _i < _a.length; _i++) {
var item = _a[_i];
filterObjects[item] = item;
}
if (this.fieldFilterMem[filterItem.name]) {
rawHeaders = this.performFilterDeletion(headersInfo.headers, filterItem, headersInfo, filterObjects, 0);
}
if (addPos.length > 0 && headersInfo.fields.length > 0) {
this.frameHeaderObjectsCollection = true;
if (headersInfo.fields.filter(function (item) { return item.showNoDataItems; }).length > 0) {
for (var i = 0; i < this.data.length; i++) {
addPos.push(i);
}
}
this.headerObjectsCollection['parent'] = this.getIndexedHeaders(headersInfo.fields, this.data, 0, addPos, headersInfo.axis, '');
rawHeaders = this.performFilterAddition(rawHeaders, headersInfo.fields, headersInfo);
var headerNames_1 = {};
for (var _b = 0, rawHeaders_1 = rawHeaders; _b < rawHeaders_1.length; _b++) {
var header = rawHeaders_1[_b];
headerNames_1[header.valueSort.levelName.toString()] = header.valueSort.levelName.toString();
}
var excessHeaders = this.headerObjectsCollection['parent'].filter(function (header) {
return !headerNames_1[header.valueSort.levelName.toString()];
});
var grandHeader = rawHeaders.filter(function (item) { return item.type === 'grand sum'; });
if (grandHeader.length > 0) {
rawHeaders.pop();
}
rawHeaders = this.getSortedHeaders(rawHeaders.concat(excessHeaders), this.fieldList[headersInfo.fields[0].name].sort).concat(grandHeader);
var rowFlag = (this.dataSourceSettings.showGrandTotals && this.dataSourceSettings.showRowGrandTotals) ? true :
(this.dataSourceSettings.rows.length > 0) ? false : true;
var columnFlag = (this.dataSourceSettings.showGrandTotals && this.dataSourceSettings.showColumnGrandTotals) ?
true : (this.dataSourceSettings.columns.length > 0) ? false : true;
if (headersInfo.axis === 'row') {
this.cMembers = this.getIndexedHeaders(this.dataSourceSettings.columns, this.data, 0, this.filterMembers, 'column', '');
if (columnFlag) {
this.insertAllMember(this.cMembers, this.filterMembers, '', 'column');
}
}
else {
this.rMembers = this.getIndexedHeaders(this.dataSourceSettings.rows, this.data, 0, this.filterMembers, 'row', '');
if (rowFlag) {
this.insertAllMember(this.rMembers, this.filterMembers, '', 'row');
}
}
}
if (headersInfo.axis === 'row') {
this.rowCount = 0;
this.levelMap = {};
}
else {
this.columnCount = 0;
}
this.updateHeadersCount(rawHeaders, headersInfo.axis, 0, headersInfo.fields, 'plus', false);
if (headersInfo.axis === 'row') {
if (headersInfo.position > 0) {
this.insertPosition(this.dataSourceSettings.rows, this.data, 0, this.filterMembers, 'row', '', rawHeaders);
}
this.insertTotalPosition(rawHeaders);
this.rMembers = this.headerCollection.rowHeaders = rawHeaders;
this.headerCollection.rowHeadersCount = this.rowCount;
this.updateRowMaxLevel();
}
else {
if (headersInfo.position > 0) {
this.insertPosition(this.dataSourceSettings.columns, this.data, 0, this.filterMembers, 'column', '', rawHeaders);
}
this.insertTotalPosition(rawHeaders);
this.cMembers = this.headerCollection.columnHeaders = rawHeaders;
this.headerCollection.columnHeadersCount = this.columnCount;
}
}
else {
var showNoDataItems = (this.dataSourceSettings.rows[0] && this.dataSourceSettings.rows[0].showNoDataItems) || (this.dataSourceSettings.columns[0] && this.dataSourceSettings.columns[0].showNoDataItems);
this.rMembers = this.getIndexedHeaders(this.dataSourceSettings.rows, this.data, 0, showNoDataItems ? addPos : this.filterMembers, 'row', '');
this.cMembers = this.getIndexedHeaders(this.dataSourceSettings.columns, this.data, 0, showNoDataItems ? addPos : this.filterMembers, 'column', '');
this.insertAllMembersCommon();
this.rowCount = 0;
this.columnCount = 0;
this.updateHeadersCount(this.cMembers, 'column', 0, this.dataSourceSettings.columns, 'plus', false);
this.updateHeadersCount(this.rMembers, 'row', 0, this.dataSourceSettings.rows, 'plus', false);
if (showNoDataItems) {
this.insertPosition(this.dataSourceSettings.rows, this.data, 0, this.filterMembers, 'row', '', this.rMembers);
this.insertPosition(this.dataSourceSettings.columns, this.data, 0, this.filterMembers, 'column', '', this.cMembers);
}
this.headerCollection.rowHeaders = this.rMembers;
this.headerCollection.rowHeadersCount = this.rowCount;
this.headerCollection.columnHeaders = this.cMembers;
this.headerCollection.columnHeadersCount = this.columnCount;
}
this.applyValueSorting();
};
PivotEngine.prototype.getHeadersInfo = function (fieldName, axis) {
this.rMembers = this.headerCollection.rowHeaders;
this.cMembers = this.headerCollection.columnHeaders;
axis = axis === '' ? this.getAxisByFieldName(fieldName) : axis;
var headers = axis === 'row' ? this.rMembers : this.cMembers;
var fields = axis === 'row' ? this.dataSourceSettings.rows : this.dataSourceSettings.columns;
var position = 0;
for (var _i = 0, fields_1 = fields; _i < fields_1.length; _i++) {
var field = fields_1[_i];
if (field.name === fieldName) {
break;
}
position++;
}
return { axis: axis, fields: fields, headers: headers, position: position };
};
/**
* It performs the updating engine.
*
* @returns {void}
* @hidden
*/
PivotEngine.prototype.updateEngine = function () {
this.removeCount = 0;
this.validateValueFields();
this.calculatePagingValues();
this.pivotValues = [];
this.headerContent = [];
this.valueContent = [];
var rowheads = [];
var colheads = [];
var updatedRowMembers = [];
var valuesCount = (this.dataSourceSettings.values.length);
if (!this.isFilterAction) {
this.frameDrillObject();
}
else {
this.isFilterAction = false;
}
this.getAggregatedHeaders(this.dataSourceSettings.rows, this.dataSourceSettings.columns, this.rMembers, this.cMembers, this.dataSourceSettings.values);
this.getHeaderData(this.dataSourceSettings.rows, this.dataSourceSettings.columns, this.dataSourceSettings.values, updatedRowMembers, this.cMembers, colheads, this.pivotValues, 0, this.valueAxis ? 1 : valuesCount);
this.insertSubTotals();
this.getTableData((updatedRowMembers.length > 0 ? updatedRowMembers : this.rMembers), rowheads, colheads, 0, this.pivotValues, valuesCount, 0, (this.rowGrandTotal ? this.rowGrandTotal : this.rMembers[this.rMembers.length - 1]), (this.columnGrandTotal ? this.columnGrandTotal : this.cMembers[this.cMembers.length - 1]));
this.applyAdvancedAggregate(rowheads, colheads, this.pivotValues);
if (this.customProperties.isTabularLayout) {
this.pivotValues = this.getTabularPivotValues(true);
this.setRowSpan();
}
this.isEngineUpdated = true;
this.isEmptyDataAvail(this.rMembers, this.cMembers);
};
PivotEngine.prototype.getAxisByFieldName = function (fieldName) {
var axisCount = 0;
var axis = '';
while (axisCount < 4 && axis === '') {
switch (axisCount) {
case 0:
axis = this.getFieldByName(fieldName, this.dataSourceSettings.rows) ? 'row' : '';
break;
case 1:
axis = this.getFieldByName(fieldName, this.dataSourceSettings.columns) ? 'column' : '';
break;
}
axisCount++;
}
return axis;
};
PivotEngine.prototype.getFieldByName = function (fieldName, fields) {
return new DataManager({ json: fields }).executeLocal(new Query().where('name', 'equal', fieldName))[0];
};
PivotEngine.prototype.updateHeadersCount = function (headers, axis, position, fields, action, isDrill) {
var lenCnt = 0;
var field = fields[position];
var showSubTotals = true;
if (axis === 'column') {
showSubTotals = this.dataSourceSettings.showSubTotals && this.dataSourceSettings.showColumnSubTotals &&
(field ? field.showSubTotals : true);
}
else {
showSubTotals = this.dataSourceSettings.showSubTotals && this.dataSourceSettings.showRowSubTotals &&
(field ? field.showSubTotals : true);
}
while (lenCnt < headers.length) {
if (axis === 'row') {
var increment = this.getRowMemberContributionCount(headers[lenCnt]);
this.rowCount += action === 'plus' ? increment : -increment;
}
else {
this.columnCount -= (action === 'plus' ? -(this.valueAxis === 1 ? 1 : this.dataSourceSettings.values.length) :
(this.valueAxis === 1 ? 1 : this.dataSourceSettings.values.length));
}
if (headers[lenCnt].members.length > 0) {
this.updateHeadersCount(headers[lenCnt].members, axis, position + 1, fields, action, true);
if (axis === 'row') {
this.rowCount -= this.showSubTotalsAtBottom && !this.customProperties.isTabularLayout &&
headers[lenCnt].hasChild && headers[lenCnt].isDrilled ? 1 : 0;
if (action === 'plus') {
this.drillDownLevel(headers[lenCnt].level);
}
else {
this.drillUpLevel(headers[lenCnt].level);
}
}
}
lenCnt++;
}
if (axis === 'column' && !showSubTotals && isDrill) {
this.columnCount += action === 'plus' ? -this.colValuesLength : this.colValuesLength;
}
};
/**
* It performs to retrieve the sorted headers.
*
* @param {IAxisSet[]} headers - It cotains the headers data.
* @param {string} sortOrder - It cotains the ortOrder data
* @returns {IAxisSet[]} - return sorted headers as IAxisSet[].
* @hidden
*/
PivotEngine.prototype.getSortedHeaders = function (headers, sortOrder) {
var fieldName = headers[0].actualText !== 'Grand Total' ? headers[0].valueSort.axis :
headers[1].valueSort.axis;
var isNotDateType = !(this.formatFields && this.formatFields[fieldName] &&
this.formatFields[fieldName].type);
var childrens = this.fieldList[fieldName];
if (isNotDateType) {
if (childrens && childrens.type === 'number' && headers.length > 0 && (typeof (headers[0].actualText) === 'string')) {
var stringValue = [];
var alphaNumbervalue = [];
var nullValue = [];
for (var i = 0; i < headers.length; i++) {
if (isNaN(Number(headers[i].actualText.toString().charAt(0)))) {
stringValue.push(headers[i]);
}
else if (headers[i].actualText === '') {
nullValue.push(headers[i]);
}
else {
alphaNumbervalue.push(headers[i]);
break;
}
}
if (alphaNumbervalue.length > 0) {
alphaNumbervalue = this.sortHeaders(fieldName, childrens, headers, childrens.sort, childrens.isAlphanumeric);
}
return headers;
}
else {
return this.sortHeaders(fieldName, childrens, headers, sortOrder, childrens.type);
}
}
else {
return this.sortHeaders(fieldName, childrens, headers, sortOrder, 'date');
}
};
PivotEngine.prototype.sortHeaders = function (fieldName, childrens, sortMembersOrder, sortOrder, type) {
var isHeaderSortByDefault = false;
var membersInfo = this.fieldList[fieldName] && this.fieldList[fieldName].membersOrder ?
this.fieldList[fieldName].membersOrder.slice() : [];
if (!this.sortMembers[fieldName]) {
this.sortMembers[fieldName] = Object.keys(childrens.members);
}
var sortDetails = {
fieldName: fieldName,
sortOrder: sortOrder,
members: membersInfo && membersInfo.length > 0 ? membersInfo : this.sortMembers[fieldName],
IsOrderChanged: false
};
type = (type === 'datetime' || type === 'date' || type === 'time') ? (this.formatFields[fieldName] &&
(['date', 'dateTime', 'time'].indexOf(this.formatFields[fieldName].type) > -1)) ? type : 'string' : type;
var isDateType = (type === 'datetime' || type === 'date' || type === 'time');
var isNumberGroupSorting = false;
if (this.dataSourceSettings.groupSettings.length > 0) {
var groupField = this.dataSourceSettings.groupSettings.filter(function (field) {
return field.name === childrens.id;
});
if (!isNullOrUndefined(groupField) && groupField.length > 0) {
isNumberGroupSorting = groupField[0].type.toLocaleLowerCase() === 'number' &&
childrens.type.toLocaleLowerCase() === 'string';
}
}
if (membersInfo && membersInfo.length > 0) {
PivotUtil.applyCustomSort(sortDetails, sortMembersOrder, type);
}
else {
PivotUtil.applyHeadersSort(sortMembersOrder, sortOrder, type, isNumberGroupSorting);
isHeaderSortByDefault = true;
}
if (isHeaderSortByDefault && this.getHeaderSortInfo) {
var copyOrder = [];
for (var m = 0, n = 0; m < sortMembersOrder.length; m++) {
var member = sortMembersOrder[m];
var sortText = isDateType ?
member.dateText : member.actualText;
if (member.actualText !== 'Grand Total') {
copyOrder[n++] = sortText;
}
}
sortDetails.members = copyOrder;
}
if (this.getHeaderSortInfo) {
this.getHeaderSortInfo(sortDetails);
}
if (sortDetails.IsOrderChanged) {
PivotUtil.applyCustomSort(sortDetails, sortMembersOrder, type, true);
}
return sortMembersOrder;
};
/**
* It performs to applying the value sorting.
*
* @param {IAxisSet[]} rMembers - It contains the row members data.
* @param {IAxisSet[]} cMembers - It contains the column members data.
* @returns {ISortedHeaders} - It return the sorted value as ISortedHeaders.
* @hidden
*/
PivotEngine.prototype.applyValueSorting = function (rMembers, cMembers) {
var isNullArgument = false;
if (this.enableValueSorting && (this.valueSortSettings.rowHeaderText || this.valueSortSettings.columnHeaderText)
&& this.dataSourceSettings.values.length > 0) {
if (rMembers === undefined || cMembers === undefined) {
this.rowValueSortHeaderText = undefined;
this.columnValueSortHeaderText = undefined;
if (!isNullOrUndefined(this.valueSortSettings.rowHeaderText) && this.valueSortSettings.rowHeaderText !== '') {
this.rowValueSortHeaderText = this.prepareValueSortHeaderText(this.valueSortSettings.rowHeaderText);
}
if (!isNullOrUndefined(this.valueSortSettings.columnHeaderText) && this.valueSortSettings.columnHeaderText !== '') {
this.columnValueSortHeaderText = this.prepareValueSortHeaderText(this.valueSortSettings.columnHeaderText);
}
rMembers = this.rMembers;
cMembers = this.cMembers;
isNullArgument = true;
}
cMembers = this.applySortingForAxis(this.rowValueSortHeaderText, true, rMembers, cMembers, this.rowGrandTotal);
rMembers = this.applySortingForAxis(this.columnValueSortHeaderText, false, cMembers, rMembers, this.columnGrandTotal);
if (isNullArgument) {
this.rMembers = rMembers;
this.cMembers = cMembers;
if (this.isPagingOrVirtualizationEnabled) {
this.headerCollection.rowHeaders = this.rMembers;
this.headerCollection.columnHeaders = this.cMembers;
}
}
}
return { rMembers: rMembers, cMembers: cMembers };
};
PivotEngine.prototype.applySortingForAxis = function (axisHeaderText, isRow, members, oppositeMembers, grandTotal) {
if (!axisHeaderText) {
return oppositeMembers;
}
var showGrandTotals = isRow ? this.dataSourceSettings.showRowGrandTotals
: this.dataSourceSettings.showColumnGrandTotals;
var hasMembers = isRow ? this.dataSourceSettings.rows.length > 0 : this.dataSourceSettings.columns.length > 0;
var flag = this.dataSourceSettings.showGrandTotals && showGrandTotals ? true : !hasMembers;
var grandTotalIncluded = true;
if (axisHeaderText.includes(this.localeObj.getConstant('grandTotal')) && !flag) {
members.push(grandTotal);
grandTotalIncluded = false;
}
var _a = this.getHeaderDetails(axisHeaderText, isRow), hText = _a.hText, mIndex = _a.mIndex, mType = _a.mType;
var member = this.getMember(members, hText);
if (member) {
oppositeMembers = this.sortByValueRow(oppositeMembers, member, isRow ?
this.valueSortSettings.rowSortOrder : this.valueSortSettings.columnSortOrder, mIndex, mType);
}
if (!grandTotalIncluded) {
members.pop();
}
return oppositeMembers;
};
PivotEngine.prototype.prepareValueSortHeaderText = function (sortHeaderText) {
var textArray = sortHeaderText.split(this.valueSortSettings.headerDelimiter);
for (var _i = 0, _a = this.dataSourceSettings.values; _i < _a.length; _i++) {
var field = _a[_i];
var name_1 = field.caption ? field.caption : field.name;
var valueIndex = textArray.indexOf(name_1);
if (valueIndex > -1) {
textArray.splice(valueIndex, 1);
textArray.push(name_1);
sortHeaderText = textArray.join(this.valueSortSettings.headerDelimiter);
break;
}
}
return sortHeaderText;
};
PivotEngine.prototype.getHeaderDetails = function (headerText, isRow) {
var textArray = headerText.split(this.valueSortSettings.headerDelimiter);
var hText = '';
var mIndex;
var mType;
var caption;
for (var i = 0; i < this.dataSourceSettings.values.length; i++) {
if (this.dataSourceSettings.values[i].caption === textArray[textArray.length - 1]) {
caption = this.dataSourceSettings.values[i].name;
break;
}
else {
caption = textArray[textArray.length - 1];
}
}
if ((((this.dataSourceSettings.values.length === 1 && ((!isRow && this.dataSourceSettings.valueAxis === 'column' &&
this.dataSourceSettings.columns.length === 0) || (isRow && this.dataSourceSettings.valueAxis === 'row' &&
this.dataSourceSettings.rows.length === 0)))) || ((this.dataSourceSettings.values.length > 1 && ((!isRow &&
this.dataSourceSettings.valueAxis === 'column') || (isRow && this.dataSourceSettings.valueAxis === 'row'))))) &&
caption && this.fieldList[caption]) {
for (var i = 0; i < textArray.length - 1; i++) {
hText = hText === '' ? textArray[i] : (hText + this.valueSortSettings.headerDelimiter + textArray[i]);
}
mIndex = this.fieldList[caption].index;
mType = this.fieldList[caption].aggregateType;
}
else {
if (!this.dataSourceSettings.alwaysShowValueHeader || textArray.length === 1 || ((isRow &&
this.dataSourceSettings.valueAxis !== 'row') || (!isRow && this.dataSourceSettings.valueAxis !== 'column'))) {
hText = headerText;
}
else {
for (var i = 0; i < textArray.length - 1; i++) {
hText = hText === '' ? textArray[i] : (hText + this.valueSortSettings.headerDelimiter + textArray[i]);
}
}
if (!isNullOrUndefined(this.dataSourceSettings.valueSortSettings.measure) &&
this.dataSourceSettings.valueSortSettings.measure !== '') {
for (var i = 0; i < this.dataSourceSettings.values.length; i++) {
if (this.dataSourceSettings.valueSortSettings.measure === this.dataSourceSettings.values[i].name) {
mIndex = this.fieldList[this.dataSourceSettings.valueSortSettings.measure].index;
mType = this.fieldList[this.dataSourceSettings.valueSortSettings.measure].aggregateType;
break;
}
else {
mIndex = this.fieldList[this.dataSourceSettings.values[0].name].index;
mType = this.fieldList[this.dataSourceSettings.values[0].name].aggregateType;
}
}
}
else {
mIndex = this.fieldList[this.dataSourceSettings.values[0].name].index;
mType = this.fieldList[this.dataSourceSettings.values[0].name].aggregateType;
}
}
return { hText: hText, mIndex: mIndex, mType: mType };
};
PivotEngine.prototype.getMember = function (cMembers, headerText) {
var vlen = cMembers.length;
var member;
for (var j = 0; j < vlen; j++) {
if (cMembers[j].valueSort.levelName === headerText) {
member = cMembers[j];
break;
}
else if (cMembers[j].members.length > 0) {
member = this.getMember(cMembers[j].members, headerText);
}
if (member) {
return member;
}
}
return member;
};
PivotEngine.prototype.sortByValueRow = function (rMembers, member, sortOrder, mIndex, mType) {
var aggreColl = [];
for (var _i = 0, rMembers_1 = rMembers; _i < rMembers_1.length; _i++) {
var header = rMembers_1[_i];
if (header.type === 'grand sum') {
aggreColl.push({ 'header': header });
}
else {
this.rawIndexObject = {};
var value = this.getAggregateValue(header.index, member.indexObject, mIndex, mType, false);
var cellDetails = {
fieldName: this.fields[mIndex],
row: header,
column: member,
value: value,
cellSets: this.getValueCellInfo ? this.getCellSet(this.rawIndexObject) : [],
rowCellType: (header.hasChild && header.isDrilled ? 'subTotal' : header.type === 'grand sum' ? 'grandTotal' : 'value'),
columnCellType: (member.hasChild && member.isDrilled ? 'subTotal' : member.type === 'grand sum' ? 'grandTotal' : 'value'),
aggregateType: mType,
skipFormatting: false
};
if (this.getValueCellInfo) {
this.getValueCellInfo(cellDetails);
}
value = cellDetails.value;
this.rawIndexObject = {};
aggreColl.push({ 'header': header, 'value': value });
}
}
rMembers = PivotUtil.getSortedValue(aggreColl, sortOrder);
for (var _a = 0, rMembers_2 = rMembers; _a < rMembers_2.length; _a++) {
var header = rMembers_2[_a];
if (header.members.length > 0) {
header.members = this.sortByValueRow(header.members, member, sortOrder, mIndex, mType);
}
}
return rMembers;
};
PivotEngine.prototype.insertAllMembersCommon = function () {
this.rowGrandTotal = this.columnGrandTotal = null;
var rowFlag = (this.dataSourceSettings.showGrandTotals && this.dataSourceSettings.showRowGrandTotals) ? true :
(this.dataSourceSettings.rows.length > 0) ? false : true;
var columnFlag = (this.dataSourceSettings.showGrandTotals && this.dataSourceSettings.showColumnGrandTotals) ?
true : (this.dataSourceSettings.columns.length > 0) ? false : true;
if (this.isValueHasAdvancedAggregate) {
/* inserting the row grant-total members */
this.insertAllMember(this.rMembers, this.filterMembers, '', 'row');
if (rowFlag) {
this.rowCount += this.rowValuesLength + ((this.isMultiValueRowAxis && !this.customProperties.isTabularLayout) ? 1 : 0);
}
/* inserting the column gran-total members */
this.insertAllMember(this.cMembers, this.filterMembers, '', 'column');
if (columnFlag) {
this.columnCount += this.colValuesLength;
}
}
else {
if (rowFlag) {
/* inserting the row grant-total members */
this.insertAllMember(this.rMembers, this.filterMembers, '', 'row');
this.rowCount += this.rowValuesLength + ((this.isMultiValueRowAxis && !this.customProperties.isTabularLayout) ? 1 : 0);
}
else {
this.rowGrandTotal = this.insertAllMember([], this.filterMembers, '', 'row')[0];
}
if (columnFlag) {
/* inserting the column gran-total members */
this.insertAllMember(this.cMembers, this.filterMembers, '', 'column');
this.columnCount += this.colValuesLength;
}
else {
this.columnGrandTotal = this.insertAllMember([], this.filterMembers, '', 'column')[0];
}
}
};
PivotEngine.prototype.insertSubTotals = function () {
var rowLength = this.pivotValues.length;
for (var rowCnt = 0; rowCnt < rowLength; rowCnt++) {
var rowCells = this.pivotValues[rowCnt];
if (rowCells) {
var savedCell = void 0;
var spanCnt = 1;
var colLength = rowCells.length;
var indexObj = void 0;
var startIndex = 1;
var lastIndex = this.showSubTotalsAtTop ? this.reformAxisCount : colLength;
var colCnt = this.showSubTotalsAtTop ? startIndex : lastIndex - 1;
var columnSpan = void 0;
var memberCnt = void 0;
while (startIndex < lastIndex) {
var cell = rowCells[colCnt];
if (cell) {
// if (cell.rowSpan > 1) {
// cell.rowSpan = 1;
// }
if (savedCell) {
savedCell.colSpan = spanCnt;
savedCell.colIndex = this.showSubTotalsAtTop ? savedCell.colIndex + (spanCnt - 1) :
savedCell.colIndex - (spanCnt - 1);
}
if (this.showSubTotalsAtTop) {
columnSpan = memberCnt = this.getMemberSpanCount(this.pivotValues[rowCnt], colCnt);
}
indexObj = { index: cell.index, indexObject: cell.indexObject };
cell.index = [];
cell.indexObject = {};
savedCell = extend({}, cell, null, true);
cell.index = indexObj.index;
cell.indexObject = indexObj.indexObject;
var rowPos = rowCnt + 1;
while (this.pivotValues[rowPos] && !this.pivotValues[rowPos][colCnt]) {
var curentCell = this.pivotValues[rowCnt][colCnt];
if (!curentCell.isDrilled && !(!this.valueAxis && !this.isLastHeaderHasMeasures && (curentCell.members
&& curentCell.members.length > 0 && rowPos > this.measureIndex))) {
curentCell.rowSpan = (rowPos - rowCnt) + 1;
savedCell.rowSpan = (rowPos - rowCnt) + 1;
}
var cellType = (cell.type === 'sum' || cell.type === 'grand sum') ? cell.type : 'sum';
this.pivotValues[rowPos][colCnt] =
this.headerContent[rowPos][colCnt] = {
type: cellType, formattedText: ((cell.type === 'sum' || cell.type === 'grand sum') ? cell.formattedText :
(cell.formattedText + ' Total')), axis: 'column', hierarchyName: cell.hierarchyName,
level: -1, colIndex: colCnt, rowIndex: rowPos, valueSort: cell.valueSort
};
if (cell.valueSort && (cell.valueSort[this.valueSortSettings.rowHeaderText]
|| cell.valueSort[this.valueSortSettings.columnHeaderText])) {
this.valueSortSettings.columnIndex = colCnt;
}
var isSpanned = false;
if (cellType === 'grand sum') {
curentCell.rowSpan = (rowPos - rowCnt) + 1;
savedCell.rowSpan = (rowPos - rowCnt) + 1;
}
else if (curentCell.type !== 'sum' && (curentCell.isDrilled || (this.valueAxisFields[curentCell.actualText] &&
!this.valueAxis && !this.isLastHeaderHasMeasures && curentCell.members && curentCell.members.length > 0))) {
this.pivotValues[rowCnt + 1][colCnt].rowSpan = rowPos - rowCnt;
isSpanned = true;
}
else {
this.pivotValues[rowPos][colCnt].rowSpan = -1;
}
if (rowPos > (rowCnt + 1) && (curentCell.type === 'sum' ||
isSpanned)) {
this.pivotValues[rowPos][colCnt].rowSpan = -1;
}
rowPos++;
}
spanCnt = 1;
}
else {
rowCells[colCnt] =
this.headerContent[rowCnt][colCnt] = extend({}, savedCell, null, true);
rowCells[colCnt].index =
this.headerContent[rowCnt][colCnt].index = indexObj.index;
rowCells[colCnt].indexObject =
this.headerContent[rowCnt][colCnt].indexObject = indexObj.indexObject;
spanCnt++;
if (this.showSubTotalsAtTop) {
memberCnt--;
rowCells[colCnt].colSpan = memberCnt;
rowCells[colCnt].colIndex = rowCells[colCnt].colIndex + (spanCnt - 1);
}
else {
rowCells[colCnt].colSpan = spanCnt;
rowCells[colCnt].colIndex = rowCells[colCnt].colIndex - (spanCnt - 1);
}
}
if (colCnt === 1 && savedCell) {
if (this.showSubTotalsAtTop) {
savedCell.colSpan = columnSpan;
savedCell.colIndex = savedCell.colIndex + (spanCnt - 1);
}
else {
savedCell.colSpan = spanCnt;
savedCell.colIndex = savedCell.colIndex - (spanCnt - 1);
}
}
if (this.showSubTotalsAtTop && (rowCells[colCnt + 1] || colCnt + 1 === this.reformAxisCount)) {
var cell_1 = this.pivotValues[rowCnt][(colCnt - spanCnt) + 1];
cell_1.colSpan = columnSpan;
this.pivotValues[rowCnt][(colCnt - spanCnt) + 1] = cell_1;
}
colCnt = this.showSubTotalsAtTop ? colCnt + 1 : colCnt - 1;
startIndex++;
}
}
}
};
PivotEngine.prototype.getMemberSpanCount = function (rowCellArray, cellIndex) {
var colIndex = 1;
for (var i = cellIndex + 1; i < this.reformAxisCount; i++) {
if (!rowCellArray[i]) {
colIndex++;
}
else {
break;
}
}
return colIndex;
};
PivotEngine.prototype.frameDrillObject = function (vDrilledItem) {
if (vDrilledItem === void 0) { vDrilledItem = null; }
this.fieldDrillCollection = {};
for (var fieldCnt = 0; fieldCnt < this.drilledMembers.length; fieldCnt++) {
var drillOption = this.drilledMembers[fieldCnt];
var hasValueField = false;
var levelCount = 1;
var isFieldAvail = false;
var field = this.fieldList[drillOption.name];
var isDrillMemberExpand = (field && field.expandAll);
for (var i = 0; i < this.dataSourceSettings.rows.length; i++) {
if (this.dataSourceSettings.rows[i].name === drillOption.name) {
var hasMeasureIndex = this.valueAxis && (this.isMultiMeasures ||
this.dataSourceSettings.alwaysShowValueHeader) && this.measureIndex > -1 && this.measureIndex <= i;
levelCount = (hasMeasureIndex ? (i + 1) : i) + 1;
hasValueField = hasMeasureIndex ? true : false;
isFieldAvail = true;
break;
}
}
if (!isFieldAvail) {
for (var i = 0; i < this.dataSourceSettings.columns.length; i++) {
if (this.dataSourceSettings.columns[i].name === drillOption.name) {
var hasMeasureIndex = !this.valueAxis && (this.isMultiMeasures ||
this.dataSourceSettings.alwaysShowValueHeader) && this.measureIndex > -1 && this.measureIndex <= i;
levelCount = (hasMeasureIndex ? (i + 1) : i) + 1;
hasValueField = hasMeasureIndex ? true : false;
isFieldAvail = true;
break;
}
}
}
for (var _i = 0, _a = drillOption.items; _i < _a.length; _i++) {
var drilledItem = _a[_i];
var members = drilledItem.split(drillOption.delimiter);
if (levelCount === members.length) {
var memberString = drillOption.name + this.valueSortSettings.headerDelimiter +
members.join(this.valueSortSettings.headerDelimiter);
this.fieldDrillCollection[memberString] = memberString;
if (hasValueField) {
var isAllValuesAvail = false;
if (this.isExpandAll || isDrillMemberExpand) {
for (var _b = 0, _c = this.dataSourceSettings.values; _b < _c.length; _b++) {
var field_1 = _c[_b];
var name_2 = field_1.caption ? field_1.caption : field_1.name;
members[this.measureIndex] = name_2;
if (drillOption.items.indexOf(members.join(drillOption.delimiter)) > -1) {
isAllValuesAvail = true;
}
else {
isAllValuesAvail = false;
break;
}
}
}
if (((this.isExpandAll || isDrillMemberExpand) && isAllValuesAvail) || !this.isExpandAll || !isDrillMemberExpand) {
members = drilledItem.split(drillOption.delimiter);
members.splice(this.measureIndex, 1);
if (vDrilledItem && vDrilledItem.memberName === drilledItem) {
vDrilledItem.memberName = members.join(drillOption.delimiter);
}
memberString = drillOption.name + this.valueSortSettings.headerDelimiter +
members.join(this.valueSortSettings.headerDelimiter);
this.fieldDrillCollection[memberString] = memberString;
}
}
}
}
}
};
PivotEngine.prototype.getRowMemberContributionCount = function (header) {
var isParent = header.isDrilled && header.hasChild;
var fName = header.valueSort && header.valueSort.axis;
var isMeasuresAvail = (header.level <= this.measureIndex) && this.isMultiValueRowAxis;
var shouldCountMember = (!isParent && !isMeasuresAvail) || !this.customProperties.isTabularLayout;
var shouldAddTotals = this.dataSourceSettings.showRowSubTotals &&
this.dataSourceSettings.showSubTotals && (this.fieldList[fName] && this.fieldList[fName].showSubTotals);
var shouldIncludeRowValues = shouldAddTotals ?
(isMeasuresAvail || (isParent && this.showSubTotalsAtBottom)) : (isMeasuresAvail && !isParent);
return (shouldIncludeRowValues ? this.rowValuesLength : 0) + (shouldCountMember ? 1 : 0);
};
PivotEngine.prototype.getIndexedHeaders = function (keys, data, keyInd, position, axis, parentMember, valueFil) {
var hierarchy = [];
var keysPos = 0;
if (keys && keys.length > 0) {
keysPos++;
var rlen = keys.length;
var decisionObj = {};
var fieldName = keys[keyInd].name;
var field = keys[keyInd];
// let members: string[] = Object.keys(this.fieldList[field].members);
var childrens = this.fieldList[fieldName];
if (isNullOrUndefined(this.reportDataType)) {
this.reportDataType = {};
for (var i = 0; i < this.dataSourceSettings.rows.length; i++) {
this.reportDataType[this.dataSourceSettings.rows[i].name] =
this.dataSourceSettings.rows[i].dataType;
}
for (var i = 0; i < this.dataSourceSettings.columns.length; i++) {
this.reportDataType[this.dataSourceSettings.columns[i].name] =
this.dataSourceSettings.columns[i].dataType;
}
for (var i = 0; i < this.dataSourceSettings.values.length; i++) {
this.reportDataType[this.dataSourceSettings.values[i].name] =
this.dataSourceSettings.values[i].dataType;
}
}
childrens.type = !isNullOrUndefined(this.reportDataType[childrens.id]) ? this.reportDataType[childrens.id] : childrens.type;
var isNoData = false;
var isDateType = (this.formatFields[fieldName] &&
(['date', 'dateTime', 'time'].indexOf(this.formatFields[fieldName].type) > -1));
var showNoDataItems = (position.length < 1 && keyInd > 0) || field.showNoDataItems;
var savedMembers = {};
if (showNoDataItems) {
var members = Object.keys(childrens.members);
for (var pos = 0, lt = members.length; pos < lt; pos++) {
if (this.dataSourceSettings.showHeaderWhenEmpty ||
(this.localeObj && members[pos] !== this.localeObj.getConstant('undefined'))) {
savedMembers[members[pos]] = members[pos];
}
}
if (position.length < 1) {
isNoData = true;
position.length = members.length;
}
}
if (axis === this.dataSourceSettings.valueAxis && this.measureIndex === keyInd &&
(this.dataSourceSettings.values.length > 1 || this.dataSourceSettings.alwaysShowValueHeader)) {
this.isLastHeaderHasMeasures = false;
}
for (var pos = 0, lt = position.length; pos < lt; pos++) {
var member = {};
if (!isNullOrUndefined(keys[keyInd].showSubTotals) && !keys[keyInd].showSubTotals) {
member.showSubTotals = false;
}
member.hasChild = keyInd < rlen - 1;
member.level = keyInd;
member.axis = axis;
member.colSpan = 1;
var memInd = isNoData ? childrens.members[Object.keys(savedMembers)[0]].ordinal :
this.valueMatrix[position[pos]][childrens.index].ordinal;
var headerValue = isNoData ? Object.keys(savedMembers)[0] :
data[position[pos]][this.fieldKeys[fieldName]];
headerValue = this.enableHtmlSanitizer ? SanitizeHtmlHelper.sanitize(headerValue) : headerValue;
if ((isNullOrUndefined(headerValue) || (this.localeObj && headerValue === this.localeObj.getConstant('undefined')))
&& !this.dataSourceSettings.showHeaderWhenEmpty) {
if (showNoDataItems && !isNoData && keyInd > 0 && pos + 1 === position.length &&
Object.keys(savedMembers).length > 0) {
lt = Object.keys(savedMembers).length;
isNoData = true;
pos = -1;
}
continue;
}
delete savedMembers[headerValue];
if (showNoDataItems && this.fieldFilterMem[fieldName] &&
this.fieldFilterMem[fieldName].memberObj[headerValue] === headerValue) {
continue;
}
var formattedValue = isDateType ? {
actualText: headerValue,
formattedText: childrens.dateMember[memInd - 1].formattedText,
dateText: childrens.dateMember[memInd - 1].actualText
} : {
formattedText: headerValue === null ? (this.localeObj ? this.localeObj.getConstant('null') : String(headerValue)) :
headerValue === undefined ? (this.localeObj ? (fieldName in this.groupingFields) ?
this.localeObj.getConstant('groupOutOfRange') : this.localeObj.getConstant('undefined') :
String(headerValue)) : String(headerValue), actualText: headerValue === null ? (this.localeObj ?
this.localeObj.getConstant('null') : String(headerValue)) : headerValue === undefined ?
(this.localeObj ? (fieldName in this.groupingFields) ? this.localeObj.getConstant('groupOutOfRange') :
this.localeObj.getConstant('undefined') : String(headerValue)) : headerValue
};
member.actualText = formattedValue.actualText;
member.formattedText = formattedValue.formattedText;
if (isDateType) {
member.dateText = formattedValue.dateText;
}
var availData = showNoDataItems ? (this.filterPosObj[position[pos]] !== undefined &&
!isNoData ? true : false) : true;
//member.name = members[memInd as number];
// member.type = member.hasChild ? 'All' : 'Single';
var isFiltered = false;
if (showNoDataItems && childrens.filter.length > 0 && childrens.filterType === 'include') {
isFiltered = true;
}
if ((!(decisionObj && decisionObj[memInd])) && (!isFiltered ||
(isFiltered && childrens.filter.indexOf(headerValue.toString()) > -1))) {
decisionObj[memInd] = { index: [], indexObject: {} };
member.index = decisionObj[memInd].index;
member.indexObject = decisionObj[memInd].indexObject;
if (availData) {
member.index = decisionObj[memInd].index = [position[pos]];
decisionObj[memInd].indexObject[position[pos]] = position[pos];
member.indexObject = decisionObj[memInd].indexObject;
}
member.ordinal = memInd;
member.valueSort = {};
member.valueSort.axis = fieldName;
if (keyInd !== 0) {
member.valueSort.levelName = parentMember + this.valueSortSettings.headerDelimiter +
(this.customProperties.isTabularLayout ?
this.getFormattedValue(member.formattedText, childrens.caption).formattedText : member.formattedText);
member.valueSort[parentMember + this.valueSortSettings.headerDelimiter + member.formattedText] = 1;
member.valueSort.uniqueName = parentMember + this.valueSortSettings.headerDelimiter +
(member.actualText ? member.actualText : member.formattedText);
member.valueSort[parentMember + this.valueSortSettings.headerDelimiter + (member.actualText ?
member.actualText : member.formattedText)] = 1;
}
else {
member.valueSort[member.formattedText] = 1;
member.valueSort.levelName = (this.customProperties.isTabularLayout ?
this.getFormattedValue(member.formattedText, childrens.caption).formattedText : member.formattedText);
member.valueSort[member.actualText ? member.actualText : member.formattedText] = 1;
member.valueSort.uniqueName = (member.actualText ? member.actualText : member.formattedText);
}
var memberString = member.valueSort.axis + this.valueSortSettings.headerDelimiter + member.valueSort.levelName;
var isExpandMember = this.isExpandAll || (field && field.expandAll);
member.isDrilled = (valueFil && this.isValueFiltersAvail) ? true :
(member.hasChild && this.fieldDrillCollection[memberString]) ?
isExpandMember ? (!this.valueAxis && !this.isLastHeaderHasMeasures && (keysPos >= this.measureIndex) ?
true : false) : true : isExpandMember;
//if (!member.members) {
member.members = [];
//}
//let copyObj: AxisSet = Object.create(member);
hierarchy.push(member);
}
else if (availData) {
decisionObj[memInd].index.push(position[pos]);
decisionObj[memInd].indexObject[position[pos]] = position[pos];
}
if (showNoDataItems && !isNoData && keyInd > 0 && pos + 1 === position.length &&
Object.keys(savedMembers).length > 0) {
isNoData = true;
lt = Object.keys(savedMembers).length;
pos = -1;
}
}
for (var iln = 0, ilt = hierarchy.length; iln < ilt; iln++) {
if (!this.frameHeaderObjectsCollection) {
if (axis === 'row') {
this.rowCount += this.getRowMemberContributionCount(hierarchy[iln]);
}
else {
this.columnCount += hierarchy[iln].level <= this.measureIndex ? this.colValuesLength : 1;
}
}
var level = null;
if (hierarchy[iln].valueSort && hierarchy[iln].valueSort.levelName) {
level = hierarchy[iln].valueSort.levelName;
}
parentMember = (level || hierarchy[iln].formattedText);
if (!this.dataSourceSettings.showHeaderWhenEmpty && rlen - 1 > keyInd && hierarchy[iln].index &&
hierarchy[iln].index.length > 0) {
if (showNoDataItems && keys[keyInd + 1] && keys[keyInd + 1].name &&
Object.keys(this.fieldList[keys[keyInd + 1].name].members).length > 0) {
hierarchy[iln].hasChild = true;
}
else {
var hIndLen = hierarchy[iln].index.length;
var count = 0;
for (var len = 0; len < hIndLen; len++) {
var headerValue = data[hierarchy[iln].index[len]][this.fieldKeys[keys[keyInd + 1].name]];
if ((isNullOrUndefined(headerValue) || (this.localeObj &&
headerValue === this.localeObj.getConstant('undefined')))) {
count++;
}
}
hierarchy[iln].hasChild = count !== hIndLen;
}
}
if (rlen - 1 > keyInd && hierarchy[iln].isDrilled) {
this.columnCount -= (!(this.dataSourceSettings.showSubTotals && this.dataSourceSettings.showColumnSubTotals && field.showSubTotals) && axis === 'column') ?
this.colValuesLength : 0;
var filterPosition = hierarchy[iln].index;
hierarchy[iln].members = this.getIndexedHeaders(keys, data, keyInd + 1, (filterPosition === undefined ? [] : filterPosition), axis, parentMember, valueFil);
if (axis === 'row' && hierarchy[iln].members.length > 0) {
this.drillDownLevel(keyInd);
}
if (this.frameHeaderObjectsCollection) {
this.headerObjectsCollection[parentMember] = hierarchy[iln].members;
}
}
}
if (this.enableSort) {
// return new DataManager(hierarchy as JSON[]).executeLocal(new Query().sortBy('actualText', childrens.sort.toLowerCase()));
if (isDateType) {
return this.sortHeaders(fieldName, childrens, hierarchy, childrens.sort, 'date');
}
else {
if (childrens.type.toLowerCase() === 'number' && hierarchy.length > 0 && (typeof (hierarchy[0].actualText) === 'string') && hierarchy[0].actualText.match(/[a-zA-Z]+/g)) {
var stringValue = [];
var outOfRange = void 0;
var alphaNumbervalue = [];
var nullValue = [];
for (var i = 0; i < hierarchy.length; i++) {
if (isNullOrUndefined(hierarchy[i].actualText.toString().match(/\d+/))) {
stringValue.push(hierarchy[i]);
if (!outOfRange && childrens.sort !== 'None') {
if (hierarchy[i].actualText === 'Out of Range') {
outOfRange = hierarchy[i];
hierarchy.splice(i, 1);
}
}
}
else if (hierarchy[i].actualText === '') {
nullValue.push(hierarchy[i]);
}
else {
this.fieldList[fieldName].isAlphanumeric = true;
alphaNumbervalue.push(hierarchy[i]);
break;
}
}
if (outOfRange) {
if (childrens.sort === 'Ascending') {
if (hierarchy[0].actualText === 'Grand Total') {
hierarchy.splice(1, 0, outOfRange);
}
else {
hierarchy.splice(0, 0, outOfRange);
}
}
else {
if (hierarchy[hierarchy.length - 1].actualText === 'Grand Total') {
hierarchy.splice(hierarchy.length - 1, 0, outOfRange);
}
else {
hierarchy.splice(hierarchy.length, 0, outOfRange);
}
}
}
if (alphaNumbervalue.length > 0) {
this.sortHeaders(fieldName, childrens, hierarchy, childrens.sort, childrens.isAlphanumeric);
}
return hierarchy;
}
else {
return this.sortHeaders(fieldName, childrens, hierarchy, childrens.sort, childrens.type);
}
}
}
else {
return hierarchy;
}
}
else {
return hierarchy;
}
};
PivotEngine.prototype.getOrderedIndex = function (headers) {
var orderedIndex = {};
for (var i = 0; i < headers.length; i++) {
if (headers[i].type !== 'grand sum') {
orderedIndex[headers[i].ordinal] = i;
}
}
return orderedIndex;
};
PivotEngine.prototype.insertPosition = function (keys, data, keyInd, position, axis, parentMember, slicedHeaders) {
var hierarchy = [];
var orderedIndex = this.getOrderedIndex(slicedHeaders);
if (keys) {
var decisionObj = {};
var field = keys[keyInd].name;
var childrens = this.fieldList[field];
for (var pos = 0, lt = position.length; pos < lt; pos++) {
var member = {};
var memInd = this.valueMatrix[position[pos]][childrens.index].ordinal;
var slicedHeader = slicedHeaders[orderedIndex[memInd]];
var value = data[position[pos]][this.fieldKeys[field]];
value = value === null ? (this.localeObj ? this.localeObj.getConstant('null') : String(value)) : value;
var formattedValue = (this.formatFields[field] &&
(['date', 'dateTime', 'time'].indexOf(this.formatFields[field].type) > -1)) ?
this.getFormattedValue(value, field) : { formattedText: value.toString(), actualText: value.toString() };
if (!(slicedHeader && slicedHeader.formattedText === formattedValue.formattedText)) {
continue;
}
if (!(decisionObj && decisionObj[memInd])) {
decisionObj[memInd] = { index: [], indexObject: {} };
slicedHeader.index = decisionObj[memInd].index = [position[pos]];
decisionObj[memInd].indexObject[position[pos]] = position[pos];
slicedHeader.indexObject = decisionObj[memInd].indexObject;
slicedHeader.valueSort = {};
slicedHeader.valueSort.axis = field;
if (keyInd !== 0) {
slicedHeader.valueSort.levelName = parentMember + this.valueSortSettings.headerDelimiter +
slicedHeader.formattedText;
slicedHeader.valueSort[parentMember + this.valueSortSettings.headerDelimiter +
slicedHeader.formattedText] = 1;
slicedHeader.valueSort.uniqueName = parentMember + this.valueSortSettings.headerDelimiter +
(slicedHeader.actualText ? slicedHeader.actualText : slicedHeader.formattedText);
slicedHeader.valueSort[parentMember + this.valueSortSettings.headerDelimiter +
(slicedHeader.actualText ? slicedHeader.actualText : slicedHeader.formattedText)] = 1;
}
else {
slicedHeader.valueSort[slicedHeader.formattedText] = 1;
slicedHeader.valueSort.levelName = slicedHeader.formattedText;
slicedHeader.valueSort[(slicedHeader.actualText ? slicedHeader.actualText : slicedHeader.formattedText)] = 1;
slicedHeader.valueSort.uniqueName =
(slicedHeader.actualText ? slicedHeader.actualText : slicedHeader.formattedText);
}
member.members = [];
hierarchy.push(member);
}
else {
decisionObj[memInd].index.push(position[pos]);
decisionObj[memInd].indexObject[position[pos]] = position[pos];
}
}
var diff = slicedHeaders.length - hierarchy.length;
while (diff > 0) {
hierarchy.push({ members: [] });
diff--;
}
for (var iln = 0, ilt = hierarchy.length; iln < ilt; iln++) {
if (slicedHeaders[iln].members.length > 0) {
var level = null;
if (slicedHeaders[iln].valueSort && slicedHeaders[iln].valueSort.levelName) {
level = slicedHeaders[iln].valueSort.levelName;
}
parentMember = (level || slicedHeaders[iln].formattedText);
hierarchy[iln].members = this.insertPosition(keys, data, keyInd + 1, slicedHeaders[iln].index, axis, parentMember, slicedHeaders[iln].members);
}
}
return hierarchy;
}
else {
return hierarchy;
}
};
PivotEngine.prototype.insertTotalPosition = function (headers) {
var summCell = headers[headers.length - 1];
if (summCell && summCell.type === 'grand sum') {
summCell.index = this.filterMembers;
summCell.indexObject = {};
for (var ln = 0, lt = this.filterMembers.length; ln < lt; ln++) {
summCell.indexObject[this.filterMembers[ln]] = this.filterMembers[ln];
}
}
return headers;
};
PivotEngine.prototype.calculatePagingValues = function () {
if (this.isPagingOrVirtualizationEnabled) {
if (this.valueAxis === 1) {
this.rowValuesLength = this.dataSourceSettings.values.length;
}
else {
this.colValuesLength = this.dataSourceSettings.values.length;
}
this.columnPageCount = Math.ceil(this.columnCount / this.pageSettings.columnPageSize);
this.rowPageCount = Math.ceil(this.rowCount / this.pageSettings.rowPageSize);
this.pageSettings.currentColumnPage = this.pageSettings.currentColumnPage >= this.columnPageCount ||
(this.enableOptimizedRendering && this.pageSettings.currentColumnPage > 1 &&
((this.pageSettings.currentColumnPage + 1) * this.colValuesLength) >= this.columnPageCount) ?
this.columnPageCount : this.pageSettings.currentColumnPage;
this.pageSettings.currentRowPage = this.pageSettings.currentRowPage >= this.rowPageCount ||
(this.enableOptimizedRendering && this.pageSettings.currentRowPage > 1 &&
((this.pageSettings.currentRowPage + 1) * this.rowValuesLength) >= this.rowPageCount) ?
this.rowPageCount : this.pageSettings.currentRowPage;
var requirePageCount = this.enablePaging ? 1 : this.enableOptimizedRendering ? 1.5 : this.viewportPageCount;
this.memberCnt = 0;
this.rowStartPos = ((this.pageSettings.currentRowPage * this.pageSettings.rowPageSize) -
(this.pageSettings.rowPageSize)) * (this.enablePaging ? 1 : this.rowValuesLength) + (this.enablePaging ? 1 : 0);
var exactStartPos = this.enablePaging ? this.rowStartPos :
(this.rowStartPos + (this.pageSettings.rowPageSize * requirePageCount * this.rowValuesLength)) > this.rowCount ?
(this.rowCount - (this.pageSettings.rowPageSize * requirePageCount * this.rowValuesLength)) : this.rowStartPos;
if (exactStartPos < 0) {
exactStartPos = this.rowStartPos = 0;
this.pageSettings.currentRowPage = 1;
}
this.rowFirstLvl = (this.rowStartPos - exactStartPos) % this.pageSettings.rowPageSize;
this.rowStartPos = exactStartPos;
this.endPos = this.rowStartPos + (this.pageSettings.rowPageSize * requirePageCount * (this.enablePaging ? 1 :
this.rowValuesLength)) - (this.enablePaging ? 1 : 0);
this.endPos = this.endPos > (this.rowCount + 1) ? (this.rowCount + 1) : this.endPos;
this.lastMember = {};
this.rMembers = this.performSlicing(this.rMembers, [], this.rowStartPos, 'row');
this.memberCnt = this.enablePaging ? 0 : -this.colValuesLength;
this.pageInLimit = false;
this.colHdrBufferCalculated = false;
this.colStartPos = ((this.pageSettings.currentColumnPage * this.pageSettings.columnPageSize) -
(this.pageSettings.columnPageSize)) * (this.enablePaging ? 1 : this.colValuesLength) + (this.enablePaging ? 1 : 0);
exactStartPos = this.enablePaging ? this.colStartPos : (this.colStartPos + (this.pageSettings.columnPageSize *
requirePageCount * this.colValuesLength)) > this.columnCount ? (this.columnCount - (this.pageSettings.columnPageSize *
requirePageCount * this.colValuesLength)) : this.colStartPos;
if (exactStartPos < 0) {
exactStartPos = this.colStartPos = 0;
this.pageSettings.currentColumnPage = 1;
}
this.colFirstLvl = (this.colStartPos - exactStartPos) % this.pageSettings.columnPageSize;
this.colStartPos = exactStartPos;
this.endPos = this.colStartPos + (this.pageSettings.columnPageSize * requirePageCount *
(this.enablePaging ? 1 : this.colValuesLength)) - (this.enablePaging ? 1 : 0);
this.endPos = this.endPos > (this.columnCount + 1) ? (this.columnCount + 1) : this.endPos;
this.cMembers = this.performSlicing(this.cMembers, [], this.colStartPos, 'column');
this.memberCnt = -1;
this.pageInLimit = false;
if (this.isValueHasAdvancedAggregate) {
if (this.rMembers[this.rMembers.length - 1].type !== 'grand sum' &&
this.headerCollection.rowHeaders[this.headerCollection.rowHeaders.length - 1].type === 'grand sum') {
this.rMembers.push(this.headerCollection.rowHeaders[this.headerCollection.rowHeaders.length - 1]);
this.removeRowGrandTotal = true;
}
if (this.cMembers[this.cMembers.length - 1].type !== 'grand sum' &&
this.headerCollection.columnHeaders[this.headerCollection.columnHeaders.length - 1].type === 'grand sum') {
this.cMembers.push(this.headerCollection.columnHeaders[this.headerCollection.columnHeaders.length - 1]);
this.removeColumnGrandTotal = true;
}
}
else {
var getHeadersByType = function (headers, type) {
if (!headers || headers.length === 0) {
return undefined;
}
return headers.find(function (h) { return h && h.type === type; });
};
var rowGrand = this.headerCollection && this.headerCollection.rowHeaders
? getHeadersByType(this.headerCollection.rowHeaders, 'grand sum') : undefined;
var colGrand = this.headerCollection && this.headerCollection.columnHeaders
? getHeadersByType(this.headerCollection.columnHeaders, 'grand sum') : undefined;
var showRowGrandTotal = !!(this.dataSourceSettings && this.dataSourceSettings.showGrandTotals &&
this.dataSourceSettings.showRowGrandTotals);
var showColGrandTotal = !!(this.dataSourceSettings && this.dataSourceSettings.showGrandTotals &&
this.dataSourceSettings.showColumnGrandTotals);
this.rowGrandTotal = this.rowGrandTotal ? this.rowGrandTotal : (rowGrand && showRowGrandTotal ? rowGrand : null);
this.columnGrandTotal = this.columnGrandTotal ? this.columnGrandTotal : (colGrand && showColGrandTotal ? colGrand : null);
if (!this.rowGrandTotal || (this.rowGrandTotal.type !== 'grand sum')) {
var createdRow = this.insertAllMember([], this.filterMembers, '', 'row');
if (createdRow && createdRow.length > 0) {
this.rowGrandTotal = createdRow[0];
this.removeRowGrandTotal = true;
}
}
if (!this.columnGrandTotal || (this.columnGrandTotal.type !== 'grand sum')) {
var createdCol = this.insertAllMember([], this.filterMembers, '', 'column');
if (createdCol && createdCol.length > 0) {
this.columnGrandTotal = createdCol[0];
this.removeColumnGrandTotal = true;
}
}
}
}
};
PivotEngine.prototype.performSlicing = function (headers, slicedHeaders, startPos, axis) {
var pos = 0;
while (headers[pos]) {
if (this.enablePaging && this.endPos <= this.memberCnt && pos !== 0) {
break;
}
if (axis === 'row') {
this.memberCnt += this.getRowMemberContributionCount(headers[pos]);
}
else {
this.memberCnt += headers[pos].level <= this.measureIndex ? this.colValuesLength : 1;
}
if (!this.pageInLimit && startPos <= this.memberCnt) {
if (axis === 'column') {
this.colFirstLvl = this.colFirstLvl + headers[pos].level;
}
else {
if (!this.customProperties.isTabularLayout) {
this.rowFirstLvl = this.rowFirstLvl + headers[pos].level;
}
}
this.pageInLimit = true;
}
if (this.pageInLimit && !this.enablePaging) {
var isValidLimit = axis === 'column' ? this.endPos <= this.memberCnt : this.endPos < this.memberCnt;
if (isValidLimit) {
if (axis === 'column') {
if (headers[pos].members.length === 0) {
if (this.colHdrBufferCalculated) {
break;
}
this.colHdrBufferCalculated = true;
this.endPos += (headers[pos].level * this.colValuesLength);
}
else if (this.colHdrBufferCalculated) {
break;
}
}
else {
break;
}
}
}
if (axis === 'row' && headers[pos] && headers[pos].members &&
headers[pos].members.length > 0 &&
headers[pos].members[headers[pos].members.length - 1] &&
headers[pos].members[headers[pos].members.length - 1].valueSort &&
headers[pos].members[headers[pos].members.length - 1].valueSort.levelName) {
this.addLastMember(headers[pos].actualText, headers[pos].members[headers[pos].members.length - 1].valueSort.levelName);
}
slicedHeaders.push(headers[pos].members.length > 0 ?
this.removeChildMembers(headers[pos]) : headers[pos]);
if (headers[pos].members.length > 0) {
if (axis === 'column') {
this.memberCnt -= !(this.dataSourceSettings.showSubTotals && this.dataSourceSettings.showColumnSubTotals &&
this.columnKeys[headers[pos].valueSort.axis].showSubTotals) ?
this.colValuesLength : 0;
}
slicedHeaders[slicedHeaders.length - 1].members = this.performSlicing(headers[pos].members, [], startPos, axis);
}
if (!this.pageInLimit) {
slicedHeaders.pop();
}
if (headers[pos].level === 0 && this.pageInLimit && this.endPos <= this.memberCnt) {
break;
}
pos++;
}
return slicedHeaders;
};
/**
* Stores the last member level name for each field member in the pivot table.
*
* @param {string} key - The field member key identifier in the pivot table hierarchy.
* @param {string} levelName - The member level name to be stored or added to the field member.
* @returns {void}
*/
PivotEngine.prototype.addLastMember = function (key, levelName) {
var lastFieldMemberName = this.lastMember[key];
if (!lastFieldMemberName) {
this.lastMember[key] = levelName;
}
else if (typeof lastFieldMemberName === 'string' && lastFieldMemberName !== levelName) {
this.lastMember[key] = [lastFieldMemberName, levelName];
}
else if (Array.isArray(lastFieldMemberName) && !lastFieldMemberName.includes(levelName)) {
lastFieldMemberName.push(levelName);
}
};
PivotEngine.prototype.removeChildMembers = function (member) {
var keys = Object.keys(member);
var keyPos = 0;
var framedMember = {};
while (keyPos < keys.length) {
framedMember[keys[keyPos]] = member[keys[keyPos]];
if (keys[keyPos] === 'members') {
framedMember['members'] = [];
}
keyPos++;
}
return framedMember;
};
PivotEngine.prototype.insertAllMember = function (set, filter, customText, axis) {
var len = set.length;
customText = ' Total';
var grandTotalSet = {
hasChild: false,
index: filter,
level: 0,
axis: axis,
isDrilled: false,
indexObject: {},
members: [],
actualText: 'Grand' + customText,
formattedText: this.localeObj ? this.localeObj.getConstant('grandTotal') : ('Grand' + customText),
ordinal: len,
type: 'grand sum',
valueSort: {}
};
grandTotalSet.valueSort[grandTotalSet.formattedText] = 1;
grandTotalSet.valueSort.levelName = grandTotalSet.formattedText;
grandTotalSet.valueSort[grandTotalSet.actualText] = 1;
grandTotalSet.valueSort.uniqueName = grandTotalSet.actualText;
for (var ln = 0, lt = filter.length; ln < lt; ln++) {
grandTotalSet.indexObject[filter[ln]] = filter[ln];
}
if (this.dataSourceSettings.grandTotalsPosition === 'Top' && this.dataSourceSettings.showGrandTotals) {
set.unshift(grandTotalSet);
}
else {
set.push(grandTotalSet);
}
// if (axis === 'row') {
// this.rowCount += this.rowValuesLength;
// } else {
// this.columnCount += this.colValuesLength;
// }
return set;
};
PivotEngine.prototype.getTableData = function (rows, reformAxis, columns, pIndex, data, vlt, level, rTotal, cTotal, valueParentIndex) {
for (var rlt = rows.length, rln = 0; rln < rlt; rln++) {
var tnum = (!this.valueAxis && !this.isLastHeaderHasMeasures && data.length <
(this.dataSourceSettings.columns.length + 1)) ? (this.dataSourceSettings.columns.length + 1) : data.length;
var row = rows[rln];
reformAxis[tnum] = row;
var actCnt = tnum - Number(Object.keys(reformAxis)[0]);
var isLeastNode = !reformAxis[tnum].members.length;
row.colIndex = 0;
row.rowIndex = tnum;
var isRowFieldsAvail = false;
var delimiter = this.dataSourceSettings.valueSortSettings.headerDelimiter;
if (this.valueAxis && this.dataSourceSettings.rows.length === 0 && this.dataSourceSettings.values.length > 1) {
this.rowIndex = (isNullOrUndefined(this.rowIndex) && !isLeastNode &&
this.dataSourceSettings.rows.length === 0) ? row.index : this.rowIndex;
isRowFieldsAvail = (this.valueAxis && this.dataSourceSettings.rows.length === 0 && row.valueSort.levelName &&
row.valueSort.levelName.toString().indexOf('Grand Total' + delimiter) !== 0);
if (this.valueAxis && this.dataSourceSettings.rows.length === 0 &&
row.valueSort.levelName.toString().indexOf('Grand Total' + delimiter) === 0) {
row.index = this.rowIndex;
}
}
if (!isRowFieldsAvail) {
var isValue = false;
if (this.showSubTotalsAtBottom && reformAxis[pIndex] && reformAxis[pIndex].hasChild) {
var axis = void 0;
for (var _i = 0, _a = reformAxis[pIndex].members; _i < _a.length; _i++) {
axis = _a[_i];
if (axis.type === 'value') {
isValue = true;
break;
}
}
}
if (isValue && !reformAxis[tnum].isSum && reformAxis[tnum].members &&
reformAxis[tnum].members.length === 0) {
continue;
}
if (!data[tnum]) {
data[tnum] = [];
this.valueContent[actCnt] = {};
}
data[tnum][0] = reformAxis[tnum]
= this.valueContent[actCnt][0] = PivotUtil.getFormattedHeader(row, this);
if (this.valueAxis && (this.isMultiMeasures || this.dataSourceSettings.alwaysShowValueHeader)) {
var hPos = tnum;
var actpos = actCnt;
var rowIndex = tnum;
var isValueCellUpdated = false;
if ((((!(level === 0 && this.measureIndex === 0) && !isLeastNode) || isLeastNode) && row.type === 'value' && !row.valueSort.axis) ||
(level > this.measureIndex && row.axis === 'row' && row.valueSort.axis)) {
var vln = 0;
var isValueIndexFound = false;
var rowUniqueName = row.valueSort.uniqueName ?
row.valueSort.uniqueName.toString().split(this.valueSortSettings.headerDelimiter) : [];
for (var cln = 0, dln = 1, clt = columns.length; cln < clt; ++cln) {
if (!isValueIndexFound) {
for (vln = 0; vln < vlt; vln++) {
if (rowUniqueName.indexOf(this.dataSourceSettings.values[vln].name) > -1) {
isValueIndexFound = true;
isValueCellUpdated = true;
break;
}
}
}
if (level > this.measureIndex && row.axis === 'row' && row.valueSort.axis) {
this.updateRowData(rows, columns, tnum, data, vln, rln, cln, dln, actCnt, rTotal, cTotal);
}
else {
if (!reformAxis[pIndex]) {
isValueCellUpdated = false;
break;
}
var parentIndex = this.showSubTotalsAtBottom && valueParentIndex ? valueParentIndex : pIndex;
this.updateRowData(reformAxis, columns, tnum, data, vln, parentIndex, cln, dln, actCnt, rTotal, cTotal);
}
dln = data[tnum].length;
}
}
if (!isValueCellUpdated) {
for (var cln = 0, dln = 1, clt = columns.length; cln < clt; ++cln) {
dln = data[tnum].length;
data[hPos][dln] = this.valueContent[actpos][dln] = {
axis: 'value', actualText: '', colSpan: 1,
colIndex: dln, formattedText: '', hasChild: false
};
}
}
this.recursiveRowData(rows, reformAxis, columns, rowIndex, data, vlt, isLeastNode, rln, vlt, level, rTotal, cTotal);
}
else {
for (var cln = 0, dln = 1, clt = columns.length; cln < clt; ++cln) {
var columnUniqueName = columns[cln].valueSort.uniqueName ?
columns[cln].valueSort.uniqueName.toString().split(this.valueSortSettings.headerDelimiter) : [];
for (var vln = 0; vln < vlt; vln++) {
if (!this.valueAxis && !this.isLastHeaderHasMeasures) {
if (columnUniqueName.indexOf(this.dataSourceSettings.values[vln].name) > -1) {
this.updateRowData(rows, columns, tnum, data, vln, rln, cln, dln, actCnt, rTotal, cTotal);
dln = data[tnum].length;
}
}
else {
this.updateRowData(rows, columns, tnum, data, vln, rln, cln, dln, actCnt, rTotal, cTotal);
dln = data[tnum].length;
}
}
}
this.recursiveRowData(rows, reformAxis, columns, tnum, data, vlt, isLeastNode, rln, 0, level, rTotal, cTotal);
}
}
else if (!isLeastNode) {
this.recursiveRowData(rows, reformAxis, columns, tnum, data, vlt, isLeastNode, rln, 0, level, rTotal, cTotal);
}
}
};
PivotEngine.prototype.insertRowSubTotals = function (reformAxis, columns, tnum, data, vlt, level, rTotal, cTotal) {
var isValueAxis = reformAxis[tnum].type ? reformAxis[tnum].type === 'value' &&
reformAxis[tnum].valueSort.levelName !== reformAxis[tnum].actualText : false;
if (reformAxis[tnum].hasChild && reformAxis[tnum].members.length > 0) {
var parentIndexes = [];
var subTotal = PivotUtil.frameHeaderWithKeys(reformAxis[tnum]);
if (reformAxis[tnum].members[0].type === 'value') {
var startIndex = 0;
var valueCells = [];
var i = 1;
for (var _i = 0, _a = subTotal.members; _i < _a.length; _i++) {
var axis = _a[_i];
if (axis.type === 'value') {
valueCells[valueCells.length] = axis;
}
}
while (startIndex < valueCells.length) {
var valueCell = PivotUtil.frameHeaderWithKeys(valueCells[startIndex]);
var index = void 0;
for (i; i < reformAxis.length; i++) {
if (reformAxis[i] && reformAxis[i].valueSort.levelName === valueCell.valueSort.levelName) {
index = reformAxis.indexOf(reformAxis[i]);
break;
}
}
if (index > -1) {
parentIndexes[parentIndexes.length] = index;
}
valueCell.formattedText = subTotal.formattedText + ' ' + valueCell.formattedText;
valueCell.isSum = true;
valueCell.members = [];
this.getTableData([valueCell], reformAxis, columns, tnum, data, vlt, level, rTotal, cTotal);
startIndex++;
}
}
else {
subTotal.formattedText = subTotal.formattedText + ' Total';
subTotal.members = [];
subTotal.isDrilled = false;
subTotal.hasChild = false;
subTotal.isSum = true;
subTotal.type = 'sum';
var parentIndex = isValueAxis ? this.getParentIndex(reformAxis, subTotal) : 0;
var levelName = void 0;
var expectedLevels = void 0;
var matchesExpectedLevel = false;
if (reformAxis && reformAxis[tnum] && reformAxis[tnum].members &&
reformAxis[tnum].members.length > 0) {
var lastMember = reformAxis[tnum].members[reformAxis[tnum].members.length - 1];
if (lastMember.valueSort && typeof lastMember.valueSort.levelName === 'string') {
levelName = lastMember.valueSort.levelName;
}
}
if (this.lastMember && reformAxis && reformAxis[tnum] &&
this.lastMember[reformAxis[tnum].actualText]) {
expectedLevels = this.lastMember[reformAxis[tnum].actualText];
}
if (typeof levelName === 'string' && expectedLevels) {
if (Array.isArray(expectedLevels)) {
matchesExpectedLevel = expectedLevels.indexOf(levelName) !== -1;
}
else if (typeof expectedLevels === 'string') {
matchesExpectedLevel = expectedLevels === levelName;
}
}
if (!this.enableVirtualization || (this.enableVirtualization && matchesExpectedLevel)) {
this.getTableData([subTotal], reformAxis, columns, tnum, data, vlt, level, rTotal, cTotal, parentIndex);
}
parentIndexes = [tnum];
}
for (var index = 0; index < parentIndexes.length; index++) {
var parentInfo = data[parentIndexes[index]];
parentInfo = parentInfo.map(function (dataValue) {
dataValue.formattedText = dataValue.colIndex === 0 ? dataValue.formattedText : '';
return dataValue;
});
data[parentIndexes[index]] = parentInfo;
}
}
};
PivotEngine.prototype.getParentIndex = function (reformAxis, axis) {
var parentIndex = 0;
for (var i = reformAxis.length - 1; i > 0; i--) {
if (axis.level === reformAxis[i].level && reformAxis[i].index) {
parentIndex = i;
break;
}
}
return parentIndex;
};
PivotEngine.prototype.getAggregatedHeaders = function (rows, columns, rMembers, cMembers, values) {
this.selectedHeaders = { selectedHeader: [], values: [] };
for (var vlt = values.length, vln = 0; vln < vlt; vln++) {
switch (values[vln].type) {
case 'DifferenceFrom':
case 'PercentageOfDifferenceFrom':
{
var baseField = void 0;
var baseItem = void 0;
this.selectedHeaders.values.push(values[vln].name);
if (values[vln].baseField && values[vln].baseItem) {
baseField = values[vln].baseField;
baseItem = values[vln].baseItem;
}
else if (this.valueAxis && (this.isMultiMeasures || this.dataSourceSettings.alwaysShowValueHeader) &&
columns.length > 0) {
baseField = columns[0].name;
baseItem = Object.keys(this.fieldList[columns[0].name].members)[0];
}
else if (rows.length > 0) {
baseField = rows[0].name;
baseItem = Object.keys(this.fieldList[rows[0].name].members)[0];
}
var isHeaderSelected = false;
for (var _i = 0, rows_2 = rows; _i < rows_2.length; _i++) {
var row = rows_2[_i];
if (row.name === baseField) {
this.getAggregatedHeaderData(rMembers, values[vln].name, baseItem, false, 'row', values[vln].type, this.selectedHeaders.selectedHeader, vln);
isHeaderSelected = true;
break;
}
}
if (!isHeaderSelected) {
for (var _a = 0, columns_1 = columns; _a < columns_1.length; _a++) {
var column = columns_1[_a];
if (column.name === baseField) {
this.getAggregatedHeaderData(cMembers, values[vln].name, baseItem, false, 'column', values[vln].type, this.selectedHeaders.selectedHeader, vln);
break;
}
}
}
}
break;
case 'PercentageOfParentRowTotal':
case 'PercentageOfParentColumnTotal':
{
this.selectedHeaders.values.push(values[vln].name);
this.getAggregatedHeaderData((values[vln].type === 'PercentageOfParentRowTotal' ? rMembers : cMembers), values[vln].name, undefined, false, (values[vln].type === 'PercentageOfParentRowTotal' ? 'row' : 'column'), values[vln].type, this.selectedHeaders.selectedHeader, vln);
}
break;
case 'RunningTotals':
case 'PercentageOfRunningTotals':
{
this.selectedHeaders.values.push(values[vln].name);
this.getAggregatedHeaderData((this.valueAxis && (this.isMultiMeasures || this.dataSourceSettings.alwaysShowValueHeader) ? cMembers : rMembers), values[vln].name, undefined, false, (this.valueAxis && (this.isMultiMeasures || this.dataSourceSettings.alwaysShowValueHeader) ? 'column' : 'row'), values[vln].type, this.selectedHeaders.selectedHeader, vln);
}
break;
case 'PercentageOfParentTotal':
{
var baseField = void 0;
this.selectedHeaders.values.push(values[vln].name);
if (values[vln].baseField) {
baseField = values[vln].baseField;
}
else if (this.valueAxis && (this.isMultiMeasures || this.dataSourceSettings.alwaysShowValueHeader) &&
columns.length > 0) {
baseField = columns[0].name;
}
else if (rows.length > 0) {
baseField = rows[0].name;
}
var isHeaderSelected = false;
for (var len = rows.length, i = 0; i < len; i++) {
if (rows[i].name === baseField) {
var level = i >= this.measureIndex ? i + 1 : i;
this.getAggregatedHeaderData(rMembers, values[vln].name, undefined, false, 'row', values[vln].type, this.selectedHeaders.selectedHeader, vln, level);
isHeaderSelected = true;
break;
}
}
if (!isHeaderSelected) {
for (var len = columns.length, i = 0; i < len; i++) {
if (columns[i].name === baseField) {
var level = i;
if (!this.valueAxis && !this.isLastHeaderHasMeasures) {
level = i >= this.measureIndex ? i + 1 : i;
}
this.getAggregatedHeaderData(cMembers, values[vln].name, undefined, false, 'column', values[vln].type, this.selectedHeaders.selectedHeader, vln, level);
break;
}
}
}
}
break;
}
}
};
PivotEngine.prototype.getAggregatedHeaderData = function (headers, name, baseItem, isChildren, type, aggregateType, selectedHeaders, vln, level) {
for (var _i = 0, headers_1 = headers; _i < headers_1.length; _i++) {
var rln = headers_1[_i];
switch (aggregateType) {
case 'DifferenceFrom':
case 'PercentageOfDifferenceFrom':
{
var levelName = rln.valueSort.levelName.toString().split(this.valueSortSettings.headerDelimiter);
if (levelName.indexOf(baseItem) !== -1) {
var actualHeaders = [];
if (!isChildren && type === 'row') {
for (var _a = 0, headers_2 = headers; _a < headers_2.length; _a++) {
var header = headers_2[_a];
if (header.level >= rln.level) {
actualHeaders.push(header);
}
}
}
selectedHeaders.push(this.updateSelectedHeaders(baseItem, rln.level, type, isChildren, name, aggregateType, rln.valueSort.levelName, (isChildren ? [rln] : (type === 'column' ? headers : actualHeaders)), vln + 1));
if (rln.members.length > 0) {
var isValuesAvail = false;
var members = [];
if (type === 'row') {
for (var _b = 0, _c = rln.members; _b < _c.length; _b++) {
var member = _c[_b];
if (member.type === 'value' && member.members.length === 0) {
isValuesAvail = true;
}
else {
members.push(member);
isValuesAvail = false;
break;
}
}
}
if ((!isValuesAvail && members.length > 0) || type === 'column') {
this.getAggregatedHeaderData(type === 'column' ? rln.members : members, name, baseItem, true, type, aggregateType, selectedHeaders[selectedHeaders.length - 1].childMembers, vln);
}
}
}
else if (rln.members.length > 0) {
this.getAggregatedHeaderData(rln.members, name, baseItem, false, type, aggregateType, selectedHeaders, vln);
}
}
break;
case 'RunningTotals':
case 'PercentageOfRunningTotals':
case 'PercentageOfParentRowTotal':
case 'PercentageOfParentColumnTotal':
{
if (rln.type === 'grand sum') {
selectedHeaders.push(this.updateSelectedHeaders(undefined, rln.level, type, false, name, aggregateType, rln.valueSort.levelName, headers, vln + 1));
}
else {
if (rln.members.length > 0) {
selectedHeaders.push(this.updateSelectedHeaders(undefined, rln.level, type, false, name, aggregateType, rln.valueSort.levelName, rln.members, vln + 1));
this.getAggregatedHeaderData(rln.members, name, undefined, false, type, aggregateType, selectedHeaders, vln);
}
}
}
break;
case 'PercentageOfParentTotal':
{
if (rln.type !== 'grand sum') {
if ((rln.valueSort.levelName.split(this.valueSortSettings.headerDelimiter).length - 1) === level) {
if (rln.members.length > 0) {
if (isChildren) {
var aggregateHeaders = selectedHeaders[selectedHeaders.length - 1].aggregateHeaders;
for (var _d = 0, _e = rln.members; _d < _e.length; _d++) {
var member = _e[_d];
aggregateHeaders.push(extend({}, member, null, true));
}
}
else {
var children = extend([], rln.members, null, true);
selectedHeaders.push(this.updateSelectedHeaders(undefined, rln.level, type, false, name, aggregateType, rln.valueSort.levelName, children, vln + 1));
var aggregateHeaders = selectedHeaders[selectedHeaders.length - 1].aggregateHeaders;
aggregateHeaders.push(extend({}, rln, null, true));
}
this.getAggregatedHeaderData(rln.members, name, undefined, true, type, aggregateType, selectedHeaders, vln, level + 1);
}
else {
if (!isChildren) {
selectedHeaders.push(this.updateSelectedHeaders(undefined, rln.level, type, false, name, aggregateType, rln.valueSort.levelName, [rln], vln + 1));
}
}
}
else if (rln.members.length > 0) {
this.getAggregatedHeaderData(rln.members, name, undefined, false, type, aggregateType, selectedHeaders, vln, level);
}
}
}
break;
}
}
};
PivotEngine.prototype.updateSelectedHeaders = function (baseItem, level, type, isChildren, name, aggregateType, levelName, headers, vCount) {
var headerData = {
name: baseItem,
level: level,
axis: type,
isChild: isChildren,
value: name,
type: aggregateType,
uniqueName: levelName,
aggregateHeaders: extend([], headers, null, true),
childMembers: [],
valueCount: vCount
};
return headerData;
};
PivotEngine.prototype.applyAdvancedAggregate = function (rowheads, colheads, data) {
this.aggregatedValueMatrix = [];
if (this.selectedHeaders.values.length > 0) {
var pivotIndex = {};
var colIndex = [];
var rowIndex = [];
var isIndexFilled = false;
for (var rlt = data.length, rln = 0; rln < rlt; rln++) {
if (data[rln] !== undefined && data[rln][0] !== undefined) {
if (!isIndexFilled) {
for (var clt = data[rln].length, cln = 0; cln < clt; cln++) {
var actualText = data[rln][cln].actualText;
if (data[rln][cln].axis === 'value' &&
this.selectedHeaders.values.indexOf(actualText) !== -1) {
colIndex.push(cln);
isIndexFilled = true;
}
}
}
var isTotal = this.showSubTotalsAtBottom && data[rln][0].isDrilled &&
data[rln][0].hasChild;
if (!isTotal) {
if (colIndex.length > 0 && data[rln][colIndex[0]].axis === 'value' &&
this.selectedHeaders.values.indexOf(data[rln][colIndex[0]].actualText) !== -1) {
rowIndex.push(rln);
for (var _i = 0, colIndex_1 = colIndex; _i < colIndex_1.length; _i++) {
var index = colIndex_1[_i];
pivotIndex[rln + ',' + index] = [rln, index];
}
}
}
}
}
this.updateAggregates(rowheads, colheads, data, this.selectedHeaders.selectedHeader, colIndex, rowIndex, pivotIndex);
var indexCollection = Object.keys(pivotIndex);
for (var _a = 0, indexCollection_1 = indexCollection; _a < indexCollection_1.length; _a++) {
var index = indexCollection_1[_a];
var currentSet = data[pivotIndex[index][0]][pivotIndex[index][1]];
// currentSet.formattedText = '0';
currentSet.formattedText = (this.selectedHeaders.selectedHeader.length > 0 ? this.emptyCellTextContent : '#N/A');
if (!this.aggregatedValueMatrix[pivotIndex[index][0]]) {
this.aggregatedValueMatrix[pivotIndex[index][0]] = [];
}
this.aggregatedValueMatrix[pivotIndex[index][0]][pivotIndex[index][1]] = 0;
}
this.updatePivotValues(true);
}
else {
return;
}
};
PivotEngine.prototype.calculateColumnGrandTotals = function (rowIndex, colIndex, rowheads, data, name, selectedHeaderCollection) {
var columnTotals = {};
for (var _i = 0, colIndex_2 = colIndex; _i < colIndex_2.length; _i++) {
var colIdx = colIndex_2[_i];
var grandTotal = 0;
for (var _a = 0, selectedHeaderCollection_1 = selectedHeaderCollection; _a < selectedHeaderCollection_1.length; _a++) {
var headerItem = selectedHeaderCollection_1[_a];
for (var _b = 0, rowIndex_1 = rowIndex; _b < rowIndex_1.length; _b++) {
var rowIdx = rowIndex_1[_b];
if (rowheads[rowIdx] !== undefined) {
var currentSet = data[rowIdx][colIdx];
if (rowheads[rowIdx].valueSort[headerItem.valueSort.levelName] &&
rowheads[rowIdx].level === headerItem.level &&
rowheads[rowIdx].type !== 'grand sum' &&
currentSet.axis === 'value' && currentSet.actualText === name) {
grandTotal += this.extractRunningTotalValue(currentSet);
}
}
}
}
columnTotals[colIdx.toString()] = grandTotal;
}
return columnTotals;
};
PivotEngine.prototype.calculateRowGrandTotals = function (rowIndex, activeColumn, data, name, selectedHeaderCollection) {
var rowTotals = {};
for (var _i = 0, rowIndex_2 = rowIndex; _i < rowIndex_2.length; _i++) {
var rowIdx = rowIndex_2[_i];
var grandTotal = 0;
if (data[rowIdx] !== undefined) {
for (var _a = 0, selectedHeaderCollection_2 = selectedHeaderCollection; _a < selectedHeaderCollection_2.length; _a++) {
var headerItem = selectedHeaderCollection_2[_a];
for (var colLen = activeColumn.length, colIdx = 0; colIdx < colLen; colIdx++) {
var currentSet = data[rowIdx][colIdx];
if (activeColumn[colIdx] !== undefined &&
activeColumn[colIdx].valueSort[headerItem.valueSort.levelName] &&
currentSet.axis === 'value' && currentSet.actualText === name) {
if (activeColumn[colIdx].type !== 'grand sum') {
grandTotal += this.extractRunningTotalValue(currentSet);
}
}
}
}
}
rowTotals[rowIdx.toString()] = grandTotal;
}
return rowTotals;
};
PivotEngine.prototype.convertRunningTotalToPercentage = function (accumulatedValue, grandTotal, fieldName) {
var percentageDecimal = grandTotal === 0 ? 0 : (accumulatedValue / grandTotal);
var formattedText = percentageDecimal === 0 && accumulatedValue === 0 ? this.emptyCellTextContent
: this.globalize.formatNumber(percentageDecimal, {
format: 'P',
maximumFractionDigits: this.getPercentFormat(this.formatFields, fieldName)
});
return {
actualValue: percentageDecimal,
formattedText: formattedText
};
};
PivotEngine.prototype.extractRunningTotalValue = function (currentSet) {
return (!currentSet.showSubTotals && !(!isNullOrUndefined(currentSet.actualValue) && isNaN(currentSet.actualValue))) ?
currentSet.actualValue : (!isNullOrUndefined(currentSet.value) &&
!isNaN(currentSet.value)) ? currentSet.value : 0;
};
PivotEngine.prototype.isRowSubtotal = function (rowIdx, rowheads) {
return rowheads[rowIdx] && rowheads[rowIdx].hasChild &&
rowheads[rowIdx].isDrilled &&
((!isNullOrUndefined(rowheads[rowIdx].showSubTotals) &&
!rowheads[rowIdx].showSubTotals) || !this.dataSourceSettings.showSubTotals ||
!this.dataSourceSettings.showRowSubTotals);
};
PivotEngine.prototype.accumulateRowBasedRunningValues = function (colIndex, rowIndex, rowheads, data, name, selectedHeaderCollection, pivotIndex, formatter) {
for (var _i = 0, colIndex_3 = colIndex; _i < colIndex_3.length; _i++) {
var colIdx = colIndex_3[_i];
var accumulatedValue = 0;
for (var _a = 0, selectedHeaderCollection_3 = selectedHeaderCollection; _a < selectedHeaderCollection_3.length; _a++) {
var headerItem = selectedHeaderCollection_3[_a];
for (var _b = 0, rowIndex_3 = rowIndex; _b < rowIndex_3.length; _b++) {
var rowIdx = rowIndex_3[_b];
if (rowheads[rowIdx] !== undefined) {
var currentSet = data[rowIdx][colIdx];
if (rowheads[rowIdx] !== undefined &&
rowheads[rowIdx].valueSort[headerItem.valueSort.levelName] &&
rowheads[rowIdx].level === headerItem.level &&
currentSet.axis === 'value' &&
currentSet.actualText === name) {
if (rowheads[rowIdx].type !== 'grand sum') {
accumulatedValue += this.extractRunningTotalValue(currentSet);
}
var result = formatter(accumulatedValue, colIdx);
currentSet.formattedText = currentSet.showSubTotals ? result.formattedText : currentSet.formattedText;
if (!this.aggregatedValueMatrix[rowIdx]) {
this.aggregatedValueMatrix[rowIdx] = [];
}
this.aggregatedValueMatrix[rowIdx][colIdx] = result.actualValue;
if (pivotIndex[rowIdx + ',' + colIdx]) {
delete pivotIndex[rowIdx + ',' + colIdx];
}
}
}
}
}
}
};
PivotEngine.prototype.accumulateColumnBasedRunningValues = function (rowIndex, activeColumn, rowheads, data, name, selectedHeaderCollection, pivotIndex, formatter) {
for (var _i = 0, rowIndex_4 = rowIndex; _i < rowIndex_4.length; _i++) {
var rowIdx = rowIndex_4[_i];
if (data[rowIdx] !== undefined) {
var accumulatedValue = 0;
for (var _a = 0, selectedHeaderCollection_4 = selectedHeaderCollection; _a < selectedHeaderCollection_4.length; _a++) {
var headerItem = selectedHeaderCollection_4[_a];
for (var colLen = activeColumn.length, colIdx = 0; colIdx < colLen; colIdx++) {
var currentSet = data[rowIdx][colIdx];
if (activeColumn[colIdx] !== undefined &&
activeColumn[colIdx].valueSort[headerItem.valueSort.levelName] &&
currentSet.axis === 'value' &&
currentSet.actualText === name) {
if (activeColumn[colIdx].type !== 'grand sum') {
accumulatedValue += this.extractRunningTotalValue(currentSet);
}
var result = formatter(accumulatedValue, rowIdx);
currentSet.formattedText = currentSet.showSubTotals ? result.formattedText : currentSet.formattedText;
if (!this.aggregatedValueMatrix[rowIdx]) {
this.aggregatedValueMatrix[rowIdx] = [];
}
this.aggregatedValueMatrix[rowIdx][colIdx] = result.actualValue;
if (pivotIndex[rowIdx + ',' + colIdx]) {
delete pivotIndex[rowIdx + ',' + colIdx];
}
}
}
}
}
}
};
PivotEngine.prototype.updateAggregates = function (rowheads, colheads, data, selectedHeaders, colIndex, rowIndex, pivotIndex) {
var _this = this;
var _loop_6 = function (headers) {
var selectedHeaderCollection = headers.aggregateHeaders;
var name_3 = headers.value;
// let valueCount: number = (this.valueAxis && (this.isMutiMeasures || this.dataSourceSettings.alwaysShowValueHeader) ? headers.valueCount : 0);
var aggregateType = headers.type;
var uniqueName = headers.uniqueName;
var axis = headers.axis;
var isRowBaseField = axis === 'row' ? true : false;
var activeValues = void 0;
var indexCollection = [];
var activeColumn = [];
var columnHeaders = [];
var rowindexCollection = [];
var selectedRowValues = [];
var selectedColumnValues = [];
if ((['DifferenceFrom', 'PercentageOfDifferenceFrom', 'PercentageOfParentRowTotal', 'PercentageOfParentColumnTotal', 'PercentageOfParentTotal', 'RunningTotals', 'PercentageOfRunningTotals']).indexOf(headers.type) !== -1) {
if (isRowBaseField) {
if (headers.type !== 'RunningTotals' && headers.type !== 'PercentageOfRunningTotals') {
for (var _i = 0, rowIndex_5 = rowIndex; _i < rowIndex_5.length; _i++) {
var rln = rowIndex_5[_i];
if (rowheads[rln] !== undefined) {
if (rowheads[rln].valueSort[uniqueName]) {
activeValues = rowheads[rln];
if (this_6.valueAxis === 0 || (this_6.valueAxis && data[rln] && data[rln][1] &&
data[rln][1].actualText === name_3)) {
selectedRowValues = data[rln];
}
else {
selectedRowValues = [];
}
break;
}
}
}
}
}
else {
for (var len_5 = data.length, i = 0; i < len_5; i++) {
if (data[i] !== undefined && data[i][0] === undefined) {
columnHeaders.push(data[i]);
}
else {
break;
}
}
var len = columnHeaders.length;
while (len--) {
var axisObj = columnHeaders[len][colIndex[0]];
var cLevelName = axisObj.actualText;
if (this_6.selectedHeaders.values.indexOf(cLevelName) === -1) {
activeColumn = columnHeaders[len];
len = 0;
}
}
if (headers.type !== 'RunningTotals' && headers.type !== 'PercentageOfRunningTotals') {
for (var clt = activeColumn.length, cln = 0; cln < clt; cln++) {
var isSelectedColumn = false;
if (activeColumn[cln] !== undefined && activeColumn[cln].valueSort[uniqueName]) {
activeValues = activeColumn[cln];
for (var len_6 = data.length, i = 0; i < len_6; i++) {
var axisObj = data[i];
if (axisObj !== undefined && axisObj[0] !== undefined && axisObj[cln].axis === 'value' && this_6.selectedHeaders.values.indexOf(axisObj[cln].actualText) !== -1) {
isSelectedColumn = true;
selectedColumnValues[i] = axisObj[cln];
rowindexCollection.push(i);
}
}
if (isSelectedColumn) {
break;
}
}
}
if (selectedColumnValues.length === 0 && rowindexCollection.length === 0) {
for (var clt = activeColumn.length, cln = 0; cln < clt; cln++) {
var isSelectedColumn = false;
if (activeColumn[cln] !== undefined &&
activeColumn[cln].valueSort.levelName.indexOf(uniqueName) === 0) {
activeValues = activeColumn[cln];
for (var lnt = data.length, j = 0; j < lnt; j++) {
var axisObj = data[j];
if (axisObj !== undefined && axisObj[0] !== undefined && axisObj[cln].axis === 'value' && this_6.selectedHeaders.values.indexOf(axisObj[cln].actualText) !== -1) {
isSelectedColumn = true;
// selectedColumnValues[i as number] = axisObj[cln as number] as IAxisSet;
rowindexCollection.push(j);
}
}
if (isSelectedColumn) {
break;
}
}
}
}
}
}
}
switch (headers.type) {
case 'DifferenceFrom':
case 'PercentageOfDifferenceFrom':
{
var isChildren = headers.isChild;
if (isRowBaseField) {
if (!isChildren) {
for (var _a = 0, selectedHeaderCollection_5 = selectedHeaderCollection; _a < selectedHeaderCollection_5.length; _a++) {
var item = selectedHeaderCollection_5[_a];
for (var _b = 0, rowIndex_6 = rowIndex; _b < rowIndex_6.length; _b++) {
var rln = rowIndex_6[_b];
if (rowheads[rln] !== undefined && activeValues !== undefined) {
if (rowheads[rln].valueSort[item.valueSort.levelName] &&
rowheads[rln].level === activeValues.level && rowheads[rln].type !== 'grand sum') {
for (var _c = 0, colIndex_4 = colIndex; _c < colIndex_4.length; _c++) {
var index = colIndex_4[_c];
var currentSet = data[rln][index];
if (currentSet.axis === 'value' && currentSet.actualText === name_3) {
indexCollection.push([rln, index]);
if (pivotIndex[rln + ',' + index]) {
delete pivotIndex[rln + ',' + index];
}
}
}
}
}
}
}
}
else {
var uniqueLevelName = uniqueName.split(this_6.valueSortSettings.headerDelimiter);
for (var _d = 0, rowIndex_7 = rowIndex; _d < rowIndex_7.length; _d++) {
var rlen = rowIndex_7[_d];
if (rowheads[rlen] !== undefined && activeValues !== undefined) {
var levelName = rowheads[rlen].valueSort.levelName.split(this_6.valueSortSettings.headerDelimiter);
if (levelName.indexOf(uniqueLevelName[uniqueLevelName.length - 1]) !== -1 && activeValues &&
rowheads[rlen].level === activeValues.level) {
for (var _e = 0, colIndex_5 = colIndex; _e < colIndex_5.length; _e++) {
var index = colIndex_5[_e];
var currentSet = data[rlen][index];
if (currentSet.axis === 'value' && currentSet.actualText === name_3) {
indexCollection.push([rlen, index]);
if (pivotIndex[rlen + ',' + index]) {
delete pivotIndex[rlen + ',' + index];
}
}
}
}
}
}
}
for (var _f = 0, indexCollection_2 = indexCollection; _f < indexCollection_2.length; _f++) {
var index = indexCollection_2[_f];
var currentSet = data[index[0]][index[1]];
var actualValue = isNullOrUndefined(selectedRowValues[index[1]].actualValue) ? 0 : selectedRowValues[index[1]].actualValue;
// let cVal: number = currentSet.value - (selectedRowValues[index[1]] as IAxisSet).value;
var cVal = (isNullOrUndefined(currentSet.actualValue) ? 0 : currentSet.actualValue) - actualValue;
cVal = isNaN(cVal) ? 0 : (currentSet.value === 0 && selectedRowValues[index[1]].value === 0) ? 0 : cVal;
if (!this_6.aggregatedValueMatrix[index[0]]) {
this_6.aggregatedValueMatrix[index[0]] = [];
}
if (aggregateType === 'DifferenceFrom') {
this_6.aggregatedValueMatrix[index[0]][index[1]] = cVal;
currentSet.formattedText = cVal === 0 ? this_6.emptyCellTextContent :
this_6.getFormattedValue(cVal, name_3).formattedText;
}
else {
// cVal = ((selectedRowValues[index[1]] as IAxisSet).value === 0 ?
// 0 : (cVal / (selectedRowValues[index[1]] as IAxisSet).value));
cVal = (actualValue === 0 ? 0 : (cVal / actualValue));
this_6.aggregatedValueMatrix[index[0]][index[1]] = cVal;
currentSet.formattedText = currentSet.showSubTotals ? (cVal !== 0 ? this_6.globalize.formatNumber(cVal, { format: 'P', maximumFractionDigits: this_6.getPercentFormat(this_6.formatFields, currentSet.actualText) }) : this_6.emptyCellTextContent) : currentSet.formattedText;
}
}
}
else {
if (!isChildren) {
for (var _g = 0, selectedHeaderCollection_6 = selectedHeaderCollection; _g < selectedHeaderCollection_6.length; _g++) {
var item = selectedHeaderCollection_6[_g];
for (var clt = activeColumn.length, cln = 0; cln < clt; cln++) {
var isSelectedColumn = false;
if (activeColumn[cln] !== undefined &&
activeColumn[cln].valueSort[item.valueSort.levelName] && activeValues &&
activeColumn[cln].level === activeValues.level && activeColumn[cln].type !== 'grand sum') {
for (var _h = 0, rowindexCollection_1 = rowindexCollection; _h < rowindexCollection_1.length; _h++) {
var index = rowindexCollection_1[_h];
var currentSet = data[index][cln];
if (currentSet.axis === 'value' && currentSet.actualText === name_3) {
isSelectedColumn = true;
indexCollection.push([index, cln]);
if (pivotIndex[index + ',' + cln]) {
delete pivotIndex[index + ',' + cln];
}
}
}
if (isSelectedColumn) {
break;
}
}
}
}
}
else {
var uniqueLevelName = uniqueName.split(this_6.valueSortSettings.headerDelimiter);
for (var clt = activeColumn.length, clen = 0; clen < clt; clen++) {
var isSelectedColumn = false;
if (activeColumn[clen] !== undefined) {
var levelName = activeColumn[clen].valueSort.levelName.split(this_6.valueSortSettings.headerDelimiter);
if (levelName.indexOf(uniqueLevelName[uniqueLevelName.length - 1]) !== -1 &&
activeColumn[clen].level === activeValues.level) {
for (var _j = 0, rowindexCollection_2 = rowindexCollection; _j < rowindexCollection_2.length; _j++) {
var index = rowindexCollection_2[_j];
var currentSet = data[index][clen];
if (currentSet.axis === 'value' && currentSet.actualText === name_3) {
isSelectedColumn = true;
indexCollection.push([index, clen]);
if (pivotIndex[index + ',' + clen]) {
delete pivotIndex[index + ',' + clen];
}
}
}
if (isSelectedColumn) {
break;
}
}
}
}
}
var selectedColumn = void 0;
if (selectedColumnValues.length === 0) {
selectedColumn = this_6.getSelectedColumn(headers.uniqueName, colheads);
}
for (var _k = 0, indexCollection_3 = indexCollection; _k < indexCollection_3.length; _k++) {
var index = indexCollection_3[_k];
var currentSet = data[index[0]][index[1]];
var selectedColumnValue = 0;
if (selectedColumnValues.length === 0) {
var selectedRow = this_6.getSelectedRow(currentSet.rowHeaders, rowheads);
selectedColumnValue = this_6.getAggregateValue(selectedRow.index, selectedColumn.indexObject, this_6.fieldList[name_3].index, headers.type, false);
}
else {
selectedColumnValue = selectedColumnValues[index[0]].value;
}
var cVal = currentSet.value - selectedColumnValue;
cVal = isNaN(cVal) ? 0 : cVal;
if (!this_6.aggregatedValueMatrix[index[0]]) {
this_6.aggregatedValueMatrix[index[0]] = [];
}
if (aggregateType === 'DifferenceFrom') {
currentSet.formattedText = cVal === 0 ? this_6.emptyCellTextContent :
this_6.getFormattedValue(cVal, name_3).formattedText;
this_6.aggregatedValueMatrix[index[0]][index[1]] = cVal;
}
else {
cVal = (selectedColumnValues[index[0]].value === 0 ?
0 : (cVal / selectedColumnValues[index[0]].value));
currentSet.formattedText = (cVal !== 0 ? this_6.globalize.formatNumber(cVal, { format: 'P', maximumFractionDigits: this_6.getPercentFormat(this_6.formatFields, currentSet.actualText) }) : this_6.emptyCellTextContent);
this_6.aggregatedValueMatrix[index[0]][index[1]] = cVal;
}
}
}
if (headers.childMembers.length > 0) {
this_6.updateAggregates(rowheads, colheads, data, headers.childMembers, colIndex, rowIndex, pivotIndex);
}
}
break;
case 'PercentageOfParentRowTotal':
case 'PercentageOfParentColumnTotal':
case 'PercentageOfParentTotal':
{
if (isRowBaseField) {
for (var _l = 0, selectedHeaderCollection_7 = selectedHeaderCollection; _l < selectedHeaderCollection_7.length; _l++) {
var item = selectedHeaderCollection_7[_l];
for (var _m = 0, rowIndex_8 = rowIndex; _m < rowIndex_8.length; _m++) {
var i = rowIndex_8[_m];
if (rowheads[i] !== undefined) {
if (rowheads[i].valueSort[item.valueSort.levelName] &&
rowheads[i].level === item.level) {
for (var _o = 0, colIndex_6 = colIndex; _o < colIndex_6.length; _o++) {
var index = colIndex_6[_o];
var currentSet = data[i][index];
if (currentSet.axis === 'value' && currentSet.actualText === name_3) {
indexCollection.push([i, index]);
if (pivotIndex[i + ',' + index]) {
delete pivotIndex[i + ',' + index];
}
}
}
}
}
}
}
for (var _p = 0, indexCollection_4 = indexCollection; _p < indexCollection_4.length; _p++) {
var i = indexCollection_4[_p];
var currentSet = data[i[0]][i[1]];
// let cVal: number = currentSet.value / (selectedRowValues[i[1]] as IAxisSet).value;
var selectedRowValue = 0;
if (selectedRowValues.length === 0 && activeValues) {
selectedRowValue = this_6.getAggregateValue(activeValues.index, colheads[i[1] - 1].indexObject, this_6.fieldList[name_3].index, headers.type, false);
}
else {
selectedRowValue = selectedRowValues[i[1]] ? selectedRowValues[i[1]].actualValue : 0;
}
var cVal = currentSet.value / selectedRowValue;
cVal = isNaN(cVal) ? 0 : cVal;
currentSet.formattedText = currentSet.showSubTotals ? (cVal !== 0 ? this_6.globalize.formatNumber(cVal, { format: 'P', maximumFractionDigits: this_6.getPercentFormat(this_6.formatFields, currentSet.actualText) }) : this_6.emptyCellTextContent) : currentSet.formattedText;
if (!this_6.aggregatedValueMatrix[i[0]]) {
this_6.aggregatedValueMatrix[i[0]] = [];
}
this_6.aggregatedValueMatrix[i[0]][i[1]] = cVal;
}
}
else {
for (var _q = 0, selectedHeaderCollection_8 = selectedHeaderCollection; _q < selectedHeaderCollection_8.length; _q++) {
var item = selectedHeaderCollection_8[_q];
for (var clt = activeColumn.length, j = 0; j < clt; j++) {
var isSelectedColumn = false;
if (activeColumn[j] !== undefined &&
activeColumn[j].valueSort[item.valueSort.levelName]) {
for (var _r = 0, rowindexCollection_3 = rowindexCollection; _r < rowindexCollection_3.length; _r++) {
var index = rowindexCollection_3[_r];
var isTotals = this_6.showSubTotalsAtBottom && data[index][0].isDrilled && data[index][0].hasChild;
if (!isTotals) {
var currentSet = data[index][j];
if (currentSet.axis === 'value' && currentSet.actualText === name_3) {
isSelectedColumn = true;
indexCollection.push([index, j]);
if (pivotIndex[index + ',' + j]) {
delete pivotIndex[index + ',' + j];
}
}
}
}
if (isSelectedColumn) {
break;
}
}
}
}
var selectedCol = void 0;
if (selectedColumnValues.length === 0) {
selectedCol = this_6.getSelectedColumn(headers.uniqueName, colheads);
}
for (var _s = 0, indexCollection_5 = indexCollection; _s < indexCollection_5.length; _s++) {
var i = indexCollection_5[_s];
var currentSet = data[i[0]][i[1]];
var selectedColValue = 0;
if (selectedColumnValues.length === 0) {
var selectedRow = this_6.getSelectedRow(currentSet.rowHeaders, rowheads);
selectedColValue = this_6.getAggregateValue(selectedRow.index, selectedCol.indexObject, this_6.fieldList[name_3].index, headers.type, false);
}
else {
selectedColValue = selectedColumnValues[i[0]].value;
}
var val = currentSet.value / selectedColValue;
val = isNaN(val) ? 0 : val;
currentSet.formattedText = (val !== 0 ? this_6.globalize.formatNumber(val, { format: 'P', maximumFractionDigits: this_6.getPercentFormat(this_6.formatFields, currentSet.actualText) }) : this_6.emptyCellTextContent);
if (!this_6.aggregatedValueMatrix[i[0]]) {
this_6.aggregatedValueMatrix[i[0]] = [];
}
this_6.aggregatedValueMatrix[i[0]][i[1]] = val;
}
}
}
break;
case 'RunningTotals':
{
if (isRowBaseField) {
this_6.accumulateRowBasedRunningValues(colIndex, rowIndex, rowheads, data, name_3, selectedHeaderCollection, pivotIndex, function (accumulatedValue, _colIdx) { return ({
formattedText: accumulatedValue === 0 ? '' : _this.getFormattedValue(accumulatedValue, name_3).formattedText,
actualValue: accumulatedValue
}); });
}
else {
this_6.accumulateColumnBasedRunningValues(rowIndex, activeColumn, rowheads, data, name_3, selectedHeaderCollection, pivotIndex, function (accumulatedValue, rowIdx) {
var subTotal = _this.isRowSubtotal(rowIdx, rowheads);
return {
formattedText: subTotal ? '' : _this.getFormattedValue(accumulatedValue, name_3).formattedText,
actualValue: accumulatedValue
};
});
}
}
break;
case 'PercentageOfRunningTotals':
{
if (isRowBaseField) {
var columnTotals_1 = this_6.calculateColumnGrandTotals(rowIndex, colIndex, rowheads, data, name_3, selectedHeaderCollection);
this_6.accumulateRowBasedRunningValues(colIndex, rowIndex, rowheads, data, name_3, selectedHeaderCollection, pivotIndex, function (accumulatedValue, colIdx) {
var grandTotal = columnTotals_1[colIdx.toString()] || 0;
return _this.convertRunningTotalToPercentage(accumulatedValue, grandTotal, name_3);
});
}
else {
var rowTotals_1 = this_6.calculateRowGrandTotals(rowIndex, activeColumn, data, name_3, selectedHeaderCollection);
this_6.accumulateColumnBasedRunningValues(rowIndex, activeColumn, rowheads, data, name_3, selectedHeaderCollection, pivotIndex, function (accumulatedValue, rowIdx) {
var subTotal = _this.isRowSubtotal(rowIdx, rowheads);
if (subTotal) {
return { formattedText: '', actualValue: accumulatedValue };
}
var grandTotal = rowTotals_1[rowIdx.toString()] || 0;
return _this.convertRunningTotalToPercentage(accumulatedValue, grandTotal, name_3);
});
}
}
break;
}
};
var this_6 = this;
for (var _i = 0, selectedHeaders_1 = selectedHeaders; _i < selectedHeaders_1.length; _i++) {
var headers = selectedHeaders_1[_i];
_loop_6(headers);
}
};
PivotEngine.prototype.getSelectedColumn = function (name, colheads) {
var set = { axis: 'column', index: [], indexObject: {} };
for (var _i = 0, colheads_1 = colheads; _i < colheads_1.length; _i++) {
var head = colheads_1[_i];
if (head && head.valueSort && head.valueSort.levelName.indexOf(name) === 0) {
set.index = set.index.concat(head.index).sort(function (a, b) { return a - b; });
set.indexObject = __assign({}, set.indexObject, head.indexObject);
}
}
return set;
};
PivotEngine.prototype.getSelectedRow = function (name, rowheads) {
for (var _i = 0, rowheads_1 = rowheads; _i < rowheads_1.length; _i++) {
var head = rowheads_1[_i];
if (head) {
if (head.valueSort && head.valueSort.levelName === name) {
return head;
}
else if (name === '' && head.type === 'grand sum') {
return head;
}
}
}
return null;
};
PivotEngine.prototype.recursiveRowData = function (rows, reformAxis, columns, tnum, data, vlt, isLeastNode, rln, vln, level, rTotal, cTotal) {
if (!isLeastNode) {
this.getTableData(reformAxis[tnum].members, reformAxis, columns, tnum, data, vlt, level + 1, rTotal, cTotal);
}
if (this.showSubTotalsAtBottom && (!isNullOrUndefined(rows[rln].showSubTotals) ? rows[rln].showSubTotals : true)) {
this.insertRowSubTotals(reformAxis, columns, tnum, data, vlt, level, rTotal, cTotal);
}
if (!this.isPagingOrVirtualizationEnabled) {
reformAxis[tnum].members = [];
}
};
PivotEngine.prototype.updateRowData = function (rows, columns, tnum, data, vln, rln, cln, dln, actCnt, rTotal, cTotal) {
var mPos = this.fieldList[this.dataSourceSettings.values[vln].name].index;
var aggregate = this.fieldList[this.dataSourceSettings.values[vln].name].aggregateType;
var field = this.dataSourceSettings.values[vln].name;
var gTotalIndex = [];
var totalValues = {};
var value = 0;
var actualValue = 0;
// let isLeast: boolean = isLeastNode && (vln === vlt - 1);
switch (aggregate) {
case 'Index':
{
gTotalIndex = [
[rows[rln], columns[cln]], [rows[rln], cTotal],
[rTotal, columns[cln]], [rTotal, cTotal]
];
var valueContent = ['cVal', 'rTotalVal', 'cTotalVal', 'gTotalVal'];
var i = 0;
for (var _i = 0, gTotalIndex_1 = gTotalIndex; _i < gTotalIndex_1.length; _i++) {
var rIndex = gTotalIndex_1[_i];
totalValues[valueContent[i]] = this.getAggregateValue((rIndex[0]).index, (rIndex[1]).indexObject, mPos, aggregate, i === 0 ? false : true);
i++;
}
var val = ((totalValues.cVal) * (totalValues.gTotalVal)) / ((totalValues.rTotalVal) * (totalValues.cTotalVal));
value = (rows[rln].members.length > 0 && rows[rln].hasChild && rows[rln].isDrilled &&
((!isNullOrUndefined(rows[rln].showSubTotals) && !rows[rln].showSubTotals) ||
!this.dataSourceSettings.showRowSubTotals || !this.dataSourceSettings.showSubTotals)) ? undefined :
(isNullOrUndefined(totalValues.cVal) ? totalValues.cVal : (isNaN(val) ? 0 : val));
actualValue = (isNullOrUndefined(totalValues.cVal) ? totalValues.cVal : (isNaN(val) ? 0 : val));
}
break;
case 'PercentageOfGrandTotal':
case 'PercentageOfColumnTotal':
case 'PercentageOfRowTotal':
{
gTotalIndex = [[rows[rln], columns[cln]]];
gTotalIndex.push((aggregate === 'PercentageOfGrandTotal' ?
[rTotal, cTotal] : (aggregate === 'PercentageOfColumnTotal' ? [rTotal, columns[cln]] :
[rows[rln], cTotal])));
var valueContent = ['cVal', 'gTotalVal'];
var i = 0;
for (var _a = 0, gTotalIndex_2 = gTotalIndex; _a < gTotalIndex_2.length; _a++) {
var rIndex = gTotalIndex_2[_a];
totalValues[valueContent[i]] = this.getAggregateValue((rIndex[0]).index, (rIndex[1]).indexObject, mPos, aggregate, i === 0 ? false : true);
i++;
}
var val = ((totalValues.cVal) / (totalValues.gTotalVal));
value = (rows[rln].members.length > 0 && rows[rln].hasChild && rows[rln].isDrilled &&
((!isNullOrUndefined(rows[rln].showSubTotals) && !rows[rln].showSubTotals) ||
!this.dataSourceSettings.showSubTotals || !this.dataSourceSettings.showRowSubTotals)) ? undefined :
(isNullOrUndefined(totalValues.cVal) ? totalValues.cVal : (isNaN(val) ? 0 : val));
actualValue = (isNullOrUndefined(totalValues.cVal) ? totalValues.cVal : (isNaN(val) ? 0 : val));
}
break;
default:
{
var val = this.getAggregateValue(rows[rln].index, columns[cln].indexObject, mPos, aggregate, false);
value = (rows[rln].members.length > 0 && rows[rln].hasChild && rows[rln].isDrilled &&
((!isNullOrUndefined(rows[rln].showSubTotals) && !rows[rln].showSubTotals) ||
!this.dataSourceSettings.showSubTotals || !this.dataSourceSettings.showRowSubTotals)) ? undefined : val;
actualValue = val;
}
break;
}
var rowClone = !isNullOrUndefined(rows[rln]) ? __assign({}, rows[rln]) : null;
var columnClone = !isNullOrUndefined(columns[cln]) ? __assign({}, columns[cln]) : null;
if (!isNullOrUndefined(rowClone) && !rowClone.isSum) {
rowClone.isSum = (rowClone.hasChild && rowClone.isDrilled) || rowClone.type === 'grand sum';
}
if (!isNullOrUndefined(columnClone) && !columnClone.isSum) {
columnClone.isSum = (columnClone.hasChild && columnClone.isDrilled) || columnClone.type === 'grand sum';
}
var cellDetails = {
fieldName: this.dataSourceSettings.values[vln].name, row: rowClone, column: columnClone,
value: value,
cellSets: this.getValueCellInfo ? this.getCellSet(this.rawIndexObject) : [],
rowCellType: (rows[rln].type === 'grand sum' ? 'grandTotal' : ((rows[rln].hasChild &&
rows[rln].isDrilled) || (this.showSubTotalsAtBottom && rows[rln].type === 'sum' &&
rows[rln].isSum)) ? 'subTotal' : 'value'),
columnCellType: (columns[cln].type === 'grand sum' ? 'grandTotal' : ((columns[cln].hasChild &&
columns[cln].isDrilled) || (this.showSubTotalsAtBottom && columns[cln].type === 'sum' &&
columns[cln].isSum)) ? 'subTotal' : 'value'),
aggregateType: aggregate, skipFormatting: false
};
if (this.getValueCellInfo) {
this.getValueCellInfo(cellDetails);
}
value = cellDetails.value;
var isSum = rows[rln].hasChild || columns[cln].hasChild || rows[rln].type === 'grand sum' ||
columns[cln].type === 'grand sum' || (this.showSubTotalsAtBottom && rows[rln].isSum);
var isGrand = rows[rln].type === 'grand sum' || columns[cln].type === 'grand sum';
var subTotal = (rows[rln].members.length > 0 && rows[rln].hasChild &&
rows[rln].isDrilled && ((!isNullOrUndefined(rows[rln].showSubTotals) &&
!rows[rln].showSubTotals) || !this.dataSourceSettings.showSubTotals || !this.dataSourceSettings.showRowSubTotals));
var formattedText = subTotal ?
'' : (value === undefined) ? this.emptyCellTextContent :
(aggregate === 'Count' || aggregate === 'DistinctCount') ? value.toLocaleString() :
this.getFormattedValue(value, field).formattedText;
if (!isNaN(value) && !isNullOrUndefined(value) && (['PercentageOfGrandTotal', 'PercentageOfColumnTotal', 'PercentageOfRowTotal']).indexOf(aggregate) >= 0) {
formattedText = this.globalize.formatNumber(value, { format: 'P', maximumFractionDigits: this.getPercentFormat(this.formatFields, cellDetails.fieldName) });
}
else if (!subTotal &&
isNaN(value) && !isNullOrUndefined(value) &&
(['PopulationStDev', 'SampleStDev', 'PopulationVar', 'SampleVar']).indexOf(aggregate) !== -1) {
formattedText = '#DIV/0!';
value = 0;
}
//dln = data[tnum as number].length;
formattedText = (cellDetails.skipFormatting ? isNullOrUndefined(value) ?
this.emptyCellTextContent : value.toString() : formattedText);
data[tnum][dln] = this.valueContent[actCnt][dln] = {
axis: 'value', actualText: field, indexObject: this.isDrillThrough ? this.rawIndexObject : {},
rowHeaders: rows[rln].type === 'grand sum' ? '' : rows[rln].valueSort.levelName,
columnHeaders: columns[cln].type === 'grand sum' ? '' : columns[cln].valueSort.levelName,
formattedText: formattedText, value: value,
hierarchyName: columns[cln].hierarchyName,
actualValue: actualValue,
rowIndex: tnum, colIndex: dln, isSum: isSum, isGrandSum: isGrand, showSubTotals: !subTotal
};
this.rawIndexObject = {};
};
PivotEngine.prototype.getCellSet = function (rawIndexObject) {
var currentCellSets = [];
var keys = Object.keys(rawIndexObject);
for (var _i = 0, keys_3 = keys; _i < keys_3.length; _i++) {
var index = keys_3[_i];
if (this.data[parseInt(index, 10)]) {
currentCellSets.push(this.data[parseInt(index, 10)]);
}
}
return currentCellSets;
};
PivotEngine.prototype.updateValueMembers = function (hasMeasureIndex, headerInfo, levelInfo, columnHeaders, axis, vcnt, levelIndex) {
var levelName = levelInfo && !isNullOrUndefined(levelInfo.levelName) ? levelInfo.levelName.toString() : undefined;
var uniqueName = levelInfo && !isNullOrUndefined(levelInfo.uniqueName) ? levelInfo.uniqueName.toString() : undefined;
if (hasMeasureIndex) {
for (var vln = 0; vln < vcnt; vln++) {
var field = this.dataSourceSettings.values[vln];
var name_4 = field.caption ? field.caption : field.name;
var calObj = {
axis: this.valueAxis ? 'row' : 'column',
rowIndex: !this.valueAxis ? (headerInfo && levelIndex <= headerInfo.rowIndex ?
(headerInfo.rowIndex + 1) : levelIndex) : 0,
actualText: field.name,
formattedText: name_4,
level: 0,
valueSort: {},
// colIndex: (tnum) + 1 + vln,
// rowIndex: this.measureIndex,
members: [],
type: this.valueAxis ? 'value' : (headerInfo ? headerInfo.type : null),
index: !this.valueAxis && headerInfo ? headerInfo.index : null,
indexObject: !this.valueAxis && headerInfo ? headerInfo.indexObject : null
};
if (axis.length > 0) {
calObj.showSubTotals = field.showSubTotals;
}
var vData = calObj.valueSort;
vData.axis = !this.valueAxis ? field.name : undefined;
vData[(levelName ? (levelName + this.valueSortSettings.headerDelimiter) : '') + name_4] = 1;
vData[(uniqueName ? (uniqueName + this.valueSortSettings.headerDelimiter) : '') + field.name] = 1;
vData.levelName = (levelName ? (levelName + this.valueSortSettings.headerDelimiter) : '') + name_4;
vData.uniqueName = (uniqueName ? (uniqueName + this.valueSortSettings.headerDelimiter) : '') + field.name;
columnHeaders.push(calObj);
this.updateValueMembers(false, headerInfo, vData, calObj.members, axis, vcnt, levelIndex + 1);
}
}
else {
for (var rln = 0, rlt = axis.length; rln < rlt; rln++) {
var header = PivotUtil.frameHeaderWithKeys(axis[rln]);
header.members = [];
header.rowIndex = !this.valueAxis ? (levelIndex < 0 ? 0 : levelIndex) : header.rowIndex;
var hData = {};
hData.axis = header.valueSort.axis;
hData[(levelName ? (levelName + this.valueSortSettings.headerDelimiter) : '') + header.formattedText] = 1;
hData[(uniqueName ? (uniqueName + this.valueSortSettings.headerDelimiter) : '') + header.actualText] = 1;
hData.levelName = (levelName ? (levelName + this.valueSortSettings.headerDelimiter) : '') + header.formattedText;
hData.uniqueName = (uniqueName ? (uniqueName + this.valueSortSettings.headerDelimiter) : '') + header.actualText;
header.hierarchyName = header.valueSort.uniqueName;
header.valueSort = hData;
var drillInfo = hData.axis + this.valueSortSettings.headerDelimiter + hData.levelName;
var isFieldValueHeader = this.fieldList[hData.axis];
if (header.isDrilled && (((this.isExpandAll || isFieldValueHeader.expandAll) &&
this.fieldDrillCollection[drillInfo]) || ((!this.isExpandAll && !isFieldValueHeader.expandAll) &&
!this.fieldDrillCollection[drillInfo]))) {
header.isDrilled = false;
}
columnHeaders.push(header);
if (header.isDrilled && axis[rln].members.length > 0) {
if (this.valueAxis && levelIndex < this.measureIndex && this.measureIndex !== (levelIndex + 1) && (!(axis[rln].hasChild &&
((!isNullOrUndefined(axis[rln].showSubTotals) && !axis[rln].showSubTotals) ||
!this.dataSourceSettings.showSubTotals || !this.dataSourceSettings.showRowSubTotals)))) {
this.updateValueMembers(true, header, hData, columnHeaders[columnHeaders.length - 1].members, [], vcnt, levelIndex);
}
this.updateValueMembers(this.measureIndex === (levelIndex + 1), header, hData, columnHeaders[columnHeaders.length - 1].members, axis[rln].members, vcnt, levelIndex + 1);
if (!this.valueAxis && levelIndex < this.measureIndex && this.measureIndex !== (levelIndex + 1) &&
(!(axis[rln].hasChild && ((!isNullOrUndefined(axis[rln].showSubTotals) &&
!axis[rln].showSubTotals) || !this.dataSourceSettings.showSubTotals ||
!this.dataSourceSettings.showColumnSubTotals)))) {
this.updateValueMembers(true, header, hData, columnHeaders[columnHeaders.length - 1].members, [], vcnt, levelIndex);
}
}
else if (levelIndex < this.measureIndex) {
this.updateValueMembers(true, header, hData, columnHeaders[columnHeaders.length - 1].members, [], vcnt, levelIndex);
}
}
}
};
PivotEngine.prototype.reArrangeValueMember = function (member) {
var valueAxis = [];
for (var _i = 0, member_1 = member; _i < member_1.length; _i++) {
var axis = member_1[_i];
if (this.valueAxisFields[axis.actualText]) {
valueAxis[valueAxis.length] = axis;
}
}
return valueAxis.concat(member).slice(0, member.length);
};
PivotEngine.prototype.frameDefinedHeaderData = function (axis, reformAxis, data, levelIndex, tnum, vcnt) {
// let sortText: string = this.valueSortSettings.headerText;
for (var rln = 0, rlt = axis.length; rln < rlt; rln++) {
var showSubTotals = true;
if (axis[rln].members.length > 0 && ((!isNullOrUndefined(axis[rln].showSubTotals) && !axis[rln].showSubTotals) ||
!this.dataSourceSettings.showSubTotals || !this.dataSourceSettings.showColumnSubTotals)) {
showSubTotals = false;
}
var index = (this.measureIndex < levelIndex && showSubTotals ? 1 : ((this.measureIndex > levelIndex &&
axis[rln].members.length > 0) || !(this.measureIndex === (levelIndex + 1) &&
axis[rln].isDrilled) ? ((this.measureIndex === levelIndex && this.measureIndex !== 0 && showSubTotals) ? 1 : ((this.measureIndex > levelIndex && showSubTotals && axis[rln].valueSort &&
axis[rln].valueSort.axis && this.measureNames[axis[rln].valueSort.axis.toString()]) ? 1 : 0)) : (this.measureIndex === 0 || !showSubTotals ? 0 : 1)));
if (axis[rln].members.length) {
var pos = void 0;
var members = axis[rln].members;
if (this.showSubTotalsAtTop) {
if (levelIndex + 1 < this.measureIndex && showSubTotals) {
pos = tnum;
members = this.reArrangeValueMember(members);
}
else {
pos = tnum + index;
}
}
else {
pos = tnum;
}
this.frameDefinedHeaderData(members, reformAxis, data, levelIndex + 1, pos, vcnt);
}
// let lvl: number = axis[rln as number].level;
// axis[rln as number].rowIndex = lvl;
var level = this.measureIndex > levelIndex && axis[rln].valueSort &&
axis[rln].valueSort.axis && this.measureNames[axis[rln].valueSort.axis.toString()] ?
this.measureIndex : levelIndex;
tnum = this.showSubTotalsAtTop ? tnum + 1 : reformAxis.length + index;
if (!reformAxis[tnum - 1]) {
reformAxis[tnum - 1] = PivotUtil.frameHeaderWithKeys(axis[rln]);
}
axis[rln].colIndex = tnum;
if (!data[level]) {
data[level] = [];
this.headerContent[level] = {};
data[level][tnum] = this.headerContent[level][tnum]
= PivotUtil.frameHeaderWithKeys(axis[rln]);
}
else {
data[level][tnum] = this.headerContent[level][tnum]
= PivotUtil.frameHeaderWithKeys(axis[rln]);
}
if (!this.isPagingOrVirtualizationEnabled && (this.showSubTotalsAtTop ? index !== 0 : true)) {
if (reformAxis[tnum - 1]) {
reformAxis[tnum - 1].members = [];
}
}
if (this.showSubTotalsAtTop) {
tnum = reformAxis.length;
if (rln + 1 === rlt && axis[rln].level === 0) {
this.reformAxisCount = reformAxis.length + 1;
}
}
}
};
PivotEngine.prototype.getHeaderData = function (rows, columns, values, rowAxis, axis, reformAxis, data, tnum, vcnt) {
if (!this.valueAxis && !this.isLastHeaderHasMeasures) {
var columnHeaders = [];
if (this.dataSourceSettings.showGrandTotals && this.dataSourceSettings.showColumnGrandTotals && axis[axis.length - 1].type === 'grand sum') {
this.updateValueMembers(this.measureIndex === 0 && axis.length > 1, null, null, columnHeaders, axis.slice(0, axis.length - 1), vcnt, 0);
this.updateValueMembers(false, null, null, columnHeaders, axis.slice(axis.length - 1, axis.length), vcnt, -1);
}
else if (this.dataSourceSettings.grandTotalsPosition === 'Top' && this.dataSourceSettings.showGrandTotals &&
this.dataSourceSettings.showColumnGrandTotals && this.measureIndex === 0) {
this.updateValueMembers(false, null, null, columnHeaders, axis.slice(0, 1), vcnt, -1);
this.updateValueMembers(this.measureIndex === 0 && axis.length > 1, null, null, columnHeaders, axis.slice(1, axis.length), vcnt, 0);
}
else {
var hasColumnTotal = columns.length === 0 && axis.length === 1 && axis[0].type === 'grand sum';
this.updateValueMembers(!hasColumnTotal && this.measureIndex === 0, null, null, columnHeaders, axis, vcnt, hasColumnTotal ? -1 : 0);
}
this.getAggregatedHeaders(rows, columns, this.rMembers, columnHeaders, values);
if (this.selectedHeaders.values.length > 0) {
for (var clt = this.selectedHeaders.selectedHeader.length, i = 0; i < clt; i++) {
var headerData = this.selectedHeaders.selectedHeader[i];
if (headerData.axis === 'column') {
if (headerData.uniqueName === headerData.value) {
this.selectedHeaders.selectedHeader.splice(i, 1);
i--;
clt--;
}
else if (headerData.uniqueName === 'Grand Total') {
for (var clt_1 = headerData.aggregateHeaders.length, j = 0; j < clt_1; j++) {
if (headerData.aggregateHeaders[j] &&
headerData.aggregateHeaders[j].members.length > 0) {
for (var _i = 0, _a = headerData.aggregateHeaders[j].members; _i < _a.length; _i++) {
var member = _a[_i];
if (member.actualText === headerData.value) {
headerData.aggregateHeaders[j] = member;
if (member.type === 'grand sum') {
headerData.uniqueName = member.valueSort.levelName;
}
}
}
}
}
}
}
}
}
this.frameDefinedHeaderData(columnHeaders, reformAxis, data, 0, this.showSubTotalsAtTop ? 0 : 1, vcnt);
return;
}
else if (rowAxis.length === 0 && (this.valueAxis && (this.isMultiMeasures || this.dataSourceSettings.alwaysShowValueHeader)) &&
this.dataSourceSettings.values.length > 0) {
if (this.dataSourceSettings.showGrandTotals && this.dataSourceSettings.showRowGrandTotals && !isNullOrUndefined(this.rMembers)
&& this.rMembers.length > 0 && this.rMembers[this.rMembers.length - 1].type === 'grand sum') {
this.updateValueMembers(this.measureIndex === 0 && this.rMembers.length > 1, null, null, rowAxis, this.rMembers.slice(0, this.rMembers.length - 1), this.dataSourceSettings.values.length, 0);
this.updateValueMembers(false, null, null, rowAxis, this.rMembers.slice(this.rMembers.length - 1, this.rMembers.length), this.dataSourceSettings.values.length, -1);
}
else if (this.dataSourceSettings.grandTotalsPosition === 'Top' && this.dataSourceSettings.showGrandTotals && this.measureIndex === 0) {
this.updateValueMembers(false, null, null, rowAxis, this.rMembers.slice(0, 1), this.dataSourceSettings.values.length, -1);
this.updateValueMembers(this.measureIndex === 0 && this.rMembers.length > 1, null, null, rowAxis, this.rMembers.slice(1, this.rMembers.length), this.dataSourceSettings.values.length, 0);
}
else {
var hasRowTotal = rows.length === 0 && this.rMembers.length === 1 && this.rMembers[0].type === 'grand sum';
this.updateValueMembers(!hasRowTotal && this.measureIndex === 0, null, null, rowAxis, this.rMembers, this.dataSourceSettings.values.length, hasRowTotal ? -1 : 0);
}
this.getAggregatedHeaders(rows, columns, rowAxis, axis, values);
if (this.selectedHeaders.values.length > 0) {
for (var clt = this.selectedHeaders.selectedHeader.length, i = 0; i < clt; i++) {
var headerData = this.selectedHeaders.selectedHeader[i];
if (headerData.axis === 'row') {
for (var clt_2 = headerData.aggregateHeaders.length, j = 0; j < clt_2; j++) {
if (headerData.aggregateHeaders[j].actualText === headerData.value) {
if (headerData.aggregateHeaders[j].valueSort.levelName.indexOf(headerData.uniqueName) !== -1) {
headerData.uniqueName = headerData.aggregateHeaders[j].valueSort.levelName;
headerData.aggregateHeaders.splice(j, 1);
j--;
clt_2--;
}
else {
for (var count = headerData.aggregateHeaders[j].members.length, k = 0; k < count; k++) {
var member = headerData.aggregateHeaders[j].members[k];
if (member.type !== 'value' && member.level ===
headerData.aggregateHeaders[j].level) {
var members = extend([], headerData.aggregateHeaders[j].members, null, true);
headerData.aggregateHeaders = [].concat(headerData.aggregateHeaders, members, headerData.aggregateHeaders.splice(j));
headerData.aggregateHeaders.splice(members.length + j, 1);
j = (members.length + j) - 1;
clt_2 = headerData.aggregateHeaders.length;
}
}
}
}
else if (headerData.aggregateHeaders[j].actualText !== headerData.value &&
headerData.aggregateHeaders[j].members.length > 0) {
for (var count = headerData.aggregateHeaders[j].members.length, k = 0; k < count; k++) {
var member = headerData.aggregateHeaders[j].members[k];
if (member.actualText === headerData.value) {
if (headerData.uniqueName ===
headerData.aggregateHeaders[j].valueSort.levelName) {
headerData.uniqueName = member.valueSort.levelName;
}
headerData.aggregateHeaders[j].members.splice(k, 1);
headerData.aggregateHeaders[j] = member;
break;
}
}
}
}
}
}
}
}
var rlt = axis.length;
var colItmLn = this.dataSourceSettings.columns.length;
var sortText = this.valueSortSettings.headerText;
//let valueLn: number = this.dataSourceSettings.values.length;
for (var rln = 0; rln < rlt; rln++) {
var isHidden = !isNullOrUndefined(axis[rln].showSubTotals) && !axis[rln].showSubTotals;
if (axis[rln].members.length) {
this.getHeaderData(rows, columns, values, rowAxis, axis[rln].members, reformAxis, data, this.showSubTotalsAtTop && !isHidden ? tnum + 1 : tnum, vcnt);
}
var isTotalHide = true;
tnum = this.showSubTotalsAtTop ? tnum : reformAxis.length;
if (isHidden || !this.dataSourceSettings.showSubTotals || !this.dataSourceSettings.showColumnSubTotals) {
if (!(axis[rln].members.length > 0)) {
reformAxis[this.showSubTotalsAtTop ? tnum : reformAxis.length] = PivotUtil.frameHeaderWithKeys(axis[rln]);
}
else {
this.removeCount++;
isTotalHide = false;
}
tnum = this.showSubTotalsAtTop ? tnum : reformAxis.length - 1;
}
else {
reformAxis[tnum] = PivotUtil.frameHeaderWithKeys(axis[rln]);
}
// let rplus: number = rln + 1;
var lvl = axis[rln].level;
axis[rln].rowIndex = lvl;
var index = (tnum * vcnt) + (this.showSubTotalsAtTop ? 1 : vcnt);
axis[rln].colIndex = index;
if (!data[lvl]) {
data[lvl] = [];
this.headerContent[lvl] = {};
}
data[lvl][index] = this.headerContent[lvl][index] =
PivotUtil.getFormattedHeader(axis[rln], this);
var isSingleMeasure = (this.dataSourceSettings.columns.length === 0 &&
this.dataSourceSettings.values.length === 1) ? true : false;
if ((this.isMultiMeasures || this.dataSourceSettings.alwaysShowValueHeader || isSingleMeasure) &&
!this.valueAxis && isTotalHide) {
for (var vln = 0; vln < vcnt; vln++) {
var name_5 = this.dataSourceSettings.values[vln].caption ?
this.dataSourceSettings.values[vln].caption : this.dataSourceSettings.values[vln].name;
var calObj = {
axis: 'column', actualText: this.dataSourceSettings.values[vln].name, formattedText: name_5, level: 0, valueSort: {},
colIndex: (tnum * vcnt) + 1 + vln, rowIndex: colItmLn
};
if (!data[colItmLn]) {
data[colItmLn] = [];
this.headerContent[colItmLn] = {};
data[colItmLn][(tnum * vcnt) + 1 + vln] =
this.headerContent[colItmLn][(tnum * vcnt) + 1 + vln] = calObj;
}
else {
data[colItmLn][(tnum * vcnt) + 1 + vln] =
this.headerContent[colItmLn][(tnum * vcnt) + 1 + vln] = calObj;
}
var vData = data[colItmLn][(tnum * vcnt) + 1 + vln].valueSort;
vData[axis[rln].valueSort.levelName + this.valueSortSettings.headerDelimiter + name_5] = 1;
vData.levelName = axis[rln].valueSort.levelName + this.valueSortSettings.headerDelimiter + name_5;
vData[axis[rln].valueSort.uniqueName + this.valueSortSettings.headerDelimiter +
this.dataSourceSettings.values[vln].name] = 1;
vData.uniqueName = axis[rln].valueSort.uniqueName +
this.valueSortSettings.headerDelimiter + this.dataSourceSettings.values[vln].name;
if (vData && vData[sortText]) {
this.valueSortSettings.columnIndex = (tnum * vcnt) + 1 + vln;
}
}
}
else if (axis[rln].valueSort && axis[rln].valueSort[sortText]) {
this.valueSortSettings.columnIndex = (tnum * vcnt) + 1;
}
if (!this.isPagingOrVirtualizationEnabled) {
reformAxis[tnum].members = [];
}
if (this.showSubTotalsAtTop) {
tnum = reformAxis.length;
if (axis[rln].level === 0 && rln + 1 === rlt) {
this.reformAxisCount = (reformAxis.length * vcnt) + 1;
}
}
}
};
PivotEngine.prototype.getAggregateValue = function (rowIndex, columnIndex, value, type, isGrandTotal) {
//rowIndex = rowIndex.sort();
//columnIndex = columnIndex.sort();
//let clt: number = columnIndex.length;
var ri = 0;
var cellValue = 0;
var avgCnt = 0;
var isInit = true;
var isValueExist = false;
switch (type.toLowerCase()) {
case 'median':
{
var values = [];
var position = 0;
while (rowIndex[ri] !== undefined) {
var index = rowIndex[ri];
if (columnIndex[index] !== undefined) {
isValueExist = true;
this.rawIndexObject[index] = index;
if (!isNullOrUndefined(this.valueMatrix[index][value].member)) {
values.push(this.valueMatrix[index][value].member);
}
}
ri++;
}
var len = values.length;
if (len > 0) {
values.sort(function (a, b) { return a - b; });
if (len % 2 === 0) {
position = (len / 2) <= 1 ? 0 : ((len / 2) - 1);
cellValue = (values[position] + values[position + 1]) / 2;
}
else {
position = (len + 1) / 2 <= 1 ? 0 : (((len + 1) / 2) - 1);
cellValue = values[position];
}
}
}
break;
case 'count':
{
while (rowIndex[ri] !== undefined) {
var index = rowIndex[ri];
if (columnIndex[index] !== undefined) {
isValueExist = true;
this.rawIndexObject[index] = index;
cellValue += (isNullOrUndefined(this.valueMatrix[index][value].member) ?
0 : (this.allowDataCompression ? this.valueMatrix[index][value].member : 1));
}
ri++;
}
}
break;
case 'distinctcount':
{
var duplicateValues = [];
while (rowIndex[ri] !== undefined) {
if (columnIndex[rowIndex[ri]] !== undefined) {
this.rawIndexObject[rowIndex[ri]] = rowIndex[ri];
isValueExist = true;
var val = (this.data[rowIndex[ri]][this.fieldKeys[this.fields[value]]]);
// let currentVal: number = this.valueMatrix[rowIndex[ri as number]][value as number];
if (!isNullOrUndefined(val)) {
var currentVal = val.toString();
if (duplicateValues.length === 0 || (duplicateValues.length > 0 &&
duplicateValues.indexOf(currentVal) === -1)) {
cellValue += (this.allowDataCompression && typeof val === 'number') ? val : 1;
duplicateValues.push(currentVal);
}
}
}
ri++;
}
}
break;
case 'product':
{
while (rowIndex[ri] !== undefined) {
var index = rowIndex[ri];
if (columnIndex[index] !== undefined) {
this.rawIndexObject[index] = index;
isValueExist = true;
var currentVal = this.valueMatrix[index][value].member;
if (!isNullOrUndefined(currentVal)) {
cellValue = ((isInit || isNullOrUndefined(cellValue)) ? 1 : cellValue);
cellValue *= currentVal;
}
else if (isInit) {
cellValue = currentVal;
}
isInit = false;
}
ri++;
}
}
break;
case 'populationstdev':
case 'samplestdev':
case 'populationvar':
case 'samplevar':
{
var i = 0;
var val = 0;
var indexVal = [];
var avgVal = 0;
var cVal = 0;
var avgDifferenceVal = 0;
while (rowIndex[ri] !== undefined) {
var index = rowIndex[ri];
if (columnIndex[index] !== undefined) {
isValueExist = true;
this.rawIndexObject[index] = index;
var currentVal = this.valueMatrix[index][value].member;
if (!isNullOrUndefined(currentVal)) {
val += currentVal;
indexVal.push(currentVal);
i++;
}
}
ri++;
}
if (i > 0) {
avgVal = val / i;
for (var _i = 0, indexVal_1 = indexVal; _i < indexVal_1.length; _i++) {
var index = indexVal_1[_i];
avgDifferenceVal += Math.pow((index - avgVal), 2);
}
if ((['populationstdev', 'samplestdev']).indexOf(type.toLowerCase()) !== -1) {
cVal = Math.sqrt(avgDifferenceVal / (type.toLowerCase() === 'populationstdev' ? i : (i - 1)));
}
else {
cVal = avgDifferenceVal / (type.toLowerCase() === 'populationvar' ? i : (i - 1));
}
cellValue = (cVal === 0 ? NaN : cVal);
}
else {
cellValue = val;
}
}
break;
case 'min':
{
var isFirst = true;
cellValue = undefined;
while (rowIndex[ri] !== undefined) {
var index = rowIndex[ri];
if (columnIndex[index] !== undefined &&
this.valueMatrix[index][value].member !== undefined) {
isValueExist = true;
this.rawIndexObject[index] = index;
if (isNullOrUndefined(cellValue) &&
isNullOrUndefined(this.valueMatrix[index][value].member)) {
cellValue = this.valueMatrix[index][value].member;
}
else {
if (isFirst) {
cellValue = this.valueMatrix[index][value].member;
isFirst = false;
}
else {
cellValue = this.valueMatrix[index][value].member < cellValue ?
this.valueMatrix[index][value].member : cellValue;
}
}
}
ri++;
}
}
break;
case 'max':
{
var isMaxFirst = true;
while (rowIndex[ri] !== undefined) {
var index = rowIndex[ri];
if (columnIndex[index] !== undefined &&
this.valueMatrix[index][value].member !== undefined) {
isValueExist = true;
this.rawIndexObject[index] = index;
if (isMaxFirst) {
cellValue = this.valueMatrix[index][value].member;
isMaxFirst = false;
}
else {
cellValue = this.valueMatrix[index][value].member > cellValue ?
this.valueMatrix[index][value].member : cellValue;
}
}
ri++;
}
}
break;
case 'calculatedfield':
{
isValueExist = true;
var calcField = this.calculatedFields[this.fields[value]];
var actualFormula = calcField.formula;
var aggregateField = {};
if (this.calculatedFormulas[calcField.name]) {
var calculatedFormulas = this.calculatedFormulas[calcField.name];
for (var len = 0, lmt = calculatedFormulas.length; len < lmt; len++) {
var aggregatedValue = calculatedFormulas[len];
var value_1 = aggregateField[aggregatedValue.formula];
if (value_1 === undefined) {
var type_1 = aggregatedValue.type;
value_1 = this.getAggregateValue(rowIndex, columnIndex, aggregatedValue.index, type_1, false);
aggregateField[aggregatedValue.formula] = value_1;
}
actualFormula = (actualFormula).replace(aggregatedValue.formula, value_1 < 0 ? "(" + String(value_1) + ")" : String(value_1));
}
}
cellValue = this.evaluate(actualFormula);
cellValue = (cellValue === Infinity || cellValue === -Infinity ? Infinity : (cellValue === undefined || isNaN(cellValue)) ?
undefined : JSON.parse(String(cellValue)));
}
break;
default:
{
cellValue = undefined;
while (rowIndex[ri] !== undefined) {
var index = rowIndex[ri];
if (columnIndex[index] !== undefined) {
isValueExist = true;
if (!isGrandTotal) {
this.rawIndexObject[index] = index;
}
//let cIndx: number = isLeastLevel ? columnIndex.splice(columnIndex.indexOf(rowIndex[ri as number]), 1)[0] : rowIndex[ri as number];
var currentVal = this.valueMatrix[index][value].member;
if (isNullOrUndefined(cellValue) && isNullOrUndefined(currentVal)) {
cellValue = currentVal;
}
else {
if (isNullOrUndefined(cellValue)) {
cellValue = 0;
}
cellValue += (isNullOrUndefined(currentVal) ? 0 : currentVal);
}
if (!isNullOrUndefined(currentVal)) {
avgCnt++;
}
}
ri++;
}
}
break;
}
/* if (rlt > clt) {
this.makeMirrorObject(rowIndex, mirror);
while (columnIndex[ci] !== undefined) {
if (mirror[columnIndex[ci]]) {
let cIndx: number = isLeastLevel ? columnIndex.splice(ci, 1)[0] : columnIndex[ci];
//rowIndex.splice
sum += this.valueMatrix[cIndx][value as number];
}
ci++;
}
} else {
this.makeMirrorObject(columnIndex, mirror);
while (rowIndex[ri as number] !== undefined) {
if (mirror[rowIndex[ri as number]]) {
let cIndx: number = isLeastLevel ? columnIndex.splice(columnIndex.indexOf(rowIndex[ri as number]), 1)[0] : rowIndex[ri as number];
sum += this.valueMatrix[rowIndex[ri as number]][value as number];
}
ri++;
}
} */
return ((type && type.toLowerCase() === 'avg' && cellValue !== 0 &&
!isNullOrUndefined(cellValue)) ? (cellValue / avgCnt) : isValueExist ? cellValue : undefined);
};
PivotEngine.prototype.evaluate = function (obj) {
return Function('"use strict";return (' + obj + ')')();
};
/**
* It performs the formatting to get formatted Value
*
* @param {number | string} value - It contains the value which went formatting.
* @param {string} fieldName - It contains the field name.
* @returns {IAxisSet} - It returns the formatted value as IAxisSet data.
* @hidden
*/
PivotEngine.prototype.getFormattedValue = function (value, fieldName) {
var commonValue = value === null ? (this.localeObj ? this.localeObj.getConstant('null') :
String(value)) : value === undefined ?
(this.localeObj ? (fieldName in this.groupingFields) ? this.localeObj.getConstant('groupOutOfRange') :
this.localeObj.getConstant('undefined') : String(value)) : value;
var formattedValue = {
formattedText: commonValue.toString(),
actualText: commonValue,
dateText: commonValue
};
if (this.formatFields[fieldName] && (this.formatFields[fieldName].format ||
this.formatFields[fieldName].skeleton) && !isNullOrUndefined(value)) {
try {
var formatField = (this.formatFields[fieldName].properties ?
this.formatFields[fieldName].properties :
this.formatFields[fieldName]);
var formatSetting = extend({}, formatField, null, true);
delete formatSetting.name;
if (!formatSetting.minimumSignificantDigits && formatSetting.minimumSignificantDigits < 1) {
delete formatSetting.minimumSignificantDigits;
}
if (!formatSetting.maximumSignificantDigits && formatSetting.maximumSignificantDigits < 1) {
delete formatSetting.maximumSignificantDigits;
}
if (formatSetting.type) {
formattedValue.formattedText = this.dateFormatFunction[fieldName].exactFormat(new Date(value))
=== null ? formattedValue.formattedText :
this.dateFormatFunction[fieldName].exactFormat(new Date(value));
formattedValue.actualText = value;
}
else {
delete formatSetting.type;
if ((formatSetting.format) && !(this.formatRegex.test(formatSetting.format))) {
if (isNullOrUndefined(formatSetting.minimumFractionDigits)) {
delete formatSetting.minimumFractionDigits;
}
if (isNullOrUndefined(formatSetting.maximumFractionDigits)) {
delete formatSetting.maximumFractionDigits;
}
if (isNullOrUndefined(formatSetting.minimumIntegerDigits)) {
delete formatSetting.minimumIntegerDigits;
}
}
formattedValue.formattedText =
this.globalize.formatNumber(!isNaN(Number(value)) ? Number(value) : value, formatSetting);
formattedValue.actualText = !isNaN(Number(value)) ? Number(value) : value;
formattedValue.dateText = !isNaN(Number(value)) ? Number(value) : value;
}
if (this.fieldList[fieldName].sort !== 'None' && formatSetting.type &&
['date', 'dateTime', 'time'].indexOf(this.formatFields[fieldName].type) > -1) {
formattedValue.dateText = this.dateFormatFunction[fieldName].fullFormat(new Date(value));
}
if (this.fieldList[fieldName].isCustomField) {
formattedValue.formattedText = formattedValue.formattedText === 'NaN' ?
commonValue.toString() : formattedValue.formattedText;
formattedValue.dateText = formattedValue.dateText === 'NaN' ?
commonValue.toString() : formattedValue.dateText;
}
}
catch (exception) {
if (!this.fieldList[fieldName].isCustomField) {
throw exception;
}
}
finally {
if (this.fieldList[fieldName].isCustomField) {
formattedValue.formattedText =
(isNullOrUndefined(formattedValue.formattedText) || formattedValue.formattedText === 'NaN') ?
commonValue.toString() : formattedValue.formattedText;
formattedValue.dateText = (isNullOrUndefined(formattedValue.dateText) || formattedValue.dateText === 'NaN') ?
commonValue.toString() : formattedValue.dateText;
}
}
}
return formattedValue;
};
PivotEngine.prototype.powerFunction = function (formula) {
if (formula.indexOf('^') > -1) {
var items_1 = [];
while (formula.indexOf('(') > -1) {
formula = formula.replace(/(\([^()]*\))/g, function (text, item) {
items_1.push(item);
return ('~' + (items_1.length - 1));
});
}
items_1.push(formula);
formula = '~' + (items_1.length - 1);
while (formula.indexOf('~') > -1) {
formula = formula.replace(new RegExp('~' + '(\\d+)', 'g'), function (text, index) {
return items_1[index].replace(/(\w*)\^(\w*)/g, 'Math.pow' + '($1,$2)');
});
}
}
return formula;
};
PivotEngine.prototype.getTabularPivotValues = function (requireDatasourceUpdate) {
this.tabularPivotValues = [];
var colIndex;
var indexObjectMap = {};
var isGrouping = Object.keys(this.groupingFields).length > 0;
for (var i = 0; i < this.pivotValues.length; i++) {
var rowPivotValues = void 0;
var drillMem = false;
var isValue = true;
var levelName = void 0;
var levelNameParts = void 0;
var vLevelNameParts = void 0;
var valueAxis = void 0;
var type = false;
while (isNullOrUndefined(this.pivotValues[i]) && i < this.pivotValues.length) {
this.tabularPivotValues.length++;
i++;
}
if (i < this.pivotValues.length) {
rowPivotValues = this.pivotValues[i];
}
var firstRow = rowPivotValues[0] ? rowPivotValues[0] : undefined;
if (firstRow) {
levelName = firstRow.valueSort.levelName;
levelNameParts = vLevelNameParts = levelName.split(this.dataSourceSettings.valueSortSettings.headerDelimiter);
if (((!this.dataSourceSettings.showSubTotals && firstRow.type !== 'value') ||
(!this.dataSourceSettings.showRowSubTotals)) &&
firstRow.formattedText !== this.localeObj.getConstant('grandTotal')) {
if (firstRow.isSum) {
isValue = false;
}
}
if (isGrouping) {
var pivotValue = this.pivotValues[i - 1][0];
var previousValue = this.tabularPivotValues[this.tabularPivotValues.length - 1][this.rowMaxLevel - 1];
if (!isNullOrUndefined(pivotValue) || !isNullOrUndefined(previousValue)) {
var pivotValueAxis = pivotValue.valueSort.axis;
var previousValueAxis = void 0;
if (!isNullOrUndefined(previousValue) && previousValue.valueSort.axis) {
previousValueAxis = previousValue.valueSort.axis;
}
if (pivotValueAxis.includes('custom_group') || !isNullOrUndefined(previousValueAxis) &&
previousValueAxis.includes('custom_group')) {
if ((pivotValue.formattedText === levelNameParts[this.rowMaxLevel - 1] && pivotValue.formattedText !==
levelNameParts[levelNameParts.length - 1]) || (previousValue && previousValue.formattedText ===
levelNameParts[this.rowMaxLevel - 1])) {
valueAxis = pivotValue.valueSort.axis ? pivotValue.valueSort.axis :
previousValue.valueSort.axis;
}
else {
valueAxis = firstRow.valueSort.axis;
}
}
else {
valueAxis = firstRow.valueSort.axis;
}
}
}
}
if (firstRow && this.isTabularMultiValueRowAxis) {
if (firstRow.type === 'value') {
if (levelNameParts.length - 1 !== this.rowMaxLevel && levelNameParts[0] !== this.localeObj.getConstant('grandTotal')) {
for (var w = 0; w < this.dataSourceSettings.values.length; w++) {
if (firstRow.formattedText === this.dataSourceSettings.values[w].name) {
isValue = false;
firstRow.hasChild = false;
break;
}
}
}
}
if (levelNameParts.length - 1 !== this.rowMaxLevel) {
firstRow.isDrilled = true;
if (!firstRow.hasChild && !firstRow.type) {
firstRow.hasChild = true;
}
else if (levelNameParts[0] === this.localeObj.getConstant('grandTotal') && firstRow.type === 'grand sum') {
firstRow.hasChild = true;
}
else {
firstRow.level = levelNameParts.length - 1;
}
}
else {
firstRow.level = levelNameParts.length - 1;
}
drillMem = PivotUtil.isMemberDrilled(firstRow, levelNameParts, this.drilledMembers);
}
if (isValue && levelNameParts && levelNameParts.length > 1 && firstRow.type === 'sum') {
if (levelNameParts[levelNameParts.length - 1] === levelNameParts[levelNameParts.length - 2]) {
isValue = false;
}
}
if (!isNullOrUndefined(firstRow) && firstRow.axis === 'row') {
if (!isNullOrUndefined(rowPivotValues[1]) && !(firstRow.hasChild && firstRow.isDrilled) && isValue) {
var levelNameArray = [];
var vLevelNameArray = [];
if (this.isTabularMultiValueRowAxis && (requireDatasourceUpdate && drillMem
? levelNameParts.length - 1 < this.rowMaxLevel : levelNameParts.length <= this.rowMaxLevel) &&
firstRow.type === 'value' && (!this.dataSourceSettings.expandAll ? drillMem : !drillMem) ||
levelNameParts[0] === this.localeObj.getConstant('grandTotal')) {
for (var b = levelNameParts.length - 1; b >= 0; b--) {
type = true;
if (levelNameParts[b] === levelNameParts[levelNameParts.length - 2]) {
levelNameArray[b] = levelNameParts[levelNameParts.length - 2] + ' ' +
levelNameParts[levelNameParts.length - 1];
vLevelNameArray[b] = levelNameParts[levelNameParts.length - 2] +
this.valueSortSettings.headerDelimiter + levelNameParts[levelNameParts.length - 1];
if (b === 0) {
break;
}
else {
while (b >= 0) {
levelNameArray[b - 1] = levelNameParts[b - 1];
vLevelNameArray[b - 1] = vLevelNameParts[b - 1];
b--;
}
break;
}
}
else {
levelNameArray[b] = levelNameParts[levelNameParts.length - 2] + ' ' +
levelNameParts[levelNameParts.length - 1];
vLevelNameArray[b] = levelNameParts[levelNameParts.length - 2] +
this.valueSortSettings.headerDelimiter + levelNameParts[levelNameParts.length - 1];
}
}
levelNameParts = levelNameArray;
vLevelNameParts = vLevelNameArray;
}
colIndex = firstRow.colIndex;
var currentRow = [];
var dLevelName = vLevelNameParts[0];
var level = 0;
for (var k = 0; k < levelNameParts.length - 1 || k < this.rowMaxLevel; k++) {
var valueIsDrill = void 0;
var valueHasChild = void 0;
var duplIsDrilled = firstRow.isDrilled;
var dupliHasChild = firstRow.hasChild;
if (this.isTabularMultiValueRowAxis) {
valueIsDrill = false;
valueHasChild = false;
if (levelNameParts[levelNameParts.length - 1] !== levelNameParts[levelNameParts.length - 2]) {
var currentRowIndex = levelNameParts.length - 1 === this.rowMaxLevel &&
this.dataSourceSettings.rows.length === this.rowMaxLevel ?
levelNameParts.length - 2 : levelNameParts.length - 1;
if (k < currentRowIndex) {
valueHasChild = true;
}
if (k < levelNameParts.length - 2) {
valueIsDrill = true;
}
}
}
else {
if (k < this.rowMaxLevel) {
dupliHasChild = true;
}
if (levelNameParts.length > 1 || k === 0) {
duplIsDrilled = true;
}
}
if (k < levelNameParts.length - 1) {
if (k > 0) {
dLevelName = dLevelName + this.dataSourceSettings.valueSortSettings.headerDelimiter +
vLevelNameParts[k];
}
currentRow.push({
actualText: levelNameParts[k],
axis: firstRow.axis,
formattedText: levelNameParts[k],
rowIndex: this.tabularPivotValues.length,
hasChild: (this.isTabularMultiValueRowAxis && firstRow.type !== 'grand sum') ? valueHasChild : dupliHasChild,
isDrilled: (this.isTabularMultiValueRowAxis && firstRow.type !== 'grand sum') ? valueIsDrill : duplIsDrilled,
level: level,
valueSort: {
levelName: type && firstRow.type === 'value' && k === this.rowMaxLevel ?
firstRow.valueSort.levelName : dLevelName,
axis: isGrouping ? (valueAxis ?
(valueAxis.includes('custom_group') ? valueAxis : this.dataSourceSettings.rows[k].name) :
firstRow.valueSort.axis) : (this.dataSourceSettings.rows[k] ?
this.dataSourceSettings.rows[k].name : firstRow.valueSort.axis)
},
type: type ? firstRow.type : undefined,
colIndex: colIndex++,
colSpan: 1,
rowSpan: 1
});
}
if (k >= firstRow.level) {
var span = k === 0 ? this.rowMaxLevel : this.rowMaxLevel - 1;
currentRow.push({
actualText: this.isTabularMultiValueRowAxis ? levelNameParts[k] === undefined ?
levelNameParts[levelNameParts.length - 1] : levelNameParts[k] : firstRow.formattedText,
axis: firstRow.axis,
formattedText: this.isTabularMultiValueRowAxis ? levelNameParts[k] === undefined ?
levelNameParts[levelNameParts.length - 1] : levelNameParts[k] : firstRow.formattedText,
rowIndex: this.tabularPivotValues.length,
hasChild: (this.isTabularMultiValueRowAxis && firstRow.type !== 'grand sum') ? valueHasChild : firstRow.hasChild,
isDrilled: (this.isTabularMultiValueRowAxis && firstRow.type !== 'grand sum') ? valueIsDrill : firstRow.isDrilled,
level: level,
valueSort: {
levelName: firstRow.valueSort.levelName,
axis: isGrouping ? (valueAxis ?
(valueAxis.includes('custom_group') ? valueAxis : this.dataSourceSettings.rows[k].name) :
firstRow.valueSort.axis) : this.dataSourceSettings.rows[k].name
},
type: type ? firstRow.type : firstRow.type ? firstRow.type : undefined,
colIndex: colIndex++,
colSpan: span,
rowSpan: 1
});
}
var cell = currentRow[currentRow.length - 1];
var cellLevelName = cell.valueSort.levelName.toString();
if (indexObjectMap[cellLevelName]) {
cell.index = indexObjectMap[cellLevelName].index;
cell.indexObject = indexObjectMap[cellLevelName].indexObject;
delete indexObjectMap[cellLevelName];
}
level++;
}
firstRow.colIndex = colIndex;
firstRow.rowIndex = this.tabularPivotValues.length;
firstRow.colSpan = 1;
firstRow.rowSpan = 1;
if (this.isTabularMultiValueRowAxis) {
firstRow.formattedText = levelNameParts[levelNameParts.length - 1];
}
currentRow.push(firstRow);
this.setColumnSpan(currentRow, firstRow);
var colData = rowPivotValues.slice(1, rowPivotValues.length);
for (var i_8 = 1; i_8 < rowPivotValues.length; i_8++) {
var colDataValues = rowPivotValues[i_8];
colDataValues.colIndex = colIndex + 1;
colDataValues.rowIndex = this.tabularPivotValues.length;
colIndex++;
}
currentRow = currentRow.concat(colData);
this.tabularPivotValues.push(currentRow);
}
else if (this.isTabularMultiValueRowAxis && (this.dataSourceSettings.rows.length === this.measureIndex)) {
var levelKey = firstRow.valueSort.levelName.toString();
if (levelKey) {
indexObjectMap[levelKey] = { index: firstRow.index, indexObject: firstRow.indexObject };
var headerDelimiter = this.valueSortSettings.headerDelimiter;
delete indexObjectMap[levelKey.split(headerDelimiter).slice(0, -1).join(headerDelimiter)];
}
}
}
else {
var emptyRow = [];
var headerColIndex = this.rowMaxLevel + 1;
for (var j = 0; j < this.rowMaxLevel; j++) {
emptyRow.push(undefined);
}
emptyRow.push(firstRow);
var colData = rowPivotValues.slice(1, rowPivotValues.length);
for (var i_9 = 0; i_9 < colData.length; i_9++) {
colData[i_9].colIndex = headerColIndex;
colData[i_9].rowIndex = this.tabularPivotValues.length;
headerColIndex++;
}
emptyRow = emptyRow.concat(colData);
this.tabularPivotValues.push(emptyRow);
}
}
return this.tabularPivotValues;
};
PivotEngine.prototype.drillDownLevel = function (level, isDrillDown) {
if (isDrillDown === void 0) { isDrillDown = false; }
this.levelMap[level] = (this.levelMap[level] || 0) + 1;
if (isDrillDown) {
this.updateRowMaxLevel();
}
};
PivotEngine.prototype.drillUpLevel = function (level, isDrillUp) {
if (isDrillUp === void 0) { isDrillUp = false; }
if (this.levelMap[level] && this.levelMap[level] > 0) {
this.levelMap[level]--;
if (this.levelMap[level] === 0) {
delete this.levelMap[level];
}
}
if (isDrillUp) {
this.updateRowMaxLevel();
}
};
PivotEngine.prototype.updateRowMaxLevel = function () {
var levels = Object.keys(this.levelMap).map(function (level) { return Number(level); });
if (levels.length > 0) {
this.rowMaxLevel = Math.max.apply(Math, levels) + 1;
}
else {
this.rowMaxLevel = 0;
}
this.rowMaxLevel = this.isTabularMultiValueRowAxis ? this.rowMaxLevel + 1 : this.rowMaxLevel;
};
PivotEngine.prototype.setColumnSpan = function (currentRow, firstRow) {
var spanlength = 1;
for (var f = currentRow.length - 1; f >= 0; f--) {
if (f !== 0) {
if ((currentRow[f].formattedText === currentRow[f - 1].formattedText) &&
(currentRow[f].valueSort.levelName === currentRow[f - 1].valueSort.levelName)) {
currentRow[f].colSpan = 0;
spanlength++;
currentRow[f - 1].colSpan = spanlength;
}
}
var currentRowindex = (this.dataSourceSettings.valueAxis === 'row' && (this.dataSourceSettings.values.length > 1 ||
this.dataSourceSettings.alwaysShowValueHeader)) ? currentRow.length - 2 : currentRow.length - 1;
if (f < currentRowindex && !firstRow.isSum &&
currentRow[currentRow.length - 1].formattedText !== currentRow[currentRow.length - 2].formattedText &&
firstRow.type !== 'grand sum') {
currentRow[f].hasChild = true;
var drillMem = this.dataSourceSettings.drilledMembers;
for (var drillItem = 0; drillItem < drillMem.length; drillItem++) {
for (var item = 0; item < drillMem[drillItem].items.length; item++) {
if (drillMem[drillItem].items[item] === currentRow[f].formattedText) {
currentRow[f].isDrilled = currentRow[f].isDrilled ? true : false;
}
}
}
}
}
};
PivotEngine.prototype.setRowSpan = function () {
var emptyHeaderLength = this.headerContent.length;
for (var m = 0; m < this.rowMaxLevel; m++) {
var rowSpan = 1;
if (this.tabularPivotValues.length > this.rowMaxLevel + emptyHeaderLength) {
for (var j = this.tabularPivotValues.length - 1; j >= emptyHeaderLength - 1; j--) {
if (j !== emptyHeaderLength - 1) {
var tabluarValue = this.tabularPivotValues;
if (isNullOrUndefined(tabluarValue[j - 1])) {
break;
}
if (!isNullOrUndefined(tabluarValue[j - 1][m])) {
var previousLevelName = tabluarValue[j - 1][m].valueSort.levelName;
var previousLevelLastIndex = previousLevelName.lastIndexOf(this.dataSourceSettings.valueSortSettings.headerDelimiter);
var finalpreviouslevel = previousLevelLastIndex !== -1 ? previousLevelName.substring(0, previousLevelLastIndex) : previousLevelName;
var currentLevelName = tabluarValue[j][m].valueSort.levelName;
var currentLevelLastIndex = currentLevelName.lastIndexOf(this.dataSourceSettings.valueSortSettings.headerDelimiter);
var finalCurrentlevel = currentLevelLastIndex !== -1 ? currentLevelName.substring(0, currentLevelLastIndex) : currentLevelName;
if (tabluarValue[j][m].formattedText ===
tabluarValue[j - 1][m].formattedText && finalCurrentlevel === finalpreviouslevel) {
tabluarValue[j][m].rowSpan = 0;
rowSpan++;
tabluarValue[j - 1][m].rowSpan = rowSpan;
}
else {
rowSpan = 1;
}
}
else {
rowSpan = 1;
}
}
}
}
}
};
return PivotEngine;
}());
export { PivotEngine };