@gooddata/react-components
Version:
GoodData.UI - A powerful JavaScript library for building analytical applications
131 lines • 8.54 kB
JavaScript
"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