Skip to content

Commit 424aec6

Browse files
author
hackerstanislav
committed
feat: mode=export add filter type
risk: low JIRA: F1-1144
1 parent 9dc8151 commit 424aec6

File tree

7 files changed

+97
-16
lines changed

7 files changed

+97
-16
lines changed

libs/sdk-ui-dashboard/api/sdk-ui-dashboard.api.md

+14-1
Original file line numberDiff line numberDiff line change
@@ -2866,6 +2866,17 @@ export interface DashboardQueryStartedPayload {
28662866
// @beta (undocumented)
28672867
export type DashboardQueryType = "GDC.DASH/QUERY.INSIGHT.DATE.DATASETS" | "GDC.DASH/QUERY.INSIGHT.ATTRIBUTE.META" | "GDC.DASH/QUERY.MEASURE.DATE.DATASETS" | "GDC.DASH/QUERY.WIDGET.FILTERS" | "GDC.DASH/QUERY.WIDGET.BROKEN_ALERTS" | "GDC.DASH/QUERY.WIDGET.ALERT_COUNT" | "GDC.DASH/QUERY.CONNECTING.ATTRIBUTES" | "GDC.DASH/QUERY.DISPLAY.FORM.ATTRIBUTE" | "GDC.DASH/QUERY.DATA.SET.ATTRIBUTE" | "GDC.DASH/QUERY.ELEMENTS.ATTRIBUTE" | "GDC.DASH/QUERY.CONNECTED.ATTRIBUTES" | "GDC.DASH/QUERY.METRICS_AND_FACTS" | "GDC.DASH/QUERY.AVAILABLE.DATA.SETS.FOR.ITEMS";
28682868

2869+
// @alpha (undocumented)
2870+
export type DashboardRelatedFilter = {
2871+
type: "attributeFilter" | "dateFilter";
2872+
all: boolean;
2873+
id: string;
2874+
title: string;
2875+
subtitle: string;
2876+
common?: true;
2877+
mode: DashboardDateFilterConfigMode | DashboardAttributeFilterConfigMode;
2878+
};
2879+
28692880
// @beta
28702881
export interface DashboardRenamed extends IDashboardEvent {
28712882
// (undocumented)
@@ -6416,14 +6427,16 @@ export type MetaExportData = {
64166427
filter: {
64176428
name: MetaExportDataAttributes;
64186429
value: MetaExportDataAttributes;
6430+
filterData: (data: DashboardRelatedFilter) => MetaExportDataAttributes;
64196431
};
64206432
};
64216433
};
64226434

64236435
// @alpha
64246436
export type MetaExportDataAttributes = {
6425-
"data-export-meta-type": ExportMetaType;
6437+
"data-export-meta-type"?: ExportMetaType;
64266438
"data-export-meta-filter-type"?: "date" | "attribute";
6439+
"data-export-meta-filter-mode"?: "readonly" | "hidden" | "active";
64276440
};
64286441

64296442
// @alpha (undocumented)

libs/sdk-ui-dashboard/src/_staging/sharedHooks/useFiltersNamings.ts

+25-8
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
isAllTimeDashboardDateFilter,
88
isAllValuesDashboardAttributeFilter,
99
isDashboardAttributeFilter,
10+
isDashboardCommonDateFilter,
1011
isDashboardDateFilterWithDimension,
1112
serializeObjRef,
1213
} from "@gooddata/sdk-model";
@@ -31,7 +32,16 @@ import {
3132
import { useCommonDateFilterTitle } from "./useCommonDateFilterTitle.js";
3233
import { useDateFiltersTitles } from "./useDateFiltersTitles.js";
3334

34-
export function useFiltersNamings(filtersToDisplay: FilterContextItem[]) {
35+
export type FilterNaming = {
36+
type: "attributeFilter" | "dateFilter";
37+
all: boolean;
38+
id: string;
39+
title: string;
40+
subtitle: string;
41+
common?: true;
42+
};
43+
44+
export function useFiltersNamings(filtersToDisplay: FilterContextItem[]): (FilterNaming | undefined)[] {
3545
const intl = useIntl();
3646
const locale = useDashboardSelector(selectLocale);
3747
const settings = useDashboardSelector(selectSettings);
@@ -95,24 +105,31 @@ export function useFiltersNamings(filtersToDisplay: FilterContextItem[]) {
95105
);
96106
const subtitle = DateFilterHelpers.getDateFilterTitle(dateFilterOption, locale, dateFormat);
97107

98-
if (isDashboardDateFilterWithDimension(filter)) {
99-
const key = serializeObjRef(filter.dateFilter.dataSet!);
108+
const a = filter;
109+
if (isDashboardDateFilterWithDimension(a)) {
110+
const key = serializeObjRef(a.dateFilter.dataSet!);
100111
return {
101112
type: "dateFilter",
102-
all: isAllTimeDashboardDateFilter(filter),
103-
id: uuidv4(), // used just for React keys
113+
all: isAllTimeDashboardDateFilter(a),
114+
id: a.dateFilter.localIdentifier ?? uuidv4(),
104115
title: allDateFiltersTitlesObj[key],
105116
subtitle,
106117
};
107-
} else {
118+
}
119+
120+
const b = filter;
121+
if (isDashboardCommonDateFilter(b)) {
108122
return {
109123
type: "dateFilter",
110-
all: isAllTimeDashboardDateFilter(filter),
111-
id: uuidv4(), // used just for React keys
124+
common: true,
125+
all: isAllTimeDashboardDateFilter(b),
126+
id: b.dateFilter.localIdentifier ?? uuidv4(),
112127
title: commonDateFilterTitle || intl.formatMessage({ id: "dateFilterDropdown.title" }),
113128
subtitle,
114129
};
115130
}
131+
132+
return undefined;
116133
}
117134
});
118135
}

