UNPKG

@gooddata/react-components

Version:

GoodData.UI - A powerful JavaScript library for building analytical applications

157 lines • 7.26 kB
"use strict"; 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