UNPKG

@gooddata/react-components

Version:

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

131 lines • 8.54 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); // (C) 2019-2020 GoodData Corporation var MenuList_1 = require("@gooddata/goodstrap/lib/List/MenuList"); var typings_1 = require("@gooddata/typings"); var classNames = require("classnames"); var React = require("react"); var BubbleHoverTrigger_1 = require("@gooddata/goodstrap/lib/Bubble/BubbleHoverTrigger"); var Bubble_1 = require("@gooddata/goodstrap/lib/Bubble/Bubble"); var noop = require("lodash/noop"); var executionResultHelper_1 = require("../../../helpers/executionResultHelper"); var Menu_1 = require("../../menu/Menu"); var agGridUtils_1 = require("./agGridUtils"); var utils_1 = require("../../visualizations/table/totals/utils"); var AggregationsSubMenu_1 = require("./AggregationsSubMenu"); var aggregationsMenuHelper_1 = require("./aggregationsMenuHelper"); var agGridConst_1 = require("./agGridConst"); var bubble_1 = require("../../../internal/constants/bubble"); var NATIVE_TOTAL = "nat"; var AggregationsMenu = /** @class */ (function (_super) { __extends(AggregationsMenu, _super); function AggregationsMenu() { return _super !== null && _super.apply(this, arguments) || this; } AggregationsMenu.prototype.render = function () { var _a = this.props, intl = _a.intl, colId = _a.colId, getExecutionResponse = _a.getExecutionResponse, isMenuOpened = _a.isMenuOpened, onMenuOpenedChange = _a.onMenuOpenedChange; // Because of Ag-grid react wrapper does not rerender the component when we pass // new gridOptions we need to pull the data manually on each render var executionResponse = getExecutionResponse(); if (!executionResponse) { return null; } var rowAttributeHeaders = executionResultHelper_1.getNthDimensionHeaders(executionResponse, 0); var isOneRowTable = rowAttributeHeaders.length === 0; if (isOneRowTable) { return null; } var dimensionHeader = executionResultHelper_1.getNthDimensionHeaders(executionResponse, 1); if (!dimensionHeader) { return null; } var measureGroupHeader = dimensionHeader[dimensionHeader.length - 1]; if (!measureGroupHeader || !typings_1.Execution.isMeasureGroupHeader(measureGroupHeader)) { return null; } var fields = agGridUtils_1.getParsedFields(colId); var _b = fields[fields.length - 1], lastFieldType = _b[0], lastFieldId = _b[1], _c = _b[2], lastFieldValueId = _c === void 0 ? null : _c; var isAttributeHeader = lastFieldType === agGridConst_1.FIELD_TYPE_ATTRIBUTE; var isColumnAttribute = lastFieldValueId === null; if (isAttributeHeader && isColumnAttribute) { return null; } var measureLocalIdentifiers = aggregationsMenuHelper_1.default.getHeaderMeasureLocalIdentifiers(measureGroupHeader.measureGroupHeader.items, lastFieldType, lastFieldId); var totalsForHeader = this.getColumnTotals(measureLocalIdentifiers, isAttributeHeader); return (React.createElement(Menu_1.default, { toggler: React.createElement("div", { className: "menu-icon" }), togglerWrapperClassName: this.getTogglerClassNames(), opened: isMenuOpened, onOpenedChange: onMenuOpenedChange, openAction: "click", closeOnScroll: true }, React.createElement(MenuList_1.ItemsWrapper, null, React.createElement("div", { className: "s-table-header-menu-content" }, React.createElement(MenuList_1.Header, null, intl.formatMessage({ id: "visualizations.menu.aggregations" })), this.renderMainMenuItems(totalsForHeader, measureLocalIdentifiers, rowAttributeHeaders))))); }; AggregationsMenu.prototype.getColumnTotals = function (measureLocalIdentifiers, isAttributeHeader) { var columnTotals = this.props.getTotals() || []; if (isAttributeHeader) { return aggregationsMenuHelper_1.default.getTotalsForAttributeHeader(columnTotals, measureLocalIdentifiers); } return aggregationsMenuHelper_1.default.getTotalsForMeasureHeader(columnTotals, measureLocalIdentifiers[0]); }; AggregationsMenu.prototype.getTogglerClassNames = function () { var _a = this.props, isMenuButtonVisible = _a.isMenuButtonVisible, isMenuOpened = _a.isMenuOpened; return classNames("s-table-header-menu", "gd-pivot-table-header-menu", { "gd-pivot-table-header-menu--show": isMenuButtonVisible, "gd-pivot-table-header-menu--hide": !isMenuButtonVisible, "gd-pivot-table-header-menu--open": isMenuOpened, }); }; AggregationsMenu.prototype.renderMenuItemContent = function (totalType, onClick, isSelected, hasSubMenu, isEnabled) { var intl = this.props.intl; var onClickHandler = isEnabled ? onClick : noop; var itemElement = (React.createElement(MenuList_1.Item, { checked: isSelected, subMenu: hasSubMenu, disabled: !isEnabled }, React.createElement("div", { onClick: onClickHandler, className: "gd-aggregation-menu-item-inner s-menu-aggregation-inner" }, intl.formatMessage({ id: "visualizations.totals.dropdown.title." + totalType, })))); return isEnabled ? (itemElement) : (React.createElement(BubbleHoverTrigger_1.default, { showDelay: bubble_1.SHOW_DELAY_DEFAULT, hideDelay: bubble_1.HIDE_DELAY_DEFAULT }, itemElement, React.createElement(Bubble_1.default, { className: "bubble-primary", alignPoints: [{ align: "bc tc" }] }, intl.formatMessage({ id: "visualizations.totals.dropdown.title.nat.disabled.tooltip", })))); }; AggregationsMenu.prototype.getItemClassNames = function (totalType) { return classNames("gd-aggregation-menu-item", "s-menu-aggregation", "s-menu-aggregation-" + totalType); }; AggregationsMenu.prototype.renderMainMenuItems = function (columnTotals, measureLocalIdentifiers, rowAttributeHeaders) { var _this = this; var _a = this.props, intl = _a.intl, onAggregationSelect = _a.onAggregationSelect, showSubmenu = _a.showSubmenu, getAfmFilters = _a.getAfmFilters; var firstAttributeIdentifier = executionResultHelper_1.getNthAttributeLocalIdentifier(rowAttributeHeaders, 0); var afmFilters = getAfmFilters(); return utils_1.AVAILABLE_TOTALS.map(function (totalType) { var isSelected = aggregationsMenuHelper_1.default.isTotalEnabledForAttribute(firstAttributeIdentifier, totalType, columnTotals); var attributeHeader = executionResultHelper_1.getNthAttributeHeader(rowAttributeHeaders, 0); var onClick = function () { return _this.props.onAggregationSelect({ type: totalType, measureIdentifiers: measureLocalIdentifiers, include: !isSelected, attributeIdentifier: attributeHeader.localIdentifier, }); }; var itemClassNames = _this.getItemClassNames(totalType); var isEnabled = totalType !== NATIVE_TOTAL || !afmFilters.find(typings_1.AFM.isMeasureValueFilter); var renderSubmenu = isEnabled && showSubmenu && rowAttributeHeaders.length > 0; var toggler = _this.renderMenuItemContent(totalType, onClick, isSelected, renderSubmenu, isEnabled); return (React.createElement("div", { className: itemClassNames, key: totalType }, renderSubmenu ? (React.createElement(AggregationsSubMenu_1.default, { intl: intl, totalType: totalType, rowAttributeHeaders: rowAttributeHeaders, columnTotals: columnTotals, measureLocalIdentifiers: measureLocalIdentifiers, onAggregationSelect: onAggregationSelect, toggler: toggler })) : (toggler))); }); }; return AggregationsMenu; }(React.Component)); exports.default = AggregationsMenu; //# sourceMappingURL=AggregationsMenu.js.map