diff --git a/libs/sdk-ui-dashboard/src/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/useDrillDialogInsightDrills.ts b/libs/sdk-ui-dashboard/src/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/useDrillDialogInsightDrills.ts index 6966f096165..62751a9fb15 100644 --- a/libs/sdk-ui-dashboard/src/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/useDrillDialogInsightDrills.ts +++ b/libs/sdk-ui-dashboard/src/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/useDrillDialogInsightDrills.ts @@ -1,10 +1,11 @@ -// (C) 2020-2022 GoodData Corporation +// (C) 2020-2024 GoodData Corporation import { useCallback, useState } from "react"; import isEqual from "lodash/isEqual.js"; import { useDashboardSelector, selectImplicitDrillsByAvailableDrillTargets, selectDrillableItemsByAvailableDrillTargets, + selectEnableKPIDashboardDrillFromAttribute, } from "../../../../../model/index.js"; import { OnWidgetDrill } from "../../../../drill/types.js"; import { @@ -35,13 +36,22 @@ export const useDrillDialogInsightDrills = ({ }: UseDashboardInsightDrillsProps) => { // Drilling const [drillTargets, setDrillTargets] = useState(); + const isDrillFromAttributeEnabled = useDashboardSelector(selectEnableKPIDashboardDrillFromAttribute); + const disableDrillDownOnInsight = insight.insight.properties.controls?.disableDrillDown; + const onPushData = useCallback( (data: IPushData): void => { - if (data?.availableDrillTargets && !isEqual(drillTargets, data.availableDrillTargets)) { - setDrillTargets(data.availableDrillTargets); + const targets = sanitizeAvailableDrillTargets( + data?.availableDrillTargets, + isDrillFromAttributeEnabled, + !disableDrillDownOnInsight, + ); + + if (targets && !isEqual(drillTargets, data.availableDrillTargets)) { + setDrillTargets(targets); } }, - [drillTargets], + [disableDrillDownOnInsight, drillTargets, isDrillFromAttributeEnabled], ); const implicitDrillDefinitions = useDashboardSelector( @@ -81,3 +91,20 @@ export const useDrillDialogInsightDrills = ({ onDrill, }; }; + +const sanitizeAvailableDrillTargets = ( + availableDrillTargets: IAvailableDrillTargets | undefined, + isDrillFromAttributeEnabled: boolean, + isDrillDownOnInsightEnabled: boolean, +) => { + // if no drill targets went in (likely the pushData was fired in a non-drill-related case) + // pass the undefined through, this avoids useless setting of the drill targets down the line + if (!availableDrillTargets) { + return availableDrillTargets; + } + + // Both drill from attribute FF and drilldown enablement on insight level must be enabled + return isDrillFromAttributeEnabled && isDrillDownOnInsightEnabled + ? availableDrillTargets + : { ...availableDrillTargets, attributes: undefined }; +};