@gooddata/react-components
Version:
GoodData.UI - A powerful JavaScript library for building analytical applications
238 lines (191 loc) • 7.68 kB
text/typescript
// (C) 2019-2020 GoodData Corporation
import get = require("lodash/get");
import some = require("lodash/some");
import every = require("lodash/every");
import isEmpty = require("lodash/isEmpty");
import reduce = require("lodash/reduce");
import * as BucketNames from "../../constants/bucketNames";
import {
IFiltersBucketItem,
IBucketItem,
IBucket,
IReferencePoint,
IFilters,
} from "../interfaces/Visualization";
import {
getItemsCount,
getMeasureItems,
getStackItems,
getAllAttributeItems,
getBucketItems,
getAllItemsByType,
isDateBucketItem,
getAttributeItemsWithoutStacks,
} from "./bucketHelper";
import { FILTERS, GRANULARITY, ALL_TIME, ATTRIBUTE, BUCKETS, METRIC } from "../constants/bucket";
export function hasOneMeasure(buckets: IBucket[]): boolean {
return getItemsCount(buckets, BucketNames.MEASURES) === 1;
}
function hasOneMasterMeasure(buckets: IBucket[]): boolean {
return getMasterMeasuresCount(buckets, BucketNames.MEASURES) === 1;
}
export function getMasterMeasuresCount(buckets: IBucket[], bucketLocalIdentifier: string): number {
const items: IBucketItem[] = getBucketItems(buckets, bucketLocalIdentifier);
return reduce(items, (acc, item) => (item.masterLocalIdentifier ? acc : acc + 1), 0);
}
export function hasOneMasterMeasureInBucket(buckets: IBucket[], bucketLocalIdentifier: string): boolean {
return getMasterMeasuresCount(buckets, bucketLocalIdentifier) === 1;
}
export function hasNoMeasures(buckets: IBucket[]): boolean {
return getItemsCount(buckets, BucketNames.MEASURES) === 0;
}
export function hasNoSecondaryMeasures(buckets: IBucket[]): boolean {
return getItemsCount(buckets, BucketNames.SECONDARY_MEASURES) === 0;
}
export function hasNoAttribute(buckets: IBucket[]): boolean {
return getItemsCount(buckets, BucketNames.ATTRIBUTE) === 0;
}
export function hasSomeSegmentByItems(buckets: IBucket[]): boolean {
return getItemsCount(buckets, BucketNames.SEGMENT) !== 0;
}
export function hasMoreThanOneCategory(buckets: IBucket[]): boolean {
return getAllAttributeItems(buckets).length > 1;
}
export function hasMoreThanOneMasterMeasure(buckets: IBucket[], bucketLocalIdentifier: string): boolean {
return getMasterMeasuresCount(buckets, bucketLocalIdentifier) > 1;
}
function hasSomeCategories(buckets: IBucket[]): boolean {
return getAttributeItemsWithoutStacks(buckets).length > 0;
}
function hasNoCategories(buckets: IBucket[]): boolean {
return getAttributeItemsWithoutStacks(buckets).length === 0;
}
function allRulesMet(
rules: Array<(buckets: IBucket[], filters?: IFilters) => boolean>,
buckets: IBucket[],
filters?: IFilters,
): boolean {
return rules.every(rule => rule(buckets, filters));
}
function hasDateInCategories(buckets: IBucket[]): boolean {
return some(getAllAttributeItems(buckets), isDateBucketItem);
}
export function hasGlobalDateFilterIgnoreAllTime(filters: IFilters): boolean {
if (filters) {
return some(filters.items, (item: IFiltersBucketItem) => {
const interval = get(item, [FILTERS, 0, "interval"], null);
return interval && get(interval, "name") !== ALL_TIME;
});
}
return false;
}
export function hasGlobalDateFilter(filters: IFilters): boolean {
if (filters) {
return some(filters.items, (item: IFiltersBucketItem) => get(item, [FILTERS, 0, "interval"], null));
}
return false;
}
export function hasUsedDateIgnoreAllTime(buckets: IBucket[], filters: IFilters): boolean {
return hasDateInCategories(buckets) || hasGlobalDateFilterIgnoreAllTime(filters);
}
export function hasUsedDate(buckets: IBucket[], filters: IFilters): boolean {
return hasDateInCategories(buckets) || hasGlobalDateFilter(filters);
}
function hasNoWeekGranularity(buckets: IBucket[]): boolean {
if (hasDateInCategories(buckets)) {
return every(getAllAttributeItems(buckets), item => get(item, "granularity") !== GRANULARITY.week);
}
return every(getBucketItems(buckets, FILTERS), item => get(item, "granularity") !== GRANULARITY.week);
}
function hasNoMeasureDateFilter(buckets: IBucket[]): boolean {
return !some(getMeasureItems(buckets), (item: IBucketItem) => {
const filters = get(item, FILTERS);
return filters && some(filters, isDateBucketItem);
});
}
export function hasNoStacks(buckets: IBucket[]): boolean {
return getStackItems(buckets).length === 0;
}
export function hasOneCategory(buckets: IBucket[]): boolean {
return getAttributeItemsWithoutStacks(buckets).length === 1;
}
function isShowPercentageUnselected(buckets: IBucket[]): boolean {
return !get(getBucketItems(buckets, BucketNames.MEASURES), [0, "showInPercent"], false);
}
export function noDerivedMeasurePresent(buckets: IBucket[]): boolean {
const measures = getAllItemsByType(buckets, [METRIC]);
return !some(measures, measure => measure.masterLocalIdentifier);
}
function hasFirstDate(buckets: IBucket[]): boolean {
const firstAttributeItem = get(getAllAttributeItems(buckets), 0);
return firstAttributeItem && isDateBucketItem(firstAttributeItem);
}
function hasNotFirstDate(buckets: IBucket[]): boolean {
return !hasFirstDate(buckets);
}
export function hasNonAllTimeFilter(filters: IFilters): boolean {
const filterBucketItems: IFiltersBucketItem[] = get(filters, "items", []);
const dateFilter = filterBucketItems.find((filter: IFiltersBucketItem) => {
return get(filter, ATTRIBUTE) === "attr.datedataset";
});
const filterInterval = get(dateFilter, [FILTERS, 0, "interval", "interval"], []);
return !isEmpty(filterInterval);
}
export function isShowInPercentAllowed(buckets: IBucket[], filters: IFilters, bucketLocalIdentifier: string) {
const rules = [hasNoStacks, hasSomeCategories];
return (
allRulesMet(rules, buckets, filters) && hasOneMasterMeasureInBucket(buckets, bucketLocalIdentifier)
);
}
export function isComparisonOverTimeAllowed(
buckets: IBucket[],
filters: IFilters,
weekFiltersEnabled: boolean,
) {
const rules = weekFiltersEnabled ? [hasNoStacks] : [hasNoStacks, hasNoWeekGranularity];
return allRulesMet(rules, buckets, filters) && hasGlobalDateFilter(filters);
}
export function overTimeComparisonRecommendationEnabled(
referencePoint: IReferencePoint,
weekFiltersEnabled: boolean,
) {
const baseRules = [
noDerivedMeasurePresent,
hasOneMeasure,
hasFirstDate,
hasNoStacks,
hasOneCategory,
hasNoMeasureDateFilter,
];
const rules = weekFiltersEnabled ? baseRules : [...baseRules, hasNoWeekGranularity];
return (
allRulesMet(rules, get(referencePoint, BUCKETS, [])) &&
hasGlobalDateFilterIgnoreAllTime(get(referencePoint, FILTERS))
);
}
export function comparisonAndTrendingRecommendationEnabled(buckets: IBucket[]) {
const rules = [hasOneMeasure, noDerivedMeasurePresent, hasNoCategories];
return allRulesMet(rules, buckets);
}
export function percentRecommendationEnabled(buckets: IBucket[]): boolean {
const rules = [
isShowPercentageUnselected,
hasNotFirstDate,
hasOneMasterMeasure,
hasOneCategory,
hasNoStacks,
];
return allRulesMet(rules, buckets);
}
export function previousPeriodRecommendationEnabled(buckets: IBucket[]) {
const rules = [
hasOneMeasure,
hasOneCategory,
hasNotFirstDate,
hasNoStacks,
noDerivedMeasurePresent,
isShowPercentageUnselected,
hasNoMeasureDateFilter,
];
return allRulesMet(rules, buckets);
}