@gooddata/react-components
Version:
GoodData.UI - A powerful JavaScript library for building analytical applications
157 lines • 7.26 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);
};
Object.defineProperty(exports, "__esModule", { value: true });
// (C) 2007-2019 GoodData Corporation
var cloneDeep = require("lodash/cloneDeep");
var get = require("lodash/get");
var isEmpty = require("lodash/isEmpty");
var isNumber = require("lodash/isNumber");
var invariant = require("invariant");
var headerPredicate_1 = require("../../../../helpers/headerPredicate");
var visualizationTypes_1 = require("../../../../constants/visualizationTypes");
function createHeadlineDataItem(executionDataItem) {
if (!executionDataItem) {
return null;
}
return {
localIdentifier: executionDataItem.measureHeaderItem.localIdentifier,
title: executionDataItem.measureHeaderItem.name,
value: executionDataItem.value ? String(executionDataItem.value) : null,
format: executionDataItem.measureHeaderItem.format,
isDrillable: false,
};
}
function createTertiaryItem(executionData, intl) {
var secondaryHeaderItem = get(executionData, [1, "measureHeaderItem"]);
if (!secondaryHeaderItem) {
return null;
}
var primaryValueString = get(executionData, [0, "value"]);
var primaryValue = primaryValueString !== null ? Number(primaryValueString) : null;
var secondaryValueString = get(executionData, [1, "value"]);
var secondaryValue = secondaryValueString !== null ? Number(secondaryValueString) : null;
var tertiaryTitle = intl.formatMessage({ id: "visualizations.headline.tertiary.title" });
var isCountableValue = isNumber(primaryValue) && isNumber(secondaryValue);
var tertiaryValue = isCountableValue && secondaryValue !== 0
? ((primaryValue - secondaryValue) / secondaryValue) * 100
: null;
return {
localIdentifier: "tertiaryIdentifier",
title: tertiaryTitle,
value: tertiaryValue !== null ? String(tertiaryValue) : null,
format: null,
isDrillable: false,
};
}
function getExecutionResponseMeasureHeaders(executionResponse) {
return get(executionResponse, ["dimensions", 0, "headers", 0, "measureGroupHeader", "items"], []);
}
/**
* Get tuple of measure header items with related data value by index position from executionResponse and
* executionResult.
*
* @param executionResponse
* @param executionResult
* @returns {any[]}
*/
function getExecutionData(executionResponse, executionResult) {
var headerItems = getExecutionResponseMeasureHeaders(executionResponse);
return headerItems.map(function (item, index) {
var value = get(executionResult, ["data", index]);
invariant(value !== undefined, "Undefined execution value data for headline transformation");
invariant(item.measureHeaderItem, "Missing expected measureHeaderItem");
return {
measureHeaderItem: item.measureHeaderItem,
value: value,
};
});
}
/**
* Get {HeadlineData} used by the {Headline} component.
*
* @param executionResponse - The execution response with dimensions definition.
* @param executionResult - The execution result with an actual data values.
* @param intl - Required localization for compare item title
* @returns {*}
*/
function getHeadlineData(executionResponse, executionResult, intl) {
var executionData = getExecutionData(executionResponse, executionResult);
var primaryItem = createHeadlineDataItem(executionData[0]);
var secondaryItem = createHeadlineDataItem(executionData[1]);
var secondaryItemProp = secondaryItem ? { secondaryItem: secondaryItem } : {};
var tertiaryItem = createTertiaryItem(executionData, intl);
var tertiaryItemProp = tertiaryItem ? { tertiaryItem: tertiaryItem } : {};
return __assign({ primaryItem: primaryItem }, secondaryItemProp, tertiaryItemProp);
}
exports.getHeadlineData = getHeadlineData;
function findMeasureHeaderItem(localIdentifier, executionResponse) {
var measureGroupHeaderItems = getExecutionResponseMeasureHeaders(executionResponse);
return measureGroupHeaderItems
.map(function (item) { return item.measureHeaderItem; })
.find(function (header) { return header !== undefined && header.localIdentifier === localIdentifier; });
}
/**
* Take headline data and apply list of drillable items.
* The method will return copied collection of the headline data with altered drillable status.
*
* @param headlineData - The headline data that we want to change the drillable status.
* @param drillableItems - list of drillable items {uri, identifier}
* @param executionRequest - Request with required measure id (uri or identifier) for activation of drill eventing
* @param executionResponse - Response headers for drilling predicate matching
* @returns altered headlineData
*/
function applyDrillableItems(headlineData, drillableItems, executionRequest, executionResponse) {
var data = cloneDeep(headlineData);
var primaryItem = data.primaryItem, secondaryItem = data.secondaryItem;
var _a = getExecutionResponseMeasureHeaders(executionResponse), primaryItemHeader = _a[0], secondaryItemHeader = _a[1];
if (!isEmpty(primaryItem) && !isEmpty(primaryItemHeader)) {
primaryItem.isDrillable = headerPredicate_1.isSomeHeaderPredicateMatched(drillableItems, primaryItemHeader, executionRequest.afm, executionResponse);
}
if (!isEmpty(secondaryItem) && !isEmpty(secondaryItemHeader)) {
secondaryItem.isDrillable = headerPredicate_1.isSomeHeaderPredicateMatched(drillableItems, secondaryItemHeader, executionRequest.afm, executionResponse);
}
return data;
}
exports.applyDrillableItems = applyDrillableItems;
/**
* Build drill event data (object with execution and drill context) from the data obtained by clicking on the {Headline}
* component an from the execution objects.
*
* @param itemContext - data received from the click on the {Headline} component.
* @param executionRequest - The execution request with AFM and ResultSpec.
* @param executionResponse - The execution response with dimensions definition.
* @returns {*}
*/
function buildDrillEventData(itemContext, executionRequest, executionResponse) {
var measureHeaderItem = findMeasureHeaderItem(itemContext.localIdentifier, executionResponse);
if (!measureHeaderItem) {
throw new Error("The measure uri has not been found in execution response!");
}
var intersectionElement = {
header: {
measureHeaderItem: measureHeaderItem,
},
};
var drillContext = {
type: visualizationTypes_1.VisualizationTypes.HEADLINE,
element: itemContext.element,
value: itemContext.value,
intersection: [intersectionElement],
};
return {
executionContext: executionRequest.afm,
drillContext: drillContext,
};
}
exports.buildDrillEventData = buildDrillEventData;
//# sourceMappingURL=HeadlineTransformationUtils.js.map