@gooddata/react-components
Version:
GoodData.UI - A powerful JavaScript library for building analytical applications
159 lines • 7.73 kB
JavaScript
;
// (C) 2007-2020 GoodData Corporation
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);
};
Object.defineProperty(exports, "__esModule", { value: true });
var typings_1 = require("@gooddata/typings");
var mappingHeader_1 = require("../../../helpers/mappingHeader");
var utils_1 = require("../../../helpers/utils");
var agGridUtils_1 = require("./agGridUtils");
var range = require("lodash/range");
var clone = require("lodash/clone");
var agGridConst_1 = require("./agGridConst");
var agGridDrilling_1 = require("./agGridDrilling");
var invariant = require("invariant");
/*
* All code related to transforming headers from our backend to ag-grid specific data structures
*/
exports.identifyHeader = function (header) {
if (typings_1.Execution.isAttributeHeaderItem(header)) {
return "a" + agGridConst_1.ID_SEPARATOR + agGridUtils_1.getIdsFromUri(header.attributeHeaderItem.uri).join(agGridConst_1.ID_SEPARATOR);
}
if (typings_1.Execution.isMeasureHeaderItem(header)) {
return "m" + agGridConst_1.ID_SEPARATOR + header.measureHeaderItem.order;
}
if (typings_1.Execution.isTotalHeaderItem(header)) {
return "t" + agGridConst_1.ID_SEPARATOR + header.totalHeaderItem.type;
}
invariant(false, "Unknown header type: " + JSON.stringify(header));
};
exports.identifyResponseHeader = function (header) {
if (typings_1.Execution.isAttributeHeader(header)) {
// response headers have no value id
return "a" + agGridConst_1.ID_SEPARATOR + agGridUtils_1.getIdsFromUri(header.attributeHeader.uri)[0];
}
if (typings_1.Execution.isMeasureGroupHeader(header)) {
// trying to identify a measure group would be ambiguous
return null;
}
invariant(false, "Unknown response header type: " + JSON.stringify(header));
};
exports.headerToGrid = function (header, fieldPrefix) {
if (fieldPrefix === void 0) { fieldPrefix = ""; }
var internalHeader = utils_1.unwrap(header);
return {
headerName: internalHeader.name,
field: fieldPrefix + exports.identifyHeader(header),
};
};
exports.shouldMergeHeaders = function (resultHeaderDimension, headerIndex, headerItemIndex) {
for (var ancestorIndex = headerIndex; ancestorIndex >= 0; ancestorIndex--) {
var currentAncestorHeader = resultHeaderDimension[ancestorIndex][headerItemIndex];
var nextAncestorHeader = resultHeaderDimension[ancestorIndex][headerItemIndex + 1];
if (!nextAncestorHeader ||
exports.identifyHeader(currentAncestorHeader) !== exports.identifyHeader(nextAncestorHeader)) {
return false;
}
}
return true;
};
exports.mergeHeaderEndIndex = function (resultHeaderDimension, headerIndex, headerItemStartIndex) {
var header = resultHeaderDimension[headerIndex];
for (var headerItemIndex = headerItemStartIndex; headerItemIndex < header.length; headerItemIndex++) {
if (!exports.shouldMergeHeaders(resultHeaderDimension, headerIndex, headerItemIndex)) {
return headerItemIndex;
}
}
return headerItemStartIndex;
};
/*
* getColumnHeaders transforms header items from matrix to tree hierarchy
* for each span of identical headers in a row, the function is called recursively to assign child items
*/
exports.getColumnHeaders = function (resultHeaderDimension, responseHeaders, columnDefOptions, headerIndex, headerItemStartIndex, headerValueEnd, fieldPrefix, parentDrillItems) {
if (columnDefOptions === void 0) { columnDefOptions = {}; }
if (headerIndex === void 0) { headerIndex = 0; }
if (headerItemStartIndex === void 0) { headerItemStartIndex = 0; }
if (headerValueEnd === void 0) { headerValueEnd = undefined; }
if (fieldPrefix === void 0) { fieldPrefix = ""; }
if (parentDrillItems === void 0) { parentDrillItems = []; }
if (!resultHeaderDimension.length) {
return [];
}
var currentHeaders = resultHeaderDimension[headerIndex];
var lastIndex = headerValueEnd !== undefined ? headerValueEnd : currentHeaders.length - 1;
var hierarchy = [];
for (var headerItemIndex = headerItemStartIndex; headerItemIndex < lastIndex + 1;) {
var currentHeader = currentHeaders[headerItemIndex];
var header = __assign({ drillItems: [] }, exports.headerToGrid(currentHeader, fieldPrefix), columnDefOptions);
var drillItems = clone(parentDrillItems);
agGridDrilling_1.assignDrillItemsAndType(header, currentHeader, responseHeaders, headerIndex, drillItems);
var headerItemEndIndex = exports.mergeHeaderEndIndex(resultHeaderDimension, headerIndex, headerItemIndex);
if (headerIndex !== resultHeaderDimension.length - 1) {
header.children = exports.getColumnHeaders(resultHeaderDimension, responseHeaders, columnDefOptions, headerIndex + 1, headerItemIndex, headerItemEndIndex, header.field + agGridConst_1.FIELD_SEPARATOR, drillItems);
}
hierarchy.push(header);
// We move the pointer manually to skip identical headers
headerItemIndex = headerItemEndIndex + 1;
}
return hierarchy;
};
exports.getRowHeaders = function (rowDimensionHeaders, columnDefOptions, makeRowGroups) {
return rowDimensionHeaders.map(function (attributeHeader) {
var rowGroupProps = makeRowGroups
? {
rowGroup: true,
hide: true,
}
: {};
var field = exports.identifyResponseHeader(attributeHeader);
return __assign({
// The label should be attribute name (not attribute display form name)
headerName: mappingHeader_1.getMappingHeaderName(attributeHeader), type: agGridConst_1.ROW_ATTRIBUTE_COLUMN,
// Row dimension must contain only attribute headers.
field: field, drillItems: [attributeHeader] }, rowGroupProps, columnDefOptions);
});
};
exports.getFields = function (dataHeaders) {
return range((dataHeaders[0] || []).length).map(function (cellIndex) {
var fieldList = dataHeaders.map(function (header) {
return exports.identifyHeader(header[cellIndex]);
});
return fieldList.join(agGridConst_1.FIELD_SEPARATOR);
});
};
exports.assortDimensionHeaders = function (dimensions) {
var dimensionHeaders = dimensions.reduce(function (headers, dimension) { return headers.concat(dimension.headers); }, []);
var attributeHeaders = [];
var measureHeaderItems = [];
dimensionHeaders.forEach(function (dimensionHeader) {
if (typings_1.Execution.isAttributeHeader(dimensionHeader)) {
attributeHeaders.push(dimensionHeader);
}
else if (typings_1.Execution.isMeasureGroupHeader(dimensionHeader)) {
measureHeaderItems.push.apply(measureHeaderItems, dimensionHeader.measureGroupHeader.items);
}
});
return {
attributeHeaders: attributeHeaders,
measureHeaderItems: measureHeaderItems,
};
};
exports.getMinimalRowData = function (data, rowHeaderItems) {
var numberOfRowHeaderItems = (rowHeaderItems[0] || []).length;
return data.length > 0
? data
: // if there are no measures only attributes
// create array of [null] of length equal to the number of row dimension headerItems
Array(numberOfRowHeaderItems).fill([null]);
};
//# sourceMappingURL=agGridHeaders.js.map