@gooddata/react-components
Version:
GoodData.UI - A powerful JavaScript library for building analytical applications
100 lines (82 loc) • 4.5 kB
text/typescript
// (C) 2019 GoodData Corporation
import cloneDeep = require("lodash/cloneDeep");
import get = require("lodash/get");
import set = require("lodash/set");
import { IntlShape } from "react-intl";
import * as BucketNames from "../../../constants/bucketNames";
import { IExtendedReferencePoint, IBucket, IUiConfig, IBucketUiConfig } from "../../interfaces/Visualization";
import { UICONFIG } from "../../constants/uiConfig";
import { BUCKETS } from "../../constants/bucket";
import { hasNoStacks, getMasterMeasuresCount } from "../bucketRules";
import { getItemsCount, setBucketTitles } from "../bucketHelper";
import * as areaMeasuresIcon from "../../assets/area/bucket-title-measures.svg";
import * as areaViewIcon from "../../assets/area/bucket-title-view.svg";
import * as areaStackIcon from "../../assets/area/bucket-title-stack.svg";
function getWarningMessageIdForMeasuresBucket(categoriesCount: number) {
return categoriesCount > 1
? "dashboard.bucket.metric_view_by_warning"
: "dashboard.bucket.metric_stack_by_warning";
}
function getWarningMessageIdForViewByBucket(measuresCount: number) {
return measuresCount > 1
? "dashboard.bucket.category_view_by_warning"
: "dashboard.bucket.view_stack_by_warning";
}
function getWarningMessageIdForStackByBucket(categoriesCount: number) {
return categoriesCount > 1
? "dashboard.bucket.stack_view_by_warning"
: "dashboard.bucket.measure_stack_by_warning";
}
function setAreaChartBucketWarningMessages(
referencePoint: IExtendedReferencePoint,
messageConfig: { [bucketName: string]: string },
intl?: IntlShape,
): IUiConfig {
const buckets: IBucket[] = get(referencePoint, BUCKETS, []);
const updatedUiConfig: IUiConfig = get(referencePoint, UICONFIG);
return buckets.reduce((uiConfig: IUiConfig, bucket: IBucket) => {
const localIdentifier: string = get(bucket, "localIdentifier", "");
const bucketUiConfig: IBucketUiConfig = get(uiConfig, [BUCKETS, localIdentifier]);
const isEnabled: boolean = get(bucketUiConfig, "enabled", false);
const canAddItem: boolean = get(bucketUiConfig, "canAddItems");
// skip disabled buckets
if (canAddItem || !isEnabled) {
return uiConfig;
}
const warningMessageId = messageConfig[localIdentifier];
const warningMessage = intl ? intl.formatMessage({ id: warningMessageId }) : warningMessageId;
return set(uiConfig, [BUCKETS, localIdentifier, "warningMessage"], warningMessage);
}, updatedUiConfig);
}
export function setAreaChartUiConfig(
referencePoint: IExtendedReferencePoint,
intl: IntlShape,
visualizationType: string,
): IExtendedReferencePoint {
const referencePointConfigured = cloneDeep(referencePoint);
const buckets: IBucket[] = get(referencePointConfigured, BUCKETS, []);
const categoriesCount = getItemsCount(buckets, BucketNames.VIEW);
const measuresCount = getMasterMeasuresCount(buckets, BucketNames.MEASURES);
const isStackEmpty = hasNoStacks(buckets);
const canAddMeasuresItems = !measuresCount || (categoriesCount <= 1 && isStackEmpty);
const canAddViewItems = !categoriesCount || (measuresCount <= 1 && isStackEmpty);
const canAddStackItems = categoriesCount <= 1 && measuresCount <= 1;
const messageConfig = {
[BucketNames.MEASURES]: getWarningMessageIdForMeasuresBucket(categoriesCount),
[BucketNames.VIEW]: getWarningMessageIdForViewByBucket(measuresCount),
[BucketNames.STACK]: getWarningMessageIdForStackByBucket(categoriesCount),
};
set(referencePointConfigured, UICONFIG, setBucketTitles(referencePoint, visualizationType, intl));
set(
referencePointConfigured,
[UICONFIG, BUCKETS, BucketNames.MEASURES, "canAddItems"],
canAddMeasuresItems,
);
set(referencePointConfigured, [UICONFIG, BUCKETS, BucketNames.VIEW, "canAddItems"], canAddViewItems);
set(referencePointConfigured, [UICONFIG, BUCKETS, BucketNames.STACK, "canAddItems"], canAddStackItems);
setAreaChartBucketWarningMessages(referencePointConfigured, messageConfig, intl);
set(referencePointConfigured, [UICONFIG, BUCKETS, BucketNames.MEASURES, "icon"], areaMeasuresIcon);
set(referencePointConfigured, [UICONFIG, BUCKETS, BucketNames.VIEW, "icon"], areaViewIcon);
set(referencePointConfigured, [UICONFIG, BUCKETS, BucketNames.STACK, "icon"], areaStackIcon);
return referencePointConfigured;
}