libs/sdk-ui-dashboard/src/presentation/export/DefaultDashboardExportVariables.tsx

+10-2
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,21 @@ export function DefaultDashboardExportVariables({ renderMode }: DefaultDashboard
4646
{dateFilters.length > 0 || attributeFilters.length > 0 ? (
4747
<div {...exportData?.filters?.root}>
4848
{dateFilters.map((filter, i: number) => (
49-
<div key={i} {...exportData?.filters?.dateFilter}>
49+
<div
50+
key={i}
51+
{...exportData?.filters?.dateFilter}
52+
{...exportData?.filters?.filter.filterData(filter)}
53+
>
5054
<span {...exportData?.filters?.filter.name}>{filter?.title}</span> -{" "}
5155
<span {...exportData?.filters?.filter.value}>{filter?.subtitle}</span>
5256
</div>
5357
))}
5458
{attributeFilters.map((filter, i: number) => (
55-
<div key={i} {...exportData?.filters?.attributeFilter}>
59+
<div
60+
key={i}
61+
{...exportData?.filters?.attributeFilter}
62+
{...exportData?.filters?.filter.filterData(filter)}
63+
>
5664
<span {...exportData?.filters?.filter.name}>{filter?.title}</span> -{" "}
5765
<span {...exportData?.filters?.filter.value}>{filter?.subtitle}</span>
5866
</div>

libs/sdk-ui-dashboard/src/presentation/export/hooks/useDashboardRelatedFilters.ts

+39-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,47 @@
11
// (C) 2022-2025 GoodData Corporation
2-
import { selectFilterContextFilters, useDashboardSelector } from "../../../model/index.js";
3-
import { useFiltersNamings } from "../../../_staging/sharedHooks/useFiltersNamings.js";
2+
import {
3+
selectAttributeFilterConfigsOverrides,
4+
selectDateFilterConfigOverrides,
5+
selectFilterContextFilters,
6+
useDashboardSelector,
7+
} from "../../../model/index.js";
8+
import { FilterNaming, useFiltersNamings } from "../../../_staging/sharedHooks/useFiltersNamings.js";
9+
import { DashboardAttributeFilterConfigMode, DashboardDateFilterConfigMode } from "@gooddata/sdk-model";
410

5-
export function useDashboardRelatedFilters() {
11+
/**
12+
* @alpha
13+
*/
14+
export type DashboardRelatedFilter = {
15+
type: "attributeFilter" | "dateFilter";
16+
all: boolean;
17+
id: string;
18+
title: string;
19+
subtitle: string;
20+
common?: true;
21+
mode: DashboardDateFilterConfigMode | DashboardAttributeFilterConfigMode;
22+
};
23+
24+
export function useDashboardRelatedFilters(): {
25+
dateFilters: DashboardRelatedFilter[];
26+
attributeFilters: DashboardRelatedFilter[];
27+
} {
628
const dashboardFilters = useDashboardSelector(selectFilterContextFilters);
29+
const dateFiltersConfig = useDashboardSelector(selectDateFilterConfigOverrides);
30+
const attributeFiltersConfig = useDashboardSelector(selectAttributeFilterConfigsOverrides);
731
const filters = useFiltersNamings(dashboardFilters);
832

9-
const all = filters.filter((f) => !f?.all);
33+
const all = (filters.filter((f) => f && !f.all) as FilterNaming[]).map((f) => {
34+
return {
35+
...f,
36+
...(f?.type === "dateFilter" && f?.common
37+
? {
38+
mode: dateFiltersConfig?.mode,
39+
}
40+
: {
41+
mode: attributeFiltersConfig.find((c) => c.localIdentifier === f?.id)?.mode,
42+
}),
43+
};
44+
}) as DashboardRelatedFilter[];
1045

1146
return {
1247
dateFilters: all.filter((f) => f?.type === "dateFilter"),

libs/sdk-ui-dashboard/src/presentation/export/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
export * from "./types.js";
44
export * from "./useExportData.js";
55
export * from "./DefaultDashboardExportVariables.js";
6+
export type { DashboardRelatedFilter } from "./hooks/useDashboardRelatedFilters.js";

libs/sdk-ui-dashboard/src/presentation/export/types.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// (C) 2025 GoodData Corporation
22

3+
import { DashboardRelatedFilter } from "./hooks/useDashboardRelatedFilters.js";
4+
35
/**
46
* Export element type.
57
*
@@ -48,8 +50,9 @@ export type CommonExportDataAttributes = {
4850
* @alpha
4951
*/
5052
export type MetaExportDataAttributes = {
51-
"data-export-meta-type": ExportMetaType;
53+
"data-export-meta-type"?: ExportMetaType;
5254
"data-export-meta-filter-type"?: "date" | "attribute";
55+
"data-export-meta-filter-mode"?: "readonly" | "hidden" | "active";
5356
};
5457

5558
/**
@@ -73,6 +76,7 @@ export type MetaExportData = {
7376
filter: {
7477
name: MetaExportDataAttributes;
7578
value: MetaExportDataAttributes;
79+
filterData: (data: DashboardRelatedFilter) => MetaExportDataAttributes;
7680
};
7781
};
7882
};

libs/sdk-ui-dashboard/src/presentation/export/useExportData.ts

+3
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,9 @@ export const useMetaExportData = (): MetaExportData | undefined => {
167167
value: {
168168
"data-export-meta-type": "dashboard-filter-value",
169169
},
170+
filterData: (data) => ({
171+
"data-export-meta-filter-mode": data.mode,
172+
}),
170173
},
171174
},
172175
};

0 commit comments

Comments
 (0)